ZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ5NDA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5Db3B5IG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNWFkNmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTkwODYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTQ3ZmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIGpzdF9qMmVlX3RvYy54bWwsXAotICAgICAgICAgICAgICAganN0X2oyZWVfYW50LnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy9Qcm9qZWN0RXhwbG9yZXIuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbWFnZXMvUHJvamVjdEV4cGxvcmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg3NzEwNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy9Qcm9qZWN0RXhwbG9yZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV9hbnQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV9hbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWRiNDFkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvanN0X2oyZWVfYW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTx0b2MgbGFiZWw9IkFudCIgdG9waWM9InRvcGljcy90amFudC5odG1sIj4KLSAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIEFudCIgaHJlZj0idG9waWNzL3RqYW50Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJBbnQgc3VwcG9ydCIgaHJlZj0idG9waWNzL2NqYW50Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRXh0ZW5kZWQgQW50IFN1cHBvcnQgLSBvdmVydmlldyIgaHJlZj0idG9waWNzL3RhbnRob21lLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUnVubmluZyBBbnQgaW4gYSBoZWFkbGVzcyB3b3Jrc3BhY2UiIGhyZWY9InRvcGljcy90amFudGhlYWRsZXNzLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iVXBncmFkaW5nIEFudCIgaHJlZj0idG9waWNzL3RqYW50dXBncmFkZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkdlbmVyYWwgQW50IHRhc2tzIiBocmVmPSJ0b3BpY3MvcGgtYW50Z2VuZXJhbC5odG1sIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iY2FwdHVyZUJ1aWxkTWVzc2FnZXMiIGhyZWY9InRvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJjb21waWxlV29ya3NwYWNlIiBocmVmPSJ0b3BpY3MvdGFudGNvbXBpbGV3Lmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iZ2V0SmF2YWNFcnJvckNvdW50IiBocmVmPSJ0b3BpY3MvdGFudGdldGouaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJnZXRQcm9qZWN0RGF0YSIgaHJlZj0idG9waWNzL3RhbnRnZXRwLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0icHJvamVjdEJ1aWxkIiBocmVmPSJ0b3BpY3MvdGFudHByb2ouaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJwcm9qZWN0R2V0RXJyb3JzIiBocmVmPSJ0b3BpY3MvdGFudHByb2plY3RnZXRlcnJvcnMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJwcm9qZWN0SW1wb3J0IiBocmVmPSJ0b3BpY3MvdGFudHByb2plY3RpbXBvcnQuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJwcm9qZWN0U2V0QnVpbGQiIGhyZWY9InRvcGljcy90YW50cHJvamVjdHNldGJ1aWxkLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0icHJvamVjdFNldEltcG9ydCIgaHJlZj0idG9waWNzL3RhbnRwcm9qZWN0c2V0aW1wb3J0Lmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0ic2V0RGVidWdJbmZvIiBocmVmPSJ0b3BpY3MvdGFudHNldGQuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJ3b3Jrc3BhY2VCdWlsZCIgaHJlZj0idG9waWNzL3RhbnR3b3Jrc3BhY2VidWlsZC5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IndvcmtzcGFjZUdldEVycm9ycyIgaHJlZj0idG9waWNzL3RhbnR3b3Jrc3BhY2VnZXRlcnJvcnMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJ3b3Jrc3BhY2VQcmVmZXJlbmNlRmlsZSIgaHJlZj0idG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZmlsZS5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IndvcmtzcGFjZVByZWZlcmVuY2VHZXQiIGhyZWY9InRvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IndvcmtzcGFjZVByZWZlcmVuY2VTZXQiIGhyZWY9InRvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZXNldC5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJBbnQgdGFza3MgZm9yIEoyRUUiIGhyZWY9InRvcGljcy9waC1hbnRqMmVlLmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJhdXRvQXBwSW5zdGFsbCIgaHJlZj0idG9waWNzL3RhbnRhdXRvYXBwaW5zdGFsbC5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkFwcENsaWVudEV4cG9ydCIgaHJlZj0idG9waWNzL3RhbnRhcHBjLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRUFSRXhwb3J0IiBocmVmPSJ0b3BpY3MvdGFudGVhcmUuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJVdGlsSmFyIiBocmVmPSJ0b3BpY3MvdGFudHV0aWwuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJXQVJFeHBvcnQiIGhyZWY9InRvcGljcy90YW50d2FyZS5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJBbnQgdGFza3MgZm9yIEVKQi1lbmFibGVkIHRvb2xzIiBocmVmPSJ0b3BpY3MvcGgtYW50ZWpiLmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJBY2Nlc3NCZWFuUmVnZW5lcmF0aW9uIiBocmVmPSJ0b3BpY3MvdGFudGF4Ym4uaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFSkJEZXBsb3kiIGhyZWY9InRvcGljcy90YW50ZWpiZC5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkVKQkV4cG9ydCIgaHJlZj0idG9waWNzL3RhbnRlamJlLmh0bWwiLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IkV4YW1wbGU6IEF1dG9tYXRlZCBBbnQgYnVpbGQiIGhyZWY9InRvcGljcy90YW50ZXhhbXBsZWF1dG9idWlsZC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkV4YW1wbGU6IEF1dG9tYXRlZCBBbnQgZGVwbG95IiBocmVmPSJ0b3BpY3MvdGFudGV4YW1wbGVhdXRvZGVwbG95Lmh0bWwiLz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2pzdF9qMmVlX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2pzdF9qMmVlX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTVhNWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPHRvYyBsYWJlbD0iSjJFRSBhcHBsaWNhdGlvbnMgLSBvcGVuIHNvdXJjZSIgdG9waWM9InRvcGljcy9waC1qMmVlYXBwLmh0bWwiPgotICAgPHRvcGljIGxhYmVsPSJKMkVFIEFwcGxpY2F0aW9ucyIgaHJlZj0idG9waWNzL3BoLWoyZWVhcHAuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkoyRUUgYXJjaGl0ZWN0dXJlIiBocmVmPSJ0b3BpY3MvY2phcmNoLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iSjJFRSBwZXJzcGVjdGl2ZSIgaHJlZj0idG9waWNzL2NqcGVycy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByb2plY3QgRXhwbG9yZXIgdmlldyBpbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSIgaHJlZj0idG9waWNzL2Nqdmlldy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9qZWN0cyIgaHJlZj0idG9waWNzL3BoLXByb2plY3RzLmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvY2plYXJwcm9qLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIiBocmVmPSJ0b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdGplYXIuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCIgaHJlZj0idG9waWNzL3RqYXBwcHJvai5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3QiIGhyZWY9InRvcGljcy90anJhci5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgdGFyZ2V0IHNlcnZlcnMgZm9yIEoyRUUgcHJvamVjdHMiIGhyZWY9InRvcGljcy90anRhcmdldHNlcnZlci5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHByb2plY3RzIGFuZCBmaWxlcyIgaHJlZj0idG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIj4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdGpleHBhcHAuaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlIiBocmVmPSJ0b3BpY3MvdGpleHBlYXIuaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgY29ubmVjdG9yIHByb2plY3RzIHRvIFJBUiBmaWxlcyIgaHJlZj0idG9waWNzL3RqZXhwcmFyLmh0bWwiLz4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGUiIGhyZWY9InRvcGljcy90amltcGVhci5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGUiIGhyZWY9InRvcGljcy90amltcGFwcC5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhIGNvbm5lY3RvciBwcm9qZWN0IFJBUiBmaWxlIiBocmVmPSJ0b3BpY3MvdGppbXByYXIuaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJDeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKMkVFIG1vZHVsZXMiIGhyZWY9InRvcGljcy9jamNpcmNsZS5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkNvcnJlY3RpbmcgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZCIgaHJlZj0idG9waWNzL3RqY2lyY2xlYi5odG1sIi8+Ci0gICAgICAgICA8L3RvcGljPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zIiBocmVmPSJ0b3BpY3MvdGp2YWwuaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIiBocmVmPSJ0b3BpY3MvcnZhbGVyci5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkoyRUUgVmFsaWRhdG9ycyIgaHJlZj0idG9waWNzL3J2YWxpZGF0b3JzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRW5hYmxpbmcgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbiIgaHJlZj0idG9waWNzL3RqdmFsYXV0by5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkVuYWJsaW5nIGJ1aWxkIHZhbGlkYXRpb24iIGhyZWY9InRvcGljcy90anZhbGJ1aWxkLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRGlzYWJsaW5nIGEgdmFsaWRhdG9yIiBocmVmPSJ0b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iT3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RqdmFsZ2xvYmFscHJlZi5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9Ik1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZSIgaHJlZj0idG9waWNzL3RqdmFsbWFudWFsLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iU2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9ycyIgaHJlZj0idG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwiLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8bGluayB0b2M9ImpzdF9qMmVlX2FudC54bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUmVmZXJlbmNlIiBocmVmPSJ0b3BpY3MvcGgtcmVmLmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJKMkVFIFZhbGlkYXRvcnMiIGhyZWY9InRvcGljcy9ydmFsaWRhdG9ycy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIiBocmVmPSJ0b3BpY3MvcnZhbGVyci5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkxpbWl0YXRpb25zIG9mIEoyRUUgZGV2ZWxvcG1lbnQgdG9vbHMiIGhyZWY9InRvcGljcy9yamxpbWl0Y3VycmVudC5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgPC90b3BpYz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXJpbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlcmluZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMjZiMjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlcmluZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNSIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTGljZW5zZWQgTWF0ZXJpYWxzIFByb3BlcnR5IG9mIElCTSAtLT4KLTwhLS0gVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtLT4KLTwhLS0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgLS0+Ci08IS0tIEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJpYm1kaXRhLmNzcyIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNvbW1vbi5jc3MiIC8+Ci08dGl0bGU+SW5kZXg8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+SW5kZXg8L2gxPgotPGEgbmFtZT0iSURYMF80MSIgaHJlZj0iI0lEWDFfNDEiPkE8L2E+Ci08YSBuYW1lPSJJRFgwXzQyIiBocmVmPSIjSURYMV80MiI+QjwvYT4KLTxhIG5hbWU9IklEWDBfNDMiIGhyZWY9IiNJRFgxXzQzIj5DPC9hPgotPGEgbmFtZT0iSURYMF80NSIgaHJlZj0iI0lEWDFfNDUiPkU8L2E+Ci08YSBuYW1lPSJJRFgwXzRBIiBocmVmPSIjSURYMV80QSI+SjwvYT4KLTxhIG5hbWU9IklEWDBfNTAiIGhyZWY9IiNJRFgxXzUwIj5QPC9hPgotPGEgbmFtZT0iSURYMF81MiIgaHJlZj0iI0lEWDFfNTIiPlI8L2E+Ci08YSBuYW1lPSJJRFgwXzU2IiBocmVmPSIjSURYMV81NiI+VjwvYT4KLTxocj48L2hyPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQxIiBocmVmPSIjSURYMF80MSI+QTwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5BbnQKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2phbnQuaHRtbCNjamFudCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbjwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NqYW50Lmh0bWwjY2phbnQiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jamFwcGNsaXByb2ouaHRtbCNjamFwcGNsaXByb2oiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80MiIgaHJlZj0iI0lEWDBfNDIiPkI8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+YnVpbGQgdmFsaWRhdGlvbgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90anZhbGJ1aWxkLmh0bWwjdGp2YWxidWlsZCI+ZW5hYmxpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQzIiBocmVmPSIjSURYMF80MyI+QzwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5jb2RlIHZhbGlkYXRpb24KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGp2YWxhdXRvLmh0bWwjdGp2YWxhdXRvIj5hdXRvbWF0aWM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90anZhbGRpc2FibGUuaHRtbCN0anZhbGRpc2FibGUiPmRpc2FibGluZyB2YWxpZGF0b3JzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnZhbGVyci5odG1sI3J2YWxlcnIiPmVycm9yczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3J2YWxpZGF0b3JzLmh0bWwjcnZhbGlkYXRvcnMiPkoyRUUgdmFsaWRhdG9yczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqdmFsbWFudWFsLmh0bWwjdGp2YWxtYW51YWwiPm1hbnVhbDwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqdmFsZ2xvYmFscHJlZi5odG1sI3RqdmFsZ2xvYmFscHJlZiI+b3ZlcnJpZGluZyBnbG9iYWwgcHJlZmVyZW5jZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90anZhbC5odG1sI3RqdmFsIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwjdGp2YWxzZWxlY3QiPnNlbGVjdGluZyB2YWxpZGF0b3JzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnZhbGVyci5odG1sI3J2YWxlcnIiPnNvbHV0aW9ucyB0byBlcnJvcnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Y29ubmVjdG9yIHByb2plY3RzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqcmFyLmh0bWwjdGpyYXIiPmNyZWF0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGpleHByYXIuaHRtbCN0amV4cHJhciI+ZXhwb3J0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGppbXByYXIuaHRtbCN0amltcHJhciI+aW1wb3J0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmN5Y2xpY2FsIGRlcGVuZGVuY2llcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90amNpcmNsZWIuaHRtbCN0amNpcmNsZWIiPmNvcnJlY3Rpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9jamNpcmNsZS5odG1sI2NqY2lyY2xlIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDUiIGhyZWY9IiNJRFgwXzQ1Ij5FPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPmVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2plYXJwcm9qLmh0bWwjY2plYXJwcm9qIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNEEiIGhyZWY9IiNJRFgwXzRBIj5KPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPkoyRUUgZGV2ZWxvcG1lbnQKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcmpsaW1pdGN1cnJlbnQuaHRtbCNyamxpbWl0Y3VycmVudCI+bGltaXRhdGlvbnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzUwIiBocmVmPSIjSURYMF81MCI+UDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5wZXJzcGVjdGl2ZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2pwZXJzLmh0bWwjY2pwZXJzIj5KMkVFPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnByb2plY3RzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NqYXBwY2xpcHJvai5odG1sI2NqYXBwY2xpcHJvaiI+YXBwbGljYXRpb24gY2xpZW50PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGpjaXJjbGViLmh0bWwjdGpjaXJjbGViIj5jb3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NqY2lyY2xlLmh0bWwjY2pjaXJjbGUiPmN5Y2xpY2FsIGRlcGVuZGVuY2llczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTIiIGhyZWY9IiNJRFgwXzUyIj5SPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPlJBUiBmaWxlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90amV4cHJhci5odG1sI3RqZXhwcmFyIj5leHBvcnRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90amltcHJhci5odG1sI3RqaW1wcmFyIj5pbXBvcnRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzU2IiBocmVmPSIjSURYMF81NiI+VjwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT52YWxpZGF0aW9uCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqdmFsYXV0by5odG1sI3RqdmFsYXV0byI+YXV0b21hdGljPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGp2YWxidWlsZC5odG1sI3RqdmFsYnVpbGQiPmJ1aWxkIHZhbGlkYXRpb248L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90anZhbGRpc2FibGUuaHRtbCN0anZhbGRpc2FibGUiPmRpc2FibGluZyB2YWxpZGF0b3JzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnZhbGVyci5odG1sI3J2YWxlcnIiPmVycm9yczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3J2YWxpZGF0b3JzLmh0bWwjcnZhbGlkYXRvcnMiPkoyRUUgdmFsaWRhdG9yczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqdmFsbWFudWFsLmh0bWwjdGp2YWxtYW51YWwiPm1hbnVhbDwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqdmFsZ2xvYmFscHJlZi5odG1sI3RqdmFsZ2xvYmFscHJlZiI+b3ZlcnJpZGluZyBnbG9iYWwgcHJlZmVyZW5jZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90anZhbC5odG1sI3RqdmFsIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwjdGp2YWxzZWxlY3QiPnNlbGVjdGluZyB2YWxpZGF0b3JzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnZhbGVyci5odG1sI3J2YWxlcnIiPnNvbHV0aW9ucyB0byBlcnJvcnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+dmlld3MKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2p2aWV3Lmh0bWwjY2p2aWV3Ij5Qcm9qZWN0IEV4cGxvcmVyPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkYTQ5OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUcmFuc2xhdGlvbiBJbnN0cnVjdGlvbjogc2VjdGlvbiB0byBiZSB0cmFuc2xhdGVkCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUGx1Z2luLm5hbWUgPSBKU1QgZG9jdW1lbnRhdGlvbiBmb3IgSjJFRSB0b29scwotUGx1Z2luLnByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTI1MDQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotIDxwbHVnaW4+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICAgPHRvYyBmaWxlPSJqc3RfajJlZV90b2MueG1sIi8+Ci0gICAgICAgPHRvYyBmaWxlPSJqc3RfajJlZV9hbnQueG1sIi8+Ci0gICAgICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFudC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmMWZmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+QW50IHN1cHBvcnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNqYW50Ij48YSBuYW1lPSJjamFudCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BbnQgc3VwcG9ydDwvaDE+Ci08ZGl2PjxwPlRoaXMgdG9waWMgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIEFudCBzdXBwb3J0IHByb3ZpZGVkIGluCi10aGUgd29ya2JlbmNoLjwvcD4KLTxwPkFudCBpcyBhIEphdmEtYmFzZWQgYnVpbGQgdG9vbCB0aGF0IGlzIGEgcHJvamVjdCBvZiB0aGUgSmFrYXJ0YSBBcGFjaGUKLXByb2plY3QuIEl0IGlzIHNpbWlsYXIgdG8gTWFrZSwgZXhjZXB0IHRoYXQgaW5zdGVhZCBvZiB1c2luZyBvcGVyYXRpbmcgc3lzdGVtCi1zaGVsbC1iYXNlZCBjb21tYW5kcywgaXQgdXNlcyBKYXZh4oSiIGNsYXNzZXMgdG8gcGVyZm9ybSBpdHMgb3BlcmF0aW9ucy4KLVRoZSBidWlsZCBzY3JpcHRzIGFyZSBYTUwgZmlsZXMgY29udGFpbmluZyB0YXJnZXRzIGFuZCBzcGVjaWZ5aW5nIHRoZSB0YXNrcwotKG9wZXJhdGlvbnMpIHJlcXVpcmVkIGZvciBlYWNoLiBBbnQgY29tZXMgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBidWlsdC1pbgotdGFza3Mgc3VmZmljaWVudCB0byBwZXJmb3JtIG1hbnkgY29tbW9uIGJ1aWxkIG9wZXJhdGlvbnMuIFlvdSBjYW4gbGVhcm4gYWJvdXQKLXRoZW0gaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50L21hbnVhbC9pbmRleC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+QW50IHVzZXIgbWFudWFsPC9hPiBvbiB0aGUgSmFrYXJ0YSBBcGFjaGUgV2ViIHNpdGUuPC9wPgotPHA+QmVjYXVzZSBBbnQgaXMgSmF2YS1iYXNlZCwgaXQgaXMgcGxhdGZvcm0taW5kZXBlbmRlbnQuIEl0IGlzIHdlbGwgc3VpdGVkCi1mb3IgYnVpbGRpbmcgSmF2YSBhcHBsaWNhdGlvbnMsIGJ1dCBjYW4gYmUgdXNlZCBmb3Igb3RoZXIgYnVpbGQgdGFza3MKLWFzIHdlbGwuIE9uZSBvZiBpdHMgaW1wb3J0YW50IGZlYXR1cmVzIGlzIHRoYXQgeW91IGNhbiB1c2UgSmF2YSB0bwotd3JpdGUgbmV3IEFudCB0YXNrcyB0byBleHRlbmQgcHJvZHVjdGlvbiBidWlsZCBjYXBhYmlsaXRpZXMuIDwvcD4KLTxwPlRoZSBjb20uaWJtLmV0b29scy5qMmVlLmFudCBwbHVnaW4gY29udGFpbnMgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6PC9wPgotPHVsPjxsaT5BIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnJlYWRtZS5odG08L3NhbXA+IGZpbGU8L2xpPgotPGxpPkFuIGV4YW1wbGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+cnVuQW50LmJhdDwvc2FtcD4gZmlsZS4gVXNlIHRoaXMgZmlsZSB0byBzdGFydCBhCi0iaGVhZGxlc3MiIHdvcmtzcGFjZSBhbmQgcnVuIHRoZSBBbnQgYnVpbGQgc2NyaXB0LjwvbGk+Ci08bGk+QW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+ZXhhbXBsZS54bWw8L3NhbXA+IGZpbGUuIFRoaXMgZmlsZSBzaG93cyBleGFtcGxlcyBvZiBzb21lCi1vZiB0aGUgSjJFRSB0YXNrcyBpbmNsdWRlZCBpbiB0aGUgcGx1Z2luLjwvbGk+Ci08L3VsPgotPHA+U2V2ZXJhbCBzb3VyY2VzIG9mIEFudCBpbmZvcm1hdGlvbiBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIEpha2FydGEgQXBhY2hlCi1BbnQgUHJvamVjdC4gVG8gbGVhcm4gbW9yZSBhYm91dCBBbnQsIGZvbGxvdyB0aGUgbGlua3MgYmVsb3c6PC9wPgotPHVsPjxsaT48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2FudC9tYW51YWwvaW5kZXguaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkFudCB1c2VyIG1hbnVhbDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9tYWlsLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5BbnQKLXVzZXIgbWFpbCBsaXN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1hbnQtdXNlciIgdGFyZ2V0PSJfYmxhbmsiPkFudAotdXNlciBtYWlsIGxpc3QgYXJjaGl2ZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3LnJlZGJvb2tzLmlibS5jb20vcHVicy9wZGZzL3JlZGJvb2tzL3NnMjQ2MTM0LnBkZiIgdGFyZ2V0PSJfYmxhbmsiPldlYlNwaGVyZTxzdXA+wq48L3N1cD4gVmVyc2lvbiA0LjAgQXBwbGljYXRpb24gRGV2ZWxvcG1lbnQgSGFuZGJvb2s8L2E+OgotQ2hhcHRlciA5IGV4cGxhaW5zIGhvdyB0byB1c2UgQW50IHRvIGJ1aWxkIGEgV2ViU3BoZXJlIGFwcGxpY2F0aW9uLjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhd29ybGQuY29tL2phdmF3b3JsZC9qdy0xMC0yMDAwL2p3LTEwMjAtYW50X3AuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkF1dG9tYXRlIHlvdXIgYnVpbGQgcHJvY2VzcyB1c2luZyBKYXZhIGFuZCBBbnQ8L2E+OiBKYXZhV29ybGTihKIgYXJ0aWNsZTwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDAxLzAyLzIyL29wZW5fc291cmNlLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5PcGVuIFNvdXJjZSBKYXZhOiBBbnQ8L2E+OiBvbmphdmEuY29tIGFydGljbGU8L2xpPgotPC91bD4KLTxwPk1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQW50IGFuZCBob3cgdG8gdXNlIGl0IHdpdGggdGhlIHdvcmtiZW5jaCBjYW4gYmUKLWZvdW5kIGluIHRoZSBmb2xsb3dpbmcgc2VyaWVzIG9mIGFydGljbGVzOjwvcD4KLTx1bD48bGk+PGEgaHJlZj0iaHR0cDovL3d3dzdiLnNvZnR3YXJlLmlibS5jb20vd3NkZC9saWJyYXJ5L3RlY2hhcnRpY2xlcy8wMjAzX3NlYXJsZS9zZWFybGUxLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5Vc2luZyBBbnQgd2l0aCBXZWJTcGhlcmUgU3R1ZGlvIEFwcGxpY2F0aW9uIERldmVsb3BlcjoKLVBhcnQgMSBvZiAzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dzdiLnNvZnR3YXJlLmlibS5jb20vd3NkZC9saWJyYXJ5L3RlY2hhcnRpY2xlcy8wMjAzX3NlYXJsZS9zZWFybGUyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5Vc2luZyBBbnQgd2l0aCBXZWJTcGhlcmUgU3R1ZGlvIEFwcGxpY2F0aW9uIERldmVsb3BlcjoKLVBhcnQgMiBvZiAzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dzdiLnNvZnR3YXJlLmlibS5jb20vd3NkZC9saWJyYXJ5L3RlY2hhcnRpY2xlcy8wMjAzX3NlYXJsZS9zZWFybGUzLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5Vc2luZyBBbnQgd2l0aCBXZWJTcGhlcmUgU3R1ZGlvIEFwcGxpY2F0aW9uIERldmVsb3BlcjoKLVBhcnQgMyBvZiAzPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy90amFudC5odG1sIj5Xb3JraW5nIHdpdGggQW50PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1YzRmZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2phcHBjbGlwcm9qIj48YSBuYW1lPSJjamFwcGNsaXByb2oiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzPC9oMT4KLTxkaXY+PHA+IEFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBjb250YWluIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciBhcHBsaWNhdGlvbgotY2xpZW50IG1vZHVsZXMuIEFuIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgaXMgdXNlZCB0byBjb250YWluIGEgZnVsbC1mdW5jdGlvbgotY2xpZW50IEphdmHihKIgYXBwbGljYXRpb24gKG5vbiBXZWItYmFzZWQpIHRoYXQgY29ubmVjdHMgdG8gYW5kCi11c2VzIHRoZSBKMkVFIHJlc291cmNlcyBkZWZpbmVkIGluIHlvdXIgc2VydmVyLiBXaGVuIHlvdSBwbGFjZSB0aGUgY2xpZW50Ci1jb2RlIGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgaW5zdGVhZCBvZiBhIHNpbXBsZSBKQVIgZmlsZSwgdGhlIGFwcGxpY2F0aW9uCi1jbGllbnQgYmVuZWZpdHMgZnJvbSB0aGUgc2VydmVyJ3MgcmVzb3VyY2VzIChpdCBkb2VzIG5vdCBuZWVkIHRvIHJlLXNwZWNpZnkKLXRoZSBjbGFzcyBwYXRoIHRvIEoyRUUgYW5kIHNlcnZlciBKQVIgZmlsZXMpIGFzIHdlbGwgYXMgZnJvbSBlYXNpZXIgSk5ESSBsb29rdXAKLSh0aGUgY2xpZW50IGNvbnRhaW5lciBmaWxscyBpbiB0aGUgaW5pdGlhbCBjb250ZXh0IGFuZCBvdGhlciBwYXJhbWV0ZXJzKS4KLVRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbGxvd3MgeW91IHRvIHdvcmsgYXMgaWYgeW91IGFyZSBjcmVhdGluZyBhCi1zdGFuZGFsb25lIEphdmEgYXBwbGljYXRpb24gaW4gYSBKYXZhIHByb2plY3QuPC9wPgotPHA+QW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgZW5hYmxlcyB5b3UgdG8gZG8gdGhlIGZvbGxvd2luZyB0aGluZ3M6PC9wPgotPHVsPjxsaT5EZXZlbG9wIHRoZSBKYXZhIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIGNsaWVudCBtb2R1bGU8L2xpPgotPGxpPlNldCB0aGUgYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvcjwvbGk+Ci08bGk+VGVzdCB0aGUgYXBwbGljYXRpb24gY2xpZW50PC9saT4KLTwvdWw+Ci08cD5MaWtlIEphdmEgcHJvamVjdHMsIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBjb250YWluIHRoZQotcmVzb3VyY2VzIG5lZWRlZCBmb3IgYXBwbGljYXRpb24gY2xpZW50cywgaW5jbHVkaW5nIEphdmEgY2xhc3MKLWZpbGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QsIHRoZSBlbnZpcm9ubWVudCBpcwotc2V0IHVwIGZvciBKYXZhIGRldmVsb3BtZW50LiBBIEphdmEgPGVtPmJ1aWxkZXI8L2VtPiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi1wcm9qZWN0IHNvIHRoZSBKYXZhIHNvdXJjZSBjYW4gYmUgaW5jcmVtZW50YWxseSBjb21waWxlZCBhcyBpdCBpcyB1cGRhdGVkLgotVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIGhpZXJhcmNoeQotYW5kIEphdmEgZWxlbWVudHMuCi1UaGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgY3VycmVudCBhcyBjaGFuZ2VzIGFyZSBtYWRlLCBhbmQgdGhlIEphdmEgYnVpbGRlcgotd2lsbCBpbmNyZW1lbnRhbGx5IGNvbXBpbGUgdGhlIHJlc291cmNlcyB3aXRoaW4gdGhlc2UgcHJvamVjdHMgYXMgdGhlIHJlc291cmNlcwotYXJlIHVwZGF0ZWQuPC9wPgotPHA+SW4gdGhlIHdvcmtiZW5jaCwgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSBhbHdheXMgcmVmZXJlbmNlZCBieQotZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiAoRUFSKSBwcm9qZWN0cy4gV2hlbiB5b3UgY3JlYXRlIGFuIGFwcGxpY2F0aW9uIGNsaWVudAotcHJvamVjdCwgeW91IHNwZWNpZnkgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB0byB3aGljaCB0aGUgYXBwbGljYXRpb24KLWNsaWVudCBwcm9qZWN0IGJlbG9uZ3MuIEEgbW9kdWxlIGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YXBwbGljYXRpb24ueG1sPC9zYW1wPiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGZvciB0aGUgRUFSIHByb2plY3QuPC9wPgotPHA+QW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgaXMgZGVwbG95ZWQgYXMgYSBKQVIgZmlsZS4gVGhpcyBhcHBsaWNhdGlvbgotY2xpZW50IEpBUiBmaWxlIGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciB0aGUgYXBwbGljYXRpb24sIGluY2x1ZGluZyBKYXZhIGNsYXNzCi1maWxlcywgYW5kIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBhbmQgYW55IG1ldGEtZGF0YSBleHRlbnNpb25zCi1hbmQgYmluZGluZ3MgZmlsZXMuPC9wPgotPHA+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSB0eXBpY2FsbHkgcnVuIG9uIG5ldHdvcmtlZCBjbGllbnQgc3lzdGVtcwotY29ubmVjdGVkIHRvIEoyRUUgKEVKQikgc2VydmVycy4gVGhlIHBvaW50IG9mIGVudHJ5IGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50Ci1pcyBhIEphdmEgbWFpbi1jbGFzcywKLXdoaWNoIGlzIHNpbXBseSBhIEphdmEgY2xhc3MgdGhhdCBjb250YWlucyBhIHN0YXRpYyBtYWluIG1ldGhvZC4gVGhlIGNsYXNzCi1pcyBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZmlsZSBvZiB0aGUgY2xpZW50IG1vZHVsZS4gPC9wPgotPHA+QSBKMkVFIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBKMkVFIHNlcnZpY2UKLShKTkRJIG5hbWluZyBzZXJ2aWNlcywgZGVwbG95bWVudCBzZXJ2aWNlcywgdHJhbnNhY3Rpb24gc2VydmljZXMsIGFuZCBzZWN1cml0eQotc2VydmljZXMpIGFuZCBjb21tdW5pY2F0aW9ucyBBUElzIChpbnRlcm5ldCBwcm90b2NvbHMsIFJlbW90ZSBNZXRob2QgSW52b2NhdGlvbgotcHJvdG9jb2xzLCBPYmplY3QgTWFuYWdlbWVudCBHcm91cCBwcm90b2NvbHMsIE1lc3NhZ2luZyBwcm90b2NvbHMsIGFuZCBkYXRhCi1mb3JtYXRzKS48L3A+Ci08cD5CeSBkZWZhdWx0LCBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBvbmUgZm9sZGVyIG5hbWVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmFwcENsaWVudE1vZHVsZTwvc3Bhbj4sCi13aGljaCBjb250YWlucyBib3RoIEphdmEgc291cmNlIGNvZGUgYW5kIGNvbXBpbGVkIDxzYW1wIGNsYXNzPSJjb2RlcGgiPi5jbGFzczwvc2FtcD4gZmlsZXMsCi1hbG9uZyB3aXRoIGFsbCB0aGUgbWV0YS1kYXRhIGZpbGVzIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NRVRBLUlORjwvc3Bhbj4gc3ViZm9sZGVyLjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtcHJvamVjdHMuaHRtbCIgdGl0bGU9IlRoZSB3b3JrYmVuY2ggY2FuIHdvcmsgd2l0aCBtYW55IGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cy4gVGhlIGZvbGxvd2luZyB0b3BpY3MgY292ZXIgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIHNvbWUgb2YgdGhlIHR5cGVzIG9mIHByb2plY3RzIHJlbGF0ZWQgdG8gSjJFRSBkZXZlbG9wbWVudC4iPldvcmtpbmcgd2l0aCBwcm9qZWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqYXBwcHJvai5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgYSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiI+Q3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amV4cGFwcC5odG1sIiB0aXRsZT0iWW91IGNhbiBleHBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYXMgYSBKQVIgZmlsZS4iPkV4cG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqaW1wYXBwLmh0bWwiIHRpdGxlPSJBcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgYXJlIGRlcGxveWVkIGFzIEpBUiBmaWxlcy4gWW91IGNhbiBpbXBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgdGhhdCBoYXMgYmVlbiBkZXBsb3llZCBpbnRvIGEgSkFSIGZpbGUgYnkgdXNpbmcgdGhlIEltcG9ydCB3aXphcmQuIj5JbXBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcmNoLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwN2I1My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkoyRUUgYXJjaGl0ZWN0dXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjamFyY2giPjxhIG5hbWU9ImNqYXJjaCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5KMkVFIGFyY2hpdGVjdHVyZTwvaDE+Ci08ZGl2PjxwPlRoZSBKYXZh4oSiIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMKLWEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLjwvcD4KLTxwPlRoZSBKYXZh4oSiIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IKLWRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLjwvcD4KLTxwPlRoZSBlY29ub215IGFuZCB0ZWNobm9sb2d5IG9mIHRvZGF5IGhhdmUgaW50ZW5zaWZpZWQgdGhlIG5lZWQgZm9yIGZhc3RlciwKLW1vcmUgZWZmaWNpZW50LCBhbmQgbGFyZ2VyLXNjYWxlIGluZm9ybWF0aW9uIG1hbmFnZW1lbnQgc29sdXRpb25zLiBUaGUgSjJFRQotc3BlY2lmaWNhdGlvbiBzYXRpc2ZpZXMgdGhlc2UgY2hhbGxlbmdlcyBieSBwcm92aWRpbmcgYSBwcm9ncmFtbWluZyBtb2RlbAotdGhhdCBpbXByb3ZlcyBkZXZlbG9wbWVudCBwcm9kdWN0aXZpdHksIHN0YW5kYXJkaXplcyB0aGUgcGxhdGZvcm0gZm9yIGhvc3RpbmcKLWVudGVycHJpc2UgYXBwbGljYXRpb25zLCBhbmQgZW5zdXJlcyBwb3J0YWJpbGl0eSBvZiBkZXZlbG9wZWQgYXBwbGljYXRpb25zCi13aXRoIGFuIGV4dGVuc2l2ZSB0ZXN0IHN1aXRlLjwvcD4KLTxwPkoyRUUgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCBvZiBtdWx0aS10aWVyIGVudGVycHJpc2UKLWFwcGxpY2F0aW9ucy4gQSBKMkVFIGFwcGxpY2F0aW9uIHN5c3RlbSB0eXBpY2FsbHkgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB0aWVyczo8L3A+Ci08dWw+PGxpPjxzdHJvbmc+Q2xpZW50IHRpZXI8L3N0cm9uZz46IEluIHRoZSBjbGllbnQgdGllciwgV2ViIGNvbXBvbmVudHMsIHN1Y2ggYXMgU2VydmxldHMKLWFuZCBKYXZhU2VydmVyIFBhZ2VzIChKU1BzKSwgb3Igc3RhbmRhbG9uZSBKYXZhIGFwcGxpY2F0aW9ucyBwcm92aWRlIGEgZHluYW1pYwotaW50ZXJmYWNlIHRvIHRoZSBtaWRkbGUgdGllci48L2xpPgotPGxpPjxzdHJvbmc+TWlkZGxlIHRpZXI8L3N0cm9uZz46IEluIHRoZSBzZXJ2ZXIgdGllciwgb3IgbWlkZGxlIHRpZXIsIGVudGVycHJpc2UgYmVhbnMKLWFuZCBXZWIgU2VydmljZXMgZW5jYXBzdWxhdGUgcmV1c2FibGUsIGRpc3RyaWJ1dGFibGUgYnVzaW5lc3MgbG9naWMgZm9yIHRoZQotYXBwbGljYXRpb24uIFRoZXNlIHNlcnZlci10aWVyIGNvbXBvbmVudHMgYXJlIGNvbnRhaW5lZCBvbiBhIEoyRUUgQXBwbGljYXRpb24KLVNlcnZlciwgd2hpY2ggcHJvdmlkZXMgdGhlIHBsYXRmb3JtIGZvciB0aGVzZSBjb21wb25lbnRzIHRvIHBlcmZvcm0gYWN0aW9ucwotYW5kIHN0b3JlIGRhdGEuPC9saT4KLTxsaT48c3Ryb25nPkVudGVycHJpc2UgZGF0YSB0aWVyPC9zdHJvbmc+OiBJbiB0aGUgZGF0YSB0aWVyLCB0aGUgZW50ZXJwcmlzZSdzIGRhdGEgaXMKLXN0b3JlZCBhbmQgcGVyc2lzdGVkLCB0eXBpY2FsbHkgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLjwvbGk+Ci08L3VsPgotPHA+SjJFRSBhcHBsaWNhdGlvbnMgYXJlIGNvbXByaXNlZCBvZiBjb21wb25lbnRzLCBjb250YWluZXJzLCBhbmQgc2VydmljZXMuCi1Db21wb25lbnRzIGFyZSBhcHBsaWNhdGlvbi1sZXZlbCBjb21wb25lbnRzLiBXZWIgY29tcG9uZW50cywgc3VjaCBhcyBTZXJ2bGV0cwotYW5kIEpTUHMsIHByb3ZpZGUgZHluYW1pYyByZXNwb25zZXMgdG8gcmVxdWVzdHMgZnJvbSBhIFdlYiBwYWdlLiBFSkIgY29tcG9uZW50cwotY29udGFpbiBzZXJ2ZXItc2lkZSBidXNpbmVzcyBsb2dpYyBmb3IgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMuIFdlYiBhbmQgRUpCCi1jb21wb25lbnQgY29udGFpbmVycyBob3N0IHNlcnZpY2VzIHRoYXQgc3VwcG9ydCBXZWIgYW5kIEVKQiBtb2R1bGVzLjwvcD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEoyRUUgYXJjaGl0ZWN0dXJlIGFuZCBpdHMgaW1wbGljaXQgdGVjaG5vbG9naWVzLAotZG93bmxvYWQgYW5kIHJlYWQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kb3dubG9hZC5odG1sI3BsYXRmb3Jtc3BlYyIgdGFyZ2V0PSJfYmxhbmsiPkoyRUUgMS40IFNwZWNpZmljYXRpb248L2E+LjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtajJlZWFwcC5odG1sIiB0aXRsZT0iVGhlc2UgdG9waWNzIGRlYWwgd2l0aCB0aGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpLiI+SjJFRSBBcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIiB0aXRsZT0iQW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGNvbnRhaW5zIHRoZSBoaWVyYXJjaHkgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYW4gRUFSIGZpbGUuIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwiPkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGplYXIuaHRtbCI+Q3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gRUFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYnkgaW1wb3J0aW5nIGl0IGZyb20gYSBkZXBsb3llZCBFQVIgZmlsZS4iPkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb25zIGFyZSBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZS4gVXNlIHRoZSBFeHBvcnQgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4iPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amFwcHByb2ouaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4iPkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBhcHAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFzIGEgSkFSIGZpbGUuIj5FeHBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amltcGFwcC5odG1sIiB0aXRsZT0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSBkZXBsb3llZCBhcyBKQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHRoYXQgaGFzIGJlZW4gZGVwbG95ZWQgaW50byBhIEpBUiBmaWxlIGJ5IHVzaW5nIHRoZSBJbXBvcnQgd2l6YXJkLiI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqY2lyY2xlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamNpcmNsZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzRlMmNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqY2lyY2xlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5DeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKMkVFIG1vZHVsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNqY2lyY2xlIj48YSBuYW1lPSJjamNpcmNsZSI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKMkVFIG1vZHVsZXM8L2gxPgotPGRpdj48cD5BIGN5Y2xpY2FsIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gb3IgbW9yZSBtb2R1bGVzIGluIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24KLW1vc3QgY29tbW9ubHkgb2NjdXJzIHdoZW4gcHJvamVjdHMgYXJlIGltcG9ydGVkIGZyb20gb3V0c2lkZSBXZWJTcGhlcmU8c3VwPsKuPC9zdXA+IFN0dWRpby4KLVdoZW4gYSBjeWNsZSBleGlzdHMgYmV0d2VlbiB0d28gb3IgbW9yZSBtb2R1bGVzIGluIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24sCi10aGUgSmF2YeKEoiBidWlsZGVyCi1jYW5ub3QgYWNjdXJhdGVseSBjb21wdXRlIHRoZSBidWlsZCBvcmRlciBvZiB0aGUgcHJvamVjdHMuIEZ1bGwgYnVpbGRzIGZhaWwKLXVuZGVyIHRoZXNlIGNvbmRpdGlvbnMsIG9yIHJlcXVpcmUgc2V2ZXJhbCBpbnZvY2F0aW9ucy48L3A+Ci08cD5UaGVyZWZvcmUsIHRoZSBiZXN0IHByYWN0aWNlIGlzIHRvIGNvbXBvbmVudGl6ZSB5b3VyIHByb2plY3RzIG9yIG1vZHVsZXMuCi1UaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB5b3VyIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnVuY3Rpb24gYXMgYSB0cmVlIGluc3RlYWQKLW9mIGEgY3ljbGUgZGlhZ3JhbS4gVGhpcyBwcmFjdGljZSBoYXMgdGhlIGFkZGVkIGJlbmVmaXQgb2YgcHJvZHVjaW5nIGEgYmV0dGVyCi1mYWN0b3JlZCBhbmQgbGF5ZXJlZCBhcHBsaWNhdGlvbi48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIiB0aXRsZT0iVGhlc2UgdG9waWNzIGNvdmVyIGhvdyB0byBpbXBvcnQgZmlsZXMgYW5kIHByb2plY3RzIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgZXhwb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyB0byBkaXNrLiI+SW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgcHJvamVjdHMgYW5kIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amltcGVhci5odG1sIiB0aXRsZT0iRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgaW50byBFQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBieSBpbXBvcnRpbmcgaXQgZnJvbSBhIGRlcGxveWVkIEVBUiBmaWxlLiI+SW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amNpcmNsZWIuaHRtbCIgdGl0bGU9IllvdSBjYW4gcmVzb2x2ZSBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkLiI+Q29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2plYXJwcm9qLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamVhcnByb2ouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjOWM2ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamVhcnByb2ouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2plYXJwcm9qIj48YSBuYW1lPSJjamVhcnByb2oiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0czwvaDE+Ci08ZGl2PjxwPkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjb250YWlucyB0aGUgaGllcmFyY2h5IG9mIHJlc291cmNlcwotdGhhdCBhcmUgcmVxdWlyZWQgdG8gZGVwbG95IGEgSjJFRSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLCBvZnRlbiByZWZlcnJlZAotdG8gYXMgYW4gRUFSIGZpbGUuPC9wPgotPHA+QW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGFsc28gY29udGFpbnMgYSBzZXQgb2YgcmVmZXJlbmNlcyB0bwotb3RoZXIgSjJFRSBtb2R1bGVzIGFuZCBKYXZh4oSiIHByb2plY3RzIHRoYXQgYXJlIGNvbWJpbmVkIHRvIGNvbXBvc2UKLWFuIEVBUiBmaWxlLiBUaGVzZSBwcm9qZWN0cyBjYW4gYmUgV2ViIG1vZHVsZXMsIEVKQiBtb2R1bGVzLCBhcHBsaWNhdGlvbiBjbGllbnQKLW1vZHVsZXMsIGNvbm5lY3RvciBtb2R1bGVzLCBnZW5lcmFsIHV0aWxpdHkgSmF2YSBKQVIgZmlsZXMsIGFuZCBFSkIgY2xpZW50IEpBUiBmaWxlcy4KLUVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgY3JlYXRlZCBpbiB0aGUgd29ya2JlbmNoIGluY2x1ZGUgYSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLCBhcyB3ZWxsIGFzIGZpbGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgSjJFRSBtb2R1bGVzCi10aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuPC9wPgotPHA+V2hlbiBhIEoyRUUgbW9kdWxlIHByb2plY3QgaXMgY3JlYXRlZCwgaXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiBwcm9qZWN0LiBUaGUgcHJvamVjdCB3aXphcmRzIGFpZCB0aGlzIGJ5IGFsbG93aW5nIHlvdSB0byBzcGVjaWZ5Ci1hIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIEVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMKLWFyZSBleHBvcnRlZCBhcyBFQVIgKGVudGVycHJpc2UgYXJjaGl2ZSkgZmlsZXMgdGhhdCBpbmNsdWRlIGFsbCBmaWxlcyBkZWZpbmVkCi1pbiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IGFzIHdlbGwgYXMgdGhlIGFwcHJvcHJpYXRlIGFyY2hpdmUgZmlsZQotZm9yIGVhY2ggSjJFRSBtb2R1bGUgb3IgdXRpbGl0eSBKQVIgcHJvamVjdCBkZWZpbmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsCi1zdWNoIGFzIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIGFuZCBFSkIgSkFSIGZpbGVzLjwvcD4KLTxwPkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gY2FuIGNvbnRhaW4gdXRpbGl0eSBKQVIgZmlsZXMgdGhhdCBhcmUgdG8gYmUKLXVzZWQgYnkgdGhlIGNvbnRhaW5lZCBtb2R1bGVzLiBUaGlzIGFsbG93cyBzaGFyaW5nIG9mIGNvZGUgYXQgdGhlIGFwcGxpY2F0aW9uCi1sZXZlbCBieSBtdWx0aXBsZSBXZWIsIEVKQiwgb3IgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZXMuIFRoZXNlIEpBUiBmaWxlcwotYXJlIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIDxlbT51dGlsaXR5IEpBUiBmaWxlcy48L2VtPiBUaGUgdXRpbGl0eSBKQVIgZmlsZXMKLWRlZmluZWQgZm9yIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjYW4gYmUgYWN0dWFsIEpBUiBmaWxlcyBpbiB0aGUKLXByb2plY3QsIG9yIHlvdSBjYW4gaW5jbHVkZSB1dGlsaXR5IEphdmEgcHJvamVjdHMgdGhhdCBhcmUgZGVzaWduYXRlZCB0byBiZWNvbWUKLXRoZSB1dGlsaXR5IEpBUiBmaWxlcyBkdXJpbmcgYXNzZW1ibHkgYW5kIGRlcGxveW1lbnQuPC9wPgotPHA+VG8gc3RhcnQgZGV2ZWxvcGluZyBKMkVFIGFwcGxpY2F0aW9ucywgeW91IHR5cGljYWxseSBmaXJzdCBjcmVhdGUgYW4gZW50ZXJwcmlzZQotYXBwbGljYXRpb24gcHJvamVjdCB0byBjb250YWluIHlvdXIgV2ViLCBFSkIsIGFuZCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcy4KLVRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaXMgdXNlZCB0byBjb21wb3NlIGFuIGVudGlyZSBhcHBsaWNhdGlvbgotZnJvbSB0aGUgdmFyaW91cyBtb2R1bGVzLiBTaW5jZSBubyBzb3VyY2UgY29kZSBpcyBidWlsdCBkaXJlY3RseSBpbnRvIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uLCB0aGVzZSBwcm9qZWN0cyBhcmUgbm90IEphdmEgcHJvamVjdHMsIGFuZCB0aGV5IGFyZSBub3QgY29tcGlsZWQKLWJ5IHRoZSBKYXZhIGJ1aWxkZXIuPC9wPgotPGRpdiBjbGFzcz0icCI+V2hlbiB5b3UgY3JlYXRlIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB1c2luZyB0aGUgd29ya2JlbmNoLAotdGhlIGZvbGxvd2luZyBrZXkgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZDo8ZGw+PGR0IGNsYXNzPSJkbHRlcm0iPk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbDwvZHQ+Ci08ZGQ+VGhpcyBmaWxlIGlzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLAotYXMgZGVmaW5lZCBpbiB0aGUgSjJFRSBzcGVjaWZpY2F0aW9uLCB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBhc3NvY2lhdGluZwotSjJFRSBtb2R1bGVzIHRvIGEgc3BlY2lmaWMgRUFSIGZpbGUuIEl0IGlzIGNyZWF0ZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1FVEEtSU5GPC9zcGFuPiBmb2xkZXIuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5NRVRBLUlORi8ubW9kdWxlbWFwczwvZHQ+Ci08ZGQ+VGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYXBwaW5ncyB0byB0aGUgY29udGFpbmVkIG1vZHVsZXMgYW5kIHV0aWxpdHkgSkFSCi1wcm9qZWN0cy48L2RkPgotPC9kbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+VGhlIGZvbGxvd2luZyB3b3JrYmVuY2ggYXJ0aWZhY3RzIGFyZSBhbHNvIGNyZWF0ZWQgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotcHJvamVjdCBidXQgd2lsbCBub3QgYmVjb21lIHBhcnQgb2YgdGhlIEVBUiBmaWxlLCBhbmQgeW91IHNob3VsZCBub3QgZWRpdAotdGhlbSBtYW51YWxseTo8ZGw+PGR0IGNsYXNzPSJkbHRlcm0iPi5qMmVlPC9kdD4KLTxkZD5UaGlzIGlzIGEgd29ya2JlbmNoIGFydGlmYWN0IHRoYXQgaW5jbHVkZXMgdGhlIHByb2R1Y3QgdmVyc2lvbiBhbmQgSjJFRQotc3BlY2lmaWNhdGlvbiBsZXZlbCBmb3IgdGhlIHByb2plY3QuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj4ucHJvamVjdDwvZHQ+Ci08ZGQ+VGhpcyBpcyBhIHdvcmtiZW5jaCBhcnRpZmFjdCwgdGhlIHN0YW5kYXJkIHByb2plY3QgZGVzY3JpcHRpb24gZmlsZS48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPi5ydW50aW1lPC9kdD4KLTxkZD5UaGlzIGlzIGEgd29ya2JlbmNoIGFydGlmYWN0IHRoYXQgY29udGFpbnMgdGhlIHRhcmdldCBzZXJ2ZXIgZGVmaW5pdGlvbi48L2RkPgotPC9kbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1wcm9qZWN0cy5odG1sIiB0aXRsZT0iVGhlIHdvcmtiZW5jaCBjYW4gd29yayB3aXRoIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIHRvcGljcyBjb3ZlciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgc29tZSBvZiB0aGUgdHlwZXMgb2YgcHJvamVjdHMgcmVsYXRlZCB0byBKMkVFIGRldmVsb3BtZW50LiI+V29ya2luZyB3aXRoIHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2Ugc2VydmljZXMuIj5KMkVFIGFyY2hpdGVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGplYXIuaHRtbCI+Q3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gRUFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYnkgaW1wb3J0aW5nIGl0IGZyb20gYSBkZXBsb3llZCBFQVIgZmlsZS4iPkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb25zIGFyZSBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZS4gVXNlIHRoZSBFeHBvcnQgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4iPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9janBlcnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqcGVycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YThmNWZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqcGVycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+SjJFRSBwZXJzcGVjdGl2ZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2pwZXJzIj48YSBuYW1lPSJjanBlcnMiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SjJFRSBwZXJzcGVjdGl2ZTwvaDE+Ci08ZGl2PjxwPlRoZSBKMkVFIHBlcnNwZWN0aXZlIGluY2x1ZGVzIHdvcmtiZW5jaCB2aWV3cyB0aGF0IHlvdSBjYW4gdXNlCi13aGVuIGRldmVsb3BpbmcgcmVzb3VyY2VzIGZvciBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucywgRUpCIG1vZHVsZXMsIFdlYiBtb2R1bGVzLAotYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZXMsIGFuZCBjb25uZWN0b3IgcHJvamVjdHMgb3IgbW9kdWxlcy48L3A+Ci08cD5Zb3UgY2FuIHJlYXJyYW5nZSB0aGUgbG9jYXRpb24sIHRpbGluZywgYW5kIHNpemUgb2YgdGhlIHZpZXdzIHdpdGhpbiB0aGUKLXBlcnNwZWN0aXZlLiBZb3UgY2FuIGFsc28gYWRkIG90aGVyIHZpZXdzIHRvIHRoZSBKMkVFIHBlcnNwZWN0aXZlIGJ5IGNsaWNraW5nIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNob3cgVmlldzwvc3Bhbj48L3NwYW4+IGFuZAotc2VsZWN0aW5nIHRoZSB2aWV3LjwvcD4KLTxwPlRoZSB3b3JrYmVuY2ggcHJvdmlkZXMgc3luY2hyb25pemF0aW9uIGJldHdlZW4gZGlmZmVyZW50IHZpZXdzIGFuZCBlZGl0b3JzLgotVGhpcyBpcyBhbHNvIHRydWUgaW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUuPC9wPgotPHA+QnkgZGVmYXVsdCwgdGhlIEoyRUUgcGVyc3BlY3RpdmUgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB3b3JrYmVuY2ggdmlld3M6PC9wPgotPGRsPjxkdCBjbGFzcz0iZGx0ZXJtIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPjwvZHQ+Ci08ZGQ+VGhlIFByb2plY3QgRXhwbG9yZXIgcHJvdmlkZXMgYW4gaW50ZWdyYXRlZCB2aWV3IG9mIHlvdXIgcHJvamVjdHMsIGdyb3VwZWQKLWJ5IHR5cGUsIGFuZCB0aGVpciBhcnRpZmFjdHMgcmVsYXRlZCB0byBKMkVFIGRldmVsb3BtZW50LiBJdCBkaXNwbGF5cyBuYXZpZ2FibGUKLW1vZGVscyBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMsIEphdmHihKIgYXJ0aWZhY3RzIChzb3VyY2UgZm9sZGVycywgcGFja2FnZXMsCi1hbmQgY2xhc3NlcyksIG5hdmlnYWJsZSBtb2RlbHMgb2YgdGhlIGF2YWlsYWJsZSBXZWIgc2VydmljZXMsIGFuZCBzcGVjaWFsaXplZAotdmlld3Mgb2YgV2ViIG1vZHVsZXMgdG8gc2ltcGxpZnkgdGhlIGRldmVsb3BtZW50IG9mIGR5bmFtaWMgV2ViIGFwcGxpY2F0aW9ucy4KLUluIGFkZGl0aW9uLCBFSkIgZGF0YWJhc2UgbWFwcGluZyBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgcHJvamVjdHMgZm9yIGEKLUoyRUUgYXBwbGljYXRpb24gc2VydmVyIGFyZSBtYWRlIHJlYWRpbHkgYXZhaWxhYmxlLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+IE91dGxpbmU8L3NwYW4+PC9kdD4KLTxkZD5UaGUgT3V0bGluZSB2aWV3IGluIHRoZSBKMkVFIHBlcnNwZWN0aXZlIHNob3dzIHRoZSBvdXRsaW5lIG9mIHRoZSBmaWxlCi10aGF0IHlvdSBhcmUgZWRpdGluZy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdXNpbmcgYSB0YWJiZWQgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lZGl0b3IsIHRoZSBPdXRsaW5lIHZpZXcgc2hvd3MgdGhlIG91dGxpbmUgZm9yIHRoZSBzZWxlY3RlZCBwYWdlJ3MgZWxlbWVudHMsCi1hbmQgaWYgeW91IGFyZSBlZGl0aW5nIG9uIHRoZSBTb3VyY2UgdGFiLCB0aGUgb3V0bGluZSBmb3IgdGhlIFhNTCBzb3VyY2UgaXMKLWRpc3BsYXllZC4gSWYgeW91IGFyZSBlZGl0aW5nIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgSmF2YSBlZGl0b3IsCi10aGUgT3V0bGluZSB2aWV3IHNob3dzIHRoZSBvdXRsaW5lIGZvciB0aGUgSmF2YSBjbGFzcy48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhc2tzPC9zcGFuPjwvZHQ+Ci08ZGQ+VGhlIFRhc2tzIHZpZXcgbGlzdHMgdGhlIHRvLWRvIGl0ZW1zIHRoYXQgeW91IGhhdmUgZW50ZXJlZC48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2JsZW1zPC9zcGFuPjwvZHQ+Ci08ZGQ+VGhlIFByb2JsZW1zIHZpZXcgZGlzcGxheXMgcHJvYmxlbXMsIHdhcm5pbmdzLCBvciBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoCi10aGUgc2VsZWN0ZWQgcHJvamVjdC4gWW91IGNhbiBkb3VibGUtY2xpY2sgb24gYW4gaXRlbSB0byBhZGRyZXNzIHRoZSBzcGVjaWZpYwotcHJvYmxlbSBpbiB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPjwvZHQ+Ci08ZGQ+VGhlIFByb3BlcnRpZXMgdmlldyBwcm92aWRlcyBhIHRhYnVsYXIgdmlldyBvZiB0aGUgcHJvcGVydGllcyBhbmQgYXNzb2NpYXRlZAotdmFsdWVzIG9mIG9iamVjdHMgaW4gZmlsZXMgeW91IGhhdmUgb3BlbiBpbiBhbiBlZGl0b3IuIEZvciBleGFtcGxlLCB5b3UgY2FuCi1zcGVjaWZ5IGNvbnZlcnRlcnMgaW4gdGhlIFByb3BlcnRpZXMgdmlldyBvZiB0aGUgTWFwcGluZyBlZGl0b3IuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5TdGF0dXMgYmFyPC9zcGFuPjwvZHQ+Ci08ZGQ+VGhlIFN0YXR1cyBiYXIgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYXRpb24gb2Ygc2VsZWN0ZWQgb2JqZWN0cwotaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlld3MgaW4gdGhlIGxlZnQgc2lkZS4gV2hlbiBmaWxlIGFuZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi1hcmUgb3BlbiwgdGhlIHN0YXR1cyBiYXIgc2hvd3MgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiB0aGUgZmlsZXMgYW5kIHRoZSBsaW5lCi1hbmQgY29sdW1uIG51bWJlcnMgd2hlbiBhcHBsaWNhYmxlLiBTb21ldGltZXMgd2hlbiBsb25nIG9wZXJhdGlvbnMgcnVuLCBhCi1zdGF0dXMgbW9uaXRvciB3aWxsIGFwcGVhciBpbiB0aGUgc3RhdHVzIGJhciwgYWxvbmcgd2l0aCBhIGJ1dHRvbiB3aXRoIGEgc3RvcAotc2lnbiBpY29uLiBDbGlja2luZyB0aGUgc3RvcCBzaWduIHN0b3BzIHRoZSBvcGVyYXRpb24gd2hlbiB0aGUgb3BlcmF0aW9uIGNhbgotYmUgY2FuY2VsbGVkLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VydmVyczwvc3Bhbj48L2R0PgotPGRkPlRoZSBTZXJ2ZXJzIHZpZXcgc2hvd3MgYWxsIHRoZSBjcmVhdGVkIHNlcnZlciBpbnN0YW5jZXMuIFlvdSBjYW4gc3RhcnQKLWFuZCBzdG9wIGVhY2ggc2VydmVyIGZyb20gdGhpcyB2aWV3LCBhbmQgeW91IGNhbiBsYXVuY2ggdGhlIHRlc3QgY2xpZW50LjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+U25pcHBldHM8L3NwYW4+PC9kdD4KLTxkZD5UaGUgU25pcHBldHMgdmlldyBwcm92aWRlcyBjYXRlZ29yaXplZCBwaWVjZXMgb2YgY29kZSB0aGF0Ci15b3UgY2FuIGluc2VydCBpbnRvIGFwcHJvcHJpYXRlIHBsYWNlcyBpbiB5b3VyIHNvdXJjZSBjb2RlLjwvZGQ+Ci08L2RsPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1qMmVlYXBwLmh0bWwiIHRpdGxlPSJUaGVzZSB0b3BpY3MgZGVhbCB3aXRoIHRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkuIj5KMkVFIEFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2Nqdmlldy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2p2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMTA4MTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2p2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgaW4gdGhlIEoyRUUgcGVyc3BlY3RpdmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNqdmlldyI+PGEgbmFtZT0iY2p2aWV3Ij48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByb2plY3QgRXhwbG9yZXIgdmlldyBpbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZTwvaDE+Ci08ZGl2PjxwPldoaWxlIGRldmVsb3BpbmcgSjJFRSBhcHBsaWNhdGlvbnMgaW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUsIHRoZQotUHJvamVjdCBFeHBsb3JlciB2aWV3IGlzIHlvdXIgbWFpbiB2aWV3IG9mIHlvdXIgSjJFRSBwcm9qZWN0cyBhbmQgcmVzb3VyY2VzLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyIHZpZXc8L2g0PlRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgcHJvdmlkZXMKLWFuIGludGVncmF0ZWQgdmlldyBvZiBhbGwgcHJvamVjdCByZXNvdXJjZXMsIGluY2x1ZGluZyBtb2RlbHMgb2YgSjJFRSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9ycywgSmF2YeKEoiBhcnRpZmFjdHMsIHJlc291cmNlcywgV2ViIHNlcnZpY2VzLCBkYXRhYmFzZXMsCi1hbmQgZHluYW1pYyBXZWIgcHJvamVjdCBhcnRpZmFjdHMuPHA+WW91IHNob3VsZCB1c2UgdGhpcyB2aWV3IHRvIHdvcmsgd2l0aAoteW91ciBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYW5kIHRoZWlyIGNvbnRlbnQuIFlvdSBjYW4gZWFzaWx5IHZpZXcgYW4KLWVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBhbmQgc2VlIGFsbCBvZiB0aGUgbW9kdWxlcyBhc3NvY2lhdGVkIHdpdGgKLWl0LiA8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGltYWdlIHNob3dzIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgd2l0aCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R3JvdXAKLXByb2plY3RzIGJ5IHR5cGU8L3NwYW4+IG9wdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbGJhcjo8YnIgLz48aW1nIHNyYz0iLi4vaW1hZ2VzL1Byb2plY3RFeHBsb3Jlci5naWYiIGFsdD0iU2NyZWVuIGNhcHR1cmUgb2YgdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyIgLz48YnIgLz48L3A+Ci08ZGw+PGR0IGNsYXNzPSJkbHRlcm0iPkVudGVycHJpc2UgQXBwbGljYXRpb25zPC9kdD4KLTxkZD5TaG93cyBhIGhpZXJhcmNoaWNhbCBtb2RlbCBvZiBhbGwgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cy48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0czwvZHQ+Ci08ZGQ+U2hvd3MgYSBoaWVyYXJjaGljYWwgbW9kZWwgb2YgYWxsIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+Q29ubmVjdG9yIFByb2plY3RzPC9kdD4KLTxkZD5TaG93cyBhIGhpZXJhcmNoaWNhbCBtb2RlbCBvZiBhbGwgY29ubmVjdG9yIG1vZHVsZXMuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5EeW5hbWljIFdlYiBQcm9qZWN0czwvZHQ+Ci08ZGQ+U2hvd3MgYSBoaWVyYXJjaGljYWwgbW9kZWwgb2YgYWxsIGR5bmFtaWMgV2ViIG1vZHVsZXMuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5FSkIgUHJvamVjdHM8L2R0PgotPGRkPlNob3dzIGEgaGllcmFyY2hpY2FsIG1vZGVsIG9mIGFsbCBFSkIgcHJvamVjdHMuIEVhY2ggRUpCIHByb2plY3QgY29udGFpbnMKLXRoZSBmb2xsb3dpbmcgc3ViLWZvbGRlcnMgZm9yIG9yZ2FuaXppbmcgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBiZWFucyBhbmQKLXRoZSBtYXBwaW5nczogPHVsPjxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXNzaW9uIEJlYW5zPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW50aXR5IEJlYW5zPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWVzc2FnZS1Ecml2ZW4gQmVhbnM8L3NwYW4+PC9saT4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXBzPC9zcGFuPjwvbGk+Ci08L3VsPgotPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5PdGhlciBQcm9qZWN0czwvZHQ+Ci08ZGQ+U2hvd3MgYW55IG5vbi1KMkVFIG1vZHVsZSBwcm9qZWN0cywgc3VjaCBhcyBKYXZhIHByb2plY3RzLiBUaGVzZSBKYXZhIHByb2plY3RzCi1jYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6IDx1bD48bGk+VXRpbGl0eSBwcm9qZWN0cyBmb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0cyBpbiB5b3VyCi13b3Jrc3BhY2U8L2xpPgotPGxpPkVKQiBDbGllbnQgSkFSIFByb2plY3RzLCB3aGljaCBpbmNsdWRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIGNsYXNzZXMgKHJlbW90ZSwKLWhvbWUsIGxvY2FsLCBvciBsb2NhbCBob21lIGludGVyZmFjZXMpIGZvciBiZWFucyBpbiBFSkIgcHJvamVjdHM8L2xpPgotPGxpPkphdmEgcHJvamVjdHMKLXRoYXQgYXJlIGluIHlvdXIgd29ya3NwYWNlIGJ1dCB1bnJlbGF0ZWQgdG8geW91ciBKMkVFIGRldmVsb3BtZW50PC9saT4KLTwvdWw+Ci08L2RkPgotPC9kbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1qMmVlYXBwLmh0bWwiIHRpdGxlPSJUaGVzZSB0b3BpY3MgZGVhbCB3aXRoIHRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkuIj5KMkVFIEFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLWFudGVqYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtYW50ZWpiLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMzI1YjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtYW50ZWpiLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPjwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+QW50IHRhc2tzIGZvciBFSkItZW5hYmxlZCB0b29sczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icGgtYW50ZWpiIj48YSBuYW1lPSJwaC1hbnRlamIiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QW50IHRhc2tzIGZvciBFSkItZW5hYmxlZCB0b29sczwvaDE+Ci08ZGl2PjxwPjwvcD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YW50YXhibi5odG1sIj5BY2Nlc3NCZWFuUmVnZW5lcmF0aW9uPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YXNrIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVnZW5lcmF0ZQotQWNjZXNzIEJlYW5zPC9zcGFuPiBtZW51IGFjdGlvbiwgZm9yIHJlZ2VuZXJhdGluZyBhY2Nlc3MgYmVhbnMgaW4gYW4KLUVKQiBwcm9qZWN0LiBUaGlzIGlzIG5vdCBhdmFpbGFibGUgaW4gV2ViU3BoZXJlPHN1cD7Crjwvc3VwPiBTdHVkaW8gU2l0ZSBEZXZlbG9wZXIgb3IgV2ViU3BoZXJlIEFwcGxpY2F0aW9uCi1TZXJ2ZXIgRXhwcmVzcy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudGVqYmQuaHRtbCI+RUpCRGVwbG95PC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YXNrIGdlbmVyYXRlcyBkZXBsb3ltZW50IGNvZGUgYW5kIFJNSUMgY29kZSBmb3IgYW4gRUpCIFByb2plY3QuCi1Pbmx5IGF2YWlsYWJsZSB3aGVyZSBFSkIgZGVwbG95IHRvb2xzIGFyZSBhdmFpbGFibGUuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRlamJlLmh0bWwiPkVKQkV4cG9ydDwvYT48L3N0cm9uZz48YnIgLz4KLVRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIEVKQiBKQVIgZmlsZSBleHBvcnQKLXdpemFyZCBmb3IgZXhwb3J0aW5nIGFuIEVKQiBQcm9qZWN0IHRvIGFuIEVKQiBKYXIgZmlsZS4gVGhpcyB0YXNrIGlzIG5vdCBhdmFpbGFibGUKLWluIHByb2R1Y3RzIHRoYXQgZG8gbm90IGluY2x1ZGUgRUpCIGRldmVsb3BtZW50IHRvb2xzLjwvbGk+Ci08L3VsPgotCi08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RqYW50Lmh0bWwiPldvcmtpbmcgd2l0aCBBbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNTQ2NjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtYW50Z2VuZXJhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi0KLQotCi0KLQotCi0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5HZW5lcmFsIEFudCB0YXNrczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icGgtYW50Z2VuZXJhbCI+PGEgbmFtZT0icGgtYW50Z2VuZXJhbCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5HZW5lcmFsIEFudCB0YXNrczwvaDE+Ci08ZGl2PjxwPjwvcD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCI+Y2FwdHVyZUJ1aWxkTWVzc2FnZXM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIHRhc2sgY2FwdHVyZXMgQW50IGJ1aWxkIG1lc3NhZ2VzIGFuZCBhbGxvd3MgdGhlbSB0byBiZSBzZWFyY2hlZAotb3IgZGlzcGxheWVkLCBhbmQgYWxsb3dzIGNvbmRpdGlvbmFsIEFudCBidWlsZCBmYWlsdXJlcyBkZXBlbmRpbmcgb24gd2hldGhlcgotb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjb21waWxldy5odG1sIj5jb21waWxlV29ya3NwYWNlPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24KLWFzIGphdmFjLiBXaGlsZSB0aGlzIHRhc2sgaXMgcnVubmluZywgYWxsIHRoZSB2YWxpZGF0aW9uIGFuZCBvdGhlciBidWlsZGVycwotYXJlIHR1cm5lZCBvZjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0ai5odG1sIj5nZXRKYXZhY0Vycm9yQ291bnQ8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3IgY291bnQgZm9yIHRoZSBsYXN0IGludGVybmFsIGphdmFjIGNvbXBpbGF0aW9uCi1vZiB0aGUgc3BlY2lmaWVkIHByb2plY3QuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRnZXRwLmh0bWwiPmdldFByb2plY3REYXRhPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YXNrIGdldHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGluZm9ybWF0aW9uLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvai5odG1sIj5wcm9qZWN0QnVpbGQ8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIHRhc2sgYnVpbGRzIHRoZSBzcGVjaWZpZWQgcHJvamVjdC48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RnZXRlcnJvcnMuaHRtbCI+cHJvamVjdEdldEVycm9yczwvYT48L3N0cm9uZz48YnIgLz4KLVRoaXMgdGFzayBnZXRzIHRoZSBlcnJvcnMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4gSXQgaXMgYSBzdWJzZXQKLW9mIHRoZSBwcm9qZWN0QnVpbGQgdGFzayAoaXQgZG9lcyBub3QgZG8gYSBidWlsZCwgaXQganVzdCBnZXRzIHByb2plY3QgZXJyb3JzCi1yZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCk8L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RpbXBvcnQuaHRtbCI+cHJvamVjdEltcG9ydDwvYT48L3N0cm9uZz48YnIgLz4KLVRoaXMgdGFzayBpbXBvcnRzIGFuIGV4aXN0aW5nIGZpbGUgc3lzdGVtIHByb2plY3QgaW50byBhIHdvcmtzcGFjZS48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RzZXRidWlsZC5odG1sIj5wcm9qZWN0U2V0QnVpbGQ8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIHRhc2sgYnVpbGRzIGEgc2V0IG9mIEVjbGlwc2UgcHJvamVjdHMgdXNpbmcgYW4gZXhpc3RpbmcgRWNsaXBzZQotdGVhbSBQcm9qZWN0IFNldCBGaWxlICgiUFNGIikuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZwotYW4gRWNsaXBzZSB0ZWFtICJQcm9qZWN0IFNldCBFeHBvcnQiIGNvbW1hbmQsIGFuZCB0aGVuIHRoZSB0YXNrIHByb2plY3RTZXRJbXBvcnQKLW11c3QgaGF2ZSBiZWVuIHVzZWQgdG8gaW1wb3J0IHRob3NlIHByb2plY3RzIGludG8gYSB3b3Jrc3BhY2UuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0aW1wb3J0Lmh0bWwiPnByb2plY3RTZXRJbXBvcnQ8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoUFNGKQotaW50byBhIHdvcmtzcGFjZS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbQotIlByb2plY3QgU2V0IEV4cG9ydCIgY29tbWFuZC48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudHNldGQuaHRtbCI+c2V0RGVidWdJbmZvPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YXNrIHNldHMgdGhlIGludGVybmFsIEphdmHihKIgY29tcGlsYXRpb24gZGVidWcgbGV2ZWwsIGFuZCByZXR1cm5zCi10aGUgY3VycmVudCBzZXR0aW5ncy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWJ1aWxkLmh0bWwiPndvcmtzcGFjZUJ1aWxkPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YXNrIGJ1aWxkcyB0aGUgZW50aXJlIHdvcmtzcGFjZS48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWdldGVycm9ycy5odG1sIj53b3Jrc3BhY2VHZXRFcnJvcnM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgZW50aXJlIHdvcmtzcGFjZS4gSXQgaXMgYSBzdWJzZXQKLW9mIHRoZSB3b3Jrc3BhY2VCdWlsZCB0YXNrIChpdCBkb2VzIG5vdCBkbyBhIGJ1aWxkLCBpdCBqdXN0IGdldHMgd29ya3NwYWNlCi1lcnJvcnMgcmVnYXJkbGVzcyBvZiBob3cgdGhleSB3ZXJlIGNyZWF0ZWQpLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWZpbGUuaHRtbCI+d29ya3NwYWNlUHJlZmVyZW5jZUZpbGU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIHRhc2sgcmVhZHMgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMKLWFuZCBzZXRzIHRob3NlIHByZWZlcmVuY2VzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sIj53b3Jrc3BhY2VQcmVmZXJlbmNlR2V0PC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YXNrIGdldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlc2V0Lmh0bWwiPndvcmtzcGFjZVByZWZlcmVuY2VTZXQ8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIHRhc2sgc2V0cyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcy48L2xpPgotPC91bD4KLQotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy90amFudC5odG1sIj5Xb3JraW5nIHdpdGggQW50PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtYW50ajJlZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtYW50ajJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjc1Nzg4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLWFudGoyZWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkFudCB0YXNrcyBmb3IgSjJFRTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icGgtYW50ajJlZSI+PGEgbmFtZT0icGgtYW50ajJlZSI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BbnQgdGFza3MgZm9yIEoyRUU8L2gxPgotPGRpdj48cD48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudGF1dG9hcHBpbnN0YWxsLmh0bWwiPmF1dG9BcHBJbnN0YWxsPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YXNrIHVzZXMgdGhlIFdlYlNwaGVyZTxzdXA+wq48L3N1cD4gUmFwaWQgRGVwbG95IGZlYXR1cmUgdG8KLWluc3RhbGwgYW4gYXBwbGljYXRpb24uPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRhcHBjLmh0bWwiPkFwcENsaWVudEV4cG9ydDwvYT48L3N0cm9uZz48YnIgLz4KLVRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIEFwcGxpY2F0aW9uIENsaWVudAotZXhwb3J0IHdpemFyZCBmb3IgZXhwb3J0aW5nIGFuIEFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0IHRvIGFuIEFwcGxpY2F0aW9uCi1DbGllbnQgSkFSIGZpbGUuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRlYXJlLmh0bWwiPkVBUkV4cG9ydDwvYT48L3N0cm9uZz48YnIgLz4KLVRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIEVBUiBmaWxlIGV4cG9ydCB3aXphcmQKLWZvciBleHBvcnRpbmcgYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0IHRvIGFuIEVBUiBmaWxlLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YW50dXRpbC5odG1sIj5VdGlsSmFyPC9hPjwvc3Ryb25nPjxiciAvPgotKERFUFJFQ0FURUQpIFRoaXMgdGFzayBjb21wcmVzc2VzIHNvdXJjZSBhbmQvb3IgYnVpbGQgb3V0cHV0IG9mCi1hIEphdmHihKIgcHJvamVjdAotaW50byBhIEpBUiBmaWxlIGFuZCBwbGFjZXMgdGhlIEpBUiBmaWxlIGluIGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdC48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudHdhcmUuaHRtbCI+V0FSRXhwb3J0PC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YXNrIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgV0FSIGZpbGUgZXhwb3J0IHdpemFyZAotZm9yIGV4cG9ydGluZyBhIFdlYiBQcm9qZWN0IHRvIGEgV0FSIGZpbGUuPC9saT4KLTwvdWw+Ci0KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGphbnQuaHRtbCI+V29ya2luZyB3aXRoIEFudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtaW1wb3J0ZXhwb3J0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzEyNzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtaW1wb3J0ZXhwb3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5JbXBvcnRpbmcgYW5kIGV4cG9ydGluZyBwcm9qZWN0cyBhbmQgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InBoLWltcG9ydGV4cG9ydCI+PGEgbmFtZT0icGgtaW1wb3J0ZXhwb3J0Ij48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHByb2plY3RzIGFuZCBmaWxlczwvaDE+Ci08ZGl2PjxwPlRoZXNlIHRvcGljcyBjb3ZlciBob3cgdG8gaW1wb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyBpbnRvIHRoZSB3b3JrYmVuY2gKLWFuZCBleHBvcnQgZmlsZXMgYW5kIHByb2plY3RzIHRvIGRpc2suPC9wPgotPC9kaXY+Ci08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwYXBwLmh0bWwiPkV4cG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvYT48L3N0cm9uZz48YnIgLz4KLVlvdSBjYW4gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFzIGEgSkFSIGZpbGUuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwZWFyLmh0bWwiPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1FbnRlcnByaXNlIGFwcGxpY2F0aW9ucyBhcmUgZGVwbG95ZWQgaW4gdGhlIGZvcm0gb2YgYW4gRUFSIGZpbGUuCi1Vc2UgdGhlIEV4cG9ydCB3aXphcmQgdG8gZXhwb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBpbnRvIGFuCi1FQVIgZmlsZSBmb3IgZGVwbG95bWVudC48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGpleHByYXIuaHRtbCI+RXhwb3J0aW5nIGNvbm5lY3RvciBwcm9qZWN0cyB0byBSQVIgZmlsZXM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Zb3UgY2FuIGV4cG9ydCBhIGNvbm5lY3RvciBwcm9qZWN0IHRvIGEgUkFSIGZpbGUgaW4gcHJlcGFyYXRpb24KLWZvciBkZXBsb3lpbmcgaXQgdG8gYSBzZXJ2ZXIuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqaW1wZWFyLmh0bWwiPkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlPC9hPjwvc3Ryb25nPjxiciAvPgotRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgaW50byBFQVIgZmlsZXMuIFlvdQotY2FuIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYnkgaW1wb3J0aW5nIGl0IGZyb20gYSBkZXBsb3llZAotRUFSIGZpbGUuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqaW1wYXBwLmh0bWwiPkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgYXJlIGRlcGxveWVkIGFzIEpBUiBmaWxlcy4gWW91IGNhbgotaW1wb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHRoYXQgaGFzIGJlZW4gZGVwbG95ZWQgaW50byBhIEpBUiBmaWxlCi1ieSB1c2luZyB0aGUgSW1wb3J0IHdpemFyZC48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGppbXByYXIuaHRtbCI+SW1wb3J0aW5nIGEgY29ubmVjdG9yIHByb2plY3QgUkFSIGZpbGU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Db25uZWN0b3IgcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gUkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydAotYSBjb25uZWN0b3IgcHJvamVjdCBieSBpbXBvcnRpbmcgYSBkZXBsb3llZCBSQVIgZmlsZS48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvY2pjaXJjbGUuaHRtbCI+Q3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gSjJFRSBtb2R1bGVzPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqY2lyY2xlYi5odG1sIj5Db3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVIgaXMgaW1wb3J0ZWQ8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Zb3UgY2FuIHJlc29sdmUgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZC48L2xpPgotPC91bD4KLQotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1wcm9qZWN0cy5odG1sIiB0aXRsZT0iVGhlIHdvcmtiZW5jaCBjYW4gd29yayB3aXRoIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIHRvcGljcyBjb3ZlciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgc29tZSBvZiB0aGUgdHlwZXMgb2YgcHJvamVjdHMgcmVsYXRlZCB0byBKMkVFIGRldmVsb3BtZW50LiI+V29ya2luZyB3aXRoIHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtajJlZWFwcC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtajJlZWFwcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWFhNWZkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLWoyZWVhcHAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkoyRUUgQXBwbGljYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwaC1qMmVlYXBwIj48YSBuYW1lPSJwaC1qMmVlYXBwIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkoyRUUgQXBwbGljYXRpb25zPC9oMT4KLTxkaXY+PHA+VGhlc2UgdG9waWNzIGRlYWwgd2l0aCB0aGUgSmF2YeKEoiAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpLjwvcD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzCi1hIHN0YW5kYXJkIGZvciBkZXZlbG9waW5nIG11bHRpdGllciwgZW50ZXJwcmlzZSBzZXJ2aWNlcy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvY2pwZXJzLmh0bWwiPkoyRUUgcGVyc3BlY3RpdmU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGUgSjJFRSBwZXJzcGVjdGl2ZSBpbmNsdWRlcyB3b3JrYmVuY2ggdmlld3MgdGhhdCB5b3UgY2FuIHVzZQotd2hlbiBkZXZlbG9waW5nIHJlc291cmNlcyBmb3IgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMsIEVKQiBtb2R1bGVzLCBXZWIgbW9kdWxlcywKLWFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLCBhbmQgY29ubmVjdG9yIHByb2plY3RzIG9yIG1vZHVsZXMuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL2Nqdmlldy5odG1sIj5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgaW4gdGhlIEoyRUUgcGVyc3BlY3RpdmU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1XaGlsZSBkZXZlbG9waW5nIEoyRUUgYXBwbGljYXRpb25zIGluIHRoZSBKMkVFIHBlcnNwZWN0aXZlLCB0aGUKLVByb2plY3QgRXhwbG9yZXIgdmlldyBpcyB5b3VyIG1haW4gdmlldyBvZiB5b3VyIEoyRUUgcHJvamVjdHMgYW5kIHJlc291cmNlcy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcGgtcHJvamVjdHMuaHRtbCI+V29ya2luZyB3aXRoIHByb2plY3RzPC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIHdvcmtiZW5jaCBjYW4gd29yayB3aXRoIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLiBUaGUKLWZvbGxvd2luZyB0b3BpY3MgY292ZXIgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIHNvbWUgb2YgdGhlIHR5cGVzIG9mIHByb2plY3RzCi1yZWxhdGVkIHRvIEoyRUUgZGV2ZWxvcG1lbnQuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsLmh0bWwiPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9waC1yZWYuaHRtbCI+UmVmZXJlbmNlPC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIGZvbGxvd2luZyByZWZlcmVuY2UgbWF0ZXJpYWwgb24gSjJFRSBpcyBhdmFpbGFibGU6PC9saT4KLTwvdWw+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtcHJvamVjdHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXByb2plY3RzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTBiNzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtcHJvamVjdHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5Xb3JraW5nIHdpdGggcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InBocHJvamVjdHMiPjxhIG5hbWU9InBocHJvamVjdHMiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIHByb2plY3RzPC9oMT4KLTxkaXY+PHA+VGhlIHdvcmtiZW5jaCBjYW4gd29yayB3aXRoIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLiBUaGUKLWZvbGxvd2luZyB0b3BpY3MgY292ZXIgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIHNvbWUgb2YgdGhlIHR5cGVzIG9mIHByb2plY3RzCi1yZWxhdGVkIHRvIEoyRUUgZGV2ZWxvcG1lbnQuPC9wPgotPC9kaXY+Ci08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPC9hPjwvc3Ryb25nPjxiciAvPgotQW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGNvbnRhaW5zIHRoZSBoaWVyYXJjaHkgb2YgcmVzb3VyY2VzCi10aGF0IGFyZSByZXF1aXJlZCB0byBkZXBsb3kgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24sIG9mdGVuIHJlZmVycmVkCi10byBhcyBhbiBFQVIgZmlsZS48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwiPkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0czwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90amVhci5odG1sIj5DcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiPkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvc3Ryb25nPjxiciAvPgotWW91IGNhbiB1c2UgYSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ci1hbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGpyYXIuaHRtbCI+Q3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdDwvYT48L3N0cm9uZz48YnIgLz4KLUEgY29ubmVjdG9yIGlzIGEgSjJFRSBzdGFuZGFyZCBleHRlbnNpb24gbWVjaGFuaXNtIGZvciBjb250YWluZXJzCi10byBwcm92aWRlIGNvbm5lY3Rpdml0eSB0byBlbnRlcnByaXNlIGluZm9ybWF0aW9uIHN5c3RlbXMgKEVJU3MpLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90anRhcmdldHNlcnZlci5odG1sIj5TcGVjaWZ5aW5nIHRhcmdldCBzZXJ2ZXJzIGZvciBKMkVFIHByb2plY3RzPC9hPjwvc3Ryb25nPjxiciAvPgotV2hlbiB5b3UgZGV2ZWxvcCBKMkVFIGFwcGxpY2F0aW9ucywgdGhlIHdvcmtiZW5jaCByZXF1aXJlcyB0aGF0Ci15b3Ugc3BlY2lmeSB0aGUgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzIGZvciB5b3VyIEoyRUUgcHJvamVjdHMuIFRoZSB0YXJnZXQKLXNlcnZlciBpcyBzcGVjaWZpZWQgZHVyaW5nIHByb2plY3QgY3JlYXRpb24gYW5kIGltcG9ydCwgYW5kIGl0IGNhbiBiZSBjaGFuZ2VkCi1pbiB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzLiBUaGUgdGFyZ2V0IHNlcnZlciBzZXR0aW5nIGlzIHRoZSBkZWZhdWx0IG1lY2hhbmlzbQotZm9yIHNldHRpbmcgdGhlIGNsYXNzIHBhdGggZm9yIEoyRUUgcHJvamVjdHMuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIj5JbXBvcnRpbmcgYW5kIGV4cG9ydGluZyBwcm9qZWN0cyBhbmQgZmlsZXM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGVzZSB0b3BpY3MgY292ZXIgaG93IHRvIGltcG9ydCBmaWxlcyBhbmQgcHJvamVjdHMgaW50byB0aGUgd29ya2JlbmNoCi1hbmQgZXhwb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyB0byBkaXNrLjwvbGk+Ci08L3VsPgotCi08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWoyZWVhcHAuaHRtbCIgdGl0bGU9IlRoZXNlIHRvcGljcyBkZWFsIHdpdGggdGhlIEphdmEgMiBQbGF0Zm9ybSwgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKS4iPkoyRUUgQXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtcmVmLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1yZWYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5NDAzMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1yZWYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+PCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5SZWZlcmVuY2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InBoLXJlZiI+PGEgbmFtZT0icGgtcmVmIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJlZmVyZW5jZTwvaDE+Ci08ZGl2PjxwPlRoZSBmb2xsb3dpbmcgcmVmZXJlbmNlIG1hdGVyaWFsIG9uIEoyRUUgaXMgYXZhaWxhYmxlOjwvcD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9ydmFsaWRhdG9ycy5odG1sIj5KMkVFIFZhbGlkYXRvcnM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIHRhYmxlIGxpc3RzIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGRpZmZlcmVudAotcHJvamVjdCB0eXBlcyBhbmQgZ2l2ZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBlYWNoIHZhbGlkYXRvci48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcnZhbGVyci5odG1sIj5Db21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9uczwvYT48L3N0cm9uZz48YnIgLz4KLVlvdSBtYXkgZW5jb3VudGVyIHRoZXNlIGNvbW1vbiBlcnJvciBtZXNzYWdlcyB3aGVuIHlvdSB2YWxpZGF0ZQoteW91ciBwcm9qZWN0cy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcmpsaW1pdGN1cnJlbnQuaHRtbCI+TGltaXRhdGlvbnMgb2YgSjJFRSBkZXZlbG9wbWVudCB0b29sczwvYT48L3N0cm9uZz48YnIgLz4KLVRoaXMgdG9waWMgb3V0bGluZXMgY3VycmVudCBrbm93biBsaW1pdGF0aW9ucyBhbmQgcmVzdHJpY3Rpb25zCi1mb3IgSjJFRSB0b29saW5nLjwvbGk+Ci08L3VsPgotCi08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWoyZWVhcHAuaHRtbCIgdGl0bGU9IlRoZXNlIHRvcGljcyBkZWFsIHdpdGggdGhlIEphdmEgMiBQbGF0Zm9ybSwgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKS4iPkoyRUUgQXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcmpsaW1pdGN1cnJlbnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3JqbGltaXRjdXJyZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWE0ZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcmpsaW1pdGN1cnJlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkxpbWl0YXRpb25zIG9mIEoyRUUgZGV2ZWxvcG1lbnQgdG9vbHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJqbGltaXRjdXJyZW50Ij48YSBuYW1lPSJyamxpbWl0Y3VycmVudCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5MaW1pdGF0aW9ucyBvZiBKMkVFIGRldmVsb3BtZW50IHRvb2xzPC9oMT4KLTxkaXY+PHA+VGhpcyB0b3BpYyBvdXRsaW5lcyBjdXJyZW50IGtub3duIGxpbWl0YXRpb25zIGFuZCByZXN0cmljdGlvbnMKLWZvciBKMkVFIHRvb2xpbmcuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkFsdGVybmF0ZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFsdC1kZCkgZWxlbWVudHMgaW4gZW50ZXJwcmlzZQotYXBwbGljYXRpb25zPC9oND5UaGUgdXNlIG9mIGFsdC1kZCBlbGVtZW50cyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZAotaW4gdGhlIHdvcmtiZW5jaC4gVGhlIHdvcmthcm91bmQgaXMgdG8gZWRpdCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBvZgotdGhlIGNvbnRhaW5lZCBtb2R1bGVzLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNwYWNlcyBub3Qgc3VwcG9ydGVkIGluIEpBUiBVUklzIHdpdGhpbiBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uPC9oND5TcGFjZXMKLWFyZSBub3Qgc3VwcG9ydGVkIGluIHRoZSBVUkkgZm9yIG1vZHVsZXMgb3IgdXRpbGl0eSBKQVIgZmlsZXMgaW4gYW4gZW50ZXJwcmlzZQotYXBwbGljYXRpb24uIFRoZSAiQ2xhc3MtUGF0aDoiIGF0dHJpYnV0ZSBvZiBhIE1BTklGRVNULk1GIGZpbGUgaW4gYSBKQVIgZmlsZQotb3IgbW9kdWxlIGlzIGEgc3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgcmVsYXRpdmUgcGF0aHMgd2l0aGluIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uLiBBIEpBUiBmaWxlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlZmVyZW5jZSBhbm90aGVyIEpBUiBmaWxlIGluCi10aGUgRUFSIGlmIHRoZSBVUkkgb2YgdGhlIHJlZmVyZW5jZWQgSkFSIGZpbGUgY29udGFpbmVkIHNwYWNlcy48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgbmFtZXMgc2hvdWxkIG5vdCBjb250YWluIERCQ1MKLWNoYXJhY3RlcnM8L2g0PjxwIGlkPSJyamxpbWl0Y3VycmVudF9fbGltaXRhdGlvbl9lYXJfZGJjcyI+PGEgbmFtZT0icmpsaW1pdGN1cnJlbnRfX2xpbWl0YXRpb25fZWFyX2RiY3MiPjwhLS0gLS0+PC9hPldoZW4geW91IGNyZWF0ZSBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiBwcm9qZWN0LCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkbyBub3QgZ2l2ZSBpdCBhIG5hbWUgdGhhdAotY29udGFpbnMgZG91YmxlLWJ5dGUgY2hhcmFjdGVyIHNldCAoREJDUykgY2hhcmFjdGVycy48L3A+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5KYXZh4oSiIGJ1aWxkIHBhdGggdXBkYXRlcyB3aGVuIHJlbW92aW5nIHRoZSBkZXBlbmRlbmN5Ci1vbiBhIFV0aWxpdHkgSkFSIGZpbGU8L2g0PldoZW4gcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kgb24gYSBVdGlsaXR5IEpBUiwKLXRoZSBjb3JyZXNwb25kaW5nIEphdmEgcHJvamVjdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgSmF2YSBidWlsZAotcGF0aCBvbmx5IGlmIHRoZSBkZXBlbmRlbnQgSkFSIGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgdGhlIEVBUiBwcm9qZWN0LiBGb3IKLWV4YW1wbGUsIHN1cHBvc2UgeW91IGNyZWF0ZSBhIEoyRUUgMS4zIFdlYiBwcm9qZWN0IGFuZCBFQVIgYWxvbmcgd2l0aCB0aGUKLUpVbml0IEphdmEgRXhhbXBsZQotcHJvamVjdC4gTmV4dCwgYWRkIHRoZSBKVW5pdCBwcm9qZWN0IGFzIGEgVXRpbGl0eSBKQVIgaW4gdGhlIEVBUiwgdGhlbiBhZGQKLUpVbml0IGFzIGEgSmF2YSBKQVIgRGVwZW5kZW5jeSBvZiB0aGUgV2ViIHByb2plY3QuIElmIHlvdSB0aGVuCi13YW50ZWQgdG8gcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IGJldHdlZW4gSlVuaXQgYW5kIHRoZSBXZWIgcHJvamVjdCwgcmVtb3ZlCi10aGUgSmF2YSBKQVIKLURlcGVuZGVuY3kgZnJvbSB0aGUgV2ViIHByb2plY3QgZmlyc3QsIHRoZW4gcmVtb3ZlIHRoZSBVdGlsaXR5IEpBUiBmcm9tIHRoZQotRUFSLiBGb2xsb3cgdGhpcyBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGlzIHdvcmtzIGNvcnJlY3RseS48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5KYXZhIEpBUiBEZXBlbmRlbmNpZXMgcGFnZSBmYWlscyB0byB1cGRhdGUgSmF2YSBidWlsZAotcGF0aDwvaDQ+VGhlIEphdmEgSkFSIERlcGVuZGVuY2llcyBwYWdlIGlzIG5vdCBzeW5jaHJvbml6ZWQgd2l0aAotdGhlIEphdmEgYnVpbGQKLXBhdGggcGFnZSBpbiB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIGRpYWxvZy4gVGhlcmVmb3JlLCBhIGNoYW5nZSBhcHBsaWVkIGluCi1vbmUgbWF5IG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIG90aGVyIHdpdGhpbiB0aGUgc2FtZSBkaWFsb2cgc2Vzc2lvbi4gVGhlcmUKLWFyZSBhbHNvIHNvbWUgaW5zdGFuY2VzIHdoZXJlIGZsaXBwaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIHBhZ2VzIHdpbGwKLWNhdXNlIHRoZSB1cGRhdGUgZnJvbSBvbmUgdG8gY2FuY2VsIG91dCB0aGUgdXBkYXRlIGZyb20gYW5vdGhlciB3aGVuIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gYnV0dG9uCi1pcyBjbGlja2VkIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4gYnV0dG9uIGlzIGNsaWNrZWQgcHJpb3IKLXRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gYnV0dG9uLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGFwcGVhciBhcyBpZgotYSBKQVIgZGVwZW5kZW5jeSB3YXMgYWRkZWQsIGJ1dCB0aGUgcHJvamVjdCBkaWQgbm90IGdldCBhZGRlZCB0byB0aGUgSmF2YSBidWlsZAotcGF0aC4gVGhlIHdvcmthcm91bmQgaXMgdG8gcmVvcGVuIHRoZSBwcm9wZXJ0aWVzIGRpYWxvZ3MsIHN3aXRjaCB0byB0aGUgSkFSCi1kZXBlbmRlbmN5IHBhZ2UsIGNsZWFyIGFuZCByZS1zZWxlY3QgdGhlIGRlcGVuZGVudCBKQVIgZmlsZXMsIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPidJbnZhbGlkIHByb2plY3QgZGVzY3JpcHRpb24nIGVycm9yIHdoZW4gdXNpbmcgYSBub24tZGVmYXVsdAotcHJvamVjdCBsb2NhdGlvbiBmb3IgYSBuZXcgSjJFRSBwcm9qZWN0PC9oND5XaGVuIHlvdSBjcmVhdGUgYSBuZXcgSjJFRQotcHJvamVjdCAoaW5jbHVkaW5nIEphdmEsIGVudGVycHJpc2UgYXBwbGljYXRpb24sIER5bmFtaWMgV2ViLAotRUpCLCBhcHBsaWNhdGlvbiBjbGllbnQsIGFuZCBjb25uZWN0b3IgcHJvamVjdHMpLCB5b3UgY2Fubm90IHVzZSBhIHByb2plY3QKLWxvY2F0aW9uIHRoYXQgaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoLiBJZiB5b3UKLWNob29zZSBhIHByb2plY3QgbG9jYXRpb24gdGhhdCBpcyB1c2VkIGJ5IGFub3RoZXIgcHJvamVjdCwgdGhlIHdpemFyZCBkaXNwbGF5cwotYW4gIkludmFsaWQgcHJvamVjdCBkZXNjcmlwdGlvbiIgZXJyb3IgZGlhbG9nIG9yIG1lc3NhZ2UuIElmIGFmdGVyIHlvdSByZWNlaXZlCi10aGlzIG1lc3NhZ2UgeW91IHRoZW4gc2VsZWN0IGEgdmFsaWQgcHJvamVjdCBsb2NhdGlvbiBieSBjbGlja2luZyB0aGUgQnJvd3NlCi1idXR0b24sIHRoZSBwcm9qZWN0IGNyZWF0aW9uIHdpbGwgc3RpbGwgbm90IGZpbmlzaC4gVGhlIHdvcmthcm91bmQgaXMgdG8gY2xpY2sKLUNhbmNlbCBhbmQgcmVvcGVuIHRoZSBwcm9qZWN0IGNyZWF0aW9uIHdpemFyZC48L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtcmVmLmh0bWwiIHRpdGxlPSJUaGUgZm9sbG93aW5nIHJlZmVyZW5jZSBtYXRlcmlhbCBvbiBKMkVFIGlzIGF2YWlsYWJsZToiPlJlZmVyZW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyODBkYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydmFsZXJyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+Q29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJ2YWxlcnIiPjxhIG5hbWU9InJ2YWxlcnIiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnM8L2gxPgotPGRpdj48cD5Zb3UgbWF5IGVuY291bnRlciB0aGVzZSBjb21tb24gZXJyb3IgbWVzc2FnZXMgd2hlbiB5b3UgdmFsaWRhdGUKLXlvdXIgcHJvamVjdHMuPC9wPgotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHI+PHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBpZD0iZDBlMzMiPk1lc3NhZ2UgcHJlZml4PC90aD4KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGlkPSJkMGUzNSI+TWVzc2FnZTwvdGg+Ci08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaWQ9ImQwZTM3Ij5FeHBsYW5hdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT48dHI+PHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMyBkMGUzNSBkMGUzNyAiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGxpY2F0aW9uIENsaWVudCB2YWxpZGF0b3I8L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUzMyAiPkNIS0oxMDAwPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTM1ICI+VmFsaWRhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGZpbGUKLWlzIG5vdCB2YWxpZC4gRW5zdXJlIHRoYXQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyB2YWxpZC48L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9ImQwZTM3ICI+VGhlIGFwcGxpY2F0aW9uLWNsaWVudC54bWwgZmlsZSBjYW5ub3QgYmUgbG9hZGVkLiBUaGUKLXByb2plY3QgbWV0YWRhdGEgY2Fubm90IGJlIGluaXRpYWxpemVkIGZyb20gdGhlIGFwcGxpY2F0aW9uLWNsaWVudC54bWwgZmlsZS4KLSAgPG9sPjxsaT5FbnN1cmUgdGhlIGZvbGxvd2luZzogIDx1bD48bGk+dGhhdCB0aGUgTUVUQS1JTkYgZm9sZGVyIGV4aXN0cyBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2xpPgotPGxpPnRoYXQgTUVUQS1JTkYgY29udGFpbnMgdGhlIGFwcGxpY2F0aW9uLWNsaWVudC54bWwgZmlsZTwvbGk+Ci08bGk+dGhhdCBNRVRBLUlORiBpcyBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC48L2xpPgotPC91bD4KLSAgPC9saT4KLTxsaT5WYWxpZGF0ZSB0aGUgc3ludGF4IG9mIHRoZSBhcHBsaWNhdGlvbi1jbGllbnQueG1sIGZpbGU6IGluIHRoZSBOYXZpZ2F0b3IKLXZpZXcsIGhpZ2hsaWdodCB0aGUgYXBwbGljYXRpb24tY2xpZW50LnhtbCBmaWxlLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZQotWE1MIGZpbGU8L3NwYW4+LjwvbGk+Ci08bGk+SWYgYm90aCAxKSBhbmQgMikgYXJlIG9rYXksIGNsb3NlIHRoZSBwcm9qZWN0LCByZW9wZW4gdGhlIHByb2plY3QsIGFuZAotcmVidWlsZCB0aGUgcHJvamVjdC4gVGhlIHByb2plY3QgbWV0YWRhdGEgd2lsbCByZWZyZXNoLjwvbGk+Ci08L29sPgotIDwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMzMgZDBlMzUgZDBlMzcgIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5FQVIgdmFsaWRhdG9yPC9zcGFuPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iZDBlMzMgIj5DSEtKMTAwMTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJkMGUzNSAiPlRoZSBFQVIgcHJvamVjdCB7MH0gaXMgaW52YWxpZC48L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9ImQwZTM3ICI+VGhlIGFwcGxpY2F0aW9uLnhtbCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQuIFRoZSBwcm9qZWN0Ci1tZXRhZGF0YSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGUuICA8b2w+PGxpPkVuc3VyZSB0aGUgZm9sbG93aW5nOiAgPHVsPjxsaT50aGF0IHRoZSBNRVRBLUlORiBmb2xkZXIgZXhpc3RzIGluIHRoZSBFQVIgcHJvamVjdDwvbGk+Ci08bGk+dGhhdCBNRVRBLUlORiBjb250YWlucyA8c2FtcCBjbGFzcz0iY29kZXBoIj5hcHBsaWNhdGlvbi54bWw8L3NhbXA+PC9saT4KLTxsaT50aGF0IE1FVEEtSU5GIGlzIGluIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLjwvbGk+Ci08L3VsPgotICA8L2xpPgotPGxpPlZhbGlkYXRlIHRoZSBzeW50YXggb2YgdGhlIGFwcGxpY2F0aW9uLnhtbCBmaWxlOiBpbiB0aGUgTmF2aWdhdG9yIHZpZXcsCi1oaWdobGlnaHQgdGhlIGFwcGxpY2F0aW9uLnhtbCBmaWxlLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZQotWE1MIGZpbGU8L3NwYW4+LjwvbGk+Ci08bGk+SWYgYm90aCAxKSBhbmQgMikgYXJlIG9rYXksIGNsb3NlIHRoZSBwcm9qZWN0LCByZW9wZW4gdGhlIHByb2plY3QsIGFuZAotcmVidWlsZCB0aGUgcHJvamVjdC4gVGhlIHByb2plY3QgbWV0YWRhdGEgd2lsbCByZWZyZXNoLjwvbGk+Ci08L29sPgotPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMyBkMGUzNSBkMGUzNyAiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVKQiB2YWxpZGF0b3I8L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUzMyAiPkNIS0oyMDE5PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTM1ICI+VGhlIHswfSBrZXkgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gPC90ZD4KLTx0ZCByb3dzcGFuPSIzIiB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBoZWFkZXJzPSJkMGUzNyAiPlRoZSBFSkIgaXMgY29tcGxpYW50IHdpdGggdGhlIEVKQiBzcGVjaWZpY2F0aW9uLiBUaGlzCi1tZXNzYWdlIGlzIGEgd2FybmluZyB0aGF0IHByb2JsZW1zIG1heSBvY2N1ci4gVGhlIHdhcm5pbmcgYXBwZWFycyB3aGVuIGEgdHlwZQotbmVlZHMgdG8gYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgYW5kIHdoZW4gc2VyaWFsaXphYmlsaXR5IGNhbm5vdCBiZSB2ZXJpZmllZAotYXQgY29tcGlsZS10aW1lLiBBIHR5cGUgaXMgc2VyaWFsaXphYmxlIGlmLCBhdCBydW50aW1lLCBpdCBpcyBhIHByaW1pdGl2ZQotdHlwZSwgYSBwcmltaXRpdmUgYXJyYXksIGEgcmVtb3RlIG9iamVjdCwgb3IgaWYgaXQgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZS4KLVRoaXMgbWVzc2FnZSBmbGFncyBqYXZhLmxhbmcuT2JqZWN0IGFuZCBpdCBjYW5ub3QgYmUgZGlzYWJsZWQuIFlvdSBjYW4gZWl0aGVyCi1tYWtlIHRoZSBvYmplY3Qgc2VyaWFsaXphYmxlIGF0IGNvbXBpbGUtdGltZSBvciBpZ25vcmUgdGhlIHdhcm5pbmcuIDwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iZDBlMzMgIj5DSEtKMjQxMjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJkMGUzNSAiPlRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiA8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9ImQwZTMzICI+Q0hLSjI0MTM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iZDBlMzUgIj5Bcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUzMyAiPkNIS0oyMTAyPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTM1ICI+RWl0aGVyIGEgZmluZGVyIGRlc2NyaXB0b3IsIG9yIGEgbWF0Y2hpbmcgY3VzdG9tIGZpbmRlciBtZXRob2Qgb24gdGhlCi17MH0gY2xhc3MsIG11c3QgYmUgZGVmaW5lZC48L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9ImQwZTM3ICI+QSBmaW5kZXIgZGVzY3JpcHRvciBtdXN0IGV4aXN0IGZvciBldmVyeSBmaW5kZXIgbWV0aG9kLiA8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9ImQwZTMzICI+Q0hLSjI4NzM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iZDBlMzUgIj5NaWdyYXRlIHRoaXMgYmVhbidzIGRhdGFzb3VyY2UgYmluZGluZyB0byBhIENNUCBDb25uZWN0aW9uIEZhY3RvcnkKLWJpbmRpbmcuPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBoZWFkZXJzPSJkMGUzNyAiPiZuYnNwOzwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iZDBlMzMgIj5DSEtKMjg3NDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJkMGUzNSAiPk1pZ3JhdGUgdGhpcyBFSkIgbW9kdWxlJ3MgZGVmYXVsdCBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUAotQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcuPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBoZWFkZXJzPSJkMGUzNyAiPiZuYnNwOzwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iZDBlMzMgIj5DSEtKMjg3NUUgICAgICAgPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTM1ICI+Jmx0O2VqYi1jbGllbnQtamFyJmd0OyB7MH0gbXVzdCBleGlzdCBpbiBldmVyeSBFQVIgZmlsZQotdGhhdCBjb250YWlucyB0aGlzIEVKQiBtb2R1bGUuPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBoZWFkZXJzPSJkMGUzNyAiPklmIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDtlamItY2xpZW50LWphciZndDs8L3NhbXA+IGlzIHNwZWNpZmllZAotaW4gPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5lamItamFyLnhtbDwvc3Bhbj4sIGEgY29ycmVzcG9uZGluZyBFSkIgY2xpZW50IHByb2plY3QgbXVzdAotY29udGFpbiB0aGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgYW5kIGFueSBvdGhlciB0eXBlcyB0aGF0IGEgY2xpZW50IHdpbGwKLW5lZWQuIElmIHRoZXNlIHR5cGVzIGFyZSBhbGwgY29udGFpbmVkIGluIGEgc2luZ2xlIEVKQiBwcm9qZWN0LCBkZWxldGUgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDtlamItY2xpZW50LWphciZndDs8L3NhbXA+IGxpbmUKLWluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIE90aGVyd2lzZSwgZW5zdXJlIHRoYXQgdGhlIEVKQiBjbGllbnQgcHJvamVjdAotZXhpc3RzLCBpcyBvcGVuLCBhbmQgaXMgYSBwcm9qZWN0IHV0aWxpdHkgSkFSIGluIGV2ZXJ5IEVBUiB0aGF0IHVzZXMgdGhpcwotRUpCIHByb2plY3QgYXMgYSBtb2R1bGUuPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUzMyAiPkNIS0oyOTA1PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTM1ICI+VGhlIEVKQiB2YWxpZGF0b3IgZGlkIG5vdCBydW4gYmVjYXVzZSBlamItamFyLnhtbCBjb3VsZCBub3QgYmUgbG9hZGVkLgotUnVuIHRoZSBYTUwgdmFsaWRhdG9yIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMzcgIj5DSEtKMjkwNSBtZWFucyB0aGF0IHRoZSBwcm9qZWN0J3MgbWV0YWRhdGEgY291bGQgbm90IGJlIGluaXRpYWxpemVkCi1mcm9tIGVqYi1qYXIueG1sLiA8b2w+PGxpPkVuc3VyZSB0aGUgZm9sbG93aW5nOiAgPHVsPjxsaT50aGF0IHRoZSBNRVRBLUlORiBmb2xkZXIgZXhpc3RzIGluIHRoZSBFSkIgcHJvamVjdDwvbGk+Ci08bGk+dGhhdCBNRVRBLUlORiBjb250YWlucyBlamItamFyLnhtbDwvbGk+Ci08bGk+dGhhdCBNRVRBLUlORiBpcyBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC48L2xpPgotPC91bD4KLSAgPC9saT4KLTxsaT5WYWxpZGF0ZSB0aGUgc3ludGF4IG9mIHRoZSBlamItamFyLnhtbCBmaWxlOiBpbiB0aGUgTmF2aWdhdG9yIHZpZXcsIGhpZ2hsaWdodAotdGhlIGVqYi1qYXIueG1sIGZpbGUsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlIFhNTCBmaWxlPC9zcGFuPi48L2xpPgotPGxpPklmIGJvdGggMSkgYW5kIDIpIGFyZSBva2F5LCBjbG9zZSB0aGUgcHJvamVjdCwgcmVvcGVuIHRoZSBwcm9qZWN0LCBhbmQKLXJlYnVpbGQgdGhlIHByb2plY3QuIFRoZSBwcm9qZWN0IG1ldGFkYXRhIHdpbGwgcmVmcmVzaC48L2xpPgotPC9vbD4KLTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMzMgZDBlMzUgZDBlMzcgIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5KU1AgdmFsaWRhdG9yPC9zcGFuPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iZDBlMzMgIj5JV0FXMDQ4MjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJkMGUzNSAiPk5vIHZhbGlkIEpzcFRyYW5zbGF0b3I8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9ImQwZTM3ICI+VGhlcmUgaXMgYSBwYXRoIHByb2JsZW0gd2l0aCB0aGUgcHJvamVjdDsgdGhlIEpTUCBWYWxpZGF0b3IKLW5lZWRzIGFjY2VzcyB0byB0aGUgV0FTIHJ1bnRpbWUgY29kZS4gSWYgSVdBVzA0ODJFIGFwcGVhcnMgb24gYWxsIHdlYiBwcm9qZWN0cywKLWNoZWNrIHRoZSBWYXJpYWJsZSBvciBKUkUgcGF0aDogICA8b2w+PGxpPkNoZWNrIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgKDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdyAmZ3Q7IFByZWZlcmVuY2VzICZndDsgSmF2YSAmZ3Q7SW5zdGFsbGVkCi1KUkVzPC9zcGFuPikgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2NhdGlvbiBmb3IgdGhlIEpSRSBpcyBwb2ludGluZwotdG8gYSB2YWxpZCBKUkUgZGlyZWN0b3J5LiAgPC9saT4KLTxsaT5FbnN1cmUgdGhhdCB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlcyAoPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93ICZndDsgUHJlZmVyZW5jZXMgJmd0OwotSmF2YSAmZ3Q7IENsYXNzcGF0aCBWYXJpYWJsZXM8L3NwYW4+KSBhcmUgc2V0IGNvcnJlY3RseS48L2xpPgotPC9vbD4KLSA8L3RkPgotPC90cj4KLTx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMzIGQwZTM1IGQwZTM3ICI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V0FSIHZhbGlkYXRvcjwvc3Bhbj48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9ImQwZTMzICI+Q0hLSjMwMDg8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iZDBlMzUgIj5NaXNzaW5nIG9yIGludmFsaWQgV0FSIGZpbGUuPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBoZWFkZXJzPSJkMGUzNyAiPlRoZSB3ZWIueG1sIGZpbGUgY2Fubm90IGJlIGxvYWRlZC4gVGhlIHByb2plY3QgbWV0YWRhdGEKLWNhbm5vdCBiZSBpbml0aWFsaXplZCBmcm9tIHRoZSB3ZWIueG1sIGZpbGUuICAgPG9sPjxsaT5FbnN1cmUgdGhlIGZvbGxvd2luZzogIDx1bD48bGk+dGhhdCB0aGUgV0VCLUlORiBmb2xkZXIgZXhpc3RzIGluIHRoZSB3ZWIgcHJvamVjdDwvbGk+Ci08bGk+dGhhdCBXRUItSU5GIGNvbnRhaW5zIHRoZSB3ZWIueG1sIGZpbGU8L2xpPgotPGxpPnRoYXQgV0VCLUlORiBpcyBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC48L2xpPgotPC91bD4KLSAgPC9saT4KLTxsaT5WYWxpZGF0ZSB0aGUgc3ludGF4IG9mIHRoZSB3ZWIueG1sIGZpbGU6IGluIHRoZSBOYXZpZ2F0b3IgdmlldywgaGlnaGxpZ2h0Ci10aGUgd2ViLnhtbCBmaWxlLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZSBYTUwgZmlsZTwvc3Bhbj4uPC9saT4KLTxsaT5JZiBib3RoIDEpIGFuZCAyKSBhcmUgb2theSwgY2xvc2UgdGhlIHByb2plY3QsIHJlb3BlbiB0aGUgcHJvamVjdCwgYW5kCi1yZWJ1aWxkIHRoZSBwcm9qZWN0LiBUaGUgcHJvamVjdCBtZXRhZGF0YSB3aWxsIHJlZnJlc2guPC9saT4KLTwvb2w+Ci08L3RkPgotPC90cj4KLTx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMzIGQwZTM1IGQwZTM3ICI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIHZhbGlkYXRvcjwvc3Bhbj48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9ImQwZTMzICI+IDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJkMGUzNSAiPlRoZSBjb250ZW50IG9mIGVsZW1lbnQgdHlwZSAiZWpiLWphciIgaXMgaW5jb21wbGV0ZSwgaXQgbXVzdCBtYXRjaAotIihkZXNjcmlwdGlvbj8sZGlzcGxheS1uYW1lPyxzbWFsbC1pY29uPyxsYXJnZS1pY29uPyxlbnRlcnByaXNlLWJlYW5zLGFzc2VtYmx5LWRlc2NyaXB0b3I/LGVqYi1jbGllbnQtamFyPykiLjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMzcgIj5UaGUgRUpCIDEuMSBhbmQgMi4wIHNwZWNpZmljYXRpb25zIG1hbmRhdGUgdGhhdCBhdCBsZWFzdCBvbmUgZW50ZXJwcmlzZQotYmVhbiBtdXN0IGV4aXN0IGluIGFuIEVKQiAuamFyIGZpbGUuIFRoaXMgZXJyb3IgbWVzc2FnZSBpcyBub3JtYWwgZHVyaW5nIGRldmVsb3BtZW50Ci1vZiBFSkIgLmphciBmaWxlcyBhbmQgY2FuIGJlIGlnbm9yZWQgdW50aWwgeW91IHBlcmZvcm0gYSBwcm9kdWN0aW9uIGFjdGlvbiwKLXN1Y2ggYXMgZXhwb3J0aW5nIG9yIGRlcGxveWluZyBjb2RlLiBEZWZpbmUgYXQgbGVhc3Qgb25lIGVudGVycHJpc2UgYmVhbiBpbgotdGhlIHByb2plY3QuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1yZWYuaHRtbCIgdGl0bGU9IlRoZSBmb2xsb3dpbmcgcmVmZXJlbmNlIG1hdGVyaWFsIG9uIEoyRUUgaXMgYXZhaWxhYmxlOiI+UmVmZXJlbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGUgZGlmZmVyZW50IHByb2plY3QgdHlwZXMgYW5kIGdpdmVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaCB2YWxpZGF0b3IuIj5KMkVFIFZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydmFsaWRhdG9ycy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2NDQxMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydmFsaWRhdG9ycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkoyRUUgVmFsaWRhdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icnZhbGlkYXRvcnMiPjxhIG5hbWU9InJ2YWxpZGF0b3JzIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkoyRUUgVmFsaWRhdG9yczwvaDE+Ci08ZGl2PjxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGUgZGlmZmVyZW50Ci1wcm9qZWN0IHR5cGVzIGFuZCBnaXZlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGVhY2ggdmFsaWRhdG9yLjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaWQ9ImQwZTI0Ij5WYWxpZGF0b3IgbmFtZTwvdGg+Ci08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGlkPSJkMGUyNiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI0ICI+QXBwbGljYXRpb24gQ2xpZW50IFZhbGlkYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUyNiAiPlRoZSBBcHBsaWNhdGlvbiBDbGllbnQgVmFsaWRhdG9yIHZhbGlkYXRlcwotdGhlIGZvbGxvd2luZyBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCByZXNvdXJjZXM6ICAgPHVsPjxsaT5EZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFwcGxpY2F0aW9uLWNsaWVudC54bWwpPC9saT4KLTxsaT5FSkIgcmVmZXJlbmNlczwvbGk+Ci08bGk+UmVzb3VyY2UgcmVmZXJlbmNlczwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMjQgIj5EVEQgVmFsaWRhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI2ICI+VGhlIERURCB2YWxpZGF0b3IgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotY3VycmVudCBzdGF0ZSBvZiBhIERURCBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIFhNTCBmaWxlcyBhcmUgdmFsaWRhdGVkIGFjY29yZGluZwotdG8gdGhlIFhNTCBzcGVjaWZpY2F0aW9uIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLXhtbC0yMDAwMTAwNiIgdGFyZ2V0PSJfYmxhbmsiPiBFeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZSAoWE1MKSAxLjA8L2E+IGZyb20gdGhlIFczQwotV2ViIHNpdGUuIEFzIHdlbGwsIHRoZSBEVEQgdmFsaWRhdG9yIGNoZWNrcyBmb3IgZXJyb3JzIHN1Y2ggYXMgcmVmZXJlbmNlcwotdG8gZW50aXRpZXMgYW5kIGVsZW1lbnRzIHRoYXQgZG8gbm90IGV4aXN0LjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI0ICI+RUFSIFZhbGlkYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUyNiAiPlRoZSBFQVIgVmFsaWRhdG9yIHZhbGlkYXRlcyB0aGUgZm9sbG93aW5nOgotIDx1bD48bGk+RUFSIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoYXBwbGljYXRpb24ueG1sKTwvbGk+Ci08bGk+RUpCIHJlZmVyZW5jZXMgb2YgYWxsIG1vZHVsZSBwcm9qZWN0cyBpbiB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0PC9saT4KLTxsaT5TZWN1cml0eSByb2xlczwvbGk+Ci08bGk+UmVzb3VyY2UgcmVmZXJlbmNlczwvbGk+Ci08bGk+TWFuaWZlc3QgZmlsZXMgZm9yIGFsbCBjb250YWluZWQgb3IgcmVmZXJlbmNlZCBtb2R1bGVzIGFuZCB1dGlsaXR5IEpBUgotZmlsZXM8L2xpPgotPGxpPlRhcmdldCBzZXJ2ZXIgY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGFuZAotYW55IHV0aWxpdHkgYW5kIG1vZHVsZSBwcm9qZWN0czwvbGk+Ci08bGk+RXhpc3RlbmNlIG9mIHByb2plY3RzIGZvciBlYWNoIG1vZHVsZSBkZWZpbmVkIGluIGVudGVycHJpc2UgYXBwbGljYXRpb248L2xpPgotPC91bD4KLSAgPHA+Tm90ZSB0aGF0IHRoZSBFQVIgVmFsaWRhdG9yIG9ubHkgZW5zdXJlcyB0aGUgdmFsaWRpdHkgYW5kIGRlcGVuZGVuY3kKLW9mIHRoZSBtb2R1bGUgcHJvamVjdHMgd2l0aCByZXNwZWN0IHRvIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMjQgIj5FSkIgVmFsaWRhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI2ICI+VGhlIEVKQiBWYWxpZGF0b3IgdmVyaWZpZXMgdGhhdCBlbnRlcnByaXNlCi1iZWFucyBjb250YWluZWQgaW4gYW4gRUpCIHByb2plY3QgY29tcGx5IHdpdGggdGhlIFN1biBFbnRlcnByaXNlIEphdmFCZWFuc+KEoiBTcGVjaWZpY2F0aW9ucwotKDEuMSwgMi4wLCBhbmQgMi4xKSwgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCBvZiB0aGUgYmVhbi4gQ29kZSB2YWxpZGF0aW9uIGZvcgotdGhlIEVKQiAxLjAgc3BlY2lmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgIDxwPlNwZWNpZmljYWxseSwgdGhlIEVKQiBWYWxpZGF0b3IKLXZhbGlkYXRlcyB0aGUgZm9sbG93aW5nIHJlc291cmNlczogPC9wPgotICA8dWw+PGxpPkphdmHihKIgLmNsYXNzCi1maWxlcyB0aGF0IGFyZSBtZW1iZXJzIG9mIGFuIGVudGVycHJpc2UgYmVhbiAoaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UsCi1lbnRlcnByaXNlIGJlYW4gY2xhc3MsIGFuZCwgaWYgdGhlIGJlYW4gaXMgYW4gZW50aXR5IGJlYW4sIHRoZSBrZXkgY2xhc3MpPC9saT4KLTxsaT5lamItamFyLnhtbDwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUyNCAiPkNvbm5lY3RvciBWYWxpZGF0b3I8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUyNiAiPlRoZSBDb25uZWN0b3IgdmFsaWRhdG9yIGNoZWNrcyBmb3IgaW52YWxpZCBKMkVFIHNwZWNpZmljYXRpb24KLWxldmVscyBpbiBjb25uZWN0b3IgcHJvamVjdHMuPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMjQgIj5IVE1MIFN5bnRheCBWYWxpZGF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMjYgIj5UaGUgSFRNTCBTeW50YXggVmFsaWRhdG9yIHZhbGlkYXRlcyBIVE1MCi1iYXNpYyBzeW50YXggYW5kIEhUTUwgRFREIGNvbXBsaWFuY2UgaW4gdGhlIGZvbGxvd2luZyBXZWIgcHJvamVjdCByZXNvdXJjZXM6Ci0gPHVsPjxsaT5IVE1MIGZpbGVzPC9saT4KLTxsaT5KU1AgZmlsZXM8L2xpPgotPC91bD4KLTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI0ICI+SlNQIFN5bnRheCBWYWxpZGF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMjYgIj5UaGUgSlNQIFN5bnRheCBWYWxpZGF0b3IgdmFsaWRhdGVzIEpTUCBmaWxlcwotaW4gYSBwcm9qZWN0IGJ5IHRyYW5zbGF0aW5nIHRoZW0gaW50byB0aGUgY29ycmVzcG9uZGluZyBKYXZhIGNvZGUKLWFuZCB0aGVuIGNoZWNraW5nIHRoZSBKYXZhIGNvZGUgZm9yIGNvbXBpbGUgZXJyb3JzLjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI0ICI+V0FSIFZhbGlkYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUyNiAiPlRoZSBXQVIgVmFsaWRhdG9yIHZhbGlkYXRlcyB0aGUgZm9sbG93aW5nCi13ZWIgcHJvamVjdCByZXNvdXJjZXM6ICAgPHVsPjxsaT5EZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwpPC9saT4KLTxsaT5TZXJ2bGV0czwvbGk+Ci08bGk+U2VjdXJpdHkgcm9sZXM8L2xpPgotPGxpPlNlcnZsZXQgJmFtcDsgc2VydmxldCBtYXBwaW5nczwvbGk+Ci08bGk+RUpCIHJlZmVyZW5jZXM8L2xpPgotPC91bD4KLTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMjQgIj5XU0RMIFZhbGlkYXRvcjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI2ICI+VGhlIFdTREwgdmFsaWRhdG9yIGNoZWNrcyB0aGUgZm9sbG93aW5nIGluIFdTREwgZmlsZXM6IDx1bD48bGk+WE1MIHN5bnRheDwvbGk+Ci08bGk+WE1MIFNjaGVtYSB0eXBlcyBpbiB0aGUgJmx0O3R5cGVzJmd0OyBzZWN0aW9uPC9saT4KLTxsaT5SZWZlcmVudGlhbCBpbnRlZ3JpdHkgb2YgdGhlIHZhcmlvdXMgY29uc3RydWN0cyBpbiBXU0RMIDwvbGk+Ci08L3VsPgotVGhlIHZhbGlkYXRvciBhbHNvIGluY2x1ZGVzIGFuIGV4dGVuc2lvbiBwb2ludCB0byBhbGxvdyBvdGhlciB2YWxpZGF0b3JzCi10byBiZSBwbHVnZ2VkIGludG8gdGhlIFdTREwgdmFsaWRhdGlvbiB0byBwcm92aWRlIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9uCi1vZiB0aGUgV1NETCBmaWxlLiBUaHJvdWdoIHRoaXMgbWVjaGFuaXNtLCBpbnRlcm9wZXJhYmlsaXR5IGlzIGNoZWNrZWQgYnkgdmFsaWRhdGluZwotYSBXU0RMIGZpbGUgYWdhaW5zdCBXUy1JIFByb2ZpbGVzLiA8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI0ICI+V1MtSSBNZXNzYWdlIFZhbGlkYXRvcjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI2ICI+V1MtSSBNZXNzYWdlIHZhbGlkYXRvciBjaGVja3MgU09BUCBtZXNzYWdlcyBhZ2FpbnN0Ci1XUy1JIFByb2ZpbGVzLiBBIHVzZXIgY2FuIGNhcHR1cmUgYW5kIHZlcmlmeSBTT0FQIG1lc3NhZ2VzIHVzaW5nIHRoZSBUQ1AvSVAKLU1vbml0b3IuIFRoZSB2YWxpZGF0b3IgY2hlY2tzIGEgbWVzc2FnZSBsb2cgdGhhdCBpcyBzYXZlZCBhcyBhIHByb2plY3QgcmVzb3VyY2UKLSgud3NpbXNnKS4gVGhlIGxvZyBjb25mb3JtcyB0byBhIGZvcm1hdCBhcyBzcGVjaWZpZWQgYnkgV1MtSS48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUyNCAiPlhNTCBTY2hlbWEgVmFsaWRhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI2ICI+VGhlIFhNTCBzY2hlbWEgdmFsaWRhdG9yIGRldGVybWluZXMgd2hldGhlcgotdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gWE1MIHNjaGVtYXMKLWFyZSB2YWxpZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvIj4gWE1MIFNjaGVtYSBQYXJ0IDE6Ci1TdHJ1Y3R1cmVzPC9hPiBmcm9tIHRoZSBXM0MgV2ViIHNpdGUuPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMjQgIj5YTUwgVmFsaWRhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTI2ICI+VGhlIFhNTCB2YWxpZGF0b3IgZW5zdXJlcyB0aGF0IGFuIFhNTCBmaWxlCi1pcyB3ZWxsLWZvcm1lZC4gSXQgYWxzbyB2ZXJpZmllcyBpZiBhbiBYTUwgZmlsZSBpcyB2YWxpZCAtIHRoYXQgaXMsIGl0IGZvbGxvd3MKLXRoZSBjb25zdHJhaW50cyBlc3RhYmxpc2hlZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQKLXdpdGguPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1yZWYuaHRtbCIgdGl0bGU9IlRoZSBmb2xsb3dpbmcgcmVmZXJlbmNlIG1hdGVyaWFsIG9uIEoyRUUgaXMgYXZhaWxhYmxlOiI+UmVmZXJlbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnZhbGVyci5odG1sIiB0aXRsZT0iWW91IG1heSBlbmNvdW50ZXIgdGhlc2UgY29tbW9uIGVycm9yIG1lc3NhZ2VzIHdoZW4geW91IHZhbGlkYXRlIHlvdXIgcHJvamVjdHMuIj5Db21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRhcHBjLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50YXBwYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWRlNzY0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRhcHBjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5BcHBDbGllbnRFeHBvcnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnRhcHBjIj48YSBuYW1lPSJ0YW50YXBwYyI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BcHBDbGllbnRFeHBvcnQ8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgcGVyZm9ybXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzIHRoZSBBcHBsaWNhdGlvbiBDbGllbnQKLWV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBhbiBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdCB0byBhbiBBcHBsaWNhdGlvbgotQ2xpZW50IEpBUiBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXJhbWV0ZXJzPC9zcGFuPjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGlkPSJkMGUyMSI+QXR0cmlidXRlPC90aD4KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaWQ9ImQwZTIzIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaWQ9ImQwZTI1Ij5SZXF1aXJlZDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT48dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjEgIj5BcHBDbGllbnRQcm9qZWN0TmFtZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+TmFtZSBvZiB0aGUgQXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QgKDxlbT5DYXNlIFNlbnNpdGl2ZTwvZW0+KTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPkFwcENsaWVudEV4cG9ydEZpbGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPkFic29sdXRlIHBhdGggb2YgdGhlIEFwcGxpY2F0aW9uIENsaWVudCBKQVIgZmlsZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjEgIj5FeHBvcnRTb3VyY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPldoZXRoZXIgdG8gaW5jbHVkZSBzb3VyY2UgZmlsZXMgb3Igbm90LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ObywgZGVmYXVsdCBpczxlbT4gZmFsc2U8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+T3ZlcndyaXRlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjMgIj5XaGV0aGVyIHRvIG92ZXJ3cml0ZSBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXM8ZW0+IGZhbHNlPC9lbT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeGFtcGxlczwvc3Bhbj48L3A+Ci08dWw+PGxpPkV4cG9ydCB0aGUgcHJvamVjdCAiUHJvamVjdENsaWVudCIgdG8gIlByb2plY3RDbGllbnQuamFyIiBpbiB0aGUgQyBEcml2ZTogPHByZT4mbHQ7YXBwQ2xpZW50RXhwb3J0IAotQXBwQ2xpZW50UHJvamVjdE5hbWU9IlByb2plY3RDbGllbnQiIAotQXBwQ2xpZW50RXhwb3J0RmlsZT0iQzpcUHJvamVjdENsaWVudC5qYXIiLyZndDs8L3ByZT4KLTwvbGk+Ci08bGk+RXhwb3J0IHRoZSBwcm9qZWN0ICJQcm9qZWN0Q2xpZW50IiB3aXRoIHRoZSBzb3VyY2UgZmlsZXMgdG8gIlByb2plY3RDbGllbnQuamFyIgotaW4gdGhlIEMgRHJpdmU6IDxwcmU+Jmx0O2FwcENsaWVudEV4cG9ydCAKLUFwcENsaWVudFByb2plY3ROYW1lPSJQcm9qZWN0Q2xpZW50IiAKLUFwcENsaWVudEV4cG9ydEZpbGU9IkM6XFByb2plY3RDbGllbnQuamFyIiAKLUV4cG9ydFNvdXJjZT0idHJ1ZSIvJmd0OzwvcHJlPgotPC9saT4KLTwvdWw+Ci0gPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWFudGoyZWUuaHRtbCIgdGl0bGU9IiI+QW50IHRhc2tzIGZvciBKMkVFPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50YXV0b2FwcGluc3RhbGwuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayB1c2VzIHRoZSBXZWJTcGhlcmUgUmFwaWQgRGVwbG95IGZlYXR1cmUgdG8gaW5zdGFsbCBhbiBhcHBsaWNhdGlvbi4iPmF1dG9BcHBJbnN0YWxsPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGVhcmUuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIEVBUiBmaWxlIGV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QgdG8gYW4gRUFSIGZpbGUuIj5FQVJFeHBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50dXRpbC5odG1sIiB0aXRsZT0iKERFUFJFQ0FURUQpIFRoaXMgdGFzayBjb21wcmVzc2VzIHNvdXJjZSBhbmQvb3IgYnVpbGQgb3V0cHV0IG9mIGEgSmF2YSBwcm9qZWN0IGludG8gYSBKQVIgZmlsZSBhbmQgcGxhY2VzIHRoZSBKQVIgZmlsZSBpbiBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QuIj5VdGlsSmFyPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdhcmUuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIFdBUiBmaWxlIGV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBhIFdlYiBQcm9qZWN0IHRvIGEgV0FSIGZpbGUuIj5XQVJFeHBvcnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50YXV0b2FwcGluc3RhbGwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRhdXRvYXBwaW5zdGFsbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQzYzgwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRhdXRvYXBwaW5zdGFsbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+YXV0b0FwcEluc3RhbGw8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnRhdXRvYXBwaW5zdGFsbCI+PGEgbmFtZT0idGFudGF1dG9hcHBpbnN0YWxsIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPmF1dG9BcHBJbnN0YWxsPC9oMT4KLTxkaXY+PHA+VGhpcyB0YXNrIHVzZXMgdGhlIFdlYlNwaGVyZTxzdXA+wq48L3N1cD4gUmFwaWQgRGVwbG95IGZlYXR1cmUgdG8KLWluc3RhbGwgYW4gYXBwbGljYXRpb24uPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGFyYW1ldGVyczwvc3Bhbj48L3A+Ci0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBpZD0iZDBlMjMiPkF0dHJpYnV0ZTwvdGg+Ci08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGlkPSJkMGUyNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGlkPSJkMGUyNyI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIzICI+RmlsZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyNSAiPlRoZSBhcHBsaWNhdGlvbiBmaWxlIHRvIGJlIGluc3RhbGxlZDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjcgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMyAiPkNvbmZpZ0RhdGE8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyNSAiPkFuIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjcgIj5ObzwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIzICI+UHJvamVjdE5hbWU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyNSAiPlRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIHByb2plY3QgdG8gY3JlYXRlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNyAiPk5vLCBkZWZhdWx0IGlzIDxlbT5BdXRvQXBwSW5zdGFsbDwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjMgIj5Qcm9wZXJ0eUVycm9yQ291bnQ8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyNSAiPlByb3BlcnR5IHRvIHJlY2VpdmUgdGhlIHByb2plY3QgZXJyb3IgY291bnQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI3ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPlByb2plY3RFcnJvckNvdW50PC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMyAiPlByb3BlcnR5RXJyb3JNZXNzYWdlczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTI1ICI+UHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCBlcnJvciBtZXNzYWdlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjcgIj5ObywgZGVmYXVsdCBpcyA8ZW0+UHJvamVjdEVycm9yTWVzc2FnZXM8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIzICI+Q29uc29sZU91dHB1dDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTI1ICI+V2hldGhlciBvciBub3QgdG8gb3V0cHV0IGV4dHJhIHByb2dyZXNzIG1lc3NhZ2VzIHRvCi10aGUgY29uc29sZSBsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI3ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeGFtcGxlczwvc3Bhbj48L3A+Ci08dWw+PGxpPkluc3RhbGwgdGhlIE15VGVzdCBhcHBsaWNhdGlvbiB1c2luZyBhIGNvbmZpZ3VyYXRpb24gZmlsZTo8cHJlPiZsdDthdXRvQXBwSW5zdGFsbCAKLQlGaWxlcz0iWDovTXlQYXRoL015VGVzdC5qc3AiIAotCUNvbmZpZ0RhdGE9Ik15Q29uZmlnRGF0YS54bWwiIAotCUNvbnNvbGVPdXRwdXQ9InRydWUiIC8mZ3Q7Ci0mbHQ7ZWNobyBtZXNzYWdlPSJjb21waWxlciBwcm9ibGVtLnVudXNlZEltcG9ydD0ke3VudXNlZEltcG9ydH0iIC8mZ3Q7PC9wcmU+Ci08L2xpPgotPGxpPkFuIG9wdGlvbmFsIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmNvbmZpZ0RhdGEueG1sPC9zYW1wPiBmaWxlOjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPyZndDsKLSZsdDtjb20uaWJtLndzLnJkLmhlYWRsZXNzbW9kZWw6SGVhZGxlc3NDb25maWd1cmF0aW9uIAotCXhtbG5zOmNvbS5pYm0ud3MucmQuaGVhZGxlc3Ntb2RlbD0iaHR0cDovLy9jb20vaWJtL3dzL3JkL2hlYWRsZXNzbW9kZWwuZWNvcmUiJmd0OwotCSZsdDtwcm9qZWN0IG5hbWU9IkF1dG9BcHBJbnN0YWxsIiAKLQkJd29ya3NwYWNlTG9jYXRpb249Ilg6XE15V29ya3NwYWNlIiAKLQkJc3R5bGVJRD0iQXV0byBBcHBsaWNhdGlvbiBJbnN0YWxsIiZndDsKLQkmbHQ7dGFyZ2V0U2VydmVyIHNlcnZlck5hbWU9InNlcnZlcjEiIAotCQlzZXJ2ZXJKTVhIb3N0PSJsb2NhbGhvc3QiIAotCQlzZXJ2ZXJKTVhQb3J0PSI4ODgwIiAKLQkJd2F0Y2hJbnRlcnZhbD0iNSIvJmd0OwotCSZsdDsvcHJvamVjdCZndDsKLSZsdDsvY29tLmlibS53cy5yZC5oZWFkbGVzc21vZGVsOkhlYWRsZXNzQ29uZmlndXJhdGlvbiZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotIDwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1hbnRqMmVlLmh0bWwiIHRpdGxlPSIiPkFudCB0YXNrcyBmb3IgSjJFRTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGFwcGMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIEFwcGxpY2F0aW9uIENsaWVudCBleHBvcnQgd2l6YXJkIGZvciBleHBvcnRpbmcgYW4gQXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QgdG8gYW4gQXBwbGljYXRpb24gQ2xpZW50IEpBUiBmaWxlLiI+QXBwQ2xpZW50RXhwb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGVhcmUuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIEVBUiBmaWxlIGV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QgdG8gYW4gRUFSIGZpbGUuIj5FQVJFeHBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50dXRpbC5odG1sIiB0aXRsZT0iKERFUFJFQ0FURUQpIFRoaXMgdGFzayBjb21wcmVzc2VzIHNvdXJjZSBhbmQvb3IgYnVpbGQgb3V0cHV0IG9mIGEgSmF2YSBwcm9qZWN0IGludG8gYSBKQVIgZmlsZSBhbmQgcGxhY2VzIHRoZSBKQVIgZmlsZSBpbiBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QuIj5VdGlsSmFyPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdhcmUuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIFdBUiBmaWxlIGV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBhIFdlYiBQcm9qZWN0IHRvIGEgV0FSIGZpbGUuIj5XQVJFeHBvcnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50YXhibi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGF4Ym4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyZTNlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50YXhibi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkFjY2Vzc0JlYW5SZWdlbmVyYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnRheGJuIj48YSBuYW1lPSJ0YW50YXhibiI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BY2Nlc3NCZWFuUmVnZW5lcmF0aW9uPC9oMT4KLTxkaXY+PHA+VGhpcyB0YXNrIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVnZW5lcmF0ZQotQWNjZXNzIEJlYW5zPC9zcGFuPiBtZW51IGFjdGlvbiwgZm9yIHJlZ2VuZXJhdGluZyBhY2Nlc3MgYmVhbnMgaW4gYW4KLUVKQiBwcm9qZWN0LiBUaGlzIGlzIG5vdCBhdmFpbGFibGUgaW4gV2ViU3BoZXJlPHN1cD7Crjwvc3VwPiBTdHVkaW8gU2l0ZSBEZXZlbG9wZXIgb3IgV2ViU3BoZXJlIEFwcGxpY2F0aW9uCi1TZXJ2ZXIgRXhwcmVzcy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGFyYW1ldGVyczwvc3Bhbj48L3A+Ci0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBpZD0iZDBlMzAiPkF0dHJpYnV0ZTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBpZD0iZDBlMzIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBpZD0iZDBlMzQiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUzMCAiPkVKQlByb2plY3ROYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTMyICI+TmFtZSBvZiB0aGUgRUpCIFByb2plY3QgKDxlbT5DYXNlIFNlbnNpdGl2ZTwvZW0+KTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuNTU3NDkxMjg5MTk4NjA1JSIgaGVhZGVycz0iZDBlMzQgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUzMCAiPlN1c3BlbmRQcm9qZWN0VmFsaWRhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBoZWFkZXJzPSJkMGUzMiAiPkluZGljYXRlcyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIHN1c3BlbmRlZCBhZnRlcgotYWNjZXNzIGJlYW4gZ2VuZXJhdGlvbi4gT3RoZXJ3aXNlIGFsbCByZWdpc3RlcmVkIHZhbGlkYXRvcnMgcnVuIG9uIHRoZSBwcm9qZWN0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuNTU3NDkxMjg5MTk4NjA1JSIgaGVhZGVycz0iZDBlMzQgIj5ObywgZGVmYXVsdCBpcyA8ZW0+ZmFsc2U8L2VtPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4YW1wbGVzPC9zcGFuPjwvcD4KLTx1bD48bGk+UmVnZW5lcmF0ZSB0aGUgYWNjZXNzIGJlYW5zIGluIHRoZSBFSkIgcHJvamVjdCBuYW1lZCAiU2FtcGxlIiwgYW5kIGFsbG93Ci12YWxpZGF0aW9uIHRvIHByb2NlZWQ6IDxwcmU+Jmx0O2FjY2Vzc0JlYW5SZWdlbmVyYXRpb24KLWVqYlByb2plY3ROYW1lID0gIlNhbXBsZSIKLXN1c3BlbmRQcm9qZWN0VmFsaWRhdGlvbiA9ICJmYWxzZSIgJmd0OyAKLSZsdDsvYWNjZXNzQmVhblJlZ2VuZXJhdGlvbiZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWFudGVqYi5odG1sIiB0aXRsZT0iIj5BbnQgdGFza3MgZm9yIEVKQi1lbmFibGVkIHRvb2xzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGNhcHR1cmVidWlsZG1lc3NhZ2VzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhMGZkMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLQotCi0KLQotCi0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5jYXB0dXJlQnVpbGRNZXNzYWdlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFudGNhcHR1cmVidWlsZG1lc3NhZ2VzIj48YSBuYW1lPSJ0YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Y2FwdHVyZUJ1aWxkTWVzc2FnZXM8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgY2FwdHVyZXMgQW50IGJ1aWxkIG1lc3NhZ2VzIGFuZCBhbGxvd3MgdGhlbSB0byBiZSBzZWFyY2hlZAotb3IgZGlzcGxheWVkLCBhbmQgYWxsb3dzIGNvbmRpdGlvbmFsIEFudCBidWlsZCBmYWlsdXJlcyBkZXBlbmRpbmcgb24gd2hldGhlcgotb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGFyYW1ldGVyczwvc3Bhbj48L3A+Ci0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBpZD0iZDBlMjAiPkF0dHJpYnV0ZTwvdGg+Ci08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGlkPSJkMGUyMiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGlkPSJkMGUyNCI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+YWN0aW9uIDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+VGhlIGNhcHR1cmluZyBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNCAiPlllcy4gTWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiA8dWw+PGxpPjxlbT5zdGFydDwvZW0+PC9saT4KLTxsaT48ZW0+c3RvcDwvZW0+PC9saT4KLTxsaT48ZW0+Z2V0QWxsTWVzc2FnZXM8L2VtPjwvbGk+Ci08bGk+PGVtPmZpbmRNZXNzYWdlPC9lbT48L2xpPgotPGxpPjxlbT5GYWlsT25FcnJvck1lc3NhZ2VQcmVzZW50PC9lbT48L2xpPgotPGxpPjxlbT5GYWlsT25FcnJvck1lc3NhZ2VNaXNzaW5nPC9lbT48L2xpPgotPC91bD4KLTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+TWVzc2FnZUxldmVsPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjIgIj5UaGUgbGV2ZWwgb2YgQW50IGJ1aWxkIG1lc3NhZ2VzIHRvIGNhcHR1cmU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPkluZm9ybWF0aW9uPC9lbT4uIE1heSBiZSA8ZW0+ZXJyb3I8L2VtPiwgPGVtPndhcm5pbmc8L2VtPiwgPGVtPmluZm9ybWF0aW9uPC9lbT4sIDxlbT5kZWJ1ZzwvZW0+LAotb3IgPGVtPnZlcmJvc2U8L2VtPi48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMCAiPlNlYXJjaFN0cmluZzwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+QSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQgZm9yIChvbmx5IHZhbGlkIGZvciA8ZW0+ZmluZE1lc3NhZ2U8L2VtPiBvciA8ZW0+RmFpbE9uRXJyb3JNZXNzYWdlUHJlc2VudDwvZW0+IG9yIDxlbT5GYWlsT25FcnJvck1lc3NhZ2VNaXNzaW5nPC9lbT4pPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNCAiPlllcyAoZm9yIHNlYXJjaCBhY3Rpb25zKTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+UHJvcGVydHlNZXNzYWdlc05hbWU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMiAiPlByb3BlcnR5IHRvIHJlY2VpdmUgR2V0L1NlYXJjaCBhY3Rpb24gTWVzc2FnZSByZXN1bHQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPkJ1aWxkTWVzc2FnZXM8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+RXJyb3JQcmVmaXhNZXNzYWdlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjIgIj5BIHN0cmluZyBwcmVmaXggdG8gYmUgb3V0cHV0IGJlZm9yZSBhbnkgRmFpbE9uRXJyb3IKLWZhaWx1cmUgbWVzc2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjQgIj5ObzwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4YW1wbGVzPC9zcGFuPjwvcD4KLTx1bD48bGk+UGVyZm9ybSBhIHByb2plY3RCdWlsZCBhbmQgZGlzcGxheSB0aGUgYnVpbGQgbWVzc2FnZXM6PHByZT4mbHQ7Y2FwdHVyZUJ1aWxkTWVzc2FnZXMgYWN0aW9uPSJzdGFydCIgIAotCW1lc3NhZ2VsZXZlbD0iaW5mb3JtYXRpb24iIC8mZ3Q7Ci0mbHQ7cHJvamVjdEJ1aWxkwqAgUHJvamVjdE5hbWU9Im15UHJvamVjdCIgLyZndDsKLSZsdDtjYXB0dXJlQnVpbGRNZXNzYWdlcyBhY3Rpb249InN0b3AiIC8mZ3Q7Ci0mbHQ7Y2FwdHVyZUJ1aWxkTWVzc2FnZXMgYWN0aW9uPSJnZXRBbGxNZXNzYWdlcyIgCi0JcHJvcGVydHltZXNzYWdlc25hbWU9IkJ1aWxkTWVzc2FnZXMiIC8mZ3Q7Ci0mbHQ7ZWNobyBtZXNzYWdlPSJwcm9qZWN0QnVpbGQ6IAotCWJ1aWxkIG1lc3NhZ2VzPSR7QnVpbGRNZXNzYWdlc30iIC8mZ3Q7PC9wcmU+Ci08L2xpPgotPGxpPlNlYXJjaCB0aGUgcHJldmlvdXMgYnVpbGQgbWVzc2FnZXMgZm9yIGEgdGFyZ2V0IHN0cmluZywgYW5kIHRoZW4gZmFpbAotaWYgYW4gZXJyb3Igc3RyaW5nIGlzIHByZXNlbnQ6PHByZT4mbHQ7Y2FwdHVyZUJ1aWxkTWVzc2FnZXMgYWN0aW9uPSJmaW5kTWVzc2FnZSIgCi0Jc2VhcmNoc3RyaW5nPSIke1RhcmdldFNlYXJjaFN0cmluZ30iICAKLQlwcm9wZXJ0eW1lc3NhZ2VzbmFtZT0iRm91bmRNZXNzYWdlcyIgLyZndDsKLSZsdDtlY2hvIG1lc3NhZ2U9InByb2plY3RCdWlsZDogc2VhcmNoIGZvdW5kIAotCXRhcmdldCBtZXNzYWdlcz0ke0ZvdW5kTWVzc2FnZXN9IiAvJmd0OwotJmx0O2NhcHR1cmVCdWlsZE1lc3NhZ2VzIGFjdGlvbj0iZmFpbE9uRXJyb3JNZXNzYWdlUHJlc2VudCIgCi0Jc2VhcmNoc3RyaW5nPSIke0Vycm9yTWVzc2FnZVN0cmluZ30iIC8mZ3Q7PC9wcmU+Ci08L2xpPgotPC91bD4KLSA8L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtYW50Z2VuZXJhbC5odG1sIiB0aXRsZT0iIj5HZW5lcmFsIEFudCB0YXNrczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGNvbXBpbGV3Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgY29tcGlsZXMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIEl0IHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBqYXZhYy4gV2hpbGUgdGhpcyB0YXNrIGlzIHJ1bm5pbmcsIGFsbCB0aGUgdmFsaWRhdGlvbiBhbmQgb3RoZXIgYnVpbGRlcnMgYXJlIHR1cm5lZCBvZiI+Y29tcGlsZVdvcmtzcGFjZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRnZXRqLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3IgY291bnQgZm9yIHRoZSBsYXN0IGludGVybmFsIGphdmFjIGNvbXBpbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4iPmdldEphdmFjRXJyb3JDb3VudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRnZXRwLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgc3BlY2lmaWVkIHByb2plY3QgaW5mb3JtYXRpb24uIj5nZXRQcm9qZWN0RGF0YTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4iPnByb2plY3RCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0Z2V0ZXJyb3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuIEl0IGlzIGEgc3Vic2V0IG9mIHRoZSBwcm9qZWN0QnVpbGQgdGFzayAoaXQgZG9lcyBub3QgZG8gYSBidWlsZCwgaXQganVzdCBnZXRzIHByb2plY3QgZXJyb3JzIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgd2VyZSBjcmVhdGVkKSI+cHJvamVjdEdldEVycm9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0aW1wb3J0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBmaWxlIHN5c3RlbSBwcm9qZWN0IGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0SW1wb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RzZXRidWlsZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyBhIHNldCBvZiBFY2xpcHNlIHByb2plY3RzIHVzaW5nIGFuIGV4aXN0aW5nIEVjbGlwc2UgdGVhbSBQcm9qZWN0IFNldCBGaWxlICgmIzM0O1BTRiYjMzQ7KS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbSAmIzM0O1Byb2plY3QgU2V0IEV4cG9ydCYjMzQ7IGNvbW1hbmQsIGFuZCB0aGVuIHRoZSB0YXNrIHByb2plY3RTZXRJbXBvcnQgbXVzdCBoYXZlIGJlZW4gdXNlZCB0byBpbXBvcnQgdGhvc2UgcHJvamVjdHMgaW50byBhIHdvcmtzcGFjZS4iPnByb2plY3RTZXRCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0aW1wb3J0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoUFNGKSBpbnRvIGEgd29ya3NwYWNlLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgYW4gRWNsaXBzZSB0ZWFtICYjMzQ7UHJvamVjdCBTZXQgRXhwb3J0JiMzNDsgY29tbWFuZC4iPnByb2plY3RTZXRJbXBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50c2V0ZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgdGhlIGludGVybmFsIEphdmEgY29tcGlsYXRpb24gZGVidWcgbGV2ZWwsIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmdzLiI+c2V0RGVidWdJbmZvPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWJ1aWxkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiI+d29ya3NwYWNlQnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlZ2V0ZXJyb3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgZW50aXJlIHdvcmtzcGFjZS4gSXQgaXMgYSBzdWJzZXQgb2YgdGhlIHdvcmtzcGFjZUJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyB3b3Jrc3BhY2UgZXJyb3JzIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgd2VyZSBjcmVhdGVkKS4iPndvcmtzcGFjZUdldEVycm9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZmlsZS5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHJlYWRzIGEgcHJvcGVydHkgZmlsZSBjb250YWluaW5nIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzIGFuZCBzZXRzIHRob3NlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZUZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlR2V0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VzZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZVNldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRjb21waWxldy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGNvbXBpbGV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTJlNzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGNvbXBpbGV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLQotCi0KLQotCi0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5jb21waWxlV29ya3NwYWNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YW50Y29tcGlsZXciPjxhIG5hbWU9InRhbnRjb21waWxldyI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5jb21waWxlV29ya3NwYWNlPC9oMT4KLTxkaXY+PHA+VGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24KLWFzIGphdmFjLiBXaGlsZSB0aGlzIHRhc2sgaXMgcnVubmluZywgYWxsIHRoZSB2YWxpZGF0aW9uIGFuZCBvdGhlciBidWlsZGVycwotYXJlIHR1cm5lZCBvZjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXJhbWV0ZXJzPC9zcGFuPjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGlkPSJkMGUyMSI+QXR0cmlidXRlPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGlkPSJkMGUyMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGlkPSJkMGUyNSI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIxICI+QnVpbGRUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIzICI+VHlwZSBvZiBidWlsZDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuNTU3NDkxMjg5MTk4NjA1JSIgaGVhZGVycz0iZDBlMjUgIj5ObywgZGVmYXVsdCBpcyA8ZW0+SW5jcmVtZW50YWw8L2VtPi4gQ2FuIGJlIDxlbT5JbmNyZW1lbnRhbDwvZW0+IG9yIDxlbT5GdWxsPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUyMSAiPlF1aWV0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIzICI+V2hldGhlciBvciBub3QgdG8gcHJpbnQgb3V0IG1lc3NhZ2VzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzIDxlbT5mYWxzZTwvZW0+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGlwOjwvc3Bhbj4gVGhlIHF1aWV0IG1vZGUgY2FuIGdpdmUgeW91IGEgc3Vic3RhbnRpYWwKLXBlcmZvcm1hbmNlIGdhaW4gd2hlbiBydW5uaW5nIHRoaXMgQW50IHRhc2sgaW4gdGhlIHdvcmtiZW5jaC48L3A+Ci08cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeGFtcGxlczwvc3Bhbj48L3A+Ci08dWw+PGxpPkRvIGEgZnVsbCBjb21waWxhdGlvbiBvZiB0aGUgd29ya3NwYWNlOiA8cHJlPiZsdDtjb21waWxlV29ya3NwYWNlIEJ1aWxkVHlwZT0iRnVsbCIgLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWFudGdlbmVyYWwuaHRtbCIgdGl0bGU9IiI+R2VuZXJhbCBBbnQgdGFza3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjYXB0dXJlYnVpbGRtZXNzYWdlcy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNhcHR1cmVzIEFudCBidWlsZCBtZXNzYWdlcyBhbmQgYWxsb3dzIHRoZW0gdG8gYmUgc2VhcmNoZWQgb3IgZGlzcGxheWVkLCBhbmQgYWxsb3dzIGNvbmRpdGlvbmFsIEFudCBidWlsZCBmYWlsdXJlcyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgYSBzcGVjaWZpZWQgc3RyaW5nIGlzIGluIHRoZSBjYXB0dXJlZCBidWlsZCBtZXNzYWdlcy4iPmNhcHR1cmVCdWlsZE1lc3NhZ2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGdldGouaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvciBjb3VudCBmb3IgdGhlIGxhc3QgaW50ZXJuYWwgamF2YWMgY29tcGlsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiI+Z2V0SmF2YWNFcnJvckNvdW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGdldHAuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpbmZvcm1hdGlvbi4iPmdldFByb2plY3REYXRhPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2ouaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiI+cHJvamVjdEJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RnZXRlcnJvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvcnMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4gSXQgaXMgYSBzdWJzZXQgb2YgdGhlIHByb2plY3RCdWlsZCB0YXNrIChpdCBkb2VzIG5vdCBkbyBhIGJ1aWxkLCBpdCBqdXN0IGdldHMgcHJvamVjdCBlcnJvcnMgcmVnYXJkbGVzcyBvZiBob3cgdGhleSB3ZXJlIGNyZWF0ZWQpIj5wcm9qZWN0R2V0RXJyb3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RpbXBvcnQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBpbXBvcnRzIGFuIGV4aXN0aW5nIGZpbGUgc3lzdGVtIHByb2plY3QgaW50byBhIHdvcmtzcGFjZS4iPnByb2plY3RJbXBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdHNldGJ1aWxkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIGEgc2V0IG9mIEVjbGlwc2UgcHJvamVjdHMgdXNpbmcgYW4gZXhpc3RpbmcgRWNsaXBzZSB0ZWFtIFByb2plY3QgU2V0IEZpbGUgKCYjMzQ7UFNGJiMzNDspLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgYW4gRWNsaXBzZSB0ZWFtICYjMzQ7UHJvamVjdCBTZXQgRXhwb3J0JiMzNDsgY29tbWFuZCwgYW5kIHRoZW4gdGhlIHRhc2sgcHJvamVjdFNldEltcG9ydCBtdXN0IGhhdmUgYmVlbiB1c2VkIHRvIGltcG9ydCB0aG9zZSBwcm9qZWN0cyBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdFNldEJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RzZXRpbXBvcnQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBpbXBvcnRzIGFuIGV4aXN0aW5nIEVjbGlwc2UgdGVhbSBQcm9qZWN0IFNldCBGaWxlIChQU0YpIGludG8gYSB3b3Jrc3BhY2UuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLiI+cHJvamVjdFNldEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRzZXRkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgc2V0cyB0aGUgaW50ZXJuYWwgSmF2YSBjb21waWxhdGlvbiBkZWJ1ZyBsZXZlbCwgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZ3MuIj5zZXREZWJ1Z0luZm88L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlYnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIj53b3Jrc3BhY2VCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VnZXRlcnJvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvcnMgZm9yIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgd29ya3NwYWNlQnVpbGQgdGFzayAoaXQgZG9lcyBub3QgZG8gYSBidWlsZCwgaXQganVzdCBnZXRzIHdvcmtzcGFjZSBlcnJvcnMgcmVnYXJkbGVzcyBvZiBob3cgdGhleSB3ZXJlIGNyZWF0ZWQpLiI+d29ya3NwYWNlR2V0RXJyb3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VmaWxlLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgcmVhZHMgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMgYW5kIHNldHMgdGhvc2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlRmlsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZ2V0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcy4iPndvcmtzcGFjZVByZWZlcmVuY2VHZXQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZXNldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlU2V0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGVhcmUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRlYXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNWQ4M2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGVhcmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkVBUkV4cG9ydDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFudGVhcmUiPjxhIG5hbWU9InRhbnRlYXJlIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVBUkV4cG9ydDwvaDE+Ci08ZGl2PjxwPlRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIEVBUiBmaWxlIGV4cG9ydCB3aXphcmQKLWZvciBleHBvcnRpbmcgYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0IHRvIGFuIEVBUiBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXJhbWV0ZXJzPC9zcGFuPjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjY0ODA4MzYyMzY5MzM4JSIgaWQ9ImQwZTIxIj5BdHRyaWJ1dGU8L3RoPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBpZD0iZDBlMjMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBpZD0iZDBlMjUiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIxICI+RUFSUHJvamVjdE5hbWU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBoZWFkZXJzPSJkMGUyMyAiPk5hbWUgb2YgdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCAoPGVtPkNhc2UgU2Vuc2l0aXZlPC9lbT4pPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNSAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjY0ODA4MzYyMzY5MzM4JSIgaGVhZGVycz0iZDBlMjEgIj5FQVJFeHBvcnRGaWxlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljc5NDQyNTA4NzEwODAxJSIgaGVhZGVycz0iZDBlMjMgIj5BYnNvbHV0ZSBwYXRoIG9mIHRoZSBFQVIgZmlsZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI1ICI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUyMSAiPkV4cG9ydFNvdXJjZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIzICI+V2hldGhlciB0byBpbmNsdWRlIHNvdXJjZSBmaWxlcyBvciBub3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzIDxlbT5mYWxzZTwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUyMSAiPkluY2x1ZGVQcm9qZWN0TWV0YUZpbGVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljc5NDQyNTA4NzEwODAxJSIgaGVhZGVycz0iZDBlMjMgIj5XaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHByb2plY3QgbWV0YS1kYXRhIGZpbGVzIHRoYXQgaW5jbHVkZSB0aGUgSmF2YeKEoiBidWlsZAotcGF0aCwgdGhlIHByb2plY3QgbmFtZXMsIGV0Yy4gVXNlZCB3aGVuIHJlaW1wb3J0aW5nIGFzIGJpbmFyeSBwcm9qZWN0cy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIxICI+T3ZlcndyaXRlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljc5NDQyNTA4NzEwODAxJSIgaGVhZGVycz0iZDBlMjMgIj5XaGV0aGVyIHRvIG92ZXJ3cml0ZSBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeGFtcGxlczwvc3Bhbj48L3A+Ci08dWw+PGxpPkV4cG9ydCB0aGUgcHJvamVjdCAiRUFSUHJvamVjdCIgdG8gIkVBUlByb2plY3QuZWFyIiBpbiB0aGUgQyBEcml2ZTogPHByZT4mbHQ7ZWFyRXhwb3J0IEVBUlByb2plY3ROYW1lPSJFQVJQcm9qZWN0IiBFQVJFeHBvcnRGaWxlPSJDOlxFQVJQcm9qZWN0LmVhciIvJmd0OzwvcHJlPgotPC9saT4KLTxsaT5FeHBvcnQgdGhlIHByb2plY3QgIkVBUlByb2plY3QiIHdpdGggdGhlIHNvdXJjZSBmaWxlcyB0byAiRUFSUHJvamVjdC5lYXIiCi1pbiB0aGUgQyBEcml2ZTogPHByZT4mbHQ7ZWFyRXhwb3J0IEVBUlByb2plY3ROYW1lPSJFQVJQcm9qZWN0IiBFQVJFeHBvcnRGaWxlPSJDOlxFQVJQcm9qZWN0LmVhciIgRXhwb3J0U291cmNlPSJ0cnVlIi8mZ3Q7PC9wcmU+Ci08L2xpPgotPC91bD4KLSA8L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtYW50ajJlZS5odG1sIiB0aXRsZT0iIj5BbnQgdGFza3MgZm9yIEoyRUU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRhdXRvYXBwaW5zdGFsbC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHVzZXMgdGhlIFdlYlNwaGVyZSBSYXBpZCBEZXBsb3kgZmVhdHVyZSB0byBpbnN0YWxsIGFuIGFwcGxpY2F0aW9uLiI+YXV0b0FwcEluc3RhbGw8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50YXBwYy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgQXBwbGljYXRpb24gQ2xpZW50IGV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBhbiBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdCB0byBhbiBBcHBsaWNhdGlvbiBDbGllbnQgSkFSIGZpbGUuIj5BcHBDbGllbnRFeHBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50dXRpbC5odG1sIiB0aXRsZT0iKERFUFJFQ0FURUQpIFRoaXMgdGFzayBjb21wcmVzc2VzIHNvdXJjZSBhbmQvb3IgYnVpbGQgb3V0cHV0IG9mIGEgSmF2YSBwcm9qZWN0IGludG8gYSBKQVIgZmlsZSBhbmQgcGxhY2VzIHRoZSBKQVIgZmlsZSBpbiBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QuIj5VdGlsSmFyPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdhcmUuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIFdBUiBmaWxlIGV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBhIFdlYiBQcm9qZWN0IHRvIGEgV0FSIGZpbGUuIj5XQVJFeHBvcnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50ZWpiZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGVqYmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhZDZjNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50ZWpiZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5FSkJEZXBsb3k8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnRlamJkIj48YSBuYW1lPSJ0YW50ZWpiZCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FSkJEZXBsb3k8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgZ2VuZXJhdGVzIGRlcGxveW1lbnQgY29kZSBhbmQgUk1JQyBjb2RlIGZvciBhbiBFSkIgUHJvamVjdC4KLU9ubHkgYXZhaWxhYmxlIHdoZXJlIEVKQiBkZXBsb3kgdG9vbHMgYXJlIGF2YWlsYWJsZS48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXJhbWV0ZXJzPC9zcGFuPjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMy4xODY4MTMxODY4MTMxODglIiBpZD0iZDBlMjAiPkF0dHJpYnV0ZTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMuNzM2MjYzNzM2MjYzNzMlIiBpZD0iZDBlMjIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy4wNzY5MjMwNzY5MjMwNzclIiBpZD0iZDBlMjQiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTMuMTg2ODEzMTg2ODEzMTg4JSIgaGVhZGVycz0iZDBlMjAgIj5FSkJQcm9qZWN0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My43MzYyNjM3MzYyNjM3MyUiIGhlYWRlcnM9ImQwZTIyICI+TmFtZSBvZiB0aGUgRUpCIFByb2plY3QgKDxlbT5DYXNlIFNlbnNpdGl2ZTwvZW0+KTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuMDc2OTIzMDc2OTIzMDc3JSIgaGVhZGVycz0iZDBlMjQgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTMuMTg2ODEzMTg2ODEzMTg4JSIgaGVhZGVycz0iZDBlMjAgIj5JZ25vcmVFcnJvcnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjYzLjczNjI2MzczNjI2MzczJSIgaGVhZGVycz0iZDBlMjIgIj5EbyBub3QgaGFsdCBmb3IgY29tcGlsYXRpb24gb3IgdmFsaWRhdGlvbiBlcnJvcnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjA3NjkyMzA3NjkyMzA3NyUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTMuMTg2ODEzMTg2ODEzMTg4JSIgaGVhZGVycz0iZDBlMjAgIj5Ob1ZhbGlkYXRlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My43MzYyNjM3MzYyNjM3MyUiIGhlYWRlcnM9ImQwZTIyICI+RGlzYWJsZSB0aGUgdmFsaWRhdGlvbiBzdGVwczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuMDc2OTIzMDc2OTIzMDc3JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgZGVmYXVsdCBpcyA8ZW0+ZmFsc2U8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMy4xODY4MTMxODY4MTMxODglIiBoZWFkZXJzPSJkMGUyMCAiPlF1aWV0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My43MzYyNjM3MzYyNjM3MyUiIGhlYWRlcnM9ImQwZTIyICI+T25seSBvdXRwdXQgZXJyb3JzLCBzdXBwcmVzcyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy4wNzY5MjMwNzY5MjMwNzclIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT5mYWxzZTwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjEzLjE4NjgxMzE4NjgxMzE4OCUiIGhlYWRlcnM9ImQwZTIwICI+VXNlMzVSdWxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMuNzM2MjYzNzM2MjYzNzMlIiBoZWFkZXJzPSJkMGUyMiAiPiZsdDtkZXByZWNhdGVkJmd0Oy1SZXBsYWNlZCBieSAiQ29tcGF0aWJsZTM1Ii48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjA3NjkyMzA3NjkyMzA3NyUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTMuMTg2ODEzMTg2ODEzMTg4JSIgaGVhZGVycz0iZDBlMjAgIj5Db21wYXRpYmxlMzU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjYzLjczNjI2MzczNjI2MzczJSIgaGVhZGVycz0iZDBlMjIgIj5Vc2UgdGhlIFdlYlNwaGVyZTxzdXA+wq48L3N1cD4gMy41Ci1jb21wYXRpYmxlIG1hcHBpbmcgcnVsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjA3NjkyMzA3NjkyMzA3NyUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTMuMTg2ODEzMTg2ODEzMTg4JSIgaGVhZGVycz0iZDBlMjAgIj5Db2RlR2VuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My43MzYyNjM3MzYyNjM3MyUiIGhlYWRlcnM9ImQwZTIyICI+T25seSBnZW5lcmF0ZSB0aGUgZGVwbG95bWVudCBjb2RlLCBkbyBub3QgcnVuIFJNSUMgb3IKLUphdmFjPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy4wNzY5MjMwNzY5MjMwNzclIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT5mYWxzZTwvZW0+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhhbXBsZXM8L3NwYW4+PC9wPgotPHVsPjxsaT5HZW5lcmF0ZSBEZXBsb3ltZW50IGNvZGUgYW5kIFJNSUMgY29kZSBmb3IgIkVKQlByb2plY3QiLCBydW4gdmFsaWRhdGlvbgotb24gdGhlIHByb2plY3QsIGFuZCBwcmludCBvdXQgYW55IGVycm9ycyB3aGlsZSBjb21waWxpbmcvdmFsaWRhdGluZyB0aGUgcHJvamVjdC4KLUlmIHRoZXJlIGFyZSBlcnJvcnMgdGhlIG9wZXJhdGlvbiBjb21lcyB0byBhIGhhbHQ6IDxwcmU+Jmx0O2VqYkRlcGxveSBFSkJQcm9qZWN0PSJFSkJQcm9qZWN0IiAvJmd0OzwvcHJlPgotIDwvbGk+Ci08bGk+R2VuZXJhdGUgRGVwbG95bWVudCBjb2RlIGFuZCBSTUlDIGNvZGUgZm9yICJFSkJQcm9qZWN0IiBhbmQgcnVuIHZhbGlkYXRpb24KLW9uIHRoZSBwcm9qZWN0LiBCdXQgaWYgdGhlcmUgYXJlIGFueSBlcnJvcnMgd2hpbGUgdmFsaWRhdGluZy9jb21waWxpbmcsIHRoZQotZXJyb3JzIGFyZSByZXBvcnRlZCBhbmQgdGhlIG9wZXJhdGlvbiBjb250aW51ZXM6IDxwcmU+Jmx0O2VqYkRlcGxveSBFSkJQcm9qZWN0PSJFSkJQcm9qZWN0IiBJZ25vcmVFcnJvcnM9InRydWUiLyZndDs8L3ByZT4KLTwvbGk+Ci08bGk+R2VuZXJhdGUgRGVwbG95bWVudCBjb2RlIGFuZCBSTUlDIGNvZGUgZm9yICJFSkJQcm9qZWN0IiBidXQgZG8gbm90IHJ1bgotdGhlIHZhbGlkYXRpb24gc3RlcHMuIElmIHRoZXJlIGFyZSBhbnkgZXJyb3JzIHdoaWxlIGNvbXBpbGluZywgdGhlIGVycm9ycwotYXJlIHJlcG9ydGVkIGFuZCB0aGUgb3BlcmF0aW9uIGNvbWVzIHRvIGEgaGFsdC4gPHByZT4mbHQ7ZWpiRGVwbG95IEVKQlByb2plY3Q9IkVKQlByb2plY3QiIE5vVmFsaWRhdGU9InRydWUiLyZndDs8L3ByZT4KLTwvbGk+Ci08bGk+R2VuZXJhdGUgRGVwbG95bWVudCBjb2RlIGFuZCBSTUlDIGNvZGUgZm9yICJFSkJQcm9qZWN0Ii4gVXNlIFdlYlNwaGVyZSBWZXJzaW9uCi0zLjUgbWFwcGluZyBydWxlcyBpbnN0ZWFkIG9mIFZlcnNpb24gNC4wLiBSdW4gdmFsaWRhdGlvbiBvbiB0aGUgcHJvamVjdCwgYnV0Ci1pZiB0aGVyZSBhcmUgYW55IGVycm9ycyB3aGlsZSB2YWxpZGF0aW5nIG9yIGNvbXBpbGluZywgdGhlIGVycm9ycyBhcmUgaWdub3JlZAotYW5kIHRoZSBvcGVyYXRpb24gY29udGludWVzOiA8cHJlPiZsdDtlamJEZXBsb3kgRUpCUHJvamVjdD0iRUpCUHJvamVjdCIgQ29tcGF0aWJsZTM1PSJ0cnVlIi8mZ3Q7PC9wcmU+Ci08L2xpPgotPGxpPkdlbmVyYXRlIERlcGxveW1lbnQgY29kZSBhbmQgUk1JQyBjb2RlIGZvciAiRUpCUHJvamVjdCIuIERvIG5vdCBydW4gdGhlCi12YWxpZGF0aW9uIG9uIHRoZSBwcm9qZWN0IGFuZCBkbyBub3QgZGlzcGxheSBhbnkgbWVzc2FnZXMgZXhwZWN0IGZvciBlcnJvcgotbWVzc2FnZXMsIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBjb21lcyB0byBhIGhhbHQ6IDxwcmU+Jmx0O2VqYkRlcGxveSBFSkJQcm9qZWN0PSJFSkJQcm9qZWN0IiBOb1ZhbGlkYXRlPSJ0cnVlIiBRdWlldD0idHJ1ZSIvJmd0OzwvcHJlPgotPC9saT4KLTxsaT5HZW5lcmF0ZSBEZXBsb3ltZW50IGNvZGUgZm9yICJFSkJQcm9qZWN0Ii4gUnVuIHZhbGlkYXRpb24gb24gdGhlIHByb2plY3QsCi1idXQgaWdub3JlIGdlbmVyYXRpb24gb2YgdGhlIFJNSUMgY29kZTogPHByZT4mbHQ7ZWpiRGVwbG95IEVKQlByb2plY3Q9IkVKQlByb2plY3QiIENvZGVHZW49InRydWUiLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWFudGVqYi5odG1sIiB0aXRsZT0iIj5BbnQgdGFza3MgZm9yIEVKQi1lbmFibGVkIHRvb2xzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGVqYmUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRlamJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzU5ZjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGVqYmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5FSkJFeHBvcnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnRlamJlIj48YSBuYW1lPSJ0YW50ZWpiZSI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FSkJFeHBvcnQ8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgcGVyZm9ybXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzIHRoZSBFSkIgSkFSIGZpbGUgZXhwb3J0Ci13aXphcmQgZm9yIGV4cG9ydGluZyBhbiBFSkIgUHJvamVjdCB0byBhbiBFSkIgSmFyIGZpbGUuIFRoaXMgdGFzayBpcyBub3QgYXZhaWxhYmxlCi1pbiBwcm9kdWN0cyB0aGF0IGRvIG5vdCBpbmNsdWRlIEVKQiBkZXZlbG9wbWVudCB0b29scy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXJhbWV0ZXJzPC9zcGFuPjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNy4wNzMxNzA3MzE3MDczMTglIiBpZD0iZDBlMjAiPkF0dHJpYnV0ZTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTcuMzE3MDczMTcwNzMxNyUiIGlkPSJkMGUyMiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjI1LjYwOTc1NjA5NzU2MDk3NSUiIGlkPSJkMGUyNCI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNy4wNzMxNzA3MzE3MDczMTglIiBoZWFkZXJzPSJkMGUyMCAiPkVKQlByb2plY3ROYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ny4zMTcwNzMxNzA3MzE3JSIgaGVhZGVycz0iZDBlMjIgIj5OYW1lIG9mIHRoZSBFSkIgUHJvamVjdCAoPGVtPkNhc2UgU2Vuc2l0aXZlPC9lbT4pPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNS42MDk3NTYwOTc1NjA5NzUlIiBoZWFkZXJzPSJkMGUyNCAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNy4wNzMxNzA3MzE3MDczMTglIiBoZWFkZXJzPSJkMGUyMCAiPkVKQkV4cG9ydEZpbGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjU3LjMxNzA3MzE3MDczMTclIiBoZWFkZXJzPSJkMGUyMiAiPkFic29sdXRlIHBhdGggb2YgdGhlIEVKQiBKQVIgZmlsZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjI1LjYwOTc1NjA5NzU2MDk3NSUiIGhlYWRlcnM9ImQwZTI0ICI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjE3LjA3MzE3MDczMTcwNzMxOCUiIGhlYWRlcnM9ImQwZTIwICI+RXhwb3J0U291cmNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ny4zMTcwNzMxNzA3MzE3JSIgaGVhZGVycz0iZDBlMjIgIj5XaGV0aGVyIHRvIGluY2x1ZGUgc291cmNlIGZpbGVzIG9yIG5vdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjI1LjYwOTc1NjA5NzU2MDk3NSUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTcuMDczMTcwNzMxNzA3MzE4JSIgaGVhZGVycz0iZDBlMjAgIj5PdmVyd3JpdGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjU3LjMxNzA3MzE3MDczMTclIiBoZWFkZXJzPSJkMGUyMiAiPldoZXRoZXIgdG8gb3ZlcndyaXRlIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjUuNjA5NzU2MDk3NTYwOTc1JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgZGVmYXVsdCBpczxlbT5mYWxzZTwvZW0+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhhbXBsZXM8L3NwYW4+PC9wPgotPHVsPjxsaT5FeHBvcnQgdGhlIHByb2plY3QgIkVKQlByb2plY3QiIHRvICJFSkJQcm9qZWN0LmphciIgaW4gdGhlIEMgRHJpdmU6IDxwcmU+Jmx0O2VqYkV4cG9ydCAKLUVKQlByb2plY3ROYW1lPSJFSkJQcm9qZWN0IiAKLUVKQkV4cG9ydEZpbGU9IkM6XEVKQlByb2plY3QuamFyIi8mZ3Q7PC9wcmU+Ci08L2xpPgotPGxpPkV4cG9ydCB0aGUgcHJvamVjdCAiRUpCUHJvamVjdCIgd2l0aCB0aGUgc291cmNlIGZpbGVzIHRvICJFSkJQcm9qZWN0LmphciIKLWluIHRoZSBDIERyaXZlOiA8cHJlPiZsdDtlamJFeHBvcnQgCi1FSkJQcm9qZWN0TmFtZT0iRUpCUHJvamVjdCIKLUVKQkV4cG9ydEZpbGU9IkM6XEVKQlByb2plY3QuamFyIgotRXhwb3J0U291cmNlPSJ0cnVlIi8mZ3Q7PC9wcmU+Ci08L2xpPgotPC91bD4KLSA8L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtYW50ZWpiLmh0bWwiIHRpdGxlPSIiPkFudCB0YXNrcyBmb3IgRUpCLWVuYWJsZWQgdG9vbHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50ZXhhbXBsZWF1dG9idWlsZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGV4YW1wbGVhdXRvYnVpbGQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhOTAwYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50ZXhhbXBsZWF1dG9idWlsZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkV4YW1wbGU6IEF1dG9tYXRlZCBBbnQgYnVpbGQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnRleGFtcGxlYXV0b2J1aWxkIj48YSBuYW1lPSJ0YW50ZXhhbXBsZWF1dG9idWlsZCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FeGFtcGxlOiBBdXRvbWF0ZWQgQW50IGJ1aWxkPC9oMT4KLTxkaXY+PHA+VGhpcyBleGFtcGxlIHByb2dyYW0gc2hvd3MgYSB0eXBpY2FsIGF1dG9tYXRlZCBidWlsZCB1c2luZyB0aGUKLXdvcmtiZW5jaCBBbnQgdGFza3MuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gcnVuIHRoZSBhdXRvbWF0ZWQgQW50IGJ1aWxkIGV4YW1wbGU6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5HbyB0byB0aGUgY29tLmlibS5ldG9vbHMuajJlZS5hbnQgZGlyZWN0b3J5IHVuZGVyIHlvdXIgd29ya2JlbmNoCi1pbnN0YWxsYXRpb24gKGZvciBleGFtcGxlLCA8c2FtcCBjbGFzcz0iY29kZXBoIj54Oi8mbHQ7aW5zdGFsbGRpciZndDsvcndkL2VjbGlwc2UvcGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlLmFudF8qPC9zYW1wPikuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVkaXQgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnJ1bkFudC5iYXQ8L3NhbXA+IChvciA8c2FtcCBjbGFzcz0iY29kZXBoIj5ydW5BbnQuc2g8L3NhbXA+KQotcHJvZ3JhbSB0byBzZXQgeW91ciBXT1JLU1BBQ0UgdmFyaWFibGUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuemlwIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5FeGFtcGxlLnppcDwvc2FtcD4gZmlsZS4gVGhpcyBjcmVhdGVzIGFuIEV4YW1wbGUKLWRpcmVjdG9yeSB3aXRoIHN1YmRpcmVjdG9yaWVzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FZGl0IHRoZSBmaWxlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmJ1aWxkRXhhbXBsZS5wcmVmZXJlbmNlczwvc2FtcD4gdG8gc2V0Ci10aGUgdmFyaWFibGUgV0FTXzYwX0lOU1RBTExESVIuIDwvc3Bhbj4gPHVsPjxsaT5EbyBub3QgY2hhbmdlIHRoZSB2YXJpYWJsZSBuYW1lLjwvbGk+Ci08bGk+VGhlIHZhcmlhYmxlIG11c3QgcG9pbnQgdG8gYSBXZWJTcGhlcmU8c3VwPsKuPC9zdXA+IEFwcGxpY2F0aW9uIFNlcnZlciBpbnN0YWxsYXRpb24uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SdW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YnVpbGRFeGFtcGxlLmJhdDwvc2FtcD4gKG9yIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmJ1aWxkRXhhbXBsZS5zaDwvc2FtcD4pLiA8L3NwYW4+IDx1bD48bGk+U2FtcGxlIHByb2plY3RzIGFyZSBpbXBvcnRlZCBhbmQgYnVpbHQgKEFkZGVySmF2YSwgQWRkZXJXQVIsIEFkZGVyRUpCLAotQWRkZXJFQVIpPC9saT4KLTxsaT5BZGRlckVBUi5lYXIgaXMgY3JlYXRlZCBhcyB0aGUgb3V0cHV0IHJlc3VsdDwvbGk+Ci08L3VsPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJpbXBvcnRhbnQiPjxzcGFuIGNsYXNzPSJpbXBvcnRhbnR0aXRsZSI+SW1wb3J0YW50Ojwvc3Bhbj4gVGhpcyBpcyBhbiBFeGFtcGxlIHByb2dyYW0gb25seS4gRG8gbm90IHVzZQotaXQgdG8gYnVpbGQgcHJvZHVjdGlvbiBhcHBsaWNhdGlvbnMuPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGphbnQuaHRtbCI+V29ya2luZyB3aXRoIEFudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRleGFtcGxlYXV0b2RlcGxveS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGV4YW1wbGVhdXRvZGVwbG95Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMTVlMzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGV4YW1wbGVhdXRvZGVwbG95Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+RXhhbXBsZTogQXV0b21hdGVkIEFudCBkZXBsb3k8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnRleGFtcGxlYXV0b2RlcGxveSI+PGEgbmFtZT0idGFudGV4YW1wbGVhdXRvZGVwbG95Ij48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkV4YW1wbGU6IEF1dG9tYXRlZCBBbnQgZGVwbG95PC9oMT4KLTxkaXY+PHA+VGhpcyBleGFtcGxlIHByb2dyYW0gc2hvd3MgYSB0eXBpY2FsIGF1dG9tYXRlZCBkZXBsb3ltZW50IHVzaW5nCi10aGUgV2ViU3BoZXJlPHN1cD7Crjwvc3VwPiBBcHBsaWNhdGlvbgotU2VydmVyIEFudCB0YXNrcy48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGlzIGV4YW1wbGUgcmVxdWlyZXMgYSBXZWJTcGhlcmUgQXBwbGljYXRpb24gU2VydmVyICh2NTAKLW9yIHY1MSBvciB2NjApIHRvIGJlIGluc3RhbGxlZCBhbmQgb3BlcmF0aW5nIG9uIHRoZSBzYW1lIG1hY2hpbmUuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBydW4gdGhlIGF1dG9tYXRlZCBBbnQgZGVwbG95IGV4YW1wbGUgcHJvZ3JhbTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkdvIHRvIHRoZSBjb20uaWJtLmV0b29scy5qMmVlLmFudCBkaXJlY3RvcnkgdW5kZXIgeW91ciB3b3JrYmVuY2gKLWluc3RhbGxhdGlvbiAoZm9yIGV4YW1wbGUsIDxzYW1wIGNsYXNzPSJjb2RlcGgiPng6LyZsdDtpbnN0YWxsZGlyJmd0Oy9yd2QvZWNsaXBzZS9wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmoyZWUuYW50Xyo8L3NhbXA+KS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW56aXAgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkV4YW1wbGUuemlwPC9zYW1wPiBmaWxlLiBUaGlzIGNyZWF0ZXMgYW4gRXhhbXBsZQotZGlyZWN0b3J5IHdpdGggc3ViZGlyZWN0b3JpZXMsIGluY2x1ZGluZyBhbiBBZGRlckRlcGxveSBmb2xkZXIuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVkaXQgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRlc3REZXBsb3kuYmF0PC9zYW1wPiBmaWxlIGluIHRoZSBBZGRlckRlcGxveQotZm9sZGVyOjwvc3Bhbj48dWw+PGxpPlNldCB0aGUgdmFyaWFibGVzIFdBU1JPT1QgYW5kIEpBQ0xXQVNST09UIHRvIHBvaW50IHRvIGEgV2ViU3BoZXJlIEFwcGxpY2F0aW9uCi1TZXJ2ZXIgb24gdGhlIHNhbWUgbWFjaGluZS4gQmUgY2FyZWZ1bCB3aGVuIGRlZmluaW5nIHRoZXNlIHZhcmlhYmxlcywgbWFraW5nCi1zdXJlIHRoYXQgeW91IHVzZSB0aGUgY29ycmVjdCBzeW50YXguIE9uZSB2YWx1ZSByZXF1aXJlcyBiYWNrLXNsYXNoZXMsIHdoaWxlCi10aGUgb3RoZXIgcmVxdWlyZXMgZm9yd2FyZC1zbGFzaGVzLjwvbGk+Ci08bGk+U2V0IHRoZSB2YXJpYWJsZXMgSkFDTGJhc2VEaXIgdG8gYmUgdGhlIGN1cnJlbnQgQWRkZXJEZXBsb3kgZGlyZWN0b3J5LjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RWRpdCB0aGUgZmlsZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5kaXN0XEFkZGVyRUFSLXBpb3QudGFyZ2V0czwvc2FtcD4gdG8gc3BlY2lmeQotd2hhdCBzZXJ2ZXJzIGFuZC9vciBjbHVzdGVycyBhcmUgdG8gcmVjZWl2ZSB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb246PC9zcGFuPiA8dWw+PGxpPkN1cnJlbnRseSB0aGUgdGVzdFVSTCBhbmQgVGVzdFJlc3BvbnNlIGVudHJpZXMgYXJlIHByb2Nlc3NlZCBidXQgbm90IGFjdHVhbGx5Ci11c2VkPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SdW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+VGVzdERlcGxveS5iYXQ8L3NhbXA+Ljwvc3Bhbj4gVGhlIGZvbGxvd2luZyBtdXN0Ci1iZSBydW5uaW5nOjx1bD48bGk+VGhlIFdlYlNwaGVyZSBjZWxsCi1EaXN0cmlidXRpb24gTWFuYWdlcjwvbGk+Ci08bGk+VGhlIHRhcmdldCBzZXJ2ZXIvY2x1c3RlciBOb2RlQWdlbnRzPC9saT4KLTwvdWw+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxkaXYgY2xhc3M9ImltcG9ydGFudCI+PHNwYW4gY2xhc3M9ImltcG9ydGFudHRpdGxlIj5JbXBvcnRhbnQ6PC9zcGFuPiBUaGlzIGlzIGFuIEV4YW1wbGUgcHJvZ3JhbSBvbmx5LiBEbyBub3QgdXNlCi1pdCB0byBkZXBsb3kgdG8gcHJvZHVjdGlvbiBzZXJ2ZXJzLjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RqYW50Lmh0bWwiPldvcmtpbmcgd2l0aCBBbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50Z2V0ai5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGdldGouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlMTkwMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50Z2V0ai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi0KLQotCi0KLQotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+Z2V0SmF2YWNFcnJvckNvdW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YW50Z2V0aiI+PGEgbmFtZT0idGFudGdldGoiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Z2V0SmF2YWNFcnJvckNvdW50PC9oMT4KLTxkaXY+PHA+VGhpcyB0YXNrIGdldHMgdGhlIGVycm9yIGNvdW50IGZvciB0aGUgbGFzdCBpbnRlcm5hbCBqYXZhYyBjb21waWxhdGlvbgotb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhcmFtZXRlcnM8L3NwYW4+PC9wPgotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHI+PHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjYzNDE0NjM0MTQ2MzQxMyUiIGlkPSJkMGUyMCI+QXR0cmlidXRlPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI0OC43ODA0ODc4MDQ4NzgwNSUiIGlkPSJkMGUyMiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjM2LjU4NTM2NTg1MzY1ODU0JSIgaWQ9ImQwZTI0Ij5SZXF1aXJlZDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT48dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjYzNDE0NjM0MTQ2MzQxMyUiIGhlYWRlcnM9ImQwZTIwICI+UHJvamVjdE5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjQ4Ljc4MDQ4NzgwNDg3ODA1JSIgaGVhZGVycz0iZDBlMjIgIj5OYW1lIG9mIHByb2plY3QgdG8gYmUgY291bnRlZDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMzYuNTg1MzY1ODUzNjU4NTQlIiBoZWFkZXJzPSJkMGUyNCAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC42MzQxNDYzNDE0NjM0MTMlIiBoZWFkZXJzPSJkMGUyMCAiPlByb3BlcnR5TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNDguNzgwNDg3ODA0ODc4MDUlIiBoZWFkZXJzPSJkMGUyMiAiPlByb3BlcnR5IE5hbWUgdG8gcmVjZWl2ZSBjdXJyZW50IHNldHRpbmdzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIzNi41ODUzNjU4NTM2NTg1NCUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIERlZmF1bHQgaXMgPGVtPkphdmFjRXJyb3JDb3VudCA8L2VtPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4YW1wbGVzPC9zcGFuPjwvcD4KLTx1bD48bGk+RGlzcGxheSB0aGUgZXJyb3IgY291bnQgZm9yICJteVByb2plY3QiOiA8cHJlPiZsdDtnZXRKYXZhY0Vycm9yQ291bnQKLSAgIFByb2plY3ROYW1lPSJNeVByb2plY3QiCi0gICBQcm9wZXJ0eU5hbWU9Ik15SmF2YWNFcnJvckNvdW50IiAvJmd0OwotJmx0O2VjaG8gbWVzc2FnZT0iTXlKYXZhY0Vycm9yQ291bnQ9JHtNeUphdmFjRXJyb3JDb3VudH0iIC8mZ3Q7PC9wcmU+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwiIHRpdGxlPSIiPkdlbmVyYWwgQW50IHRhc2tzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjYXB0dXJlcyBBbnQgYnVpbGQgbWVzc2FnZXMgYW5kIGFsbG93cyB0aGVtIHRvIGJlIHNlYXJjaGVkIG9yIGRpc3BsYXllZCwgYW5kIGFsbG93cyBjb25kaXRpb25hbCBBbnQgYnVpbGQgZmFpbHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuIj5jYXB0dXJlQnVpbGRNZXNzYWdlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjb21waWxldy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgamF2YWMuIFdoaWxlIHRoaXMgdGFzayBpcyBydW5uaW5nLCBhbGwgdGhlIHZhbGlkYXRpb24gYW5kIG90aGVyIGJ1aWxkZXJzIGFyZSB0dXJuZWQgb2YiPmNvbXBpbGVXb3Jrc3BhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0cC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGluZm9ybWF0aW9uLiI+Z2V0UHJvamVjdERhdGE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5wcm9qZWN0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgcHJvamVjdEJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyBwcm9qZWN0IGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkiPnByb2plY3RHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gcHJvamVjdCBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0YnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgYSBzZXQgb2YgRWNsaXBzZSBwcm9qZWN0cyB1c2luZyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoJiMzNDtQU0YmIzM0OykuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLCBhbmQgdGhlbiB0aGUgdGFzayBwcm9qZWN0U2V0SW1wb3J0IG11c3QgaGF2ZSBiZWVuIHVzZWQgdG8gaW1wb3J0IHRob3NlIHByb2plY3RzIGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0U2V0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdHNldGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgRWNsaXBzZSB0ZWFtIFByb2plY3QgU2V0IEZpbGUgKFBTRikgaW50byBhIHdvcmtzcGFjZS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbSAmIzM0O1Byb2plY3QgU2V0IEV4cG9ydCYjMzQ7IGNvbW1hbmQuIj5wcm9qZWN0U2V0SW1wb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHNldGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIHRoZSBpbnRlcm5hbCBKYXZhIGNvbXBpbGF0aW9uIGRlYnVnIGxldmVsLCBhbmQgcmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5ncy4iPnNldERlYnVnSW5mbzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VidWlsZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4iPndvcmtzcGFjZUJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIEl0IGlzIGEgc3Vic2V0IG9mIHRoZSB3b3Jrc3BhY2VCdWlsZCB0YXNrIChpdCBkb2VzIG5vdCBkbyBhIGJ1aWxkLCBpdCBqdXN0IGdldHMgd29ya3NwYWNlIGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkuIj53b3Jrc3BhY2VHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWZpbGUuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayByZWFkcyBhIHByb3BlcnR5IGZpbGUgY29udGFpbmluZyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcyBhbmQgc2V0cyB0aG9zZSBwcmVmZXJlbmNlcy4iPndvcmtzcGFjZVByZWZlcmVuY2VGaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VnZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZUdldDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlc2V0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgc2V0cyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcy4iPndvcmtzcGFjZVByZWZlcmVuY2VTZXQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50Z2V0cC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGdldHAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhNDM1Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50Z2V0cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotCi0KLQotCi0KLQotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPmdldFByb2plY3REYXRhPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YW50Z2V0cCI+PGEgbmFtZT0idGFudGdldHAiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Z2V0UHJvamVjdERhdGE8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgZ2V0cyB0aGUgc3BlY2lmaWVkIHByb2plY3QgaW5mb3JtYXRpb24uPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGFyYW1ldGVyczwvc3Bhbj48L3A+Ci0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBpZD0iZDBlMjAiPkF0dHJpYnV0ZTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBpZD0iZDBlMjIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBpZD0iZDBlMjQiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUyMCAiPlByb2plY3ROYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIyICI+VGhlIG5hbWUgb2YgdGhlIHByb2plY3Q8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI0ICI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjY0ODA4MzYyMzY5MzM4JSIgaGVhZGVycz0iZDBlMjAgIj5CYXNlZGlyIChkZXByZWNhdGVkKTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBoZWFkZXJzPSJkMGUyMiAiPlRoZSBmdWxseSBxdWFsaWZpZWQgcHJvamVjdCBiYXNlZGlyICh0eXBpY2FsbHkgWDpcTVlJTlNUQUxMRElSXE1ZV09SS1NQQUNFXE1ZUFJPSkVDVCk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8gKGRlcHJlY2F0ZWQpLjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIwICI+UHJvamVjdFByb3BlcnR5IChkZXByZWNhdGVkKTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBoZWFkZXJzPSJkMGUyMiAiPlByb3BlcnR5IG5hbWUgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCBuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vIChkZXByZWNhdGVkKSwgZGVmYXVsdCBpcyA8ZW0+cHJvamVjdE5hbWU8L2VtPiA8L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUyMCAiPldvcmtzcGFjZVByb3BlcnR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIyICI+UHJvcGVydHkgbmFtZSB0byByZWNlaXZlIHRoZSB3b3Jrc3BhY2UgcGF0aDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuNTU3NDkxMjg5MTk4NjA1JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgZGVmYXVsdCBpcyA8ZW0+d29ya3NwYWNlTmFtZTwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjY0ODA4MzYyMzY5MzM4JSIgaGVhZGVycz0iZDBlMjAgIj5Mb2NhdGlvblByb3BlcnR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIyICI+UHJvcGVydHkgbmFtZSB0byByZWNlaXZlIHRoZSBwcm9qZWN0IGxvY2F0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT5sb2NhdGlvbk5hbWU8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIwICI+TmF0dXJlUHJvcGVydHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljc5NDQyNTA4NzEwODAxJSIgaGVhZGVycz0iZDBlMjIgIj5Qcm9wZXJ0eSBuYW1lIHRvIHJlY2VpdmUgdGhlIHByb2plY3QgbmF0dXJlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT5uYXR1cmVOYW1lPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUyMCAiPmhhc1NwZWNpZmllZE5hdHVyZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBoZWFkZXJzPSJkMGUyMiAiPlRoZSBuYW1lIG9mIGEgcHJvamVjdCBuYXR1cmUgdG8gYmUgdGVzdGVkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBubyBkZWZhdWx0IChvbmx5IGVudGVyIGEgdmFsdWUgaWYgeW91IHdhbnQgdG8gdGVzdAotaWYgdGhlIHByb2plY3QgYWxzbyBoYXMgdGhhdCBzcGVjaWZpYyBuYXR1cmUpPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjY0ODA4MzYyMzY5MzM4JSIgaGVhZGVycz0iZDBlMjAgIj5oYXNTcGVjaWZpZWROYXR1cmVQcm9wZXJ0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBoZWFkZXJzPSJkMGUyMiAiPlByb3BlcnR5IG5hbWUgdG8gcmVjZWl2ZSB0cnVlIChvciBmYWxzZSkgaWYgdGhlIHByb2plY3QKLWhhcyAob3IgZG9lcyBub3QgaGF2ZSkgdGhlIHNwZWNpZmllZCBuYXR1cmU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI0ICI+WWVzLCBpZiA8ZW0+aGFzU3BlY2lmaWVkTmF0dXJlPC9lbT4gaXMgcHJlc2VudDwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIwICI+RmFpbE9uRXJyb3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljc5NDQyNTA4NzEwODAxJSIgaGVhZGVycz0iZDBlMjIgIj5XaWxsIGNhdXNlIHRoZSBidWlsZCB0byBmYWlsIGlmIHRoZSBvcGVyYXRpb24gY2Fubm90IGNvbXBsZXRlCi1zdWNjZXNzZnVsbHkgKHN1Y2ggYXMgc3BlY2lmeWluZyBhbiBpbnZhbGlkIHByb2plY3QpPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT50cnVlPC9lbT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeGFtcGxlczwvc3Bhbj48L3A+Ci08dWw+PGxpPlJldHJpZXZlIGFuZCBkaXNwbGF5IGN1cnJlbnQgcHJvamVjdCBpbmZvcm1hdGlvbjogPHByZT4mbHQ7Z2V0UHJvamVjdERhdGEgcHJvamVjdE5hbWU9JHtteVByb2plY3R9Ci0JaGFzU3BlY2lmaWVkTmF0dXJlPSJKYXZhIgotCWhhc1NwZWNpZmllZE5hdHVyZVByb3BlcnR5PSJpc1NwZWNpZmllZFByb3BlcnR5UHJlc2VudCIKLQlmYWlsT25FcnJvcj0iZmFsc2UiIC8mZ3Q7Ci0mbHQ7ZWNobyBtZXNzYWdlPSJnZXRQcm9qZWN0RGF0YTogcHJvamVjdE5hbWU9JHtwcm9qZWN0TmFtZX0KLQluYXR1cmU9JHtuYXR1cmVOYW1lfQotCXdvcmtzcGFjZT0ke3dvcmtzcGFjZU5hbWV9Ci0JbG9jYXRpb249JHtsb2NhdGlvbk5hbWV9Ci0JSmF2YU5hdHVyZT0iJHtpc1NwZWNpZmllZE5hdHVyZVByZXNlbnR9IiAvJmd0OwkgICAgPC9wcmU+Ci08L2xpPgotPC91bD4KLSA8L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtYW50Z2VuZXJhbC5odG1sIiB0aXRsZT0iIj5HZW5lcmFsIEFudCB0YXNrczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGNhcHR1cmVidWlsZG1lc3NhZ2VzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgY2FwdHVyZXMgQW50IGJ1aWxkIG1lc3NhZ2VzIGFuZCBhbGxvd3MgdGhlbSB0byBiZSBzZWFyY2hlZCBvciBkaXNwbGF5ZWQsIGFuZCBhbGxvd3MgY29uZGl0aW9uYWwgQW50IGJ1aWxkIGZhaWx1cmVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCBhIHNwZWNpZmllZCBzdHJpbmcgaXMgaW4gdGhlIGNhcHR1cmVkIGJ1aWxkIG1lc3NhZ2VzLiI+Y2FwdHVyZUJ1aWxkTWVzc2FnZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y29tcGlsZXcuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjb21waWxlcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4gSXQgcGVyZm9ybXMgdGhlIHNhbWUgYWN0aW9uIGFzIGphdmFjLiBXaGlsZSB0aGlzIHRhc2sgaXMgcnVubmluZywgYWxsIHRoZSB2YWxpZGF0aW9uIGFuZCBvdGhlciBidWlsZGVycyBhcmUgdHVybmVkIG9mIj5jb21waWxlV29ya3NwYWNlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGdldGouaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvciBjb3VudCBmb3IgdGhlIGxhc3QgaW50ZXJuYWwgamF2YWMgY29tcGlsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiI+Z2V0SmF2YWNFcnJvckNvdW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2ouaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiI+cHJvamVjdEJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RnZXRlcnJvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvcnMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4gSXQgaXMgYSBzdWJzZXQgb2YgdGhlIHByb2plY3RCdWlsZCB0YXNrIChpdCBkb2VzIG5vdCBkbyBhIGJ1aWxkLCBpdCBqdXN0IGdldHMgcHJvamVjdCBlcnJvcnMgcmVnYXJkbGVzcyBvZiBob3cgdGhleSB3ZXJlIGNyZWF0ZWQpIj5wcm9qZWN0R2V0RXJyb3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RpbXBvcnQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBpbXBvcnRzIGFuIGV4aXN0aW5nIGZpbGUgc3lzdGVtIHByb2plY3QgaW50byBhIHdvcmtzcGFjZS4iPnByb2plY3RJbXBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdHNldGJ1aWxkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIGEgc2V0IG9mIEVjbGlwc2UgcHJvamVjdHMgdXNpbmcgYW4gZXhpc3RpbmcgRWNsaXBzZSB0ZWFtIFByb2plY3QgU2V0IEZpbGUgKCYjMzQ7UFNGJiMzNDspLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgYW4gRWNsaXBzZSB0ZWFtICYjMzQ7UHJvamVjdCBTZXQgRXhwb3J0JiMzNDsgY29tbWFuZCwgYW5kIHRoZW4gdGhlIHRhc2sgcHJvamVjdFNldEltcG9ydCBtdXN0IGhhdmUgYmVlbiB1c2VkIHRvIGltcG9ydCB0aG9zZSBwcm9qZWN0cyBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdFNldEJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RzZXRpbXBvcnQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBpbXBvcnRzIGFuIGV4aXN0aW5nIEVjbGlwc2UgdGVhbSBQcm9qZWN0IFNldCBGaWxlIChQU0YpIGludG8gYSB3b3Jrc3BhY2UuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLiI+cHJvamVjdFNldEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRzZXRkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgc2V0cyB0aGUgaW50ZXJuYWwgSmF2YSBjb21waWxhdGlvbiBkZWJ1ZyBsZXZlbCwgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZ3MuIj5zZXREZWJ1Z0luZm88L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlYnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIj53b3Jrc3BhY2VCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VnZXRlcnJvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvcnMgZm9yIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgd29ya3NwYWNlQnVpbGQgdGFzayAoaXQgZG9lcyBub3QgZG8gYSBidWlsZCwgaXQganVzdCBnZXRzIHdvcmtzcGFjZSBlcnJvcnMgcmVnYXJkbGVzcyBvZiBob3cgdGhleSB3ZXJlIGNyZWF0ZWQpLiI+d29ya3NwYWNlR2V0RXJyb3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VmaWxlLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgcmVhZHMgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMgYW5kIHNldHMgdGhvc2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlRmlsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZ2V0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcy4iPndvcmtzcGFjZVByZWZlcmVuY2VHZXQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZXNldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlU2V0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGhvbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRob21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxY2VjZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudGhvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5FeHRlbmRlZCBBbnQgU3VwcG9ydCAtIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YW50aG9tZSI+PGEgbmFtZT0idGFudGhvbWUiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RXh0ZW5kZWQgQW50IFN1cHBvcnQgLSBvdmVydmlldzwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSBSdW4gQU5UIG9wdGlvbiB0byBjaGVjayB5b3VyIGJ1aWxkIGVudmlyb25tZW50Ci1vciB1c2UgdGhlIGNvbW1hbmQgbGluZSBiYXRjaCBmaWxlIHByb3ZpZGVkIGZvciByZXBldGl0aXZlIGJ1aWxkcy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5JbiB0aGUgcm9vdCBvZiB0aGUgY29tLmlibS5ldG9vbHMuajJlZS5hbnQgcGx1Z2luIGlzIGEgc2FtcGxlCi1iYXRjaCBmaWxlIGNhbGxlZCBydW5BTlQuYmF0LiBUaGlzIGJhdGNoIGZpbGUgcnVucyBhICJoZWFkbGVzcyIgd29ya3NwYWNlLAotYW5kIGl0IHJ1bnMgYSBzcGVjaWZpZWQgQU5UIHNjcmlwdCBmaWxlIChleGFtcGxlLnhtbCkuIFRoZSBBTlQgc2NyaXB0IGZpbGUKLW11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS48L3A+Ci08cD5FZGl0IHRoZSBydW5BTlQuYmF0IGZpbGUgYW5kIGNoYW5nZQotdGhlIHZhcmlhYmxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiBmb3IgeW91ciBXZWJTcGhlcmU8c3VwPsKuPC9zdXA+IFN0dWRpbyBpbnN0YWxsYXRpb24uIFRoaXMKLWZpbGUgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byBydW4gdGhpcyBwbHVnaW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLjwvcD4KLTxwPklmCi15b3UgZG8gbm90IHNwZWNpZnkgYSBidWlsZCBmaWxlLCBydW5BTlQgd2lsbCBwcm9tcHQgeW91IHdoZW4geW91IGV4ZWN1dGUgdGhlCi1maWxlLiBZb3UgY2FuIHRoZW4gc2VsZWN0IEFOVCwgbGlzdCBhbGwgcHJvamVjdHMsIGFuZCBxdWl0LiBXaGVuIHlvdSBzcGVjaWZ5Ci10aGUgYnVpbGQgZmlsZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgc28geW91IG11c3QgZW50ZXIgcHJvamVjdCBuYW1lXGJ1aWxkZmlsZQotbmFtZS4gTm90ZSB0aGF0IHRoaXMgaXMgY2FzZSBzZW5zaXRpdmUuPC9wPgotPHA+QWZ0ZXIgeW91IGxpc3QgdGhlIHByb2plY3RzCi1hdmFpbGFibGUsIHNlbGVjdCB0aGUgQU5UIG9wdGlvbiBhbmQgdHlwZSBpbiB5b3VyIGJ1aWxkIGZpbGVuYW1lLiBZb3UgdGhlbgotbmVlZCB0byBxdWl0IG1hbnVhbGx5IHdoZW4gdGhlIHNjcmlwdCBpcyBmaW5pc2hlZCBvciBzcGVjaWZ5IGFub3RoZXIgcHJvamVjdC4KLVRoZSBwcm9qZWN0cyBtdXN0IGFsbCBiZSByZWxhdGl2ZSB0byB0aGUgc2FtZSB3b3Jrc3BhY2UuPC9wPgotPHA+QWxzbyBpbmNsdWRlZAotaXMgYW4gZXhhbXBsZS54bWwgZmlsZSB3aGljaCBzaG93cyBob3cgdG8gdXNlIHNvbWUgb2YgdGhlIHRhc2tzIHByb3ZpZGVkIHRocm91Z2gKLUFOVC4gUGxlYXNlIHJlZmVyIHRvIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmV4YW1wbGUueG1sPC9zYW1wPiBhbmQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+cnVuQU5ULmJhdDwvc2FtcD4gZm9yCi1tb3JlIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgdGhlIHRhc2tzIHRoZW1zZWx2ZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlIGJ1dCB0aGUKLXBhcmFtZXRlcnMgYXZhaWxhYmxlIG9uIGVhY2ggdGFzayBhcmUgbm90LjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhpbnRzIGFuZCBUaXBzPC9zcGFuPjwvcD4KLTx1bD48bGk+V2hlbiBjcmVhdGluZyBhbiBBTlQgU2NyaXB0LCBsb2dpY2FsIG9yZGVyIGlzIGltcG9ydGFudC4gRm9yIGV4YW1wbGUsCi1pZiB5b3UgYXJlIGV4cG9ydGluZyBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHRoYXQgY29udGFpbnMgZW50ZXJwcmlzZSBiZWFucywKLXlvdSBzaG91bGQgZ2VuZXJhdGUgZGVwbG95bWVudCBjb2RlIGZvciB5b3VyIEVKQiBiZWZvcmUgZXhwb3J0aW5nLiBZb3VyIFhNTAotc2hvdWxkIGxvb2sgbGlrZSB0aGlzOiA8cHJlPiZsdDshLS0gUnVuIGVqYkRlcGxveSBvbiB0aGUgRUpCIHByb2plY3QgaW4gYW4gRUFSIGZpbGUgLS0mZ3Q7Ci0mbHQ7ZWpiRGVwbG95IEVKQlByb2plY3Q9Ik1pbmliYW5rRUpCIiBJZ25vcmVFcnJvcnM9InRydWUiLyZndDsKLQotJmx0OyEtLSBFeHBvcnQgdGhlIEFwcGxpY2F0aW9uIHByb2plY3QgYXMgYW4gRUFSIGZpbGUgLS0mZ3Q7Ci0mbHQ7ZWFyRXhwb3J0IEVBUlByb2plY3ROYW1lPSJNaW5pYmFua0V4YW1wbGUiIEVBUkV4cG9ydEZpbGU9ImY6XHRlbXBcc2FtcGxlLmVhciIKLUV4cG9ydFNvdXJjZT0idHJ1ZSIvJmd0OzwvcHJlPgotPC9saT4KLTxsaT5JZiB5b3UgYXJlIHVzaW5nIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5ydW5BbnQuYmF0PC9zYW1wPiBmaWxlIHRvIGRvIG11bHRpcGxlIGJ1aWxkcywKLW1ha2Ugc3VyZSB0aGF0IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGluIHlvdXIgWE1MIGZpbGUuIElmIHlvdXIgY3VycmVudAotYnVpbGQgaXMgaW5jb21wbGV0ZSBvciBmYWlscyBpbiBhbnkgd2F5LCB5b3Ugc3RpbGwgaGF2ZSB0aGUgcHJldmlvdXMgYnVpbGQKLXRvIHdvcmsgZnJvbS48L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy90amFudC5odG1sIj5Xb3JraW5nIHdpdGggQW50PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudHByb2ouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRwcm9qLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYTQxZGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudHByb2ouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLQotCi0KLQotCi0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5wcm9qZWN0QnVpbGQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnRwcm9qIj48YSBuYW1lPSJ0YW50cHJvaiI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5wcm9qZWN0QnVpbGQ8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgYnVpbGRzIHRoZSBzcGVjaWZpZWQgcHJvamVjdC48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXJhbWV0ZXJzPC9zcGFuPjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGlkPSJkMGUyMCI+QXR0cmlidXRlPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGlkPSJkMGUyMiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGlkPSJkMGUyNCI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIwICI+UHJvamVjdE5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljc5NDQyNTA4NzEwODAxJSIgaGVhZGVycz0iZDBlMjIgIj5OYW1lIG9mIHByb2plY3QgdG8gYmUgYnVpbHQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI0ICI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjY0ODA4MzYyMzY5MzM4JSIgaGVhZGVycz0iZDBlMjAgIj5CdWlsZFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljc5NDQyNTA4NzEwODAxJSIgaGVhZGVycz0iZDBlMjIgIj5UeXBlIG9mIGJ1aWxkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT5JbmNyZW1lbnRhbDwvZW0+LiBDYW4gYmUgPGVtPkluY3JlbWVudGFsPC9lbT4gb3IgPGVtPkZ1bGw8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIwICI+RmFpbE9uRXJyb3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljc5NDQyNTA4NzEwODAxJSIgaGVhZGVycz0iZDBlMjIgIj5XaGV0aGVyIG9yIG5vdCBidWlsZHMgc2hvdWxkIGZhaWwgb24gZXJyb3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPnRydWU8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIwICI+RGVidWdDb21waWxhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBoZWFkZXJzPSJkMGUyMiAiPldoZXRoZXIgb24gbm90IGNvbXBpbGF0aW9ucyBzaG91bGQgYmUgZGVidWc8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPnRydWU8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi42NDgwODM2MjM2OTMzOCUiIGhlYWRlcnM9ImQwZTIwICI+UXVpZXQgKGRlcHJlY2F0ZWQpPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIyICI+V2hldGhlciBvciBub3QgdG8gcHJpbnQgb3V0IG1lc3NhZ2VzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT5mYWxzZTwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjY0ODA4MzYyMzY5MzM4JSIgaGVhZGVycz0iZDBlMjAgIj5TaG93RXJyb3JzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIyICI+V2hldGhlciBvciBub3QgdG8gc2hvdyB0aGUgcHJvamVjdCBlcnJvcnMgaW4gdGhlIGFudAotYnVpbGQgbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBEZWZhdWx0IGlzIDxlbT50cnVlPC9lbT4gPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjY0ODA4MzYyMzY5MzM4JSIgaGVhZGVycz0iZDBlMjAgIj5TZXZlcml0eUxldmVsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIyICI+VGhlIHByb2JsZW0gbGV2ZWwgdG8gY291bnQgYW5kIHRyZWF0IGFzIGEgYnVpbGQgZXJyb3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjU1NzQ5MTI4OTE5ODYwNSUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIERlZmF1bHQgaXMgPGVtPkVSUk9SPC9lbT4uICBNYXkgYmUgIDxlbT5FUlJPUjwvZW0+IG9yCi0gPGVtPldBUk5JTkc8L2VtPiBvciAgPGVtPklORk9STUFUSU9OPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUyMCAiPkNvdW50VmFsaWRhdGlvbkVycm9yczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuNzk0NDI1MDg3MTA4MDElIiBoZWFkZXJzPSJkMGUyMiAiPldoZXRoZXIgb3Igbm90IHRvIGNvdW50IFZhbGlkYXRpb24gcHJvYmxlbXMgYXMgcHJvamVjdAotRXJyb3JzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC41NTc0OTEyODkxOTg2MDUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBEZWZhdWx0IGlzIDxlbT50cnVlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUyMCAiPlByb3BlcnR5Q291bnROYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIyICI+UHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCBlcnJvciBjb3VudDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuNTU3NDkxMjg5MTk4NjA1JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgRGVmYXVsdCBpcyA8ZW0+UHJvamVjdEVycm9yQ291bnQ8L2VtPiA8L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuNjQ4MDgzNjIzNjkzMzglIiBoZWFkZXJzPSJkMGUyMCAiPlByb3BlcnR5TWVzc2FnZXNOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni43OTQ0MjUwODcxMDgwMSUiIGhlYWRlcnM9ImQwZTIyICI+UHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCBlcnJvciBtZXNzYWdlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuNTU3NDkxMjg5MTk4NjA1JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgRGVmYXVsdCBpcyA8ZW0+UHJvamVjdEVycm9yTWVzc2FnZXM8L2VtPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4YW1wbGVzPC9zcGFuPjwvcD4KLTx1bD48bGk+QnVpbGQgIm15UHJvamVjdCIuIERlZmF1bHQgaXMgaW5jcmVtZW50YWwgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbjogPHByZT4mbHQ7cHJvamVjdEJ1aWxkIFByb2plY3ROYW1lPSJteVByb2plY3QiIC8mZ3Q7PC9wcmU+Ci08L2xpPgotPGxpPkRvIGEgcHJvZHVjdGlvbiBidWlsZCBvZiAibXlQcm9qZWN0IiwgYSBmdWxsIGJ1aWxkIHdpdGhvdXQgZGVidWcgaW5mb3JtYXRpb246IDxwcmU+Jmx0O3Byb2plY3RCdWlsZCAKLVByb2plY3ROYW1lPSJteVByb2plY3QiCi1mYWlsb25lcnJvcj0idHJ1ZSIKLURlYnVnQ29tcGlsYXRpb249ImZhbHNlIgotQnVpbGRUeXBlPSJmdWxsIiAvJmd0OwotJmx0O2VjaG8gbWVzc2FnZT0icHJvamVjdEJ1aWxkOiBwcm9qZWN0TmFtZT0ke3Byb2plY3ROYW1lfQotcHJvamVjdCBFcnJvciBDb3VudD0ke1Byb2plY3RFcnJvckNvdW50fQotcHJvamVjdCBFcnJvciBNZXNzYWdlcz0ke1Byb2plY3RFcnJvck1lc3NhZ2VzfSIgLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWFudGdlbmVyYWwuaHRtbCIgdGl0bGU9IiI+R2VuZXJhbCBBbnQgdGFza3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjYXB0dXJlYnVpbGRtZXNzYWdlcy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNhcHR1cmVzIEFudCBidWlsZCBtZXNzYWdlcyBhbmQgYWxsb3dzIHRoZW0gdG8gYmUgc2VhcmNoZWQgb3IgZGlzcGxheWVkLCBhbmQgYWxsb3dzIGNvbmRpdGlvbmFsIEFudCBidWlsZCBmYWlsdXJlcyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgYSBzcGVjaWZpZWQgc3RyaW5nIGlzIGluIHRoZSBjYXB0dXJlZCBidWlsZCBtZXNzYWdlcy4iPmNhcHR1cmVCdWlsZE1lc3NhZ2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGNvbXBpbGV3Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgY29tcGlsZXMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIEl0IHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBqYXZhYy4gV2hpbGUgdGhpcyB0YXNrIGlzIHJ1bm5pbmcsIGFsbCB0aGUgdmFsaWRhdGlvbiBhbmQgb3RoZXIgYnVpbGRlcnMgYXJlIHR1cm5lZCBvZiI+Y29tcGlsZVdvcmtzcGFjZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRnZXRqLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3IgY291bnQgZm9yIHRoZSBsYXN0IGludGVybmFsIGphdmFjIGNvbXBpbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4iPmdldEphdmFjRXJyb3JDb3VudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRnZXRwLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgc3BlY2lmaWVkIHByb2plY3QgaW5mb3JtYXRpb24uIj5nZXRQcm9qZWN0RGF0YTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0Z2V0ZXJyb3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuIEl0IGlzIGEgc3Vic2V0IG9mIHRoZSBwcm9qZWN0QnVpbGQgdGFzayAoaXQgZG9lcyBub3QgZG8gYSBidWlsZCwgaXQganVzdCBnZXRzIHByb2plY3QgZXJyb3JzIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgd2VyZSBjcmVhdGVkKSI+cHJvamVjdEdldEVycm9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0aW1wb3J0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBmaWxlIHN5c3RlbSBwcm9qZWN0IGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0SW1wb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RzZXRidWlsZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyBhIHNldCBvZiBFY2xpcHNlIHByb2plY3RzIHVzaW5nIGFuIGV4aXN0aW5nIEVjbGlwc2UgdGVhbSBQcm9qZWN0IFNldCBGaWxlICgmIzM0O1BTRiYjMzQ7KS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbSAmIzM0O1Byb2plY3QgU2V0IEV4cG9ydCYjMzQ7IGNvbW1hbmQsIGFuZCB0aGVuIHRoZSB0YXNrIHByb2plY3RTZXRJbXBvcnQgbXVzdCBoYXZlIGJlZW4gdXNlZCB0byBpbXBvcnQgdGhvc2UgcHJvamVjdHMgaW50byBhIHdvcmtzcGFjZS4iPnByb2plY3RTZXRCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0aW1wb3J0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoUFNGKSBpbnRvIGEgd29ya3NwYWNlLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgYW4gRWNsaXBzZSB0ZWFtICYjMzQ7UHJvamVjdCBTZXQgRXhwb3J0JiMzNDsgY29tbWFuZC4iPnByb2plY3RTZXRJbXBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50c2V0ZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgdGhlIGludGVybmFsIEphdmEgY29tcGlsYXRpb24gZGVidWcgbGV2ZWwsIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmdzLiI+c2V0RGVidWdJbmZvPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWJ1aWxkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiI+d29ya3NwYWNlQnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlZ2V0ZXJyb3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgZW50aXJlIHdvcmtzcGFjZS4gSXQgaXMgYSBzdWJzZXQgb2YgdGhlIHdvcmtzcGFjZUJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyB3b3Jrc3BhY2UgZXJyb3JzIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgd2VyZSBjcmVhdGVkKS4iPndvcmtzcGFjZUdldEVycm9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZmlsZS5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHJlYWRzIGEgcHJvcGVydHkgZmlsZSBjb250YWluaW5nIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzIGFuZCBzZXRzIHRob3NlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZUZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlR2V0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VzZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZVNldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRwcm9qZWN0Z2V0ZXJyb3JzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50cHJvamVjdGdldGVycm9ycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmUyMzQyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRwcm9qZWN0Z2V0ZXJyb3JzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi0KLQotCi0KLQotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+cHJvamVjdEdldEVycm9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFudHByb2plY3RnZXRlcnJvcnMiPjxhIG5hbWU9InRhbnRwcm9qZWN0Z2V0ZXJyb3JzIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPnByb2plY3RHZXRFcnJvcnM8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuIEl0IGlzIGEgc3Vic2V0Ci1vZiB0aGUgcHJvamVjdEJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyBwcm9qZWN0IGVycm9ycwotcmVnYXJkbGVzcyBvZiBob3cgdGhleSB3ZXJlIGNyZWF0ZWQpPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhcmFtZXRlcnM8L3NwYW4+PC9wPgotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHI+PHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaWQ9ImQwZTIxIj5BdHRyaWJ1dGU8L3RoPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBpZD0iZDBlMjMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBpZD0iZDBlMjUiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPlByb2plY3ROYW1lPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjMgIj5OYW1lIG9mIHByb2plY3QgdG8gYmUgYnVpbHQgPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+RmFpbE9uRXJyb3I8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPldoZXRoZXIgb3Igbm90IGJ1aWxkcyBzaG91bGQgZmFpbCBpZiB0aGUgcHJvamVjdCBjb250YWlucwotYW55IGVycm9yczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ObywgZGVmYXVsdCBpczxlbT4gZmFsc2U8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+U2hvd0Vycm9yczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+VGhlIHByb2JsZW0gbGV2ZWwgdG8gY291bnQgYW5kIHRyZWF0IGFzIGEgYnVpbGQgZXJyb3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXM8ZW0+IHRydWU8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+U2V2ZXJpdHlMZXZlbDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+V2hldGhlciB0byBvdmVyd3JpdGUgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzPGVtPiBFUlJPUjwvZW0+LiBNYXkgYmUgPGVtPiBFUlJPUjwvZW0+LCA8ZW0+IFdBUk5JTkc8L2VtPiwKLW9yIDxlbT4gSU5GT1JNQVRJT048L2VtPi48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPkNvdW50VmFsaWRhdGlvbkVycm9yczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+V2hldGhlciBvciBub3QgdG8gY291bnQgVmFsaWRhdGlvbiBwcm9ibGVtcyBhcyBwcm9qZWN0Ci1FcnJvcnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXM8ZW0+IHRydWU8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+UHJvcGVydHlDb3VudE5hbWU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPlByb3BlcnR5IHRvIHJlY2VpdmUgdGhlIHByb2plY3QgZXJyb3IgY291bnQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXM8ZW0+IFByb2plY3RFcnJvckNvdW50PC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPlByb3BlcnR5TWVzc2FnZXNOYW1lPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjMgIj5Qcm9wZXJ0eSB0byByZWNlaXZlIHRoZSBwcm9qZWN0IGVycm9yIG1lc3NhZ2VzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzPGVtPiBQcm9qZWN0RXJyb3JNZXNzYWdlczwvZW0+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhhbXBsZXM8L3NwYW4+PC9wPgotPHVsPjxsaT5SZXRyaWV2ZSBhbmQgZGlzcGxheSB0aGUgZXJyb3Ird2FybmluZyBjb3VudCBhbmQgZXJyb3Ird2FybmluZyBtZXNzYWdlcwotZm9yICJteVByb2plY3QiOjxwcmU+Jmx0O3Byb2plY3RHZXRFcnJvcnPCoAotCVByb2plY3ROYW1lPSJteVByb2plY3QiCi0JU2V2ZXJpdHlMZXZlbD0iV0FSTklORyIKLQlQcm9wZXJ0eUNvdW50TmFtZT0ibXlQcm9qZWN0RXJyb3JDb3VudAotCVByb3BlcnR5TWVzc2FnZXNOYW1lPSJteVByb2plY3RFcnJvck1lc3NhZ2VzIiAvJmd0OwotJmx0O2VjaG8gbWVzc2FnZT0icHJvamVjdEdldEVycm9yczogcHJvamVjdE5hbWU9JHtwcm9qZWN0TmFtZX0KLQlwcm9qZWN0IEVycm9yK1dhcm5pbmcgQ291bnQ9JHtteVByb2plY3RFcnJvckNvdW50fQotCXByb2plY3QgRXJyb3IrV2FybmluZyBNZXNzYWdlcz0ke215UHJvamVjdEVycm9yTWVzc2FnZXN9IiAvJmd0OzwvcHJlPgotPC9saT4KLTwvdWw+Ci0gPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWFudGdlbmVyYWwuaHRtbCIgdGl0bGU9IiI+R2VuZXJhbCBBbnQgdGFza3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjYXB0dXJlYnVpbGRtZXNzYWdlcy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNhcHR1cmVzIEFudCBidWlsZCBtZXNzYWdlcyBhbmQgYWxsb3dzIHRoZW0gdG8gYmUgc2VhcmNoZWQgb3IgZGlzcGxheWVkLCBhbmQgYWxsb3dzIGNvbmRpdGlvbmFsIEFudCBidWlsZCBmYWlsdXJlcyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgYSBzcGVjaWZpZWQgc3RyaW5nIGlzIGluIHRoZSBjYXB0dXJlZCBidWlsZCBtZXNzYWdlcy4iPmNhcHR1cmVCdWlsZE1lc3NhZ2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGNvbXBpbGV3Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgY29tcGlsZXMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIEl0IHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBqYXZhYy4gV2hpbGUgdGhpcyB0YXNrIGlzIHJ1bm5pbmcsIGFsbCB0aGUgdmFsaWRhdGlvbiBhbmQgb3RoZXIgYnVpbGRlcnMgYXJlIHR1cm5lZCBvZiI+Y29tcGlsZVdvcmtzcGFjZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRnZXRqLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3IgY291bnQgZm9yIHRoZSBsYXN0IGludGVybmFsIGphdmFjIGNvbXBpbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4iPmdldEphdmFjRXJyb3JDb3VudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRnZXRwLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgc3BlY2lmaWVkIHByb2plY3QgaW5mb3JtYXRpb24uIj5nZXRQcm9qZWN0RGF0YTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4iPnByb2plY3RCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0aW1wb3J0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBmaWxlIHN5c3RlbSBwcm9qZWN0IGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0SW1wb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RzZXRidWlsZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyBhIHNldCBvZiBFY2xpcHNlIHByb2plY3RzIHVzaW5nIGFuIGV4aXN0aW5nIEVjbGlwc2UgdGVhbSBQcm9qZWN0IFNldCBGaWxlICgmIzM0O1BTRiYjMzQ7KS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbSAmIzM0O1Byb2plY3QgU2V0IEV4cG9ydCYjMzQ7IGNvbW1hbmQsIGFuZCB0aGVuIHRoZSB0YXNrIHByb2plY3RTZXRJbXBvcnQgbXVzdCBoYXZlIGJlZW4gdXNlZCB0byBpbXBvcnQgdGhvc2UgcHJvamVjdHMgaW50byBhIHdvcmtzcGFjZS4iPnByb2plY3RTZXRCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0aW1wb3J0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoUFNGKSBpbnRvIGEgd29ya3NwYWNlLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgYW4gRWNsaXBzZSB0ZWFtICYjMzQ7UHJvamVjdCBTZXQgRXhwb3J0JiMzNDsgY29tbWFuZC4iPnByb2plY3RTZXRJbXBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50c2V0ZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgdGhlIGludGVybmFsIEphdmEgY29tcGlsYXRpb24gZGVidWcgbGV2ZWwsIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmdzLiI+c2V0RGVidWdJbmZvPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWJ1aWxkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiI+d29ya3NwYWNlQnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlZ2V0ZXJyb3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgZW50aXJlIHdvcmtzcGFjZS4gSXQgaXMgYSBzdWJzZXQgb2YgdGhlIHdvcmtzcGFjZUJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyB3b3Jrc3BhY2UgZXJyb3JzIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgd2VyZSBjcmVhdGVkKS4iPndvcmtzcGFjZUdldEVycm9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZmlsZS5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHJlYWRzIGEgcHJvcGVydHkgZmlsZSBjb250YWluaW5nIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzIGFuZCBzZXRzIHRob3NlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZUZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlR2V0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VzZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZVNldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRwcm9qZWN0aW1wb3J0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50cHJvamVjdGltcG9ydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjE4N2VmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRwcm9qZWN0aW1wb3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLQotCi0KLQotCi0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5wcm9qZWN0SW1wb3J0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YW50cHJvamVjdGltcG9ydCI+PGEgbmFtZT0idGFudHByb2plY3RpbXBvcnQiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+cHJvamVjdEltcG9ydDwvaDE+Ci08ZGl2PjxwPlRoaXMgdGFzayBpbXBvcnRzIGFuIGV4aXN0aW5nIGZpbGUgc3lzdGVtIHByb2plY3QgaW50byBhIHdvcmtzcGFjZS48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGFyYW1ldGVyczwvc3Bhbj48L3A+Ci0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBpZD0iZDBlMjEiPkF0dHJpYnV0ZTwvdGg+Ci08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGlkPSJkMGUyMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGlkPSJkMGUyNSI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+UHJvamVjdE5hbWU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPk5hbWUgb2YgcHJvamVjdCB0byBiZSBpbXBvcnRlZDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPlByb2plY3RMb2NhdGlvbjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+VGhlIGZ1bGx5IHF1YWxpZmllZCBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdCAoZWl0aGVyIHVuZGVyIHRoZSB3b3Jrc3BhY2UsCi1vciBlbHNld2hlcmUgb24gdGhlIGZpbGUgc3lzdGVtKS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPiR7d29yc3BhY2VMb2NhdGlvbn0vJHtwcm9qZWN0TmFtZX08L2VtPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4YW1wbGVzPC9zcGFuPjwvcD4KLTx1bD48bGk+SW1wb3J0IGEgcHJvamVjdCB3aGljaCBpcyB1bmRlciB0aGUgd29ya3NwYWNlIGRpcmVjdG9yeSwgYnV0IG5vdCBwcmVzZW50bHkKLWluIHRoZSB3b3Jrc3BhY2U6PHByZT4mbHQ7cHJvamVjdEltcG9ydMKgCi0JUHJvamVjdE5hbWU9Im15UHJvamVjdCIvJmd0OzwvcHJlPgotPC9saT4KLTxsaT5JbXBvcnQgYSBwcm9qZWN0IHdoaWNoIGlzIGVsc2V3aGVyZSBvbiB0aGUgZmlsZSBzeXN0ZW0gaW50byB0aGUgY3VycmVudAotd29ya3NwYWNlOjxwcmU+Jmx0O3Byb2plY3RJbXBvcnTCoAotCVByb2plY3ROYW1lPSJteVByb2plY3QiIAotCVByb2plY3RMb2NhdGlvbj0iJHtNeVByb2plY3RMb2NhdGlvbn0gLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotIDwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwiIHRpdGxlPSIiPkdlbmVyYWwgQW50IHRhc2tzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjYXB0dXJlcyBBbnQgYnVpbGQgbWVzc2FnZXMgYW5kIGFsbG93cyB0aGVtIHRvIGJlIHNlYXJjaGVkIG9yIGRpc3BsYXllZCwgYW5kIGFsbG93cyBjb25kaXRpb25hbCBBbnQgYnVpbGQgZmFpbHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuIj5jYXB0dXJlQnVpbGRNZXNzYWdlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjb21waWxldy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgamF2YWMuIFdoaWxlIHRoaXMgdGFzayBpcyBydW5uaW5nLCBhbGwgdGhlIHZhbGlkYXRpb24gYW5kIG90aGVyIGJ1aWxkZXJzIGFyZSB0dXJuZWQgb2YiPmNvbXBpbGVXb3Jrc3BhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0ai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9yIGNvdW50IGZvciB0aGUgbGFzdCBpbnRlcm5hbCBqYXZhYyBjb21waWxhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5nZXRKYXZhY0Vycm9yQ291bnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0cC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGluZm9ybWF0aW9uLiI+Z2V0UHJvamVjdERhdGE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5wcm9qZWN0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgcHJvamVjdEJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyBwcm9qZWN0IGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkiPnByb2plY3RHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdHNldGJ1aWxkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIGEgc2V0IG9mIEVjbGlwc2UgcHJvamVjdHMgdXNpbmcgYW4gZXhpc3RpbmcgRWNsaXBzZSB0ZWFtIFByb2plY3QgU2V0IEZpbGUgKCYjMzQ7UFNGJiMzNDspLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgYW4gRWNsaXBzZSB0ZWFtICYjMzQ7UHJvamVjdCBTZXQgRXhwb3J0JiMzNDsgY29tbWFuZCwgYW5kIHRoZW4gdGhlIHRhc2sgcHJvamVjdFNldEltcG9ydCBtdXN0IGhhdmUgYmVlbiB1c2VkIHRvIGltcG9ydCB0aG9zZSBwcm9qZWN0cyBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdFNldEJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RzZXRpbXBvcnQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBpbXBvcnRzIGFuIGV4aXN0aW5nIEVjbGlwc2UgdGVhbSBQcm9qZWN0IFNldCBGaWxlIChQU0YpIGludG8gYSB3b3Jrc3BhY2UuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLiI+cHJvamVjdFNldEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRzZXRkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgc2V0cyB0aGUgaW50ZXJuYWwgSmF2YSBjb21waWxhdGlvbiBkZWJ1ZyBsZXZlbCwgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZ3MuIj5zZXREZWJ1Z0luZm88L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlYnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIj53b3Jrc3BhY2VCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VnZXRlcnJvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvcnMgZm9yIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgd29ya3NwYWNlQnVpbGQgdGFzayAoaXQgZG9lcyBub3QgZG8gYSBidWlsZCwgaXQganVzdCBnZXRzIHdvcmtzcGFjZSBlcnJvcnMgcmVnYXJkbGVzcyBvZiBob3cgdGhleSB3ZXJlIGNyZWF0ZWQpLiI+d29ya3NwYWNlR2V0RXJyb3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VmaWxlLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgcmVhZHMgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMgYW5kIHNldHMgdGhvc2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlRmlsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZ2V0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcy4iPndvcmtzcGFjZVByZWZlcmVuY2VHZXQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZXNldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlU2V0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudHByb2plY3RzZXRidWlsZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudHByb2plY3RzZXRidWlsZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmNhNDBmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRwcm9qZWN0c2V0YnVpbGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLQotCi0KLQotCi0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5wcm9qZWN0U2V0QnVpbGQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnRwcm9qZWN0c2V0YnVpbGQiPjxhIG5hbWU9InRhbnRwcm9qZWN0c2V0YnVpbGQiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+cHJvamVjdFNldEJ1aWxkPC9oMT4KLTxkaXY+PHA+VGhpcyB0YXNrIGJ1aWxkcyBhIHNldCBvZiBFY2xpcHNlIHByb2plY3RzIHVzaW5nIGFuIGV4aXN0aW5nIEVjbGlwc2UKLXRlYW0gUHJvamVjdCBTZXQgRmlsZSAoIlBTRiIpLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcKLWFuIEVjbGlwc2UgdGVhbSAiUHJvamVjdCBTZXQgRXhwb3J0IiBjb21tYW5kLCBhbmQgdGhlbiB0aGUgdGFzayBwcm9qZWN0U2V0SW1wb3J0Ci1tdXN0IGhhdmUgYmVlbiB1c2VkIHRvIGltcG9ydCB0aG9zZSBwcm9qZWN0cyBpbnRvIGEgd29ya3NwYWNlLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhcmFtZXRlcnM8L3NwYW4+PC9wPgotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHI+PHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaWQ9ImQwZTIwIj5BdHRyaWJ1dGU8L3RoPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBpZD0iZDBlMjIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBpZD0iZDBlMjQiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMCAiPlByb2plY3RTZXRGaWxlTmFtZSA8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMiAiPlRoZSBmdWxseSBxdWFsbGlmaWVkIHBhdGggdG8gdGhlIEVjbGlwc2UgUFNGIGZpbGUgdG8gYmUKLWltcG9ydGVkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNCAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+UHJvcGVydHlCdWlsZFByb2plY3ROYW1lczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+UHJvcGVydHkgdG8gcmVjZWl2ZSBhIFN0cmluZ1tdIG9mIHRoZSBuYW1lcyBvZiB0aGUgcHJvamVjdHMgd2hpY2ggd2VyZQotYnVpbHQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPkJ1aWx0UHJvamVjdE5hbWVzPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMCAiPkZhaWxPbkVycm9yPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjIgIj5XaGV0aGVyIG9uIG5vdCB0aGUgQW50IGJ1aWxkIHNob3VsZCBmYWlsIGlmIHRoZXJlIGlzCi1vbmUgb3IgbW9yZSBidWlsZCBlcnJvcnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPnRydWU8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+VXNlQnVpbGRYTUw8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMiAiPldoZXRoZXIgb3Igbm90IHRvIHVzZSBhIGJ1aWxkLnhtbCAoaW5zdGVhZCBvZiBqdXN0IGNhbGxpbmcKLWJ1aWxkUHJvamVjdCBmb3IgZWFjaCBwcm9qZWN0KTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgZGVmYXVsdCBpcyA8ZW0+ZmFsc2U8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+QnVpbGRGaWxlTmFtZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+TmFtZSBvZiBhbiBBbnQgYnVpbGQgZmlsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgZGVmYXVsdCBpcyA8ZW0+YnVpbGQueG1sPC9lbT4gKG9ubHkgdXNlZCBpZiA8ZW0+VXNlQnVpbGRYTUw9dHJ1ZTwvZW0+KTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+QnVpbGRUYXJnZXQJPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjIgIj5CdWlsZCB0YXJnZXQgd2l0aGluIGFuIEFudCBidWlsZCBmaWxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT5idWlsZDwvZW0+IChvbmx5IHVzZWQgaWYgPGVtPlVzZUJ1aWxkWE1MPXRydWU8L2VtPik8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeGFtcGxlczwvc3Bhbj48L3A+Ci08dWw+PGxpPkJ1aWxkIHVzaW5nIGFuIEVjbGlwc2UgUHJvamVjdCBTZXQsIGFuZCB1c2UgdGhlIEFudCB0YXNrIHByb2plY3RCdWlsZAotdG8gYnVpbGQgZWFjaCBwcm9qZWN0OjxwcmU+Jmx0O3Byb2plY3RTZXRCdWlsZCBQcm9qZWN0U2V0RmlsZU5hbWU9IiR7bXlQcm9qZWN0U2V0LnBzZn0iIC8mZ3Q7PC9wcmU+Ci08L2xpPgotPGxpPkJ1aWxkIHVzaW5nIGFuIEVjbGlwc2UgUHJvamVjdFNldCwgYnV0IHVzZSBhIGJ1aWxkLnhtbCBmaWxlIHdpdGhpbiBlYWNoCi1wcm9qZWN0IHRvIGRvIHRoZSBwcm9qZWN0IGJ1aWxkczo8cHJlPiZsdDtwcm9qZWN0U2V0QnVpbGTCoFByb2plY3RTZXRGaWxlTmFtZT0iJHtteVByb2plY3RTZXQucHNmfSIKLQl1c2VCdWlsZFhNTD0idHJ1ZSIgCi0JQnVpbGRGaWxlTmFtZT0iYnVpbGQueG1sIgotCUJ1aWxkVGFyZ2V0PSJidWlsZCIKLQlGYWlsT25FcnJvcj0idHJ1ZSIKLQlwcm9wZXJ0eUJ1aWx0UHJvamVjdE5hbWVzPSJCdWlsdFByb2plY3ROYW1lcyIgIC8mZ3Q7Ci0mbHQ7ZWNobyBtZXNzYWdlPSJzdWNjZXNzZnVsIGJ1aWxkIG9mIHByb2plY3RzPSIke0J1aWxkUHJvamVjdE5hbWVzfSIgLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotIDwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwiIHRpdGxlPSIiPkdlbmVyYWwgQW50IHRhc2tzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjYXB0dXJlcyBBbnQgYnVpbGQgbWVzc2FnZXMgYW5kIGFsbG93cyB0aGVtIHRvIGJlIHNlYXJjaGVkIG9yIGRpc3BsYXllZCwgYW5kIGFsbG93cyBjb25kaXRpb25hbCBBbnQgYnVpbGQgZmFpbHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuIj5jYXB0dXJlQnVpbGRNZXNzYWdlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjb21waWxldy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgamF2YWMuIFdoaWxlIHRoaXMgdGFzayBpcyBydW5uaW5nLCBhbGwgdGhlIHZhbGlkYXRpb24gYW5kIG90aGVyIGJ1aWxkZXJzIGFyZSB0dXJuZWQgb2YiPmNvbXBpbGVXb3Jrc3BhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0ai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9yIGNvdW50IGZvciB0aGUgbGFzdCBpbnRlcm5hbCBqYXZhYyBjb21waWxhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5nZXRKYXZhY0Vycm9yQ291bnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0cC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGluZm9ybWF0aW9uLiI+Z2V0UHJvamVjdERhdGE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5wcm9qZWN0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgcHJvamVjdEJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyBwcm9qZWN0IGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkiPnByb2plY3RHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gcHJvamVjdCBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0aW1wb3J0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoUFNGKSBpbnRvIGEgd29ya3NwYWNlLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgYW4gRWNsaXBzZSB0ZWFtICYjMzQ7UHJvamVjdCBTZXQgRXhwb3J0JiMzNDsgY29tbWFuZC4iPnByb2plY3RTZXRJbXBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50c2V0ZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgdGhlIGludGVybmFsIEphdmEgY29tcGlsYXRpb24gZGVidWcgbGV2ZWwsIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmdzLiI+c2V0RGVidWdJbmZvPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWJ1aWxkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiI+d29ya3NwYWNlQnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlZ2V0ZXJyb3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgZW50aXJlIHdvcmtzcGFjZS4gSXQgaXMgYSBzdWJzZXQgb2YgdGhlIHdvcmtzcGFjZUJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyB3b3Jrc3BhY2UgZXJyb3JzIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgd2VyZSBjcmVhdGVkKS4iPndvcmtzcGFjZUdldEVycm9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZmlsZS5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHJlYWRzIGEgcHJvcGVydHkgZmlsZSBjb250YWluaW5nIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzIGFuZCBzZXRzIHRob3NlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZUZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlR2V0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VzZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZVNldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRwcm9qZWN0c2V0aW1wb3J0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50cHJvamVjdHNldGltcG9ydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWNiODA5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRwcm9qZWN0c2V0aW1wb3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi0KLQotCi0KLQotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+cHJvamVjdFNldEltcG9ydDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFudHByb2plY3RzZXRpbXBvcnQiPjxhIG5hbWU9InRhbnRwcm9qZWN0c2V0aW1wb3J0Ij48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPnByb2plY3RTZXRJbXBvcnQ8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoUFNGKQotaW50byBhIHdvcmtzcGFjZS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbQotIlByb2plY3QgU2V0IEV4cG9ydCIgY29tbWFuZC48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGFyYW1ldGVyczwvc3Bhbj48L3A+Ci0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBpZD0iZDBlMjEiPkF0dHJpYnV0ZTwvdGg+Ci08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGlkPSJkMGUyMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGlkPSJkMGUyNSI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+UHJvamVjdFNldEZpbGVOYW1lIDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+VGhlIGZ1bGx5IHF1YWxpZmllZCBwYXRoIHRvIHRoZSBFY2xpcHNlIFBTRiBmaWxlIHRvIGJlCi1pbXBvcnRlZDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPlByb3BlcnR5SW1wb3J0ZWRQcm9qZWN0TmFtZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPlByb3BlcnR5IHRvIHJlY2VpdmUgYSBTdHJpbmdbXSBvZiB0aGUgbmFtZXMgb2YgdGhlIHByb2plY3RzIHdoaWNoIHdlcmUKLWltcG9ydGVkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzIDxlbT5JbXBvcnRlZFByb2plY3ROYW1lczwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjEgIj5BdXRvRGVsZXRlRXhpc3RpbmdQcm9qZWN0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+V2hldGhlciBvciBub3QgYW55IGV4aXN0aW5nIHByb2plY3QgKHdpdGggdGhlIHNhbWUgbmFtZSkKLXdpbGwgYmUgZGVsZXRlZCAocmVwbGFjZWQpIGJ5IGEgbmV3IHByb2plY3Qgd2l0aCB0aGUgc2FtZSBuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzIDxlbT50cnVlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPkZhaWxPbkVycm9yPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjMgIj5XaGV0aGVyIG9uIG5vdCB0aGUgQW50IGJ1aWxkIHNob3VsZCBmYWlsIGlmIHRoZXJlIGlzCi1hbiBpbXBvcnQgZXJyb3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPnRydWU8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+VVNFUklEPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjMgIj5JZiBhIENWUyBQU0YgaXMgdXNlZCwgYW5kIGlmIGl0IGNvbnRhaW5zIHRoZSBzdHJpbmcKLVVTRVJJRCwgdGhlbiB0aGlzIHZhbHVlIGlzIHN1YnN0aXR1dGVkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjEgIj5QQVNTV09SRDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+SWYgYSBDVlMgUFNGIGlzIHVzZWQsIGFuZCBpZiBpdCBjb250YWlucyB0aGUgc3RyaW5nCi1QQVNTV09SRCwgdGhlbiB0aGlzIHZhbHVlIGlzIHN1YnN0aXR1dGVkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhhbXBsZXM8L3NwYW4+PC9wPgotPHVsPjxsaT5JbXBvcnQgYW4gRWNsaXBzZSBQcm9qZWN0U2V0IDo8cHJlPiZsdDtwcm9qZWN0U2V0SW1wb3J0wqAKLQlQcm9qZWN0U2V0RmlsZU5hbWU9IiR7bXlQcm9qZWN0U2V0LnBzZn0iIC8mZ3Q7PC9wcmU+Ci08L2xpPgotPGxpPkltcG9ydCBhbiBFY2xpcHNlIFByb2plY3RTZXQgdGhhdCBpcyBjb250cm9sbGVkIGJ5IGEgQ1ZTIFVTRVJJRDpQQVNTV09SRDogPHByZT4mbHQ7cHJvamVjdFNldEltcG9ydCBQcm9qZWN0U2V0RmlsZU5hbWU9IiR7bXlQcm9qZWN0U2V0LnBzZn0iIFVTRVJJRD0iJHtNeUN2c1VzZXJpZH0iIFBBU1NXT1JEPSIke015Q3ZzUGFzc3dvcmR9IiAvJmd0OzwvcHJlPgotPC9saT4KLTxsaT5JbXBvcnQgYW4gRWNsaXBzZSBQcm9qZWN0U2V0IGludG8gYSBjbGVhbiB3b3Jrc3BhY2UgYnV0IGRvIG5vdCByZXBsYWNlCi1hbnkgZXhpc3RpbmcgcHJvamVjdCAoZmFpbCBpbnN0ZWFkKTo8cHJlPiZsdDtwcm9qZWN0U2V0SW1wb3J0wqAKLQlQcm9qZWN0U2V0RmlsZU5hbWU9IiR7bXlQcm9qZWN0U2V0LnBzZn0iCi0JQXV0b0RlbGV0ZUV4aXN0aW5nUHJvamVjdHM9ImZhbHNlIiAKLQlGYWlsT25FcnJvcj0idHJ1ZSIgLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5NYW51YWxseSBjcmVhdGluZyBhIG5vbi10ZWFtIFBTRjwvc3Ryb25nPjx1bD48bGk+SWYgRWNsaXBzZSB0ZWFtIFNvdXJjZSBDb2RlIE1hbmFnZW1lbnQgKFNDTSkgaXMgbm90IGJlaW5nIHVzZWQgdG8gc3RvcmUKLXByb2plY3RzLCBhbmQgdGhleSBhcmUgZWxzZXdoZXJlIG9uIHRoZSBmaWxlIHN5c3RlbSwgdGhlbiBhIG5vbi10ZWFtICJBbnQiCi1QU0YgY2FuIGJlIG1hbnVhbGx5IGNyZWF0ZWQgYW5kIHVzZWQgdG8gaW1wb3J0IHNldHMgb2YgZXhpc3RpbmcgZmlsZSBzeXN0ZW0KLXByb2plY3RzLiBJdHMgaW50ZXJuYWwgcHJvamVjdCByZWZlcmVuY2UgbG9jYXRpb25zIG1heSBiZSBlaXRoZXIgZnVsbHkgcXVhbGlmaWVkLAotb3IgcmVsYXRpdmUgdG8gdGhlIFBTRiBmaWxlLjwvbGk+Ci08bGk+U2FtcGxlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPk15QW50UHJvamVjdFNldC5wc2Y8L3NhbXA+OjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKLSZsdDtwc2YgdmVyc2lvbj0iMi4wIiZndDsKLSZsdDtwcm92aWRlciBpZD0iYW50aW1wb3J0UHJvamVjdFNldCImZ3Q7Ci0JJmx0O3Byb2plY3QgcmVmZXJlbmNlPSIxLjAsYW50aW1wb3J0UHJvamVjdFNldCxYOi9NeVBhdGgvTXlQcm9qZWN0RGlyZWN0b3J5MSxNeVByb2plY3ROYW1lMSIvJmd0OwotCSZsdDtwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLGFudGltcG9ydFByb2plY3RTZXQsWDovTXlQYXRoL015UHJvamVjdERpcmVjdG9yeTIsTXlQcm9qZWN0TmFtZTIiLyZndDsKLQkmbHQ7cHJvamVjdCByZWZlcmVuY2U9IjEuMCxhbnRpbXBvcnRQcm9qZWN0U2V0LC4uL015V29ya3NwYWNlUHJvamVjdERpcixNeVByb2plY3ROYW1lMyIvJmd0OwotCSZsdDtwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLGFudGltcG9ydFByb2plY3RTZXQsLi4vTXlXb3Jrc3BhY2VQcm9qZWN0RGlyLE15UHJvamVjdE5hbWU0Ii8mZ3Q7Ci0mbHQ7L3Byb3ZpZGVyJmd0OwotJmx0Oy9wc2YmZ3Q7PC9wcmU+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotIDwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwiIHRpdGxlPSIiPkdlbmVyYWwgQW50IHRhc2tzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjYXB0dXJlcyBBbnQgYnVpbGQgbWVzc2FnZXMgYW5kIGFsbG93cyB0aGVtIHRvIGJlIHNlYXJjaGVkIG9yIGRpc3BsYXllZCwgYW5kIGFsbG93cyBjb25kaXRpb25hbCBBbnQgYnVpbGQgZmFpbHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuIj5jYXB0dXJlQnVpbGRNZXNzYWdlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjb21waWxldy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgamF2YWMuIFdoaWxlIHRoaXMgdGFzayBpcyBydW5uaW5nLCBhbGwgdGhlIHZhbGlkYXRpb24gYW5kIG90aGVyIGJ1aWxkZXJzIGFyZSB0dXJuZWQgb2YiPmNvbXBpbGVXb3Jrc3BhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0ai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9yIGNvdW50IGZvciB0aGUgbGFzdCBpbnRlcm5hbCBqYXZhYyBjb21waWxhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5nZXRKYXZhY0Vycm9yQ291bnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0cC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGluZm9ybWF0aW9uLiI+Z2V0UHJvamVjdERhdGE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5wcm9qZWN0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgcHJvamVjdEJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyBwcm9qZWN0IGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkiPnByb2plY3RHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gcHJvamVjdCBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0YnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgYSBzZXQgb2YgRWNsaXBzZSBwcm9qZWN0cyB1c2luZyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoJiMzNDtQU0YmIzM0OykuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLCBhbmQgdGhlbiB0aGUgdGFzayBwcm9qZWN0U2V0SW1wb3J0IG11c3QgaGF2ZSBiZWVuIHVzZWQgdG8gaW1wb3J0IHRob3NlIHByb2plY3RzIGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0U2V0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50c2V0ZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgdGhlIGludGVybmFsIEphdmEgY29tcGlsYXRpb24gZGVidWcgbGV2ZWwsIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmdzLiI+c2V0RGVidWdJbmZvPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWJ1aWxkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiI+d29ya3NwYWNlQnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlZ2V0ZXJyb3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgZW50aXJlIHdvcmtzcGFjZS4gSXQgaXMgYSBzdWJzZXQgb2YgdGhlIHdvcmtzcGFjZUJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyB3b3Jrc3BhY2UgZXJyb3JzIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgd2VyZSBjcmVhdGVkKS4iPndvcmtzcGFjZUdldEVycm9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZmlsZS5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHJlYWRzIGEgcHJvcGVydHkgZmlsZSBjb250YWluaW5nIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzIGFuZCBzZXRzIHRob3NlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZUZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlR2V0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VzZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZVNldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRzZXRkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50c2V0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGRkNjU0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnRzZXRkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi0KLQotCi0KLQotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+c2V0RGVidWdJbmZvPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YW50c2V0ZCI+PGEgbmFtZT0idGFudHNldGQiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+c2V0RGVidWdJbmZvPC9oMT4KLTxkaXY+PHA+VGhpcyB0YXNrIHNldHMgdGhlIGludGVybmFsIEphdmHihKIgY29tcGlsYXRpb24gZGVidWcgbGV2ZWwsIGFuZCByZXR1cm5zCi10aGUgY3VycmVudCBzZXR0aW5ncy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXJhbWV0ZXJzPC9zcGFuPjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMy4yNjUzMDYxMjI0NDg5OCUiIGlkPSJkMGUyMyI+QXR0cmlidXRlPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI0MC44MTYzMjY1MzA2MTIyNDQlIiBpZD0iZDBlMjUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI0NS45MTgzNjczNDY5Mzg3OCUiIGlkPSJkMGUyNyI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMy4yNjUzMDYxMjI0NDg5OCUiIGhlYWRlcnM9ImQwZTIzICI+RGVidWdJbmZvPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI0MC44MTYzMjY1MzA2MTIyNDQlIiBoZWFkZXJzPSJkMGUyNSAiPkNoYW5nZXMgYWxsIDMgc2V0dGluZ3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjQ1LjkxODM2NzM0NjkzODc4JSIgaGVhZGVycz0iZDBlMjcgIj5ObyAodmFsdWUgdW5jaGFuZ2VkKSAobWF5IGJlIDxlbT50cnVlPC9lbT4gb3IgPGVtPmZhbHNlPC9lbT4pPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjEzLjI2NTMwNjEyMjQ0ODk4JSIgaGVhZGVycz0iZDBlMjMgIj5MaW5lTnVtYmVyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI0MC44MTYzMjY1MzA2MTIyNDQlIiBoZWFkZXJzPSJkMGUyNSAiPkxpbmUgTnVtYmVyIGRlYnVnIGluZm9ybWF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI0NS45MTgzNjczNDY5Mzg3OCUiIGhlYWRlcnM9ImQwZTI3ICI+Tm8gKHZhbHVlIHVuY2hhbmdlZCkgKG1heSBiZSA8ZW0+dHJ1ZTwvZW0+IG9yIDxlbT5mYWxzZTwvZW0+KTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMy4yNjUzMDYxMjI0NDg5OCUiIGhlYWRlcnM9ImQwZTIzICI+TG9jYWxWYXJpYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNDAuODE2MzI2NTMwNjEyMjQ0JSIgaGVhZGVycz0iZDBlMjUgIj5Mb2NhbCBWYXJpYWJsZSBzeW1ib2wgdGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjQ1LjkxODM2NzM0NjkzODc4JSIgaGVhZGVycz0iZDBlMjcgIj5ObyAodmFsdWUgdW5jaGFuZ2VkKSAobWF5IGJlIDxlbT50cnVlPC9lbT4gb3IgPGVtPmZhbHNlPC9lbT4pPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjEzLjI2NTMwNjEyMjQ0ODk4JSIgaGVhZGVycz0iZDBlMjMgIj5Tb3VyY2VGaWxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI0MC44MTYzMjY1MzA2MTIyNDQlIiBoZWFkZXJzPSJkMGUyNSAiPlNvdXJjZSBGaWxlIG5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjQ1LjkxODM2NzM0NjkzODc4JSIgaGVhZGVycz0iZDBlMjcgIj5ObyAodmFsdWUgdW5jaGFuZ2VkKSAobWF5IGJlIDxlbT50cnVlPC9lbT4gb3IgPGVtPmZhbHNlPC9lbT4pPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjEzLjI2NTMwNjEyMjQ0ODk4JSIgaGVhZGVycz0iZDBlMjMgIj5Qcm9wZXJ0eU5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjQwLjgxNjMyNjUzMDYxMjI0NCUiIGhlYWRlcnM9ImQwZTI1ICI+UHJvcGVydHkgTmFtZSB0byByZWNlaXZlIGN1cnJlbnQgc2V0dGluZ3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjQ1LjkxODM2NzM0NjkzODc4JSIgaGVhZGVycz0iZDBlMjcgIj5ObywgZGVmYXVsdCBpcyA8ZW0+RGVidWdJbmZvPC9lbT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeGFtcGxlczwvc3Bhbj48L3A+Ci08dWw+PGxpPlJldHJpZXZlIGFuZCBkaXNwbGF5IGN1cnJlbnQgZGVidWcgaW5mbyBzZXR0aW5nczogPHByZT4mbHQ7c2V0RGVidWdJbmZvIC8mZ3Q7Ci0mbHQ7ZWNobyBtZXNzYWdlPSJjdXJyZW50IHNldHRpbmdzOiAke0RlYnVnSW5mb30iIC8mZ3Q7PC9wcmU+Ci08L2xpPgotPGxpPlNldCB0aGUgaW5kaXZpZHVhbCBzZXR0aW5ncyB0byA8ZW0+ZmFsc2U8L2VtPiwgdGhlbiBkbyBidWlsZHMsIHRoZW4gc2V0Ci1hbGwgc2V0dGluZ3MgdG8gPGVtPnRydWU8L2VtPjogPHByZT4mbHQ7c2V0RGVidWdJbmZvCi0gICBMaW5lTnVtYmVyPSJmYWxzZSIKLSAgIExvY2FsVmFyaWFibGU9ImZhbHNlIgotICAgc291cmNlRmlsZT0iZmFsc2UiIC8mZ3Q7Ci0mbHQ7ZWNobyBtZXNzYWdlPSJjdXJyZW50IHNldHRpbmdzOiAke0RlYnVnSW5mb30iIC8mZ3Q7Ci0uLi4gZG8gYnVpbGRzIGhlcmUgLi4uIAotJmx0O3NldERlYnVnSW5mbyAKLSAgIERlYnVnSW5mbz0idHJ1ZSIKLSAgIFByb3BlcnR5TmFtZT0iU2V0dGluZ3MiIC8mZ3Q7Ci0mbHQ7ZWNobyBtZXNzYWdlPSJjdXJyZW50IHNldHRpbmdzOiAke1NldHRpbmdzfSIgLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWFudGdlbmVyYWwuaHRtbCIgdGl0bGU9IiI+R2VuZXJhbCBBbnQgdGFza3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjYXB0dXJlYnVpbGRtZXNzYWdlcy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNhcHR1cmVzIEFudCBidWlsZCBtZXNzYWdlcyBhbmQgYWxsb3dzIHRoZW0gdG8gYmUgc2VhcmNoZWQgb3IgZGlzcGxheWVkLCBhbmQgYWxsb3dzIGNvbmRpdGlvbmFsIEFudCBidWlsZCBmYWlsdXJlcyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgYSBzcGVjaWZpZWQgc3RyaW5nIGlzIGluIHRoZSBjYXB0dXJlZCBidWlsZCBtZXNzYWdlcy4iPmNhcHR1cmVCdWlsZE1lc3NhZ2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGNvbXBpbGV3Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgY29tcGlsZXMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIEl0IHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBqYXZhYy4gV2hpbGUgdGhpcyB0YXNrIGlzIHJ1bm5pbmcsIGFsbCB0aGUgdmFsaWRhdGlvbiBhbmQgb3RoZXIgYnVpbGRlcnMgYXJlIHR1cm5lZCBvZiI+Y29tcGlsZVdvcmtzcGFjZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRnZXRqLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3IgY291bnQgZm9yIHRoZSBsYXN0IGludGVybmFsIGphdmFjIGNvbXBpbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4iPmdldEphdmFjRXJyb3JDb3VudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRnZXRwLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgc3BlY2lmaWVkIHByb2plY3QgaW5mb3JtYXRpb24uIj5nZXRQcm9qZWN0RGF0YTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4iPnByb2plY3RCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0Z2V0ZXJyb3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuIEl0IGlzIGEgc3Vic2V0IG9mIHRoZSBwcm9qZWN0QnVpbGQgdGFzayAoaXQgZG9lcyBub3QgZG8gYSBidWlsZCwgaXQganVzdCBnZXRzIHByb2plY3QgZXJyb3JzIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgd2VyZSBjcmVhdGVkKSI+cHJvamVjdEdldEVycm9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0aW1wb3J0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBmaWxlIHN5c3RlbSBwcm9qZWN0IGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0SW1wb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RzZXRidWlsZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyBhIHNldCBvZiBFY2xpcHNlIHByb2plY3RzIHVzaW5nIGFuIGV4aXN0aW5nIEVjbGlwc2UgdGVhbSBQcm9qZWN0IFNldCBGaWxlICgmIzM0O1BTRiYjMzQ7KS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbSAmIzM0O1Byb2plY3QgU2V0IEV4cG9ydCYjMzQ7IGNvbW1hbmQsIGFuZCB0aGVuIHRoZSB0YXNrIHByb2plY3RTZXRJbXBvcnQgbXVzdCBoYXZlIGJlZW4gdXNlZCB0byBpbXBvcnQgdGhvc2UgcHJvamVjdHMgaW50byBhIHdvcmtzcGFjZS4iPnByb2plY3RTZXRCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0aW1wb3J0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgaW1wb3J0cyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoUFNGKSBpbnRvIGEgd29ya3NwYWNlLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgYW4gRWNsaXBzZSB0ZWFtICYjMzQ7UHJvamVjdCBTZXQgRXhwb3J0JiMzNDsgY29tbWFuZC4iPnByb2plY3RTZXRJbXBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlYnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIj53b3Jrc3BhY2VCdWlsZDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VnZXRlcnJvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvcnMgZm9yIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgd29ya3NwYWNlQnVpbGQgdGFzayAoaXQgZG9lcyBub3QgZG8gYSBidWlsZCwgaXQganVzdCBnZXRzIHdvcmtzcGFjZSBlcnJvcnMgcmVnYXJkbGVzcyBvZiBob3cgdGhleSB3ZXJlIGNyZWF0ZWQpLiI+d29ya3NwYWNlR2V0RXJyb3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VmaWxlLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgcmVhZHMgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMgYW5kIHNldHMgdGhvc2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlRmlsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZ2V0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcy4iPndvcmtzcGFjZVByZWZlcmVuY2VHZXQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZXNldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlU2V0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudHV0aWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR1dGlsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTI1NmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudHV0aWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPlV0aWxKYXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnR1dGlsIj48YSBuYW1lPSJ0YW50dXRpbCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5VdGlsSmFyPC9oMT4KLTxkaXY+PHA+KERFUFJFQ0FURUQpIFRoaXMgdGFzayBjb21wcmVzc2VzIHNvdXJjZSBhbmQvb3IgYnVpbGQgb3V0cHV0IG9mCi1hIEphdmHihKIgcHJvamVjdAotaW50byBhIEpBUiBmaWxlIGFuZCBwbGFjZXMgdGhlIEpBUiBmaWxlIGluIGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdC48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhpcyBkZXByZWNhdGVkIHRhc2sgd2FzIG5vdCByZW1vdmVkIGluIG9yZGVyIHRvCi1tYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnMsIGJ1dCBpdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlCi1mdXR1cmUuIEl0IHNob3VsZCBubyBsb25nZXIgYmUgcmVxdWlyZWQ7IHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaCBpcyB0byB1c2UKLXRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWRpdG9yIHRvIG1hcCBKYXZhIHByb2plY3RzCi10byB1dGlsaXR5IEpBUnMuIDwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGFyYW1ldGVyczwvc3Bhbj48L3A+Ci0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTUuOTU3NDQ2ODA4NTEwNjM5JSIgaWQ9ImQwZTI4Ij5BdHRyaWJ1dGU8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjYxLjcwMjEyNzY1OTU3NDQ2NSUiIGlkPSJkMGUzMCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjM0MDQyNTUzMTkxNDg5MiUiIGlkPSJkMGUzMiI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNS45NTc0NDY4MDg1MTA2MzklIiBoZWFkZXJzPSJkMGUyOCAiPkVBUlByb2plY3ROYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI2MS43MDIxMjc2NTk1NzQ0NjUlIiBoZWFkZXJzPSJkMGUzMCAiPk5hbWUgb2YgdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCAoPGVtPmNhc2Ugc2Vuc2l0aXZlPC9lbT4pPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4zNDA0MjU1MzE5MTQ4OTIlIiBoZWFkZXJzPSJkMGUzMiAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNS45NTc0NDY4MDg1MTA2MzklIiBoZWFkZXJzPSJkMGUyOCAiPkphdmFQcm9qZWN0TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNjEuNzAyMTI3NjU5NTc0NDY1JSIgaGVhZGVycz0iZDBlMzAgIj5OYW1lIG9mIHRoZSBKYXZhIFByb2plY3QgKDxlbT5jYXNlIHNlbnNpdGl2ZTwvZW0+KTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMzQwNDI1NTMxOTE0ODkyJSIgaGVhZGVycz0iZDBlMzIgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTUuOTU3NDQ2ODA4NTEwNjM5JSIgaGVhZGVycz0iZDBlMjggIj5KYXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjYxLjcwMjEyNzY1OTU3NDQ2NSUiIGhlYWRlcnM9ImQwZTMwICI+RUFSIHJlbGF0aXZlIHBhdGggb2YgdGhlIEpBUiBmaWxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4zNDA0MjU1MzE5MTQ4OTIlIiBoZWFkZXJzPSJkMGUzMiAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNS45NTc0NDY4MDg1MTA2MzklIiBoZWFkZXJzPSJkMGUyOCAiPkluY2x1ZGVTb3VyY2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjYxLjcwMjEyNzY1OTU3NDQ2NSUiIGhlYWRlcnM9ImQwZTMwICI+V2hldGhlciB0byBpbmNsdWRlIHRoZSBzb3VyY2UgZmlsZXMgb2YgdGhlIEphdmEgUHJvamVjdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMzQwNDI1NTMxOTE0ODkyJSIgaGVhZGVycz0iZDBlMzIgIj5ObywgZGVmYXVsdCBpcyA8ZW0+ZmFsc2U8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNS45NTc0NDY4MDg1MTA2MzklIiBoZWFkZXJzPSJkMGUyOCAiPk92ZXJ3cml0ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNjEuNzAyMTI3NjU5NTc0NDY1JSIgaGVhZGVycz0iZDBlMzAgIj5XaGV0aGVyIHRvIG92ZXJ3cml0ZSBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0czwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMzQwNDI1NTMxOTE0ODkyJSIgaGVhZGVycz0iZDBlMzIgIj5ObywgZGVmYXVsdCBpcyA8ZW0+ZmFsc2U8L2VtPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4YW1wbGVzPC9zcGFuPjwvcD4KLTx1bD48bGk+RXhwb3J0IHRoZSBwcm9qZWN0ICJKUHJvamVjdCIgd2l0aCBzb3VyY2UgZmlsZXMgdG8gIkpQcm9qZWN0LmphciIgYW5kCi1wbGFjZSB0aGUgSkFSIGZpbGUgaW4gRUFSUHJvamVjdDogPHByZT4mbHQ7dXRpbEphciBFQVJQcm9qZWN0TmFtZT0iRUFSUHJvamVjdCIgSmF2YVByb2plY3ROYW1lPSJKUHJvamVjdCIgSmFyPSJKUHJvamVjdC5qYXIiIEluY2x1ZGVTb3VyY2U9InRydWUiLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWFudGoyZWUuaHRtbCIgdGl0bGU9IiI+QW50IHRhc2tzIGZvciBKMkVFPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50YXV0b2FwcGluc3RhbGwuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayB1c2VzIHRoZSBXZWJTcGhlcmUgUmFwaWQgRGVwbG95IGZlYXR1cmUgdG8gaW5zdGFsbCBhbiBhcHBsaWNhdGlvbi4iPmF1dG9BcHBJbnN0YWxsPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGFwcGMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIEFwcGxpY2F0aW9uIENsaWVudCBleHBvcnQgd2l6YXJkIGZvciBleHBvcnRpbmcgYW4gQXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QgdG8gYW4gQXBwbGljYXRpb24gQ2xpZW50IEpBUiBmaWxlLiI+QXBwQ2xpZW50RXhwb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGVhcmUuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlIEVBUiBmaWxlIGV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QgdG8gYW4gRUFSIGZpbGUuIj5FQVJFeHBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d2FyZS5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgV0FSIGZpbGUgZXhwb3J0IHdpemFyZCBmb3IgZXhwb3J0aW5nIGEgV2ViIFByb2plY3QgdG8gYSBXQVIgZmlsZS4iPldBUkV4cG9ydDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3YXJlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50d2FyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTExZGVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3YXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5XQVJFeHBvcnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhbnR3YXJlIj48YSBuYW1lPSJ0YW50d2FyZSI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XQVJFeHBvcnQ8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgcGVyZm9ybXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzIHRoZSBXQVIgZmlsZSBleHBvcnQgd2l6YXJkCi1mb3IgZXhwb3J0aW5nIGEgV2ViIFByb2plY3QgdG8gYSBXQVIgZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXJhbWV0ZXJzPC9zcGFuPjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNy4wNzMxNzA3MzE3MDczMTglIiBpZD0iZDBlMjAiPkF0dHJpYnV0ZTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTcuMzE3MDczMTcwNzMxNyUiIGlkPSJkMGUyMiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjI1LjYwOTc1NjA5NzU2MDk3NSUiIGlkPSJkMGUyNCI+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNy4wNzMxNzA3MzE3MDczMTglIiBoZWFkZXJzPSJkMGUyMCAiPldBUlByb2plY3ROYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ny4zMTcwNzMxNzA3MzE3JSIgaGVhZGVycz0iZDBlMjIgIj5OYW1lIG9mIHRoZSBXZWIgUHJvamVjdCAoPGVtPmNhc2Ugc2Vuc2l0aXZlPC9lbT4pPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNS42MDk3NTYwOTc1NjA5NzUlIiBoZWFkZXJzPSJkMGUyNCAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNy4wNzMxNzA3MzE3MDczMTglIiBoZWFkZXJzPSJkMGUyMCAiPldBUkV4cG9ydEZpbGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjU3LjMxNzA3MzE3MDczMTclIiBoZWFkZXJzPSJkMGUyMiAiPkFic29sdXRlIHBhdGggb2YgdGhlIFdBUiBmaWxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNS42MDk3NTYwOTc1NjA5NzUlIiBoZWFkZXJzPSJkMGUyNCAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNy4wNzMxNzA3MzE3MDczMTglIiBoZWFkZXJzPSJkMGUyMCAiPkV4cG9ydFNvdXJjZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTcuMzE3MDczMTcwNzMxNyUiIGhlYWRlcnM9ImQwZTIyICI+V2hldGhlciB0byBpbmNsdWRlIHNvdXJjZSBmaWxlcyBvciBub3Q8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjI1LjYwOTc1NjA5NzU2MDk3NSUiIGhlYWRlcnM9ImQwZTI0ICI+Tm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTcuMDczMTcwNzMxNzA3MzE4JSIgaGVhZGVycz0iZDBlMjAgIj5PdmVyd3JpdGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjU3LjMxNzA3MzE3MDczMTclIiBoZWFkZXJzPSJkMGUyMiAiPldoZXRoZXIgdG8gb3ZlcndyaXRlIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNS42MDk3NTYwOTc1NjA5NzUlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT5mYWxzZTwvZW0+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhhbXBsZXM8L3NwYW4+PC9wPgotPHVsPjxsaT5FeHBvcnQgdGhlIHByb2plY3QgIlByb2plY3RXZWIiIHRvICJQcm9qZWN0V2ViLndhciIgaW4gdGhlIEMgRHJpdmU6IDxwcmU+Jmx0O3dhckV4cG9ydCBXQVJQcm9qZWN0TmFtZT0iUHJvamVjdFdlYiIgV0FSRXhwb3J0RmlsZT0iQzpcUHJvamVjdFdlYi53YXIiLyZndDs8L3ByZT4KLTwvbGk+Ci08bGk+RXhwb3J0IHRoZSBwcm9qZWN0ICJQcm9qZWN0V2ViIiB3aXRoIHRoZSBzb3VyY2UgZmlsZXMgdG8gIlByb2plY3RXZWIud2FyIgotaW4gdGhlIEMgRHJpdmU6IDxwcmU+Jmx0O3dhckV4cG9ydCBXQVJQcm9qZWN0TmFtZT0iUHJvamVjdFdlYiIgV0FSRXhwb3J0RmlsZT0iQzpcUHJvamVjdFdlYi53YXIiIEV4cG9ydFNvdXJjZT0idHJ1ZSIvJmd0OzwvcHJlPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtYW50ajJlZS5odG1sIiB0aXRsZT0iIj5BbnQgdGFza3MgZm9yIEoyRUU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRhdXRvYXBwaW5zdGFsbC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHVzZXMgdGhlIFdlYlNwaGVyZSBSYXBpZCBEZXBsb3kgZmVhdHVyZSB0byBpbnN0YWxsIGFuIGFwcGxpY2F0aW9uLiI+YXV0b0FwcEluc3RhbGw8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50YXBwYy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgQXBwbGljYXRpb24gQ2xpZW50IGV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBhbiBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdCB0byBhbiBBcHBsaWNhdGlvbiBDbGllbnQgSkFSIGZpbGUuIj5BcHBDbGllbnRFeHBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50ZWFyZS5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgRUFSIGZpbGUgZXhwb3J0IHdpemFyZCBmb3IgZXhwb3J0aW5nIGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCB0byBhbiBFQVIgZmlsZS4iPkVBUkV4cG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR1dGlsLmh0bWwiIHRpdGxlPSIoREVQUkVDQVRFRCkgVGhpcyB0YXNrIGNvbXByZXNzZXMgc291cmNlIGFuZC9vciBidWlsZCBvdXRwdXQgb2YgYSBKYXZhIHByb2plY3QgaW50byBhIEpBUiBmaWxlIGFuZCBwbGFjZXMgdGhlIEpBUiBmaWxlIGluIGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdC4iPlV0aWxKYXI8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50d29ya3NwYWNlYnVpbGQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3b3Jrc3BhY2VidWlsZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQxMzY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3b3Jrc3BhY2VidWlsZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotCi0KLQotCi0KLQotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPndvcmtzcGFjZUJ1aWxkPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YW50d29ya3NwYWNlYnVpbGQiPjxhIG5hbWU9InRhbnR3b3Jrc3BhY2VidWlsZCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj53b3Jrc3BhY2VCdWlsZDwvaDE+Ci08ZGl2PjxwPlRoaXMgdGFzayBidWlsZHMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhcmFtZXRlcnM8L3NwYW4+PC9wPgotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHI+PHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaWQ9ImQwZTIxIj5BdHRyaWJ1dGU8L3RoPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBpZD0iZDBlMjMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBpZD0iZDBlMjUiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPkJ1aWxkVHlwZSA8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPlR5cGUgb2YgYnVpbGQgPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzIDxlbT5JbmNyZW1lbnRhbDwvZW0+LiBNYXkgYmUgPGVtPkluY3JlbWVudGFsPC9lbT4gb3IgPGVtPkZ1bGw8L2VtPi48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPkZhaWxPbkVycm9yPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjMgIj5XaGV0aGVyIG9yIG5vdCBidWlsZHMgc2hvdWxkIGZhaWwgb24gZXJyb3IgPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzPGVtPiB0cnVlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPkRlYnVnQ29tcGlsYXRpb248L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPldoZXRoZXIgb24gbm90IGNvbXBpbGF0aW9ucyBzaG91bGQgYmUgZGVidWcgPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzPGVtPiB0cnVlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPlNob3dFcnJvcnM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPldoZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIHByb2plY3QgZXJyb3JzIGluIHRoZSBhbnQgYnVpbGQgbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzPGVtPiB0cnVlPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPlNldmVyaXR5TGV2ZWw8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMyAiPlRoZSBwcm9ibGVtIGxldmVsIHRvIGNvdW50IGFuZCB0cmVhdCBhcyBhIGJ1aWxkIGVycm9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNSAiPk5vLCBkZWZhdWx0IGlzPGVtPiBFUlJPUjwvZW0+LiBNYXkgYmUgPGVtPiBFUlJPUjwvZW0+LCA8ZW0+IFdBUk5JTkc8L2VtPiwKLW9yIDxlbT5JTkZPUk1BVElPTjwvZW0+LjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+Q291bnRWYWxpZGF0aW9uRXJyb3JzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjMgIj5XaGV0aGVyIG9yIG5vdCB0byBjb3VudCBWYWxpZGF0aW9uIHByb2JsZW1zIGFzIHByb2plY3QKLUVycm9yczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ObywgZGVmYXVsdCBpczxlbT4gdHJ1ZTwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjEgIj5Qcm9wZXJ0eUNvdW50TmFtZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+UHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCBlcnJvciBjb3VudDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ObywgZGVmYXVsdCBpczxlbT4gV29ya3NwYWNlRXJyb3JDb3VudDwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjEgIj5Qcm9wZXJ0eU1lc3NhZ2VzTmFtZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+UHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCBlcnJvciBtZXNzYWdlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ObywgZGVmYXVsdCBpczxlbT4gV29ya3NwYWNlRXJyb3JNZXNzYWdlczwvZW0+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhhbXBsZXM8L3NwYW4+PC9wPgotPHVsPjxsaT5CdWlsZCB0aGUgd29ya3NwYWNlIChkZWZhdWx0IGlzIGluY3JlbWVudGFsIHdpdGggZGVidWcgaW5mb3JtYXRpb24pOiA8cHJlPiZsdDt3b3Jrc3BhY2VCdWlsZCAvJmd0OzwvcHJlPgotPC9saT4KLTxsaT5EbyBhIHByb2R1Y3Rpb24gYnVpbGQgb2Ygd29ya3NwYWNlIChmdWxsIGJ1aWxkIHdpdGhvdXQgZGVidWcgaW5mb3JtYXRpb24pOjxwcmU+Jmx0O3dvcmtzcGFjZUJ1aWxkIAotCWZhaWxvbmVycm9yPSJ0cnVlIgotCURlYnVnQ29tcGlsYXRpb249ImZhbHNlIgotCUJ1aWxkVHlwZT0iZnVsbCIvJmd0OwotJmx0O2VjaG8gbWVzc2FnZT0icHJvamVjdEJ1aWxkOiBwcm9qZWN0TmFtZT0ke3Byb2plY3ROYW1lfQotCXdvcmtzcGFjZSBFcnJvciBDb3VudD0ke1dvcmtzcGFjZUVycm9yQ291bnR9Ci0Jd29ya3NwYWNlIEVycm9yIE1lc3NhZ2VzPSR7V29ya3NwYWNlRXJyb3JNZXNzYWdlc30iIC8mZ3Q7PC9wcmU+Ci08L2xpPgotPC91bD4KLSA8L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtYW50Z2VuZXJhbC5odG1sIiB0aXRsZT0iIj5HZW5lcmFsIEFudCB0YXNrczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGNhcHR1cmVidWlsZG1lc3NhZ2VzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgY2FwdHVyZXMgQW50IGJ1aWxkIG1lc3NhZ2VzIGFuZCBhbGxvd3MgdGhlbSB0byBiZSBzZWFyY2hlZCBvciBkaXNwbGF5ZWQsIGFuZCBhbGxvd3MgY29uZGl0aW9uYWwgQW50IGJ1aWxkIGZhaWx1cmVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCBhIHNwZWNpZmllZCBzdHJpbmcgaXMgaW4gdGhlIGNhcHR1cmVkIGJ1aWxkIG1lc3NhZ2VzLiI+Y2FwdHVyZUJ1aWxkTWVzc2FnZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y29tcGlsZXcuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjb21waWxlcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4gSXQgcGVyZm9ybXMgdGhlIHNhbWUgYWN0aW9uIGFzIGphdmFjLiBXaGlsZSB0aGlzIHRhc2sgaXMgcnVubmluZywgYWxsIHRoZSB2YWxpZGF0aW9uIGFuZCBvdGhlciBidWlsZGVycyBhcmUgdHVybmVkIG9mIj5jb21waWxlV29ya3NwYWNlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGdldGouaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvciBjb3VudCBmb3IgdGhlIGxhc3QgaW50ZXJuYWwgamF2YWMgY29tcGlsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiI+Z2V0SmF2YWNFcnJvckNvdW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudGdldHAuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpbmZvcm1hdGlvbi4iPmdldFByb2plY3REYXRhPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2ouaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiI+cHJvamVjdEJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RnZXRlcnJvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvcnMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4gSXQgaXMgYSBzdWJzZXQgb2YgdGhlIHByb2plY3RCdWlsZCB0YXNrIChpdCBkb2VzIG5vdCBkbyBhIGJ1aWxkLCBpdCBqdXN0IGdldHMgcHJvamVjdCBlcnJvcnMgcmVnYXJkbGVzcyBvZiBob3cgdGhleSB3ZXJlIGNyZWF0ZWQpIj5wcm9qZWN0R2V0RXJyb3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RpbXBvcnQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBpbXBvcnRzIGFuIGV4aXN0aW5nIGZpbGUgc3lzdGVtIHByb2plY3QgaW50byBhIHdvcmtzcGFjZS4iPnByb2plY3RJbXBvcnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdHNldGJ1aWxkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgYnVpbGRzIGEgc2V0IG9mIEVjbGlwc2UgcHJvamVjdHMgdXNpbmcgYW4gZXhpc3RpbmcgRWNsaXBzZSB0ZWFtIFByb2plY3QgU2V0IEZpbGUgKCYjMzQ7UFNGJiMzNDspLiBUaGUgUFNGIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgYW4gRWNsaXBzZSB0ZWFtICYjMzQ7UHJvamVjdCBTZXQgRXhwb3J0JiMzNDsgY29tbWFuZCwgYW5kIHRoZW4gdGhlIHRhc2sgcHJvamVjdFNldEltcG9ydCBtdXN0IGhhdmUgYmVlbiB1c2VkIHRvIGltcG9ydCB0aG9zZSBwcm9qZWN0cyBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdFNldEJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHByb2plY3RzZXRpbXBvcnQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBpbXBvcnRzIGFuIGV4aXN0aW5nIEVjbGlwc2UgdGVhbSBQcm9qZWN0IFNldCBGaWxlIChQU0YpIGludG8gYSB3b3Jrc3BhY2UuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLiI+cHJvamVjdFNldEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRzZXRkLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgc2V0cyB0aGUgaW50ZXJuYWwgSmF2YSBjb21waWxhdGlvbiBkZWJ1ZyBsZXZlbCwgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZ3MuIj5zZXREZWJ1Z0luZm88L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlZ2V0ZXJyb3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyB0aGUgZXJyb3JzIGZvciB0aGUgZW50aXJlIHdvcmtzcGFjZS4gSXQgaXMgYSBzdWJzZXQgb2YgdGhlIHdvcmtzcGFjZUJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyB3b3Jrc3BhY2UgZXJyb3JzIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgd2VyZSBjcmVhdGVkKS4iPndvcmtzcGFjZUdldEVycm9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZmlsZS5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHJlYWRzIGEgcHJvcGVydHkgZmlsZSBjb250YWluaW5nIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzIGFuZCBzZXRzIHRob3NlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZUZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlR2V0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VzZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZVNldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3b3Jrc3BhY2VnZXRlcnJvcnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3b3Jrc3BhY2VnZXRlcnJvcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3Y2FhMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50d29ya3NwYWNlZ2V0ZXJyb3JzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi0KLQotCi0KLQotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+d29ya3NwYWNlR2V0RXJyb3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YW50d29ya3NwYWNlZ2V0ZXJyb3JzIj48YSBuYW1lPSJ0YW50d29ya3NwYWNlZ2V0ZXJyb3JzIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPndvcmtzcGFjZUdldEVycm9yczwvaDE+Ci08ZGl2PjxwPlRoaXMgdGFzayBnZXRzIHRoZSBlcnJvcnMgZm9yIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBpcyBhIHN1YnNldAotb2YgdGhlIHdvcmtzcGFjZUJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyB3b3Jrc3BhY2UKLWVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhcmFtZXRlcnM8L3NwYW4+PC9wPgotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHI+PHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaWQ9ImQwZTIxIj5BdHRyaWJ1dGU8L3RoPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBpZD0iZDBlMjMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBpZD0iZDBlMjUiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMSAiPkZhaWxPbkVycm9yPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjMgIj5XaGV0aGVyIG9yIG5vdCBidWlsZHMgc2hvdWxkIGZhaWwgaWYgdGhlIHByb2plY3QgY29udGFpbnMKLWFueSBlcnJvcnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXM8ZW0+IHRydWU8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+U2hvd0Vycm9yczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+V2hldGhlciBvciBub3QgdG8gc2hvdyB0aGUgcHJvamVjdCBlcnJvcnMgaW4gdGhlIGFudCBidWlsZCBsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXM8ZW0+IHRydWU8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+U2V2ZXJpdHlMZXZlbDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+VGhlIHByb2JsZW0gbGV2ZWwgdG8gY291bnQgYW5kIHRyZWF0IGFzIGEgYnVpbGQgZXJyb3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI1ICI+Tm8sIGRlZmF1bHQgaXM8ZW0+IEVSUk9SPC9lbT4uIE1heSBiZSA8ZW0+IEVSUk9SPC9lbT4sIDxlbT4gV0FSTklORzwvZW0+LAotb3IgPGVtPiBJTkZPUk1BVElPTjwvZW0+LjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIxICI+Q291bnRWYWxpZGF0aW9uRXJyb3JzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjMgIj5XaGV0aGVyIG9yIG5vdCB0byBjb3VudCBWYWxpZGF0aW9uIHByb2JsZW1zIGFzIHByb2plY3QKLUVycm9yczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ObywgZGVmYXVsdCBpczxlbT4gdHJ1ZTwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjEgIj5Qcm9wZXJ0eUNvdW50TmFtZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+UHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCBlcnJvciBjb3VudDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ObywgZGVmYXVsdCBpczxlbT4gV29ya3NwYWNlRXJyb3JDb3VudDwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjEgIj5Qcm9wZXJ0eU1lc3NhZ2VzTmFtZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIzICI+UHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCBlcnJvciBtZXNzYWdlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjUgIj5ObywgZGVmYXVsdCBpczxlbT4gV29ya3NwYWNlRXJyb3JNZXNzYWdlczwvZW0+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhhbXBsZXM8L3NwYW4+PC9wPgotPHVsPjxsaT5SZXRyaWV2ZSBhbmQgZGlzcGxheSB0aGUgZXJyb3Ird2FybmluZyBjb3VudCBhbmQgZXJyb3Ird2FybmluZyBtZXNzYWdlcwotZm9yICJteVByb2plY3QiOjxwcmU+Jmx0O3dvcmtzcGFjZUdldEVycm9yc8KgCi0JU2V2ZXJpdHlMZXZlbD0iV0FSTklORyIKLQlQcm9wZXJ0eUNvdW50TmFtZT0idGhlV29ya3NwYWNlRXJyb3JDb3VudCIKLQlQcm9wZXJ0eU1lc3NhZ2VzTmFtZT0idGhlV29ya3NwYWNlRXJyb3JNZXNzYWdlcyIgLyZndDsKLSZsdDtlY2hvIG1lc3NhZ2U9IndvcmtzcGFjZUdldEVycm9yczoKLQl3b3Jrc3BhY2UgRXJyb3IrV2FybmluZyBDb3VudD0ke3RoZVdvcmtzcGFjZUVycm9yQ291bnR9Ci0Jd29ya3NwYWNlIEVycm9yK1dhcm5pbmcgTWVzc2FnZXM9JHt0aGVXb3Jrc3BhY2VFcnJvck1lc3NhZ2VzfSIgLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotIDwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwiIHRpdGxlPSIiPkdlbmVyYWwgQW50IHRhc2tzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjYXB0dXJlcyBBbnQgYnVpbGQgbWVzc2FnZXMgYW5kIGFsbG93cyB0aGVtIHRvIGJlIHNlYXJjaGVkIG9yIGRpc3BsYXllZCwgYW5kIGFsbG93cyBjb25kaXRpb25hbCBBbnQgYnVpbGQgZmFpbHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuIj5jYXB0dXJlQnVpbGRNZXNzYWdlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjb21waWxldy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgamF2YWMuIFdoaWxlIHRoaXMgdGFzayBpcyBydW5uaW5nLCBhbGwgdGhlIHZhbGlkYXRpb24gYW5kIG90aGVyIGJ1aWxkZXJzIGFyZSB0dXJuZWQgb2YiPmNvbXBpbGVXb3Jrc3BhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0ai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9yIGNvdW50IGZvciB0aGUgbGFzdCBpbnRlcm5hbCBqYXZhYyBjb21waWxhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5nZXRKYXZhY0Vycm9yQ291bnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0cC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGluZm9ybWF0aW9uLiI+Z2V0UHJvamVjdERhdGE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5wcm9qZWN0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgcHJvamVjdEJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyBwcm9qZWN0IGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkiPnByb2plY3RHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gcHJvamVjdCBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0YnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgYSBzZXQgb2YgRWNsaXBzZSBwcm9qZWN0cyB1c2luZyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoJiMzNDtQU0YmIzM0OykuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLCBhbmQgdGhlbiB0aGUgdGFzayBwcm9qZWN0U2V0SW1wb3J0IG11c3QgaGF2ZSBiZWVuIHVzZWQgdG8gaW1wb3J0IHRob3NlIHByb2plY3RzIGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0U2V0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdHNldGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgRWNsaXBzZSB0ZWFtIFByb2plY3QgU2V0IEZpbGUgKFBTRikgaW50byBhIHdvcmtzcGFjZS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbSAmIzM0O1Byb2plY3QgU2V0IEV4cG9ydCYjMzQ7IGNvbW1hbmQuIj5wcm9qZWN0U2V0SW1wb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHNldGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIHRoZSBpbnRlcm5hbCBKYXZhIGNvbXBpbGF0aW9uIGRlYnVnIGxldmVsLCBhbmQgcmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5ncy4iPnNldERlYnVnSW5mbzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VidWlsZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4iPndvcmtzcGFjZUJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VmaWxlLmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgcmVhZHMgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMgYW5kIHNldHMgdGhvc2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlRmlsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZ2V0Lmh0bWwiIHRpdGxlPSJUaGlzIHRhc2sgZ2V0cyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcy4iPndvcmtzcGFjZVByZWZlcmVuY2VHZXQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZXNldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIHNldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlU2V0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VmaWxlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWZpbGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1MmMzNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWZpbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLQotCi0KLQotCi0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT53b3Jrc3BhY2VQcmVmZXJlbmNlRmlsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFudHdvcmtzcGFjZXByZWZlcmVuY2VmaWxlIj48YSBuYW1lPSJ0YW50d29ya3NwYWNlcHJlZmVyZW5jZWZpbGUiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+d29ya3NwYWNlUHJlZmVyZW5jZUZpbGU8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgcmVhZHMgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMKLWFuZCBzZXRzIHRob3NlIHByZWZlcmVuY2VzLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhcmFtZXRlcnM8L3NwYW4+PC9wPgotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHI+PHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaWQ9ImQwZTIwIj5BdHRyaWJ1dGU8L3RoPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBpZD0iZDBlMjIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBpZD0iZDBlMjQiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMCAiPlByZWZlcmVuY2VGaWxlTmFtZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgY29udGFpbmluZyBzb3Jrc3BhY2UgcHJlZmVyZW5jZSA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI0ICI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjAgIj5PdmVyd3JpdGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMiAiPldoZXRoZXIgb3Igbm90IHRvIG92ZXJ3cml0ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZSBpdCBpdCBhbHJlYWR5IGV4aXN0czwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgZGVmYXVsdCBpcyA8ZW0+dHJ1ZTwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjAgIj5GYWlsT25FcnJvcjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+V2hldGhlciBvciBub3QgdGhlIEFudCBidWlsZCBzaG91bGQgZmFpbCBpZiB0aGVyZSB3YXMKLWFuIGVycm9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT50cnVlPC9lbT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeGFtcGxlczwvc3Bhbj48L3A+Ci08dWw+PGxpPlJlYWQgYSBwcmVmZXJlbmNlIHByb3BlcnR5IGZpbGUgYW5kIHNldCBpdHMgY29udGFpbmVkIHdvcmtzcGFjZSBwcmVmZXJlbmNlczo8cHJlPiZsdDt3b3Jrc3BhY2VQcmVmZXJlbmNlRmlsZSAKLQlQcmVmZXJlbmNlRmlsZU5hbWU9Ilg6L015UGF0aC9NeVNldHRpbmdzLnByZWZlcmVuY2VzIiAKLQlPdmVyd3JpdGU9InRydWUiIAotCWZhaWxvbmVycm9yPSJ0cnVlIiAvJmd0OzwvcHJlPgotPC9saT4KLTxsaT5TYW1wbGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+TXlTZXR0aW5ncy5wcmVmZXJlbmNlczwvc2FtcD4gZmlsZTo8cHJlPiMKLWNsYXNzcGF0aFZhcmlhYmxlLldBU181MV9QTFVHSU5ESVI9RjovV0FTNTEvQXBwU2VydmVyCi0jCi1jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1pZ25vcmUKLWNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9aWdub3JlCi1jb21waWxlci5zb3VyY2U9MS40Ci0jCi1idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLWNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi0jCi10YXJnZXRSdW50aW1lLnJ1bnRpbWVUeXBlSWQ9Y29tLmlibS5ldG9vbHMud2Vic3BoZXJlLnJ1bnRpbWUudjUxLmJhc2UKLXRhcmdldFJ1bnRpbWUudGFyZ2V0TG9jYXRpb249RjovV0FTNTEvQXBwU2VydmVyCi10YXJnZXRSdW50aW1lLnRhcmdldE5hbWU9YnVpbGRFeGFtcGxlV0FTNTE8L3ByZT4KLTwvbGk+Ci08L3VsPgotIDwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwiIHRpdGxlPSIiPkdlbmVyYWwgQW50IHRhc2tzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjYXB0dXJlcyBBbnQgYnVpbGQgbWVzc2FnZXMgYW5kIGFsbG93cyB0aGVtIHRvIGJlIHNlYXJjaGVkIG9yIGRpc3BsYXllZCwgYW5kIGFsbG93cyBjb25kaXRpb25hbCBBbnQgYnVpbGQgZmFpbHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuIj5jYXB0dXJlQnVpbGRNZXNzYWdlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjb21waWxldy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgamF2YWMuIFdoaWxlIHRoaXMgdGFzayBpcyBydW5uaW5nLCBhbGwgdGhlIHZhbGlkYXRpb24gYW5kIG90aGVyIGJ1aWxkZXJzIGFyZSB0dXJuZWQgb2YiPmNvbXBpbGVXb3Jrc3BhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0ai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9yIGNvdW50IGZvciB0aGUgbGFzdCBpbnRlcm5hbCBqYXZhYyBjb21waWxhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5nZXRKYXZhY0Vycm9yQ291bnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0cC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGluZm9ybWF0aW9uLiI+Z2V0UHJvamVjdERhdGE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5wcm9qZWN0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgcHJvamVjdEJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyBwcm9qZWN0IGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkiPnByb2plY3RHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gcHJvamVjdCBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0YnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgYSBzZXQgb2YgRWNsaXBzZSBwcm9qZWN0cyB1c2luZyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoJiMzNDtQU0YmIzM0OykuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLCBhbmQgdGhlbiB0aGUgdGFzayBwcm9qZWN0U2V0SW1wb3J0IG11c3QgaGF2ZSBiZWVuIHVzZWQgdG8gaW1wb3J0IHRob3NlIHByb2plY3RzIGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0U2V0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdHNldGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgRWNsaXBzZSB0ZWFtIFByb2plY3QgU2V0IEZpbGUgKFBTRikgaW50byBhIHdvcmtzcGFjZS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbSAmIzM0O1Byb2plY3QgU2V0IEV4cG9ydCYjMzQ7IGNvbW1hbmQuIj5wcm9qZWN0U2V0SW1wb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHNldGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIHRoZSBpbnRlcm5hbCBKYXZhIGNvbXBpbGF0aW9uIGRlYnVnIGxldmVsLCBhbmQgcmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5ncy4iPnNldERlYnVnSW5mbzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VidWlsZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4iPndvcmtzcGFjZUJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIEl0IGlzIGEgc3Vic2V0IG9mIHRoZSB3b3Jrc3BhY2VCdWlsZCB0YXNrIChpdCBkb2VzIG5vdCBkbyBhIGJ1aWxkLCBpdCBqdXN0IGdldHMgd29ya3NwYWNlIGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkuIj53b3Jrc3BhY2VHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgRWNsaXBzZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuIj53b3Jrc3BhY2VQcmVmZXJlbmNlR2V0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VzZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZVNldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZ2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ5MDg3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlZ2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLQotCi0KLQotCi0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT53b3Jrc3BhY2VQcmVmZXJlbmNlR2V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YW50d29ya3NwYWNlcHJlZmVyZW5jZWdldCI+PGEgbmFtZT0idGFudHdvcmtzcGFjZXByZWZlcmVuY2VnZXQiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+d29ya3NwYWNlUHJlZmVyZW5jZUdldDwvaDE+Ci08ZGl2PjxwPlRoaXMgdGFzayBnZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhcmFtZXRlcnM8L3NwYW4+PC9wPgotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHI+PHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaWQ9ImQwZTIwIj5BdHRyaWJ1dGU8L3RoPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBpZD0iZDBlMjIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBpZD0iZDBlMjQiPlJlcXVpcmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMCAiPlByZWZlcmVuY2VUeXBlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjIgIj5UaGUgdHlwZSBvZiBwcmVmZXJlbmNlIHRvIGJlIHNldDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjQgIj5ZZXMuIE1heSBiZSA8ZW0+Y29tcGlsZXI8L2VtPiBvciA8ZW0+Y2xhc3NwYXRoVmFyaWFibGU8L2VtPiBvciA8ZW0+Y2xhc3NwYXRoPC9lbT4gb3IgPGVtPmJ1aWxkZXI8L2VtPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+UHJlZmVyZW5jZU5hbWU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMiAiPlRoZSBwcmVmZXJlbmNlIG5hbWUgdG8gYmUgc2V0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNCAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+UHJvcGVydHlOYW1lPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjIgIj5Qcm9wZXJ0eSB0byByZWNlaXZlIHRoZSBwcmVmZXJlbmNlIHZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNCAiPlllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGhlYWRlcnM9ImQwZTIwICI+RmFpbE9uRXJyb3I8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTYuODQyMTA1MjYzMTU3ODklIiBoZWFkZXJzPSJkMGUyMiAiPldoZXRoZXIgb3Igbm90IHRoZSBBbnQgYnVpbGQgc2hvdWxkIGZhaWwgaWYgdGhlcmUgd2FzCi1hbiBlcnJvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgZGVmYXVsdCBpcyA8ZW0+dHJ1ZTwvZW0+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhhbXBsZXM8L3NwYW4+PC9wPgotPHVsPjxsaT5HZXQgYW5kIGRpc3BsYXkgYSB3b3Jrc3BhY2UgcHJlZmVyZW5jZTo8cHJlPiZsdDt3b3Jrc3BhY2VQcmVmZXJlbmNlR2V0IAotCXByZWZlcmVuY2VUeXBlPSJjb21waWxlciIgCi0JcHJlZmVyZW5jZW5hbWU9InByb2JsZW0udW51c2VkSW1wb3J0IiAKLQlQcm9wZXJ0eU5hbWU9InVudXNlZEltcG9ydCIgLyZndDsKLSZsdDtlY2hvIG1lc3NhZ2U9ImNvbXBpbGVyIHByb2JsZW0udW51c2VkSW1wb3J0PSR7dW51c2VkSW1wb3J0fSIgLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotIDwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwiIHRpdGxlPSIiPkdlbmVyYWwgQW50IHRhc2tzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjYXB0dXJlcyBBbnQgYnVpbGQgbWVzc2FnZXMgYW5kIGFsbG93cyB0aGVtIHRvIGJlIHNlYXJjaGVkIG9yIGRpc3BsYXllZCwgYW5kIGFsbG93cyBjb25kaXRpb25hbCBBbnQgYnVpbGQgZmFpbHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuIj5jYXB0dXJlQnVpbGRNZXNzYWdlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjb21waWxldy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgamF2YWMuIFdoaWxlIHRoaXMgdGFzayBpcyBydW5uaW5nLCBhbGwgdGhlIHZhbGlkYXRpb24gYW5kIG90aGVyIGJ1aWxkZXJzIGFyZSB0dXJuZWQgb2YiPmNvbXBpbGVXb3Jrc3BhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0ai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9yIGNvdW50IGZvciB0aGUgbGFzdCBpbnRlcm5hbCBqYXZhYyBjb21waWxhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5nZXRKYXZhY0Vycm9yQ291bnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0cC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGluZm9ybWF0aW9uLiI+Z2V0UHJvamVjdERhdGE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5wcm9qZWN0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgcHJvamVjdEJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyBwcm9qZWN0IGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkiPnByb2plY3RHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gcHJvamVjdCBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0YnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgYSBzZXQgb2YgRWNsaXBzZSBwcm9qZWN0cyB1c2luZyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoJiMzNDtQU0YmIzM0OykuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLCBhbmQgdGhlbiB0aGUgdGFzayBwcm9qZWN0U2V0SW1wb3J0IG11c3QgaGF2ZSBiZWVuIHVzZWQgdG8gaW1wb3J0IHRob3NlIHByb2plY3RzIGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0U2V0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdHNldGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgRWNsaXBzZSB0ZWFtIFByb2plY3QgU2V0IEZpbGUgKFBTRikgaW50byBhIHdvcmtzcGFjZS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbSAmIzM0O1Byb2plY3QgU2V0IEV4cG9ydCYjMzQ7IGNvbW1hbmQuIj5wcm9qZWN0U2V0SW1wb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHNldGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIHRoZSBpbnRlcm5hbCBKYXZhIGNvbXBpbGF0aW9uIGRlYnVnIGxldmVsLCBhbmQgcmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5ncy4iPnNldERlYnVnSW5mbzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VidWlsZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4iPndvcmtzcGFjZUJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIEl0IGlzIGEgc3Vic2V0IG9mIHRoZSB3b3Jrc3BhY2VCdWlsZCB0YXNrIChpdCBkb2VzIG5vdCBkbyBhIGJ1aWxkLCBpdCBqdXN0IGdldHMgd29ya3NwYWNlIGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkuIj53b3Jrc3BhY2VHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWZpbGUuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayByZWFkcyBhIHByb3BlcnR5IGZpbGUgY29udGFpbmluZyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcyBhbmQgc2V0cyB0aG9zZSBwcmVmZXJlbmNlcy4iPndvcmtzcGFjZVByZWZlcmVuY2VGaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VzZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZVNldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlc2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZXNldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGI0YmI1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlc2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi0KLQotCi0KLQotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+d29ya3NwYWNlUHJlZmVyZW5jZVNldDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFudHdvcmtzcGFjZXByZWZlcmVuY2VzZXQiPjxhIG5hbWU9InRhbnR3b3Jrc3BhY2VwcmVmZXJlbmNlc2V0Ij48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPndvcmtzcGFjZVByZWZlcmVuY2VTZXQ8L2gxPgotPGRpdj48cD5UaGlzIHRhc2sgc2V0cyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXJhbWV0ZXJzPC9zcGFuPjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyPjx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjIxLjA1MjYzMTU3ODk0NzM2NiUiIGlkPSJkMGUyMCI+QXR0cmlidXRlPC90aD4KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaWQ9ImQwZTIyIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaWQ9ImQwZTI0Ij5SZXF1aXJlZDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT48dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjAgIj5QcmVmZXJlbmNlVHlwZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+VGhlIHR5cGUgb2YgcHJlZmVyZW5jZSB0byBiZSBzZXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjIyLjEwNTI2MzE1Nzg5NDczNiUiIGhlYWRlcnM9ImQwZTI0ICI+WWVzLiBNYXkgYmUgPGVtPmNvbXBpbGVyPC9lbT4gb3IgPGVtPmNsYXNzcGF0aFZhcmlhYmxlPC9lbT4gb3IgPGVtPmNsYXNzcGF0aDwvZW0+IG9yIDxlbT5idWlsZGVyPC9lbT48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMCAiPlByZWZlcmVuY2VOYW1lPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU2Ljg0MjEwNTI2MzE1Nzg5JSIgaGVhZGVycz0iZDBlMjIgIj5UaGUgcHJlZmVyZW5jZSBuYW1lIHRvIGJlIHNldDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjQgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMCAiPlByZWZlcmVuY2VWYWx1ZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+VGhlIHZhbHVlIHRvIGJlIHNldDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjQgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMS4wNTI2MzE1Nzg5NDczNjYlIiBoZWFkZXJzPSJkMGUyMCAiPk92ZXJ3cml0ZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+V2hldGhlciBvciBub3QgdG8gb3ZlcndyaXRlIHRoZSBwcmVmZXJlbmNlIHZhbHVlIGl0Ci1pdCBhbHJlYWR5IGV4aXN0czwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjIuMTA1MjYzMTU3ODk0NzM2JSIgaGVhZGVycz0iZDBlMjQgIj5ObywgZGVmYXVsdCBpcyA8ZW0+dHJ1ZTwvZW0+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjEuMDUyNjMxNTc4OTQ3MzY2JSIgaGVhZGVycz0iZDBlMjAgIj5GYWlsT25FcnJvcjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Ni44NDIxMDUyNjMxNTc4OSUiIGhlYWRlcnM9ImQwZTIyICI+V2hldGhlciBvciBub3QgdGhlIEFudCBidWlsZCBzaG91bGQgZmFpbCBpZiB0aGVyZSB3YXMKLWFuIGVycm9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMi4xMDUyNjMxNTc4OTQ3MzYlIiBoZWFkZXJzPSJkMGUyNCAiPk5vLCBkZWZhdWx0IGlzIDxlbT50cnVlPC9lbT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeGFtcGxlczwvc3Bhbj48L3A+Ci08dWw+PGxpPlNldCB2YXJpb3VzIHdvcmtzcGFjZSBwcmVmZXJlbmNlczo8cHJlPiZsdDt3b3Jrc3BhY2VQcmVmZXJlbmNlU2V0IAotCVByZWZlcmVuY2VUeXBlPSJjb21waWxlciIgCi0JUHJlZmVyZW5jZW5hbWU9InByb2JsZW0udW51c2VkSW1wb3J0IiAKLQlQcmVmZXJlbmNlVmFsdWU9Imlnbm9yZSIgLyZndDsKLSZsdDt3b3Jrc3BhY2VQcmVmZXJlbmNlU2V0IAotCVByZWZlcmVuY2VUeXBlPSJjb21waWxlciIgCi0JUHJlZmVyZW5jZW5hbWU9InByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXIiIAotCVByZWZlcmVuY2VWYWx1ZT0iaWdub3JlIiAvJmd0OwotJmx0O3dvcmtzcGFjZVByZWZlcmVuY2VTZXQgCi0JUHJlZmVyZW5jZVR5cGU9ImNsYXNzcGF0aFZhcmlhYmxlIiAKLQlQcmVmZXJlbmNlbmFtZT0iV0FTX1BMVUdJTkRJUiIgCi0JUHJlZmVyZW5jZVZhbHVlPSJGOi9XdGU1MS9BcHBTZXJ2ZXIiIC8mZ3Q7Ci0mbHQ7d29ya3NwYWNlUHJlZmVyZW5jZVNldCAKLQlQcmVmZXJlbmNlVHlwZT0iY2xhc3NwYXRoIiAKLQlQcmVmZXJlbmNlbmFtZT0iZXhjbHVzaW9uUGF0dGVybnMiIAotCVByZWZlcmVuY2VWYWx1ZT0iZW5hYmxlZCIgLyZndDsKLSZsdDt3b3Jrc3BhY2VQcmVmZXJlbmNlU2V0IAotCVByZWZlcmVuY2VUeXBlPSJidWlsZGVyIiAKLQlQcmVmZXJlbmNlbmFtZT0iaW52YWxpZENsYXNzcGF0aCIgCi0JUHJlZmVyZW5jZVZhbHVlPSJhYm9ydCIgLyZndDs8L3ByZT4KLTwvbGk+Ci08L3VsPgotIDwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1hbnRnZW5lcmFsLmh0bWwiIHRpdGxlPSIiPkdlbmVyYWwgQW50IHRhc2tzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Y2FwdHVyZWJ1aWxkbWVzc2FnZXMuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBjYXB0dXJlcyBBbnQgYnVpbGQgbWVzc2FnZXMgYW5kIGFsbG93cyB0aGVtIHRvIGJlIHNlYXJjaGVkIG9yIGRpc3BsYXllZCwgYW5kIGFsbG93cyBjb25kaXRpb25hbCBBbnQgYnVpbGQgZmFpbHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWVkIHN0cmluZyBpcyBpbiB0aGUgY2FwdHVyZWQgYnVpbGQgbWVzc2FnZXMuIj5jYXB0dXJlQnVpbGRNZXNzYWdlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRjb21waWxldy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGNvbXBpbGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgamF2YWMuIFdoaWxlIHRoaXMgdGFzayBpcyBydW5uaW5nLCBhbGwgdGhlIHZhbGlkYXRpb24gYW5kIG90aGVyIGJ1aWxkZXJzIGFyZSB0dXJuZWQgb2YiPmNvbXBpbGVXb3Jrc3BhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0ai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9yIGNvdW50IGZvciB0aGUgbGFzdCBpbnRlcm5hbCBqYXZhYyBjb21waWxhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5nZXRKYXZhY0Vycm9yQ291bnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50Z2V0cC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGluZm9ybWF0aW9uLiI+Z2V0UHJvamVjdERhdGE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvai5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuIj5wcm9qZWN0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJdCBpcyBhIHN1YnNldCBvZiB0aGUgcHJvamVjdEJ1aWxkIHRhc2sgKGl0IGRvZXMgbm90IGRvIGEgYnVpbGQsIGl0IGp1c3QgZ2V0cyBwcm9qZWN0IGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkiPnByb2plY3RHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gcHJvamVjdCBpbnRvIGEgd29ya3NwYWNlLiI+cHJvamVjdEltcG9ydDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnRwcm9qZWN0c2V0YnVpbGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBidWlsZHMgYSBzZXQgb2YgRWNsaXBzZSBwcm9qZWN0cyB1c2luZyBhbiBleGlzdGluZyBFY2xpcHNlIHRlYW0gUHJvamVjdCBTZXQgRmlsZSAoJiMzNDtQU0YmIzM0OykuIFRoZSBQU0YgbXVzdCBoYXZlIGJlZW4gZmlyc3QgY3JlYXRlZCB1c2luZyBhbiBFY2xpcHNlIHRlYW0gJiMzNDtQcm9qZWN0IFNldCBFeHBvcnQmIzM0OyBjb21tYW5kLCBhbmQgdGhlbiB0aGUgdGFzayBwcm9qZWN0U2V0SW1wb3J0IG11c3QgaGF2ZSBiZWVuIHVzZWQgdG8gaW1wb3J0IHRob3NlIHByb2plY3RzIGludG8gYSB3b3Jrc3BhY2UuIj5wcm9qZWN0U2V0QnVpbGQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50cHJvamVjdHNldGltcG9ydC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGltcG9ydHMgYW4gZXhpc3RpbmcgRWNsaXBzZSB0ZWFtIFByb2plY3QgU2V0IEZpbGUgKFBTRikgaW50byBhIHdvcmtzcGFjZS4gVGhlIFBTRiBtdXN0IGhhdmUgYmVlbiBmaXJzdCBjcmVhdGVkIHVzaW5nIGFuIEVjbGlwc2UgdGVhbSAmIzM0O1Byb2plY3QgU2V0IEV4cG9ydCYjMzQ7IGNvbW1hbmQuIj5wcm9qZWN0U2V0SW1wb3J0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHNldGQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBzZXRzIHRoZSBpbnRlcm5hbCBKYXZhIGNvbXBpbGF0aW9uIGRlYnVnIGxldmVsLCBhbmQgcmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5ncy4iPnNldERlYnVnSW5mbzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhbnR3b3Jrc3BhY2VidWlsZC5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGJ1aWxkcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4iPndvcmtzcGFjZUJ1aWxkPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZWdldGVycm9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YXNrIGdldHMgdGhlIGVycm9ycyBmb3IgdGhlIGVudGlyZSB3b3Jrc3BhY2UuIEl0IGlzIGEgc3Vic2V0IG9mIHRoZSB3b3Jrc3BhY2VCdWlsZCB0YXNrIChpdCBkb2VzIG5vdCBkbyBhIGJ1aWxkLCBpdCBqdXN0IGdldHMgd29ya3NwYWNlIGVycm9ycyByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHdlcmUgY3JlYXRlZCkuIj53b3Jrc3BhY2VHZXRFcnJvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YW50d29ya3NwYWNlcHJlZmVyZW5jZWZpbGUuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayByZWFkcyBhIHByb3BlcnR5IGZpbGUgY29udGFpbmluZyBFY2xpcHNlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcyBhbmQgc2V0cyB0aG9zZSBwcmVmZXJlbmNlcy4iPndvcmtzcGFjZVByZWZlcmVuY2VGaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFudHdvcmtzcGFjZXByZWZlcmVuY2VnZXQuaHRtbCIgdGl0bGU9IlRoaXMgdGFzayBnZXRzIEVjbGlwc2Ugd29ya3NwYWNlIHByZWZlcmVuY2VzLiI+d29ya3NwYWNlUHJlZmVyZW5jZUdldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqYW50Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amFudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWZiNzkyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqYW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5Xb3JraW5nIHdpdGggQW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amFudCI+PGEgbmFtZT0idGphbnQiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIEFudDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5BbnQgc3VwcG9ydCBpcyBwcm92aWRlZCBhcyBhIGJ1aWx0LWluIGZlYXR1cmUgb2YgdGhlIHdvcmtiZW5jaC4KLUlmIHlvdSByaWdodC1jbGljayBhbnkgWE1MIGZpbGUgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SdW4gQW50PC9zcGFuPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUsIHRoZSBFeGVjdXRlIEFudCBTY3JpcHQgZGlhbG9nIHNob3dzIHRoZSBhdmFpbGFibGUgQW50IHRhcmdldHMuCi1Zb3UgY2FuIGNoZWNrLCBpbiBzZXF1ZW5jZSwgd2hpY2ggb25lcyBhcmUgdG8gYmUgZXhlY3V0ZWQsIGFuZCB0aGUgZXhlY3V0aW9uCi1zZXF1ZW5jZSB3aWxsIGJlIHNob3duIGJlc2lkZSBlYWNoIHRhcmdldC4gWW91IGNhbiBhbHNvIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EaXNwbGF5Ci1leGVjdXRpb24gbG9nIHRvIEFudCBjb25zb2xlPC9zcGFuPiwgd2hpY2ggd2lsbCBjYXVzZSBhbnkgQW50IG1lc3NhZ2VzCi10byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEFudCBDb25zb2xlIHZpZXcgKDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBlcnNwZWN0aXZlPC9zcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNob3cKLVZpZXc8L3NwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QW50PC9zcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFudAotQ29uc29sZTwvc3Bhbj4pLjwvcD4KLTxwPkluIGFkZGl0aW9uLCBhbiBBcmd1bWVudHMgZmllbGQgbGV0cyB5b3UgcGFzcwotYXJndW1lbnRzLCBzdWNoIGFzIDxzYW1wIGNsYXNzPSJjb2RlcGgiPi12ZXJib3NlPC9zYW1wPiwgdG8gdGhlIEFudCBwcm9ncmFtLiBJZiB0aGUgQW50Ci1zY3JpcHQgaW52b2tlcyB0aGUgQW50IDxzYW1wIGNsYXNzPSJjb2RlcGgiPmphdmFjPC9zYW1wPiB0YXNrLCB0aGVuIGEgc3BlY2lhbCA8c2FtcCBjbGFzcz0iY29kZXBoIj4tRGJ1aWxkLmNvbXBpbGVyPW9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC5jb3JlLkpEVENvbXBpbGVyQWRhcHRlcjwvc2FtcD4gYXJndW1lbnQgbXVzdCBiZSBwYXNzZWQgb3IgeW91IHdpbGwgZ2V0IGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Q2Fubm90IHVzZSBjbGFzc2ljIGNvbXBpbGVyPC9zYW1wPiBlcnJvci4gPC9wPgotPHA+SWYKLXlvdSB1c2UgdGhlIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5kZXByZWNhdGlvbj0ib24iPC9zYW1wPiBvcHRpb24gZm9yIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5qYXZhYzwvc2FtcD4gQW50Ci10YXNrLCBXZWJTcGhlcmU8c3VwPsKuPC9zdXA+IFN0dWRpbwotd2lsbCBjcmFzaC4gWW91IHNob3VsZCBlaXRoZXIgc3BlY2lmeSBub3RoaW5nIG9yIHVzZSA8dHQ+ZGVwcmVjYXRpb249Im9mZiI8L3R0Pi48L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSB0aGUgZm9sbG93aW5nIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmVjaG8ueG1sPC9zYW1wPiBmaWxlIGluc2lkZSBhbnkKLXByb2plY3QgaW4geW91ciB3b3Jrc3BhY2U6PC9zcGFuPiA8cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICAgJmx0O3Byb2plY3QgbmFtZT0iRWNobyIgZGVmYXVsdD0iZWNobyIgYmFzZWRpcj0iLiImZ3Q7Ci0gICAgICAmbHQ7dGFyZ2V0IG5hbWU9ImVjaG8iJmd0OwotICAgICAgICAgJmx0O2VjaG8gbWVzc2FnZT0iSEVMTE8gZnJvbSBlY2hvIi8mZ3Q7Ci0gICAgICAmbHQ7L3RhcmdldCZndDsKLSAgICAgICZsdDt0YXJnZXQgbmFtZT0iZGlyIiZndDsKLSAgICAgICAgICZsdDtlY2hvIG1lc3NhZ2U9ImRpciBvZiAke2Jhc2VkaXJ9OiIvJmd0OwotICAgICAgICAgJmx0O2V4ZWMgZGlyPSIke2Jhc2VkaXJ9IiBleGVjdXRhYmxlPSJjbWQuZXhlIiZndDsKLSAgICAgICAgICAgICZsdDthcmcgbGluZT0iL2MgZGlyIi8mZ3Q7Ci0gICAgICAgICAmbHQ7L2V4ZWMmZ3Q7Ci0gICAgICAmbHQ7L3RhcmdldCZndDsKLSAgICZsdDsvcHJvamVjdCZndDs8L3ByZT4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0LWNsaWNrIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmVjaG8ueG1sPC9zYW1wPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJ1bgotQW50PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIFJ1biBBbnQgZGlhbG9nIHNob3dzIHRoYXQgeW91IGhhdmUgdHdvIHRhcmdldHMsIGVjaG8gYW5kIGRpciwKLWFuZCB0aGF0IGVjaG9bMV0gaXMgdGhlIGRlZmF1bHQgdGFyZ2V0IHRoYXQgd2lsbCBiZSBleGVjdXRlZC4gSWYgeW91IGFsc28KLXNlbGVjdCBkaXIsIGl0IHdpbGwgY2hhbmdlIHRvIGRpclsyXSBhbmQgaXQgd2lsbCBiZSBydW4gYXMgdGhlIHNlY29uZCB0YXJnZXQuCi1FbnN1cmUgdGhhdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EaXNwbGF5IGV4ZWN1dGlvbiBsb2cgdG8gQW50IGNvbnNvbGU8L3NwYW4+IGlzCi1jaGVja2VkIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LiBUaGUgc2NyaXB0IHdpbGwgdGhlbiBiZSBydW4uPC9zcGFuPiAgVGhlIHJlc3VsdHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgQW50IENvbnNvbGUuPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQtY2xpY2sgPHNhbXAgY2xhc3M9ImNvZGVwaCI+ZWNoby54bWw8L3NhbXA+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuCi1BbnQ8L3NwYW4+IHRvIHJ1biBpdCBhZ2Fpbi4gVGhpcyB0aW1lIGVudGVyIDx0dD4tdmVyYm9zZTwvdHQ+IGluIHRoZQotYXJndW1lbnRzIGVudHJ5IGZpZWxkLCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0iZXhhbXBsZSI+VHJ5IGVkaXRpbmcgeW91ciA8c2FtcCBjbGFzcz0iY29kZXBoIj5lY2hvLnhtbDwvc2FtcD4gZmlsZSB0byBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YmFkPC9zYW1wPiB0YXJnZXQKLXdpdGggYSBub25leGlzdGVudCB0YXNrIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnByb3BlcnR5QmFkPC9zYW1wPjo8cHJlPiZsdDt0YXJnZXQgbmFtZT0iYmFkIiZndDsKLSAgICZsdDtwcm9wZXJ0eUJBRCBuYW1lPSJNeU5hbWUiIHZhbHVlPSJNeVZhbHVlIi8mZ3Q7Ci0mbHQ7L3RhcmdldCZndDs8L3ByZT4KLTxwPlJpZ2h0LWNsaWNrIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmVjaG8ueG1sPC9zYW1wPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJ1bgotQW50PC9zcGFuPiB0byBydW4gaXQgYWdhaW4uIFNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5iYWQ8L3NwYW4+IGFzIHlvdXIKLXRhcmdldCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi4gWW91IHdpbGwgcmVjZWl2ZSB0aGUgZm9sbG93aW5nCi1lcnJvciBtZXNzYWdlLCBsaXN0ZWQgdHdpY2U6ICJDb3VsZCBub3QgY3JlYXRlIHRhc2sgb2YgdHlwZTogPHNhbXAgY2xhc3M9ImNvZGVwaCI+cHJvcGVydHlCYWQ8L3NhbXA+IgotaW4gdGhlIFByb2JsZW1zIHZpZXcuIFlvdSBjYW4gcGFydGx5IGZpeCB0aGlzIGJ5IGNoYW5naW5nIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnByb3BlcnR5QmFkPC9zYW1wPiB0bwotcHJvcGVydHksIGFuZCB0aGVuIHNhdmluZyA8c2FtcCBjbGFzcz0iY29kZXBoIj5lY2hvLnhtbDwvc2FtcD4uIFRoZSBlcnJvcnMgaW4gdGhlIFRhc2sKLXZpZXcgd2lsbCByZW1haW4sIGJlY2F1c2UgdGhlIGVycm9ycyBhcmUgQW50IHJ1bnRpbWUgZXJyb3JzLiBJZiB5b3UgcnVuIEFudAotYWdhaW4sIHRoZSBlcnJvciBtZXNzYWdlcyB3aWxsIGRpc2FwcGVhci48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9jamFudC5odG1sIj5BbnQgc3VwcG9ydDwvYT48L3N0cm9uZz48YnIgLz4KLVRoaXMgdG9waWMgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIEFudCBzdXBwb3J0IHByb3ZpZGVkIGluCi10aGUgd29ya2JlbmNoLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YW50aG9tZS5odG1sIj5FeHRlbmRlZCBBbnQgU3VwcG9ydCAtIG92ZXJ2aWV3PC9hPjwvc3Ryb25nPjxiciAvPgotWW91IGNhbiB1c2UgdGhlIFJ1biBBTlQgb3B0aW9uIHRvIGNoZWNrIHlvdXIgYnVpbGQgZW52aXJvbm1lbnQKLW9yIHVzZSB0aGUgY29tbWFuZCBsaW5lIGJhdGNoIGZpbGUgcHJvdmlkZWQgZm9yIHJlcGV0aXRpdmUgYnVpbGRzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90amFudGhlYWRsZXNzLmh0bWwiPlJ1bm5pbmcgQW50IGluIGEgaGVhZGxlc3Mgd29ya3NwYWNlPC9hPjwvc3Ryb25nPjxiciAvPgotWW91IGNhbiB1c2UgQW50IHRvIHJ1biBhIHdvcmtiZW5jaCB3aXRoIG5vIGludGVyZmFjZSBhbmQgcnVuIHNwZWNpZmllZAotQW50IHNjcmlwdHMuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqYW50dXBncmFkZS5odG1sIj5VcGdyYWRpbmcgQW50PC9hPjwvc3Ryb25nPjxiciAvPgotQW50IDEuNi4xIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBwcm9kdWN0LiBJZiB5b3UgbmVlZAotZnVuY3Rpb25hbGl0eSBmcm9tIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgQW50LCB5b3UgY2FuIGRvd25sb2FkIGFuZCBpbnN0YWxsCi1hbiB1cGRhdGVkIHZlcnNpb24uPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3BoLWFudGdlbmVyYWwuaHRtbCI+R2VuZXJhbCBBbnQgdGFza3M8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcGgtYW50ajJlZS5odG1sIj5BbnQgdGFza3MgZm9yIEoyRUU8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcGgtYW50ZWpiLmh0bWwiPkFudCB0YXNrcyBmb3IgRUpCLWVuYWJsZWQgdG9vbHM8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGFudGV4YW1wbGVhdXRvYnVpbGQuaHRtbCI+RXhhbXBsZTogQXV0b21hdGVkIEFudCBidWlsZDwvYT48L3N0cm9uZz48YnIgLz4KLVRoaXMgZXhhbXBsZSBwcm9ncmFtIHNob3dzIGEgdHlwaWNhbCBhdXRvbWF0ZWQgYnVpbGQgdXNpbmcgdGhlCi13b3JrYmVuY2ggQW50IHRhc2tzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YW50ZXhhbXBsZWF1dG9kZXBsb3kuaHRtbCI+RXhhbXBsZTogQXV0b21hdGVkIEFudCBkZXBsb3k8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGlzIGV4YW1wbGUgcHJvZ3JhbSBzaG93cyBhIHR5cGljYWwgYXV0b21hdGVkIGRlcGxveW1lbnQgdXNpbmcKLXRoZSBXZWJTcGhlcmUgQXBwbGljYXRpb24KLVNlcnZlciBBbnQgdGFza3MuPC9saT4KLTwvdWw+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGphbnRoZWFkbGVzcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGphbnRoZWFkbGVzcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTAxYjY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqYW50aGVhZGxlc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5SdW5uaW5nIEFudCBpbiBhIGhlYWRsZXNzIHdvcmtzcGFjZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGphbnRoZWFkbGVzcyI+PGEgbmFtZT0idGphbnRoZWFkbGVzcyI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SdW5uaW5nIEFudCBpbiBhIGhlYWRsZXNzIHdvcmtzcGFjZTwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gdXNlIEFudCB0byBydW4gYSB3b3JrYmVuY2ggd2l0aCBubyBpbnRlcmZhY2UgYW5kIHJ1biBzcGVjaWZpZWQKLUFudCBzY3JpcHRzLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5JbiB0aGUgcm9vdCBvZiB0aGUgY29tLmlibS5ldG9vbHMuajJlZS5hbnQgcGx1Z2luIGlzIGEgc2FtcGxlCi1iYXRjaCBmaWxlIGNhbGxlZCA8c2FtcCBjbGFzcz0iY29kZXBoIj5ydW5BTlQuYmF0PC9zYW1wPi4gVGhpcyA8c2FtcCBjbGFzcz0iY29kZXBoIj4uYmF0PC9zYW1wPiBmaWxlCi13aWxsIHJ1biBhICJoZWFkbGVzcyIgd29ya2JlbmNoIChubyB1c2VyIGludGVyZmFjZSBmb3IgdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50KQotYW5kIHJ1biBhIHNwZWNpZmllZCBBTlQgc2NyaXB0IGZpbGUgKDxzYW1wIGNsYXNzPSJjb2RlcGgiPmV4YW1wbGUueG1sPC9zYW1wPikuIFRoZSBBTlQKLXNjcmlwdCBmaWxlIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS48L3A+Ci08ZGl2IGNsYXNzPSJwIj5Vc2luZyBydW5BbnQgaGFzIHR3byBhZHZhbnRhZ2VzCi1vdmVyIHRoZSBvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRSdW5uZXIgYXBwbGljYXRpb246ICA8dWw+PGxpPlRoZSB3b3Jrc3BhY2UgaXMgc2F2ZWQgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBzcGVjaWZpZWQgYnVpbGQgZmlsZS48L2xpPgotPGxpPkF1dG9idWlsZCBpcyBkaXNhYmxlZCBkdXJpbmcgQW50IHNjcmlwdCBleGVjdXRpb24gYXMgYSBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudAotYW5kIHRvIGZpeCBhIGtub3duIGxpbWl0YXRpb24gd2l0aCBvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRSdW5uZXIgb24gTGludXg8c3VwPsKuPC9zdXA+LjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBydW4gcnVuQW50IHdpdGggbm8gcGFyYW1ldGVycywgaXQgd2lsbCBwcmVzZW50IGEgc2ltcGxlCi1tZW51IG9mIG9wZXJhdGlvbnMuPC9zcGFuPjx1bD48bGk+TGlzdCB5b3VyIHdvcmtiZW5jaCBwcm9qZWN0czwvbGk+Ci08bGk+UnVuIGFuIEFudCBzY3JpcHQ8L2xpPgotPC91bD4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBzcGVjaWZ5IHBhcmFtZXRlcnMsIGl0IHdpbGwgcGFzcyB0aGVtIHRvIEFudCBpbnNpZGUgdGhlCi13b3JrYmVuY2guIFRyeSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6PC9zcGFuPiA8cHJlPnJ1bkFudCAtYnVpbGRmaWxlIHg6XE1ZV09SS1NQQUNFXE1ZUFJPSkVDVFxlY2hvLnhtbCBlY2hvIGRpcjwvcHJlPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlbiB0cnkgdGhlIGNvbW1hbmQ6PC9zcGFuPiA8cHJlPnJ1bkFudDwvcHJlPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlbiwgeW91IGNhbiB0eXBlIGVpdGhlciA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPjE8L2tiZD4gb3IgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4yPC9rYmQ+IHBsdXMKLXRoZSBmb2xsb3dpbmc6PC9zcGFuPiA8cHJlPi1idWlsZGZpbGUgeDpcTVlXT1JLU1BBQ0VcTVlQUk9KRUNUXGVjaG8ueG1sPC9wcmU+Ci08L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGphbnQuaHRtbCI+V29ya2luZyB3aXRoIEFudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqYW50dXBncmFkZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGphbnR1cGdyYWRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NTY2MzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGphbnR1cGdyYWRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+VXBncmFkaW5nIEFudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGphbnR1cGRncmFkZSI+PGEgbmFtZT0idGphbnR1cGRncmFkZSI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5VcGdyYWRpbmcgQW50PC9oMT4KLTxkaXY+PHA+QW50IDEuNi4xIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBwcm9kdWN0LiBJZiB5b3UgbmVlZAotZnVuY3Rpb25hbGl0eSBmcm9tIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgQW50LCB5b3UgY2FuIGRvd25sb2FkIGFuZCBpbnN0YWxsCi1hbiB1cGRhdGVkIHZlcnNpb24uPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxkaXYgY2xhc3M9ImNhdXRpb250aXRsZSI+Q0FVVElPTjo8L2Rpdj48ZGl2IGNsYXNzPSJjYXV0aW9uIj5JZiB5b3UgY2hhbmdlIHlvdXIgQW50IHZlcnNpb24sIHlvdSBoYXZlIGNoYW5nZWQKLXlvdXIgaW5zdGFsbGF0aW9uIG9mIHRoZSB3b3JrYmVuY2gsIGFuZCBpdCB3aWxsIG5vIGxvbmdlciBiZSBhIHN1cHBvcnRlZCBlbnZpcm9ubWVudC4KLUFsdGhvdWdoIGV2ZXJ5dGhpbmcgc2hvdWxkIHN0aWxsIHdvcmsgYXMgYmVmb3JlLCB1bmV4cGVjdGVkIHJlc3VsdHMgbWF5IG9jY3VyLgotSWYgeW91IGFyZSBmYW1pbGlhciB3aXRoIGRldmVsb3BpbmcgcGx1Zy1pbnMgYW5kIHVuZGVyc3RhbmQgaG93IHRoZXkgYXJlIHVzZWQKLWR1cmluZyBzdGFydHVwLCB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBwbHVnLWluIGRpcmVjdG9yeSB3aXRoIGEgaGlnaGVyIHZlcnNpb24KLW51bWJlciBhbmQgYSBoaWdoZXIgdmVyc2lvbiBudW1iZXIgaW4gaXRzIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnBsdWdpbi54bWw8L3NhbXA+LCBhbmQKLXlvdSBjYW4gbGVhdmUgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeSBhcyBpcy48L2Rpdj4KLTwvZGl2PgotPG9sPjxsaT48c3Bhbj5HbyB0byB0aGUgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL2JpbmluZGV4Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj5KYWthcnRhIEFwYWNoZTwvYT4gV2ViIHNpdGUgYW5kIGRvd25sb2FkCi10aGUgQW50IGJpbmFyeSBkaXN0cmlidXRpb24gdGhhdCB5b3Ugd2FudC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5JbiB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+b3JnLmVjbGlwc2UuYW50LmNvcmU8L3NhbXA+IHBsdWdpbiBkaXJlY3RvcnkgKHVuZGVybmVhdGgKLXdoZXJlIHlvdSBpbnN0YWxsZWQgdGhlIHdvcmtiZW5jaCksIHJlbmFtZSB0aGUgZXhpc3RpbmcgQW50IEpBUiBmaWxlcyBhbmQKLWRyb3AgaW4geW91ciBuZXcgSkFSIGZpbGVzLiBJZiBhbnkgSkFSIGhhcyBhIGRpZmZlcmVudCBuYW1lIGVkaXQgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnBsdWdpbi54bWw8L3NhbXA+IGZpbGUKLWluIDxzYW1wIGNsYXNzPSJjb2RlcGgiPm9yZy5lY2xpcHNlLmFudC5jb3JlPC9zYW1wPiBhY2NvcmRpbmdseS48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5SZXN0YXJ0IHRoZSB3b3JrYmVuY2ggYW5kIHlvdXIgbmV3IHZlcnNpb24gb2YgQW50IHdpbGwgYmUgYWN0aXZlLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGphbnQuaHRtbCI+V29ya2luZyB3aXRoIEFudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqYXBwcHJvai5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGphcHBwcm9qLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYThkN2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGphcHBwcm9qLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5DcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGphcHBwcm9qIj48YSBuYW1lPSJ0amFwcHByb2oiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2gxPgotPGRpdj48cD5Zb3UgY2FuIHVzZSBhIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QKLWFuZCBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiB0aGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IKLWFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLiBBcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBwcm9ncmFtcyB0aGF0Ci1ydW4gb24gbmV0d29ya2VkIGNsaWVudCBzeXN0ZW1zLiBBbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBpcyBkZXBsb3llZAotYXMgYSBKQVIgZmlsZS48L3A+Ci08cD5UbyBjcmVhdGUgYSBKMkVFIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3Q8L3NwYW4+PC9zcGFuPi4gVGhlIE5ldyBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdCB3aW5kb3cgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZCwgdHlwZSBhIG5hbWUgZm9yIHRoZSBhcHBsaWNhdGlvbgotY2xpZW50IHByb2plY3QuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBjaGFuZ2UgdGhlIGRlZmF1bHQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvamVjdCBsb2NhdGlvbjwvc3Bhbj4sCi1jbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBidXR0b24gdG8gc2VsZWN0IGEgbmV3IGxvY2F0aW9uLiBJZgoteW91IHNwZWNpZnkgYSBub24tZGVmYXVsdCBwcm9qZWN0IGxvY2F0aW9uIHRoYXQgaXMgYWxyZWFkeSBiZWluZyB1c2VkIGJ5IGFub3RoZXIKLXByb2plY3QsIHRoZSBwcm9qZWN0IGNyZWF0aW9uIHdpbGwgZmFpbC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2hvdyBBZHZhbmNlZDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgcnVudGltZTwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNlbGVjdAotdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHlvdSB3YW50IHRvIHRhcmdldCBmb3IgeW91ciBkZXZlbG9wbWVudC4gVGhpcwotc2VsZWN0aW9uIGFmZmVjdHMgdGhlIHJ1biB0aW1lIHNldHRpbmdzIGJ5IG1vZGlmeWluZyB0aGUgY2xhc3MgcGF0aCBlbnRyaWVzCi1mb3IgdGhlIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Nb2R1bGUgdmVyc2lvbjwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNlbGVjdAotdGhlIG1vZHVsZSB2ZXJzaW9uIHRvIHdoaWNoIHlvdSB3YW50IHlvdXIgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgdG8gYWRoZXJlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgdG8gYWRkIHRoZSBuZXcgbW9kdWxlIHRvIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FQVIgYXBwbGljYXRpb248L3NwYW4+IGNvbWJpbmF0aW9uIGJveCwKLXR5cGUgYSBuZXcgcHJvamVjdCBuYW1lIG9yIHNlbGVjdCBhbiBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QKLWZyb20gdGhlIGRyb3AtZG93biBsaXN0LiBPciwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gYnV0dG9uIHRvCi1sYXVuY2ggdGhlIE5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3Qgd2l6YXJkLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmCi15b3UgdHlwZSBhIG5ldyBFQVIgcHJvamVjdCBuYW1lLCB0aGUgRUFSIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0Ci1sb2NhdGlvbiB3aXRoIHRoZSBsb3dlc3QgY29tcGF0aWJsZSBKMkVFIHZlcnNpb24gYmFzZWQgb24gdGhlIHZlcnNpb24gb2YgdGhlCi1wcm9qZWN0IGJlaW5nIGNyZWF0ZWQuIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvciBhIGRpZmZlcmVudAotbG9jYXRpb24gZm9yIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLCB5b3UgbXVzdCB1c2UgdGhlIE5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uCi1Qcm9qZWN0IHdpemFyZC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1wcm9qZWN0cy5odG1sIiB0aXRsZT0iVGhlIHdvcmtiZW5jaCBjYW4gd29yayB3aXRoIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIHRvcGljcyBjb3ZlciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgc29tZSBvZiB0aGUgdHlwZXMgb2YgcHJvamVjdHMgcmVsYXRlZCB0byBKMkVFIGRldmVsb3BtZW50LiI+V29ya2luZyB3aXRoIHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2Ugc2VydmljZXMuIj5KMkVFIGFyY2hpdGVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqYXBwY2xpcHJvai5odG1sIj5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwYXBwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLiI+RXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCIgdGl0bGU9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgYXMgSkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCB0aGF0IGhhcyBiZWVuIGRlcGxveWVkIGludG8gYSBKQVIgZmlsZSBieSB1c2luZyB0aGUgSW1wb3J0IHdpemFyZC4iPkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amNpcmNsZWIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqY2lyY2xlYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjliMmYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqY2lyY2xlYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+Q29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amNpcmNsZWIiPjxhIG5hbWU9InRqY2lyY2xlYiI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVIgaXMgaW1wb3J0ZWQ8L2gxPgotPGRpdj48cD5Zb3UgY2FuIHJlc29sdmUgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZC48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5BIGN5Y2xpY2FsIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gb3IgbW9yZSBtb2R1bGVzIGluIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uIG1vc3QgY29tbW9ubHkgb2NjdXJzIHdoZW4gcHJvamVjdHMgYXJlIGltcG9ydGVkIGZyb20gb3V0c2lkZSB0aGUKLXdvcmtiZW5jaC4gV2hlbiBhIGN5Y2xlIGV4aXN0cyBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaW4gYW4gZW50ZXJwcmlzZQotYXBwbGljYXRpb24sIHRoZSBKYXZh4oSiIGJ1aWxkZXIgY2Fubm90IGFjY3VyYXRlbHkgY29tcHV0ZSB0aGUgYnVpbGQgb3JkZXIKLW9mIHRoZSBwcm9qZWN0cy4gRnVsbCBidWlsZHMgZmFpbCB1bmRlciB0aGVzZSBjb25kaXRpb25zLCBvciByZXF1aXJlIHNldmVyYWwKLWludm9jYXRpb25zLjxwPlRoZXJlZm9yZSwgdGhlIGJlc3QgcHJhY3RpY2UgaXMgdG8gb3JnYW5pemUgeW91ciBwcm9qZWN0cyBvcgotbW9kdWxlcyBpbnRvIGNvbXBvbmVudHMuIFRoaXMgYWxsb3dzIHlvdXIgbW9kdWxlIGRlcGVuZGVuY2llcyB0byBmdW5jdGlvbgotYXMgYSB0cmVlIGluc3RlYWQgb2YgYSBjeWNsZSBkaWFncmFtLiBUaGlzIHByYWN0aWNlIGhhcyB0aGUgYWRkZWQgYmVuZWZpdAotb2YgcHJvZHVjaW5nIGEgYmV0dGVyIGZhY3RvcmVkIGFuZCBsYXllcmVkIGFwcGxpY2F0aW9uLjwvcD4KLTwvZGl2PgotPG9sPjxsaT48c3Bhbj5JZGVudGlmeSBhbGwgdGhlIGNsYXNzZXMgd2l0aGluIHRoZSBKQVIgZmlsZXMgdGhhdCBoYXZlIGN5Y2xpY2FsCi1kZXBlbmRlbmNpZXMsIHRoZW4gbW92ZSB0aG9zZSBjbGFzc2VzIGludG8gYSBjb21tb24gSmF2YSBwcm9qZWN0Ci1vciBKQVIgZmlsZS48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5Vc2UgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gZWRpdG9yIHRvIG1hcCB1dGlsaXR5IEpBUiBmaWxlcwotdG8gdGhlIGNvbW1vbiBwcm9qZWN0cy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5Vc2UgdGhlIEpBUiBkZXBlbmRlbmN5IGVkaXRvciBvciBwcm9wZXJ0aWVzIHBhZ2UsIGZvciBlYWNoIG1vZHVsZQotb2YgdGhlIEpBUiBpbiB0aGUgYXBwbGljYXRpb24sIHRvIHNldCBkZXBlbmRlbmNpZXMgb25seSB0byB0aGUgSkFSIGZpbGVzIHRoYXQKLWFyZSB0cnVseSByZXF1aXJlZC48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIiB0aXRsZT0iVGhlc2UgdG9waWNzIGNvdmVyIGhvdyB0byBpbXBvcnQgZmlsZXMgYW5kIHByb2plY3RzIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgZXhwb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyB0byBkaXNrLiI+SW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgcHJvamVjdHMgYW5kIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamNpcmNsZS5odG1sIj5DeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKMkVFIG1vZHVsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqaW1wZWFyLmh0bWwiIHRpdGxlPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIGFyZSBkZXBsb3llZCBpbnRvIEVBUiBmaWxlcy4gWW91IGNhbiBpbXBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGJ5IGltcG9ydGluZyBpdCBmcm9tIGEgZGVwbG95ZWQgRUFSIGZpbGUuIj5JbXBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBFQVIgZmlsZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZWFyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amVhci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2I2MDI2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZWFyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5DcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqZWFyIj48YSBuYW1lPSJ0amVhciI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgcmVzb3VyY2VzCi1uZWVkZWQgZm9yIGVudGVycHJpc2UgYXBwbGljYXRpb25zIGFuZCBjYW4gY29udGFpbiBhIGNvbWJpbmF0aW9uIG9mIFdlYiBtb2R1bGVzLAotSkFSIGZpbGVzLCBjb25uZWN0b3IgbW9kdWxlcywgRUpCIG1vZHVsZXMsIGFuZCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcy4KLUFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBpcyBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZSwKLWFuZCBpcyB0aGVyZWZvcmUgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGFuIEVBUiBwcm9qZWN0LiBUaGUgbW9kdWxlcyBpbiBhbgotZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGFyZSBtYXBwZWQgdG8gb3RoZXIgSjJFRSBwcm9qZWN0cy4gVGhlIG1hcHBpbmcKLWluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBtZXRhZGF0YSBmaWxlcyB3aXRoaW4gdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24KLXByb2plY3QuIFRoZSBtZXRhZGF0YSBmaWxlcyBhcmUgdXNlZCBmb3IgZXhwb3J0aW5nIHRoZSBwcm9qZWN0IHRvIGFuIEVBUiBmaWxlCi1hbmQgZm9yIHJ1bm5pbmcgdGhlIHByb2plY3Qgb24gdGhlIHNlcnZlci48L3A+Ci08cD5XaGVuIHlvdSBjcmVhdGUgYW4gZW50ZXJwcmlzZQotYXBwbGljYXRpb24gcHJvamVjdCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgZG8gbm90IGdpdmUgaXQgYSBuYW1lIHRoYXQKLWNvbnRhaW5zIGRvdWJsZS1ieXRlIGNoYXJhY3RlciBzZXQgKERCQ1MpIGNoYXJhY3RlcnMuPC9wPgotPHA+VG8KLWNyZWF0ZSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgYSBuYW1lIGZvciB0aGUgbmV3Ci1lbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIFRvIGNoYW5nZSB0aGUgZGVmYXVsdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0IGxvY2F0aW9uPC9zcGFuPiwKLWNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGJ1dHRvbiB0byBzZWxlY3QgYSBuZXcgbG9jYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNob3cgQWR2YW5jZWQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0IHJ1bnRpbWU8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzZWxlY3QKLXRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGhhdCB5b3Ugd2FudCB0byB0YXJnZXQgZm9yIHlvdXIgZGV2ZWxvcG1lbnQuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TW9kdWxlIFZlcnNpb248L3NwYW4+IGxpc3QsIHNwZWNpZnkgdGhlCi1KMkVFIHNwZWNpZmljYXRpb24gbGV2ZWwgdGhhdCB5b3Ugd2FudCB0byB1c2UgZm9yIHRoaXMgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBFQVIgTW9kdWxlcyBwYWdlIG9mIHRoZSB3aXphcmQsIHNlbGVjdCB0aGUgZXhpc3RpbmcgbW9kdWxlcwotdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIG5ldyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIENsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcKLU1vZHVsZTwvc3Bhbj4gYnV0dG9uIHRvIG9wZW4gYW5vdGhlciB3aXphcmQgd2hlcmUgeW91IGNhbiBjcmVhdGUgbmV3Ci1tb2R1bGVzIGZvciB0aGlzIGVudGVycHJpc2UgYXBwbGljYXRpb24uIEluIHRoZSBOZXcgTW9kdWxlIHdpemFyZCwgaWYgeW91Ci1zZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBkZWZhdWx0IG1vZHVsZSBwcm9qZWN0czwvc3Bhbj4gY2hlY2sgYm94LAoteW91IGNhbiBjaG9vc2UgdG8gY3JlYXRlIGRlZmF1bHQgdmVyc2lvbnMgb2YgdGhlIGZvbGxvd2luZyBtb2R1bGVzIHdoaWNoIHdpbGwKLWJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBKMkVFIHZlcnNpb246PC9zcGFuPjx1bD48bGk+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2xpPgotPGxpPkVKQiBwcm9qZWN0PC9saT4KLTxsaT5XZWIgcHJvamVjdDwvbGk+Ci08bGk+Q29ubmVjdG9yIHByb2plY3Q8L2xpPgotPC91bD4KLSBUaGUgd2l6YXJkIHByb3ZpZGVzIGRlZmF1bHQgcHJvamVjdCBuYW1lcyBmb3IgdGhlIG1vZHVsZXMsIGJ1dCB5b3UgY2FuCi1zcGVjaWZ5IGRpZmZlcmVudCBwcm9qZWN0IG5hbWVzLiBUaGUgZGVmYXVsdCBtb2R1bGVzIHRoYXQgYXJlIGNyZWF0ZWQgd2lsbAotaGF2ZSB0aGUgc2FtZSBzZXJ2ZXIgdGFyZ2V0IGFzIHRoZSBuZXcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi48cD5JZiB5b3UgY2xlYXIKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgZGVmYXVsdCBtb2R1bGUgcHJvamVjdHM8L3NwYW4+IGNoZWNrIGJveCwgeW91IGNhbgotc2VsZWN0IGEgc2luZ2xlIG1vZHVsZSB0eXBlIGFuZCBwcm9jZWVkIHdpdGggdGhlIHByb3BlciB3aXphcmQgZm9yIHRoYXQgcHJvamVjdAotdHlwZS48L3A+Ci08cD5JZiB5b3UgY3JlYXRlIG5ldyBtb2R1bGVzIGF0IHRoaXMgdGltZSwgdGhleSBhcmUgYWRkZWQgdG8gdGhlCi1saXN0IG9mIGF2YWlsYWJsZSBtb2R1bGVzIGluIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0IHdpemFyZCwKLWlmIHRoZSBtb2R1bGUgdmVyc2lvbnMgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24KLXlvdSBhcmUgY3JlYXRpbmcuPC9wPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLXByb2plY3RzLmh0bWwiIHRpdGxlPSJUaGUgd29ya2JlbmNoIGNhbiB3b3JrIHdpdGggbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMuIFRoZSBmb2xsb3dpbmcgdG9waWNzIGNvdmVyIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBzb21lIG9mIHRoZSB0eXBlcyBvZiBwcm9qZWN0cyByZWxhdGVkIHRvIEoyRUUgZGV2ZWxvcG1lbnQuIj5Xb3JraW5nIHdpdGggcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqYXJjaC5odG1sIiB0aXRsZT0iVGhlIEphdmEgMiBQbGF0Zm9ybSwgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKSBwcm92aWRlcyBhIHN0YW5kYXJkIGZvciBkZXZlbG9waW5nIG11bHRpdGllciwgZW50ZXJwcmlzZSBzZXJ2aWNlcy4iPkoyRUUgYXJjaGl0ZWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2plYXJwcm9qLmh0bWwiIHRpdGxlPSJBbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgY29udGFpbnMgdGhlIGhpZXJhcmNoeSBvZiByZXNvdXJjZXMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gZGVwbG95IGEgSjJFRSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLCBvZnRlbiByZWZlcnJlZCB0byBhcyBhbiBFQVIgZmlsZS4iPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqaW1wZWFyLmh0bWwiIHRpdGxlPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIGFyZSBkZXBsb3llZCBpbnRvIEVBUiBmaWxlcy4gWW91IGNhbiBpbXBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGJ5IGltcG9ydGluZyBpdCBmcm9tIGEgZGVwbG95ZWQgRUFSIGZpbGUuIj5JbXBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBFQVIgZmlsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwZWFyLmh0bWwiIHRpdGxlPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9ucyBhcmUgZGVwbG95ZWQgaW4gdGhlIGZvcm0gb2YgYW4gRUFSIGZpbGUuIFVzZSB0aGUgRXhwb3J0IHdpemFyZCB0byBleHBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGludG8gYW4gRUFSIGZpbGUgZm9yIGRlcGxveW1lbnQuIj5FeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBhcHAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwYXBwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDNkZDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBhcHAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkV4cG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpleHBhcHAiPjxhIG5hbWU9InRqZXhwYXBwIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkV4cG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFzIGEgSkFSIGZpbGUuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGZyb20gdGhlIHdvcmtiZW5jaDo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBvZiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSwgcmlnaHQtY2xpY2sKLXRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCB0aGF0IHlvdSB3YW50IHRvIGV4cG9ydC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBvcnQ8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwCi1DbGllbnQgSkFSIGZpbGU8L3NwYW4+PC9zcGFuPiBmcm9tIHRoZSBwb3AtdXAgbWVudS4gVGhlIEV4cG9ydAotd2l6YXJkIG9wZW5zLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXN0aW5hdGlvbjwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBmdWxsCi1wYXRoIGFuZCBKQVIgZmlsZSBuYW1lIHdoZXJlIHlvdSB3YW50IHRvIGV4cG9ydCB0aGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QKLXRoYXQgaXMgc2VsZWN0ZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0PC9zcGFuPiBmaWVsZC48L3NwYW4+PC9saT4KLTxsaT48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5UbyBleHBvcnQgc291cmNlIGZpbGVzLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4cG9ydAotc291cmNlIGZpbGVzPC9zcGFuPiBjaGVjayBib3guPC9zcGFuPjwvbGk+Ci08bGk+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+SWYgeW91IGFyZSBleHBvcnRpbmcgdG8gYW4gZXhpc3RpbmcgSkFSIGZpbGUKLWFuZCB5b3UgZG8gbm90IHdhbnQgdG8gYmUgd2FybmVkIGFib3V0IG92ZXJ3cml0aW5nIGl0LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3ZlcndyaXRlCi1leGlzdGluZyBmaWxlcyB3aXRob3V0IHdhcm5pbmc8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1pbXBvcnRleHBvcnQuaHRtbCIgdGl0bGU9IlRoZXNlIHRvcGljcyBjb3ZlciBob3cgdG8gaW1wb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIGV4cG9ydCBmaWxlcyBhbmQgcHJvamVjdHMgdG8gZGlzay4iPkltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHByb2plY3RzIGFuZCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbCI+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amFwcHByb2ouaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4iPkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCIgdGl0bGU9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgYXMgSkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCB0aGF0IGhhcyBiZWVuIGRlcGxveWVkIGludG8gYSBKQVIgZmlsZSBieSB1c2luZyB0aGUgSW1wb3J0IHdpemFyZC4iPkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cGVhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBlYXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlMzJjYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cGVhci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+RXhwb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gaW50byBhbiBFQVIgZmlsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpleHBlYXIiPjxhIG5hbWU9InRqZXhwZWFyIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGU8L2gxPgotPGRpdj48cD5FbnRlcnByaXNlIGFwcGxpY2F0aW9ucyBhcmUgZGVwbG95ZWQgaW4gdGhlIGZvcm0gb2YgYW4gRUFSIGZpbGUuCi1Vc2UgdGhlIEV4cG9ydCB3aXphcmQgdG8gZXhwb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBpbnRvIGFuCi1FQVIgZmlsZSBmb3IgZGVwbG95bWVudC48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VG8gZXhwb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBpbnRvIGFuIEVBUiBmaWxlOjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBvZiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSwgcmlnaHQtY2xpY2sKLXRoZSBwcm9qZWN0IHRoYXQgeW91IHdhbnQgdG8gZXhwb3J0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBvcnQ8L3NwYW4+IGZyb20gdGhlIHBvcC11cCBtZW51LiBUaGUgRXhwb3J0Ci13aXphcmQgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNlbGVjdCBhbiBleHBvcnQgZGVzdGluYXRpb248L3NwYW4+LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FQVIKLWZpbGU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiBBcHBsaWNhdGlvbjwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZQotcHJvamVjdCB0byBleHBvcnQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXN0aW5hdGlvbjwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBmdWxsCi1wYXRoIGFuZCBFQVIgZmlsZSBuYW1lIHdoZXJlIHlvdSB3YW50IHRvIGV4cG9ydCB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotcHJvamVjdCB0aGF0IGlzIHNlbGVjdGVkIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FQVIgYXBwbGljYXRpb248L3NwYW4+IGZpZWxkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5UbyBleHBvcnQgc291cmNlIGZpbGVzLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4cG9ydAotc291cmNlIGZpbGVzPC9zcGFuPiBjaGVjayBib3guPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPklmIHlvdSBhcmUgZXhwb3J0aW5nIHRvIGFuIGV4aXN0aW5nIEVBUiBmaWxlCi1hbmQgeW91IGRvIG5vdCB3YW50IHRvIGJlIHdhcm5lZCBhYm91dCBvdmVyd3JpdGluZyBpdCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJ3cml0ZQotZXhpc3RpbmcgZmlsZXMgd2l0aG91dCB3YXJuaW5nPC9zcGFuPjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5jbHVkZSBwcm9qZWN0IGJ1aWxkIHBhdGhzCi1hbmQgbWV0YS1kYXRhIGZpbGVzPC9zcGFuPi48L3NwYW4+IFRoaXMgYWxsb3dzIHlvdSB0byBwcmVzZXJ2ZSB0aGUKLW9yaWdpbmFsIG5hbWVzIG9mIHByb2plY3RzIGluY2x1ZGVkIGluIG9yIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2plY3QsCi1mb3IgcmUtaW1wb3J0aW5nIHRoZSBFQVIgaW4gYW5vdGhlciB3b3Jrc3BhY2UuIDwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlIHdpemFyZCBleHBvcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgRUFSIHByb2plY3QgdG8gdGhlIHNwZWNpZmllZAotRUFSIGZpbGUuIEFkZGl0aW9uYWxseSwgZm9yIGVhY2ggcHJvamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgbW9kdWxlIG9yIHV0aWxpdHkKLUpBUiBpbiB0aGUgYXBwbGljYXRpb24sIHRoZSBwcm9qZWN0IGNvbnRlbnRzIGFyZSBleHBvcnRlZCBpbnRvIGEgbmVzdGVkIG1vZHVsZQotb3IgSkFSIGZpbGUgaW4gdGhlIEVBUiBmaWxlLiBJZiBhbnkgdW5zYXZlZCBjaGFuZ2VzIGV4aXN0IG9uIGFueSBvZiB0aGUgZmlsZXMKLWluIGFueSBvZiB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0cywgeW91IGFyZSBwcm9tcHRlZCB0byBzYXZlIHRoZXNlIGZpbGVzIHByaW9yCi10byBleHBvcnQuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIiB0aXRsZT0iVGhlc2UgdG9waWNzIGNvdmVyIGhvdyB0byBpbXBvcnQgZmlsZXMgYW5kIHByb2plY3RzIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgZXhwb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyB0byBkaXNrLiI+SW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgcHJvamVjdHMgYW5kIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2Ugc2VydmljZXMuIj5KMkVFIGFyY2hpdGVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIiB0aXRsZT0iQW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGNvbnRhaW5zIHRoZSBoaWVyYXJjaHkgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYW4gRUFSIGZpbGUuIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amVhci5odG1sIj5DcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amltcGVhci5odG1sIiB0aXRsZT0iRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgaW50byBFQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBieSBpbXBvcnRpbmcgaXQgZnJvbSBhIGRlcGxveWVkIEVBUiBmaWxlLiI+SW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cHJhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHByYXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyYWE0OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cHJhci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+RXhwb3J0aW5nIGNvbm5lY3RvciBwcm9qZWN0cyB0byBSQVIgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqZXhwcmFyIj48YSBuYW1lPSJ0amV4cHJhciI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FeHBvcnRpbmcgY29ubmVjdG9yIHByb2plY3RzIHRvIFJBUiBmaWxlczwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gZXhwb3J0IGEgY29ubmVjdG9yIHByb2plY3QgdG8gYSBSQVIgZmlsZSBpbiBwcmVwYXJhdGlvbgotZm9yIGRlcGxveWluZyBpdCB0byBhIHNlcnZlci48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VG8gZXhwb3J0IHRoZSBjb250ZW50cyBvZiBhIGNvbm5lY3RvciBwcm9qZWN0IHRvCi1hIFJBUiBmaWxlOjwvcD4KLTwvZGl2PgotPG9sPjxsaT48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IG9mIHRoZSBKMkVFIHBlcnNwZWN0aXZlLCByaWdodC1jbGljawotdGhlIGNvbm5lY3RvciBwcm9qZWN0IHRoYXQgeW91IHdhbnQgdG8gZXhwb3J0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBvcnQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkluIHRoZSBFeHBvcnQgd2luZG93LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SQVIgZmlsZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbm5lY3RvciBtb2R1bGU8L3NwYW4+IGxpc3QsIHNlbGVjdCB0aGUKLW5hbWUgb2YgdGhlIGNvbm5lY3RvciBwcm9qZWN0IHRvIGV4cG9ydC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVzdGluYXRpb248L3NwYW4+IGZpZWxkLCBlbnRlciB0aGUgZnVsbAotcGF0aCBhbmQgUkFSIGZpbGUgbmFtZSB3aGVyZSB5b3Ugd2FudCB0byBleHBvcnQgdGhlIG1vZHVsZSB0aGF0IGlzIHNlbGVjdGVkCi1pbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29ubmVjdG9yIHByb2plY3Q8L3NwYW4+IGZpZWxkLjwvc3Bhbj48L2xpPgotPGxpPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlRvIGV4cG9ydCBzb3VyY2UgZmlsZXMsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhwb3J0Ci1zb3VyY2UgZmlsZXM8L3NwYW4+IGNoZWNrIGJveC48L3NwYW4+PC9saT4KLTxsaT48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5JZiB5b3UgYXJlIGV4cG9ydGluZyB0byBhbiBleGlzdGluZyBSQVIgZmlsZQotYW5kIHlvdSBkbyBub3Qgd2FudCB0byBiZSB3YXJuZWQgYWJvdXQgb3ZlcndyaXRpbmcgaXQsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdmVyd3JpdGUKLWV4aXN0aW5nIGZpbGU8L3NwYW4+PC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gVGhlIHdpemFyZCBleHBvcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgUkFSIHByb2plY3QgdG8gdGhlIHNwZWNpZmllZAotUkFSIGZpbGUuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIiB0aXRsZT0iVGhlc2UgdG9waWNzIGNvdmVyIGhvdyB0byBpbXBvcnQgZmlsZXMgYW5kIHByb2plY3RzIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgZXhwb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyB0byBkaXNrLiI+SW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgcHJvamVjdHMgYW5kIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXBhcHAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wYXBwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNWUzOWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXBhcHAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqaW1wYXBwIj48YSBuYW1lPSJ0amltcGFwcCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JbXBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlPC9oMT4KLTxkaXY+PHA+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSBkZXBsb3llZCBhcyBKQVIgZmlsZXMuIFlvdSBjYW4KLWltcG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCB0aGF0IGhhcyBiZWVuIGRlcGxveWVkIGludG8gYSBKQVIgZmlsZQotYnkgdXNpbmcgdGhlIEltcG9ydCB3aXphcmQuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPlRvIGltcG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGUgdXNpbmcgdGhlIHdpemFyZDo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBKMkVFIHBlcnNwZWN0aXZlLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW1wb3J0PC9zcGFuPjwvc3Bhbj4uIFRoZSBJbXBvcnQgd2luZG93IG9wZW5zLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5VbmRlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZWxlY3QgYW4gaW1wb3J0IHNvdXJjZTwvc3Bhbj4sIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcAotQ2xpZW50IEphciBmaWxlPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBsaWNhdGlvbiBDbGllbnQgZmlsZTwvc3Bhbj4gZmllbGQsIGVudGVyCi10aGUgbG9jYXRpb24gYW5kIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZSB0aGF0IHlvdSB3YW50IHRvCi1pbXBvcnQuIENsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGJ1dHRvbiB0byBzZWxlY3QgdGhlIEpBUiBmaWxlCi1mcm9tIHRoZSBmaWxlIHN5c3RlbS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0PC9zcGFuPiBmaWVsZCwKLXR5cGUgYSBuZXcgcHJvamVjdCBvciBzZWxlY3QgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgZnJvbSB0aGUgZHJvcC1kb3duCi1saXN0LiBPciwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gYnV0dG9uIHRvIGxhdW5jaCB0aGUgTmV3IEFwcGxpY2F0aW9uCi1DbGllbnQgUHJvamVjdCB3aXphcmQuIElmIHlvdSB0eXBlIGEgbmV3IG5hbWUgaW4gdGhpcyBmaWVsZCwgdGhlIGFwcGxpY2F0aW9uCi1jbGllbnQgcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgYmFzZWQgb24gdGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudAotSkFSIGZpbGUsIGFuZCBpdCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBsb2NhdGlvbi4gVXNlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+IGJ1dHRvbgotdG8gY2hhbmdlIHRoZSBKMkVFIHZlcnNpb24gYW5kIHRoZSBsb2NhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IGFyZSBpbXBvcnRpbmcgdG8gYW4gZXhpc3RpbmcgcHJvamVjdCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJ3cml0ZQotZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgc2VydmVyPC9zcGFuPiBkcm9wLWRvd24gbGlzdCwgc2VsZWN0Ci10aGUgYXBwbGljYXRpb24gc2VydmVyIHRoYXQgeW91IHdhbnQgdG8gdGFyZ2V0IGZvciB5b3VyIGRldmVsb3BtZW50LiBUaGlzCi1zZWxlY3Rpb24gYWZmZWN0cyB0aGUgcnVuIHRpbWUgc2V0dGluZ3MgYnkgbW9kaWZ5aW5nIHRoZSBjbGFzcyBwYXRoIGVudHJpZXMKLWZvciB0aGUgcHJvamVjdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRvIGFkZCB0aGUgbmV3IG1vZHVsZSB0byBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiAoRUFSKSBwcm9qZWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIGFwcGxpY2F0aW9uPC9zcGFuPiBmaWVsZCwgdHlwZSBhIG5ldwotcHJvamVjdCBuYW1lIG9yIHNlbGVjdCBhbiBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgZnJvbSB0aGUKLWRyb3AtZG93biBsaXN0LiBPciwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gYnV0dG9uIHRvIGxhdW5jaAotdGhlIE5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3Qgd2l6YXJkLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmIHlvdSB0eXBlCi1hIG5ldyBFQVIgcHJvamVjdCBuYW1lLCB0aGUgRUFSIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uCi13aXRoIHRoZSBsb3dlc3QgY29tcGF0aWJsZSBKMkVFIHZlcnNpb24gYmFzZWQgb24gdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QKLWJlaW5nIGNyZWF0ZWQuIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvciBhIGRpZmZlcmVudCBsb2NhdGlvbgotZm9yIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLCB5b3UgbXVzdCB1c2UgdGhlIE5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uCi1Qcm9qZWN0IHdpemFyZC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4gdG8gaW1wb3J0IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLUpBUiBmaWxlLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtaW1wb3J0ZXhwb3J0Lmh0bWwiIHRpdGxlPSJUaGVzZSB0b3BpY3MgY292ZXIgaG93IHRvIGltcG9ydCBmaWxlcyBhbmQgcHJvamVjdHMgaW50byB0aGUgd29ya2JlbmNoIGFuZCBleHBvcnQgZmlsZXMgYW5kIHByb2plY3RzIHRvIGRpc2suIj5JbXBvcnRpbmcgYW5kIGV4cG9ydGluZyBwcm9qZWN0cyBhbmQgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqYXJjaC5odG1sIiB0aXRsZT0iVGhlIEphdmEgMiBQbGF0Zm9ybSwgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKSBwcm92aWRlcyBhIHN0YW5kYXJkIGZvciBkZXZlbG9waW5nIG11bHRpdGllciwgZW50ZXJwcmlzZSBzZXJ2aWNlcy4iPkoyRUUgYXJjaGl0ZWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwiPkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSBhIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYW5kIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIj5DcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwYXBwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLiI+RXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXBlYXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wZWFyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNjExOGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXBlYXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amltcGVhciI+PGEgbmFtZT0idGppbXBlYXIiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGU8L2gxPgotPGRpdj48cD5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIGFyZSBkZXBsb3llZCBpbnRvIEVBUiBmaWxlcy4gWW91Ci1jYW4gaW1wb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBieSBpbXBvcnRpbmcgaXQgZnJvbSBhIGRlcGxveWVkCi1FQVIgZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+WW91IGNhbiBhbHNvIGNob29zZSB0byBpbXBvcnQgdXRpbGl0eSBKQVIgZmlsZXMgYXMgdXRpbGl0eSBKYXZh4oSiIHByb2plY3RzLgotWW91IGNhbiBhbHNvIHVzZSB0aGUgd2l6YXJkIHRvIGNoYW5nZSB0aGUgbmV3IHByb2plY3QgbmFtZXMgZm9yIHRoZSBFQVIgZmlsZQotYW5kIG1vZHVsZXMgdGhhdCB3aWxsIGJlIGltcG9ydGVkLjwvcD4KLTxwPlRvIGltcG9ydCBhbiBFQVIgZmlsZSB1c2luZyB0aGUgd2l6YXJkOjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+PC9zcGFuPi4gVGhlIEltcG9ydCB3aW5kb3cgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiBmaWxlPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIGZvbGxvd2luZyBnZW5lcmFsIG9wdGlvbnMgZm9yIHRoZSBFQVIgaW1wb3J0Ojwvc3Bhbj4gPG9sIHR5cGU9ImEiPjxsaT48c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5FQVIgZmlsZTwvc3Bhbj46IEVudGVyIHRoZSBmdWxsIHBhdGggZm9yIHRoZQotRUFSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQuIFlvdSBjYW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiB0bwotc2VsZWN0IHRoZSBFQVIgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbS48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5FQVIgcHJvamVjdDwvc3Bhbj46IHR5cGUgYSBuYW1lIGZvciB0aGUgZW50ZXJwcmlzZQotYXBwbGljYXRpb24gcHJvamVjdCB0aGF0IHdpbGwgYmUgY3JlYXRlZCB3aGVuIHlvdSBpbXBvcnQgdGhlIEVBUiBmaWxlLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldCBydW50aW1lPC9zcGFuPjogU2VsZWN0IHRoZSBhcHBsaWNhdGlvbgotc2VydmVyIHRoYXQgeW91IHdhbnQgdG8gdGFyZ2V0IGZvciB5b3VyIGRldmVsb3BtZW50LiBUaGlzIHNlbGVjdGlvbiBhZmZlY3RzCi10aGUgcnVudGltZSBzZXR0aW5ncyBieSBtb2RpZnlpbmcgdGhlIGNsYXNzIHBhdGggZW50cmllcyBmb3IgdGhlIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4sIGFuZCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvc3Bhbj48b2wgdHlwZT0iYSI+PGxpPjxzcGFuPk9uIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIEltcG9ydCBwYWdlLCBzZWxlY3QgYW55IHV0aWxpdHkKLUpBUiBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0IHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IGFzIHV0aWxpdHkgcHJvamVjdHMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1vZHVsZSBSb290IExvY2F0aW9uIGZpZWxkPC9zcGFuPiwgc3BlY2lmeQotdGhlIHJvb3QgZGlyZWN0b3J5IGZvciBhbGwgb2YgdGhlIHByb2plY3RzIHRoYXQgd2lsbCBiZSBpbXBvcnRlZCBvciBjcmVhdGVkCi1kdXJpbmcgaW1wb3J0Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PbiB0aGUgRUFSIE1vZHVsZSBhbmQgVXRpbGl0eSBKQVIgUHJvamVjdHMgcGFnZSBvZiB0aGUgd2l6YXJkLAotc2VsZWN0IHRoZSBwcm9qZWN0cyB0aGF0IHlvdSB3YW50IHRvIGltcG9ydCB3aXRoIHRoZSBFQVIgZmlsZS4gQWxzbywgeW91IGNhbgotZWRpdCB0aGUgbmV3IHByb2plY3QgbmFtZSBmb3IgZWFjaCBtb2R1bGUgYW5kIHV0aWxpdHkgcHJvamVjdCB0byBiZSBpbXBvcnRlZC48L3NwYW4+IDxkaXYgY2xhc3M9InRpcCI+PHNwYW4gY2xhc3M9InRpcHRpdGxlIj5UaXA6PC9zcGFuPiBUaGUgc2VsZWN0aW9uIGJ1dHRvbnMgb24gdGhpcyBwYWdlIGNhbiBoZWxwIHlvdSBzZWxlY3QKLXRoZSBwcm9qZWN0cyB0byBpbXBvcnQgd2hlbiB5b3UgYXJlIGltcG9ydGluZyBmb3IgcGFydGlhbCBFQVIgZGV2ZWxvcG1lbnQuCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBpbXBvcnRpbmcgdG8gYSB3b3Jrc3BhY2Ugd2hlcmUgc29tZSBwcm9qZWN0cyBhcmUgYXR0YWNoZWQKLXRvIGEgcmVwb3NpdG9yeSBhbmQgb3RoZXIgcHJvamVjdHMgYXJlIGluIGJpbmFyeSBmb3JtLCB0aGVzZSBidXR0b25zIGhlbHAKLXlvdSBtYWtlIHRoZSBwcm9wZXIgc2VsZWN0aW9ucyBmb3Igd2hpY2ggcHJvamVjdHMgdG8gaW1wb3J0Ojx1bD48bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VsZWN0IE5ldzwvc3Bhbj46IFNlbGVjdHMgdGhlIHByb2plY3RzIHRoYXQgYXJlIGN1cnJlbnRseQotbm90IGluIHlvdXIgd29ya3NwYWNlLjwvbGk+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VsZWN0IEFsbDwvc3Bhbj46IFNlbGVjdHMgYWxsIHByb2plY3RzIGZvciBpbXBvcnQuPC9saT4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNlbGVjdCBBbGw8L3NwYW4+OiBDbGVhcnMgYWxsIG1vZHVsZSBhbmQgdXRpbGl0eSBwcm9qZWN0cwotZm9yIGltcG9ydC48L2xpPgotPC91bD4KLTwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPiB0byBpbXBvcnQgdGhlIGNvbnRlbnRzIG9mIHRoZQotRUFSIGZpbGUuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1pbXBvcnRleHBvcnQuaHRtbCIgdGl0bGU9IlRoZXNlIHRvcGljcyBjb3ZlciBob3cgdG8gaW1wb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIGV4cG9ydCBmaWxlcyBhbmQgcHJvamVjdHMgdG8gZGlzay4iPkltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHByb2plY3RzIGFuZCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamVhcnByb2ouaHRtbCIgdGl0bGU9IkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjb250YWlucyB0aGUgaGllcmFyY2h5IG9mIHJlc291cmNlcyB0aGF0IGFyZSByZXF1aXJlZCB0byBkZXBsb3kgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24sIG9mdGVuIHJlZmVycmVkIHRvIGFzIGFuIEVBUiBmaWxlLiI+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqY2lyY2xlLmh0bWwiPkN5Y2xpY2FsIGRlcGVuZGVuY2llcyBiZXR3ZWVuIEoyRUUgbW9kdWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGplYXIuaHRtbCI+Q3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb25zIGFyZSBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZS4gVXNlIHRoZSBFeHBvcnQgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4iPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amNpcmNsZWIuaHRtbCIgdGl0bGU9IllvdSBjYW4gcmVzb2x2ZSBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkLiI+Q29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXByYXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wcmFyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YmNhODUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXByYXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkltcG9ydGluZyBhIGNvbm5lY3RvciBwcm9qZWN0IFJBUiBmaWxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amltcHJhciI+PGEgbmFtZT0idGppbXByYXIiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIGEgY29ubmVjdG9yIHByb2plY3QgUkFSIGZpbGU8L2gxPgotPGRpdj48cD5Db25uZWN0b3IgcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gUkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydAotYSBjb25uZWN0b3IgcHJvamVjdCBieSBpbXBvcnRpbmcgYSBkZXBsb3llZCBSQVIgZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBpbXBvcnQgYSBjb25uZWN0b3IgcHJvamVjdCBSQVIgZmlsZSB1c2luZyB0aGUgd2l6YXJkOjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+PC9zcGFuPi4gVGhlIEltcG9ydCB3aW5kb3cgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNlbGVjdCBhbiBpbXBvcnQgc291cmNlPC9zcGFuPiwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UkFSCi1maWxlPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25uZWN0b3IgZmlsZTwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBmdWxsCi1wYXRoIGFuZCBuYW1lIG9mIHRoZSBjb25uZWN0b3IgUkFSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQuIENsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGJ1dHRvbgotdG8gc2VsZWN0IHRoZSBSQVIgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbm5lY3RvciBtb2R1bGU8L3NwYW4+IGNvbWJpbmF0aW9uIGJveCwKLXR5cGUgYSBuZXcgcHJvamVjdCBuYW1lIG9yIHNlbGVjdCBhIGNvbm5lY3RvciBwcm9qZWN0IGZyb20gdGhlIGRyb3AtZG93biBsaXN0LgotSWYgeW91IHR5cGUgYSBuZXcgcHJvamVjdCBuYW1lIGluIHRoaXMgZmllbGQsIHRoZSBjb25uZWN0b3IgcHJvamVjdCB3aWxsIGJlCi1jcmVhdGVkIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb25uZWN0b3IgUkFSIGZpbGUsIGFuZCBpdCB3aWxsIHVzZSB0aGUKLWRlZmF1bHQgbG9jYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgcnVudGltZTwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNlbGVjdAotdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHlvdSB3YW50IHRvIHRhcmdldCBmb3IgeW91ciBkZXZlbG9wbWVudC4gVGhpcwotc2VsZWN0aW9uIGFmZmVjdHMgdGhlIHJ1biB0aW1lIHNldHRpbmdzIGJ5IG1vZGlmeWluZyB0aGUgY2xhc3MgcGF0aCBlbnRyaWVzCi1mb3IgdGhlIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGFkZCB0aGUgbmV3IGNvbm5lY3RvciBtb2R1bGUgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotKEVBUikgcHJvamVjdCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgbW9kdWxlIHRvIGFuIEVBUiBhcHBsaWNhdGlvbjwvc3Bhbj4gY2hlY2sKLWJveC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiBhcHBsaWNhdGlvbjwvc3Bhbj4gY29tYmluYXRpb24gYm94LAotdHlwZSBhIG5ldyBwcm9qZWN0IG5hbWUgb3Igc2VsZWN0IGFuIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdAotZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QuIE9yLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBidXR0b24gdG8KLWxhdW5jaCB0aGUgTmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCB3aXphcmQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYKLXlvdSB0eXBlIGEgbmV3IEVBUiBwcm9qZWN0IG5hbWUsIHRoZSBFQVIgcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGRlZmF1bHQKLWxvY2F0aW9uIHdpdGggdGhlIGxvd2VzdCBjb21wYXRpYmxlIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiB0aGUgdmVyc2lvbiBvZiB0aGUKLXByb2plY3QgYmVpbmcgY3JlYXRlZC4gSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9yIGEgZGlmZmVyZW50Ci1sb2NhdGlvbiBmb3IgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24sIHlvdSBtdXN0IHVzZSB0aGUgTmV3Ci1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3Qgd2l6YXJkLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPiB0byBpbXBvcnQgdGhlIGNvbm5lY3RvciBSQVIKLWZpbGUuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1pbXBvcnRleHBvcnQuaHRtbCIgdGl0bGU9IlRoZXNlIHRvcGljcyBjb3ZlciBob3cgdG8gaW1wb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIGV4cG9ydCBmaWxlcyBhbmQgcHJvamVjdHMgdG8gZGlzay4iPkltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHByb2plY3RzIGFuZCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqcmFyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anJhci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGI4ZjlhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqcmFyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5DcmVhdGluZyBhIGNvbm5lY3RvciBwcm9qZWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anJhciI+PGEgbmFtZT0idGpyYXIiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdDwvaDE+Ci08ZGl2PjxwPkEgY29ubmVjdG9yIGlzIGEgSjJFRSBzdGFuZGFyZCBleHRlbnNpb24gbWVjaGFuaXNtIGZvciBjb250YWluZXJzCi10byBwcm92aWRlIGNvbm5lY3Rpdml0eSB0byBlbnRlcnByaXNlIGluZm9ybWF0aW9uIHN5c3RlbXMgKEVJU3MpLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD4gQSBjb25uZWN0b3IgaXMgYSBKMkVFIHN0YW5kYXJkIGV4dGVuc2lvbiBtZWNoYW5pc20gZm9yIGNvbnRhaW5lcnMKLXRvIHByb3ZpZGUgY29ubmVjdGl2aXR5IHRvIGVudGVycHJpc2UgaW5mb3JtYXRpb24gc3lzdGVtcyAoRUlTcykuIEEgY29ubmVjdG9yCi1pcyBzcGVjaWZpYyB0byBhbiBFSVMgYW5kIGNvbnNpc3RzIG9mIGEgcmVzb3VyY2UgYWRhcHRlciBhbmQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQKLXRvb2xzLiBBIHJlc291cmNlIGFkYXB0ZXIgaXMgYSBzeXN0ZW0tbGV2ZWwgc29mdHdhcmUgZHJpdmVyIHRoYXQgaXMgdXNlZCBieQotYW4gRUpCIGNvbnRhaW5lciBvciBhbiBhcHBsaWNhdGlvbiBjbGllbnQgdG8gY29ubmVjdCB0byBhbiBFSVMuIENvbm5lY3RvcnMKLWNvbXBseSB3aXRoIHRoZSBKMkVFIENvbm5lY3RvciBhcmNoaXRlY3R1cmUgKEpDQSkuPC9wPgotPGRpdiBjbGFzcz0icmVzdHJpY3Rpb24iPjxzcGFuIGNsYXNzPSJyZXN0cmljdGlvbnRpdGxlIj5SZXN0cmljdGlvbjo8L3NwYW4+IEoyRUUKLTEuMiBzcGVjaWZpY2F0aW9uIGxldmVsIGRvZXMgbm90IGluY2x1ZGUgY29ubmVjdG9yIGNhcGFiaWxpdHkuPC9kaXY+Ci08cD5UbwotY3JlYXRlIGEgbmV3IGNvbm5lY3RvciBwcm9qZWN0OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbm5lY3RvciBQcm9qZWN0PC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZCwgdHlwZSBhIG5hbWUgZm9yIHRoZSBjb25uZWN0b3IKLXByb2plY3QuIFRvIGNoYW5nZSB0aGUgZGVmYXVsdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0IGxvY2F0aW9uPC9zcGFuPiwgY2xpY2sKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGJ1dHRvbiB0byBzZWxlY3QgYSBuZXcgbG9jYXRpb24uPC9zcGFuPiBJZgoteW91IHNwZWNpZnkgYSBub24tZGVmYXVsdCBwcm9qZWN0IGxvY2F0aW9uIHRoYXQgaXMgYWxyZWFkeSBiZWluZyB1c2VkIGJ5IGFub3RoZXIKLXByb2plY3QsIHRoZSBwcm9qZWN0IGNyZWF0aW9uIHdpbGwgZmFpbC48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TaG93IEFkdmFuY2VkPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpDQSB2ZXJzaW9uPC9zcGFuPiBkcm9wLWRvd24gbGlzdCwgc2VsZWN0Ci10aGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIHRvIHdoaWNoIHlvdSB3YW50IHlvdXIgY29ubmVjdG9yIHByb2plY3QgdG8gYWRoZXJlLjwvc3Bhbj4gPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldCBzZXJ2ZXI8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzZWxlY3QKLXRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGhhdCB5b3Ugd2FudCB0byB0YXJnZXQgZm9yIHlvdXIgZGV2ZWxvcG1lbnQuIFRoaXMKLXNlbGVjdGlvbiBhZmZlY3RzIHRoZSBydW4gdGltZSBzZXR0aW5ncyBieSBtb2RpZnlpbmcgdGhlIGNsYXNzIHBhdGggZW50cmllcwotZm9yIHRoZSBwcm9qZWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgdG8gYWRkIHRoZSBuZXcgbW9kdWxlIHRvIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FQVIgcHJvamVjdDwvc3Bhbj4gY29tYmluYXRpb24gYm94LCB0eXBlCi1hIG5ldyBwcm9qZWN0IG5hbWUgb3Igc2VsZWN0IGFuIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBmcm9tCi10aGUgZHJvcC1kb3duIGxpc3QuIE9yLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBidXR0b24gdG8gbGF1bmNoCi10aGUgTmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCB3aXphcmQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgeW91IHR5cGUKLWEgbmV3IEVBUiBwcm9qZWN0IG5hbWUsIHRoZSBFQVIgcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYXRpb24KLXdpdGggdGhlIGxvd2VzdCBjb21wYXRpYmxlIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdAotYmVpbmcgY3JlYXRlZC4gSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9yIGEgZGlmZmVyZW50IGxvY2F0aW9uCi1mb3IgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24sIHlvdSBtdXN0IHVzZSB0aGUgTmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24KLVByb2plY3Qgd2l6YXJkLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLXByb2plY3RzLmh0bWwiIHRpdGxlPSJUaGUgd29ya2JlbmNoIGNhbiB3b3JrIHdpdGggbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMuIFRoZSBmb2xsb3dpbmcgdG9waWNzIGNvdmVyIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBzb21lIG9mIHRoZSB0eXBlcyBvZiBwcm9qZWN0cyByZWxhdGVkIHRvIEoyRUUgZGV2ZWxvcG1lbnQuIj5Xb3JraW5nIHdpdGggcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anRhcmdldHNlcnZlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyMTA0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anRhcmdldHNlcnZlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz48IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPlNwZWNpZnlpbmcgdGFyZ2V0IHNlcnZlcnMgZm9yIEoyRUUgcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqdGFyZ2V0c2VydmVyIj48YSBuYW1lPSJ0anRhcmdldHNlcnZlciI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TcGVjaWZ5aW5nIHRhcmdldCBzZXJ2ZXJzIGZvciBKMkVFIHByb2plY3RzPC9oMT4KLTxkaXY+PHA+V2hlbiB5b3UgZGV2ZWxvcCBKMkVFIGFwcGxpY2F0aW9ucywgdGhlIHdvcmtiZW5jaCByZXF1aXJlcyB0aGF0Ci15b3Ugc3BlY2lmeSB0aGUgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzIGZvciB5b3VyIEoyRUUgcHJvamVjdHMuIFRoZSB0YXJnZXQKLXNlcnZlciBpcyBzcGVjaWZpZWQgZHVyaW5nIHByb2plY3QgY3JlYXRpb24gYW5kIGltcG9ydCwgYW5kIGl0IGNhbiBiZSBjaGFuZ2VkCi1pbiB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzLiBUaGUgdGFyZ2V0IHNlcnZlciBzZXR0aW5nIGlzIHRoZSBkZWZhdWx0IG1lY2hhbmlzbQotZm9yIHNldHRpbmcgdGhlIGNsYXNzIHBhdGggZm9yIEoyRUUgcHJvamVjdHMuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+SW4gb3JkZXIgdG8gc3VwcG9ydCBkaWZmZXJlbnQgYXBwbGljYXRpb24gc2VydmVycyB0aGF0IHVzZSBkaWZmZXJlbnQKLUpESyBsZXZlbHMgZm9yIHRoZWlyIEphdmHihKIgUnVudGltZSBFbnZpcm9ubWVudCAoSlJFKSwgdGhlIHdvcmtiZW5jaAotcmVxdWlyZXMgdGhhdCBwcm9qZWN0cyBpbmNsdWRlIGEgdGFyZ2V0IHNlcnZlciBzZXR0aW5nLiBGb3IgZXhhbXBsZSwgaWYgeW91Ci13YW50IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmZWF0dXJlcyBvZiBKREsgMS40LjIsIHlvdXIgYXBwbGljYXRpb25zIHJlcXVpcmUKLWRpZmZlcmVudCBjbGFzcyBwYXRoIGVudHJpZXMgdGhhbiB0aG9zZSB0aGF0IHdlcmUgdXNlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucwotb2YgdGhlIHdvcmtiZW5jaC4gQnkgcmVxdWlyaW5nIHRoYXQgeW91IHNwZWNpZnkgYSB0YXJnZXQgc2VydmVyLCB0aGUgd29ya2JlbmNoCi1lbmZvcmNlcyB0aGF0IHByb3BlciBlbnRyaWVzIGFyZSBhcHByb3ByaWF0ZWx5IGFkZGVkIGZvciBydW5uaW5nIG9uIHRoZSBzZXJ2ZXIKLXlvdSBjaG9vc2UuPC9wPgotPHA+V2hlbiB0aGUgcHJvamVjdCBpcyBjcmVhdGVkLCB0aGUgY2xhc3MgcGF0aCBvZiB0aGUgcHJvamVjdAotaXMgdXBkYXRlZCB3aXRoIHR3byBjbGFzcyBwYXRoIGNvbnRhaW5lcnMuIE9uZSBjb250YWluZXIgaXMgdGhlIEpESyBjb250YWluZXIKLWFuZCB0aGUgb3RoZXIgaXMgdGhlIHNlcnZlciBjb250YWluZXIuIFRoZSBKREsgY29udGFpbmVyIHBvaW50cyB0byB0aGUgZGlyZWN0b3J5Ci10aGF0IGNvbnRhaW5zIHRoZSBKQVIgZmlsZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhlIEpESyB2ZXJzaW9uLgotVGhlIHNlcnZlciBjb250YWluZXIgcG9pbnRzIHRvIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgbXVsdGlwbGUgcHVibGljCi1KQVIgZmlsZXMgYXZhaWxhYmxlIGluIHRoZSBzZWxlY3RlZCBzZXJ2ZXIuIFRoZSBwcm9qZWN0IHRoZW4gY29tcGlsZXMgYmFzZWQKLW9uIHRoZSByZXF1aXJlZCBKQVIgZmlsZXMgbG9jYXRlZCBpbiB0aGVzZSBmb2xkZXJzLCBhbmQgeW91IGRvIG5vdCBuZWVkIHRvCi13b3JyeSBhYm91dCBhZGRpbmcgYWRkaXRpb25hbCBKQVIgZmlsZXMgZnJvbSB0aGUgc2VydmVyIGR1cmluZyBkZXZlbG9wbWVudC4KLVdoZW4gdGhlIHByb2plY3QgaXMgY29tcGlsZWQsIHRoZSBKQVIgZmlsZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBjbGFzcyBwYXRoLgotWW91IGNhbiBzdGlsbCBhZGQgeW91ciBvd24gSkFSIGZpbGVzIHRvIHRoZSBjbGFzcyBwYXRoLjwvcD4KLTxwPlRoZSB0YXJnZXQgcnVudGltZQotZW52aXJvbm1lbnQgaXMgc3BlY2lmaWVkIGluIHRoZSAucnVudGltZSBmaWxlIGluIHRoZSBwcm9qZWN0J3MgcmVzb3VyY2VzLgotWW91IHNob3VsZCBub3QgZWRpdCB0aGlzIGZpbGUgbWFudWFsbHkuPC9wPgotPHA+QWxsIEoyRUUgcHJvamVjdCBjcmVhdGlvbiBhbmQKLWltcG9ydCB3aXphcmRzIHJlcXVpcmUgeW91IHRvIHNwZWNpZnkgdGhlIHRhcmdldCBzZXJ2ZXIgZm9yIHRoZSByZXN1bHRpbmcKLXByb2plY3RzLiBUaGUgbGlzdCBvZiB0YXJnZXQgc2VydmVycyB0aGF0IHlvdSBjYW4gY2hvb3NlIGZyb20gaXMgZmlsdGVyZWQKLWJhc2VkIG9uIGluc3RhbGxlZCBydW50aW1lcywgdGhlIEoyRUUgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgdGhlIEoyRUUKLW1vZHVsZSB0eXBlLiBGb3IgZXhhbXBsZSwgZm9yIEVKQiBwcm9qZWN0cyBvbmx5IGFwcGxpY2F0aW9uIHNlcnZlcnMgdGhhdCBzdXBwb3J0Ci1FbnRlcnByaXNlIEphdmFCZWFuc+KEoiBhcmUgZGlzcGxheWVkLiBBbGwgcHJvamVjdHMgaW5zaWRlIGEKLXNpbmdsZSBFQVIgZmlsZSBtdXN0IGJlIHRhcmdldGVkIHRvIHRoZSBzYW1lIHNlcnZlci4gSWYgeW91IGNyZWF0ZSBhIG5ldyBwcm9qZWN0Ci1hbmQgYWRkIGl0IHRvIGFuIGV4aXN0aW5nIEVBUiBwcm9qZWN0IGR1cmluZyBjcmVhdGlvbiwgdGhlIHByb2plY3QgaW5oZXJpdHMKLXRoZSB0YXJnZXQgc2VydmVyIHNldHRpbmcgb2YgdGhlIEVBUiBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBVdGlsaXR5IEphdmEgcHJvamVjdHMKLXRoYXQgYXJlIGFkZGVkIHRvIGFuIGFwcGxpY2F0aW9uIGFyZSB0YXJnZXRlZCB0byB0aGUgc2FtZSB0YXJnZXQgc2VydmVyIGFzCi10aGUgYXBwbGljYXRpb24uIFdlYiBsaWJyYXJ5IHByb2plY3RzIHRoYXQgYXJlIGFkZGVkIHRvIGEgV2ViIHByb2plY3QgYXJlCi10YXJnZXRlZCB0byB0aGUgc2FtZSB0YXJnZXQgc2VydmVyIGFzIHRoZSBXZWIgcHJvamVjdC48L2Rpdj4KLTxwPlRvIG1vZGlmeQotdGhlIHRhcmdldCBydW50aW1lIGFuZCBkZWZhdWx0IHNlcnZlciBmb3IgYW4gZXhpc3RpbmcgcHJvamVjdDo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgb2YgdGhlIEoyRUUgcGVyc3BlY3RpdmUsIHJpZ2h0LWNsaWNrCi10aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBvciBtb2R1bGUgcHJvamVjdCwgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUuPC9zcGFuPiBUaGUgUHJvcGVydGllcyBkaWFsb2cgZm9yIHRoZSBwcm9qZWN0IG9wZW5zLjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VydmVyPC9zcGFuPiBwYWdlIG9uIHRoZSBQcm9wZXJ0aWVzCi1kaWFsb2cuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgcnVudGltZTwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNlbGVjdAotdGhlIHNlcnZlciBydW50aW1lIHRoYXQgeW91IHdhbnQgeW91ciBwcm9qZWN0IHRvIGJlIGRldmVsb3BlZCBmb3IuIFRoaXMgc2VsZWN0aW9uCi1pbXBhY3RzIHRoZSBydW50aW1lIGxpYnJhcmllcyB0aGF0IGFyZSBhZGRlZCB0byB5b3VyIHByb2plY3QgY2xhc3MgcGF0aC4gWW91Ci1jYW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiB0byBkZWZpbmUgYSBuZXcgcnVudGltZSBlbnZpcm9ubWVudCB0aGF0Ci15b3UgaGF2ZSBpbnN0YWxsZWQuIFRoZSBsaXN0IG9mIHJ1bnRpbWUgZW52aXJvbm1lbnRzIGFyZSBkZWZpbmVkIGluIHlvdXIgd29ya2JlbmNoCi1wcmVmZXJlbmNlcy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMgb25seTogV2hlbiBtb2RpZnlpbmcKLXRoZSB0YXJnZXQgc2VydmVyIGZvciBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5jbHVkZQotY2hpbGQgcHJvamVjdHM8L3NwYW4+IGNoZWNrIGJveCB0byBhcHBseSB5b3VyIGNoYW5nZXMgdG8gYW55IGNoaWxkcmVuCi1tb2R1bGVzLjwvc3Bhbj4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdAotYW5kIGFsbCBvZiBpdHMgbW9kdWxlIHByb2plY3RzLCB1dGlsaXR5IHByb2plY3RzLCBhbmQgV2ViIGFwcGxpY2F0aW9uIGxpYnJhcnkKLXByb2plY3RzIGhhdmUgdGhlIHNhbWUgdGFyZ2V0IHNlcnZlci48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVmYXVsdCBzZXJ2ZXI8L3NwYW4+IGZpZWxkLAotc2VsZWN0IGEgZGVmYXVsdCBzZXJ2ZXIgdG8gdXNlIHdoZW4gZGVwbG95aW5nIHRoZSBwcm9qZWN0LiBBbHRob3VnaCB5b3Ugd291bGQKLXR5cGljYWxseSBzZXQgdGhpcyB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgdGFyZ2V0IHJ1bnRpbWUsIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWZhdWx0Ci1zZXJ2ZXI8L3NwYW4+IHNlbGVjdGlvbiBpcyBpbmRlcGVuZGVudCBvZiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0IHJ1bnRpbWU8L3NwYW4+IHNlbGVjdGlvbi4KLVRoZSBkZWZhdWx0IHNlcnZlciBzaW1wbHkgc3BlY2lmaWVzIGEgcHJvamVjdCBwcmVmZXJlbmNlIHNvIHlvdSBhcmUgbm90IHByb21wdGVkCi1mb3IgYXZhaWxhYmxlIHJ1bnRpbWUgZW52aXJvbm1lbnRzIHdoZW4geW91IGRlcGxveSB0aGUgcHJvamVjdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+IHRvIHNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtcHJvamVjdHMuaHRtbCIgdGl0bGU9IlRoZSB3b3JrYmVuY2ggY2FuIHdvcmsgd2l0aCBtYW55IGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cy4gVGhlIGZvbGxvd2luZyB0b3BpY3MgY292ZXIgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIHNvbWUgb2YgdGhlIHR5cGVzIG9mIHByb2plY3RzIHJlbGF0ZWQgdG8gSjJFRSBkZXZlbG9wbWVudC4iPldvcmtpbmcgd2l0aCBwcm9qZWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhZTBhNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi0KLQotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGp2YWwiPjxhIG5hbWU9InRqdmFsIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UaGUgd29ya2JlbmNoIHByb3ZpZGVzIG1hbnVhbCBjb2RlIHZhbGlkYXRpb24sIGNvZGUgdmFsaWRhdGlvbgotZHVyaW5nIGEgYnVpbGQsIGFuZCBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uIG9mIHByb2plY3QgcmVzb3VyY2VzLiBNYW51YWwKLWNvZGUgdmFsaWRhdGlvbiBpcyBleHBsaWNpdGx5IGludm9rZWQgYnkgdGhlIHVzZXIsIGFuZCBpdCBpbW1lZGlhdGVseSB2YWxpZGF0ZXMKLXRoZSByZXNvdXJjZXMgY29udGFpbmVkIGluIGEgc2VsZWN0ZWQgcHJvamVjdC4gQnVpbGQgdmFsaWRhdGlvbiBvY2N1cnMgd2hlbgoteW91IG1hbnVhbGx5IGludm9rZSBhIGJ1aWxkLiBBdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uIG9jY3VycyB3aGVuZXZlciBhbgotYXV0b21hdGljIGluY3JlbWVudGFsIGJ1aWxkIG9jY3VycyBhcyBhIHJlc3VsdCBvZiBhIHJlc291cmNlIGNoYW5nZSwgc3VjaAotYXMgd2hlbiBhIHByb2plY3QgaXMgY3JlYXRlZCwgYSAuamF2YSBmaWxlIGlzIGVkaXRlZCwgb3IgYSBtb2RlbCBmaWxlIChzdWNoCi1hcyBlamItamFyLnhtbCwgLm1hcHhtaSwgb3IgLnJkYnhtaSkgaXMgY2hhbmdlZCBvciBzYXZlZC4gQnkKLWRlZmF1bHQsIG1hbnVhbCBjb2RlIHZhbGlkYXRpb24gYW5kIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24gYXJlIGVuYWJsZWQKLWluIHRoZSBwcmVmZXJlbmNlcy48L3A+Ci08cD5PbiB0aGUgUHJvcGVydGllcyBwYWdlIGZvciBlYWNoIGVudGVycHJpc2UgYXBwbGljYXRpb24KLW1vZHVsZSBwcm9qZWN0LCB5b3Ugd2lsbCBmaW5kIGEgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgeW91IGNhbiBydW4gYWdhaW5zdAotYSBzZWxlY3RlZCBwcm9qZWN0LiBUaGUgbGlzdCBvZiB2YWxpZGF0b3JzIGlzIGRpZmZlcmVudCBmb3IgZWFjaCB0eXBlIG9mIHByb2plY3QuIDwvcD4KLTxwPkZvcgotbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB2YWxpZGF0aW9uLCBzZWUgdGhlIGZvbGxvd2luZyB0b3BpY3M6PC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcnZhbGVyci5odG1sIj5Db21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9uczwvYT48L3N0cm9uZz48YnIgLz4KLVlvdSBtYXkgZW5jb3VudGVyIHRoZXNlIGNvbW1vbiBlcnJvciBtZXNzYWdlcyB3aGVuIHlvdSB2YWxpZGF0ZQoteW91ciBwcm9qZWN0cy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCI+SjJFRSBWYWxpZGF0b3JzPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YWJsZSBsaXN0cyB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoZSBkaWZmZXJlbnQKLXByb2plY3QgdHlwZXMgYW5kIGdpdmVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaCB2YWxpZGF0b3IuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsYXV0by5odG1sIj5FbmFibGluZyBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uPC9hPjwvc3Ryb25nPjxiciAvPgotSWYgeW91IHdhbnQgdmFsaWRhdGlvbiB0byBvY2N1ciBhdXRvbWF0aWNhbGx5IGR1cmluZyBhbiBhdXRvbWF0aWMKLWluY3JlbWVudGFsIGJ1aWxkIHRoYXQgb2NjdXJzIGFzIGEgcmVzdWx0IG9mIGEgcmVzb3VyY2UgY2hhbmdlLCB5b3UgY2FuIGVuYWJsZQotYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxidWlsZC5odG1sIj5FbmFibGluZyBidWlsZCB2YWxpZGF0aW9uPC9hPjwvc3Ryb25nPjxiciAvPgotWW91IGNhbiBlbmFibGUgdmFsaWRhdGlvbiB0byBvY2N1ciBkdXJpbmcgYSBidWlsZCBvZiBhIHByb2plY3QuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIj5EaXNhYmxpbmcgYSB2YWxpZGF0b3I8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Zb3UgY2FuIGRpc2FibGUgb25lIG9yIG1vcmUgdmFsaWRhdG9ycyBmb3IgYSBwcm9qZWN0LjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L3N0cm9uZz48YnIgLz4KLUZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbG1hbnVhbC5odG1sIj5NYW51YWxseSB2YWxpZGF0aW5nIGNvZGU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1XaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsIHJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQKLXByb2plY3QgYXJlIHZhbGlkYXRlZCB3aXRoIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIHNlbGVjdGVkIG9uIHRoZSBWYWxpZGF0aW9uCi1wYWdlIG9mIHRoZSBwcm9qZWN0IFByb3BlcnRpZXMgZGlhbG9nLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbHNlbGVjdC5odG1sIj5TZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzPC9hPjwvc3Ryb25nPjxiciAvPgotWW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgdmFsaWRhdG9ycyB0byBydW4gZm9yIGEgcHJvamVjdCBkdXJpbmcKLW1hbnVhbCBhbmQgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi48L2xpPgotPC91bD4KLQotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1qMmVlYXBwLmh0bWwiIHRpdGxlPSJUaGVzZSB0b3BpY3MgZGVhbCB3aXRoIHRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkuIj5KMkVFIEFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9ydmFsZXJyLmh0bWwiIHRpdGxlPSJZb3UgbWF5IGVuY291bnRlciB0aGVzZSBjb21tb24gZXJyb3IgbWVzc2FnZXMgd2hlbiB5b3UgdmFsaWRhdGUgeW91ciBwcm9qZWN0cy4iPkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGUgZGlmZmVyZW50IHByb2plY3QgdHlwZXMgYW5kIGdpdmVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaCB2YWxpZGF0b3IuIj5KMkVFIFZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGF1dG8uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsYXV0by5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDE0NjBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsYXV0by5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLQotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53dHAuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLQotPHRpdGxlPkVuYWJsaW5nIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqdmFsYXV0byI+PGEgbmFtZT0idGp2YWxhdXRvIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVuYWJsaW5nIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb248L2gxPgotPGRpdj48cD5JZiB5b3Ugd2FudCB2YWxpZGF0aW9uIHRvIG9jY3VyIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGFuIGF1dG9tYXRpYwotaW5jcmVtZW50YWwgYnVpbGQgdGhhdCBvY2N1cnMgYXMgYSByZXN1bHQgb2YgYSByZXNvdXJjZSBjaGFuZ2UsIHlvdSBjYW4gZW5hYmxlCi1hdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5Zb3UgY2FuIGVuYWJsZSBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uIGZvciBhbGwgcHJvamVjdHMgaW4KLXlvdXIgd29ya3NwYWNlIG9yIGZvciBvbmx5IHRoZSBvbmVzIHlvdSBzZWxlY3QuPC9wPgotPHA+PC9wPgotPC9kaXY+Ci08b2w+PGxpPjxzcGFuPk9uIHRoZSB3b3JrYmVuY2ggbWVudSBiYXIsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPjwvc3Bhbj4uIFRoZSBQcmVmZXJlbmNlcyB3aW5kb3cgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4gb24gdGhlIGxlZnQgcGFuZSBvZiB0aGUKLXdpbmRvdy4gVGhpcyBwYWdlIGxpc3RzIHZhbGlkYXRpb24gb3B0aW9ucyBmb3IgeW91ciBlbnRpcmUgd29ya3NwYWNlLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuIHZhbGlkYXRpb24gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlCi1jaGFuZ2VzIHRvIGEgcmVzb3VyY2U8L3NwYW4+IGNoZWNrIGJveC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5JZiB5b3Ugd2FudCB0byBhbGxvdyBpbmRpdmlkdWFsIHByb2plY3RzIHRvIGhhdmUgZGlmZmVyZW50IHZhbGlkYXRpb24KLXNldHRpbmdzLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2UKLXNldHRpbmdzPC9zcGFuPiBjaGVjayBib3guPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2hvb3NlIHRoZSB2YWxpZGF0b3JzIHRoYXQgeW91IHdhbnQgdG8gdXNlIGJ5IHNlbGVjdGluZyBvciBjbGVhcmluZwotdGhlIGNoZWNrIGJveGVzIG5leHQgdG8gdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uIE5vdywgeW91ciBwcm9qZWN0cyB3aWxsIGJlIHZhbGlkYXRlZAotYXV0b21hdGljYWxseSB3aGVuIHRoZXkgYXJlIGNoYW5nZWQuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+SWYgeW91IHdhbnQgdG8gc2V0IGRpZmZlcmVudCBhdXRvbWF0aWMgdmFsaWRhdGlvbgotc2V0dGluZ3MgZm9yIHNwZWNpZmljIHByb2plY3RzLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9zcGFuPjxvbCB0eXBlPSJhIj48bGk+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgcmlnaHQtY2xpY2sgYSBwcm9qZWN0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPi4KLVRoZSBQcm9wZXJ0aWVzIHdpbmRvdyBvcGVucy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPiBvbiB0aGUgbGVmdCBwYW5lIG9mCi10aGUgd2luZG93LiBUaGlzIHBhZ2UgbGlzdHMgdmFsaWRhdGlvbiBvcHRpb25zIGZvciB0aGUgcHJvamVjdC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5PbiB0aGUgVmFsaWRhdGlvbiBwYWdlLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJyaWRlIHZhbGlkYXRpb24KLXByZWZlcmVuY2VzPC9zcGFuPiBjaGVjayBib3guPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+SWYgeW91IHdhbnQgdGhpcyBwcm9qZWN0IHRvIGJlIHZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4KLXlvdSBtYWtlIGNoYW5nZXMsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuIHZhbGlkYXRpb24gYXV0b21hdGljYWxseSB3aGVuCi15b3UgbWFrZSBjaGFuZ2VzIHRvIDx2YXIgY2xhc3M9InZhcm5hbWUiPnByb2plY3RfbmFtZTwvdmFyPiByZXNvdXJjZXM8L3NwYW4+IGNoZWNrCi1ib3guPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2hvb3NlIHRoZSB2YWxpZGF0b3JzIHRoYXQgeW91IHdhbnQgdG8gdXNlIGJ5IHNlbGVjdGluZyBvciBjbGVhcmluZwotdGhlIGNoZWNrIGJveGVzIG5leHQgdG8gdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08L29sPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+SWYgYW55IGVycm9ycyBhcmUgZGV0ZWN0ZWQsIGFuIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZSBpcyBsb2dnZWQKLWluIHRoZSBQcm9ibGVtcyB2aWV3LiBUaGVzZSBtZXNzYWdlcyBjYW5ub3QgYmUgcmVtb3ZlZCBtYW51YWxseS4gT25jZSB0aGUKLXByb2JsZW0gaXMgZml4ZWQgdGhhdCBjYXVzZWQgdGhlIG1lc3NhZ2VzIHRvIGJlIGdlbmVyYXRlZCwgdGhlIG1lc3NhZ2VzIGFyZQotYXV0b21hdGljYWxseSByZW1vdmVkLiBZb3UgY2FuLCBob3dldmVyLCB1c2UgdGhlIEZpbHRlciBUYXNrcyB3aXphcmQgdG8gdGVtcG9yYXJpbHkKLWZpbHRlciBvdXQgYW55IG1lc3NhZ2VzIGluIHRoZSBQcm9ibGVtcyB2aWV3IHVudGlsIHlvdSBjYW4gZml4IHRoZSBhc3NvY2lhdGVkCi1wcm9ibGVtcy4gVG8gb3BlbiB0aGUgRmlsdGVyIFRhc2tzIHdpemFyZCwgY2xpY2sgdGhlIEZpbHRlcnMgaWNvbiBpbiB0aGUgdGl0bGUKLWJhciBvZiB0aGUgUHJvYmxlbXMgdmlldy4gQWx0ZXJuYXRpdmVseSwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNlZSBhbnkgcHJvYmxlbXMKLWRldGVjdGVkIGJ5IGEgcGFydGljdWxhciB2YWxpZGF0b3IsIG9uIGEgcGFydGljdWxhciBwcm9qZWN0LCB5b3UgY2FuIGRpc2FibGUKLXRoZSB2YWxpZGF0b3IgaW4gdGhlIHByb2plY3QncyBQcm9wZXJ0aWVzIHBhZ2UuIFdoZW4gYSB2YWxpZGF0b3IgaXMgZGlzYWJsZWQsCi1hbGwgbWVzc2FnZXMgZnJvbSB0aGF0IHZhbGlkYXRvciBhcmUgcmVtb3ZlZC48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGp2YWwuaHRtbCI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGJ1aWxkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVuYWJsZSB2YWxpZGF0aW9uIHRvIG9jY3VyIGR1cmluZyBhIGJ1aWxkIG9mIGEgcHJvamVjdC4iPkVuYWJsaW5nIGJ1aWxkIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGRpc2FibGUuaHRtbCIgdGl0bGU9IllvdSBjYW4gZGlzYWJsZSBvbmUgb3IgbW9yZSB2YWxpZGF0b3JzIGZvciBhIHByb2plY3QuIj5EaXNhYmxpbmcgYSB2YWxpZGF0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCIgdGl0bGU9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsbWFudWFsLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsIHJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBhcmUgdmFsaWRhdGVkIHdpdGggdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgc2VsZWN0ZWQgb24gdGhlIFZhbGlkYXRpb24gcGFnZSBvZiB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZy4iPk1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNlbGVjdCBzcGVjaWZpYyB2YWxpZGF0b3JzIHRvIHJ1biBmb3IgYSBwcm9qZWN0IGR1cmluZyBtYW51YWwgYW5kIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24uIj5TZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxidWlsZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxidWlsZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmFiYzg0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsYnVpbGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5FbmFibGluZyBidWlsZCB2YWxpZGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbGJ1aWxkIj48YSBuYW1lPSJ0anZhbGJ1aWxkIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVuYWJsaW5nIGJ1aWxkIHZhbGlkYXRpb248L2gxPgotPGRpdj48cD5Zb3UgY2FuIGVuYWJsZSB2YWxpZGF0aW9uIHRvIG9jY3VyIGR1cmluZyBhIGJ1aWxkIG9mIGEgcHJvamVjdC48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+QnVpbGQgdmFsaWRhdGlvbiBvY2N1cnMgd2hlbiB5b3Ugc2VsZWN0IGVpdGhlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5CdWlsZAotUHJvamVjdDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJ1aWxkIEFsbDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlYnVpbGQKLVByb2plY3Q8L3NwYW4+LCBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWJ1aWxkIEFsbDwvc3Bhbj4uIFRoZXNlIGJ1aWxkIG9wdGlvbnMKLWFwcGVhciBpbiBhIHBvcC11cCBtZW51IG9ubHkgaWYgYXV0b21hdGljIGJ1aWxkcyBhcmUgZGlzYWJsZWQuIEVhY2ggb2YgdGhlCi1idWlsZCBjb21tYW5kcyBzdGFydHMgYW4gaW5jcmVtZW50YWwgYnVpbGQgb2YgdGhlIHByb2plY3Qgb3Igd29ya3NwYWNlLiBUaGUKLWluY3JlbWVudGFsIGJ1aWxkIHZhbGlkYXRlcyB0aGUgcHJvamVjdCB1c2luZyB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkCi1mb3IgdGhlIHByb2plY3QuIFRoZSBpbmNyZW1lbnRhbCBidWlsZCBhbHNvIHZhbGlkYXRlcyBhbnkgcHJvamVjdHMgdGhhdCBhcmUKLXJlZmVyZW5jZWQgYnkgdGhlIHByb2plY3QgYmVpbmcgdmFsaWRhdGVkLCB1c2luZyB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkCi1mb3IgZWFjaCByZXNwZWN0aXZlIHByb2plY3QuIFRoZSByZWJ1aWxkIGNvbW1hbmRzIHN0YXJ0IGEgZnVsbCBidWlsZCAoYWxsCi1wcmV2aW91cyBidWlsZCBvdXRwdXQgaXMgZGVsZXRlZCBhbmQgZXZlcnl0aGluZyBpcyByZWNyZWF0ZWQpLjwvcD4KLTxwPlRvIGVuYWJsZQotYnVpbGQgdmFsaWRhdGlvbjogPC9wPgotPC9kaXY+Ci08b2w+PGxpPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHJpZ2h0LWNsaWNrIHlvdXIgcHJvamVjdCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPk9uIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPiBwYWdlLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJyaWRlCi12YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9zcGFuPiBjaGVjayBib3ggdG8gb3ZlcnJpZGUgZ2xvYmFsIHByZWZlcmVuY2VzCi1mb3IgdGhpcyBwcm9qZWN0Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkVuc3VyZSB0aGF0IHRoZSB2YWxpZGF0b3JzIHRoYXQgeW91IHdhbnQgdG8gcnVuIGFyZSBzZWxlY3RlZC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJ1biB2YWxpZGF0aW9uIHdoZW4geW91IG1hbnVhbGx5Ci1idWlsZCAmbHQ7cHJvamVjdF9uYW1lJmd0Ozwvc3Bhbj4gY2hlY2sgYm94LiA8L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsYXV0by5odG1sIiB0aXRsZT0iSWYgeW91IHdhbnQgdmFsaWRhdGlvbiB0byBvY2N1ciBhdXRvbWF0aWNhbGx5IGR1cmluZyBhbiBhdXRvbWF0aWMgaW5jcmVtZW50YWwgYnVpbGQgdGhhdCBvY2N1cnMgYXMgYSByZXN1bHQgb2YgYSByZXNvdXJjZSBjaGFuZ2UsIHlvdSBjYW4gZW5hYmxlIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24uIj5FbmFibGluZyBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGRpc2FibGUgb25lIG9yIG1vcmUgdmFsaWRhdG9ycyBmb3IgYSBwcm9qZWN0LiI+RGlzYWJsaW5nIGEgdmFsaWRhdG9yPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIHRpdGxlPSJGb3IgYSBnaXZlbiBwcm9qZWN0LCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4iPk92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbG1hbnVhbC5odG1sIiB0aXRsZT0iV2hlbiB5b3UgcnVuIGEgbWFudWFsIHZhbGlkYXRpb24sIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNlbGVjdGVkIHByb2plY3QgYXJlIHZhbGlkYXRlZCB3aXRoIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIHNlbGVjdGVkIG9uIHRoZSBWYWxpZGF0aW9uIHBhZ2Ugb2YgdGhlIHByb2plY3QgUHJvcGVydGllcyBkaWFsb2cuIj5NYW51YWxseSB2YWxpZGF0aW5nIGNvZGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbHNlbGVjdC5odG1sIiB0aXRsZT0iWW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgdmFsaWRhdG9ycyB0byBydW4gZm9yIGEgcHJvamVjdCBkdXJpbmcgbWFudWFsIGFuZCBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uLiI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzkxMTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+RGlzYWJsaW5nIGEgdmFsaWRhdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbGRpc2FibGUiPjxhIG5hbWU9InRqdmFsZGlzYWJsZSI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EaXNhYmxpbmcgYSB2YWxpZGF0b3I8L2gxPgotPGRpdj48cD5Zb3UgY2FuIGRpc2FibGUgb25lIG9yIG1vcmUgdmFsaWRhdG9ycyBmb3IgYSBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5FcnJvcnMgYW5kIHdhcm5pbmcgbWVzc2FnZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldwotd2hlbiB2YWxpZGF0aW9uIGlzIHJ1bi4gVG8gZGlzYWJsZSBvbmUgb3IgbW9yZSB2YWxpZGF0b3JzIGZvciBhIHByb2plY3Q6PC9wPgotPC9kaXY+Ci08b2w+PGxpPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHJpZ2h0LWNsaWNrIHlvdXIgcHJvamVjdCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPk9uIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPiBwYWdlLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJyaWRlCi12YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9zcGFuPiBjaGVjayBib3ggdG8gb3ZlcnJpZGUgZ2xvYmFsIHByZWZlcmVuY2VzCi1mb3IgdGhpcyBwcm9qZWN0Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsZWFyIHRoZSBjaGVjayBib3ggbmV4dCB0byB0aGUgdmFsaWRhdG9ycyB0aGF0IHlvdSB3YW50IHRvIGRpc2FibGUuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPk9ubHkgdGhvc2UgdmFsaWRhdG9ycyB0aGF0IGFyZSBzZWxlY3RlZCBvbiB0aGUgUHJvcGVydGllcyBwYWdlIHdpbGwKLXJ1biBhdXRvbWF0aWNhbGx5LCBtYW51YWxseSwgb3IgZHVyaW5nIGEgYnVpbGQuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsLmh0bWwiPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxhdXRvLmh0bWwiIHRpdGxlPSJJZiB5b3Ugd2FudCB2YWxpZGF0aW9uIHRvIG9jY3VyIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGFuIGF1dG9tYXRpYyBpbmNyZW1lbnRhbCBidWlsZCB0aGF0IG9jY3VycyBhcyBhIHJlc3VsdCBvZiBhIHJlc291cmNlIGNoYW5nZSwgeW91IGNhbiBlbmFibGUgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi4iPkVuYWJsaW5nIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGJ1aWxkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVuYWJsZSB2YWxpZGF0aW9uIHRvIG9jY3VyIGR1cmluZyBhIGJ1aWxkIG9mIGEgcHJvamVjdC4iPkVuYWJsaW5nIGJ1aWxkIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCIgdGl0bGU9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsbWFudWFsLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsIHJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBhcmUgdmFsaWRhdGVkIHdpdGggdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgc2VsZWN0ZWQgb24gdGhlIFZhbGlkYXRpb24gcGFnZSBvZiB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZy4iPk1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNlbGVjdCBzcGVjaWZpYyB2YWxpZGF0b3JzIHRvIHJ1biBmb3IgYSBwcm9qZWN0IGR1cmluZyBtYW51YWwgYW5kIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24uIj5TZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0ZTZhMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5PdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbGdsb2JhbHByZWYiPjxhIG5hbWU9InRqdmFsZ2xvYmFscHJlZiI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5PdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9oMT4KLTxkaXY+PHA+Rm9yIGEgZ2l2ZW4gcHJvamVjdCwgeW91IGNhbiBvdmVycmlkZSB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPlRoZSBkZWZhdWx0IHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgYXJlIHNwZWNpZmllZCBnbG9iYWxseSBvbgotdGhlIFZhbGlkYXRpb24gcGFnZSBvZiB0aGUgUHJlZmVyZW5jZXMgZGlhbG9nLiBUbyBhbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZQotdGhlc2UgZGVmYXVsdCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzOjwvcD4KLTwvZGl2PgotPG9sPjxsaT48c3Bhbj5PbiB0aGUgd29ya2JlbmNoIG1lbnUsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+T24gdGhlIFZhbGlkYXRpb24gcGFnZSBvZiB0aGUgUHJlZmVyZW5jZXMgZGlhbG9nLCBtYWtlIHN1cmUgdGhhdAotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3M8L3NwYW4+IGlzCi1zZWxlY3RlZC48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsLmh0bWwiPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxhdXRvLmh0bWwiIHRpdGxlPSJJZiB5b3Ugd2FudCB2YWxpZGF0aW9uIHRvIG9jY3VyIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGFuIGF1dG9tYXRpYyBpbmNyZW1lbnRhbCBidWlsZCB0aGF0IG9jY3VycyBhcyBhIHJlc3VsdCBvZiBhIHJlc291cmNlIGNoYW5nZSwgeW91IGNhbiBlbmFibGUgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi4iPkVuYWJsaW5nIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGJ1aWxkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVuYWJsZSB2YWxpZGF0aW9uIHRvIG9jY3VyIGR1cmluZyBhIGJ1aWxkIG9mIGEgcHJvamVjdC4iPkVuYWJsaW5nIGJ1aWxkIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGRpc2FibGUuaHRtbCIgdGl0bGU9IllvdSBjYW4gZGlzYWJsZSBvbmUgb3IgbW9yZSB2YWxpZGF0b3JzIGZvciBhIHByb2plY3QuIj5EaXNhYmxpbmcgYSB2YWxpZGF0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbG1hbnVhbC5odG1sIiB0aXRsZT0iV2hlbiB5b3UgcnVuIGEgbWFudWFsIHZhbGlkYXRpb24sIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNlbGVjdGVkIHByb2plY3QgYXJlIHZhbGlkYXRlZCB3aXRoIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIHNlbGVjdGVkIG9uIHRoZSBWYWxpZGF0aW9uIHBhZ2Ugb2YgdGhlIHByb2plY3QgUHJvcGVydGllcyBkaWFsb2cuIj5NYW51YWxseSB2YWxpZGF0aW5nIGNvZGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbHNlbGVjdC5odG1sIiB0aXRsZT0iWW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgdmFsaWRhdG9ycyB0byBydW4gZm9yIGEgcHJvamVjdCBkdXJpbmcgbWFudWFsIGFuZCBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uLiI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsbWFudWFsLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbG1hbnVhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE0N2JmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsbWFudWFsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotCi0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnd0cC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+TWFudWFsbHkgdmFsaWRhdGluZyBjb2RlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbG1hbnVhbCI+PGEgbmFtZT0idGp2YWxtYW51YWwiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWFudWFsbHkgdmFsaWRhdGluZyBjb2RlPC9oMT4KLTxkaXY+PHA+V2hlbiB5b3UgcnVuIGEgbWFudWFsIHZhbGlkYXRpb24sIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNlbGVjdGVkCi1wcm9qZWN0IGFyZSB2YWxpZGF0ZWQgd2l0aCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBzZWxlY3RlZCBvbiB0aGUgVmFsaWRhdGlvbgotcGFnZSBvZiB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBtYW51YWxseSBpbnZva2UgYW4gaW1tZWRpYXRlIGNvZGUgdmFsaWRhdGlvbjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgcHJvamVjdCB0aGF0IHlvdSB3YW50IHRvIHZhbGlkYXRlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodC1jbGljayB0aGUgcHJvamVjdCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJ1biBWYWxpZGF0aW9uPC9zcGFuPi48L3NwYW4+IElmIG5vIHZhbGlkYXRvcnMgd2VyZSBzZWxlY3RlZCwgYSBtZXNzYWdlIGJveCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dAotaG93IHRvIHNlbGVjdCBhIHZhbGlkYXRvci48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBzZWxlY3RlZCB2YWxpZGF0b3JzCi1mb3IgdGhlIHByb2plY3QuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsLmh0bWwiPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxhdXRvLmh0bWwiIHRpdGxlPSJJZiB5b3Ugd2FudCB2YWxpZGF0aW9uIHRvIG9jY3VyIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGFuIGF1dG9tYXRpYyBpbmNyZW1lbnRhbCBidWlsZCB0aGF0IG9jY3VycyBhcyBhIHJlc3VsdCBvZiBhIHJlc291cmNlIGNoYW5nZSwgeW91IGNhbiBlbmFibGUgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi4iPkVuYWJsaW5nIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGJ1aWxkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVuYWJsZSB2YWxpZGF0aW9uIHRvIG9jY3VyIGR1cmluZyBhIGJ1aWxkIG9mIGEgcHJvamVjdC4iPkVuYWJsaW5nIGJ1aWxkIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGRpc2FibGUuaHRtbCIgdGl0bGU9IllvdSBjYW4gZGlzYWJsZSBvbmUgb3IgbW9yZSB2YWxpZGF0b3JzIGZvciBhIHByb2plY3QuIj5EaXNhYmxpbmcgYSB2YWxpZGF0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCIgdGl0bGU9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNlbGVjdCBzcGVjaWZpYyB2YWxpZGF0b3JzIHRvIHJ1biBmb3IgYSBwcm9qZWN0IGR1cmluZyBtYW51YWwgYW5kIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24uIj5TZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxzZWxlY3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTM5NWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxzZWxlY3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci0KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3RwLmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci0KLTx0aXRsZT5TZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbHNlbGVjdCI+PGEgbmFtZT0idGp2YWxzZWxlY3QiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gc2VsZWN0IHNwZWNpZmljIHZhbGlkYXRvcnMgdG8gcnVuIGZvciBhIHByb2plY3QgZHVyaW5nCi1tYW51YWwgYW5kIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24uPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gY2hvb3NlIHRoZSB2YWxpZGF0b3JzIHRoYXQgeW91IHdhbnQgdG8gdXNlIGZvciBhIHByb2plY3Q6PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCByaWdodC1jbGljayB5b3VyIHByb2plY3QgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T24gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+IHBhZ2UsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3ZlcnJpZGUKLXZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L3NwYW4+IGNoZWNrIGJveCB0byBvdmVycmlkZSBnbG9iYWwgcHJlZmVyZW5jZXMKLWZvciB0aGlzIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgdmFsaWRhdG9ycyB0aGF0IHlvdSB3YW50IHRvIHJ1bi4gPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYKLXlvdSBkZXNlbGVjdCBhbnkgdmFsaWRhdG9yIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkLCBhbnkgbWVzc2FnZXMgYXNzb2NpYXRlZAotd2l0aCB0aGUgZGVzZWxlY3RlZCB2YWxpZGF0b3Igd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHRhc2sgbGlzdC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsLmh0bWwiPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxhdXRvLmh0bWwiIHRpdGxlPSJJZiB5b3Ugd2FudCB2YWxpZGF0aW9uIHRvIG9jY3VyIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGFuIGF1dG9tYXRpYyBpbmNyZW1lbnRhbCBidWlsZCB0aGF0IG9jY3VycyBhcyBhIHJlc3VsdCBvZiBhIHJlc291cmNlIGNoYW5nZSwgeW91IGNhbiBlbmFibGUgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi4iPkVuYWJsaW5nIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGJ1aWxkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVuYWJsZSB2YWxpZGF0aW9uIHRvIG9jY3VyIGR1cmluZyBhIGJ1aWxkIG9mIGEgcHJvamVjdC4iPkVuYWJsaW5nIGJ1aWxkIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGRpc2FibGUuaHRtbCIgdGl0bGU9IllvdSBjYW4gZGlzYWJsZSBvbmUgb3IgbW9yZSB2YWxpZGF0b3JzIGZvciBhIHByb2plY3QuIj5EaXNhYmxpbmcgYSB2YWxpZGF0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCIgdGl0bGU9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsbWFudWFsLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsIHJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBhcmUgdmFsaWRhdGVkIHdpdGggdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgc2VsZWN0ZWQgb24gdGhlIFZhbGlkYXRpb24gcGFnZSBvZiB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZy4iPk1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlYjhjOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0RlbGV0ZUJlYW5fSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9EZWxldGVCZWFuX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NDU1YTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0RlbGV0ZUJlYW5fSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iY29tLmlibS53dHAuZ2VuZXJpYy5EZWxldGUiPgotICAgIDwhLS0gZnVuY3Rpb24gc2NoZWR1bGVkIGZvciBXVFAgMS4wIC0tPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyBib3ggdG8gc3BlY2lmeSB0aGUgZGVsZXRpb24gb3B0aW9ucyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbjoKLQotLSAgPGI+RGVsZXRlIGRlcGxveWVkIGNvZGU6PC9iPiBTZWxlY3QgdG8gZGVsZXRlIHRoZSBnZW5lcmF0ZWQgZGVwbG95bWVudCBjb2RlIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuLgotLSAgPGI+RGVsZXRlIGdlbmVyYXRlZCBBY2Nlc3NCZWFuOjwvYj4gU2VsZWN0IHRvIGRlbGV0ZSB0aGUgYWNjZXNzIGJlYW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50ZXJwcmlzZSBiZWFuLgotLSAgPGI+RGVsZXRlIEJlYW4gZnJvbSBEZXBsb3ltZW50IERlc2NyaXB0b3I6PC9iPiBTZWxlY3QgdG8gZGVsZXRlIHRoZSBiZWFuIGVudHJ5IGZyb20gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYnV0IGRvIG5vdCBkZWxldGUgdGhlIGJlYW4uCi0tICA8Yj5EZWxldGUgQmVhbiBDbGFzc2VzOjwvYj4gU2VsZWN0IHRvIGRlbGV0ZSB0aGUgY2xhc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBiZWFuLgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0VKQkNyZWF0ZVdpemFyZF9IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0VKQkNyZWF0ZVdpemFyZF9IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTEzMjBmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9FSkJDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci0KLTwhLS0gUGFnZSAxLCBDcmVhdGUgYW4gRW50ZXJwcmlzZSBCZWFuICAtLT4KLTxjb250ZXh0IGlkPSJhbnRlamIxMDAwIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZW50ZXJwcmlzZSBiZWFuIHR5cGU6IHNlc3Npb24gYmVhbiBvciBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCQotWW91IG11c3QgaW5zdGFsbCBhbmQgZW5hYmxlIFhEb2NsZXQgYmVmb3JlIGNyZWF0aW5nIGEgc2Vzc2lvbiBvciBtZXNzYWdlLWRyaXZlbiBiZWFuLiBGb2xsb3cgdGhlc2Ugc3RlcHM6Ci0JMSAtIEZpcnN0LCBkb3dubG9hZCBhbmQgaW5zdGFsbCBYRG9jbGV0IGZyb20gaHR0cDovL3hkb2NsZXQuc291cmNlZm9yZ2UubmV0L3hkb2NsZXQvaW5zdGFsbC5odG1sCi0JMiAtIE5leHQsIGNsaWNrIHRoZSA8Yj5wcmVmZXJlbmNlczwvYj4gbGluayB0byBjb25maWd1cmUgdGhlIFhEb2NsZXQgUnVudGltZSBQcmVmZXJlbmNlcy4gQW5vdGhlciB3YXkgdG8gZ2V0IHRvIHRoZSBYRG9jbGV0IFJ1bnRpbWUgUHJlZmVyZW5jZXMgcGFnZSBpcyBmcm9tIDxiPldpbmRvdyA+IFByZWZlcmVuY2VzID4gSjJFRSBBbm5vdGF0aW9ucyA+IFhEb2NsZXQ8L2I+LgotCTMgLSBDaGVjayB0aGUgPGI+RW5hYmxlIFhEb2NsZXQgQnVpbGRlcjwvYj4gY2hlY2sgYm94LgotCTQgLSBTZWxlY3QgdGhlIFZlcnNpb24gb2YgWERvY2xldCB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZC4KLQk1IC0gVXNlIHRoZSBCcm93c2UgYnV0dG9uIHRvIGxvY2F0ZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgWERvY2xldCAoPGI+WERvY2xldCBIb21lPC9iPikuCi0JNiAtIENsaWNrIDxiPk9LPC9iPiB0byBzYXZlIHRoZSBwcmVmZXJlbmNlcy4KLQkKLUFmdGVyIGluc3RhbGxpbmcgYW5kIGNvbmZpZ3VyaW5nIFhEb2NsZXQsIHNlbGVjdCB0aGUgYmVhbiB0eXBlIHlvdSB3YW50IHRvIGNyZWF0ZSBhbmQgY2xpY2sgPGI+TmV4dDwvYj4uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBlbnRlcnByaXNlIGJlYW5zIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWNydGUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFSkIgYXJjaGl0ZWN0dXJlIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy9jZWFyY2guaHRtbCIvPgotPCEtLSBsaW5rIHRvIG9yZy5lY2xpcHNlLmpzdC5hbm5vdGF0aW9uLnVzZXIuZG9jICBhbm5vdGF0aW9uIHRhZ2dpbmcgLS0+Ci08L2NvbnRleHQ+Ci0KLTwhLS0gUGFnZSAyLCBFbnRlcnByaXNlIEJlYW4gY2xhc3MgZmlsZSBkZWZpbml0aW9uIC0tPgotPGNvbnRleHQgaWQ9ImFudGVqYjExMDAiPgotPGRlc2NyaXB0aW9uPkVudGVyIHRoZSA8Yj5Qcm9qZWN0PC9iPiwgPGI+TW9kdWxlIE5hbWU8L2I+LCBhbmQgd29ya3NwYWNlIDxiPkZvbGRlcjwvYj4gZm9yIHRoZSBuZXcgZW50ZXJwcmlzZSBiZWFuLgotCi1FbnRlciB0aGUgPGI+SmF2YSBwYWNrYWdlPC9iPiBhbmQgPGI+Q2xhc3MgbmFtZTwvYj4gZm9yIHRoZSBuZXcgZW50ZXJwcmlzZSBiZWFuLiAKLUNoYW5nZSB0aGUgPGI+U3VwZXJjbGFzczwvYj4gaWYgeW91ciBjbGFzcyB3aWxsIG92ZXJyaWRlIGEgY2xhc3Mgb3RoZXIgdGhhbiBqYXZhLmxhbmcuT2JqZWN0LgotCi1TZWxlY3QgdGhlIDxiPkdlbmVyYXRlIGFuIGFubm90YXRlZCBiZWFuIGNsYXNzPC9iPiBjaGVjayBib3ggdG8gYWRkIEoyRUUgYW5ub3RhdGlvbnMgdG8gdGhlIHNvdXJjZSBmaWxlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZW50ZXJwcmlzZSBiZWFucyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVjcnRlLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gRUpCIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlY3J0cHJvLmh0bWwiLz4KLTwhLS0gbGluayB0byBvcmcuZWNsaXBzZS5qc3QuYW5ub3RhdGlvbi51c2VyLmRvYyAgYW5ub3RhdGlvbiB0YWdnaW5nIC0tPgotPC9jb250ZXh0PgotCi08IS0tIFBhZ2UgMywgRW50ZXJwcmlzZSBCZWFuIGRldGFpbHMgLS0+Ci08Y29udGV4dCBpZD0iYW50ZWpiMTIwMCI+Ci08ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgRUpCLCBKTkRJIGFuZCBEaXNwbGF5IG5hbWVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuLiAKLQlUaGUgPGI+RUpCIG5hbWU8L2I+IGlzIHRoZSBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gY2xhc3MuCi0JVGhlIDxiPkpOREkgbmFtZTwvYj4gaXMgYSBsb2dpY2FsIG5hbWUgdXNlZCBieSB0aGUgc2VydmVyIHRvIGxvY2F0ZSBhbiBlbnRlcnByaXNlIGJlYW4gYXQgcnVudGltZS4KLQlUaGUgPGI+RGlzcGxheSBuYW1lPC9iPiBpcyBhIHNob3J0IG5hbWUgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4gdGhhdCBpcyB1c2VkIGJ5IHRvb2xzLgkKLQotT3B0aW9uYWxseSwgcHJvdmlkZSBhIHRleHQgPGI+RGVzY3JpcHRpb248L2I+IG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gY2xhc3MuCi0KLVNlbGVjdCB0aGUgPGI+U3RhdGUgVHlwZTwvYj4gKHN0YXRlbGVzcyBvciBzdGF0ZWZ1bCkgaWYgeW91IGFyZSBjcmVhdGluZyBhIHNlc3Npb24gYmVhbi4KLUEgc3RhdGVmdWwgc2Vzc2lvbiBiZWFuIG1haW50YWlucyBjbGllbnQtc3BlY2lmaWMgc2Vzc2lvbiBpbmZvcm1hdGlvbiwgb3IgY29udmVyc2F0aW9uYWwgc3RhdGUsIGFjcm9zcyBtdWx0aXBsZSBtZXRob2QgY2FsbHMgYW5kIHRyYW5zYWN0aW9ucy4KLUEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbiBkb2VzIG5vdCBtYWludGFpbiBjb252ZXJzYXRpb25hbCBzdGF0ZS4KLQotU2VsZWN0IHRoZSA8Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPiAoY29udGFpbmVyIG9yIGJlYW4pIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuLiBUaGlzIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb250YWluZXIgb3IgdGhlIGJlYW4gd2lsbCBoYW5kbGUgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBlbnRlcnByaXNlIGJlYW5zIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWNydGUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhbiBFSkIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVjcnRwcm8uaHRtbCIvPgotPC9jb250ZXh0PgotCi08IS0tIFBhZ2UgNCwgRW50ZXJwcmlzZSBCZWFuIG1vZGlmaWVycywgaW50ZXJmYWNlcyBhbmQgbWV0aG9kIHN0dWJzIC0tPgotPGNvbnRleHQgaWQ9ImFudGVqYjEzMDAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgdHlwZSBvZiA8Yj5Nb2RpZmllcnM8L2I+IGZvciB0aGUgYmVhbiBjbGFzcy4KLQkKLVNlbGVjdCB0aGUgPGI+SW50ZXJmYWNlczwvYj4gdGhhdCB5b3VyIGJlYW4gY2xhc3Mgd2lsbCBpbXBsZW1lbnQuIFVzZSB0aGUgPGI+QWRkPC9iPiBhbmQgPGI+UmVtb3ZlPC9iPiBidXR0b25zIHRvIGNyZWF0ZSB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzLgotCi1TZWxlY3Qgd2hpY2ggbWV0aG9kIHN0dWJzIHRoYXQgeW91IHdhbnQgY3JlYXRlZCBpbiB0aGUgYmVhbiBjbGFzcy48Yj48L2I+Ci08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBlbnRlcnByaXNlIGJlYW5zIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWNydGUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhbiBFSkIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVjcnRwcm8uaHRtbCIvPgotPC9jb250ZXh0PgotCi0KLQotIAotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvRXhwb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvRXhwb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjI1NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0V4cG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJBUFBDTElFTlRfRVhQT1JUX0FQUENMSUVOVF9XSVpBUkRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBleHBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgaW50byBhIEpBUiBmaWxlLiAgU2VsZWN0IHRoZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHRvIGV4cG9ydCwgYW5kIHByb3ZpZGUgYSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGZvciB0aGUgZXhwb3J0ZWQgSkFSIGZpbGUuCi0KLVNlbGVjdCA8Yj5FeHBvcnQgc291cmNlIGZpbGVzPC9iPiB0byBpbmNsdWRlIHNvdXJjZSBmaWxlcyBpbiB0aGUgSkFSIGZpbGUuIAotCi1TZWxlY3QgPGI+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGU8L2I+IHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZS4gCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amV4cGFwcC5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amFwcHByb2ouaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iRUFSX0VYUE9SVF9QQUdFMSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZS4gU2VsZWN0IHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdG8gZXhwb3J0LCBhbmQgcHJvdmlkZSBhIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUgZm9yIHRoZSBleHBvcnRlZCBFQVIgZmlsZS4KLQotU2VsZWN0IDxiPkV4cG9ydCBzb3VyY2UgZmlsZXM8L2I+IHRvIGluY2x1ZGUgc291cmNlIGZpbGVzIGluIHRoZSBFQVIgZmlsZS4gCi0KLVNlbGVjdCA8Yj5PdmVyd3JpdGUgZXhpc3RpbmcgZmlsZTwvYj4gdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlLiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amV4cGVhci5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGplYXIuaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iRUpCX0VYUE9SVF9QQUdFMSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGV4cG9ydCBhbiBFSkIgbW9kdWxlIGludG8gYSBKQVIgZmlsZS4gU2VsZWN0IHRoZSBFSkIgbW9kdWxlIHRvIGV4cG9ydCwgYW5kIHByb3ZpZGUgYSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGZvciB0aGUgZXhwb3J0ZWQgSkFSIGZpbGUuCi0KLVNlbGVjdCA8Yj5FeHBvcnQgc291cmNlIGZpbGVzPC9iPiB0byBpbmNsdWRlIHNvdXJjZSBmaWxlcyBpbiB0aGUgSkFSIGZpbGUuIAotCi1TZWxlY3QgPGI+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGU8L2I+IHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZS4gPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iRXhwb3J0aW5nIGFuIEVKQiBKQVIgZmlsZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuZWpiLmFzc2VtYmx5LmRvYy90b3BpY3MvdGVleHAuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkltcG9ydGluZyBhbiBFSkIgSkFSIGZpbGUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmVqYi5hc3NlbWJseS5kb2MvdG9waWNzL3RlaW1wLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iRVhQT1JUX1JBUl9XSVpBUkRfUEFHRSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGV4cG9ydCBhIGNvbm5lY3RvciBwcm9qZWN0IGludG8gYSBSQVIgZmlsZS4gIFNlbGVjdCB0aGUgY29ubmVjdG9yIHByb2plY3QgdG8gZXhwb3J0LCBhbmQgcHJvdmlkZSBhIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUgZm9yIHRoZSBleHBvcnRlZCBSQVIgZmlsZS4KLQotU2VsZWN0IDxiPkV4cG9ydCBzb3VyY2UgZmlsZXM8L2I+IHRvIGluY2x1ZGUgc291cmNlIGZpbGVzIGluIHRoZSBSQVIgZmlsZS4gCi0KLVNlbGVjdCA8Yj5PdmVyd3JpdGUgZXhpc3RpbmcgZmlsZTwvYj4gdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlLiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkV4cG9ydGluZyBhIGNvbm5lY3RvciBwcm9qZWN0IHRvIGEgUkFSIGZpbGUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWUuZG9jL3RvcGljcy90amV4cHJhci5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZS5kb2MvdG9waWNzL3RqcmFyLmh0bWwiLy0tPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvSW1wb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvSW1wb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTNiM2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0ltcG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJBUFBDTElFTlRfSU1QT1JUX0FQUENMSUVOVF9XSVpBUkRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBpbXBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlLiBMb2NhdGUgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZSBvbiB5b3VyIGZpbGUgc3lzdGVtIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gT3B0aW9uYWxseSwgbW9kaWZ5IHRoZSBwcm9qZWN0IG5hbWUgcHJvdmlkZWQuCi0KLVVzZSB0aGUgPGI+VGFyZ2V0IHNlcnZlcjwvYj4gZmllbGQgdG8gc3BlY2lmeSB0aGUgYXBwbGljYXRpb24gc2VydmVyIHRoYXQgdGhlIGltcG9ydGVkIHByb2plY3Qgd2lsbCBiZSBkZXZlbG9wZWQgZm9yLiAKLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgd2hldGhlciBvciBub3QgdG8gYWRkIHRoZSBpbXBvcnRlZCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlIHRvIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4gQ2hvb3NlIGFuIGV4aXN0aW5nIHByb2plY3Qgb3IgdXNlIHRoZSA8Yj5OZXc8L2I+IGJ1dHRvbiB0byBjcmVhdGUgYSBuZXcgcHJvamVjdC4KLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL3RqaW1wYXBwLmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJDcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL3RqYXBwcHJvai5odG1sIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IkVBUl9JTVBPUlRfRUFSX1dJWkFSRF9QQUdFMSI+Ci0gICAgPCEtLSB3aXphcmQgYnJva2VuIGF0IHRpbWUgb2YgdGhpcyB3cml0aW5nIC0tPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBpbXBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBFQVIgZmlsZS4gIExvY2F0ZSB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBFQVIgZmlsZSBvbiB5b3VyIGZpbGUgc3lzdGVtIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gT3B0aW9uYWxseSwgbW9kaWZ5IHRoZSBwcm9qZWN0IG5hbWUgcHJvdmlkZWQuCi0KLVVzZSB0aGUgPGI+VGFyZ2V0IHNlcnZlcjwvYj4gZmllbGQgdG8gc3BlY2lmeSB0aGUgYXBwbGljYXRpb24gc2VydmVyIHRoYXQgdGhlIHJlc3VsdGluZyBwcm9qZWN0cyB3aWxsIGJlIGRldmVsb3BlZCBmb3IuIAotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amltcGVhci5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGplYXIuaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci0KLQotPGNvbnRleHQgaWQ9IkVKQl9JTVBPUlRfRUpCX1dJWkFSRF9QQUdFMSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGltcG9ydCBhbiBFSkIgSkFSIGZpbGUuIExvY2F0ZSB0aGUgRUpCIEpBUiBmaWxlIG9uIHlvdXIgZmlsZSBzeXN0ZW0gdXNpbmcgdGhlIDxiPkJyb3dzZTwvYj4gYnV0dG9uLiBPcHRpb25hbGx5LCBtb2RpZnkgdGhlIG1vZHVsZSBuYW1lIHByb3ZpZGVkLgotCi1Vc2UgdGhlIDxiPlRhcmdldCBzZXJ2ZXI8L2I+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHRoZSBpbXBvcnRlZCBwcm9qZWN0IHdpbGwgYmUgZGV2ZWxvcGVkIGZvci4gCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHRvIGFkZCB0aGUgaW1wb3J0ZWQgRUpCIG1vZHVsZSB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIENob29zZSBhbiBleGlzdGluZyBwcm9qZWN0IG9yIHVzZSB0aGUgPGI+TmV3PC9iPiBidXR0b24gdG8gY3JlYXRlIGEgbmV3IHByb2plY3QuCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJJbXBvcnRpbmcgYW4gRUpCIEpBUiBmaWxlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5lamIuYXNzZW1ibHkuZG9jL3RvcGljcy90ZWltcC5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gRUpCIHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmVqYi5hc3NlbWJseS5kb2MvdG9waWNzL3RlY3J0cHJvLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iSU1QT1JUX1JBUl9XSVpBUkRfUEFHRSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGltcG9ydCBhIEpDQSBDb25uZWN0b3IgUkFSIGZpbGUuIExvY2F0ZSB0aGUgQ29ubmVjdG9yIFJBUiBmaWxlIG9uIHlvdXIgZmlsZSBzeXN0ZW0gdXNpbmcgdGhlIDxiPkJyb3dzZTwvYj4gYnV0dG9uLiBPcHRpb25hbGx5LCBtb2RpZnkgdGhlIG1vZHVsZSBuYW1lIHByb3ZpZGVkLgotCi1Vc2UgdGhlIDxiPlRhcmdldCBzZXJ2ZXI8L2I+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHRoZSBpbXBvcnRlZCBwcm9qZWN0IHdpbGwgYmUgZGV2ZWxvcGVkIGZvci4gCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHRvIGFkZCB0aGUgaW1wb3J0ZWQgY29ubmVjdG9yIG1vZHVsZSB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIENob29zZSBhbiBleGlzdGluZyBwcm9qZWN0IG9yIHVzZSB0aGUgPGI+TmV3PC9iPiBidXR0b24gdG8gY3JlYXRlIGEgbmV3IHByb2plY3QuCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJJbXBvcnRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCBSQVIgZmlsZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZS5kb2MvdG9waWNzL3RqaW1wcmFyLmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJDcmVhdGluZyBhIGNvbm5lY3RvciBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlLmRvYy9obXRsL3RqcmFyLmh0bWwiLy0tPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9KMkVFR2VuZXJhbF9IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0oyRUVHZW5lcmFsX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YmQ1MzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0oyRUVHZW5lcmFsX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNvbS5pYm0ud3RwLnVpLlByb2plY3ROYXZpZ2F0b3IiPgotPGRlc2NyaXB0aW9uPlRoZSBKMkVFIFByb2plY3QgRXhwbG9yZXIgdmlldyBwcm92aWRlcyBhIGhpZXJhcmNoaWNhbCB2aWV3IG9mIHRoZSBjb250ZW50IG1vZGVscyBmb3IgcmVzb3VyY2VzIGluIHRoZSB3b3JrYmVuY2guIEZyb20gdGhpcyB2aWV3LCB5b3UgY2FuIG9wZW4gdGhlIHZhcmlvdXMgcHJvamVjdCBmaWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yLiAKLQotQnkgcmlnaHQtY2xpY2tpbmcgb24gbW9kdWxlcywgeW91IGNhbiBhY2Nlc3MgdGhlIHBvcC11cCBjb250ZXh0IG1lbnUgZm9yIGFkZGl0aW9uYWwgZGV2ZWxvcG1lbnQgb3B0aW9ucy4KLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkoyRUUgSGllcmFyY2h5IGFuZCBQcm9qZWN0IE5hdmlnYXRvciB2aWV3cyIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL2Nqdmlldy5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iSjJFRSBwZXJzcGVjdGl2ZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL2NqcGVycy5odG1sIi8tLT4KLTwvY29udGV4dD4KLQotCi08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiN2UzNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSIyLjEiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ci1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1ByZWZlcmVuY2VzX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvUHJlZmVyZW5jZXNfSGVscENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiNmU0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvUHJlZmVyZW5jZXNfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08IS0tRWNsaXBzZSBwcmVmZXJlbmNlcyAtLT4KLQotPGNvbnRleHQgaWQ9IkZsZXhpYmxlUHJvamVjdCI+Ci0JPCEtLSBGbGV4aWJsZSBKYXZhIFByb2plY3QgIHByZWZlcmVuY2VzLS0+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IDxiPkFsbG93IE11bHRpcGxlIG1vZHVsZXMgcGVyIHByb2plY3Q8L2I+IHRvIGFsbG93IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gKEVBUikgcHJvamVjdCB0byBjb250YWluIG1vcmUgdGhhbiBvbmUgbW9kdWxlCi1vZiBhIHBhcnRpY3VsYXIgdHlwZS4gRm9yIGluc3RhbmNlLCBtb3JlIHRoYW4gb25lIEFwcGxpY2F0aW9uIENsaWVudCBtb2R1bGUuIAotPC9kZXNjcmlwdGlvbj4KLTwhLS0gbGlua3MgdG8gRmxleGlibGUgamF2YSBwcm9qZWN0IHN0dWZmLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iSjJFRUFubm90YXRpb25zX1BBR0UxIj4KLQk8IS0tIEoyRUUgQW5ub3RhdGlvbnMgIHByZWZlcmVuY2VzIG1haW4tLT4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIEoyRUUgQW5ub3RhdGlvbiBQcm92aWRlciAgdG8gdXNlLiAKLQotSjJFRSBBbm5vdGF0aW9ucyBhbGxvdyBwcm9ncmFtbWVycyB0byBhZGQgc3BlY2lhbGl6ZWQgSmF2YWRvYyB0YWdzIHRvIHRoZWlyIHNvdXJjZSBjb2RlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBjb2RlIGFydGlmYWN0cyBmcm9tIHRlbXBsYXRlcy4KLTwvZGVzY3JpcHRpb24+Ci08IS0tIGxpbmtzIHRvIGFubm90YXRpb24gc3R1ZmYgKFhEb2NsZXQgYW5kIGVqYmRvY2xldCwgYW5kIGdlbmVyaWMgaW5mbykgLS0+Ci08IS0tIGh0dHA6Ly94ZG9jbGV0LnNvdXJjZWZvcmdlLm5ldC94ZG9jbGV0L2luZGV4Lmh0bWwgLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iSjJFRUFubm90YXRpb25zX1BBR0UyIj4KLQk8IS0tIEoyRUUgQW5ub3RhdGlvbnMgIHByZWZlcmVuY2VzIFhEb2NsZXQtLT4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNldCB0aGUgWERvY2xldCBydW50aW1lIHByZWZlcmVuY2VzLiBYRG9jbGV0IG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBsb2NhbCBzeXN0ZW0gdG8gdXNlIHRoaXMgZnVuY3Rpb24uCi0KLVNlbGVjdCA8Yj5FbmFibGUgWERvY2xldCBCdWlsZGVyPC9iPiB0byB0dXJuIG9uIGFubm90YXRpb24tYmFzZWQgYXJ0aWZhY3QgY3JlYXRpb24uCi0KLVNlbGVjdCB0aGUgPGI+VmVyc2lvbjwvYj4gb2YgWERvY2xldC4gU3VwcG9ydGVkIHZlcnNpb25zIGluY2x1ZGUgMS4yLjEsIDEuMi4yLCAxLjIuMzsgWERvY2xldCB2ZXJzaW9uIDEuMS4yIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0KLVByb3ZpZGUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKDxiPlhEb2NsZXQgSG9tZTwvYj4pIGZvciBYRG9jbGV0IG9uIHRoZSBsb2NhbCBzeXN0ZW0uCi08L2Rlc2NyaXB0aW9uPgotPCEtLSBsaW5rcyB0byBhbm5vdGF0aW9uIHN0dWZmIChYRG9jbGV0IGFuZCBlamJkb2NsZXQsIGFuZCBnZW5lcmljIGluZm8pIC0tPgotPCEtLSBodHRwOi8veGRvY2xldC5zb3VyY2Vmb3JnZS5uZXQveGRvY2xldC9pbmRleC5odG1sIC0tPgotPCEtLXRvcGljIGxhYmVsPSIiIGhyZWY9IiIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IkoyRUVBbm5vdGF0aW9uc19QQUdFMyI+Ci0JPCEtLSBKMkVFIEFubm90YXRpb25zICBwcmVmZXJlbmNlcyBlamJkb2NsZXQtLT4KLTxkZXNjcmlwdGlvbj5FamJkb2NsZXQgaXMgYSBzdWJzZXQgb2YgdGhlIFhEb2NsZXQgc3BlY2lmaWNhdGlvbiB0aGF0IHNwZWNpZmllcyBkZXRhaWxzIG9uIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotVGhlIHN5bnRheCBvZiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGRpZmZlcnMsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yIG9mICB0aGUgQXBwbGljYXRpb24gU2VydmVyIGJlaW5nIHVzZWQuIAotCi1Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSB3aGljaCBBcHBsaWNhdGlvbiBTZXJ2ZXIgdmVuZG9ycyB0byBzdXBwb3J0LiBZb3UgY2FuIHNlbGVjdCBvbmUgb3IgbW9yZSBBcHBsaWNhdGlvbiBTZXJ2ZXIKLXZlbmRvcnMsIGluY2x1ZGluZyBKQm9zcywgSk9uQVMsIFdlYkxvZ2ljLCBhbmQgV2ViU3BoZXJlLiBBbHNvIHNlbGVjdCB0aGUgdmVyc2lvbiBvZiB0aGUgQXBwbGljYXRpb24gU2VydmVyIHRvIHN1cHBvcnQuCi08L2Rlc2NyaXB0aW9uPgotPCEtLSBsaW5rcyB0byBhbm5vdGF0aW9uIHN0dWZmIChYRG9jbGV0IGFuZCBlamJkb2NsZXQsIGFuZCBnZW5lcmljIGluZm8pIC0tPgotPCEtLWh0dHA6Ly94ZG9jbGV0LnNvdXJjZWZvcmdlLm5ldC94ZG9jbGV0L2FudC94ZG9jbGV0L21vZHVsZXMvZWpiL0VqYkRvY2xldFRhc2suaHRtbCAtLT4KLTwhLS0gaHR0cDovL3d3dy5qYm9zcy5vcmctLT4KLTwhLS0gaHR0cDovL2pvbmFzLm9iamVjdHdlYi5vcmcvLS0+Ci08IS0tIGh0dHA6L3d3dy5iZWEuY29tLS0+Ci08IS0tIGh0dHA6Ly93d3cuaWJtLmNvbS9zb2Z0d2FyZS93ZWJzcGhlcmUvLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi0KLQotPC9jb250ZXh0cz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1Byb2plY3RDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9Qcm9qZWN0Q3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExM2IxMWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1Byb2plY3RDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9IkFQUENMSUVOVF9ORVdfQVBQQ0xJRU5UX1dJWkFSRF9QQUdFMSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdC4gCi0KLU9uIHRoaXMgcGFnZSwgbmFtZSB0aGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QsIGFuZCBzZWxlY3QgdGhlIHdvcmtzcGFjZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgcHJvamVjdCBmaWxlcy4gIAotCi1TZWxlY3QgdGhlIDxiPlNob3cgQWR2YW5jZWQ8L2I+IGJ1dHRvbiB0byBzcGVjaWZ5IGFueSBvZiB0aGUgZm9sbG93aW5nOgotPHVsPgotICAgIDxsaT5UaGUgPGI+VGFyZ2V0IHNlcnZlcjwvYj4uPC9saT4KLSAgICA8bGk+VGhlIDxiPk1vZHVsZSBWZXJzaW9uIChKMkVFIHNwZWNpZmljYXRpb24gbGV2ZWwpPC9iPi48L2xpPgotICAgIDxsaT5BdXRvbWF0aWNhbGx5IGFkZCB0aGUgQXBwbGljYXRpb24gQ2xpZW50ICBwcm9qZWN0IHRvIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC48L2xpPgotICAgIDwvdWw+IAotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amFwcHByb2ouaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkoyRUUgYXJjaGl0ZWN0dXJlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvY2phcmNoLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iRUFSX05FV19FQVJfV0laQVJEX1BBR0UxIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyB3aXphcmQgdG8gY3JlYXRlIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gKEVBUikgcHJvamVjdC4gQW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGNhbiBjb250YWluIG9uZSBvciBtb3JlIEoyRUUgbW9kdWxlcywgaW5jbHVkaW5nIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLCBFSkIgbW9kdWxlcywgQ29ubmVjdG9yIG1vZHVsZXMsIG9yIFdlYiBtb2R1bGUuIAotCi1PbiB0aGlzIHBhZ2UsIG5hbWUgdGhlIEVBUiBhcHBsaWNhdGlvbiBwcm9qZWN0LCBhbmQgc2VsZWN0IHRoZSB3b3Jrc3BhY2UgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHByb2plY3QgZmlsZXMuICAKLQotU2VsZWN0IHRoZSA8Yj5TaG93IEFkdmFuY2VkPC9iPiBidXR0b24gdG8gc2VsZWN0IGEgPGI+VGFyZ2V0IHNlcnZlcjwvYj4gb3IgdGhlIDxiPk1vZHVsZSBWZXJzaW9uPC9iPiAoSjJFRSBzcGVjaWZpY2F0aW9uIGxldmVsKSB0aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhlIG5ldyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuCi0KLVRvIGFkZCBKMkVFIG1vZHVsZXMgdG8gdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCwgY2xpY2sgPGI+TmV4dDwvYj4uICBJZiB5b3UgZG8gbm90IHdhbnQgdG8gYWRkIEoyRUUgbW9kdWxlcyBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QsIGNsaWNrIDxiPkZpbmlzaDwvYj4uCi1KMkVFIG1vZHVsZXMgY2FuIGJlIGFkZGVkIHRvIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBhdCBhbnkgdGltZS4gT25jZSB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGhhcyBiZWVuIGNyZWF0ZWQsIHJpZ2h0LWNsaWNrIGFuZCBzZWxlY3QgPGI+UHJvcGVydGllcyA+IEVBUiBtb2R1bGVzPC9iPiB0bwotYWRkIG9yIGRlbGV0ZSBFQVIgbW9kdWxlcyBmcm9tIHRoZSBwcm9qZWN0LiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL3RqZWFyLmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJKMkVFIGFyY2hpdGVjdHVyZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL2NqYXJjaC5odG1sIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9Ik5FV19FQVJfQUREX01PRFVMRVNfUEFHRSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgYXZhaWxhYmxlIEoyRUUgbW9kdWxlcyB0byBhZGQgdG8gdGhlIG5ldyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLiBDbGljayB0aGUgPGI+TmV3IE1vZHVsZTwvYj4gYnV0dG9uICB0byBjcmVhdGUgbmV3IG1vZHVsZXMuIAotCi1KMkVFIG1vZHVsZXMgY2FuIGJlIGFkZGVkIHRvIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBhdCBhbnkgdGltZS4gT25jZSB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGhhcyBiZWVuIGNyZWF0ZWQsIHJpZ2h0LWNsaWNrIGFuZCBzZWxlY3QgPGI+UHJvcGVydGllcyA+IEVBUiBtb2R1bGVzPC9iPiB0bwotYWRkIG9yIGRlbGV0ZSBFQVIgbW9kdWxlcyBmcm9tIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IiBocmVmPSIuLi8vdG9waWNzL3RqZWFyLmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJKMkVFIGFyY2hpdGVjdHVyZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL2NqYXJjaC5odG1sIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IkVBUl9ORVdfTU9EVUxFX1BST0pFQ1RTX1BBR0UiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gY3JlYXRlIG5ldyBKMkVFIG1vZHVsZXMgdG8gYWRkIHRvIHRoZSBuZXcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4gVGhlIHdpemFyZCBjYW4gZ2VuZXJhdGUgYSBzZXQgb2YgZGVmYXVsdCBKMkVFIG1vZHVsZXMgb3IgaW5kaXZpZHVhbCBjdXN0b21pemVkIEoyRUUgbW9kdWxlcy4KLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWNsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGplYXIuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkoyRUUgYXJjaGl0ZWN0dXJlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvY2phcmNoLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi0KLTxjb250ZXh0IGlkPSJFSkJfTkVXX0VKQl9XSVpBUkRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgRUpCIHByb2plY3QuIEFuIEVKQiBwcm9qZWN0IHByb3ZpZGVzIGEgbG9naWNhbCBncm91cCB0byBvcmdhbml6ZSBlbnRlcnByaXNlIGJlYW5zLiAKLQotT24gdGhpcyBwYWdlLCBuYW1lIHRoZSBFSkIgcHJvamVjdCwgYW5kIHNlbGVjdCB0aGUgd29ya3NwYWNlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBwcm9qZWN0IGZpbGVzLiAgCi0KLVNlbGVjdCB0aGUgPGI+U2hvdyBBZHZhbmNlZDwvYj4gYnV0dG9uIHRvIHNwZWNpZnkgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci08dWw+Ci0gICAgPGxpPlRoZSA8Yj5UYXJnZXQgc2VydmVyPC9iPi48L2xpPgotICAgIDxsaT5UaGUgPGI+RUpCIHZlcnNpb248L2I+LjwvbGk+Ci0gICAgPGxpPkF1dG9tYXRpY2FsbHkgYWRkIHRoZSBFSkIgcHJvamVjdCB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuPC9saT4KLSAgICA8bGk+Q3JlYXRlIGFuIEVKQiBDbGllbnQgSkFSIG1vZHVsZSB0byBob2xkIHJlbW90ZSBhbmQgbG9jYWwgaG9tZSBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzLiA8L2xpPgotICAgIDxsaT5BZGQgc3VwcG9ydCBmb3IgYW5ub3RhdGVkIEphdmEgY2xhc3Nlcy48L2xpPgotICAgIDwvdWw+IAotCi1JZiB5b3Ugc2VsZWN0ZWQgdGhlIDxiPkNyZWF0ZSBhbiBFSkIgQ2xpZW50IEpBUiBtb2R1bGUgdG8gaG9sZCB0aGUgY2xpZW50IGludGVyZmFjZXMgYW5kIGNsYXNzZXM8L2I+LCBjbGljayA8Yj5OZXh0PC9iPiB0byBkZWZpbmUgdGhlIEVKQiBDbGllbnQgSkFSIG1vZHVsZSBuYW1lLiAKLU90aGVyd2lzZSwgY2xpY2sgPGI+RmluaXNoPC9iPi4KLTwvZGVzY3JpcHRpb24+Ci08IS0tIGFkZCBsaW5rIGZvciBhbm5vdGF0ZWQgSmF2YSBjbGFzc2VzLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIEVKQiBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5lamIuYXNzZW1ibHkuZG9jL3RvcGljcy90ZWNydHByby5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iRUpCIGFyY2hpdGVjdHVyZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuZWpiLmRvYy90b3BpY3MvY2VhcmNoLmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJFSkIgY2xpZW50IHByb2plY3RzIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5lamIuYXNzZW1ibHkuZG9jL3RvcGljcy9jZWNsaWVudGphcnMuaHRtbCIvLS0+Ci0KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IkVKQl9ORVdfRUpCX1dJWkFSRF9QQUdFMiI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBFSkIgY2xpZW50IEpBUiBtb2R1bGUsIGFzIHdlbGwgYXMgdGhlIG5hbWUgb2YgdGhlIEpBUiBmaWxlICg8Yj5DbGllbnQgSkFSIFVSSTwvYj4pLgotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gRUpCIHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmVqYi5hc3NlbWJseS5kb2MvdG9waWNzL3RlY3J0cHJvLmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJFSkIgY2xpZW50IHByb2plY3RzIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5lamIuYXNzZW1ibHkuZG9jL3RvcGljcy9jZWNsaWVudGphcnMuaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci0KLQotPGNvbnRleHQgaWQ9IkpDQV9ORVdJWkFSRF9QQUdFMSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGNyZWF0ZSBhIENvbm5lY3RvciBwcm9qZWN0LiBUaGUgSjJFRSBDb25uZWN0b3IgQXJjaGl0ZWN0dXJlIChKQ0EpIHNwZWNpZmllcyBob3cgYSBKMkVFIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBhY2Nlc3NlcyBhIGNvbm5lY3Rpb24tYmFzZWQgcmVzb3VyY2UuIAotCi1PbiB0aGlzIHBhZ2UsIG5hbWUgdGhlIENvbm5lY3RvciBwcm9qZWN0LCBhbmQgc2VsZWN0IHRoZSB3b3Jrc3BhY2UgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHByb2plY3QgZmlsZXMuICAKLQotU2VsZWN0IHRoZSA8Yj5TaG93IEFkdmFuY2VkPC9iPiBidXR0b24gdG8gc3BlY2lmeSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKLTx1bD4KLSAgICA8bGk+VGhlIDxiPlRhcmdldCBzZXJ2ZXI8L2I+LjwvbGk+Ci0gICAgPGxpPlRoZSA8Yj5KQ0EgdmVyc2lvbjwvYj4uPC9saT4KLSAgICA8bGk+QXV0b21hdGljYWxseSBhZGQgdGhlIENvbm5lY3RvciBwcm9qZWN0IHRvIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC48L2xpPgotICAgIDwvdWw+IAotPC9kZXNjcmlwdGlvbj4KLTwhLS0gbGluayB0byAnQ29ubmVjdG9yIHByb2plY3RzJyB0b3BpYyBpbiBjb20uaWJtLmV0b29scy5yYWQubWlncmF0aW9uLmRvYy90b3BpY3MvcnY2Y29ubmVjdGpjYS5odG1sLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWUuZG9jL3RvcGljcy90anJhci5odG1sIi8tLT4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1Byb2plY3RQcmVmc19IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1Byb2plY3RQcmVmc19IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQzYTAzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9Qcm9qZWN0UHJlZnNfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08IS0tIHByb2plY3QgcHJlZmVyZW5jZXMgLS0+Ci0KLTxjb250ZXh0IGlkPSJKQVJkZXAiPgotCQk8IS0tIEpBUiBkZXBlbmRlbmNpZXMgcHJlZmVyZW5jZXMtLT4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNwZWNpZnkgZGVwZW5kZW50IEpBUiBmaWxlcyBmb3IgbW9kdWxlcyB3aXRoaW4gdGhlIGFzc29jaWF0ZWQgcHJvamVjdC4KLQotU2VsZWN0IDxiPlVzZSBFSkIgSkFSczwvYj4sIDxiPlVzZSBFSkIgY2xpZW50IEpBUnM8L2I+LCBvciA8Yj5BbGxvdyBib3RoPC9iPiB0byBjb250cm9sIHdoaWNoIEpBUiBmaWxlcyBhcmUgbGlzdGVkLiAgVGhlbiwgc2VsZWN0IHRoZSBKQVIgZmlsZXMgZnJvbSB0aGUgbGlzdC4gVGhpcyB3aWxsIHVwZGF0ZSB0aGUgcnVuLXRpbWUgY2xhc3MgcGF0aCBhbmQgSmF2YSBwcm9qZWN0IGJ1aWxkIHBhdGggd2l0aCB0aGUgYXBwcm9wcmlhdGUgSkFSIGZpbGVzLgotCi1UaGUgPGI+TWFuaWZlc3QgQ2xhc3MtUGF0aDwvYj4gZmllbGQgZGlzcGxheXMgdGhlIG1hbmlmZXN0IGNsYXNzLXBhdGggY2hhbmdlcyBiYXNlZCBvbiB0aGUgSkFSIGZpbGVzIHNlbGVjdGVkLiBUaGlzIGZpZWxkIGlzIGRpc3BsYXkgb25seSBhbmQgc2hvd3MgeW91IHRoZSBjbGFzcyBwYXRoIGZvciB5b3VyIG1vZHVsZSBmaWxlLgotPC9kZXNjcmlwdGlvbj4KLTwhLS0gbmVlZCBsaW5rcyB0byBFSkIgYmFzZSBpbmZvLCBFSkIgQ2xpZW50IGluZm8sIHByb2plY3QgY2xhc3MgcGF0aHMtLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPCEtLXRvcGljIGxhYmVsPSIiIGhyZWY9IiIvLS0+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJFQVJtb2QiPgotCTwhLS0gRUFSIG1vZHVsZXMgcHJlZmVyZW5jZXMtLT4KLTxkZXNjcmlwdGlvbj48IS0tIHBhZ2UgaXMgYmxhbmsgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nIC0tPgotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPCEtLXRvcGljIGxhYmVsPSIiIGhyZWY9IiIvLS0+Ci08L2NvbnRleHQ+Ci0KLQotCi08L2NvbnRleHRzPgotCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvVmFsaWRhdGlvblByZWZzX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvVmFsaWRhdGlvblByZWZzX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZGU4MjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1ZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLQk8IS0tIEVjbGlwc2UgVmFsaWRhdGlvbiBwcmVmZXJlbmNlcyAtLT4KLTxjb250ZXh0IGlkPSJqdmdwMDAwMCI+Ci08ZGVzY3JpcHRpb24+IFRoZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIHBhZ2UgYWxsb3dzIHlvdSB0byB2aWV3IG9yIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciBhbGwgd29ya2JlbmNoIHByb2plY3RzLiBBIHZhbGlkYXRvciBpcyBhIHRvb2wgdGhhdCBjaGVja3MgdGhhdCByZXNvdXJjZXMgY29uZm9ybSB0byBhIHNwZWNpZmljYXRpb24sIERURCwgb3Igc29tZSBvdGhlciBzZXQgb2YgcnVsZXMuCi0KLVNlbGVjdCB0aGUgPGI+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5nczwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvIGFsbG93IGluZGl2aWR1YWwgcHJvamVjdHMgdG8gc2V0IHRoZWlyIG93biB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLgotVG8gY29uZmlndXJlIG5ldyB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciBhbiBpbmRpdmlkdWFsIHByb2plY3QsIHNlbGVjdCB0aGUgcHJvamVjdCBpbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIGFuZCBzZWxlY3QgPGI+UHJvcGVydGllcyA+IFZhbGlkYXRpb248L2I+LgotCi1TZWxlY3QgdGhlIDxiPlJ1biB2YWxpZGF0aW9uIHdoZW4geW91IG1hbnVhbGx5IGJ1aWxkIGEgcHJvamVjdDwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRoZSBzZWxlY3RlZCB2YWxpZGF0b3JzIHRvIHJ1biB3aGVuZXZlciB5b3UgYnVpbGQgeW91ciBwcm9qZWN0cy4KLVRvIGVuYWJsZSB0aGUgPGI+UnVuIHZhbGlkYXRpb24gd2hlbiB5b3UgbWFudWFsbHkgYnVpbGQgYSBwcm9qZWN0PC9iPiBjaGVjayBib3gsIHNlbGVjdCBhdCBsZWFzdCBvbmUgdmFsaWRhdG9yIGluIHRoZSBsaXN0LgotCi1TZWxlY3QgIHRoZSA8Yj5SdW4gdmFsaWRhdGlvbiBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUgY2hhbmdlcyB0byBhIHJlc291cmNlPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdGhlIHNlbGVjdGVkIHZhbGlkYXRvcnMgdG8gYXV0b21hdGljYWxseSBydW4gd2hlbmV2ZXIgeW91IHNhdmUgY2hhbmdlcyB0byBhbnkgcHJvamVjdCByZXNvdXJjZXMuCi1UbyBlbmFibGUgdGhlIDxiPlJ1biB2YWxpZGF0aW9uIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugc2F2ZSBjaGFuZ2VzIHRvIGEgcmVzb3VyY2U8L2I+IGNoZWNrIGJveCwgc2VsZWN0IGF0IGxlYXN0IG9uZSB2YWxpZGF0b3IgaW4gdGhlIGxpc3QuIAotCi1Vc2UgdGhlIDxiPk1heGltdW0gbnVtYmVyIG9mIHZhbGlkYXRpb24gbWVzc2FnZXM8L2I+IGZpZWxkIHRvIGRlZmluZSB0aGUgbWF4aW11bSBhbGxvd2FibGUgdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgdGhlIHByb2plY3QuCi1JZiB0aGUgbnVtYmVyIG9mIHZhbGlkYXRpb24gbWVzc2FnZXMgcmVwb3J0ZWQgaW4gdGhlIHRhc2sgbGlzdCBleGNlZWRzIHRoZSBudW1iZXIgc2V0IGluIHRoaXMgZmllbGQsIHZhbGlkYXRpb24gd2lsbCB0ZXJtaW5hdGUuCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90anZhbC5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnMiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy9ydmFsZXJyLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9WYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWQ4OTA3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9WYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotCTwhLS0gVmFsaWRhdGlvbiBzZXR0aW5ncyBmb3IgcHJvamVjdCAtLT4KLQotPGNvbnRleHQgaWQ9Imp2cHAwMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgcHJvamVjdCB2YWxpZGF0aW9uIHBhZ2UgYWxsb3dzIHlvdSB0byB2aWV3IG9yIGNoYW5nZSB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncyBmb3IgYSBwcm9qZWN0LiBBIHZhbGlkYXRvciBpcyBhIHRvb2wgdGhhdCBjaGVja3MgdGhhdCByZXNvdXJjZXMgY29uZm9ybSB0byBhIHNwZWNpZmljYXRpb24sIERURCwgb3Igc29tZSBvdGhlciBzZXQgb2YgcnVsZXMuCi0KLVNlbGVjdCB0aGUgPGI+T3ZlcnJpZGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYj4gY2hlY2sgYm94LiBTZWxlY3QgdGhpcyBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBzZXQgaW4gdGhlIHdvcmtiZW5jaCBQcmVmZXJlbmNlcyBwYWdlLgotSWYgdGhlIDxiPk92ZXJyaWRlIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2I+IGNoZWNrIGJveCBpcyBub3QgZW5hYmxlZCwgZ28gdG8gPGI+V2luZG93ID4gUHJlZmVyZW5jZXMgPiBWYWxpZGF0aW9uPC9iPiBhbmQgc2VsZWN0IHRoZSA8Yj5BbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZSB0aGVzZSBwcmVmZXJlbmNlIHNldHRpbmdzPC9iPiBjaGVjayBib3guCi0KLVNlbGVjdCB0aGUgPGI+UnVuIHZhbGlkYXRpb24gd2hlbiB5b3UgbWFudWFsbHkgYnVpbGQ8L2I+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0aGUgc2VsZWN0ZWQgdmFsaWRhdG9ycyB0byBydW4gd2hlbmV2ZXIgeW91IGJ1aWxkIHlvdXIgcHJvamVjdC4KLVRvIGVuYWJsZSB0aGUgPGI+UnVuIHZhbGlkYXRpb24gd2hlbiB5b3UgbWFudWFsbHkgYnVpbGQ8L2I+IGNoZWNrIGJveCwgc2VsZWN0IGF0IGxlYXN0IG9uZSB2YWxpZGF0b3IgaW4gdGhlIGxpc3QuCi0KLVNlbGVjdCAgdGhlIDxiPlJ1biB2YWxpZGF0aW9uIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugc2F2ZSBjaGFuZ2VzIHRvIHJlc291cmNlczwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRoZSBzZWxlY3RlZCB2YWxpZGF0b3JzIHRvIGF1dG9tYXRpY2FsbHkgcnVuIHdoZW5ldmVyIHlvdSBzYXZlIGNoYW5nZXMgdG8geW91ciBwcm9qZWN0IHJlc291cmNlcy4KLVRvIGVuYWJsZSB0aGUgPGI+UnVuIHZhbGlkYXRpb24gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlIGNoYW5nZXMgdG8gcmVzb3VyY2VzPC9iPiBjaGVjayBib3gsIHNlbGVjdCBhdCBsZWFzdCBvbmUgdmFsaWRhdG9yIGluIHRoZSBsaXN0LiAKLQotVXNlIHRoZSA8Yj5NYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzPC9iPiBmaWVsZCB0byBkZWZpbmUgdGhlIG1heGltdW0gYWxsb3dhYmxlIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIHRoZSBwcm9qZWN0LgotSWYgdGhlIG51bWJlciBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzIHJlcG9ydGVkIGluIHRoZSB0YXNrIGxpc3QgZXhjZWVkcyB0aGUgbnVtYmVyIHNldCBpbiB0aGlzIGZpZWxkLCB2YWxpZGF0aW9uIHdpbGwgdGVybWluYXRlLgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODExZDBmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gRGVsZXRlQmVhbl9IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEVKQkNyZWF0ZVdpemFyZF9IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEV4cG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEltcG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEoyRUVHZW5lcmFsX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgUHJlZmVyZW5jZXNfSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBQcm9qZWN0Q3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgUHJvamVjdFByZWZzX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgVmFsaWRhdGlvblByZWZzX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2OGYyNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUcmFuc2xhdGlvbiBJbnN0cnVjdGlvbjogc2VjdGlvbiB0byBiZSB0cmFuc2xhdGVkCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUGx1Z2luLm5hbWUgPSBKMkVFIHRvb2xzIGluZm9wb3BzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDAwOWM2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotCTxjb250ZXh0cyBmaWxlPSJFeHBvcnRXaXphcmRfSGVscENvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgLz4KLQk8Y29udGV4dHMgZmlsZT0iSW1wb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IkoyRUVHZW5lcmFsX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IlByb2plY3RDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgLz4KLQk8Y29udGV4dHMgZmlsZT0iRUpCQ3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIC8+Ci0gICAJPCEtLTxjb250ZXh0cyBmaWxlPSJEZWxldGVCZWFuX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIC8+IC0tPgotCTxjb250ZXh0cyBmaWxlPSJWYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIC8+Ci0JPGNvbnRleHRzIGZpbGU9IlZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiAvPgotCTxjb250ZXh0cyBmaWxlPSJQcm9qZWN0UHJlZnNfSGVscENvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgLz4KLQk8Y29udGV4dHMgZmlsZT0iUHJlZmVyZW5jZXNfSGVscENvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTA3MWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNjNzBmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbAotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC8uY2xhc3NwYXRoIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZGFkNjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJldmVudCIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODEwN2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Y29tLmlibS5ldG9vbHMuZW1mLmV2ZW50PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMmI4My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFdmVudCBNb2RlbAotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjAuMC4yCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsCi0gY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LmltcGwsCi0gY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSIyLjEiCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjYjIzZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGNvbS8sXAotICAgICAgICAgICAgICAgbW9kZWwvLFwKLSAgICAgICAgICAgICAgIC4KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gZXZlbnQvCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0FkZC5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvQWRkLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2I1YmRiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvQWRkLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9BZGRNYW55LmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9BZGRNYW55LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDUzYmY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvQWRkTWFueS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvQ2hhbmdlJFNldHRpbmcuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0NoYW5nZSRTZXR0aW5nLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTI0ODE0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvQ2hhbmdlJFNldHRpbmcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0NoYW5nZS5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvQ2hhbmdlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmU5MTNjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvQ2hhbmdlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9DaGFuZ2VVdGlsLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9DaGFuZ2VVdGlsLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2M3ODk5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvQ2hhbmdlVXRpbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvRU9iamVjdERlc2NyaXB0b3IuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0VPYmplY3REZXNjcmlwdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDY1OWI3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvRU9iamVjdERlc2NyaXB0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0V2ZW50LmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9FdmVudC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2MWI3MS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0V2ZW50LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9FdmVudEZhY3RvcnkuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0V2ZW50RmFjdG9yeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkY2ZjYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0V2ZW50RmFjdG9yeS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvRXZlbnRLaW5kLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9FdmVudEtpbmQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5M2JlNjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9FdmVudEtpbmQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0V2ZW50UGFja2FnZS5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvRXZlbnRQYWNrYWdlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM5MWE5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvRXZlbnRQYWNrYWdlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9FdmVudFV0aWwuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0V2ZW50VXRpbC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4MjIyZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0V2ZW50VXRpbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvRmVhdHVyZUtpbmQuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L0ZlYXR1cmVLaW5kLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGIyM2M2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvRmVhdHVyZUtpbmQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L01vdmUuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L01vdmUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjFkNDIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9Nb3ZlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9Ob3RpZmllcktpbmQuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L05vdGlmaWVyS2luZC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiMTNiYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L05vdGlmaWVyS2luZC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvUmVtb3ZlLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9SZW1vdmUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzNiM2QuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9SZW1vdmUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L1JlbW92ZU1hbnkuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L1JlbW92ZU1hbnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZmY4ZjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9SZW1vdmVNYW55LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9TZXQuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L1NldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhZDAyZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L1NldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvU2V0dGluZy5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvU2V0dGluZy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzZTQzZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L1NldHRpbmcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L1Vuc2V0LmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9VbnNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0YTFhYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L1Vuc2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0FkZEltcGwuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvQWRkSW1wbC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmZmE5MS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvQWRkSW1wbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9BZGRNYW55SW1wbC5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9BZGRNYW55SW1wbC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmOGMyYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvQWRkTWFueUltcGwuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvQ2hhbmdlSGVscGVyLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0NoYW5nZUhlbHBlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhNDAzZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvQ2hhbmdlSGVscGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0NoYW5nZUltcGwkU2V0dGluZ0ltcGwuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvQ2hhbmdlSW1wbCRTZXR0aW5nSW1wbC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmOGFiZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvQ2hhbmdlSW1wbCRTZXR0aW5nSW1wbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9DaGFuZ2VJbXBsLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0NoYW5nZUltcGwuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzRkZDIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0NoYW5nZUltcGwuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvQ2hhbmdlVXRpbEltcGwuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvQ2hhbmdlVXRpbEltcGwuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODVlNjIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0NoYW5nZVV0aWxJbXBsLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0VPYmplY3REZXNjcmlwdG9ySW1wbC5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FT2JqZWN0RGVzY3JpcHRvckltcGwuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjRlYmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0VPYmplY3REZXNjcmlwdG9ySW1wbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudEFkYXB0ZXIuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRBZGFwdGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdiY2I1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudEFkYXB0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRGYWN0b3J5SW1wbC5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudEZhY3RvcnlJbXBsLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM0M2UyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudEZhY3RvcnlJbXBsLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0V2ZW50SGVscGVyLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0V2ZW50SGVscGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQyMjAxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudEhlbHBlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudEltcGwuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRJbXBsLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2M0NDkzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudEltcGwuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRQYWNrYWdlSW1wbC5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudFBhY2thZ2VJbXBsLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDA2YzliLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudFBhY2thZ2VJbXBsLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0V2ZW50UmVhZGVySGVscGVyLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0V2ZW50UmVhZGVySGVscGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY3ZTZiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudFJlYWRlckhlbHBlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudFV0aWxJbXBsJEJhY2t3YXJkRXZlbnRJdGVyYXRvci5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudFV0aWxJbXBsJEJhY2t3YXJkRXZlbnRJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2ZDJkYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRVdGlsSW1wbCRCYWNrd2FyZEV2ZW50SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRVdGlsSW1wbCRGb3J3YXJkRXZlbnRJdGVyYXRvci5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudFV0aWxJbXBsJEZvcndhcmRFdmVudEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTViODNlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudFV0aWxJbXBsJEZvcndhcmRFdmVudEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0V2ZW50VXRpbEltcGwuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRVdGlsSW1wbC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1NjA1My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRVdGlsSW1wbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudFdyaXRlckhlbHBlciRFT2JqZWN0RGF0YS5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9FdmVudFdyaXRlckhlbHBlciRFT2JqZWN0RGF0YS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyNGQ5NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRXcml0ZXJIZWxwZXIkRU9iamVjdERhdGEuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRXcml0ZXJIZWxwZXIuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvRXZlbnRXcml0ZXJIZWxwZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMDFkYjIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL0V2ZW50V3JpdGVySGVscGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL01vdmVJbXBsLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL01vdmVJbXBsLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmE0M2RmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9Nb3ZlSW1wbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9SZW1vdmVJbXBsLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL1JlbW92ZUltcGwuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjI4NzEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL1JlbW92ZUltcGwuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvUmVtb3ZlTWFueUltcGwuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvUmVtb3ZlTWFueUltcGwuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjUzMTIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL1JlbW92ZU1hbnlJbXBsLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL1NldEltcGwuY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvU2V0SW1wbC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3ODM2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvU2V0SW1wbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9TZXR0aW5nSW1wbC5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvaW1wbC9TZXR0aW5nSW1wbC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllMWRlMi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvU2V0dGluZ0ltcGwuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvVW5zZXRJbXBsLmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC9pbXBsL1Vuc2V0SW1wbC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhMjIzZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L2ltcGwvVW5zZXRJbXBsLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC91dGlsL0V2ZW50QWRhcHRlckZhY3RvcnkkMS5jbGFzcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvdXRpbC9FdmVudEFkYXB0ZXJGYWN0b3J5JDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YWNmZTkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC91dGlsL0V2ZW50QWRhcHRlckZhY3RvcnkkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ldmVudC9jb20vaWJtL2V0b29scy9lbWYvZXZlbnQvdXRpbC9FdmVudEFkYXB0ZXJGYWN0b3J5LmNsYXNzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC91dGlsL0V2ZW50QWRhcHRlckZhY3RvcnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZTE3OWQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC91dGlsL0V2ZW50QWRhcHRlckZhY3RvcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L3V0aWwvRXZlbnRTd2l0Y2guY2xhc3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvZXZlbnQvY29tL2libS9ldG9vbHMvZW1mL2V2ZW50L3V0aWwvRXZlbnRTd2l0Y2guY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTcyOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L2V2ZW50L2NvbS9pYm0vZXRvb2xzL2VtZi9ldmVudC91dGlsL0V2ZW50U3dpdGNoLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L21vZGVsL2V2ZW50Lm1kbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9tb2RlbC9ldmVudC5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzdiMTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L21vZGVsL2V2ZW50Lm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDUwMjkgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDIKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODE2My4zIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDAKLQl0b3BNYXJnaW4gIAkwLjI1MDAwMAotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKLQljbGlwSWNvbkxhYmVscyAJVFJVRQotCWF1dG9SZXNpemUgCVRSVUUKLQlzbmFwVG9HcmlkIAlUUlVFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiM0IxRkU0QkIwMEM1IgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0IxRkU0QzYwMTQ0IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjNCMUZFNEJCMDA4QSIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjNCMUZFNEJCMDBDNiIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCQlxdWlkICAgICAgIAkiM0UyNUQzNUYwMENEIgotCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJICAgIChvYmplY3QgUm9sZSAiYWRkZWRFT2JqZWN0cyIKLQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQlxdWlkICAgICAgIAkiM0UyNUQzNjAwMEY3IgotCQkJbGFiZWwgICAgICAJImFkZGVkRU9iamVjdHMiCi0JCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RU9iamVjdCIKLQkJCXF1aWR1ICAgICAgCSIzQzRGMUM4NjAxMjMiCi0JCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIgotCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCXF1aWQgICAgICAgCSIzRTI1RDM2MDAwRjgiCi0JCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpFdmVudDo6RXZlbnQiCi0JCQlxdWlkdSAgICAgIAkiM0JDQzc5NkIwMTI5IgotCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVjb3JlIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkVkFCQVNFX1BMVUdJTlNfUEFUSFxcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXFxzcmNcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRWNvcmUuY2F0IgotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiRXZlbnQiCi0JCXF1aWQgICAgICAgCSIzRTJDNTEwNDAxODgiCi0JCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzICJFdmVudCIKLQkJCXF1aWQgICAgICAgCSIzQkNDNzk2QjAxMjkiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV2ZW50S2luZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0REMDA1MkYwM0ExIgotCQkJCXR5cGUgICAgICAgCSJFdmVudEtpbmQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub3RpZmllclVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0U1OTU1MTgwMjcwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmVhdHVyZU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNFMjcwMUNCMDExRCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdGlmaWVyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzRTc5MTZGNjAyNDYiCi0JCQkJdHlwZSAgICAgICAJIk5vdGlmaWVyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpKQotCQkJbGFuZ3VhZ2UgICAJIkMrKyIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJKYXZhT2JqZWN0IgotCQkJcXVpZCAgICAgICAJIjNCRjQwN0I4MDA0MCIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5sYW5nLk9iamVjdCIKLQkJCQlxdWlkICAgICAgIAkiM0JGNDA3REIwMDE4IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJbGFuZ3VhZ2UgICAJIkMrKyIpCi0JCSAgICAob2JqZWN0IENsYXNzICJFdmVudEtpbmQiCi0JCQlxdWlkICAgICAgIAkiM0UyMzM2MjUwMTgyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXQiCi0JCQkJcXVpZCAgICAgICAJIjNFMjMzNjY0MDBGNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bnNldCIKLQkJCQlxdWlkICAgICAgIAkiM0UyMzM2NjUwMTM0IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFkZCIKLQkJCQlxdWlkICAgICAgIAkiM0UyMzM2NjYwMzQ5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlbW92ZSIKLQkJCQlxdWlkICAgICAgIAkiM0UyMzM2NjgwMTJGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFkZE1hbnkiCi0JCQkJcXVpZCAgICAgICAJIjNFMjMzNjY5MDFEQSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZW1vdmVNYW55IgotCQkJCXF1aWQgICAgICAgCSIzRTIzMzY2RDAyNjIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW92ZSIKLQkJCQlxdWlkICAgICAgIAkiM0UyMzM2ODEwMDhBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkFkZCIKLQkJCXF1aWQgICAgICAgCSIzRTI1Q0Q1RjAzM0IiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0UyNUQzRTEwMjc5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OkV2ZW50OjpFdmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0JDQzc5NkIwMTI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBvc2l0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzRTI1RjczNTAxNjUiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiLTEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGl0ZXJhbCIKLQkJCQlxdWlkICAgICAgIAkiM0UyRDhFOTIwM0I0IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib2JqZWN0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzRTdBNjMxMzAyRjUiCi0JCQkJdHlwZSAgICAgICAJIkphdmFPYmplY3QiCi0JCQkJZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJBZGRNYW55IgotCQkJcXVpZCAgICAgICAJIjNFMjVDRDY0MDNDNSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRTI1RDNFNTAzQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OkV2ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQkNDNzk2QjAxMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicG9zaXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzRTJEOEU5QTAyNzUiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXRlcmFscyIKLQkJCQlxdWlkICAgICAgIAkiM0U3QTYzNzYwMkVEIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib2JqZWN0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0U3QTYzMzYwMDZBIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJKYXZhT2JqZWN0IgotCQkJCWV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiU2V0IgotCQkJcXVpZCAgICAgICAJIjNFMjVDRDdEMDJEQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRTI1RDQwMTAzODMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OkV2ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQkNDNzk2QjAxMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib2xkTGl0ZXJhbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNFMkQ4RTcxMDE5QSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9sZE9iamVjdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzRTdBNjNBRTAwOEIiCi0JCQkJdHlwZSAgICAgICAJIkphdmFPYmplY3QiCi0JCQkJZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuZXdMaXRlcmFsIgotCQkJCXF1aWQgICAgICAgCSIzRTJEOEU4MDAwQTEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuZXdPYmplY3QiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNFN0E2M0I1MDMyQSIKLQkJCQl0eXBlICAgICAgIAkiSmF2YU9iamVjdCIKLQkJCQlleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlVuc2V0IgotCQkJcXVpZCAgICAgICAJIjNFMjVDRDgzMDE2NiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRTI1RDNGQjAyOTQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OkV2ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQkNDNzk2QjAxMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGl0ZXJhbCIKLQkJCQlxdWlkICAgICAgIAkiM0UyRDhFODgwMzBGIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib2JqZWN0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzRTdBNjM5QzAyNTEiCi0JCQkJdHlwZSAgICAgICAJIkphdmFPYmplY3QiCi0JCQkJZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJSZW1vdmUiCi0JCQlxdWlkICAgICAgIAkiM0UyNUNEOEEwMzgzIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNFMjVEM0VBMDBFQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpFdmVudDo6RXZlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCQ0M3OTZCMDEyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwb3NpdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0UyNUNEQUIwMjcyIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIi0xIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpdGVyYWwiCi0JCQkJcXVpZCAgICAgICAJIjNFMkQ4RUFFMDI2MCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9iamVjdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0U3QTYzNTAwMkFDIgotCQkJCXR5cGUgICAgICAgCSJKYXZhT2JqZWN0IgotCQkJCWV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUmVtb3ZlTWFueSIKLQkJCXF1aWQgICAgICAgCSIzRTI1Q0Q5MjAwRTYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0UyNUQzRjYwMDE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OkV2ZW50OjpFdmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0JDQzc5NkIwMTI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBvc2l0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0UyNUQwNEMwMkEyIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGl0ZXJhbHMiCi0JCQkJcXVpZCAgICAgICAJIjNFMkQ4RUI4MDFCQSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9iamVjdHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNFN0E2MzU4MDNFNCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiSmF2YU9iamVjdCIKLQkJCQlleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIk1vdmUiCi0JCQlxdWlkICAgICAgIAkiM0UyNUNEQzAwMzQ1IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNFMjVEM0YyMDFBMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpFdmVudDo6RXZlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCQ0M3OTZCMDEyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvbGRQb3NpdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0UyNUNEQzYwMDA0IgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIi0xIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5ld1Bvc2l0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzRTI1Q0RDQjAzMEYiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiLTEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTm90aWZpZXIiCi0JCQlxdWlkICAgICAgIAkiM0UyNkVDNUUwMUU4IgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciIKLQkJCQlxdWlkICAgICAgIAkiM0UyNkVDOTYwMERBIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUmVzb3VyY2UiCi0JCQlxdWlkICAgICAgIAkiM0UyNzI1MjcwMDZGIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UiCi0JCQkJcXVpZCAgICAgICAJIjNFMjcyNTM5MDExRiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNldHRpbmciCi0JCQlxdWlkICAgICAgIAkiM0UzOUE1MTEwMDBFIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZWZOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzRTY1NTQxQTAzMzUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0UzOUE1MzMwMDAzIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicG9zaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNFNjU1M0IxMDI0RSIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSItMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJFT2JqZWN0RGVzY3JpcHRvciIKLQkJCXF1aWQgICAgICAgCSIzRTY2NzJFOTAzOTYiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV2ZW50SWQiCi0JCQkJcXVpZCAgICAgICAJIjNFNjY3MzM1MDM4QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVPYmplY3RQb3NpdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0U2NzdFRjMwMUZBIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIi0xIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiCi0JCQlxdWlkICAgICAgIAkiM0U2NTU0NTEwMDRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJhZGRlZERlc2NyaXB0b3JzIgotCQkJCXF1aWQgICAgICAgCSIzRTY1NTQ1MTAzNDgiCi0JCQkJbGFiZWwgICAgICAJImFkZGVkRGVzY3JpcHRvcnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OkVPYmplY3REZXNjcmlwdG9yIgotCQkJCXF1aWR1ICAgICAgCSIzRTY2NzJFOTAzOTYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyIKLQkJCQlxdWlkICAgICAgIAkiM0U2NTU0NTEwMzQ5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OkV2ZW50OjpFdmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0JDQzc5NkIwMTI5IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCIKLQkJCXF1aWQgICAgICAgCSIzRTY1NTQ4MDAzODIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlbW92ZWREZXNjcmlwdG9ycyIKLQkJCQlxdWlkICAgICAgIAkiM0U2NTU0ODEwMkJCIgotCQkJCWxhYmVsICAgICAgCSJyZW1vdmVkRGVzY3JpcHRvcnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OkVPYmplY3REZXNjcmlwdG9yIgotCQkJCXF1aWR1ICAgICAgCSIzRTY2NzJFOTAzOTYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSIKLQkJCQlxdWlkICAgICAgIAkiM0U2NTU0ODEwMkJDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OkV2ZW50OjpFdmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0JDQzc5NkIwMTI5IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiIKLQkJCXF1aWQgICAgICAgCSIzRTY2NzM0NzAzMTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInNldHRpbmdzIgotCQkJCXF1aWQgICAgICAgCSIzRTY2NzM0ODAyQTMiCi0JCQkJbGFiZWwgICAgICAJInNldHRpbmdzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OkV2ZW50OjpTZXR0aW5nIgotCQkJCXF1aWR1ICAgICAgCSIzRTM5QTUxMTAwMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyIKLQkJCQlxdWlkICAgICAgIAkiM0U2NjczNDgwMkFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OkV2ZW50OjpFT2JqZWN0RGVzY3JpcHRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0U2NjcyRTkwMzk2IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCIKLQkJCXF1aWQgICAgICAgCSIzRTQwNEZEMjAzMUUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlbW92ZWRFT2JqZWN0cyIKLQkJCQlxdWlkICAgICAgIAkiM0U0MDRGRDMwM0ExIgotCQkJCWxhYmVsICAgICAgCSJyZW1vdmVkRU9iamVjdHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPYmplY3QiCi0JCQkJcXVpZHUgICAgICAJIjNDNEYxQzg2MDEyMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5IgotCQkJCXF1aWQgICAgICAgCSIzRTQwNEZEMzAzQTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OkV2ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQkNDNzk2QjAxMjkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCIKLQkJCXF1aWQgICAgICAgCSIzRTc5MTZDRTAxNkMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImZlYXR1cmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNFNzkxNkQ3MDA0MyIKLQkJCQlsYWJlbCAgICAgIAkiZmVhdHVyZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzOTAzRDU5RDAyMzAiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExIgotCQkJCXF1aWQgICAgICAgCSIzRTc5MTZENzAwNEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OkV2ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQkNDNzk2QjAxMjkiKSkpKQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQkJcXVpZCAgICAgICAJIjNFMkM1MTdBMDE5MiIKLQkJCXRpdGxlICAgICAgCSJNYWluIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpFdmVudDo6RXZlbnRLaW5kIiBAMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMTk2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MDIsIDE3NTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV2ZW50S2luZCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTAyLCAxNzA5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMTU5OTc5MgotCQkJCXF1aWR1ICAgICAgCSIzRTIzMzYyNTAxODIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTAyLCAxODE5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk4Ci0JCQkJICAgIG1heF93aWR0aCAgCTI4NykKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAk1NDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OkV2ZW50OjpNb3ZlIiBAMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTY5NiwgMTEyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0ODAsIDEwMTQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1vdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzRTI1Q0RDMDAzNDUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDgwLCAxMDc0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MykKLQkJCQl3aWR0aCAgICAgIAk0NTAKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IE5vdGVWaWV3IEAzCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyLCAyMjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUaGUgZXZlbnRLaW5kIGF0dHJpYnV0ZSwgbm90aWZpZXIgYXR0cmlidXRlIGFuZCBmZWF0dXJlIHJlZmVyZW5jZSBhcmUgYWxsIHRyYW5zaWVudCIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJd2lkdGggICAgICAJNjAwCi0JCQkJaGVpZ2h0ICAgICAJMTk0KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OlJlbW92ZU1hbnkiIEA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTUyLCAxNTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1NywgMTM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUmVtb3ZlTWFueSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNFMjVDRDkyMDBFNiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTcsIDE0MzMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNjAwKQotCQkJCXdpZHRoICAgICAgCTYwOAotCQkJCWhlaWdodCAgICAgCTI4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OlJlbW92ZSIgQDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDE1MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjExLCAxMzczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJSZW1vdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzRTI1Q0Q4QTAzODMiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjExLCAxNDMzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTQwMykKLQkJCQl3aWR0aCAgICAgIAk0MTIKLQkJCQloZWlnaHQgICAgIAkyODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OkV2ZW50OjpBZGRNYW55IiBANgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAxNTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUzLCAxMzczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJBZGRNYW55IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0UyNUNENjQwM0M1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUzLCAxNDMzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTYwMCkKLQkJCQl3aWR0aCAgICAgIAk2MDgKLQkJCQloZWlnaHQgICAgIAkyODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OkV2ZW50OjpBZGQiIEA3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE1MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMTM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQWRkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0UyNUNENUYwMzNCIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDE0MzMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAzKQotCQkJCXdpZHRoICAgICAgCTQxMgotCQkJCWhlaWdodCAgICAgCTI4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OlVuc2V0IiBAOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTEyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDkzOSwgMTAxNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVW5zZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzRTI1Q0Q4MzAxNjYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MzksIDEwNzQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAzKQotCQkJCXdpZHRoICAgICAgCTQxMgotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OlNldCIgQDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU2MCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDMyMiwgMTAxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0UyNUNEN0QwMkRBIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzIyLCAxMDcyKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQ4NCkKLQkJCQl3aWR0aCAgICAgIAk0OTQKLQkJCQloZWlnaHQgICAgIAkzMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OkV2ZW50OjpOb3RpZmllciIgQDEwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjksIDIwNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTAxNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJOb3RpZmllciIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjksIDIwMDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTAxNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDU0MDE2Ci0JCQkJcXVpZHUgICAgICAJIjNFMjZFQzVFMDFFOCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2OSwgMjExMykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkxMDI4KQotCQkJCXdpZHRoICAgICAgCTEwMzIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OkV2ZW50OjpTZXR0aW5nIiBAMTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5ODQsIDI4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA3LCAxNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzU0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNldHRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzRTM5QTUxMTAwMEUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNywgMjE3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTM2NSkKLQkJCQl3aWR0aCAgICAgIAkzNzIKLQkJCQloZWlnaHQgICAgIAkyODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OkV2ZW50OjpFT2JqZWN0RGVzY3JpcHRvciIgQDEyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgNjYyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFT2JqZWN0RGVzY3JpcHRvciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNFNjY3MkU5MDM5NiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUwLCA3MjIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNTEyKQotCQkJCXdpZHRoICAgICAgCTUxOAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAMTMKLQkJCQlsb2NhdGlvbiAgIAkoMTk4NCwgNTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNFNjY3MzQ3MDMxOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2V0dGluZ3MiIEAxNAotCQkJCQlQYXJlbnRfVmlldyAJQDEzCi0JCQkJCWxvY2F0aW9uICAgCSgzMiwgMTA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjQsIDQ4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZXR0aW5ncyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTIyOTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNFNjY3MzQ4MDJBMyIKLQkJCQkJY2xpZW50ICAgICAJQDEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk4NCwgNTQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk4NCwgNDMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTUsIDQ4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQ4MTQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBAMTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMwotCQkJCQlsb2NhdGlvbiAgIAkoMzIsIDEwOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRTY2NzM0ODAyQUQiCi0JCQkJCWNsaWVudCAgICAgCUAxMwotCQkJCQlzdXBwbGllciAgIAlAMTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5ODQsIDU0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5ODQsIDY1MCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFT2JqZWN0IiBAMTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDczNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzEsIDY2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRU9iamVjdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDNEYxQzg2MDEyMyIKLQkJCQl3aWR0aCAgICAgIAkxOTYKLQkJCQloZWlnaHQgICAgIAkxNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUiIEAxOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDI4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MzUsIDIzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRVN0cnVjdHVyYWxGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzkwM0Q1OUQwMjMwIgotCQkJCXdpZHRoICAgICAgCTM5NgotCQkJCWhlaWdodCAgICAgCTEyNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6RXZlbnQ6OkV2ZW50IiBAMjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCA2ODgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAxLCA1MzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV2ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0JDQzc5NkIwMTI5IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMSwgNTkyKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQ1MykKLQkJCQl3aWR0aCAgICAgIAk0NjQKLQkJCQloZWlnaHQgICAgIAkzMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjEKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNywgOTQ4KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAyMAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTAyNywgOTQ4KQotCQkJCSAgICAoMTAyNywgODU2KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRTI1RDNGMjAxQTEiCi0JCQkJY2xpZW50ICAgICAJQDIKLQkJCQlzdXBwbGllciAgIAlAMjAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjUyLCAxMDAyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjUyLCA5NDgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRTI1RDNFQTAwRUIiCi0JCQkJY2xpZW50ICAgICAJQDUKLQkJCQlzdXBwbGllciAgIAlAMjAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCAxMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE1LCA5NDgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRTI1RDNGQjAyOTQiCi0JCQkJY2xpZW50ICAgICAJQDgKLQkJCQlzdXBwbGllciAgIAlAMjAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIxLCAxMDAyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIxLCA5NDgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRTI1RDNFMTAyNzkiCi0JCQkJY2xpZW50ICAgICAJQDcKLQkJCQlzdXBwbGllciAgIAlAMjAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTYsIDEzNjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgOTQ4KQotCQkJCWRyYXdTdXBwbGllciAJQDIxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0UyNUQzRTUwM0FCIgotCQkJCWNsaWVudCAgICAgCUA2Ci0JCQkJc3VwcGxpZXIgICAJQDIwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDksIDk0OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMSkKLQkJCSAgICAob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDI3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQljbGllbnQgICAgIAlAMwotCQkJCXN1cHBsaWVyICAgCUAyMAotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAyOAotCQkJCWxvY2F0aW9uICAgCSgxNDk4LCA2ODEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0U2NTU0NTEwMDRGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhZGRlZERlc2NyaXB0b3JzIiBAMjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAyOAotCQkJCQlsb2NhdGlvbiAgIAkoNjUwLCAyNDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2MiwgNTg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2FkZGVkRGVzY3JpcHRvcnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2Nzg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNFNjU1NDUxMDM0OCIKLQkJCQkJY2xpZW50ICAgICAJQDI4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgNjgxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0MSwgNjgxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDksIDY0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjI1NDMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAyOAotCQkJCQlsb2NhdGlvbiAgIAkoNjUwLCAyNDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0U2NTU0NTEwMzQ5IgotCQkJCQljbGllbnQgICAgIAlAMjgKLQkJCQkJc3VwcGxpZXIgICAJQDIwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCA2ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjU2LCA2ODEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAzMwotCQkJCWxvY2F0aW9uICAgCSgxNDk4LCA4MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0U2NTU0ODAwMzgyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZW1vdmVkRGVzY3JpcHRvcnMiIEAzNAotCQkJCQlQYXJlbnRfVmlldyAJQDMzCi0JCQkJCWxvY2F0aW9uICAgCSg2NTAsIDM3MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTQwLCA3NjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVtb3ZlZERlc2NyaXB0b3JzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzYxMzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRTY1NTQ4MTAyQkIiCi0JCQkJCWNsaWVudCAgICAgCUAzMwotCQkJCQlzdXBwbGllciAgIAlAMTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDgwMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDEsIDgwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCA4NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxOTMxOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDM3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCQkJbG9jYXRpb24gICAJKDY1MCwgMzcxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNFNjU1NDgxMDJCQyIKLQkJCQkJY2xpZW50ICAgICAJQDMzCi0JCQkJCXN1cHBsaWVyICAgCUAyMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgODAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1NiwgODAzKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMzgKLQkJCQlsb2NhdGlvbiAgIAkoNjA1LCA4MTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0U0MDRGRDIwMzFFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZW1vdmVkRU9iamVjdHMiIEAzOQotCQkJCQlQYXJlbnRfVmlldyAJQDM4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDEsIC00KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3NiwgODUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlbW92ZWRFT2JqZWN0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3MjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0U0MDRGRDMwM0ExIgotCQkJCQljbGllbnQgICAgIAlAMzgKLQkJCQkJc3VwcGxpZXIgICAJQDE4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDUsIDgxMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxOCwgODEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwMiwgNzgyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTQ1MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkiIEA0MgotCQkJCQlQYXJlbnRfVmlldyAJQDM4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDEsIC00KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNFNDA0RkQzMDNBMiIKLQkJCQkJY2xpZW50ICAgICAJQDM4Ci0JCQkJCXN1cHBsaWVyICAgCUAyMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjA1LCA4MTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTIsIDgxMikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDQzCi0JCQkJbG9jYXRpb24gICAJKDYwNSwgNjUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNFMjVEMzVGMDBDRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlANDMKLQkJCQkJbG9jYXRpb24gICAJKC0zMjMsIC0xMjA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1NSwgNjA5KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRTI1RDM2MDAwRjgiCi0JCQkJCWNsaWVudCAgICAgCUA0MwotCQkJCQlzdXBwbGllciAgIAlAMjAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYwNSwgNjUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzkyLCA2NTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhZGRlZEVPYmplY3RzIiBANDYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0MwotCQkJCQlsb2NhdGlvbiAgIAkoLTMyMywgLTEyMDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDY1LCA1OTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYWRkZWRFT2JqZWN0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUzNTU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0UyNUQzNjAwMEY3IgotCQkJCQljbGllbnQgICAgIAlANDMKLQkJCQkJc3VwcGxpZXIgICAJQDE4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDUsIDY1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxOCwgNjUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ5NiwgNjgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODI5MzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNFMjVEM0Y2MDAxNiIKLQkJCQljbGllbnQgICAgIAlANAotCQkJCXN1cHBsaWVyICAgCUAyMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMzAsIDEzNjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMzAsIDk0OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNFMjVENDAxMDM4MyIKLQkJCQljbGllbnQgICAgIAlAOQotCQkJCXN1cHBsaWVyICAgCUAyMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MCwgMTAwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQwLCA5NDgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjEpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBANTEKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgNDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNFNzkxNkNFMDE2QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmVhdHVyZSIgQDUyCi0JCQkJCVBhcmVudF9WaWV3IAlANTEKLQkJCQkJbG9jYXRpb24gICAJKC0xNiwgLTM2NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDUsIDM5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmZWF0dXJlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjcyMTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTgwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRTc5MTZENzAwNDMiCi0JCQkJCWNsaWVudCAgICAgCUA1MQotCQkJCQlzdXBwbGllciAgIAlAMTkKLQkJCQkJbGluZV9zdHlsZSAJMAotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTMsIDQzNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA0NzYxOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEiIEA1NQotCQkJCQlQYXJlbnRfVmlldyAJQDUxCi0JCQkJCWxvY2F0aW9uICAgCSgtMTYsIC0zNjYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0U3OTE2RDcwMDREIgotCQkJCQljbGllbnQgICAgIAlANTEKLQkJCQkJc3VwcGxpZXIgICAJQDIwCi0JCQkJCWxpbmVfc3R5bGUgCTApKSkKLQkJCSAgICAob2JqZWN0IE5vdGVWaWV3IEA1NgotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAxODA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDk2OSwgMTczNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0NTkKLQkJCQkgICAgbGFiZWwgICAgICAJIkFsbCBhdHRyaWJ1dGVzIG9mIHR5cGUgSmF2YU9iamVjdCBhcmUgdHJhbnNpZW50IikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQl3aWR0aCAgICAgIAk1MTkKLQkJCQloZWlnaHQgICAgIAkxNTYpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpFdmVudDo6SmF2YU9iamVjdCIgQDU3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTYsIDIwNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkphdmFPYmplY3QiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTYsIDIwMDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0NTQwMTYKLQkJCQlxdWlkdSAgICAgIAkiM0JGNDA3QjgwMDQwIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTYsIDIxMTMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI1KQotCQkJCXdpZHRoICAgICAgCTYzNAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXR0YWNoVmlldyAiIiBANTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWNsaWVudCAgICAgCUA1NgotCQkJCXN1cHBsaWVyICAgCUA3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg5NTYsIDE4NTYpCi0JCQkJICAgICgyNjgsIDE4NTYpCi0JCQkJICAgICgyNjgsIDE2NDcpKQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDE3MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NiwgMTUwNCkpCi0JCQkgICAgKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA1OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJY2xpZW50ICAgICAJQDU2Ci0JCQkJc3VwcGxpZXIgICAJQDYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5OTYsIDE3MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NiwgMTY0NykpCi0JCQkgICAgKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA2MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJY2xpZW50ICAgICAJQDU2Ci0JCQkJc3VwcGxpZXIgICAJQDUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI3LCAxNzI5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI3LCAxNjQ3KSkKLQkJCSAgICAob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDYxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQljbGllbnQgICAgIAlANTYKLQkJCQlzdXBwbGllciAgIAlAOQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTU2LCAxNzc1KQotCQkJCSAgICAoNDkwLCAxNzc1KQotCQkJCSAgICAoNDkwLCAxMzM2KSkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCAxNzI5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDcsIDExNjgpKQotCQkJICAgIChvYmplY3QgQXR0YWNoVmlldyAiIiBANjIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWNsaWVudCAgICAgCUA1NgotCQkJCXN1cHBsaWVyICAgCUA0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNDc1LCAxODI4KQotCQkJCSAgICAoMTc0NCwgMTgyOCkKLQkJCQkgICAgKDE3NDQsIDE2NDcpKQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDE3MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NDgsIDE1MDQpKQotCQkJICAgIChvYmplY3QgQXR0YWNoVmlldyAiIiBANjMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWNsaWVudCAgICAgCUA1NgotCQkJCXN1cHBsaWVyICAgCUA4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTcyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE2OCwgMTIzOCkpKSkpKSkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQjFGRTRDNjAxNzUiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpFdmVudCIgQDY0Ci0JCQlsb2NhdGlvbiAgIAkoMjg4LCAyNTYpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlANjQKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0LCAxNzIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJFdmVudCIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiM0UyQzUxMDQwMTg4IgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplY29yZSIgQDY1Ci0JCQlsb2NhdGlvbiAgIAkoNzM2LCAyNzIpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlANjUKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTkyLCAxODgpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciCi0JcXVpZCAgICAgICAJIjNCMUZFNEJCMDBDNiIKLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0IxRkU0QzYwMTQzIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMKLQlxdWlkICAgICAgIAkiM0IxRkU0QkIwMEM3IgotCVByb2NzTkRldnMgCShsaXN0Ci0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciCi0JCXF1aWQgICAgICAgCSIzQjFGRTRCQjAwRDkiCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJyZWZlcmVuY2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEREwiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlIgotCQkJdmFsdWUgICAgICAJKCJEYXRhQmFzZVNldCIgODAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiQU5TSSIKLQkJCQl2YWx1ZSAgICAgIAk4MDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJPcmFjbGUiCi0JCQkJdmFsdWUgICAgICAJODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiU1FMU2VydmVyIgotCQkJCXZhbHVlICAgICAgCTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIlN5YmFzZSIKLQkJCQl2YWx1ZSAgICAgIAk4MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJXYXRjb20iCi0JCQkJdmFsdWUgICAgICAJODA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSIKLQkJCXZhbHVlICAgICAgCSJJZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVl8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lIgotCQkJdmFsdWUgICAgICAJIlRfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkluaGVyaXRTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiX1YiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQmFzZVZpZXdzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJWQVJDSEFSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiTnVsbHNPSyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSURMRWxlbWVudCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExTcGVjaWZpY2F0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiSURMU3BlY1NldCIgMjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSURMU3BlY1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlR5cGVkZWYiCi0JCQkJdmFsdWUgICAgICAJNTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJFeGNlcHRpb24iCi0JCQkJdmFsdWUgICAgICAJNjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTdHJ1Y3QiCi0JCQkJdmFsdWUgICAgICAJNTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJVbmlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4MSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lY29yZS5ldmVudC9zcmMvbW9kZWwvZXZlbnQubWRsLCBlbWYuZWNvcmUsIG9yZy5lY2xpcHNlLmRldiwgMjAwMzAyMjVfMTY1NlNMIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSURMTW9kdWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lY29yZS5ldmVudC9zcmMvbW9kZWwvZXZlbnQubWRsLCBlbWYuZWNvcmUsIG9yZy5lY2xpcHNlLmRldiwgMjAwMzAyMjVfMTY1NlNMIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkibV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkic18iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJInZvaWQiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSIKLQkJCXZhbHVlICAgICAgCSJfSUQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiCi0JCQkJdmFsdWUgICAgICAJMTkwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIgotCQkJCXZhbHVlICAgICAgCTE4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIgotCQkJCXZhbHVlICAgICAgCTE4MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiIKLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUk9XIgotCQkJCXZhbHVlICAgICAgCTE3MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIgotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIgotCQkJCXZhbHVlICAgICAgCTE2MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiNiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSZXBvc2l0b3J5IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5IgotCQkJdmFsdWUgICAgICAJImNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXZlbnQvc3JjL21vZGVsL2V2ZW50Lm1kbCwgZW1mLmVjb3JlLCBvcmcuZWNsaXBzZS5kZXYsIDIwMDMwMjI1XzE2NTZTTCIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lY29yZS5ldmVudC9zcmMvbW9kZWwvZXZlbnQubWRsLCBlbWYuZWNvcmUsIG9yZy5lY2xpcHNlLmRldiwgMjAwMzAyMjVfMTY1NlNMIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJhaXNlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiCi0JCQl2YWx1ZSAgICAgIAkyKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAk2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIgotCQkJCXZhbHVlICAgICAgCTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlNDQyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVHlwZUxpYkltcG9ydGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIxOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIyMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSIKLQkJCXZhbHVlICAgICAgCSIwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGUiCi0JCQl2YWx1ZSAgICAgIAkoIkNyZWF0YWJsZVNldCIgMjIxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5pdGlhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVGVybWluYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25DbGFzcyIKLQkJCXZhbHVlICAgICAgCSJDb2xsZWN0aW9uIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJUZXh0IgotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJG9wZXJhdGlvbiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZSRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTGV0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpKQotCXF1aWQgICAgICAgCSIzQjFGRTRCQjAwQzgiKSkKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9wbHVnaW4ueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwY2U4MjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbj4KLQotICAgCi08IS0tIGJ1aWxkLWxldmVsID0gIjIwMDMwODA2XzE3MTNTTCIgKioqIFdpdGggZml4IDEwMDI4IG1lcmdlZCBpbi4gLS0+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJldmVudC54bWkiCi0gICAgICAgICAgICBjbGFzcz0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LmltcGwuRXZlbnRQYWNrYWdlSW1wbCI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNzc5MWUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9BdHRpYy9mZWF0dXJlLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIzOjAyOjE0ICQKLSMKLQotCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SmF2YSBFTUYgTW9kZWwKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVZpc3VhbCBFZGl0b3IgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUphdmEgRU1GIE1vZGVsLCBpbmNsdWRpbmcgQmVhbkluZm8sIEphdmEgTW9kZWwsIFByb3h5IHN1cHBvcnQgKHdpdGggcmVtb3RlIHZtIGFuZCBJREUgdm0gc3VwcG9ydCkuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSmFudWFyeSAyOCwgMjAwNFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNjkyM2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0iCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3Rvb2xzL3ZlL3VwZGF0ZXMvMS4wLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdG9vbHMvdmUvdXBkYXRlcy8xLjAvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZHQiIHZlcnNpb249IjMuMS4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZiIgdmVyc2lvbj0iMi4xLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wLjIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU5ZmI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SmFudWFyeSAyOCwgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkNGJiOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmplbS5zb3VyY2U9b3JnLmVjbGlwc2UuamVtCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1NTI3Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvQXR0aWMvZmVhdHVyZS5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMzowMjoxNCAkCi0jCi0KLQotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgRU1GIE1vZGVsIFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VmlzdWFsIEVkaXRvciB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QmluYXJpZXMgYW5kIEFQSSBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgemlwcyBmb3IgdGhlIFZpc3VhbCBFZGl0b3IuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSmFudWFyeSAyOCwgMjAwNFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3NzZmZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0uc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMi4wIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy90b29scy92ZS91cGRhdGVzLzEuMC8iLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3Rvb2xzL3ZlL3VwZGF0ZXMvMS4wLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnNkayIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTlmYjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SmFudWFyeSAyOCwgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjMyZDMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS5zZGs8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL01FVEEtSU5GL01BTklGRVNULk1GIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0NjE3Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLnNkawotQnVuZGxlLVZlcnNpb246IDEuMi4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWEzZWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGIzOWMzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL0F0dGljL2Fib3V0LnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIzOjAyOjE0ICQKLSMKLQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1KYXZhIEVNRiBNb2RlbCBTREtcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuIDIwMDAsIDIwMDQuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy92ZXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3M2EyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2VjbGlwc2UzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWIxOGYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL0F0dGljL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMzowMjoxNCAkCi0jCi0KLQotcGx1Z2luTmFtZT1KYXZhIEVNRiBNb2RlbCBTREsKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNjNzBmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmNDQ4Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvQXR0aWMvZmVhdHVyZS5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMzowMjoxNCAkCi0jCi0KLQotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgRU1GIE1vZGVsIFNvdXJjZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VmlzdWFsIEVkaXRvciB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QVBJIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZSB6aXBzIGZvciB0aGUgSmF2YSBFTUYgTW9kZWwuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSmFudWFyeSAyOCwgMjAwNFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU5ZmI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWU0MTNiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxYTNlYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZmEyNzkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9BdHRpYy9hYm91dC5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMzowMjoxNCAkCi0jCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPUphdmEgRU1GIE1vZGVsIFNES1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy4gMjAwMCwgMjAwNC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3ZlcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MTAyODcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDkxNTUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vQXR0aWMvcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIzOjAyOjE0ICQKLSMKLQotCi1wbHVnaW5OYW1lID0gSmF2YSBFTUYgTW9kZWwgU291cmNlCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMGFhOTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZV8wLjcuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjA2NmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuZG9jLmlzdi5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5M2M2NzkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbAotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRjOWE3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1kZXNjcmlwdGlvbj1KMkVFIFN0YW5kYXJkIFRvb2xzIERvY3VtZW50YXRpb24KLQotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUphbnVhcnkgMjgsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLVRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLVN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotRmVhdHVyZSBkaXJlY3RvcmllcyBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLUFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi1Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwZDUyYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlIgotICAgICAgbGFiZWw9IkoyRUUgU3RhbmRhcmQgVG9vbHMgRG9jIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMCIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotICAgPGluc3RhbGwtaGFuZGxlci8+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24uaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+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+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby51aS9PQlNPTEVURS1tb3ZlZCB0byBvcmcuZWNsaXBzZS5qZW0udWkgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby51aS9PQlNPTEVURS1tb3ZlZCB0byBvcmcuZWNsaXBzZS5qZW0udWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udWkvT0JTT0xFVEUtbW92ZWQgdG8gb3JnLmVjbGlwc2UuamVtLnVpCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzA1ZTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImJlYW5pbmZvQ29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iYmVhbmluZm8iLz4KLQk8Y2xhc3NwYXRoZW50cnkgb3V0cHV0PSJiaW5fdm1fYmVhbmluZm92bSIga2luZD0ic3JjIiBwYXRoPSJ2bV9iZWFuaW5mb3ZtIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjgxNzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1iaW5fYmVhbmluZm9jb21tb24KLWJpbl92bV9iZWFuaW5mb3ZtCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjI0NjUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9ndHJhY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ3RyYWNlZmlsZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9nbGV2ZWw9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzODA3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5jb20uaWJtLmV0b29scy5lbWYuZXZlbnQ8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUueGVyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb21wYXJlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmVtZi5lY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmplbTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamVtLnByb3h5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5vc2dpPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+Y29tLmlibS5ydHAudG9vbHMucm9zZS5idWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5yb3NlPC9rZXk+Ci0JCQkJCTx2YWx1ZT48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPmNvbS5pYm0ucnRwLnRvb2xzLnJvc2UudG9vbG5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTRiN2Y2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBNYXkgMTggMTY6NDM6MjcgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3YzdhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotI1RodSBKdW4gMTYgMTI6NDU6NDQgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9jb21tZW50cz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZmY2MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI1dlZCBNYXkgMTEgMTY6MjA6MTUgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO29yZy5lY2xpcHNlLnd0cDtvcmcuZWNsaXBzZS5qZW07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qY207b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamF2YTtvcmcuZWNsaXBzZS52ZTtjb207Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkYzE2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgSnVuIDE2IDExOjA5OjA4IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotc2VsZmhvc3RpbmcuYmluRXhjbHVkZXM9L29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iaW5fdm1fYmVhbmluZm92bQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZWU2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm87IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0sCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycywKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamVtLnByb3h5LAotIGNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS5vc2dpLAotIG9yZy5lY2xpcHNlLnVpO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkltcGxpY2l0IEl0ZW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldEltcGxpY2l0SXRlbSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vRXZlbnRTZXREZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9FdmVudFNldERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTdiZjQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9FdmVudFNldERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogRXZlbnRTZXREZWNvcmF0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8xMC8wNiAxNToxODozOCAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FdmVudCBTZXQgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRXF1aXZhbGVudCB0byBFdmVudFNldERlY29yYXRvciBpbiBqYXZhLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc0luRGVmYXVsdEV2ZW50U2V0IDxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzVW5pY2FzdCA8ZW0+VW5pY2FzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSA8ZW0+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldEFkZExpc3RlbmVyTWV0aG9kIDxlbT5BZGQgTGlzdGVuZXIgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0TGlzdGVuZXJNZXRob2RzIDxlbT5MaXN0ZW5lciBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0TGlzdGVuZXJUeXBlIDxlbT5MaXN0ZW5lciBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QgPGVtPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRFdmVudEFkYXB0ZXJDbGFzcyA8ZW0+RXZlbnQgQWRhcHRlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldFNlckxpc3RNdGhkIDxlbT5TZXIgTGlzdCBNdGhkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEV2ZW50U2V0RGVjb3JhdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGludGVyZmFjZSBFdmVudFNldERlY29yYXRvciBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3J7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+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/IGdldFJlZ2lzdHJ5KCkgOiBudWxsKTsgLy8gTWFyayBpdCBzdGFsZSB3aXRoIHRoZSBjdXJyZW50IHJlZ2lzdHJ5LgotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBtYXJrU3RhbGVJbnRyb3NwZWN0aW9uUGx1c0lubmVyKFN0cmluZyBzb3VyY2VOYW1lLCBib29sZWFuIGNsZWFyUmVzdWx0cykgewotCQlwcm9jZXNzUXVldWUoKTsKLQkJU3RyaW5nIHNvdXJjZU5hbWVGb3JJbm5lciA9IHNvdXJjZU5hbWUgKyAnJCc7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJSXRlcmF0b3IgaXRyID0gZkludHJvc3BlY3RlZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGVudHJ5TmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCWlmIChlbnRyeU5hbWUuZXF1YWxzKHNvdXJjZU5hbWUpIHx8IGVudHJ5TmFtZS5zdGFydHNXaXRoKHNvdXJjZU5hbWVGb3JJbm5lcikpIHsKLQkJCQkJLy8gSXQgaXMgdGhlIGl0ZW0gb3Igb25lIG9mIGl0cyBpbm5lciBjbGFzc2VzLgotCQkJCQlXZWFrVmFsdWUgcmVmID0gKFdlYWtWYWx1ZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJQmVhbmluZm9DbGFzc0FkYXB0ZXIgYSA9IChCZWFuaW5mb0NsYXNzQWRhcHRlcikgcmVmLmdldCgpOwkJCQkJCi0JCQkJCWlmIChhICE9IG51bGwpIHsKLQkJCQkJCWlmIChjbGVhclJlc3VsdHMpCi0JCQkJCQkJYS5jbGVhckludHJvc3BlY3Rpb24oKTsKLQkJCQkJCWEubWFya1N0YWxlRmFjdG9yeShpc1JlZ2lzdHJ5Q3JlYXRlZCgpID8gZ2V0UmVnaXN0cnkoKSA6IG51bGwpOyAvLyBNYXJrIGl0IHN0YWxlIHdpdGggdGhlIGN1cnJlbnQgcmVnaXN0cnkuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYW4gYWRhcHRlciBmb3IgaW50cm9zcGVjdGlvbi4KLQkgKiBAcGFyYW0gc291cmNlTmFtZSBGdWxseSBxdWFsaWZpZWQgc291cmNlIG5hbWUsIHVzZSB0eXBlIGZvciByZWZsZWN0aW9uLCBpLmUuICJhLmIuYy5DbGFzczEkSW5uZXJDbGFzcyIKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGUgYWRhcHRlciB0byByZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVySW50cm9zcGVjdGlvbihTdHJpbmcgc291cmNlTmFtZSwgQmVhbmluZm9DbGFzc0FkYXB0ZXIgYWRhcHRlcikgewotCQkvLyBDcmVhdGUgaXQgYXMgYSB3ZWFrIHJlZmVyZW5jZSBzbyB0aGF0IGl0IGRvZXNuJ3QgaG9sZCBvbnRvIHRoZSBhZGFwdGVyIGlmIGl0IGlzIGV2ZXIgcmVtb3ZlZAotCQkvLyBhbmQgdGhyb3duIGF3YXkgKG9yIHRoZSBNT0YgcmVzb3VyY2UgaXRzZWxmIGlzIHRocm93biBhd2F5KS4KLQkJcHJvY2Vzc1F1ZXVlKCk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJZkludHJvc3BlY3RlZC5wdXQoc291cmNlTmFtZSwgbmV3IFdlYWtWYWx1ZShzb3VyY2VOYW1lLCBhZGFwdGVyLCBmUmVmUSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhZGFwdGVyLiBUaGlzIGhhcHBlbnMgaW4gdGhlIGNhc2UgdGhhdCBhZGFwdGVyIGlzIGJlaW5nIHJlbW92ZWQgYW5kCi0JICogd2Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSBvdXIgbGlzdC4gVGhpcyBpcyBhbiBpbnRlcm5hbCBBUEkgb25seSBmb3IgdXNlIGJ5Ci0JICogdGhlIGFkYXB0ZXIgaXRzZWxmLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBZGFwdGVyKEJlYW5pbmZvQ2xhc3NBZGFwdGVyIGEpIHsKLQkJZkludHJvc3BlY3RlZC5yZW1vdmUoYS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHByb2Nlc3NRdWV1ZSgpIHsKLQkJV2Vha1ZhbHVlIHd2OwotCQl3aGlsZSAoKHd2ID0gKFdlYWtWYWx1ZSkgZlJlZlEucG9sbCgpKSAhPSBudWxsKSB7Ci0JCQlmSW50cm9zcGVjdGVkLnJlbW92ZSh3di5nZXRLZXkoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9DbGFzc0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0NsYXNzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTIxNjViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0NsYXNzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvQ2xhc3NBZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQ3ICQgICREYXRlOiAyMDA1LzEwLzExIDIxOjI3OjE3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN1cGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLkNsYXNzRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi1pbXBvcnQgY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LkV2ZW50RmFjdG9yeTsKLWltcG9ydCBjb20uaWJtLmV0b29scy5lbWYuZXZlbnQuRXZlbnRVdGlsOwotCi0vKioKLSAqIEJlYW5pbmZvIGFkYXB0ZXIgZm9yIGRvaW5nIGludHJvc3BlY3Rpb24gb24gYSBKYXZhIE1vZGVsIGNsYXNzLgotICogPHA+Ci0gKiBUaGUgZmlyc3QgdGltZSBhIGludHJvc3BlY3QgcmVxdWVzdCBpcyBtYWRlLCBpdCB3aWxsIHVzZSB0aGUgQ2xhc3NFbnRyeSBmcm9tIHRoZSBjYWNoZSBjb250cm9sbGVyIHRvIGRldGVybWluZSBpZiBpdCBzaG91bGQgbG9hZCBmcm9tIHRoZQotICogY2FjaGUgb3IgZG8gYSBjb21wbGV0ZSBpbnRyb3NwZWN0aW9uLiBBZnRlciB0aGF0IGl0IHdpbGwgYWx3YXlzIGRvIGEgY29tcGxldGUgaW50cm9zcGVjdGlvbiB3aGVuIGl0IGlzIG1hcmtlZCBhcyBuZWVkaW5nIGludHJvc3BlY3Rpb24uCi0gKiBUaGlzIGlzIGJlY2F1c2UgdGhlIGNhY2hlIGlzIHVzZWxlc3MgdG8gdXMgdGhlbi4gQXQgdGhhdCBwb2ludCBpbiB0aW1lIHdlIGFscmVhZHkga25vdyB0aGF0IHdlIG9yIG9uZSBvZiBvdXIgc3VwZXJjbGFzc2VzIG9yIG9uZSBvZiAKLSAqIG91dGVyIGNsYXNzZXMgaGFzIGNoYW5nZWQsIHRoZXJlYnkgcmVxdWlyaW5nIHVzIHRvIHJlaW50cm9zcGVjdCwgdGhlIGNhY2hlIGlzIGludmFsaWQgYXQgdGhhdCBwb2ludC4gQWxzbyBvbmNlIHdlIGRpZCBhbiBpbnRyb3NwZWN0aW9uIHdlCi0gKiBkb24ndCB3YW50IHRvIGRvIGEgbG9hZCBmcm9tIGNhY2hlIGJ1dCBpbnN0ZWFkIGRvIGEgbWVyZ2UgYmVjYXVzZSBzb21lb25lIG1heSBvZiBiZWVuIGhvbGRpbmcgb250byB0aGUgZmVhdHVyZXMgYW5kIHdlIGRvbid0IHdhbnQgdG8KLSAqIHRocm93IHRoZW0gYXdheSB1bm5lY2Vzc2FyaWx5LgotICogPHA+IAotICogVE9ETyBOZWVkIHRvIHJlLWxvb2sgaW50byB0aGlzIHRvIHNlZSBpZiB3ZSBjYW4gZG8gYSBtZXJnZSB3aXRoIHRoZSBjYWNoZSBmaWxlIGJlY2F1c2UgaWYgaXQgd2FzIGFuIGV4dGVybmFsIGphciBhbmQgaXQgaGFzIG5vdyBnb25lCi0gKiB2YWxpZCwgd2h5IHdhc3RlIHRpbWUgcmVpbnRyb3NwZWN0aW5nLiBCdXQgdGhpcyBuZWVkcyB0byBiZSBjYXJlZnVsbHkgdGhvdWdodCBhYm91dC4gCi0gKiA8cD4gCi0gKiBUaGUgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyCi0gKiB3aWxsIGF1dG9tYXRpY2FsbHkgbWFyayBhbnkgc3ViY2xhc3NlcyAoYm90aCB0aGUgQmVhbmluZm9DbGFzc0FkYXB0ZXIgYW5kIHRoZSBDbGFzc0VudHJ5KSBhcyBiZWluZyBzdGFsZSBmb3IgdXMuIFRoYXQgd2F5IHdlIGRvbid0IG5lZWQKLSAqIHRvIHdhc3RlIHRpbWUgY2hlY2tpbmcgdGhlIGNlIGFuZCBzdXBlcmNsYXNzZXMgZXZlcnl0aW1lLiBXZSB3aWxsIGtlZXAgdGhlIENsYXNzRW50cnkgYXJvdW5kIHNpbXBseSB0byBtYWtlIHRoZSBtYXJraW5nIG9mIGl0IGFzIHN0YWxlIGVhc2llciBmb3IgdGhlCi0gKiByZXNvdXJjZSBsaXN0ZW5lci4gRmluZGluZyB0aGUgY2UgZXZlcnl0aW1lIHdvdWxkIGJlIGV4cGVuc2l2ZS4KLSAqIDxwPiAKLSAqIFRoaXMgaXMgdGhlIHByb2Nlc3MgZm9yIGRldGVybWluaW5nIGlmIGludHJvc3BlY3Rpb24gcmVxdWlyZWQ6Ci0gKiA8b2w+Ci0gKiA8bGk+SWYgbmVlZHNJbnRyb3NwZWN0aW9uIGZsYWcgaXMgZmFsc2UsIHRoZW4gZG8gbm90aGluZy4gRG9lc24ndCBuZWVkIGludHJvc3BlY3Rpb24uCi0gKiA8bGk+SWYgY2xhc3MgaXMgdW5kZWZpbmVkLCB0aGVuIGp1c3Qgc2V0IHVwIGZvciBhbiB1bmRlZmluZWQgY2xhc3MgYW5kIHJldHVybi4gKEluIHRoaXMgY2FzZSB0aGUgQ0Ugc2hvdWxkIGJlIHRocm93biBhd2F5LCBpdCBzaG91bGQgb2YgYmVlbiBkZWxldGVkKS4KLSAqIDxsaT5JZiBuZXZlciBpbnRyb3NwZWN0ZWQgKG5vdCBSRVRSSUVWRURfRlVMTF9ET0NVTUVOVCksIGdldCB0aGUgQ0UsIGdldCB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIGFuZCBjYWxsIGlzU3RhbGVTdGFtcC4gVGhpcyBkZXRlcm1pbmVzIGlmIHRoaXMKLSAqIHN0YW1wIG9yIGFueSBzdXBlciBjbGFzcyBzdGFtcCBpcyBzdGFsZSB3cnQgdG8gY3VycmVudCBzdGFtcC4gSWYgaXQgaXMgbm90IHN0YWxlLCB0aGVuIGxvYWQgZnJvbSBjYWNoZSBiZWNhdXNlIHRoZSBjYWNoZSBpcyBnb29kLiAKLSAqIDxsaT5JZiBubyBjYWNoZSBvciBjYWNoZSBpcyBzdGFsZSBvciBoYXMgaW50cm9zcGVjdGVkIG9uY2UsIHRoZW4gaW50cm9zcGVjdCBhbmQgcmVwbGFjZSBjYWNoZS4KLSAqIDwvb2w+Ci0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9DbGFzc0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElJbnRyb3NwZWN0aW9uQWRhcHRlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9QUk9QRVJUSUVTID0gIlJlZmxlY3QgcHJvcGVydGllcyI7CS8vIFJlZmxlY3QgcHJvcGVydGllcyBpbiBJREUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExZX0VYVEVOU0lPTlMgPSAiQXBwbHkgT3ZlcnJpZGVzIjsJLy8gQXBwbHkgb3ZlcnJpZGUgZmlsZXMgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9JTlRST1NQRUNUID0gIlJlbW90ZSBJbnRyb3NwZWN0IjsJLy8gSW50cm9zcGVjdCBvbiByZW1vdGUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVFJPU1BFQ1QgPSAiSW50cm9zcGVjdCI7CS8vIFN0cmFpZ2h0IGludHJvc3BlY3Rpb24sIHdoZXRoZXIgbG9hZCBmcm9tIGNhY2hlIG9yIGludHJvc3BlY3QuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0ZST01fQ0FDSEUgPSAiTG9hZCBmcm9tIENhY2hlIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgQmVhbmluZm9DbGFzc0FkYXB0ZXIgZ2V0QmVhbmluZm9DbGFzc0FkYXB0ZXIoRU9iamVjdCBqYykgewotCQlyZXR1cm4gKEJlYW5pbmZvQ2xhc3NBZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGpjLCBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhciBvdXQgdGhlIGludHJvc3BlY3Rpb24gYmVjYXVzZSBpbnRyb3NwZWN0aW9uIGlzIGJlaW5nIGNsb3NlZCBvciByZW1vdmVkIGZyb20gdGhlIHByb2plY3QuCi0JICogRG9uJ3Qgd2FudCBhbnl0aGluZyBoYW5naW5nIGFyb3VuZCB0aGF0IHdlIGhhZCBkb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFySW50cm9zcGVjdGlvbigpIHsKLQkJLy8gQ2xlYXIgb3V0IHRoZSBiZWFuZGVjb3JhdG9yIGlmIGltcGxpY2l0bHkgY3JlYXRlZC4KLQkJSXRlcmF0b3IgYmVhbkl0ciA9IGdldEphdmFDbGFzcygpLmdldEVBbm5vdGF0aW9uc0ludGVybmFsKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJlYW5JdHIuaGFzTmV4dCgpKSB7Ci0JCQlFQW5ub3RhdGlvbiBkZWMgPSAoRUFubm90YXRpb24pIGJlYW5JdHIubmV4dCgpOwotCQkJaWYgKGRlYyBpbnN0YW5jZW9mIEJlYW5EZWNvcmF0b3IpIHsKLQkJCQlCZWFuRGVjb3JhdG9yIGRlY29yID0gKEJlYW5EZWNvcmF0b3IpIGRlYzsKLQkJCQlpZiAoZGVjb3IuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9MSVRFUkFMKSB7Ci0JCQkJCWJlYW5JdHIucmVtb3ZlKCk7Ci0JCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBkZWNvcikuZVNldFByb3h5VVJJKEJBRF9VUkkpOyAvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCX0gZWxzZSB7Ci0JCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcigoQmVhbkRlY29yYXRvcikgZGVjKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gQ2xlYXIgb3V0IHRoZSBmZWF0dXJlcyB0aGF0IHdlIGltcGxpY2l0bHkgY3JlYXRlZC4KLQkJSXRlcmF0b3IgcHJvcEl0ciA9IGdldEphdmFDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChwcm9wSXRyLmhhc05leHQoKSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHByb3AgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wSXRyLm5leHQoKTsKLQkJCUl0ZXJhdG9yIHBkSXRyID0gcHJvcC5nZXRFQW5ub3RhdGlvbnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHBkSXRyLmhhc05leHQoKSkgewotCQkJCUVBbm5vdGF0aW9uIGRlYyA9IChFQW5ub3RhdGlvbikgcGRJdHIubmV4dCgpOwotCQkJCWlmIChkZWMgaW5zdGFuY2VvZiBQcm9wZXJ0eURlY29yYXRvcikgewotCQkJCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IChQcm9wZXJ0eURlY29yYXRvcikgZGVjOwotCQkJCQlpZiAocGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKQotCQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKHBkKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlwZEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIHByb3BlcnR5LgotCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIHBkKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7IC8vIE1hcmsgaXQgYXMgYmFkIHByb3h5IHNvIHdlIGtub3cgaXQgaXMgbm8gbG9uZ2VyIGFueSB1c2UuCi0JCQkJCX0KLQkJCQkJaWYgKHBkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCkgewotCQkJCQkJcHJvcEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIHRoZSBmZWF0dXJlIGl0c2VsZgotCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIHByb3ApLmVTZXRQcm94eVVSSShCQURfVVJJKTsgLy8gTWFyayBpdCBhcyBiYWQgcHJveHkgc28gd2Uga25vdyBpdCBpcyBubyBsb25nZXIgYW55IHVzZS4KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIENsZWFyIG91dCB0aGUgb3BlcmF0aW9ucyB0aGF0IHdlIGltcGxpY2l0bHkgY3JlYXRlZC4KLQkJSXRlcmF0b3Igb3Blckl0ciA9IGdldEphdmFDbGFzcygpLmdldEVPcGVyYXRpb25zSW50ZXJuYWwoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAob3Blckl0ci5oYXNOZXh0KCkpIHsKLQkJCUVPcGVyYXRpb24gb3BlciA9IChFT3BlcmF0aW9uKSBvcGVySXRyLm5leHQoKTsKLQkJCUl0ZXJhdG9yIG1kSXRyID0gb3Blci5nZXRFQW5ub3RhdGlvbnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG1kSXRyLmhhc05leHQoKSkgewotCQkJCUVBbm5vdGF0aW9uIGRlYyA9IChFQW5ub3RhdGlvbikgbWRJdHIubmV4dCgpOwotCQkJCWlmIChkZWMgaW5zdGFuY2VvZiBNZXRob2REZWNvcmF0b3IpIHsKLQkJCQkJTWV0aG9kRGVjb3JhdG9yIG1kID0gKE1ldGhvZERlY29yYXRvcikgZGVjOwotCQkJCQlpZiAobWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKQotCQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKG1kKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQltZEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIG9wZXJhdGlvbi4KLQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBtZCkuZVNldFByb3h5VVJJKEJBRF9VUkkpOyAvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCQl9Ci0JCQkJCWlmIChtZC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKSA9PSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUwpIHsKLQkJCQkJCW9wZXJJdHIucmVtb3ZlKCk7IC8vIFJlbW92ZSB0aGUgb2VwcmF0aW9uIGl0c2VsZgotCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIG9wZXIpLmVTZXRQcm94eVVSSShCQURfVVJJKTsgLy8gTWFyayBpdCBhcyBiYWQgcHJveHkgc28gd2Uga25vdyBpdCBpcyBubyBsb25nZXIgYW55IHVzZS4KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIENsZWFyIG91dCB0aGUgZXZlbnRzIHRoYXQgd2UgaW1wbGljaXRseSBjcmVhdGVkLgotCQkJSXRlcmF0b3IgZXZ0SXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzR2VuKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChldnRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUV2ZW50IGV2dCA9IChKYXZhRXZlbnQpIGV2dEl0ci5uZXh0KCk7Ci0JCQkJSXRlcmF0b3IgZWRJdHIgPSBldnQuZ2V0RUFubm90YXRpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZWRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVBbm5vdGF0aW9uIGRlYyA9IChFQW5ub3RhdGlvbikgZWRJdHIubmV4dCgpOwotCQkJCQlpZiAoZGVjIGluc3RhbmNlb2YgRXZlbnRTZXREZWNvcmF0b3IpIHsKLQkJCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkID0gKEV2ZW50U2V0RGVjb3JhdG9yKSBkZWM7Ci0JCQkJCQlpZiAoZWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKQotCQkJCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcihlZCk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllZEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGV2ZW50LgotCQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBlZCkuZVNldFByb3h5VVJJKEJBRF9VUkkpOyAvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCQkJfQotCQkJCQkJaWYgKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCkgewotCQkJCQkJCWV2dEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIHRoZSBldmVudCBpdHNlbGYKLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgZXZ0KS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7IC8vIE1hcmsgaXQgYXMgYmFkIHByb3h5IHNvIHdlIGtub3cgaXQgaXMgbm8gbG9uZ2VyIGFueSB1c2UuCi0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkJCi0JCX0KLQotCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJbmVlZHNJbnRyb3NwZWN0aW9uID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYXJBbGwoKSB7Ci0JCWNsZWFySW50cm9zcGVjdGlvbigpOwkvLyBGaXJzdCBnZXQgcmlkIG9mIHRoZSBvbmVzIHdlIGRpZCBzbyB0aGF0IHRoZXkgYXJlIG1hcmtlZCBhcyBwcm94aWVzLgotCQkKLQkJLy8gQ2xlYXIgb3V0IHRoZSBhbm5vdGF0aW9ucy4KLQkJZ2V0SmF2YUNsYXNzKCkuZ2V0RUFubm90YXRpb25zSW50ZXJuYWwoKS5jbGVhcigpOwotCQkvLyBDbGVhciBvdXQgdGhlIGF0dHJpYnV0ZXMuCi0JCWdldEphdmFDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpLmNsZWFyKCk7CQotCQkvLyBDbGVhciBvdXQgdGhlIG9wZXJhdGlvbnMuCi0JCWdldEphdmFDbGFzcygpLmdldEVPcGVyYXRpb25zSW50ZXJuYWwoKS5jbGVhcigpOwotCQkvLyBDbGVhciBvdXQgdGhlIGV2ZW50cy4KLQkJZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzR2VuKCkuY2xlYXIoKTsKLQkJCi0JCXJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID0gTkVWRVJfUkVUUklFVkVEX0VYVEVOU0lPTl9ET0NVTUVOVDsJLy8gU2luY2Ugd2UgY2xlYXJlZCBldmVyeXRoaW5nLCBnbyBiYWNrIHRvIG5vIGRvYyBhcHBsaWVkLgotCX0KLQkKLQotCS8qKgotCSAqIEB2ZXJzaW9uIAkxLjAKLQkgKiBAYXV0aG9yCi0JICovCi0KLQkvLyBBIFVSSSB0aGF0IHdpbGwgbmV2ZXIgcmVzb2x2ZS4gVXNlZCB0byBtYXJrIGFuIG9iamVjdCBhcyBubyBsb25nZXIgdmFsaWQuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgQkFEX1VSSSA9IFVSSS5jcmVhdGVVUkkoImJhZHVyaSIpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc0ludHJvc3BlY3Rpb24gPSB0cnVlOwotCQotCXByb3RlY3RlZCBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5IGNsYXNzRW50cnk7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRyb3NwZWN0aW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2luZ0FsbFByb3BlcnRpZXM7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RvaW5nQWxsT3BlcmF0aW9uczsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRG9pbmdBbGxFdmVudHM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludAotCQlORVZFUl9SRVRSSUVWRURfRVhURU5TSU9OX0RPQ1VNRU5UID0gMCwKLQkJUkVUUklFVkVEX1JPT1RfT05MWSA9IDEsCi0JCVJFVFJJRVZFRF9GVUxMX0RPQ1VNRU5UID0gMiwKLQkJQ0xFQVJfRVhURU5TSU9OUyA9IDM7Ci0JcHJvdGVjdGVkIGludCByZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9IE5FVkVSX1JFVFJJRVZFRF9FWFRFTlNJT05fRE9DVU1FTlQ7Ci0KLQlwcm90ZWN0ZWQgQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBzdGFsZUZhY3Rvcnk7IC8vIFdoZW4gcmVmZXJlbmNlIG5vdCBudWxsLCB0aGVuIHRoaXMgZmFjdG9yeSBpcyBhIHN0YWxlIGZhY3RvcnkgYW5kIAotCS8vIGEgbmV3IG9uZSBpcyBuZWVkZWQgd2hlbiB0aGUgZmFjdG9yeSByZXR1cm5lZCA9PSB0aGlzIG9uZS4KLQkvLyBJdCBpcyBhIFdlYWtSZWYgc28gdGhhdCBpZiB0aGUgZmFjdG9yeSBnb2VzIGF3YXkgb24gaXRzIG93bgotCS8vIHRoYXQgd2UgZG9uJ3QgaG9sZCBvbnRvIGl0LgotCi0JLy8gQSB0ZW1wb3JhcnkgaGFzaHNldCBvZiB0aGUgbG9jYWwgcHJvcGVydGllcy4gVXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3Ci0JLy8gcHJvcGVydHkgdG8gdXNlIHRoZSBvbGQgb25lLiBJdCBpcyBjbGVhcmVkIG91dCBhdCB0aGUgZW5kIG9mIGF0dHJpYnV0ZSBpbnRyb3NwZWN0aW9uLgotCS8vIEl0IGlzIG9ubHkgYnVpbHQgb25jZSBkdXJpbmcgYXR0cmlidXRlIGludHJvc3BlY3Rpb24gc28gdGhhdCB3ZSBoYXZlIHRoZSBzbmFwc2hvdAotCS8vIG9mIGJlZm9yZSB0aGUgaW50cm9zcGVjdGlvbiAoaS5lLiB0aGUgb25lcyB0aGF0IHdlcmUgc3BlY2lmaWNhbGx5IGFkZGVkIGJ5IHVzZXJzCi0JLy8gYW5kIG5vdCB0aHJvdWdoIGludHJvc3BlY3Rpb24pLiBUaGUgb25lcyB0aGF0IHdlIGFyZSBhZGRpbmcgZG8gbm90IG5lZWQgdG8gYmUgY2hlY2tlZAotCS8vIGFnYWluc3QgZWFjaCBvdGhlciBiZWNhdXNlIHRoZXJlIHdpbGwgbm90IGJlIGNvbmZsaWN0cy4KLQkvLwotCS8vIEFsc28gYXQgdGhlIGVuZCwgd2Ugd2lsbCBnbyB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZWUgaWYgaXQgZXhpc3RzIGluIHRoZSBmUHJvcGVydGllc01hcCBhbmQKLQkvLyBpdCBpcyBub3QgdGhlIHZhbHVlIEJvb2xlYW4uRkFMU0UgaW4gdGhlIG1hcCwgYW5kIHRoZSBlbnRyeSBpcyBpbXBsaWNpdGx5IGNyZWF0ZWQuIFRoaXMgbWVhbnMgdGhpcwotCS8vIHdhcyBhbiBpbXBsaWNpdCBlbnRyeSBmcm9tIHRoZSBwcmV2aW91cyBpbnRyb3NwZWN0aW9uIGFuZCB3YXMgbm90IHJlLWNyZWF0ZWQgaW4gdGhpcyBpbnRyb3NwZWN0aW9uLgotCXByaXZhdGUgSGFzaE1hcCBwcm9wZXJ0aWVzTWFwOwotCXByaXZhdGUgTGlzdCBmZWF0dXJlc1JlYWxMaXN0OyAvLyBUZW1wIHBvaW50ZXIgdG8gdGhlIHJlYWwgbGlzdCB3ZSBhcmUgYnVpbGRpbmcuIEl0IGlzIHRoZSB0cnVlIGxpc3QgaW4gamF2YSBjbGFzcy4KLQkKLQkvLyBBIHRlbXBvcmFyeSBoYXNobWFwIG9mIHRoZSBsb2NhbCBvcGVyYXRpb25zLiBVc2VkIHdoZW4gY3JlYXRpbmcgYSBuZXcKLQkvLyBvcGVyYXRpb24gdG8gcmV1c2UgdGhlIG9sZCBvbmUuIEl0IGlzIGNsZWFyZWQgb3V0IGF0IHRoZSBlbmQgb2Ygb3BlcmF0aW9uIGludHJvc3BlY3Rpb24uCi0JLy8gSXQgaXMgb25seSBidWlsdCBvbmNlIGR1cmluZyBvcGVyYXRpb24gaW50cm9zcGVjdGlvbiBzbyB0aGF0IHdlIGhhdmUgdGhlIHNuYXBzaG90Ci0JLy8gb2YgYmVmb3JlIHRoZSBpbnRyb3NwZWN0aW9uLgotCXByaXZhdGUgSGFzaE1hcCBvcGVyYXRpb25zTWFwOwotCXByaXZhdGUgRUxpc3Qgb3BlcmF0aW9uc1JlYWxMaXN0OyAvLyBUZW1wIHBvaW50ZXIgdG8gdGhlIHJlYWwgbGlzdCB3ZSBhcmUgYnVpbGRpbmcuIEl0IGlzIHRoZSB0cnVlIGxpc3QgaW4gamF2YSBjbGFzcy4KLQkvLyBBIHNldCBvZiBvcGVyYXRpb25zIGFzIHdlIGNyZWF0ZSB0aGVtIHNvIHRoYXQgd2Ugd2hpY2ggb25lcyB3ZSBhZGRlZC9rZXB0IGFuZCB3aGljaCBhcmUgbm8gbG9uZ2VyIGluIHVzZSBhbmQgY2FuIGJlIHJlbW92ZWQuCQotCS8vIElmIHRoZXkgYXJlbid0IGluIHRoaXMgc2V0IGF0IHRoZSBlbmQsIHRoZW4gd2Uga25vdyBpdCBzaG91bGQgYmUgcmVtb3ZlZCBpZiBpdCBpcyBvbmUgd2UgaGFkIGNyZWF0ZWQgaW4gdGhlIHBhc3QuCi0JcHJpdmF0ZSBIYXNoU2V0IG5ld29wZXJhdGlvbnM7IAotCi0JLy8gQSB0ZW1wb3JhcnkgaGFzaHNldCBvZiB0aGUgbG9jYWwgZXZlbnRzLiBVc2VkIHdoZW4gY3JlYXRpbmcgYSBuZXcKLQkvLyBldmVudCB0byB1c2UgdGhlIG9sZCBvbmUuIEl0IGlzIGNsZWFyZWQgb3V0IGF0IHRoZSBlbmQgb2YgZXZlbnQgaW50cm9zcGVjdGlvbi4KLQkvLyBJdCBpcyBvbmx5IGJ1aWx0IG9uY2UgZHVyaW5nIGV2ZW50IGludHJvc3BlY3Rpb24gc28gdGhhdCB3ZSBoYXZlIHRoZSBzbmFwc2hvdAotCS8vIG9mIGJlZm9yZSB0aGUgaW50cm9zcGVjdGlvbiAoaS5lLiB0aGUgb25lcyB0aGF0IHdlcmUgc3BlY2lmaWNhbGx5IGFkZGVkIGJ5IHVzZXJzCi0JLy8gYW5kIG5vdCB0aHJvdWdoIGludHJvc3BlY3Rpb24pLiBUaGUgb25lcyB0aGF0IHdlIGFyZSBhZGRpbmcgZG8gbm90IG5lZWQgdG8gYmUgY2hlY2tlZAotCS8vIGFnYWluc3QgZWFjaCBvdGhlciBiZWNhdXNlIHRoZXJlIHdpbGwgbm90IGJlIGNvbmZsaWN0cy4KLQkvLwotCS8vIEFsc28gYXQgdGhlIGVuZCwgd2Ugd2lsbCBnbyB0aHJvdWdoIHRoZSBldmVudHMgYW5kIHNlZSBpZiBpdCBleGlzdHMgaW4gdGhlIGZFdmVudHNNYXAgYW5kCi0JLy8gaXQgaXMgbm90IHRoZSB2YWx1ZSBCb29sZWFuLkZBTFNFIGluIHRoZSBtYXAsIGFuZCB0aGUgZW50cnkgaXMgaW1wbGljaXRseSBjcmVhdGVkLiBUaGlzIG1lYW5zIHRoaXMKLQkvLyB3YXMgYW4gaW1wbGljaXQgZW50cnkgZnJvbSB0aGUgcHJldmlvdXMgaW50cm9zcGVjdGlvbiBhbmQgd2FzIG5vdCByZS1jcmVhdGVkIGluIHRoaXMgaW50cm9zcGVjdGlvbi4KLQlwcml2YXRlIEhhc2hNYXAgZXZlbnRzTWFwOwotCXByaXZhdGUgRUxpc3QgZXZlbnRzUmVhbExpc3Q7IC8vIFRlbXAgcG9pbnRlciB0byB0aGUgcmVhbCBsaXN0IHdlIGFyZSBidWlsZGluZy4gSXQgaXMgdGhlIHRydWUgbGlzdCBpbiBqYXZhIGNsYXNzLgotCi0JcHJpdmF0ZSBCb29sZWFuIGRlZmF1bHRCb3VuZDsKLQkvLyBXaGV0aGVyIHRoaXMgY2xhc3MgaXMgZGVmYXVsdCBib3VuZCBvciBub3QgKGkuZS4gZG9lcyB0aGlzIGNsYXNzIGltcGxlbWVudCBhZGQvcmVtb3ZlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lci4gSWYgbnVsbCwgdGhlbiBub3QgeWV0IHF1ZXJpZWQuCi0KLQlwdWJsaWMgQmVhbmluZm9DbGFzc0FkYXB0ZXIoQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgamF2YSBjbGFzcyBpcyBzdGlsbCBjb25uZWN0ZWQgdG8gYSBsaXZlIHJlc291cmNlLiBJdCBoYXBwZW5zIGR1cmluZyB1bmxvYWRpbmcKLQkgKiB0aGF0IHdlIGFyZSBubyBsb25nZXIgY29ubmVjdGVkIHRvIGEgcmVzb3VyY2UgKGJlY2F1c2UgdGhlIGphdmFwYWNrYWdlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZAotCSAqIHVubG9hZGVkKSBvciB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgdW5sb2FkZWQsIGJ1dCB0aGUgdW5sb2FkaW5nIHByb2Nlc3Mgd2lsbCBzdGlsbCAKLQkgKiBjYWxsIGFjY2Vzc29ycyBvbiB0aGlzIGphdmEgY2xhc3MsIHdoaWNoIHdpbGwgY29tZSBvdmVyIGhlcmUuIEluIHRob3NlIGNhc2VzIHdlIHNob3VsZCB0cmVhdCBhcwotCSAqIGludHJvc3BlY3Rpb24gY29tcGxldGVkIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNvdXJjZUNvbm5lY3RlZCgpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0SmF2YUNsYXNzKCkuZVJlc291cmNlKCk7Ci0JCXJldHVybiByZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeS5nZXRSZWdpc3RyeSgpOwotCQlpZiAoc3RhbGVGYWN0b3J5ICE9IG51bGwgJiYgZmFjdG9yeSA9PSBzdGFsZUZhY3RvcnkuZ2V0KCkpIHsKLQkJCS8vIFdlIG5lZWQgdG8gcmVjeWNsZSB0aGUgZmFjdG9yeS4gVGhlIHJldHVybmVkIGZhY3RvcnkgaXMgdGhlIHNhbWUgZmFjdG9yeSB3aGVuIGl0IHdlbnQgc3RhbGUuCi0JCQlmYWN0b3J5ID0gYWRhcHRlckZhY3RvcnkucmVjeWNsZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJc3RhbGVGYWN0b3J5ID0gbnVsbDsgLy8gV2hldGhlciB3ZSByZWN5Y2xlZCBvciBub3QsIGl0IGlzIG5vIGxvbmdlciBzdGFsZS4KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBhZGFwdGVyIGhhcyBiZWVuIG1hcmtlZCBhcyBzdGFsZS4gTmVlZGVkCi0JICogYnkgdGhlIHVzZXJzIHNvIHRoYXQgdGhleSBjYW4gcmVjeWNsZSBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpIHsKLQkJcmV0dXJuIHN0YWxlRmFjdG9yeSAhPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkuZXF1YWxzKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtYXAgaXMga2V5ZWQgYnkgbmFtZS4gSXQgaXMgYSBzbmFwc2hvdCBvZiB0aGUgcHJvcGVydGllcyBhdCB0aGUKLQkgKiB0aW1lIHRoZSBpbnRyb3NwZWN0aW9uL3JlZmxlY3Rpb24gb2YgcHJvcGVydGllcyB3YXMgc3RhcnRlZC4gSXQgaXMgdXNlZAotCSAqIGZvciBxdWljayBsb29rdXAuCi0JICoKLQkgKiBPbmNlIGEgcHJvcGVydHkgaXMgdXNlZCwgdGhlIGVudHJ5IGlzIHJlcGxhY2VkIHdpdGggYSBCb29sZWFuLkZBTFNFLiBUaGlzCi0JICogaXMgc28gd2Uga25vdyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIGFuZCBhdCB0aGUgZW5kLCB3aGljaCBuZWVkCi0JICogdG8gYmUgZGVsZXRlZCBzaW5jZSB0aGV5IHdlcmVuJ3QgdXNlZCAoaS5lLiB0aGUgb25lcyB0aGF0IGFyZW4ndCBGQUxTRSkuCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0UHJvcGVydGllc01hcCgpIHsKLQkJaWYgKHByb3BlcnRpZXNNYXAgPT0gbnVsbCkgewotCQkJTGlzdCBsb2NhbEZlYXR1cmVzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlc0ludGVybmFsKCk7Ci0JCQlwcm9wZXJ0aWVzTWFwID0gbmV3IEhhc2hNYXAobG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQkJSXRlcmF0b3IgaXRyID0gbG9jYWxGZWF0dXJlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQkJcHJvcGVydGllc01hcC5wdXQoZmVhdHVyZS5nZXROYW1lKCksIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzTWFwOwotCX0KLQotCS8qKgotCSAqIEdldCBpdCBvbmNlIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGdldHRpbmcgaXQgb3ZlciBhbmQgb3Zlci4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRGZWF0dXJlc0xpc3QoKSB7Ci0JCWlmIChmZWF0dXJlc1JlYWxMaXN0ID09IG51bGwpCi0JCQlmZWF0dXJlc1JlYWxMaXN0ID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlc0ludGVybmFsKCk7Ci0JCXJldHVybiBmZWF0dXJlc1JlYWxMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoZSBtYXAgaXMga2V5ZWQgYnkgbG9uZ05hbWUuIElmIGEgTWV0aG9kIGlzIHBhc3NlZCBpbiwgdGhlbiB0aGUKLQkgKiBpZCBvZiB0aGUgbWV0aG9kIGlzIHVzZWQgKHRoaXMgaXMgaW4gcmVmbGVjdGlvbiksIGlmIGFuIElCZWFuUHJveHkKLQkgKiBpcyBwYXNzZWQgaW4sIHRoZW4gYW4gaWQgaXMgY3JlYXRlZCBhbmQgbG9va2VkIHVwICh0aGlzIGlzIGluIGludHJvc3BlY3Rpb24pLgotCSAqIFRoZSBtYXAgaXMgdXNlZCBmb3IgYSBxdWljayBsb29rdXAgb2YgYmVoYXZpb3JzIGF0IHRoZSB0aW1lIGludHJvc3BlY3Rpb24KLQkgKiBvZiBiZWhhdmlvcnMgc3RhcnRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaE1hcCBnZXRPcGVyYXRpb25zTWFwKCkgewotCQlpZiAob3BlcmF0aW9uc01hcCA9PSBudWxsKSB7Ci0JCQlMaXN0IGxvY2FscyA9IGdldEphdmFDbGFzcygpLmdldEVPcGVyYXRpb25zSW50ZXJuYWwoKTsKLQkJCWludCBsID0gbG9jYWxzLnNpemUoKTsKLQkJCW9wZXJhdGlvbnNNYXAgPSBuZXcgSGFzaE1hcChsKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0JCQkJRU9wZXJhdGlvbiBvcCA9IChFT3BlcmF0aW9uKSBsb2NhbHMuZ2V0KGkpOwotCQkJCW9wZXJhdGlvbnNNYXAucHV0KGZvcm1Mb25nTmFtZShvcCksIG9wKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3BlcmF0aW9uc01hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgaXQgb25jZSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8ga2VlcCBnZXR0aW5nIGl0IG92ZXIgYW5kIG92ZXIuCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGdldE9wZXJhdGlvbnNMaXN0KCkgewotCQlpZiAob3BlcmF0aW9uc1JlYWxMaXN0ID09IG51bGwpCi0JCQlvcGVyYXRpb25zUmVhbExpc3QgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFT3BlcmF0aW9uc0ludGVybmFsKCk7Ci0JCXJldHVybiBvcGVyYXRpb25zUmVhbExpc3Q7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1hcCBpcyBrZXllZCBieSBuYW1lLgotCSAqIFRoZSBtYXAgaXMgdXNlZCBmb3IgYSBxdWljayBsb29rdXAgb2YgZXZlbnRzIGF0IHRoZSB0aW1lIGludHJvc3BlY3Rpb24KLQkgKiBvZiBldmVudHMgc3RhcnRlZC4KLQkgKgotCSAqIE9uY2UgYW4gZXZlbnQgaXMgdXNlZCwgdGhlIGVudHJ5IGlzIHJlcGxhY2VkIHdpdGggYSBCb29sZWFuLkZBTFNFLiBUaGlzCi0JICogaXMgc28gd2Uga25vdyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIGFuZCBhdCB0aGUgZW5kLCB3aGljaCBuZWVkCi0JICogdG8gYmUgZGVsZXRlZCBzaW5jZSB0aGV5IHdlcmVuJ3QgdXNlZCAoaS5lLiB0aGUgb25lcyB0aGF0IGFyZW4ndCBGQUxTRSkuCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0RXZlbnRzTWFwKCkgewotCQlpZiAoZXZlbnRzTWFwID09IG51bGwpIHsKLQkJCUxpc3QgbG9jYWxzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzR2VuKCk7Ci0JCQlldmVudHNNYXAgPSBuZXcgSGFzaE1hcChsb2NhbHMuc2l6ZSgpKTsKLQkJCUl0ZXJhdG9yIGl0ciA9IGxvY2Fscy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhRXZlbnQgZXZlbnQgPSAoSmF2YUV2ZW50KSBpdHIubmV4dCgpOwotCQkJCWV2ZW50c01hcC5wdXQoZXZlbnQuZ2V0TmFtZSgpLCBldmVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV2ZW50c01hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgaXQgb25jZSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8ga2VlcCBnZXR0aW5nIGl0IG92ZXIgYW5kIG92ZXIuCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGdldEV2ZW50c0xpc3QoKSB7Ci0JCWlmIChldmVudHNSZWFsTGlzdCA9PSBudWxsKQotCQkJZXZlbnRzUmVhbExpc3QgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFdmVudHNHZW4oKTsKLQkJcmV0dXJuIGV2ZW50c1JlYWxMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGludHJvc3BlY3RJZk5lY2Vzc2FyeSgpIHsKLQkJaW50cm9zcGVjdElmTmVjZXNzYXJ5KGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW50cm9zcGVjdElmTmVjZXNzYXJ5KGJvb2xlYW4gZG9PcGVyYXRpb25zKSB7Ci0JCWJvb2xlYW4gZG9JbnRyb3NwZWN0aW9uID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJZG9JbnRyb3NwZWN0aW9uID0gbmVlZHNJbnRyb3NwZWN0aW9uICYmICFpc0ludHJvc3BlY3Rpbmc7IAotCQkJaWYgKGRvSW50cm9zcGVjdGlvbikKLQkJCQlpc0ludHJvc3BlY3RpbmcgPSB0cnVlOwotCQl9Ci0JCWlmIChkb0ludHJvc3BlY3Rpb24pIHsKLQkJCWJvb2xlYW4gZGlkSW50cm9zcGVjdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsJCQkJCi0JCQkJaW50cm9zcGVjdChkb09wZXJhdGlvbnMpOwotCQkJCWRpZEludHJvc3BlY3Rpb24gPSB0cnVlOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCTAsCi0JCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5JTlRST1NQRUNUX0ZBSUxFRF9FWENfLCAKLQkJCQkJCQluZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLCAiIn0pLCAvLyROT04tTkxTLTEkCi0JCQkJCQllKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlpc0ludHJvc3BlY3RpbmcgPSBmYWxzZTsKLQkJCQkJbmVlZHNJbnRyb3NwZWN0aW9uID0gIWRpZEludHJvc3BlY3Rpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzcyBlbnRyeS4gCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5IGdldENsYXNzRW50cnkoKSB7Ci0JCXJldHVybiBjbGFzc0VudHJ5OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuVXNlQ2FjaGUoKSB7Ci0JCS8vIFdlIGNoZWNrIG91ciBsZXZlbCwgd2UgYXNzdW1lIG5vdCBzdGFsZSB1bmxlc3MgQ0Ugc2F5cyBzdGFsZS4KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBXZSBtYXkgYWxyZWFkeSBoYXZlIGEgY2xhc3MgZW50cnkgZHVlIHRvIGEgc3ViY2xhc3MgZG9pbmcgYSBjaGVjaywgc28gaWYgd2UgZG8sIHdlJ2xsIHVzZSBpdC4gRWxzZSB3ZSdsbCBnZXQgdGhlIGxhdGVzdCBvbmUuCi0JCQlpZiAoY2xhc3NFbnRyeSA9PSBudWxsKQotCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzc0VudHJ5KGdldEphdmFDbGFzcygpKTsKLQkJCWlmIChjbGFzc0VudHJ5ICE9IG51bGwpIHsKLQkJCQkvLyBXZSBoYXZlIGEgY2FjaGUgdG8gY2hlY2suCi0JCQkJbG9uZyBtb2RTdGFtcCA9IGNsYXNzRW50cnkuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQkvLyBBIHNhbml0eSBjaGVjaywgaWYgdGhpcyB3YXMgYW4gb2xkLCBidXQgbm93IGRlbGV0ZWQgb25lIHdlIHdhbnQgdG8gdGhyb3cgaXQgYXdheSBhbmQgZ2V0IGl0IGFnYWluLiBJdCBtYXkgbm93IGJlIHZhbGlkLgotCQkJCWlmIChtb2RTdGFtcCA9PSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5LkRFTEVURURfTU9ESUZJQ0FUSU9OX1NUQU1QKSB7Ci0JCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzc0VudHJ5KGdldEphdmFDbGFzcygpKTsKLQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkKLQkJCQkJCW1vZFN0YW1wID0gY2xhc3NFbnRyeS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCQlpZiAobW9kU3RhbXAgPT0gSVJlc291cmNlLk5VTExfU1RBTVAgfHwgbW9kU3RhbXAgPT0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuQ2xhc3NFbnRyeS5ERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBhcmUgc3RhbGUuCi0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGRvbid0IGhhdmUgYSBjYWNoZSBlbnRyeSB0byBjaGVjayBhZ2FpbnN0LCB3aGljaCBtZWFucyBhcmUgZGVsZXRlZCwgb3IgbmV2ZXIgY2FjaGVkLgotCQl9Ci0JCQotCQkvLyBOb3cgdHJ5IHRoZSBzdXBlcnMgdG8gc2VlIGlmIHdlIGFyZSBvdXQgb2YgZGF0ZSB0byB0aGVtLgotCQkvLyBOb3RlOiBPbmx5IGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlIGNvdWxkIHRoZXJlIGJlIG1vcmUgdGhhbiBvbmUgZVN1cGVyVHlwZS4KLQkJTGlzdCBzdXBlcnMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQlpZiAoIXN1cGVycy5pc0VtcHR5KCkpIHsKLQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGJjYSA9IGdldEJlYW5pbmZvQ2xhc3NBZGFwdGVyKChFT2JqZWN0KSBzdXBlcnMuZ2V0KDApKTsKLQkJCUNsYXNzRW50cnkgc3VwZXJDRSA9IGJjYS5nZXRDbGFzc0VudHJ5KCk7Ci0JCQkvLyBJZiBzdXBlciBpcyBkZWZpbmVkIGFuZCBvdXQgb2YgZGF0ZSBkb24ndCB1c2UgY2FjaGUuIElmIHN1cGVyIGlzIHVuZGVmaW5lZCBhbmQgc3VwZXIgbW9kaWZpY2F0aW9uIHN0YW1wIGlzIG5vdCBzdXBlcl91bmRlZmluZWQsCi0JCQkvLyB0aGVuIHRoYXQgbWVhbnMgaXQgd2FzIGRlZmluZWQgYXQgdGltZSBvZiBjYWNoZSBhbmQgbm93IG5vdCBkZWZpbmVkLCBzbyBkb24ndCB1c2UgY2FjaGUuCi0JCQlpZiAoc3VwZXJDRSAhPSBudWxsKSB7Ci0JCQkJaWYgKHN1cGVyQ0UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSAhPSBjbGFzc0VudHJ5LmdldFN1cGVyTW9kaWZpY2F0aW9uU3RhbXAoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBPdXQtb2YtZGF0ZSB3cnQvc3VwZXIuCi0JCQl9IGVsc2UgaWYgKGNsYXNzRW50cnkuZ2V0U3VwZXJNb2RpZmljYXRpb25TdGFtcCgpICE9IENsYXNzRW50cnkuU1VQRVJfVU5ERUZJTkVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIHdhcyBwcmV2aW91c2x5IGRlZmluZWQsIGFuZCBub3cgdW5kZWZpbmVkLCBzbyBvdXQgb2YgZGF0ZS4KLQkJCVN0cmluZ1tdIGlOYW1lcyA9IGNsYXNzRW50cnkuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKLQkJCWlmIChpTmFtZXMgIT0gbnVsbCkgewotCQkJCWlmIChpTmFtZXMubGVuZ3RoICE9IHN1cGVycy5zaXplKCkgLSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIFdlIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHN1cGVycywgc28gc3RhbGUuCi0JCQkJLy8gTm93IHRoZSBpbnRlcmZhY2VzIG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIsIGJ1dCB0aGVyZSBzaG91bGRuJ3QgYmUgdG9vIG1hbnksIHNvIHdlJ2xsIHVzZSBPKG4yKSBsb29rdXAuIFdlJ2xsIHRyeSBzdGFydGluZyBhdAotCQkJCS8vIHRoZSBzYW1lIGluZGV4IGp1c3QgaW4gY2FzZS4gVGhhdCB3YXkgaWYgdGhleSBhcmUgdGhlIHNhbWUgb3JkZXIgaXQgd2lsbCBiZSBsaW5lYXIgaW5zdGVhZC4gTW9zdCBsaWtlbHkgd2lsbCBiZSBzYW1lIG9yZGVyLgotCQkJCWxvbmdbXSBpU3RhbXAgPSBjbGFzc0VudHJ5LmdldEludGVyZmFjZU1vZGlmaWNhdGlvblN0YW1wcygpOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IGlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgc3VwZXJzLmdldChpKTsKLQkJCQkJU3RyaW5nIGludE5hbWUgPSAoamF2YUNsYXNzKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJCQkvLyBGaW5kIGl0IGluIHRoZSBuYW1lcyBsaXN0LgotCQkJCQlpbnQgc3RvcCA9IGktMTsKLQkJCQkJaW50IGluZHggPSBzdG9wOwkvLyBTdGFydCBhdCB0aGUgc3RvcCwgd2hlbiB3ZSBoaXQgaXQgYWdhaW4gd2Ugd2lsbCBiZSBkb25lLgotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWRvIHsKLQkJCQkJCWlmIChpTmFtZXNbaW5keF0uZXF1YWxzKGludE5hbWUpKSB7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IHdoaWxlICgoKytpbmR4KSVpTmFtZXMubGVuZ3RoICE9IHN0b3ApOwotCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBDb3VsZG4ndCBmaW5kIGl0LCBzbyB3ZSBhcmUgc3RhbGUuXQotCQkJCQkKLQkJCQkJc3VwZXJDRSA9IGdldEJlYW5pbmZvQ2xhc3NBZGFwdGVyKGphdmFDbGFzcykuZ2V0Q2xhc3NFbnRyeSgpOwotCQkJCQlpZiAoc3VwZXJDRSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoc3VwZXJDRS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICE9IGlTdGFtcFtpbmR4XSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIE91dC1vZi1kYXRlIHdydC9pbnRlcmZhY2UuCi0JCQkJCX0gZWxzZSBpZiAoaVN0YW1wW2luZHhdICE9IENsYXNzRW50cnkuU1VQRVJfVU5ERUZJTkVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQkJCXJldHVybiBmYWxzZTsJLy8gd2FzIHByZXZpb3VzbHkgZGVmaW5lZCwgYW5kIG5vdyB1bmRlZmluZWQsIHNvIG91dCBvZiBkYXRlLgotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWYgd2UgZ290IGhlcmUgZXZlcnl0aGluZyBpcyBvay4KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuVXNlT3ZlcnJpZGVDYWNoZSgpIHsKLQkJLy8gV2UgY2hlY2sgb3VyIGNvbmZpZyBzdGFtcC4KLQkJLy8gVE9ETyBpbiBmdXR1cmUgY2FuIHdlIGxpc3RlbiBmb3IgY29uZmlnIGNoYW5nZXMgYW5kIG1hcmsgY2xhc3NlcyBzdGFsZSBpZiB0aGUgY29uZmlnIGNoYW5nZXM/Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gV2UgbWF5IGFscmVhZHkgaGF2ZSBhIGNsYXNzIGVudHJ5IGR1ZSB0byBhIHN1YmNsYXNzIGRvaW5nIGEgY2hlY2ssIHNvIGlmIHdlIGRvLCB3ZSdsbCB1c2UgaXQuIEVsc2Ugd2UnbGwgZ2V0IHRoZSBsYXRlc3Qgb25lLgotCQkJaWYgKGNsYXNzRW50cnkgPT0gbnVsbCkKLQkJCQljbGFzc0VudHJ5ID0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuSU5TVEFOQ0UuZ2V0Q2xhc3NFbnRyeShnZXRKYXZhQ2xhc3MoKSk7Ci0JCQlpZiAoY2xhc3NFbnRyeSAhPSBudWxsKSB7Ci0JCQkJLy8gV2UgaGF2ZSBhIGNhY2hlIHRvIGNoZWNrLgotCQkJCS8vIEEgc2FuaXR5IGNoZWNrLCBpZiB0aGlzIHdhcyBhbiBvbGQsIGJ1dCBub3cgZGVsZXRlZCBvbmUgd2Ugd2FudCB0byB0aHJvdyBpdCBhd2F5IGFuZCBnZXQgaXQgYWdhaW4uIEl0IG1heSBub3cgYmUgdmFsaWQuCi0JCQkJaWYgKGNsYXNzRW50cnkuaXNEZWxldGVkKCkpIHsKLQkJCQkJY2xhc3NFbnRyeSA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENsYXNzRW50cnkoZ2V0SmF2YUNsYXNzKCkpOwotCQkJCQlpZiAoY2xhc3NFbnRyeSAhPSBudWxsKQotCQkJCQkJaWYgKGNsYXNzRW50cnkuaXNEZWxldGVkKCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBoYXZlIGJlZW4gZGVsZXRlZC4gUHJvYmFibHkgc2hvdWxkbid0IG9mIGdvdHRvbiBoZXJlIGluIHRoaXMgY2FzZS4KLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGRvbid0IGhhdmUgYSBjYWNoZSBlbnRyeSB0byBjaGVjayBhZ2FpbnN0LCB3aGljaCBtZWFucyBhcmUgZGVsZXRlZCwgb3IgbmV2ZXIgY2FjaGVkLgotCQkJcmV0dXJuIGNsYXNzRW50cnkuZ2V0Q29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wKCkgPT0gUGxhdGZvcm0uZ2V0UGxhdGZvcm1BZG1pbigpLmdldFN0YXRlKGZhbHNlKS5nZXRUaW1lU3RhbXAoKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgY2FjaGUgZm9yIHRoaXMgZW50cnkgaXMgc3RhbGUgY29tcGFyZWQgdG8gdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCwgb3IgaWYgdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBpdHNlbGYgaXMgc3RhbGUsIG1lYW5pbmcKLQkgKiBzdWJjbGFzcyB3YXMgc3RhbGUgYWxyZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdFN0YW1wIHRoZSB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0LiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHdlIGNhbiB1c2UgdGhlIGluY29taW5nIGNhY2hlIHN0YW1wLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblVzZUNhY2hlKGxvbmcgcmVxdWVzdFN0YW1wKSB7Ci0JCWxvbmcgbW9kU3RhbXA7Ci0JCS8vIE5vdyBnZXQgdGhlIGN1cnJlbnQgbW9kIHN0YW1wIGZvciB0aGlzIGNsYXNzIHNvIHdlIGNhbiBjb21wYXJlIGl0LgotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIFdlIG1heSBhbHJlYWR5IGhhdmUgYSBjbGFzcyBlbnRyeSBkdWUgdG8gYSBzdWJjbGFzcyBkb2luZyBhIGNoZWNrLCBzbyBpZiB3ZSBkbywgd2UnbGwgdXNlIGl0LiBFbHNlIHdlJ2xsIGdldCB0aGUgbGF0ZXN0IG9uZS4KLQkJCWlmIChjbGFzc0VudHJ5ID09IG51bGwpCi0JCQkJY2xhc3NFbnRyeSA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENsYXNzRW50cnkoZ2V0SmF2YUNsYXNzKCkpOwotCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkgewotCQkJCS8vIFdlIGhhdmUgYSBjYWNoZSB0byBjaGVjay4KLQkJCQltb2RTdGFtcCA9IGNsYXNzRW50cnkuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQkvLyBBIHNhbml0eSBjaGVjaywgaWYgdGhpcyB3YXMgYW4gb2xkLCBidXQgbm93IGRlbGV0ZWQgb25lIHdlIHdhbnQgdG8gdGhyb3cgaXQgYXdheSBhbmQgZ2V0IGl0IGFnYWluLiBJdCBtYXkgbm93IGJlIHZhbGlkLgotCQkJCWlmIChtb2RTdGFtcCA9PSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5LkRFTEVURURfTU9ESUZJQ0FUSU9OX1NUQU1QKSB7Ci0JCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzc0VudHJ5KGdldEphdmFDbGFzcygpKTsKLQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkKLQkJCQkJCW1vZFN0YW1wID0gY2xhc3NFbnRyeS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCQlpZiAobW9kU3RhbXAgPT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgbW9kU3RhbXAgPT0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuQ2xhc3NFbnRyeS5ERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBTaW5jZSB3ZSBhcmUgc3RhbGUsIGNoaWxkIGFza2luZyBxdWVzdGlvbiBtdXN0IGFsc28gYmUgc3RhbGUgYW5kIGNhbid0IHVzZSB0aGUgY2FjaGUuCi0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGRvbid0IGhhdmUgYSBjYWNoZSBlbnRyeSB0byBjaGVjayBhZ2FpbnN0LCBzbyBjaGlsZCBtdXN0IGJlIHN0YWxlIHRvby4KLQkJfQotCQkvLyBJZiB0aGUgcmVxdWVzdGVkIHN0YW1wIGlzIG5vdCB0aGUgc2FtZSBhcyBvdXJzLCB0aGVuIGl0IGlzIG91dCBvZiBkYXRlIChpdCBjb3VsZG4ndCBiZSBuZXdlciBidXQgaXQgY291bGQgYmUgb2xkZXIpLgotCQlyZXR1cm4gcmVxdWVzdFN0YW1wID09IG1vZFN0YW1wOwotCX0KLQkJCi0JLyoKLQkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0aHJvdWdoIGludHJvc3BlY3RJZk5lY2Vzc2FyeSBzbyB0aGF0IGZsYWdzIGFyZSBzZXQgY29ycmVjdGx5LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRyb3NwZWN0KGJvb2xlYW4gZG9PcGVyYXRpb25zKSB7Ci0JCUlCZWFuUHJveHkgYmVhbmluZm8gPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGlzUmVzb3VyY2VDb25uZWN0ZWQoKSkgewotCQkJCS8vIFNlZSBpZiBhcmUgdmFsaWQga2luZCBvZiBjbGFzcy4KLQkJCQlpZiAoZ2V0SmF2YUNsYXNzKCkuZ2V0S2luZCgpID09IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMKSB7Ci0JCQkJCS8vIE5vdCB2YWxpZCwgZG9uJ3QgbGV0IGFueSBmdXJ0aGVyIGludHJvc3BlY3Rpb24gb2NjdXIuCi0JCQkJCS8vIE1hcmsgdGhhdCB3ZSd2ZSBkb25lIGFsbCBpbnRyb3NwZWN0aW9ucyBzbyBhcyBub3QgdG8gd2FzdGUgdGltZSB1bnRpbCB3ZSBnZXQgbm90aWZpZWQgdGhhdCBpdCBoYXMgYmVlbiBhZGRlZAotCQkJCQkvLyBiYWNrIGluLgotCQkJCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkgewotCQkJCQkJCWNsYXNzRW50cnkubWFya0RlbGV0ZWQoKTsJLy8gbWFyayBpdCBkZWxldGVkIGluIGNhc2Ugc3RpbGwgc2l0dGluZyBpbiBjYWNoZSAobWF5YmUgYmVjYXVzZSBpdCB3YXMgaW4gYW4gZXh0ZXJuYWwgamFyLCB3ZSBjYW4ndCBrbm93IGlmIGRlbGV0ZWQgd2hlbiBqYXIgY2hhbmdlZCkuCi0JCQkJCQkJY2xhc3NFbnRyeSA9IG51bGw7CS8vIEdldCByaWQgb2YgaXQgc2luY2Ugbm93IGRlbGV0ZWQuCi0JCQkJCQl9Ci0JCQkJCQluZWVkc0ludHJvc3BlY3Rpb24gPSBmYWxzZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IFJFVFJJRVZFRF9GVUxMX0RPQ1VNRU5UIHx8IHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IENMRUFSX0VYVEVOU0lPTlMpIHsKLQkJCQkJCS8vIFdlJ3ZlIGJlZW4gZGVmaW5lZCBhdCBvbmUgcG9pbnQuIE5lZWQgdG8gY2xlYXIgZXZlcnl0aGluZyBhbmQgc3RlcCBiYWNrCi0JCQkJCQkvLyB0byBuZXZlciByZXRyaWV2ZWQgc28gdGhhdCB3ZSBub3cgZ2V0IHRoZSByb290IGFkZGVkIGluLiBJZiB3ZSBoYWQgYmVlbgotCQkJCQkJLy8gcHJldmlvdXNseSBkZWZpbmVkLCB0aGVuIHdlIGRpZG4ndCBoYXZlIHJvb3QuIFdlIHdpbGwgaGF2ZSB0byBsb3NlCi0JCQkJCQkvLyBhbGwgb3RoZXIgdXBkYXRlcyB0b28uIEJ1dCB0aGV5IGNhbiBjb21lIGJhY2sgd2hlbiB3ZSdyZSBkZWZpbmVkLgotCQkJCQkJLy8gT3Igd2UndmUgYmVlbiBhc2tlZCB0byBjbGVhciBhbGwuCi0JCQkJCQljbGVhckFsbCgpOwotCQkJCQkJcmV0cmlldmVkRXh0ZW5zaW9uRG9jdW1lbnQgPSBORVZFUl9SRVRSSUVWRURfRVhURU5TSU9OX0RPQ1VNRU5UOwotCQkJCQl9Ci0JCQkJCWlmIChyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9PSBORVZFUl9SRVRSSUVWRURfRVhURU5TSU9OX0RPQ1VNRU5UKQotCQkJCQkJYXBwbHlFeHRlbnNpb25Eb2N1bWVudCh0cnVlKTsJLy8gQWRkIGluIFJvb3Qgc3R1ZmYgc28gdGhhdCBpdCB3aWxsIHdvcmsgY29ycmVjdGx5IGV2ZW4gdGhvdWdoIHVuZGVmaW5lZC4KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUT0RPIEZvciBub3cgY2F1c2UgcmVjeWNsZSBvZiB2bSBpZiBhbnkgc3VwZXIgdHlwZSBpcyBzdGFsZSBzbyB0aGF0IGlmIHJlZ2lzdHJ5IGlzIHN0YWxlIGZvciB0aGUgc3VwZXIgdHlwZSBpdCB3aWxsIGJlCi0JCQkJCS8vIHJlY3JlYXRlZC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSByZWZsZWN0aW9uIHJlcXVpcmVzIHN1cGVyUHJvcGVydGllcywgZXRjLiBhbmQgcmVjcmVhdGluZyB0aGUgcmVnaXN0cnkKLQkJCQkJLy8gY3VycmVudGx5IHJlLW1hcmtzIGV2ZXJ5b25lIGFzIHN0YWxlLCBpbmNsdWRpbmcgdGhpcyBzdWJjbGFzcy4gVGhpcyB3b3VsZCBtZWFuIHRoYXQKLQkJCQkJLy8gcmUtaW50cm9zcGVjdGlvbiB3b3VsZCBuZWVkIHRvIGJlIGRvbmUsIGV2ZW4gdGhvdWdoIHdlIGp1c3QgZGlkIGl0LiBUaGUgc3RhbGUgcmVnaXN0cnkgYnVzaW5lc3MgbmVlZHMgdG8gYmUgcmUtYWRkcmVzc2VkIHNvIHRoYXQgaXQgaXMKLQkJCQkJLy8gYSBsb3Qgc21hcnRlci4gCi0JCQkJCUxpc3Qgc3VwZXJzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGJjYSA9IChCZWFuaW5mb0NsYXNzQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcigoRU9iamVjdCkgc3VwZXJzLmdldChpKSwKLQkJCQkJCQkJSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCQkJCWlmIChiY2EgIT0gbnVsbCAmJiBiY2EuaXNTdGFsZSgpKQotCQkJCQkJCWJjYS5nZXRSZWdpc3RyeSgpOwotCQkJCQl9Ci0JCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIGZvcmNlIGludHJvc3BlY3Rpb24sIGlmIG5lZWRlZCwgb2YgYWxsIHBhcmVudHMgYmVjYXVzZSB3ZSBuZWVkIHRoZW0gdG8gYmUgdXAtdG8tZGF0ZSBmb3IgdGhlCi0JCQkJCS8vIGNsYXNzIGVudHJ5LgotCQkJCQkvLyBUT0RPIHNlZSBpZiB3ZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIHdheSB0aGF0IHdlIEtOT1cgdGhlIENFIGlzIGNvcnJlY3QsIGV2ZW4gaWYgYW55IHN1cGVycyBhcmUgc3RhbGUuCi0JCQkJCXN1cGVycyA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlclR5cGVzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlCZWFuaW5mb0NsYXNzQWRhcHRlciBiY2EgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcigoRU9iamVjdCkgc3VwZXJzLmdldChpKSwKLQkJCQkJCQkJSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCQkJCWJjYS5pbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsKLQkJCQkJfQotCi0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoSU5UUk9TUEVDVCk7Ci0JCQkJCWlmIChyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9PSBSRVRSSUVWRURfUk9PVF9PTkxZIHx8IHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IENMRUFSX0VYVEVOU0lPTlMpIHsKLQkJCQkJCS8vIFdlIG5lZWQgdG8gY2xlYXIgb3V0IEVWRVJZVEhJTkcgYmVjYXVzZSB3ZSBhcmUgY29taW5nIGZyb20gYW4gdW5kZWZpbmVkIHRvIGEgZGVmaW5lZC4KLQkJCQkJCS8vIE5vdGhpbmcgcHJldmlvdXMgaXMgbm93IHZhbGlkLiAoUGFydGljdWxhcmx5IHRoZSByb290IHN0dWZmKS4KLQkJCQkJCS8vIE9yIHdlIGhhZCBhIENsZWFuIHJlcXVlc3RlZCBhbmQgbmVlZCB0byBjbGVhciB0aGUgZXh0ZW5zaW9ucyB0b28uCi0JCQkJCQljbGVhckFsbCgpOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gZmlyc3RUaW1lID0gZmFsc2U7Ci0JCQkJCWlmIChyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCAhPSBSRVRSSUVWRURfRlVMTF9ET0NVTUVOVCkgewotCQkJCQkJZmlyc3RUaW1lID0gdHJ1ZTsJLy8gSWYgd2UgbmVlZCB0byBhcHBseSB0aGUgZXh0ZW5zaW9uIGRvYywgdGhlbiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLgotCQkJCQkJYXBwbHlFeHRlbnNpb25Eb2N1bWVudChmYWxzZSk7IC8vIEFwcGx5IHRoZSBleHRlbnNpb24gZG9jIGJlZm9yZSB3ZSBkbyBhbnl0aGluZy4KLQkJCQkJfQotCi0JCQkJCS8vIE5vdyBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHVzZSB0aGUgY2FjaGUuCi0JCQkJCWJvb2xlYW4gZG9JbnRyb3NwZWN0aW9uID0gdHJ1ZTsKLQkJCQkJaWYgKGZpcnN0VGltZSkgewotCQkJCQkJLy8gQ2hlY2sgaWYgd2UgY2FuIHVzZSB0aGUgY2FjaGUuIFVzZSBNYXggdmFsdWUgc28gdGhhdCBmaXJzdCBsZXZlbCB0ZXN0IChvdXJzZWxmKSB3aWxsIGFsd2F5cyBwYXNzIGFuZCBnbyBvbiB0byB0aGUgc3VwZXJzLgotCQkJCQkJaWYgKGNhblVzZUNhY2hlKCkpIHsKLQkJCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKExPQURfRlJPTV9DQUNIRSk7Ci0JCQkJCQkJLy8gV2UgY2FuIHVzZSB0aGUgY2FjaGUuCi0JCQkJCQkJUmVzb3VyY2UgY3JlcyA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENhY2hlKGdldEphdmFDbGFzcygpLCBjbGFzc0VudHJ5LCB0cnVlKTsKLQkJCQkJCQlpZiAoY3JlcyAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkvLyBHb3QgYSBjYWNoZSB0byB1c2UsIG5vdyBhcHBseSBpdC4KLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgY2RzID0gY3Jlcy5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGNkcy5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJQ2hhbmdlRGVzY3JpcHRpb24gY2FjaGVDRCA9IChDaGFuZ2VEZXNjcmlwdGlvbikgY2RzLm5leHQoKTsKLQkJCQkJCQkJCQljYWNoZUNELmFwcGx5KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkvLyBXZSBuZWVkIHRvIHdhbGsgdGhyb3VnaCBhbmQgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBJRCdzIGZvciBldmVudHMvYWN0aW9ucy9wcm9wZXJ0aWVzIGJlY2F1c2UgYnkKLQkJCQkJCQkJCS8vIGRlZmF1bHQgZnJvbSB0aGUgY2hhbmdlIGRlc2NyaXB0aW9ucyB0aGVzZSBkb24ndCBnZXQgcmVmbGVjdGVkIGJhY2suIEFuZCBpZiBzb21lIG9uZSBkb2Vzbid0Ci0JCQkJCQkJCQkvLyB1c2UgYW4gSUQgdG8gZ2V0IHRoZW0sIHRoZXkgd29uJ3QgaGF2ZSBhbiBpZCBzZXQuCi0JCQkJCQkJCQlkb0lEcygpOwotCQkJCQkJCQkJZG9JbnRyb3NwZWN0aW9uID0gZmFsc2U7Ci0JCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQkJCQkJQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuSU5UUk9TUEVDVF9GQUlMRURfRVhDXywgCi0JCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLCAiIn0pLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJTGV2ZWwuV0FSTklORyk7Ci0JCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQkvLyBSZW1vdmUgdGhlIGNyZXMgc2luY2UgaXQgaXMgbm93IGludmFsaWQuIFRoZSBhcHBsaWVzIGNhdXNlIHRoZW0gdG8gYmUgaW52YWxpZC4KLQkJCQkJCQkJCWNyZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoY3Jlcyk7Ci0JCQkJCQkJCQlpZiAoZG9JbnRyb3NwZWN0aW9uKSB7Ci0JCQkJCQkJCQkJLy8gQXBwbHkgaGFkIGZhaWxlZC4gV2UgZG9uJ3Qga25vdyBob3cgZmFyIGl0IHdlbnQuIFdlIG5lZWQgdG8gd2lwZSBvdXQgYW5kIHJlZ2V0IEVWRVJZVEhJTkcuCi0JCQkJCQkJCQkJY2xlYXJBbGwoKTsKLQkJCQkJCQkJCQlhcHBseUV4dGVuc2lvbkRvY3VtZW50KGZhbHNlKTsgLy8gUmUtYXBwbHkgdGhlIGV4dGVuc2lvbiBkb2MgYmVmb3JlIHdlIGRvIGFueXRoaW5nIGVsc2UuCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKExPQURfRlJPTV9DQUNIRSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChkb0ludHJvc3BlY3Rpb24pIHsKLQkJCQkJCS8vIEZpbmFsbHkgd2UgY2FuIGdldCB0byBoYW5kbGluZyBvdXJzZWx2ZXMuCi0JCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFTU9URV9JTlRST1NQRUNUKTsKLQkJCQkJCUJlYW5EZWNvcmF0b3IgZGVjb3IgPSBVdGlsaXRpZXMuZ2V0QmVhbkRlY29yYXRvcihnZXRKYXZhQ2xhc3MoKSk7Ci0JCQkJCQlpZiAoZGVjb3IgPT0gbnVsbCkgewotCQkJCQkJCWRlY29yID0gQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCZWFuRGVjb3JhdG9yKCk7Ci0JCQkJCQkJZGVjb3Iuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTCk7Ci0JCQkJCQkJZ2V0SmF2YUNsYXNzKCkuZ2V0RUFubm90YXRpb25zKCkuYWRkKGRlY29yKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcihkZWNvcik7CS8vIENsZWFyIG91dCBwcmV2aW91cyByZXN1bHRzLgotCQkJCQkJCi0JCQkJCQlib29sZWFuIGRvUmVmbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQlpZiAoZG9PcGVyYXRpb25zKQotCQkJCQkJCW5ld29wZXJhdGlvbnMgPSBuZXcgSGFzaFNldCg1MCk7Ci0JCQkJCQlpZiAoZGVjb3IuaXNEb0JlYW5pbmZvKCkpIHsKLQkJCQkJCQlpbnQgZG9GbGFncyA9IDA7Ci0JCQkJCQkJaWYgKGRlY29yID09IG51bGwgfHwgZGVjb3IuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQkJCQkJZG9GbGFncyB8PSBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX0JFQU5fREVDT1I7Ci0JCQkJCQkJaWYgKGRlY29yID09IG51bGwgfHwgZGVjb3IuaXNJbnRyb3NwZWN0RXZlbnRzKCkpCi0JCQkJCQkJCWRvRmxhZ3MgfD0gSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19FVkVOVFM7Ci0JCQkJCQkJaWYgKGRlY29yID09IG51bGwgfHwgZGVjb3IuaXNJbnRyb3NwZWN0UHJvcGVydGllcygpKQotCQkJCQkJCQlkb0ZsYWdzIHw9IElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9fUFJPUEVSVElFUzsKLQkJCQkJCQlpZiAoZG9PcGVyYXRpb25zICYmIChkZWNvciA9PSBudWxsIHx8IGRlY29yLmlzSW50cm9zcGVjdE1ldGhvZHMoKSkpCi0JCQkJCQkJCWRvRmxhZ3MgfD0gSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19NRVRIT0RTOwotCQkJCQkJCQotCQkJCQkJCWlmIChkb0ZsYWdzICE9IDApIHsKLQkJCQkJCQkJLy8gVGhlcmUgd2FzIHNvbWV0aGluZyByZW1vdGUgdG8gZG8uCi0JCQkJCQkJCUlCZWFuVHlwZVByb3h5IHRhcmdldFR5cGUgPSBudWxsOwotCQkJCQkJCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7Ci0JCQkJCQkJCWlmIChyZWdpc3RyeSAhPSBudWxsICYmIHJlZ2lzdHJ5LmlzVmFsaWQoKSkKLQkJCQkJCQkJCXRhcmdldFR5cGUgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSk7Ci0JCQkJCQkJCWlmICh0YXJnZXRUeXBlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICh0YXJnZXRUeXBlLmdldEluaXRpYWxpemF0aW9uRXJyb3IoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdHJlYXQgdGhpcyBhcyBubyBwcm94eSwgaG93ZXZlciBsb2cgaXQgYmVjYXVzZSB3ZQotCQkJCQkJCQkJCS8vIHNob3VsZG4ndCBoYXZlIGV4Y2VwdGlvbnMgZHVyaW5nIGludHJvc3BlY3Rpb24sIGJ1dCBpZiB3ZSBkbyBpdCBzaG91bGQgYmUgbG9nZ2VkCi0JCQkJCQkJCQkJLy8gc28gaXQgY2FuIGJlIGNvcnJlY3RlZC4KLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQliZWFuaW5mbyA9IGdldFByb3h5Q29uc3RhbnRzKCkuZ2V0SW50cm9zcGVjdFByb3h5KCkuaW52b2tlKG51bGwsCi0JCQkJCQkJCQkJCQkJbmV3IElCZWFuUHJveHlbXSB7IHRhcmdldFR5cGUsIGdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpLCBnZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGRvRmxhZ3MpfSk7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuSU5UUk9TUEVDVF9GQUlMRURfRVhDXywgbmV3IE9iamVjdFtdIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCQlnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLCAiIn0pLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJCWUpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCS8vIFRoZSBjbGFzcyBpdHNlbGYgY291bGRuJ3QgYmUgaW5pdGlhbGl6ZWQuIEp1c3QgbG9nIGl0LCBidXQgdHJlYXQgYXMgbm8gcHJveHkuCi0JCQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nKAotCQkJCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5JTlRST1NQRUNUX0ZBSUxFRF9FWENfLCBuZXcgT2JqZWN0W10geyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJZ2V0SmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKSwgdGFyZ2V0VHlwZS5nZXRJbml0aWFsaXphdGlvbkVycm9yKCl9KSwgbnVsbCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJLy8gVGhlIGNsYXNzIGl0c2VsZiBjb3VsZCBub3QgYmUgZm91bmQuIEp1c3QgbG9nIGl0LCBidXQgdHJlYXQgYXMgbm8gcHJveHkuCi0JCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuSU5UUk9TUEVDVF9GQUlMRURfRVhDXywgbmV3IE9iamVjdFtdIHsgCi0JCQkJCQkJCQkJCQkJCQlnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLAotCQkJCQkJCQkJCQkJCQkJQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuQmVhbmluZm9DbGFzc0FkYXB0ZXJfQ2xhc3NOb3RGb3VuZH0pLCAKLQkJCQkJCQkJCQkJCQkJCW51bGwpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJaWYgKGJlYW5pbmZvICE9IG51bGwpIHsKLQkJCQkJCQkJCWRvUmVmbGVjdGlvbiA9IGZhbHNlOwkvLyBXZSBoYXZlIGEgYmVhbmluZm8sIHNvIHdlIGFyZSBkb2luZyBpbnRyb3NwZWN0aW9uLgotCQkJCQkJCQkJZmluYWwgQmVhbkRlY29yYXRvciBiZGVjb3IgPSBkZWNvcjsKLQkJCQkJCQkJCS8vIFdlIGhhdmUgYSBiZWFuaW5mbyB0byBwcm9jZXNzLgotCQkJCQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmludHJvc3BlY3QoYmVhbmluZm8sIG5ldyBCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuSW50cm9zcGVjdENhbGxCYWNrKCkgewotCi0JCQkJCQkJCQkJLyo7IChub24tSmF2YWRvYykKLQkJCQkJCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuSW50cm9zcGVjdENhbGxCYWNrI3Byb2Nlc3Mob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5CZWFuUmVjb3JkKQotCQkJCQkJCQkJCSAqLwotCQkJCQkJCQkJCXB1YmxpYyBCZWFuRGVjb3JhdG9yIHByb2Nlc3MoQmVhblJlY29yZCByZWNvcmQpIHsKLQkJCQkJCQkJCQkJcmV0dXJuIGJkZWNvcjsKLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LkludHJvc3BlY3RDYWxsQmFjayNwcm9jZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uUHJvcGVydHlSZWNvcmQpCi0JCQkJCQkJCQkJICovCi0JCQkJCQkJCQkJcHVibGljIFByb3BlcnR5RGVjb3JhdG9yIHByb2Nlc3MoUHJvcGVydHlSZWNvcmQgcmVjb3JkKSB7Ci0JCQkJCQkJCQkJCXJldHVybiBjYWxjdWxhdGVQcm9wZXJ0eShyZWNvcmQsIGZhbHNlKTsKLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LkludHJvc3BlY3RDYWxsQmFjayNwcm9jZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uSW5kZXhlZFByb3BlcnR5UmVjb3JkKQotCQkJCQkJCQkJCSAqLwotCQkJCQkJCQkJCXB1YmxpYyBQcm9wZXJ0eURlY29yYXRvciBwcm9jZXNzKEluZGV4ZWRQcm9wZXJ0eVJlY29yZCByZWNvcmQpIHsKLQkJCQkJCQkJCQkJcmV0dXJuIGNhbGN1bGF0ZVByb3BlcnR5KHJlY29yZCwgdHJ1ZSk7Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5JbnRyb3NwZWN0Q2FsbEJhY2sjcHJvY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLk1ldGhvZFJlY29yZCkKLQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJCQlwdWJsaWMgTWV0aG9kRGVjb3JhdG9yIHByb2Nlc3MoTWV0aG9kUmVjb3JkIHJlY29yZCkgewotCQkJCQkJCQkJCQlyZXR1cm4gY2FsY3VsYXRlT3BlcmF0aW9uKHJlY29yZCk7Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5JbnRyb3NwZWN0Q2FsbEJhY2sjcHJvY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkV2ZW50U2V0UmVjb3JkKQotCQkJCQkJCQkJCSAqLwotCQkJCQkJCQkJCXB1YmxpYyBFdmVudFNldERlY29yYXRvciBwcm9jZXNzKEV2ZW50U2V0UmVjb3JkIHJlY29yZCkgewotCQkJCQkJCQkJCQlyZXR1cm4gY2FsY3VsYXRlRXZlbnQocmVjb3JkKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9KTsKLQkJCQkJCQkJfSAKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmIChkb1JlZmxlY3Rpb24pIHsKLQkJCQkJCQkvLyBOZWVkIHRvIGRvIHJlZmxlY3Rpb24gc3R1ZmYuCi0JCQkJCQkJaWYgKGRlY29yLmlzSW50cm9zcGVjdFByb3BlcnRpZXMoKSkKLQkJCQkJCQkJcmVmbGVjdFByb3BlcnRpZXMoKTsKLQkJCQkJCQlpZiAoZG9PcGVyYXRpb25zICYmIGRlY29yLmlzSW50cm9zcGVjdE1ldGhvZHMoKSkKLQkJCQkJCQkJcmVmbGVjdE9wZXJhdGlvbnMoKTsKLQkJCQkJCQlpZiAoZGVjb3IuaXNJbnRyb3NwZWN0RXZlbnRzKCkpCi0JCQkJCQkJCXJlZmxlY3RFdmVudHMoKTsKLQkJCQkJCX0KLQkJCQkJCUNoYW5nZURlc2NyaXB0aW9uIGNkID0gQ2hhbmdlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hhbmdlRGVzY3JpcHRpb24oKTsJCQkJCQkKLQkJCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5idWlsZENoYW5nZShjZCwgZGVjb3IpOwotCQkJCQkJZmluYWxpemVQcm9wZXJ0aWVzKGNkKTsKLQkJCQkJCWlmIChkb09wZXJhdGlvbnMpCi0JCQkJCQkJZmluYWxpemVPcGVyYXRpb25zKGNkKTsKLQkJCQkJCWZpbmFsaXplRXZlbnRzKGNkKTsKLQotCQkJCQkJY2xhc3NFbnRyeSA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLm5ld0NhY2hlKGdldEphdmFDbGFzcygpLCBjZCwgZG9PcGVyYXRpb25zID8gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuUkVGTEVDVElPTl9PUEVSQVRJT05TX0NBQ0hFIDogQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuUkVGTEVDVElPTl9DQUNIRSk7Ci0JCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVNT1RFX0lOVFJPU1BFQ1QpOyAKLQkJCQkJfQotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoSU5UUk9TUEVDVCk7Ci0JCQkJfQotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkucmVnaXN0ZXJJbnRyb3NwZWN0aW9uKGdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCksIHRoaXMpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGJlYW5pbmZvICE9IG51bGwpIHsKLQkJCQliZWFuaW5mby5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLnJlbGVhc2VQcm94eShiZWFuaW5mbyk7IC8vIERpc3Bvc2Ugb2YgdGhlIGJlYW5pbmZvIHNpbmNlIHdlIG5vdyBoYXZlIGV2ZXJ5dGhpbmcuCi0JCQl9Ci0JCQlldmVudHNNYXAgPSBudWxsOyAvLyBDbGVhciBvdXQgdGhlIHRlbXAgbGlzdHMuCi0JCQlldmVudHNSZWFsTGlzdCA9IG51bGw7Ci0JCQlvcGVyYXRpb25zTWFwID0gbnVsbDsgLy8gQ2xlYXIgb3V0IHRoZSB0ZW1wIGxpc3RzLgotCQkJb3BlcmF0aW9uc1JlYWxMaXN0ID0gbnVsbDsKLQkJCW5ld29wZXJhdGlvbnMgPSBudWxsOwotCQkJcHJvcGVydGllc01hcCA9IG51bGw7IC8vIEdldCByaWQgb2YgYWNjdW11bGF0ZWQgbWFwLgotCQkJZmVhdHVyZXNSZWFsTGlzdCA9IG51bGw7IC8vIFJlbGVhc2UgdGhlIHJlYWwgbGlzdC4KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0lEcygpIHsKLQkJLy8gRG8gcHJvcGVydGllcy4KLQkJaWYgKGdldEphdmFDbGFzcygpLmVJc1NldChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc19FU3RydWN0dXJhbEZlYXR1cmVzKCkpKSB7Ci0JCQlMaXN0IGZlYXR1cmVzID0gZ2V0RmVhdHVyZXNMaXN0KCk7Ci0JCQlpbnQgbGVuID0gZmVhdHVyZXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKGYpOwotCQkJCWlmIChwZCA9PSBudWxsIHx8ICFwZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKQotCQkJCQljb250aW51ZTsgLy8gTm90IGEgcHJvcGVydHkgZm9yIHVzIHRvIGdpdmUgYW4gSUQgdG8uCi0JCQkJc2V0UHJvcGVydHlJRChmLmdldE5hbWUoKSwgZik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIERvIGV2ZW50cy4KLQkJaWYgKGdldEphdmFDbGFzcygpLmVJc1NldChKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0V2ZW50cygpKSkgewotCQkJTGlzdCBldmVudHMgPSBnZXRFdmVudHNMaXN0KCk7Ci0JCQlpbnQgbGVuID0gZXZlbnRzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlCZWFuRXZlbnQgZSA9IChCZWFuRXZlbnQpIGV2ZW50cy5nZXQoaSk7Ci0JCQkJRXZlbnRTZXREZWNvcmF0b3IgZWQgPSBVdGlsaXRpZXMuZ2V0RXZlbnRTZXREZWNvcmF0b3IoZSk7Ci0JCQkJaWYgKGVkID09IG51bGwgfHwgIWVkLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpCi0JCQkJCWNvbnRpbnVlOyAvLyBOb3QgYW4gZXZlbnQgZm9yIHVzIHRvIGdpdmUgYW4gSUQgdG8uCi0JCQkJc2V0RXZlbnRJRChlLmdldE5hbWUoKSwgZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBEbyBPcGVyYXRpb25zLgotCQlpZiAoZ2V0SmF2YUNsYXNzKCkuZUlzU2V0KEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzX0VPcGVyYXRpb25zKCkpKSB7Ci0JCQlMaXN0IG9wcyA9IGdldE9wZXJhdGlvbnNMaXN0KCk7Ci0JCQlpbnQgbGVuID0gb3BzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlFT3BlcmF0aW9uIG8gPSAoRU9wZXJhdGlvbikgb3BzLmdldChpKTsKLQkJCQlNZXRob2REZWNvcmF0b3IgbWQgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kRGVjb3JhdG9yKG8pOwotCQkJCWlmIChtZCA9PSBudWxsIHx8ICFtZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKQotCQkJCQljb250aW51ZTsgLy8gTm90IGFuIGV2ZW50IGZvciB1cyB0byBnaXZlIGFuIElEIHRvLgotCQkJCXNldE1ldGhvZElEKG8uZ2V0TmFtZSgpLCBvKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX09WRVJSSURFID0gQmVhbmluZm9QbHVnaW4uUk9PVCsnLicrQmVhbmluZm9QbHVnaW4uT1ZFUlJJREVfRVhURU5TSU9OOwkgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCB2b2lkIGFwcGx5RXh0ZW5zaW9uRG9jdW1lbnQoYm9vbGVhbiByb290T25seSkgewotCQl0cnkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChBUFBMWV9FWFRFTlNJT05TKTsKLQkJCWJvb2xlYW4gY2FuVXNlQ2FjaGUgPSAhcm9vdE9ubHkgJiYgY2FuVXNlT3ZlcnJpZGVDYWNoZSgpOwotCQkJYm9vbGVhbiBhbHJlYWR5UmV0cmlldmVkUm9vdCA9IHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IFJFVFJJRVZFRF9ST09UX09OTFk7Ci0JCQlyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9IHJvb3RPbmx5ID8gUkVUUklFVkVEX1JPT1RfT05MWSA6IFJFVFJJRVZFRF9GVUxMX0RPQ1VNRU5UOwotCQkJSmF2YUNsYXNzIGpjID0gZ2V0SmF2YUNsYXNzKCk7Ci0JCQlSZXNvdXJjZSBtZXJnZUludG9SZXNvdXJjZSA9IGpjLmVSZXNvdXJjZSgpOwotCQkJUmVzb3VyY2VTZXQgcnNldCA9IG1lcmdlSW50b1Jlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gamMuZ2V0TmFtZSgpOwotCQkJaWYgKGNhblVzZUNhY2hlKSB7Ci0JCQkJLy8gV2UgY2FuIHVzZSB0aGUgY2FjaGUsIHNlZSBpZiB3ZSBhY3R1YWxseSBoYXZlIG9uZS4KLQkJCQlpZiAoZ2V0Q2xhc3NFbnRyeSgpLm92ZXJyaWRlQ2FjaGVFeGlzdHMoKSkgewotCQkJCQkvLyBHZXQgdGhlIGNhY2hlIGFuZCBhcHBseSBpdCBiZWZvcmUgYW55dGhpbmcgZWxzZS4KLQkJCQkJUmVzb3VyY2UgY2FjaGVSZXMgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDYWNoZShqYywgZ2V0Q2xhc3NFbnRyeSgpLCBmYWxzZSk7Ci0JCQkJCWlmIChjYWNoZVJlcyAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW5ldyBFeHRlbnNpb25Eb2NBcHBsaWVzKG51bGwsIHJzZXQsIGpjLCBudWxsKS5ydW4oY2FjaGVSZXMpOwotCQkJCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklELCAwLAotCQkJCQkJCQkJCQkiRXJyb3IgcHJvY2Vzc2luZyBmaWxlXCIiICsgY2FjaGVSZXMuZ2V0VVJJKCkgKyAiXCIiLCBlLmV4Y2VwdGlvbigpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkJCQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQljYWNoZVJlcy5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnJlbW92ZShjYWNoZVJlcyk7IC8vIFdlIGRvbid0IG5lZWQgaXQgYXJvdW5kIG9uY2Ugd2UgZG8gdGhlIG1lcmdlLiBOb3JtYWwgbWVyZ2Ugd291bGQgb2YgZ290dG9uIHJpZCBvZiBpdCwgYnV0IGluIGNhc2Ugb2YgZXJyb3Igd2UgZG8gaXQgaGVyZS4KLQkJCQkJCX0KLQkJCQkJfSBlbHNlCi0JCQkJCQljYW5Vc2VDYWNoZSA9IGZhbHNlOyAvLyBOZWVkIHRvIHJlYnVpbGQgdGhlIGNhY2hlLgotCQkJCX0KLQkJCX0KLQkJCUxpc3Qgb3ZlcnJpZGVDYWNoZSA9IG51bGw7Ci0JCQlpZiAoIWFscmVhZHlSZXRyaWV2ZWRSb290ICYmIChyb290T25seSB8fCBqYy5nZXRTdXBlcnR5cGUoKSA9PSBudWxsKSkgewotCQkJCS8vIEl0IGlzIGEgcm9vdCBjbGFzcy4gTmVlZCB0byBtZXJnZSBpbiByb290IHN0dWZmLgotCQkJCWlmICghY2FuVXNlQ2FjaGUpIHsKLQkJCQkJb3ZlcnJpZGVDYWNoZSA9IGNyZWF0ZU92ZXJyaWRlQ2FjaGUob3ZlcnJpZGVDYWNoZSwgZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRQcm9qZWN0KCksIEJlYW5pbmZvUGx1Z2luLlJPT1QsIFJPT1RfT1ZFUlJJREUsIHJzZXQsIGpjKTsKLQkJCQl9Ci0JCQkJYXBwbHlFeHRlbnNpb25Eb2NUbyhyc2V0LCBqYywgUk9PVF9PVkVSUklERSwgQmVhbmluZm9QbHVnaW4uUk9PVCwgQmVhbmluZm9QbHVnaW4uUk9PVCk7Ci0JCQkJaWYgKHJvb3RPbmx5KQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyBiYXNlT3ZlcnJpZGVmaWxlID0gY2xhc3NOYW1lICsgJy4nICsgQmVhbmluZm9QbHVnaW4uT1ZFUlJJREVfRVhURU5TSU9OOyAvLyBnZXROYW1lKCkgcmV0dXJucyBpbm5lciBjbGFzc2VzIHdpdGggIiQiIG5vdGF0aW9uLCB3aGljaCBpcyBnb29kLiAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBqYy5nZXRKYXZhUGFja2FnZSgpLmdldFBhY2thZ2VOYW1lKCk7Ci0JCQlpZiAoIWNhblVzZUNhY2hlKSB7Ci0JCQkJb3ZlcnJpZGVDYWNoZSA9IGNyZWF0ZU92ZXJyaWRlQ2FjaGUob3ZlcnJpZGVDYWNoZSwgZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRQcm9qZWN0KCksIHBhY2thZ2VOYW1lLCBiYXNlT3ZlcnJpZGVmaWxlLCByc2V0LCBqYyk7Ci0JCQl9Ci0JCQlhcHBseUV4dGVuc2lvbkRvY1RvKHJzZXQsIGpjLCBiYXNlT3ZlcnJpZGVmaWxlLCBwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKTsKLQkJCQotCQkJaWYgKCFjYW5Vc2VDYWNoZSkgewotCQkJCS8vIFdlIGhhdmUgYW4gb3ZlcnJpZGUgY2FjaGUgdG8gc3RvcmUuIElmIHRoZSBjYWNoZSBpcyBudWxsLCB0aGlzIHdpbGwgZmxhZyB0aGF0IHRoZXJlIGlzIG5vIG92ZXJyaWRlIGNhY2hlIGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBUaGF0IHdheSB3ZSB3b24ndCBib3RoZXIgdHJ5aW5nIGFnYWluIHVudGlsIGNvbmZpZyBjaGFuZ2VzLgotCQkJCUJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLm5ld0NhY2hlKGpjLCBvdmVycmlkZUNhY2hlLCBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5PVkVSUklERVNfQ0FDSEUpOwotCQkJfQotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoQVBQTFlfRVhURU5TSU9OUyk7CQotCQl9Ci0JfQotCQotCS8qCi0JICogQnVpbGQgdXAgdGhlIGZpeGVkIG92ZXJyaWRlcyBpbnRvIHRoZSBjYWNoZSwgYW5kIGFwcGx5IGFzIHdlIGdhdGhlciB0aGVtLgotCSAqIFJldHVybiB0aGUgY2FjaGUgb3IgbnVsbCBpZiB0aGUgY2FjaGUgaXMgZW1wdHkgYXQgdGhlIGVuZC4KLQkgKi8KLQlwcml2YXRlIExpc3QgY3JlYXRlT3ZlcnJpZGVDYWNoZShMaXN0IGNhY2hlLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBvdmVycmlkZUZpbGUsIFJlc291cmNlU2V0IHJzZXQsIEphdmFDbGFzcyBtZXJnZUludG9KYXZhQ2xhc3MpIHsKLQkJLy8gTm93IGdldCB0aGUgb3ZlcnJpZGVzIHBhdGhzCi0JCVN0cmluZ1tdIHBhdGhzID0gQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0T3ZlcnJpZGVQYXRocyhwcm9qZWN0LCBwYWNrYWdlTmFtZSk7Ci0JCWlmIChwYXRocy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBjYWNoZTsKLQkJCi0JCS8vIE5vdyBhcHBseSB0aGUgb3ZlcnJpZGVzLgotCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCWNhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQlCZWFuaW5mb1BsdWdpbi5JT3ZlcnJpZGVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBFeHRlbnNpb25Eb2NBcHBsaWVzKG92ZXJyaWRlRmlsZSwgcnNldCwgbWVyZ2VJbnRvSmF2YUNsYXNzLCBjYWNoZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCXJ1bm5hYmxlLnJ1bihwYXRoc1tpXSk7Ci0JCX0KLQkJcmV0dXJuICFjYWNoZS5pc0VtcHR5KCkgPyBjYWNoZSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBST09UX1VSSSA9IFVSSS5jcmVhdGVHZW5lcmljVVJJKEJlYW5pbmZvUGx1Z2luLlJPT1RfU0NIRU1BLCBCZWFuaW5mb1BsdWdpbi5ST09UX09QQVFVRSwgbnVsbCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRlJBR01FTlQgPSAiLy9Acm9vdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGUkFHTUVOVF9TUExJVFRFUiA9IFBhdHRlcm4uY29tcGlsZSgiLyIpOwotCQotCXByaXZhdGUgY2xhc3MgRXh0ZW5zaW9uRG9jQXBwbGllcyBpbXBsZW1lbnRzIEJlYW5pbmZvUGx1Z2luLklPdmVycmlkZVJ1bm5hYmxlIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIG92ZXJyaWRlRmlsZTsKLQkJcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZVNldCByc2V0OwotCQlwcml2YXRlIGZpbmFsIEphdmFDbGFzcyBtZXJnZUludG9KYXZhQ2xhc3M7Ci0JCXByaXZhdGUgZmluYWwgTGlzdCBvdmVycmlkZXNDYWNoZTsKLQotCQlwdWJsaWMgRXh0ZW5zaW9uRG9jQXBwbGllcyhTdHJpbmcgb3ZlcnJpZGVGaWxlLCBSZXNvdXJjZVNldCByc2V0LCBKYXZhQ2xhc3MgbWVyZ2VJbnRvSmF2YUNsYXNzLCBMaXN0IG92ZXJyaWRlc0NhY2hlKSB7Ci0JCQl0aGlzLm92ZXJyaWRlRmlsZSA9IG92ZXJyaWRlRmlsZTsKLQkJCXRoaXMucnNldCA9IHJzZXQ7Ci0JCQl0aGlzLm1lcmdlSW50b0phdmFDbGFzcyA9IG1lcmdlSW50b0phdmFDbGFzczsKLQkJCXRoaXMub3ZlcnJpZGVzQ2FjaGUgPSBvdmVycmlkZXNDYWNoZTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvUGx1Z2luLklPdmVycmlkZVJ1bm5hYmxlI3J1bihqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFN0cmluZyBvdmVycmlkZVBhdGgpIHsKLQkJCVJlc291cmNlIG92ZXJyaWRlUmVzID0gbnVsbDsKLQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKG92ZXJyaWRlUGF0aCtvdmVycmlkZUZpbGUpOwotCQkJdHJ5IHsKLQkJCQlvdmVycmlkZVJlcyA9IHJzZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQlydW4ob3ZlcnJpZGVSZXMpOwotCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlzIG9rCi0JCQkJaWYgKCEoZS5leGNlcHRpb24oKSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikpIHsKLQkJCQkJaWYgKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uCi0JCQkJCQkmJiAoKENvcmVFeGNlcHRpb24pIGUuZXhjZXB0aW9uKCkpLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EKSB7Ci0JCQkJCQkvLyBUaGlzIGlzIG9rLiBNZWFucyB1cmlfbWFwcGluZyBub3Qgc2V0IHNvIGNvdWxkbid0IGZpbmQgaW4gV29ya3NwYWNlLCBhbHNvIG9rLgotCQkJCQl9IGVsc2UgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIkVycm9yIGxvYWRpbmcgZmlsZVwiIiArIHVyaSArICJcIiIsIGUuZXhjZXB0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSW4gY2FzZSBpdCBoYXBwZW5lZCBhZnRlciBjcmVhdGluZyByZXNvdXJjZSBidXQgZHVyaW5nIGxvYWQuIE5lZWQgdG8gZ2V0IHJpZCBvZiBpdCBpbiB0aGUgZmluYWxseS4JCi0JCQkJb3ZlcnJpZGVSZXMgPSByc2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwkJCQkKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gQ291bGRuJ3QgbG9hZCBpdCBmb3Igc29tZSByZWFzb24uCi0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIkVycm9yIGxvYWRpbmcgZmlsZVwiIiArIHVyaSArICJcIiIsIGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJb3ZlcnJpZGVSZXMgPSByc2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOyAvLyBJbiBjYXNlIGl0IGhhcHBlbmVkIGFmdGVyIGNyZWF0aW5nIHJlc291cmNlIGJ1dCBkdXJpbmcgbG9hZCBzbyB0aGF0IHdlIGNhbiBnZXQgcmlkIG9mIGl0LgotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAob3ZlcnJpZGVSZXMgIT0gbnVsbCkKLQkJCQkJcnNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUob3ZlcnJpZGVSZXMpOyAvLyBXZSBkb24ndCBuZWVkIGl0IGFyb3VuZCBvbmNlIHdlIGRvIHRoZSBtZXJnZS4gTm9ybWFsIG1lcmdlIHdvdWxkIG9mIGdvdHRvbiByaWQgb2YgaXQsIGJ1dCBpbiBjYXNlIG9mIGVycm9yIHdlIGRvIGl0IGhlcmUuCi0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb1BsdWdpbi5JT3ZlcnJpZGVSdW5uYWJsZSNydW4ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFJlc291cmNlIG92ZXJyaWRlUmVzKSB7Ci0JCQl0cnkgewotCQkJCUVMaXN0IGNvbnRlbnRzID0gb3ZlcnJpZGVSZXMuZ2V0Q29udGVudHMoKTsKLQkJCQlpZiAob3ZlcnJpZGVzQ2FjaGUgIT0gbnVsbCkgewotCQkJCQkvLyBUT0RPIFVudGlsIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkxNjkgaXMgZml4ZWQsIHdlIG5lZWQgb3VyIG93biBDb3BpZXIuCi0JCQkJCUVjb3JlVXRpbC5Db3BpZXIgY29waWVyID0gbmV3IEVjb3JlVXRpbC5Db3BpZXIoKSB7Ci0KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJCQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgRU9iamVjdCBlT2JqZWN0LCBFT2JqZWN0IGNvcHlFT2JqZWN0KSB7Ci0JCQkJCQkJaWYgKGVPYmplY3QuZUlzU2V0KGVSZWZlcmVuY2UpKSB7Ci0JCQkJCQkJCWlmIChlUmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQlMaXN0IHNvdXJjZSA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZVJlZmVyZW5jZSk7Ci0JCQkJCQkJCQlJbnRlcm5hbEVMaXN0IHRhcmdldCA9IChJbnRlcm5hbEVMaXN0KSBjb3B5RU9iamVjdC5lR2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSk7Ci0JCQkJCQkJCQlpZiAoc291cmNlLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCXRhcmdldC5jbGVhcigpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlib29sZWFuIGlzQmlkaXJlY3Rpb25hbCA9IGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbDsKLQkJCQkJCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgayA9ICgoRWNvcmVFTGlzdCkgc291cmNlKS5iYXNpY0l0ZXJhdG9yKCk7IGsuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCQlPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSBrLm5leHQoKTsKLQkJCQkJCQkJCQkJT2JqZWN0IGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGdldChyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCWlmIChjb3B5UmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCQkJCQkJaWYgKCFpc0JpZGlyZWN0aW9uYWwpIHsKLQkJCQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LCByZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCQkJKytpbmRleDsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJCWlmIChpc0JpZGlyZWN0aW9uYWwpIHsKLQkJCQkJCQkJCQkJCQlpbnQgcG9zaXRpb24gPSB0YXJnZXQuaW5kZXhPZihjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCQkJCWlmIChwb3NpdGlvbiA9PSAtMSkgewotCQkJCQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LCBjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCQkJCX0gZWxzZSBpZiAoaW5kZXggIT0gcG9zaXRpb24pIHsKLQkJCQkJCQkJCQkJCQkJdGFyZ2V0Lm1vdmUoaW5kZXgsIGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LCBjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJKytpbmRleDsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCU9iamVjdCByZWZlcmVuY2VkRU9iamVjdCA9IGVPYmplY3QuZUdldChlUmVmZXJlbmNlLCBmYWxzZSk7Ci0JCQkJCQkJCQlpZiAocmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCBudWxsKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJT2JqZWN0IGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGdldChyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJaWYgKGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCWlmIChlUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpID09IG51bGwpIHsKLQkJCQkJCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCByZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQljb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwgY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCQotCQkJCQkvLyBXZSBmaXh1cCB0aGUgQ0QgZmlyc3Qgc28gdGhhdCB3aGVuIHNlcmlhbGl6ZWQgaXQgd2lsbCBiZSB0byB0aGUgY29ycmVjdCBvYmplY3QgYWxyZWFkeS4gU2ltcGxpZmllcyBhcHBseSBsYXRlci4KLQkJCQkJSXRlcmF0b3IgaXRyID0gY29udGVudHMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJCWlmIChvIGluc3RhbmNlb2YgQ2hhbmdlRGVzY3JpcHRpb24pIHsKLQkJCQkJCQlmaXh1cENEKChDaGFuZ2VEZXNjcmlwdGlvbikgbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCSAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IGNvcGllci5jb3B5QWxsKGNvbnRlbnRzKTsKLQkJCQkgICAgY29waWVyLmNvcHlSZWZlcmVuY2VzKCk7Ci0JCQkJCW92ZXJyaWRlc0NhY2hlLmFkZEFsbChyZXN1bHQpOwkvLyBNYWtlIGEgY29weSBmb3IgdGhlIG92ZXJyaWRlIGNhY2hlIHRvIGJlIHVzZWQgbmV4dCB0aW1lIG5lZWRlZC4KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCFjb250ZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gVE9ETyBJdCBjb3VsZCBiZSBlaXRoZXIgdGhlIG9sZCBldmVudCBtb2RlbCBvciB0aGUgbmV3IENoYW5nZURlc2NyaXB0aW9uLiBXaGVuIHdlIHJlbW92ZSBFdmVudCBNb2RlbCB3ZSBuZWVkIHRvIHJlbW92ZQotCQkJCQkvLyB0aGUgdGVzdC4gVGhpcyBjb3VsZCBiZSB0aGUgb3ZlcnJpZGUgY2FjaGUgdG9vLCBzbyB3ZSBtdXN0IGFwcGx5IHRoZSBjb250ZW50cyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgaW4gdGhlIHJlc291cmNlLgotCQkJCQl0cnkgewotCQkJCQkJTGlzdCBldmVudHMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJCQkJZXZlbnRzLmFkZChudWxsKTsJLy8gRXZlbnRVdGlsIG5lZWRzIGEgbGlzdCwgYnV0IHdlIHdpbGwgYmUgY2FsbGluZyBvbmUgYnkgb25lLiBTbyBqdXN0IHJldXNlIHRoaXMgbGlzdC4KLQkJCQkJCUl0ZXJhdG9yIGl0ciA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIENoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCQkJCQkJCUNoYW5nZURlc2NyaXB0aW9uIGNkID0gKENoYW5nZURlc2NyaXB0aW9uKSBvOwotCQkJCQkJCQlmaXh1cENEKGNkKTsKLQkJCQkJCQkJY2QuYXBwbHkoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBJdCBpcyB0aGUgb2xkIGZvcm1hdC4KLQkJCQkJCQkJZXZlbnRzLnNldCgwLCBvKTsKLQkJCQkJCQkJRXZlbnRVdGlsIHV0aWwgPSBFdmVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV2ZW50VXRpbChtZXJnZUludG9KYXZhQ2xhc3MsIHJzZXQpOwotCQkJCQkJCQl1dGlsLmRvRm9yd2FyZEV2ZW50cyhldmVudHMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXVuaW5zdGFsbFJvb3RSZXNvdXJjZSgpOwotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIkVycm9yIHByb2Nlc3NpbmcgZmlsZVwiIiArIG92ZXJyaWRlUmVzLmdldFVSSSgpICsgIlwiIiwgZS5leGNlcHRpb24oKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogZml4IGl0IHVwIHNvIHRoYXQgcmVmZXJlbmNlcyB0byAiWDpST09UIy8vQHJvb3QiIGFyZSByZXBsYWNlZCB3aXRoIHJlZmVyZW5jZSB0byB0aGUgamF2YWNsYXNzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGZpeHVwQ0QoQ2hhbmdlRGVzY3JpcHRpb24gY2QpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBrZXlGZWF0dXJlID0gQ2hhbmdlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU9iamVjdFRvQ2hhbmdlc01hcEVudHJ5X0tleSgpOwotCQkJSXRlcmF0b3IgY2hhbmdlcyA9IGNkLmdldE9iamVjdENoYW5nZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGNoYW5nZXMuaGFzTmV4dCgpKSB7Ci0JCQkJRU9iamVjdCBlbnRyeSA9IChFT2JqZWN0KSBjaGFuZ2VzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGtleSA9IChFT2JqZWN0KSBlbnRyeS5lR2V0KGtleUZlYXR1cmUsIGZhbHNlKTsKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVJc1Byb3h5KCkpIHsKLQkJCQkJLy8gU2VlIGlmIGl0IGlzIG91ciBzcGVjaWFsLgotCQkJCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIGtleSkuZVByb3h5VVJJKCk7Ci0JCQkJCVN0cmluZyByb290RnJhZyA9IHVyaS5mcmFnbWVudCgpOwotCQkJCQlpZiAoQmVhbmluZm9QbHVnaW4uUk9PVF9TQ0hFTUEuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgQmVhbmluZm9QbHVnaW4uUk9PVF9PUEFRVUUuZXF1YWxzKHVyaS5vcGFxdWVQYXJ0KCkpICYmIChyb290RnJhZyAhPSBudWxsICYmIHJvb3RGcmFnLnN0YXJ0c1dpdGgoUk9PVF9GUkFHTUVOVCkpKSB7Ci0JCQkJCQkvLyBJdCBpcyBvbmUgb2Ygb3Vycy4gR2V0IHRoZSBmcmFnbWVudCwgcmVtb3ZlIHRoZSBsZWFkaW5nIC8vcm9vdCBhbmQgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlCi0JCQkJCQkvLyB1cmkgZnJvbSB0aGUgamF2YSBjbGFzcyBpdHNlbGYuCi0JCQkJCQlpZiAocm9vdEZyYWcubGVuZ3RoKCkgPD0gUk9PVF9GUkFHTUVOVC5sZW5ndGgoKSkKLQkJCQkJCQllbnRyeS5lU2V0KGtleUZlYXR1cmUsIG1lcmdlSW50b0phdmFDbGFzcyk7CS8vIE5vIHN1Yi1wYXRoLCBzbyBqdXN0IHRoZSBqYXZhIGNsYXNzLgotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gVGhlcmUgaXMgYSBzdWItcGF0aCBiZWxvdyB0aGUgamF2YSBjbGFzcyB0aGF0IGlzIG5lZWRlZC4gTmVlZCB0byB3YWxrIGRvd24gdGhlIHBhdGguCi0JCQkJCQkJU3RyaW5nW10gcGF0aCA9IEZSQUdNRU5UX1NQTElUVEVSLnNwbGl0KHJvb3RGcmFnLnN1YnN0cmluZyhST09UX0ZSQUdNRU5ULmxlbmd0aCgpKzEpKTsKLQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3S2V5ID0gKEludGVybmFsRU9iamVjdCkgbWVyZ2VJbnRvSmF2YUNsYXNzOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBuZXdLZXkgIT0gbnVsbCAmJiBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewotCQkJCQkJCQluZXdLZXkgPSAoSW50ZXJuYWxFT2JqZWN0KSBuZXdLZXkuZU9iamVjdEZvclVSSUZyYWdtZW50U2VnbWVudChwYXRoW2ldKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG5ld0tleSAhPSBudWxsKQotCQkJCQkJCQllbnRyeS5lU2V0KGtleUZlYXR1cmUsIG5ld0tleSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFVuaW5zdGFsbCB0aGUgZmFrZSByb290IHJlc291cmNlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGluc3RhbGxSb290UmVzb3VyY2UgaGFzIGJlZW4gY2FsbGVkLiBTbyBtdXN0IHVzZSB0cnkvZmluYWxseS4gCi0JCSAqIAotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdW5pbnN0YWxsUm9vdFJlc291cmNlKCkgewotCQkJUmVzb3VyY2Ugcm9vdCA9IHJzZXQuZ2V0UmVzb3VyY2UoUk9PVF9VUkksIGZhbHNlKTsKLQkJCWlmIChyb290ICE9IG51bGwpCi0JCQkJcnNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocm9vdCk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYXBwbHlFeHRlbnNpb25Eb2NUbyhSZXNvdXJjZVNldCByc2V0LCBKYXZhQ2xhc3MgbWVyZ2VJbnRvSmF2YUNsYXNzLCBTdHJpbmcgb3ZlcnJpZGVGaWxlLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuYXBwbHlPdmVycmlkZXMoZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRQcm9qZWN0KCksIHBhY2thZ2VOYW1lLCBjbGFzc05hbWUsIG1lcmdlSW50b0phdmFDbGFzcywgcnNldCwgCi0JCQluZXcgRXh0ZW5zaW9uRG9jQXBwbGllcyhvdmVycmlkZUZpbGUsIHJzZXQsIG1lcmdlSW50b0phdmFDbGFzcywgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFyZ2V0IGFzIGEgSmF2YUNsYXNzIAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3NJbXBsIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGJlYW5pbmZvIGNvbnN0YW50cyByZWNvcmQKLQkgKi8KLQlwcm90ZWN0ZWQgQmVhbmluZm9Qcm94eUNvbnN0YW50cyBnZXRQcm94eUNvbnN0YW50cygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGdldFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyI2dldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkgewotCQlpbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsKLQkJcmV0dXJuIGdldEphdmFDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlciNnZXRBbGxQcm9wZXJ0aWVzKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGFsbFByb3BlcnRpZXMoKTsKLQl9CQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyI2dldEVPcGVyYXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKSB7Ci0JCWlmIChnZXRDbGFzc0VudHJ5KCkgIT0gbnVsbCAmJiBnZXRDbGFzc0VudHJ5KCkuaXNPcGVyYXRpb25zU3RvcmVkKCkpCi0JCQlpbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsJLy8gQWxyZWFkeSBzdG9yZWQsIGp1c3QgZG8gaWYgbmVjZXNzYXJ5LgotCQllbHNlIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCW5lZWRzSW50cm9zcGVjdGlvbiA9IHRydWU7CS8vIEZvcmNlIHJlaW50cm9zcGVjdGlvbiBiZWNhdXNlIHdlIGVpdGhlciBhcmVuJ3Qgc3RvcmluZyBvcGVyYXRpb25zLCBvciBoYXZlIG5ldmVyIGxvYWRlZC4KLQkJCX0KLQkJCWludHJvc3BlY3RJZk5lY2Vzc2FyeSh0cnVlKTsJLy8gQnV0IGZvcmNlIHRoZSBvcGVyYXRpb25zIG5vdy4KLQkJfQotCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCkuZ2V0RU9wZXJhdGlvbnNJbnRlcm5hbCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlciNnZXRFQWxsT3BlcmF0aW9ucygpCi0JICovCi0JcHVibGljIEJhc2ljRUxpc3QgZ2V0RUFsbE9wZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBhbGxPcGVyYXRpb25zKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyI2dldEV2ZW50cygpCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV2ZW50cygpIHsKLQkJaW50cm9zcGVjdElmTmVjZXNzYXJ5KCk7Ci0JCXJldHVybiBnZXRKYXZhQ2xhc3MoKS5nZXRFdmVudHNHZW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5iZWFuaW5mby5JSW50cm9zcGVjdGlvbkFkYXB0ZXIjZ2V0QWxsRXZlbnRzKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsRXZlbnRzKCkgewotCQlyZXR1cm4gYWxsRXZlbnRzKCk7Ci0JfQkJCQkJCi0KLQlwcml2YXRlIHZvaWQgZmluYWxpemVQcm9wZXJ0aWVzKENoYW5nZURlc2NyaXB0aW9uIGNkKSB7Ci0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBsaXN0IGFuZCByZW1vdmUgdGhvc2UgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCwgYW5kIHNldCB0aGUgZXR5cGUgZm9yIHRob3NlIHRoYXQgZG9uJ3QgaGF2ZSBpdCBzZXQuCi0JCU1hcCBvbGRMb2NhbHMgPSBnZXRQcm9wZXJ0aWVzTWFwKCk7Ci0JCUl0ZXJhdG9yIGl0ciA9IGdldEZlYXR1cmVzTGlzdCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQlQcm9wZXJ0eURlY29yYXRvciBwID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKGEpOwotCQkJT2JqZWN0IGFPbGQgPSBvbGRMb2NhbHMuZ2V0KGEuZ2V0TmFtZSgpKTsKLQkJCWlmIChhT2xkICE9IG51bGwgJiYgYU9sZCAhPSBCb29sZWFuLkZBTFNFKSB7Ci0JCQkJLy8gQSBjYW5kaWRhdGUgZm9yIHJlbW92YWwuIEl0IHdhcyBpbiB0aGUgb2xkIGxpc3QgYW5kIGl0IHdhcyBub3QgcHJvY2Vzc2VkLgotCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gcC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCQkJaWYgKGltcGxpY2l0ICE9IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCkgewotCQkJCQkJcC5zZXRFTW9kZWxFbGVtZW50KG51bGwpOyAvLyBSZW1vdmUgZnJvbSB0aGUgZmVhdHVyZTsKLQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBwKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7Ci0JCQkJCQkvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCQkJcCA9IG51bGw7Ci0JCQkJCQlpZiAoaW1wbGljaXQgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKSB7Ci0JCQkJCQkJaXRyLnJlbW92ZSgpOyAvLyBSZW1vdmUgaXQsIHRoaXMgd2FzIGltcGxpY2l0bHkgY3JlYXRlZCBhbmQgbm90IHByb2Nlc3NlZCB0aGlzIHRpbWUuCi0JCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIGEpLmVTZXRQcm94eVVSSShCQURfVVJJKTsJLy8gTWFyayBpdCBhcyBiYWQgcHJveHkgc28gd2Uga25vdyBpdCBpcyBubyBsb25nZXIgYW55IHVzZS4KLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCS8vIE5lZWQgdG8gZ28gb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBlVHlwZSB0byBtYWtlIHN1cmUgaXQgaXMgc2V0LiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbm8gZGVjb3JhdG9yIGJ1dCB3ZSBzdGlsbCBoYXZlIGEgZmVhdHVyZS4KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gWzc5MDgzXSBBbHNvIGNoZWNrIGZvciBlVHlwZSBub3Qgc2V0LCBhbmQgaWYgaXQgaXMsIHNldCBpdCB0byBFT2JqZWN0IHR5cGUuIFRoYXQgd2F5IGl0IHdpbGwgYmUgdmFsaWQsIGJ1dCBub3QgdmFsaWQgYXMgCi0JCQkvLyBhIGJlYW4gc2V0dGluZy4KLQkJCWlmIChhLmdldEVUeXBlKCkgPT0gbnVsbCkgewotCQkJCS8vIFNldCBpdCB0byBFT2JqZWN0IHR5cGUuIElmIGl0IGJlY29tZXMgdmFsaWQgbGF0ZXIgKHRocm91Z2ggdGhlIGNsYXNzIGJlaW5nIGNoYW5nZWQpLCB0aGVuIHRoZSBpbnRyb3NwZWN0L3JlZmxlY3QKLQkJCQkvLyB3aWxsIHNldCBpdCB0byB0aGUgY29ycmVjdCB0eXBlLgotCQkJCWEuc2V0RVR5cGUoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFT2JqZWN0KCkpOwotCQkJCUxvZ2dlciBsb2dnZXIgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKQotCQkJCQlsb2dnZXIubG9nV2FybmluZygiRmVhdHVyZSBcIiIrZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKyItPiIrYS5nZXROYW1lKCkrIlwiIGRpZCBub3QgaGF2ZSBhIHR5cGUgc2V0LiBUeXBpY2FsbHkgZHVlIHRvIG92ZXJyaWRlIGZpbGUgY3JlYXRpbmcgZmVhdHVyZSBidXQgcHJvcGVydHkgbm90IGZvdW5kIG9uIGludHJvc3BlY3Rpb24vcmVmbGVjdGlvbi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCQotCQkJaWYgKHAgIT0gbnVsbCAmJiBjZCAhPSBudWxsKSB7Ci0JCQkJLy8gTm93IGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY2FjaGUgZW50cnkgZm9yIHRoaXMgcHJvcGVydHkuCi0JCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmJ1aWxkQ2hhbmdlKGNkLCBwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIG1lcmdlIGFsbCAgdGhlIFByb3BlcnRpZXMgKGkuZS4gc3VwZXJ0eXBlcykgKHByb3BlcnRpZXMpCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFsbFByb3BlcnRpZXMoKSB7Ci0JCQotCQlFTGlzdCBqY0FsbFByb3BlcnRpZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRBbGxQcm9wZXJ0aWVzR2VuKCk7Ci0JCUJlYW5pbmZvU3VwZXJBZGFwdGVyIHN1cGVyQWRhcHRlciA9Ci0JCQkoQmVhbmluZm9TdXBlckFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihnZXRKYXZhQ2xhc3MoKSwgQmVhbmluZm9TdXBlckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoamNBbGxQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCS8vIFNlZSBpZiBuZXcgb25lIHJlcXVpcmVkLgotCQkJaWYgKHN1cGVyQWRhcHRlciA9PSBudWxsIHx8ICFzdXBlckFkYXB0ZXIuaXNBbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkKCkpCi0JCQkJcmV0dXJuIGpjQWxsUHJvcGVydGllczsKLQkJCS8vIENhbid0IGdldCBzdXBlcmFkYXB0ZXIsIHNvIG11c3Qgbm90IGJlIGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHNvIHJldHVybiBjdXJyZW50IGxpc3QuIE9yIG5vIGNoYW5nZSByZXF1aXJlZC4gICAgICAgCQkKLQkJfQotCQkKLQkJVW5pcXVlRUxpc3QuRmFzdENvbXBhcmUgYWxsUHJvcGVydGllcyA9IG5ldyBVbmlxdWVFTGlzdC5GYXN0Q29tcGFyZSgpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqIAotCQkJICogQHNpbmNlIDEuMS4wCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlwcm90ZWN0ZWQgT2JqZWN0W10gbmV3RGF0YShpbnQgY2FwYWNpdHkpIHsKLQkJCQlyZXR1cm4gbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtjYXBhY2l0eV07Ci0JCQl9Ci0JCX07Ci0JCWJvb2xlYW4gZG9BbGxQcm9wZXJ0aWVzID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQkvLyBJZiB3ZSBhcmUgaW50cm9zcGVjdGluZywgZG9uJ3QgZG8gYWxsIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBpcyBhbiBpbnZhbGlkIGxpc3QuIEp1c3QgcmV0dXJuIGVtcHR5IHdpdGhvdXQgcmVzZXRpbmcgdGhlIGFsbCBtb2RpZmllZCBmbGFnLgotCQkJZG9BbGxQcm9wZXJ0aWVzID0gIWlzRG9pbmdBbGxQcm9wZXJ0aWVzICYmICFpc0ludHJvc3BlY3RpbmcgJiYgaXNSZXNvdXJjZUNvbm5lY3RlZCgpOwotCQkJaWYgKGRvQWxsUHJvcGVydGllcykKLQkJCQlpc0RvaW5nQWxsUHJvcGVydGllcyA9IHRydWU7Ci0JCX0KLQkJaWYgKGRvQWxsUHJvcGVydGllcykgewotCQkJdHJ5IHsKLQkJCQlFTGlzdCBsb2NhbFByb3BlcnRpZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJCQkvLyBJbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuZHMsIHdoaWxlIHRoZSBJbnRyb3NwZWN0b3IgaWdub3JlcyB0aGVzZSBmb3IgcmVmbGVjdGlvbiwKLQkJCQkvLyB0aGUgdHJ1dGggaXMgbW9zdCBwZW9wbGUgd2FudCB0aGVzZS4gU28gd2Ugd2lsbCBhZGQgdGhlbSBpbi4gQnV0IHNpbmNlIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgaXQKLQkJCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzIGFuZCBzdGlsbCBrZWVwIG9yZGVyLgotCQkJCS8vCi0JCQkJLy8gU3VwZXJ0eXBlcyB3aWxsIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmUgZW50cnkgZm9yIGNsYXNzZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJlIDAsIDEsIDIgb3IgbW9yZSBmb3IgaW50ZXJmYWNlcy4KLQkJCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJCWlmICghc3VwZXJUeXBlcy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gTm93IHdlIG5lZWQgdG8gbWVyZ2UgaW4gdGhlIHN1cGVycy4KLQkJCQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKGdldEphdmFDbGFzcygpKTsKLQkJCQkJLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgc3VwZXJ0eXBlLCB3ZSBjYW4gYWRkIHRvIHRoZSBhY3R1YWwgZXZlbnRzLCBlbHNlIHdlIHdpbGwgdXNlIHRoZSBsaW5rZWQgaGFzaHNldCBzbyB0aGF0Ci0JCQkJCS8vIHdlIGRvbid0IGFkZCBwb3NzaWJsZSBkdXBsaWNhdGVzIChlLmcuIElBIGV4dGVuZHMgSUIsSUMgYW5kIElCIGV4dGVuZHMgSUMuIEluIHRoaXMgY2FzZSB0aGVyZSB3b3VsZCBiZSBkdXBzCi0JCQkJCS8vIGJlY2F1c2UgSUIgd291bGQgY29udHJpYnV0ZSBJQydzIHRvbykuCi0JCQkJCUNvbGxlY3Rpb24gd29ya2luZ0FsbFByb3BlcnRpZXMgPSBzdXBlclR5cGVzLnNpemUoKSA9PSAxID8gKENvbGxlY3Rpb24pIGFsbFByb3BlcnRpZXMgOiBuZXcgTGlua2VkSGFzaFNldCgpOyAKLQkJCQkJLy8gV2Ugd2lsbCBub3cgbWVyZ2UgYXMgZGlyZWN0ZWQuCi0JCQkJCWJvb2xlYW4gbWVyZ2VBbGwgPSBiZCA9PSBudWxsIHx8IGJkLmlzTWVyZ2VTdXBlclByb3BlcnRpZXMoKTsKLQkJCQkJaWYgKCFtZXJnZUFsbCkgewotCQkJCQkJLy8gd2UgZG9uJ3QgdG8gd2FudCB0byBtZXJnZSBzdXBlciBwcm9wZXJ0aWVzLCBidXQgd2Ugc3RpbGwgbmVlZCBzdXBlciBub24tcHJvcGVydGllcyBvciBleHBsaWN0IG9uZXMuCi0JCQkJCQlpbnQgbGVuU1QgPSBzdXBlclR5cGVzLnNpemUoKTsKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCQkJTGlzdCBzdXBlcnMgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJCQkJCQlpbnQgbGVuID0gc3VwZXJzLnNpemUoKTsKLQkJCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgbGVuOyBpMSsrKSB7Ci0JCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgc3VwZXJzLmdldChpMSk7Ci0JCQkJCQkJCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKHApOwotCQkJCQkJCQlpZiAoIHBkID09IG51bGwgfHwgKHBkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhcGQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJCQkJCQl3b3JraW5nQWxsUHJvcGVydGllcy5hZGQocCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gV2Ugd2FudCB0byBtZXJnZSBhbGwuCQkJCQkKLQkJCQkJCS8vIEJlYW5JbmZvIGNvdWxkIG9mIGdpdmVuIHVzIHRoZSBub3QgbWVyZ2UgbGlzdC4gSWYgdGhlIGxpc3QgaXMgZW1wdHksIHRoZW4gd2UgYWNjZXB0IGFsbC4KLQkJCQkJCWlmIChiZCAhPSBudWxsICYmIGJkLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpKSkgewotCQkJCQkJCS8vIFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzLgotCQkJCQkJCS8vIEdldCB0aGUgbmFtZXMgaW50byBhIHNldCB0byBjcmVhdGUgYSBxdWljayBsb29rdXAuCi0JCQkJCQkJSGFzaFNldCBzdXBlclNldCA9IG5ldyBIYXNoU2V0KGJkLmdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gTm93IHdhbGsgYW5kIGFkZCBpbiBub24tYmVhbiBwcm9wZXJ0aWVzIChhbmQgYmVhbiBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBleHBsaWNpdGx5IGFkZGVkIGFuZCBub3QgbWVyZ2VhYmxlIChpLmUuIGRpZG4ndCBjb21lIHRocnUgYmVhbmluZm8pKSAKLQkJCQkJCQkvLyBhbmQgYWRkIHRob3NlIG5vdCBzcGVjaWZpY2FsbHkgY2FsbGVkIG91dCBieSBCZWFuSW5mbyBpbiB0aGUgbm90IGluaGVyaXRlZCBsaXN0LgotCQkJCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCQkJCUxpc3Qgc3VwZXJzID0gKChKYXZhQ2xhc3MpIHN1cGVyVHlwZXMuZ2V0KGkpKS5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCQkJCQkJCWludCBsZW4gPSBzdXBlcnMuc2l6ZSgpOwotCQkJCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgbGVuOyBpMSsrKSB7Ci0JCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHN1cGVycy5nZXQoaTEpOwotCQkJCQkJCQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IocCk7Ci0JCQkJCQkJCQlpZiAocGQgPT0gbnVsbCB8fCAocGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMICYmICFwZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKSB8fCAhc3VwZXJTZXQuY29udGFpbnMocGQuZ2V0TmFtZSgpKSkKLQkJCQkJCQkJCQl3b3JraW5nQWxsUHJvcGVydGllcy5hZGQocCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEJlYW5JbmZvIChvciByZWZsZWN0aW9uIGFsd2F5cyBkb2VzIHRoaXMpIGNhbGxlZCBvdXQgdGhhdCBhbGwgc3VwZXIgcHJvcGVydGllcyBhcmUgZ29vZAotCQkJCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCQkJCXdvcmtpbmdBbGxQcm9wZXJ0aWVzLmFkZEFsbCgoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbFByb3BlcnRpZXMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3b3JraW5nQWxsUHJvcGVydGllcyAhPSBhbGxQcm9wZXJ0aWVzKQotCQkJCQkJYWxsUHJvcGVydGllcy5hZGRBbGwod29ya2luZ0FsbFByb3BlcnRpZXMpOwkvLyBOb3cgY29weSBvdmVyIHRoZSBvcmRlcmVkIHN1cGVyIHByb3BlcnRpZXMuCi0JCQkJfQotCQkJCWFsbFByb3BlcnRpZXMuYWRkQWxsKGxvY2FsUHJvcGVydGllcyk7CQkJCQotCQkJCXN1cGVyQWRhcHRlci5zZXRBbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkKGZhbHNlKTsgLy8gTm93IGJ1aWx0LCBzbyByZXNldCB0byBub3QgY2hhbmdlZC4KLQkJCX0gZmluYWxseSB7Ci0JCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQkJaXNEb2luZ0FsbFByb3BlcnRpZXMgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFsbFByb3BlcnRpZXMuaXNFbXB0eSgpKSB7Ci0JCQlhbGxQcm9wZXJ0aWVzLnNocmluaygpOwotCQkJcmV0dXJuIG5ldyBFY29yZUVMaXN0LlVubW9kaWZpYWJsZUVMaXN0LkZhc3RDb21wYXJlKAotCQkJCWdldEphdmFDbGFzcygpLAotCQkJCW51bGwsCi0JCQkJYWxsUHJvcGVydGllcy5zaXplKCksCi0JCQkJYWxsUHJvcGVydGllcy5kYXRhKCkpOwotCQl9IGVsc2UKLQkJCXJldHVybiBFQ29sbGVjdGlvbnMuRU1QVFlfRUxJU1Q7Ci0JfQotCi0JLyoKLQkgKiBGaWxsIGluIHRoZSBwcm9wZXJ0eSB1c2luZyB0aGUgcHJvcCByZWNvcmQuIElmIHRoaXMgb25lIHRoYXQgc2hvdWxkIGhhdmUgbWVyZ2luZyBkb25lLCB0aGVuCi0JICogcmV0dXJuIHRoZSBQcm9wZXJ0eURlY29yYXRvciBzbyB0aGF0IGl0IGNhbiBoYXZlIHRoZSBQcm9wZXJ0eVJlY29yZCBtZXJnZWQgaW50byBpdC4gRWxzZQotCSAqIHJldHVybiBudWxsIGlmIG5vIG1lcmdpbmcuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5RGVjb3JhdG9yIGNhbGN1bGF0ZVByb3BlcnR5KFByb3BlcnR5UmVjb3JkIHByLCBib29sZWFuIGluZGV4ZWQpIHsKLQkJLy8gSWYgdGhpcyBpcyBhbiBpbmRleGVkIHByb3BlcnR5LCB0aGVuIGEgZmV3IGZpZWxkcyB3aWxsIG5vdCBiZSBzZXQgaW4gaGVyZSwgYnV0Ci0JCS8vIHdpbGwgaW5zdGVhZCBiZSBzZXQgYnkgdGhlIGNhbGN1bGF0ZUluZGV4ZWRQcm9wZXJ0eSwgd2hpY2ggd2lsbCBiZSBjYWxsZWQuCi0JCUphdmFIZWxwZXJzIHR5cGUgPSBwci5wcm9wZXJ0eVR5cGVOYW1lICE9IG51bGwgPyBVdGlsaXRpZXMuZ2V0SmF2YVR5cGUoTWFwSk5JVHlwZXMuZ2V0Rm9ybWFsVHlwZU5hbWUocHIucHJvcGVydHlUeXBlTmFtZSksIGdldEphdmFDbGFzcygpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpIDogbnVsbDsKLQotCQlpZiAoaW5kZXhlZCkgewotCQkJLy8gSWYgbm8gYXJyYXkgd3JpdGUgbWV0aG9kIGZvdW5kLCB0aGVuIHNlZSBpZiB0aGVyZSBpcyBhbiBpbmRleGVkIHdyaXRlIG1ldGhvZC4gSWYgdGhlcmUgaXMsIHRoZW4gaXQgaXMgY2hhbmdhYmxlLgotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCS8vIElmIG5vIGFycmF5IHR5cGUgZnJvbSBhYm92ZSwgY3JlYXRlIG9uZSBmcm9tIHRoZSBpbmRleGVkIHR5cGUgcHJveHkuIEFkZCAnW10nIHRvIHR1cm4gaXQgaW50byBhbiBhcnJheS4KLQkJCQl0eXBlID0gVXRpbGl0aWVzLmdldEphdmFUeXBlKE1hcEpOSVR5cGVzLmdldEZvcm1hbFR5cGVOYW1lKCgoSW5kZXhlZFByb3BlcnR5UmVjb3JkKSBwcikuaW5kZXhlZFByb3BlcnR5VHlwZU5hbWUpKyJbXSIsIGdldEphdmFDbGFzcygpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJcmV0dXJuIGNyZWF0ZVByb3BlcnR5KHByLm5hbWUsIGluZGV4ZWQsIHR5cGUpOyAvLyBBIHZhbGlkIHByb3BlcnR5IGRlc2NyaXB0b3IuCi0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbGwgaW4gdGhlIHByb3BlcnR5IGFuZCBpdHMgZGVjb3JhdG9yIHVzaW5nIHRoZSBwYXNzZWQgaW4gaW5mb3JtYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5RGVjb3JhdG9yIGNyZWF0ZVByb3BlcnR5KFN0cmluZyBuYW1lLCBib29sZWFuIGluZGV4ZWQsIEVDbGFzc2lmaWVyIHR5cGUpIHsKLQkJLy8gRmlyc3QgZmluZCBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcHJvcGVydHkgb2YgdGhpcyBuYW1lLCBhbmQgaWYgdGhlcmUgaXMsIGlzIHRoZSBQcm9wZXJ0eURlY29yYXRvcgotCQkvLyBtYXJrZWQgdG8gbm90IGFsbG93IG1lcmdpbmcgaW4gb2YgaW50cm9zcGVjdGlvbiByZXN1bHRzLgkJCi0JCUhhc2hNYXAgZXhpc3RpbmdMb2NhbHMgPSBnZXRQcm9wZXJ0aWVzTWFwKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwcm9wID0gbnVsbDsKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBudWxsOwotCQlPYmplY3QgcCA9IGV4aXN0aW5nTG9jYWxzLmdldChuYW1lKTsKLQkJaWYgKEJvb2xlYW4uRkFMU0UgPT0gcCkKLQkJCXJldHVybiBudWxsOyAvLyBXZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIG5hbWUsIGNhbid0IHByb2Nlc3MgaXQgYWdhaW4uCi0JCWlmIChwICE9IG51bGwpIHsKLQkJCS8vIFdlJ3ZlIGZvdW5kIG9uZSBvZiB0aGUgc2FtZSBuYW1lLiBXaGV0aGVyIHdlIG1vZGlmeSBpdCBvciB1c2UgaXQgYXMgaXMsIHdlIHB1dCBpbiBhCi0JCQkvLyBzcGVjaWFsIGR1bW15IGluIGl0cyBwbGFjZS4gVGhhdCBtYXJrcyB0aGF0IHdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIGl0IGFuZCBhY2NlcHRlZCBpdC4KLQkJCWV4aXN0aW5nTG9jYWxzLnB1dChuYW1lLCBCb29sZWFuLkZBTFNFKTsKLQotCQkJLy8gSWYgdGhlIGRlY29yYXRvciBmb3IgdGhpcyBlbnRyeSBzYXlzIG5vdCB0byBtZXJnZSB0aGVuIHJldHVybi4KLQkJCS8vIElmIHRoZXJlIGlzIG5vIFByb3BlcnR5RGVjb3JhdG9yLCB0aGVuIHdlIHdpbGwgbWVyZ2UuIElmIHRoZXkKLQkJCS8vIGRpZG4ndCB3YW50IHRvIG1lcmdlIHRoZW4gc2hvdWxkIG9mIGNyZWF0ZWQgb2YgcHJvcGVydHkgZGVjb3JhdG9yIGFuZCBzYWlkIG5vIG1lcmdlLgotCQkJcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcCk7Ci0JCQlpZiAocGQgIT0gbnVsbCAmJiAhcGQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXByb3AgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwOwotCQl9Ci0KLQkJLy8gTmVlZCB0byB0ZXN0IGlmIHRoaXMgaXMgYW4gaW1wbGljaXQgZGVjb3JhdG9yIGFuZCBpdCBpcyBub3Qgb2YgdGhlIAotCQkvLyBzYW1lIHR5cGUgKGkuZS4gaXMgaW5kZXhlZCBub3cgYnV0IHdhc24ndCBvciB2aXNhLXZlcnNhLCB0aGVuIHdlIG5lZWQKLQkJLy8gdG8gZ2V0IHJpZCBvZiB0aGUgZGVjb3JhdG9yIGFuZCByZWNyZWF0ZSBpdC4gSWYgaXQgaXMgbm90IGltcGxpY2l0LCB0aGVuCi0JCS8vIHdlIGhhdmUgdG8gdXNlIGl0IGFzIGlzIGJlY2F1c2UgdGhlIHVzZXIgc3BlY2lmaWVkLCBzbyBpdCB3b24ndCBiZWNvbWUKLQkJLy8gYW4gaW5kZXhlZCBpZiB0aGUgdXNlciBkaWQgbm90IGNyZWF0ZWQgaXQgYXMgYW4gaW5kZXgsIGFuZCB2aXNhLXZlcnNhLgotCQkvLyBBbHNvIGlmIGl0IGlzIGltcGxpY2l0LCB0aGVuIHdlIG5lZWQgdG8gdW5zZXQgY2VydGFpbiBmZWF0dXJlcyB0aGF0IG1heSBvZgotCQkvLyBiZWVuIHNldCBieSBhIHByZXZpb3VzIHJlZmxlY3Rpb24gd2hpY2ggaGFzIG5vdyBiZWNvbWUgaW50cm9zcGVjdGVkLgotCQkvLyBXaGVuIHJlZmxlY3RlZCB3ZSBzZXQgdGhlIGFjdHVhbCBmaWVsZHMgaW5zdGVhZCBvZiB0aGUgbGV0dGluZyBwcm94eSBkZXRlcm1pbmUgdGhlbS4KLQkJaWYgKHBkICE9IG51bGwpIHsKLQkJCWlmIChwZC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKSA9PSBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUwpIHsKLQkJCQkvLyBXZSBjYW4ndCBjaGFuZ2UgdGhlIHR5cGUgZm9yIGV4cGxpY2l0LgotCQkJCWluZGV4ZWQgPSBwZCBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKChpbmRleGVkICYmICEocGQgaW5zdGFuY2VvZiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpKSB8fCAoIWluZGV4ZWQgJiYgcGQgaW5zdGFuY2VvZiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpKSB7Ci0JCQkJCS8vIEl0IGlzIGltcGxpY2l0IGFuZCBvZiBhIGRpZmZlcmVudCB0eXBlLCBzbyBqdXN0IGdldCByaWQgb2YgaXQgYW5kIGxldCBpdCBiZSByZWNyZWF0ZWQgY29ycmVjdGx5LgotCQkJCQlwcm9wLmdldEVBbm5vdGF0aW9ucygpLnJlbW92ZShwZCk7Ci0JCQkJCXBkID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGQgIT0gbnVsbCkKLQkJCQlpZiAoaW5kZXhlZCkKLQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKChJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpIHBkKTsKLQkJCQllbHNlCi0JCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcihwZCk7Ci0JCX0KLQotCQlJbXBsaWNpdEl0ZW0gaW1wbGljaXQgPSBwZCA9PSBudWxsID8gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9MSVRFUkFMIDogcGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCWlmIChwcm9wID09IG51bGwpIHsKLQkJCS8vIFdlIHdpbGwgY3JlYXRlIGEgbmV3IHByb3BlcnR5LgotCQkJLy8gV2UgY2FuJ3QgaGF2ZSBhbiBpbXBsaWNpdCBmZWF0dXJlLCBidXQgYW4gZXhwbGljaXQgZGVjb3JhdG9yLgotCQkJZ2V0RmVhdHVyZXNMaXN0KCkuYWRkKHByb3AgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVSZWZlcmVuY2UoKSk7Ci0JCQlpbXBsaWNpdCA9IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTDsKLQkJfQotCi0JCXNldFByb3BlcnR5SUQobmFtZSwgcHJvcCk7Ci0JCXByb3Auc2V0TmFtZShuYW1lKTsKLQkJcHJvcC5zZXRUcmFuc2llbnQoZmFsc2UpOwotCQlwcm9wLnNldFZvbGF0aWxlKGZhbHNlKTsKLQotCQkvLyBDb250YWlubWVudCBhbmQgVW5zZXR0YWJsZSBpcyB0cmlja3kgZm9yIEVSZWZlcmVuY2VzLiBUaGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGV0aGVyIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLCBvciBpdCBkZWZhdWx0ZWQgdG8KLQkJLy8gZmFsc2UgYmVjYXVzZSBFQ29yZSBoYXMgbm90IG1hZGUgY29udGFpbm1lbnQvdW5zZXR0YWJsZSBhbiB1bnNldHRhYmxlIGZlYXR1cmUuIFNvIHdlIG5lZWQgdG8gaW5zdGVhZCB1c2UgdGhlIGFsZ29yaXRobSBvZiBpZiB3ZSBoZXJlIAotCQkvLyBjcmVhdGVkIHRoZSBmZWF0dXJlLCB0aGVuIHdlIHdpbGwgYnkgZGVmYXVsdCBzZXQgaXQgdG8gY29udGFpbm1lbnQvdW5zZXR0YWJsZS4gSWYgaXQgd2FzIGNyZWF0ZWQgdGhyb3VnaCBkaWZmIG1lcmdlLCB0aGVuCi0JCS8vIHdlIHdpbGwgbGVhdmUgaXQgYWxvbmUuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgbWVyZ2UgZmlsZSB3cml0ZXIgdG8gc2V0IGNvbnRhaW5tZW50L3Vuc2V0dGFibGUgY29ycmVjdGx5LgotCQlpZiAoaW1wbGljaXQgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKSB7Ci0JCQlwcm9wLnNldFVuc2V0dGFibGUodHJ1ZSk7Ci0JCX0KLQkJcHJvcC5zZXRFVHlwZSh0eXBlKTsKLQkJaWYgKCFpbmRleGVkKSB7Ci0JCQlwcm9wLnNldExvd2VyQm91bmQoMCk7Ci0JCQlwcm9wLnNldFVwcGVyQm91bmQoMSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9wLnNldExvd2VyQm91bmQoMCk7Ci0JCQlwcm9wLnNldFVwcGVyQm91bmQoLTEpOwotCQkJcHJvcC5zZXRVbmlxdWUodHJ1ZSk7Ci0JCX0KLQotCQkvLyBOb3cgY3JlYXRlL2ZpbGwgaW4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIGl0LgotCQkvLyBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSB0aGVuIHdlCi0JCS8vIHdpbGwgdXNlIGl0LiBUaGlzIGFsbG93cyBtZXJnaW5nIHdpdGggYmVhbmZpbmZvLgkJCi0JCWlmIChwZCA9PSBudWxsKSB7Ci0JCQlwZCA9Ci0JCQkJKCFpbmRleGVkKQotCQkJCQk/IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoKQotCQkJCQk6IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCk7Ci0JCQlwZC5zZXRJbXBsaWNpdERlY29yYXRvckZsYWcoaW1wbGljaXQpOwotCQkJcHJvcC5nZXRFQW5ub3RhdGlvbnMoKS5hZGQocGQpOwotCQl9Ci0JCXJldHVybiBwZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBwcm9wCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5SUQoU3RyaW5nIG5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBwcm9wKSB7Ci0JCS8vIE5vdyBmaWxsIGl0IGluLiBOb3JtYWwgaWQgZm9yIGFuIGF0dHJpYnV0ZSBpcyAiY2xhc3NuYW1lLmF0dHJpYnV0ZW5hbWUiIGJ1dCB3ZSBjYW4ndCB1c2UgdGhhdAotCQkvLyBmb3IgdXMgYmVjYXVzZSB0aGF0IGZvcm1hdCBpcyB1c2VkIGJ5IEphdmEgQ29yZSBmb3IgYSBmaWVsZCBhbmQgdGhlcmUgd291bGQgYmUgY29uZnVzaW9uLgotCQkvLyBTbyB3ZSB3aWxsIHVzZSAnLycgaW5zdGVhZC4KLQkJKChYTUlSZXNvdXJjZSkgcHJvcC5lUmVzb3VyY2UoKSkuc2V0SUQocHJvcCwgZ2V0SmF2YUNsYXNzKCkuZ2V0TmFtZSgpICsgQmVhbmluZm9KYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5GRUFUVVJFICsgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBSZWZsZWN0IHRoZSBwcm9wZXJ0aWVzLiBUaGlzIHJlcXVpcmVzIGdvaW5nIHRocm91Z2ggbG9jYWwgbWV0aG9kcyBhbmQgbWF0Y2hpbmcgdGhlbSB1cCB0bwotCSAqIHNlZSBpZiB0aGV5IGFyZSBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWZsZWN0UHJvcGVydGllcygpIHsKLQkJLy8gSWYgd2UgYXJlIHNldCB0byBtZXJnZVN1cGVyVHlwZVByb3BlcnRpZXMsIHRoZW4gd2UgbmVlZCB0byBnZXQgdGhlIHN1cGVyIHByb3BlcnRpZXMuCi0JCS8vIFRoaXMgaXMgc28gdGhhdCBkdXBsaWNhdGUgYW55IGZyb20gc3VwZXIgdGhhdCB3ZSBmaW5kIGhlcmUuIFdoZW4gcmVmbGVjdGluZyB3ZSBkb24ndAotCQkvLyBhbGxvdyBkaXNjb3ZlcmVkIGR1cGxpY2F0ZXMgdW5sZXNzIHRoZXkgYXJlIGRpZmZlcmVudCB0eXBlcy4KLQkJLy8KLQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJLy8gSW50ZXJmYWNlcyBjYW4gaGF2ZSBtdWx0aXBsZSBleHRlbmRzLCB3aGlsZSB0aGUgSW50cm9zcGVjdG9yIGlnbm9yZXMgdGhlc2UgZm9yIHJlZmxlY3Rpb24sCi0JCS8vIHRoZSB0cnV0aCBpcyBtb3N0IHBlb3BsZSB3YW50IHRoZXNlLiBTbyB3ZSB3aWxsIGFkZCB0aGVtIGluLiBCdXQgc2luY2UgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBpdAotCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzLgotCQkvLwotCQkvLyBTdXBlcnR5cGVzIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBmb3IgY2xhc3NlcywgaXQgaXMgcG9zc2libGUgdG8gYmUgMCwgMSwgMiBvciBtb3JlIGZvciBpbnRlcmZhY2VzLgotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfUFJPUEVSVElFUyk7CQkKLQkJU2V0IHN1cGVycyA9IG5ldyBIYXNoU2V0KDUwKTsKLQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKGdldEphdmFDbGFzcygpKTsKLQkJaWYgKGJkID09IG51bGwgfHwgYmQuaXNNZXJnZVN1cGVyUHJvcGVydGllcygpKSB7Ci0JCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJaWYgKCFzdXBlclR5cGVzLmlzRW1wdHkoKSkgewotCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCUxpc3Qgc3VwZXJBbGwgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJCQkJaW50IGxlbiA9IHN1cGVyQWxsLnNpemUoKTsKLQkJCQkJZm9yIChpbnQgaTE9MDsgaTE8bGVuOyBpMSsrKSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBzdXBlckFsbC5nZXQoaTEpOwotCQkJCQkJc3VwZXJzLmFkZChzZi5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gSWYgYW55IG9mIHRoZSBjbGFzc2VzIGluIHRoZSBoaWVyYXJjaHkgYXJlIGJvdW5kLCB0aGVuIGFsbCByZWZsZWN0ZWQgcHJvcGVydGllcyBhcmUgY29uc2lkZXJlZCBib3VuZC4KLQkJYm9vbGVhbiBpc0JvdW5kID0gaXNEZWZhdWx0Qm91bmQoKTsKLQkJaWYgKCFpc0JvdW5kKSB7Ci0JCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFQWxsU3VwZXJUeXBlcygpOwotCQkJLy8gU3RhcnQgZnJvbSBlbmQgYmVjYXVzZSB0aGF0IHdpbGwgYmUgZmlyc3QgY2xhc3MgYWJvdmUgdGhlIHRoaXMgb25lLgotCQkJZm9yIChpbnQgaT1zdXBlclR5cGVzLnNpemUoKS0xOyAhaXNCb3VuZCAmJiBpPj0wOyBpLS0pIHsKLQkJCQlKYXZhQ2xhc3Mgc3ByID0gKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSk7Ci0JCQkJQmVhbmluZm9DbGFzc0FkYXB0ZXIgYmkgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoc3ByLCBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCQkJCS8vIFRoZXkgc2hvdWxkIGFsbCBiZSByZWZsZWN0ZWQsIGJ1dCBiZSBvbiBzYWZlIHNpZGUsIGNoZWNrIGlmIG51bGwuCi0JCQkJaWYgKGJpICE9IG51bGwpCi0JCQkJCWlzQm91bmQgPSBiaS5pc0RlZmF1bHRCb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJSGFzaE1hcCBwcm9wcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJSXRlcmF0b3IgaXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2QgbXRoZCA9IChNZXRob2QpIGl0ci5uZXh0KCk7Ci0JCQlpZiAobXRoZC5pc1N0YXRpYygpIHx8IG10aGQuaXNDb25zdHJ1Y3RvcigpKQotCQkJCWNvbnRpbnVlOyAvLyBTdGF0aWNzL2NvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZSBhcyBwcm9wZXJ0aWVzCi0JCQlpZiAobXRoZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBuYW1lID0gamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG10aGQuZ2V0TmFtZSgpLnN1YnN0cmluZygzKSk7Ci0JCQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCB8fCBzdXBlcnMuY29udGFpbnMobmFtZSkpCi0JCQkJCWNvbnRpbnVlOwkvLyBIYWQgZ2V0KC4uLikgYW5kIG5vdCBnZXRYWFgoLi4uKSBzbyBub3QgYSBnZXR0ZXIuIE9yIHRoaXMgaXMgdGhlIHNhbWUgbmFtZSBhcyBhIHN1cGVyLCBlaXRoZXIgd2F5IGlnbm9yZSBpdC4KLQkJCQlQcm9wZXJ0eUluZm8gcHJvcEluZm8gPSAoUHJvcGVydHlJbmZvKSBwcm9wcy5nZXQobmFtZSk7Ci0JCQkJaWYgKHByb3BJbmZvID09IG51bGwpIHsKLQkJCQkJcHJvcEluZm8gPSBuZXcgUHJvcGVydHlJbmZvKCk7Ci0JCQkJCWlmIChwcm9wSW5mby5zZXRHZXR0ZXIobXRoZCwgZmFsc2UpKQotCQkJCQkJcHJvcHMucHV0KG5hbWUsIHByb3BJbmZvKTsKLQkJCQl9IGVsc2UKLQkJCQkJcHJvcEluZm8uc2V0R2V0dGVyKG10aGQsIGZhbHNlKTsKLQkJCX0gZWxzZSBpZiAobXRoZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiaXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG5hbWUgPSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobXRoZC5nZXROYW1lKCkuc3Vic3RyaW5nKDIpKTsKLQkJCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwIHx8IHN1cGVycy5jb250YWlucyhuYW1lKSkKLQkJCQkJY29udGludWU7CS8vIEhhZCBpcyguLi4pIGFuZCBub3QgaXNYWFgoLi4uKSBzbyBub3QgYSBnZXR0ZXIuIE9yIHRoaXMgaXMgdGhlIHNhbWUgbmFtZSBhcyBhIHN1cGVyLCBlaXRoZXIgd2F5IGlnbm9yZSBpdC4KLQkJCQlQcm9wZXJ0eUluZm8gcHJvcEluZm8gPSAoUHJvcGVydHlJbmZvKSBwcm9wcy5nZXQobmFtZSk7Ci0JCQkJaWYgKHByb3BJbmZvID09IG51bGwpIHsKLQkJCQkJcHJvcEluZm8gPSBuZXcgUHJvcGVydHlJbmZvKCk7Ci0JCQkJCWlmIChwcm9wSW5mby5zZXRHZXR0ZXIobXRoZCwgdHJ1ZSkpCi0JCQkJCQlwcm9wcy5wdXQobmFtZSwgcHJvcEluZm8pOwotCQkJCX0gZWxzZQotCQkJCQlwcm9wSW5mby5zZXRHZXR0ZXIobXRoZCwgdHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKG10aGQuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbmFtZSA9IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShtdGhkLmdldE5hbWUoKS5zdWJzdHJpbmcoMykpOwotCQkJCWlmIChuYW1lLmxlbmd0aCgpID09IDAgfHwgc3VwZXJzLmNvbnRhaW5zKG5hbWUpKQotCQkJCQljb250aW51ZTsJLy8gSGFkIHNldCguLi4pIGFuZCBub3Qgc2V0WFhYKC4uLikgc28gbm90IGEgc2V0dGVyLiBPciB0aGlzIGlzIHRoZSBzYW1lIG5hbWUgYXMgYSBzdXBlciwgZWl0aGVyIHdheSBpZ25vcmUgaXQuCQkJCQotCQkJCVByb3BlcnR5SW5mbyBwcm9wSW5mbyA9IChQcm9wZXJ0eUluZm8pIHByb3BzLmdldChuYW1lKTsKLQkJCQlpZiAocHJvcEluZm8gPT0gbnVsbCkgewotCQkJCQlwcm9wSW5mbyA9IG5ldyBQcm9wZXJ0eUluZm8oKTsKLQkJCQkJaWYgKHByb3BJbmZvLnNldFNldHRlcihtdGhkKSkKLQkJCQkJCXByb3BzLnB1dChuYW1lLCBwcm9wSW5mbyk7Ci0JCQkJfSBlbHNlCi0JCQkJCXByb3BJbmZvLnNldFNldHRlcihtdGhkKTsKLQkJCX0KLQkJfQotCi0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBoYXNoIG1hcCBhbmQgY3JlYXRlIHRoZSBwcm9wZXJ0aWVzLgotCQlpdHIgPSBwcm9wcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOwotCQkJKChQcm9wZXJ0eUluZm8pIGVudHJ5LmdldFZhbHVlKCkpLmNyZWF0ZVByb3BlcnR5KChTdHJpbmcpIGVudHJ5LmdldEtleSgpLCBpc0JvdW5kKTsKLQkJfQotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9QUk9QRVJUSUVTKTsJCQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydHlJbmZvIHsKLQkJCi0JCXB1YmxpYyBFQ2xhc3NpZmllciB0eXBlLCBpbmRleGVkVHlwZTsKLQkJcHVibGljIGJvb2xlYW4gY29uc3RyYWluZWQ7Ci0JCXB1YmxpYyBNZXRob2QgZ2V0dGVyLCBzZXR0ZXIsIGluZGV4ZWRHZXR0ZXIsIGluZGV4ZWRTZXR0ZXI7Ci0KLQkJcHVibGljIGJvb2xlYW4gc2V0R2V0dGVyKE1ldGhvZCBnZXQsIGJvb2xlYW4gbXVzdEJlQm9vbGVhbikgewotCQkJTGlzdCBwYXJtcyA9IGdldC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQlpZiAocGFybXMuc2l6ZSgpID4gMSkKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpbXByb3BlciBudW1iZXIgb2YgcGFybXMuCi0JCQlib29sZWFuIGluZGV4ZWQgPSBwYXJtcy5zaXplKCkgPT0gMTsKLQkJCWlmIChpbmRleGVkICYmICEoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJpbnQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsgLy8gSW52YWxpZCAtIGEgcGFybSB0aGF0IGlzIG5vdCBhbiBpbnQgaXMgaW52YWxpZCBmb3IgaW5kZXhlZC4KLQkJCUVDbGFzc2lmaWVyIHJldFR5cGUgPSBnZXQuZ2V0UmV0dXJuVHlwZSgpOwotCQkJaWYgKHJldFR5cGUgPT0gbnVsbCB8fCByZXRUeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsgLy8gSW52YWxpZCAtIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlCi0JCQlpZiAobXVzdEJlQm9vbGVhbiAmJiAhcmV0VHlwZS5nZXROYW1lKCkuZXF1YWxzKCJib29sZWFuIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpdCBtdXN0IGJlIGEgYm9vbGVhbi4KLQkJCWlmIChpbmRleGVkKSB7Ci0JCQkJaWYgKGluZGV4ZWRUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKGluZGV4ZWRUeXBlICE9IHJldFR5cGUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIGluZm8uCi0JCQkJfQotCQkJCWlmICh0eXBlICE9IG51bGwgJiYgISgoKEphdmFIZWxwZXJzKSB0eXBlKS5pc0FycmF5KCkgJiYgKChBcnJheVR5cGUpIHR5cGUpLmdldENvbXBvbmVudFR5cGUoKSA9PSByZXRUeXBlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gaW5kZXhlZCB0eXBlIGRvZXNuJ3QgbWF0Y2ggY29tcG9uZW50IHR5cGUgb2YgYmFzZSB0eXBlLgotCQkJfSBlbHNlIHsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0eXBlICE9IHJldFR5cGUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIGluZm8uCi0JCQkJfQotCQkJCWlmIChpbmRleGVkVHlwZSAhPSBudWxsICYmICEoKChKYXZhSGVscGVycykgcmV0VHlwZSkuaXNBcnJheSgpICYmICgoQXJyYXlUeXBlKSByZXRUeXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gaW5kZXhlZFR5cGUpKQotCQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBXZSBoYWQgYSBwb3RlbnRpYWwgaW5kZXhlZCBhbmQgaGFkIG5vdCB5ZXQgZm91bmQgdGhlIHJlZ3VsYXIgdHlwZS4gV2UndmUgbm93IGZvdW5kCi0JCQkJCQkvLyB0aGUgcmVndWxhciB0eXBlLCBhbmQgaXQgaXMgbm90IGluZGV4ZWQuIFNvIGl0IHRha2VzIHByaW9yaXR5IGFuZCB3aWxsIHdpcGUgb3V0Ci0JCQkJCQkvLyB0aGUgaW5kZXhlZCB0eXBlLgotCQkJCQkJaW5kZXhlZEdldHRlciA9IG51bGw7Ci0JCQkJCQlpbmRleGVkU2V0dGVyID0gbnVsbDsKLQkJCQkJCWluZGV4ZWRUeXBlID0gbnVsbDsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpbmRleGVkIHR5cGUgZG9lc24ndCBtYXRjaCBjb21wb25lbnQgdHlwZSBvZiBiYXNlIHR5cGUgd2UgYWxyZWFkeSBoYXZlCi0JCQl9Ci0KLQkJCWlmIChpbmRleGVkKSB7Ci0JCQkJaWYgKGluZGV4ZWRHZXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBBbHJlYWR5IGhhdmUgYW4gaW5kZXhlZCBnZXR0ZXIuCi0JCQkJaW5kZXhlZEdldHRlciA9IGdldDsKLQkJCQlpbmRleGVkVHlwZSA9IHJldFR5cGU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChnZXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBBbHJlYWR5IGhhdmUgYSBnZXR0ZXIKLQkJCQlnZXR0ZXIgPSBnZXQ7Ci0JCQkJdHlwZSA9IHJldFR5cGU7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNldFNldHRlcihNZXRob2Qgc2V0KSB7Ci0JCQlMaXN0IHBhcm1zID0gc2V0LmdldFBhcmFtZXRlcnMoKTsKLQkJCWlmIChwYXJtcy5zaXplKCkgPiAyIHx8IHBhcm1zLnNpemUoKSA8IDEpCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gaW1wcm9wZXIgbnVtYmVyIG9mIHBhcm1zLgotCQkJYm9vbGVhbiBpbmRleGVkID0gcGFybXMuc2l6ZSgpID09IDI7Ci0JCQlpZiAoaW5kZXhlZCAmJiAhKChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMCkpLmdldEVUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiaW50IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBhIHBhcm0gdGhhdCBpcyBub3QgYW4gaW50IGlzIGludmFsaWQgZm9yIGluZGV4ZWQuCi0JCQlFQ2xhc3NpZmllciByZXRUeXBlID0gc2V0LmdldFJldHVyblR5cGUoKTsKLQkJCWlmIChyZXRUeXBlICE9IG51bGwgJiYgIXJldFR5cGUuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gbXVzdCBub3QgaGF2ZSBhIHJldHVybiB0eXBlCi0JCQlFQ2xhc3NpZmllciBwcm9wVHlwZSA9IG51bGw7Ci0JCQlpZiAoaW5kZXhlZCkgewotCQkJCXByb3BUeXBlID0gKChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMSkpLmdldEVUeXBlKCk7Ci0JCQkJaWYgKGluZGV4ZWRUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKGluZGV4ZWRUeXBlICE9IHByb3BUeXBlKQotCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBpbmZvLgotCQkJCX0KLQkJCQlpZiAodHlwZSAhPSBudWxsICYmICEoKChKYXZhSGVscGVycykgdHlwZSkuaXNBcnJheSgpICYmICgoQXJyYXlUeXBlKSB0eXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gcHJvcFR5cGUpKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpbmRleGVkIHR5cGUgZG9lc24ndCBtYXRjaCBjb21wb25lbnQgdHlwZSBvZiBiYXNlIHR5cGUsIG9yIGJhc2UgdHlwZSBub3QgYW4gYXJyYXkKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvcFR5cGUgPSAoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0eXBlICE9IHByb3BUeXBlKQotCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBpbmZvLgotCQkJCX0KLQkJCQlpZiAoaW5kZXhlZFR5cGUgIT0gbnVsbAotCQkJCQkmJiAhKCgoSmF2YUhlbHBlcnMpIHByb3BUeXBlKS5pc0FycmF5KCkgJiYgKChBcnJheVR5cGUpIHByb3BUeXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gaW5kZXhlZFR5cGUpKQotCQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBXZSBoYWQgYSBwb3RlbnRpYWwgaW5kZXhlZCBhbmQgaGFkIG5vdCB5ZXQgZm91bmQgdGhlIHJlZ3VsYXIgdHlwZS4gV2UndmUgbm93IGZvdW5kCi0JCQkJCQkvLyB0aGUgcmVndWxhciB0eXBlLCBhbmQgaXQgaXMgbm90IGluZGV4ZWQgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU28gaXQgdGFrZXMgcHJpb3JpdHkgYW5kIHdpbGwgd2lwZSBvdXQKLQkJCQkJCS8vIHRoZSBpbmRleGVkIHR5cGUuCi0JCQkJCQlpbmRleGVkR2V0dGVyID0gbnVsbDsKLQkJCQkJCWluZGV4ZWRTZXR0ZXIgPSBudWxsOwotCQkJCQkJaW5kZXhlZFR5cGUgPSBudWxsOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsgLy8gSW52YWxpZCAtIGluZGV4ZWQgdHlwZSBkb2Vzbid0IG1hdGNoIGNvbXBvbmVudCB0eXBlIG9mIGJhc2UgdHlwZSBmcm9tIHRoaXMgc2V0dGVyLgotCQkJfQotCi0JCQlpZiAoaW5kZXhlZCkgewotCQkJCWlmIChpbmRleGVkU2V0dGVyICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsgLy8gQWxyZWFkeSBoYXZlIGFuIGluZGV4ZWQgZ2V0dGVyLgotCQkJCWluZGV4ZWRTZXR0ZXIgPSBzZXQ7Ci0JCQkJaW5kZXhlZFR5cGUgPSBwcm9wVHlwZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHNldHRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEFscmVhZHkgaGF2ZSBhIGdldHRlcgotCQkJCXNldHRlciA9IHNldDsKLQkJCQl0eXBlID0gcHJvcFR5cGU7Ci0JCQl9Ci0KLQkJCWlmIChzZXQuZ2V0SmF2YUV4Y2VwdGlvbnMoKS5jb250YWlucyhVdGlsaXRpZXMuZ2V0SmF2YUNsYXNzKCJqYXZhLmJlYW5zLlByb3BlcnR5VmV0b0V4Y2VwdGlvbiIsIGdldEphdmFDbGFzcygpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnN0cmFpbmVkID0gdHJ1ZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlUHJvcGVydHkoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNCb3VuZCkgewotCQkJYm9vbGVhbiBpbmRleGVkID0gaW5kZXhlZFR5cGUgIT0gbnVsbDsKLQkJCWlmIChpbmRleGVkICYmIHR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIEEgcG90ZW50aWFsIGluZGV4ZWQsIGJ1dCBuZXZlciBmb3VuZCB0aGUgZ2V0dGVyL3NldHRlciBvZiB0aGUgcmVndWxhciB0eXBlLgotCi0JCQlQcm9wZXJ0eURlY29yYXRvciBwcm9wID0KLQkJCQlCZWFuaW5mb0NsYXNzQWRhcHRlci50aGlzLmNyZWF0ZVByb3BlcnR5KAotCQkJCQluYW1lLAotCQkJCQlpbmRleGVkLAotCQkJCQl0eXBlKTsKLQkJCWlmIChwcm9wID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBSZWZsZWN0aW9uIG5vdCB3YW50ZWQuCi0KLQkJCWluZGV4ZWQgPSBwcm9wIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yOyAvLyBJdCBjb3VsZCBvZiBiZWVuIGZvcmNlZCBiYWNrIHRvIG5vdCBpbmRleGVkIGlmIGV4cGxpY2l0bHkgc2V0LgotCi0JCQkvLyBBdCB0aGlzIHBvaW50IGluIHRpbWUgYWxsIGltcGxpY2l0IHNldHRpbmdzIGhhdmUgYmVlbiBjbGVhcmVkLiBUaGlzIGlzIGRvbmUgYmFjayBpbiBjcmVhdGVQcm9wZXJ0eSgpIG1ldGhvZCBhYm92ZS4KLQkJCS8vIFNvIG5vdyBhcHBseSByZWZsZWN0ZWQgc2V0dGluZ3Mgb24gdGhlIHByb3BlcnR5IGRlY29yYXRvci4gCi0JCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuc2V0UHJvcGVydGllcyhwcm9wLCBpc0JvdW5kLCBjb25zdHJhaW5lZCwgZ2V0dGVyLCBzZXR0ZXIpOwotCQkJaWYgKGluZGV4ZWQpCi0JCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LnNldFByb3BlcnRpZXMoKEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcikgcHJvcCwgaW5kZXhlZEdldHRlciwgaW5kZXhlZFNldHRlcik7Ci0KLQkJfQotCX07Ci0KLQkvKgotCSAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGludHJvc3BlY3Qgc28gdGhhdCBmbGFncyBhcmUgY29ycmVjdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmluYWxpemVPcGVyYXRpb25zKENoYW5nZURlc2NyaXB0aW9uIGNkKSB7Ci0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBsaXN0IGFuZCByZW1vdmUgdGhvc2UgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4KLQkJSXRlcmF0b3IgaXRyID0gZ2V0T3BlcmF0aW9uc0xpc3QoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJRU9wZXJhdGlvbiBhID0gKEVPcGVyYXRpb24pIGl0ci5uZXh0KCk7Ci0JCQlNZXRob2REZWNvcmF0b3IgbSA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IoYSk7Ci0JCQlpZiAoIW5ld29wZXJhdGlvbnMuY29udGFpbnMoYSkpIHsKLQkJCQkvLyBBIGNhbmRpZGF0ZSBmb3IgcmVtb3ZhbC4gSXQgaXMgaW4gdGhlIGxpc3QgYnV0IHdlIGRpZG4ndCBhZGQgaXQuIENoZWNrIHRvIHNlZSBpZiBpdCBvbmUgd2UgaGFkIGNyZWF0ZWQgaW4gdGhlIHBhc3QuCi0JCQkJLy8gSWYgbm8gbWV0aG9kZGVjb3JhdG9yLCB0aGVuIGtlZXAgaXQsIG5vdCBvbmUgb3Vycy4KLQkJCQlpZiAobSAhPSBudWxsKSB7Ci0JCQkJCUltcGxpY2l0SXRlbSBpbXBsaWNpdCA9IG0uZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQkJCWlmIChpbXBsaWNpdCAhPSBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUwpIHsKLQkJCQkJCW0uc2V0RU1vZGVsRWxlbWVudChudWxsKTsgLy8gUmVtb3ZlIGl0IGJlY2F1c2UgaXQgd2FzIGltcGxpY2l0LgotCQkJCQkJICgoSW50ZXJuYWxFT2JqZWN0KSBtKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7Ci0JCQkJCQlpZiAoaW1wbGljaXQgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKSB7Ci0JCQkJCQkJaXRyLnJlbW92ZSgpOyAvLyBUaGUgb3BlcmF0aW9uIHdhcyBpbXBsaWNpdCB0b28uCi0JCQkJCQkJICgoSW50ZXJuYWxFT2JqZWN0KSBhKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsJLy8gQXQgdGhpcyBwb2ludCB3ZSBubyBsb25nZXIgaGF2ZSBhIG1ldGhvZCBkZWNvcmF0b3IsIHNvIGdvIHRvIG5leHQuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChtICE9IG51bGwgJiYgY2QgIT0gbnVsbCkgewotCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGNhY2hlIGVudHJ5IGZvciB0aGlzIG1ldGhvZC4KLQkJCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuYnVpbGRDaGFuZ2UoY2QsIG0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgYmVoYXZpb3IgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIG10aGREZXNjLgotCSAqLwotCXByb3RlY3RlZCBNZXRob2REZWNvcmF0b3IgY2FsY3VsYXRlT3BlcmF0aW9uKE1ldGhvZFJlY29yZCByZWNvcmQpIHsKLQkJcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbihyZWNvcmQubmFtZSwgZm9ybUxvbmdOYW1lKHJlY29yZCksIG51bGwsIHJlY29yZCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgYmVoYXZpb3IgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIHBhc3NlZCBpbiBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRGVjb3JhdG9yIGNyZWF0ZU9wZXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGxvbmdOYW1lLCBNZXRob2QgbWV0aG9kLCBNZXRob2RSZWNvcmQgcmVjb3JkKSB7Ci0JCS8vIEZpcnN0IGZpbmQgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGJlaGF2aW9yIG9mIHRoaXMgbmFtZSBhbmQgbWV0aG9kIHNpZ25hdHVyZSAsIGFuZCBpZiB0aGVyZSBpcywgaXMgdGhlIE1ldGhvZERlY29yYXRvcgotCQkvLyBtYXJrZWQgdG8gbm90IGFsbG93IG1lcmdpbmcgaW4gb2YgaW50cm9zcGVjdGlvbiByZXN1bHRzLgotCQlIYXNoTWFwIGV4aXN0aW5nTG9jYWxzID0gZ2V0T3BlcmF0aW9uc01hcCgpOwotCQlFT3BlcmF0aW9uIG9wZXIgPSBudWxsOwotCQlNZXRob2REZWNvcmF0b3IgbWQgPSBudWxsOwotCQlPYmplY3QgYiA9IG51bGw7Ci0JCWlmIChuYW1lICE9IG51bGwpCi0JCQliID0gZXhpc3RpbmdMb2NhbHMuZ2V0KGxvbmdOYW1lKTsKLQkJZWxzZQotCQkJYiA9IGV4aXN0aW5nTG9jYWxzLmdldChsb25nTmFtZSk7Ci0JCQkKLQkJaWYgKGIgIT0gbnVsbCkgewotCQkJLy8gSWYgdGhlIGRlY29yYXRvciBmb3IgdGhpcyBlbnRyeSBzYXlzIG5vdCB0byBtZXJnZSB0aGVuIHJldHVybi4KLQkJCS8vIElmIHRoZXJlIGlzIG5vIGRlY29yYXRvciwgdGhlbiB3ZSB3aWxsIG1lcmdlLiBJZiB0aGV5IGRpZG4ndCB3YW50IHRvCi0JCQkvLyBtZXJnZSwgdGhlbiB0aGV5IHNob3VsZCBvZiBjcmVhdGVkIGEgZGVjb3JhdG9yIHdpdGggbm8gbWVyZ2Ugb24gaXQuCi0JCQltZCA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IoKEVPcGVyYXRpb24pIGIpOwotCQkJaWYgKG1kICE9IG51bGwgJiYgIW1kLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlvcGVyID0gKEVPcGVyYXRpb24pIGI7Ci0JCX0KLQotCQkvLyBOZWVkIHRvIGZpbmQgdGhlIG1ldGhvZCBhbmQgbWV0aG9kIGlkLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCS8vIE5vIG1ldGhvZCBzZW50LCBjcmVhdGUgYSBwcm94eSB0byBpdCBmcm9tIHRoZSByZWNvcmQuCi0JCQltZXRob2QgPSBCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuY3JlYXRlSmF2YU1ldGhvZFByb3h5KHJlY29yZC5tZXRob2RGb3JEZXNjcmlwdG9yKTsKLQkJfQotCi0JCUltcGxpY2l0SXRlbSBpbXBsaWNpdCA9IG1kID09IG51bGwgPyBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0xJVEVSQUwgOiBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUw7Ci0JCWlmIChvcGVyID09IG51bGwpIHsKLQkJCS8vIFdlIHdpbGwgY3JlYXRlIGEgbmV3IE1ldGhvZFByb3h5LgotCQkJb3BlciA9IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUHJveHkoKTsKLQkJCWdldE9wZXJhdGlvbnNMaXN0KCkuYWRkKG9wZXIpOwotCQkJaW1wbGljaXQgPSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUw7IAotCQl9CQkKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwkJCi0KLQkJLy8gTm93IGZpbGwgaXQgaW4uCi0JCWlmIChvcGVyIGluc3RhbmNlb2YgTWV0aG9kUHJveHkpCi0JCQkgKChNZXRob2RQcm94eSkgb3Blcikuc2V0TWV0aG9kKG1ldGhvZCk7Ci0JCXNldE1ldGhvZElEKG5hbWUsIG9wZXIpOwotCQlvcGVyLnNldE5hbWUobmFtZSk7Ci0JCW5ld29wZXJhdGlvbnMuYWRkKG9wZXIpOwotCi0JCS8vIE5vdyBjcmVhdGUvZmlsbCBpbiB0aGUgbWV0aG9kIGRlY29yYXRvciBmb3IgaXQuCi0JCS8vIElmIHRoZXJlIGFscmVhZHkgaXMgb25lIHRoZW4gd2UKLQkJLy8gd2lsbCB1c2UgaXQuIFRoaXMgYWxsb3dzIG1lcmdpbmcgd2l0aCBiZWFuaW5mby4JCQotCQlpZiAobWQgPT0gbnVsbCkgewotCQkJbWQgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZERlY29yYXRvcigpOwotCQkJbWQuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKGltcGxpY2l0KTsKLQkJCW9wZXIuZ2V0RUFubm90YXRpb25zKCkuYWRkKG1kKTsKLQkJfSBlbHNlCi0JCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuY2xlYXIobWQpOwotCQlyZXR1cm4gbWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gb3BlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RJRChTdHJpbmcgbmFtZSwgRU9wZXJhdGlvbiBvcGVyKSB7Ci0JCSgoWE1JUmVzb3VyY2UpIG9wZXIuZVJlc291cmNlKCkpLnNldElEKG9wZXIsIGdldEphdmFDbGFzcygpLmdldE5hbWUoKSArIEJlYW5pbmZvSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uQkVIQVZJT1IgKyBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmbGVjdE9wZXJhdGlvbnMoKSB7Ci0JCS8vIElmIHdlIGFyZSBzZXQgdG8gbWVyZ2VTdXBlclR5cGVCZWhhdmlvcnMsIHRoZW4gd2UgbmVlZCB0byBnZXQgdGhlIHN1cGVyIGJlaGF2aW9ycy4KLQkJLy8gVGhpcyBpcyBzbyB0aGF0IGR1cGxpY2F0ZSBhbnkgZnJvbSBzdXBlciB0aGF0IHdlIGZpbmQgaGVyZS4gV2hlbiByZWZsZWN0aW5nIHdlIGRvbid0Ci0JCS8vIGFsbG93IGRpc2NvdmVyZWQgZHVwbGljYXRlcyB1bmxlc3MgdGhleSBhcmUgZGlmZmVyZW50IHNpZ25hdHVyZXMuIFNvIGFsbCBzdXBlciBvcGVyYXRpb25zCi0JCS8vIHdpbGwgYmUgYWxsb3dlZCBhbmQgd2Ugd2lsbCBub3Qgb3ZlcnJpZGUgdGhlbS4KLQkJLy8KLQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJLy8gSW50ZXJmYWNlcyBjYW4gaGF2ZSBtdWx0aXBsZSBleHRlbmRzLCB3aGlsZSB0aGUgSW50cm9zcGVjdG9yIGlnbm9yZXMgdGhlc2UgZm9yIHJlZmxlY3Rpb24sCi0JCS8vIHRoZSB0cnV0aCBpcyBtb3N0IHBlb3BsZSB3YW50IHRoZXNlLiBTbyB3ZSB3aWxsIGFkZCB0aGVtIGluLiBCdXQgc2luY2UgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBpdAotCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzLgotCQkvLwotCQkvLyBTdXBlcnR5cGVzIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBmb3IgY2xhc3NlcywgaXQgaXMgcG9zc2libGUgdG8gYmUgMCwgMSwgMiBvciBtb3JlIGZvciBpbnRlcmZhY2VzLgotCQlTZXQgc3VwZXJzID0gbmV3IEhhc2hTZXQoNTApOwotCQlCZWFuRGVjb3JhdG9yIGJkID0gVXRpbGl0aWVzLmdldEJlYW5EZWNvcmF0b3IoZ2V0SmF2YUNsYXNzKCkpOwotCQlpZiAoYmQgPT0gbnVsbCB8fCBiZC5pc01lcmdlU3VwZXJNZXRob2RzKCkpIHsKLQkJCUxpc3Qgc3VwZXJUeXBlcyA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlpZiAoIXN1cGVyVHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJTGlzdCBzdXBlckFsbCA9ICgoSmF2YUNsYXNzKSBzdXBlclR5cGVzLmdldChpKSkuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCQkJaW50IGxlbiA9IHN1cGVyQWxsLnNpemUoKTsKLQkJCQkJZm9yIChpbnQgaTE9MDsgaTE8bGVuOyBpMSsrKSB7Ci0JCQkJCQlFT3BlcmF0aW9uIG9wID0gKEVPcGVyYXRpb24pIHN1cGVyQWxsLmdldChpMSk7Ci0JCQkJCQlzdXBlcnMuYWRkKGZvcm1Mb25nTmFtZShvcCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmF0b3IgaXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2QgbXRoZCA9IChNZXRob2QpIGl0ci5uZXh0KCk7Ci0JCQlpZiAobXRoZC5pc1N0YXRpYygpIHx8IG10aGQuaXNDb25zdHJ1Y3RvcigpKQotCQkJCWNvbnRpbnVlOyAvLyBTdGF0aWNzL2NvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZSBhcyBiZWhhdmlvcnMJCi0JCQlTdHJpbmcgbG9uZ05hbWUgPSBmb3JtTG9uZ05hbWUobXRoZCk7Ci0JCQkvLyBBZGQgaWYgc3VwZXIgbm90IGFscmVhZHkgY29udGFpbiBpdC4KLQkJCWlmICghc3VwZXJzLmNvbnRhaW5zKGxvbmdOYW1lKSkKLQkJCQljcmVhdGVPcGVyYXRpb24obnVsbCwgbG9uZ05hbWUsIG10aGQsIG51bGwpOwkvLyBEb24ndCBwYXNzIGEgbmFtZSwgdHJ5IHRvIGNyZWF0ZSBpdCBieSBuYW1lLCBvbmx5IHVzZSBJRCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG9mIHRoZSBzYW1lIG5hbWUuCi0JCX0KLQl9Ci0KLQkvKgotCSAqIG1lcmdlIGFsbCAgdGhlIEJlaGF2aW9ycyhpLmUuIHN1cGVydHlwZXMpCi0JICovCi0JcHJvdGVjdGVkIEJhc2ljRUxpc3QgYWxsT3BlcmF0aW9ucygpIHsKLQkJQmFzaWNFTGlzdCBqY0FsbE9wZXJhdGlvbnMgPSAoQmFzaWNFTGlzdCkgZ2V0SmF2YUNsYXNzKCkucHJpbUdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCUJlYW5pbmZvU3VwZXJBZGFwdGVyIHN1cGVyQWRhcHRlciA9Ci0JCQkoQmVhbmluZm9TdXBlckFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihnZXRKYXZhQ2xhc3MoKSwgQmVhbmluZm9TdXBlckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoamNBbGxPcGVyYXRpb25zICE9IG51bGwpIHsKLQkJCS8vIFNlZSBpZiBuZXcgb25lIHJlcXVpcmVkLgotCQkJaWYgKHN1cGVyQWRhcHRlciA9PSBudWxsIHx8ICFzdXBlckFkYXB0ZXIuaXNBbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkKCkpCi0JCQkJcmV0dXJuIGpjQWxsT3BlcmF0aW9uczsKLQkJCS8vIENhbid0IGdldCBzdXBlcmFkYXB0ZXIsIHNvIG11c3Qgbm90IGJlIGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHNvIHJldHVybiBjdXJyZW50IGxpc3QuIE9yIG5vIGNoYW5nZSByZXF1aXJlZC4gICAgICAgCQkKLQkJfQotCi0JCVVuaXF1ZUVMaXN0LkZhc3RDb21wYXJlIGFsbE9wZXJhdGlvbnMgPSBuZXcgVW5pcXVlRUxpc3QuRmFzdENvbXBhcmUoKSB7Ci0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKiAKLQkJCSAqIEBzaW5jZSAxLjEuMAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIE9iamVjdFtdIG5ld0RhdGEoaW50IGNhcGFjaXR5KSB7Ci0JCQkJcmV0dXJuIG5ldyBFT3BlcmF0aW9uW2NhcGFjaXR5XTsKLQkJCX0KLQkJfTsKLQkJYm9vbGVhbiBkb0FsbE9wZXJhdGlvbnMgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCS8vIElmIHdlIGFyZSBpbnRyb3NwZWN0aW5nLCBkb24ndCBkbyBhbGwgb3BlcmF0b2lucyBiZWNhdXNlIGl0IGlzIGFuIGludmFsaWQgbGlzdC4gSnVzdCByZXR1cm4gZW1wdHkgd2l0aG91dCByZXNldGluZyB0aGUgYWxsIG1vZGlmaWVkIGZsYWcuCi0JCQlkb0FsbE9wZXJhdGlvbnMgPSAhaXNEb2luZ0FsbE9wZXJhdGlvbnMgJiYgIWlzSW50cm9zcGVjdGluZyAmJiBpc1Jlc291cmNlQ29ubmVjdGVkKCk7Ci0JCQlpZiAoZG9BbGxPcGVyYXRpb25zKQotCQkJCWlzRG9pbmdBbGxPcGVyYXRpb25zID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChkb0FsbE9wZXJhdGlvbnMpIHsKLQkJCXRyeSB7Ci0JCQkJRUxpc3QgbG9jYWxPcGVyYXRpb25zID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RU9wZXJhdGlvbnMoKTsKLQkJCQkvLyBLbHVkZ2U6IEJlYW5JbmZvIHNwZWMgZG9lc24ndCBhZGRyZXNzIEludGVyZmFjZXMsIGJ1dCBzb21lIHBlb3BsZSB3YW50IHRvIHVzZSB0aGVtLgotCQkJCS8vIEludGVyZmFjZXMgY2FuIGhhdmUgbXVsdGlwbGUgZXh0ZW5kcywgd2hpbGUgdGhlIEludHJvc3BlY3RvciBpZ25vcmVzIHRoZXNlIGZvciByZWZsZWN0aW9uLAotCQkJCS8vIHRoZSB0cnV0aCBpcyBtb3N0IHBlb3BsZSB3YW50IHRoZXNlLiBTbyB3ZSB3aWxsIGFkZCB0aGVtIGluLiBCdXQgc2luY2UgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBpdAotCQkJCS8vIGdldHMgY29uZnVzaW5nLiBXZSBuZWVkIHRvIGxvb2sgZm9yIGR1cHMgZnJvbSB0aGUgc3VwZXIgdHlwZXMgYW5kIHN0aWxsIGtlZXAgb3JkZXIuCi0JCQkJLy8KLQkJCQkvLyBTdXBlcnR5cGVzIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBmb3IgY2xhc3NlcywgaXQgaXMgcG9zc2libGUgdG8gYmUgMCwgMSwgMiBvciBtb3JlIGZvciBpbnRlcmZhY2VzLgotCQkJCUxpc3Qgc3VwZXJUeXBlcyA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlclR5cGVzKCk7Ci0JCQkJaWYgKCFzdXBlclR5cGVzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBOb3cgd2UgbmVlZCB0byBtZXJnZSBpbiB0aGUgc3VwZXJzLgotCQkJCQlCZWFuRGVjb3JhdG9yIGJkID0gVXRpbGl0aWVzLmdldEJlYW5EZWNvcmF0b3IoZ2V0SmF2YUNsYXNzKCkpOwotCQkJCQkvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBzdXBlcnR5cGUsIHdlIGNhbiBhZGQgdG8gdGhlIGFjdHVhbCBldmVudHMsIGVsc2Ugd2Ugd2lsbCB1c2UgdGhlIGxpbmtlZCBoYXNoc2V0IHNvIHRoYXQKLQkJCQkJLy8gd2UgZG9uJ3QgYWRkIHBvc3NpYmxlIGR1cGxpY2F0ZXMgKGUuZy4gSUEgZXh0ZW5kcyBJQixJQyBhbmQgSUIgZXh0ZW5kcyBJQy4gSW4gdGhpcyBjYXNlIHRoZXJlIHdvdWxkIGJlIGR1cHMKLQkJCQkJLy8gYmVjYXVzZSBJQiB3b3VsZCBjb250cmlidXRlIElDJ3MgdG9vKS4KLQkJCQkJQ29sbGVjdGlvbiB3b3JraW5nQWxsT3BlcmF0aW9ucyA9IHN1cGVyVHlwZXMuc2l6ZSgpID09IDEgPyAoQ29sbGVjdGlvbikgYWxsT3BlcmF0aW9ucyA6IG5ldyBMaW5rZWRIYXNoU2V0KCk7IAotCQkJCQkvLyBXZSB3aWxsIG5vdyBtZXJnZSBhcyBkaXJlY3RlZC4KLQkJCQkJYm9vbGVhbiBtZXJnZUFsbCA9IGJkID09IG51bGwgfHwgYmQuaXNNZXJnZVN1cGVyTWV0aG9kcygpOwotCQkJCQlpZiAoIW1lcmdlQWxsKSB7Ci0JCQkJCQkvLyB3ZSBkb24ndCB0byB3YW50IHRvIG1lcmdlIHN1cGVyIG9wZXJhdGlvbnMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHN1cGVyIG5vbi1vcGVyYXRpb25zLgotCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQlmb3IgKGludCBpPTA7IGk8bGVuU1Q7IGkrKykgewotCQkJCQkJCUxpc3Qgc3VwZXJzID0gKChKYXZhQ2xhc3MpIHN1cGVyVHlwZXMuZ2V0KGkpKS5nZXRFQWxsT3BlcmF0aW9ucygpOwotCQkJCQkJCWludCBsZW4gPSBzdXBlcnMuc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGkxID0gMDsgaTEgPCBsZW47IGkxKyspIHsKLQkJCQkJCQkJRU9wZXJhdGlvbiBvID0gKEVPcGVyYXRpb24pIHN1cGVycy5nZXQoaTEpOwotCQkJCQkJCQlNZXRob2REZWNvcmF0b3IgbWQgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kRGVjb3JhdG9yKG8pOwotCQkJCQkJCQlpZiAobWQgPT0gbnVsbCB8fCAobWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMICYmICFtZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKSkKLQkJCQkJCQkJCXdvcmtpbmdBbGxPcGVyYXRpb25zLmFkZChvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBXZSB3YW50IHRvIG1lcmdlIGFsbC4KLQkJCQkJCS8vIEJlYW5JbmZvIGNvdWxkIG9mIGdpdmVuIHVzIHRoZSBkb24ndCBtZXJnZSBsaXN0LiBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgdGhlbiB3ZSBhY2NlcHQgYWxsLgotCQkJCQkJaWYgKGJkICE9IG51bGwgJiYgYmQuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRNZXRob2ROYW1lcygpKSkgewotCQkJCQkJCS8vIFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzLgotCQkJCQkJCS8vIEdldCB0aGUgbmFtZXMgaW50byBhIHNldCB0byBjcmVhdGUgYSBxdWljayBsb29rdXAuCi0JCQkJCQkJSGFzaFNldCBzdXBlclNldCA9IG5ldyBIYXNoU2V0KGJkLmdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkpOwotCQkJCQkJCQotCQkJCQkJCS8vIE5vdyB3YWxrIGFuZCBhZGQgaW4gbm9uLWJlYW4gb3BlcmF0aW9ucyAoYW5kIGJlYW4gb3BlcmF0aW9ucyB0aGF0IHdlcmUgZXhwbGljaXRseSBhZGRlZCBhbmQgbm90IG1lcmdlYWJsZSAoaS5lLiBkaWRuJ3QgY29tZSB0aHJ1IGJlYW5pbmZvKSkgCi0JCQkJCQkJLy8gYW5kIGFkZCB0aG9zZSBub3Qgc3BlY2lmaWNhbGx5IGNhbGxlZCBvdXQgYnkgQmVhbkluZm8gbm90IG1lcmdlIGxpc3QuCi0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJTGlzdCBzdXBlcnMgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQkJCQkJCWludCBsZW4gPSBzdXBlcnMuc2l6ZSgpOwotCQkJCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgbGVuOyBpMSsrKSB7Ci0JCQkJCQkJCQlFT3BlcmF0aW9uIG8gPSAoRU9wZXJhdGlvbikgc3VwZXJzLmdldChpMSk7Ci0JCQkJCQkJCQlNZXRob2REZWNvcmF0b3IgbWQgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kRGVjb3JhdG9yKG8pOwotCQkJCQkJCQkJaWYgKG1kID09IG51bGwgfHwgKG1kLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhbWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJCQkJCQkJd29ya2luZ0FsbE9wZXJhdGlvbnMuYWRkKG8pOwotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJU3RyaW5nIGxvbmdOYW1lID0gZm9ybUxvbmdOYW1lKG8pOwotCQkJCQkJCQkJCWlmIChsb25nTmFtZSA9PSBudWxsIHx8ICFzdXBlclNldC5jb250YWlucyhsb25nTmFtZSkpCi0JCQkJCQkJCQkJCXdvcmtpbmdBbGxPcGVyYXRpb25zLmFkZChvKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJd29ya2luZ0FsbE9wZXJhdGlvbnMuYWRkQWxsKCgoSmF2YUNsYXNzKSBzdXBlclR5cGVzLmdldChpKSkuZ2V0RUFsbE9wZXJhdGlvbnMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3b3JraW5nQWxsT3BlcmF0aW9ucyAhPSBhbGxPcGVyYXRpb25zKQotCQkJCQkJYWxsT3BlcmF0aW9ucy5hZGRBbGwod29ya2luZ0FsbE9wZXJhdGlvbnMpOwkvLyBOb3cgY29weSBvdmVyIHRoZSBvcmRlcmVkIHN1cGVyIG9wZXJhdGlvbnMuCQkJCQkKLQkJCQl9Ci0JCQkJYWxsT3BlcmF0aW9ucy5hZGRBbGwobG9jYWxPcGVyYXRpb25zKTsJCQkJCi0JCQkJRVN1cGVyQWRhcHRlciBzYSA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlckFkYXB0ZXIoKTsKLQkJCQlzYS5zZXRBbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkKGZhbHNlKTsgLy8gTm93IGJ1aWx0LCBzbyByZXNldCB0byBub3QgY2hhbmdlZC4KLQkJCX0gZmluYWxseSB7Ci0JCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQkJaXNEb2luZ0FsbFByb3BlcnRpZXMgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlhbGxPcGVyYXRpb25zLnNocmluaygpOwotCQlyZXR1cm4gbmV3IEVjb3JlRUxpc3QuVW5tb2RpZmlhYmxlRUxpc3QuRmFzdENvbXBhcmUoCi0JCQlnZXRKYXZhQ2xhc3MoKSwKLQkJCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzX0VBbGxPcGVyYXRpb25zKCksCi0JCQlhbGxPcGVyYXRpb25zLnNpemUoKSwKLQkJCWFsbE9wZXJhdGlvbnMuZGF0YSgpKTsKLQotCX0KLQotCS8qCi0JICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gaW50cm9zcGVjdCBzbyB0aGF0IGZsYWdzIGFyZSBjb3JyZWN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBmaW5hbGl6ZUV2ZW50cyhDaGFuZ2VEZXNjcmlwdGlvbiBjZCkgewotCQkvLyBOb3cgZ28gdGhyb3VnaCB0aGUgbGlzdCBhbmQgcmVtb3ZlIHRob3NlIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQuCi0JCU1hcCBvbGRMb2NhbHMgPSBnZXRFdmVudHNNYXAoKTsKLQkJSXRlcmF0b3IgaXRyID0gZ2V0RXZlbnRzTGlzdCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhRXZlbnQgYSA9IChKYXZhRXZlbnQpIGl0ci5uZXh0KCk7Ci0JCQlFdmVudFNldERlY29yYXRvciBlID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGEpOwotCQkJT2JqZWN0IGFPbGQgPSBvbGRMb2NhbHMuZ2V0KGEuZ2V0TmFtZSgpKTsKLQkJCWlmIChhT2xkICE9IG51bGwgJiYgYU9sZCAhPSBCb29sZWFuLkZBTFNFKSB7Ci0JCQkJLy8gQSBjYW5kaWRhdGUgZm9yIHJlbW92YWwuIEl0IHdhcyBpbiB0aGUgb2xkIGxpc3QgYW5kIGl0IHdhcyBub3QgcHJvY2Vzc2VkLgotCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gZS5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCQkJaWYgKGltcGxpY2l0ICE9IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCkgewotCQkJCQkJZS5zZXRFTW9kZWxFbGVtZW50KG51bGwpOyAvLyBSZW1vdmUgaXQgYmVjYXVzZSBpdCB3YXMgaW1wbGljaXQuCi0JCQkJCQkoKEludGVybmFsRU9iamVjdCkgZSkuZVNldFByb3h5VVJJKEJBRF9VUkkpOwotCQkJCQkJaWYgKGltcGxpY2l0ID09IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCkgewotCQkJCQkJCWl0ci5yZW1vdmUoKTsgLy8gVGhlIGZlYXR1cmUgd2FzIGltcGxpY2l0IHRvby4KLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgYSkuZVNldFByb3h5VVJJKEJBRF9VUkkpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7CS8vIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3QgaGF2ZSBhIGRlY29yYXRvciBhbnkgbW9yZSwgc28gZG9uJ3QgYm90aGVyIGdvaW5nIG9uLgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZSAhPSBudWxsICYmIGNkICE9IG51bGwpIHsKLQkJCQkvLyBOb3cgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjYWNoZSBlbnRyeSBmb3IgdGhpcyBldmVudC4KLQkJCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuYnVpbGRDaGFuZ2UoY2QsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgZXZlbnQgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIGV2ZW50RGVzYy4KLQkgKi8KLQlwcm90ZWN0ZWQgRXZlbnRTZXREZWNvcmF0b3IgY2FsY3VsYXRlRXZlbnQoRXZlbnRTZXRSZWNvcmQgcmVjb3JkKSB7Ci0JCXJldHVybiBjcmVhdGVFdmVudChyZWNvcmQubmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgZXZlbnQgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIHBhc3NlZCBpbiBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRXZlbnRTZXREZWNvcmF0b3IgY3JlYXRlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQkJLy8gRmlyc3QgZmluZCBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGV2ZW50IG9mIHRoaXMgbmFtZSwgYW5kIGlmIHRoZXJlIGlzLCBpcyB0aGUgRXZlbnRTZXREZWNvcmF0b3IKLQkJLy8gbWFya2VkIHRvIG5vdCBhbGxvdyBtZXJnaW5nIGluIG9mIGludHJvc3BlY3Rpb24gcmVzdWx0cy4KLQkJSGFzaE1hcCBleGlzdGluZ0xvY2FscyA9IGdldEV2ZW50c01hcCgpOwotCQlKYXZhRXZlbnQgZXZlbnQgPSBudWxsOwotCQlFdmVudFNldERlY29yYXRvciBlZCA9IG51bGw7Ci0JCU9iamVjdCBiID0gZXhpc3RpbmdMb2NhbHMuZ2V0KG5hbWUpOwotCQlpZiAoQm9vbGVhbi5GQUxTRSA9PSBiKQotCQkJcmV0dXJuIG51bGw7IC8vIFdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZXZlbnQsIGNhbid0IHByb2Nlc3MgaXQgYWdhaW4uCQkJCi0JCWlmIChiICE9IG51bGwpIHsKLQkJCS8vIFdlJ3ZlIGZvdW5kIG9uZSBvZiB0aGUgc2FtZSBldmVudC4gV2hldGhlciB3ZSBtb2RpZnkgaXQgb3IgdXNlIGl0IGFzIGlzLCB3ZSBwdXQgaW4gYQotCQkJLy8gc3BlY2lhbCBkdW1teSBpbiBpdHMgcGxhY2UuIFRoYXQgbWFya3MgdGhhdCB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCBhbmQgYWNjZXB0ZWQgaXQuCi0JCQlleGlzdGluZ0xvY2Fscy5wdXQobmFtZSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJCS8vIElmIHRoZSBkZWNvcmF0b3IgZm9yIHRoaXMgZW50cnkgc2F5cyBub3QgdG8gbWVyZ2UgdGhlbiByZXR1cm4uCi0JCQkvLyBJZiB0aGVyZSBpcyBubyBkZWNvcmF0b3IsIHRoZW4gd2Ugd2lsbCBtZXJnZS4gSWYgdGhleSBkaWRuJ3Qgd2FudCB0bwotCQkJLy8gbWVyZ2UsIHRoZW4gdGhleSBzaG91bGQgb2YgY3JlYXRlZCBhIGRlY29yYXRvciB3aXRoIG5vIG1lcmdlIG9uIGl0LgotCQkJZWQgPSBVdGlsaXRpZXMuZ2V0RXZlbnRTZXREZWNvcmF0b3IoKEphdmFFdmVudCkgYik7Ci0JCQlpZiAoZWQgIT0gbnVsbCAmJiAhZWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWV2ZW50ID0gKEphdmFFdmVudCkgYjsKLQkJfQotCQkKLQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gZWQgPT0gbnVsbCA/IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTCA6IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTDsKLQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCS8vIFdlIHdpbGwgY3JlYXRlIGEgbmV3IEV2ZW50LgotCQkJZXZlbnQgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJlYW5FdmVudCgpOwotCQkJZ2V0RXZlbnRzTGlzdCgpLmFkZChldmVudCk7Ci0JCQlpbXBsaWNpdCA9IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTDsgLy8gQ2FuJ3QgaGF2ZSBhbiBpbXBsaWNpdCBmZWF0dXJlIGJ1dCBleHBsaWNpdCBkZWNvcmF0b3IuCi0JCX0KLQotCQlzZXRFdmVudElEKG5hbWUsIGV2ZW50KTsKLQkJZXZlbnQuc2V0TmFtZShuYW1lKTsKLQotCQkvLyBOb3cgY3JlYXRlIGluIHRoZSBldmVudCBkZWNvcmF0b3IgZm9yIGl0LgotCQkvLyBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSB0aGVuIHdlCi0JCS8vIHdpbGwgdXNlIGl0LiBUaGlzIGFsbG93cyBtZXJnaW5nIHdpdGggYmVhbmluZm8uCQkKLQkJaWYgKGVkID09IG51bGwpIHsKLQkJCWVkID0gQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFdmVudFNldERlY29yYXRvcigpOwotCQkJZWQuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKGltcGxpY2l0KTsKLQkJCWV2ZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlZCk7Ci0JCX0gZWxzZQotCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKGVkKTsKLQkJcmV0dXJuIGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGV2ZW50Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEV2ZW50SUQoU3RyaW5nIG5hbWUsIEphdmFFdmVudCBldmVudCkgewotCQkvLyBOb3cgZmlsbCBpdCBpbi4KLQkJKChYTUlSZXNvdXJjZSkgZXZlbnQuZVJlc291cmNlKCkpLnNldElEKGV2ZW50LCBnZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCkgKyBCZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLkVWRU5UICsgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVmbGVjdCB0aGUgZXZlbnRzLiBUaGlzIHJlcXVpcmVzIGdvaW5nIHRocm91Z2ggbG9jYWwgcHVibGljIG1ldGhvZHMgYW5kIGNyZWF0aW5nIGFuIAotCSAqIGV2ZW50IGZvciB0aGUgZGlzY292ZXJlZCBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEV2ZW50cygpIHsKLQkJLy8gSWYgd2UgYXJlIHNldCB0byBtZXJnZVN1cGVyVHlwZUV2ZW50cywgdGhlbiB3ZSBuZWVkIHRvIGdldCB0aGUgc3VwZXIgZXZlbnRzLgotCQkvLyBUaGlzIGlzIHNvIHRoYXQgZHVwbGljYXRlIGFueSBmcm9tIHN1cGVyIHRoYXQgd2UgZmluZCBoZXJlLiBXaGVuIHJlZmxlY3Rpbmcgd2UgZG9uJ3QKLQkJLy8gYWxsb3cgZGlzY292ZXJlZCBkdXBsaWNhdGVzLgotCQkvLwotCQkvLyBLbHVkZ2U6IEJlYW5JbmZvIHNwZWMgZG9lc24ndCBhZGRyZXNzIEludGVyZmFjZXMsIGJ1dCBzb21lIHBlb3BsZSB3YW50IHRvIHVzZSB0aGVtLgotCQkvLyBJbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuZHMsIHdoaWxlIHRoZSBJbnRyb3NwZWN0b3IgaWdub3JlcyB0aGVzZSBmb3IgcmVmbGVjdGlvbiwKLQkJLy8gdGhlIHRydXRoIGlzIG1vc3QgcGVvcGxlIHdhbnQgdGhlc2UuIFNvIHdlIHdpbGwgYWRkIHRoZW0gaW4uIEJ1dCBzaW5jZSB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIGl0Ci0JCS8vIGdldHMgY29uZnVzaW5nLiBXZSBuZWVkIHRvIGxvb2sgZm9yIGR1cHMgZnJvbSB0aGUgc3VwZXIgdHlwZXMuCi0JCS8vCi0JCS8vIFN1cGVydHlwZXMgd2lsbCBuZXZlciBiZSBtb3JlIHRoYW4gb25lIGVudHJ5IGZvciBjbGFzc2VzLCBpdCBpcyBwb3NzaWJsZSB0byBiZSAwLCAxLCAyIG9yIG1vcmUgZm9yIGludGVyZmFjZXMuCi0JCVNldCBzdXBlcnMgPSBuZXcgSGFzaFNldCg1MCk7Ci0JCUJlYW5EZWNvcmF0b3IgYmQgPSBVdGlsaXRpZXMuZ2V0QmVhbkRlY29yYXRvcihnZXRKYXZhQ2xhc3MoKSk7Ci0JCWlmIChiZCA9PSBudWxsIHx8IGJkLmlzTWVyZ2VTdXBlckV2ZW50cygpKSB7Ci0JCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJaWYgKCFzdXBlclR5cGVzLmlzRW1wdHkoKSkgewotCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCUxpc3Qgc3VwZXJBbGwgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbEV2ZW50cygpOwotCQkJCQlpbnQgbGVuID0gc3VwZXJBbGwuc2l6ZSgpOwotCQkJCQlmb3IgKGludCBpMT0wOyBpMTxsZW47IGkxKyspIHsKLQkJCQkJCUphdmFFdmVudCBzZSA9IChKYXZhRXZlbnQpIHN1cGVyQWxsLmdldChpMSk7Ci0JCQkJCQlzdXBlcnMuYWRkKHNlLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlIYXNoTWFwIGV2ZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWV2ZW50TGlzdGVuZXJDbGFzcyA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiamF2YS51dGlsLkV2ZW50TGlzdGVuZXIiLCBnZXRKYXZhQ2xhc3MoKSk7IC8vIEluaXRpYWxpemUsIG5lZWRlZCBmb3IgYnVpbGRpbmcgZXZlbnRpbmZvcy4gLy8kTk9OLU5MUy0xJAotCQl0b29NYW55RXhjZXB0aW9uQ2xhc3MgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmEudXRpbC5Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uIiwgZ2V0SmF2YUNsYXNzKCkpOyAvLyBJbml0aWFsaXplLCBuZWVkZWQgZm9yIGJ1aWxkaW5nIGV2ZW50aW5mb3MuIC8vJE5PTi1OTFMtMSQKLQkJSXRlcmF0b3IgaXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2QgbXRoZCA9IChNZXRob2QpIGl0ci5uZXh0KCk7Ci0JCQlpZiAobXRoZC5pc1N0YXRpYygpIHx8IG10aGQuaXNDb25zdHJ1Y3RvcigpKQotCQkJCWNvbnRpbnVlOyAvLyBTdGF0aWNzL2NvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZSBpbiBldmVudHMuCi0JCQlTdHJpbmcga2V5ID0gdmFsaWRFdmVudEFkZGVyKG10aGQpOwotCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJRXZlbnRJbmZvIGV2ZW50SW5mbyA9IChFdmVudEluZm8pIGV2ZW50cy5nZXQoa2V5KTsKLQkJCQlpZiAoZXZlbnRJbmZvID09IG51bGwpIHsKLQkJCQkJZXZlbnRJbmZvID0gbmV3IEV2ZW50SW5mbygpOwotCQkJCQlldmVudEluZm8uc2V0QWRkZXIobXRoZCk7Ci0JCQkJCWV2ZW50cy5wdXQoa2V5LCBldmVudEluZm8pOwotCQkJCX0gZWxzZQotCQkJCQlldmVudEluZm8uc2V0QWRkZXIobXRoZCk7Ci0JCQl9IGVsc2UgewotCQkJCWtleSA9IHZhbGlkRXZlbnRSZW1vdmUobXRoZCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJCUV2ZW50SW5mbyBldmVudEluZm8gPSAoRXZlbnRJbmZvKSBldmVudHMuZ2V0KGtleSk7Ci0JCQkJCWlmIChldmVudEluZm8gPT0gbnVsbCkgewotCQkJCQkJZXZlbnRJbmZvID0gbmV3IEV2ZW50SW5mbygpOwotCQkJCQkJZXZlbnRJbmZvLnNldFJlbW92ZXIobXRoZCk7Ci0JCQkJCQlldmVudHMucHV0KGtleSwgZXZlbnRJbmZvKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlldmVudEluZm8uc2V0UmVtb3ZlcihtdGhkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlldmVudExpc3RlbmVyQ2xhc3MgPSBudWxsOyAvLyBObyBsb25nZXIgbmVlZCBpdC4KLQotCQkvLyBOb3cgYWN0dWFsbHkgY3JlYXRlIHRoZSBldmVudHMuCi0JCUhhc2hTZXQgZXZlbnROYW1lcyA9IG5ldyBIYXNoU2V0KGV2ZW50cy5zaXplKCkpOyAvLyBTZXQgb2YgZm91bmQgZXZlbnQgbmFtZXMsIHRvIHByZXZlbnQgZHVwbGljYXRlcwotCQlJdGVyYXRvciBldnRJdHIgPSBldmVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZXZ0SXRyLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGV2ZW50TWFwID0gKE1hcC5FbnRyeSkgZXZ0SXRyLm5leHQoKTsKLQkJCUV2ZW50SW5mbyBlaSA9IChFdmVudEluZm8pIGV2ZW50TWFwLmdldFZhbHVlKCk7Ci0JCQlpZiAoZWkuaXNWYWxpZEluZm8oKSkgewotCQkJCVN0cmluZyBldmVudE5hbWUgPSBnZXRFdmVudE5hbWUoKFN0cmluZykgZXZlbnRNYXAuZ2V0S2V5KCkpOwotCQkJCWlmIChldmVudE5hbWVzLmNvbnRhaW5zKGV2ZW50TmFtZSkpCi0JCQkJCWNvbnRpbnVlOwkvLyBBbGVhZHkgY3JlYXRlZCBpdC4gKE5vdGU6IEludHJvc3BlY3RvciBhY3R1YWxseSB0YWtlcyBsYXN0IG9uZSBvdmVyIHByZXZpb3VzIGR1cHMsIGJ1dCB0aGUgb3JkZXIgaXMgdG90YWxseSB1bmRlZmluZWQsIHNvIGNob29zaW5nIGZpcnN0IGlzIGp1c3QgYXMgZ29vZCBvciBiYWQuCi0KLQkJCQlpZiAoc3VwZXJzLmNvbnRhaW5zKGV2ZW50TmFtZSkpCi0JCQkJCWNvbnRpbnVlOyAvLyBEb24ndCBvdmVycmlkZSBhIHN1cGVyIGV2ZW50LgotCi0JCQkJaWYgKGVpLmNyZWF0ZUV2ZW50KGV2ZW50TmFtZSkpCi0JCQkJCWV2ZW50TmFtZXMuYWRkKGV2ZW50TmFtZSk7IC8vIEl0IHdhcyB2YWxpZGx5IGNyZWF0ZWQuCi0JCQl9Ci0JCX0KLQotCQl0b29NYW55RXhjZXB0aW9uQ2xhc3MgPSBudWxsOyAvLyBObyBsb25nZXIgbmVlZCBpdC4KLQl9Ci0KLQkvKioKLQkgKiBtZXJnZSBhbGwgdGhlIEV2ZW50cyAoaS5lLiBzdXBlcnR5cGVzKQotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhbGxFdmVudHMoKSB7Ci0KLQkJRUxpc3QgamNBbGxFdmVudHMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRBbGxFdmVudHNHZW4oKTsKLQkJQmVhbmluZm9TdXBlckFkYXB0ZXIgc3VwZXJBZGFwdGVyID0KLQkJCShCZWFuaW5mb1N1cGVyQWRhcHRlcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKGdldEphdmFDbGFzcygpLCBCZWFuaW5mb1N1cGVyQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChqY0FsbEV2ZW50cyAhPSBudWxsKSB7Ci0JCQkvLyBTZWUgaWYgbmV3IG9uZSByZXF1aXJlZC4KLQkJCWlmIChzdXBlckFkYXB0ZXIgPT0gbnVsbCB8fCAhc3VwZXJBZGFwdGVyLmlzQWxsRXZlbnRzQ29sbGVjdGlvbk1vZGlmaWVkKCkpCi0JCQkJcmV0dXJuIGpjQWxsRXZlbnRzOwotCQkJLy8gQ2FuJ3QgZ2V0IHN1cGVyYWRhcHRlciwgc28gbXVzdCBub3QgYmUgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgc28gcmV0dXJuIGN1cnJlbnQgbGlzdC4gT3Igbm8gY2hhbmdlIHJlcXVpcmVkLiAgICAgICAJCQotCQl9Ci0KLQkJVW5pcXVlRUxpc3QuRmFzdENvbXBhcmUgYWxsRXZlbnRzID0gbmV3IFVuaXF1ZUVMaXN0LkZhc3RDb21wYXJlKCkgewotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICogCi0JCQkgKiBAc2luY2UgMS4xLjAKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCBPYmplY3RbXSBuZXdEYXRhKGludCBjYXBhY2l0eSkgewotCQkJCXJldHVybiBuZXcgSmF2YUV2ZW50W2NhcGFjaXR5XTsKLQkJCX0KLQkJfTsKLQkJCi0JCWJvb2xlYW4gZG9BbGxFdmVudHMgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCS8vIElmIHdlIGFyZSBpbnRyb3NwZWN0aW5nLCBkb24ndCBkbyBhbGwgcHJvcGVydGllcyBiZWNhdXNlIGl0IGlzIGFuIGludmFsaWQgbGlzdC4gSnVzdCByZXR1cm4gZW1wdHkgd2l0aG91dCByZXNldGluZyB0aGUgYWxsIG1vZGlmaWVkIGZsYWcuCi0JCQlkb0FsbEV2ZW50cyA9ICFpc0RvaW5nQWxsRXZlbnRzICYmICFpc0ludHJvc3BlY3RpbmcgJiYgaXNSZXNvdXJjZUNvbm5lY3RlZCgpOwotCQkJaWYgKGRvQWxsRXZlbnRzKQotCQkJCWlzRG9pbmdBbGxFdmVudHMgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGRvQWxsRXZlbnRzKSB7Ci0JCQl0cnkgewotCQkJCUVMaXN0IGxvY2FsRXZlbnRzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzKCk7Ci0JCQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJCQkvLyBJbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuZHMsIHdoaWxlIHRoZSBJbnRyb3NwZWN0b3IgaWdub3JlcyB0aGVzZSBmb3IgcmVmbGVjdGlvbiwKLQkJCQkvLyB0aGUgdHJ1dGggaXMgbW9zdCBwZW9wbGUgd2FudCB0aGVzZS4gU28gd2Ugd2lsbCBhZGQgdGhlbSBpbi4gQnV0IHNpbmNlIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgaXQKLQkJCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzIGFuZCBzdGlsbCBrZWVwIG9yZGVyLgotCQkJCS8vCi0JCQkJLy8gU3VwZXJ0eXBlcyB3aWxsIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmUgZW50cnkgZm9yIGNsYXNzZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJlIDAsIDEsIDIgb3IgbW9yZSBmb3IgaW50ZXJmYWNlcy4KLQkJCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJCWlmICghc3VwZXJUeXBlcy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gTm93IHdlIG5lZWQgdG8gbWVyZ2UgaW4gdGhlIHN1cGVycy4KLQkJCQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKGdldEphdmFDbGFzcygpKTsKLQkJCQkJLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgc3VwZXJ0eXBlLCB3ZSBjYW4gYWRkIHRvIHRoZSBhY3R1YWwgZXZlbnRzLCBlbHNlIHdlIHdpbGwgdXNlIHRoZSBsaW5rZWQgaGFzaHNldCBzbyB0aGF0Ci0JCQkJCS8vIHdlIGRvbid0IGFkZCBwb3NzaWJsZSBkdXBsaWNhdGVzIChlLmcuIElBIGV4dGVuZHMgSUIsSUMgYW5kIElCIGV4dGVuZHMgSUMuIEluIHRoaXMgY2FzZSB0aGVyZSB3b3VsZCBiZSBkdXBzCi0JCQkJCS8vIGJlY2F1c2UgSUIgd291bGQgY29udHJpYnV0ZSBJQydzIHRvbykuCi0JCQkJCUNvbGxlY3Rpb24gd29ya2luZ0FsbEV2ZW50cyA9IHN1cGVyVHlwZXMuc2l6ZSgpID09IDEgPyAoQ29sbGVjdGlvbikgYWxsRXZlbnRzIDogbmV3IExpbmtlZEhhc2hTZXQoKTsgCi0JCQkJCS8vIFdlIHdpbGwgbm93IG1lcmdlIGFzIGRpcmVjdGVkLgotCQkJCQlib29sZWFuIG1lcmdlQWxsID0gYmQgPT0gbnVsbCB8fCBiZC5pc01lcmdlU3VwZXJFdmVudHMoKTsKLQkJCQkJaWYgKCFtZXJnZUFsbCkgewotCQkJCQkJLy8gd2UgZG9uJ3QgdG8gd2FudCB0byBtZXJnZSBzdXBlciBldmVudHMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHN1cGVyIG5vbi1ldmVudHMgb3IgZXhwbGljaXQgb25lcy4KLQkJCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQlMaXN0IHN1cGVycyA9ICgoSmF2YUNsYXNzKSBzdXBlclR5cGVzLmdldChpKSkuZ2V0QWxsRXZlbnRzKCk7Ci0JCQkJCQkJaW50IGxlbiA9IHN1cGVycy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaTEgPSAwOyBpMSA8IGxlbjsgaTErKykgewotCQkJCQkJCQlKYXZhRXZlbnQgZSA9IChKYXZhRXZlbnQpIHN1cGVycy5nZXQoaTEpOwotCQkJCQkJCQlFdmVudFNldERlY29yYXRvciBlZCA9IFV0aWxpdGllcy5nZXRFdmVudFNldERlY29yYXRvcihlKTsKLQkJCQkJCQkJaWYgKGVkID09IG51bGwgfHwgKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhZWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJCQkJCQl3b3JraW5nQWxsRXZlbnRzLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBXZSB3YW50IHRvIG1lcmdlIGFsbC4JCQkJCQotCQkJCQkJLy8gQmVhbkluZm8gaGFzIGdpdmVuIHVzIHRoZSBub3QgbWVyZ2UgbGlzdC4gSWYgdGhlIGxpc3QgaXMgZW1wdHksIHRoZW4gd2UgYWNjZXB0IGFsbC4KLQkJCQkJCWlmIChiZCAhPSBudWxsICYmIGJkLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkRXZlbnROYW1lcygpKSkgewotCQkJCQkJCS8vIFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzLgotCQkJCQkJCS8vIEdldCB0aGUgbmFtZXMgaW50byBhIHNldCB0byBjcmVhdGUgYSBxdWljayBsb29rdXAuCi0JCQkJCQkJSGFzaFNldCBzdXBlclNldCA9IG5ldyBIYXNoU2V0KGJkLmdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gTm93IHdhbGsgYW5kIGFkZCBpbiBub24tYmVhbiBldmVudHMgKGFuZCBiZWFuIGV2ZW50cyB0aGF0IHdlcmUgZXhwbGljaXRseSBhZGRlZCBhbmQgbm90IG1lcmdlYWJsZSAoaS5lLiBkaWRuJ3QgY29tZSB0aHJ1IGJlYW5pbmZvKSkgCi0JCQkJCQkJLy8gYW5kIGFkZCB0aG9zZSBub3Qgc3BlY2lmaWNhbGx5IGNhbGxlZCBvdXQgYnkgQmVhbkluZm8uCi0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJTGlzdCBzdXBlcnMgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbEV2ZW50cygpOwotCQkJCQkJCQlpbnQgbGVuID0gc3VwZXJzLnNpemUoKTsKLQkJCQkJCQkJZm9yIChpbnQgaTEgPSAwOyBpMSA8IGxlbjsgaTErKykgewotCQkJCQkJCQkJSmF2YUV2ZW50IGUgPSAoSmF2YUV2ZW50KSBzdXBlcnMuZ2V0KGkxKTsKLQkJCQkJCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGUpOwotCQkJCQkJCQkJaWYgKGVkID09IG51bGwgfHwgKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhZWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkgfHwgIXN1cGVyU2V0LmNvbnRhaW5zKGVkLmdldE5hbWUoKSkpCi0JCQkJCQkJCQkJd29ya2luZ0FsbEV2ZW50cy5hZGQoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEJlYW5JbmZvIGNhbGxlZCBvdXQgdGhhdCBhbGwgc3VwZXIgZXZlbnRzIHNob3VsZCBiZSBhZGRlZCwgb3Igbm8gYmVhbmluZm8uCi0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJd29ya2luZ0FsbEV2ZW50cy5hZGRBbGwoKChKYXZhQ2xhc3MpIHN1cGVyVHlwZXMuZ2V0KGkpKS5nZXRBbGxFdmVudHMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3b3JraW5nQWxsRXZlbnRzICE9IGFsbEV2ZW50cykKLQkJCQkJCWFsbEV2ZW50cy5hZGRBbGwod29ya2luZ0FsbEV2ZW50cyk7CS8vIE5vdyBjb3B5IG92ZXIgdGhlIG9yZGVyZWQgc3VwZXIgZXZlbnRzLgotCQkJCX0KLQkJCQlhbGxFdmVudHMuYWRkQWxsKGxvY2FsRXZlbnRzKTsJCQkJCi0JCQkJc3VwZXJBZGFwdGVyLnNldEFsbEV2ZW50c0NvbGxlY3Rpb25Nb2RpZmllZChmYWxzZSk7IC8vIE5vdyBidWlsdCwgc28gcmVzZXQgdG8gbm90IGNoYW5nZWQuCi0JCQl9IGZpbmFsbHkgewotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlpc0RvaW5nQWxsRXZlbnRzID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGFsbEV2ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gRUNvbGxlY3Rpb25zLkVNUFRZX0VMSVNUOwotCQllbHNlIHsKLQkJCWFsbEV2ZW50cy5zaHJpbmsoKTsKLQkJCXJldHVybiBuZXcgRWNvcmVFTGlzdC5Vbm1vZGlmaWFibGVFTGlzdC5GYXN0Q29tcGFyZSgKLQkJCQlnZXRKYXZhQ2xhc3MoKSwKLQkJCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0FsbEV2ZW50cygpLAotCQkJCWFsbEV2ZW50cy5zaXplKCksCi0JCQkJYWxsRXZlbnRzLmRhdGEoKSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgSmF2YUNsYXNzIGV2ZW50TGlzdGVuZXJDbGFzcywgLy8gRXZlbnQgTGlzdGVuZXIgY2xhc3MuIE5lZWRlZCBmb3IgdmFsaWRhdGlvbi4KLQl0b29NYW55RXhjZXB0aW9uQ2xhc3M7IC8vIFRvbyBtYW55IGxpc3RlbmVycyBleGNlcHRpb24uCi0KLQkvKgotCSAqIFBhc3MgaW4gdGhlIGtleSwgaXQgd2lsbCBiZSB1c2VkIHRvIGZvcm0gdGhlIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFdmVudE5hbWUoU3RyaW5nIGtleSkgewotCQlyZXR1cm4ga2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZignOicpKTsKLQl9Ci0KLQkvKgkKLQkgKiBBbnN3ZXJzIGV2ZW50IGtleSBpZiB2YWxpZCwgbnVsbCBpZiBub3QgdmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZEV2ZW50QWRkZXIoTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JCWlmICghbmFtZS5zdGFydHNXaXRoKCJhZGQiKSB8fCAhbmFtZS5lbmRzV2l0aCgiTGlzdGVuZXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gbnVsbDsgLy8gTm90IHZhbGlkIGZvcm1hdCBmb3IgYW4gYWRkIGxpc3RlbmVyIG5hbWUuCi0KLQkJTGlzdCBwYXJtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWlmIChwYXJtcy5zaXplKCkgIT0gMSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnZhbGlkIC0gaW1wcm9wZXIgbnVtYmVyIG9mIHBhcm1zLgotCi0JCUVDbGFzc2lmaWVyIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlpZiAocmV0dXJuVHlwZSA9PSBudWxsIHx8ICFyZXR1cm5UeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7IC8vIEludmFsaWQgLSBtdXN0IGJlIHZvaWQgcmV0dXJuIHR5cGUuCi0KLQkJRUNsYXNzaWZpZXIgcGFybVR5cGUgPSAoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKTsKLQkJaWYgKCFCZWFuaW5mb0NsYXNzQWRhcHRlci50aGlzLmV2ZW50TGlzdGVuZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcm1UeXBlKSkKLQkJCXJldHVybiBudWxsOyAvLyBQYXJtIG11c3QgYmUgaW5oZXJpdCBmcm9tIEV2ZW50TGlzdGVuZXIKLQotCQkvLyBUaGlzIGlzIGEgdW5pcXVlIGNvbnRhaW5pbmcgZXZlbnQgbmFtZSBhbmQgbGlzdGVuZXIgdHlwZQotCQkvLyBUaGlzIGlzIHNvIHdlIGNhbiBoYXZlIGEgdW5pcXVlIGtleSBmb3IgdHdvIGV2ZW50cyB3aXRoIHRoZSBzYW1lCi0JCS8vIG5hbWUgYnV0IGRpZmZlcmVudCBsaXN0ZW5lciB0eXBlLiAoVGhpcyBtYXRjaGVzIEludHJvc3BlY3RvciBzbyB0aGF0IHdlIGFyZW4ndAotCQkvLyBjb21pbmcgdXAgd2l0aCBkaWZmZXJlbnQgcmVzdWx0cy4KLQkJcmV0dXJuIGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShuYW1lLnN1YnN0cmluZygzLCBuYW1lLmxlbmd0aCgpIC0gOCkpCi0JCQkrICc6JwotCQkJKyAoKEphdmFIZWxwZXJzKSBwYXJtVHlwZSkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCS8qCi0JICogQW5zd2VycyBldmVudCBrZXkgaWYgdmFsaWQsIG51bGwgaWYgbm90IHZhbGlkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRFdmVudFJlbW92ZShNZXRob2QgbWV0aG9kKSB7Ci0JCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJaWYgKCFuYW1lLnN0YXJ0c1dpdGgoInJlbW92ZSIpIHx8ICFuYW1lLmVuZHNXaXRoKCJMaXN0ZW5lciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBudWxsOyAvLyBOb3QgdmFsaWQgZm9ybWF0IGZvciBhIHJlbW92ZSBsaXN0ZW5lciBuYW1lLgotCi0JCUxpc3QgcGFybXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQlpZiAocGFybXMuc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm4gbnVsbDsgLy8gSW52YWxpZCAtIGltcHJvcGVyIG51bWJlciBvZiBwYXJtcy4KLQotCQlFQ2xhc3NpZmllciByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJaWYgKHJldHVyblR5cGUgPT0gbnVsbCB8fCAhcmV0dXJuVHlwZS5nZXROYW1lKCkuZXF1YWxzKCJ2b2lkIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOyAvLyBJbnZhbGlkIC0gbXVzdCBiZSB2b2lkIHJldHVybiB0eXBlLgotCi0JCUVDbGFzc2lmaWVyIHBhcm1UeXBlID0gKChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMCkpLmdldEVUeXBlKCk7Ci0JCWlmICghQmVhbmluZm9DbGFzc0FkYXB0ZXIudGhpcy5ldmVudExpc3RlbmVyQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJtVHlwZSkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gUGFybSBtdXN0IGJlIGluaGVyaXQgZnJvbSBFdmVudExpc3RlbmVyCi0KLQkJLy8gVGhpcyBpcyBhIHVuaXF1ZSBjb250YWluaW5nIGV2ZW50IG5hbWUgYW5kIGxpc3RlbmVyIHR5cGUKLQkJLy8gVGhpcyBpcyBzbyB3ZSBjYW4gaGF2ZSBhIHVuaXF1ZSBrZXkgZm9yIHR3byBldmVudHMgd2l0aCB0aGUgc2FtZQotCQkvLyBuYW1lIGJ1dCBkaWZmZXJlbnQgbGlzdGVuZXIgdHlwZS4gKFRoaXMgbWF0Y2hlcyBJbnRyb3NwZWN0b3Igc28gdGhhdCB3ZSBhcmVuJ3QKLQkJLy8gY29taW5nIHVwIHdpdGggZGlmZmVyZW50IHJlc3VsdHMpLgotCQlyZXR1cm4gamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKDYsIG5hbWUubGVuZ3RoKCkgLSA4KSkKLQkJCSsgJzonCi0JCQkrICgoSmF2YUhlbHBlcnMpIHBhcm1UeXBlKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Qm91bmQoKSB7Ci0JCWlmIChkZWZhdWx0Qm91bmQgPT0gbnVsbCkgewotCQkJLy8gSGF2ZW4ndCB5ZXQgZGVjaWRlZCBvbiBpdC4KLQkJCUl0ZXJhdG9yIG1ldGhvZHMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRQdWJsaWNNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJCWJvb2xlYW4gZm91bmRBZGQgPSBmYWxzZSwgZm91bmRSZW1vdmUgPSBmYWxzZTsKLQkJCXdoaWxlIChtZXRob2RzLmhhc05leHQoKSAmJiAoIWZvdW5kQWRkIHx8ICFmb3VuZFJlbW92ZSkpIHsKLQkJCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5uZXh0KCk7Ci0JCQkJaWYgKCJhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIi5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlMaXN0IHBhcm1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJCQkJaWYgKHBhcm1zLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQlKYXZhUGFyYW1ldGVyIHBhcm0gPSAoSmF2YVBhcmFtZXRlcikgcGFybXMuZ2V0KDApOwotCQkJCQkJaWYgKCJqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiLmVxdWFscygoKEphdmFIZWxwZXJzKSBwYXJtLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWZvdW5kQWRkID0gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoInJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUxpc3QgcGFybXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQkJCQlpZiAocGFybXMuc2l6ZSgpID09IDEpIHsKLQkJCQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMCk7Ci0JCQkJCQlpZiAoImphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciIuZXF1YWxzKCgoSmF2YUhlbHBlcnMpIHBhcm0uZ2V0RVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZm91bmRSZW1vdmUgPSB0cnVlOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlkZWZhdWx0Qm91bmQgPSAoZm91bmRBZGQgJiYgZm91bmRSZW1vdmUpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEJvdW5kLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRXZlbnRJbmZvIHsKLQkJCi0JCXB1YmxpYyBNZXRob2QgYWRkTGlzdGVuZXJNZXRob2Q7Ci0JCXB1YmxpYyBNZXRob2QgcmVtb3ZlTGlzdGVuZXJNZXRob2Q7Ci0KLQkJcHVibGljIHZvaWQgc2V0QWRkZXIoTWV0aG9kIGFkZE1ldGhvZCkgewotCQkJYWRkTGlzdGVuZXJNZXRob2QgPSBhZGRNZXRob2Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRSZW1vdmVyKE1ldGhvZCByZW1vdmVNZXRob2QpIHsKLQkJCXJlbW92ZUxpc3RlbmVyTWV0aG9kID0gcmVtb3ZlTWV0aG9kOwotCQl9Ci0KLQkJLy8gQW5zd2VyIHdoZXRoZXIgdGhpcyBpcyBhIHZhbGlkIGV2ZW50IGluZm8uCi0JCXB1YmxpYyBib29sZWFuIGlzVmFsaWRJbmZvKCkgewotCQkJcmV0dXJuIChhZGRMaXN0ZW5lck1ldGhvZCAhPSBudWxsICYmIHJlbW92ZUxpc3RlbmVyTWV0aG9kICE9IG51bGwpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY3JlYXRlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkID0gQmVhbmluZm9DbGFzc0FkYXB0ZXIudGhpcy5jcmVhdGVFdmVudChuYW1lKTsKLQkJCWlmIChlZCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsgLy8gUmVmbGVjdGlvbiBub3Qgd2FudGVkLgotCi0KLQkJCS8vIFNlZSBpZiB1bmljYXN0LgotCQkJYm9vbGVhbiB1bmljYXN0ID0gZmFsc2U7Ci0JCQlMaXN0IGV4Y2VwdGlvbnMgPSBhZGRMaXN0ZW5lck1ldGhvZC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQkJaW50IGxlbiA9IGV4Y2VwdGlvbnMuc2l6ZSgpOwotCQkJZm9yKGludCBpPTA7IGk8bGVuOyBpKyspIHsKLQkJCQlpZiAoZXhjZXB0aW9ucy5nZXQoaSkgPT0gQmVhbmluZm9DbGFzc0FkYXB0ZXIudGhpcy50b29NYW55RXhjZXB0aW9uQ2xhc3MpIHsKLQkJCQkJdW5pY2FzdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8vIFdlJ2xsIGxldCBsaXN0ZW5lciBtZXRob2RzIGdldCByZXRyaWV2ZWQgZHluYW1pY2FsbHkgd2hlbiBuZWVkZWQuCi0JCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuc2V0UHJvcGVydGllcyhlZCwgYWRkTGlzdGVuZXJNZXRob2QsIHJlbW92ZUxpc3RlbmVyTWV0aG9kLCB1bmljYXN0LCAoSmF2YUNsYXNzKSAoKEphdmFQYXJhbWV0ZXIpIGFkZExpc3RlbmVyTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkpLmdldEVUeXBlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE1hcmggdGhlIGZhY3RvcnkgYXMgc3RhbGUsIGJ1dCBsZWF2ZSB0aGUgb3ZlcnJpZGVzIGFsb25lLiBUaGV5IGFyZSBub3Qgc3RhbGUuCi0JICogQHBhcmFtIHN0YWxlCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrU3RhbGVGYWN0b3J5KFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHN0YWxlKSB7Ci0JCW1hcmtTdGFsZUZhY3Rvcnkoc3RhbGUsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogTWFyayB0aGlzIGZhY3RvcnkgYXMgdGhlIHN0YWxlIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGNsZWFyT3ZlcnJpZGRlcyBjbGVhciB0aGUgb3ZlcnJpZGVzIHRvby4gVGhleSBhcmUgc3RhbGUuCi0JICovCi0JcHVibGljIHZvaWQgbWFya1N0YWxlRmFjdG9yeShQcm94eUZhY3RvcnlSZWdpc3RyeSBzdGFsZSwgYm9vbGVhbiBjbGVhck92ZXJyaWRkZXMpIHsKLQkJaWYgKHN0YWxlRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkvLyBJdCdzIG5vdCBzdGFsZSBzbyBtYWtlIGl0IHN0YWxlLgotCQkJLy8gU28gdGhhdCBuZXh0IGFjY2VzcyB3aWxsIHJlLWludHJvc3BlY3QKLQkJCWRlZmF1bHRCb3VuZCA9IG51bGw7IC8vIFNvIHF1ZXJ5IG9uIG5leHQgcmVxdWVzdC4KLQkJCXN0YWxlRmFjdG9yeSA9IG5ldyBXZWFrUmVmZXJlbmNlKHN0YWxlKTsKLQotCQkJLy8gTmVlZCB0byBtYXJrIHRoZSBlc3VwZXJhZGFwdGVyIHRoYXQgdGhpbmdzIGhhdmUgY2hhbmdlZCBzbyB0aGF0IGFueSAKLQkJCS8vIHN1YnR5cGUgd2lsbCBrbm93IHRvIHJldXNlIHRoZSBwYXJlbnQgZm9yIGFueXRoaW5nIHRoYXQgcmVxdWlyZXMga25vd2luZyBwYXJlbnQgaW5mby4KLQkJCUFkYXB0ZXIgYSA9IEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoZ2V0VGFyZ2V0KCksIEVTdXBlckFkYXB0ZXIuY2xhc3MpOwotCQkJLy8gU2ltdWxhdGUgdGhhdCB0aGlzIG9iamVjdHMgc3VwZXIgaGFzIGNoYW5nZWQuIFRoaXMgd2lsbCBtYWtlIGFsbCBzdWJjbGFzc2VzCi0JCQkvLyB0aGluayBhYm91dCB0aGUgc3VwZXIgaGFzIGNoYW5nZWQgYW5kIG5leHQgcmV0cmlldmluZyBhbnl0aGluZyB0aGF0IGludm9sdmVzIHRoZQotCQkJLy8gc3VwZXIgd2lsbCBjYXVzZSBhIHJlYnVpbGQgdG8gb2NjdXIuCi0JCQlOb3RpZmljYXRpb24gbm90ZSA9Ci0JCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIGdldFRhcmdldCgpLCBOb3RpZmljYXRpb24uU0VULCBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1VQRVJfVFlQRVMsIG51bGwsIG51bGwpOwotCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQlhLm5vdGlmeUNoYW5nZWQobm90ZSk7Ci0JCQkvLyBEbyB0aGUgc2FtZSB3aXRoIEJlYW5pbmZvU3VwZXJBZGFwdGVyIHNvIHRoYXQgZXZlbnRzIGFsc28gd2lsbCBiZSByZWJ1aWx0LgotCQkJYSA9IEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoZ2V0VGFyZ2V0KCksIEJlYW5pbmZvU3VwZXJBZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCWlmIChhICE9IG51bGwpCi0JCQkJYS5ub3RpZnlDaGFuZ2VkKG5vdGUpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJbmVlZHNJbnRyb3NwZWN0aW9uID0gdHJ1ZTsKLQkJCQlpZiAoY2xlYXJPdmVycmlkZGVzKSB7Ci0JCQkJCXJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID0gQ0xFQVJfRVhURU5TSU9OUzsKLQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkgewotCQkJCQkJY2xhc3NFbnRyeS5tYXJrRGVsZXRlZCgpOwotCQkJCQkJY2xhc3NFbnRyeSA9IG51bGw7IC8vIEdldCBhIG5ldyBvbmUgbmV4dCB0aW1lLgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9ybSBhIGxvbmduYW1lIGZvciB0aGUgYWRka2V5IGZ1bmN0aW9uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZvcm1Mb25nTmFtZShFT3BlcmF0aW9uIGZlYXR1cmUpIHsKLQkJTWV0aG9kIG10aGQgPSBudWxsOwotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE1ldGhvZCkKLQkJCW10aGQgPSAoTWV0aG9kKSBmZWF0dXJlOwotCQllbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWV0aG9kUHJveHkpCi0JCQltdGhkID0gKChNZXRob2RQcm94eSkgZmVhdHVyZSkuZ2V0TWV0aG9kKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOyAvLyBEb24ndCBrbm93IHdoYXQgaXQgaXMuCi0KLQkJU3RyaW5nQnVmZmVyIGxvbmdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQlsb25nTmFtZS5hcHBlbmQoZmVhdHVyZS5nZXROYW1lKCkpOyAvLyBGZWF0dXJlIE5hbWUKLQkJbG9uZ05hbWUuYXBwZW5kKCc6Jyk7Ci0JCWxvbmdOYW1lLmFwcGVuZChtdGhkLmdldE5hbWUoKSk7IC8vIE1ldGhvZCBOYW1lCi0JCWxvbmdOYW1lLmFwcGVuZCgnKCcpOwotCQlMaXN0IHAgPSBtdGhkLmdldFBhcmFtZXRlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwLnNpemUoKTsgaSsrKSB7Ci0JCQlKYXZhUGFyYW1ldGVyIHBhcm0gPSAoSmF2YVBhcmFtZXRlcikgcC5nZXQoaSk7Ci0JCQlpZiAoaT4wKQotCQkJCWxvbmdOYW1lLmFwcGVuZCgnLCcpOwotCQkJbG9uZ05hbWUuYXBwZW5kKHBhcm0uZ2V0SmF2YVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGxvbmdOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogTW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gY2FuIGhhdmUgdGhlIHNhbWUgbmFtZS4gVG8gaWRlbnRpZnkgdGhlbSB1bmlxdWVseSwgdGhlIGxvbmcgbmFtZSBpcyBjcmVhdGVkLAotCSAqIHdoaWNoIGlzIGZvcm1lZCBmcm9tIHRoZSBuYW1lIGFuZCB0aGUgbWV0aG9kIHNpZ25hdHVyZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtTG9uZ05hbWUoTWV0aG9kUmVjb3JkIHJlY29yZCkgewotCQlTdHJpbmdCdWZmZXIgbG9uZ05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCWxvbmdOYW1lLmFwcGVuZChyZWNvcmQubmFtZSk7IC8vIEZlYXR1cmUgTmFtZQotCQlsb25nTmFtZS5hcHBlbmQoJzonKTsKLQkJbG9uZ05hbWUuYXBwZW5kKHJlY29yZC5tZXRob2RGb3JEZXNjcmlwdG9yLm1ldGhvZE5hbWUpOyAvLyBNZXRob2QgTmFtZQotCQlsb25nTmFtZS5hcHBlbmQoJygnKTsKLQkJU3RyaW5nW10gcCA9IHJlY29yZC5tZXRob2RGb3JEZXNjcmlwdG9yLnBhcmFtZXRlclR5cGVOYW1lczsKLQkJaWYgKHAgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpPjApCi0JCQkJCWxvbmdOYW1lLmFwcGVuZCgnLCcpOwotCQkJCWxvbmdOYW1lLmFwcGVuZChNYXBKTklUeXBlcy5nZXRGb3JtYWxUeXBlTmFtZShwW2ldKSk7Ci0JCQl9Ci0KLQkJcmV0dXJuIGxvbmdOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gSW4gY2FzZSBvZiByZW1vdmluZyBhZGFwdGVyLCBtYWtlIHN1cmUgd2UgYXJlIGZpcnN0IHJlbW92ZWQgZnJvbSB0aGUgZmFjdG9yeSBzbyBpdCBkb2Vzbid0IGtub3cgYWJvdXQgdXMgYW55bW9yZS4KLQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUikKLQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkucmVtb3ZlQWRhcHRlcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpICsgJygnICsgKGdldEphdmFDbGFzcygpICE9IG51bGwgPyBnZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCkgOiAiPyIpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9KYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzNiOTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotICogICRSQ1NmaWxlOiBCZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzggJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb247Ci0KLS8qKgotICogSmF2YSBSZWZsZWN0aW9uIEtleSBleHRlbnNpb24gdG8gcmV0cmlldmUga2V5cyBmb3IgYmVhbmluZm8gY3JlYXRpb25zLgotICogCi0gKiBIYW5kbGVzIGF0dHJpYnV0ZXMgYW5kIGJlaGF2aW9ycy4KLSAqIAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvciBSLiBMLiBLdWxwICAKLSAqLwotcHVibGljIGNsYXNzIEJlYW5pbmZvSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gaW1wbGVtZW50cyBJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gewotCQotCS8vIFRoZSBmb3JtYXQgb2YgdGhlIGtleXMgYXJlOgotCS8vIGJlaGF2aW9yczogICJjbGFzc25hbWUvYmVoYXZpb3IvYmVoYXZpb3JuYW1lIgotCS8vIHN0cnVjdHVyYWwgZmVhdHVyZXM6ICJjbGFzc25hbWUvZmVhdHVyZW5hbWUiCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgCi0JCUJFSEFWSU9SID0gIi9vcGVyYXRpb24vIiwJLy8gUGllY2UgaW4ga2V5IHRoYXQgaW5kaWNhdGVzIHRoaXMgaXMgYSBiZWhhdmlvci4gLy8kTk9OLU5MUy0xJAotCQlFVkVOVCA9ICIvZXZlbnQvIiwJCS8vIFBpZWNlIGluIGtleSB0aGF0IGluZGljYXRlcyB0aGlzIGlzIGFuIGV2ZW50LiAvLyROT04tTkxTLTEkCi0JCUZFQVRVUkUgPSAiLyI7CQkJLy8gUGllY2UgaW4ga2V5IHRoYXQgaW5kaWNhdGVzIHRoaXMgaXMgYW4gYXR0cmlidXRlLiAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogR2V0IHRoZSBvYmplY3QgZm9yIHRoaXMga2V5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBrZXksIElKYXZhUmVmbGVjdGlvbktleSByZWZsZWN0aW9uS2V5KSB7Ci0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJaW50IGliZWhhdmUgPSBrZXkuaW5kZXhPZihCRUhBVklPUik7Ci0JCQlpZiAoaWJlaGF2ZSA+IC0xKSB7Ci0JCQkJLy8gV2UgaGF2ZSBhIHBvc3NpYmxlIGJlaGF2aW9yLgotCQkJCVN0cmluZyBjbGFzc25hbWUgPSBrZXkuc3Vic3RyaW5nKDAsIGliZWhhdmUpOwotCQkJCWludCBpYmVoYXZlTmFtZSA9IGliZWhhdmUrQkVIQVZJT1IubGVuZ3RoKCk7Ci0JCQkJaWYgKGliZWhhdmVOYW1lIDwga2V5Lmxlbmd0aCgpKSB7Ci0JCQkJCUphdmFDbGFzcyBqYXZhY2xhc3MgPSBnZXRKYXZhQ2xhc3MocmVmbGVjdGlvbktleSwgY2xhc3NuYW1lKTsKLQkJCQkJaWYgKGphdmFjbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQlqYXZhY2xhc3MuZ2V0RU9wZXJhdGlvbnMoKTsJLy8gR2V0IHRoZSBsaXN0IGludHJvc3BlY3RlZCBhbmQgcG9wdWxhdGVkIGlmIG5vdCBhbHJlYWR5LgotCQkJCQkJcmV0dXJuIHJlZmxlY3Rpb25LZXkucHJpbUdldChrZXkpOwkvLyBJdCBzaG91bGQgbm93IGJlIHRoZXJlLCAKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGlldmVudCA9IGtleS5pbmRleE9mKEVWRU5UKTsKLQkJCQlpZiAoaWV2ZW50ID4gLTEpIHsKLQkJCQkJLy8gV2UgaGF2ZSBhIHBvc3NpYmxlIGV2ZW50LgotCQkJCQlTdHJpbmcgY2xhc3NuYW1lID0ga2V5LnN1YnN0cmluZygwLCBpZXZlbnQpOwotCQkJCQlpbnQgaWV2ZW50TmFtZSA9IGlldmVudCtFVkVOVC5sZW5ndGgoKTsKLQkJCQkJaWYgKGlldmVudE5hbWUgPCBrZXkubGVuZ3RoKCkpIHsKLQkJCQkJCUphdmFDbGFzcyBqYXZhY2xhc3MgPSBnZXRKYXZhQ2xhc3MocmVmbGVjdGlvbktleSwgY2xhc3NuYW1lKTsKLQkJCQkJCWlmIChqYXZhY2xhc3MgIT0gbnVsbCkgewotCQkJCQkJCWphdmFjbGFzcy5nZXRFdmVudHMoKTsJLy8gR2V0IHRoZSBsaXN0IGludHJvc3BlY3RlZCBhbmQgcG9wdWxhdGVkIGlmIG5vdCBhbHJlYWR5LgotCQkJCQkJCXJldHVybiByZWZsZWN0aW9uS2V5LnByaW1HZXQoa2V5KTsJLy8gSXQgc2hvdWxkIG5vdyBiZSB0aGVyZSwgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgaWZlYXR1cmUgPSBrZXkuaW5kZXhPZihGRUFUVVJFKTsKLQkJCQkJaWYgKGlmZWF0dXJlID4gLTEpIHsKLQkJCQkJCS8vIFdlIGhhdmUgYSBwb3NzaWJsZSBmZWF0dXJlLgotCQkJCQkJU3RyaW5nIGNsYXNzbmFtZSA9IGtleS5zdWJzdHJpbmcoMCwgaWZlYXR1cmUpOwotCQkJCQkJaW50IGlmZWF0dXJlTmFtZSA9IGlmZWF0dXJlK0ZFQVRVUkUubGVuZ3RoKCk7Ci0JCQkJCQlpZiAoaWZlYXR1cmVOYW1lIDwga2V5Lmxlbmd0aCgpKSB7Ci0JCQkJCQkJU3RyaW5nIGZlYXR1cmUgPSBrZXkuc3Vic3RyaW5nKGlmZWF0dXJlTmFtZSk7Ci0JCQkJCQkJSmF2YUNsYXNzIGphdmFjbGFzcyA9IGdldEphdmFDbGFzcyhyZWZsZWN0aW9uS2V5LCBjbGFzc25hbWUpOwotCQkJCQkJCWlmIChqYXZhY2xhc3MgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBUaGlzIGlzIGp1c3QgYSBoYWNrIHVudGlsIHdlIGNhbiBnZXQgSUQgc2l0dWF0aW9uIHN0cmFpZ2h0ZW5lZCBvdXQuCi0JCQkJCQkJCS8vIE5lZWQgdG8gY2F1c2UgaW50cm9zcGVjdGlvbiBvZiB0aGUgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcy4KLQkJCQkJCQkJamF2YWNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCQkJCQkJT2JqZWN0IHJlc3VsdCA9IHJlZmxlY3Rpb25LZXkucHJpbUdldChrZXkpOwkvLyBTZWUgaWYgaXQgbm93IGdvdCBhZGRlZCBhcyBhbiBpZC4KLQkJCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkvLyBXZWxsLCBpdCBjb3VsZCBvZiBiZWVuIGFkZGVkIGJ5IHRoZSBkaWZmIG1lcmdlLCB3aGljaCBhcyBvZiBub3cgY2FuJ3QgaGFuZGxlIGlkcy4KLQkJCQkJCQkJCS8vIFNvIHdlIHdpbGwgZmluZCBpdCB3aXRoaW4gdGhlIGF0dHJpYnV0ZXMvcmVmZXJlbmNlcy4KLQkJCQkJCQkJCXJlc3VsdCA9IGZpbmRGZWF0dXJlKGZlYXR1cmUsIGphdmFjbGFzcy5nZXRFUmVmZXJlbmNlcygpKTsKLQkJCQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCQkJCQlyZXN1bHQgPSBmaW5kRmVhdHVyZShmZWF0dXJlLCBqYXZhY2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKSk7CQkJCQkJCQkJCi0JCQkJCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQkJCQkJCQkJLy8gTmVlZCB0byBhZGQgaXQgYXMgYW4gaWQgc28gbmV4dCB0aW1lIHdvbid0IGNvbWUgdGhyb3VnaCBoZXJlLgotCQkJCQkJCQkJCSgoWE1JUmVzb3VyY2UpIGphdmFjbGFzcy5lUmVzb3VyY2UoKSkuc2V0SUQoKEVPYmplY3QpIHJlc3VsdCwga2V5KTsJLy8gU28gbmV4dCB0aW1lIGl0IHdpbGwgZmluZCBpdCBkaXJlY3RseS4KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZpbmRGZWF0dXJlKFN0cmluZyBmZWF0dXJlTmFtZSwgTGlzdCBmZWF0dXJlTGlzdCkgewotCQlJdGVyYXRvciBpdHIgPSBmZWF0dXJlTGlzdC5pdGVyYXRvcigpOwkJCi0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZU5hbWUuZXF1YWxzKGZlYXR1cmUuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiBmZWF0dXJlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKElKYXZhUmVmbGVjdGlvbktleSByZWZsZWN0aW9uS2V5LCBTdHJpbmcgY2xhc3NuYW1lKSB7Ci0JCU9iamVjdCBlY2xhc3MgPSByZWZsZWN0aW9uS2V5LnByaW1HZXQoY2xhc3NuYW1lKTsKLQkJaWYgKGVjbGFzcyA9PSBudWxsKSAKLQkJCWVjbGFzcyA9IHJlZmxlY3Rpb25LZXkuZ2V0SmF2YVR5cGUoY2xhc3NuYW1lKTsJLy8gTGV0IGl0IGNyZWF0ZSBpdC4KLQkJaWYgKGVjbGFzcyBpbnN0YW5jZW9mIEphdmFDbGFzcykKLQkJCXJldHVybiAoSmF2YUNsYXNzKSBlY2xhc3M7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb01vZGVsU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNjc4NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFNb2RlbExpc3RlbmVyOwotLyoqCi0gKiBUaGlzIGNsYXNzIGxpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIGphdmEgbW9kZWwgYW5kIGZsdXNocyB0aGUKLSAqIGFwcHJvcHJpYXRlIGNsYXNzIGludHJvc3BlY3Rpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIgZXh0ZW5kcyBKYXZhTW9kZWxMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgZkFkYXB0ZXJGYWN0b3J5OwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZlByb2plY3Q7IC8vIFRoZSBwcm9qZWN0IHRoaXMgbGlzdGVuZXIgaXMgb3BlbmVkIG9uLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIEJFQU5JTkZPQ09ORklHX1BBVEggPSBuZXcgUGF0aChCZWFuaW5mb05hdHVyZS5QX0JFQU5JTkZPX1NFQVJDSF9QQVRIKTsJLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBCZWFuaW5mb01vZGVsU3luY2hyb25pemVyKEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgYUZhY3RvcnksIElKYXZhUHJvamVjdCBhUHJvamVjdCkgewotCQlzdXBlcihFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJZkFkYXB0ZXJGYWN0b3J5ID0gYUZhY3Rvcnk7Ci0JCWZQcm9qZWN0ID0gYVByb2plY3Q7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjZ2V0SmF2YVByb2plY3QoKQotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBmUHJvamVjdDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjaXNBbHNvQ2xhc3NwYXRoQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fsc29DbGFzc3BhdGhDaGFuZ2UoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gcGF0aC5lcXVhbHMoQkVBTklORk9DT05GSUdfUEFUSCk7Ci0JfQotCQotCS8qKgotCSAqIFN0b3AgdGhlIHN5bmNocm9uaXplciBmcm9tIGxpc3RlbmluZyB0byBhbnkgbW9yZSBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BTeW5jaHJvbml6ZXIoYm9vbGVhbiBjbGVhclJlc3VsdHMpIHsKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5jbG9zZUFsbChjbGVhclJlc3VsdHMpOwotCX0KLQotCXB1YmxpYyBCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZkFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFQcm9qZWN0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChpc0luQ2xhc3NwYXRoKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgfHwgZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBmb3IgZGVsZXRlL2Nsb3NlL2FkZC9vcGVuIG9mIG1haW4gcHJvamVjdCBiZWNhdXNlIHRoZXJlIGlzIG11Y2ggbW9yZSB0aGF0IG5lZWRzIHRvCi0JCQkJLy8gYmUgZG9uZSBieSBCZWFuaW5mb05hdHVyZSBvbiBwcm9qZWN0IGNsb3NlL2RlbGV0ZSwgc28gbmF0dXJlIGxpc3RlbnMgZm9yIHRoaXMgYW5kIGRvZXMgdGhlIGFwcHJvcHJpYXRlIGNsZWFudXAuCQkJCi0JCQkJaWYgKCFlbGVtZW50LmVxdWFscyhmUHJvamVjdCkpIHsKLQkJCQkJLy8gSG93ZXZlciwgYWxsIG90aGVyIHByb2plY3RzIGFyZSByZXF1aXJlZCBwcm9qZWN0cyBhbmQgaWYgdGhleSBhcmUgZGVsZXRlZC9jbG9zZWQvYWRkZWQvb3BlbmVkIHdoZW4gbmVlZCB0byBkbwotCQkJCQkvLyBhIGZ1bGwgZmx1c2ggYmVjYXVzZSB3ZSBkb24ndCBrbm93IGFueSBvZiB0aGUgc3RhdGUsIHdoZXRoZXIgdGhleSBhcmUgc3RpbGwgdGhlcmUgb3Igbm90LgotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtBbGxTdGFsZSgpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKGlzQ2xhc3NwYXRoUmVzb3VyY2VDaGFuZ2UoZGVsdGEpKSB7Ci0JCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5tYXJrQWxsU3RhbGUoKTsgLy8gVGhlIC5jbGFzc3BhdGggZmlsZSAob3IgLmJlYW5pbmZvY29uZmlnKSBpdHNlbGYgaW4gU09NRSBERVBFTkRFTlQgUFJPSkVDVCBoYXMgY2hhbmdlZC4gCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKiBJZiBhIHdvcmtpbmcgY29weSwgdGhlbiBpZ25vcmUgaXQgYmVjYXVzZSB3ZSBkb24ndCBjYXJlIGFib3V0IGNoYW5nZXMgdW50aWwKLQkgKiB0aGV5IGFyZSBjb21taXR0ZWQuIEVsc2UsIGlmIHRoZSBDVSBoYXMgY2hhbmdlZCBjb250ZW50IHRoZW4gbWFyayBhbGwgb2YgdGhlCi0JICogdHlwZXMgaW4gdGhpcyBDVSAoc3VjaCBhcyBpbm5lciBjbGFzc2VzKSBhcyBzdGFsZS4KLQkgKiBJZiBpdCBpcyBub3QgYSBjb250ZW50IGNoYW5nZSB0aGVuIHByb2Nlc3MgdGhlIGNoaWxkcmVuLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEIDoKLQkJCQkvLyBBIGZpbGUgc2F2ZSBoYWQgb2NjdXJyZWQuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIGN1cnJlbnRseSB3b3JraW5nIGNvcHkgb3Igbm90LgotCQkJCS8vIEl0IG1lYW5zIHNvbWV0aGluZyBoYXMgY2hhbmdlZCB0byB0aGUgZmlsZSBvbiBkaXNrLCBidXQgZG9uJ3Qga25vdyB3aGF0LgotCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9SRVNPVVJDRSkgIT0gMCkgewotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtTdGFsZUludHJvc3BlY3Rpb25QbHVzSW5uZXIoZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChlbGVtZW50KSwgZmFsc2UpOwkvLyBGbHVzaCBldmVyeXRoaW5nLCBpbmNsdWRpbmcgaW5uZXIgY2xhc3Nlcy4KLQkJCQl9CQkJCQkJCi0JCQkJCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEOgotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEOgotCQkJCS8vIE5lZWQgdG8ga25vdyBmb3IgYWRkIGJlY2F1c2Ugd2Ugb3B0aW1pemUgdGhlIGJlYW5pbmZvIHN1Y2ggdGhhdCBvbmNlIGZvdW5kIGFzIHVuZGVmaW5lZCwgaXQgd29uJ3QKLQkJCQkvLyBpbnRyb3NwZWN0IGFnYWluIHVudGlsIHdlIG1hcmsgaXQgc3RhbGUuIFNvIHdlIG5lZWQgdG8gbWFyayBpdCBzdGFsZSB0byByZWZyZXNoIGl0LgotCQkJCQotCQkJCS8vIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRvdGFsbHkgcmVtb3ZlZCBvciBqdXN0IG1vdmVkIHNvbWV3aGVyZSBlbHNlLCB3ZSB3aWxsIGNsZWFyIG91dAotCQkJCS8vIGFkYXB0ZXIgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhIHJlbmFtZSB3aGljaCB3b3VsZCBiZSBhIGRpZmZlcmVudCBjbGFzcy4KLQkJCQkvLyBDdXJyZW50bHkgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBkZWxldGVkIG9yIGFkZGVkIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gZmluZCB0aGUgdHlwZXMgaW4gdGhlIHVuaXQgdG8gZmx1c2guCi0JCQkJLy8gU28gaW5zdGVhZCB3ZSBhc2sgZmFjdG9yeSB0byBmbHVzaCBhbGwgaXQgYW55IHRoYXQgc3RhcnQgd2l0aCBpdCBwbHVzIGZvciBpbm5lciBjbGFzc2VzLgkJCQkKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtTdGFsZUludHJvc3BlY3Rpb25QbHVzSW5uZXIoZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChlbGVtZW50KSwgdHJ1ZSk7CS8vIEZsdXNoIGV2ZXJ5dGhpbmcsIGluY2x1ZGluZyBpbm5lciBjbGFzc2VzLgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDbGFzc0ZpbGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKSB7Ci0JCQkvLyBJdCBkb2Vzbid0IG1hdHRlciBpZiB0b3RhbGx5IHJlbW92ZWQgb3IganVzdCBtb3ZlZCBzb21ld2hlcmUgZWxzZSwgd2Ugd2lsbCBjbGVhciBvdXQgYW5kIHJlbW92ZSB0aGUKLQkJCS8vIGFkYXB0ZXIgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhIHJlbmFtZSB3aGljaCB3b3VsZCBiZSBhIGRpZmZlcmVudCBjbGFzcy4KLQkJCS8vIEN1cnJlbnRseSB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGRlbGV0ZWQgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBmaW5kIHRoZSB0eXBlcyBpbiB0aGUgdW5pdCB0byByZW1vdmUuCi0JCQkvLyBTbyBpbnN0ZWFkIHdlIGFzayBmYWN0b3J5IHRvIHJlbW92ZSBhbGwgaXQgYW55IHRoYXQgc3RhcnQgd2l0aCBpdCBwbHVzIGZvciBpbm5lciBjbGFzc2VzLgotCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5tYXJrU3RhbGVJbnRyb3NwZWN0aW9uUGx1c0lubmVyKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCksIHRydWUpOwotCQkJcmV0dXJuOyAvLyBTaW5jZSB0aGUgY2xhc3NmaWxlIHdhcyByZW1vdmVkIHdlIGRvbid0IG5lZWQgdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW4gKGFjdHVhbGx5IHRoZSBjaGlsZHJlbiBsaXN0IHdpbGwgYmUgZW1wdHkKLQkJfQotCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7Ci0JCQlwcm9jZXNzRGVsdGEoY2hpbGRyZW5baWldKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsJCQotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUNsYXNzRmlsZSkpCi0JCQlyZXR1cm4gbmFtZTsJLy8gU2hvdWxkbid0IGJlIGhlcmUKLQkJCi0JCS8vIHJlbW92ZSBleHRlbnNpb24uCi0JCWludCBwZXJpb2ROZHggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChwZXJpb2ROZHggPT0gLTEpCi0JCQlyZXR1cm4gbmFtZTsJLy8gU2hvdWxkbid0IGJlIGhlcmUuIFRoZXJlIHNob3VsZCBiZSBhbiBleHRlbnNpb24KLQkJCQkJCi0JCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCVN0cmluZyBwYXJlbnROYW1lID0gZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlpZiAocGFyZW50TmFtZSA9PSBudWxsIHx8IHBhcmVudE5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXR5cGVOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgcGVyaW9kTmR4KTsgLy8gSW4gZGVmYXVsdCBwYWNrYWdlCi0JCWVsc2UKLQkJCXR5cGVOYW1lID0gcGFyZW50TmFtZSArICIuIiArIG5hbWUuc3Vic3RyaW5nKDAsIHBlcmlvZE5keCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCi0JCXJldHVybiB0eXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICogSWYgdGhlIGNsYXNzcGF0aCBoYXMgY2hhbmdlZCwgbWFyayBhbGwgYXMgc3RhbGUgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQKLQkgKiBoYXMgY2hhbmdlZC4gVGhpbmdzIHRoYXQgd2VyZSBpbiB0aGUgcGF0aCBtYXkgbm8gbG9uZ2VyIGJlIGluIHRoZSBwYXRoLCBvcgotCSAqIHRoZSBvcmRlciB3YXMgY2hhbmdlZCwgd2hpY2ggY291bGQgYWZmZWN0IHRoZSBpbnRyb3NwZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudFJvb3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGlzQ2xhc3NQYXRoQ2hhbmdlKGRlbHRhKSkKLQkJCWZBZGFwdGVyRmFjdG9yeS5tYXJrQWxsU3RhbGUoKTsKLQkJZWxzZQotCQkJc3VwZXIucHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChlbGVtZW50LCBkZWx0YSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRDoKLQkJCQlicmVhazsJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBvbiBhIG5ldyBwYWNrYWdlLiBJZiB0aGlzIHdhcyBmcm9tIGEgbmV3IGZyYWdyb290LCB3ZSB3b3VsZCByZWN5Y2xlIGFscmVhZHkuIE90aGVyd2lzZSwgaXQgd2lsbCBmaW5kIHRoaXMgcGFja2FnZSBvbiB0aGUgZmlyc3QgdXNlLgotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEOgotCQkJCWlmIChkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID09IDApCi0JCQkJCWZBZGFwdGVyRmFjdG9yeS5tYXJrQWxsU3RhbGUoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoZWxlbWVudCwgZGVsdGEpOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqIFNvbWV0aGluZyBhYm91dCB0aGUgdHlwZSBoYXMgY2hhbmdlZC4gSWYgaXQgd2FzIHJlbW92ZWQgKG5vdCBhIG1vdmUpLCB0aGVuIGNsb3NlIHRoZQotCSAqIGFkYXB0ZXIgdG9vLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVR5cGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKSB7Ci0JCQkvLyBDbG9zZSBpdCBvdXQuIERvZXNuJ3QgbWF0dGVyIGlmIG1vdmVkX3RvLCB0aGF0IHdvdWxkIGJlIGEgcmVuYW1lIHdoaWNoIHJlcXVpcmVzIGJyYW5kIG5ldyBjbGFzcy4KLQkJCS8vIFdlIGNhbid0IGFjdHVhbGx5IGdldCByaWQgb2YgdGhlIGJlYW5pbmZvIGFkYXB0ZXIgYmVjYXVzZSBpdCBtYXkgYmUgYXNrZWQgZm9yIGFnYWluCi0JCQkvLyBqdXN0IHRvIHNlZSBpZiBub3QgZGVmaW5lZC4gSXQgbWF5IGFsc28gY29tZSBiYWNrIGxhdGVyIGFuZCB3ZSB3YW50IHRvIGtub3cgYWJvdXQKLQkJCS8vIGl0IHRvIHJlY3ljbGUgdGhlIHZtLgotCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5tYXJrU3RhbGVJbnRyb3NwZWN0aW9uKGVsZW1lbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIHRydWUpOwkKLQkJfSBlbHNlCi0JCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtTdGFsZUludHJvc3BlY3Rpb24oZWxlbWVudC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgZmFsc2UpOyAvLyBKdXN0IG1hcmsgaXQgc3RhbGUKLQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiICIrZlByb2plY3QuZ2V0RWxlbWVudE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb05hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMjc4YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotICogICRSQ1NmaWxlOiBCZWFuaW5mb05hdHVyZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zOSAkICAkRGF0ZTogMjAwNS8xMC8yNiAxNDoyNDo1NiAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQuSmF2YUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvLkNvbnRhaW5lclBhdGhzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFYTUlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VIYW5kbGVyOwotCi0KLS8qKgotICogVGhlIGJlYW5pbmZvIG5hdHVyZS4gSXQgaXMgY3JlYXRlZCBmb3IgYSBwcm9qZWN0IGFuZCBob2xkcyB0aGUKLSAqIG5lY2Vzc2FyeSBpbmZvIGZvciBiZWFuaW5mbyB0byBiZSBwZXJmb3JtZWQgb24gYSBwcm9qZWN0LgotICovCi0KLXB1YmxpYyBjbGFzcyBCZWFuaW5mb05hdHVyZSBpbXBsZW1lbnRzIElQcm9qZWN0TmF0dXJlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRV9JRCA9IEJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklEICsgIi5CZWFuSW5mb05hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0JFQU5JTkZPX1NFQVJDSF9QQVRIID0gIi5iZWFuaW5mb0NvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgQ09ORklHX0lORk9fU0VTU0lPTl9LRVkgPSBuZXcgUXVhbGlmaWVkTmFtZShCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgIkNPTkZJR19JTkZPIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgQkVBTklORk9fQ09OVFJJQlVUT1JTX1NFU1NJT05fS0VZID0gbmV3IFF1YWxpZmllZE5hbWUoQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQsICJCRUFOSU5GT19DT05UUklCVVRPUlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQcm94eUZhY3RvcnlSZWdpc3RyeS5JUmVnaXN0cnlMaXN0ZW5lciByZWdpc3RyeUxpc3RlbmVyID0gbmV3IFByb3h5RmFjdG9yeVJlZ2lzdHJ5LklSZWdpc3RyeUxpc3RlbmVyKCkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeS5JUmVnaXN0cnlMaXN0ZW5lciNyZWdpc3RyeVRlcm1pbmF0ZWQoUHJveHlGYWN0b3J5UmVnaXN0cnkpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpc3RyeVRlcm1pbmF0ZWQoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJCW1hcmtBbGxTdGFsZSgpOwotCQl9OwotCX07Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJ1bnRpbWUgbmF0dXJlIGZvciB0aGUgcHJvamVjdCwgY3JlYXRlIGl0IGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5pbmZvTmF0dXJlIGdldFJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUocHJvamVjdCk7CS8vIE11c3QgZm9yY2UgSkFWQUVNRk5hdHVyZSBjcmVhdGlvbiBmaXJzdCBiZWZvcmUgd2UgdHJ5IHRvIGdldCBvdXJzLiBUaGVyZSBpcyBhIGNoaWNrZW4vZWdnIHByb2JsZW0gaWYgd2UgbGV0IG91ciBuYXR1cmUgdHJ5IHRvIGdldCBKYXZhRU1GTmF0dXJlIGR1cmluZyBzZXRQcm9qZWN0LgotCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoTkFUVVJFX0lEKSkKLQkJCXJldHVybiAoQmVhbmluZm9OYXR1cmUpIHByb2plY3QuZ2V0TmF0dXJlKE5BVFVSRV9JRCk7Ci0JCWVsc2UKLQkJCXJldHVybiBjcmVhdGVSdW50aW1lKHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHByb2plY3QgaGFzIGEgQmVhbkluZm8gcnVudGltZSB0dXJuZWQgb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGhhcyB0aGUgYSBCZWFuSW5mbyBydW50aW1lLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSdW50aW1lKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKE5BVFVSRV9JRCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGlzIGlzIGEgdmFsaWQgcHJvamVjdCBmb3IgYSBCZWFuaW5mbyBOYXR1cmUuIEl0IG11c3QgYmUKLQkgKiBhIEphdmFQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJ1bnRpbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQmVhbmluZm9OYXR1cmUgY3JlYXRlUnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZFByb2plY3QocHJvamVjdCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQlCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwKLQkJCQkJMCwKLQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5JTlRST1NQRUNUX0ZBSUxFRF9FWENfLCAKLQkJCQkJCW5ldyBPYmplY3RbXSB7IHByb2plY3QuZ2V0TmFtZSgpLCBCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5CZWFuaW5mb05hdHVyZV9JbnZhbGlkUHJvamVjdH0pLCAKLQkJCQkJbnVsbCkpOwotCi0JCWFkZE5hdHVyZVRvUHJvamVjdChwcm9qZWN0LCBOQVRVUkVfSUQpOwotCQlyZXR1cm4gKEJlYW5pbmZvTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShOQVRVUkVfSUQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsKLQlwcm90ZWN0ZWQgUHJveHlGYWN0b3J5UmVnaXN0cnkgZlJlZ2lzdHJ5OwotCXByb3RlY3RlZCBSZXNvdXJjZVNldCBqYXZhUlNldDsKLQlwcm90ZWN0ZWQgQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplciBmU3luY2hyb25pemVyOwotCXByb3RlY3RlZCBzdGF0aWMgQmVhbmluZm9KYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBmUmVmbGVjdGlvbktleUV4dGVuc2lvbjsKLQotCS8qKiAKLQkgKiBDb25maWd1cmVzIHRoZSBwcm9qZWN0IHdpdGggdGhpcyBuYXR1cmUuCi0JICogVGhpcyBpcyBjYWxsZWQgYnkgPGNvZGU+SVByb2plY3QuZ2V0TmF0dXJlPC9jb2RlPiBhbmQgc2hvdWxkIG5vdAotCSAqIGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLgotCSAqIFRoZSBuYXR1cmUgZXh0ZW5zaW9uIGlkIGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIG5hdHVyZXMgb24gdGhlIHByb2plY3QgYnkKLQkgKiA8Y29kZT5JUHJvamVjdC5nZXROYXR1cmU8L2NvZGU+LCBhbmQgbmVlZCBub3QgYmUgYWRkZWQgaGVyZS4KLQkgKgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqIAotCSAqIFJlbW92ZXMgdGhpcyBuYXR1cmUgZnJvbSB0aGUgcHJvamVjdCwgcGVyZm9ybWluZyBhbnkgcmVxdWlyZWQgZGVjb25maWd1cmF0aW9uLgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IDxjb2RlPklQcm9qZWN0LnJlbW92ZU5hdHVyZTwvY29kZT4gYW5kIHNob3VsZCBub3QKLQkgKiBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLQkgKiBUaGUgbmF0dXJlIGlkIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBuYXR1cmVzIG9uIHRoZSBwcm9qZWN0IGJ5Ci0JICogPGNvZGU+SVByb2plY3QucmVtb3ZlTmF0dXJlPC9jb2RlPiwgYW5kIG5lZWQgbm90IGJlIHJlbW92ZWQgaGVyZS4KLQkgKgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscy4gCi0JICovCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZVNoYXJlZFByb3BlcnR5KFBfQkVBTklORk9fU0VBUkNIX1BBVEgsIG51bGwpOwotCQljbGVhbnVwKHRydWUsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTaHV0ZG93biB0aGUgbmF0dXJlLiBDYWxsZWQgYnkgQmVhbkluZm9QbHVnaW4gdG8gdGVsbCB0aGUgbmF0dXJlIHRoYXQgdGhlIHBsdWdpbiBpcyBiZWluZyBzaHV0ZG93bi4KLQkgKiBJdCBuZWVkcyB0byBjbGVhbnVwLgotCSAqIFRPRE8gPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgQmVhbkluZm9QbHVnaW4gc2hvdWxkIGNhbGwgaXQuIChwdWJsaWMgZm9yIG5vdyBidXQgd2hlbiB3ZSBtYWtlCi0JICogQmVhbkluZm9OYXR1cmUgYW4gQVBJIGl0IHdpbGwgYmUgbW92ZWQgaW50byB0aGUgc2FtZSBwYWNrYWdlIGFzIEJlYW5JbmZvUGx1Z2luKS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJY2xlYW51cCh0cnVlLCBmYWxzZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgUmVzb3VyY2VTZXQgdGhhdCBpcyBsaW5rZWQgY29ycmVjdGx5IHRvIHRoaXMgQmVhbmluZm8gTmF0dXJlLgotCSAqIDxwPgotCSAqIFRoaXMgbGlua3MgdXAgYSBSZXNvdXJjZVNldCBzbyB0aGF0IGl0IHdpbGwgd29yayBjb3JyZWN0bHkgd2l0aCB0aGlzIG5hdHVyZS4KLQkgKiBJdCBtYWtlcyBzdXJlIHRoYXQgZ29pbmcgdGhyb3VnaCB0aGUgUmVzb3VyY2VTZXQgdGhhdCBhbnkgImphdmE6Ly4uLiIKLQkgKiBjbGFzc2VzIGNhbiBiZSBmb3VuZCBhbmQgaXQgbWFrZXMgc3VyZSB0aGF0IGFueSBuZXcgY2xhc3NlcyBhcmUgcGxhY2VkIGludG8gdGhlCi0JICogbmF0dXJlJ3MgcmVzb3VyY2Ugc2V0IGFuZCBub3QgcmVzb3VyY2Ugc2V0IGRvaW5nIHRoZSBjYWxsaW5nLgotCSAqIDxwPgotCSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgYW55IHRpbWUgYSByZXNvdXJjZSBzZXQgaXMgbmVlZGVkIHRoYXQgaXMgbm90IHRoZQotCSAqIHByb2plY3Qgd2lkZSByZXNvdXJjZSBzZXQgYXNzb2NpYXRlZCB3aXRoIGJlYW5pbmZvcywgYnV0IHdpbGwgcmVmZXJlbmNlCi0JICogSmF2YSBNb2RlbCBjbGFzc2VzIG9yIGluc3RhbnRpYXRlLgotCSAqIDxwPgotCSAqIEFuIGFkZGl0aW9uYWwgY2hhbmdlIGlzIG1hZGUgdG9vLiBUaGUgUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkncyBleHRlbnNpb25Ub1Jlc291cmNlRmFjdG9yeSBtYXAgaXMgbW9kaWZpZWQKLQkgKiB0byBoYXZlIGFuICJqYXZhIi0+WE1JUmVzb3VyY2VGYWN0b3J5IGVudHJ5IGFkZGVkIHRvIGl0IGlmIEVNRiBFeGFtcGxlcyBpcyBsb2FkZWQuIEVNRiBFeGFtcGxlcyBhZGQKLQkgKiB0aGUgImphdmEiIGV4dGVuc2lvbiBhbmQgc2V0cyBpdCB0byB0aGVpciBvd24gc3BlY2lhbCBKYXZhUmVzb3VyY2VGYWN0b3J5LiAKLQkgKiBJZiBFTUYgRXhhbXBsZXMgaXMgbm90IGxvYWRlZCwgdGhlbiBpdCBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0ICIqIiBtYXBwaW5nLCB3aGljaCBpcyB0byBYTUlSZXNvdXJjZUZhY3RvcnkuCi0JICogVGhpcyBub3JtYWxseSBjYXVzZXMgcHJvYmxlbXMgZm9yIG1hbnkKLQkgKiBjdXN0b21lcnMuIElmIHVzZXJzIG9mIHRoaXMgcmVzb3VyY2Ugc2V0IHJlYWxseSB3YW50IHRoZSBFTUYgZXhhbXBsZXMgZW50cnkgaW5zdGVhZCwgYWZ0ZXIgdGhleSByZXRyaWV2ZSB0aGUKLQkgKiBuZXcgcmVzb3VyY2Ugc2V0IHRoZXkgY2FuIGRvIHRoaXM6Ci0JICogPHA+Ci0JICogPHByZT48Y29kZT4KLQkgKiAJcnNldCA9IGJlYW5pbmZvTmF0dXJlLm5ld1Jlc291cmNlU2V0KCk7Ci0JICogCXJzZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5yZW1vdmUoImphdmEiKTsKLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogCi0JICogQHJldHVybiBhIFJlc291cmNlU2V0IHRoYXQgaXMgc3BlY2lhbGx5IGNvbm5lY3RlZCB0byB0aGUgSkVNIGphdmEgbW9kZWwuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldCBuZXdSZXNvdXJjZVNldCgpIHsKLQkJU3BlY2lhbFJlc291cmNlU2V0IHJzZXQgPSBuZXcgU3BlY2lhbFJlc291cmNlU2V0KCk7Ci0JCXJzZXQuYWRkKG5ldyBSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0RmFpbGVkKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCQkJcmV0dXJuIG51bGw7IC8vIFdlIGRvbid0IGhhdmUgYW55IHNwZWNpYWwgdGhpbmdzIHdlIGNhbiBkbyBpbiB0aGlzIGNhc2UuCi0JCQl9Ci0KLQkJCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCQkJLy8gQWx3YXlzIHRyeSB0byBnZXQgaXQgb3V0IG9mIHRoZSBuYXR1cmUncyByZXNvdXJjZSBzZXQgYmVjYXVzZSBpdCBtYXkgb2YgYmVlbiBsb2FkZWQgdGhlcmUgZWl0aGVyIGFzIAotCQkJCS8vIHRoZSAiamF2YTouLi4iIHR5cGUgb3IgaXQgY291bGQgb2YgYmVlbiBhbiBvdmVycmlkZSBleHRyYSBmaWxlIChzdWNoIGFzIGFuIG92ZXJyaWRlIEVNRiBwYWNrYWdlLCBmb3IKLQkJCQkvLyBleGFtcGxlIGpjZiBoYXMgYSBzaWRlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbmV3IGF0dHJpYnV0ZSB0eXBlLiBUaGF0IGZpbGUKLQkJCQkvLyB3aWxsIGFsc28gYmUgbG9hZGVkIGludG8gdGhpcyByZXNvdXJjZXNldC4gU28gdG8gZmluZCBpdCB3ZSBuZWVkIHRvIGdvIGluIGhlcmUgYW5kIHRyeS4KLQkJCQkvLwotCQkJCS8vIEhvd2V2ZXIsIGlmIG5vdCBmb3VuZCB3ZSB3b24ndCBnbyBhbmQgdHJ5IHRvIGxvYWQgdGhlIHJlc291cmNlLiBUaGF0IGNvdWxkIGxvYWQgaW4gdGhlIHdyb25nIHBsYWNlLgotCQkJCS8vIEtsdWRnZTogQmVjYXVzZSBvZiBhIGJ1ZyAoZmVhdHVyZSA6LSkpIGluIFhNTEhhbmRsZXIuZ2V0UGFja2FnZUZyb21VUkkoKSwgaXQgZG9lc24ndCB1c2UgZ2V0UmVzb3VyY2UoLi4uLHRydWUpIGFuZCBpdCB0cmllcyBpbnN0ZWFkCi0JCQkJLy8gdG8gdXNlIHVyaSBpbnB1dHN0cmVhbSB0byBsb2FkIHRoZSBwYWNrYWdlIHdoZW4gbm90IGZvdW5kLiBUaGlzIGJ5cGFzc2VzIG91ciBzcGVjaWFsIGNyZWF0ZSByZXNvdXJjZSBhbmQgc28KLQkJCQkvLyBwYWNrYWdlcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4gU28gd2UgbmVlZCB0byBkbyBsb2FkIG9uIGRlbWFuZCBoZXJlIGluc3RlYWQgaWYgaXQgaXMgYSBqYXZhIHByb3RvY29sLgotCQkJCS8vIEVNRiB3aWxsIG5vdCBiZSBmaXhpbmcgdGhpcy4gSXQgaXMgd29ya2luZyBhcyBkZXNpZ25lZC4KLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh1cmksIEphdmFYTUlGYWN0b3J5LlNDSEVNRS5lcXVhbHModXJpLnNjaGVtZSgpKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCQkJLy8gVGhpcyBpcyB0aGUgb25lLiBJdCBoYXMgZ290IGhlcmUgYmVjYXVzZSBpdCBjb3VsZG4ndCBmaW5kIGEgcmVzb3VyY2UgYWxyZWFkeSBsb2FkZWQuCi0JCQkJLy8gSWYgaXQgaXMgYSAiamF2YTovLi4uIiBwcm90b2NvbCByZXNvdXJjZSwgdGhlbiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYXQgdGhlIEJlYW5pbmZvTmF0dXJlIGNvbnRleHQKLQkJCQkvLyBpbnN0ZWFkIG9mIHRoZSBsb3dlciBvbmUuCi0JCQkJaWYgKEphdmFYTUlGYWN0b3J5LlNDSEVNRS5lcXVhbHModXJpLnNjaGVtZSgpKSkKLQkJCQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9KTsKLQkJLy8gWzcxNDczXSBSZXN0b3JlICIqLmphdmEiIHRvIGJlIGFuIFhNSVJlc291cmNlLiBJZiBFTUYgRXhhbXBsZXMgYXJlIGxvYWRlZCB0aGV5IG92ZXJsb2FkIHRoaXMgYW5kIGxvYWQgdGhlaXIgc3BlY2lhbCByZXNvdXJjZSBmb3IgIiouamF2YSIgd2hpY2ggd2UgZG9uJ3Qgd2FudC4KLQkJLy8gSWYgc29tZSB1c2VyIHJlYWxseSB3YW50cyB0aGF0LCB0aGV5IGdyYWIgdGhlIHJlc291cmNlIHJlc291cmNlIHNldCBhbmQgcmVtb3ZlIG91ciBvdmVycmlkZS4KLQkJaWYgKFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkuY29udGFpbnNLZXkoImphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBOZWVkIHRvIGFkZCBhbiBvdmVycmlkZSB0byBnbyB0byBYTUkgaW5zdGVhZC4KLQkJCXJzZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoImphdmEiLCBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByc2V0OwotCX0KLQkvKioKLQkgKiBDbGVhbiB1cCwgdGhpcyBtZWFucyBlaXRoZXIgdGhlIHByb2plY3QgaXMgYmVpbmcgY2xvc2VkLCBkZWxldGVkLCBvciBpdCBtZWFucyB0aGF0Ci0JICogdGhlIG5hdHVyZSBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIHByb2plY3QuIEVpdGhlciB3YXkgdGhhdCBtZWFucyB0bwotCSAqIHRlcm1pbmF0ZSB0aGUgVk0gYW5kIHJlbW92ZSB3aGF0IHdlIGFkZGVkIHRvIHRoZSBjb250ZXh0IGlmIHRoZSBmbGFnIHNheXMgY2xlYXIgaXQuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIE9OTFkgd2hlbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBuYXR1cmUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gSXQKLQkgKiB3aWxsIGJlIHJlY3JlYXRlZCBmb3IgYW55IG5ldyB1c2VzLiBUaGF0IGlzIGJlY2F1c2Ugd2Ugd2lsbCBiZSByZW1vdmluZyBvdXJzZWx2ZXMKLQkgKiBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBuYXR1cmVzIGluIHRoZSBCZWFuSW5mb1BsdWdpbi4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci4gSXQga25vd3Mgd2hlbiB0aGUgcHJvamVjdCBpcwotCSAqIGJlaW5nIGNsb3NlZCBvciBkZWxldGVkLgotCSAqIAotCSAqIEBwYXJhbSBjbGVhclJlc3VsdHMgY2xlYXIgdGhlIHJlc3VsdHMgc3VjaCB0aGF0IGFueSBKRU0gbW9kZWwgb2JqZWN0cyBoYXZlIG5vIEJlYW5JbmZvCi0JICogYWRhcHRlcnMgYXR0YWNoZWQgdG8gdGhlbS4gVGhpcyBhbGxvd3MgQmVhbkluZm8gdG8gYmUgR0MnZCB3aXRob3V0IGJlaW5nIGh1bmcgb250by4KLQkgKiAgCi0JICogQHBhcmFtIGRlcmVnaXN0ZXIgRGVyZWdpc3RlciBmcm9tIHRoZSBCZWFuSW5mb1BsdWdpbi4gTm9ybWFsbHkgdGhpcyB3aWxsIGFsd2F5cyBiZSB0cnVlLCBidXQgaXQKLQkgKiB3aWxsIGJlIGNhbGxlZCB3aXRoIGZhbHNlIHdoZW4gQmVhbkluZm9QbHVnaW4gaXMgY2FsbGluZyBiYWNrIHRvIHNodXRkb3duLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoYm9vbGVhbiBjbGVhclJlc3VsdHMsIGJvb2xlYW4gZGVyZWdpc3RlcikgewotCQlpZiAoZGVyZWdpc3RlcikKLQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLnJlbW92ZUJlYW5JbmZvTmF0dXJlKHRoaXMpOwotCQlmU3luY2hyb25pemVyLnN0b3BTeW5jaHJvbml6ZXIoY2xlYXJSZXN1bHRzKTsKLQkJSW5pdC5jbGVhbnVwKGphdmFSU2V0LCBjbGVhclJlc3VsdHMpOwotCQlpZiAoZlJlZ2lzdHJ5ICE9IG51bGwpCi0JCQlmUmVnaXN0cnkudGVybWluYXRlUmVnaXN0cnkodHJ1ZSk7Ci0KLQkJamF2YVJTZXQgPSBudWxsOwotCQlmUmVnaXN0cnkgPSBudWxsOwotCQlmUHJvamVjdCA9IG51bGw7Ci0JCWZTeW5jaHJvbml6ZXIgPSBudWxsOwotCX0KLQotCS8qKiAKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgcHJvamVjdCBuYXR1cmUgYXBwbGllcy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgaGFuZGxlCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBmUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgbmF0dXJlIGFwcGxpZXMuCi0JICogVXNlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBwcm9qZWN0IG5hdHVyZSBydW50aW1lLgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IDxjb2RlPklQcm9qZWN0LmFkZE5hdHVyZTwvY29kZT4KLQkgKiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLQkgKgotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgbmF0dXJlIGFwcGxpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLS8vCQlCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzcygpOwkvLyBJbnN0YW50aWF0ZXMgdGhlIGNvbnRyb2xsZXIgaWYgbm90IGFscmVhZHkgc3RhcnRlZC4KLQkJZlByb2plY3QgPSBwcm9qZWN0OwotCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5hZGRCZWFuSW5mb05hdHVyZSh0aGlzKTsKLQotCQl0cnkgewotCQkJLy8gVGhlIG5hdHVyZSBoYXMgYmVlbiBzdGFydGVkIGZvciB0aGlzIHByb2plY3QsIG5lZWQgdG8gc2V0dXAgdGhlIGludHJvc3BlY3Rpb24gcHJvY2VzcyBub3cuCi0JCQlKYXZhRU1GTmF0dXJlIGphdmFOYXR1cmUgPSBKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUoZlByb2plY3QpOwotCQkJSmF2YUluaXQuaW5pdCgpOwotCQkJaWYgKGZSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uID09IG51bGwpIHsKLQkJCQkvLyBSZWdpc3RlciB0aGUgcmVmbGVjdGlvbiBrZXkgZXh0ZW5zaW9uLgotCQkJCWZSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uID0gbmV3IEJlYW5pbmZvSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24oKTsKLQkJCQlKYXZhWE1JRmFjdG9yeS5JTlNUQU5DRS5yZWdpc3RlclJlZmxlY3Rpb25LZXlFeHRlbnNpb24oZlJlZmxlY3Rpb25LZXlFeHRlbnNpb24pOwotCQkJfQotCi0JCQlqYXZhUlNldCA9IGphdmFOYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCUluaXQuaW5pdGlhbGl6ZShqYXZhUlNldCwgbmV3IElCZWFuaW5mb1N1cHBsaWVyKCkgewotCQkJCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJCQkJcmV0dXJuIEJlYW5pbmZvTmF0dXJlLnRoaXMuZ2V0UmVnaXN0cnkoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdHJ5Q3JlYXRlZCgpIHsKLQkJCQkJcmV0dXJuIEJlYW5pbmZvTmF0dXJlLnRoaXMuaXNSZWdpc3RyeUNyZWF0ZWQoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgY2xvc2VSZWdpc3RyeSgpIHsKLQkJCQkJQmVhbmluZm9OYXR1cmUudGhpcy5jbG9zZVJlZ2lzdHJ5KCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQkJCQlyZXR1cm4gQmVhbmluZm9OYXR1cmUudGhpcy5nZXRQcm9qZWN0KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFByb2plY3RSZXNvdXJjZVNldCBnZXROZXdSZXNvdXJjZVNldCgpIHsKLQkJCQkJcmV0dXJuIEJlYW5pbmZvTmF0dXJlLnRoaXMubmV3UmVzb3VyY2VTZXQoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UHJvamVjdFJlc291cmNlU2V0KCkgewotCQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWZTeW5jaHJvbml6ZXIgPQotCQkJCW5ldyBCZWFuaW5mb01vZGVsU3luY2hyb25pemVyKAotCQkJCQkoQmVhbmluZm9BZGFwdGVyRmFjdG9yeSkgRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KGphdmFSU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKSwgSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKSwKLQkJCQkJSmF2YUNvcmUuY3JlYXRlKGphdmFOYXR1cmUuZ2V0UHJvamVjdCgpKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgdGhlIHJlZ2lzdHJ5LiBJdCBuZWVkcyB0byBiZSByZWN5Y2xlZCBiZWNhdXNlIGEgY2xhc3MgaGFzIGNoYW5nZWQKLQkgKiBhbmQgbm93IHRoZSBuZXcgY2xhc3MgbmVlZHMgdG8gYmUgYWNjZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2VSZWdpc3RyeSgpIHsKLQkJUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlyZWcgPSBmUmVnaXN0cnk7Ci0JCQlmUmVnaXN0cnkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBXaXBlIG91dCB0aGUgU2Vzc2lvbiBwcm9wZXJ0aWVzIHNvIHRoYXQgdGhleSBhcmUgcmVjb21wdXRlZC4KLQkJCQlnZXRQcm9qZWN0KCkuc2V0U2Vzc2lvblByb3BlcnR5KENPTkZJR19JTkZPX1NFU1NJT05fS0VZLCBudWxsKTsKLQkJCQlnZXRQcm9qZWN0KCkuc2V0U2Vzc2lvblByb3BlcnR5KEJFQU5JTkZPX0NPTlRSSUJVVE9SU19TRVNTSU9OX0tFWSwgbnVsbCk7CQkJCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlZyAhPSBudWxsKSB7Ci0JCQlyZWcucmVtb3ZlUmVnaXN0cnlMaXN0ZW5lcihyZWdpc3RyeUxpc3RlbmVyKTsKLQkJCXJlZy50ZXJtaW5hdGVSZWdpc3RyeSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFVzaW5nIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGluZm8sIGNvbXB1dGUgdGhlIEJlYW5JbmZvIGNvbmZpZyBpbmZvIG5lZWRlZC4gVGhpcyBzZXRzIHRoZQotCSAqIHNlc3Npb24gcHJvcGVydGllcyBCRUFOSU5GT19DT05UUklCVVRPUlNfU0VTU0lPTl9LRVkgYW5kIENPTkZJR19JTkZPX1NFU1NJT05fS0VZLgotCSAqIAotCSAqIEBwYXJhbSBpbmZvCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXB1dGVCZWFuSW5mb0NvbmZpZ0luZm8oSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QgdGltZSBmb3IgdGhpcyBuYXR1cmUsIG9yIGZpcnN0IHRpbWUgYWZ0ZXIgcmVnaXN0cnkgcmVzZXQuIE5lZWQgdG8gY29tcHV0ZSB0aGUgaW5mby4KLQkJLy8gSXQgaXMgcG9zc2libGUgZm9yIHRoaXMgdG8gYmUgY2FsbGVkIEJFRk9SRSB0aGUgZmlyc3QgdXNhZ2Ugb2YgQmVhbkluZm8uIFRoZSBlZGl0b3IgdXN1YWxseQotCQkvLyBicmluZ3MgdXAgdGhlIGVkaXRvcidzIHJlZ2lzdHJ5IGJlZm9yZSBpdCBnZXRzIGFueXRoaW5nIGZyb20gQmVhbkluZm8uCi0JCUxpc3QgY29udHJpYnV0b3JzTGlzdCA9IG5ldyBBcnJheUxpc3QoMTApOwotCQlpZiAoIWluZm8uZ2V0Q29udGFpbmVySWRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkvLyBSdW4gdGhyb3VnaCBhbGwgb2YgdGhlIHZpc2libGUgY29udGFpbmVyIGlkcyB0aGF0IGFyZSBhcHBsaWNhYmxlIGFuZCBnZXQgQmVhbkluZm8gY29udHJpYnV0b3JzLgotCQkJSXRlcmF0b3IgY29udGFpbmVySWRJdHIgPSBpbmZvLmdldENvbnRhaW5lcklkcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoY29udGFpbmVySWRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29udGFpbmVyUGF0aHMgY29udGFpbmVyUGF0aHMgPSAoQ29udGFpbmVyUGF0aHMpIGNvbnRhaW5lcklkSXRyLm5leHQoKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb250cmlidXRvcnMgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRDb250YWluZXJJZENvbnRyaWJ1dG9ycyhjb250YWluZXJQYXRocy5nZXRDb250YWluZXJJZCgpLCBjb250YWluZXJQYXRocy5nZXRWaXNpYmxlQ29udGFpbmVyUGF0aHMoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdCBjb250cmlidXRvciA9IGNvbnRyaWJ1dG9yc1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFBJX0NMQVNTKTsKLQkJCQkJCWlmIChjb250cmlidXRvciBpbnN0YW5jZW9mIElCZWFuSW5mb0NvbnRyaWJ1dG9yKQotCQkJCQkJCWNvbnRyaWJ1dG9yc0xpc3QuYWRkKGNvbnRyaWJ1dG9yKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCQkJCi0JCX0KLQkJCi0JCWlmICghaW5mby5nZXRQbHVnaW5JZHMoKS5pc0VtcHR5KCkpIHsKLQkJCS8vIFJ1biB0aHJvdWdoIGFsbCBvZiB0aGUgdmlzaWJsZSBwbHVnaW4gaWRzIHRoYXQgYXJlIGFwcGxpY2FibGUgYW5kIGdldCBCZWFuSW5mbyBjb250cmlidXRvcnMuCi0JCQkJSXRlcmF0b3IgcGx1Z2luSWRJdHIgPSBpbmZvLmdldFBsdWdpbklkcygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAocGx1Z2luSWRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIHBsdWdpbklkSXRyLm5leHQoKTsKLQkJCQkJaWYgKCgoQm9vbGVhbikgZW50cnkuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbnRyaWJ1dG9ycyA9IEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpbkNvbnRyaWJ1dG9ycygKLQkJCQkJCQkJKFN0cmluZykgZW50cnkuZ2V0S2V5KCkpOwotCQkJCQkJaWYgKGNvbnRyaWJ1dG9ycyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlPYmplY3QgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQSV9DTEFTUyk7Ci0JCQkJCQkJCWlmIChjb250cmlidXRvciBpbnN0YW5jZW9mIElCZWFuSW5mb0NvbnRyaWJ1dG9yKQotCQkJCQkJCQkJY29udHJpYnV0b3JzTGlzdC5hZGQoY29udHJpYnV0b3IpOwotCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkKLQkJCS8vIFNhdmUgaXQgZm9yIGFsbCBiZWFuaW5mbyBwcm9jZXNzaW5nIChhbmQgY29uZmlndXJhdGlvbiBwcm9jZXNzaW5nIGlmIHRoZXkgaW1wbGVtZW50IHByb3h5IGNvbmZpZ3VyYXRpb24gY29udHJpYnV0b3IpLgotCQlJQmVhbkluZm9Db250cmlidXRvcltdIGV4cGxpY2l0Q29udHJpYnV0b3JzID0gKElCZWFuSW5mb0NvbnRyaWJ1dG9yW10pIGNvbnRyaWJ1dG9yc0xpc3QudG9BcnJheShuZXcgSUJlYW5JbmZvQ29udHJpYnV0b3JbY29udHJpYnV0b3JzTGlzdC5zaXplKCldKTsKLQkJaW5mby5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5zZXRTZXNzaW9uUHJvcGVydHkoQkVBTklORk9fQ09OVFJJQlVUT1JTX1NFU1NJT05fS0VZLCBleHBsaWNpdENvbnRyaWJ1dG9ycyk7Ci0JCS8vIFNhdmUgaXQgZm9yIG92ZXJyaWRlIHByb2Nlc3NpbmcuIFRoYXQgaGFwcGVucyBvdmVyIGFuZCBvdmVyIGxhdGVyIGFmdGVyIGFsbCBjb25maWcgcHJvY2Vzc2luZyBpcyBkb25lLgotCQkvLyBEbyBpdCBsYXN0IHNvIHRoYXQgaWYgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiwgc2luY2UgdGhpcyBwcm9wZXJ0eSBpcyBhIGZsYWcgdG8gaW5kaWNhdGUgd2UgaGF2ZSBkYXRhLAotCQkvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgQmVhbmluZm8gZGF0YSBpcyBhbHJlYWR5IHNldCBhdCB0aGUgcG9pbnQgd2Ugc2V0IHRoaXMuCi0JCS8vIFdlIGNvdWxkIGFjdHVhbGx5IHNldCBpdCB0d2ljZSBiZWNhdXNlIG9mIHRoaXMsIGJ1dCBpdCBpcyB0aGUgc2FtZSBkYXRhLCBzbywgc28gd2hhdC4KLQkJaW5mby5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5zZXRTZXNzaW9uUHJvcGVydHkoQ09ORklHX0lORk9fU0VTU0lPTl9LRVksIGluZm8pOwotCX0KLQotCS8qKgotCSAqIEdldCByZWdpc3RyeSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgotCSAqIEByZXR1cm4gdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoZlJlZ2lzdHJ5ICE9IG51bGwpCi0JCQkJcmV0dXJuIGZSZWdpc3RyeTsKLQkJfQotCQkvLyBOb3cgbmVlZCB0byBzdGFydCB0aGUgYXBwcm9wcmlhdGUgam9iLiBJbiBhbm90aGVyIGNsYXNzIHNvIHRoYXQgaXQgY2FuIGhhbmRsZSBkeW5hbWljYWxseSBjaGVja2luZyBpZiAKLQkJLy8gVUkgaXMgYXZhaWxhYmxlIHRvIGV2ZW4gZG8gdGhpcyAoaXQgbWF5YmUgbm90IGluIGEgVUkgbW9kZSwgc28gdGhlbiBqdXN0IGRvIGl0LgotCQlDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIuY3JlYXRlUmVnaXN0cnkodGhpcyk7Ci0JCXJldHVybiBmUmVnaXN0cnk7Ci0JfQotCQotCS8qCi0JICogVGhpcyBpcyA8cGFja2FnZS1wcm90ZWN0ZWQ+IHNvIHRoYXQgb25seSB0aGUgYXBwcm9wcmlhdGUgY3JlYXRlIGpvYiBpbiB0aGlzCi0JICogcGFja2FnZSBjYW4gY2FsbCBpdC4gVGhpcyBpcyBiZWNhdXNlIHRoaXMgbXVzdCBiZSBjb250cm9sbGVkIHRvIG9ubHkgYmUKLQkgKiBkb25lIHdoZW4gYnVpbGQgbm90IGluIHByb2dyZXNzIGFuZCBzZXJpYWwgYWNjZXNzLgotCSAqLwotCXZvaWQgY3JlYXRlUmVnaXN0cnkoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQlwbS5iZWdpblRhc2soQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuVUlDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXJfU3RhcnRCZWFuaW5mb1JlZ2lzdHJ5LCAxMDApOyAKLQkJaWYgKGlzUmVnaXN0cnlDcmVhdGVkKCkpIHsKLQkJCXBtLmRvbmUoKTsKLQkJCXJldHVybjsgLy8gSXQgaGFkIGFscmVhZHkgYmVlbiBjcmVhdGVkLiBDb3VsZCBvZiBiZWVuIGJlY2F1c2UgdGhyZWFkcyB3ZXJlIHJhY2luZyB0byBkbyB0aGUgY3JlYXRpb24sIGFuZCBvbmUgZ290IHRoZXJlIGZpcnN0LgotCQl9Ci0KLQkJdHJ5IHsKLQkJCUNvbmZpZ3VyYXRpb25Db250cmlidXRvciBjb25maWd1cmF0aW9uQ29udHJpYnV0b3IgPSAoQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKSBnZXRDb25maWd1cmF0aW9uQ29udHJpYnV0b3IoKTsKLQkJCWNvbmZpZ3VyYXRpb25Db250cmlidXRvci5zZXROYXR1cmUodGhpcyk7Ci0JCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IFByb3h5TGF1bmNoU3VwcG9ydC5zdGFydEltcGxlbWVudGF0aW9uKGZQcm9qZWN0LCAiQmVhbmluZm8iLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10geyBjb25maWd1cmF0aW9uQ29udHJpYnV0b3J9LCBmYWxzZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMTAwKSk7Ci0JCQlyZWdpc3RyeS5hZGRSZWdpc3RyeUxpc3RlbmVyKHJlZ2lzdHJ5TGlzdGVuZXIpOwotCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQlmUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzUmVnaXN0cnlDcmVhdGVkKCkgewotCQlyZXR1cm4gZlJlZ2lzdHJ5ICE9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgbmF0dXJlIGlzIHN0aWxsIHZhbGlkLiBJZiB0aGUgcHJvamVjdCBoYXMgYmVlbgotCSAqIHJlbmFtZWQsIHRoZSBuYXR1cmUgaXMgc3RpbGwgYXJvdW5kLCBidXQgdGhlIHByb2plY3QgaGFzIGJlZW4gY2xvc2VkLgotCSAqIFNvIHRoZSBuYXR1cmUgaXMgbm93IGludmFsaWQuCi0JICogCi0JICogQHJldHVybiBJcyB0aGlzIGEgdmFsaWQgbmF0dXJlLiBJLmUuIGlzIHRoZSBwcm9qZWN0IHN0aWxsIG9wZW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZE5hdHVyZSgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0ICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzZWFyY2ggcGF0aCBvbnRvIHRoZSByZWdpc3RyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm94eVNlYXJjaFBhdGgoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnksIExpc3Qgc2VhcmNoUGF0aHMpIHsKLQkJaWYgKHNlYXJjaFBhdGhzICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHN0cmluZ1NlYXJjaFBhdGggPSAoU3RyaW5nW10pIHNlYXJjaFBhdGhzLnRvQXJyYXkobmV3IFN0cmluZ1tzZWFyY2hQYXRocy5zaXplKCldKTsKLQkJCVV0aWxpdGllcy5zZXRCZWFuSW5mb1NlYXJjaFBhdGgocmVnaXN0cnksIHN0cmluZ1NlYXJjaFBhdGgpOwotCQl9IGVsc2UKLQkJCVV0aWxpdGllcy5zZXRCZWFuSW5mb1NlYXJjaFBhdGgocmVnaXN0cnksIG51bGwpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElORyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIHNCZWFuaW5mb3MgPSAiYmVhbmluZm9zIjsgLy8gUm9vdCBlbGVtZW50IG5hbWUgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEdldCB0aGUgcGVyc2lzdGVudCBzZWFyY2ggcGF0aC4gSXQgaXMgY29weS4KLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9zRG9jIGdldFNlYXJjaFBhdGgoKSB7Ci0JCUJlYW5pbmZvc0RvYyBiZG9jID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIHByb3BlcnR5ID0gZ2V0U2hhcmVkUHJvcGVydHkoUF9CRUFOSU5GT19TRUFSQ0hfUEFUSCk7Ci0JCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIE5lZWQgdG8gcmVjb25zdHJ1Y3QgZnJvbSB0aGUgWE1MIGZvcm1hdC4KLQkJCQkJRG9jdW1lbnQgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvcGVydHksIEVOQ09ESU5HKSkpOwotCQkJCQlFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCWlmIChyb290ICE9IG51bGwgJiYgcm9vdC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2Uoc0JlYW5pbmZvcykpIHsKLQkJCQkJCWJkb2MgPSBCZWFuaW5mb3NEb2MucmVhZEVudHJ5KG5ldyBET01SZWFkZXIoKSwgcm9vdCwgZ2V0UHJvamVjdCgpKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm9wZXJ0eS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBiZG9jOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcGVyc2lzdGVudCBzZWFyY2ggcGF0aC4gTm8gcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hQYXRoKEJlYW5pbmZvc0RvYyBzZWFyY2hQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNldFNlYXJjaFBhdGgoc2VhcmNoUGF0aCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBwZXJzaXN0ZW50IHNlYXJjaCBwYXRoIHdpdGggYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoUGF0aChCZWFuaW5mb3NEb2Mgc2VhcmNoUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IG51bGw7Ci0JCWlmIChzZWFyY2hQYXRoICE9IG51bGwgJiYgc2VhcmNoUGF0aC5nZXRTZWFyY2hwYXRoKCkubGVuZ3RoID4gMCkgewotCQkJdHJ5IHsKLQkJCQlEb2N1bWVudCBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJCQlFbGVtZW50IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudChzQmVhbmluZm9zKTsgLy8gQ3JlYXRlIFJvb3QgRWxlbWVudAotCQkJCUlCZWFuaW5mb3NEb2NFbnRyeVtdIGVudHJpZXMgPSBzZWFyY2hQYXRoLmdldFNlYXJjaHBhdGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0JCQkJCXJvb3QuYXBwZW5kQ2hpbGQoZW50cmllc1tpXS53cml0ZUVudHJ5KGRvYywgZ2V0UHJvamVjdCgpKSk7IC8vIEFkZCB0byB0aGUgc2VhcmNoIHBhdGgKLQkJCQlkb2MuYXBwZW5kQ2hpbGQocm9vdCk7IC8vIEFkZCBSb290IHRvIERvY3VtZW50Ci0JCQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotCQkJCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHN0cldyaXRlcik7Ci0JCQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKLQkJCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotCQkJCXByb3BlcnR5ID0gc3RyV3JpdGVyLnRvU3RyaW5nKCk7Ci0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQl9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJLy8gSWYgaXQgaGFzbid0IGNoYW5nZWQsIGRvbid0IHdyaXRlIGl0IGJhY2sgb3V0LiBUaGlzIGlzIHNvIHRoYXQgaWYgdGhlIGZpbGUgaGFzbid0Ci0JCQkvLyBiZWVuIGNoZWNrZWQgb3V0IGFuZCBpdCBpcyB0aGUgc2FtZSwgd2UgZG9uJ3Qgd2FudCB0byBib3RoZXIgdGhlIHVzZXIuIFRoaXMgaXMgYmVjYXVzZQotCQkJLy8gd2UgZG9uJ3Qga25vdyBpZiB0aGUgdXNlciBoYWQgc2ltcGx5IGJyb3dzZWQgdGhlIHNlYXJjaCBwYXRoIG9yIGhhZCBhY3R1YWxseSBjaGFuZ2VkIGFuZAotCQkJLy8gc2V0IGl0IGJhY2sgdG8gd2hhdCBpdCB3YXMuIEluIGVpdGhlciBvZiB0aG9zZSBjYXNlcyBpdCB3b3VsZCBiZSBhIGJvdGhlciB0byBhc2sgdGhlCi0JCQkvLyB1c2VyIHRvIGNoZWNrb3V0IHRoZSBmaWxlLgotCQkJSW5wdXRTdHJlYW0gaXMgPSBnZXRTaGFyZWRQcm9wZXJ0eShQX0JFQU5JTkZPX1NFQVJDSF9QQVRIKTsKLQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgRU5DT0RJTkcpOwotCQkJCQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMTAwMF07Ci0JCQkJCQlTdHJpbmdCdWZmZXIgb2xkUHJvcGVydHkgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMDApOwotCQkJCQkJaW50IHJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0JCQkJCQl3aGlsZSAocmVhZCAhPSAtMSkgewotCQkJCQkJCW9sZFByb3BlcnR5LmFwcGVuZChjaGFycywgMCwgcmVhZCk7Ci0JCQkJCQkJcmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvbGRQcm9wZXJ0eS50b1N0cmluZygpLmVxdWFscyhwcm9wZXJ0eSkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0gLy8gRGlkbid0IGNoYW5nZS4KLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc2V0U2hhcmVkUHJvcGVydHkoUF9CRUFOSU5GT19TRUFSQ0hfUEFUSCwgcHJvcGVydHksIG1vbml0b3IpOwotCQl9IGVsc2UKLQkJCXJlbW92ZVNoYXJlZFByb3BlcnR5KFBfQkVBTklORk9fU0VBUkNIX1BBVEgsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2Ugc2V0IGZvciBhbGwgamF2YSBwYWNrYWdlcyBpbiB0aGlzIG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBqYXZhUlNldDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtYXJrQWxsU3RhbGUoKSB7Ci0JCS8vIE1hcmsgYWxsIHN0YWxlIHNvIHRoYXQgdGhlIHJlZ2lzdHJ5IHdpbGwgYmUgcmVjeWNsZWQuCi0JCWlmIChmUmVnaXN0cnkgIT0gbnVsbCkgewotCQkJLy8gV2UgaGF2ZSBhIHJlZ2lzdHJ5IHJ1bm5pbmcsIHdlIG5lZWQgdG8gaW5kaWNhdGUgcmVjeWNsZSBpcyBuZWVkZWQuCi0JCQlmU3luY2hyb25pemVyLmdldEFkYXB0ZXJGYWN0b3J5KCkubWFya0FsbFN0YWxlKCk7Ci0JCQkvLyBNYXJrIGFsbCBzdGFsZS4gTmV4dCB0aW1lIHdlIG5lZWQgYW55dGhpbmcgaXQgd2lsbCBiZSByZWN5Y2xlZC4KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXB1dGUgdGhlIGZpbGUgbmFtZSB0byB1c2UgZm9yIGEgZ2l2ZW4gc2hhcmVkIHByb3BlcnR5Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlU2hhcmVkUHJvcGVydHlGaWxlTmFtZShRdWFsaWZpZWROYW1lIHFOYW1lKSB7Ci0JCXJldHVybiBxTmFtZS5nZXRMb2NhbE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSBhIHNoYXJlZCBwcm9wZXJ0eSBvbiBhIHByb2plY3QuIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCwgYW5zd2VycyBudWxsLgotCSAqIE5vdGUgdGhhdCBpdCBpcyBvcnRob2dvbmFsIHRvIElSZXNvdXJjZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMsIGFuZCBjbGllbnQgY29kZSBoYXMgdG8gZGVjaWRlCi0JICogd2hpY2ggZm9ybSBvZiBzdG9yYWdlIHRvIHVzZSBhcHByb3ByaWF0ZWx5LiBTaGFyZWQgcHJvcGVydGllcyBwcm9kdWNlIHJlYWwgcmVzb3VyY2UgZmlsZXMgd2hpY2gKLQkgKiBjYW4gYmUgc2hhcmVkIHRocm91Z2ggYSBWQ00gb250byBhIHNlcnZlci4gUGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSBub3Qgc2hhcmVhYmxlLgotCSAqCi0JICovCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldFNoYXJlZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGaWxlIHJzY0ZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZShwcm9wZXJ0eUZpbGVOYW1lKTsKLQkJaWYgKHJzY0ZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gcnNjRmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVjb3JkIGEgc2hhcmVkIHBlcnNpc3RlbnQgcHJvcGVydHkgb250byBhIHByb2plY3QuCi0JICogTm90ZSB0aGF0IGl0IGlzIG9ydGhvZ29uYWwgdG8gSVJlc291cmNlIHBlcnNpc3RlbnQgcHJvcGVydGllcywgYW5kIGNsaWVudCBjb2RlIGhhcyB0byBkZWNpZGUKLQkgKiB3aGljaCBmb3JtIG9mIHN0b3JhZ2UgdG8gdXNlIGFwcHJvcHJpYXRlbHkuIFNoYXJlZCBwcm9wZXJ0aWVzIHByb2R1Y2UgcmVhbCByZXNvdXJjZSBmaWxlcyB3aGljaAotCSAqIGNhbiBiZSBzaGFyZWQgdGhyb3VnaCBhIFZDTSBvbnRvIGEgc2VydmVyLiBQZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIG5vdCBzaGFyZWFibGUuCi0JICogCi0JICogc2hhcmVkIHByb3BlcnRpZXMgZW5kIHVwIGluIHJlc291cmNlIGZpbGVzLCBhbmQgdGh1cyBjYW5ub3QgYmUgbW9kaWZpZWQgZHVyaW5nCi0JICogZGVsdGEgbm90aWZpY2F0aW9ucyAoYSBDb3JlRXhjZXB0aW9uIHdvdWxkIHRoZW4gYmUgdGhyb3duKS4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTaGFyZWRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlJRmlsZSByc2NGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUocHJvcGVydHlOYW1lKTsKLQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHZhbHVlLmdldEJ5dGVzKEVOQ09ESU5HKSk7Ci0JCQkvLyB1cGRhdGUgdGhlIHJlc291cmNlIGNvbnRlbnQKLQkJCWlmIChyc2NGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcnNjRmlsZS5zZXRDb250ZW50cyhpbnB1dCwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlyc2NGaWxlLmNyZWF0ZShpbnB1dCwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgc2hhcmVkIHBlcnNpc3RlbnQgcHJvcGVydHkgb250byBhIHByb2plY3QuCi0JICogTm90ZSB0aGF0IGl0IGlzIG9ydGhvZ29uYWwgdG8gSVJlc291cmNlIHBlcnNpc3RlbnQgcHJvcGVydGllcywgYW5kIGNsaWVudCBjb2RlIGhhcyB0byBkZWNpZGUKLQkgKiB3aGljaCBmb3JtIG9mIHN0b3JhZ2UgdG8gdXNlIGFwcHJvcHJpYXRlbHkuIFNoYXJlZCBwcm9wZXJ0aWVzIHByb2R1Y2UgcmVhbCByZXNvdXJjZSBmaWxlcyB3aGljaAotCSAqIGNhbiBiZSBzaGFyZWQgdGhyb3VnaCBhIFZDTSBvbnRvIGEgc2VydmVyLiBQZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIG5vdCBzaGFyZWFibGUuCi0JICogCi0JICogc2hhcmVkIHByb3BlcnRpZXMgZW5kIHVwIGluIHJlc291cmNlIGZpbGVzLCBhbmQgdGh1cyBjYW5ub3QgYmUgbW9kaWZpZWQgZHVyaW5nCi0JICogZGVsdGEgbm90aWZpY2F0aW9ucyAoYSBDb3JlRXhjZXB0aW9uIHdvdWxkIHRoZW4gYmUgdGhyb3duKS4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTaGFyZWRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJRmlsZSByc2NGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUocHJvcGVydHlOYW1lKTsKLQkJcnNjRmlsZS5kZWxldGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29uZmlndXJhdGlvbiBjb250cmlidXRvciB0aGF0IHNldHMgdXAgYSB2bSB0byBhbGxvdwotCSAqIGludHJvc3BlY3Rpb24uIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhlIGFwcHJvcHJpYXRlIHBhdGhzCi0JICogYXJlIGluIHRoZSBjbGFzc3BhdGggdG8gYWxsb3cgYWNjZXNzIHRvIHRoZSBiZWFuaW5mb3MsIGFuZAotCSAqIGl0IHdpbGwgc2V0dXAgdGhlIGJlYW5pbmZvIHNlYXJjaCBwYXRoIGZvciB0aGlzIHByb2plY3QuCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IgZ2V0Q29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKCkgewotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25Db250cmlidXRvcihnZXRTZWFyY2hQYXRoKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbmZpZ3VyYXRpb25Db250cmlidXRvciBleHRlbmRzIENvbmZpZ3VyYXRpb25Db250cmlidXRvckFkYXB0ZXIgewotCi0JCXByaXZhdGUgQmVhbmluZm9zRG9jIGRvYzsKLQkJTGlzdCBjb21wdXRlZFNlYXJjaFBhdGg7Ci0JCQkJCi0JCS8vIFRoZSBuYXR1cmUuIElmIHRoZSBuYXR1cmUgaXMgbm90IHNldCB0aGVuIHRoaXMgY29udHJpYnV0b3IgaXMgb25lCi0JCS8vIHVzZWQgYnkgc29tZSBvdGhlciBsYXRlciBwcm94eSByZWdpc3RyeSB0byBnZXQgdGhlIGJlYW5pbmZvIGNsYXNzZXMgaW50byB0aGVpciBwYXRocy4gSW4gdGhhdCBjYXNlCi0JCS8vIHdlIGNhbiBleHBlY3QgdGhlIGNvbmZpZyBpbmZvIHRvIGJlIGluIHRoZSBzZXNzaW9uIHZhcmlhYmxlIGZvciBvdXIgdXNlLiBPdGhlcndpc2Ugd2Ugd2lsbCBuZWVkIHRvCi0JCS8vIGFkZCBpdCBoZXJlLiBBbHNvIGRvbid0IHNldCBzZWFyY2hwYXRoIHN0dWZmIGlmIG5vdCBuYXR1cmUgYmVjYXVzZSBvbmx5IHRoZSBiZWFuaW5mbyBvbmUgd2lsbCBkbyBpbnRyb3NwZWN0aW9uLgotCQlwcml2YXRlIEJlYW5pbmZvTmF0dXJlIG5hdHVyZTsJCi0JCQotCQlwcml2YXRlIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvOwotCQlwcml2YXRlIElCZWFuSW5mb0NvbnRyaWJ1dG9yW10gZXhwbGljaXRDb250cmlidXRvcnM7Ci0KLQkJcHVibGljIENvbmZpZ3VyYXRpb25Db250cmlidXRvcihCZWFuaW5mb3NEb2MgZG9jKSB7Ci0JCQl0aGlzLmRvYyA9IGRvYzsKLQkJfQotCi0JCS8qCi0JCSAqIFNldCB0aGF0IHRoaXMgaXMgdGhlIG5hdHVyZSBjb250cmlidXRvci4gTm90IG51bGwsIG1lYW5zIHRoYXQgdGhpcyBpcyB0aGUgY29udHJpYnV0b3IgYmVpbmcKLQkJICogdXNlZCB0byBzZXR1cCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBwcm9qZWN0J3MgYmVhbmluZm8gbmF0dXJlLiBudWxsIChkZWZhdWx0KSBtZWFucyB0aGF0IHRoaXMKLQkJICogaXMgb25lIGNyZWF0ZWQgdG8gYWRkIHRvIHNvbWUgZWRpdG9yJ3MgcmVnaXN0cnkuCi0JCSAqIAotCQkgKiBOb3RlOiBUaGlzIE1VU1QgYmUgc2V0IGJlZm9yZSBpbml0aWFsaXplIGlzIGNhbGxlZCBvciBpdCB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4gSWYgbm90IHNldCwgaXQgCi0JCSAqIHdpbGwgYmUgY29uc2lkZXJlZCBub3QgZm9yIEJlYW5JbmZvIG5hdHVyZSBkaXJlY3RseS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE5hdHVyZShCZWFuaW5mb05hdHVyZSBuYXR1cmUpIHsKLQkJCXRoaXMubmF0dXJlID0gbmF0dXJlOwotCQkJaWYgKG5hdHVyZSAhPSBudWxsKQotCQkJCWNvbXB1dGVkU2VhcmNoUGF0aCA9IG5ldyBBcnJheUxpc3QoMyk7CS8vIFdlIHdpbGwgYmUgZ2F0aGVyaW5nIHRoaXMgaW5mby4KLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0b3IjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvKSB7Ci0JCQl0aGlzLmluZm8gPSBpbmZvOwotCQkJdHJ5IHsKLQkJCQlpZiAoaW5mby5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRTZXNzaW9uUHJvcGVydHkoQ09ORklHX0lORk9fU0VTU0lPTl9LRVkpID09IG51bGwpIHsKLQkJCQkJLy8gVE9ETyBGb3Igbm93IHdlIHdpbGwgcmVidWlsZCBmb3IgZWFjaCB0aW1lIHdlIG9wZW4gYSByZWdpc3RyeSwgYnV0IGl0IGFjdHVhbGx5IGlzIG9ubHkgbmVlZGVkIGlmIGEgY2xhc3NwYXRoCi0JCQkJCS8vIGNoYW5nZXMgZm9yIHNvbWUgcmVhc29uLiBBdCB0aGF0IHBvaW50IHdlIGNhbiBnZXQgaXQgb3V0IG9mIGhlcmUuCi0JCQkJCQotCQkJCQljb21wdXRlQmVhbkluZm9Db25maWdJbmZvKGluZm8pOwkJCQkJCi0JCQkJfSAKLQkJCQlleHBsaWNpdENvbnRyaWJ1dG9ycyA9IChJQmVhbkluZm9Db250cmlidXRvcltdKSBpbmZvLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldFNlc3Npb25Qcm9wZXJ0eShCRUFOSU5GT19DT05UUklCVVRPUlNfU0VTU0lPTl9LRVkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRocyhmaW5hbCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gQ29udHJpYnV0ZSBmb3IgdGhpcyBwcm9qZWN0Ci0JCQljb250cmlidXRlQ2xhc3NwYXRoc0ZvclByb2plY3QoY29udHJvbGxlciwgaW5mby5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSwgZG9jLCB0cnVlKTsKLQkJCQkJCQotCQkJaWYgKCFpbmZvLmdldFByb2plY3RQYXRocygpLmlzRW1wdHkoKSkgewotCQkJCS8vIFJ1biB0aHJvdWdoIGFsbCBvZiB0aGUgdmlzaWJsZSBwcm9qZWN0cyBhbmQgY29udHJpYnV0ZSB0aGUgY2xhc3NwYXRocyAod2hpY2ggY29tZSBmcm9tIHRoZSBCZWFuSW5mbyBkb2NzLCBpZiB0aGV5IGhhdmUgYW55KS4KLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gaW5mby5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJSXRlcmF0b3IgcHJvakl0ZXIgPSBpbmZvLmdldFByb2plY3RQYXRocygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAocHJvakl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIHByb2pJdGVyLm5leHQoKTsKLQkJCQkJaWYgKCgoQm9vbGVhbikgZW50cnkuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCUlSZXNvdXJjZSByZXMgPSByb290LmZpbmRNZW1iZXIoKElQYXRoKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QgJiYgKChJUHJvamVjdCkgcmVzKS5pc09wZW4oKSAmJiBCZWFuaW5mb05hdHVyZS5oYXNSdW50aW1lKChJUHJvamVjdCkgcmVzKSkKLQkJCQkJCQljb250cmlidXRlQ2xhc3NwYXRoc0ZvclByb2plY3QoY29udHJvbGxlciwgKElQcm9qZWN0KSByZXMsIEJlYW5pbmZvTmF0dXJlLmdldFJ1bnRpbWUoKElQcm9qZWN0KSByZXMpCi0JCQkJCQkJCQkuZ2V0U2VhcmNoUGF0aCgpLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCQkKLQkJCWlmICghaW5mby5nZXRDb250YWluZXJJZHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkvLyBSdW4gdGhyb3VnaCBhbGwgb2YgdGhlIHZpc2libGUgY29udGFpbmVyIGlkcyB0aGF0IGFyZSBhcHBsaWNhYmxlLgotCQkJCUl0ZXJhdG9yIGNvbnRhaW5lcklkSXRyID0gaW5mby5nZXRDb250YWluZXJJZHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChjb250YWluZXJJZEl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJQ29udGFpbmVyUGF0aHMgY29udGFpbmVyUGF0aHMgPSAoQ29udGFpbmVyUGF0aHMpIGNvbnRhaW5lcklkSXRyLm5leHQoKTsKLQkJCQkJcHJvY2Vzc0JlYW5pbmZvRW50cmllcyhCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRDb250YWluZXJJZEJlYW5JbmZvcyhjb250YWluZXJQYXRocy5nZXRDb250YWluZXJJZCgpLCBjb250YWluZXJQYXRocy5nZXRWaXNpYmxlQ29udGFpbmVyUGF0aHMoKSksCi0JCQkJCQkJY29udHJvbGxlciwgaW5mby5nZXRKYXZhUHJvamVjdCgpKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICghaW5mby5nZXRQbHVnaW5JZHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkvLyBSdW4gdGhyb3VnaCBhbGwgb2YgdGhlIHZpc2libGUgcGx1Z2luIGlkcyB0aGF0IGFyZSBhcHBsaWNhYmxlLgotCQkJCUl0ZXJhdG9yIHBsdWdpbklkSXRyID0gaW5mby5nZXRQbHVnaW5JZHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHBsdWdpbklkSXRyLmhhc05leHQoKSkgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBwbHVnaW5JZEl0ci5uZXh0KCk7Ci0JCQkJCWlmICgoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlwcm9jZXNzQmVhbmluZm9FbnRyaWVzKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpbkJlYW5JbmZvcygoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKSksIGNvbnRyb2xsZXIsIGluZm8uZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICghaW5mby5nZXRDb250YWluZXJzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gUnVuIHRocm91Z2ggYWxsIG9mIHRoZSB2aXNpYmxlIGNvbnRhaW5lcnMgdGhhdCBpbXBsZW1lbnQgSUJlYW5JbmZvQ29udHJpYnV0b3IgYW5kIGFzayB0aGVtIGZvciB0aGUgY29udHJpYnV0aW9ucy4KLQkJCQlJdGVyYXRvciBjb250YWluZXJJdHIgPSBpbmZvLmdldENvbnRhaW5lcnMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGNvbnRhaW5lckl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgY29udGFpbmVySXRyLm5leHQoKTsKLQkJCQkJaWYgKCgoQm9vbGVhbikgZW50cnkuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlmIChlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIElCZWFuSW5mb0NvbnRyaWJ1dG9yKQotCQkJCQkJCXByb2Nlc3NCZWFuaW5mb0VudHJpZXMoKChJQmVhbkluZm9Db250cmlidXRvcikgZW50cnkuZ2V0S2V5KCkpLmdldEJlYW5JbmZvRW50cnlDb250cmlidXRpb25zKGluZm8pLAotCQkJCQkJCQkJY29udHJvbGxlciwgaW5mby5nZXRKYXZhUHJvamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0JCQkKLQkJCQkKLQkJCS8vIEFuZCBmaW5hbGx5IHJ1biB0aHJvdWdoIHRoZSBleHBsaWNpdCBjb250cmlidXRvcnMuCQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBsaWNpdENvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIElCZWFuSW5mb0NvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZXhwbGljaXRDb250cmlidXRvcnNbaV07Ci0JCQkJcHJvY2Vzc0JlYW5pbmZvRW50cmllcyhjb250cmlidXRvci5nZXRCZWFuSW5mb0VudHJ5Q29udHJpYnV0aW9ucyhpbmZvKSwgY29udHJvbGxlciwgaW5mby5nZXRKYXZhUHJvamVjdCgpKTsKLQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKSB7Ci0JCQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkJLy8gZG8gbm90aGluZy4gYnkgZGVmYXVsdCBwbGF0Zm9ybSBsb2dzLgotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHs7Ci0JCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkJKChJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKSBjb250cmlidXRvcikuY29udHJpYnV0ZUNsYXNzcGF0aHMoY29udHJvbGxlcik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gQWRkIHRoZSBjb21tb24gdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoLiAoU2luY2Ugd2UgYXJlIG5vdyBhIGphcnJlZCBwbHVnaW4sIHRoZSBjb21tb24gaXMgbm90IHRoZSBwbHVnaW4gamFyIGl0c2VsZikuCi0JCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgoQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksIChJUGF0aCkgbnVsbCwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9VU0VSX0NMQVNTUEFUSCwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIEFkZCB0aGUgYmVhbmluZm92bS5qYXIgYW5kIGFueSBubHMgdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoLgotCQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAidm0vYmVhbmluZm92bS5qYXIiLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuQVBQRU5EX1VTRVJfQ0xBU1NQQVRILCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnkgZ2V0KElDbGFzc3BhdGhFbnRyeVtdIGFycmF5LCBTZWFyY2hwYXRoRW50cnkgc2UpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoYXJyYXlbaV0uZ2V0RW50cnlLaW5kKCkgPT0gc2UuZ2V0S2luZCgpICYmIGFycmF5W2ldLmdldFBhdGgoKS5lcXVhbHMoc2UuZ2V0UGF0aCgpKSkKLQkJCQkJcmV0dXJuIGFycmF5W2ldOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQmVhbmluZm9zRG9jRW50cnlbXSBFTVBUWV9FTlRSSUVTID0gbmV3IElCZWFuaW5mb3NEb2NFbnRyeVswXTsKLQkJCi0JCS8qCi0JCSAqIENvbnRyaWJ1dGUgY2xhc3NwYXRocyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJZiBkb2MgaXMgcGFzc2VkIGluLCB0aGVuIHRoaXMgaXMgdGhlIHRvcCBsZXZlbCBhbmQKLQkJICogYWxsIHNob3VsZCBiZSBhZGRlZC4gSWYgbm8gZG9jLCB0aGVuIHRoaXMgaXMgcHJlLXJlcSdkIHByb2plY3QsIGFuZCB0aGVuIHdlIHdpbGwgaGFuZGxlIGV4cG9ydGVkIGVudHJpZXMgb25seS4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGhzRm9yUHJvamVjdCgKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyLAotCQkJSVByb2plY3QgcHJvamVjdCwKLQkJCUJlYW5pbmZvc0RvYyBkb2MsCi0JCQlib29sZWFuIHRvcGxldmVsUHJvamVjdCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gcmF3UGF0aCA9IGpQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCi0JCQkvLyBTZWFyY2ggcGF0aCBvZiB0aGlzIHByb2plY3QKLQkJCUlCZWFuaW5mb3NEb2NFbnRyeVtdIGVudHJpZXMgPSAoZG9jICE9IG51bGwpID8gZG9jLmdldFNlYXJjaHBhdGgoKSA6IEVNUFRZX0VOVFJJRVM7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCUlCZWFuaW5mb3NEb2NFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkJaWYgKGVudHJ5IGluc3RhbmNlb2YgQmVhbmluZm9FbnRyeSkgewotCQkJCQlCZWFuaW5mb0VudHJ5IGJlID0gKEJlYW5pbmZvRW50cnkpIGVudHJ5OwotCQkJCQlpZiAodG9wbGV2ZWxQcm9qZWN0IHx8IGJlLmlzRXhwb3J0ZWQoKSkgewotCQkJCQkJLy8gRmlyc3QgcHJvamVjdCBvciB0aGlzIGlzIGFuIGV4cG9ydGVkIGJlYW5pbmZvLCBzbyB3ZSBwcm9jZXNzIGl0LgotCQkJCQkJcHJvY2Vzc0JlYW5pbmZvRW50cnkoYmUsIGNvbnRyb2xsZXIsIGpQcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAobmF0dXJlICE9IG51bGwpewotCQkJCQkvLyBKdXN0IGEgc2VhcmNoIHBhdGggZW50cnkuIFRoZXJlIGlzIG5vIGJlYW5pbmZvIGphciB0byBwaWNrIHVwLgotCQkJCQkvLyBXZSBoYXZlIGEgbmF0dXJlLCBzbyB3ZSBwcm9jZXNzIHNlYXJjaCBwYXRoLgotCQkJCQlTZWFyY2hwYXRoRW50cnkgc2UgPSAoU2VhcmNocGF0aEVudHJ5KSBlbnRyeTsKLQkJCQkJaWYgKCF0b3BsZXZlbFByb2plY3QpIHsKLQkJCQkJCS8vIFdlIGFyZSBpbiBhIG5lc3RlZCBwcm9qZWN0LCBmaW5kIHRoZSByYXcgY2xhc3NwYXRoIGVudHJ5IHRvIHNlZQotCQkJCQkJLy8gaWYgdGhpcyBlbnRyeSBpcyBleHBvcnRlZC4gT25seSBkbyBpdCBpZiBleHBvcnRlZC4gKE5vdGU6IGV4cG9ydGVkIGlzIG9ubHkgdXNlZCBvbiBub24tc291cmNlLiBTb3VyY2UgYXJlIGFsd2F5cyBleHBvcnRlZCkuCi0JCQkJCQlJQ2xhc3NwYXRoRW50cnkgY3BlID0gZ2V0KHJhd1BhdGgsIHNlKTsKLQkJCQkJCWlmIChjcGUgPT0gbnVsbCB8fCAoY3BlLmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFICYmICFjcGUuaXNFeHBvcnRlZCgpKSkgewotCQkJCQkJCWNvbnRpbnVlOyAvLyBOb3QgZXhpc3Qgb3Igbm90IGV4cG9ydGVkLCBzbyB3ZSBkb24ndCB3YW50IGl0IGhlcmUgZWl0aGVyLgotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIHBrZyA9IHNlLmdldFBhY2thZ2UoKTsKLQkJCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCQkvLyBFeHBsaWNpdCBzZWFyY2ggcGF0aAotCQkJCQkJaWYgKCFjb21wdXRlZFNlYXJjaFBhdGguY29udGFpbnMocGtnKSkKLQkJCQkJCQljb21wdXRlZFNlYXJjaFBhdGguYWRkKHBrZyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBXZSBubyBsb25nZXIgYWxsb3cgdGhpcywgYnV0IGp1c3QgdG8gYmUgb24gc2FmZSBzaWRlIHdlIHRlc3QgZm9yIGl0LgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0JlYW5pbmZvRW50cmllcygKLQkJCUJlYW5pbmZvRW50cnlbXSBlbnRyaWVzLAotCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIsCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAoZW50cmllcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQkJCQlwcm9jZXNzQmVhbmluZm9FbnRyeShlbnRyaWVzW2ldLCBjb250cm9sbGVyLCBqYXZhUHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQmVhbmluZm9FbnRyeSgKLQkJCUJlYW5pbmZvRW50cnkgZW50cnksCi0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlciwKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCU9iamVjdFtdIGNwcyA9IGVudHJ5LmdldENsYXNzcGF0aChqYXZhUHJvamVjdCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNwcy5sZW5ndGg7IGorKykgewotCQkJCU9iamVjdCBjcCA9IGNwc1tqXTsKLQkJCQlpZiAoY3AgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQkJY29udHJvbGxlci5jb250cmlidXRlUHJvamVjdCgoSVByb2plY3QpIGNwKTsKLQkJCQllbHNlIGlmIChjcCBpbnN0YW5jZW9mIFN0cmluZykKLQkJCQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0U3RyaW5nUGF0aFRvVVJMKChTdHJpbmcpIGNwKSwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9VU0VSX0NMQVNTUEFUSCk7Ci0JCQkJZWxzZSBpZiAoY3AgaW5zdGFuY2VvZiBJUGF0aCkgewotCQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBjcDsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwYXRoLnNlZ21lbnQoMCkpOwotCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgoYnVuZGxlLCBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSksIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfVVNFUl9DTEFTU1BBVEgsIHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG5hdHVyZSAhPSBudWxsKSB7Ci0JCQkJLy8gTm93IGFkZCBpbiB0aGUgcGFja2FnZSBuYW1lcy4KLQkJCQlTZWFyY2hwYXRoRW50cnlbXSBzZWVzID0gZW50cnkuZ2V0U2VhcmNoUGF0aHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJU2VhcmNocGF0aEVudHJ5IHNlYXJjaHBhdGhFbnRyeSA9IHNlZXNbal07Ci0JCQkJCWlmICghY29tcHV0ZWRTZWFyY2hQYXRoLmNvbnRhaW5zKHNlYXJjaHBhdGhFbnRyeS5nZXRQYWNrYWdlKCkpKQotCQkJCQkJY29tcHV0ZWRTZWFyY2hQYXRoLmFkZChzZWFyY2hwYXRoRW50cnkuZ2V0UGFja2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db25maWd1cmF0aW9uKGZpbmFsIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGxpY2l0Q29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkvLyBkbyBub3RoaW5nLiBieSBkZWZhdWx0IHBsYXRmb3JtIGxvZ3MuCi0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCUlCZWFuSW5mb0NvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZXhwbGljaXRDb250cmlidXRvcnNbaWldOwotCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkoKElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IpIGNvbnRyaWJ1dG9yKS5jb250cmlidXRlVG9Db25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1JlZ2lzdHJ5KGZpbmFsIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlpZiAobmF0dXJlICE9IG51bGwpCi0JCQkJbmF0dXJlLnNldFByb3h5U2VhcmNoUGF0aChyZWdpc3RyeSwgY29tcHV0ZWRTZWFyY2hQYXRoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwbGljaXRDb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCS8vIGRvIG5vdGhpbmcuIGJ5IGRlZmF1bHQgcGxhdGZvcm0gbG9ncy4KLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJSUJlYW5JbmZvQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBleHBsaWNpdENvbnRyaWJ1dG9yc1tpaV07Ci0JCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKQotCQkJCQkJCSgoSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikgY29udHJpYnV0b3IpLmNvbnRyaWJ1dGVUb1JlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQkJCQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb1Byb3h5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9Qcm94eUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY4MmI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb1Byb3h5Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQmVhbmluZm9Qcm94eUNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIGhvbGRzIHRoZSBwcm94eSBjb25zdGFudHMgZm9yIGFjY2VzcyBpbiBiZWFuaW5mby4gSXQgaXMgY3JlYXRlZCBvbiBhIHBlci1yZWdpc3RyeSBiYXNpcyBhbmQgc3RvcmVkIGluIHRoZSBjb25zdGFudHMgc2VjdGlvbiBvZiB0aGUgcmVnaXN0cnkgc28KLSAqIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYXMgbmVlZGVkLgotICogPHA+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/IGVudHJ5LmdldEVudHJ5S2luZCgpIDogQklFX1BMVUdJTjsKLQl9Ci0JCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0UGF0aCgpIDogcGx1Z2luUGF0aDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAodGhpcyA9PSBvdGhlcikKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgQmVhbmluZm9FbnRyeSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gUmV0dXJuIGVxdWFsIGlmIHRoZSBjbGFzc3BhdGggZW50cnkgaXMgdGhlIHNhbWUgY2xhc3NwYXRoIGVudHJ5IG9yIHBsdWdpbiBwYXRoIGVudHJ5LgotCQkvLyBUaGUgc2VhcmNoIHBhdGggZG9lc24ndCBoYXZlIGFueSBhZmZlY3Qgb24gdGhlIHNlbWFudGljIGVxdWFsaXR5LgotCQlCZWFuaW5mb0VudHJ5IG90aGVyRW50cnkgPSAoQmVhbmluZm9FbnRyeSkgb3RoZXI7Ci0JCWlmIChpc0V4cG9ydGVkICE9IG90aGVyRW50cnkuaXNFeHBvcnRlZCkKLQkJCXJldHVybiBmYWxzZTsJCi0JCWlmIChlbnRyeSAhPSBudWxsKQotCQkJcmV0dXJuIGVudHJ5LmVxdWFscyhvdGhlckVudHJ5LmVudHJ5KTsKLQkJCi0JCXJldHVybiBwbHVnaW5QYXRoLmVxdWFscyhvdGhlckVudHJ5LnBsdWdpblBhdGgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoZW50cnkgIT0gbnVsbCkKLQkJCXJldHVybiBlbnRyeS5oYXNoQ29kZSgpIF4gKGlzRXhwb3J0ZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gcGx1Z2luUGF0aC5oYXNoQ29kZSgpIF4gKGlzRXhwb3J0ZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9QbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOWFmOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogQmVhbmluZm9QbHVnaW4uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTkgJCAgJERhdGU6IDIwMDUvMTAvMTQgMTc6NDU6MDQgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuaW5mb05hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkNvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nLkNvbnRhaW5lckNvbnRyaWJ1dGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mby5Db250YWluZXJQYXRoczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuRWNsaXBzZUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIFRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZSBwbHVnaW4uCi0gKi8KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9CRUFOSU5GT19QTFVHSU5JRCA9ICJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iOwkvLyBQbHVnaW4gSUQsIHVzZWQgZm9yIFF1YWxpZmllZE5hbWUuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9CRUFOSU5GT19PVkVSUklERVMgPSAib3ZlcnJpZGVzIjsJLy8gSUQgb2YgdGhlIG92ZXJyaWRlcyBleHRlbnNpb24gcG9pbnQuIC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBCZWFuaW5mb1BsdWdpbiBCRUFOSU5GT19QTFVHSU4gPSBudWxsOwotCQkKLQlwdWJsaWMgQmVhbmluZm9QbHVnaW4oKSB7CQotCQlCRUFOSU5GT19QTFVHSU4gPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBBY2Nlc3NvciBtZXRob2QgdG8gZ2V0IHRoZSBzaW5nbGV0b24gcGx1Z2luLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmVhbmluZm9QbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gQkVBTklORk9fUExVR0lOOwotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsIE92ZXJyaWRlIGZpbGUgbmFtZSB1c2VkIHdoZW4gbmVlZCB0byBhcHBseSBhbiBvdmVycmlkZSB0byBhIGNsYXNzIHRoYXQgaXMgYXQgdGhlIHJvb3QuCi0JICogQSByb290IGlzIG9uZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHN1cGVyIHR5cGUuIFRoZXNlIGFyZSA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiwgaW50ZXJmYWNlcywgYW5kIGFueQotCSAqIHVuZGVmaW5lZCBjbGFzc2VzIChpLmUuIGNsYXNzZXMgdGhhdCBkb24ndCBhY3R1YWxseSBleGlzdCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9ICIuLlJPT1QuLiI7IC8vJE5PTi1OTFMtMSQKLQkKLQotCS8qKgotCSAqIFNwZWNpYWwgb3ZlcnJpZGUgc2NoZW1lIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGphdmEgY2xhc3MuIChBcyBpbiAiWDpST09UIy8vQHJvb3QiKS4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1NDSEVNQSA9ICJYIjsKLQkKLQkvKioKLQkgKiBTcGVjaWFsIG92ZXJyaWRlIG9wYXF1ZSBwYXJ0IHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGphdmEgY2xhc3MuIChBcyBpbiAiWDpST09UIy8vQHJvb3QiKS4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX09QQVFVRSA9ICJST09UIjsKLQkKLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHVzZWQgb24gYW55IG92ZXJyaWRlIGZpbGUgd2hlbiB5b3UgcGFzcyBpbiBhIHBhdGggdGhyb3VnaCB0aGUgbWV0aG9kIHRoYXQgdGFrZXMgYSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUlJJREVfRVhURU5TSU9OID0gIm92ZXJyaWRlIjsJLy8kTk9OLU5MUy0xJAotCQkKLQkKLQkvKgotCSAqIE1hcCBvZiBvcGVuIG5hdHVyZXMuIFRoaXMgbWFwIGlzIG5lZWRlZCBiZWNhdXNlIG9uIHNodXRkb3duIG9mIGJlYW5pbmZvIHBsdWdpbiB3ZSBuZWVkCi0JICogdG8gc2h1dGRvd24gdGhlIG5hdHVyZXMuIElmIHdlIGRvbid0IGRvIHRoYXQgdGhlcmUgaXMgYSBzbGlnaHQgcG9zc2liaWxpdHkgb2YgYW4gZXJyb3IKLQkgKiBiZWNhdXNlIHByb3h5IHBsdWdpbiB3aWxsIHNodXRkb3duIGFuZCB0aGlzIGNhbiBjYXVzZSBhIGNhbGxiYWNrIGludG8gYmVhbmluZm8gd2hpY2ggaGFzCi0JICogYWxyZWFkeSBiZWVuIHNodXRkb3duLiBJdCBjYWxscyBiYWNrIHRocm91Z2ggdGhlIHJlZ2lzdHJ5IGxpc3RlbmVyIHRoYXQgQmVhbmluZm9OYXR1cmUKLQkgKiBhZGRlZCB0byB0aGUgcmVnaXN0cnkgdG8gbm90aWZ5IHRoYXQgdGhlIHJlZ2lzdHJ5IGlzIGJlaW5nIHNodXRkb3duLgotCSAqIAotCSAqIEFsc28gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIgbmVlZHMgdG8ga25vdyBzbyB0aGF0IGl0IGNhbiB0ZWxsIGl0IHRoZSBwcm9qZWN0IGlzIGNsb3Npbmcgb3IKLQkgKiBiZWluZyBkZWxldGVkIG9yIHRoYXQgaXQgbmVlZHMgdG8gYmUgY2xlYXJlZCBkdWUgdG8gYSBjbGVhciByZXF1ZXN0LgotCSAqLwotCXByaXZhdGUgTWFwIG9wZW5OYXR1cmVzOwotCQotCXByaXZhdGUgQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcgYmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnNNYXBwaW5nOwotCXByaXZhdGUgQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcgY29udHJpYnV0b3JDb250cmlidXRpb25zTWFwcGluZzsKLQlwcml2YXRlIE1hcCBwbHVnaW5Ub0JlYW5pbmZvRW50cnlDb250cmlidXRpb25zOwotCXByaXZhdGUgTWFwIHBsdWdpblRvQ29udHJpYnV0b3JzOwotCQotCS8qCi0JICogT3ZlcnJpZGUgY29udHJpYnV0aW9ucyBmcm9tIGV4dGVuc2lvbiBwb2ludC4KLQkgKiBvY0ZyYWdtZW50czogQXJyYXkgb2YgZnJhZ21lbnRzIHBhdGhzLiBXaGVuIGEgbWF0Y2ggaXMgZm91bmQgZm9yIGEgcGF0aCwgdGhlIGluZGV4Ci0JICogCQlpcyB0aGUgaW5kZXggaW50byB0aGUgb2NDb250YWluZXJJZHMgYW5kIG9jUGx1Z2luSWRzIGFycmF5IGZvciB0aGUgY29udHJpYnV0aW9ucy4KLQkgKiBvY0NvbnRhaW5lcklkczogVGhlIGZpcnN0IGRpbWVuc2lvbiBpcyB0aGUgaW5kZXggb2YgdGhlIGZyYWdtZW50IHRoYXQgdGhlIGxpc3Qgb2YgT3ZlcnJpZGVDb250cmlidXRpb25zIGlzIGZvci4KLQkgKiAJCVRoZSBzZWNvbmQgZGltZW5zaW9uIGlzIHRoZSBhcnJheSBvZiBjb250cmlidXRpb25zIGZvciB0aGF0IGZyYWdtZW50LCBvbmUgcGVyIGNvbnRhaW5lciBpZC4KLQkgKiBvY1BsdWdpbklkczogVGhlIGZpcnN0IGRpbWVuc2lvbiBpcyB0aGUgaW5kZXggb2YgdGhlIGZyYWdtZW50IHRoYXQgdGhlIGxpc3Qgb2YgT3ZlcnJpZGVDb250cmlidXRpb25zIGlzIGZvci4KLQkgKiAJCVRoZSBzZWNvbmQgZGltZW5zaW9uIGlzIHRoZSBhcnJheSBvZiBjb250cmlidXRpb25zIGZvciB0aGF0IGZyYWdtZW50LCBvbmUgcGVyIHBsdWdpbiBpZC4KLQkgKiAKLQkgKiBJZiBhIHBhcnRpY3VsYXIgZnJhZ21lbnQgZG9lc24ndCBoYXZlIGFueSBlbnRyaWVzIG9mIGNvbnRhaW5lciBhbmQvb3IgcGx1Z2luLCB0aGVuIEVNUFRZX09DIGlzIHVzZWQgZm9yIHRoYXQKLQkgKiBlbnRyeSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIG51bGwuCi0JICogCi0JICogSG93IHRoaXMgaXMgdXNlZCBpcyBmb3IgYSBwYXJ0aWN1bGFyIHBhdGggcmVxdWVzdGVkLCB0aGUgb2NGcmFnbWVudHMgd2lsbCBiZSBzZWFyY2hlZCBmb3IgdGhlIGZyYWdtZW50cyB0aGF0Ci0JICogYXJlIGFwcHJvcHJpYXRlLCB0aGVuIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgaXMgdXNlZCB0byB3YWxrIHRocm91Z2ggdGhlIE9DW10gYXJyYXkgcmV0dXJuZWQgZnJvbSB0aGUgb2NDb250YWluZXJJZHMKLQkgKiBvciBvY1BsdWdpbklkcy4gRWFjaCBjb250cmlidXRpb24gd291bGQgYmUgY2hlY2tlZCB0byBzZWUgaWYgdGhlIGNvbnRhaW5lciBpZC9wbHVnaW4gaWQgaXMgaW4gdGhlIHZpc2libGUgY2xhc3NwYXRoICh0aHJvdWdoIAotCSAqIHRoZSBpbmZvIGRhdGEgc3RvcmVkIGluIHRoZSBwZXJzaXN0ZW50IHByb3BlcnR5KS4gSWYgaXQgaXMsIHRoZW4gdGhlIG92ZXJyaWRlcyBmcm9tIHRoYXQgY29udHJpYnV0aW9uIHdpbGwgYmUgdXNlZC4KLQkgKi8KLQlwcml2YXRlIElQYXRoIG9jRnJhZ21lbnRzW107Ci0JcHJpdmF0ZSBPdmVycmlkZUNvbnRyaWJ1dGlvbltdW10gb2NDb250YWluZXJJZHM7Ci0JcHJpdmF0ZSBPdmVycmlkZUNvbnRyaWJ1dGlvbltdW10gb2NQbHVnaW5JZHM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3ZlcnJpZGVDb250cmlidXRpb25bXSBFTVBUWV9PQyA9IG5ldyBPdmVycmlkZUNvbnRyaWJ1dGlvblswXTsJLy8gVXNlZCBmb3IgYW4gZW1wdHkgY29udHJpYnV0aW9uIGxpc3QgZm9yIGEgZnJhZ21lbnQuCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIEJlYW5pbmZvRW50cnlbXSBnZXRDb250YWluZXJJZEJlYW5JbmZvcyhTdHJpbmcgY29udGFpbmVySUQsIFN0cmluZ1tdIGNvbnRhaW5lclBhdGhzKSB7Ci0JCWlmIChiZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9uc01hcHBpbmcgPT0gbnVsbCkKLQkJCXByb2Nlc3NCZWFuSW5mb0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KCk7Ci0JCXJldHVybiAoQmVhbmluZm9FbnRyeVtdKSBiZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9uc01hcHBpbmcuZ2V0Q29udHJpYnV0b3JzKGNvbnRhaW5lcklELCBjb250YWluZXJQYXRocyk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQmVhbmluZm9FbnRyeVtdIGdldFBsdWdpbkJlYW5JbmZvcyhTdHJpbmcgcGx1Z2luaWQpIHsKLQkJaWYgKHBsdWdpblRvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnMgPT0gbnVsbCkKLQkJCXByb2Nlc3NCZWFuSW5mb0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KCk7Ci0JCXJldHVybiAoQmVhbmluZm9FbnRyeVtdKSBwbHVnaW5Ub0JlYW5pbmZvRW50cnlDb250cmlidXRpb25zLmdldChwbHVnaW5pZCk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0UGx1Z2luQ29udHJpYnV0b3JzKFN0cmluZyBwbHVnaW5pZCkgewotCQlpZiAocGx1Z2luVG9Db250cmlidXRvcnMgPT0gbnVsbCkKLQkJCXByb2Nlc3NCZWFuSW5mb0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KCk7Ci0JCXJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pIHBsdWdpblRvQ29udHJpYnV0b3JzLmdldChwbHVnaW5pZCk7Ci0JfQkKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbnRhaW5lcklkQ29udHJpYnV0b3JzKFN0cmluZyBjb250YWluZXJJRCwgU3RyaW5nW10gY29udGFpbmVyUGF0aHMpIHsKLQkJaWYgKGNvbnRyaWJ1dG9yQ29udHJpYnV0aW9uc01hcHBpbmcgPT0gbnVsbCkKLQkJCXByb2Nlc3NCZWFuSW5mb0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KCk7Ci0JCXJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pIGNvbnRyaWJ1dG9yQ29udHJpYnV0aW9uc01hcHBpbmcuZ2V0Q29udHJpYnV0b3JzKGNvbnRhaW5lcklELCBjb250YWluZXJQYXRocyk7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9CRUFOSU5GT19DT05UUklCVVRJT05fRVhURU5TSU9OX1BPSU5UID0gUElfQkVBTklORk9fUExVR0lOSUQrIi5yZWdpc3RyYXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1JFR0lTVFJBVElPTiA9ICJyZWdpc3RyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQkVBTklORk8gPSAiYmVhbmluZm8iOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX09WRVJSSURFID0gIm92ZXJyaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0NPTlRSSUJVVE9SID0gImNvbnRyaWJ1dG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1BBQ0tBR0UgPSAicGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9QQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHByb2Nlc3NCZWFuSW5mb0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KCkgewotCQlDb250cmlidXRvckV4dGVuc2lvblBvaW50SW5mbyBpbmZvID0gUHJveHlQbHVnaW4ucHJvY2Vzc0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KFBJX0JFQU5JTkZPX0NPTlRSSUJVVElPTl9FWFRFTlNJT05fUE9JTlQpOwotCQlDb25maWd1cmF0aW9uRWxlbWVudFJlYWRlciByZWFkZXIgPSBuZXcgQ29uZmlndXJhdGlvbkVsZW1lbnRSZWFkZXIoKTsKLQkJLy8gUHJvY2VzcyB0aGUgY29udGFpbmVyIElEcyBmaXJzdC4gV2UgY2FuJ3QgdXNlIHRoZSBpbmZvIGRpcmVjdGx5IGJlY2F1c2UgdGhlIGFjdHVhbCBjb25maWd1cmF0aW9uIGVsZW1lbnRzIG9mIGludGVyZXN0IGFyZQotCQkvLyBzdWItZWxlbWVudHMgb2YgdGhlIGluZm8uIFRoZSBpbmZvIGNvbnRhaW5zIHRoZSBjb250YWluZXIgcGF0aCB0aGF0IHdlIG5lZWQuCi0JCWJlYW5pbmZvRW50cnlDb250cmlidXRpb25zTWFwcGluZyA9IG5ldyBDb250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZyhCZWFuaW5mb0VudHJ5LmNsYXNzKTsKLQkJY29udHJpYnV0b3JDb250cmlidXRpb25zTWFwcGluZyA9IG5ldyBDb250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQuY2xhc3MpOwotCi0JCU1hcCBmcmFnbWVudHNUb0lkcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluZm8uY29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbnMuY29udGFpbmVySWRUb0NvbnRyaWJ1dGlvbnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeT0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgY29udGFpbmVyaWQgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUNvbnRhaW5lckNvbnRyaWJ1dGlvbkVudHJ5W10gY29udHJpYkVsZW1lbnRzID0gKENvbnRhaW5lckNvbnRyaWJ1dGlvbkVudHJ5W10pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUNvbnRhaW5lckNvbnRyaWJ1dGlvbkVudHJ5IGNvbnRyaWJFbGVtZW50ID0gY29udHJpYkVsZW1lbnRzW2ldOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgY29udHJpYkVsZW1lbnQuZ2V0Q29udHJpYnV0aW9uKCk7Ci0JCQkJaWYgKFBJX1JFR0lTVFJBVElPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbigpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlbltqXTsKLQkJCQkJCWlmIChQSV9CRUFOSU5GTy5lcXVhbHMoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCQkJCS8vIFRoaXMgaXMgYSBiZWFuaW5mbyBlbnRyeQotCQkJCQkJCUJlYW5pbmZvRW50cnkgYmUgPSBCZWFuaW5mb0VudHJ5LnJlYWRFbnRyeShyZWFkZXIsIGNoaWxkLCBudWxsKTsKLQkJCQkJCQlpZiAoYmUgIT0gbnVsbCkKLQkJCQkJCQkJYmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnNNYXBwaW5nLmFkZENvbnRyaWJ1dGlvbihjb250YWluZXJpZCwgY29udHJpYkVsZW1lbnQuZ2V0Q29udGFpbmVyUGF0aFBhdHRlcm4oKSwgYmUpOwotCQkJCQkJfSBlbHNlIGlmIChQSV9PVkVSUklERS5lcXVhbHMoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCQkJCWFkZE92ZXJyaWRlRW50cnkoZnJhZ21lbnRzVG9JZHMsIHRydWUsIGNvbnRhaW5lcmlkLCBjb250cmliRWxlbWVudC5nZXRDb250YWluZXJQYXRoUGF0dGVybigpLCBjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKFBJX0NPTlRSSUJVVE9SLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJY29udHJpYnV0b3JDb250cmlidXRpb25zTWFwcGluZy5hZGRDb250cmlidXRpb24oY29udGFpbmVyaWQsIGNvbnRyaWJFbGVtZW50LmdldENvbnRhaW5lclBhdGhQYXR0ZXJuKCksIGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCi0JCWJlYW5pbmZvRW50cnlDb250cmlidXRpb25zTWFwcGluZy5maW5hbGl6ZU1hcHBpbmcoKTsKLQkJY29udHJpYnV0b3JDb250cmlidXRpb25zTWFwcGluZy5maW5hbGl6ZU1hcHBpbmcoKTsKLQkJCi0JCS8vIE5vdyBwcm9jZXNzIHRoZSBwbHVnaW4gSURzLgotCQlwbHVnaW5Ub0JlYW5pbmZvRW50cnlDb250cmlidXRpb25zID0gbmV3IEhhc2hNYXAoaW5mby5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnMuc2l6ZSgpKTsJCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmZvLnBsdWdpblRvQ29udHJpYnV0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5PSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBwbHVnaW5JZCA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBjb25maWdFbGVtZW50c1tpXTsKLQkJCQlpZiAoUElfUkVHSVNUUkFUSU9OLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuW2pdOwotCQkJCQkJaWYgKFBJX0JFQU5JTkZPLmVxdWFscyhjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJLy8gVGhpcyBpcyBhIGJlYW5pbmZvIGVudHJ5Ci0JCQkJCQkJQmVhbmluZm9FbnRyeSBiZSA9IEJlYW5pbmZvRW50cnkucmVhZEVudHJ5KHJlYWRlciwgY2hpbGQsIG51bGwpOwotCQkJCQkJCWlmIChiZSAhPSBudWxsKQotCQkJCQkJCQlhZGRFbnRyeShwbHVnaW5Ub0JlYW5pbmZvRW50cnlDb250cmlidXRpb25zLCBwbHVnaW5JZCwgYmUpOwotCQkJCQkJfSBlbHNlIGlmIChQSV9PVkVSUklERS5lcXVhbHMoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCQkJCWFkZE92ZXJyaWRlRW50cnkoZnJhZ21lbnRzVG9JZHMsIGZhbHNlLCBwbHVnaW5JZCwgbnVsbCwgY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChQSV9DT05UUklCVVRPUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCQlpZiAocGx1Z2luVG9Db250cmlidXRvcnMgPT0gbnVsbCkKLQkJCQkJCQlwbHVnaW5Ub0NvbnRyaWJ1dG9ycyA9IG5ldyBIYXNoTWFwKDUpOwkvLyBUaGVzZSBhcmUgcmFyZSwgZG9uJ3QgY3JlYXRlIHVudGlsIG5lY2Vzc2FyeS4KLQkJCQkJCWFkZEVudHJ5KHBsdWdpblRvQ29udHJpYnV0b3JzLCBwbHVnaW5JZCwgZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJLy8gTm93IGdvIHRocm91Z2ggYW5kIHR1cm4gYWxsIG9mIHRoZSBjb250cmlidXRpb24gbGlzdHMgaW50byBhcnJheXMuCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBsdWdpblRvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJZW50cnkuc2V0VmFsdWUoKChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpKS50b0FycmF5KG5ldyBCZWFuaW5mb0VudHJ5WygoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkuc2l6ZSgpXSkpOwotCQl9Ci0JCQotCQlpZiAocGx1Z2luVG9Db250cmlidXRvcnMgPT0gbnVsbCkKLQkJCQlwbHVnaW5Ub0NvbnRyaWJ1dG9ycyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnkuCi0JCWVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGx1Z2luVG9Db250cmlidXRvcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQllbnRyeS5zZXRWYWx1ZSgoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnRvQXJyYXkobmV3IElDb25maWd1cmF0aW9uRWxlbWVudFsoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnNpemUoKV0pKTsKLQkJCX0JCQkKLQkJfQotCQkKLQkJLy8gTm93IGhhbmRsZSB0aGUgZW50aXJlIGxpc3Qgb2YgZnJhZ21lbnRzLgotCQlvY0ZyYWdtZW50cyA9IG5ldyBJUGF0aFtmcmFnbWVudHNUb0lkcy5zaXplKCldOwotCQlvY0NvbnRhaW5lcklkcyA9IG5ldyBPdmVycmlkZUNvbnRyaWJ1dGlvbltvY0ZyYWdtZW50cy5sZW5ndGhdW107Ci0JCW9jUGx1Z2luSWRzID0gbmV3IE92ZXJyaWRlQ29udHJpYnV0aW9uW29jRnJhZ21lbnRzLmxlbmd0aF1bXTsKLQkJSXRlcmF0b3IgaXRlcjsKLQkJaW50IGZyYWdJbmRleDsKLQkJZm9yIChpdGVyID0gZnJhZ21lbnRzVG9JZHMuZW50cnlTZXQoKS5pdGVyYXRvcigpLCBmcmFnSW5kZXg9MDsgaXRlci5oYXNOZXh0KCk7IGZyYWdJbmRleCsrKSB7Ci0JCQlNYXAuRW50cnkgbWFwRW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCW9jRnJhZ21lbnRzW2ZyYWdJbmRleF0gPSAoSVBhdGgpIG1hcEVudHJ5LmdldEtleSgpOwotCQkJTWFwW10gbWFwVmFsdWUgPSAoTWFwW10pIG1hcEVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAobWFwVmFsdWVbMF0gPT0gbnVsbCkKLQkJCQlvY0NvbnRhaW5lcklkc1tmcmFnSW5kZXhdID0gRU1QVFlfT0M7Ci0JCQllbHNlIHsKLQkJCQlNYXAgY29udGFpbmVycyA9IG1hcFZhbHVlWzBdOwotCQkJCUxpc3Qgb2NDb250cmlidXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3Igb2NJdGVyYXRvciA9IGNvbnRhaW5lcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBvY0l0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGNvbnRhaW5lckVudHJ5ID0gKE1hcC5FbnRyeSkgb2NJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBjb250YWluZXJJRCA9IChTdHJpbmcpIGNvbnRhaW5lckVudHJ5LmdldEtleSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIHBhdHRlcm5JdGVyYXRvciA9ICgoTWFwKSBjb250YWluZXJFbnRyeS5nZXRWYWx1ZSgpKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IHBhdHRlcm5JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNYXAuRW50cnkgcGF0dGVybkVudHJ5ID0gKEVudHJ5KSBwYXR0ZXJuSXRlcmF0b3IubmV4dCgpOwotCQkJCQkJT3ZlcnJpZGVDb250cmlidXRpb24gb2MgPSBuZXcgT3ZlcnJpZGVDb250cmlidXRpb24oKTsKLQkJCQkJCW9jLmlkID0gY29udGFpbmVySUQ7Ci0JCQkJCQlvYy5wYXR0ZXJuID0gKFBhdHRlcm4pIHBhdHRlcm5FbnRyeS5nZXRLZXkoKTsKLQkJCQkJCUxpc3RbXSBvY0xpc3RzID0gKExpc3RbXSkgcGF0dGVybkVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCQlvYy5wbHVnaW5JZHMgPSAoU3RyaW5nW10pIG9jTGlzdHNbMF0udG9BcnJheShuZXcgU3RyaW5nW29jTGlzdHNbMF0uc2l6ZSgpXSk7Ci0JCQkJCQlvYy5wYXRocyA9IChTdHJpbmdbXSkgb2NMaXN0c1sxXS50b0FycmF5KG5ldyBTdHJpbmdbb2NMaXN0c1sxXS5zaXplKCldKTsKLQkJCQkJCW9jQ29udHJpYnV0aW9ucy5hZGQob2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW9jQ29udGFpbmVySWRzW2ZyYWdJbmRleF0gPSAoT3ZlcnJpZGVDb250cmlidXRpb25bXSkgb2NDb250cmlidXRpb25zLnRvQXJyYXkobmV3IE92ZXJyaWRlQ29udHJpYnV0aW9uW29jQ29udHJpYnV0aW9ucy5zaXplKCldKTsKLQkJCX0KLQkJCWlmIChtYXBWYWx1ZVsxXSA9PSBudWxsKQotCQkJCW9jUGx1Z2luSWRzW2ZyYWdJbmRleF0gPSBFTVBUWV9PQzsKLQkJCWVsc2UgewotCQkJCU1hcCBwbHVnaW5zID0gbWFwVmFsdWVbMV07Ci0JCQkJT3ZlcnJpZGVDb250cmlidXRpb25bXSBvY0NvbnRyaWJ1dGlvbiA9IG9jUGx1Z2luSWRzW2ZyYWdJbmRleF0gPSBuZXcgT3ZlcnJpZGVDb250cmlidXRpb25bcGx1Z2lucy5zaXplKCldOwotCQkJCWludCBvY0luZGV4OwotCQkJCUl0ZXJhdG9yIG9jSXRlcmF0b3I7Ci0JCQkJZm9yIChvY0l0ZXJhdG9yID0gcGx1Z2lucy5lbnRyeVNldCgpLml0ZXJhdG9yKCksIG9jSW5kZXg9MDsgb2NJdGVyYXRvci5oYXNOZXh0KCk7IG9jSW5kZXgrKykgewotCQkJCQlNYXAuRW50cnkgcGx1Z2luRW50cnkgPSAoTWFwLkVudHJ5KSBvY0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJT3ZlcnJpZGVDb250cmlidXRpb24gb2MgPSBvY0NvbnRyaWJ1dGlvbltvY0luZGV4XSA9IG5ldyBPdmVycmlkZUNvbnRyaWJ1dGlvbigpOwotCQkJCQlvYy5pZCA9IChTdHJpbmcpIHBsdWdpbkVudHJ5LmdldEtleSgpOwotCQkJCQlMaXN0W10gb2NMaXN0cyA9IChMaXN0W10pIHBsdWdpbkVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCW9jLnBsdWdpbklkcyA9IChTdHJpbmdbXSkgb2NMaXN0c1swXS50b0FycmF5KG5ldyBTdHJpbmdbb2NMaXN0c1swXS5zaXplKCldKTsKLQkJCQkJb2MucGF0aHMgPSAoU3RyaW5nW10pIG9jTGlzdHNbMV0udG9BcnJheShuZXcgU3RyaW5nW29jTGlzdHNbMV0uc2l6ZSgpXSk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JfQotCQotCS8qCi0JICogQWRkIGFuIGVudHJ5IHRvIHRoZSBtYXAuIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCwgY3JlYXRlIGFuIGVudHJ5IGFzIGFuIGFycmF5LiBUaGVuIGFkZCB0aGUgZW50cnkgdG8gYXJyYXkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEVudHJ5KE1hcCBtYXAsIE9iamVjdCBrZXksIE9iamVjdCBlbnRyeSkgewotCQlMaXN0IG1hcEVudHJ5ID0gKExpc3QpIG1hcC5nZXQoa2V5KTsKLQkJaWYgKG1hcEVudHJ5ID09IG51bGwpIHsKLQkJCW1hcEVudHJ5ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCW1hcC5wdXQoa2V5LCBtYXBFbnRyeSk7Ci0JCX0KLQkJbWFwRW50cnkuYWRkKGVudHJ5KTsKLQl9Ci0JCi0JLyoKLQkgKiBBZGQgYW4gZW50cnkgdG8gdGhlIG1hcC4KLQkgKiBpZCBpcyB0aGUgY29udGFpbmVyIHBhdGggcGF0dGVybi9wbHVnaW4gaWQuCi0JICogCi0JICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgbWFwIGlzOgotCSAqIAlrZXk6IGZyYWdtZW50IG5hbWUKLQkgKiAJdmFsdWU6IE1hcFsyXSwgd2hlcmUgWzBdIGlzIGZvciBjb250YWluZXIgaWQsIGFuZCBbMV0gaXMgZm9yIHBsdWdpbiBpZHMuCi0JICogCQlNYXBbeF06Ci0JICogCQkJa2V5OiBjb250YWluZXIvcGx1Z2luIGlkCi0JICogCQkJdmFsdWU6IE1hcChwYXR0ZXJuLT5MaXN0KEZpbmFsT3ZlcnJpZGUpKSBmb3IgY29udGFpbmVyLCBvZiBGaW5hbE92ZXJyaWRlIGZvciBwbHVnaW4uIAotCSAqIAotCSAqIEZpbmFsT3ZlcnJpZGU6IExpc3RbMl0sIHdoZXJlIFswXSBpcyBsaXN0IG9mIHBsdWdpbiBpZHMgZm9yIHRoZSBvdmVycmlkZSwgYW5kIFsxXSBpcyBsaXN0IG9mIHBhdGhzIGZvciB0aGUgb3ZlcnJpZGUgZmlsZXMgcmVsYXRpdmUgdG8gdGhhdCBwbHVnaW4gaWQuCi0JICogCi0JICogQWZ0ZXIgYWxsIGRvbmUgdGhlc2UgbWFwcy9saXN0IHdpbGwgYmUgYm9pbGVkIGRvd24gdG8gdGhlIGFycmF5cyB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgbG9va3VwLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRPdmVycmlkZUVudHJ5KE1hcCBtYXAsIGJvb2xlYW4gY29udGFpbmVyLCBPYmplY3QgaWQsIFBhdHRlcm4gcGF0dGVybiwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVudHJ5KSB7Ci0JCQotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBlbnRyeS5nZXRBdHRyaWJ1dGVBc0lzKFBJX1BBQ0tBR0UpOwotCQlTdHJpbmcgcGx1Z2luID0gbnVsbDsKLQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBlbnRyeS5nZXRBdHRyaWJ1dGVBc0lzKFBJX1BBVEgpOwotCQlJUGF0aCBmcmFnbWVudCA9IG51bGw7IAotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDAgJiYgcGF0aFN0cmluZyAhPSBudWxsICYmIHBhdGhTdHJpbmcubGVuZ3RoKCkgPiAwKSB7IAotCQkJZnJhZ21lbnQgPSBuZXcgUGF0aChwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgJy8nKSk7Ci0JCQlpZiAocGF0aFN0cmluZy5jaGFyQXQocGF0aFN0cmluZy5sZW5ndGgoKS0xKSAhPSAnLycpCi0JCQkJcGF0aFN0cmluZyArPSAnLyc7Ci0JCQlpZiAocGF0aFN0cmluZy5jaGFyQXQoMCkgIT0gJy8nKQotCQkJCXBsdWdpbiA9IGVudHJ5LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKHBhdGhTdHJpbmcubGVuZ3RoKCkgPiA0KSB7Ci0JCQkJCWludCBwZW5kID0gcGF0aFN0cmluZy5pbmRleE9mKCcvJywgMSk7Ci0JCQkJCWlmIChwZW5kID09IC0xIHx8IHBlbmQgPj0gcGF0aFN0cmluZy5sZW5ndGgoKS0xKQotCQkJCQkJcmV0dXJuOwkvLyBpbnZhbGlkCi0JCQkJCXBsdWdpbiA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKDEsIHBlbmQpOwotCQkJCQlwYXRoU3RyaW5nID0gcGF0aFN0cmluZy5zdWJzdHJpbmcocGVuZCsxKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuOwkvLyBpbnZhbGlkCi0JCQl9Ci0JCX0KLQkJaWYgKHBhdGhTdHJpbmcubGVuZ3RoKCkgPCAyKQotCQkJcmV0dXJuOwkvLyBpbnZhbGlkCi0KLQkJTWFwW10gbWFwRW50cnkgPSAoTWFwW10pIG1hcC5nZXQoZnJhZ21lbnQpOwotCQlpZiAobWFwRW50cnkgPT0gbnVsbCkgewotCQkJbWFwRW50cnkgPSBuZXcgSGFzaE1hcFsyXTsKLQkJCW1hcC5wdXQoZnJhZ21lbnQsIG1hcEVudHJ5KTsKLQkJfQotCQlMaXN0W10gaWRFbnRyeTsKLQkJaWYgKGNvbnRhaW5lcikgewotCQkJaWYgKG1hcEVudHJ5WzBdID09IG51bGwpCi0JCQkJbWFwRW50cnlbMF0gPSBuZXcgSGFzaE1hcCgyKTsKLQkJCQotCQkJTWFwIHBhdHRlcm5NYXAgPSAoTWFwKSBtYXBFbnRyeVswXS5nZXQoaWQpOwotCQkJaWYgKHBhdHRlcm5NYXAgPT0gbnVsbCkKLQkJCQltYXBFbnRyeVswXS5wdXQoaWQsIHBhdHRlcm5NYXAgPSBuZXcgSGFzaE1hcCgpKTsKLQkJCQotCQkJaWRFbnRyeSA9IChMaXN0W10pIHBhdHRlcm5NYXAuZ2V0KHBhdHRlcm4pOwotCQkJaWYgKGlkRW50cnkgPT0gbnVsbCkgewotCQkJCXBhdHRlcm5NYXAucHV0KHBhdHRlcm4sIGlkRW50cnkgPSBuZXcgTGlzdFtdIHsgbmV3IEFycmF5TGlzdCgxKSwgbmV3IEFycmF5TGlzdCgxKX0pOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG1hcEVudHJ5WzFdID09IG51bGwpCi0JCQkJbWFwRW50cnlbMV0gPSBuZXcgSGFzaE1hcCgyKTsKLQotCQkJaWRFbnRyeSA9IChMaXN0W10pIG1hcEVudHJ5WzFdLmdldChpZCk7Ci0JCQlpZiAoaWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJbWFwRW50cnlbMV0ucHV0KGlkLCBpZEVudHJ5ID0gbmV3IExpc3RbXSB7IG5ldyBBcnJheUxpc3QoMSksIG5ldyBBcnJheUxpc3QoMSl9KTsKLQkJCX0KLQkJfQotCQlpZEVudHJ5WzBdLmFkZChwbHVnaW4pOwotCQlpZEVudHJ5WzFdLmFkZChwYXRoU3RyaW5nKTsKLQotCi0JfQkKLQkJCQotCS8qCi0JICogVGhpcyBpcyBhbiBsaXN0IG9mIG92ZXJyaWRlcyB0aGF0IGFyZSBhdmFpbGFibGUgYXMgYSBjb250cmlidXRpb24gZm9yIGEgc3BlY2lmaWMgZnJhZ21lbnQuCi0JICogPHVsPgotCSAqIDxsaT5UaGUgaWQgb2YgdGhpcyBjb250cmlidXRpb24uIEVpdGhlciBjb250YWluZXIgKFBhdHRlcm4pIG9yIHBsdWdpbiBpZCBkZXBlbmRpbmcgb24gd2hpY2ggbGlzdCBpdCB3YXMgaW4uLgotCSAqIDxsaT5UaGUgcGx1Z2lucyBhcnJheSBsaXN0cyB0aGUgcGx1Z2luIGlkcyBmb3IgYWxsIG9mIHRoZSBwYXRocyBpbiB0aGlzIGNvbnRyaWJ1dGlvbi4KLQkgKiA8bGk+VGhlIHBhdGhzIGFycmF5IGxpc3RzIHRoZSBmb2xkZXIgcGF0aCB1bmRlciB0aGF0IGNvcnJlc3BvbmRpbmcgcGx1Z2luIGZyb20gInBsdWdpbklkcyIuCi0JICogPC91bD4gCi0JICogPHA+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT3ZlcnJpZGVDb250cmlidXRpb24gewotCQlwdWJsaWMgU3RyaW5nIGlkOwotCQlwdWJsaWMgUGF0dGVybiBwYXR0ZXJuOwkvLyBVc2VkIG9ubHkgZm9yIGNvbnRhaW5lcnMuCi0JCXB1YmxpYyBTdHJpbmdbXSBwbHVnaW5JZHM7Ci0JCXB1YmxpYyBTdHJpbmdbXSBwYXRoczsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHJ1bm5hYmxlIGlzIHRvIHVzZWQgdG8gYXBwbHkgb3ZlcnJpZGUuIAotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gc2VxdWVuY2UgZm9yIGVhY2ggb3ZlcnJpZGUgcGF0aCBmb3VuZC4gSXQgaXMgc2VuZCBpbiBvbiB0aGUgYXBwbHkgb3ZlcnJpZGVzIGNhbGwuIFRoaXMKLQkgKiBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gaXMgcHJpdmF0ZS4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIChpbXBsZW1lbnRlcnMgb2YgdGhlIElCZWFuSW5mb0NvbnRyaWJ1dG9yKSB3aWxsIGJlIHBhc3NlZCBpbiB0aGUgc3ViaW50ZXJmYWNlIDxjb2RlPklDb250cmlidXRvck92ZXJyaWRlUnVubmFibGU8L2NvZGU+IHdoaWNoCi0JICogaW5oZXJpdHMgZnJvbSB0aGlzIGludGVyZmFjZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogQHNlZSBCZWFuaW5mb1BsdWdpbiNhcHBseU92ZXJyaWRlcyhJUHJvamVjdCwgU3RyaW5nLCBTdHJpbmcsIFJlc291cmNlU2V0LCBJT3ZlcnJpZGVSdW5uYWJsZSkKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElPdmVycmlkZVJ1bm5hYmxlIHsKLQkJLyoqCi0JCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZGlyZWN0b3J5IHBhdGggdG8gdXNlLiBJdCB3aWxsIGJlIGNhbGxlZCBvdmVyIGFuZCBvdmVyIGZvciBldmVyeQotCQkgKiBvdmVycmlkZSBwYXRoIGZvdW5kIGZvciBhIHBhY2thZ2UuIFRoZSBwYXRoIHdpbGwgYmUgY29tcGxldGUsIGluY2x1ZGluZyB0cmFpbGluZyAnLycuCi0JCSAqIEl0IHdpbGwgYmUgaW4gYSBVUkkgZm9ybWF0IGZvciBhIGRpcmVjdG9yeS4gVGhlIG92ZXJyaWRlcnVubmFibGUgaW1wbGVtZW50YXRpb24gd2lsbCB0aGVuIGFwcGVuZCB0aGUgZmlsZW5hbWUgY2FsbCAoaS5lLiBjbGFzc2JlaW5naW50cm9zcGVjdGVkLm92ZXJyaWRlKSB0byBnZXQgYSBjb21wbGV0ZSBwYXRoLgotCQkgKiA8cD4KLQkJICogQ2xpZW50cyAoSUJlYW5JbmZvQ29udHJpYnV0b3IgaW1wbGVtZW50ZXJzKSBjYW4gY2FsbCB0aGlzIHRvIGFwcGx5IGEgc3BlY2lmaWMgb3ZlcnJpZGUgZmlsZSB0byB0aGUgY3VycmVudAotCQkgKiBjbGFzcyBiZWluZyBwcm9jZXNzZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gb3ZlcnJpZGVQYXRoIHRoZSBwYXRoIHdpbGwgYmUgY29tcGxldGUsIGluY2x1ZGluZyB0cmFpbGluZyAnLycuIEl0IHdpbGwgYmUgaW4gYSBVUkkgZm9ybWF0IGZvciBhIGRpcmVjdG9yeS4gVGhlIG92ZXJyaWRlIGZpbGUgbmFtZSAoY2xhc3NuYW1lLm92ZXJyaWRlKSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgYW5kIHJldHJpZXZlZCBhbmQgYXBwbGllZC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFN0cmluZyBvdmVycmlkZVBhdGgpOwotCQkKLQkJLyoqCi0JCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgYWN0dWFsIHJlc291cmNlIHRvIHVzZS4gVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBzcGVjaWFsIGNvbnRyaWJ1dG9ycyB0aGF0IHdhbnQKLQkJICogYSBzcGVjaWFsIGV4cGxpY2l0IG92ZXJyaWRlIHJlc291cmNlIHRvIGJlIHVzZWQuCi0JCSAqIDxwPgotCQkgKiBDb250cmlidXRvcnMgc2hvdWxkIHVzZSB0aGUgUmVzb3VyY2VTZXQgdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlbS4gVGhpcyBpcyBzbyB0aGF0IGFueXRoaW5nIGphdmEgY2xhc3MgdGhhdAotCQkgKiB0aGUgb3ZlcnJpZGUgcmVzb3VyY2UgcG9pbnRzIHRvIHdpbGwgYmUgZm91bmQuCi0JCSAqIDxwPgotCQkgKiBUaGlzIHJlc291cmNlIHdpbGwgYmUgYXV0b21hdGljYWxseSByZW1vdmVkIGJ5IEJlYW5JbmZvIGFmdGVyIGJlaW5nIGFwcGxpZWQuIEl0IG11c3Qgbm90IGJlIGxlZnQgYXJvdW5kIGJlY2F1c2UKLQkJICogaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgYXBwbGllZCBpdCB3aWxsIGJlIG1vZGlmaWVkLCBzbyBpdCBjb3VsZCBub3QgYmUgcmV1c2VkLiAKLQkJICogIAotCQkgKiBAcGFyYW0gb3ZlcnJpZGVSZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gYXBwbHkgdG8gdGhlIGN1cnJlbnQgY2xhc3MuIE5PVEU6IFRoaXMgcmVzb3VyY2UgV0lMTCBiZSByZW1vdmVkIGZyb20KLQkJICogdGhlIHJlc291cmNlIHNldCBpdCBpcyBpbiBhdXRvbWF0aWNhbGx5IGJ5IHRoaXMgY2FsbC4gSXQgd29uJ3QgYmUgbGVmdCBhcm91bmQgYmVjYXVzZSB0aGUgYWN0aW9uIG9mIGFwcGx5Ci0JCSAqIHdpbGwgYWN0dWFsbHkgbW9kaWZ5IHRoZSByZXNvdXJjZS4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFJlc291cmNlIG92ZXJyaWRlUmVzKTsKLQl9Ci0JCi0JLyoqCi0JICogSUJlYW5JbmZvQ29udHJpYnV0b3IgcnVubmFibGUgdG8gdXNlIHRvIGFwcGx5IG92ZXJyaWRlcy4KLQkgKiA8cD4KLQkgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHdpbGwgYmUgcGFzc2VkIGluIHRvIElCZWFuSW5mb0NvbnRyaWJ1dG9yJ3Mgc28gdGhhdCB0aGV5IGNhbiBjYWxsIGJhY2sgdG8gYXBwbHkgdGhlIG92ZXJyaWRlcy4gVGhleQotCSAqIHNob3VsZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBydW4gbWV0aG9kIG9uY2UgZm9yIGVhY2ggb3ZlcnJpZGUgdG8gYmUgYXBwbGllZC4gVGhlIHJ1biBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZyb20gZWFjaCBJQmVhbkluZm9Db250cmlidXRvci4KLQkgKiA8cD4KLQkgKiBJdCBpbmhlcml0cyBmcm9tIDxjb2RlPklPdmVycmlkZVJ1bm5hYmxlPC9jb2RlPiwgc28gc2VlIHRoYXQgZm9yIG1vcmUgbWV0aG9kcyB0byBjYWxsLgotCSAqIDxwPgotCSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotCSAqIAotCSAqIEBzZWUgQmVhbmluZm9QbHVnaW4uSU92ZXJyaWRlUnVubmFibGUgZm9yIG1vcmUgbWV0aG9kcyB0aGF0IGNhbiBiZSBjYWxsZWQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlIGV4dGVuZHMgSU92ZXJyaWRlUnVubmFibGUgewotCQkKLQkJLyoqCi0JCSAqIFRlc3RzIGlmIHBhdGggaGFzIGFscmVhZHkgYmVlbiBjb250cmlidXRlZCBvbmNlIGZvciB0aGUgY3VycmVudCBjbGFzcy4KLQkJICogPHA+Ci0JCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBieSB0aGUgSUJlYW5JbmZvQ29udHJpYnV0b3IgZm9yIG92ZXJyaWRlcyB0byB0ZXN0IGlmIHRoZSBwYXRoIChzYW1lIHBhdGggYXMgZm9yIHRoZSBJT3ZlcnJpZGVSdW5uYWJsZS5ydW4oU3RyaW5nKSBtZXRob2QpCi0JCSAqIGhhcyBhbHJlYWR5IGJlZW4gY29udHJpYnV0ZWQgb25jZSBmb3IgdGhpcyBjbGFzcy4gSXQgY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aW1lLiBIb3dldmVyIGl0IGlzIG5vdCBuZWNlc3NhcnkgYmVjYXVzZQotCQkgKiBCZWFuSW5mbyB3aWxsIG5vdCBwZXJtaXQgaXQgdG8gYmUgY29udHJpYnV0ZWQgbW9yZSB0aGFuIG9uY2UgZm9yIGEgY2xhc3MuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGF0aAotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVzZWQgYWxyZWFkeS4KLQkJICogCi0JCSAqIEBzZWUgSU92ZXJyaWRlUnVubmFibGUjcnVuKFN0cmluZykKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBwYXRoQ29udHJpYnV0ZWQoU3RyaW5nIHBhdGgpOwotCQkKLQkJLyoqCi0JCSAqIFRlc3RzIGlmIHRoZSBVUkkgaGFzIGFscmVhZHkgYmVlbiBjb250cmlidXRlZCBvbmNlIGZvciB0aGUgY3VycmVudCBjbGFzcy4KLQkJICogPHA+Ci0JCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBieSBhbiBJQmVhbkluZm9Db250cmlidXRvciBmb3Igb3ZlcnJpZGVzIHRvIHNlZSBpZiB0aGUgVVJJIChzYW1lIHBhdGggYXMgdGhlIFVSSSBmcm9tIHRoZSBJT3ZlcnJpZGVSdW5uYWJsZS5ydW4oUmVzb3VyY2UpIG1ldGhvZCkKLQkJICogaGFzIGFscmVhZHkgYmVlbiBjb250cmlidXRlZCBvbmNlIGZvciB0aGlzIGNsYXNzLiBJdCBjYW4gYmUgdXNlZCB0byBzYXZlIHRpbWUuIEhvd2V2ZXIsIG5vdCBuZWNlc3NhcnkgYmVjYXVzZQotCQkgKiBCZWFuSW5mbyB3aWxsIG5vdCBwZXJtaXQgdGhlIFVSSSB0byBiZSBjb250cmlidXRlZCBtb3JlIHRoYW4gb25jZSBmb3IgYSBjbGFzcy4KLQkJICogCi0JCSAqIEBwYXJhbSByZXNvdXJjZVVSSQotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVzZWQgYWxyZWFkeS4KLQkJICogCi0JCSAqIEBzZWUgSU92ZXJyaWRlUnVubmFibGUjcnVuKFJlc291cmNlKQotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlc291cmNlQ29udHJpYnV0ZWQoVVJJIHJlc291cmNlVVJJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fUEFUSFMgPSBuZXcgU3RyaW5nWzBdOwotCQotCS8qKgotCSAqIFJldHVybiBqdXN0IHRoZSBjb250cmlidXRlZCBvdmVycmlkZSBwYXRocyAodGhyb3VnaCB0aGUgQmVhbkluZm8gcmVnaXN0cmF0aW9ucykuIERvZXMgbm90IGluY2x1ZGUgYW55IHBhdGhzIHRoYXQgYXJlIGNvbnRyaWJ1dGVkIGZyb20KLQkgKiBJQmVhbkluZm9Db250cmlidXRvcidzLiBUaGlzIGlzIHVzZWQgYnkgdGhlIEJlYW5JbmZvQ2xhc3NBZGFwdGVyIHRvIGxvYWQgdGhlIG92ZXJyaWRlcyBmaWxlcyBpbnRvIG9uZSBjYWNoZSBmaWxlIHNvIHRoYXQgaXQgY2FuCi0JICogYmUgZG9uZSBhdCBvbmUgdGltZSB0aGUgbmV4dCB0aW1lIGl0IGlzIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZQotCSAqIEByZXR1cm4gYXJyYXkgb2YgcGF0aCBzdHJpbmdzIHRvIHRoZSBvdmVycmlkZS4gVGhlIGZpbGVzIG1heSBub3QgZXhpc3QsIHRoZXkgaXMganVzdCBwb3NzaWJsZSBvdmVycmlkZXMuIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRPdmVycmlkZVBhdGhzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlmaW5hbCBJUGF0aCBwYWNrYWdlUGF0aCA9IG5ldyBQYXRoKHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnLycpKycvJyk7Ci0JCUxpc3Qgb3ZlcnJpZGVQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvID0gKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbykgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoQmVhbmluZm9OYXR1cmUuQ09ORklHX0lORk9fU0VTU0lPTl9LRVkpOwotCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCS8vIEl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvdXIgb3duIGludGVybmFsIHZlcnNpb24gaGVyZS4KLQkJCQlpbmZvID0gUHJveHlMYXVuY2hTdXBwb3J0LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyhKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwkJCQkJCi0JCQkJQmVhbmluZm9OYXR1cmUuY29tcHV0ZUJlYW5JbmZvQ29uZmlnSW5mbyhpbmZvKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChvY0ZyYWdtZW50cyA9PSBudWxsKQotCQkJCQlwcm9jZXNzQmVhbkluZm9Db250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpOyAvLyBXZSBoYXZlbid0IHByb2Nlc3NlZCB0aGVtIHlldC4KLQkJCX0KLQkJCQotCQkJLy8gQ2FjaGUgb2YgdGVzdGVkIHBhdHRlcm5zLiAoUGF0dGVybi0+Qm9vbGVhbikuIElmIGEgcGF0dGVybiBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zdCBhbGwgdmlzaWJsZSBjb250YWluZXIgcGF0aHMgd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHRoZQotCQkJLy8gcGF0dGVybiBhZ2FpbiBpZiBpdCBpcyBmb3VuZCBhZ2Fpbi4gKE5vdGU6IFRoaXMgd29ya3MgZm9yIGVmZmljaWVuY3kgYmVjYXVzZSBQcm94eVBsdWdpbiB1c2VzIHRoZSBzYW1lIHBhdHRlcm4gaW5zdGFuY2UgZm9yCi0JCQkvLyBzYW1lIHBhdHRlcm4gZm91bmQgd2hpbGUgcHJvY2Vzc2luZyBvbmUgZXh0ZW5zaW9uIHBvaW50KS4gVGhlIHZhbHVlIGlzIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyBhIHZpc2libGUgY29udGFpbmVyIHBhdGguCi0JCQlNYXAgdGVzdGVkUGF0dGVybnMgPSBuZXcgSGFzaE1hcCgpOwkKLQkJCWZvciAoaW50IGZyYWdtZW50SW5kZXggPSAwOyBmcmFnbWVudEluZGV4IDwgb2NGcmFnbWVudHMubGVuZ3RoOyBmcmFnbWVudEluZGV4KyspIHsKLQkJCQlpZiAob2NGcmFnbWVudHNbZnJhZ21lbnRJbmRleF0uaXNQcmVmaXhPZihwYWNrYWdlUGF0aCkpIHsKLQkJCQkJU3RyaW5nIGxlZnRPdmVyID0gbnVsbDsJLy8gVGhlIGxlZnQgb3ZlciBwb3J0aW9uIG9mIHRoZSBwYWNrYWdlLiBUaGlzIHdpbGwgYmUgc2V0IGZpcnN0IHRpbWUgbmVlZGVkLiAKLQkJCQkJT3ZlcnJpZGVDb250cmlidXRpb25bXSBjbnRyQ29udHJpYnV0aW9ucyA9IG9jQ29udGFpbmVySWRzW2ZyYWdtZW50SW5kZXhdOwotCQkJCQlmb3IgKGludCBvY2luZGV4ID0gMDsgb2NpbmRleCA8IGNudHJDb250cmlidXRpb25zLmxlbmd0aDsgb2NpbmRleCsrKSB7Ci0JCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSBjbnRyQ29udHJpYnV0aW9uc1tvY2luZGV4XTsKLQkJCQkJCUJvb2xlYW4gdGVzdGVkID0gKEJvb2xlYW4pIHRlc3RlZFBhdHRlcm5zLmdldChjb250cmlidXRpb24ucGF0dGVybik7Ci0JCQkJCQlpZiAodGVzdGVkID09IG51bGwpIHsKLQkJCQkJCQl0ZXN0ZWQgPSBCb29sZWFuLkZBTFNFOwotCQkJCQkJCUNvbnRhaW5lclBhdGhzIGNvbnRhaW5lclBhdGhzID0gKENvbnRhaW5lclBhdGhzKSBpbmZvLmdldENvbnRhaW5lcklkcygpLmdldChjb250cmlidXRpb24uaWQpOwotCQkJCQkJCWlmIChjb250YWluZXJQYXRocyAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZ1tdIHZpc2libGUgPSBjb250YWluZXJQYXRocy5nZXRWaXNpYmxlQ29udGFpbmVyUGF0aHMoKTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoY29udHJpYnV0aW9uLnBhdHRlcm4ubWF0Y2hlcih2aXNpYmxlW2ldKS5tYXRjaGVzKCkpIHsKLQkJCQkJCQkJCQl0ZXN0ZWQgPSBCb29sZWFuLlRSVUU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJdGVzdGVkUGF0dGVybnMucHV0KGNvbnRyaWJ1dGlvbi5wYXR0ZXJuLCB0ZXN0ZWQpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAodGVzdGVkLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJZm9yIChpbnQgY2luZGV4ID0gMDsgY2luZGV4IDwgY29udHJpYnV0aW9uLnBsdWdpbklkcy5sZW5ndGg7IGNpbmRleCsrKSB7Ci0JCQkJCQkJCS8vIEJlY2F1c2Ugb2YgVVJJQ29udmVydGVycyBhbmQgbm9ybWFsaXphdGlvbiBpbiBvcmcuZWNsaXBzZS5qZW0udXRpbCBzdHVmZiwgd2UKLQkJCQkJCQkJLy8gbmVlZCB0byBoYXZlIHBsdWdpbiB1cmkncyBpbiB0aGUgZm9ybSAicGxhdGZvcm06L3BsdWdpbi9wbHVnaW5uYW1lIi4KLQkJCQkJCQkJLy8gQnVuZGxlJ3MgZG9uJ3QgcmV0dXJuIHRoaXMgZm9ybWF0LiBUaGV5IHJldHVybiBidW5kbGU6L3N0dWZmCi0JCQkJCQkJCS8vIFNvIHdlIHdpbGwgc2ltcGxlIGNyZWF0ZSBpdCBvZiB0aGUgcGxhdGZvcm06L3BsdWdpbiBmb3JtYXQuCi0JCQkJCQkJCS8vIFRvIHNhdmUgdGltZSwgd2Ugd2lsbCBmaXJzdCBzZWUgaWYgd2UgaGF2ZSB0aGUgYnVuZGxlLgotCQkJCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGNvbnRyaWJ1dGlvbi5wbHVnaW5JZHNbY2luZGV4XSk7Ci0JCQkJCQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKGxlZnRPdmVyID09IG51bGwpCi0JCQkJCQkJCQkJbGVmdE92ZXIgPSBnZXRMZWZ0T3ZlcihvY0ZyYWdtZW50c1tmcmFnbWVudEluZGV4XSwgcGFja2FnZVBhdGgpOwotCQkJCQkJCQkJb3ZlcnJpZGVQYXRocy5hZGQoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTCsiOi8iK0pFTVV0aWxQbHVnaW4uUExBVEZPUk1fUExVR0lOKycvJytidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkrJy8nK2NvbnRyaWJ1dGlvbi5wYXRoc1tjaW5kZXhdK2xlZnRPdmVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbltdIHBsdWdpbkNvbnRyaWJ1dGlvbnMgPSBvY1BsdWdpbklkc1tmcmFnbWVudEluZGV4XTsKLQkJCQkJZm9yIChpbnQgb2NpbmRleCA9IDA7IG9jaW5kZXggPCBwbHVnaW5Db250cmlidXRpb25zLmxlbmd0aDsgb2NpbmRleCsrKSB7Ci0JCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSBwbHVnaW5Db250cmlidXRpb25zW29jaW5kZXhdOwotCQkJCQkJQm9vbGVhbiB2aXNpYmxlID0gKEJvb2xlYW4pIGluZm8uZ2V0UGx1Z2luSWRzKCkuZ2V0KGNvbnRyaWJ1dGlvbi5pZCk7Ci0JCQkJCQlpZiAodmlzaWJsZSAhPSBudWxsICYmIHZpc2libGUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQlmb3IgKGludCBjaW5kZXggPSAwOyBjaW5kZXggPCBjb250cmlidXRpb24ucGx1Z2luSWRzLmxlbmd0aDsgY2luZGV4KyspIHsKLQkJCQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShjb250cmlidXRpb24ucGx1Z2luSWRzW2NpbmRleF0pOwotCQkJCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChsZWZ0T3ZlciA9PSBudWxsKQotCQkJCQkJCQkJCWxlZnRPdmVyID0gZ2V0TGVmdE92ZXIob2NGcmFnbWVudHNbZnJhZ21lbnRJbmRleF0sIHBhY2thZ2VQYXRoKTsKLQkJCQkJCQkJCW92ZXJyaWRlUGF0aHMuYWRkKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUFJPVE9DT0wrIjovIitKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BMVUdJTisnLycrYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKycvJytjb250cmlidXRpb24ucGF0aHNbY2luZGV4XStsZWZ0T3Zlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCX0KLQkJcmV0dXJuIG92ZXJyaWRlUGF0aHMuaXNFbXB0eSgpID8gTk9fUEFUSFMgOiAoU3RyaW5nW10pIG92ZXJyaWRlUGF0aHMudG9BcnJheShuZXcgU3RyaW5nW292ZXJyaWRlUGF0aHMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIEFwcGx5IHRoZSBydW5uYWJsZSB0byBhbGwgb2YgdGhlIG92ZXJyaWRlIHBhdGhzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIAotCSAqIGdpdmVuIHBhY2thZ2UgbmFtZS4gSXQgd2lsbCBydW4gdGhyb3VnaCB0aGUgZXhwbGljaXQgY29udHJpYnV0b3JzIGFuZCB0aGUgSUNvbnRhaW5lcnMgdGhhdCBpbXBsZW1lbnQgSUJlYW5JbmZvQ29udHJpYnV0b3IuCi0JICogPHA+Ci0JICogVGhlIHBhY2thZ2UgbmFtZSB1c2VzICcuJyB0byBkZWxpbmVhdGUgdGhlIGZyYWdtZW50cyBvZiB0aGUgbmFtZSwKLQkgKiBpLmUuIHVzZSAiPGNvZGU+amF2YS5sYW5nPC9jb2RlPiIgYXMgYSBwYWNrYWdlIG5hbWUuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuIEl0IGlzIHB1YmxpYyBvbmx5IGJlY2F1c2UgYW4gaW50ZXJuYWwgY2xhc3MgaW4gYW5vdGhlciBwYWNrYWdlIG5lZWRzIHRvIGNhbGwgaXQuCi0JICogVE9ETyBUaGlzIHNob3VsZCBiZSBwYWNrYWdlLXByb3RlY3RlZC4gTGF0ZXIgdGhlIG90aGVyIGNsYXNzIHdpbGwgYmUgbW92ZWQgaW50byB0aGlzIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gcnVuIGFnYWluc3QuCi0JICogQHBhcmFtIHBhY2thZ2VOYW1lCi0JICogQHBhcmFtIGNsYXNzTmFtZSBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGlzIGJlaW5nIG92ZXJyaWRkZW4uCi0JICogQHBhcmFtIGphdmFDbGFzcyB0aGUgamF2YSBjbGFzcyB0aGUgb3ZlcnJpZGVzIHdpbGwgYmUgYXBwbGllZCB0by4KLQkgKiBAcGFyYW0gcmVzb3VyY2Ugc2V0IHRoYXQgY29udHJpYnV0b3JzIGNhbiB1c2UgdG8gdGVtcG9yYXJpbHkgbG9hZCBkeW5hbWljIG92ZXJyaWRlIGZpbGVzLgotCSAqIEBwYXJhbSBydW5uYWJsZSB1c2UgdGhpcyBydW5uYWJsZSB0byBhY3R1YWxseSBhcHBseSBvdmVycmlkZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlPdmVycmlkZXMoZmluYWwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBKYXZhQ2xhc3MgamF2YUNsYXNzLCBmaW5hbCBSZXNvdXJjZVNldCByc2V0LCBmaW5hbCBJT3ZlcnJpZGVSdW5uYWJsZSBydW5uYWJsZSkgewotCQlmaW5hbCBJUGF0aCBwYWNrYWdlUGF0aCA9IG5ldyBQYXRoKHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnLycpKycvJyk7Ci0JCXRyeSB7Ci0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbyA9IChJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8pIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KEJlYW5pbmZvTmF0dXJlLkNPTkZJR19JTkZPX1NFU1NJT05fS0VZKTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkvLyBJdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldCwgc28gd2UgbmVlZCB0byBjcmVhdGUgb3VyIG93biBpbnRlcm5hbCB2ZXJzaW9uIGhlcmUuCi0JCQkJaW5mbyA9IFByb3h5TGF1bmNoU3VwcG9ydC5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8oSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsJCQkJCQotCQkJCUJlYW5pbmZvTmF0dXJlLmNvbXB1dGVCZWFuSW5mb0NvbmZpZ0luZm8oaW5mbyk7Ci0JCQl9Ci0JCQlmaW5hbCBJQmVhbkluZm9Db250cmlidXRvcltdIGV4cGxpY2l0Q29udHJpYnV0b3JzID0gKElCZWFuSW5mb0NvbnRyaWJ1dG9yW10pIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KEJlYW5pbmZvTmF0dXJlLkJFQU5JTkZPX0NPTlRSSUJVVE9SU19TRVNTSU9OX0tFWSk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAob2NGcmFnbWVudHMgPT0gbnVsbCkKLQkJCQkJcHJvY2Vzc0JlYW5JbmZvQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsgLy8gV2UgaGF2ZW4ndCBwcm9jZXNzZWQgdGhlbSB5ZXQuCi0JCQl9Ci0KLQkJCWZpbmFsIFNldCB1c2VkUGF0aHMgPSBuZXcgSGFzaFNldCgxMCk7CS8vIFNldCBvZiB1c2VkIHBhdGhzLiBTbyB0aGF0IHRoZSBjb250cmlidXRvcnMgZG9uJ3Qgc3VwcGx5IGEgcGF0aCBhbHJlYWR5IHVzZWQuIFRoaXMgY291bGQgY2F1c2UgcHJvYmxlbXMgaWYgdGhleSBkaWQuCi0JCQlmaW5hbCBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlIGNvbnRyaWJSdW5uYWJsZSA9IG5ldyBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgb3ZlcnJpZGVQYXRoKSB7Ci0JCQkJCWlmICghdXNlZFBhdGhzLmNvbnRhaW5zKG92ZXJyaWRlUGF0aCkpIHsKLQkJCQkJCXVzZWRQYXRocy5hZGQob3ZlcnJpZGVQYXRoKTsKLQkJCQkJCXJ1bm5hYmxlLnJ1bihvdmVycmlkZVBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHJ1bihSZXNvdXJjZSBvdmVycmlkZVJlcykgewotCQkJCQlpZiAoIXVzZWRQYXRocy5jb250YWlucyhvdmVycmlkZVJlcy5nZXRVUkkoKSkpIHsKLQkJCQkJCXVzZWRQYXRocy5hZGQob3ZlcnJpZGVSZXMuZ2V0VVJJKCkpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlydW5uYWJsZS5ydW4ob3ZlcnJpZGVSZXMpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlvdmVycmlkZVJlcy5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnJlbW92ZShvdmVycmlkZVJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIGJvb2xlYW4gcGF0aENvbnRyaWJ1dGVkKFN0cmluZyBwYXRoKSB7Ci0JCQkJCXJldHVybiB1c2VkUGF0aHMuY29udGFpbnMocGF0aCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBib29sZWFuIHJlc291cmNlQ29udHJpYnV0ZWQoVVJJIHJlc291cmNlVVJJKSB7Ci0JCQkJCXJldHVybiB1c2VkUGF0aHMuY29udGFpbnMocmVzb3VyY2VVUkkpOwotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCS8vIFJ1biB0aHJvdWdoIHRoZSBjb250YWluZXJzIHRoYXQgaW1wbGVtZW50IElCZWFuSW5mb0NvbnRyaWJ1dG9yLgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5mby5nZXRDb250YWluZXJzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgbWFwRW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ2xhc3NwYXRoQ29udGFpbmVyKSBtYXBFbnRyeS5nZXRLZXkoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUJlYW5JbmZvQ29udHJpYnV0b3IgJiYgKChCb29sZWFuKSBtYXBFbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJCS8vIFN0YW5kYXJkIHJ1biBsb2dzIHRvIC5sb2cKLQkJCQkJCX0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJCSgoSUJlYW5JbmZvQ29udHJpYnV0b3IpIGNvbnRhaW5lcikucnVuT3ZlcnJpZGVzKHBhY2thZ2VQYXRoLCBjbGFzc05hbWUsIGphdmFDbGFzcywgcnNldCwgY29udHJpYlJ1bm5hYmxlKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBSdW4gdGhyb3VnaCB0aGUgZXhwbGljaXQgY29udHJpYnV0b3JzLgotCQkJZm9yIChpbnQgaT0wOyBpPGV4cGxpY2l0Q29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkvLyBTdGFuZGFyZCBydW4gbG9ncyB0byAubG9nCi0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQlleHBsaWNpdENvbnRyaWJ1dG9yc1tpaV0ucnVuT3ZlcnJpZGVzKHBhY2thZ2VQYXRoLCBjbGFzc05hbWUsIGphdmFDbGFzcywgcnNldCwgY29udHJpYlJ1bm5hYmxlKTsJCQkJCQkKLQkJCQkJfQotCQkJCX0pOwotCQkJfQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5JTkZPKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRMZWZ0T3ZlcihJUGF0aCBmcmFnbWVudCwgSVBhdGggcGFja2FnZVBhdGgpIHsKLQkJcmV0dXJuIHBhY2thZ2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoZnJhZ21lbnQuc2VnbWVudENvdW50KCkpLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKQotCQkJbG9nZ2VyID0gRWNsaXBzZUxvZ2dlci5nZXRFY2xpcHNlTG9nZ2VyKHRoaXMpOwotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhhdCBhIEJlYW5JbmZvIG5hdHVyZSBpcyBhY3RpdmUuIFRoaXMgaXMgdXNlZCB0byB0ZWxsIGl0IHRvIHNodXRkb3duIHdoZW4gYmVhbmluZm8gc2h1dHMgZG93bi4KLQkgKiBUT0RPIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IEJlYW5JbmZvTmF0dXJlIHNob3VsZCBjYWxsIGl0LiAocHVibGljIGZvciBub3cgYnV0IHdoZW4gd2UgbWFrZQotCSAqIEJlYW5JbmZvTmF0dXJlIGFuIEFQSSBpdCB3aWxsIGJlIG1vdmVkIGludG8gdGhlIHNhbWUgcGFja2FnZSBhcyBCZWFuSW5mb1BsdWdpbikuCi0JICogCi0JICogQHBhcmFtIG5hdHVyZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEJlYW5JbmZvTmF0dXJlKEJlYW5pbmZvTmF0dXJlIG5hdHVyZSkgewotCQlpZiAob3Blbk5hdHVyZXMgPT0gbnVsbCkKLQkJCW9wZW5OYXR1cmVzID0gbmV3IEhhc2hNYXAoKTsKLQkJb3Blbk5hdHVyZXMucHV0KG5hdHVyZS5nZXRQcm9qZWN0KCksIG5hdHVyZSk7Ci0JfQotCQotCS8qKgotCSAqIE1hcmsgdGhhdCBhIEJlYW5JbmZvIG5hdHVyZSBpcyBub3QgYWN0aXZlLiBUaGlzIGlzIHVzZWQgdG8gdGVsbCBpdCB0byBzaHV0ZG93biB3aGVuIGJlYW5pbmZvIHNodXRzIGRvd24uCi0JICogVE9ETyA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSBCZWFuSW5mb05hdHVyZSBzaG91bGQgY2FsbCBpdC4gKHB1YmxpYyBmb3Igbm93IGJ1dCB3aGVuIHdlIG1ha2UKLQkgKiBCZWFuSW5mb05hdHVyZSBhbiBBUEkgaXQgd2lsbCBiZSBtb3ZlZCBpbnRvIHRoZSBzYW1lIHBhY2thZ2UgYXMgQmVhbkluZm9QbHVnaW4pLgotCSAqIAotCSAqIEBwYXJhbSBuYXR1cmUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVCZWFuSW5mb05hdHVyZShCZWFuaW5mb05hdHVyZSBuYXR1cmUpIHsKLQkJaWYgKG9wZW5OYXR1cmVzICE9IG51bGwpCi0JCQlvcGVuTmF0dXJlcy5yZW1vdmUobmF0dXJlLmdldFByb2plY3QoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaXN0ZXJlZCBuYXR1cmUsIGlmIGFueSwgZm9yIHRoZSBwcm9qZWN0LiBUaGlzIHdpbGwgbm90IGNhdXNlIHRoZQotCSAqIG5hdHVyZSB0byBiZSBjcmVhdGVkLgotCSAqIDxwPgotCSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIG5hdHVyZSBmb3IgcHJvamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgcmVnaXN0ZXJlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlCZWFuaW5mb05hdHVyZSBnZXROYXR1cmUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKEJlYW5pbmZvTmF0dXJlKSBvcGVuTmF0dXJlcy5nZXQocHJvamVjdCk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcGVuTmF0dXJlcyAhPSBudWxsICYmICFvcGVuTmF0dXJlcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgbmF0dXJlSXRyID0gb3Blbk5hdHVyZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgbmF0dXJlSXRyLmhhc05leHQoKTspIHsKLQkJCQlCZWFuaW5mb05hdHVyZSBuYXR1cmUgPSAoQmVhbmluZm9OYXR1cmUpIG5hdHVyZUl0ci5uZXh0KCk7Ci0JCQkJbmF0dXJlLnNodXRkb3duKCk7Ci0JCQl9Ci0JCX0KLQkJCQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuaW5mb1JlZ2lzdHJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9SZWdpc3RyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzNTBjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuaW5mb1JlZ2lzdHJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvUmVnaXN0cmF0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIHJlZ2lzdGVyZWQgYmVhbmluZm9zIGluIHRoZSBCZWFuaW5mb1BsdWdpbi4KLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEJlYW5pbmZvUmVnaXN0cmF0aW9uIHsKLQkKLQlwcm90ZWN0ZWQgQmVhbmluZm9zRG9jIGRvYzsKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhcmlhYmxlRWxlbWVudDsJLy8gVGhpcyBpcyB1c2VkIHRvIGdldCBjb250cmlidXRvciBlbGVtZW50LiBJZiBudWxsLCB0aGVuIG5vIGNvbnRyaWJ1dG9yLgotCQotCXB1YmxpYyBCZWFuaW5mb1JlZ2lzdHJhdGlvbigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBCZWFuaW5mb3NEb2MKLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9SZWdpc3RyYXRpb24oQmVhbmluZm9zRG9jIGRvYykgewotCQl0aGlzLmRvYyA9IGRvYzsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBCZWFuaW5mb3NEb2MgYW5kIHZhcmlhYmxlIGVsZW1lbnQuCi0JICovCi0JcHVibGljIEJlYW5pbmZvUmVnaXN0cmF0aW9uKEJlYW5pbmZvc0RvYyBkb2MsIElDb25maWd1cmF0aW9uRWxlbWVudCB2YXJpYWJsZUVsZW1lbnQpIHsKLQkJdGhpcy5kb2MgPSBkb2M7Ci0JCXRoaXMudmFyaWFibGVFbGVtZW50ID0gdmFyaWFibGVFbGVtZW50OwotCX0JCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBkb2MuCi0JICogQHJldHVybiBSZXR1cm5zIGEgQmVhbmluZm9zRG9jCi0JICovCi0JcHVibGljIEJlYW5pbmZvc0RvYyBnZXREb2MoKSB7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZG9jLgotCSAqIEBwYXJhbSBkb2MgVGhlIGRvYyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2MoQmVhbmluZm9zRG9jIGRvYykgewotCQl0aGlzLmRvYyA9IGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YXJpYWJsZUVsZW1lbnQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRWYXJpYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFyaWFibGVFbGVtZW50LgotCSAqIEBwYXJhbSB2YXJpYWJsZUVsZW1lbnQgVGhlIHZhcmlhYmxlRWxlbWVudCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhcmlhYmxlRWxlbWVudCkgewotCQl0aGlzLnZhcmlhYmxlRWxlbWVudCA9IHZhcmlhYmxlRWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvc0RvYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9zRG9jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjI5OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9zRG9jLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogQmVhbmluZm9zRG9jLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy4qOwotLyoqCi0gKiBCZWFuaW5mb3MgZG9jdW1lbnQgaW4tbWVtb3J5IGZvcm1hdC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9zRG9jIGltcGxlbWVudHMgSUJlYW5pbmZvc0RvY0VudHJ5IHsKLQotCXByb3RlY3RlZCBJQmVhbmluZm9zRG9jRW50cnlbXSBzZWFyY2hwYXRoOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBzRXhwb3J0ZWQgPSAiZXhwb3J0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIHNLaW5kID0gImtpbmQiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIHNQYXRoID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQmVhbmluZm9zRG9jKCkgewotCX0KLQotCXB1YmxpYyBCZWFuaW5mb3NEb2MoSUJlYW5pbmZvc0RvY0VudHJ5W10gc2VhcmNocGF0aCkgewotCQl0aGlzLnNlYXJjaHBhdGggPSBzZWFyY2hwYXRoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIC0xOwkvLyBOLkEuCi0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gbnVsbDsJLy8gTi5BLgotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJlYW5pbmZvc0RvYyByZWFkRW50cnkoSVJlYWRlciByZWFkZXIsIE9iamVjdCByb290LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFycmF5TGlzdCBwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0IGNoaWxkcmVuID0gcmVhZGVyLmdldENoaWxkcmVuKHJvb3QpOwotCQlpbnQgY2hpbGRyZW5MZW5ndGggPSByZWFkZXIuZ2V0TGVuZ3RoKGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSByZWFkZXIuZ2V0SXRlbShjaGlsZHJlbiwgaSk7Ci0JCQlpZiAocmVhZGVyLmlzTm9kZVR5cGVFbGVtZW50KGNoaWxkKSkgewotCQkJCU9iamVjdCBlbnRyeSA9IG51bGw7Ci0JCQkJaWYgKHJlYWRlci5nZXROb2RlTmFtZShjaGlsZCkuZXF1YWxzSWdub3JlQ2FzZShCZWFuaW5mb0VudHJ5LnNCZWFuaW5mbykpIHsKLQkJCQkJZW50cnkgPSBCZWFuaW5mb0VudHJ5LnJlYWRFbnRyeShyZWFkZXIsIGNoaWxkLCBwcm9qZWN0KTsKLQkJCQl9IGVsc2UgaWYgKHJlYWRlci5nZXROb2RlTmFtZShjaGlsZCkuZXF1YWxzSWdub3JlQ2FzZShTZWFyY2hwYXRoRW50cnkuc1NlYXJjaHBhdGgpKSB7Ci0JCQkJCWVudHJ5ID0gU2VhcmNocGF0aEVudHJ5LnJlYWRFbnRyeShyZWFkZXIsIGNoaWxkLCBwcm9qZWN0LCBmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChlbnRyeSAhPSBudWxsKQotCQkJCQlwYXRocy5hZGQoZW50cnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgQmVhbmluZm9zRG9jKChJQmVhbmluZm9zRG9jRW50cnlbXSkgcGF0aHMudG9BcnJheShuZXcgSUJlYW5pbmZvc0RvY0VudHJ5W3BhdGhzLnNpemUoKV0pKTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5pbmZvc0RvY0VudHJ5W10gZ2V0U2VhcmNocGF0aCgpIHsKLQkJcmV0dXJuIHNlYXJjaHBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VhcmNocGF0aChJQmVhbmluZm9zRG9jRW50cnlbXSBzZWFyY2hwYXRoKSB7Ci0JCXRoaXMuc2VhcmNocGF0aCA9IHNlYXJjaHBhdGg7Ci0JfQotCi0JcHVibGljIE5vZGUgd3JpdGVFbnRyeShEb2N1bWVudCBkb2MsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoU2VhcmNocGF0aEVudHJ5LnNTZWFyY2hwYXRoKTsgLy8gQ3JlYXRlIFJvb3QgRWxlbWVudAotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXJvb3QuYXBwZW5kQ2hpbGQoc2VhcmNocGF0aFtpXS53cml0ZUVudHJ5KGRvYywgcHJvamVjdCkpOyAvLyBBZGQgdG8gdGhlIGRvY3VtZW50Ci0JCX0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQ29uZmlndXJhdGlvbkVsZW1lbnRSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0NvbmZpZ3VyYXRpb25FbGVtZW50UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZDBiZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQ29uZmlndXJhdGlvbkVsZW1lbnRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBDb25maWd1cmF0aW9uRWxlbWVudFJlYWRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy4qOwotCi0KLS8qKgotICogRm9yIHJlYWRpbmcgZnJvbSBJQ29uZmlndXJhdGlvbkVsZW1lbnRzCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLWNsYXNzIENvbmZpZ3VyYXRpb25FbGVtZW50UmVhZGVyIGltcGxlbWVudHMgSVJlYWRlciB7Ci0KLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZHJlbihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpID8gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG5vZGUpLmdldENoaWxkcmVuKCkgOiBuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVhZGVyI2dldExlbmd0aChPYmplY3QpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoT2JqZWN0IG5vZGVMaXN0KSB7Ci0JCXJldHVybiAobm9kZUxpc3QgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgPyBBcnJheS5nZXRMZW5ndGgobm9kZUxpc3QpIDogMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXRJdGVtKE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SXRlbShPYmplY3Qgbm9kZUxpc3QsIGludCBpbmRleCkgewotCQlyZXR1cm4gKG5vZGVMaXN0IGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pID8gQXJyYXkuZ2V0KG5vZGVMaXN0LCBpbmRleCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVhZGVyI2lzTm9kZVR5cGVFbGVtZW50KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vZGVUeXBlRWxlbWVudChPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gbm9kZSBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXROb2RlTmFtZShPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZShPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpID8gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG5vZGUpLmdldE5hbWUoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjZ2V0QXR0cmlidXRlKE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpID8gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQpLmdldEF0dHJpYnV0ZUFzSXMoYXR0cmlidXRlTmFtZSkgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5JbmZvQ29udHJpYnV0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0lCZWFuSW5mb0NvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZjk5NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5JbmZvQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElCZWFuSW5mb0NvbnRyaWJ1dG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjggJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotIAotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIEJlYW5JbmZvIGNvbnRyaWJ1dG9ycy4gU3VwcGxpZWQgZWl0aGVyIGFzIGFkZGl0aW9uYWwgaW50ZXJmYWNlIG9uIGEgSUNsYXNzcGF0aENvbnRhaW5lciwgb3IgYXMKLSAqIGFuIGV4cGxpY2l0IGNvbnRyaWJ1dG9yIGZvciBCZWFuSW5mb3MgZnJvbSB0aGUgbWFuaWZlc3QgZmlsZXMuCi0gKiA8cD4KLSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBhbGxvd3MgYSBkeW5hbWljIHN1cHBseSBvZiBCZWFuSW5mbyBjb250cmlidXRpb25zIChiZWFuaW5mbyBqYXJzIGFuZCBzZWFyY2ggcGF0aHMpCi0gKiBhbmQgb3ZlcnJpZGUgZmlsZXMuIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBkZWZhdWx0IHBsdWdpbiBleHRlbnNpb24gbWVjaGFuaXNtIGlzIHRvbyBzdGF0aWMgZm9yIHRoZSByZXF1aXJlbWVudHMuIAotICogPHA+Ci0gKiBUaGVyZSBpcyBhIHZlcnkgdXNlZnVsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKDxjb2RlPkJlYW5JbmZvQ29udHJpYnV0b3JBZGFwdGVyPC9jb2RlPikgdGhhdCBjYW4gYmUgc3ViY2xhc3NlZC4gVGhlCi0gKiBkZWZhdWx0IGRvZXNuJ3QgZG8gYW55dGhpbmcgb24gaXRzIG93bi4gQnV0IGl0IGRvZXMgaGF2ZSBhIHZlcnkgdXNlZnVsIHV0aWxpdHkgbWV0aG9kIGZvciBsb2FkaW5nIHJlc291cmNlcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuSW5mb0NvbnRyaWJ1dG9yQWRhcHRlcgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5JbmZvQ29udHJpYnV0b3IgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgQmVhbkluZm9FbnRyeSBjb250cmlidXRpb25zIHRoYXQgYXJlIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGJ5IEJlYW5JbmZvIHdoZW4gaXQgZGV0ZXJtaW5lcyB0aGF0IHRoaXMgY29udHJpYnV0b3IgaXMgYXBwbGljYWJsZSAKLQkgKiBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCBiZWluZyBwcm9jZXNzZWQuIEJlYW5pbmZvRW50cnkncyBkZWZpbmUgdGhlIEJlYW5JbmZvIGphcnMgYW5kIHNlYXJjaCBwYXRocyB0byB1c2UuCi0JICogCi0JICogQHBhcmFtIGluZm8KLQkgKiBAcmV0dXJuIEJlYW5JbmZvIGNvbnRyaWJ1dGlvbnMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSB0byBjb250cmlidXRlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBCZWFuaW5mb0VudHJ5W10gZ2V0QmVhbkluZm9FbnRyeUNvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGluZm8pOwotCQotCS8qKgotCSAqIEZvciB0aGUgZ2l2ZW4gcGFja2FnZSBwYXRoIHJ1biB0aGUgb3ZlcnJpZGUgY29udHJpYnV0aW9ucyB0aHJvdWdoIHRoZSBydW5uYWJsZS4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGJ5IEJlYW5JbmZvIHdoZW4gaXQgZGV0ZXJtaW5lcyB0aGF0IHRoaXMKLQkgKiBjb250cmlidXRvciBpcyBhcHBsaWNhYmxlIGZvciB0aGUgY3VycmVudCBwcm9qZWN0IGJlaW5nIHByb2Nlc3NlZC4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBjYWxsIHRoZSBydW5uYWJsZSAodGhlIGFyZ3VtZW50IDxjb2RlPnJ1bm5hYmxlPC9jb2RlPikgZm9yIGVhY2ggb3ZlcnJpZGUgZmlsZSB0aGF0IGlzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGluY29taW5nIGNsYXNzLgotCSAqIFlvdSBjYW4gZWl0aGVyIGNhbGwgdGhlIHJ1biBtZXRob2QgdGhhdCBwYXNzZXMgaW4gYSBzdHJpbmcgcG9pbnRpbmcgdG8gYSBkaXJlY3Rvcnkgd2hlcmUgeW91ciBvdmVycmlkZSBmaWxlIGlzCi0JICogbG9jYXRlZCAoaS5lLiA8Y29kZT5vdmVycmlkZUZpbGVOYW1lLm92ZXJyaWRlPC9jb2RlPiB3aGVyZSAib3ZlcnJpZGVGaWxlTmFtZSIgaXMgdGhlIG5hbWUgcGFzc2VkLiBPciB5b3UgY2FuIGNhbGwgdGhlIHJ1biBtZXRob2QgdGhhdCAKLQkgKiB0YWtlcyBhIFJlc291cmNlIHRoYXQgaXMgYWxyZWFkeSBsb2FkZWQgKGFuZCBtYXliZSBtb2RpZmllZCBvciBjcmVhdGVkIGxvY2FsbHkpLgotCSAqIAotCSAqIEBwYXJhbSBwYWNrYWdlUGF0aAotCSAqIEBwYXJhbSBvdmVycmlkZUZpbGVOYW1lIHRoZSBvdmVycmlkZUZpbGVOYW1lIHRoYXQgdGhlIG92ZXJyaWRlcyBpcyBmb3IuIFRoaXMgY2FuIGJlIHVzZWQgaW4gdmVyeSBzcGVjaWFsIGNhc2VzIHRvIHByb3ZpZGUgCi0JICogZXhhY3Qgb3ZlcnJpZGUgZmlsZXMgaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBwYXRoIGJlIHNlYXJjaGVkLiBBbiBleGFtcGxlIHdvdWxkIGJlIGZvciBwcm92aWRpbmcgYSBmaWxlIHRoYXQgaXNuJ3QgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2xhc3MuCi0JICogQSB2ZXJ5IHNwZWNpYWwgY2FzZSBpcyA8Y29kZT5ST09UPC9jb2RlPi4gVGhpcyBpcyB1c2VkIHdoZW4gYXNraW5nIHRvIGFwcGx5IHJvb3Qgb3ZlcnJpZGVzIHRvIGNsYXNzZXMgdGhhdCBoYXZlIG5vIAotCSAqIHN1cGVyIHR5cGUuIAotCSAqIEBwYXJhbSBqYXZhQ2xhc3MgdGhlIGphdmEgY2xhc3MgdGhhdCB0aGUgb3ZlcnJpZGVzIHdpbGwgYmUgYXBwbGllZCB0by4gTm90ZTogRG8gbm90IGNhbGwgYW55IHByb3BlcnR5LCBmZWF0dXJlcywgZXZlbnRzLCBvciBvcGVyYXRpb25zIGNhbGxzCi0JICogb3IgYW55IHByb3BlcnR5LCBldmVudHMsIG9yIG9wZXJhdGlvbnMgVXRpbGl0aWVzIGFnYWluc3QgdGhpcyBjbGFzcy4gVGhhdCBpcyBiZWNhdXNlIHRoaXMgY2xhc3MgaXMgYmVpbmcgaW50cm9zcGVjdGVkIGF0IHRoaXMgdGltZQotCSAqIGFuZCB0aG9zZSBjYWxscyB3aWxsIHJldHVybiBpbnZhbGlkIHZhbHVlcyBpZiBjYWxsZWQgYXQgdGhpcyBwb2ludCBzaW5jZSBpbnRyb3NwZWN0aW9uIGlzIG5vdCB5ZXQgY29tcGxldGUuIAotCSAqIEBwYXJhbSByZXNvdXJjZSBzZXQgdGhhdCBjb250cmlidXRvcnMgY2FuIHVzZSB0byB0ZW1wb3JhcmlseSBsb2FkIGR5bmFtaWMgb3ZlcnJpZGUgZmlsZXMuCi0JICogQHBhcmFtIHJ1bm5hYmxlIHRoZSBydW5uYWJsZSB0aGF0IHlvdSBjYWxsIHRvIGFjdHVhbGx5IGFwcGx5IHRoZSBvdmVycmlkZSBmaWxlcy4KLQkgKiAKLQkgKiBAc2VlIEJlYW5pbmZvUGx1Z2luI1JPT1QKLQkgKiBAc2VlIEJlYW5pbmZvUGx1Z2luI09WRVJSSURFX0VYVEVOU0lPTgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bk92ZXJyaWRlcyhJUGF0aCBwYWNrYWdlUGF0aCwgU3RyaW5nIG92ZXJyaWRlRmlsZU5hbWUsIEphdmFDbGFzcyBqYXZhQ2xhc3MsIFJlc291cmNlU2V0IHJzZXQsIEJlYW5pbmZvUGx1Z2luLklDb250cmlidXRvck92ZXJyaWRlUnVubmFibGUgcnVubmFibGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvU3VwcGxpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0lCZWFuaW5mb1N1cHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDY5ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvU3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJQmVhbmluZm9TdXBwbGllci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA5LzEzIDIwOjMwOjQ2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci0vKioKLSAqIEludGVyZmFjZSB0byBzdXBwbHkgaW5mb3JtYXRpb24gZm9yIGJlYW5pbmZvIHRvIGRlY291cGxlCi0gKiB0aGUgaW50cm9zcGVjdGlvbiBmcm9tIHRoZSBkZXNrdG9wLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5pbmZvU3VwcGxpZXIgewotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJuIHRoZSByZWdpc3RyeSB0byB1c2UuIEluaXRpYWxpemUgaXQgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCk7Ci0JCi0JLyoqCi0JICogVXNlZCB0byBrbm93IGlmIHdlIGN1cnJlbnRseSBoYXZlIGEgcmVnaXN0cnkgY3JlYXRlZCBpbiB0aGUgc3VwcGxpZXIuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgcmVnaXN0cnkgY3VycmVudGx5IGluIHRoZSBzdXBwbGllci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdHJ5Q3JlYXRlZCgpOwotCQotCS8qKgotCSAqIENsb3NlIHRoZSByZWdpc3RyeS4gVGhpcyB0ZWxscyB0aGUgcmVnaXN0cnkgdG8gY2xvc2UuIFRoaXMgaXMgbmVjZXNzYXJ5Ci0JICogYXQgdGltZXMgYmVjYXVzZSBvZiBjaGFuZ2VzIHRvIGNsYXNzZXMgcmVxdWlyZSB0aGUgcmVnaXN0cnkgdG8gYmUKLQkgKiByZWNvbnN0cnVjdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlUmVnaXN0cnkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2plY3QgdGhhdCB0aGlzIHN1cHBsaWVyIGlzIGZvci4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVzb3VyY2Ugc2V0IGJhc2VkIHVwb24gdGhlIGN1cnJlbnQgcHJvamVjdC4gVGhpcyByZXNvdXJjZSBzZXQgaXMgaG9va2VkIGludG8gdGhlCi0JICogcHJvamVjdCdzIHJlc291cmNlIHNldCBzbyB0aGF0IGFueSBzZWFyY2hlcyBmb3IgamF2YSBjbGFzc2VzLgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgcmVzb3VyY2Ugc2V0IHRoYXQgaXMgaG9va2VkIGludG8gdGhlIHByb2plY3QncyBqYXZhIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0IGdldE5ld1Jlc291cmNlU2V0KCk7Ci0JCi0JLyoqCi0JICogVGhlIHByb2plY3QgcmVzb3VyY2Ugc2V0IGZvciB0aGlzIHN1cHBsaWVyLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UHJvamVjdFJlc291cmNlU2V0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0lCZWFuaW5mb3NEb2NFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvc0RvY0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWRhZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvc0RvY0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUJlYW5pbmZvc0RvY0VudHJ5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjggJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBET00gRG9jIHdyaXRhYmxlIGVudHJpZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmVhbmluZm9zRG9jRW50cnkgewotCXB1YmxpYyBOb2RlIHdyaXRlRW50cnkoRG9jdW1lbnQgZG9jLCBJUHJvamVjdCBwcm9qZWN0KTsKLQkKLQlwdWJsaWMgaW50IGdldEtpbmQoKTsKLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM5M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0luaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJbml0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjggJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5iZWFuaW5mby5JSW50cm9zcGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLS8qKgotICogU3RhdGljIGluaXRpYWxpemVyIGNsYXNzIHRvIGluaXRpYWxpemUgdGhlIGJlYW5pbmZvIHN0dWZmLgotICogSXQgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGRlc2t0b3AgYW5kIHNvIGRvZXNuJ3QgcmVxdWlyZSBpdC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSW5pdCB7Ci0JCi0JLy8gU28gaXQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLgotCXByaXZhdGUgSW5pdCgpIHsKLQl9OwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCB3aXRoIGFuIElCZWFuaW5mb1N1cHBsaWVyLCB1c2VkIHRvIHNldCB1cCB0aGUKLQkgKiBpbnRyb3NwZWN0aW9uIHByb2Nlc3MuIAotCSAqCi0JICogVGhlIGJlYW5pbmZvIHN1cHBsaWVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIHRoZSBiZWFuIGluZm8gc2VhcmNoIHBhdGgsCi0JICogaW5jbHVkaW5nIHJlbW92aW5nIHRoZSBzdW4gYmVhbmluZm9zLCBpZiBkZXNpcmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKFJlc291cmNlU2V0IHJzZXQsIGZpbmFsIElCZWFuaW5mb1N1cHBsaWVyIHN1cHBsaWVyKSB7Ci0JCXJzZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgQmVhbmluZm9BZGFwdGVyRmFjdG9yeShzdXBwbGllcikpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHJlZ2lzdHJ5IG5vdyB0aGF0IGl0IGlzIGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkvLyBSZW1vdmUgdGhlICJzdW4uYmVhbnMuaW5mbyIgZnJvbSB0aGUgYmVhbmluZm8gc2VhcmNoIHBhdGggYmVjYXVzZQotCQkvLyB3ZSBjb21wbGV0ZWx5IG92ZXJyaWRlIHRoZSBzdW4gYmVhbiBpbmZvcy4KLQkJVXRpbGl0aWVzLnJlbW92ZUJlYW5JbmZvUGF0aChyZWdpc3RyeSwgInN1bi5iZWFucy5pbmZvcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2xlYW51cCBmcm9tIHRoZSBjb250ZXh0IGJlY2F1c2Ugd2UgYXJlIGJlaW5nIHJlbW92ZWQuCi0JICogSWYgY2xlYXJSZXN1bHRzIGlzIHRydWUsIHRoZW4gdGhlIGZhY3Rvcnkgc2hvdWxkIGNsZWFyIHRoZSByZXN1bHRzIG9mIGludHJvc3BlY3Rpb24KLQkgKiBmcm9tIHRoZSBldmVyeXRoaW5nIGJlY2F1c2UgdGhlIGNvbnRleHQgd2lsbCBzdGlsbCBiZSBhcm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoUmVzb3VyY2VTZXQgcnNldCwgYm9vbGVhbiBjbGVhclJlc3VsdHMpIHsKLQkJQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0KLQkJCShCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5KSBFY29yZVV0aWwuZ2V0QWRhcHRlckZhY3RvcnkocnNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCksIElJbnRyb3NwZWN0aW9uQWRhcHRlci5BREFQVEVSX0tFWSk7Ci0JCXJzZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLnJlbW92ZShmYWN0b3J5KTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCWZhY3RvcnkuY2xvc2VBbGwoY2xlYXJSZXN1bHRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL1NlYXJjaHBhdGhFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvU2VhcmNocGF0aEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODBlMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvU2VhcmNocGF0aEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFNlYXJjaHBhdGhFbnRyeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy4qOwotCi0vKioKLSAqIFNlYXJjaHBhdGggZW50cnkuIEJlYW5pbmZvIHNlYXJjaHBhdGggZW50cnkgKGkuZS4gcGFja2FnZSBuYW1lKS4gQ2FuIGluY2x1ZGUKLSAqIGtpbmQvcGF0aC9leHBvcnRlZCBpZiBub3QgYSBjaGlsZCBvZiB0aGUgQmVhbmluZm9FbnRyeS4KLSAqIAotICogTm90ZTogaWYgbm90IGEgY2hpbGQgb2YgYSBCZWFuSW5mb0VudHJ5LCB0aGVuIHRoZSBwYXRoIHJlZmVycyB0byBhIHBhY2thZ2UKLSAqIGluIHRoZSBjbGFzc3BhdGgsIHNvIGNvbnRhaW5lciBpcyBzdXBwb3J0ZWQgaGVyZS4KLSAqIAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNocGF0aEVudHJ5IGltcGxlbWVudHMgSUJlYW5pbmZvc0RvY0VudHJ5IHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgc1NlYXJjaHBhdGggPSAic2VhcmNocGF0aCI7IC8vIFNlYXJjaHBhdGggZW50cnksIHNoYXJlZCB3aXRoIEJlYW5pbmZvc0RvYy4gLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgc1BhY2thZ2UgPSAicGFja2FnZSI7IC8vIFBhY2thZ2UgbmFtZS4gLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVhZCB0aGUgZW50cnkgaW4gZnJvbSB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlYXJjaHBhdGhFbnRyeSByZWFkRW50cnkoSVJlYWRlciByZWFkZXIsIE9iamVjdCBlbGVtZW50LCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGJlYW5pbmZvQ2hpbGQpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZShlbGVtZW50LCBzUGFja2FnZSk7Ci0JCWlmIChiZWFuaW5mb0NoaWxkKQotCQkJcmV0dXJuIG5ldyBTZWFyY2hwYXRoRW50cnkocGFja2FnZU5hbWUpOyAvLyBLaW5kL3BhdGggYXJlbid0IHZhbGlkIG9uIGJlYW5pbmZvIGNoaWxkcmVuLgotCi0JCVN0cmluZyBlbGVtZW50S2luZCA9IHJlYWRlci5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgQmVhbmluZm9zRG9jLnNLaW5kKTsKLQkJU3RyaW5nIHBhdGhTdHIgPSByZWFkZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIEJlYW5pbmZvc0RvYy5zUGF0aCk7Ci0JCWludCBraW5kID0gQmVhbmluZm9FbnRyeS5raW5kRnJvbVN0cmluZyhlbGVtZW50S2luZCk7CQkKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWlmIChwYXRoU3RyICE9IG51bGwpIHsKLQkJCS8vIGVuc3VyZSBwYXRoIGlzIGFic29sdXRlCi0JCQlwYXRoID0gbmV3IFBhdGgocGF0aFN0cik7Ci0JCQlpZiAoa2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICYmIGtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgJiYgIXBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJcGF0aCA9IHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocGF0aCkgOiBwYXRoLm1ha2VBYnNvbHV0ZSgpOyAvLyBTb21lIGZvbGRlci9qYXIgd2l0aGluIHRoaXMgcHJvamVjdAotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBlbnRyeQotCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQkJc3dpdGNoIChraW5kKSB7Ci0KLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQl2YWxpZCA9IHBhdGggIT0gbnVsbCAmJiBwYXRoLmlzQWJzb2x1dGUoKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCQkJdmFsaWQgPSBmYWxzZTsKLQkJCQllbHNlIGlmIChwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCQkvLyBtdXN0IGJlIGFuIGVudHJ5IGluIHRoaXMgcHJvamVjdCBvciBzcGVjaWZ5IGFub3RoZXIgcHJvamVjdAotCQkJCQlTdHJpbmcgcHJvalNlZ21lbnQgPSBwYXRoLnNlZ21lbnQoMCk7Ci0JCQkJCWlmIChwcm9qZWN0ID09IG51bGwgfHwgcHJvalNlZ21lbnQgPT0gbnVsbCB8fCAhcHJvalNlZ21lbnQuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkgewotCQkJCQkJLy8gYW5vdGhlciBwcm9qZWN0Ci0JCQkJCQlraW5kID0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoJCQkJCi0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCXZhbGlkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodmFsaWQpCi0JCQlyZXR1cm4gbmV3IFNlYXJjaHBhdGhFbnRyeShraW5kLCBwYXRoLCBwYWNrYWdlTmFtZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCi0JfQotCi0JcHJvdGVjdGVkIGludCBraW5kID0gLTE7IC8vIFVuZGVyIEJlYW5pbmZvIGVudHJ5LCB0aGVzZSBkb24ndCBoYXZlIGtpbmQvcGF0aCdzLgotCXByb3RlY3RlZCBJUGF0aCBwYXRoOwkvLyBQYXRoIGNhbiBiZSBudWxsIGlmIHVuZGVyIGJlYW5pbmZvIGVudHJ5Ci0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlTmFtZTsJLy8gUGFja2FnZW5hbWUgY2FuIGJlIG51bGwgaWYga2luZC9wYXRoIHJlZmVyIHRvIGEgcHJvamVjdCBvciByZWdpc3RlcmVkIHZhcmlhYmxlLgotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwb3J0ZWQ7Ci0KLQlwdWJsaWMgU2VhcmNocGF0aEVudHJ5KGludCBraW5kLCBJUGF0aCBwYXRoLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJdGhpcy5raW5kID0ga2luZDsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCX0KLQotCXB1YmxpYyBTZWFyY2hwYXRoRW50cnkoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gcGFja2FnZU5hbWU7Ci0JfQotCi0JcHVibGljIE5vZGUgd3JpdGVFbnRyeShEb2N1bWVudCBkb2MsIElQcm9qZWN0IHByb2plY3QpIHsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChzU2VhcmNocGF0aCk7Ci0JCWlmIChraW5kICE9IC0xKSB7Ci0JCQkvLyBBIG5vbi1iZWFuaW5mbyBjaGlsZAotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoQmVhbmluZm9zRG9jLnNLaW5kLCBCZWFuaW5mb0VudHJ5LmtpbmRUb1N0cmluZyhraW5kKSk7Ci0JCQlJUGF0aCB0UGF0aCA9IHBhdGg7Ci0JCQlpZiAoa2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICYmIGtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQkvLyB0cmFuc2xhdGUgdG8gcHJvamVjdCByZWxhdGl2ZSBmcm9tIGFic29sdXRlICh1bmxlc3MgYSBkZXZpY2UgcGF0aCkKLQkJCQlpZiAodFBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCWlmICh0UGF0aC5zZWdtZW50KDApLmVxdWFscyhwcm9qZWN0LmdldEZ1bGxQYXRoKCkuc2VnbWVudCgwKSkpIHsKLQkJCQkJCXRQYXRoID0gdFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJCXRQYXRoID0gdFBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0UGF0aCA9IHRQYXRoLm1ha2VBYnNvbHV0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQllbGVtZW50LnNldEF0dHJpYnV0ZShCZWFuaW5mb3NEb2Muc1BhdGgsIHRQYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsKQotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoc1BhY2thZ2UsIHBhY2thZ2VOYW1lKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlYXJjaHBhdGhFbnRyeSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCi0JCVNlYXJjaHBhdGhFbnRyeSBvdGhlckVudHJ5ID0gKFNlYXJjaHBhdGhFbnRyeSkgb3RoZXI7Ci0JCWlmIChraW5kICE9IG90aGVyRW50cnkua2luZCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJaWYgKG90aGVyRW50cnkucGF0aCAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQk7Ci0JCWVsc2UgaWYgKCFwYXRoLmVxdWFscyhvdGhlckVudHJ5LnBhdGgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKQotCQkJaWYgKG90aGVyRW50cnkucGFja2FnZU5hbWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlCi0JCQkJOwotCQllbHNlIGlmICghcGFja2FnZU5hbWUuZXF1YWxzKG90aGVyRW50cnkucGFja2FnZU5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaENvZGUgPSBraW5kOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQkJaGFzaENvZGUgXj0gcGF0aC5oYXNoQ29kZSgpOwotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkKLQkJCWhhc2hDb2RlIF49IHBhY2thZ2VOYW1lLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBoYXNoQ29kZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL1V0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjY0M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFV0aWxpdGllcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI4ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvUHJveHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIEJlYW5pbmZvIChpbnRyb3NwZWN0aW9uKSB1dGlsaXRpZXMgbWV0aG9kcwotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsaXRpZXMgewotCQotCXByaXZhdGUgVXRpbGl0aWVzKCkgewotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0dXJuIHRoZSBjbGFzcyBhcyBhIEphdmFDbGFzcy4gSWYgaXQgYWN0dWFsbHkgaXMgYSBKYXZhVHlwZSB0aGlzIHdpbGwKLQkgKiBmYWlsIHdpdGggYSBDbGFzc0Nhc3RFeGNlcHRpb24uCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSByc2V0Ci0JICogQHJldHVybiBqYXZhIGNsYXNzCi0JICogCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgbm90IGEgamF2YSBjbGFzcywgYnV0IGluc3RlYWQgYSBqYXZhIHByaW1pdGl2ZS4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgUmVzb3VyY2VTZXQgcnNldCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgZ2V0SmF2YVR5cGUoY2xhc3NOYW1lLCByc2V0KTsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXR1cm4gdGhlIGNsYXNzIGFzIGEgSmF2YUhlbHBlcnMuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSByc2V0Ci0JICogQHJldHVybiBqYXZhIGhlbHBlcnMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRKYXZhVHlwZShTdHJpbmcgY2xhc3NOYW1lLCBSZXNvdXJjZVNldCByc2V0KSB7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpIHJzZXQuZ2V0RU9iamVjdChnZXRKYXZhQ2xhc3NVUkkoY2xhc3NOYW1lKSwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIFVSSSB0byB0aGUgZ2l2ZW4gY2xhc3NuYW1lLgotCSAqIDxwPgotCSAqIE5vdGU6IEl0IG11c3QgYmUgaW4gbm9ybWFsIGZvcm0sIGkuZS4gZnVsbHktcXVhbGlmaWVkLCBpZiBwcmltaXRpdmUgc3BlbGxlZCBvdXQgKGUuZy4gImludCIgbm90IEkpLCBhbmQgaWYKLQkgKiBhcnJheXMgaXQgbXVzdCByZWFkYWJsZSBmb3JtIChlLmcuICJuZXcgamF2YS5sYW5nLlN0cmluZ1tdIiBhbmQgbm90ICJbTGphdmEubGFuZy5TdHJpbmc7IikuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRKYXZhQ2xhc3NVUkkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgobmV3IEphdmFVUkwoY2xhc3NOYW1lKSkuZ2V0RnVsbFN0cmluZygpKTsKLQl9Ci0KLQkvKiogCi0JICogVXRpbGl0eSB0byByZXR1cm4gdGhlIEVDbGFzc2lmaWVyIGZyb20gdGhlIGdpdmVuIElCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUNsYXNzaWZpZXIgZ2V0SmF2YUNsYXNzKElCZWFuVHlwZVByb3h5IHR5cGUsIFJlc291cmNlU2V0IHJzZXQpIHsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEphdmFUeXBlKHR5cGUuZ2V0Rm9ybWFsVHlwZU5hbWUoKSwgcnNldCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXR1cm4gdGhlIE1ldGhvZCBmcm9tIHRoZSBnaXZlbiBJTWV0aG9kUHJveHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKElNZXRob2RQcm94eSBtZXRob2QsIFJlc291cmNlU2V0IHJzZXQpIHsKLQkJcmV0dXJuIG1ldGhvZCAhPSBudWxsID8gKE1ldGhvZCkgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoZ2V0TWV0aG9kVVJMKG1ldGhvZCkpLCB0cnVlKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBVUkwgU3RyaW5nIGZvciBNZXRob2QgZnJvbSB0aGUgZ2l2ZW4gSU1ldGhvZFByb3h5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0aG9kVVJMKElNZXRob2RQcm94eSBtZXRob2QpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGhvZC5nZXRDbGFzc1R5cGUoKS5nZXRUeXBlTmFtZSgpOwotCQlJQmVhblR5cGVQcm94eVtdIHBhcm1zID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCVN0cmluZ1tdIHBhcm1UeXBlcyA9IHBhcm1zLmxlbmd0aCA+IDAgPyBuZXcgU3RyaW5nW3Bhcm1zLmxlbmd0aF0gOiBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXJtVHlwZXNbaV0gPSBwYXJtc1tpXS5nZXRGb3JtYWxUeXBlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBjb21wdXRlTWV0aG9kVVJMKGNsYXNzTmFtZSwgbWV0aG9kLmdldE5hbWUoKSwgcGFybVR5cGVzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZFVSTChTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJtVHlwZXMpIHsKLQkJaW50IGNsYXNzU3RhcnQgPSBmdWxseVF1YWxpZmllZENsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcig1MCk7Ci0JCXVybC5hcHBlbmQoImphdmE6LyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjbGFzc1N0YXJ0ID4gLTEpCi0JCQl1cmwuYXBwZW5kKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc1N0YXJ0KSk7Ci0JCXVybC5hcHBlbmQoJyMnKTsKLQkJdXJsLmFwcGVuZChjb21wdXRlTWV0aG9kSUQoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzU3RhcnQgKyAxKSwgbWV0aG9kTmFtZSwgcGFybVR5cGVzKSk7Ci0JCXJldHVybiB1cmwudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29tcHV0ZUZpZWxkVVJMKFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlpbnQgY2xhc3NTdGFydCA9IGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCVN0cmluZ0J1ZmZlciB1cmwgPSBuZXcgU3RyaW5nQnVmZmVyKDUwKTsKLQkJdXJsLmFwcGVuZCgiamF2YTovIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNsYXNzU3RhcnQgPiAtMSkKLQkJCXVybC5hcHBlbmQoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzU3RhcnQpKTsKLQkJdXJsLmFwcGVuZCgnIycpOwotCQl1cmwuYXBwZW5kKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc1N0YXJ0ICsgMSkpOwotCQl1cmwuYXBwZW5kKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCXVybC5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmV0dXJuIHVybC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpZWxkIHVyaSBmb3IgdGhlIGdpdmVuIGNsYXNzbmFtZSwgZmllbGRuYW1lLgotCSAqIEBwYXJhbSBmdWxseVF1YWxpZmllZENsYXNzTmFtZQotCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0RmllbGRVUkkoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGNvbXB1dGVGaWVsZFVSTChmdWxseVF1YWxpZmllZENsYXNzTmFtZSwgZmllbGROYW1lKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHVyaSBmb3IgdGhlIGdpdmVuIGNsYXNzbmFtZSwgbWV0aG9kbmFtZSwgcGFybSB0eXBlcy4KLQkgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJtVHlwZXMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIHBhcm1zLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRNZXRob2RVUkkoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFybVR5cGVzKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGNvbXB1dGVNZXRob2RVUkwoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUsIG1ldGhvZE5hbWUsIHBhcm1UeXBlcykpOwotCX0KLQotCS8qKgotCSAqIFR1cm4gaXQgaW50byBhbiBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0TWV0aG9kVVJJKElNZXRob2RQcm94eSBtZXRob2QpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoZ2V0TWV0aG9kVVJMKG1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY29tcHV0ZSB0aGUgSmF2YSBNb2RlbGluZyBNRVRIT0RJRCBmcm9tIG1ldGhvZCBkZWNsYXJpbmcgY2xhc3MgbmFtZSwKLQkgKiBtZXRob2QgbmFtZSwgYW5kIHBhcmFtZXRlciBjbGFzcyBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kSUQoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDUwKTsKLQkJb3V0LmFwcGVuZChjbGFzc05hbWUpOwotCQlvdXQuYXBwZW5kKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCW91dC5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCW91dC5hcHBlbmQoUmVmbGVjdGlvbkFkYXB0b3IuQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIpOwotCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvdXQuYXBwZW5kKHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCQlpZiAoaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDEpCi0JCQkJCW91dC5hcHBlbmQoUmVmbGVjdGlvbkFkYXB0b3IuQ19QQVJNX1BBUk1fREVMSU1JVEVSKTsKLQkJCX0KLQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMobWV0aG9kTmFtZSkpCi0JCQlvdXQuYXBwZW5kKFJlZmxlY3Rpb25BZGFwdG9yLlNfQ09OU1RSVUNUT1JfVE9LRU4pOyAvL0l0J3MgYSBjb25zdHJ1Y3RvcgotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXRyaWV2ZSB0aGUgQmVhbkRlY29yYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5EZWNvcmF0b3IgZ2V0QmVhbkRlY29yYXRvcihFTW9kZWxFbGVtZW50IG1vZGVsKSB7Ci0JCXJldHVybiAoQmVhbkRlY29yYXRvcikgZ2V0RGVjb3JhdG9yKG1vZGVsLCBCZWFuRGVjb3JhdG9yLmNsYXNzKTsKLQl9Ci0JLyoqCi0JICogVXRpbGl0eSB0byByZXRyaWV2ZSBhIGRlY29yYXRvciBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUFubm90YXRpb24gZ2V0RGVjb3JhdG9yKEVNb2RlbEVsZW1lbnQgbW9kZWwsIENsYXNzIGRlY29yYXRvckNsYXNzKSB7Ci0JCUl0ZXJhdG9yIGl0ciA9IG1vZGVsLmdldEVBbm5vdGF0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFQW5ub3RhdGlvbiBkZWNyID0gKEVBbm5vdGF0aW9uKSBpdHIubmV4dCgpOwotCQkJaWYgKGRlY29yYXRvckNsYXNzLmlzSW5zdGFuY2UoZGVjcikpCi0JCQkJcmV0dXJuIGRlY3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXRyaWV2ZSB0aGUgRXZlbnRTZXREZWNvcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBFdmVudFNldERlY29yYXRvciBnZXRFdmVudFNldERlY29yYXRvcihFTW9kZWxFbGVtZW50IG1vZGVsKSB7Ci0JCXJldHVybiAoRXZlbnRTZXREZWNvcmF0b3IpIGdldERlY29yYXRvcihtb2RlbCwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0cmlldmUgdGhlIE1ldGhvZERlY29yYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZERlY29yYXRvciBnZXRNZXRob2REZWNvcmF0b3IoRU1vZGVsRWxlbWVudCBtb2RlbCkgewotCQlyZXR1cm4gKE1ldGhvZERlY29yYXRvcikgZ2V0RGVjb3JhdG9yKG1vZGVsLCBNZXRob2REZWNvcmF0b3IuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0cmlldmUgdGhlIFByb3BlcnR5RGVjb3JhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZWNvcmF0b3IgZ2V0UHJvcGVydHlEZWNvcmF0b3IoRU1vZGVsRWxlbWVudCBtb2RlbCkgewotCQlyZXR1cm4gKFByb3BlcnR5RGVjb3JhdG9yKSBnZXREZWNvcmF0b3IobW9kZWwsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIHJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgbGlzdCB3aGljaCB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgZGVjb3JhdG9ycwotCSAqIG9mIG9ubHkgdGhlIHByb3BlcnRpZXMgaW4gdGhlIEVMaXN0IHBhc3NlZCBpbi4gSWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYQotCSAqIHByb3BlcnR5IGRlY29yYXRvciwgdGhlbiBpdCBpcyBub3QgYSBiZWFuaW5mbyBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldFByb3BlcnRpZXNJdGVyYXRvcihmaW5hbCBFTGlzdCBwcm9wZXJ0aWVzKSB7Ci0JCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQlwcml2YXRlIEl0ZXJhdG9yIGl0ciA9IHByb3BlcnRpZXMuaXRlcmF0b3IoKTsKLQkJCXByaXZhdGUgYm9vbGVhbiBoYXNOZXh0ID0gdHJ1ZTsKLQkJCXByaXZhdGUgUHJvcGVydHlEZWNvcmF0b3IgbmV4dDsKLQkJCXsKLQkJCQlmaW5kTmV4dCgpOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQlyZXR1cm4gaGFzTmV4dDsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCVByb3BlcnR5RGVjb3JhdG9yIHRlbXAgPSBuZXh0OwotCQkJCWZpbmROZXh0KCk7Ci0JCQkJcmV0dXJuIHRlbXA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIGZpbmROZXh0KCkgewotCQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVNb2RlbEVsZW1lbnQgbmV4dE9uZSA9IChFTW9kZWxFbGVtZW50KSBpdHIubmV4dCgpOwotCQkJCQluZXh0ID0gZ2V0UHJvcGVydHlEZWNvcmF0b3IobmV4dE9uZSk7Ci0JCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQloYXNOZXh0ID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgd2hpY2ggd2lsbCByZXR1cm4gdGhlIEV2ZW50U2V0IGRlY29yYXRvcnMKLQkgKiBvZiBvbmx5IHRoZSBCZWFuRXZlbnRzIGluIHRoZSBFTGlzdCBwYXNzZWQgaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRFdmVudFNldHNJdGVyYXRvcihmaW5hbCBFTGlzdCBldmVudHMpIHsKLQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCXByaXZhdGUgSXRlcmF0b3IgaXRyID0gZXZlbnRzLml0ZXJhdG9yKCk7Ci0JCQlwcml2YXRlIGJvb2xlYW4gaGFzTmV4dCA9IHRydWU7Ci0JCQlwcml2YXRlIEV2ZW50U2V0RGVjb3JhdG9yIG5leHQ7Ci0JCQl7Ci0JCQkJZmluZE5leHQoKTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJcmV0dXJuIGhhc05leHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQlFdmVudFNldERlY29yYXRvciB0ZW1wID0gbmV4dDsKLQkJCQlmaW5kTmV4dCgpOwotCQkJCXJldHVybiB0ZW1wOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBmaW5kTmV4dCgpIHsKLQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQlFTW9kZWxFbGVtZW50IG5leHRPbmUgPSAoRU1vZGVsRWxlbWVudCkgaXRyLm5leHQoKTsKLQkJCQkJbmV4dCA9IGdldEV2ZW50U2V0RGVjb3JhdG9yKG5leHRPbmUpOwotCQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaGFzTmV4dCA9IGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBsaXN0IHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBNZXRob2QgZGVjb3JhdG9ycwotCSAqIG9mIG9ubHkgdGhlIE1ldGhvZHMgaW4gdGhlIEVMaXN0IHBhc3NlZCBpbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldE1ldGhvZHNJdGVyYXRvcihmaW5hbCBFTGlzdCBtZXRob2RzKSB7Ci0JCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQlwcml2YXRlIEl0ZXJhdG9yIGl0ciA9IG1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJCXByaXZhdGUgYm9vbGVhbiBoYXNOZXh0ID0gdHJ1ZTsKLQkJCXByaXZhdGUgTWV0aG9kRGVjb3JhdG9yIG5leHQ7Ci0JCQl7Ci0JCQkJZmluZE5leHQoKTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJcmV0dXJuIGhhc05leHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQlNZXRob2REZWNvcmF0b3IgdGVtcCA9IG5leHQ7Ci0JCQkJZmluZE5leHQoKTsKLQkJCQlyZXR1cm4gdGVtcDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgZmluZE5leHQoKSB7Ci0JCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJRU1vZGVsRWxlbWVudCBuZXh0T25lID0gKEVNb2RlbEVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0JCQkJCW5leHQgPSBnZXRNZXRob2REZWNvcmF0b3IobmV4dE9uZSk7Ci0JCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQloYXNOZXh0ID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzZWFyY2ggcGF0aCBmcm9tIHRoZSByZW1vdGUgdm0uIAotCSAqIAotCSAqIE5vdGU6IFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggYSBCZWFuaW5mb05hdHVyZS4gVXNlIHRoZQotCSAqIGFjY2Vzc29ycyB0YWtpbmcgdGhlIG5hdHVyZSAgaW5zdGVhZC4gT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgaW5jb25zaXN0ZW5jaWVzIHNpbmNlIHRoZSBzZWFyY2ggcGF0aCB3b24ndCBiZQotCSAqIHNhdmVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiB0aGUgd29ya3NwYWNlIGlmIGl0IGlzIG5vdCB1cGRhdGVkIHRocm91Z2ggdGhlIG5hdHVyZSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXJyYXlCZWFuUHJveHkgZ2V0QmVhbkluZm9TZWFyY2hQYXRoKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXJldHVybiAoSUFycmF5QmVhblByb3h5KSBCZWFuaW5mb1Byb3h5Q29uc3RhbnRzCi0JCQkuZ2V0Q29uc3RhbnRzKHJlZ2lzdHJ5KQotCQkJLmdldEdldEJlYW5JbmZvU2VhcmNoUGF0aFByb3h5KCkKLQkJCS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoCi0JCQludWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlYXJjaCBwYXRoIHRvIHRoZSBhcnJheSBvZiBzdHJpbmdzIHBhc3NlZCBpbiBvbiB0aGUgcmVtb3RlIHZtLgotCSAqCi0JICogTm90ZTogVGhpcyBzaG91bGRuJ3QgYmUgdXNlZCB3aGVuIHdvcmtpbmcgd2l0aCBhIEJlYW5pbmZvTmF0dXJlLiBVc2UgdGhlCi0JICogYWNjZXNzb3JzIHRha2luZyB0aGUgbmF0dXJlICBpbnN0ZWFkLiBPdGhlcndpc2UgdGhlcmUgd2lsbCBiZSBpbmNvbnNpc3RlbmNpZXMgc2luY2UgdGhlIHNlYXJjaCBwYXRoIHdvbid0IGJlCi0JICogc2F2ZWQgYWNyb3NzIGludm9jYXRpb25zIG9mIHRoZSB3b3Jrc3BhY2UgaWYgaXQgaXMgbm90IHVwZGF0ZWQgdGhyb3VnaCB0aGUgbmF0dXJlKS4JIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCZWFuSW5mb1NlYXJjaFBhdGgoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZ1tdIHBhdGhzKSB7Ci0KLQkJdHJ5IHsKLQkJCUJlYW5pbmZvUHJveHlDb25zdGFudHMgYmlDb25zdGFudHMgPSBCZWFuaW5mb1Byb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhyZWdpc3RyeSk7Ci0JCQlKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgakNvbnN0YW50cyA9IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JCQlJQXJyYXlCZWFuUHJveHkgbmV3UGF0aCA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGpDb25zdGFudHMuZ2V0U3RyaW5nVHlwZSgpLCBwYXRocyAhPSBudWxsID8gcGF0aHMubGVuZ3RoIDogMCk7Ci0JCQlpZiAocGF0aHMgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKQotCQkJCQluZXdQYXRoLnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwYXRoc1tpXSksIGkpOwotCQkJYmlDb25zdGFudHMuZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCwgbmV3UGF0aCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZyb20gdGhlIEJlYW5pbmZvIE5hdHVyZSwgaW5zZXJ0IGEgcGF0aCB0byB0aGUgYmVhbmluZm8gcGF0aCBhdCB0aGUgZ2l2ZW4gaW5kZXgsIC0xIG1lYW5zIGF0IHRoZSBlbmQuCi0JICogSWYgaW5kZXggaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgcGF0aCwgaXQgd2lsbCBhbHNvIGFkZCBhdCB0aGUgZW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRCZWFuSW5mb1NlYXJjaFBhdGgoQmVhbmluZm9OYXR1cmUgbmF0dXJlLCBJQmVhbmluZm9zRG9jRW50cnkgcGF0aCwgaW50IGluZGV4KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUJlYW5pbmZvc0RvYyBpbmZvUGF0aCA9IG5hdHVyZS5nZXRTZWFyY2hQYXRoKCk7Ci0JCUlCZWFuaW5mb3NEb2NFbnRyeVtdIG9sZFBhdGggPSBpbmZvUGF0aC5nZXRTZWFyY2hwYXRoKCk7Ci0KLQkJSUJlYW5pbmZvc0RvY0VudHJ5W10gbmV3UGF0aCA9IG5ldyBJQmVhbmluZm9zRG9jRW50cnlbb2xkUGF0aC5sZW5ndGggKyAxXTsKLQotCQlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPj0gb2xkUGF0aC5sZW5ndGgpIHsKLQkJCS8vIEF0IHRoZSBlbmQgb3IgcGFzdCBlbmQKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkUGF0aCwgMCwgbmV3UGF0aCwgMCwgb2xkUGF0aC5sZW5ndGgpOwotCQkJbmV3UGF0aFtvbGRQYXRoLmxlbmd0aF0gPSBwYXRoOwotCQl9IGVsc2UgewotCQkJLy8gSW4gdGhlIG1pZGRsZQotCQkJU3lzdGVtLmFycmF5Y29weShvbGRQYXRoLCAwLCBuZXdQYXRoLCAwLCBpbmRleCk7Ci0JCQluZXdQYXRoW2luZGV4XSA9IHBhdGg7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFBhdGgsIGluZGV4LCBuZXdQYXRoLCBpbmRleCArIDEsIG9sZFBhdGgubGVuZ3RoIC0gaW5kZXgpOwotCQl9Ci0KLQkJaW5mb1BhdGguc2V0U2VhcmNocGF0aChuZXdQYXRoKTsKLQkJbmF0dXJlLnNldFNlYXJjaFBhdGgoaW5mb1BhdGgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBhIHBhdGggdG8gdGhlIGJlYW5pbmZvIHBhdGggYXQgdGhlIGdpdmVuIGluZGV4LCAtMSBtZWFucyBhdCB0aGUgZW5kLgotCSAqIElmIGluZGV4IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHBhdGgsIGl0IHdpbGwgYWxzbyBhZGQgYXQgdGhlIGVuZC4KLQkgKgotCSAqIE5vdGU6IFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggYSBCZWFuaW5mb05hdHVyZS4gVXNlIHRoZQotCSAqIGFjY2Vzc29ycyB0YWtpbmcgdGhlIG5hdHVyZSAgaW5zdGVhZC4gT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgaW5jb25zaXN0ZW5jaWVzIHNpbmNlIHRoZSBzZWFyY2ggcGF0aCB3b24ndCBiZQotCSAqIHNhdmVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiB0aGUgd29ya3NwYWNlIGlmIGl0IGlzIG5vdCB1cGRhdGVkIHRocm91Z2ggdGhlIG5hdHVyZSkuCSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0QmVhbkluZm9TZWFyY2hQYXRoKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGF0aCwgaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIGJpQ29uc3RhbnRzID0gQmVhbmluZm9Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJSUFycmF5QmVhblByb3h5IGluZm9QYXRoID0gKElBcnJheUJlYW5Qcm94eSkgYmlDb25zdGFudHMuZ2V0R2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCk7Ci0JCQlpbnQgcGF0aExlbmd0aCA9IGluZm9QYXRoLmdldExlbmd0aCgpOwotCi0JCQlJU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQotCQkJSUFycmF5QmVhblByb3h5IG5ld1BhdGggPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChpbmZvUGF0aC5nZXRUeXBlUHJveHkoKSwgcGF0aExlbmd0aCArIDEpOwotCQkJSUJlYW5Qcm94eSBzdHJpbmdQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHBhdGgpOwotCi0JCQlKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgY29uc3RhbnRzID0gSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhyZWdpc3RyeSk7Ci0JCQlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPj0gcGF0aExlbmd0aCkgewotCQkJCS8vIEF0IHRoZSBlbmQgb3IgcGFzdCBlbmQKLQkJCQljb25zdGFudHMuYXJyYXljb3B5KGluZm9QYXRoLCAwLCBuZXdQYXRoLCAwLCBpbmZvUGF0aC5nZXRMZW5ndGgoKSk7Ci0JCQkJbmV3UGF0aC5zZXQoc3RyaW5nUHJveHksIHBhdGhMZW5ndGgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJbiB0aGUgbWlkZGxlCi0JCQkJY29uc3RhbnRzLmFycmF5Y29weShpbmZvUGF0aCwgMCwgbmV3UGF0aCwgMCwgaW5kZXgpOwotCQkJCW5ld1BhdGguc2V0KHN0cmluZ1Byb3h5LCBpbmRleCk7Ci0JCQkJY29uc3RhbnRzLmFycmF5Y29weShpbmZvUGF0aCwgaW5kZXgsIG5ld1BhdGgsIGluZGV4ICsgMSwgcGF0aExlbmd0aCAtIGluZGV4KTsKLQkJCX0KLQotCQkJYmlDb25zdGFudHMuZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCwgbmV3UGF0aCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZyb20gdGhlIEJlYW5pbmZvIE5hdHVyZSwgcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGF0aCBmcm9tIHRoZSBiZWFuaW5mbyBzZWFyY2ggcGF0aC4KLQkgKiBOb3QgYW4gZXJyb3IgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVCZWFuSW5mb1BhdGgoQmVhbmluZm9OYXR1cmUgbmF0dXJlLCBJQmVhbmluZm9zRG9jRW50cnkgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlCZWFuaW5mb3NEb2MgaW5mb1BhdGggPSBuYXR1cmUuZ2V0U2VhcmNoUGF0aCgpOwotCQlJQmVhbmluZm9zRG9jRW50cnlbXSBvbGRQYXRoID0gaW5mb1BhdGguZ2V0U2VhcmNocGF0aCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkUGF0aC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhdGguZXF1YWxzKG9sZFBhdGhbaV0pKSB7Ci0JCQkJLy8gV2UgZm91bmQgaXQsIHNvIHJlbW92ZSBpdC4KLQkJCQlJQmVhbmluZm9zRG9jRW50cnlbXSBuZXdQYXRoID0gbmV3IElCZWFuaW5mb3NEb2NFbnRyeVtvbGRQYXRoLmxlbmd0aCAtIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkUGF0aCwgMCwgbmV3UGF0aCwgMCwgaSk7Ci0JCQkJaWYgKGkgPCBvbGRQYXRoLmxlbmd0aCAtIDEpCi0JCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkUGF0aCwgaSArIDEsIG5ld1BhdGgsIGksIG9sZFBhdGgubGVuZ3RoIC0gaSAtIDEpOwotCQkJCWluZm9QYXRoLnNldFNlYXJjaHBhdGgobmV3UGF0aCk7Ci0JCQkJbmF0dXJlLnNldFNlYXJjaFBhdGgoaW5mb1BhdGgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgYmVhbmluZm8gc2VhcmNoIHBhdGguCi0JICogTm90IGFuIGVycm9yIGlmIG5vdCBmb3VuZC4KLQkgKgotCSAqIE5vdGU6IFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggYSBCZWFuaW5mb05hdHVyZS4gVXNlIHRoZQotCSAqIGFjY2Vzc29ycyB0YWtpbmcgdGhlIG5hdHVyZSAgaW5zdGVhZC4gT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgaW5jb25zaXN0ZW5jaWVzIHNpbmNlIHRoZSBzZWFyY2ggcGF0aCB3b24ndCBiZQotCSAqIHNhdmVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiB0aGUgd29ya3NwYWNlIGlmIGl0IGlzIG5vdCB1cGRhdGVkIHRocm91Z2ggdGhlIG5hdHVyZSkuCSAJIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVCZWFuSW5mb1BhdGgoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIGJpQ29uc3RhbnRzID0gQmVhbmluZm9Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJSUFycmF5QmVhblByb3h5IGluZm9QYXRoID0gKElBcnJheUJlYW5Qcm94eSkgYmlDb25zdGFudHMuZ2V0R2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCk7Ci0JCQlpbnQgcGF0aExlbmd0aCA9IGluZm9QYXRoLmdldExlbmd0aCgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhMZW5ndGg7IGkrKykgewotCQkJCUlTdHJpbmdCZWFuUHJveHkgYVBhdGggPSAoSVN0cmluZ0JlYW5Qcm94eSkgaW5mb1BhdGguZ2V0KGkpOwotCQkJCWlmIChwYXRoLmVxdWFscyhhUGF0aC5zdHJpbmdWYWx1ZSgpKSkgewotCQkJCQkvLyBXZSBmb3VuZCBpdCwgc28gcmVtb3ZlIGl0LgotCQkJCQlJQXJyYXlCZWFuUHJveHkgbmV3UGF0aCA9IHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGluZm9QYXRoLmdldFR5cGVQcm94eSgpLCBwYXRoTGVuZ3RoIC0gMSk7Ci0JCQkJCUphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBjb25zdGFudHMgPSBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKHJlZ2lzdHJ5KTsKLQkJCQkJY29uc3RhbnRzLmFycmF5Y29weShpbmZvUGF0aCwgMCwgbmV3UGF0aCwgMCwgaSk7Ci0JCQkJCWlmIChpIDwgcGF0aExlbmd0aCAtIDEpCi0JCQkJCQljb25zdGFudHMuYXJyYXljb3B5KGluZm9QYXRoLCBpICsgMSwgbmV3UGF0aCwgaSwgcGF0aExlbmd0aCAtIGkgLSAxKTsKLQkJCQkJYmlDb25zdGFudHMuZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCwgbmV3UGF0aCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM0MTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotQmVhbkluZm9DYWNoZUNvbnRyb2xsZXJfSm9iX1dyaXRlQmVhbmluZm9DYWNoZV9UaXRsZT1Xcml0ZSBCZWFuSW5mbyBjYWNoZSBmaWxlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbkRlY29yYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5EZWNvcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZWY3M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbkRlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5EZWNvcmF0b3JJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIyICQgICREYXRlOiAyMDA1LzEwLzE4IDE1OjMyOjE5ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8uY29tbW9uLklCYXNlQmVhbkluZm9Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CZWFuIERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjaXNNZXJnZVN1cGVyUHJvcGVydGllcyA8ZW0+TWVyZ2UgU3VwZXIgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjaXNNZXJnZVN1cGVyTWV0aG9kcyA8ZW0+TWVyZ2UgU3VwZXIgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjaXNNZXJnZVN1cGVyRXZlbnRzIDxlbT5NZXJnZSBTdXBlciBFdmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2lzSW50cm9zcGVjdFByb3BlcnRpZXMgPGVtPkludHJvc3BlY3QgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjaXNJbnRyb3NwZWN0TWV0aG9kcyA8ZW0+SW50cm9zcGVjdCBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNpc0ludHJvc3BlY3RFdmVudHMgPGVtPkludHJvc3BlY3QgRXZlbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNpc0RvQmVhbmluZm8gPGVtPkRvIEJlYW5pbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzIDxlbT5Ob3QgSW5oZXJpdGVkIFByb3BlcnR5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcyA8ZW0+Tm90IEluaGVyaXRlZCBNZXRob2QgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2dldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMgPGVtPk5vdCBJbmhlcml0ZWQgRXZlbnQgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2dldEN1c3RvbWl6ZXJDbGFzcyA8ZW0+Q3VzdG9taXplciBDbGFzczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBCZWFuRGVjb3JhdG9ySW1wbCBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgQmVhbkRlY29yYXRvcnsKLQkKLQkvKioKLQkgKiBCaXRzIGZvciBpbXBsaWNpdGx5IHNldCBmZWF0dXJlcy4gVGhpcyBpcyBpbnRlcm5hbCwgbm90IG1lYW50IGZvciBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBCRUFOX0NVU1RPTUlaRVJfSU1QTElDSVQgPSAweDFMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBCRUFOX01FUkdFX0lOSEVSSVRFRF9QUk9QRVJUSUVTX0lNUExJQ0lUID0gMHgyTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQkVBTl9NRVJHRV9JTkhFUklURURfT1BFUkFUSU9OU19JTVBMSUNJVCA9IDB4NEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJFQU5fTUVSR0VfSU5IRVJJVEVEX0VWRU5UU19JTVBMSUNJVCA9IDB4OEw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXJnZVN1cGVyUHJvcGVydGllcygpIDxlbT5NZXJnZSBTdXBlciBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FREVGQVVMVCA9IHRydWU7Ci0JCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXJnZVN1cGVyUHJvcGVydGllcygpIDxlbT5NZXJnZSBTdXBlciBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHID0gMSA8PCAxODsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBNZXJnZSBTdXBlciBQcm9wZXJ0aWVzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VTRVRGTEFHID0gMSA8PCAxOTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01lcmdlU3VwZXJNZXRob2RzKCkgPGVtPk1lcmdlIFN1cGVyIE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlck1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNRVJHRV9TVVBFUl9NRVRIT0RTX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWVyZ2VTdXBlck1ldGhvZHMoKSA8ZW0+TWVyZ2UgU3VwZXIgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRyA9IDEgPDwgMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgTWVyZ2UgU3VwZXIgTWV0aG9kcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0VfU1VQRVJfTUVUSE9EU19FU0VURkxBRyA9IDEgPDwgMjE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXJnZVN1cGVyRXZlbnRzKCkgPGVtPk1lcmdlIFN1cGVyIEV2ZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXJnZVN1cGVyRXZlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVSR0VfU1VQRVJfRVZFTlRTX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWVyZ2VTdXBlckV2ZW50cygpIDxlbT5NZXJnZSBTdXBlciBFdmVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlckV2ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHID0gMSA8PCAyMjsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBNZXJnZSBTdXBlciBFdmVudHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1FUkdFX1NVUEVSX0VWRU5UU19FU0VURkxBRyA9IDEgPDwgMjM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRyb3NwZWN0UHJvcGVydGllcygpIDxlbT5JbnRyb3NwZWN0IFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50cm9zcGVjdFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTlRST1NQRUNUX1BST1BFUlRJRVNfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRyb3NwZWN0UHJvcGVydGllcygpIDxlbT5JbnRyb3NwZWN0IFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50cm9zcGVjdFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOVFJPU1BFQ1RfUFJPUEVSVElFU19FRkxBRyA9IDEgPDwgMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRyb3NwZWN0TWV0aG9kcygpIDxlbT5JbnRyb3NwZWN0IE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50cm9zcGVjdE1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTlRST1NQRUNUX01FVEhPRFNfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRyb3NwZWN0TWV0aG9kcygpIDxlbT5JbnRyb3NwZWN0IE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50cm9zcGVjdE1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOVFJPU1BFQ1RfTUVUSE9EU19FRkxBRyA9IDEgPDwgMjU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRyb3NwZWN0RXZlbnRzKCkgPGVtPkludHJvc3BlY3QgRXZlbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludHJvc3BlY3RFdmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTlRST1NQRUNUX0VWRU5UU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ludHJvc3BlY3RFdmVudHMoKSA8ZW0+SW50cm9zcGVjdCBFdmVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50cm9zcGVjdEV2ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5UUk9TUEVDVF9FVkVOVFNfRUZMQUcgPSAxIDw8IDI2OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRG9CZWFuaW5mbygpIDxlbT5EbyBCZWFuaW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEb0JlYW5pbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRE9fQkVBTklORk9fRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEb0JlYW5pbmZvKCkgPGVtPkRvIEJlYW5pbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RvQmVhbmluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERPX0JFQU5JTkZPX0VGTEFHID0gMSA8PCAyNzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKSA8ZW0+Tm90IEluaGVyaXRlZCBQcm9wZXJ0eSBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgbm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcygpIDxlbT5Ob3QgSW5oZXJpdGVkIE1ldGhvZCBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG5vdEluaGVyaXRlZE1ldGhvZE5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKSA8ZW0+Tm90IEluaGVyaXRlZCBFdmVudCBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RJbmhlcml0ZWRFdmVudE5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgbm90SW5oZXJpdGVkRXZlbnROYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21pemVyQ2xhc3MoKSA8ZW0+Q3VzdG9taXplciBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VzdG9taXplckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGN1c3RvbWl6ZXJDbGFzcyA9IG51bGw7Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCQotCXByb3RlY3RlZCBCZWFuRGVjb3JhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZUZsYWdzIHw9IE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUc7Ci0JCWVGbGFncyB8PSBNRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHOwotCQllRmxhZ3MgfD0gTUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHOwotCQllRmxhZ3MgfD0gSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VGTEFHOwotCQllRmxhZ3MgfD0gSU5UUk9TUEVDVF9NRVRIT0RTX0VGTEFHOwotCQllRmxhZ3MgfD0gSU5UUk9TUEVDVF9FVkVOVFNfRUZMQUc7Ci0JCWVGbGFncyB8PSBET19CRUFOSU5GT19FRkxBRzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2VTdXBlclByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXJnZVN1cGVyUHJvcGVydGllcyhib29sZWFuIG5ld01lcmdlU3VwZXJQcm9wZXJ0aWVzKSB7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlclByb3BlcnRpZXMgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld01lcmdlU3VwZXJQcm9wZXJ0aWVzKSBlRmxhZ3MgfD0gTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfk1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlclByb3BlcnRpZXNFU2V0ID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX1BST1BFUlRJRVMsIG9sZE1lcmdlU3VwZXJQcm9wZXJ0aWVzLCBuZXdNZXJnZVN1cGVyUHJvcGVydGllcywgIW9sZE1lcmdlU3VwZXJQcm9wZXJ0aWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKSB7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlclByb3BlcnRpZXMgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRykgIT0gMDsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyUHJvcGVydGllc0VTZXQgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FU0VURkxBRykgIT0gMDsKLQkJaWYgKE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRURFRkFVTFQpIGVGbGFncyB8PSBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+TUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRzsKLQkJZUZsYWdzICY9IH5NRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfUFJPUEVSVElFUywgb2xkTWVyZ2VTdXBlclByb3BlcnRpZXMsIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRURFRkFVTFQsIG9sZE1lcmdlU3VwZXJQcm9wZXJ0aWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01lcmdlU3VwZXJNZXRob2RzKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIE1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVyZ2VTdXBlck1ldGhvZHMoYm9vbGVhbiBuZXdNZXJnZVN1cGVyTWV0aG9kcykgewotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJNZXRob2RzID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdNZXJnZVN1cGVyTWV0aG9kcykgZUZsYWdzIHw9IE1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5NRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHOwotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJNZXRob2RzRVNldCA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9NRVRIT0RTX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gTUVSR0VfU1VQRVJfTUVUSE9EU19FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9NRVRIT0RTLCBvbGRNZXJnZVN1cGVyTWV0aG9kcywgbmV3TWVyZ2VTdXBlck1ldGhvZHMsICFvbGRNZXJnZVN1cGVyTWV0aG9kc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1lcmdlU3VwZXJNZXRob2RzKCkgewotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJNZXRob2RzID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUcpICE9IDA7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlck1ldGhvZHNFU2V0ID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX01FVEhPRFNfRVNFVEZMQUcpICE9IDA7Ci0JCWlmIChNRVJHRV9TVVBFUl9NRVRIT0RTX0VERUZBVUxUKSBlRmxhZ3MgfD0gTUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfk1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUc7Ci0JCWVGbGFncyAmPSB+TUVSR0VfU1VQRVJfTUVUSE9EU19FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX01FVEhPRFMsIG9sZE1lcmdlU3VwZXJNZXRob2RzLCBNRVJHRV9TVVBFUl9NRVRIT0RTX0VERUZBVUxULCBvbGRNZXJnZVN1cGVyTWV0aG9kc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1lcmdlU3VwZXJNZXRob2RzKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIE1FUkdFX1NVUEVSX01FVEhPRFNfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZVN1cGVyRXZlbnRzKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIE1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXJnZVN1cGVyRXZlbnRzKGJvb2xlYW4gbmV3TWVyZ2VTdXBlckV2ZW50cykgewotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJFdmVudHMgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3TWVyZ2VTdXBlckV2ZW50cykgZUZsYWdzIHw9IE1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfk1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRzsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyRXZlbnRzRVNldCA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9FVkVOVFNfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBNRVJHRV9TVVBFUl9FVkVOVFNfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfRVZFTlRTLCBvbGRNZXJnZVN1cGVyRXZlbnRzLCBuZXdNZXJnZVN1cGVyRXZlbnRzLCAhb2xkTWVyZ2VTdXBlckV2ZW50c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1lcmdlU3VwZXJFdmVudHMoKSB7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlckV2ZW50cyA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUcpICE9IDA7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlckV2ZW50c0VTZXQgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfRVZFTlRTX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoTUVSR0VfU1VQRVJfRVZFTlRTX0VERUZBVUxUKSBlRmxhZ3MgfD0gTUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+TUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHOwotCQllRmxhZ3MgJj0gfk1FUkdFX1NVUEVSX0VWRU5UU19FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX0VWRU5UUywgb2xkTWVyZ2VTdXBlckV2ZW50cywgTUVSR0VfU1VQRVJfRVZFTlRTX0VERUZBVUxULCBvbGRNZXJnZVN1cGVyRXZlbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWVyZ2VTdXBlckV2ZW50cygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9FVkVOVFNfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRyb3NwZWN0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBJTlRST1NQRUNUX1BST1BFUlRJRVNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50cm9zcGVjdFByb3BlcnRpZXMoYm9vbGVhbiBuZXdJbnRyb3NwZWN0UHJvcGVydGllcykgewotCQlib29sZWFuIG9sZEludHJvc3BlY3RQcm9wZXJ0aWVzID0gKGVGbGFncyAmIElOVFJPU1BFQ1RfUFJPUEVSVElFU19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0ludHJvc3BlY3RQcm9wZXJ0aWVzKSBlRmxhZ3MgfD0gSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+SU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfUFJPUEVSVElFUywgb2xkSW50cm9zcGVjdFByb3BlcnRpZXMsIG5ld0ludHJvc3BlY3RQcm9wZXJ0aWVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRyb3NwZWN0TWV0aG9kcygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBJTlRST1NQRUNUX01FVEhPRFNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50cm9zcGVjdE1ldGhvZHMoYm9vbGVhbiBuZXdJbnRyb3NwZWN0TWV0aG9kcykgewotCQlib29sZWFuIG9sZEludHJvc3BlY3RNZXRob2RzID0gKGVGbGFncyAmIElOVFJPU1BFQ1RfTUVUSE9EU19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0ludHJvc3BlY3RNZXRob2RzKSBlRmxhZ3MgfD0gSU5UUk9TUEVDVF9NRVRIT0RTX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+SU5UUk9TUEVDVF9NRVRIT0RTX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfTUVUSE9EUywgb2xkSW50cm9zcGVjdE1ldGhvZHMsIG5ld0ludHJvc3BlY3RNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRyb3NwZWN0RXZlbnRzKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIElOVFJPU1BFQ1RfRVZFTlRTX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludHJvc3BlY3RFdmVudHMoYm9vbGVhbiBuZXdJbnRyb3NwZWN0RXZlbnRzKSB7Ci0JCWJvb2xlYW4gb2xkSW50cm9zcGVjdEV2ZW50cyA9IChlRmxhZ3MgJiBJTlRST1NQRUNUX0VWRU5UU19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0ludHJvc3BlY3RFdmVudHMpIGVGbGFncyB8PSBJTlRST1NQRUNUX0VWRU5UU19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfklOVFJPU1BFQ1RfRVZFTlRTX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfRVZFTlRTLCBvbGRJbnRyb3NwZWN0RXZlbnRzLCBuZXdJbnRyb3NwZWN0RXZlbnRzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9taXplckNsYXNzKEphdmFDbGFzcyBuZXdDdXN0b21pemVyQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZEN1c3RvbWl6ZXJDbGFzcyA9IGN1c3RvbWl6ZXJDbGFzczsKLQkJY3VzdG9taXplckNsYXNzID0gbmV3Q3VzdG9taXplckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NVU1RPTUlaRVJfQ0xBU1MsIG9sZEN1c3RvbWl6ZXJDbGFzcywgY3VzdG9taXplckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXRhaWxzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRU1PREVMX0VMRU1FTlRfX0VBTk5PVEFUSU9OUywgRU1vZGVsRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGdldERldGFpbHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzRXhwZXJ0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNIaWRkZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1ByZWZlcnJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiBpc01lcmdlSW50cm9zcGVjdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiBpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldEltcGxpY2l0bHlTZXRCaXRzKCkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBnZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gaXNNZXJnZVN1cGVyUHJvcGVydGllcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9NRVRIT0RTOgotCQkJCXJldHVybiBpc01lcmdlU3VwZXJNZXRob2RzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX0VWRU5UUzoKLQkJCQlyZXR1cm4gaXNNZXJnZVN1cGVyRXZlbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gaXNJbnRyb3NwZWN0UHJvcGVydGllcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGlzSW50cm9zcGVjdE1ldGhvZHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9FVkVOVFM6Ci0JCQkJcmV0dXJuIGlzSW50cm9zcGVjdEV2ZW50cygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ET19CRUFOSU5GTzoKLQkJCQlyZXR1cm4gaXNEb0JlYW5pbmZvKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfUFJPUEVSVFlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX01FVEhPRF9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX0VWRU5UX05BTUVTOgotCQkJCXJldHVybiBnZXROb3RJbmhlcml0ZWRFdmVudE5hbWVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ1VTVE9NSVpFUl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEN1c3RvbWl6ZXJDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldEN1c3RvbWl6ZXJDbGFzcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCWdldERldGFpbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlzZXRTaG9ydERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXNldEV4cGVydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXNldEhpZGRlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXNldFByZWZlcnJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZygoSW1wbGljaXRJdGVtKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfUFJPUEVSVElFUzoKLQkJCQlzZXRNZXJnZVN1cGVyUHJvcGVydGllcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfTUVUSE9EUzoKLQkJCQlzZXRNZXJnZVN1cGVyTWV0aG9kcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfRVZFTlRTOgotCQkJCXNldE1lcmdlU3VwZXJFdmVudHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfUFJPUEVSVElFUzoKLQkJCQlzZXRJbnRyb3NwZWN0UHJvcGVydGllcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9NRVRIT0RTOgotCQkJCXNldEludHJvc3BlY3RNZXRob2RzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX0VWRU5UUzoKLQkJCQlzZXRJbnRyb3NwZWN0RXZlbnRzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ET19CRUFOSU5GTzoKLQkJCQlzZXREb0JlYW5pbmZvKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX1BST1BFUlRZX05BTUVTOgotCQkJCWdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX01FVEhPRF9OQU1FUzoKLQkJCQlnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX0VWRU5UX05BTUVTOgotCQkJCWdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DVVNUT01JWkVSX0NMQVNTOgotCQkJCXNldEN1c3RvbWl6ZXJDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKFNPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXVuc2V0RGlzcGxheU5hbWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJdW5zZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXVuc2V0RXhwZXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQl1bnNldEhpZGRlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJdW5zZXRQcmVmZXJyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX1BST1BFUlRJRVM6Ci0JCQkJdW5zZXRNZXJnZVN1cGVyUHJvcGVydGllcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9NRVRIT0RTOgotCQkJCXVuc2V0TWVyZ2VTdXBlck1ldGhvZHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfRVZFTlRTOgotCQkJCXVuc2V0TWVyZ2VTdXBlckV2ZW50cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX1BST1BFUlRJRVM6Ci0JCQkJc2V0SW50cm9zcGVjdFByb3BlcnRpZXMoSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9NRVRIT0RTOgotCQkJCXNldEludHJvc3BlY3RNZXRob2RzKElOVFJPU1BFQ1RfTUVUSE9EU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfRVZFTlRTOgotCQkJCXNldEludHJvc3BlY3RFdmVudHMoSU5UUk9TUEVDVF9FVkVOVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ET19CRUFOSU5GTzoKLQkJCQlzZXREb0JlYW5pbmZvKERPX0JFQU5JTkZPX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9QUk9QRVJUWV9OQU1FUzoKLQkJCQlnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9NRVRIT0RfTkFNRVM6Ci0JCQkJZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX0VWRU5UX05BTUVTOgotCQkJCWdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DVVNUT01JWkVSX0NMQVNTOgotCQkJCXNldEN1c3RvbWl6ZXJDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCNlSXNTZXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNTb3VyY2VTZXQoKTsJLy8gT3ZlcnJpZGUgc28gdGhhdCBpZiBzZXQgdG8gdGhlIHNhbWUgYXMgY2xhc3NuYW1lLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgbm90IHNldC4KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGVJc1NldEdlbihlRmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXRHZW4oRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBkZXRhaWxzICE9IG51bGwgJiYgIWRldGFpbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBpc1NldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGlzU2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNTZXRFeHBlcnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzU2V0SGlkZGVuKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1NldFByZWZlcnJlZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMCkgIT0gTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gaW1wbGljaXRseVNldEJpdHMgIT0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gaW1wbGljaXREZWNvcmF0b3JGbGFnICE9IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gaXNTZXRNZXJnZVN1cGVyUHJvcGVydGllcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGlzU2V0TWVyZ2VTdXBlck1ldGhvZHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9FVkVOVFM6Ci0JCQkJcmV0dXJuIGlzU2V0TWVyZ2VTdXBlckV2ZW50cygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJTlRST1NQRUNUX1BST1BFUlRJRVNfRUZMQUcpICE9IDApICE9IElOVFJPU1BFQ1RfUFJPUEVSVElFU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5UUk9TUEVDVF9NRVRIT0RTX0VGTEFHKSAhPSAwKSAhPSBJTlRST1NQRUNUX01FVEhPRFNfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9FVkVOVFM6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5UUk9TUEVDVF9FVkVOVFNfRUZMQUcpICE9IDApICE9IElOVFJPU1BFQ1RfRVZFTlRTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RPX0JFQU5JTkZPOgotCQkJCXJldHVybiAoKGVGbGFncyAmIERPX0JFQU5JTkZPX0VGTEFHKSAhPSAwKSAhPSBET19CRUFOSU5GT19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX1BST1BFUlRZX05BTUVTOgotCQkJCXJldHVybiBub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzICE9IG51bGwgJiYgIW5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfTUVUSE9EX05BTUVTOgotCQkJCXJldHVybiBub3RJbmhlcml0ZWRNZXRob2ROYW1lcyAhPSBudWxsICYmICFub3RJbmhlcml0ZWRNZXRob2ROYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9FVkVOVF9OQU1FUzoKLQkJCQlyZXR1cm4gbm90SW5oZXJpdGVkRXZlbnROYW1lcyAhPSBudWxsICYmICFub3RJbmhlcml0ZWRFdmVudE5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DVVNUT01JWkVSX0NMQVNTOgotCQkJCXJldHVybiBjdXN0b21pemVyQ2xhc3MgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1lcmdlU3VwZXJQcm9wZXJ0aWVzOiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWVyZ2VTdXBlck1ldGhvZHM6ICIpOwotCQlpZiAoKGVGbGFncyAmIE1FUkdFX1NVUEVSX01FVEhPRFNfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIE1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXJnZVN1cGVyRXZlbnRzOiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9FVkVOVFNfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIE1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGludHJvc3BlY3RQcm9wZXJ0aWVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnRyb3NwZWN0TWV0aG9kczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIElOVFJPU1BFQ1RfTUVUSE9EU19FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW50cm9zcGVjdEV2ZW50czogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIElOVFJPU1BFQ1RfRVZFTlRTX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkb0JlYW5pbmZvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgRE9fQkVBTklORk9fRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdEluaGVyaXRlZE1ldGhvZE5hbWVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3RJbmhlcml0ZWRNZXRob2ROYW1lcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm90SW5oZXJpdGVkRXZlbnROYW1lczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm90SW5oZXJpdGVkRXZlbnROYW1lcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiBjdXN0b21pemVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEb0JlYW5pbmZvKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIERPX0JFQU5JTkZPX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvQmVhbmluZm8oYm9vbGVhbiBuZXdEb0JlYW5pbmZvKSB7Ci0JCWJvb2xlYW4gb2xkRG9CZWFuaW5mbyA9IChlRmxhZ3MgJiBET19CRUFOSU5GT19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0RvQmVhbmluZm8pIGVGbGFncyB8PSBET19CRUFOSU5GT19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkRPX0JFQU5JTkZPX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RPX0JFQU5JTkZPLCBvbGREb0JlYW5pbmZvLCBuZXdEb0JlYW5pbmZvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKSB7Ci0JCWlmIChub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzID09IG51bGwpIHsKLQkJCW5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfUFJPUEVSVFlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcygpIHsKLQkJaWYgKG5vdEluaGVyaXRlZE1ldGhvZE5hbWVzID09IG51bGwpIHsKLQkJCW5vdEluaGVyaXRlZE1ldGhvZE5hbWVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX01FVEhPRF9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIG5vdEluaGVyaXRlZE1ldGhvZE5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXROb3RJbmhlcml0ZWRFdmVudE5hbWVzKCkgewotCQlpZiAobm90SW5oZXJpdGVkRXZlbnROYW1lcyA9PSBudWxsKSB7Ci0JCQlub3RJbmhlcml0ZWRFdmVudE5hbWVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX0VWRU5UX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gbm90SW5oZXJpdGVkRXZlbnROYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJaWYgKGN1c3RvbWl6ZXJDbGFzcyAhPSBudWxsICYmIGN1c3RvbWl6ZXJDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkQ3VzdG9taXplckNsYXNzID0gY3VzdG9taXplckNsYXNzOwotCQkJY3VzdG9taXplckNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpY3VzdG9taXplckNsYXNzKTsKLQkJCWlmIChjdXN0b21pemVyQ2xhc3MgIT0gb2xkQ3VzdG9taXplckNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DVVNUT01JWkVSX0NMQVNTLCBvbGRDdXN0b21pemVyQ2xhc3MsIGN1c3RvbWl6ZXJDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjdXN0b21pemVyQ2xhc3M7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgaWNvblVSTDsKLQlwcml2YXRlIGJvb2xlYW4gaGFzUXVlcmllZEljb25VUkw7Ci0JCi0JcHVibGljIFVSTCBnZXRJY29uVVJMKCl7Ci0JCWlmICghaGFzUXVlcmllZEljb25VUkwpewotCQkJRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIHZhbHVlID0gKEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSkgZ2V0QXR0cmlidXRlcygpLmdldChJQmFzZUJlYW5JbmZvQ29uc3RhbnRzLklDT05DT0xPUjE2WDE2VVJMKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7IAotCQkJCS8vIEdldCB0aGUgdmFsdWUKLQkJCQlPYmplY3QgYXR0ciA9IHZhbHVlLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGF0dHIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWhhc1F1ZXJpZWRJY29uVVJMID0gdHJ1ZTsKLQkJCQkJCWljb25VUkwgPSBuZXcgVVJMKChTdHJpbmcpIGF0dHIpOwotCQkJCQl9IGNhdGNoICggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApIHsKLQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhleGMsIExldmVsLklORk8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBpY29uVVJMOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5FdmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5FdmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3NGM0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuRXZlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5FdmVudEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozOCAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRXZlbnRJbXBsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CZWFuIEV2ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi0KLXB1YmxpYyBjbGFzcyBCZWFuRXZlbnRJbXBsIGV4dGVuZHMgSmF2YUV2ZW50SW1wbCBpbXBsZW1lbnRzIEJlYW5FdmVudHsKLQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCZWFuRXZlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTLCBFQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX09SREVSRUQ6Ci0JCQkJcmV0dXJuIGlzT3JkZXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1VOSVFVRToKLQkJCQlyZXR1cm4gaXNVbmlxdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1VQUEVSX0JPVU5EOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRVcHBlckJvdW5kKCkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fTUFOWToKLQkJCQlyZXR1cm4gaXNNYW55KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RVR5cGUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0NIQU5HRUFCTEU6Ci0JCQkJcmV0dXJuIGlzQ2hhbmdlYWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1ZPTEFUSUxFOgotCQkJCXJldHVybiBpc1ZvbGF0aWxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVFJBTlNJRU5UOgotCQkJCXJldHVybiBpc1RyYW5zaWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0RFRkFVTFRfVkFMVUVfTElURVJBTDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VTlNFVFRBQkxFOgotCQkJCXJldHVybiBpc1Vuc2V0dGFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19ERVJJVkVEOgotCQkJCXJldHVybiBpc0Rlcml2ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX09SREVSRUQ6Ci0JCQkJc2V0T3JkZXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRVRZUEU6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19DSEFOR0VBQkxFOgotCQkJCXNldENoYW5nZWFibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVk9MQVRJTEU6Ci0JCQkJc2V0Vm9sYXRpbGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVFJBTlNJRU5UOgotCQkJCXNldFRyYW5zaWVudCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VTlNFVFRBQkxFOgotCQkJCXNldFVuc2V0dGFibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fREVSSVZFRDoKLQkJCQlzZXREZXJpdmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fT1JERVJFRDoKLQkJCQlzZXRPcmRlcmVkKE9SREVSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKExPV0VSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKFVQUEVSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FVFlQRToKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fQ0hBTkdFQUJMRToKLQkJCQlzZXRDaGFuZ2VhYmxlKENIQU5HRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1ZPTEFUSUxFOgotCQkJCXNldFZvbGF0aWxlKFZPTEFUSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19UUkFOU0lFTlQ6Ci0JCQkJc2V0VHJhbnNpZW50KFRSQU5TSUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VTlNFVFRBQkxFOgotCQkJCXNldFVuc2V0dGFibGUoVU5TRVRUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fREVSSVZFRDoKLQkJCQlzZXREZXJpdmVkKERFUklWRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX09SREVSRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgT1JERVJFRF9FRkxBRykgIT0gMCkgIT0gT1JERVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1VOSVFVRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0xPV0VSX0JPVU5EOgotCQkJCXJldHVybiBsb3dlckJvdW5kICE9IExPV0VSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSAhPSBNQU5ZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VUWVBFOgotCQkJCXJldHVybiBlVHlwZSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBDSEFOR0VBQkxFX0VGTEFHKSAhPSAwKSAhPSBDSEFOR0VBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVk9MQVRJTEU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDApICE9IFZPTEFUSUxFX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVFJBTlNJRU5UOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMCkgIT0gVFJBTlNJRU5UX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZUxpdGVyYWwgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRWYWx1ZUxpdGVyYWwpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0VERUZBVUxULmVxdWFscyhnZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VTlNFVFRBQkxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFVOU0VUVEFCTEVfRUZMQUcpICE9IDApICE9IFVOU0VUVEFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19ERVJJVkVEOgotCQkJCXJldHVybiAoKGVGbGFncyAmIERFUklWRURfRUZMQUcpICE9IDApICE9IERFUklWRURfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbmluZm9GYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbmluZm9GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTI3NGMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5pbmZvRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogQmVhbmluZm9GYWN0b3J5SW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8xMC8xMSAyMToyNjoyOCAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBCZWFuaW5mb0ZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQmVhbmluZm9GYWN0b3J5ewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8JCi0JcHVibGljIEJlYW5pbmZvRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SOiByZXR1cm4gY3JlYXRlRmVhdHVyZURlY29yYXRvcigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1I6IHJldHVybiBjcmVhdGVCZWFuRGVjb3JhdG9yKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SOiByZXR1cm4gY3JlYXRlRXZlbnRTZXREZWNvcmF0b3IoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1I6IHJldHVybiBjcmVhdGVNZXRob2REZWNvcmF0b3IoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1I6IHJldHVybiBjcmVhdGVQYXJhbWV0ZXJEZWNvcmF0b3IoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUjogcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUjogcmV0dXJuIGNyZWF0ZUluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZOiByZXR1cm4gY3JlYXRlTWV0aG9kUHJveHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlQ6IHJldHVybiBjcmVhdGVCZWFuRXZlbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklNUExJQ0lUX0lURU06IHsKLQkJCQlJbXBsaWNpdEl0ZW0gcmVzdWx0ID0gSW1wbGljaXRJdGVtLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9WQUxVRToKLQkJCQlyZXR1cm4gY3JlYXRlRmVhdHVyZUF0dHJpYnV0ZVZhbHVlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU1QTElDSVRfSVRFTToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX1ZBTFVFOgotCQkJCXJldHVybiBjb252ZXJ0RmVhdHVyZUF0dHJpYnV0ZVZhbHVlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEZlYXR1cmVEZWNvcmF0b3IgY3JlYXRlRmVhdHVyZURlY29yYXRvcigpIHsKLQkJRmVhdHVyZURlY29yYXRvckltcGwgZmVhdHVyZURlY29yYXRvciA9IG5ldyBGZWF0dXJlRGVjb3JhdG9ySW1wbCgpOwotCQlmZWF0dXJlRGVjb3JhdG9yLnNldFNvdXJjZShGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmZWF0dXJlRGVjb3JhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEV2ZW50U2V0RGVjb3JhdG9yIGNyZWF0ZUV2ZW50U2V0RGVjb3JhdG9yKCkgewotCQlFdmVudFNldERlY29yYXRvckltcGwgZXZlbnRTZXREZWNvcmF0b3IgPSBuZXcgRXZlbnRTZXREZWNvcmF0b3JJbXBsKCk7Ci0JCWV2ZW50U2V0RGVjb3JhdG9yLnNldFNvdXJjZShFdmVudFNldERlY29yYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gZXZlbnRTZXREZWNvcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFByb3h5IGNyZWF0ZU1ldGhvZFByb3h5KCkgewotCQlNZXRob2RQcm94eUltcGwgbWV0aG9kUHJveHkgPSBuZXcgTWV0aG9kUHJveHlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eURlY29yYXRvciBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcigpIHsKLQkJUHJvcGVydHlEZWNvcmF0b3JJbXBsIHByb3BlcnR5RGVjb3JhdG9yID0gbmV3IFByb3BlcnR5RGVjb3JhdG9ySW1wbCgpOwotCQlwcm9wZXJ0eURlY29yYXRvci5zZXRTb3VyY2UoUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHByb3BlcnR5RGVjb3JhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciBjcmVhdGVJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IoKSB7Ci0JCUluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwgaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yID0gbmV3IEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwoKTsKLQkJaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLnNldFNvdXJjZShJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBCZWFuRGVjb3JhdG9yIGNyZWF0ZUJlYW5EZWNvcmF0b3IoKSB7Ci0JCUJlYW5EZWNvcmF0b3JJbXBsIGJlYW5EZWNvcmF0b3IgPSBuZXcgQmVhbkRlY29yYXRvckltcGwoKTsKLQkJYmVhbkRlY29yYXRvci5zZXRTb3VyY2UoQmVhbkRlY29yYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gYmVhbkRlY29yYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBNZXRob2REZWNvcmF0b3IgY3JlYXRlTWV0aG9kRGVjb3JhdG9yKCkgewotCQlNZXRob2REZWNvcmF0b3JJbXBsIG1ldGhvZERlY29yYXRvciA9IG5ldyBNZXRob2REZWNvcmF0b3JJbXBsKCk7Ci0JCW1ldGhvZERlY29yYXRvci5zZXRTb3VyY2UoTWV0aG9kRGVjb3JhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiBtZXRob2REZWNvcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUGFyYW1ldGVyRGVjb3JhdG9yIGNyZWF0ZVBhcmFtZXRlckRlY29yYXRvcigpIHsKLQkJUGFyYW1ldGVyRGVjb3JhdG9ySW1wbCBwYXJhbWV0ZXJEZWNvcmF0b3IgPSBuZXcgUGFyYW1ldGVyRGVjb3JhdG9ySW1wbCgpOwotCQlwYXJhbWV0ZXJEZWNvcmF0b3Iuc2V0U291cmNlKFBhcmFtZXRlckRlY29yYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gcGFyYW1ldGVyRGVjb3JhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCZWFuaW5mb1BhY2thZ2UgZ2V0QmVhbmluZm9QYWNrYWdlKCkgewotCQlyZXR1cm4gKEJlYW5pbmZvUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCZWFuaW5mb1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJlYW5FdmVudCBjcmVhdGVCZWFuRXZlbnQoKSB7Ci0JCUJlYW5FdmVudEltcGwgYmVhbkV2ZW50ID0gbmV3IEJlYW5FdmVudEltcGwoKTsKLQkJcmV0dXJuIGJlYW5FdmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwLkVudHJ5IGNyZWF0ZUZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSgpIHsKLQkJRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCBmZWF0dXJlQXR0cmlidXRlTWFwRW50cnkgPSBuZXcgRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCgpOwotCQlyZXR1cm4gZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBjcmVhdGVGZWF0dXJlQXR0cmlidXRlVmFsdWVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBGZWF0dXJlQXR0cmlidXRlVmFsdWUoaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuaW5mb1BhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuaW5mb1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWJmMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbmluZm9QYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogQmVhbmluZm9QYWNrYWdlSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMDowOTo1MSAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGw7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEJlYW5pbmZvUGFja2FnZXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmZWF0dXJlRGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJlYW5EZWNvcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhcmFtZXRlckRlY29yYXRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0eURlY29yYXRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbmRleGVkUHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUHJveHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYmVhbkV2ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGltcGxpY2l0SXRlbUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGZlYXR1cmVBdHRyaWJ1dGVWYWx1ZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBCZWFuaW5mb1BhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmVhbmluZm9QYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChCZWFuaW5mb1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQmVhbmluZm9QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJQmVhbmluZm9QYWNrYWdlSW1wbCB0aGVCZWFuaW5mb1BhY2thZ2UgPSAoQmVhbmluZm9QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBCZWFuaW5mb1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgQmVhbmluZm9QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotCQlKYXZhUmVmUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUJlYW5pbmZvUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUJlYW5pbmZvUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVCZWFuaW5mb1BhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUJlYW5pbmZvUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZlYXR1cmVEZWNvcmF0b3IoKSB7Ci0JCXJldHVybiBmZWF0dXJlRGVjb3JhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfRGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9TaG9ydERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9FeHBlcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9IaWRkZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9QcmVmZXJyZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9NZXJnZUludHJvc3BlY3Rpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0ltcGxpY2l0bHlTZXRCaXRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfSW1wbGljaXREZWNvcmF0b3JGbGFnKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZlYXR1cmVEZWNvcmF0b3JfQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFdmVudFNldERlY29yYXRvcigpIHsKLQkJcmV0dXJuIGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0luRGVmYXVsdEV2ZW50U2V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFdmVudFNldERlY29yYXRvcl9VbmljYXN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9BZGRMaXN0ZW5lck1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJNZXRob2RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX1JlbW92ZUxpc3RlbmVyTWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9FdmVudEFkYXB0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXZlbnRTZXREZWNvcmF0b3JfU2VyTGlzdE10aGQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUHJveHkoKSB7Ci0JCXJldHVybiBtZXRob2RQcm94eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQcm94eV9NZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQcm94eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvcGVydHlEZWNvcmF0b3IoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eURlY29yYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9Cb3VuZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlEZWNvcmF0b3JfQ29uc3RyYWluZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0Rlc2lnblRpbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0Fsd2F5c0luY29tcGF0aWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmlsdGVyRmxhZ3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0ZpZWxkUmVhZE9ubHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb3BlcnR5RGVjb3JhdG9yX1Byb3BlcnR5RWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb3BlcnR5RGVjb3JhdG9yX1JlYWRNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb3BlcnR5RGVjb3JhdG9yX1dyaXRlTWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IoKSB7Ci0JCXJldHVybiBpbmRleGVkUHJvcGVydHlEZWNvcmF0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRSZWFkTWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRXcml0ZU1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QmVhbkRlY29yYXRvcigpIHsKLQkJcmV0dXJuIGJlYW5EZWNvcmF0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJNZXRob2RzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlckV2ZW50cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX0ludHJvc3BlY3RQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfSW50cm9zcGVjdE1ldGhvZHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0RXZlbnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJlYW5EZWNvcmF0b3JfQ3VzdG9taXplckNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZERlY29yYXRvcigpIHsKLQkJcmV0dXJuIG1ldGhvZERlY29yYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2REZWNvcmF0b3JfUGFybXNFeHBsaWNpdEVtcHR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRGVjb3JhdG9yX1BhcmFtZXRlckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRGVjb3JhdG9yX1NlclBhcm1EZXNjKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYW1ldGVyRGVjb3JhdG9yX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmVBdHRyaWJ1dGVWYWx1ZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9GYWN0b3J5IGdldEJlYW5pbmZvRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChCZWFuaW5mb0ZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJZmVhdHVyZURlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGRUFUVVJFX0RFQ09SQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19FWFBFUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19ISURERU4pOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19QUkVGRVJSRUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVMpOwotCi0JCWJlYW5EZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQkVBTl9ERUNPUkFUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9QUk9QRVJUSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfTUVUSE9EUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX0VWRU5UUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfUFJPUEVSVElFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfTUVUSE9EUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfRVZFTlRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fRE9fQkVBTklORk8pOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX1BST1BFUlRZX05BTUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9NRVRIT0RfTkFNRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX0VWRU5UX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fQ1VTVE9NSVpFUl9DTEFTUyk7Ci0KLQkJZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVZFTlRfU0VUX0RFQ09SQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEVWRU5UX1NFVF9ERUNPUkFUT1JfX0lOX0RFRkFVTFRfRVZFTlRfU0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShldmVudFNldERlY29yYXRvckVDbGFzcywgRVZFTlRfU0VUX0RFQ09SQVRPUl9fVU5JQ0FTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFVkVOVF9TRVRfREVDT1JBVE9SX19BRERfTElTVEVORVJfTUVUSE9EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShldmVudFNldERlY29yYXRvckVDbGFzcywgRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFVkVOVF9TRVRfREVDT1JBVE9SX19SRU1PVkVfTElTVEVORVJfTUVUSE9EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShldmVudFNldERlY29yYXRvckVDbGFzcywgRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVZFTlRfQURBUFRFUl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEVWRU5UX1NFVF9ERUNPUkFUT1JfX1NFUl9MSVNUX01USEQpOwotCi0JCW1ldGhvZERlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfREVDT1JBVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2REZWNvcmF0b3JFQ2xhc3MsIE1FVEhPRF9ERUNPUkFUT1JfX1BBUk1TX0VYUExJQ0lUX0VNUFRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2REZWNvcmF0b3JFQ2xhc3MsIE1FVEhPRF9ERUNPUkFUT1JfX1BBUkFNRVRFUl9ERVNDUklQVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRGVjb3JhdG9yRUNsYXNzLCBNRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDKTsKLQotCQlwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFSQU1FVEVSX0RFQ09SQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGFyYW1ldGVyRGVjb3JhdG9yRUNsYXNzLCBQQVJBTUVURVJfREVDT1JBVE9SX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MsIFBBUkFNRVRFUl9ERUNPUkFUT1JfX1BBUkFNRVRFUik7Ci0KLQkJcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPUEVSVFlfREVDT1JBVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRCk7Ci0KLQkJaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbmRleGVkUHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbmRleGVkUHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRCk7Ci0KLQkJbWV0aG9kUHJveHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1BST1hZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQcm94eUVDbGFzcywgTUVUSE9EX1BST1hZX19NRVRIT0QpOwotCi0JCWJlYW5FdmVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCRUFOX0VWRU5UKTsKLQotCQlmZWF0dXJlQXR0cmlidXRlTWFwRW50cnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlQXR0cmlidXRlTWFwRW50cnlFQ2xhc3MsIEZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fS0VZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlQXR0cmlidXRlTWFwRW50cnlFQ2xhc3MsIEZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fVkFMVUUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlpbXBsaWNpdEl0ZW1FRW51bSA9IGNyZWF0ZUVFbnVtKElNUExJQ0lUX0lURU0pOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWZlYXR1cmVBdHRyaWJ1dGVWYWx1ZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShGRUFUVVJFX0FUVFJJQlVURV9WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUVjb3JlUGFja2FnZUltcGwgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZUltcGwgdGhlSmF2YVJlZlBhY2thZ2UgPSAoSmF2YVJlZlBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUFubm90YXRpb24oKSk7Ci0JCWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlRGVjb3JhdG9yKCkpOwotCQlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZlYXR1cmVEZWNvcmF0b3IoKSk7Ci0JCW1ldGhvZERlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZlYXR1cmVEZWNvcmF0b3IoKSk7Ci0JCXBhcmFtZXRlckRlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZlYXR1cmVEZWNvcmF0b3IoKSk7Ci0JCXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmVhdHVyZURlY29yYXRvcigpKTsKLQkJaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoKSk7Ci0JCW1ldGhvZFByb3h5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFT3BlcmF0aW9uKCkpOwotCQliZWFuRXZlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUV2ZW50KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIkZlYXR1cmVEZWNvcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfRGlzcGxheU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRpc3BsYXlOYW1lIiwgbnVsbCwgMCwgMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX1Nob3J0RGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNob3J0RGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfQ2F0ZWdvcnkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNhdGVnb3J5IiwgbnVsbCwgMCwgMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZURlY29yYXRvcl9FeHBlcnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJleHBlcnQiLCBudWxsLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfSGlkZGVuKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaGlkZGVuIiwgbnVsbCwgMCwgMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX1ByZWZlcnJlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByZWZlcnJlZCIsIG51bGwsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZURlY29yYXRvcl9NZXJnZUludHJvc3BlY3Rpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJtZXJnZUludHJvc3BlY3Rpb24iLCAidHJ1ZSIsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSIsIG51bGwsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfSW1wbGljaXRseVNldEJpdHMoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJpbXBsaWNpdGx5U2V0Qml0cyIsIG51bGwsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfSW1wbGljaXREZWNvcmF0b3JGbGFnKCksIHRoaXMuZ2V0SW1wbGljaXRJdGVtKCksICJpbXBsaWNpdERlY29yYXRvckZsYWciLCBudWxsLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGZWF0dXJlRGVjb3JhdG9yX0F0dHJpYnV0ZXMoKSwgdGhpcy5nZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKSwgbnVsbCwgImF0dHJpYnV0ZXMiLCBudWxsLCAwLCAtMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlhZGRFT3BlcmF0aW9uKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXROYW1lIik7Ci0KLQkJaW5pdEVDbGFzcyhiZWFuRGVjb3JhdG9yRUNsYXNzLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAiQmVhbkRlY29yYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyUHJvcGVydGllcygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIm1lcmdlU3VwZXJQcm9wZXJ0aWVzIiwgInRydWUiLCAwLCAxLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlck1ldGhvZHMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJtZXJnZVN1cGVyTWV0aG9kcyIsICJ0cnVlIiwgMCwgMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJFdmVudHMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJtZXJnZVN1cGVyRXZlbnRzIiwgInRydWUiLCAwLCAxLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfSW50cm9zcGVjdFByb3BlcnRpZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpbnRyb3NwZWN0UHJvcGVydGllcyIsICJ0cnVlIiwgMCwgMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0TWV0aG9kcygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImludHJvc3BlY3RNZXRob2RzIiwgInRydWUiLCAwLCAxLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX0ludHJvc3BlY3RFdmVudHMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpbnRyb3NwZWN0RXZlbnRzIiwgInRydWUiLCAwLCAxLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX0RvQmVhbmluZm8oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkb0JlYW5pbmZvIiwgInRydWUiLCAwLCAxLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMiLCBudWxsLCAwLCAtMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRNZXRob2ROYW1lcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibm90SW5oZXJpdGVkTWV0aG9kTmFtZXMiLCBudWxsLCAwLCAtMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRFdmVudE5hbWVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJub3RJbmhlcml0ZWRFdmVudE5hbWVzIiwgbnVsbCwgMCwgLTEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEJlYW5EZWNvcmF0b3JfQ3VzdG9taXplckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiY3VzdG9taXplckNsYXNzIiwgbnVsbCwgMCwgMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgIkV2ZW50U2V0RGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFdmVudFNldERlY29yYXRvcl9JbkRlZmF1bHRFdmVudFNldCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImluRGVmYXVsdEV2ZW50U2V0IiwgbnVsbCwgMCwgMSwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXZlbnRTZXREZWNvcmF0b3JfVW5pY2FzdCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuaWNhc3QiLCBudWxsLCAwLCAxLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSIsIG51bGwsIDAsIDEsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFdmVudFNldERlY29yYXRvcl9BZGRMaXN0ZW5lck1ldGhvZCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRNZXRob2QoKSwgbnVsbCwgImFkZExpc3RlbmVyTWV0aG9kIiwgbnVsbCwgMSwgMSwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyTWV0aG9kcygpLCB0aGlzLmdldE1ldGhvZFByb3h5KCksIG51bGwsICJsaXN0ZW5lck1ldGhvZHMiLCBudWxsLCAxLCAtMSwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyVHlwZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImxpc3RlbmVyVHlwZSIsIG51bGwsIDEsIDEsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFdmVudFNldERlY29yYXRvcl9SZW1vdmVMaXN0ZW5lck1ldGhvZCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRNZXRob2QoKSwgbnVsbCwgInJlbW92ZUxpc3RlbmVyTWV0aG9kIiwgbnVsbCwgMSwgMSwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV2ZW50U2V0RGVjb3JhdG9yX0V2ZW50QWRhcHRlckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZXZlbnRBZGFwdGVyQ2xhc3MiLCBudWxsLCAwLCAxLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXZlbnRTZXREZWNvcmF0b3JfU2VyTGlzdE10aGQoKSwgdGhpcy5nZXRNZXRob2RQcm94eSgpLCBudWxsLCAic2VyTGlzdE10aGQiLCBudWxsLCAxLCAtMSwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2REZWNvcmF0b3JFQ2xhc3MsIE1ldGhvZERlY29yYXRvci5jbGFzcywgIk1ldGhvZERlY29yYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRGVjb3JhdG9yX1Bhcm1zRXhwbGljaXRFbXB0eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInBhcm1zRXhwbGljaXRFbXB0eSIsIG51bGwsIDAsIDEsIE1ldGhvZERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kRGVjb3JhdG9yX1BhcmFtZXRlckRlc2NyaXB0b3JzKCksIHRoaXMuZ2V0UGFyYW1ldGVyRGVjb3JhdG9yKCksIG51bGwsICJwYXJhbWV0ZXJEZXNjcmlwdG9ycyIsIG51bGwsIDAsIC0xLCBNZXRob2REZWNvcmF0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZERlY29yYXRvcl9TZXJQYXJtRGVzYygpLCB0aGlzLmdldFBhcmFtZXRlckRlY29yYXRvcigpLCBudWxsLCAic2VyUGFybURlc2MiLCBudWxsLCAwLCAtMSwgTWV0aG9kRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocGFyYW1ldGVyRGVjb3JhdG9yRUNsYXNzLCBQYXJhbWV0ZXJEZWNvcmF0b3IuY2xhc3MsICJQYXJhbWV0ZXJEZWNvcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhcmFtZXRlckRlY29yYXRvcl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUGFyYW1ldGVyRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQYXJhbWV0ZXJEZWNvcmF0b3JfUGFyYW1ldGVyKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFQYXJhbWV0ZXIoKSwgbnVsbCwgInBhcmFtZXRlciIsIG51bGwsIDAsIDEsIFBhcmFtZXRlckRlY29yYXRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAiUHJvcGVydHlEZWNvcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5RGVjb3JhdG9yX0JvdW5kKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYm91bmQiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eURlY29yYXRvcl9Db25zdHJhaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImNvbnN0cmFpbmVkIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlEZWNvcmF0b3JfRGVzaWduVGltZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRlc2lnblRpbWUiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eURlY29yYXRvcl9BbHdheXNJbmNvbXBhdGlibGUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhbHdheXNJbmNvbXBhdGlibGUiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmlsdGVyRmxhZ3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZpbHRlckZsYWdzIiwgbnVsbCwgMCwgLTEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZFJlYWRPbmx5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmllbGRSZWFkT25seSIsIG51bGwsIDAsIDEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9wZXJ0eURlY29yYXRvcl9Qcm9wZXJ0eUVkaXRvckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAicHJvcGVydHlFZGl0b3JDbGFzcyIsIG51bGwsIDAsIDEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9wZXJ0eURlY29yYXRvcl9SZWFkTWV0aG9kKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldE1ldGhvZCgpLCBudWxsLCAicmVhZE1ldGhvZCIsIG51bGwsIDAsIDEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb3BlcnR5RGVjb3JhdG9yX1dyaXRlTWV0aG9kKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldE1ldGhvZCgpLCBudWxsLCAid3JpdGVNZXRob2QiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsIElTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRGaWVsZCgpLCBudWxsLCAiZmllbGQiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsIElTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWFkZEVPcGVyYXRpb24ocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3NpZmllcigpLCAiZ2V0UHJvcGVydHlUeXBlIik7Ci0KLQkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24ocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIG51bGwsICJzZXRQcm9wZXJ0eVR5cGUiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhlRWNvcmVQYWNrYWdlLmdldEVDbGFzc2lmaWVyKCksICJwcm9wZXJ0eVR5cGUiKTsKLQotCQlpbml0RUNsYXNzKGluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckVDbGFzcywgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAiSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JfSW5kZXhlZFJlYWRNZXRob2QoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0TWV0aG9kKCksIG51bGwsICJpbmRleGVkUmVhZE1ldGhvZCIsIG51bGwsIDAsIDEsIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsIElTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JfSW5kZXhlZFdyaXRlTWV0aG9kKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldE1ldGhvZCgpLCBudWxsLCAiaW5kZXhlZFdyaXRlTWV0aG9kIiwgbnVsbCwgMCwgMSwgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQcm94eUVDbGFzcywgTWV0aG9kUHJveHkuY2xhc3MsICJNZXRob2RQcm94eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUHJveHlfTWV0aG9kKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldE1ldGhvZCgpLCBudWxsLCAibWV0aG9kIiwgbnVsbCwgMSwgMSwgTWV0aG9kUHJveHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhiZWFuRXZlbnRFQ2xhc3MsIEJlYW5FdmVudC5jbGFzcywgIkJlYW5FdmVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUVDbGFzcywgTWFwLkVudHJ5LmNsYXNzLCAiRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5X0tleSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAia2V5IiwgbnVsbCwgMCwgMSwgTWFwLkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlfVmFsdWUoKSwgdGhpcy5nZXRGZWF0dXJlQXR0cmlidXRlVmFsdWUoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgTWFwLkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShpbXBsaWNpdEl0ZW1FRW51bSwgSW1wbGljaXRJdGVtLmNsYXNzLCAiSW1wbGljaXRJdGVtIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChpbXBsaWNpdEl0ZW1FRW51bSwgSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGltcGxpY2l0SXRlbUVFbnVtLCBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaW1wbGljaXRJdGVtRUVudW0sIEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoZmVhdHVyZUF0dHJpYnV0ZVZhbHVlRURhdGFUeXBlLCBGZWF0dXJlQXR0cmlidXRlVmFsdWUuY2xhc3MsICJGZWF0dXJlQXR0cmlidXRlVmFsdWUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX0RvQmVhbmluZm8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRFdmVudE5hbWVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcmFtZXRlckRlY29yYXRvcl9QYXJhbWV0ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJlYW5FdmVudCgpIHsKLQkJcmV0dXJuIGJlYW5FdmVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSgpIHsKLQkJcmV0dXJuIGZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlfS2V5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEltcGxpY2l0SXRlbSgpIHsKLQkJcmV0dXJuIGltcGxpY2l0SXRlbUVFbnVtOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvRXZlbnRTZXREZWNvcmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9FdmVudFNldERlY29yYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmMzQyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9FdmVudFNldERlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogRXZlbnRTZXREZWNvcmF0b3JJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE1ICQgICREYXRlOiAyMDA1LzA5LzE5IDE1OjQzOjAyICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FdmVudCBTZXQgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwjaXNJbkRlZmF1bHRFdmVudFNldCA8ZW0+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkV2ZW50U2V0RGVjb3JhdG9ySW1wbCNpc1VuaWNhc3QgPGVtPlVuaWNhc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkV2ZW50U2V0RGVjb3JhdG9ySW1wbCNpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkgPGVtPkxpc3RlbmVyIE1ldGhvZHMgRXhwbGljaXQgRW1wdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkV2ZW50U2V0RGVjb3JhdG9ySW1wbCNnZXRBZGRMaXN0ZW5lck1ldGhvZCA8ZW0+QWRkIExpc3RlbmVyIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsI2dldExpc3RlbmVyTWV0aG9kcyA8ZW0+TGlzdGVuZXIgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsI2dldExpc3RlbmVyVHlwZSA8ZW0+TGlzdGVuZXIgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsI2dldFJlbW92ZUxpc3RlbmVyTWV0aG9kIDxlbT5SZW1vdmUgTGlzdGVuZXIgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwjZ2V0RXZlbnRBZGFwdGVyQ2xhc3MgPGVtPkV2ZW50IEFkYXB0ZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkV2ZW50U2V0RGVjb3JhdG9ySW1wbCNnZXRTZXJMaXN0TXRoZCA8ZW0+U2VyIExpc3QgTXRoZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBFdmVudFNldERlY29yYXRvckltcGwgZXh0ZW5kcyBGZWF0dXJlRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzIEV2ZW50U2V0RGVjb3JhdG9yewotCQotCS8qKgotCSAqIEJpdHMgZm9yIGltcGxpY2l0bHkgc2V0IGZlYXR1cmVzLiBUaGlzIGlzIGludGVybmFsLCBub3QgbWVhbnQgZm9yIGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVWRU5UX0FERExJU1RFTkVSTUVUSE9EX0lNUExJQ0lUID0gMHgxTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVZFTlRfQURBUFRFUkNMQVNTX0lNUExJQ0lUID0gMHgyTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVZFTlRfTElTVEVORVJNRVRIT0RTX0lNUExJQ0lUID0gMHg0TDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVZFTlRfTElTVEVORVJUWVBFX0lNUExJQ0lUID0gMHg4TDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVZFTlRfUkVNT1ZFTElTVEVORVJNRVRIT0RfSU1QTElDSVQgPSAweDEwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVZFTlRfREVGQVVMVEVWRU5UU0VUX0lNUExJQ0lUID0gMHgyMEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVWRU5UX1VOSUNBU1RfSU1QTElDSVQgPSAweDQwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVZFTlRfTElTVEVORVJNRVRIT0RTX0RFRkFVTFQgPSAweDgwTDsKLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW5EZWZhdWx0RXZlbnRTZXQoKSA8ZW0+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW5EZWZhdWx0RXZlbnRTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbkRlZmF1bHRFdmVudFNldCgpIDxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5fREVGQVVMVF9FVkVOVF9TRVRfRUZMQUcgPSAxIDw8IDE4OwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIEluIERlZmF1bHQgRXZlbnQgU2V0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FU0VURkxBRyA9IDEgPDwgMTk7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmljYXN0KCkgPGVtPlVuaWNhc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVW5pY2FzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVOSUNBU1RfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5pY2FzdCgpIDxlbT5VbmljYXN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VuaWNhc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVOSUNBU1RfRUZMQUcgPSAxIDw8IDIwOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIFVuaWNhc3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVOSUNBU1RfRVNFVEZMQUcgPSAxIDw8IDIxOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpIDxlbT5MaXN0ZW5lciBNZXRob2RzIEV4cGxpY2l0IEVtcHR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKSA8ZW0+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBMSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VGTEFHID0gMSA8PCAyMjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZExpc3RlbmVyTWV0aG9kKCkgPGVtPkFkZCBMaXN0ZW5lciBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZExpc3RlbmVyTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGFkZExpc3RlbmVyTWV0aG9kID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaXN0ZW5lclR5cGUoKSA8ZW0+TGlzdGVuZXIgVHlwZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlzdGVuZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGxpc3RlbmVyVHlwZSA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKSA8ZW0+UmVtb3ZlIExpc3RlbmVyIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2QgcmVtb3ZlTGlzdGVuZXJNZXRob2QgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV2ZW50QWRhcHRlckNsYXNzKCkgPGVtPkV2ZW50IEFkYXB0ZXIgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV2ZW50QWRhcHRlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGV2ZW50QWRhcHRlckNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlckxpc3RNdGhkKCkgPGVtPlNlciBMaXN0IE10aGQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VyTGlzdE10aGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJMaXN0TXRoZCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8JCi0JcHJvdGVjdGVkIEV2ZW50U2V0RGVjb3JhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luRGVmYXVsdEV2ZW50U2V0KCkgewotCQlyZXR1cm4gKGVGbGFncyAmIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluRGVmYXVsdEV2ZW50U2V0KGJvb2xlYW4gbmV3SW5EZWZhdWx0RXZlbnRTZXQpIHsKLQkJYm9vbGVhbiBvbGRJbkRlZmF1bHRFdmVudFNldCA9IChlRmxhZ3MgJiBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0luRGVmYXVsdEV2ZW50U2V0KSBlRmxhZ3MgfD0gSU5fREVGQVVMVF9FVkVOVF9TRVRfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5JTl9ERUZBVUxUX0VWRU5UX1NFVF9FRkxBRzsKLQkJYm9vbGVhbiBvbGRJbkRlZmF1bHRFdmVudFNldEVTZXQgPSAoZUZsYWdzICYgSU5fREVGQVVMVF9FVkVOVF9TRVRfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lOX0RFRkFVTFRfRVZFTlRfU0VULCBvbGRJbkRlZmF1bHRFdmVudFNldCwgbmV3SW5EZWZhdWx0RXZlbnRTZXQsICFvbGRJbkRlZmF1bHRFdmVudFNldEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEluRGVmYXVsdEV2ZW50U2V0KCkgewotCQlib29sZWFuIG9sZEluRGVmYXVsdEV2ZW50U2V0ID0gKGVGbGFncyAmIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZEluRGVmYXVsdEV2ZW50U2V0RVNldCA9IChlRmxhZ3MgJiBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FU0VURkxBRykgIT0gMDsKLQkJaWYgKElOX0RFRkFVTFRfRVZFTlRfU0VUX0VERUZBVUxUKSBlRmxhZ3MgfD0gSU5fREVGQVVMVF9FVkVOVF9TRVRfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5JTl9ERUZBVUxUX0VWRU5UX1NFVF9FRkxBRzsKLQkJZUZsYWdzICY9IH5JTl9ERUZBVUxUX0VWRU5UX1NFVF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU5fREVGQVVMVF9FVkVOVF9TRVQsIG9sZEluRGVmYXVsdEV2ZW50U2V0LCBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FREVGQVVMVCwgb2xkSW5EZWZhdWx0RXZlbnRTZXRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJbkRlZmF1bHRFdmVudFNldCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VuaWNhc3QoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgVU5JQ0FTVF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmljYXN0KGJvb2xlYW4gbmV3VW5pY2FzdCkgewotCQlib29sZWFuIG9sZFVuaWNhc3QgPSAoZUZsYWdzICYgVU5JQ0FTVF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1VuaWNhc3QpIGVGbGFncyB8PSBVTklDQVNUX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+VU5JQ0FTVF9FRkxBRzsKLQkJYm9vbGVhbiBvbGRVbmljYXN0RVNldCA9IChlRmxhZ3MgJiBVTklDQVNUX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gVU5JQ0FTVF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1VOSUNBU1QsIG9sZFVuaWNhc3QsIG5ld1VuaWNhc3QsICFvbGRVbmljYXN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VW5pY2FzdCgpIHsKLQkJYm9vbGVhbiBvbGRVbmljYXN0ID0gKGVGbGFncyAmIFVOSUNBU1RfRUZMQUcpICE9IDA7Ci0JCWJvb2xlYW4gb2xkVW5pY2FzdEVTZXQgPSAoZUZsYWdzICYgVU5JQ0FTVF9FU0VURkxBRykgIT0gMDsKLQkJaWYgKFVOSUNBU1RfRURFRkFVTFQpIGVGbGFncyB8PSBVTklDQVNUX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+VU5JQ0FTVF9FRkxBRzsKLQkJZUZsYWdzICY9IH5VTklDQVNUX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19VTklDQVNULCBvbGRVbmljYXN0LCBVTklDQVNUX0VERUZBVUxULCBvbGRVbmljYXN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VW5pY2FzdCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBVTklDQVNUX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBMSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoYm9vbGVhbiBuZXdMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KSB7Ci0JCWJvb2xlYW4gb2xkTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSA9IChlRmxhZ3MgJiBMSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3TGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSkgZUZsYWdzIHw9IExJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5MSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWSwgb2xkTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSwgbmV3TGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0QWRkTGlzdGVuZXJNZXRob2QoKSB7Ci0JCWlmIChhZGRMaXN0ZW5lck1ldGhvZCAhPSBudWxsICYmIGFkZExpc3RlbmVyTWV0aG9kLmVJc1Byb3h5KCkpIHsKLQkJCU1ldGhvZCBvbGRBZGRMaXN0ZW5lck1ldGhvZCA9IGFkZExpc3RlbmVyTWV0aG9kOwotCQkJYWRkTGlzdGVuZXJNZXRob2QgPSAoTWV0aG9kKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClhZGRMaXN0ZW5lck1ldGhvZCk7Ci0JCQlpZiAoYWRkTGlzdGVuZXJNZXRob2QgIT0gb2xkQWRkTGlzdGVuZXJNZXRob2QpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQUREX0xJU1RFTkVSX01FVEhPRCwgb2xkQWRkTGlzdGVuZXJNZXRob2QsIGFkZExpc3RlbmVyTWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkZExpc3RlbmVyTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgYmFzaWNHZXRBZGRMaXN0ZW5lck1ldGhvZCgpIHsKLQkJcmV0dXJuIGFkZExpc3RlbmVyTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZExpc3RlbmVyTWV0aG9kKE1ldGhvZCBuZXdBZGRMaXN0ZW5lck1ldGhvZCkgewotCQlNZXRob2Qgb2xkQWRkTGlzdGVuZXJNZXRob2QgPSBhZGRMaXN0ZW5lck1ldGhvZDsKLQkJYWRkTGlzdGVuZXJNZXRob2QgPSBuZXdBZGRMaXN0ZW5lck1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FERF9MSVNURU5FUl9NRVRIT0QsIG9sZEFkZExpc3RlbmVyTWV0aG9kLCBhZGRMaXN0ZW5lck1ldGhvZCkpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRMaXN0ZW5lck1ldGhvZHMoKSB7Ci0JCWlmICghaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkgJiYgZ2V0U2VyTGlzdE10aGQoKS5pc0VtcHR5KCkgJiYgKGdldEltcGxpY2l0bHlTZXRCaXRzKCkmKEVWRU5UX0xJU1RFTkVSTUVUSE9EU19JTVBMSUNJVCB8IEVWRU5UX0xJU1RFTkVSTUVUSE9EU19ERUZBVUxUKSkgPT0gMCkgewotCQkJLy8gTm90IGV4cGxpY2l0bHkgZW1wdHksIGl0IGlzIGVtcHR5LCBhbmQgd2UgaGF2ZSBub3QgaW1wbGljaXRseSBvciBieSBkZWZhdWx0cyBtYWRlIGl0IGVtcHR5LCB0aGVuIGNyZWF0ZSB0aGUgZGVmYXVsdHMuCi0JCQljcmVhdGVEZWZhdWx0TGlzdGVuZXJNZXRob2RzTGlzdCgpOwotCQl9Ci0JCXJldHVybiBnZXRTZXJMaXN0TXRoZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRMaXN0ZW5lck1ldGhvZHNHZW4oKSB7Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdMaXN0ZW5lciBNZXRob2RzJyByZWZlcmVuY2UgbGlzdAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldExpc3RlbmVyVHlwZSgpIHsKLQkJaWYgKGxpc3RlbmVyVHlwZSAhPSBudWxsICYmIGxpc3RlbmVyVHlwZS5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkTGlzdGVuZXJUeXBlID0gbGlzdGVuZXJUeXBlOwotCQkJbGlzdGVuZXJUeXBlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpbGlzdGVuZXJUeXBlKTsKLQkJCWlmIChsaXN0ZW5lclR5cGUgIT0gb2xkTGlzdGVuZXJUeXBlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX1RZUEUsIG9sZExpc3RlbmVyVHlwZSwgbGlzdGVuZXJUeXBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBpZiBtZXRob2QgbGlzdGVuZXJzIGxpc3Qgbm90IGV4cGxpY2l0bHkgc2V0IGFuZCB0aGVyZSBpcyBubyBmZWF0dXJlIHByb3h5IG9yCi0JICogdGhlcmUgaXMgYSBmZWF0dXJlIHByb3h5IGFuZCB0aGUgcHJveHkgaGFzIG5vdGhpbmcgZGVmaW5lZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIGJ5IEJlYW5JbmZvIGNsYXNzZXMuIEl0IGlzIG5vdCB0byBiZSB1c2VkIGJ5IGNsaWVudHMuCi0JICovCi0JcHVibGljIEVMaXN0IGNyZWF0ZURlZmF1bHRMaXN0ZW5lck1ldGhvZHNMaXN0KCkgewotCQlpZiAoIWVJc1NldChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVBbm5vdGF0aW9uX0VNb2RlbEVsZW1lbnQoKSkpCi0JCQlyZXR1cm4gdGhpcy5nZXRTZXJMaXN0TXRoZCgpOwkvLyBXZSBhcmUgbm90IGF0dGFjaGVkLCBjYW4ndCBkZXRlcm1pbmUgdGhlIGxpc3QgeWV0LgotCQlFTGlzdCBtdGhkc0xpc3QgPSB0aGlzLmdldFNlckxpc3RNdGhkKCk7CQkKLQkJCQotCQlKYXZhQ2xhc3MgZXZlbnRPYmplY3RDbGFzcyA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiamF2YS51dGlsLkV2ZW50T2JqZWN0IiwgZ2V0RU1vZGVsRWxlbWVudCgpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOyAvLyROT04tTkxTLTEkCi0JCQotCQltdGhkc0xpc3QuY2xlYXIoKTsKLQkJCi0JCS8vIFRoaXMgaXMgYSBsaXR0bGUgdHJpY2t5LiBOZWVkIHRvIGdldCB0aGUgbWV0aG9kcyBmb3IgdGhlIGxpc3RlbmVyIHR5cGUsIGFuZAotCQkvLyB0aGVuIGdvIHRocm91Z2ggdGhlIG1ldGhvZHMgYW5kIGZpbHRlciBvdXQgdGhlIG5vbi1ldmVudCBvbmVzLgotCQlKYXZhQ2xhc3MgbHQgPSBnZXRMaXN0ZW5lclR5cGUoKTsKLQkJaWYgKGx0ID09IG51bGwpCi0JCQlyZXR1cm4gbXRoZHNMaXN0OwkvLyBDb3VsZG4ndCBnZXQgdGhlIGxpc3RlbmVyIHR5cGUgZm9yIHNvbWUgcmVhc29uLCBzbyBsZWF2ZSBhcyBpcy4KLQkJc2V0SW1wbGljaXRseVNldEJpdHMoZ2V0SW1wbGljaXRseVNldEJpdHMoKXxFVkVOVF9MSVNURU5FUk1FVEhPRFNfREVGQVVMVCk7CS8vIE1hcmsgYXMgd2UgaW1wbGljaXRseSBmaWxsZWQgaXQgaW4uCi0JCQotCQlCZWFuaW5mb0ZhY3RvcnkgYmZhY3QgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFOwotCQlMaXN0IG1zID0gbHQuZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkKCk7Ci0JCWludCBtc2l6ZSA9IG1zLnNpemUoKTsKLQkJZm9yIChpbnQgaT0wOyBpPG1zaXplOyBpKyspIHsKLQkJCU1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBtcy5nZXQoaSk7Ci0JCQlMaXN0IHBhcm1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJCWlmIChwYXJtcy5zaXplKCkgIT0gMSkKLQkJCQljb250aW51ZTsJLy8gTXVzdCBoYXZlIG9ubHkgb25lIHBhcm0uCi0JCQlpZiAoIWV2ZW50T2JqZWN0Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbSgoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKSkpCi0JCQkJY29udGludWU7CS8vIFBhcm0gZG9lcyBub3QgaW5oZXJpdCBmcm9tIGphdmEudXRpbC5FdmVudE9iamVjdAotCQkJCQotCQkJLy8gV2UgbmVlZCBhIG1ldGhvZCBwcm94eSwgYW5kIGEgbWV0aG9kIGRlY29yYXRvci4KLQkJCU1ldGhvZFByb3h5IG1wcm94eSA9IGJmYWN0LmNyZWF0ZU1ldGhvZFByb3h5KCk7Ci0JCQltcHJveHkuc2V0TWV0aG9kKG1ldGhvZCk7Ci0JCQltcHJveHkuc2V0TmFtZShtZXRob2QuZ2V0TmFtZSgpKTsJCQkKLQkJCU1ldGhvZERlY29yYXRvciBtZCA9IGJmYWN0LmNyZWF0ZU1ldGhvZERlY29yYXRvcigpOwotCQkJbWQuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCk7Ci0JCQltZC5zZXRFTW9kZWxFbGVtZW50KG1wcm94eSk7CQkJCi0JCQltdGhkc0xpc3QuYWRkKG1wcm94eSk7Ci0JCX0KLQkJcmV0dXJuIG10aGRzTGlzdDsKLQl9CQotCQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldExpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIGxpc3RlbmVyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lclR5cGUoSmF2YUNsYXNzIG5ld0xpc3RlbmVyVHlwZSkgewotCQlKYXZhQ2xhc3Mgb2xkTGlzdGVuZXJUeXBlID0gbGlzdGVuZXJUeXBlOwotCQlsaXN0ZW5lclR5cGUgPSBuZXdMaXN0ZW5lclR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9UWVBFLCBvbGRMaXN0ZW5lclR5cGUsIGxpc3RlbmVyVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKSB7Ci0JCWlmIChyZW1vdmVMaXN0ZW5lck1ldGhvZCAhPSBudWxsICYmIHJlbW92ZUxpc3RlbmVyTWV0aG9kLmVJc1Byb3h5KCkpIHsKLQkJCU1ldGhvZCBvbGRSZW1vdmVMaXN0ZW5lck1ldGhvZCA9IHJlbW92ZUxpc3RlbmVyTWV0aG9kOwotCQkJcmVtb3ZlTGlzdGVuZXJNZXRob2QgPSAoTWV0aG9kKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClyZW1vdmVMaXN0ZW5lck1ldGhvZCk7Ci0JCQlpZiAocmVtb3ZlTGlzdGVuZXJNZXRob2QgIT0gb2xkUmVtb3ZlTGlzdGVuZXJNZXRob2QpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVNT1ZFX0xJU1RFTkVSX01FVEhPRCwgb2xkUmVtb3ZlTGlzdGVuZXJNZXRob2QsIHJlbW92ZUxpc3RlbmVyTWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZUxpc3RlbmVyTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgYmFzaWNHZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpIHsKLQkJcmV0dXJuIHJlbW92ZUxpc3RlbmVyTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW92ZUxpc3RlbmVyTWV0aG9kKE1ldGhvZCBuZXdSZW1vdmVMaXN0ZW5lck1ldGhvZCkgewotCQlNZXRob2Qgb2xkUmVtb3ZlTGlzdGVuZXJNZXRob2QgPSByZW1vdmVMaXN0ZW5lck1ldGhvZDsKLQkJcmVtb3ZlTGlzdGVuZXJNZXRob2QgPSBuZXdSZW1vdmVMaXN0ZW5lck1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFTU9WRV9MSVNURU5FUl9NRVRIT0QsIG9sZFJlbW92ZUxpc3RlbmVyTWV0aG9kLCByZW1vdmVMaXN0ZW5lck1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0RXZlbnRBZGFwdGVyQ2xhc3MoKSB7Ci0JCWlmIChldmVudEFkYXB0ZXJDbGFzcyAhPSBudWxsICYmIGV2ZW50QWRhcHRlckNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRFdmVudEFkYXB0ZXJDbGFzcyA9IGV2ZW50QWRhcHRlckNsYXNzOwotCQkJZXZlbnRBZGFwdGVyQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClldmVudEFkYXB0ZXJDbGFzcyk7Ci0JCQlpZiAoZXZlbnRBZGFwdGVyQ2xhc3MgIT0gb2xkRXZlbnRBZGFwdGVyQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVZFTlRfQURBUFRFUl9DTEFTUywgb2xkRXZlbnRBZGFwdGVyQ2xhc3MsIGV2ZW50QWRhcHRlckNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV2ZW50QWRhcHRlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRFdmVudEFkYXB0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIGV2ZW50QWRhcHRlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV2ZW50QWRhcHRlckNsYXNzKEphdmFDbGFzcyBuZXdFdmVudEFkYXB0ZXJDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkRXZlbnRBZGFwdGVyQ2xhc3MgPSBldmVudEFkYXB0ZXJDbGFzczsKLQkJZXZlbnRBZGFwdGVyQ2xhc3MgPSBuZXdFdmVudEFkYXB0ZXJDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VWRU5UX0FEQVBURVJfQ0xBU1MsIG9sZEV2ZW50QWRhcHRlckNsYXNzLCBldmVudEFkYXB0ZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTZXJMaXN0TXRoZCgpIHsKLQkJaWYgKHNlckxpc3RNdGhkID09IG51bGwpIHsKLQkJCXNlckxpc3RNdGhkID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZFByb3h5LmNsYXNzLCB0aGlzLCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0VSX0xJU1RfTVRIRCk7Ci0JCX0KLQkJcmV0dXJuIHNlckxpc3RNdGhkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERldGFpbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0VSX0xJU1RfTVRIRDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJMaXN0TXRoZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRU1PREVMX0VMRU1FTlRfX0VBTk5PVEFUSU9OUywgRU1vZGVsRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGdldERldGFpbHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNFeHBlcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzSGlkZGVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1ByZWZlcnJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuIGlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldEltcGxpY2l0bHlTZXRCaXRzKCkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU5fREVGQVVMVF9FVkVOVF9TRVQ6Ci0JCQkJcmV0dXJuIGlzSW5EZWZhdWx0RXZlbnRTZXQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19VTklDQVNUOgotCQkJCXJldHVybiBpc1VuaWNhc3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiBpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BRERfTElTVEVORVJfTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0QWRkTGlzdGVuZXJNZXRob2QoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRBZGRMaXN0ZW5lck1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0TGlzdGVuZXJNZXRob2RzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9UWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TGlzdGVuZXJUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TGlzdGVuZXJUeXBlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRU1PVkVfTElTVEVORVJfTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVZFTlRfQURBUFRFUl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEV2ZW50QWRhcHRlckNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RXZlbnRBZGFwdGVyQ2xhc3MoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NFUl9MSVNUX01USEQ6Ci0JCQkJcmV0dXJuIGdldFNlckxpc3RNdGhkKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGV0YWlscygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlzZXRTaG9ydERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlzZXRFeHBlcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXNldEhpZGRlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJc2V0UHJlZmVycmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cygoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKEltcGxpY2l0SXRlbSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTl9ERUZBVUxUX0VWRU5UX1NFVDoKLQkJCQlzZXRJbkRlZmF1bHRFdmVudFNldCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19VTklDQVNUOgotCQkJCXNldFVuaWNhc3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FERF9MSVNURU5FUl9NRVRIT0Q6Ci0JCQkJc2V0QWRkTGlzdGVuZXJNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EUzoKLQkJCQlnZXRMaXN0ZW5lck1ldGhvZHMoKS5jbGVhcigpOwotCQkJCWdldExpc3RlbmVyTWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfVFlQRToKLQkJCQlzZXRMaXN0ZW5lclR5cGUoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVNT1ZFX0xJU1RFTkVSX01FVEhPRDoKLQkJCQlzZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgoTWV0aG9kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FVkVOVF9BREFQVEVSX0NMQVNTOgotCQkJCXNldEV2ZW50QWRhcHRlckNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NFUl9MSVNUX01USEQ6Ci0JCQkJZ2V0U2VyTGlzdE10aGQoKS5jbGVhcigpOwotCQkJCWdldFNlckxpc3RNdGhkKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJdW5zZXREaXNwbGF5TmFtZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJdW5zZXRFeHBlcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJdW5zZXRQcmVmZXJyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbihNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lOX0RFRkFVTFRfRVZFTlRfU0VUOgotCQkJCXVuc2V0SW5EZWZhdWx0RXZlbnRTZXQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19VTklDQVNUOgotCQkJCXVuc2V0VW5pY2FzdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0TGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eShMSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BRERfTElTVEVORVJfTUVUSE9EOgotCQkJCXNldEFkZExpc3RlbmVyTWV0aG9kKChNZXRob2QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EUzoKLQkJCQlnZXRMaXN0ZW5lck1ldGhvZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX1RZUEU6Ci0JCQkJc2V0TGlzdGVuZXJUeXBlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVNT1ZFX0xJU1RFTkVSX01FVEhPRDoKLQkJCQlzZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgoTWV0aG9kKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VWRU5UX0FEQVBURVJfQ0xBU1M6Ci0JCQkJc2V0RXZlbnRBZGFwdGVyQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEOgotCQkJCWdldFNlckxpc3RNdGhkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIG92ZXJyaWRkZW4gc28gdGhhdCB3ZSBjYW4gZG8gc3BlY2lhbCBpcyBzZXQgdGVzdHM6Ci0JICogMSkgcGFyYW1ldGVyIGRlc2NyaXB0b3JzOiBjaGVjayBpZiBzZXJQYXJtRGVzYyBleGlzdHMgYW5kIG5vdCBlbXB0eSwgc2luY2UgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIGlzIGRlcml2ZWQuCi0JICogMikgc2VyUGFybURlc2M6IGlmIGZsYWcgc2V0IHRvIGRlZmF1bHQgcGFybSBkZXNjLCB0aGVuIGFuc3dlciBub3Qgc2V0LCBlbHNlIGRvIG5vcm1hbCBpc1NldCB0ZXN0LiBUaGF0IHdheSBpZiBzZXQgYnkgZGVmYXVsdCBpdCB3b24ndCBzZXJpYWxpemUKLQkgKiAgICBvdXQgdGhlIHVubmVlZGVkIGRlZmF1bHQgcGFybXMuIFRoZXkgY2FuIGJlIHJlY29uc3RydWN0ZWQgcXVpY2tseSB3aGVuIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBpc1NvdXJjZVNldCgpOwkvLyBPdmVycmlkZSBzbyB0aGF0IGlmIHNldCB0byB0aGUgc2FtZSBhcyBjbGFzc25hbWUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBub3Qgc2V0LgotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfU2VyTGlzdE10aGQoKSk7CS8vIExldCBkZWZhdWx0IHNlckxpc3RNdGhkIGlzIHNldCB3b3JrLgotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0VSX0xJU1RfTVRIRDoKLQkJCQlpZiAoKGdldEltcGxpY2l0bHlTZXRCaXRzKCkgJiBFVkVOVF9MSVNURU5FUk1FVEhPRFNfREVGQVVMVCkgIT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBOb3QgY29uc2lkZXJlZCBzZXQgaWYgaW5pdGlhbGl6ZWQgYnkgZGVmYXVsdC4KLQkJCQllbHNlCi0JCQkJCXJldHVybiBlSXNTZXRHZW4oZUZlYXR1cmUpOwkvLyBOb3Qgc2V0IGJ5IGRlZmF1bHQsIHNvIGNoZWNrIHRydWUgc2V0dGluZy4KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGVJc1NldEdlbihlRmVhdHVyZSk7CS8vIEV2ZXJ5dGhpbmcgZWxzZSB1c2UgdGhlIGdlbiBtZXRob2QuCi0JCX0KLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0R2VuKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIFNPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gc291cmNlICE9IG51bGwgOiAhU09VUkNFX0VERUZBVUxULmVxdWFscyhzb3VyY2UpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZGV0YWlscyAhPSBudWxsICYmICFkZXRhaWxzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBjb250ZW50cyAhPSBudWxsICYmICFjb250ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiByZWZlcmVuY2VzICE9IG51bGwgJiYgIXJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBpc1NldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gaXNTZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gQ0FURUdPUllfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGVnb3J5ICE9IG51bGwgOiAhQ0FURUdPUllfRURFRkFVTFQuZXF1YWxzKGNhdGVnb3J5KTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNTZXRFeHBlcnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNTZXRIaWRkZW4oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNTZXRQcmVmZXJyZWQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMCkgIT0gTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCkgIT0gQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIGltcGxpY2l0bHlTZXRCaXRzICE9IElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gaW1wbGljaXREZWNvcmF0b3JGbGFnICE9IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lOX0RFRkFVTFRfRVZFTlRfU0VUOgotCQkJCXJldHVybiBpc1NldEluRGVmYXVsdEV2ZW50U2V0KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19VTklDQVNUOgotCQkJCXJldHVybiBpc1NldFVuaWNhc3QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCkgIT0gTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FERF9MSVNURU5FUl9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGFkZExpc3RlbmVyTWV0aG9kICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTOgotCQkJCXJldHVybiAhZ2V0TGlzdGVuZXJNZXRob2RzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfVFlQRToKLQkJCQlyZXR1cm4gbGlzdGVuZXJUeXBlICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRU1PVkVfTElTVEVORVJfTUVUSE9EOgotCQkJCXJldHVybiByZW1vdmVMaXN0ZW5lck1ldGhvZCAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVZFTlRfQURBUFRFUl9DTEFTUzoKLQkJCQlyZXR1cm4gZXZlbnRBZGFwdGVyQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NFUl9MSVNUX01USEQ6Ci0JCQkJcmV0dXJuIHNlckxpc3RNdGhkICE9IG51bGwgJiYgIXNlckxpc3RNdGhkLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGluRGVmYXVsdEV2ZW50U2V0OiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgSU5fREVGQVVMVF9FVkVOVF9TRVRfRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1bmljYXN0OiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBVTklDQVNUX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBVTklDQVNUX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIExJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0ZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0ZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjNDdmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9GZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZlYXR1cmUgQXR0cmlidXRlIE1hcCBFbnRyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCNnZXRUeXBlZEtleSA8ZW0+S2V5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsI2dldFR5cGVkVmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzaWNFTWFwLkVudHJ5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZWRLZXkoKSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlZEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkS2V5KCkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZWRLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcga2V5ID0gS0VZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkVmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkVmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlQXR0cmlidXRlVmFsdWUgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVkS2V5KCkgewotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVkS2V5KFN0cmluZyBuZXdLZXkpIHsKLQkJU3RyaW5nIG9sZEtleSA9IGtleTsKLQkJa2V5ID0gbmV3S2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19LRVksIG9sZEtleSwga2V5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBnZXRUeXBlZFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZWRWYWx1ZShGZWF0dXJlQXR0cmlidXRlVmFsdWUgbmV3VmFsdWUpIHsKLQkJRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX0tFWToKLQkJCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX0tFWToKLQkJCQlzZXRUeXBlZEtleSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX1ZBTFVFOgotCQkJCXNldFR5cGVkVmFsdWUoKEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fS0VZOgotCQkJCXNldFR5cGVkS2V5KEtFWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19WQUxVRToKLQkJCQlzZXRUeXBlZFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fS0VZOgotCQkJCXJldHVybiBLRVlfRURFRkFVTFQgPT0gbnVsbCA/IGtleSAhPSBudWxsIDogIUtFWV9FREVGQVVMVC5lcXVhbHMoa2V5KTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChrZXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGtleSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBoYXNoID0gLTE7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhhc2goKSB7Ci0JCWlmIChoYXNoID09IC0xKSB7Ci0JCQlPYmplY3QgdGhlS2V5ID0gZ2V0S2V5KCk7Ci0JCQloYXNoID0gKHRoZUtleSA9PSBudWxsID8gMCA6IHRoZUtleS5oYXNoQ29kZSgpKTsKLQkJfQotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNoKGludCBoYXNoKSB7Ci0JCXRoaXMuaGFzaCA9IGhhc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCXJldHVybiBnZXRUeXBlZEtleSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleShPYmplY3Qga2V5KSB7Ci0JCXNldFR5cGVkS2V5KChTdHJpbmcpa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0VHlwZWRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IGdldFZhbHVlKCk7Ci0JCXNldFR5cGVkVmFsdWUoKEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSl2YWx1ZSk7Ci0JCXJldHVybiBvbGRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcCBnZXRFTWFwKCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGVDb250YWluZXIoKTsKLQkJcmV0dXJuIGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6IChFTWFwKWNvbnRhaW5lci5lR2V0KGVDb250YWlubWVudEZlYXR1cmUoKSk7Ci0JfQotCi19IC8vRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvRmVhdHVyZURlY29yYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0ZlYXR1cmVEZWNvcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMGQ1NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvRmVhdHVyZURlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEZlYXR1cmVEZWNvcmF0b3JJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjExICQgICREYXRlOiAyMDA1LzA5LzE5IDE1OjQzOjAyICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBbm5vdGF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZlYXR1cmUgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCNnZXRTaG9ydERlc2NyaXB0aW9uIDxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZURlY29yYXRvckltcGwjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCNpc0V4cGVydCA8ZW0+RXhwZXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCNpc0hpZGRlbiA8ZW0+SGlkZGVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCNpc1ByZWZlcnJlZCA8ZW0+UHJlZmVycmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCNpc01lcmdlSW50cm9zcGVjdGlvbiA8ZW0+TWVyZ2UgSW50cm9zcGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZURlY29yYXRvckltcGwjaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSA8ZW0+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZURlY29yYXRvckltcGwjZ2V0SW1wbGljaXRseVNldEJpdHMgPGVtPkltcGxpY2l0bHkgU2V0IEJpdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkZlYXR1cmVEZWNvcmF0b3JJbXBsI2dldEltcGxpY2l0RGVjb3JhdG9yRmxhZyA8ZW0+SW1wbGljaXQgRGVjb3JhdG9yIEZsYWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkZlYXR1cmVEZWNvcmF0b3JJbXBsI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlRGVjb3JhdG9ySW1wbCBleHRlbmRzIEVBbm5vdGF0aW9uSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVEZWNvcmF0b3J7Ci0JCi0JLyoqCi0JICogQml0cyBmb3IgaW1wbGljaXRseSBzZXQgZmVhdHVyZXMuIFRoaXMgaXMgaW50ZXJuYWwsIG5vdCBtZWFudCBmb3IgY2xpZW50cy4KLQkgKiBOb3RlOiBUbyBtYWtlIGl0IGVhc2llciB0byBtYWtlIGNoYW5nZXMgRmVhdHVyZSBnb2VzIGZyb20gaGlnaCBiaXRzIGRvd24sIHdoaWxlIHRoZQotCSAqIHN1YmNsYXNzZXMgZ28gZnJvbSBsb3ctYml0cyB1cC4gVGhhdCB3YXkgaWYgYSBjaGFuZ2UgaXMgbWFkZSB0byBhZGQgc29tZXRoaW5nIG9mCi0JICogaW50ZXJlc3QgdG8gRmVhdHVyZSwgYWxsIG9mIHRoZSBzdWJjbGFzc2VzIGRvbid0IG5lZWQgdG8gaGF2ZSB0aGVpciBiaXRzIHJlLW9yZGVyZWQuCi0JICogU2luY2UgdGhlc2UgYXJlIGJpdHMsIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIG9uZXMgdG8gdXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGRUFUVVJFX0RJU1BMQVlOQU1FX0lNUExJQ0lUID0gMHg4MDAwMDAwMDAwMDAwMDAwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRkVBVFVSRV9TSE9SVERFU0NfSU1QTElDSVQgPSAweDQwMDAwMDAwMDAwMDAwMDBMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGRUFUVVJFX0NBVEVHT1JZX0lNUExJQ0lUID0gMHgyMDAwMDAwMDAwMDAwMDAwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRkVBVFVSRV9FWFBFUlRfSU1QTElDSVQgPSAweDEwMDAwMDAwMDAwMDAwMDBMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGRUFUVVJFX0hJRERFTl9JTVBMSUNJVCA9IDB4ODAwMDAwMDAwMDAwMDAwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRkVBVFVSRV9QUkVGRVJSRURfSU1QTElDSVQgPSAweDQwMDAwMDAwMDAwMDAwMEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZFQVRVUkVfQVRUUklCVVRFU19JTVBMSUNJVCA9IDB4MjAwMDAwMDAwMDAwMDAwTDsgCi0JCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkgCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWUoKSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5TmFtZSA9IERJU1BMQVlfTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgRGlzcGxheSBOYW1lIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX05BTUVfRVNFVEZMQUcgPSAxIDw8IDg7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hvcnREZXNjcmlwdGlvbigpIDxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlRfREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hvcnREZXNjcmlwdGlvbigpIDxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uID0gU0hPUlRfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIFNob3J0IERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTSE9SVF9ERVNDUklQVElPTl9FU0VURkxBRyA9IDEgPDwgOTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRlZ29yeSgpIDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGVnb3J5KCkgPGVtPkNhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeSA9IENBVEVHT1JZX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4cGVydCgpIDxlbT5FeHBlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhwZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhQRVJUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4cGVydCgpIDxlbT5FeHBlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhwZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFWFBFUlRfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIEV4cGVydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVhQRVJUX0VTRVRGTEFHID0gMSA8PCAxMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hpZGRlbigpIDxlbT5IaWRkZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGlkZGVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSElEREVOX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hpZGRlbigpIDxlbT5IaWRkZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGlkZGVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBISURERU5fRUZMQUcgPSAxIDw8IDEyOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIEhpZGRlbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOX0VTRVRGTEFHID0gMSA8PCAxMzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ByZWZlcnJlZCgpIDxlbT5QcmVmZXJyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJlZmVycmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFRkVSUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ByZWZlcnJlZCgpIDxlbT5QcmVmZXJyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJlZmVycmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQUkVGRVJSRURfRUZMQUcgPSAxIDw8IDE0OwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIFByZWZlcnJlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUFJFRkVSUkVEX0VTRVRGTEFHID0gMSA8PCAxNTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01lcmdlSW50cm9zcGVjdGlvbigpIDxlbT5NZXJnZSBJbnRyb3NwZWN0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01lcmdlSW50cm9zcGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXJnZUludHJvc3BlY3Rpb24oKSA8ZW0+TWVyZ2UgSW50cm9zcGVjdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXJnZUludHJvc3BlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcgPSAxIDw8IDE2OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA8ZW0+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA8ZW0+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRyA9IDEgPDwgMTc7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGljaXRseVNldEJpdHMoKSA8ZW0+SW1wbGljaXRseSBTZXQgQml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wbGljaXRseVNldEJpdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUID0gMEw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsaWNpdGx5U2V0Qml0cygpIDxlbT5JbXBsaWNpdGx5IFNldCBCaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBsaWNpdGx5U2V0Qml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgaW1wbGljaXRseVNldEJpdHMgPSBJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpIDxlbT5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEltcGxpY2l0SXRlbSBJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVCA9IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpIDxlbT5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1wbGljaXRJdGVtIGltcGxpY2l0RGVjb3JhdG9yRmxhZyA9IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlcygpIDxlbT5BdHRyaWJ1dGVzPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCBhdHRyaWJ1dGVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlRGVjb3JhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZUZsYWdzIHw9IE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gaXNTZXREaXNwbGF5TmFtZSgpID8gZ2V0RGlzcGxheU5hbWVHZW4oKSA6IGdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lR2VuKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlFTmFtZWRFbGVtZW50IG5lID0gKEVOYW1lZEVsZW1lbnQpIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJaWYgKG5lICE9IG51bGwpCi0JCQlyZXR1cm4gbmUuZ2V0TmFtZSgpOwkvLyBUaGUgbmFtZSBmcm9tIHRoZSBvd25lciBvZiB0aGUgZmVhdHVyZSBoYXMgdG8gYmUgdGhlIG5hbWUgb2YgZmVhdHVyZS4KLQkJZWxzZQotCQkJcmV0dXJuICI/IjsJLy8gRG9uJ3Qga25vdyB3aGF0IGl0IGlzLiAvLyROT04tTkxTLTEkCi0JfQotCQotCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJU3RyaW5nIG9sZERpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0JCWRpc3BsYXlOYW1lID0gbmV3RGlzcGxheU5hbWU7Ci0JCWJvb2xlYW4gb2xkRGlzcGxheU5hbWVFU2V0ID0gKGVGbGFncyAmIERJU1BMQVlfTkFNRV9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IERJU1BMQVlfTkFNRV9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ESVNQTEFZX05BTUUsIG9sZERpc3BsYXlOYW1lLCBkaXNwbGF5TmFtZSwgIW9sZERpc3BsYXlOYW1lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RGlzcGxheU5hbWUoKSB7Ci0JCVN0cmluZyBvbGREaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQlib29sZWFuIG9sZERpc3BsYXlOYW1lRVNldCA9IChlRmxhZ3MgJiBESVNQTEFZX05BTUVfRVNFVEZMQUcpICE9IDA7Ci0JCWRpc3BsYXlOYW1lID0gRElTUExBWV9OQU1FX0VERUZBVUxUOwotCQllRmxhZ3MgJj0gfkRJU1BMQVlfTkFNRV9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRSwgb2xkRGlzcGxheU5hbWUsIERJU1BMQVlfTkFNRV9FREVGQVVMVCwgb2xkRGlzcGxheU5hbWVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBESVNQTEFZX05BTUVfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gc2hvcnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydERlc2NyaXB0aW9uKFN0cmluZyBuZXdTaG9ydERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRTaG9ydERlc2NyaXB0aW9uID0gc2hvcnREZXNjcmlwdGlvbjsKLQkJc2hvcnREZXNjcmlwdGlvbiA9IG5ld1Nob3J0RGVzY3JpcHRpb247Ci0JCWJvb2xlYW4gb2xkU2hvcnREZXNjcmlwdGlvbkVTZXQgPSAoZUZsYWdzICYgU0hPUlRfREVTQ1JJUFRJT05fRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBTSE9SVF9ERVNDUklQVElPTl9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTiwgb2xkU2hvcnREZXNjcmlwdGlvbiwgc2hvcnREZXNjcmlwdGlvbiwgIW9sZFNob3J0RGVzY3JpcHRpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTaG9ydERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgb2xkU2hvcnREZXNjcmlwdGlvbiA9IHNob3J0RGVzY3JpcHRpb247Ci0JCWJvb2xlYW4gb2xkU2hvcnREZXNjcmlwdGlvbkVTZXQgPSAoZUZsYWdzICYgU0hPUlRfREVTQ1JJUFRJT05fRVNFVEZMQUcpICE9IDA7Ci0JCXNob3J0RGVzY3JpcHRpb24gPSBTSE9SVF9ERVNDUklQVElPTl9FREVGQVVMVDsKLQkJZUZsYWdzICY9IH5TSE9SVF9ERVNDUklQVElPTl9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OLCBvbGRTaG9ydERlc2NyaXB0aW9uLCBTSE9SVF9ERVNDUklQVElPTl9FREVGQVVMVCwgb2xkU2hvcnREZXNjcmlwdGlvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNob3J0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgU0hPUlRfREVTQ1JJUFRJT05fRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBuZXdDYXRlZ29yeSkgewotCQlTdHJpbmcgb2xkQ2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJY2F0ZWdvcnkgPSBuZXdDYXRlZ29yeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWSwgb2xkQ2F0ZWdvcnksIGNhdGVnb3J5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHBlcnQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRVhQRVJUX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGVydChib29sZWFuIG5ld0V4cGVydCkgewotCQlib29sZWFuIG9sZEV4cGVydCA9IChlRmxhZ3MgJiBFWFBFUlRfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdFeHBlcnQpIGVGbGFncyB8PSBFWFBFUlRfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5FWFBFUlRfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkRXhwZXJ0RVNldCA9IChlRmxhZ3MgJiBFWFBFUlRfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBFWFBFUlRfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRVhQRVJULCBvbGRFeHBlcnQsIG5ld0V4cGVydCwgIW9sZEV4cGVydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEV4cGVydCgpIHsKLQkJYm9vbGVhbiBvbGRFeHBlcnQgPSAoZUZsYWdzICYgRVhQRVJUX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZEV4cGVydEVTZXQgPSAoZUZsYWdzICYgRVhQRVJUX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoRVhQRVJUX0VERUZBVUxUKSBlRmxhZ3MgfD0gRVhQRVJUX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RVhQRVJUX0VGTEFHOwotCQllRmxhZ3MgJj0gfkVYUEVSVF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVCwgb2xkRXhwZXJ0LCBFWFBFUlRfRURFRkFVTFQsIG9sZEV4cGVydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEV4cGVydCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBFWFBFUlRfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIaWRkZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgSElEREVOX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhpZGRlbihib29sZWFuIG5ld0hpZGRlbikgewotCQlib29sZWFuIG9sZEhpZGRlbiA9IChlRmxhZ3MgJiBISURERU5fRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdIaWRkZW4pIGVGbGFncyB8PSBISURERU5fRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5ISURERU5fRUZMQUc7Ci0JCWJvb2xlYW4gb2xkSGlkZGVuRVNldCA9IChlRmxhZ3MgJiBISURERU5fRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBISURERU5fRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSElEREVOLCBvbGRIaWRkZW4sIG5ld0hpZGRlbiwgIW9sZEhpZGRlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhpZGRlbigpIHsKLQkJYm9vbGVhbiBvbGRIaWRkZW4gPSAoZUZsYWdzICYgSElEREVOX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZEhpZGRlbkVTZXQgPSAoZUZsYWdzICYgSElEREVOX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoSElEREVOX0VERUZBVUxUKSBlRmxhZ3MgfD0gSElEREVOX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+SElEREVOX0VGTEFHOwotCQllRmxhZ3MgJj0gfkhJRERFTl9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTiwgb2xkSGlkZGVuLCBISURERU5fRURFRkFVTFQsIG9sZEhpZGRlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEhpZGRlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBISURERU5fRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmVmZXJyZWQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgUFJFRkVSUkVEX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZlcnJlZChib29sZWFuIG5ld1ByZWZlcnJlZCkgewotCQlib29sZWFuIG9sZFByZWZlcnJlZCA9IChlRmxhZ3MgJiBQUkVGRVJSRURfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdQcmVmZXJyZWQpIGVGbGFncyB8PSBQUkVGRVJSRURfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5QUkVGRVJSRURfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkUHJlZmVycmVkRVNldCA9IChlRmxhZ3MgJiBQUkVGRVJSRURfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBQUkVGRVJSRURfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVELCBvbGRQcmVmZXJyZWQsIG5ld1ByZWZlcnJlZCwgIW9sZFByZWZlcnJlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFByZWZlcnJlZCgpIHsKLQkJYm9vbGVhbiBvbGRQcmVmZXJyZWQgPSAoZUZsYWdzICYgUFJFRkVSUkVEX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZFByZWZlcnJlZEVTZXQgPSAoZUZsYWdzICYgUFJFRkVSUkVEX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoUFJFRkVSUkVEX0VERUZBVUxUKSBlRmxhZ3MgfD0gUFJFRkVSUkVEX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+UFJFRkVSUkVEX0VGTEFHOwotCQllRmxhZ3MgJj0gflBSRUZFUlJFRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1BSRUZFUlJFRCwgb2xkUHJlZmVycmVkLCBQUkVGRVJSRURfRURFRkFVTFQsIG9sZFByZWZlcnJlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFByZWZlcnJlZCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBQUkVGRVJSRURfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXJnZUludHJvc3BlY3Rpb24oYm9vbGVhbiBuZXdNZXJnZUludHJvc3BlY3Rpb24pIHsKLQkJYm9vbGVhbiBvbGRNZXJnZUludHJvc3BlY3Rpb24gPSAoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld01lcmdlSW50cm9zcGVjdGlvbikgZUZsYWdzIHw9IE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5NRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT04sIG9sZE1lcmdlSW50cm9zcGVjdGlvbiwgbmV3TWVyZ2VJbnRyb3NwZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KGJvb2xlYW4gbmV3QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkpIHsKLQkJYm9vbGVhbiBvbGRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSA9IChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkpIGVGbGFncyB8PSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+QVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZLCBvbGRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSwgbmV3QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRJbXBsaWNpdGx5U2V0Qml0cygpIHsKLQkJcmV0dXJuIGltcGxpY2l0bHlTZXRCaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcGxpY2l0bHlTZXRCaXRzKGxvbmcgbmV3SW1wbGljaXRseVNldEJpdHMpIHsKLQkJbG9uZyBvbGRJbXBsaWNpdGx5U2V0Qml0cyA9IGltcGxpY2l0bHlTZXRCaXRzOwotCQlpbXBsaWNpdGx5U2V0Qml0cyA9IG5ld0ltcGxpY2l0bHlTZXRCaXRzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFMsIG9sZEltcGxpY2l0bHlTZXRCaXRzLCBpbXBsaWNpdGx5U2V0Qml0cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbXBsaWNpdEl0ZW0gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgewotCQlyZXR1cm4gaW1wbGljaXREZWNvcmF0b3JGbGFnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJbXBsaWNpdEl0ZW0gbmV3SW1wbGljaXREZWNvcmF0b3JGbGFnKSB7Ci0JCUltcGxpY2l0SXRlbSBvbGRJbXBsaWNpdERlY29yYXRvckZsYWcgPSBpbXBsaWNpdERlY29yYXRvckZsYWc7Ci0JCWltcGxpY2l0RGVjb3JhdG9yRmxhZyA9IG5ld0ltcGxpY2l0RGVjb3JhdG9yRmxhZyA9PSBudWxsID8gSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQgOiBuZXdJbXBsaWNpdERlY29yYXRvckZsYWc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUcsIG9sZEltcGxpY2l0RGVjb3JhdG9yRmxhZywgaW1wbGljaXREZWNvcmF0b3JGbGFnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJYXR0cmlidXRlcyA9IG5ldyBFY29yZUVNYXAoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKSwgRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTKTsKLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGlzcGxheU5hbWU6ICIpOwotCQlpZiAoKGVGbGFncyAmIERJU1BMQVlfTkFNRV9FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZChkaXNwbGF5TmFtZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNob3J0RGVzY3JpcHRpb246ICIpOwotCQlpZiAoKGVGbGFncyAmIFNIT1JUX0RFU0NSSVBUSU9OX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKHNob3J0RGVzY3JpcHRpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXRlZ29yeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2F0ZWdvcnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4cGVydDogIik7Ci0JCWlmICgoZUZsYWdzICYgRVhQRVJUX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBFWFBFUlRfRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoaWRkZW46ICIpOwotCQlpZiAoKGVGbGFncyAmIEhJRERFTl9FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgSElEREVOX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlZmVycmVkOiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBQUkVGRVJSRURfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFBSRUZFUlJFRF9FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1lcmdlSW50cm9zcGVjdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW1wbGljaXRseVNldEJpdHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGltcGxpY2l0bHlTZXRCaXRzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbXBsaWNpdERlY29yYXRvckZsYWc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGltcGxpY2l0RGVjb3JhdG9yRmxhZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGV0YWlscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVNT0RFTF9FTEVNRU5UX19FQU5OT1RBVElPTlMsIEVNb2RlbEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBnZXREZXRhaWxzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzSGlkZGVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNQcmVmZXJyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCWdldERldGFpbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlzZXRTaG9ydERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXNldEV4cGVydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXNldEhpZGRlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXNldFByZWZlcnJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZygoSW1wbGljaXRJdGVtKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKFNPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXVuc2V0RGlzcGxheU5hbWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJdW5zZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXVuc2V0RXhwZXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQl1bnNldEhpZGRlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJdW5zZXRQcmVmZXJyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBvdmVycmlkZXMgdG8gZUlzU2V0IHRvIHRlc3QgaWYgc291cmNlIGlzIHNldC4gVGhpcyBpcyBiZWNhdXNlIGZvciB0aGUgCi0JICogRmVhdHVyZURlY29yYXRvciBhbmQgc3ViY2xhc3Nlcywgc2V0dGluZyBzb3VyY2UgdG8gdGhlIGNsYXNzbmFtZSBpcyBjb25zaWRlcmVkCi0JICogdG8gYmUgbm90IHNldCBzaW5jZSB0aGF0IGlzIHRoZSBuZXcgZGVmYXVsdCBmb3IgZWFjaCBjbGFzcyBsZXZlbC4gQnkgZG9pbmcgdGhpcwotCSAqIHdoZW4gc2VyaWFsaXppbmcgaXQgd29uJ3Qgd2FzdGUgc3BhY2UgYW5kIHRpbWUgYWRkaW5nIGEgY29weSBvZiB0aGUgc291cmNlIHN0cmluZwotCSAqIHRvIHRoZSBzZXJpYWxpemVkIG91dHB1dCBhbmQgdGhlbiBjcmVhdGluZyBhIE5FVyBjb3B5IG9uIGVhY2ggZGVjb3JhdG9yIGxvYWRlZAotCSAqIGZyb20gYW4gWE1JIGZpbGUuIAotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc291cmNlIGlzIG5vdCBudWxsIGFuZCBub3QgZXF1YWwgdG8gY2xhc3MgbmFtZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NvdXJjZVNldCgpIHsKLQkJcmV0dXJuIHNvdXJjZSAhPSBudWxsICYmICFnZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QjZUlzU2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU291cmNlU2V0KCk7CS8vIE92ZXJyaWRlIHNvIHRoYXQgaWYgc2V0IHRvIHRoZSBzYW1lIGFzIGNsYXNzbmFtZSwgdGhlbiBpdCBpcyBjb25zaWRlcmVkIG5vdCBzZXQuCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBlSXNTZXRHZW4oZUZlYXR1cmUpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXRHZW4oRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBkZXRhaWxzICE9IG51bGwgJiYgIWRldGFpbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBpc1NldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGlzU2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNTZXRFeHBlcnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzU2V0SGlkZGVuKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1NldFByZWZlcnJlZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMCkgIT0gTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gaW1wbGljaXRseVNldEJpdHMgIT0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gaW1wbGljaXREZWNvcmF0b3JGbGFnICE9IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Q3MmE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0luZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8wOS8xOSAxNTo0MzowMiAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5kZXhlZCBQcm9wZXJ0eSBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwjZ2V0SW5kZXhlZFJlYWRNZXRob2QgPGVtPkluZGV4ZWQgUmVhZCBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kIDxlbT5JbmRleGVkIFdyaXRlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsIGV4dGVuZHMgUHJvcGVydHlEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yewotCQotCS8qKgotCSAqIEJpdHMgZm9yIGltcGxpY2l0bHkgc2V0IGZlYXR1cmVzLiBUaGlzIGlzIGludGVybmFsLCBub3QgbWVhbnQgZm9yIGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElOREVYRURfUkVBRE1FVEhPRF9JTVBMSUNJVCA9IDB4MTAwMDAwTDsJLy8gU3RhcnQga2luZCBvZiBoaWdoIHNvIGFzIHRvIGFsbG93IFByb3BlcnR5RGVjb3JhdG9yIHRvIGluY3JlYXNlIHdpdGhvdXQgY29uZmxpZy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSU5ERVhFRF9XUklURU1FVEhPRF9JTVBMSUNJVCA9IDB4MjAwMDAwTDsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRleGVkUmVhZE1ldGhvZCgpIDxlbT5JbmRleGVkIFJlYWQgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleGVkUmVhZE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZCBpbmRleGVkUmVhZE1ldGhvZCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIEluZGV4ZWQgUmVhZCBNZXRob2QgcmVmZXJlbmNlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOREVYRURfUkVBRF9NRVRIT0RfRVNFVEZMQUcgPSAxIDw8IDI5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkgPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleGVkV3JpdGVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2QgaW5kZXhlZFdyaXRlTWV0aG9kID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgSW5kZXhlZCBXcml0ZSBNZXRob2QgcmVmZXJlbmNlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOREVYRURfV1JJVEVfTUVUSE9EX0VTRVRGTEFHID0gMSA8PCAzMDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwkKLQlwcm90ZWN0ZWQgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRJbmRleGVkUmVhZE1ldGhvZCgpIHsKLQkJaWYgKGluZGV4ZWRSZWFkTWV0aG9kICE9IG51bGwgJiYgaW5kZXhlZFJlYWRNZXRob2QuZUlzUHJveHkoKSkgewotCQkJTWV0aG9kIG9sZEluZGV4ZWRSZWFkTWV0aG9kID0gaW5kZXhlZFJlYWRNZXRob2Q7Ci0JCQlpbmRleGVkUmVhZE1ldGhvZCA9IChNZXRob2QpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWluZGV4ZWRSZWFkTWV0aG9kKTsKLQkJCWlmIChpbmRleGVkUmVhZE1ldGhvZCAhPSBvbGRJbmRleGVkUmVhZE1ldGhvZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9SRUFEX01FVEhPRCwgb2xkSW5kZXhlZFJlYWRNZXRob2QsIGluZGV4ZWRSZWFkTWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGV4ZWRSZWFkTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGV4ZWRSZWFkTWV0aG9kKE1ldGhvZCBuZXdJbmRleGVkUmVhZE1ldGhvZCkgewotCQlNZXRob2Qgb2xkSW5kZXhlZFJlYWRNZXRob2QgPSBpbmRleGVkUmVhZE1ldGhvZDsKLQkJaW5kZXhlZFJlYWRNZXRob2QgPSBuZXdJbmRleGVkUmVhZE1ldGhvZDsKLQkJYm9vbGVhbiBvbGRJbmRleGVkUmVhZE1ldGhvZEVTZXQgPSAoZUZsYWdzICYgSU5ERVhFRF9SRUFEX01FVEhPRF9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IElOREVYRURfUkVBRF9NRVRIT0RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9SRUFEX01FVEhPRCwgb2xkSW5kZXhlZFJlYWRNZXRob2QsIGluZGV4ZWRSZWFkTWV0aG9kLCAhb2xkSW5kZXhlZFJlYWRNZXRob2RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJbmRleGVkUmVhZE1ldGhvZCgpIHsKLQkJTWV0aG9kIG9sZEluZGV4ZWRSZWFkTWV0aG9kID0gaW5kZXhlZFJlYWRNZXRob2Q7Ci0JCWJvb2xlYW4gb2xkSW5kZXhlZFJlYWRNZXRob2RFU2V0ID0gKGVGbGFncyAmIElOREVYRURfUkVBRF9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JCWluZGV4ZWRSZWFkTWV0aG9kID0gbnVsbDsKLQkJZUZsYWdzICY9IH5JTkRFWEVEX1JFQURfTUVUSE9EX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9SRUFEX01FVEhPRCwgb2xkSW5kZXhlZFJlYWRNZXRob2QsIG51bGwsIG9sZEluZGV4ZWRSZWFkTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SW5kZXhlZFJlYWRNZXRob2QoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgSU5ERVhFRF9SRUFEX01FVEhPRF9FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldEluZGV4ZWRXcml0ZU1ldGhvZCgpIHsKLQkJaWYgKGluZGV4ZWRXcml0ZU1ldGhvZCAhPSBudWxsICYmIGluZGV4ZWRXcml0ZU1ldGhvZC5lSXNQcm94eSgpKSB7Ci0JCQlNZXRob2Qgb2xkSW5kZXhlZFdyaXRlTWV0aG9kID0gaW5kZXhlZFdyaXRlTWV0aG9kOwotCQkJaW5kZXhlZFdyaXRlTWV0aG9kID0gKE1ldGhvZCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpaW5kZXhlZFdyaXRlTWV0aG9kKTsKLQkJCWlmIChpbmRleGVkV3JpdGVNZXRob2QgIT0gb2xkSW5kZXhlZFdyaXRlTWV0aG9kKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRCwgb2xkSW5kZXhlZFdyaXRlTWV0aG9kLCBpbmRleGVkV3JpdGVNZXRob2QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXhlZFdyaXRlTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGV4ZWRXcml0ZU1ldGhvZChNZXRob2QgbmV3SW5kZXhlZFdyaXRlTWV0aG9kKSB7Ci0JCU1ldGhvZCBvbGRJbmRleGVkV3JpdGVNZXRob2QgPSBpbmRleGVkV3JpdGVNZXRob2Q7Ci0JCWluZGV4ZWRXcml0ZU1ldGhvZCA9IG5ld0luZGV4ZWRXcml0ZU1ldGhvZDsKLQkJYm9vbGVhbiBvbGRJbmRleGVkV3JpdGVNZXRob2RFU2V0ID0gKGVGbGFncyAmIElOREVYRURfV1JJVEVfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gSU5ERVhFRF9XUklURV9NRVRIT0RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9XUklURV9NRVRIT0QsIG9sZEluZGV4ZWRXcml0ZU1ldGhvZCwgaW5kZXhlZFdyaXRlTWV0aG9kLCAhb2xkSW5kZXhlZFdyaXRlTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkgewotCQlNZXRob2Qgb2xkSW5kZXhlZFdyaXRlTWV0aG9kID0gaW5kZXhlZFdyaXRlTWV0aG9kOwotCQlib29sZWFuIG9sZEluZGV4ZWRXcml0ZU1ldGhvZEVTZXQgPSAoZUZsYWdzICYgSU5ERVhFRF9XUklURV9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JCWluZGV4ZWRXcml0ZU1ldGhvZCA9IG51bGw7Ci0JCWVGbGFncyAmPSB+SU5ERVhFRF9XUklURV9NRVRIT0RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRCwgb2xkSW5kZXhlZFdyaXRlTWV0aG9kLCBudWxsLCBvbGRJbmRleGVkV3JpdGVNZXRob2RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJbmRleGVkV3JpdGVNZXRob2QoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgSU5ERVhFRF9XUklURV9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXRhaWxzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRU1PREVMX0VMRU1FTlRfX0VBTk5PVEFUSU9OUywgRU1vZGVsRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGdldERldGFpbHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzRXhwZXJ0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNIaWRkZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1ByZWZlcnJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiBpc01lcmdlSW50cm9zcGVjdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiBpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldEltcGxpY2l0bHlTZXRCaXRzKCkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBnZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJcmV0dXJuIGlzQm91bmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQ6Ci0JCQkJcmV0dXJuIGlzQ29uc3RyYWluZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUU6Ci0JCQkJcmV0dXJuIGlzRGVzaWduVGltZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXJldHVybiBpc0Fsd2F5c0luY29tcGF0aWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1M6Ci0JCQkJcmV0dXJuIGdldEZpbHRlckZsYWdzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZOgotCQkJCXJldHVybiBpc0ZpZWxkUmVhZE9ubHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldFByb3BlcnR5RWRpdG9yQ2xhc3MoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlYWRNZXRob2QoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZWFkTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0V3JpdGVNZXRob2QoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRXcml0ZU1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RmllbGQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRGaWVsZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfUkVBRF9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldEluZGV4ZWRSZWFkTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9XUklURV9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRJbmRleGVkV3JpdGVNZXRob2QoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRJbmRleGVkV3JpdGVNZXRob2QoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlnZXREZXRhaWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJc2V0U2hvcnREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlzZXRFeHBlcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlzZXRIaWRkZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlzZXRQcmVmZXJyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKEltcGxpY2l0SXRlbSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5EOgotCQkJCXNldEJvdW5kKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRDoKLQkJCQlzZXRDb25zdHJhaW5lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUU6Ci0JCQkJc2V0RGVzaWduVGltZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQUxXQVlTX0lOQ09NUEFUSUJMRToKLQkJCQlzZXRBbHdheXNJbmNvbXBhdGlibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlnZXRGaWx0ZXJGbGFncygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsdGVyRmxhZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFk6Ci0JCQkJc2V0RmllbGRSZWFkT25seSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCXNldFByb3BlcnR5RWRpdG9yQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCXNldFJlYWRNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRDoKLQkJCQlzZXRXcml0ZU1ldGhvZCgoTWV0aG9kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQ6Ci0JCQkJc2V0RmllbGQoKEZpZWxkKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9SRUFEX01FVEhPRDoKLQkJCQlzZXRJbmRleGVkUmVhZE1ldGhvZCgoTWV0aG9kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9XUklURV9NRVRIT0Q6Ci0JCQkJc2V0SW5kZXhlZFdyaXRlTWV0aG9kKChNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoU09VUkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJdW5zZXREaXNwbGF5TmFtZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQl1bnNldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoQ0FURUdPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJdW5zZXRFeHBlcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXVuc2V0SGlkZGVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQl1bnNldFByZWZlcnJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbihNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eShBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJdW5zZXRCb3VuZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRDoKLQkJCQl1bnNldENvbnN0cmFpbmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FOgotCQkJCXVuc2V0RGVzaWduVGltZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXNldEFsd2F5c0luY29tcGF0aWJsZShBTFdBWVNfSU5DT01QQVRJQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTOgotCQkJCWdldEZpbHRlckZsYWdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZOgotCQkJCXNldEZpZWxkUmVhZE9ubHkoRklFTERfUkVBRF9PTkxZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCXNldFByb3BlcnR5RWRpdG9yQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0Q6Ci0JCQkJdW5zZXRSZWFkTWV0aG9kKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRDoKLQkJCQl1bnNldFdyaXRlTWV0aG9kKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCXVuc2V0RmllbGQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9SRUFEX01FVEhPRDoKLQkJCQl1bnNldEluZGV4ZWRSZWFkTWV0aG9kKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfV1JJVEVfTUVUSE9EOgotCQkJCXVuc2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0I2VJc1NldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBpc1NvdXJjZVNldCgpOwkvLyBPdmVycmlkZSBzbyB0aGF0IGlmIHNldCB0byB0aGUgc2FtZSBhcyBjbGFzc25hbWUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBub3Qgc2V0LgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKGVGZWF0dXJlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldEdlbihFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIFNPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gc291cmNlICE9IG51bGwgOiAhU09VUkNFX0VERUZBVUxULmVxdWFscyhzb3VyY2UpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGRldGFpbHMgIT0gbnVsbCAmJiAhZGV0YWlscy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBjb250ZW50cyAhPSBudWxsICYmICFjb250ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlcyAhPSBudWxsICYmICFyZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGlzU2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gaXNTZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIENBVEVHT1JZX0VERUZBVUxUID09IG51bGwgPyBjYXRlZ29yeSAhPSBudWxsIDogIUNBVEVHT1JZX0VERUZBVUxULmVxdWFscyhjYXRlZ29yeSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc1NldEV4cGVydCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNTZXRIaWRkZW4oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UHJlZmVycmVkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHKSAhPSAwKSAhPSBNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCkgIT0gQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBpbXBsaWNpdGx5U2V0Qml0cyAhPSBJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBpbXBsaWNpdERlY29yYXRvckZsYWcgIT0gSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORDoKLQkJCQlyZXR1cm4gaXNTZXRCb3VuZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVEOgotCQkJCXJldHVybiBpc1NldENvbnN0cmFpbmVkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUU6Ci0JCQkJcmV0dXJuIGlzU2V0RGVzaWduVGltZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRykgIT0gMCkgIT0gQUxXQVlTX0lOQ09NUEFUSUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1M6Ci0JCQkJcmV0dXJuIGZpbHRlckZsYWdzICE9IG51bGwgJiYgIWZpbHRlckZsYWdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRklFTERfUkVBRF9PTkxZX0VGTEFHKSAhPSAwKSAhPSBGSUVMRF9SRUFEX09OTFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCXJldHVybiBwcm9wZXJ0eUVkaXRvckNsYXNzICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGlzU2V0UmVhZE1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRDoKLQkJCQlyZXR1cm4gaXNTZXRXcml0ZU1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCXJldHVybiBpc1NldEZpZWxkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9SRUFEX01FVEhPRDoKLQkJCQlyZXR1cm4gaXNTZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfV1JJVEVfTUVUSE9EOgotCQkJCXJldHVybiBpc1NldEluZGV4ZWRXcml0ZU1ldGhvZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGJhc2ljR2V0SW5kZXhlZFJlYWRNZXRob2QoKSB7Ci0JCXJldHVybiBpbmRleGVkUmVhZE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGJhc2ljR2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkgewotCQlyZXR1cm4gaW5kZXhlZFdyaXRlTWV0aG9kOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvTWV0aG9kRGVjb3JhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvTWV0aG9kRGVjb3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGEyYWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL01ldGhvZERlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogTWV0aG9kRGVjb3JhdG9ySW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMSAkICAkRGF0ZTogMjAwNS8wOS8xOSAxNTo0MzowMiAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2REZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuTWV0aG9kRGVjb3JhdG9ySW1wbCNpc1Bhcm1zRXhwbGljaXRFbXB0eSA8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLk1ldGhvZERlY29yYXRvckltcGwjZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMgPGVtPlBhcmFtZXRlciBEZXNjcmlwdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuTWV0aG9kRGVjb3JhdG9ySW1wbCNnZXRTZXJQYXJtRGVzYyA8ZW0+U2VyIFBhcm0gRGVzYzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBNZXRob2REZWNvcmF0b3JJbXBsIGV4dGVuZHMgRmVhdHVyZURlY29yYXRvckltcGwgaW1wbGVtZW50cyBNZXRob2REZWNvcmF0b3J7Ci0JCi0JLyoqCi0JICogQml0cyBmb3IgaW1wbGljaXRseSBzZXQgZmVhdHVyZXMuIFRoaXMgaXMgaW50ZXJuYWwsIG5vdCBtZWFudCBmb3IgY2xpZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTUVUSE9EX1BBUkFNRVRFUlNfSU1QTElDSVQgPSAweDFMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNRVRIT0RfUEFSQU1FVEVSU19ERUZBVUxUID0gMDJMOwkvLyBTcGVjaWFsLCBtZWFucyB3ZXJlIGNyZWF0ZWQgYnkgZGVmYXVsdCBhbmQgbm90IGJ5IGltcGxpY2l0IChmcm9tIGJlYW5pbmZvKS4KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Bhcm1zRXhwbGljaXRFbXB0eSgpIDxlbT5QYXJtcyBFeHBsaWNpdCBFbXB0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNQYXJtc0V4cGxpY2l0RW1wdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQQVJNU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJtc0V4cGxpY2l0RW1wdHkoKSA8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUGFybXNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQQVJNU19FWFBMSUNJVF9FTVBUWV9FRkxBRyA9IDEgPDwgMTg7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJQYXJtRGVzYygpIDxlbT5TZXIgUGFybSBEZXNjPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlclBhcm1EZXNjKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VyUGFybURlc2MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCQotCXByb3RlY3RlZCBNZXRob2REZWNvcmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2REZWNvcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Bhcm1zRXhwbGljaXRFbXB0eSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBQQVJNU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJtc0V4cGxpY2l0RW1wdHkoYm9vbGVhbiBuZXdQYXJtc0V4cGxpY2l0RW1wdHkpIHsKLQkJYm9vbGVhbiBvbGRQYXJtc0V4cGxpY2l0RW1wdHkgPSAoZUZsYWdzICYgUEFSTVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdQYXJtc0V4cGxpY2l0RW1wdHkpIGVGbGFncyB8PSBQQVJNU19FWFBMSUNJVF9FTVBUWV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflBBUk1TX0VYUExJQ0lUX0VNUFRZX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSTVNfRVhQTElDSVRfRU1QVFksIG9sZFBhcm1zRXhwbGljaXRFbXB0eSwgbmV3UGFybXNFeHBsaWNpdEVtcHR5KSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIGNhbGxlZCBpZiBwYXJtcyBsaXN0IG5vdCBleHBsaWNpdGx5IHNldCBhbmQgaXQgd2FzIGVtcHR5IGZyb20gQmVhbkluZm8gb3IKLQkgKiB0aGlzIGlzIGZyb20gcmVmbGVjdGlvbi4gVGhpcyBiZWNvbWVzIHRoZSBkZWZhdWx0IGxpc3QgYmFzZWQgdXBvbiB0aGUgbWV0aG9kCi0JICogd2UgYXJlIGF0dGFjaGVkIHRvLgotCSAqLwotCXByaXZhdGUgRUxpc3QgY3JlYXRlRGVmYXVsdFBhcm1zTGlzdCgpIHsKLQkJRUxpc3QgcGFybXNMaXN0ID0gdGhpcy5nZXRTZXJQYXJtRGVzYygpOwotCQlwYXJtc0xpc3QuY2xlYXIoKTsKLQkJCi0JCXNldEltcGxpY2l0bHlTZXRCaXRzKGdldEltcGxpY2l0bHlTZXRCaXRzKCl8TUVUSE9EX1BBUkFNRVRFUlNfREVGQVVMVCk7CS8vIE1hcmsgYXMgd2UgaW1wbGljaXRseSBmaWxsZWQgaXQgaW4uCi0JCUxpc3QgcCA9IGdldE1ldGhvZFBhcmFtZXRlcnMoKTsKLQkJaWYgKHAgPT0gbnVsbCkKLQkJCXJldHVybiBwYXJtc0xpc3Q7CS8vIENvdWxkbid0IGdldCB0aGUgbGlzdCBmb3Igc29tZSByZWFzb24sIHNvIGxlYXZlIGFzIGlzLgotCQlpbnQgcHNpemUgPSBwLnNpemUoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBzaXplOyBpKyspIHsKLQkJCVBhcmFtZXRlckRlY29yYXRvciBwZCA9IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFyYW1ldGVyRGVjb3JhdG9yKCk7Ci0JCQlKYXZhUGFyYW1ldGVyIGpwID0gKEphdmFQYXJhbWV0ZXIpIHAuZ2V0KGkpOwotCQkJcGQuc2V0TmFtZShqcC5nZXROYW1lKCkpOwotCQkJcGQuc2V0SW1wbGljaXRseVNldEJpdHMoUGFyYW1ldGVyRGVjb3JhdG9ySW1wbC5QQVJBTUVURVJfTkFNRV9JTVBMSUNJVCk7Ci0JCQlwZC5zZXRQYXJhbWV0ZXIoanApOwotCQkJcGFybXNMaXN0LmFkZChwZCk7Ci0JCX0KLQkJcmV0dXJuIHBhcm1zTGlzdDsKLQl9Ci0JCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBQYXJhbWV0ZXJEZWNvcmF0b3JzIHRvIGhvb2sgdXAgdGhlIEphdmFQYXJhbWV0ZXIgdGhleSBhcmUgZGVzY3JpYmluZy4KLQkgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIFBhcmFtZXRlckRlY29yYXRvciB3aGVuIGl0IGZpbmRzIHRoYXQgaXRzIEphdmFQYXJhbWV0ZXIgaGFzIG5vdCBiZWVuIHNldC4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgaXQgd2FzIGV4cGxpY2l0bHkgYWRkZWQgYW5kIHdlIG5lZWQgdG8gc2V0dXAgdGhlIHBhcm1zLgotCSAqIDxwPgotCSAqIE5vdGUgdGhpcyBhbiBpbnRlcm5hbCBtZXRob2QgZm9yIEJlYW5JbmZvLiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplUGFyYW1ldGVycygpIHsKLQkJaWYgKHRoaXMuc2VyUGFybURlc2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTGlzdCBtcCA9IGdldE1ldGhvZFBhcmFtZXRlcnMoKTsKLQkJaWYgKG1wLmlzRW1wdHkoKSkKLQkJCXJldHVybjsJLy8gTm90aGluZyB0aGF0IGNhbiBiZSBkZXNjcmliZWQuCi0JCWludCBwc2l6ZSA9IE1hdGgubWluKHRoaXMuc2VyUGFybURlc2Muc2l6ZSgpLCBtcC5zaXplKCkpOwotCQlmb3IgKGludCBpPTA7IGkgPCBwc2l6ZTsgaSsrKQotCQkJKChQYXJhbWV0ZXJEZWNvcmF0b3IpIHRoaXMuc2VyUGFybURlc2MuZ2V0KGkpKS5zZXRQYXJhbWV0ZXIoKEphdmFQYXJhbWV0ZXIpIG1wLmdldChpKSk7Ci0JfQotCi0KLQkvKgotCSAqIEdldCB0aGUgamVtIHBhcmFtZXRlcnMgZnJvbSB0aGUgbWV0aG9kIChqZW0gbWV0aG9kKQotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRNZXRob2RQYXJhbWV0ZXJzKCkgewotCQkvLyBHZXQgdGhlIG1ldGhvZAotCQlNZXRob2QgbSA9IG51bGw7Ci0JCU9iamVjdCBkID0gZ2V0RU1vZGVsRWxlbWVudCgpOwotCQlpZiAoZCBpbnN0YW5jZW9mIE1ldGhvZCkKLQkJCW0gPSAoTWV0aG9kKSBkOwotCQllbHNlIAotCQkJaWYgKGQgaW5zdGFuY2VvZiBNZXRob2RQcm94eSkKLQkJCQltID0gKChNZXRob2RQcm94eSkgZCkuZ2V0TWV0aG9kKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CS8vIE5vdCBkZWNvcmF0aW5nIGNvcnJlY3Qgb2JqZWN0LgotCQlpZiAobSA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CS8vIENvdWxkbid0IGZpbmQgdGhlIG1ldGhvZC4KLQkJTGlzdCBwID0gbS5nZXRQYXJhbWV0ZXJzKCk7Ci0JCXJldHVybiBwOwotCX0KLQkJCQotCQkJCi0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcm1zRXhwbGljaXRFbXB0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFBBUk1TX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciNnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCkgewotCQlpZiAoIWlzUGFybXNFeHBsaWNpdEVtcHR5KCkgJiYgZ2V0U2VyUGFybURlc2MoKS5pc0VtcHR5KCkgJiYgKGdldEltcGxpY2l0bHlTZXRCaXRzKCkmKE1FVEhPRF9QQVJBTUVURVJTX0lNUExJQ0lUIHwgTUVUSE9EX1BBUkFNRVRFUlNfREVGQVVMVCkpID09IDApIHsKLQkJCS8vIE5vdCBleHBsaWNpdGx5IGVtcHR5LCBpdCBpcyBlbXB0eSwgYW5kIHdlIGhhdmUgbm90IGltcGxpY2l0bHkgb3IgYnkgZGVmYXVsdHMgbWFkZSBpdCBlbXB0eSwgdGhlbiBjcmVhdGUgdGhlIGRlZmF1bHRzLgotCQkJY3JlYXRlRGVmYXVsdFBhcm1zTGlzdCgpOwotCQl9Ci0JCXJldHVybiBnZXRTZXJQYXJtRGVzYygpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnNHZW4oKSB7Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdQYXJhbWV0ZXIgRGVzY3JpcHRvcnMnIHJlZmVyZW5jZSBsaXN0Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTZXJQYXJtRGVzYygpIHsKLQkJaWYgKHNlclBhcm1EZXNjID09IG51bGwpIHsKLQkJCXNlclBhcm1EZXNjID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBhcmFtZXRlckRlY29yYXRvci5jbGFzcywgdGhpcywgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0MpOwotCQl9Ci0JCXJldHVybiBzZXJQYXJtRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXRhaWxzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0M6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VyUGFybURlc2MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVNT0RFTF9FTEVNRU5UX19FQU5OT1RBVElPTlMsIEVNb2RlbEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBnZXREZXRhaWxzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzRXhwZXJ0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc0hpZGRlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNQcmVmZXJyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiBpc01lcmdlSW50cm9zcGVjdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuIGlzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBnZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUk1TX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiBpc1Bhcm1zRXhwbGljaXRFbXB0eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUkFNRVRFUl9ERVNDUklQVE9SUzoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0M6Ci0JCQkJcmV0dXJuIGdldFNlclBhcm1EZXNjKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGV0YWlscygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlzZXRTaG9ydERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlzZXRFeHBlcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXNldEhpZGRlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJc2V0UHJlZmVycmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cygoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKEltcGxpY2l0SXRlbSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QQVJNU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRQYXJtc0V4cGxpY2l0RW1wdHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSQU1FVEVSX0RFU0NSSVBUT1JTOgotCQkJCWdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU0VSX1BBUk1fREVTQzoKLQkJCQlnZXRTZXJQYXJtRGVzYygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VyUGFybURlc2MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKFNPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQl1bnNldERpc3BsYXlOYW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJdW5zZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoQ0FURUdPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQl1bnNldEV4cGVydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQl1bnNldEhpZGRlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQl1bnNldFByZWZlcnJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSTVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0UGFybXNFeHBsaWNpdEVtcHR5KFBBUk1TX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QQVJBTUVURVJfREVTQ1JJUFRPUlM6Ci0JCQkJZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0M6Ci0JCQkJZ2V0U2VyUGFybURlc2MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgb3ZlcnJpZGRlbiBzbyB0aGF0IHdlIGNhbiBkbyBzcGVjaWFsIGlzIHNldCB0ZXN0czoKLQkgKiAxKSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnM6IGNoZWNrIGlmIHNlclBhcm1EZXNjIGV4aXN0cyBhbmQgbm90IGVtcHR5LCBzaW5jZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnMgaXMgZGVyaXZlZC4KLQkgKiAyKSBzZXJQYXJtRGVzYzogaWYgZmxhZyBzZXQgdG8gZGVmYXVsdCBwYXJtIGRlc2MsIHRoZW4gYW5zd2VyIG5vdCBzZXQsIGVsc2UgZG8gbm9ybWFsIGlzU2V0IHRlc3QuIFRoYXQgd2F5IGlmIHNldCBieSBkZWZhdWx0IGl0IHdvbid0IHNlcmlhbGl6ZQotCSAqICAgIG91dCB0aGUgdW5uZWVkZWQgZGVmYXVsdCBwYXJtcy4gVGhleSBjYW4gYmUgcmVjb25zdHJ1Y3RlZCBxdWlja2x5IHdoZW4gbmVlZGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJCXJldHVybiBpc1NvdXJjZVNldCgpOwkvLyBPdmVycmlkZSBzbyB0aGF0IGlmIHNldCB0byB0aGUgc2FtZSBhcyBjbGFzc25hbWUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBub3Qgc2V0LgotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSQU1FVEVSX0RFU0NSSVBUT1JTOgotCQkJCXJldHVybiBlSXNTZXRHZW4oQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2REZWNvcmF0b3JfU2VyUGFybURlc2MoKSk7CS8vIExldCBkZWZhdWx0IHNlclBhcm1EZXNjIGlzIHNldCB3b3JrLgotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU0VSX1BBUk1fREVTQzoKLQkJCQlpZiAoKGdldEltcGxpY2l0bHlTZXRCaXRzKCkgJiBNRVRIT0RfUEFSQU1FVEVSU19ERUZBVUxUKSAhPSAwKQotCQkJCQlyZXR1cm4gZmFsc2U7CS8vIE5vdCBjb25zaWRlcmVkIHNldCBpZiBpbml0aWFsaXplZCBieSBkZWZhdWx0LgotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGVJc1NldEdlbihlRmVhdHVyZSk7CS8vIE5vdCBzZXQgYnkgZGVmYXVsdCwgc28gY2hlY2sgdHJ1ZSBzZXR0aW5nLgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKGVGZWF0dXJlKTsJLy8gRXZlcnl0aGluZyBlbHNlIHVzZSB0aGUgZ2VuIG1ldGhvZC4KLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldEdlbihFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGRldGFpbHMgIT0gbnVsbCAmJiAhZGV0YWlscy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlcyAhPSBudWxsICYmICFyZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gaXNTZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGlzU2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIENBVEVHT1JZX0VERUZBVUxUID09IG51bGwgPyBjYXRlZ29yeSAhPSBudWxsIDogIUNBVEVHT1JZX0VERUZBVUxULmVxdWFscyhjYXRlZ29yeSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXhwZXJ0KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzU2V0SGlkZGVuKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UHJlZmVycmVkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDApICE9IE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBpbXBsaWNpdGx5U2V0Qml0cyAhPSBJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGltcGxpY2l0RGVjb3JhdG9yRmxhZyAhPSBJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QQVJNU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBQQVJNU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCkgIT0gUEFSTVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QQVJBTUVURVJfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuICFnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0M6Ci0JCQkJcmV0dXJuIHNlclBhcm1EZXNjICE9IG51bGwgJiYgIXNlclBhcm1EZXNjLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9NZXRob2RQcm94eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL01ldGhvZFByb3h5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGRlNzgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL01ldGhvZFByb3h5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBNZXRob2RQcm94eUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPcGVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQcm94eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuTWV0aG9kUHJveHlJbXBsI2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGNsYXNzIE1ldGhvZFByb3h5SW1wbCBleHRlbmRzIEVPcGVyYXRpb25JbXBsIGltcGxlbWVudHMgTWV0aG9kUHJveHkgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZCgpIDxlbT5NZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZCBtZXRob2QgPSBudWxsOwotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwkKLQlwcm90ZWN0ZWQgTWV0aG9kUHJveHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgewotCQlpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLmVJc1Byb3h5KCkpIHsKLQkJCU1ldGhvZCBvbGRNZXRob2QgPSBtZXRob2Q7Ci0JCQltZXRob2QgPSAoTWV0aG9kKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCltZXRob2QpOwotCQkJaWYgKG1ldGhvZCAhPSBvbGRNZXRob2QpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19NRVRIT0QsIG9sZE1ldGhvZCwgbWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGJhc2ljR2V0TWV0aG9kKCkgewotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChNZXRob2QgbmV3TWV0aG9kKSB7Ci0JCU1ldGhvZCBvbGRNZXRob2QgPSBtZXRob2Q7Ci0JCW1ldGhvZCA9IG5ld01ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTUVUSE9ELCBvbGRNZXRob2QsIG1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FQ09OVEFJTklOR19DTEFTUywgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FUEFSQU1FVEVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFUGFyYW1ldGVycygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUNPTlRBSU5JTkdfQ0xBU1MsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRVBBUkFNRVRFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVBhcmFtZXRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUywgRUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19PUkRFUkVEOgotCQkJCXJldHVybiBpc09yZGVyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX1VOSVFVRToKLQkJCQlyZXR1cm4gaXNVbmlxdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0xPV0VSX0JPVU5EOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRMb3dlckJvdW5kKCkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19VUFBFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VXBwZXJCb3VuZCgpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTUFOWToKLQkJCQlyZXR1cm4gaXNNYW55KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRVRZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVUeXBlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCXJldHVybiBnZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VQQVJBTUVURVJTOgotCQkJCXJldHVybiBnZXRFUGFyYW1ldGVycygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUV4Y2VwdGlvbnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TWV0aG9kKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fT1JERVJFRDoKLQkJCQlzZXRPcmRlcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX1VQUEVSX0JPVU5EOgotCQkJCXNldFVwcGVyQm91bmQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FUEFSQU1FVEVSUzoKLQkJCQlnZXRFUGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVBhcmFtZXRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUVYQ0VQVElPTlM6Ci0JCQkJZ2V0RUV4Y2VwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVFeGNlcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX01FVEhPRDoKLQkJCQlzZXRNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoT1JERVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKFVOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKExPV0VSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX1VQUEVSX0JPVU5EOgotCQkJCXNldFVwcGVyQm91bmQoVVBQRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRVRZUEU6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRVBBUkFNRVRFUlM6Ci0JCQkJZ2V0RVBhcmFtZXRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUVYQ0VQVElPTlM6Ci0JCQkJZ2V0RUV4Y2VwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTUVUSE9EOgotCQkJCXNldE1ldGhvZCgoTWV0aG9kKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX09SREVSRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgT1JERVJFRF9FRkxBRykgIT0gMCkgIT0gT1JERVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fVU5JUVVFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFVOSVFVRV9FRkxBRykgIT0gMCkgIT0gVU5JUVVFX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbG93ZXJCb3VuZCAhPSBMT1dFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX01BTlk6Ci0JCQkJcmV0dXJuIGlzTWFueSgpICE9IE1BTllfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VUWVBFOgotCQkJCXJldHVybiBlVHlwZSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VQQVJBTUVURVJTOgotCQkJCXJldHVybiBlUGFyYW1ldGVycyAhPSBudWxsICYmICFlUGFyYW1ldGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VFWENFUFRJT05TOgotCQkJCXJldHVybiBlRXhjZXB0aW9ucyAhPSBudWxsICYmICFlRXhjZXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX01FVEhPRDoKLQkJCQlyZXR1cm4gbWV0aG9kICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvUGFyYW1ldGVyRGVjb3JhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvUGFyYW1ldGVyRGVjb3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDMzNzE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL1BhcmFtZXRlckRlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQYXJhbWV0ZXJEZWNvcmF0b3JJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjExICQgICREYXRlOiAyMDA1LzA5LzE5IDE1OjQzOjAyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlBhcmFtZXRlckRlY29yYXRvckltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUGFyYW1ldGVyRGVjb3JhdG9ySW1wbCNnZXRQYXJhbWV0ZXIgPGVtPlBhcmFtZXRlcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRGVjb3JhdG9ySW1wbCBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgUGFyYW1ldGVyRGVjb3JhdG9yewotCQotCS8qKgotCSAqIEJpdHMgZm9yIGltcGxpY2l0bHkgc2V0IGZlYXR1cmVzLiBUaGlzIGlzIGludGVybmFsLCBub3QgbWVhbnQgZm9yIGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBBUkFNRVRFUl9OQU1FX0lNUExJQ0lUID0gMHgxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhcmFtZXRlckRlY29yYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFtZXRlckRlY29yYXRvcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlcigpIDxlbT5QYXJhbWV0ZXI8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEZsYWcgZm9yIGlmIHdlIHRyaWVkIHRvIGxpbmsgdXAgdGhpcyBwYXJhbWV0ZXIgdG8gamF2YSBwYXJtLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0cmllZE9uY2U7Ci0JCi0JLyoqCi0JICogVGhlIEphdmFQYXJhbWV0ZXIgdGhhdCB0aGlzIFBhcmFtZXRlckRlY29yYXRvciBpcyBkZWNvcmF0aW5nLgotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyIGdldFBhcmFtZXRlcigpIHsKLQkJaWYgKCFlSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbWV0ZXJEZWNvcmF0b3JfUGFyYW1ldGVyKCkpICYmICF0cmllZE9uY2UpIHsKLQkJCS8vIE5lZWQgdG8gdHJ5IHRvIGZpbGwgaW4gdGhlIHBhcmFtZXRlciBzZXR0aW5nLgotCQkJdHJpZWRPbmNlID0gdHJ1ZTsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gZUNvbnRhaW5lcigpOwkvLyBTZWUgaWYgd2UgYXJlIGluIGEgTWV0aG9kRGVjb3JhdG9yLgotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZERlY29yYXRvckltcGwpCi0JCQkJKChNZXRob2REZWNvcmF0b3JJbXBsKSBjb250YWluZXIpLmluaXRpYWxpemVQYXJhbWV0ZXJzKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRQYXJhbWV0ZXJHZW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyR2VuKCkgewotCQlpZiAocGFyYW1ldGVyICE9IG51bGwgJiYgcGFyYW1ldGVyLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFQYXJhbWV0ZXIgb2xkUGFyYW1ldGVyID0gcGFyYW1ldGVyOwotCQkJcGFyYW1ldGVyID0gKEphdmFQYXJhbWV0ZXIpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXBhcmFtZXRlcik7Ci0JCQlpZiAocGFyYW1ldGVyICE9IG9sZFBhcmFtZXRlcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QQVJBTUVURVIsIG9sZFBhcmFtZXRlciwgcGFyYW1ldGVyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVBhcmFtZXRlciBiYXNpY0dldFBhcmFtZXRlcigpIHsKLQkJcmV0dXJuIHBhcmFtZXRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoSmF2YVBhcmFtZXRlciBuZXdQYXJhbWV0ZXIpIHsKLQkJaWYgKG5ld1BhcmFtZXRlciA9PSBudWxsKQotCQkJdHJpZWRPbmNlID0gZmFsc2U7Ci0JCXNldFBhcmFtZXRlckdlbihuZXdQYXJhbWV0ZXIpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJHZW4oSmF2YVBhcmFtZXRlciBuZXdQYXJhbWV0ZXIpIHsKLQkJSmF2YVBhcmFtZXRlciBvbGRQYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7Ci0JCXBhcmFtZXRlciA9IG5ld1BhcmFtZXRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BBUkFNRVRFUiwgb2xkUGFyYW1ldGVyLCBwYXJhbWV0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXRhaWxzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVNT0RFTF9FTEVNRU5UX19FQU5OT1RBVElPTlMsIEVNb2RlbEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBnZXREZXRhaWxzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzRXhwZXJ0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc0hpZGRlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNQcmVmZXJyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiBpc01lcmdlSW50cm9zcGVjdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuIGlzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBnZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BBUkFNRVRFUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFBhcmFtZXRlcigpOwotCQkJCXJldHVybiBiYXNpY0dldFBhcmFtZXRlcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCWdldERldGFpbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJc2V0U2hvcnREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJc2V0RXhwZXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlzZXRIaWRkZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXNldFByZWZlcnJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKChJbXBsaWNpdEl0ZW0pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BBUkFNRVRFUjoKLQkJCQlzZXRQYXJhbWV0ZXIoKEphdmFQYXJhbWV0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKFNPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQl1bnNldERpc3BsYXlOYW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJdW5zZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoQ0FURUdPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQl1bnNldEV4cGVydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQl1bnNldEhpZGRlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQl1bnNldFByZWZlcnJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BBUkFNRVRFUjoKLQkJCQlzZXRQYXJhbWV0ZXIoKEphdmFQYXJhbWV0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0I2VJc1NldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU291cmNlU2V0KCk7CS8vIE92ZXJyaWRlIHNvIHRoYXQgaWYgc2V0IHRvIHRoZSBzYW1lIGFzIGNsYXNzbmFtZSwgdGhlbiBpdCBpcyBjb25zaWRlcmVkIG5vdCBzZXQuCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBlSXNTZXRHZW4oZUZlYXR1cmUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0R2VuKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIFNPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gc291cmNlICE9IG51bGwgOiAhU09VUkNFX0VERUZBVUxULmVxdWFscyhzb3VyY2UpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZGV0YWlscyAhPSBudWxsICYmICFkZXRhaWxzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBjb250ZW50cyAhPSBudWxsICYmICFjb250ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiByZWZlcmVuY2VzICE9IG51bGwgJiYgIXJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBpc1NldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gaXNTZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gQ0FURUdPUllfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGVnb3J5ICE9IG51bGwgOiAhQ0FURUdPUllfRURFRkFVTFQuZXF1YWxzKGNhdGVnb3J5KTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNTZXRFeHBlcnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNTZXRIaWRkZW4oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNTZXRQcmVmZXJyZWQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMCkgIT0gTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCkgIT0gQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIGltcGxpY2l0bHlTZXRCaXRzICE9IElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gaW1wbGljaXREZWNvcmF0b3JGbGFnICE9IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BBUkFNRVRFUjoKLQkJCQlyZXR1cm4gcGFyYW1ldGVyICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvUHJvcGVydHlEZWNvcmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9Qcm9wZXJ0eURlY29yYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1MzBjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9Qcm9wZXJ0eURlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xOCAkICAkRGF0ZTogMjAwNS8wOS8xOSAxNTo0MzowMiAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5IERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUHJvcGVydHlEZWNvcmF0b3JJbXBsI2lzQm91bmQgPGVtPkJvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwjaXNDb25zdHJhaW5lZCA8ZW0+Q29uc3RyYWluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlByb3BlcnR5RGVjb3JhdG9ySW1wbCNpc0Rlc2lnblRpbWUgPGVtPkRlc2lnbiBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwjaXNBbHdheXNJbmNvbXBhdGlibGUgPGVtPkFsd2F5cyBJbmNvbXBhdGlibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlByb3BlcnR5RGVjb3JhdG9ySW1wbCNnZXRGaWx0ZXJGbGFncyA8ZW0+RmlsdGVyIEZsYWdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwjaXNGaWVsZFJlYWRPbmx5IDxlbT5GaWVsZCBSZWFkIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlByb3BlcnR5RGVjb3JhdG9ySW1wbCNnZXRQcm9wZXJ0eUVkaXRvckNsYXNzIDxlbT5Qcm9wZXJ0eSBFZGl0b3IgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlByb3BlcnR5RGVjb3JhdG9ySW1wbCNnZXRSZWFkTWV0aG9kIDxlbT5SZWFkIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUHJvcGVydHlEZWNvcmF0b3JJbXBsI2dldFdyaXRlTWV0aG9kIDxlbT5Xcml0ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlByb3BlcnR5RGVjb3JhdG9ySW1wbCNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZWNvcmF0b3JJbXBsIGV4dGVuZHMgRmVhdHVyZURlY29yYXRvckltcGwgaW1wbGVtZW50cyBQcm9wZXJ0eURlY29yYXRvcnsKLQotCS8qKgotCSAqIEJpdHMgZm9yIGltcGxpY2l0bHkgc2V0IGZlYXR1cmVzLiBUaGlzIGlzIGludGVybmFsLCBub3QgbWVhbnQgZm9yIGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBST1BFUlRZX0VESVRPUl9DTEFTU19JTVBMSUNJVCA9IDB4MUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBST1BFUlRZX1RZUEVfSU1QTElDSVQgPSAweDJMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQUk9QRVJUWV9SRUFETUVUSE9EX0lNUExJQ0lUID0gMHg0TDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUFJPUEVSVFlfV1JJVEVNRVRIT0RfSU1QTElDSVQgPSAweDhMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQUk9QRVJUWV9CT1VORF9JTVBMSUNJVCA9IDB4MTBMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQUk9QRVJUWV9DT05TVFJBSU5FRF9JTVBMSUNJVCA9IDB4MjBMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQUk9QRVJUWV9ERVNJR05USU1FX0lNUExJQ0lUID0gMHg0MEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBST1BFUlRZX0ZJRUxEX0lNUExJQ0lUID0gMHg4MEw7Ci0JCi0JCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQm91bmQoKSA8ZW0+Qm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBCT1VORF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNCb3VuZCgpIDxlbT5Cb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNCb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQk9VTkRfRUZMQUcgPSAxIDw8IDE4OwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIEJvdW5kIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBCT1VORF9FU0VURkxBRyA9IDEgPDwgMTk7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25zdHJhaW5lZCgpIDxlbT5Db25zdHJhaW5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25zdHJhaW5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTlNUUkFJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NvbnN0cmFpbmVkKCkgPGVtPkNvbnN0cmFpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NvbnN0cmFpbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05TVFJBSU5FRF9FRkxBRyA9IDEgPDwgMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgQ29uc3RyYWluZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTlNUUkFJTkVEX0VTRVRGTEFHID0gMSA8PCAyMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Rlc2lnblRpbWUoKSA8ZW0+RGVzaWduIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGVzaWduVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFU0lHTl9USU1FX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Rlc2lnblRpbWUoKSA8ZW0+RGVzaWduIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGVzaWduVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVTSUdOX1RJTUVfRUZMQUcgPSAxIDw8IDIyOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIERlc2lnbiBUaW1lIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERVNJR05fVElNRV9FU0VURkxBRyA9IDEgPDwgMjM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBbHdheXNJbmNvbXBhdGlibGUoKSA8ZW0+QWx3YXlzIEluY29tcGF0aWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBbHdheXNJbmNvbXBhdGlibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBTFdBWVNfSU5DT01QQVRJQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Fsd2F5c0luY29tcGF0aWJsZSgpIDxlbT5BbHdheXMgSW5jb21wYXRpYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Fsd2F5c0luY29tcGF0aWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRyA9IDEgPDwgMjQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWx0ZXJGbGFncygpIDxlbT5GaWx0ZXIgRmxhZ3M8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsdGVyRmxhZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmaWx0ZXJGbGFncyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmllbGRSZWFkT25seSgpIDxlbT5GaWVsZCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmllbGRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJRUxEX1JFQURfT05MWV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaWVsZFJlYWRPbmx5KCkgPGVtPkZpZWxkIFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaWVsZFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSUVMRF9SRUFEX09OTFlfRUZMQUcgPSAxIDw8IDI1OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpIDxlbT5Qcm9wZXJ0eSBFZGl0b3IgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnR5RWRpdG9yQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgcHJvcGVydHlFZGl0b3JDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZE1ldGhvZCgpIDxlbT5SZWFkIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhZE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZCByZWFkTWV0aG9kID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgUmVhZCBNZXRob2QgcmVmZXJlbmNlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJFQURfTUVUSE9EX0VTRVRGTEFHID0gMSA8PCAyNjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdyaXRlTWV0aG9kKCkgPGVtPldyaXRlIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3JpdGVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2Qgd3JpdGVNZXRob2QgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBXcml0ZSBNZXRob2QgcmVmZXJlbmNlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdSSVRFX01FVEhPRF9FU0VURkxBRyA9IDEgPDwgMjc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZCgpIDxlbT5GaWVsZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGaWVsZCBmaWVsZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgRmllbGQgcmVmZXJlbmNlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0VTRVRGTEFHID0gMSA8PCAyODsKLQotCS8qKgotCSAqIFRoaXMgaXQgdGhlIHByb3BlcnR5IHR5cGUuIElmIG51bGwsIHRoZW4gaXQgd2lsbAotCSAqIHF1ZXJ5IGFnYWluc3QgbW9kZWwgZWxlbWVudCBvd25lci4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzaWZpZXIgcHJvcGVydHlUeXBlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCQotCXByb3RlY3RlZCBQcm9wZXJ0eURlY29yYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldFByb3BlcnR5RGVjb3JhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCb3VuZCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBCT1VORF9FRkxBRykgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0UHJvcGVydHlUeXBlKCkgewotCQlpZiAocHJvcGVydHlUeXBlID09IG51bGwpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZ2V0RU1vZGVsRWxlbWVudCgpOwotCQkJcmV0dXJuIChmZWF0dXJlICE9IG51bGwpID8gZmVhdHVyZS5nZXRFVHlwZSgpIDogbnVsbDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gcHJvcGVydHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VHlwZShFQ2xhc3NpZmllciBwcm9wZXJ0eVR5cGUpIHsKLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvdW5kKGJvb2xlYW4gbmV3Qm91bmQpIHsKLQkJYm9vbGVhbiBvbGRCb3VuZCA9IChlRmxhZ3MgJiBCT1VORF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0JvdW5kKSBlRmxhZ3MgfD0gQk9VTkRfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5CT1VORF9FRkxBRzsKLQkJYm9vbGVhbiBvbGRCb3VuZEVTZXQgPSAoZUZsYWdzICYgQk9VTkRfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBCT1VORF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQsIG9sZEJvdW5kLCBuZXdCb3VuZCwgIW9sZEJvdW5kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Qm91bmQoKSB7Ci0JCWJvb2xlYW4gb2xkQm91bmQgPSAoZUZsYWdzICYgQk9VTkRfRUZMQUcpICE9IDA7Ci0JCWJvb2xlYW4gb2xkQm91bmRFU2V0ID0gKGVGbGFncyAmIEJPVU5EX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoQk9VTkRfRURFRkFVTFQpIGVGbGFncyB8PSBCT1VORF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkJPVU5EX0VGTEFHOwotCQllRmxhZ3MgJj0gfkJPVU5EX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5ELCBvbGRCb3VuZCwgQk9VTkRfRURFRkFVTFQsIG9sZEJvdW5kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Qm91bmQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQk9VTkRfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25zdHJhaW5lZCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBDT05TVFJBSU5FRF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW5lZChib29sZWFuIG5ld0NvbnN0cmFpbmVkKSB7Ci0JCWJvb2xlYW4gb2xkQ29uc3RyYWluZWQgPSAoZUZsYWdzICYgQ09OU1RSQUlORURfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdDb25zdHJhaW5lZCkgZUZsYWdzIHw9IENPTlNUUkFJTkVEX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Q09OU1RSQUlORURfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkQ29uc3RyYWluZWRFU2V0ID0gKGVGbGFncyAmIENPTlNUUkFJTkVEX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gQ09OU1RSQUlORURfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVELCBvbGRDb25zdHJhaW5lZCwgbmV3Q29uc3RyYWluZWQsICFvbGRDb25zdHJhaW5lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENvbnN0cmFpbmVkKCkgewotCQlib29sZWFuIG9sZENvbnN0cmFpbmVkID0gKGVGbGFncyAmIENPTlNUUkFJTkVEX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZENvbnN0cmFpbmVkRVNldCA9IChlRmxhZ3MgJiBDT05TVFJBSU5FRF9FU0VURkxBRykgIT0gMDsKLQkJaWYgKENPTlNUUkFJTkVEX0VERUZBVUxUKSBlRmxhZ3MgfD0gQ09OU1RSQUlORURfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5DT05TVFJBSU5FRF9FRkxBRzsKLQkJZUZsYWdzICY9IH5DT05TVFJBSU5FRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRCwgb2xkQ29uc3RyYWluZWQsIENPTlNUUkFJTkVEX0VERUZBVUxULCBvbGRDb25zdHJhaW5lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENvbnN0cmFpbmVkKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIENPTlNUUkFJTkVEX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVzaWduVGltZSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBERVNJR05fVElNRV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNpZ25UaW1lKGJvb2xlYW4gbmV3RGVzaWduVGltZSkgewotCQlib29sZWFuIG9sZERlc2lnblRpbWUgPSAoZUZsYWdzICYgREVTSUdOX1RJTUVfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdEZXNpZ25UaW1lKSBlRmxhZ3MgfD0gREVTSUdOX1RJTUVfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5ERVNJR05fVElNRV9FRkxBRzsKLQkJYm9vbGVhbiBvbGREZXNpZ25UaW1lRVNldCA9IChlRmxhZ3MgJiBERVNJR05fVElNRV9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IERFU0lHTl9USU1FX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRSwgb2xkRGVzaWduVGltZSwgbmV3RGVzaWduVGltZSwgIW9sZERlc2lnblRpbWVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZXNpZ25UaW1lKCkgewotCQlib29sZWFuIG9sZERlc2lnblRpbWUgPSAoZUZsYWdzICYgREVTSUdOX1RJTUVfRUZMQUcpICE9IDA7Ci0JCWJvb2xlYW4gb2xkRGVzaWduVGltZUVTZXQgPSAoZUZsYWdzICYgREVTSUdOX1RJTUVfRVNFVEZMQUcpICE9IDA7Ci0JCWlmIChERVNJR05fVElNRV9FREVGQVVMVCkgZUZsYWdzIHw9IERFU0lHTl9USU1FX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+REVTSUdOX1RJTUVfRUZMQUc7Ci0JCWVGbGFncyAmPSB+REVTSUdOX1RJTUVfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUUsIG9sZERlc2lnblRpbWUsIERFU0lHTl9USU1FX0VERUZBVUxULCBvbGREZXNpZ25UaW1lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGVzaWduVGltZSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBERVNJR05fVElNRV9FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fsd2F5c0luY29tcGF0aWJsZSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBBTFdBWVNfSU5DT01QQVRJQkxFX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsd2F5c0luY29tcGF0aWJsZShib29sZWFuIG5ld0Fsd2F5c0luY29tcGF0aWJsZSkgewotCQlib29sZWFuIG9sZEFsd2F5c0luY29tcGF0aWJsZSA9IChlRmxhZ3MgJiBBTFdBWVNfSU5DT01QQVRJQkxFX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3QWx3YXlzSW5jb21wYXRpYmxlKSBlRmxhZ3MgfD0gQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkFMV0FZU19JTkNPTVBBVElCTEVfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEUsIG9sZEFsd2F5c0luY29tcGF0aWJsZSwgbmV3QWx3YXlzSW5jb21wYXRpYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpbHRlckZsYWdzKCkgewotCQlpZiAoZmlsdGVyRmxhZ3MgPT0gbnVsbCkgewotCQkJZmlsdGVyRmxhZ3MgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1MpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJGbGFnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkUmVhZE9ubHkoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklFTERfUkVBRF9PTkxZX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkUmVhZE9ubHkoYm9vbGVhbiBuZXdGaWVsZFJlYWRPbmx5KSB7Ci0JCWJvb2xlYW4gb2xkRmllbGRSZWFkT25seSA9IChlRmxhZ3MgJiBGSUVMRF9SRUFEX09OTFlfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaWVsZFJlYWRPbmx5KSBlRmxhZ3MgfD0gRklFTERfUkVBRF9PTkxZX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklFTERfUkVBRF9PTkxZX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFksIG9sZEZpZWxkUmVhZE9ubHksIG5ld0ZpZWxkUmVhZE9ubHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSB7Ci0JCWlmIChwcm9wZXJ0eUVkaXRvckNsYXNzICE9IG51bGwgJiYgcHJvcGVydHlFZGl0b3JDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkUHJvcGVydHlFZGl0b3JDbGFzcyA9IHByb3BlcnR5RWRpdG9yQ2xhc3M7Ci0JCQlwcm9wZXJ0eUVkaXRvckNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcHJvcGVydHlFZGl0b3JDbGFzcyk7Ci0JCQlpZiAocHJvcGVydHlFZGl0b3JDbGFzcyAhPSBvbGRQcm9wZXJ0eUVkaXRvckNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTLCBvbGRQcm9wZXJ0eUVkaXRvckNsYXNzLCBwcm9wZXJ0eUVkaXRvckNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5RWRpdG9yQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlFZGl0b3JDbGFzcyhKYXZhQ2xhc3MgbmV3UHJvcGVydHlFZGl0b3JDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkUHJvcGVydHlFZGl0b3JDbGFzcyA9IHByb3BlcnR5RWRpdG9yQ2xhc3M7Ci0JCXByb3BlcnR5RWRpdG9yQ2xhc3MgPSBuZXdQcm9wZXJ0eUVkaXRvckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1MsIG9sZFByb3BlcnR5RWRpdG9yQ2xhc3MsIHByb3BlcnR5RWRpdG9yQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldFJlYWRNZXRob2QoKSB7Ci0JCWlmIChyZWFkTWV0aG9kICE9IG51bGwgJiYgcmVhZE1ldGhvZC5lSXNQcm94eSgpKSB7Ci0JCQlNZXRob2Qgb2xkUmVhZE1ldGhvZCA9IHJlYWRNZXRob2Q7Ci0JCQlyZWFkTWV0aG9kID0gKE1ldGhvZCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcmVhZE1ldGhvZCk7Ci0JCQlpZiAocmVhZE1ldGhvZCAhPSBvbGRSZWFkTWV0aG9kKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0QsIG9sZFJlYWRNZXRob2QsIHJlYWRNZXRob2QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVhZE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkTWV0aG9kKE1ldGhvZCBuZXdSZWFkTWV0aG9kKSB7Ci0JCU1ldGhvZCBvbGRSZWFkTWV0aG9kID0gcmVhZE1ldGhvZDsKLQkJcmVhZE1ldGhvZCA9IG5ld1JlYWRNZXRob2Q7Ci0JCWJvb2xlYW4gb2xkUmVhZE1ldGhvZEVTZXQgPSAoZUZsYWdzICYgUkVBRF9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBSRUFEX01FVEhPRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0QsIG9sZFJlYWRNZXRob2QsIHJlYWRNZXRob2QsICFvbGRSZWFkTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVhZE1ldGhvZCgpIHsKLQkJTWV0aG9kIG9sZFJlYWRNZXRob2QgPSByZWFkTWV0aG9kOwotCQlib29sZWFuIG9sZFJlYWRNZXRob2RFU2V0ID0gKGVGbGFncyAmIFJFQURfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQlyZWFkTWV0aG9kID0gbnVsbDsKLQkJZUZsYWdzICY9IH5SRUFEX01FVEhPRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRCwgb2xkUmVhZE1ldGhvZCwgbnVsbCwgb2xkUmVhZE1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlYWRNZXRob2QoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgUkVBRF9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRXcml0ZU1ldGhvZCgpIHsKLQkJaWYgKHdyaXRlTWV0aG9kICE9IG51bGwgJiYgd3JpdGVNZXRob2QuZUlzUHJveHkoKSkgewotCQkJTWV0aG9kIG9sZFdyaXRlTWV0aG9kID0gd3JpdGVNZXRob2Q7Ci0JCQl3cml0ZU1ldGhvZCA9IChNZXRob2QpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXdyaXRlTWV0aG9kKTsKLQkJCWlmICh3cml0ZU1ldGhvZCAhPSBvbGRXcml0ZU1ldGhvZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRCwgb2xkV3JpdGVNZXRob2QsIHdyaXRlTWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdyaXRlTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdyaXRlTWV0aG9kKE1ldGhvZCBuZXdXcml0ZU1ldGhvZCkgewotCQlNZXRob2Qgb2xkV3JpdGVNZXRob2QgPSB3cml0ZU1ldGhvZDsKLQkJd3JpdGVNZXRob2QgPSBuZXdXcml0ZU1ldGhvZDsKLQkJYm9vbGVhbiBvbGRXcml0ZU1ldGhvZEVTZXQgPSAoZUZsYWdzICYgV1JJVEVfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gV1JJVEVfTUVUSE9EX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0QsIG9sZFdyaXRlTWV0aG9kLCB3cml0ZU1ldGhvZCwgIW9sZFdyaXRlTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0V3JpdGVNZXRob2QoKSB7Ci0JCU1ldGhvZCBvbGRXcml0ZU1ldGhvZCA9IHdyaXRlTWV0aG9kOwotCQlib29sZWFuIG9sZFdyaXRlTWV0aG9kRVNldCA9IChlRmxhZ3MgJiBXUklURV9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JCXdyaXRlTWV0aG9kID0gbnVsbDsKLQkJZUZsYWdzICY9IH5XUklURV9NRVRIT0RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9ELCBvbGRXcml0ZU1ldGhvZCwgbnVsbCwgb2xkV3JpdGVNZXRob2RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXcml0ZU1ldGhvZCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBXUklURV9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkKCkgewotCQlpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5lSXNQcm94eSgpKSB7Ci0JCQlGaWVsZCBvbGRGaWVsZCA9IGZpZWxkOwotCQkJZmllbGQgPSAoRmllbGQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWZpZWxkKTsKLQkJCWlmIChmaWVsZCAhPSBvbGRGaWVsZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxELCBvbGRGaWVsZCwgZmllbGQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZpZWxkIGJhc2ljR2V0RmllbGQoKSB7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZChGaWVsZCBuZXdGaWVsZCkgewotCQlGaWVsZCBvbGRGaWVsZCA9IGZpZWxkOwotCQlmaWVsZCA9IG5ld0ZpZWxkOwotCQlib29sZWFuIG9sZEZpZWxkRVNldCA9IChlRmxhZ3MgJiBGSUVMRF9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IEZJRUxEX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRCwgb2xkRmllbGQsIGZpZWxkLCAhb2xkRmllbGRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRGaWVsZCgpIHsKLQkJRmllbGQgb2xkRmllbGQgPSBmaWVsZDsKLQkJYm9vbGVhbiBvbGRGaWVsZEVTZXQgPSAoZUZsYWdzICYgRklFTERfRVNFVEZMQUcpICE9IDA7Ci0JCWZpZWxkID0gbnVsbDsKLQkJZUZsYWdzICY9IH5GSUVMRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRCwgb2xkRmllbGQsIG51bGwsIG9sZEZpZWxkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RmllbGQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklFTERfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJvdW5kOiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBCT1VORF9FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgQk9VTkRfRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25zdHJhaW5lZDogIik7Ci0JCWlmICgoZUZsYWdzICYgQ09OU1RSQUlORURfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIENPTlNUUkFJTkVEX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzaWduVGltZTogIik7Ci0JCWlmICgoZUZsYWdzICYgREVTSUdOX1RJTUVfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIERFU0lHTl9USU1FX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWx3YXlzSW5jb21wYXRpYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmlsdGVyRmxhZ3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbHRlckZsYWdzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZFJlYWRPbmx5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgRklFTERfUkVBRF9PTkxZX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eUVkaXRvckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgYmFzaWNHZXRSZWFkTWV0aG9kKCkgewotCQlyZXR1cm4gcmVhZE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGJhc2ljR2V0V3JpdGVNZXRob2QoKSB7Ci0JCXJldHVybiB3cml0ZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGV0YWlscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRU1PREVMX0VMRU1FTlRfX0VBTk5PVEFUSU9OUywgRU1vZGVsRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGdldERldGFpbHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc0hpZGRlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1ByZWZlcnJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuIGlzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldEltcGxpY2l0bHlTZXRCaXRzKCkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJcmV0dXJuIGlzQm91bmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVEOgotCQkJCXJldHVybiBpc0NvbnN0cmFpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRToKLQkJCQlyZXR1cm4gaXNEZXNpZ25UaW1lKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXJldHVybiBpc0Fsd2F5c0luY29tcGF0aWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTOgotCQkJCXJldHVybiBnZXRGaWx0ZXJGbGFncygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIGlzRmllbGRSZWFkT25seSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldFByb3BlcnR5RWRpdG9yQ2xhc3MoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZWFkTWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UmVhZE1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRXcml0ZU1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldFdyaXRlTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RmllbGQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRGaWVsZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCWdldERldGFpbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXNldFNob3J0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlzZXRFeHBlcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ISURERU46Ci0JCQkJc2V0SGlkZGVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXNldFByZWZlcnJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKEltcGxpY2l0SXRlbSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJc2V0Qm91bmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRDoKLQkJCQlzZXRDb25zdHJhaW5lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FOgotCQkJCXNldERlc2lnblRpbWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXNldEFsd2F5c0luY29tcGF0aWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlnZXRGaWx0ZXJGbGFncygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsdGVyRmxhZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZOgotCQkJCXNldEZpZWxkUmVhZE9ubHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1M6Ci0JCQkJc2V0UHJvcGVydHlFZGl0b3JDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCXNldFJlYWRNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0Q6Ci0JCQkJc2V0V3JpdGVNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRDoKLQkJCQlzZXRGaWVsZCgoRmllbGQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXVuc2V0RGlzcGxheU5hbWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoQ0FURUdPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXVuc2V0RXhwZXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQl1bnNldFByZWZlcnJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJdW5zZXRCb3VuZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQ6Ci0JCQkJdW5zZXRDb25zdHJhaW5lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUU6Ci0JCQkJdW5zZXREZXNpZ25UaW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXNldEFsd2F5c0luY29tcGF0aWJsZShBTFdBWVNfSU5DT01QQVRJQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlnZXRGaWx0ZXJGbGFncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFk6Ci0JCQkJc2V0RmllbGRSZWFkT25seShGSUVMRF9SRUFEX09OTFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCXNldFByb3BlcnR5RWRpdG9yQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCXVuc2V0UmVhZE1ldGhvZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCXVuc2V0V3JpdGVNZXRob2QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCXVuc2V0RmllbGQoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QjZUlzU2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBpc1NvdXJjZVNldCgpOwkvLyBPdmVycmlkZSBzbyB0aGF0IGlmIHNldCB0byB0aGUgc2FtZSBhcyBjbGFzc25hbWUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBub3Qgc2V0LgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKGVGZWF0dXJlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldEdlbihFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGRldGFpbHMgIT0gbnVsbCAmJiAhZGV0YWlscy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlcyAhPSBudWxsICYmICFyZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBpc1NldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBpc1NldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIENBVEVHT1JZX0VERUZBVUxUID09IG51bGwgPyBjYXRlZ29yeSAhPSBudWxsIDogIUNBVEVHT1JZX0VERUZBVUxULmVxdWFscyhjYXRlZ29yeSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNTZXRFeHBlcnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc1NldEhpZGRlbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UHJlZmVycmVkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMCkgIT0gTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBpbXBsaWNpdGx5U2V0Qml0cyAhPSBJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gaW1wbGljaXREZWNvcmF0b3JGbGFnICE9IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORDoKLQkJCQlyZXR1cm4gaXNTZXRCb3VuZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRDoKLQkJCQlyZXR1cm4gaXNTZXRDb25zdHJhaW5lZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRToKLQkJCQlyZXR1cm4gaXNTZXREZXNpZ25UaW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRykgIT0gMCkgIT0gQUxXQVlTX0lOQ09NUEFUSUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTOgotCQkJCXJldHVybiBmaWx0ZXJGbGFncyAhPSBudWxsICYmICFmaWx0ZXJGbGFncy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSUVMRF9SRUFEX09OTFlfRUZMQUcpICE9IDApICE9IEZJRUxEX1JFQURfT05MWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCXJldHVybiBwcm9wZXJ0eUVkaXRvckNsYXNzICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCXJldHVybiBpc1NldFJlYWRNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCXJldHVybiBpc1NldFdyaXRlTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCXJldHVybiBpc1NldEZpZWxkKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc1dyaXRlYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoKSB7Ci0JCXJldHVybiBnZXRXcml0ZU1ldGhvZCgpICE9IG51bGwgfHwgKGdldEZpZWxkKCkgIT0gbnVsbCAmJiAhaXNGaWVsZFJlYWRPbmx5KCkpOyAKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzUmVhZGFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoKSB7Ci0JCXJldHVybiBnZXRSZWFkTWV0aG9kKCkgIT0gbnVsbCB8fCBnZXRGaWVsZCgpICE9IG51bGw7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vY29tbW9uL0lCYXNlQmVhbkluZm9Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby9jb21tb24vSUJhc2VCZWFuSW5mb0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWYwNDdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby9jb21tb24vSUJhc2VCZWFuSW5mb0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUJhc2VCZWFuSW5mb0NvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzEwLzE4IDE1OjMyOjE5ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmNvbW1vbjsKLQotIAotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgdGhlIEJhc2VCZWFuSW5mbyBmb3IgYXJndW1lbnRzLiBUaGlzIGNsYXNzIGlzIGNvbW1vbiBiZXR3ZWVuCi0gKiB0aGUgSURFIGFuZCB0aGUgcmVtb3RlIHZtIHNvIHRoYXQgdGhlc2UgY29uc3RhbnRzIGNhbiBiZSB1c2VkIG9uIGJvdGggc2lkZXMuCi0gKiA8cD4KLSAqIFRoZXNlIGFyZSBjb25zdGFudHMgdXNlZCBpbiBGZWF0dXJlQXR0cmlidXRlcyBhcyBrZXlzLiBUaGUgb3RoZXIgc3BlY2lhbAotICogY29uc3RhbnRzIHRoYXQgYXJlIG5vdCBrZXlzIGluIEZlYXR1cmVBdHRyaWJ1dGVzIGFyZSBsZWZ0IGluIEJhc2VCZWFuSW5mbwotICogc2luY2UgdGhleSBhcmUgbm90IG5lZWRlZCBvbiBib3RoIHNpZGVzLgotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmFzZUJlYW5JbmZvQ29uc3RhbnRzIHsKLQotCS8qKgotCSAqIEluZGljYXRvciB1c2VkIHRvIGRlc2NyaWJlIGEgZmFjdG9yeSBpbnN0YW50aWF0aW9uIHBhdHRlcm4uICBOb3QgQVBJIGFzIHdpbGwgY2hhbmdlIHRvIGJlY29tZSBtb3JlIGV4dGVuc2libGUgCi0JICogdmlhIC5vdmVycmlkZSBtZWNoYW5pc20gaW4gZnV0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NSRUFUSU9OID0gIkZBQ1RPUllfQ1JFQVRJT04iOy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDYXRlZ29yeSBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4gQ2F0ZWdvcnkgaXMgYSBwcmUtZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZSB0b28uIFRoYXQgaXMgd2hlcmUgdGhlIGNhdGVnb3J5IGlzIHN0b3JlZCBpbiBhCi0JICogZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBFbnVtZXJhdGlvbiB2YWx1ZXMgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuIEVudW1lcmF0aW9uIHZhbHVlcyBpcyBhIHByZS1kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lIHRvby4gVGhhdCBpcyB3aGVyZSB0aGUKLQkgKiBlbnVtZXJhdGlvbiB2YWx1ZXMgYXJlIHN0b3JlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNRVJBVElPTlZBTFVFUyA9ICJlbnVtZXJhdGlvblZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCQotCS8vIFRoZSBrZXlzIGZvciBpY29uIGZpbGUgbmFtZXMsIE5PVCBUSEUgamF2YS5hd3QuaWNvbiBrZXkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTkNPTE9SMTZYMTZVUkwgPSAiSUNPTl9DT0xPUl8xNngxNl9VUkwiOyAvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05DT0xPUjMyWDMyVVJMID0gIklDT05fQ09MT1JfMzJ4MzJfVVJMIjsgLy8kTk9OLU5MUy0xJCAgICAgCS8vIE5vdCB1c2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTk1PTk8xNlgxNlVSTCA9ICJJQ09OX01PTk9fMTZ4MTZfVVJMIjsgLy8kTk9OLU5MUy0xJCAgICAgICAgCS8vIE5vdCB1c2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTk1PTk8zMlgzMlVSTCA9ICJJQ09OX01PTk9fMzJ4MzJfVVJMIjsgLy8kTk9OLU5MUy0xJAkJCS8vIE5vdCB1c2VkCi0KLQotCS8qKgotCSAqIEZlYXR1cmVBdHRyaWJ1dGUga2V5IGZvciBleHBsaWNpdCBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgdmFsdWUgaXMgYSBCb29sZWFuLiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGluZGljYXRlcyB0aGF0IHRoZSBDdXN0b21pemUgQmVhbiBjdXN0b21pemVyIHN1cHBsaWVkIGJ5IHRoZSBCZWFuSW5mbyB3aWxsIGluZGljYXRlIHdoaWNoCi0JICogcHJvcGVydGllcyBpdCBoYXMgY2hhbmdlZCB0aHJvdWdoIGZpcmluZyB7QGxpbmsgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50fSBpbnN0ZWFkIG9mIHRoZSAKLQkgKiBWaXN1YWwgRWRpdG9yIGF1dG9tYXRpY2FsbHkgdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpZiBub3Qgc2V0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUExJQ0lUX1BST1BFUlRZX0NIQU5HRSA9ICJFWFBMSUNJVF9QUk9QRVJUWV9DSEFOR0UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVc2VkIGJ5IFZpc3VhbCBFZGl0b3IgYXMgZmVhdHVyZSBhdHRyaWJ1dGUga2V5L3ZhbHVlIHRvIGluZGljYXRlIHRoYXQgaXQgbXVzdCBjcmVhdGUgYW4gaW1wbGljaXQgc2V0dGluZyBvZiBhIHByb3BlcnR5KHMpLgotCSAqIEZvciBleGFtcGxlIHtAbGluayBqYXZheC5zd2luZy5KRnJhbWUjZ2V0Q29udGVudFBhbmUoKX0uIFRoZXJlIG11c3QgYmUgYSBjb250ZW50IHBhbmUKLQkgKiBzZXQgaW4gdGhlIFZFIG1vZGVsIHNvIHRoYXQgdXNlcnMgY2FuIGRyb3AgdGhlIGNvbXBvbmVudHMgb24gaXQuIFNldHRpbmcgdGhpcyBoZXJlCi0JICogbWVhbnMgdGhhdCB0aGUgZGVmYXVsdCBjb250ZW50IHBhbmUgZnJvbSB0aGUgSkZyYW1lIHdpbGwgc2hvdyB1cCBpbiB0aGUgZWRpdG9yIHRvIHVzZS4KLQkgKiA8cD4KLQkgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZSBpbiB0aGF0IG5vdCBhbGwgcHJvcGVydGllcyBhcmUgcmVxdWlyZWQgdG8gYWx3YXlzIHNob3cgdXAuCi0JICogVGhleSBjYW4gYmUgcXVlcmllZCB3aGVuIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHtAbGluayBTdHJpbmd9IGZvciBvbmUgcHJvcGVydHkuIE9yIGl0IGNhbiBiZSBhIHtAbGluayBTdHJpbmdbXX0gZm9yIG1vcmUKLQkgKiB0aGFuIG9uZSBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9JTVBMSUNJVF9QUk9QRVJUSUVTID0gInJlcXVpcmVkSW1wbGljaXRQcm9wZXJ0aWVzIjsJLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0JlYW5SZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vQmVhblJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmViNWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vQmVhblJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5SZWNvcmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMjo0NDo1MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIEJlYW5EZXNjcmlwdG9yIGluZm8gZnJvbQotICogdGhlIEJlYW5JbmZvIHZtIHRvIHRoZSBJREUgdm0uIEl0IGlzIHNlcmlhbGl6YWJsZSBzbyB0aGF0IGl0IGNhbgotICogYmUgc2VyaWFsaXplZCBmb3IgdHJhbnNtaXNzaW9uLgotICogPHA+Ci0gKiBJdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiB0aGUgQmVhbkRlc2NyaXB0b3IuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuUmVjb3JkIGV4dGVuZHMgRmVhdHVyZVJlY29yZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1OTc5OTIwNjY0TDsKLQkKLQlwdWJsaWMgU3RyaW5nIGN1c3RvbWl6ZXJDbGFzc05hbWU7Ci0JcHVibGljIGJvb2xlYW4gbWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzOwotCXB1YmxpYyBib29sZWFuIG1lcmdlSW5oZXJpdGVkT3BlcmF0aW9uczsKLQlwdWJsaWMgYm9vbGVhbiBtZXJnZUluaGVyaXRlZEV2ZW50czsKLQkvKioKLQkgKiBOYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIHRvIG5vdCBiZSBpbmhlcml0ZWQgaW4gZ2V0QWxsUHJvcGVydGllcygpLiBJdCBpcyBzZXQgb25seQotCSAqIGlmIHRoZSBsaXN0IGlzIG5vdCB0aGUgZnVsbCBsaXN0IG9mIGluaGVyaXRlZCBwcm9wZXJ0aWVzLgotCSAqIElmIGFsbCBpbmhlcml0ZWQgb3IgbWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzIGlzIGZhbHNlLCB0aGVuIHRoZSBmaWVsZCB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBTYXZlIHNwYWNlIHRoYXQgd2F5LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzOwotCS8qKgotCSAqIE5hbWVzIG9mIG9wZXJhdGlvbnMgdGhhdCBhcmUgdG8gbm90IGJlIGluaGVyaXRlZCBpbiBnZXRFQWxsT3BlcmF0aW9ucygpLiBJdCBpcyBzZXQgb25seQotCSAqIGlmIHRoZSBsaXN0IGlzIG5vdCB0aGUgZnVsbCBsaXN0IG9mIGluaGVyaXRlZCBvcGVyYXRpb25zLiAKLQkgKiBJZiBhbGwgYXJlIGluaGVyaXRlZCBvciBpZiBtZXJnZUluaGVyaXRlZE9wZXJhdGlvbnMgaXMgZmFsc2UsIHRoZW4gdGhlIGZpZWxkIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFNhdmUgc3BhY2UgdGhhdCB3YXkuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIG5vdEluaGVyaXRlZE9wZXJhdGlvbk5hbWVzOwotCS8qKgotCSAqIE5hbWVzIG9mIGV2ZW50cyB0aGF0IGFyZSB0byBub3QgYmUgaW5oZXJpdGVkIGluIGdldEFsbEV2ZW50cygpLiBJdCBpcyBzZXQgb25seQotCSAqIGlmIHRoZSBsaXN0IGlzIG5vdCB0aGUgZnVsbCBsaXN0IG9mIGluaGVyaXRlZCBldmVudHMuCi0JICogSWYgYWxsIGFyZSBpbmhlcml0ZWQgb3IgaWYgbWVyZ2VJbmhlcml0ZWRFdmVudHMgaXMgZmFsc2UsIHRoZW4gdGhlIGZpZWxkIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFNhdmUgc3BhY2UgdGhhdCB3YXkuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIG5vdEluaGVyaXRlZEV2ZW50TmFtZXM7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRXZlbnRTZXRSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRXZlbnRTZXRSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmNDdlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0V2ZW50U2V0UmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogRXZlbnRTZXRSZWNvcmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMjo0NDo1MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIEV2ZW50U2V0RGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEV2ZW50U2V0RGVzY3JpcHRvci4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEV2ZW50U2V0UmVjb3JkIGV4dGVuZHMgRmVhdHVyZVJlY29yZCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk4MDc3MzQyMEw7Ci0JCi0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgYWRkTGlzdGVuZXJNZXRob2Q7Ci0JcHVibGljIFN0cmluZyBldmVudEFkYXB0ZXJDbGFzc05hbWU7Ci0JcHVibGljIE1ldGhvZFJlY29yZFtdIGxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnM7Ci0JcHVibGljIFN0cmluZyBsaXN0ZW5lclR5cGVOYW1lOwotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIHJlbW92ZUxpc3RlbmVyTWV0aG9kOwotCXB1YmxpYyBib29sZWFuIGluRGVmYXVsdEV2ZW50U2V0OwotCXB1YmxpYyBib29sZWFuIHVuaWNhc3Q7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVBdHRyaWJ1dGVWYWx1ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9GZWF0dXJlQXR0cmlidXRlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwZTMwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVBdHRyaWJ1dGVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBGZWF0dXJlQXR0cmlidXRlVmFsdWUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wNi8zMCAxMzo0NzoyNiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NYXBUeXBlczsKLQotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHZhbHVlIGZvciBhIEZlYXR1cmVBdHRyaWJ1dGUuIEl0IHdyYXBwZXJzIHRoZSB0cnVlIGphdmEgb2JqZWN0LgotICogVXNlIHRoZSBnZXRPYmplY3QgbWV0aG9kIHRvIGdldCB0aGUgamF2YSB2YWx1ZS4KLSAqIDxwPgotICogV2UgY2FuIG9ubHkgcmVwcmVzZW50IFN0cmluZ3MsIHByaW1pdGl2ZXMsIGFuZCBhcnJheXMuIChQcmltaXRpdmVzIHdpbGwgY29udmVydGVkCi0gKiB0byB0aGVpciB3cmFwcGVyIGNsYXNzIChlLmcuIExvbmcpLCBhbmQgYnl0ZSwgc2hvcnQsIGFuZCBpbnQgd2lsbCBtb3ZlIHVwIHRvIExvbmcsCi0gKiBhbmQgZmxvYXQgd2lsbCBtb3ZlIHVwIHRvIERvdWJsZSkuICBBbmQgYW55IGtpbmQgb2YgdmFsaWQgYXJyYXkgb24gdGhlIGphdmEgQmVhbkluZm8gc2lkZQotICogd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gT2JqZWN0IGFycmF5IG9uIHRoZSBJREUgc2lkZS4gV2UgZG9uJ3QgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBhbGxvdyBtb3JlIGNvbXBsZXggb2JqZWN0cyAKLSAqIGJlY2F1c2UgdGhlIElERSBtYXkgbm90IGhhdmUgdGhlIG5lY2Vzc2FyeSBjbGFzc2VzIGF2YWlsYWJsZSB0byBpdCB0aGF0IAotICogdGhlIEJlYW5JbmZvIG1heSBvZiBoYWQgYXZhaWxhYmxlIHRvIGl0LiBJbnZhbGlkIG9iamVjdHMgd2lsbCBiZSByZXByZXNlbnRlZAotICogYnkgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5JbnZhbGlkT2JqZWN0fS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+Ci0gKiBDbGFzcyBvYmplY3RzIHRoYXQgYXJlIHZhbHVlcyBvZiBGZWF0dXJlIGF0dHJpYnV0ZXMgb24gdGhlIGphdmEgQmVhbkluZm8gc2lkZSB3aWxsIGJlCi0gKiBjb252ZXJ0ZWQgdG8gc2ltcGxlIHN0cmluZ3MgY29udGFpbmluZyB0aGUgY2xhc3NuYW1lIHdoZW4gbW92ZWQgdG8gdGhlIGNsaWVudCAoSURFKSBzaWRlLgotICogVGhhdCBpcyBiZWNhdXNlIHRoZSBjbGFzc2VzIHByb2JhYmx5IHdpbGwgbm90IGJlIGF2YWlsYWJsZSBvbiB0aGUgSURFIHNpZGUsIGJ1dCBjYW4gYmUKLSAqIHVzZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIGNsYXNzIHdoZW4gdXNlZCBiYWNrIG9uIHRoZSBqYXZhIHZtIHNpZGUuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlQXR0cmlidXRlVmFsdWUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQotCXByaXZhdGUgdHJhbnNpZW50IE9iamVjdCB2YWx1ZTsKLQlwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgaW50ZXJuYWxWYWx1ZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1NzE3NjM0ODQ0TDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHZhbHVlIHdpdGggdGhlIGdpdmVuIGluaXQgc3RyaW5nLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4KLQkgKiBAcGFyYW0gaW5pdFN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBGZWF0dXJlQXR0cmlidXRlVmFsdWUoU3RyaW5nIGluaXRTdHJpbmcpIHsKLQkJLy8gVXNlIHRoZSBpbml0IHN0cmluZyB0byBjcmVhdGUgdGhlIHZhbHVlLiBUaGlzIGlzIG91cgotCQkvLyBvd24gc2hvcnQtaGFuZCBmb3IgdGhpcy4KLQkJdmFsdWUgPSBwYXJzZVN0cmluZyhpbml0U3RyaW5nKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gY3VzdG9tZXIgd2FudHMgdG8gZmx1ZmYgb25lIHVwLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBGZWF0dXJlQXR0cmlidXRlVmFsdWUoKSB7Ci0JCQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgYSB2YWx1ZS4KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLnNldEludGVybmFsVmFsdWUobnVsbCk7Ci0JfQotCQkKLQkvKioKLQkgKiBTZXQgdGhlIGludGVybmFsIHZhbHVlLgotCSAqIEBwYXJhbSBpbnRlcm5hbFZhbHVlIFRoZSBpbnRlcm5hbFZhbHVlIHRvIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcm5hbFZhbHVlKE9iamVjdCBpbnRlcm5hbFZhbHVlKSB7Ci0JCXRoaXMuaW50ZXJuYWxWYWx1ZSA9IGludGVybmFsVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgaW50ZXJuYWwgdmFsdWUuIEl0IGlzIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gbWFzc2FnZWQgaW50byBhbiBlYXNpZXIgdG8gdXNlIGZvcm0KLQkgKiBpbiB0aGUgSURFLiBJdCB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIG91dC4gSXQgd2lsbCBub3QgYmUgcmVjb25zdHJ1Y3RlZCBmcm9tIGFuIGluaXQgc3RyaW5nLgotCSAqIDxwPiAKLQkgKiBJdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHVzZWQuIEl0IHdpbGwgYmUgY2xlYXJlZCBpZgotCSAqIGEgbmV3IHZhbHVlIGlzIHNldC4gRm9yIGV4YW1wbGUsIGlmIHRoZSB2YWx1ZSBpcyBhIGNvbXBsaWNhdGVkIGFycmF5IChiZWNhdXNlIHlvdSBjYW4ndCBoYXZlCi0JICogc3BlY2lhbCBjbGFzc2VzIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gdGhlIEJlYW5JbmZvIHNpZGUpIHRoZSBmaXJzdCB1c2FnZSBvZiB0aGlzIHZhbHVlIGNhbgotCSAqIGJlIHRyYW5zbGF0ZWQgaW50byBhbiBlYXNpZXIgZm9ybSB0byB1c2UsIHN1Y2ggYXMgYSBtYXAuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpbnRlcm5hbFZhbHVlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW50ZXJuYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIGludGVybmFsVmFsdWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQkJcmV0dXJuIG1ha2VTdHJpbmcodmFsdWUpOwotCX0KLQkKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gdGFrZSB0aGUgb2JqZWN0IGFuZCB0dXJuIGl0IGludG8gdGhlCi0JICogc3RyaW5nIGZvcm0gdGhhdCBpcyByZXF1aXJlZCBmb3IgRU1GIHNlcmlhbGl6YXRpb24uCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkuIEl0IGNhbiBiZSB1c2VkIGZvciBkZXZlbG9wbWVudCAKLQkgKiBwdXJwb3NlcyBieSBjbGllbnRzLCBidXQgdGhleSB3b3VsZCBub3QgaGF2ZSBhbnkgcmVhbAotCSAqIHJ1bnRpbWUgbmVlZCBmb3IgdGhpcy4KLQkgKiA8cD4KLQkgKiBPdXRwdXQgZm9ybWF0IHdvdWxkIGJlICh0aGVyZSB3b24ndCBiZSBhbnkgbmV3bGluZXMgaW4gdGhlIGFjdHVhbCBzdHJpbmcpCi0JICogPHByZT4KLQkgKiAgIFN0cmluZzogInp4dnp4diIKLQkgKiAgIE51bWJlcjogbnVtYmVyCi0JICogICBCb29sZWFuOiB0cnVlIG9yIGZhbHNlCi0JICogICBDaGFyYWN0ZXI6ICdjJwotCSAqICAgbnVsbDogbnVsbAotCSAqIAotCSAqICAgQXJyYXk6IChhbGwgYXJyYXlzIHdpbGwgYmUgdHVybmVkIGludG8gT2JqZWN0W10pCi0JICogICAgIFtkaW1de2UxLCBlMn0KLQkgKiAgICAgW2RpbTFdW2RpbTJde1tkaW0xYV17ZTEsIGUyfSwgW2RpbTJhXXtlMywgZTR9fQotCSAqICAgd2hlcmUgZW4gYXJlIG9iamVjdHMgdGhhdCBmb2xsb3cgdGhlIHBhdHRlcm4gZm9yIHNpbmdsZSBvdXRwdXQgYWJvdmUuCi0JICogCi0JICogICBBbnkgaW52YWxpZCBvYmplY3QgKGkuZS4gbm90IG9uZSBvZiB0aGUgb25lcyB3ZSBoYW5kbGUpIHdpbGwgYmU6Ci0JICogICAgIElOVgotCSAqIAotCSAqICAgQXJyYXlzIG9mIGludmFsaWQgdHlwZXMgKG5vdCBPYmplY3QsIFN0cmluZywgTnVtYmVyLCBCb29sZWFuLCBDaGFyYWN0ZXIsCi0JICogICAgIG9yIHByaW1pdGl2ZXMpIHdpbGwgYmUgbWFya2VkIGFzIElOVi4KLQkgKiA8L3ByZT4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIHNlcmlhbGl6ZWQgZm9ybSBhcyBhIHN0cmluZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlU3RyaW5nKE9iamVjdCB2YWx1ZSkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQltYWtlU3RyaW5nKHZhbHVlLCBvdXQpOwotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUVVPVEUgPSBQYXR0ZXJuLmNvbXBpbGUoIlwiIik7CS8vIFBhdHRlcm4gZm9yIHNlYXJjaGluZyBmb3IgZG91YmxlLXF1b3RlLiBNYWtlIGl0IHN0YXRpYyBzbyBkb24ndCB3YXN0ZSB0aW1lIGNvbXBpbGluZyBlYWNoIHRpbWUuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTCA9ICJudWxsIjsJLy8gT3V0cHV0IHN0cmluZyBmb3IgbnVsbCAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSUQgPSAiSU5WIjsJLy8gSW52YWxpZCBvYmplY3QgZmxhZy4gLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogVXNlZCBmb3IgcmVjdXJzaXZlIGJ1aWxkaW5nIG9mIHRoZSBzdHJpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYWtlU3RyaW5nKE9iamVjdCB2YWx1ZSwgU3RyaW5nQnVmZmVyIG91dCkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCW91dC5hcHBlbmQoTlVMTCk7Ci0JCWVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCS8vIFN0cmluZzogInN0cmluZyIgb3IgInN0cmluZ1wic3RyaW5nZW5kIiBpZiBzdHIgaW5jbHVkZWQgYSBkb3VibGUtcXVvdGUuCi0JCQlvdXQuYXBwZW5kKCciJyk7Ci0JCQkvLyBJZiBjbGFzcywgdHVybiB2YWx1ZSBpbnRvIHRoZSBjbGFzc25hbWUuCi0JCQlTdHJpbmcgc3RyID0gdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgPyAoU3RyaW5nKSB2YWx1ZSA6ICgoQ2xhc3MpIHZhbHVlKS5nZXROYW1lKCk7Ci0JCQlpZiAoc3RyLmluZGV4T2YoJyInKSAhPSAtMSkgewotCQkJCS8vIFJlcGxhY2UgZG91YmxlLXF1b3RlIHdpdGggZXNjYXBlIGRvdWJsZS1xdW90ZSBzbyB3ZSBjYW4gZGlzdGlucXVpc2ggaXQgZnJvbSB0aGUgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlLgotCQkJCW91dC5hcHBlbmQoUVVPVEUubWF0Y2hlcihzdHIpLnJlcGxhY2VBbGwoIlxcXFxcIiIpKTsJLy8gRG9uJ3Qga25vdyB3aHkgd2UgbmVlZCB0aGUgYmFjay1zbGFzaCB0byBiZSBkb3VibGVkIGZvciByZXBsYWNlYWxsLCBidXQgaXQgZG9lc24ndCB3b3JrIG90aGVyd2lzZS4gLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlCi0JCQkJb3V0LmFwcGVuZChzdHIpOwotCQkJb3V0LmFwcGVuZCgnXCInKTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJLy8gV2lsbCBnbyBvdXQgYXMgZWl0aGVyIGEgaW50ZWdlciBudW1iZXIgb3IgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuIAotCQkJLy8gV2hlbiByZWFkIGJhY2sgaW4gaXQgd2lsbCBiZSBlaXRoZXIgYSBMb25nIG9yIGEgRG91YmxlLgotCQkJb3V0LmFwcGVuZCh2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkvLyBJdCB3aWxsIGdvIG91dCBhcyBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KLQkJCW91dC5hcHBlbmQodmFsdWUpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkvLyBDaGFyYWN0ZXI6ICdjJyBvciAnXCcnIGlmIGNoYXIgd2FzIGEgcXVvdGUuCi0JCQlvdXQuYXBwZW5kKCdcJycpOwotCQkJQ2hhcmFjdGVyIGMgPSAoQ2hhcmFjdGVyKSB2YWx1ZTsKLQkJCWlmIChjLmNoYXJWYWx1ZSgpICE9ICdcJycpCi0JCQkJb3V0LmFwcGVuZChjLmNoYXJWYWx1ZSgpKTsKLQkJCWVsc2UKLQkJCQlvdXQuYXBwZW5kKCJcXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0LmFwcGVuZCgnXCcnKTsKLQkJfSBlbHNlIGlmICh2YWx1ZS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotCQkJLy8gSGFuZGxlIGFycmF5IGZvcm1hdC4KLQkJCUNsYXNzIHR5cGUgPSB2YWx1ZS5nZXRDbGFzcygpOwotCQkJLy8gU2VlIGlmIGZpbmFsIHR5cGUgaXMgYSB2YWxpZCB0eXBlLgotCQkJQ2xhc3MgZnQgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCWludCBkaW1zID0gMTsKLQkJCXdoaWxlIChmdC5pc0FycmF5KCkpIHsKLQkJCQlkaW1zKys7Ci0JCQkJZnQgPSBmdC5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQl9Ci0JCQlpZiAoZnQgPT0gT2JqZWN0LmNsYXNzIHx8IGZ0ID09IFN0cmluZy5jbGFzcyB8fCBmdCA9PSBCb29sZWFuLmNsYXNzIHx8IGZ0ID09IENoYXJhY3Rlci5jbGFzcyB8fCBmdC5pc1ByaW1pdGl2ZSgpIHx8IE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZ0KSkgewotCQkJCS8vIFtsZW5ndGhdW11bXSB7Li4uLn0KLQkJCQlvdXQuYXBwZW5kKCdbJyk7Ci0JCQkJaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aCh2YWx1ZSk7IAotCQkJCW91dC5hcHBlbmQobGVuZ3RoKTsKLQkJCQlvdXQuYXBwZW5kKCddJyk7Ci0JCQkJd2hpbGUoLS1kaW1zID4gMCkgewotCQkJCQlvdXQuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW91dC5hcHBlbmQoJ3snKTsKLQkJCQlmb3IgKGludCBpPTA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJb3V0LmFwcGVuZCgnLCcpOwotCQkJCQltYWtlU3RyaW5nKEFycmF5LmdldCh2YWx1ZSwgaSksIG91dCk7Ci0JCQkJfQotCQkJCW91dC5hcHBlbmQoJ30nKTsKLQkJCX0gZWxzZQotCQkJCW91dC5hcHBlbmQoSU5WQUxJRCk7CS8vIEFueSBvdGhlciBraW5kIG9mIGFycmF5IGlzIGludmFsaWQuCi0JCX0gZWxzZSB7Ci0JCQlvdXQuYXBwZW5kKElOVkFMSUQpOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gdGFrZSB0aGUgc3RyaW5nIGlucHV0IGZyb20gRU1GIHNlcmlhbGl6YXRpb24gYW5kIHR1cm4gaXQKLQkgKiBpbnRvIGFuIE9iamVjdC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseS4gSXQgY2FuIGJlIHVzZWQgZm9yIGRldmVsb3BtZW50IAotCSAqIHB1cnBvc2VzIGJ5IGNsaWVudHMsIGJ1dCB0aGV5IHdvdWxkIG5vdCBoYXZlIGFueSByZWFsCi0JICogcnVudGltZSBuZWVkIGZvciB0aGlzLgotCSAqIDxwPgotCSAqIFRoZSBvYmplY3Qgd2lsbCBiZSBhbiBvYmplY3QsIG51bGwsIG9yIGFuIE9iamVjdCBhcnJheS4gQW55IHZhbHVlCi0JICogdGhhdCBpcyBpbnZhbGlkIHdpbGwgYmUgc2V0IHRvIHRoZSB7QGxpbmsgSW52YWxpZE9iamVjdCNJTlNUQU5DRX0gc3RhdGljCi0JICogaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybiBvYmplY3QgZGVjb2RlZCBmcm9tIHRoZSBpbnB1dC4KLQkgKiAKLQkgKiBAc2VlICNtYWtlU3RyaW5nKE9iamVjdCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBwYXJzZVN0cmluZyhTdHJpbmcgaW5wdXQpIHsKLQkJcmV0dXJuIHBhcnNlU3RyaW5nKG5ldyBTdHJpbmdQYXJzZXIoaW5wdXQpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nUGFyc2VyIHsKLQkJcHJpdmF0ZSBpbnQgbmV4dD0wOwotCQlwcml2YXRlIGludCBsZW5ndGg7Ci0JCXByaXZhdGUgU3RyaW5nIGlucHV0OwotCQkKLQkJcHVibGljIFN0cmluZ1BhcnNlcihTdHJpbmcgaW5wdXQpIHsKLQkJCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQkJCXRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlN0cmluZ1BhcnNlcjogXCIiK2lucHV0KyciJzsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2tpcFdoaXRlc3BhY2UoKSB7Ci0JCQl3aGlsZShuZXh0IDwgbGVuZ3RoKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGlucHV0LmNoYXJBdChuZXh0KyspKSkgewotCQkJCQluZXh0LS07CS8vIFB1dCBpdCBiYWNrIGFzIG5vdCB5ZXQgcmVhZCBzaW5jZSBpdCBpcyBub3Qgd2hpdGVzcGFjZS4KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuZXh0IGluZGV4Ci0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gbmV4dDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dAotCQkgKiBAcmV0dXJuIGlucHV0IGxlbmd0aAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiBsZW5ndGg7Ci0JCX0KLQkJCi0JCQotCQkvKioKLQkJICogUmVhZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgYW5kIGdvIHRvIG5leHQuCi0JCSAqIEByZXR1cm4gY3VycmVudCBjaGFyYWN0ZXIKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGNoYXIgcmVhZCgpIHsKLQkJCXJldHVybiBuZXh0PGxlbmd0aCA/IGlucHV0LmNoYXJBdChuZXh0KyspIDogMDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEJhY2t1cCB0aGUgcGFyc2VyIG9uZSBjaGFyYWN0ZXIuCi0JCSAqIAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBiYWNrdXAoKSB7Ci0JCQlpZiAoLS1uZXh0IDwgMCkKLQkJCQluZXh0ID0gMDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFBlZWsgYXQgdGhlIGNoYXIgYXQgdGhlIG5leHQgaW5kZXgsIGJ1dCBkb24ndCBpbmNyZW1lbnQgYWZ0ZXJ3YXJkcy4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgY2hhciBwZWVrKCkgewotCQkJcmV0dXJuIG5leHQ8bGVuZ3RoID8gaW5wdXQuY2hhckF0KG5leHQpIDogMDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEhhdmUgd2UgcmVhZCB0aGUgbGFzdCBjaGFyLgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlYWQgbGFzdCBjaGFyLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBhdEVuZCgpIHsKLQkJCXJldHVybiBuZXh0Pj1sZW5ndGg7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXNldCB0byB0aGUgZ2l2ZW4gbmV4dCBpbmRleC4KLQkJICogQHBhcmFtIG5leHRJbmRleCB0aGUgbmV4dCBpbmRleCB0byBkbyBhIHJlYWQgYXQuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc2V0KGludCBuZXh0SW5kZXgpIHsKLQkJCWlmIChuZXh0SW5kZXg8PWxlbmd0aCkKLQkJCQluZXh0ID0gbmV4dEluZGV4OwotCQkJZWxzZQotCQkJCW5leHQgPSBsZW5ndGg7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTa2lwIHRoZSBuZXh0IG51bWJlciBvZiBjaGFycy4KLQkJICogQHBhcmFtIHNraXAgbnVtYmVyIG9mIGNoYXJzIHRvIHNraXAuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNraXAoaW50IHNraXApIHsKLQkJCWlmICgobmV4dCs9c2tpcCkgPiBsZW5ndGgpCi0JCQkJbmV4dCA9IGxlbmd0aDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3RyaW5nIGlucHV0LgotCQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgaW5wdXQKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRJbnB1dCgpIHsKLQkJCXJldHVybiBpbnB1dDsKLQkJfQotCQkJCQotCX0KLQkKLQkvKgotCSAqIFN0YXJ0aW5nIGEgcGFyc2UgZm9yIGFuIG9iamVjdCBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0JICogUmV0dXJuIHRoZSBwYXJzZWQgb2JqZWN0IG9yIEludmFsaWRPYmplY3QgaWYgbm8KLQkgKiBvYmplY3Qgb3IgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHBhcnNlU3RyaW5nKFN0cmluZ1BhcnNlciBwYXJzZXIpIHsKLQkJcGFyc2VyLnNraXBXaGl0ZXNwYWNlKCk7Ci0JCWlmICghcGFyc2VyLmF0RW5kKCkpIHsKLQkJCWNoYXIgYyA9IHBhcnNlci5yZWFkKCk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICciJzoKLQkJCQkJLy8gU3RhcnQgb2YgYSBxdW90ZWQgc3RyaW5nLiBTY2FuIGZvciBjbG9zaW5nIHF1b3RlLCBpZ25vcmluZyBlc2NhcGVkIHF1b3Rlcy4KLQkJCQkJaW50IHN0YXJ0ID0gcGFyc2VyLm5leHRJbmRleCgpOwkvLyBJbmRleCBvZiBmaXJzdCBjaGFyIGFmdGVyICciJwotCQkJCQljaGFyW10gZGVxdW90ZWQgPSBudWxsOwkvLyBVc2VkIGlmIHRoZXJlIGlzIGFuIGVzY2FwZWQgcXVvdGUuIFRoYXQgaXMgdGhlIG9ubHkgdGhpbmcgd2Ugc3VwcG9ydCBlc2NhcGUgb24sIHF1b3Rlcy4KLQkJCQkJaW50IGRlcXVvdGVJbmRleCA9IDA7Ci0JCQkJCXdoaWxlICghcGFyc2VyLmF0RW5kKCkpIHsKLQkJCQkJCWNoYXIgY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJaWYgKGNjID09ICciJykgewotCQkJCQkJCS8vIElmIHdlIGRpZG4ndCBkZXF1b3RlLCB0aGVuIGp1c3QgZG8gc3Vic3RyaW5nLgotCQkJCQkJCWlmIChkZXF1b3RlZCA9PSBudWxsKQotCQkJCQkJCQlyZXR1cm4gcGFyc2VyLmdldElucHV0KCkuc3Vic3RyaW5nKHN0YXJ0LCBwYXJzZXIubmV4dEluZGV4KCktMSk7CS8vIG5leHQgaXMgY2hhciBhZnRlciAnIicsIHNvIGVuZCBvZiBzdHJpbmcgaW5kZXggaXMgaW5kZXggb2YgJyInCi0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIFdlIGhhdmUgYSBkZXF1b3RlZCBzdHJpbmcuIFNvIHR1cm4gaW50byBhIHN0cmluZy4KLQkJCQkJCQkJLy8gR2F0aGVyIHRoZSBsYXN0IGdyb3VwCi0JCQkJCQkJCWludCBlbmROZHggPSBwYXJzZXIubmV4dEluZGV4KCktMTsKLQkJCQkJCQkJcGFyc2VyLmdldElucHV0KCkuZ2V0Q2hhcnMoc3RhcnQsIGVuZE5keCwgZGVxdW90ZWQsIGRlcXVvdGVJbmRleCk7Ci0JCQkJCQkJCWRlcXVvdGVJbmRleCs9IChlbmROZHgtc3RhcnQpOwotCQkJCQkJCQlyZXR1cm4gbmV3IFN0cmluZyhkZXF1b3RlZCwgMCwgZGVxdW90ZUluZGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKGNjID09ICdcXCcpIHsKLQkJCQkJCQkvLyBXZSBoYWQgYW4gZXNjYXBlLCBzZWUgaWYgbmV4dCBpcyBhIHF1b3RlLiBJZiBpdCBpcyB3ZSBuZWVkIHRvIHN0cmlwIG91dCB0aGUgJ1wnLgotCQkJCQkJCWlmIChwYXJzZXIucGVlaygpID09ICciJykgewotCQkJCQkJCQlpZiAoZGVxdW90ZWQgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVxdW90ZWQgPSBuZXcgY2hhcltwYXJzZXIuZ2V0TGVuZ3RoKCldOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWludCBlbmROZHggPSBwYXJzZXIubmV4dEluZGV4KCktMTsKLQkJCQkJCQkJcGFyc2VyLmdldElucHV0KCkuZ2V0Q2hhcnMoc3RhcnQsIGVuZE5keCwgZGVxdW90ZWQsIGRlcXVvdGVJbmRleCk7CS8vIEdldCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcgJ1wnCi0JCQkJCQkJCWRlcXVvdGVJbmRleCs9IChlbmROZHgtc3RhcnQpOwotCQkJCQkJCQkvLyBOb3cgYWxzbyBhZGQgaW4gdGhlIGVzY2FwZWQgcXVvdGUuCi0JCQkJCQkJCWRlcXVvdGVkW2RlcXVvdGVJbmRleCsrXSA9IHBhcnNlci5yZWFkKCk7Ci0JCQkJCQkJCXN0YXJ0ID0gcGFyc2VyLm5leHRJbmRleCgpOwkvLyBOZXh0IGdyb3VwIGlzIGZyb20gbmV4dCBpbmRleC4KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CS8vIElmIHdlIGdvdCBoZXJlLCBpdCBpcyBpbnZhbGlkLgotCQkJCQkKLQkJCQljYXNlICctJzoKLQkJCQljYXNlICcwJzoKLQkJCQljYXNlICcxJzoKLQkJCQljYXNlICcyJzoKLQkJCQljYXNlICczJzoKLQkJCQljYXNlICc0JzoKLQkJCQljYXNlICc1JzoKLQkJCQljYXNlICc2JzoKLQkJCQljYXNlICc3JzoKLQkJCQljYXNlICc4JzoKLQkJCQljYXNlICc5JzoKLQkJCQkJLy8gUG9zc2libGUgbnVtYmVyLgotCQkJCQkvLyBTY2FuIHRvIG5leHQgbm9uLWRpZ2l0LCBvciBub3QgcGFydCBvZiB2YWxpZCBudW1iZXIuCi0JCQkJCWJvb2xlYW4gbnVtYmVyQ29tcGxldGUgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBmbG9hdFR5cGUgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBmb3VuZEUgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBmb3VuZEVTaWduID0gZmFsc2U7Ci0JCQkJCXN0YXJ0ID0gcGFyc2VyLm5leHRJbmRleCgpLTE7CS8vIFdlIHdhbnQgdG8gaW5jbHVkZSB0aGUgc2lnbiBvciBmaXJzdCBkaWdpdCBpbiB0aGUgbnVtYmVyLgotCQkJCQl3aGlsZSAoIXBhcnNlci5hdEVuZCgpICYmICFudW1iZXJDb21wbGV0ZSkgewotCQkJCQkJY2hhciBjYyA9IHBhcnNlci5yZWFkKCk7Ci0JCQkJCQlzd2l0Y2ggKGNjKSB7Ci0JCQkJCQkJY2FzZSAnMCc6Ci0JCQkJCQkJY2FzZSAnMSc6Ci0JCQkJCQkJY2FzZSAnMic6Ci0JCQkJCQkJY2FzZSAnMyc6Ci0JCQkJCQkJY2FzZSAnNCc6Ci0JCQkJCQkJY2FzZSAnNSc6Ci0JCQkJCQkJY2FzZSAnNic6Ci0JCQkJCQkJY2FzZSAnNyc6Ci0JCQkJCQkJY2FzZSAnOCc6Ci0JCQkJCQkJY2FzZSAnOSc6Ci0JCQkJCQkJCWJyZWFrOwkvLyBUaGlzIGlzIGdvb2QsIGdvIG9uLgotCQkJCQkJCWNhc2UgJy4nOgotCQkJCQkJCQlpZiAoZmxvYXRUeXBlKQotCQkJCQkJCQkJcmV0dXJuIEludmFsaWRPYmplY3QuSU5TVEFOQ0U7CS8vIFdlIGFscmVhZHkgZm91bmQgYSAnLicsIHR3byBhcmUgaW52YWxpZC4KLQkJCQkJCQkJZmxvYXRUeXBlID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnZSc6Ci0JCQkJCQkJY2FzZSAnRSc6Ci0JCQkJCQkJCWlmIChmb3VuZEUpCi0JCQkJCQkJCQlyZXR1cm4gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsJLy8gV2UgYWxyZWFkeSBmb3VuZCBhICdlJywgdHdvIGFyZSBpbnZhbGlkLgotCQkJCQkJCQlmb3VuZEUgPSB0cnVlOwotCQkJCQkJCQlmbG9hdFR5cGUgPSB0cnVlOwkvLyBBbiAnZScgbWFrZXMgaXQgYSBmbG9hdCwgaWYgbm90IGFscmVhZHkuCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgJysnOgotCQkJCQkJCWNhc2UgJy0nOgotCQkJCQkJCQlpZiAoIWZvdW5kRSB8fCBmb3VuZEVTaWduKSAKLQkJCQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwkvLyBBICsvLSB3aXRoIG5vICdlJyBmaXJzdCBpcyBpbnZhbGlkLiBPciBtb3JlIHRoYW4gb25lIHNpZ24uCi0JCQkJCQkJCWZvdW5kRVNpZ24gPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkvLyBBbnl0aGluZyBlbHNlIGlzIGVuZCBvZiBudW1iZXIuCi0JCQkJCQkJCXBhcnNlci5iYWNrdXAoKTsJLy8gQmFjayBpdCB1cCBzbyB0aGF0IG5leHQgcGFyc2Ugd2lsbCBzdGFydCB3aXRoIHRoaXMgY2hhci4KLQkJCQkJCQkJbnVtYmVyQ29tcGxldGUgPSB0cnVlOwkvLyBTbyB3ZSBzdG9wIHNjYW5uaW5nCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoIWZsb2F0VHlwZSkKLQkJCQkJCQlyZXR1cm4gTG9uZy52YWx1ZU9mKHBhcnNlci5nZXRJbnB1dCgpLnN1YnN0cmluZyhzdGFydCwgcGFyc2VyLm5leHRJbmRleCgpKSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIERvdWJsZS52YWx1ZU9mKHBhcnNlci5nZXRJbnB1dCgpLnN1YnN0cmluZyhzdGFydCwgcGFyc2VyLm5leHRJbmRleCgpKSk7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7IC8vIElmIHdlIGdvdCBoZXJlLCBpdCBpcyBpbnZhbGlkLgotCQkJCQkKLQkJCQljYXNlICd0JzoKLQkJCQljYXNlICdUJzoKLQkJCQljYXNlICdmJzoKLQkJCQljYXNlICdGJzoKLQkJCQkJLy8gUG9zc2libGUgYm9vbGVhbi4KLQkJCQkJaWYgKHBhcnNlci5nZXRJbnB1dCgpLnJlZ2lvbk1hdGNoZXModHJ1ZSwgcGFyc2VyLm5leHRJbmRleCgpLTEsICJ0cnVlIiwgMCwgNCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGFyc2VyLnNraXAoMyk7CS8vIFNraXAgb3ZlciByZXN0IG9mIHN0cmluZy4KLQkJCQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCQkJCX0gZWxzZSBpZiAocGFyc2VyLmdldElucHV0KCkucmVnaW9uTWF0Y2hlcyh0cnVlLCBwYXJzZXIubmV4dEluZGV4KCktMSwgImZhbHNlIiwgMCwgNSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGFyc2VyLnNraXAoNCk7CS8vIFNraXAgb3ZlciByZXN0IG9mIHN0cmluZy4KLQkJCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwkJCQkJCQotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAnXCcnOgotCQkJCQkvLyBQb3NzaWJsZSBjaGFyYWN0ZXIKLQkJCQkJY2hhciBjYyA9IHBhcnNlci5yZWFkKCk7Ci0JCQkJCS8vIFdlIHJlYWxseSBvbmx5IHN1cHBvcnQgJ1xcJyBhbmQgJ1wnJyBhbnl0aGluZyBlbHNlIHdpbGwgYmUgdHJlYXRlZCBhcyBpZ25vcmUgJ1wnIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBoYW5kbGUgZnVsbCBlc2NhcGVzLgotCQkJCQlpZiAoY2MgPT0gJ1xcJykKLQkJCQkJCWNjID0gcGFyc2VyLnJlYWQoKTsJLy8gR2V0IHdoYXQncyBhZnRlciBpdC4KLQkJCQkJZWxzZSBpZiAoY2MgPT0gJ1wnJykKLQkJCQkJCWJyZWFrOwkvLyAnJyBpcyBpbnZhbGlkLgotCQkJCQlpZiAocGFyc2VyLnBlZWsoKSA9PSAnXCcnKSB7Ci0JCQkJCQkvLyBTbyBuZXh0IGNoYXIgYWZ0ZXIgImNoYXJhY3RlciIgaXMgaXMgYSBxdW90ZS4gVGhpcyBpcyBnb29kLgotCQkJCQkJcGFyc2VyLnJlYWQoKTsJLy8gTm93IGNvbnN1bWUgdGhlIHF1b3RlCi0JCQkJCQlyZXR1cm4gbmV3IENoYXJhY3RlcihjYyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7IC8vIElmIHdlIGdvdCBoZXJlLCBpdCBpcyBpbnZhbGlkLgotCQkJCQkKLQkJCQljYXNlICduJzoKLQkJCQkJLy8gUG9zc2libGUgbnVsbC4KLQkJCQkJaWYgKHBhcnNlci5nZXRJbnB1dCgpLnJlZ2lvbk1hdGNoZXMocGFyc2VyLm5leHRJbmRleCgpLTEsICJudWxsIiwgMCwgNCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGFyc2VyLnNraXAoMyk7CS8vIFNraXAgb3ZlciByZXN0IG9mIHN0cmluZy4KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAnSSc6Ci0JCQkJCS8vIFBvc3NpYmxlIGludmFsaWQgdmFsdWUuCi0JCQkJCWlmIChwYXJzZXIuZ2V0SW5wdXQoKS5yZWdpb25NYXRjaGVzKHBhcnNlci5uZXh0SW5kZXgoKS0xLCBJTlZBTElELCAwLCBJTlZBTElELmxlbmd0aCgpKSkgewotCQkJCQkJcGFyc2VyLnNraXAoSU5WQUxJRC5sZW5ndGgoKS0xKTsJLy8gU2tpcCBvdmVyIHJlc3Qgb2Ygc3RyaW5nLgotCQkJCQkJcmV0dXJuIEludmFsaWRPYmplY3QuSU5TVEFOQ0U7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7IC8vIElmIHdlIGdvdCBoZXJlLCBpdCBpcyBpbnZhbGlkLgotCQkJCQkKLQkJCQljYXNlICdbJzoKLQkJCQkJLy8gUG9zc2libGUgYXJyYXkuCi0JCQkJCS8vIFRoZSBuZXh0IGZpZWxkIHNob3VsZCBiZSBhIG51bWJlciwgc28gd2UnbGwgdXNlIHBhcnNlU3RyaW5nIHRvIGdldCB0aGUgbnVtYmVyLiAKLQkJCQkJT2JqZWN0IHNpemUgPSBwYXJzZVN0cmluZyhwYXJzZXIpOwotCQkJCQlpZiAoc2l6ZSBpbnN0YW5jZW9mIExvbmcpIHsKLQkJCQkJCXBhcnNlci5za2lwV2hpdGVzcGFjZSgpOwotCQkJCQkJY2MgPSBwYXJzZXIucmVhZCgpOwkvLyBTZSBpZiBuZXh0IGlzICddJwotCQkJCQkJaWYgKGNjID09ICddJykgewotCQkJCQkJCS8vIEdvb2QsIHdlbGwtZm9ybWVkIGZpcnN0IGRpbWVuc2lvbgotCQkJCQkJCWludCBkaW0gPSAxOwotCQkJCQkJCWJvb2xlYW4gdmFsaWQgPSB0cnVlOwotCQkJCQkJCS8vIFNlZSBpZiB0aGVyZSBhcmUgbW9yZSBvZiBqdXN0ICJbXSIuIHRoZSBudW1iZXIgb2YgdGhlbSBpcyB0aGUgZGltLgotCQkJCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQkJCXBhcnNlci5za2lwV2hpdGVzcGFjZSgpOwotCQkJCQkJCQljYyA9IHBhcnNlci5yZWFkKCk7Ci0JCQkJCQkJCWlmIChjYyA9PSAnWycpIHsKLQkJCQkJCQkJCXBhcnNlci5za2lwV2hpdGVzcGFjZSgpOwotCQkJCQkJCQkJY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJCQkJaWYgKGNjID09ICddJykKLQkJCQkJCQkJCQlkaW0rKzsKLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCS8vIFRoaXMgaXMgaW52YWxpZC4KLQkJCQkJCQkJCQl2YWxpZCA9IGZhbHNlOwotCQkJCQkJCQkJCXBhcnNlci5iYWNrdXAoKTsKLQkJCQkJCQkJCQlicmVhazsJLy8gTm8gbW9yZSBkaW1zLgotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJcGFyc2VyLmJhY2t1cCgpOwotCQkJCQkJCQkJYnJlYWs7CS8vIE5vIG1vcmUgZGltcy4KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAodmFsaWQpIHsKLQkJCQkJCQkJcGFyc2VyLnNraXBXaGl0ZXNwYWNlKCk7Ci0JCQkJCQkJCWNjID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJCQkJaWYgKGNjID09ICd7JykgewotCQkJCQkJCQkJLy8gR29vZCwgd2UncmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlLgotCQkJCQkJCQkJaW50W10gZGltcyA9IG5ldyBpbnRbZGltXTsKLQkJCQkJCQkJCWludCBsZW4gPSAoKExvbmcpIHNpemUpLmludFZhbHVlKCk7Ci0JCQkJCQkJCQlkaW1zWzBdID0gbGVuOwotCQkJCQkJCQkJT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoT2JqZWN0LmNsYXNzLCBkaW1zKTsKLQkJCQkJCQkJCUFycmF5cy5maWxsKChPYmplY3RbXSkgYXJyYXksIG51bGwpOwkvLyBCZWNhdXNlIG5ld0luc3RhbmNlIHVzZWQgYWJvdmUgZmlsbHMgdGhlIGFycmF5IGNyZWF0ZWQgd2l0aCBlbXB0eSBhcnJheXMgd2hlbiBhIGRpbT4xLgotCQkJCQkJCQkJCi0JCQkJCQkJCQkvLyBOb3cgd2Ugc3RhcnQgZmlsbGluZyBpdCBpbi4KLQkJCQkJCQkJCU9iamVjdCBpbnZTZXR0aW5nID0gbnVsbDsJLy8gV2hhdCB3ZSB3aWxsIHVzZSBmb3IgdGhlIGludmFsaWQgc2V0dGluZy4gSWYgdGhpcyBpcyBhIG11bHRpZGltLCB0aGlzIG5lZWRzIHRvIGJlIGFuIGFycmF5LiBXaWxsIG5vdCBjcmVhdGUgaXQgdW50aWwgbmVlZGVkLgotCQkJCQkJCQkJT2JqZWN0IGVudHJ5ID0gcGFyc2VTdHJpbmcocGFyc2VyKTsJLy8gR2V0IHRoZSBmaXJzdCBlbnRyeQotCQkJCQkJCQkJQ2xhc3MgY29tcFR5cGUgPSBhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQkJCQkJCWludCBpID0gLTE7Ci0JCQkJCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCQkJCWlmICgrK2kgPCBsZW4pIHsKLQkJCQkJCQkJCQkJaWYgKGNvbXBUeXBlLmlzSW5zdGFuY2UoZW50cnkpKSB7Ci0JCQkJCQkJCQkJCQkvLyBHb29kLCBpdCBjYW4gYmUgYXNzaWduZWQuCi0JCQkJCQkJCQkJCQlBcnJheS5zZXQoYXJyYXksIGksIGVudHJ5KTsKLQkJCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJCS8vIEJhZC4gTmVlZCB0byBzZXQgaW52YWxpZC4KLQkJCQkJCQkJCQkJCWlmIChpbnZTZXR0aW5nID09IG51bGwpIHsKLQkJCQkJCQkJCQkJCQkvLyBXZSBoYXZlbid0IGNyZWF0ZWQgaXQgeWV0LgotCQkJCQkJCQkJCQkJCWlmIChkaW0gPT0gMSkKLQkJCQkJCQkJCQkJCQkJaW52U2V0dGluZyA9IEludmFsaWRPYmplY3QuSU5TVEFOQ0U7IC8vIEdyZWF0LCBvbmUgZGltZW5zaW9uYWwsIHdlIGNhbiB1c2UgaW52YWxpZCBkaXJlY3RseQotCQkJCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQkJCQkvLyBNdWx0aS1kaW0uIE5lZWQgdG8gY3JlYXRlIGEgdmFsaWQgYXJyYXkgdGhhdCB3ZSBjYW4gc2V0LgotCQkJCQkJCQkJCQkJCQlpbnRbXSBpbnZEaW1zID0gbmV3IGludFtkaW0gLSAxXTsKLQkJCQkJCQkJCQkJCQkJQXJyYXlzLmZpbGwoaW52RGltcywgMSk7IC8vIExlbmd0aCBvbmUgYWxsIG9mIHRoZSB3YXkgc28gdGhhdCB0aGUgZmluYWwgY29tcG9uZW50IGNhbiBiZSBpbnZhbGlkIG9iamVjdAotCQkJCQkJCQkJCQkJCQlpbnZTZXR0aW5nID0gQXJyYXkubmV3SW5zdGFuY2UoT2JqZWN0LmNsYXNzLCBpbnZEaW1zKTsKLQkJCQkJCQkJCQkJCQkJT2JqZWN0IGZpbmFsRW50cnkgPSBpbnZTZXR0aW5nOyAvLyBGaW5hbCBhcnJheSAod2l0aCBjb21wb25lbnQgdHlwZSBvZiBqdXN0IE9iamVjdCkuIFN0YXJ0IHdpdGggdGhlIGZ1bGwgYXJyYXkgYW5kIHdvcmsgZG93bi4KLQkJCQkJCQkJCQkJCQkJZm9yIChpbnQgaiA9IGludkRpbXMubGVuZ3RoIC0gMTsgaiA+IDA7IGotLSkgewotCQkJCQkJCQkJCQkJCQkJZmluYWxFbnRyeSA9IEFycmF5LmdldChmaW5hbEVudHJ5LCAwKTsKLQkJCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCQlBcnJheS5zZXQoZmluYWxFbnRyeSwgMCwgSW52YWxpZE9iamVjdC5JTlNUQU5DRSk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJQXJyYXkuc2V0KGFycmF5LCBpLCBpbnZTZXR0aW5nKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJCQkJCQlwYXJzZXIuc2tpcFdoaXRlc3BhY2UoKTsKLQkJCQkJCQkJCQljYyA9IHBhcnNlci5yZWFkKCk7Ci0JCQkJCQkJCQkJaWYgKGNjID09ICcsJykgewotCQkJCQkJCQkJCQkvLyBHb29kLCBnZXQgbmV4dAotCQkJCQkJCQkJCQllbnRyeSA9IHBhcnNlU3RyaW5nKHBhcnNlcik7Ci0JCQkJCQkJCQkJfSBlbHNlIGlmIChjYyA9PSAnfScpIHsKLQkJCQkJCQkJCQkJLy8gR29vZCwgcmVhY2hlZCB0aGUgZW5kLgotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQlpZiAoIXBhcnNlci5hdEVuZCgpKSB7Ci0JCQkJCQkJCQkJCQlwYXJzZXIuYmFja3VwKCk7Ci0JCQkJCQkJCQkJCQllbnRyeSA9IHBhcnNlU3RyaW5nKHBhcnNlcik7IC8vIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGJlIGludmFsaWQsIGJ1dCB3ZSdsbCBsZXQgYSB3aGl0ZXNwYWNlIGFsc28gZGVub3RlIG5leHQgZW50cnkuCi0JCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCQkvLyBJdCdzIHJlYWxseSBzY3Jld2VkIHVwLiBUaGUgc3RyaW5nIGp1c3QgZW5kZWQuIExvZyBpdC4KLQkJCQkJCQkJCQkJCUV4Y2VwdGlvbiBlID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihwYXJzZXIudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJCS8vIFNlZSBpZiBCZWFuaW5mbyBwbHVnaW4gaXMgYXZhaWxhYmxlICh3ZSBhcmUgcnVubmluZyB1bmRlciBlY2xpcHNlKS4gSWYgc28sIHVzZSBpdCwgZWxzZSBqdXN0IHByaW50IHRvIGVycm9yLgotCQkJCQkJCQkJCQkJCS8vIFdlIG1heSBiZSBpbiB0aGUgcmVtb3RlIHZtIGFuZCBzbyBpdCB3b24ndCBiZSBhdmFpbGFibGUuCi0JCQkJCQkJCQkJCQkJQ2xhc3MgYmlQbHVnaW5DbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvUGx1Z2luIik7Ci0JCQkJCQkJCQkJCQkJTWV0aG9kIGdldFBsdWdpbiA9IGJpUGx1Z2luQ2xhc3MuZ2V0TWV0aG9kKCJnZXRQbHVnaW4iLCBudWxsKTsKLQkJCQkJCQkJCQkJCQlNZXRob2QgZ2V0TG9nZ2VyID0gYmlQbHVnaW5DbGFzcy5nZXRNZXRob2QoImdldExvZ2dlciIsIG51bGwpOwotCQkJCQkJCQkJCQkJCU1ldGhvZCBsb2cgPSBnZXRMb2dnZXIuZ2V0UmV0dXJuVHlwZSgpLmdldE1ldGhvZCgibG9nIiwgbmV3IENsYXNzW10ge1Rocm93YWJsZS5jbGFzcywgTGV2ZWwuY2xhc3N9KTsKLQkJCQkJCQkJCQkJCQlPYmplY3QgYmlQbHVnaW4gPSBnZXRQbHVnaW4uaW52b2tlKG51bGwsIG51bGwpOwotCQkJCQkJCQkJCQkJCU9iamVjdCBsb2dnZXIgPSBnZXRMb2dnZXIuaW52b2tlKGJpUGx1Z2luLCBudWxsKTsKLQkJCQkJCQkJCQkJCQlsb2cuaW52b2tlKGxvZ2dlciwgbmV3IE9iamVjdFtdIHtlLCBMZXZlbC5XQVJOSU5HfSk7Ci0JCQkJCQkJCQkJCQkJcmV0dXJuIEludmFsaWRPYmplY3QuSU5TVEFOQ0U7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkvLyBOb3QgaW4gZWNsaXBzZSwgc28ganVzdCBwcmludCBzdGFjayB0cmFjZS4KLQkJCQkJCQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQlyZXR1cm4gYXJyYXk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCX0KLQkJfQotCQlyZXR1cm4gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFdyaXRlIG91dCBhbnkgaGlkZGVuIHN0dWZmCi0JCW91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJd3JpdGVPYmplY3QodmFsdWUsIG91dCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3QgdmFsdWUsIE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJb3V0LndyaXRlT2JqZWN0KHZhbHVlKTsKLQkJZWxzZSB7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDbGFzcykKLQkJCQlvdXQud3JpdGVPYmplY3QoKChDbGFzcykgdmFsdWUpLmdldE5hbWUoKSk7Ci0JCQllbHNlIGlmICghdmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuIHx8IHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJCQlvdXQud3JpdGVPYmplY3QodmFsdWUpOwotCQkJCWVsc2UKLQkJCQkJb3V0LndyaXRlT2JqZWN0KEludmFsaWRPYmplY3QuSU5TVEFOQ0UpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBBcnJheSBpcyB0cmlja3kuIFNlZSBpZiBpdCBpcyBvbmUgd2UgY2FuIGhhbmRsZSwgaWYgbm90IHRoZW4gaW52YWxpZC4gCi0JCQkJLy8gVG8gaW5kaWNhdGUgYXJyYXksIHdlIHdpbGwgZmlyc3Qgd3JpdGUgb3V0IHRoZSBDbGFzcyBvZiB0aGUgQ29tcG9uZW50IHR5cGUgb2YgdGhlIGFycmF5IChpdCB3aWxsCi0JCQkJLy8gYmUgY29udmVydGVkIHRvIGJlIE9iamVjdCBvciBPYmplY3RbXS4uLikuCi0JCQkJLy8gVGhpcyB3aWxsIGJlIHRoZSBjbHVlIHRoYXQgYW4gYXJyYXkgaXMgY29taW5nLiBDbGFzcyB2YWx1ZXMgd2lsbCBuZXZlcgotCQkJCS8vIGJlIHJldHVybmVkLCBzbyB0aGF0IGlzIGhvdyB3ZSBjYW4gdGVsbCBpdCBpcyBhbiBhcnJheS4KLQkJCQkvLyBOb3RlOiBUaGUgcmVhc29uIHdlIGFyZSB1c2luZyB0aGUgY29tcG9uZW50IHR5cGUgKGNvbnZlcnRlZCB0byBPYmplY3QpIGlzIGJlY2F1c2UgdG8gcmVjb25zdHJ1Y3Qgb24gdGhlIG90aGVyIHNpZGUgd2UgbmVlZAotCQkJCS8vIHRvIHVzZSB0aGUgY29tcG9uZW50IHR5cGUgcGx1cyBsZW5ndGggb2YgdGhlIGFycmF5J3MgZmlyc3QgZGltZW5zaW9uLgotCQkJCS8vIAotCQkJCS8vIFdlIGNhbiBub3QganVzdCBzZXJpYWxpemUgdGhlIGFycmF5IGluIHRoZSBub3JtYWwgd2F5IGJlY2F1c2UgaXQgbWF5IGNvbnRhaW4gaW52YWxpZCB2YWx1ZXMsIGFuZCB3ZSBuZWVkIHRvIAotCQkJCS8vIGhhbmRsZSB0aGF0LiBBbHNvLCBpZiBpdCB3YXNuJ3QgYW4gT2JqZWN0IGFycmF5LCB3ZSBuZWVkIHRvIHR1cm4gaXQgaW50byBhbiBvYmplY3QgYXJyYXkuIFdlIG5lZWQgY29uc2lzdGVuY3kKLQkJCQkvLyBpbiB0aGF0IGl0IHNob3VsZCBhbHdheXMgYmUgYW4gT2JqZWN0IGFycmF5LgotCQkJCS8vIFNvIG91dHB1dCBmb3JtYXQgd2lsbCBiZToKLQkJCQkvLyBDbGFzcyhjb21wb25lbnQgdHlwZSkKLQkJCQkvLyBpbnQoc2l6ZSBvZiBmaXJzdCBkaW1lbnNpb24pCi0JCQkJLy8gT2JqZWN0KHZhbHVlIG9mIGZpcnN0IGVudHJ5KSAtIEFjdHVhbGx5IHVzZSBvdXQgd3JpdGVPYmplY3QoKSBmb3JtYXQgdG8gYWxsb3cgbmVzdGluZyBvZiBhcnJheXMuCi0JCQkJLy8gT2JqZWN0KHZhbHVlIG9mIHNlY29uZCBlbnRyeSkKLQkJCQkvLyAuLi4gdXAgdG8gc2l6ZSBvZiBkaW1lbnNpb24uCi0JCQkJQ2xhc3MgdHlwZSA9IHZhbHVlLmdldENsYXNzKCk7Ci0JCQkJLy8gU2VlIGlmIGZpbmFsIHR5cGUgaXMgYSB2YWxpZCB0eXBlLgotCQkJCUNsYXNzIGZ0ID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJaW50IGRpbXMgPSAxOwotCQkJCXdoaWxlIChmdC5pc0FycmF5KCkpIHsKLQkJCQkJZGltcysrOwotCQkJCQlmdCA9IGZ0LmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQl9Ci0JCQkJaWYgKGZ0ID09IE9iamVjdC5jbGFzcyB8fCBmdCA9PSBTdHJpbmcuY2xhc3MgfHwgZnQgPT0gQm9vbGVhbi5jbGFzcyB8fCBmdCA9PSBDaGFyYWN0ZXIuY2xhc3MgfHwgZnQuaXNQcmltaXRpdmUoKSB8fCBmdCA9PSBDbGFzcy5jbGFzcyB8fCBOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmdCkpIHsKLQkJCQkJU3RyaW5nIGpuaVR5cGUgPSBkaW1zID09IDEgPyAiamF2YS5sYW5nLk9iamVjdCIgOiBNYXBUeXBlcy5nZXRKTklUeXBlTmFtZSgiamF2YS5sYW5nLk9iamVjdCIsIGRpbXMtMSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IENsYXNzLmZvck5hbWUoam5pVHlwZSk7Ci0JCQkJCQlvdXQud3JpdGVPYmplY3QoY29tcG9uZW50VHlwZSk7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKHZhbHVlKTsKLQkJCQkJCW91dC53cml0ZUludChsZW5ndGgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQkJCXdyaXRlT2JqZWN0KEFycmF5LmdldCh2YWx1ZSwgaSksIG91dCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiBPYmplY3QgYXJyYXlzIGFyZSBhbHdheXMgYXZhaWxhYmxlLgotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCW91dC53cml0ZU9iamVjdChJbnZhbGlkT2JqZWN0LklOU1RBTkNFKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gUmVhZCBpbiBhbnkgaGlkZGVuIHN0dWZmCi0JCWluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCQotCQl2YWx1ZSA9IHJlYWRBY3R1YWxPYmplY3QoaW4pOwotCX0KLQkKLQlwcml2YXRlIE9iamVjdCByZWFkQWN0dWFsT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlPYmplY3QgdmFsID0gaW4ucmVhZE9iamVjdCgpOwotCQlpZiAodmFsIGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCS8vIEl0IG11c3QgYmUgYW4gYXJyYXkuIE9ubHkgQ2xhc3Mgb2JqZWN0cyB0aGF0IGNvbWUgaW4gYXJlIEFycmF5cyBvZiBPYmplY3QuCi0JCQlpbnQgbGVuZ3RoID0gaW4ucmVhZEludCgpOwotCQkJT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoKENsYXNzKSB2YWwsIGxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJQXJyYXkuc2V0KGFycmF5LCBpLCByZWFkQWN0dWFsT2JqZWN0KGluKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHZhbDsJLy8gSXQgaXMgdGhlIHZhbHVlIGl0c2VsZi4KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRmVhdHVyZVJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTczZjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRmVhdHVyZVJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEZlYXR1cmVSZWNvcmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMjo0NDo1MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgRmVhdHVyZURlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBGZWF0dXJlRGVzY3JpcHRvci4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVSZWNvcmQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk3OTI3NjY0OEw7Ci0JCi0JcHVibGljIFN0cmluZyBuYW1lOwkvLyBTb21lIGRlY29yYXRvcnMgdXNlIHRoaXMgYW5kIG90aGVycyBkb24ndC4gRWFjaCBkZWNvcmF0b3IgdHlwZSB3aWxsIGRlY2lkZSB3aGV0aGVyIHRoaXMgaXMgb2YgaW1wb3J0YW5jZS4KLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlOYW1lOwotCXB1YmxpYyBTdHJpbmcgc2hvcnREZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIGNhdGVnb3J5OwotCXB1YmxpYyBib29sZWFuIGV4cGVydDsKLQlwdWJsaWMgYm9vbGVhbiBoaWRkZW47Ci0JcHVibGljIGJvb2xlYW4gcHJlZmVycmVkOwotCXB1YmxpYyBTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lczsKLQlwdWJsaWMgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlW10gYXR0cmlidXRlVmFsdWVzOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0lCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5ODczZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0lCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzAyLzE1IDIyOjQ0OjUyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLSAKLQotLyoqCi0gKiBUaGVzZSBhcmUgY29uc3RhbnRzIG5lZWRlZCBmb3IgdHJhbnNmZXJyaW5nIEJlYW5JbmZvIHJlc3VsdHMgZnJvbSB0aGUgQmVhbkluZm8gVk0uCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzIHsKLQkKLQkvKioKLQkgKiBJbnRyb3NwZWN0aW9uIGJpdCBmbGFnIGluZGljYXRpbmcgZG8gdGhlIEJlYW5EZWNvcmF0b3IuIFNlbnQgdG8gTW9kZWxpbmdCZWFuSW5mby5pbnRyb3NwZWN0IG1ldGhvZC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET19CRUFOX0RFQ09SID0gMHgxOwotCQotCS8qKgotCSAqIEludHJvc3BlY3Rpb24gYml0IGZsYWcgaW5kaWNhdGluZyBkbyB0aGUgUHJvcGVydGllcy4gU2VudCB0byBNb2RlbGluZ0JlYW5JbmZvLmludHJvc3BlY3QgbWV0aG9kLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPX1BST1BFUlRJRVMgPSAweDI7Ci0KLQkvKioKLQkgKiBJbnRyb3NwZWN0aW9uIGJpdCBmbGFnIGluZGljYXRpbmcgZG8gdGhlIE1ldGhvZHMuIFNlbnQgdG8gTW9kZWxpbmdCZWFuSW5mby5pbnRyb3NwZWN0IG1ldGhvZC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET19NRVRIT0RTID0gMHg0OwotCi0JLyoqCi0JICogSW50cm9zcGVjdGlvbiBiaXQgZmxhZyBpbmRpY2F0aW5nIGRvIHRoZSBFdmVudHMuIFNlbnQgdG8gTW9kZWxpbmdCZWFuSW5mby5pbnRyb3NwZWN0IG1ldGhvZC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET19FVkVOVFMgPSAweDg7Ci0KLQkvKioKLQkgKiBCZWFuRGVjb3JhdG9yIHdhcyBzZW50IGNvbW1hbmQgaWQuIAotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBzZW50IHRvIGNhbGxCYWNrKGludCBpZCwgSW5wdXRTdHJlYW0gaXMpLiBUaGUgSW5wdXRTdHJlYW0gd2lsbCBiZSBPYmplY3RzICh1c2UgT2JqZWN0SW5wdXRTdHJlYW0pLiAKLQkgKiBUaGUgc3RyZWFtIHdpbGwgYmUgYnJva2VuIGludG8gc2VjdGlvbnMuCi0JICogRWFjaCBzZWN0aW9uIHdpbGwgYmUgaGVhZGVkIGJ5IHRoZSBjb21tYW5kIGlkIG9mIHRoYXQgc2VjdGlvbiAoZS5nLiBCRUFOX0RFQ09SQVRPUl9TRU5UIG9yIFBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCkuCi0JICogRm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgdGhlIHR5cGUgb2YgaW5wdXQgc3BlY2lmaWMgZGF0YS4gCi0JICogPHA+Ci0JICogVGhlIGRhdGEgZm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgYSBCZWFuUmVjb3JkIGZyb20gdGhlIE9iamVjdElucHV0U3RyZWFtLgotCSAqIAotCSAqIEBzZWUgQmVhblJlY29yZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2tTdHJlYW0oaW50LCBJbnB1dFN0cmVhbSkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUFOX0RFQ09SQVRPUl9TRU5UID0gMTsKLQotCS8qKgotCSAqIFByb3BlcnR5RGVjb3JhdG9ycyBzZW5kIGNvbW1hbmQgaWQuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGJlIHNlbnQgdG8gY2FsbEJhY2soaW50IGlkLCBJbnB1dFN0cmVhbSBpcykuIFRoZSBJbnB1dFN0cmVhbSB3aWxsIGJlIE9iamVjdHMgKHVzZSBPYmplY3RJbnB1dFN0cmVhbSkuIAotCSAqIFRoZSBzdHJlYW0gd2lsbCBiZSBicm9rZW4gaW50byBzZWN0aW9ucy4KLQkgKiBFYWNoIHNlY3Rpb24gd2lsbCBiZSBoZWFkZWQgYnkgdGhlIGNvbW1hbmQgaWQgb2YgdGhhdCBzZWN0aW9uIChlLmcuIEJFQU5fREVDT1JBVE9SX1NFTlQgb3IgUFJPUEVSVFlfREVDT1JBVE9SU19TRU5UKS4KLQkgKiBGb2xsb3dpbmcgdGhlIGNvbW1hbmQgaWQgd2lsbCBiZSB0aGUgdHlwZSBvZiBpbnB1dCBzcGVjaWZpYyBkYXRhLiAKLQkgKiA8cD4KLQkgKiBUaGUgZmlyc3Qgb2JqZWN0IHdpbGwgYmUgIGFuIGludCBhbmQgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIHByb3BlcnRpZXMgYW5kIGVhY2ggb2JqZWN0IGFmdGVyIHRoYXQKLQkgKiB3aWxsIGJlIGEgUHJvcGVydHlSZWNvcmQvSW5kZXhlZFByb3BlcnR5UmVjb3JkLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrU3RyZWFtKGludCwgSW5wdXRTdHJlYW0pCi0JICogQHNlZSBQcm9wZXJ0eVJlY29yZAotCSAqIEBzZWUgSW5kZXhlZFByb3BlcnR5UmVjb3JkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREVDT1JBVE9SU19TRU5UID0gMjsKLQotCS8qKgotCSAqIE1ldGhvZERlY29yYXRvcnMgc2VuZCBjb21tYW5kIGlkLgotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBzZW50IHRvIGNhbGxCYWNrKGludCBpZCwgSW5wdXRTdHJlYW0gaXMpLiBUaGUgSW5wdXRTdHJlYW0gd2lsbCBiZSBPYmplY3RzICh1c2UgT2JqZWN0SW5wdXRTdHJlYW0pLiAKLQkgKiBUaGUgc3RyZWFtIHdpbGwgYmUgYnJva2VuIGludG8gc2VjdGlvbnMuCi0JICogRWFjaCBzZWN0aW9uIHdpbGwgYmUgaGVhZGVkIGJ5IHRoZSBjb21tYW5kIGlkIG9mIHRoYXQgc2VjdGlvbiAoZS5nLiBCRUFOX0RFQ09SQVRPUl9TRU5UIG9yIFBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCkuCi0JICogRm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgdGhlIHR5cGUgb2YgaW5wdXQgc3BlY2lmaWMgZGF0YS4gCi0JICogPHA+Ci0JICogVGhlIElucHV0U3RyZWFtIHdpbGwgYmUgT2JqZWN0cyAodXNlIE9iamVjdElucHV0U3RyZWFtKS4KLQkgKiBUaGUgZmlyc3Qgb2JqZWN0IHdpbGwgYmUgIGFuIGludCBhbmQgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIG1ldGhvZHMgYW5kIGVhY2ggb2JqZWN0IGFmdGVyIHRoYXQKLQkgKiB3aWxsIGJlIGEgTWV0aG9kUmVjb3JkLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrU3RyZWFtKGludCwgSW5wdXRTdHJlYW0pCi0JICogQHNlZSBNZXRob2RSZWNvcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfREVDT1JBVE9SU19TRU5UID0gMzsKLQkKLQkvKioKLQkgKiBFdmVudFNldERlY29yYXRvcnMgc2VuZCBjb21tYW5kIGlkLgotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBzZW50IHRvIGNhbGxCYWNrKGludCBpZCwgSW5wdXRTdHJlYW0gaXMpLiBUaGUgSW5wdXRTdHJlYW0gd2lsbCBiZSBPYmplY3RzICh1c2UgT2JqZWN0SW5wdXRTdHJlYW0pLiAKLQkgKiBUaGUgc3RyZWFtIHdpbGwgYmUgYnJva2VuIGludG8gc2VjdGlvbnMuCi0JICogRWFjaCBzZWN0aW9uIHdpbGwgYmUgaGVhZGVkIGJ5IHRoZSBjb21tYW5kIGlkIG9mIHRoYXQgc2VjdGlvbiAoZS5nLiBCRUFOX0RFQ09SQVRPUl9TRU5UIG9yIFBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCkuCi0JICogRm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgdGhlIHR5cGUgb2YgaW5wdXQgc3BlY2lmaWMgZGF0YS4gCi0JICogPHA+Ci0JICogVGhlIGZpcnN0IG9iamVjdCB3aWxsIGJlICBhbiBpbnQgYW5kIHdpbGwgYmUgdGhlIG51bWJlciBvZiBldmVudHMgYW5kIGVhY2ggb2JqZWN0IGFmdGVyIHRoYXQKLQkgKiB3aWxsIGJlIGEgRXZlbnRTZXRSZWNvcmQuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2tTdHJlYW0oaW50LCBJbnB1dFN0cmVhbSkKLQkgKiBAc2VlIE1ldGhvZFJlY29yZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RFQ09SQVRPUlNfU0VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBEb25lIHNlbmQgY29tbWFuZCBpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgc2VudCB0byBjYWxsQmFjayhpbnQgaWQsIElucHV0U3RyZWFtIGlzKS4gVGhlIElucHV0U3RyZWFtIHdpbGwgYmUgT2JqZWN0cyAodXNlIE9iamVjdElucHV0U3RyZWFtKS4gCi0JICogVGhlIHN0cmVhbSB3aWxsIGJlIGJyb2tlbiBpbnRvIHNlY3Rpb25zLgotCSAqIEVhY2ggc2VjdGlvbiB3aWxsIGJlIGhlYWRlZCBieSB0aGUgY29tbWFuZCBpZCBvZiB0aGF0IHNlY3Rpb24gKGUuZy4gQkVBTl9ERUNPUkFUT1JfU0VOVCBvciBQUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQpLgotCSAqIEZvbGxvd2luZyB0aGUgY29tbWFuZCBpZCB3aWxsIGJlIHRoZSB0eXBlIG9mIGlucHV0IHNwZWNpZmljIGRhdGEuIAotCSAqIDxwPgotCSAqIFRoaXMgY29tbWFuZCBpZCBtZWFucyB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYW5kIGl0IHNob3VsZCByZXR1cm4uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2sjY2FsbGVkQmFja1N0cmVhbShpbnQsIElucHV0U3RyZWFtKQotCSAqIEBzZWUgTWV0aG9kUmVjb3JkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9ORSA9IDU7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0luZGV4ZWRQcm9wZXJ0eVJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JbmRleGVkUHJvcGVydHlSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhNjM5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0luZGV4ZWRQcm9wZXJ0eVJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEluZGV4ZWRQcm9wZXJ0eVJlY29yZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzAyLzE1IDIyOjQ0OjUyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleGVkUHJvcGVydHlSZWNvcmQgZXh0ZW5kcyBQcm9wZXJ0eVJlY29yZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk4MzIyNzk5MEw7Ci0JCi0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgaW5kZXhlZFJlYWRNZXRob2Q7Ci0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgaW5kZXhlZFdyaXRlTWV0aG9kOwotCXB1YmxpYyBTdHJpbmcgaW5kZXhlZFByb3BlcnR5VHlwZU5hbWU7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ludmFsaWRPYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vSW52YWxpZE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODljN2VhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vSW52YWxpZE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEludmFsaWRPYmplY3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMjo0NDo1MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLSAKLQotLyoqCi0gKiBBbiBpbmRpY2F0b3Igb2JqZWN0IGZvciBpbnZhbGlkIG9iamVjdCB0eXBlLiBUaGlzIGlzIHVzZWQgd2l0aCBmZWF0dXJlIGF0dHJpYnV0ZQotICogdmFsdWVzIGZyb20gdGhlIEJlYW5JbmZvIGNsYXNzZXMuIFdlIGNhbiBvbmx5IGhhbmRsZSBjZXJ0YWluIHR5cGVzIHdoZW4gd2UKLSAqIGJyaW5nIHRoZW0gb3ZlciBmcm9tIHRoZSBCZWFuSW5mbyBWTS4gVGhhdCBpcyBiZWNhdXNlIHRoZSBjbGFzc2VzIGluc3RhbnRpYXRlZAotICogaW4gdGhlIEJlYW5JbmZvIGNsYXNzIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBJREUuICBTbyBhbnkgaW52YWxpZCB2YWx1ZQotICogd2lsbCBiZSByZXBsYWNlZCBieSB0aGlzIGNsYXNzIGluc3RhbmNlLgotICogPHA+Ci0gKiBUaGlzIGlzIGEgc2luZ2xldG9uIGNsYXNzLgotICogVGhlcmUgd2lsbCBiZSBvbmUgaW5zdGFuY2UgKEludmFsaWRPYmplY3QuSU5TVEFOQ0UpIGluIHRoZSBzeXN0ZW0uIFRoYXQgd2F5Ci0gKiAiPT0iIGNhbiBiZSB1c2VkIHRvIHRlc3QgZm9yIGl0LgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiBJbnZhbGlkT2JqZWN0LgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW52YWxpZE9iamVjdCBJTlNUQU5DRSA9IG5ldyBJbnZhbGlkT2JqZWN0KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTY0MzgwNDM3MEw7Ci0JCi0JLyoKLQkgKiBOb2JvZHkgZWxzZSBzaG91bGQgY3JlYXRlIG9uZSBvZiB0aGVzZS4KLQkgKi8KLQlwcml2YXRlIEludmFsaWRPYmplY3QoKSB7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vTWV0aG9kUmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL01ldGhvZFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzVhNjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vTWV0aG9kUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogTWV0aG9kUmVjb3JkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjI6NDQ6NTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBNZXRob2REZXNjcmlwdG9yIGluZm8gZnJvbQotICogdGhlIEJlYW5JbmZvIHZtIHRvIHRoZSBJREUgdm0uIEl0IGlzIHNlcmlhbGl6YWJsZSBzbyB0aGF0IGl0IGNhbgotICogYmUgc2VyaWFsaXplZCBmb3IgdHJhbnNtaXNzaW9uLgotICogPHA+Ci0gKiBJdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTWV0aG9kRGVzY3JpcHRvci4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFJlY29yZCBleHRlbmRzIEZlYXR1cmVSZWNvcmQgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODIyMTMxMTBMOwotCQotCS8qKgotCSAqIE1ldGhvZCBzaWduYXR1cmUgZm9yIHRoZSBtZXRob2QgdGhpcyByZWNvcmQgZGVzY3JpYmVzLgotCSAqLwotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIG1ldGhvZEZvckRlc2NyaXB0b3I7Ci0JLyoqCi0JICogUGFyYW1ldGVyIHJlY29yZHMgYXJyYXkuIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmVuJ3QgYW55LgotCSAqLwotCXB1YmxpYyBQYXJhbWV0ZXJSZWNvcmRbXSBwYXJhbWV0ZXJzOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9QYXJhbWV0ZXJSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUGFyYW1ldGVyUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYWM2MDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9QYXJhbWV0ZXJSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQYXJhbWV0ZXJSZWNvcmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMjo0NDo1MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIFBhcmFtZXRlckRlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBQYXJhbWV0ZXJEZXNjcmlwdG9yLgotICogPHA+Ci0gKiBUaGUgb25seSBmaWVsZCBvZiBpbXBvcnRhbmNlIGlzIHRoZSBuYW1lLCBhbmQgdGhhdCBjb21lcyBmcm9tIEZlYXR1cmVSZWNvcmQuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJSZWNvcmQgZXh0ZW5kcyBGZWF0dXJlUmVjb3JkIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODI0Mzg5NTVMOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9Qcm9wZXJ0eVJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9Qcm9wZXJ0eVJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU2NGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUHJvcGVydHlSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQcm9wZXJ0eVJlY29yZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzAyLzE1IDIyOjQ0OjUyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgUHJvcGVydHlEZXNjcmlwdG9yIGluZm8gZnJvbQotICogdGhlIEJlYW5JbmZvIHZtIHRvIHRoZSBJREUgdm0uIEl0IGlzIHNlcmlhbGl6YWJsZSBzbyB0aGF0IGl0IGNhbgotICogYmUgc2VyaWFsaXplZCBmb3IgdHJhbnNtaXNzaW9uLgotICogPHA+Ci0gKiBJdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiB0aGUgUHJvcGVydHlEZXNjcmlwdG9yLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlSZWNvcmQgZXh0ZW5kcyBGZWF0dXJlUmVjb3JkIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1OTc5Mjc2NjQ4TDsKLQkKLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5RWRpdG9yQ2xhc3NOYW1lOwotCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlUeXBlTmFtZTsKLQlwdWJsaWMgUmVmbGVjdE1ldGhvZFJlY29yZCByZWFkTWV0aG9kOwotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIHdyaXRlTWV0aG9kOwotCXB1YmxpYyBSZWZsZWN0RmllbGRSZWNvcmQgZmllbGQ7Ci0JcHVibGljIGJvb2xlYW4gYm91bmQ7Ci0JcHVibGljIGJvb2xlYW4gY29uc3RyYWluZWQ7Ci0JcHVibGljIEJvb2xlYW4gZGVzaWduVGltZTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUmVmbGVjdEZpZWxkUmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1JlZmxlY3RGaWVsZFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk1NzA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUmVmbGVjdEZpZWxkUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUmVmbGVjdEZpZWxkUmVjb3JkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjI6NDQ6NTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGluZm8gZnJvbQotICogdGhlIEJlYW5JbmZvIHZtIHRvIHRoZSBJREUgdm0uIEl0IGlzIHNlcmlhbGl6YWJsZSBzbyB0aGF0IGl0IGNhbgotICogYmUgc2VyaWFsaXplZCBmb3IgdHJhbnNtaXNzaW9uLgotICogPHA+Ci0gKiBJdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZsZWN0RmllbGRSZWNvcmQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODE1MTI0NTNMOwotCQotCXB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lOwotCXB1YmxpYyBTdHJpbmcgZmllbGROYW1lOwotCXB1YmxpYyBib29sZWFuIHJlYWRPbmx5OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0TWV0aG9kUmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1JlZmxlY3RNZXRob2RSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmZjJiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1JlZmxlY3RNZXRob2RSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBSZWZsZWN0TWV0aG9kUmVjb3JkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjI6NDQ6NTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmxlY3RNZXRob2RSZWNvcmQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODE1MTI3NzNMOwotCQotCXB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lOwotCXB1YmxpYyBTdHJpbmcgbWV0aG9kTmFtZTsKLQlwdWJsaWMgU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzOwkvLyBNYXliZSBudWxsIGlmIG5vIHBhcmFtZXRlcnMuCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4Y2FjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNyYy5leGNsdWRlcyA9ICoqLy5jdnNpZ25vcmUKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgotamFycy5jb21waWxlLm9yZGVyID0gLixcCi0gICAgICAgICAgICAgICAgICAgICB2bS9iZWFuaW5mb3ZtLmphcgotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBtb2RlbC8sXAotICAgICAgICAgICAgICAgcm9zZS8sXAotICAgICAgICAgICAgICAgcHJveHkuamFycyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1zb3VyY2UuLiA9IGJlYW5pbmZvQ29tbW9uLyxiZWFuaW5mby8KLXNvdXJjZS52bS9iZWFuaW5mb3ZtLmphciA9IHZtX2JlYW5pbmZvdm0vCi1vdXRwdXQudm0vYmVhbmluZm92bS5qYXIgPSBiaW5fdm1fYmVhbmluZm92bS8KLW91dHB1dC4uID0gYmluLwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9tb2RlbC9iZWFuaW5mby5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL21vZGVsL2JlYW5pbmZvLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzkyNTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL21vZGVsL2JlYW5pbmZvLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImJlYW5pbmZvIgotICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9iZWFuaW5mby5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5iZWFuaW5mbyI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmVhdHVyZURlY29yYXRvciIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VBbm5vdGF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFcXVpdmFsZW50IHRvIEZlYXR1cmVEZXNjcmlwdG9yIGluIGphdmEuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtOb3RlOiBJZiBhbnkgYXR0cmlidXRlIGlzIGV4cGxpY2l0bHkgc2V0IHRoZW4gdGhlIEJlYW5JbmZvL1JlZmxlY3Rpb24gd2lsbCBub3QgYmUgbWVyZ2VkIGludG8gdGhlIGRlY29yYXRvci4gVGhpcyBwcm92aWRlcyBhIHdheSBvZiBvdmVycmlkaW5nIHRoZSBCZWFuSW5mb3MuIEFsc28gZm9yIGFueSBtYW55LXZhbHVlZCBhdHRyaWJ1dGUsIGlmIGl0IGlzIGRlc2lyZWQgdG8gaGF2ZSBpdCBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mbyBmaWxsIGl0IGluLCB0aGVyZSB3aWxsIGJlIGFub3RoZXIgYXR0cmlidXRlIG5hbWVkIG9mIHRoZSBmb3JtICZxdW90O2F0dGlidXR1ZUV4cGxpY2l0RW1wdHkmcXVvdDsgSWYgdGhpcyBpcyB0cnVlIHRoZW4gdGhlIEJlYW5JbmZvIHdpbGwgbm90IG1lcmdlIGluIGFuZCB3aWxsIGxlYXZlIGl0IGVtcHR5LiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7VGhlc2UgY29tbWVudHMgYWJvdXQgbWVyZ2luZyBhcHBseSB0byBhbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGRlY29yYXRvciB0b28uICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc3BsYXlOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNob3J0RGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0ZWdvcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhwZXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoaWRkZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZlcnJlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVyZ2VJbnRyb3NwZWN0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNob3VsZCB0aGUgaW50cm9zcGVjdGlvbiByZXN1bHRzIGJlIG1lcmdlZCBpbnRvIHRoaXMgZGVjb3JhdG9yLiBJZiB0aGlzIGlzIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgaW50cm9zcGVjdGlvbiByZXN1bHRzIGFyZSBpZ25vcmVkIGZvciB0aGlzIHBhcnRpY3VsYXIgZGVjb3JhdG9yLiBUaGlzIGlzIGFuIGludGVybmFsIGZlYXR1cmUgc2ltcGx5IHRvIGFsbG93IGRlc2lyZWQgb3ZlcnJpZGUgY2FwYWJpbGl0aWVzLiBDdXN0b21lcnMgd291bGQgdXNlIGl0IHRvIHByZXZlbnQgQU5ZIGludHJvc3BlY3Rpb24vcmVmbGVjdGlvbiBmcm9tIG9jY3VycmluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0cmlidXRlc0V4cGxpY2l0RW1wdHkiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGF0dHJpYnV0ZXMgYXJlIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBub3QgcmV0cmlldmVkIGZyb20gdGhlIGJlYW5pbmZvL3JlZmxlY3Rpb24uIEN1c3RvbWVycyBzaG91bGQgc2V0IHRoaXMgaWYgdGhleSB3YW50IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gYmUgZW1wdHkgYW5kIG5vdCBtZXJnZWQgd2l0aCB0aGUgQmVhbkluZm8gcmVzdWx0cy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxpY2l0bHlTZXRCaXRzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgYml0ZmxhZyBmb3Igd2hpY2ggYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0IGJ5IEJlYW5JbmZvL1JlZmxlY3Rpb24uJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtUaGlzIGlzIGFuIGludGVybmFsIGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgYnkgdGhlIEJlYW5JbmZvIG1haW50YW5hbmNlLiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxpY2l0RGVjb3JhdG9yRmxhZyIKLSAgICAgICAgZVR5cGU9IiMvL0ltcGxpY2l0SXRlbSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgZGVjb3JhdG9yL2ZlYXR1cmUgaW1wbGljaXQuIFRoaXMgbWVhbnMgY3JlYXRlZCBieSBJbnRyb3NwZWN0aW9uL1JlZmxlY3Rpb24gYW5kIG5vdCBieSBjdXN0b21lci4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO1RoaXMgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCBieSB0aGUgQmVhbkluZm8gbWFpbnRhbmFuY2UuIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXR0cmlidXRlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRmVhdHVyZSBhdHRyaWJ1dGVzLiBLZXkvdmFsdWUgcGFpcnMuIElmIGl0IGlzIGRlc2lyZWQgdGhhdCB0aGUgZmVhdHVyZSBhdHRyaWJ1dGVzIGlzIGV4cGxpY2l0bHkgZW1wdHkgYW5kIG5vdCBoYXZlIEJlYW5JbmZvL3JlZmxlY3Rpb24gc2V0IGl0LCBzZXQgYXR0cmlidXRlc0V4cGxpY2l0RW1wdHkgdG8gdHJ1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmVhbkRlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVEZWNvcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVxdWl2YWxlbnQgdG8gQmVhbkRlY29yYXRvciBpbiBqYXZhLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXJnZVN1cGVyUHJvcGVydGllcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIHByb3BlcnRpZXMgb2Ygc3VwZXIgdHlwZXMgYmUgbWVyZ2VkIHdoZW4gYXNraW5nIGZvciBlQWxsQXR0cmlidXRlcy9lQWxsUmVmZXJlbmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVyZ2VTdXBlck1ldGhvZHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2hvdWxkIHRoZSBtZXRob2RzIG9mIHN1cGVyIHR5cGVzIGJlIG1lcmdlZCB3aGVuIGFza2luZyBmb3IgZUFsbEJlaGF2aW9ycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVyZ2VTdXBlckV2ZW50cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIGV2ZW50cyBvZiBzdXBlciB0eXBlcyBiZSBtZXJnZWQgd2hlbiBhc2tpbmcgZm9yIGVBbGxFdmVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImludHJvc3BlY3RQcm9wZXJ0aWVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNob3VsZCB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBpbnRyb3NwZWN0aW9uIGJlIGFkZGVkIHRvIHRoZSBjbGFzcy4gVGhpcyBhbGxvd3MgcHJvcGVydGllcyB0byBub3QgYmUgaW50cm9zcGVjdGVkIGFuZCB0byB1c2Ugb25seSB3aGF0IGlzIGRlZmluZWQgZXhwbGljaXRseSBpbiB0aGUgSmF2YUNsYXNzIHhtaSBmaWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnRyb3NwZWN0TWV0aG9kcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIG1ldGhvZHMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIG1ldGhvZHMgdG8gbm90IGJlIGludHJvc3BlY3RlZCBhbmQgdG8gdXNlIG9ubHkgd2hhdCBpcyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlIEphdmFDbGFzcyB4bWkgZmlsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW50cm9zcGVjdEV2ZW50cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIGV2ZW50cyBmcm9tIHRoZSBpbnRyb3NwZWN0aW9uIGJlIGFkZGVkIHRvIHRoZSBjbGFzcy4gVGhpcyBhbGxvd3MgZXZlbnRzIHRvIG5vdCBiZSBpbnRyb3NwZWN0ZWQgYW5kIHRvIHVzZSBvbmx5IHdoYXQgaXMgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSBKYXZhQ2xhc3MgeG1pIGZpbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRvQmVhbmluZm8iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBtZWFucyBkbyB3ZSBnbyBhbmQgZ2V0IHRoZSBiZWFuaW5mbyBmcm9tIHRoZSByZW1vdGUgdm0uIElmIGZhbHNlLCB0aGVuIGl0IHdpbGwgbm90IHRyeSB0byBnZXQgdGhlIGJlYW5pbmZvLiBUaGlzIGRvZXNuJ3QgcHJldmVudCBpbnRyb3NwZWN0aW9uIHRocm91Z2ggcmVmbGVjdGlvbi4gVGhhdCBpcyBjb250cm9sZWQgYnkgdGhlIHNlcGFyYXRlIGludHJvc3BlY3QuLi4gYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcyB0byBub3QgdXNlIGluIGdldEFsbFByb3BlcnRpZXMoKS4gVGhlc2UgbmFtZXMgYXJlIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90IGJlIGluaGVyaXRlZCBhbmQgc2hvdWxkIG5vdCBzaG93IHRocm91Z2guIElmIHRoZSBpbmhlcml0ZWQgcHJvcGVydHkgaXMgbm90IG9uIHRoZSBsaXN0IHRoZW4gaXQgd2lsbCBzaG93IGluIGdldEFsbFByb3BlcnRpZXMoKS4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO1RoaXMgbGlzdCB3aWxsIGJlIGVtcHR5IGlmIGFsbCBwcm9wZXJ0aWVzIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJQcm9wZXJ0aWVzIGZsYWcgaXMgZmFsc2UuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtOb3RlOiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgbWVhbnQgdG8gYmUgY2hhbmdlZCBieSBjbGllbnRzLiBJdCBpcyBhbiBpbnRlcm5hbCBhdHRyaWJ1dGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdEluaGVyaXRlZE1ldGhvZE5hbWVzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIG1ldGhvZCBuYW1lcyB0byBub3QgdXNlIGluIGVBbGxPcGVyYXRpb25zKCkuIFRoZXNlIG5hbWVzIGFyZSBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIG9wZXJhdGlvbiBpcyBub3Qgb24gdGhlIGxpc3QgdGhlbiBpdCB3aWxsIHNob3cgaW4gZ2V0QWxsT3BlcmF0aW9ucygpLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7VGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkgaWYgYWxsIG9wZXJhdGlvbnMgYXJlIGluaGVyaXRlZCBvciBpZiB0aGUgbWVyZ2VTdXBlckJlaGF2aW9ycyBmbGFnIGlzIGZhbHNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RJbmhlcml0ZWRFdmVudE5hbWVzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIGV2ZW50IG5hbWVzIHRvIG5vdCB1c2UgaW4gZ2V0QWxsRXZlbnRzKCkuIFRoZXNlIG5hbWVzIGFyZSBldmVudHMgdGhhdCBzaG91bGQgbm90IGJlIGluaGVyaXRlZCBhbmQgc2hvdWxkIG5vdCBzaG93IHRocm91Z2guIElmIHRoZSBpbmhlcml0ZWQgZXZlbnQgaXMgbm90IG9uIHRoZSBsaXN0IHRoZW4gaXQgd2lsbCBzaG93IGluIGdldEFsbEV2ZW50cygpLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7VGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkgaWYgYWxsIGV2ZW50cyBhcmUgaW5oZXJpdGVkIG9yIGlmIHRoZSBtZXJnZVN1cGVyRXZlbnRzIGZsYWcgaXMgZmFsc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImN1c3RvbWl6ZXJDbGFzcyIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFdmVudFNldERlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVEZWNvcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVxdWl2YWxlbnQgdG8gRXZlbnRTZXREZWNvcmF0b3IgaW4gamF2YS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5EZWZhdWx0RXZlbnRTZXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaWNhc3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2V0IHRydWUgaWYgdGhlIGxpc3RlbmVyTWV0aG9kcyBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBpcyBub3QgdG8gaGF2ZSBsaXN0ZW5lciBtZXRob2RzIG1lcmdlZCBpbiBmcm9tIEJlYW5JbmZvIG9yIHJlZmxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZExpc3RlbmVyTWV0aG9kIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vTWV0aG9kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxpc3RlbmVyTWV0aG9kcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQcm94eSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Imxpc3RlbmVyIG1ldGhvZHMuIElmIGl0IGlzIGRlc2lyZWQgdGhhdCB0aGUgbGlzdCBiZSBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mbyBzZXQgaXQsIHRoZW4gc2V0IGxpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkgdG8gdHJ1ZS4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO0xpc3RlbmVyTWV0aG9kcyB3aWxsIGJlIGRlY29yYXRlZCB3aXRoIE1ldGhvZERlY29yYXRvcnMuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtOb3RlOiBUaGlzIGlzIGEgZGVyaXZlZCBzZXR0aW5nLCB3aGljaCBtZWFucyBpdCB3aWxsIG5vdCBub3RpZnkgb3V0IGNoYW5nZXMgdG8gaXQuIFRvIGhlcmUgY2hhbmdlcyB0byBpdCwgbGlzdGVuIG9uICZxdW90O3Nlckxpc3RNdGhkJnF1b3Q7IG5vdGlmaWNhdGlvbnMgaW5zdGVhZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlzdGVuZXJUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlbW92ZUxpc3RlbmVyTWV0aG9kIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vTWV0aG9kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV2ZW50QWRhcHRlckNsYXNzIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRm9yIHNvbWUgbGlzdGVuZXIgaW50ZXJmYWNlcyBhbiBhZGFwdGVyIGNsYXNzIGlzIHByb3ZpZGVkIHRoYXQgaW1wbGVtZW50cyBkZWZhdWx0IG5vLW9wIG1ldGhvZHMsIGUuZy4gamF2YS5hd3QuZXZlbnQuRm9jdXNFdmVudCB3aGljaCBoYXMgamF2YS5hd3QuZXZlbnQuRm9jdXNBZGFwdGVyLiBUaGUgQWRhcHRlciBjbGFzcyBpcyBwcm92aWRlZCBpbiBhIGtleS92YWx1ZSBwYWlyIG9uIHRoZSBqYXZhLmJlYW5zLkV2ZW50U2V0RGVzY3JpcHRvciB3aXRoIGEga2V5IGRlZmluZWQgaW4gYSBzdGF0aWMgZmluYWwgY29uc3RhbnRzIEVWRU5UQURBUFRFUkNMQVNTID0gJnF1b3Q7ZXZlbnRBZGFwdGVyQ2xhc3MmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlckxpc3RNdGhkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFByb3h5IiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgYSBwcml2YXRlIGZlYXR1cmUuIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBvbmx5LiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRGVjb3JhdG9yIiBlU3VwZXJUeXBlcz0iIy8vRmVhdHVyZURlY29yYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXF1aXZhbGVudCB0byBNZXRob2REZWNvcmF0b3IgaW4gamF2YS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFybXNFeHBsaWNpdEVtcHR5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0cnVlIGlmIHRoZSBwYXJtcyBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBpcyBub3QgdG8gaGF2ZSBwYXJhbWV0ZXJzIG1lcmdlZCBpbiBmcm9tIEJlYW5JbmZvIG9yIHJlZmxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlckRlc2NyaXB0b3JzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BhcmFtZXRlckRlY29yYXRvciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIHBhcmFtZXRlciBkZXNjcmlwdG9ycyBsaXN0LiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7Tm90ZTogVGhpcyBpcyBhIGRlcml2ZWQgc2V0dGluZywgd2hpY2ggbWVhbnMgaXQgd2lsbCBub3Qgbm90aWZ5IG91dCBjaGFuZ2VzIHRvIGl0LiBUbyBoZXJlIGNoYW5nZXMgdG8gaXQsIGxpc3RlbiBvbiAmcXVvdDtzZXJQYXJtRGVzYyZxdW90OyBub3RpZmljYXRpb25zIGluc3RlYWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlclBhcm1EZXNjIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BhcmFtZXRlckRlY29yYXRvciIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIGEgcHJpdmF0ZSBmZWF0dXJlLiBJdCBpcyB1c2VkIGludGVybmFsbHkgb25seS4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhcmFtZXRlckRlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVEZWNvcmF0b3IiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgaXMgZXhwbGljaXQgaGVyZSBiZWNhdXNlIHVubGlrZSB0aGUgb3RoZXIgZmVhdHVyZSBkZWNvcmF0b3JzLCB0aGUgbmFtZSBkb2VzIG5vdCBjb21lIGZyb20gdGhlIG9iamVjdCBiZWluZyBkZWNvcmF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlciIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBKYXZhUGFyYW1ldGVyIHRoYXQgdGhpcyBQYXJhbWV0ZXJEZWNvcmF0b3IgaXMgZGVjb3JhdGluZy4gQ2FuJ3QgdXNlIGVEZWNvcmF0ZXMgaW4gdGhpcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHlEZWNvcmF0b3IiIGVTdXBlclR5cGVzPSIjLy9GZWF0dXJlRGVjb3JhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFcXVpdmFsZW50IHRvIFByb3BlcnR5RGVjb3JhdG9yIGluIGphdmEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFByb3BlcnR5VHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQ2xhc3NpZmllciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgcHJvcGVydHkgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFByb3BlcnR5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgcHJvcGVydHkgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InByb3BlcnR5VHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQ2xhc3NpZmllciIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvdW5kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJhaW5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzaWduVGltZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBub3Qgc2V0LCB0aGVuIG5vcm1hbCBkZWZhdWx0IHByb2Nlc3NpbmcuJiN4RDsmI3hBOyYjeEQ7JiN4QTtJZiBzZXQgdHJ1ZSwgdGhlbiB0aGlzIHByb3BlcnR5IGlzIGEgZGVzaWduIHRpbWUgcHJvcGVydHkuIFRoaXMgbWVhbnMgaXQgd2lsbCBzaG93IHVwIGluIHRoZSBwcm9wZXJ0eSBzaGVldCwgYnV0IGl0IHdvbid0IGJlIGFibGUgdG8gYmUgY29ubmVjdGVkIHRvIGF0IHJ1bnRpbWUuIEl0IG1heSBub3QgZXZlbiBiZSBhIHRydWUgYmVhbiBwcm9wZXJ0eSBidXQgaW5zdGVhZCB0aGUgYnVpbGRlciB3aWxsIGtub3cgaG93IHRvIGhhbmRsZSBpdC4mI3hEOyYjeEE7JiN4RDsmI3hBO0lmIHNldCBmYWxzZSwgdGhlbiB0aGlzIHByb3BlcnR5IHdpbGwgbm90IHNob3cgdXAgb24gdGhlIHByb3BlcnR5IHNoZWV0LCBidXQgd2lsbCBiZSBhYmxlIHRvIGJlIGNvbm5lY3RlZCB0byBmb3IgcnVudGltZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx3YXlzSW5jb21wYXRpYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHNldCB0cnVlLCB0aGVuIHdoZW4gbXVsdGlwbGUgb2JqZWN0cyBhcmUgc2VsZWN0ZWQsIHRoaXMgcHJvcGVydHkgaXMgYWx3YXlzIGluY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIuIFNvIGluIHRoaXMgY2FzZSB0aGUgcHJvcGVydHkgd2lsbCBub3Qgc2hvdyB1cCBvbiB0aGUgcHJvcGVydHkgc2hlZXQgaWYgbW9yZSB0aGFuIG9uZSBvYmplY3QgaGFzIGJlZW4gc2VsZWN0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbHRlckZsYWdzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZFJlYWRPbmx5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgZmllbGQgcmVhZC1vbmx5IChpLmUuIGlzIGEgJnF1b3Q7ZmluYWwmcXVvdDsgZmllbGQpLiBUaGlzIGlzIG9ubHkgcmVmZXJlbmNlZCBpZiB0aGUgZmllbGQgcmVmZXJlbmNlIGlzIHNldC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHlFZGl0b3JDbGFzcyIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWFkTWV0aG9kIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vTWV0aG9kIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndyaXRlTWV0aG9kIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vTWV0aG9kIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpZWxkIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vRmllbGQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGlzIGlzIHNldCwgdGhlbiB0aGlzIHByb3BlcnR5IGlzIGEgZmllbGQgYW5kIG5vdCBhIGdldHRlci9zZXR0ZXIgcHJvcGVydHkuIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRoYXQgdGhlIFZpc3VhbCBFZGl0b3IgdXNlcyB0byB0aGUgQmVhbkluZm8gbW9kZWwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL1Byb3BlcnR5RGVjb3JhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFcXVpdmFsZW50IHRvIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleGVkUmVhZE1ldGhvZCIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL01ldGhvZCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleGVkV3JpdGVNZXRob2QiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9NZXRob2QiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUHJveHkiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FT3BlcmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIGp1c3QgYSB3cmFwcGVyIG9mIGEgamF2YSBNZXRob2QuIEl0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIG1ldGhvZCBidXQgZG9lc24ndCBkdXBsaWNhdGUgdGhlIGludGVyZmFjZSBmb3IgaXQuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtNZXRob2RQcm94aWVzIHdpbGwgYmUgaW4gdGhlIGVCZWhhdmlvcnMgc2V0dGluZyBmb3IgYW55IG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIEphdmFDbGFzcyBtZXRob2RzIHNldHRpbmcgc28gdGhhdCB0aGV5IGFyZSBub3QgZHVwbGljYXRlZC4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO01ldGhvZFByb3hpZXMgd291bGQgYWxzbyBoYXZlIE1ldGhvZERlY29yYXRvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL01ldGhvZCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCZWFuRXZlbnQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFFdmVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlbnQgZnJvbSBJbnRyb3NwZWN0aW9uL1JlZmxlY3Rpb24uJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtUaGUgQmVhbkV2ZW50IHdpbGwgYmUgdW5kZXIgdGhlIEphdmFDbGFzcycgZXZlbnRzIGFuZCBhbGxFdmVudHMgZmVhdHVyZS4gRWFjaCBCZWFuRXZlbnQgd2lsbCBiZSBkZWNvcmF0ZWQgYnkgYW4gRXZlbnRTZXREZWNvcmF0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5NYXAkRW50cnkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9GZWF0dXJlQXR0cmlidXRlVmFsdWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgZmVhdHVyZSBhdHRyaWJ1dGUuIEl0IGNhbiBvbmx5IHJlcHJlc2VudCB0aGUgZm9sbG93aW5nOiYjeEQ7JiN4QTsmI3hEOyYjeEE7LSBTdHJpbmcmI3hEOyYjeEE7LSBwcmltaXRpdmVzJiN4RDsmI3hBOy0gYXJyYXkgKHR5cGUgT2JqZWN0KSBjb250YWluaW5nIG1peHR1cmUgb2YgU3RyaW5ncyBhbmQgcHJpbWl0aXZlcyAoYXMgdGhlIG9iamVjdCB0eXBlcykmI3hEOyYjeEE7LSBhcnJheSAodHlwZSBTdHJpbmcpJiN4RDsmI3hBOy0gYXJyYXkgKHR5cGUgcHJpbWl0aXZlKSYjeEQ7JiN4QTsmI3hEOyYjeEE7QW55dGhpbmcgZWxzZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iSW1wbGljaXRJdGVtIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGVudW0gaXMgYW4gaW50ZXJuYWwgZW51bS4gSXQgaXMgdXNlZCBieSBCZWFuSW5mbyBmb3IgY2FjaGUgbWFpbnRlbmFuY2UuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtUaGlzIGVudW0gaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PVF9JTVBMSUNJVCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1lYW5zIHRoaXMgZGVjb3JhdG9yIGlzIG5vdCBpbXBsaWNpdC4gVGhhdCBpcyBpdCB3YXMgY3JlYXRlZCBieSBjdXN0b21lci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU1QTElDSVRfREVDT1JBVE9SIiB2YWx1ZT0iMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgbWVhbnMgdGhhdCB0aGUgZGVjb3JhdG9yIGlzIGltcGxpY2l0LiBUaGF0IGlzIGl0IHdhcyBub3QgY3JlYXRlZCBieSB0aGUgY3VzdG9tZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRSIgdmFsdWU9IjIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIG1lYW5zIHRoZSBkZWNvcmF0b3IgYW5kIHRoZSBmZWF0dXJlIHdoZXJlIGltcGxpY2l0LiBUaGF0IGlzIHRoZXkgd2VyZSBub3QgY3JlYXRlZCBieSB0aGUgY3VzdG9tZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vbW9kZWwvaW50cm9zcGVjdC5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL21vZGVsL2ludHJvc3BlY3QuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjE2YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vbW9kZWwvaW50cm9zcGVjdC5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mbyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8uZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSIiIG1vZGVsTmFtZT0iQmVhbmluZm8iIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnByb3ZpZGVyLkJlYW5pbmZvRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnByZXNlbnRhdGlvbi5CZWFuaW5mb0VkaXRvclBsdWdpbiIKLSAgICB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIiBib29sZWFuRmxhZ3NGaWVsZD0iZUZsYWdzIiBib29sZWFuRmxhZ3NSZXNlcnZlZEJpdHM9IjgiCi0gICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLnJvc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCMvL2phdmEiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcaW50cm9zcGVjdC5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5Xb3Jrc3BhY2VSb290PC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+Li4vLi48L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iQmVhbmluZm8iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIKLSAgICAgIGVjb3JlUGFja2FnZT0iYmVhbmluZm8uZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iYmVhbmluZm8uZWNvcmUjLy9JbXBsaWNpdEl0ZW0iPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJiZWFuaW5mby5lY29yZSMvL0ltcGxpY2l0SXRlbS9OT1RfSU1QTElDSVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iYmVhbmluZm8uZWNvcmUjLy9JbXBsaWNpdEl0ZW0vSU1QTElDSVRfREVDT1JBVE9SIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImJlYW5pbmZvLmVjb3JlIy8vSW1wbGljaXRJdGVtL0lNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2Rpc3BsYXlOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL3Nob3J0RGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvY2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvZXhwZXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2hpZGRlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9wcmVmZXJyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvbWVyZ2VJbnRyb3NwZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2ltcGxpY2l0bHlTZXRCaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2ltcGxpY2l0RGVjb3JhdG9yRmxhZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvYXR0cmlidXRlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9nZXROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL21lcmdlU3VwZXJQcm9wZXJ0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL21lcmdlU3VwZXJNZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL21lcmdlU3VwZXJFdmVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3IvaW50cm9zcGVjdFByb3BlcnRpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3IvaW50cm9zcGVjdE1ldGhvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3IvaW50cm9zcGVjdEV2ZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvci9kb0JlYW5pbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL25vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3Ivbm90SW5oZXJpdGVkTWV0aG9kTmFtZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3Ivbm90SW5oZXJpdGVkRXZlbnROYW1lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvci9jdXN0b21pemVyQ2xhc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9FdmVudFNldERlY29yYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9FdmVudFNldERlY29yYXRvci9pbkRlZmF1bHRFdmVudFNldCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvdW5pY2FzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvbGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvYWRkTGlzdGVuZXJNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9FdmVudFNldERlY29yYXRvci9saXN0ZW5lck1ldGhvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0V2ZW50U2V0RGVjb3JhdG9yL2xpc3RlbmVyVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvcmVtb3ZlTGlzdGVuZXJNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0V2ZW50U2V0RGVjb3JhdG9yL2V2ZW50QWRhcHRlckNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3Ivc2VyTGlzdE10aGQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9NZXRob2REZWNvcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vTWV0aG9kRGVjb3JhdG9yL3Bhcm1zRXhwbGljaXRFbXB0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL01ldGhvZERlY29yYXRvci9wYXJhbWV0ZXJEZXNjcmlwdG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL01ldGhvZERlY29yYXRvci9zZXJQYXJtRGVzYyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJiZWFuaW5mby5lY29yZSMvL1BhcmFtZXRlckRlY29yYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9QYXJhbWV0ZXJEZWNvcmF0b3IvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vUGFyYW1ldGVyRGVjb3JhdG9yL3BhcmFtZXRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL2JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9jb25zdHJhaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvZGVzaWduVGltZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvYWx3YXlzSW5jb21wYXRpYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9maWx0ZXJGbGFncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvZmllbGRSZWFkT25seSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvcHJvcGVydHlFZGl0b3JDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvcmVhZE1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3Ivd3JpdGVNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL2ZpZWxkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9nZXRQcm9wZXJ0eVR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL3NldFByb3BlcnR5VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL3NldFByb3BlcnR5VHlwZS9wcm9wZXJ0eVR5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yL2luZGV4ZWRSZWFkTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IvaW5kZXhlZFdyaXRlTWV0aG9kIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vTWV0aG9kUHJveHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vTWV0aG9kUHJveHkvbWV0aG9kIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vQmVhbkV2ZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y1NWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkCi0jCi0KLQotcGx1Z2luTmFtZT1KYXZhIEVNRiBNb2RlbCBCZWFuSW5mbyAoSW50cm9zcGVjdGlvbikgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLWJlYW5pbmZvTmF0dXJlTmFtZT1KYXZhIE1vZGVsIEJlYW5JbmZvIE5hdHVyZQotcmVnaXN0cmF0aW9ucy5leHRlbnNpb25wb2ludC5uYW1lPUJlYW5JbmZvIGV4dGVuc2lvbiByZWdpc3RyYXRpb25zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxZGNmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVnaXN0cmF0aW9ucyIgbmFtZT0iJXJlZ2lzdHJhdGlvbnMuZXh0ZW5zaW9ucG9pbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvcmVnaXN0cmF0aW9ucy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJCZWFuSW5mb05hdHVyZSIKLSAgICAgICAgIG5hbWU9IiViZWFuaW5mb05hdHVyZU5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyI+Ci0gICAgICA8cnVudGltZT4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmUiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3J1bnRpbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8uZWNvcmUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249ImJlYW5pbmZvQ29uZmlnIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0ib3ZlcnJpZGUiPgotICAgICAgPC9maWxlVHlwZXM+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wcm94eS5qYXJzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcHJveHkuamFycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2ODIwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wcm94eS5qYXJzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi12bS9iZWFuaW5mb3ZtLmphcj0vb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2Jpbl92bV9iZWFuaW5mb3ZtLwotYmVhbmluZm9jb21tb24uamFyPS9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmluX2JlYW5pbmZvY29tbW9uLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Jvc2UvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Jvc2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlM2EzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9yb3NlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSoubWR+Ci0qLmNhfgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Jvc2UvYmVhbmluZm8uY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcm9zZS9iZWFuaW5mby5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjI3Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcm9zZS9iZWFuaW5mby5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAxICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJiZWFuaW5mbyIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbyIpKSkKLSAgICBxdWlkICAgICAgIAkiM0E3OTlBQkIwMzUzIgotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJGZWF0dXJlRGVjb3JhdG9yIgotCSAgICBxdWlkICAgICAgIAkiM0E3OTlCM0UwMUU5IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxFcXVpdmFsZW50IHRvIEZlYXR1cmVEZXNjcmlwdG9yIGluIGphdmEuCi18PHA+Ci18Tm90ZTogSWYgYW55IGF0dHJpYnV0ZSBpcyBleHBsaWNpdGx5IHNldCB0aGVuIHRoZSBCZWFuSW5mby9SZWZsZWN0aW9uIHdpbGwgbm90IGJlIG1lcmdlZCBpbnRvIHRoZSBkZWNvcmF0b3IuIFRoaXMgcHJvdmlkZXMgYSB3YXkgb2Ygb3ZlcnJpZGluZyB0aGUgQmVhbkluZm9zLiBBbHNvIGZvciBhbnkgbWFueS12YWx1ZWQgYXR0cmlidXRlLCBpZiBpdCBpcyBkZXNpcmVkIHRvIGhhdmUgaXQgZXhwbGljaXRseSBlbXB0eSBhbmQgbm90IGhhdmUgQmVhbkluZm8gZmlsbCBpdCBpbiwgdGhlcmUgd2lsbCBiZSBhbm90aGVyIGF0dHJpYnV0ZSBuYW1lZCBvZiB0aGUgZm9ybSAiYXR0aWJ1dHVlRXhwbGljaXRFbXB0eSIgSWYgdGhpcyBpcyB0cnVlIHRoZW4gdGhlIEJlYW5JbmZvIHdpbGwgbm90IG1lcmdlIGluIGFuZCB3aWxsIGxlYXZlIGl0IGVtcHR5LgotfDxwPgotfFRoZXNlIGNvbW1lbnRzIGFib3V0IG1lcmdpbmcgYXBwbHkgdG8gYWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBkZWNvcmF0b3IgdG9vLiAKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzREZBMTg1OTAwREMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUFubm90YXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0Q5OEExQzcwMUFCIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NjdEMEQwMTg0IgotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNwbGF5TmFtZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUNGQ0MwMTMxIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaG9ydERlc2NyaXB0aW9uIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5Q0ZENTAxRTgiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNhdGVnb3J5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJICAgIHF1aWQgICAgICAgCSIzQkEyNzk3MTAyREMiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4cGVydCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUNGRTcwMEZFIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaGlkZGVuIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDAwNTAzMjgiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmZXJyZWQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEMDI0MDMxOCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lcmdlSW50cm9zcGVjdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQTgyQzBBNjAzODkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2hvdWxkIHRoZSBpbnRyb3NwZWN0aW9uIHJlc3VsdHMgYmUgbWVyZ2VkIGludG8gdGhpcyBkZWNvcmF0b3IuIElmIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHRoZSBpbnRyb3NwZWN0aW9uIHJlc3VsdHMgYXJlIGlnbm9yZWQgZm9yIHRoaXMgcGFydGljdWxhciBkZWNvcmF0b3IuIFRoaXMgaXMgYW4gaW50ZXJuYWwgZmVhdHVyZSBzaW1wbHkgdG8gYWxsb3cgZGVzaXJlZCBvdmVycmlkZSBjYXBhYmlsaXRpZXMuIEN1c3RvbWVycyB3b3VsZCB1c2UgaXQgdG8gcHJldmVudCBBTlkgaW50cm9zcGVjdGlvbi9yZWZsZWN0aW9uIGZyb20gb2NjdXJyaW5nLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSIKLQkJICAgIHF1aWQgICAgICAgCSIzQzlCNDkzMjAyNjUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGF0dHJpYnV0ZXMgYXJlIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBub3QgcmV0cmlldmVkIGZyb20gdGhlIGJlYW5pbmZvL3JlZmxlY3Rpb24uIEN1c3RvbWVycyBzaG91bGQgc2V0IHRoaXMgaWYgdGhleSB3YW50IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gYmUgZW1wdHkgYW5kIG5vdCBtZXJnZWQgd2l0aCB0aGUgQmVhbkluZm8gcmVzdWx0cy4gIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbXBsaWNpdGx5U2V0Qml0cyIKLQkJICAgIHF1aWQgICAgICAgCSI0MUU1ODE1RDAyQjkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxBIGJpdGZsYWcgZm9yIHdoaWNoIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldCBieSBCZWFuSW5mby9SZWZsZWN0aW9uLgotfDxwPgotfFRoaXMgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCBieSB0aGUgQmVhbkluZm8gbWFpbnRhbmFuY2UuIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJImxvbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbXBsaWNpdERlY29yYXRvckZsYWciCi0JCSAgICBxdWlkICAgICAgIAkiNDFFNUEwNUQwMjFBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18SXMgdGhpcyBkZWNvcmF0b3IvZmVhdHVyZSBpbXBsaWNpdC4gVGhpcyBtZWFucyBjcmVhdGVkIGJ5IEludHJvc3BlY3Rpb24vUmVmbGVjdGlvbiBhbmQgbm90IGJ5IGN1c3RvbWVyLgotfDxwPgotfFRoaXMgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCBieSB0aGUgQmVhbkluZm8gbWFpbnRhbmFuY2UuIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIkltcGxpY2l0SXRlbSIKLQkJICAgIHF1aWR1ICAgICAgCSI0MUU1OUU1RDAyOTYiKSkpCi0JKG9iamVjdCBDbGFzcyAiQmVhbkRlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEMERGMDJEMSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVxdWl2YWxlbnQgdG8gQmVhbkRlY29yYXRvciBpbiBqYXZhLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERThFMDA3RiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzk5QjNFMDFFOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXJnZVN1cGVyUHJvcGVydGllcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E4MkI3M0UwMjAwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNob3VsZCB0aGUgcHJvcGVydGllcyBvZiBzdXBlciB0eXBlcyBiZSBtZXJnZWQgd2hlbiBhc2tpbmcgZm9yIGVBbGxBdHRyaWJ1dGVzL2VBbGxSZWZlcmVuY2VzLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXJnZVN1cGVyTWV0aG9kcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E4MkI5OTQwMDE1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNob3VsZCB0aGUgbWV0aG9kcyBvZiBzdXBlciB0eXBlcyBiZSBtZXJnZWQgd2hlbiBhc2tpbmcgZm9yIGVBbGxCZWhhdmlvcnMuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lcmdlU3VwZXJFdmVudHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBODJCOTlGMDE2NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTaG91bGQgdGhlIGV2ZW50cyBvZiBzdXBlciB0eXBlcyBiZSBtZXJnZWQgd2hlbiBhc2tpbmcgZm9yIGVBbGxFdmVudHMuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImludHJvc3BlY3RQcm9wZXJ0aWVzIgotCQkgICAgcXVpZCAgICAgICAJIjNBODQyN0VDMDBBNiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTaG91bGQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIHByb3BlcnRpZXMgdG8gbm90IGJlIGludHJvc3BlY3RlZCBhbmQgdG8gdXNlIG9ubHkgd2hhdCBpcyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlIEphdmFDbGFzcyB4bWkgZmlsZS4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGluaXR2ICAgICAgCSJ0cnVlIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW50cm9zcGVjdE1ldGhvZHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0E4NDI4NzUwMUIxIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNob3VsZCB0aGUgbWV0aG9kcyBmcm9tIHRoZSBpbnRyb3NwZWN0aW9uIGJlIGFkZGVkIHRvIHRoZSBjbGFzcy4gVGhpcyBhbGxvd3MgbWV0aG9kcyB0byBub3QgYmUgaW50cm9zcGVjdGVkIGFuZCB0byB1c2Ugb25seSB3aGF0IGlzIGRlZmluZWQgZXhwbGljaXRseSBpbiB0aGUgSmF2YUNsYXNzIHhtaSBmaWxlLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbnRyb3NwZWN0RXZlbnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBODQyODc3MDAwRiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTaG91bGQgdGhlIGV2ZW50cyBmcm9tIHRoZSBpbnRyb3NwZWN0aW9uIGJlIGFkZGVkIHRvIHRoZSBjbGFzcy4gVGhpcyBhbGxvd3MgZXZlbnRzIHRvIG5vdCBiZSBpbnRyb3NwZWN0ZWQgYW5kIHRvIHVzZSBvbmx5IHdoYXQgaXMgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSBKYXZhQ2xhc3MgeG1pIGZpbGUuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvQmVhbmluZm8iCi0JCSAgICBxdWlkICAgICAgIAkiM0M5QTQ2RkMwMjdDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgbWVhbnMgZG8gd2UgZ28gYW5kIGdldCB0aGUgYmVhbmluZm8gZnJvbSB0aGUgcmVtb3RlIHZtLiBJZiBmYWxzZSwgdGhlbiBpdCB3aWxsIG5vdCB0cnkgdG8gZ2V0IHRoZSBiZWFuaW5mby4gVGhpcyBkb2Vzbid0IHByZXZlbnQgaW50cm9zcGVjdGlvbiB0aHJvdWdoIHJlZmxlY3Rpb24uIFRoYXQgaXMgY29udHJvbGVkIGJ5IHRoZSBzZXBhcmF0ZSBpbnRyb3NwZWN0Li4uIGF0dHJpYnV0ZXMuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMiCi0JCSAgICBxdWlkICAgICAgIAkiNDFFRUQ1MEIwMTg1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgbGlzdCBvZiBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMgdG8gbm90IHVzZSBpbiBnZXRBbGxQcm9wZXJ0aWVzKCkuIFRoZXNlIG5hbWVzIGFyZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIHByb3BlcnR5IGlzIG5vdCBvbiB0aGUgbGlzdCB0aGVuIGl0IHdpbGwgc2hvdyBpbiBnZXRBbGxQcm9wZXJ0aWVzKCkuCi18PHA+Ci18VGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkgaWYgYWxsIHByb3BlcnRpZXMgYXJlIGluaGVyaXRlZCBvciBpZiB0aGUgbWVyZ2VTdXBlclByb3BlcnRpZXMgZmxhZyBpcyBmYWxzZS4KLXw8cD4KLXxOb3RlOiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgbWVhbnQgdG8gYmUgY2hhbmdlZCBieSBjbGllbnRzLiBJdCBpcyBhbiBpbnRlcm5hbCBhdHRyaWJ1dGUuCi0JCSAgICAKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdEluaGVyaXRlZE1ldGhvZE5hbWVzIgotCQkgICAgcXVpZCAgICAgICAJIjQxRjAyQzVGMDM5OSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgaXMgdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIG1ldGhvZCBuYW1lcyB0byBub3QgdXNlIGluIGVBbGxPcGVyYXRpb25zKCkuIFRoZXNlIG5hbWVzIGFyZSBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIG9wZXJhdGlvbiBpcyBub3Qgb24gdGhlIGxpc3QgdGhlbiBpdCB3aWxsIHNob3cgaW4gZ2V0QWxsT3BlcmF0aW9ucygpLgotfDxwPgotfFRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5IGlmIGFsbCBvcGVyYXRpb25zIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJCZWhhdmlvcnMgZmxhZyBpcyBmYWxzZS4KLQkJICAgIAotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm90SW5oZXJpdGVkRXZlbnROYW1lcyIKLQkJICAgIHF1aWQgICAgICAgCSI0MUYwMkQwQTAzMTIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIGlzIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBldmVudCBuYW1lcyB0byBub3QgdXNlIGluIGdldEFsbEV2ZW50cygpLiBUaGVzZSBuYW1lcyBhcmUgZXZlbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIGV2ZW50IGlzIG5vdCBvbiB0aGUgbGlzdCB0aGVuIGl0IHdpbGwgc2hvdyBpbiBnZXRBbGxFdmVudHMoKS4KLXw8cD4KLXxUaGlzIGxpc3Qgd2lsbCBiZSBlbXB0eSBpZiBhbGwgZXZlbnRzIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJFdmVudHMgZmxhZyBpcyBmYWxzZS4KLQkJICAgIAotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpKQotCShvYmplY3QgQ2xhc3MgIkV2ZW50U2V0RGVjb3JhdG9yIgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQxRDIwMDRGIgotCSAgICBkb2N1bWVudGF0aW9uIAkiRXF1aXZhbGVudCB0byBFdmVudFNldERlY29yYXRvciBpbiBqYXZhLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERUEyMDBFQyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzk5QjNFMDFFOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbkRlZmF1bHRFdmVudFNldCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQ5NEYwMDRDIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pY2FzdCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQ5NTgwMTY3IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0IxQUY3RDAyODYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2V0IHRydWUgaWYgdGhlIGxpc3RlbmVyTWV0aG9kcyBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBpcyBub3QgdG8gaGF2ZSBsaXN0ZW5lciBtZXRob2RzIG1lcmdlZCBpbiBmcm9tIEJlYW5JbmZvIG9yIHJlZmxlY3Rpb24uIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKSkpCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kRGVjb3JhdG9yIgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQzNUUwMDI3IgotCSAgICBkb2N1bWVudGF0aW9uIAkiRXF1aXZhbGVudCB0byBNZXRob2REZWNvcmF0b3IgaW4gamF2YS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REVBNjAzRTEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFybXNFeHBsaWNpdEVtcHR5IgotCQkgICAgcXVpZCAgICAgICAJIjNCODZBQkU4MDA5MiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdHJ1ZSBpZiB0aGUgcGFybXMgZmVhdHVyZSBpcyBleHBsaWNpdGx5IHNldCBhcyBlbXB0eSBhbmQgaXMgbm90IHRvIGhhdmUgcGFyYW1ldGVycyBtZXJnZWQgaW4gZnJvbSBCZWFuSW5mbyBvciByZWZsZWN0aW9uLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikpKQotCShvYmplY3QgQ2xhc3MgIlBhcmFtZXRlckRlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEOUMyMDMwNCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERUJCMDFDNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzk5QjNFMDFFOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCODZBNjcwMDA5OSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbmFtZSBpcyBleHBsaWNpdCBoZXJlIGJlY2F1c2UgdW5saWtlIHRoZSBvdGhlciBmZWF0dXJlIGRlY29yYXRvcnMsIHRoZSBuYW1lIGRvZXMgbm90IGNvbWUgZnJvbSB0aGUgb2JqZWN0IGJlaW5nIGRlY29yYXRlZC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQcm9wZXJ0eURlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEQTY4MDEwRSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVxdWl2YWxlbnQgdG8gUHJvcGVydHlEZWNvcmF0b3IgaW4gamF2YS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REU5NzAyQkQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHJvcGVydHlUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCOENGNTI2MDM5RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIHByb3BlcnR5IHR5cGUuIgotCQkgICAgcmVzdWx0ICAgICAJIkVDbGFzc2lmaWVyIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNBQ0U0RkVFMDM3MSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRQcm9wZXJ0eVR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDMyOUQxQ0UwMzBFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0aGUgcHJvcGVydHkgdHlwZS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicHJvcGVydHlUeXBlIgotCQkJICAgIHF1aWQgICAgICAgCSI0MzI5RDFFMjAxNjgiCi0JCQkgICAgdHlwZSAgICAgICAJIkVDbGFzc2lmaWVyIgotCQkJICAgIHF1aWR1ICAgICAgCSIzQUNFNEZFRTAzNzEiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJib3VuZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURDMjUwMzAzIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWluZWQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQzJDMDBBMCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2lnblRpbWUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNCQTI3NDU1MDE5QiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfElmIG5vdCBzZXQsIHRoZW4gbm9ybWFsIGRlZmF1bHQgcHJvY2Vzc2luZy4KLXwKLXxJZiBzZXQgdHJ1ZSwgdGhlbiB0aGlzIHByb3BlcnR5IGlzIGEgZGVzaWduIHRpbWUgcHJvcGVydHkuIFRoaXMgbWVhbnMgaXQgd2lsbCBzaG93IHVwIGluIHRoZSBwcm9wZXJ0eSBzaGVldCwgYnV0IGl0IHdvbid0IGJlIGFibGUgdG8gYmUgY29ubmVjdGVkIHRvIGF0IHJ1bnRpbWUuIEl0IG1heSBub3QgZXZlbiBiZSBhIHRydWUgYmVhbiBwcm9wZXJ0eSBidXQgaW5zdGVhZCB0aGUgYnVpbGRlciB3aWxsIGtub3cgaG93IHRvIGhhbmRsZSBpdC4KLXwKLXxJZiBzZXQgZmFsc2UsIHRoZW4gdGhpcyBwcm9wZXJ0eSB3aWxsIG5vdCBzaG93IHVwIG9uIHRoZSBwcm9wZXJ0eSBzaGVldCwgYnV0IHdpbGwgYmUgYWJsZSB0byBiZSBjb25uZWN0ZWQgdG8gZm9yIHJ1bnRpbWUuCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsd2F5c0luY29tcGF0aWJsZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQkEyN0ExNzAwQkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSWYgc2V0IHRydWUsIHRoZW4gd2hlbiBtdWx0aXBsZSBvYmplY3RzIGFyZSBzZWxlY3RlZCwgdGhpcyBwcm9wZXJ0eSBpcyBhbHdheXMgaW5jb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlci4gU28gaW4gdGhpcyBjYXNlIHRoZSBwcm9wZXJ0eSB3aWxsIG5vdCBzaG93IHVwIG9uIHRoZSBwcm9wZXJ0eSBzaGVldCBpZiBtb3JlIHRoYW4gb25lIG9iamVjdCBoYXMgYmVlbiBzZWxlY3RlZC4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaWx0ZXJGbGFncyIKLQkJICAgIHF1aWQgICAgICAgCSIzQkEzQjE4RjAwMzYiCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmllbGRSZWFkT25seSIKLQkJICAgIHF1aWQgICAgICAgCSI0MjA3RTEwMTAxOEUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxJcyB0aGlzIGZpZWxkIHJlYWQtb25seSAoaS5lLiBpcyBhICJmaW5hbCIgZmllbGQpLiBUaGlzIGlzIG9ubHkgcmVmZXJlbmNlZCBpZiB0aGUgZmllbGQgcmVmZXJlbmNlIGlzIHNldC4KLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEQzQ1MDMwOSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVxdWl2YWxlbnQgdG8gSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURFODQwMzg4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlByb3BlcnR5RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTY4MDEwRSIpKSkKLQkob2JqZWN0IENsYXNzICJNZXRob2RQcm94eSIKLQkgICAgcXVpZCAgICAgICAJIjNBODk4NEM5MDFDMyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyBqdXN0IGEgd3JhcHBlciBvZiBhIGphdmEgTWV0aG9kLiBJdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBtZXRob2QgYnV0IGRvZXNuJ3QgZHVwbGljYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGl0LgotfDxwPgotfE1ldGhvZFByb3hpZXMgd2lsbCBiZSBpbiB0aGUgZUJlaGF2aW9ycyBzZXR0aW5nIGZvciBhbnkgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUgSmF2YUNsYXNzIG1ldGhvZHMgc2V0dGluZyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBkdXBsaWNhdGVkLgotfDxwPgotfE1ldGhvZFByb3hpZXMgd291bGQgYWxzbyBoYXZlIE1ldGhvZERlY29yYXRvcnMuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0RGQTE5QjYwMERFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNERBQTIwMEEwIikpKQotCShvYmplY3QgQ2xhc3MgIkJlYW5FdmVudCIKLQkgICAgcXVpZCAgICAgICAJIjNDQjA5Q0E5MDIxMiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18RXZlbnQgZnJvbSBJbnRyb3NwZWN0aW9uL1JlZmxlY3Rpb24uCi18PHA+Ci18VGhlIEJlYW5FdmVudCB3aWxsIGJlIHVuZGVyIHRoZSBKYXZhQ2xhc3MnIGV2ZW50cyBhbmQgYWxsRXZlbnRzIGZlYXR1cmUuIEVhY2ggQmVhbkV2ZW50IHdpbGwgYmUgZGVjb3JhdGVkIGJ5IGFuIEV2ZW50U2V0RGVjb3JhdG9yLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNDQjA5Q0I2MDM4RCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFFdmVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkFGMTAzQzgiKSkpCi0JKG9iamVjdCBDbGFzcyAiRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5IgotCSAgICBxdWlkICAgICAgIAkiNDA0Q0M4NTUwMUY1IgotCSAgICBzdGVyZW90eXBlIAkiTWFwRW50cnkiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDRDQzhCNzAzMDQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJICAgIHF1aWQgICAgICAgCSI0MUU1ODQxNDAxMEEiCi0JCSAgICB0eXBlICAgICAgIAkiRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIgotCQkgICAgcXVpZHUgICAgICAJIjQxRTU4MkY4MDBCQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIgotCSAgICBxdWlkICAgICAgIAkiNDFFNTgyRjgwMEJCIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIGlzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGZlYXR1cmUgYXR0cmlidXRlLiBJdCBjYW4gb25seSByZXByZXNlbnQgdGhlIGZvbGxvd2luZzoKLXwKLXwtIFN0cmluZwotfC0gcHJpbWl0aXZlcwotfC0gYXJyYXkgKHR5cGUgT2JqZWN0KSBjb250YWluaW5nIG1peHR1cmUgb2YgU3RyaW5ncyBhbmQgcHJpbWl0aXZlcyAoYXMgdGhlIG9iamVjdCB0eXBlcykKLXwtIGFycmF5ICh0eXBlIFN0cmluZykKLXwtIGFycmF5ICh0eXBlIHByaW1pdGl2ZSkKLXwKLXxBbnl0aGluZyBlbHNlIGNhbm5vdCBiZSByZXByZXNlbnRlZC4KLQkgICAgCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDFFNTgzQjUwM0NBIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJbXBsaWNpdEl0ZW0iCi0JICAgIHF1aWQgICAgICAgCSI0MUU1OUU1RDAyOTYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgZW51bSBpcyBhbiBpbnRlcm5hbCBlbnVtLiBJdCBpcyB1c2VkIGJ5IEJlYW5JbmZvIGZvciBjYWNoZSBtYWludGVuYW5jZS4KLXw8cD4KLXxUaGlzIGVudW0gaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4KLQkgICAgCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgZXhwb3J0Q29udHJvbCAJIlByb3RlY3RlZCIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTk9UX0lNUExJQ0lUIgotCQkgICAgcXVpZCAgICAgICAJIjQxRTU5RjJBMDBFQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJNZWFucyB0aGlzIGRlY29yYXRvciBpcyBub3QgaW1wbGljaXQuIFRoYXQgaXMgaXQgd2FzIGNyZWF0ZWQgYnkgY3VzdG9tZXIuIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiSU1QTElDSVRfREVDT1JBVE9SIgotCQkgICAgcXVpZCAgICAgICAJIjQxRTU5RjcyMDBCNCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIG1lYW5zIHRoYXQgdGhlIGRlY29yYXRvciBpcyBpbXBsaWNpdC4gVGhhdCBpcyBpdCB3YXMgbm90IGNyZWF0ZWQgYnkgdGhlIGN1c3RvbWVyLiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRSIKLQkJICAgIHF1aWQgICAgICAgCSI0MUU1OUZBMzAzQjciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBtZWFucyB0aGUgZGVjb3JhdG9yIGFuZCB0aGUgZmVhdHVyZSB3aGVyZSBpbXBsaWNpdC4gVGhhdCBpcyB0aGV5IHdlcmUgbm90IGNyZWF0ZWQgYnkgdGhlIGN1c3RvbWVyLiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBxdWlkICAgICAgIAkiM0E3OUNGNkMwMzc4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5Q0Y2RTAwQkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiRmVhdHVyZSBhdHRyaWJ1dGVzLiBLZXkvdmFsdWUgcGFpcnMuIElmIGl0IGlzIGRlc2lyZWQgdGhhdCB0aGUgZmVhdHVyZSBhdHRyaWJ1dGVzIGlzIGV4cGxpY2l0bHkgZW1wdHkgYW5kIG5vdCBoYXZlIEJlYW5JbmZvL3JlZmxlY3Rpb24gc2V0IGl0LCBzZXQgYXR0cmlidXRlc0V4cGxpY2l0RW1wdHkgdG8gdHJ1ZS4iCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiCi0JCSAgICBxdWlkdSAgICAgIAkiNDA0Q0M4NTUwMUY1IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlDRjZFMDBDOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzk5QjNFMDFFOSIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5RDEzNTAyNDgiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImN1c3RvbWl6ZXJDbGFzcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQxMzYwMUQyIgotCQkgICAgbGFiZWwgICAgICAJImN1c3RvbWl6ZXJDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEMTM2MDFFNiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpCZWFuRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMERGMDJEMSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQzMDgwMTI4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJhZGRMaXN0ZW5lck1ldGhvZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDMwOTAzNDYiCi0JCSAgICBsYWJlbCAgICAgIAkiYWRkTGlzdGVuZXJNZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDMwOTAzNUEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5RDNFMTAzNjQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImxpc3RlbmVyTWV0aG9kcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQzRTYwMDdEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18bGlzdGVuZXIgbWV0aG9kcy4gSWYgaXQgaXMgZGVzaXJlZCB0aGF0IHRoZSBsaXN0IGJlIGV4cGxpY2l0bHkgZW1wdHkgYW5kIG5vdCBoYXZlIEJlYW5JbmZvIHNldCBpdCwgdGhlbiBzZXQgbGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSB0byB0cnVlLgotfDxwPgotfExpc3RlbmVyTWV0aG9kcyB3aWxsIGJlIGRlY29yYXRlZCB3aXRoIE1ldGhvZERlY29yYXRvcnMuCi18PHA+Ci18Tm90ZTogVGhpcyBpcyBhIGRlcml2ZWQgc2V0dGluZywgd2hpY2ggbWVhbnMgaXQgd2lsbCBub3Qgbm90aWZ5IG91dCBjaGFuZ2VzIHRvIGl0LiBUbyBoZXJlIGNoYW5nZXMgdG8gaXQsIGxpc3RlbiBvbiAic2VyTGlzdE10aGQiIG5vdGlmaWNhdGlvbnMgaW5zdGVhZC4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJImxpc3RlbmVyTWV0aG9kcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpNZXRob2RQcm94eSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTg5ODRDOTAxQzMiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3IgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEM0U2MDA5MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpFdmVudFNldERlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDFEMjAwNEYiKSkKLQkgICAgZGVyaXZlZCAgICAJVFJVRSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4IgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQ0QTgwMTU4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJsaXN0ZW5lclR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQ0QUEwMzhCIgotCQkgICAgbGFiZWwgICAgICAJImxpc3RlbmVyVHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5IgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlENEFBMDNCNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpFdmVudFNldERlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDFEMjAwNEYiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5RDRERjAyMEIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInJlbW92ZUxpc3RlbmVyTWV0aG9kIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlENEUxMDM5NSIKLQkJICAgIGxhYmVsICAgICAgCSJyZW1vdmVMaXN0ZW5lck1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDRFMTAzQTkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIgotCSAgICBxdWlkICAgICAgIAkiM0E3OURBMUEwMkY3IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYXJhbWV0ZXJEZXNjcmlwdG9ycyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURBMUMwMjMxIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIGxpc3QuCi18PHA+Ci18Tm90ZTogVGhpcyBpcyBhIGRlcml2ZWQgc2V0dGluZywgd2hpY2ggbWVhbnMgaXQgd2lsbCBub3Qgbm90aWZ5IG91dCBjaGFuZ2VzIHRvIGl0LiBUbyBoZXJlIGNoYW5nZXMgdG8gaXQsIGxpc3RlbiBvbiAic2VyUGFybURlc2MiIG5vdGlmaWNhdGlvbnMgaW5zdGVhZC4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJInBhcmFtZXRlckRlc2NyaXB0b3JzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlBhcmFtZXRlckRlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDlDMjAzMDQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REExQzAyMzIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6TWV0aG9kRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMzVFMDAyNyIpKQotCSAgICBkZXJpdmVkICAgIAlUUlVFKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0IgotCSAgICBxdWlkICAgICAgIAkiM0E3OURCMEIwMzM5IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwcm9wZXJ0eUVkaXRvckNsYXNzIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQjBFMDEzRiIKLQkJICAgIGxhYmVsICAgICAgCSJwcm9wZXJ0eUVkaXRvckNsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1IgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQjBFMDE3MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQcm9wZXJ0eURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REE2ODAxMEUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5REJCRDAwMDAiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInJlYWRNZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQkJGMDA3MSIKLQkJICAgIGxhYmVsICAgICAgCSJyZWFkTWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3IgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQkJGMDA4NSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQcm9wZXJ0eURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REE2ODAxMEUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5REJERjAyRDAiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIndyaXRlTWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REJFMTAxRjciCi0JCSAgICBsYWJlbCAgICAgIAkid3JpdGVNZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURCRTEwMjBCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlByb3BlcnR5RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTY4MDEwRSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMCIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlERTM0MDM2RiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW5kZXhlZFJlYWRNZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERTM1MDNDQSIKLQkJICAgIGxhYmVsICAgICAgCSJpbmRleGVkUmVhZE1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REUzNTAzREUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQzQ1MDMwOSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMiIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlERTU0MDE4MCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW5kZXhlZFdyaXRlTWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REU1NTAzRDAiCi0JCSAgICBsYWJlbCAgICAgIAkiaW5kZXhlZFdyaXRlTWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERTU1MDNFNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURDNDUwMzA5IikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0IgotCSAgICBxdWlkICAgICAgIAkiM0E4OTg2NUIwMUQ1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJtZXRob2QiCi0JCSAgICBxdWlkICAgICAgIAkiM0E4OTg2NUMwMUFFIgotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTg5ODY1QzAxQ0MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6TWV0aG9kUHJveHkiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E4OTg0QzkwMUMzIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2IgotCSAgICBxdWlkICAgICAgIAkiM0M5QTZFREQwMkMyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYXJhbWV0ZXIiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0M5QTZFREUwMUZCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBKYXZhUGFyYW1ldGVyIHRoYXQgdGhpcyBQYXJhbWV0ZXJEZWNvcmF0b3IgaXMgZGVjb3JhdGluZy4gQ2FuJ3QgdXNlIGVEZWNvcmF0ZXMgaW4gdGhpcy4iCi0JCSAgICBsYWJlbCAgICAgIAkicGFyYW1ldGVyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjciCi0JCSAgICBxdWlkICAgICAgIAkiM0M5QTZFREUwMjA1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlBhcmFtZXRlckRlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDlDMjAzMDQiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgiCi0JICAgIHF1aWQgICAgICAgCSI0MUYwMTZFNzAwMkUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNlclBhcm1EZXNjIgotCQkgICAgcXVpZCAgICAgICAJIjQxRjAxNkU4MDJBNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIGEgcHJpdmF0ZSBmZWF0dXJlLiBJdCBpcyB1c2VkIGludGVybmFsbHkgb25seS4gIgotCQkgICAgbGFiZWwgICAgICAJInNlclBhcm1EZXNjIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlBhcmFtZXRlckRlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDlDMjAzMDQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlByaXZhdGUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkiCi0JCSAgICBxdWlkICAgICAgIAkiNDFGMDE2RTgwMkIxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86Ok1ldGhvZERlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDM1RTAwMjciCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMCIKLQkgICAgcXVpZCAgICAgICAJIjQxRjExRTcxMDM4NyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZXZlbnRBZGFwdGVyQ2xhc3MiCi0JCSAgICBxdWlkICAgICAgIAkiNDFGMTFFNzMwMjQ5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18Rm9yIHNvbWUgbGlzdGVuZXIgaW50ZXJmYWNlcyBhbiBhZGFwdGVyIGNsYXNzIGlzIHByb3ZpZGVkIHRoYXQgaW1wbGVtZW50cyBkZWZhdWx0IG5vLW9wIG1ldGhvZHMsIGUuZy4gamF2YS5hd3QuZXZlbnQuRm9jdXNFdmVudCB3aGljaCBoYXMgamF2YS5hd3QuZXZlbnQuRm9jdXNBZGFwdGVyLiBUaGUgQWRhcHRlciBjbGFzcyBpcyBwcm92aWRlZCBpbiBhIGtleS92YWx1ZSBwYWlyIG9uIHRoZSBqYXZhLmJlYW5zLkV2ZW50U2V0RGVzY3JpcHRvciB3aXRoIGEga2V5IGRlZmluZWQgaW4gYSBzdGF0aWMgZmluYWwgY29uc3RhbnRzIEVWRU5UQURBUFRFUkNMQVNTID0gImV2ZW50QWRhcHRlckNsYXNzIi4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJImV2ZW50QWRhcHRlckNsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxIgotCQkgICAgcXVpZCAgICAgICAJIjQxRjExRTczMDI1RCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpFdmVudFNldERlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDFEMjAwNEYiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzIiCi0JICAgIHF1aWQgICAgICAgCSI0MUYxMjc4QTAxQTUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNlckxpc3RNdGhkIgotCQkgICAgcXVpZCAgICAgICAJIjQxRjEyNzhCMDIxRiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIGEgcHJpdmF0ZSBmZWF0dXJlLiBJdCBpcyB1c2VkIGludGVybmFsbHkgb25seS4gIgotCQkgICAgbGFiZWwgICAgICAJInNlckxpc3RNdGhkIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86Ok1ldGhvZFByb3h5IgotCQkgICAgcXVpZHUgICAgICAJIjNBODk4NEM5MDFDMyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHJpdmF0ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMyIKLQkJICAgIHF1aWQgICAgICAgCSI0MUYxMjc4QjAyMjkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzQiCi0JICAgIHF1aWQgICAgICAgCSI0MjA3RDgzRjAxREEiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImZpZWxkIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSI0MjA3RDg0MDAyOTAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSWYgdGhpcyBpcyBzZXQsIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBhIGZpZWxkIGFuZCBub3QgYSBnZXR0ZXIvc2V0dGVyIHByb3BlcnR5LiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0aGF0IHRoZSBWaXN1YWwgRWRpdG9yIHVzZXMgdG8gdGhlIEJlYW5JbmZvIG1vZGVsLiIKLQkJICAgIGxhYmVsICAgICAgCSJmaWVsZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNSIKLQkJICAgIHF1aWQgICAgICAgCSI0MjA3RDg0MDAyOTIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6UHJvcGVydHlEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURBNjgwMTBFIikpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkgICAgcXVpZCAgICAgICAJIjNBNzk5QUM4MDM4RSIKLQkgICAgdGl0bGUgICAgICAJIk1haW4iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTk0Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgTm90ZVZpZXcgQDEKLQkJICAgIGxvY2F0aW9uICAgCSgzMjMyLCAxNzEyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoMjk1MCwgMTYyNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk1MjgKLQkJCWxhYmVsICAgICAgCSJMaXN0ZW5lck1ldGhvZHMgd2lsbCBiZSBkZWNvcmF0ZWQgd2l0aCBNZXRob2REZWNvcmF0b3JzLiIpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJNTg4Ci0JCSAgICBoZWlnaHQgICAgIAkxODgpCi0JCShvYmplY3QgTm90ZVZpZXcgQDIKLQkJICAgIGxvY2F0aW9uICAgCSgzMzkyLCAyNzg0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMzA3NiwgMjU2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk4Ci0JCQltYXhfd2lkdGggIAk1OTYKLQkJCWxhYmVsICAgICAgCQotfE1ldGhvZFByb3hpZXMgd2lsbCBiZSBpbiB0aGUgZUJlaGF2aW9ycyBzZXR0aW5nIGZvciBhbnkgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUgSmF2YUNsYXNzIG1ldGhvZHMgc2V0dGluZyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBkdXBsaWNhdGVkLgotfAotfE1ldGhvZFByb3hpZXMgd291bGQgYWxzbyBoYXZlIE1ldGhvZERlY29yYXRvcnMuCi0JCQkpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJNjU2Ci0JCSAgICBoZWlnaHQgICAgIAk0NDQpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUV2ZW50IiBAMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjQ4LCAyNjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgxMTE0LCAyNjE0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFFdmVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCSAgICBxdWlkdSAgICAgIAkiM0M2MkZBRjEwM0M4IgotCQkgICAgd2lkdGggICAgICAJMjg2Ci0JCSAgICBoZWlnaHQgICAgIAkxNzIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkJlYW5FdmVudCIgQDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMjk5MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANAotCQkJbG9jYXRpb24gICAJKDEwOTYsIDI5NDEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmVhbkV2ZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQ0IwOUNBOTAyMTIiCi0JCSAgICB3aWR0aCAgICAgIAkyOTAKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDQjA5Q0I2MDM4RCIKLQkJICAgIGNsaWVudCAgICAgCUA0Ci0JCSAgICBzdXBwbGllciAgIAlAMwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBOb3RlVmlldyBANgotCQkgICAgbG9jYXRpb24gICAJKDE4NTYsIDI5NDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDYKLQkJCWxvY2F0aW9uICAgCSgxNTYxLCAyODE1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTUKLQkJCW1heF93aWR0aCAgCTU1NQotCQkJbGFiZWwgICAgICAJIlRoZSBCZWFuRXZlbnQgd2lsbCBiZSB1bmRlciB0aGUgSmF2YUNsYXNzJyBldmVudHMgYW5kIGFsbEV2ZW50cyBmZWF0dXJlLiBFYWNoIEJlYW5FdmVudCB3aWxsIGJlIGRlY29yYXRlZCBieSBhbiBFdmVudFNldERlY29yYXRvci4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTYxNQotCQkgICAgaGVpZ2h0ICAgICAJMjcwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQW5ub3RhdGlvbiIgQDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgMTI4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQlsb2NhdGlvbiAgIAkoOTA2LCA1NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFQW5ub3RhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCSAgICBxdWlkdSAgICAgIAkiM0Q5OEExQzcwMUFCIgotCQkgICAgd2lkdGggICAgICAJMzE4Ci0JCSAgICBoZWlnaHQgICAgIAkxNzIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPcGVyYXRpb24iIEA4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI4NDgsIDIyNzIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDgKLQkJCWxvY2F0aW9uICAgCSgyNzAyLCAyMTk4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVPcGVyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjM5MDREQUEyMDBBMCIKLQkJICAgIHdpZHRoICAgICAgCTMxMAotCQkgICAgaGVpZ2h0ICAgICAJMTcyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiIEA5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIyMjQsIDE3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOQotCQkJbG9jYXRpb24gICAJKDE4ODcsIDkyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY3NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA5Ci0JCQlsb2NhdGlvbiAgIAkoMTg4NywgNDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY3NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8TWFwRW50cnk+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDA0Q0M4NTUwMUY1IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAOQotCQkJbG9jYXRpb24gICAJKDE4ODcsIDE1MykKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk1ODEpCi0JCSAgICB3aWR0aCAgICAgIAk2OTIKLQkJICAgIGhlaWdodCAgICAgCTI5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIgQDEwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNzIsIDY1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCWxvY2F0aW9uICAgCSg2NjUsIDMyNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk4MTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGZWF0dXJlRGVjb3JhdG9yIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMAotCQkJbG9jYXRpb24gICAJKDY2NSwgMzg2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTEyCi0JCQltYXhfd2lkdGggIAk3MDApCi0JCSAgICB3aWR0aCAgICAgIAk4MzIKLQkJICAgIGhlaWdodCAgICAgCTY4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgMTEwNSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMTAKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEwNzIsIDExMDUpCi0JCQkoMTA3MiwgOTk5KSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0RGQTE4NTkwMERDIgotCQkgICAgY2xpZW50ICAgICAJQDEwCi0JCSAgICBzdXBwbGllciAgIAlANwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMwotCQkgICAgbG9jYXRpb24gICAJKDE2ODIsIDQwMSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlDRjZDMDM3OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlcyIgQDE0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMwotCQkJICAgIGxvY2F0aW9uICAgCSg2MjYsIC02MykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNAotCQkJCWxvY2F0aW9uICAgCSgxNzQ3LCAzMDkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIwNwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZXMiCi0JCQkJcGN0RGlzdCAgICAJMC40NTcwMTIKLQkJCQloZWlnaHQgICAgIAk2MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlDRjZFMDBCRSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMKLQkJCSAgICBzdXBwbGllciAgIAlAOQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNgotCQkJCVBhcmVudF9WaWV3IAlAMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTgxMiwgMzk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjU4NDY1MwotCQkJCWhlaWdodCAgICAgCTQ1Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDE3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMwotCQkJICAgIGxvY2F0aW9uICAgCSg2MjYsIC02MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5Q0Y2RTAwQzgiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlQXR0cmlidXRlVmFsdWUiIEAxOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzNDU2LCAxNzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQlsb2NhdGlvbiAgIAkoMjY4MywgMTE3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE1NDYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGZWF0dXJlQXR0cmlidXRlVmFsdWUiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTgKLQkJCWxvY2F0aW9uICAgCSgyNjgzLCA2NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTU0NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDFFNTgyRjgwMEJCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTgKLQkJCWxvY2F0aW9uICAgCSgyNjgzLCAxNzgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTQ5MykKLQkJICAgIHdpZHRoICAgICAgCTE1NjQKLQkJICAgIGhlaWdodCAgICAgCTI0MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6SW1wbGljaXRJdGVtIiBAMTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI4OCwgNjU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxOQotCQkJbG9jYXRpb24gICAJKDE4MTUsIDU0NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk5NDYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbXBsaWNpdEl0ZW0iKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCWxvY2F0aW9uICAgCSgxODE1LCA0OTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTk0NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDFFNTlFNUQwMjk2IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCWxvY2F0aW9uICAgCSgxODE1LCA2MDgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJODEyKQotCQkgICAgd2lkdGggICAgICAJOTY0Ci0JCSAgICBoZWlnaHQgICAgIAkzNDIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIgQDIwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQzMDQsIDE3OTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIwCi0JCQlsb2NhdGlvbiAgIAkoNDEyNSwgMTcxOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFyYW1ldGVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICB3aWR0aCAgICAgIAkzNzYKLQkJICAgIGhlaWdodCAgICAgCTE3MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6UGFyYW1ldGVyRGVjb3JhdG9yIiBAMjEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDg2NCwgMTM2MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCWxvY2F0aW9uICAgCSg0NjMxLCAxMjc5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhcmFtZXRlckRlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQ5QzIwMzA0IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCWxvY2F0aW9uICAgCSg0NjMxLCAxMzQwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTI5NCkKLQkJICAgIHdpZHRoICAgICAgCTQ4NAotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYiIEAyMgotCQkgICAgbG9jYXRpb24gICAJKDQ1NzgsIDE1NzkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQzlBNkVERDAyQzIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcmFtZXRlciIgQDIzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMgotCQkJICAgIGxvY2F0aW9uICAgCSgxNjY2LCAtMjEpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNAotCQkJCVBhcmVudF9WaWV3IAlAMjMKLQkJCQlsb2NhdGlvbiAgIAkoNDU0MCwgMTY1OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFyYW1ldGVyIgotCQkJCXBjdERpc3QgICAgCTAuMzg2NTk4Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzlBNkVERTAxRkIiCi0JCQkgICAgY2xpZW50ICAgICAJQDIyCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMwotCQkJCWxvY2F0aW9uICAgCSg0NDgwLCAxNTg4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjQxMjM3MQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjciIEAyNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMjIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2NiwgLTIxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDOUE2RURFMDIwNSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjIKLQkJCSAgICBzdXBwbGllciAgIAlAMjEKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFQkIwMUM0IgotCQkgICAgY2xpZW50ICAgICAJQDIxCi0JCSAgICBzdXBwbGllciAgIAlAMTAKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDY1OCwgMTI2NykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjU4LCAxMTA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTEpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86Ok1ldGhvZERlY29yYXRvciIgQDI4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM3MTIsIDEzNjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI4Ci0JCQlsb2NhdGlvbiAgIAkoMzM2MiwgMTI3OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk3MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2REZWNvcmF0b3IiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMzVFMDAyNyIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDI4Ci0JCQlsb2NhdGlvbiAgIAkoMzM2MiwgMTM0MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1OTQpCi0JCSAgICB3aWR0aCAgICAgIAk3MTgKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REVBNjAzRTEiCi0JCSAgICBjbGllbnQgICAgIAlAMjgKLQkJICAgIHN1cHBsaWVyICAgCUAxMAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjk0LCAxMjY3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2OTQsIDExMDUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAMzAKLQkJICAgIGxvY2F0aW9uICAgCSg0MzE0LCAxNDkwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURBMUEwMkY3IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJhbWV0ZXJEZXNjcmlwdG9ycyIgQDMxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMAotCQkJICAgIGxvY2F0aW9uICAgCSgyODQyLCA1OTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMgotCQkJCVBhcmVudF9WaWV3IAlAMzEKLQkJCQlsb2NhdGlvbiAgIAkoNDM4OSwgMTQyNykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDI3Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFyYW1ldGVyRGVzY3JpcHRvcnMiCi0JCQkJcGN0RGlzdCAgICAJMC4zMDgyNjIKLQkJCQloZWlnaHQgICAgIAk2OQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTFDMDIzMSIKLQkJCSAgICBjbGllbnQgICAgIAlAMzAKLQkJCSAgICBzdXBwbGllciAgIAlAMjEKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNDMxNCwgMTQ5MCkKLQkJCQkoNDM3MywgMTUwMykKLQkJCQkoNDYyMSwgMTQyOSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzCi0JCQkJUGFyZW50X1ZpZXcgCUAzMQotCQkJCWxvY2F0aW9uICAgCSg0NTU1LCAxNDkxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjc0NTk3NwotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEAzNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMzAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjg0MiwgNTk0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTFDMDIzMiIKLQkJCSAgICBjbGllbnQgICAgIAlAMzAKLQkJCSAgICBzdXBwbGllciAgIAlAMjgKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOCIgQDM1Ci0JCSAgICBsb2NhdGlvbiAgIAkoNDM4NSwgMTI3MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQxRjAxNkU3MDAyRSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic2VyUGFybURlc2MiIEAzNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2NSwgLTcxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcKLQkJCQlQYXJlbnRfVmlldyAJQDM2Ci0JCQkJbG9jYXRpb24gICAJKDQ1MzQsIDEyNTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI4NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiLXNlclBhcm1EZXNjIgotCQkJCXBjdERpc3QgICAgCTAuNTk1ODkzCi0JCQkJaGVpZ2h0ICAgICAJNDgKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUYwMTZFODAyQTciCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIxCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNgotCQkJCWxvY2F0aW9uICAgCSg0NTkwLCAxMzY0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwNDM4NgotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkiIEAzOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2NSwgLTcxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjAxNkU4MDJCMSIKLQkJCSAgICBjbGllbnQgICAgIAlAMzUKLQkJCSAgICBzdXBwbGllciAgIAlAMjgKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNDM4NSwgMTI3MykKLQkJCQkoNDMyNiwgMTI2MykKLQkJCQkoNDA3MSwgMTMwMikpCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIgQDQwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNTkyLCAzMjY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MAotCQkJbG9jYXRpb24gICAJKDI0OTIsIDMxOTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzY5NjAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICB3aWR0aCAgICAgIAkyMTgKLQkJICAgIGhlaWdodCAgICAgCTE3MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6TWV0aG9kUHJveHkiIEA0MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNTYwLCAyNzY4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MQotCQkJbG9jYXRpb24gICAJKDIzOTgsIDI3MTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzI0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kUHJveHkiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBODk4NEM5MDFDMyIKLQkJICAgIHdpZHRoICAgICAgCTM0MgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDQyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlAMgotCQkgICAgc3VwcGxpZXIgICAJQDQxCi0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQiIEA0MwotCQkgICAgbG9jYXRpb24gICAJKDI1NzUsIDMwMDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTg5ODY1QjAxRDUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZCIgQDQ0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJICAgIGxvY2F0aW9uICAgCSgyNzEsIDEwODQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NQotCQkJCVBhcmVudF9WaWV3IAlANDQKLQkJCQlsb2NhdGlvbiAgIAkoMjUzOSwgMzA3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTYyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuMzc2MDY4Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTg5ODY1QzAxQUUiCi0JCQkgICAgY2xpZW50ICAgICAJQDQzCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2Ci0JCQkJUGFyZW50X1ZpZXcgCUA0NAotCQkJCWxvY2F0aW9uICAgCSgyNjM5LCAzMTU4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUiIEA0NwotCQkJICAgIFBhcmVudF9WaWV3IAlANDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcxLCAxMDg0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBODk4NjVDMDFDQyIKLQkJCSAgICBjbGllbnQgICAgIAlANDMKLQkJCSAgICBzdXBwbGllciAgIAlANDEKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0RGQTE5QjYwMERFIgotCQkgICAgY2xpZW50ICAgICAJQDQxCi0JCSAgICBzdXBwbGllciAgIAlAOAotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA0OQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDYKLQkJICAgIHN1cHBsaWVyICAgCUA0Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiIEA1MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg3NTIsIDIyODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUwCi0JCQlsb2NhdGlvbiAgIAkoNDYwLCAyMjM3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU4NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURDNDUwMzA5IgotCQkgICAgd2lkdGggICAgICAJNjAyCi0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkJlYW5EZWNvcmF0b3IiIEA1MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1MTIsIDE0NTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUxCi0JCQlsb2NhdGlvbiAgIAkoNywgMTE1MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxMDEwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmVhbkRlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQwREYwMkQxIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANTEKLQkJCWxvY2F0aW9uICAgCSg3LCAxMjExKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTExCi0JCQltYXhfd2lkdGggIAk4NjgpCi0JCSAgICB3aWR0aCAgICAgIAkxMDI4Ci0JCSAgICBoZWlnaHQgICAgIAk2MzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFOEUwMDdGIgotCQkgICAgY2xpZW50ICAgICAJQDUxCi0JCSAgICBzdXBwbGllciAgIAlAMTAKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzgxLCAxMTM3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM4MSwgMTEwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDExKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpFdmVudFNldERlY29yYXRvciIgQDUzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI4NDgsIDE0MjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUzCi0JCQlsb2NhdGlvbiAgIAkoMjM5NSwgMTI2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk5MDYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFdmVudFNldERlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANTMKLQkJCWxvY2F0aW9uICAgCSgyMzk1LCAxMzI5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTc3OCkKLQkJICAgIHdpZHRoICAgICAgCTkyNAotCQkgICAgaGVpZ2h0ICAgICAJMzM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlERUEyMDBFQyIKLQkJICAgIGNsaWVudCAgICAgCUA1MwotCQkgICAgc3VwcGxpZXIgICAJQDEwCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI4MzEsIDEyNTUpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgzMSwgMTEwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDExKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDU1Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjY5MiwgMjE0OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEM0UxMDM2NCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibGlzdGVuZXJNZXRob2RzIiBANTYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Ci0JCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNTIpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NwotCQkJCVBhcmVudF9WaWV3IAlANTYKLQkJCQlsb2NhdGlvbiAgIAkoMjU4MCwgMjU4NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzI0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrbGlzdGVuZXJNZXRob2RzIgotCQkJCXBjdERpc3QgICAgCTAuNzkwNTAzCi0JCQkJaGVpZ2h0ICAgICAJMTkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDNFNjAwN0QiCi0JCQkgICAgY2xpZW50ICAgICAJQDU1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQxCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4Ci0JCQkJUGFyZW50X1ZpZXcgCUA1NgotCQkJCWxvY2F0aW9uICAgCSgyNTk4LCAyNTIyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjY3Njk2MQotCQkJCWhlaWdodCAgICAgCTE0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNyIgQDU5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NQotCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMjUyKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEM0U2MDA5MSIKLQkJCSAgICBjbGllbnQgICAgIAlANTUKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANjAKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUAxCi0JCSAgICBzdXBwbGllciAgIAlANTUKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMiIgQDYxCi0JCSAgICBsb2NhdGlvbiAgIAkoMjUyNSwgMjIyMSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQxRjEyNzhBMDFBNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic2VyTGlzdE10aGQiIEA2MgotCQkJICAgIFBhcmVudF9WaWV3IAlANjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCA4MTMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MwotCQkJCVBhcmVudF9WaWV3IAlANjIKLQkJCQlsb2NhdGlvbiAgIAkoMjI5NiwgMjY4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjI5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSItc2VyTGlzdE10aGQiCi0JCQkJcGN0RGlzdCAgICAJMC43NjUwMTIKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjEyNzhCMDIxRiIKLQkJCSAgICBjbGllbnQgICAgIAlANjEKLQkJCSAgICBzdXBwbGllciAgIAlANDEKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMjUyNSwgMjIyMSkKLQkJCQkoMjMwMywgMjc3MSkKLQkJCQkoMjM4OCwgMjc2OSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY0Ci0JCQkJUGFyZW50X1ZpZXcgCUA2MgotCQkJCWxvY2F0aW9uICAgCSgyMjM5LCAyNTg3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjY1NzY5MgotCQkJCWhlaWdodCAgICAgCTEyOQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMzIiBANjUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYxCi0JCQkgICAgbG9jYXRpb24gICAJKDI2OSwgODEzKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjEyNzhCMDIyOSIKLQkJCSAgICBjbGllbnQgICAgIAlANjEKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANjYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUA2Ci0JCSAgICBzdXBwbGllciAgIAlANTMKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDE4NzgsIDI4MDgpCi0JCQkoMjAxNiwgMjAyMSkKLQkJCSgyNjEyLCAxNTkyKSkKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIiBANjcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE2NjQsIDIwOTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDY3Ci0JCQlsb2NhdGlvbiAgIAkoMTU2NCwgMjAyMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2QiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIHdpZHRoICAgICAgCTIxOAotCQkgICAgaGVpZ2h0ICAgICAJMTcyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAiIEA2OAotCQkgICAgbG9jYXRpb24gICAJKDEzMTUsIDIyODkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REUzNDAzNkYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImluZGV4ZWRSZWFkTWV0aG9kIiBANjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ci0JCQkgICAgbG9jYXRpb24gICAJKDU2MywgNDAxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAKLQkJCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQkJbG9jYXRpb24gICAJKDE0MjEsIDIyNzUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQwNAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2luZGV4ZWRSZWFkTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuMzg1MjQ4Ci0JCQkJaGVpZ2h0ICAgICAJMTQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REUzNTAzQ0EiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEzMTUsIDIyODkpCi0JCQkJKDEzNzUsIDIyODkpCi0JCQkJKDE1NTQsIDIxNjgpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQotCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQlsb2NhdGlvbiAgIAkoMTI0OSwgMjIzOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJLTAuMjQwNzc1Ci0JCQkJaGVpZ2h0ICAgICAJNTIKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMSIgQDcyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSg1NjMsIDQwMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REUzNTAzREUiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIiIEA3MwotCQkgICAgbG9jYXRpb24gICAJKDE0NDIsIDIzNjEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REU1NDAxODAiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImluZGV4ZWRXcml0ZU1ldGhvZCIgQDc0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA3MwotCQkJICAgIGxvY2F0aW9uICAgCSg2OTAsIDQ3MykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NAotCQkJCWxvY2F0aW9uICAgCSgxNTk3LCAyMzc0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0MDkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbmRleGVkV3JpdGVNZXRob2QiCi0JCQkJcGN0RGlzdCAgICAJMC41MDExNzcKLQkJCQloZWlnaHQgICAgIAkzNwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlERTU1MDNEMCIKLQkJCSAgICBjbGllbnQgICAgIAlANzMKLQkJCSAgICBzdXBwbGllciAgIAlANjcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTQ0MiwgMjM2MSkKLQkJCQkoMTYzMiwgMjM4MikKLQkJCQkoMTY1NCwgMjE4MikpCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NAotCQkJCWxvY2F0aW9uICAgCSgxNjM5LCAyMzA2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY4MTk3MgotCQkJCWhlaWdodCAgICAgCTIKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMyIgQDc3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA3MwotCQkJICAgIGxvY2F0aW9uICAgCSg2OTAsIDQ3MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REU1NTAzRTQiCi0JCQkgICAgY2xpZW50ICAgICAJQDczCi0JCQkgICAgc3VwcGxpZXIgICAJQDUwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDc4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTg5OCwgMTY5MSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMzA4MDEyOCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiYWRkTGlzdGVuZXJNZXRob2QiIEA3OQotCQkJICAgIFBhcmVudF9WaWV3IAlANzgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNCwgNzk1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAKLQkJCQlQYXJlbnRfVmlldyAJQDc5Ci0JCQkJbG9jYXRpb24gICAJKDE1NjEsIDE4MjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTM4NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2FkZExpc3RlbmVyTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuNjI3Mzg2Ci0JCQkJaGVpZ2h0ICAgICAJOTAKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDMwOTAzNDYiCi0JCQkgICAgY2xpZW50ICAgICAJQDc4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE4OTgsIDE2OTEpCi0JCQkJKDE2NDcsIDE3NjMpCi0JCQkJKDE2NTgsIDIwMDkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MQotCQkJCVBhcmVudF9WaWV3IAlANzkKLQkJCQlsb2NhdGlvbiAgIAkoMTY5OSwgMTg1MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC42OTQwNjgKLQkJCQloZWlnaHQgICAgIAk0OAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEA4MgotCQkJICAgIFBhcmVudF9WaWV3IAlANzgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNCwgNzk1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMzA5MDM1QSIKLQkJCSAgICBjbGllbnQgICAgIAlANzgKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDgzCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE2MiwgMTgxMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlENERGMDIwQiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicmVtb3ZlTGlzdGVuZXJNZXRob2QiIEA4NAotCQkJICAgIFBhcmVudF9WaWV3IAlAODMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgOTE2KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUKLQkJCQlQYXJlbnRfVmlldyAJQDg0Ci0JCQkJbG9jYXRpb24gICAJKDIxMTUsIDE4NDYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3JlbW92ZUxpc3RlbmVyTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuMTI5MDU4Ci0JCQkJaGVpZ2h0ICAgICAJNgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlENEUxMDM5NSIKLQkJCSAgICBjbGllbnQgICAgIAlAODMKLQkJCSAgICBzdXBwbGllciAgIAlANjcKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODYKLQkJCQlQYXJlbnRfVmlldyAJQDg0Ci0JCQkJbG9jYXRpb24gICAJKDE4MzksIDIwNTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDg3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA4MwotCQkJICAgIGxvY2F0aW9uICAgCSgxMjk4LCA5MTYpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OUQ0RTEwM0E5IgotCQkJICAgIGNsaWVudCAgICAgCUA4MwotCQkJICAgIHN1cHBsaWVyICAgCUA1MwotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEA4OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCAyMTkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4OAotCQkJbG9jYXRpb24gICAJKDEwNiwgMjExOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIHdpZHRoICAgICAgCTI4NgotCQkgICAgaGVpZ2h0ICAgICAJMTcyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDg5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMzMyLCAxOTM5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxMzUwMjQ4IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjdXN0b21pemVyQ2xhc3MiIEA5MAotCQkJICAgIFBhcmVudF9WaWV3IAlAODkKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTIsIDEwNDMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MQotCQkJCVBhcmVudF9WaWV3IAlAOTAKLQkJCQlsb2NhdGlvbiAgIAkoMjk4LCAyMDQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitjdXN0b21pemVyQ2xhc3MiCi0JCQkJcGN0RGlzdCAgICAJMC42MzE2NzQKLQkJCQloZWlnaHQgICAgIAk0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxMzYwMUQyIgotCQkJICAgIGNsaWVudCAgICAgCUA4OQotCQkJICAgIHN1cHBsaWVyICAgCUA4OAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MgotCQkJCVBhcmVudF9WaWV3IAlAOTAKLQkJCQlsb2NhdGlvbiAgIAkoMzI2LCAxOTg5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjI4NDE4OAotCQkJCWhlaWdodCAgICAgCTEyCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDkzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4OQotCQkJICAgIGxvY2F0aW9uICAgCSg5MiwgMTA0MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDEzNjAxRTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDg5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUxCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDk0Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTM4NCwgMTg1NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlENEE4MDE1OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibGlzdGVuZXJUeXBlIiBAOTUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Ci0JCQkgICAgbG9jYXRpb24gICAJKDUyMCwgOTU4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTYKLQkJCQlQYXJlbnRfVmlldyAJQDk1Ci0JCQkJbG9jYXRpb24gICAJKDc4MiwgMjA2NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrbGlzdGVuZXJUeXBlIgotCQkJCXBjdERpc3QgICAgCTAuNjEwNjc3Ci0JCQkJaGVpZ2h0ICAgICAJMzMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDRBQTAzOEIiCi0JCQkgICAgY2xpZW50ICAgICAJQDk0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDg4Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3Ci0JCQkJUGFyZW50X1ZpZXcgCUA5NQotCQkJCWxvY2F0aW9uICAgCSg5NzcsIDIwNjEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuNDI5NTkwCi0JCQkJaGVpZ2h0ICAgICAJODMKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5IiBAOTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Ci0JCQkgICAgbG9jYXRpb24gICAJKDUyMCwgOTU4KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlENEFBMDNCNCIKLQkJCSAgICBjbGllbnQgICAgIAlAOTQKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMCIgQDk5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTM5MiwgMTkxMykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQxRjExRTcxMDM4NyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZXZlbnRBZGFwdGVyQ2xhc3MiIEAxMDAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ci0JCQkgICAgbG9jYXRpb24gICAJKC04NjQsIDUwNSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMQotCQkJCVBhcmVudF9WaWV3IAlAMTAwCi0JCQkJbG9jYXRpb24gICAJKDc3MSwgMjEzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzY3Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZXZlbnRBZGFwdGVyQ2xhc3MiCi0JCQkJcGN0RGlzdCAgICAJMC42Mjk3MDIKLQkJCQloZWlnaHQgICAgIAkxMAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjExRTczMDI0OSIKLQkJCSAgICBjbGllbnQgICAgIAlAOTkKLQkJCSAgICBzdXBwbGllciAgIAlAODgKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTM5MiwgMTkxMykKLQkJCQkoNzY2LCAyMTI0KQotCQkJCSgzODMsIDIxNzIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIKLQkJCQlQYXJlbnRfVmlldyAJQDEwMAotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDIxOTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODk4MjU3Ci0JCQkJaGVpZ2h0ICAgICAJMzgKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMSIgQDEwMwotCQkJICAgIFBhcmVudF9WaWV3IAlAOTkKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTg2NCwgNTA1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjExRTczMDI1RCIKLQkJCSAgICBjbGllbnQgICAgIAlAOTkKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiIEAxMDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODE2LCAyNjcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDQKLQkJCWxvY2F0aW9uICAgCSg3MjAsIDI1OTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmllbGQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIHdpZHRoICAgICAgCTIxMAotCQkgICAgaGVpZ2h0ICAgICAJMTc0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQcm9wZXJ0eURlY29yYXRvciIgQDEwNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODA4LCAxNDU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDUKLQkJCWxvY2F0aW9uICAgCSgxMzE2LCAxMjAwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTk4NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlByb3BlcnR5RGVjb3JhdG9yIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REE2ODAxMEUiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMDUKLQkJCWxvY2F0aW9uICAgCSgxMzE2LCAxMjYxKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTkKLQkJCW1heF93aWR0aCAgCTgzOCkKLQkJICAgIHdpZHRoICAgICAgCTEwMDIKLQkJICAgIGhlaWdodCAgICAgCTUzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFODQwMzg4IgotCQkgICAgY2xpZW50ICAgICAJQDUwCi0JCSAgICBzdXBwbGllciAgIAlAMTA1Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REU5NzAyQkQiCi0JCSAgICBjbGllbnQgICAgIAlAMTA1Ci0JCSAgICBzdXBwbGllciAgIAlAMTAKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMTE4OCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzcyLCAxMTA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTEpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNiIgQDEwOAotCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDE5NjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJCRDAwMDAiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInJlYWRNZXRob2QiIEAxMDkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOAotCQkJICAgIGxvY2F0aW9uICAgCSgyMzUsIDEwNzIpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAKLQkJCQlQYXJlbnRfVmlldyAJQDEwOQotCQkJCWxvY2F0aW9uICAgCSgxMzA4LCAyMDMzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNTQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIityZWFkTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuNTUzNzE0Ci0JCQkJaGVpZ2h0ICAgICAJNwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQkJGMDA3MSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTA4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMQotCQkJCVBhcmVudF9WaWV3IAlAMTA5Ci0JCQkJbG9jYXRpb24gICAJKDE0NzEsIDIxMzEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODczMzY1Ci0JCQkJaGVpZ2h0ICAgICAJNzIKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDExMgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Ci0JCQkgICAgbG9jYXRpb24gICAJKDIzNSwgMTA3MikKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJCRjAwODUiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOAotCQkJICAgIHN1cHBsaWVyICAgCUAxMDUKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTAwMywgMTk2OCkKLQkJCQkoOTA5LCAxOTUwKQotCQkJCSgxMzE2LCAxNzI0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOCIgQDExMwotCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDIxMDYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJERjAyRDAiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIndyaXRlTWV0aG9kIiBAMTE0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCAxMjEwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTMyNSwgMjA5MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjU0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrd3JpdGVNZXRob2QiCi0JCQkJcGN0RGlzdCAgICAJMC41NjA5MzAKLQkJCQloZWlnaHQgICAgIAkxMgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQkUxMDFGNyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNgotCQkJCVBhcmVudF9WaWV3IAlAMTE0Ci0JCQkJbG9jYXRpb24gICAJKDE1MDMsIDIwNTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTAxNjMyCi0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDExNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIxMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJFMTAyMEIiCi0JCQkgICAgY2xpZW50ICAgICAJQDExMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMDUKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTAzNSwgMjEwNikKLQkJCQkoOTc1LCAyMTA3KQotCQkJCSgxNDYyLCAxNzI0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNCIgQDExOAotCQkgICAgbG9jYXRpb24gICAJKDg0NCwgMTkwNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQjBCMDMzOSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicHJvcGVydHlFZGl0b3JDbGFzcyIgQDExOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Ci0JCQkgICAgbG9jYXRpb24gICAJKDc2LCAxMDExKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTkKLQkJCQlsb2NhdGlvbiAgIAkoNzc4LCAxOTY3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwcm9wZXJ0eUVkaXRvckNsYXNzIgotCQkJCXBjdERpc3QgICAgCTAuMTY2NDMwCi0JCQkJaGVpZ2h0ICAgICAJMjYKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REIwRTAxM0YiCi0JCQkgICAgY2xpZW50ICAgICAJQDExOAotCQkJICAgIHN1cHBsaWVyICAgCUA4OAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEKLQkJCQlQYXJlbnRfVmlldyAJQDExOQotCQkJCWxvY2F0aW9uICAgCSgxMTIzLCAxOTE1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAktMC40OTAxODIKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNSIgQDEyMgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Ci0JCQkgICAgbG9jYXRpb24gICAJKDc2LCAxMDExKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQjBFMDE3MSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTE4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEwNQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM0IiBAMTIzCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI5NiwgMjE4NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQyMDdEODNGMDFEQSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZmllbGQiIEAxMjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMwotCQkJICAgIGxvY2F0aW9uICAgCSgtMTEyLCA3NzgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUKLQkJCQlQYXJlbnRfVmlldyAJQDEyNAotCQkJCWxvY2F0aW9uICAgCSg5MzgsIDI1MTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTExMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ZpZWxkIgotCQkJCXBjdERpc3QgICAgCTAuODkyNTE1Ci0JCQkJaGVpZ2h0ICAgICAJNTcKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MjA3RDg0MDAyOTAiCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMDQKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTI5NiwgMjE4NikKLQkJCQkoMTEwMywgMjQ2MykKLQkJCQkoOTIxLCAyNTkzKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjQKLQkJCQlsb2NhdGlvbiAgIAkoMTA0NiwgMjU1NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43ODA5ODYKLQkJCQloZWlnaHQgICAgIAk0MwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM1IiBAMTI3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTExMiwgNzc4KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQyMDdEODQwMDI5MiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTIzCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKSkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9yb3NlL2ludHJvc3BlY3QubWRsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcm9zZS9pbnRyb3NwZWN0Lm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjYTllZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9yb3NlL2ludHJvc3BlY3QubWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiSURFIgotCSAgICB2YWx1ZSAgICAgIAkiSW50ZXJuYWwgRWRpdG9yIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIgotCSAgICB2YWx1ZSAgICAgIAkiIikpCi0gICAgcXVpZCAgICAgICAJIjNBNzlFQkE1MDMzMSIKLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDAKLQl0b3BNYXJnaW4gIAkwLjI1MDAwMAotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKLQljbGlwSWNvbkxhYmVscyAJVFJVRQotCWF1dG9SZXNpemUgCVRSVUUKLQlzbmFwVG9HcmlkIAlUUlVFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMjk3IgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0E3OTk5QjcwMkY2IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDI4RSIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjNBNzk5OUFEMDJBMSIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdvcmtzcGFjZVJvb3RcXG9yZy5lY2xpcHNlLmVtZi5lY29yZVxcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FY29yZS5jYXQiCi0JCXF1aWQgICAgICAgCSIzOUE1RUQwNDAwNEUiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqYXZhIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuamVtXFxyb3NlXFxlZG9jamF2YTIuY2F0IgotCQlxdWlkICAgICAgIAkiMzY1NDlGMkMwMDRFIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiYmVhbmluZm8iCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm9cXHJvc2VcXGJlYW5pbmZvLmNhdCIKLQkJcXVpZCAgICAgICAJIjNBNzk5QUJCMDM1MyIpKQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNBNzk5OUI3MDMwOSIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvIiBAMQotCQkJbG9jYXRpb24gICAJKDI3MiwgMjI0KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTQwKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiYmVhbmluZm8iKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjNBNzk5QUJCMDM1MyIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJEZXBlbmRlbmNpZXMgKERvbid0IGVkaXQpIgotCQlxdWlkICAgICAgIAkiM0I4NjlDOTEwMkU0IgotCQl0aXRsZSAgICAgIAkiRGVwZW5kZW5jaWVzIChEb24ndCBlZGl0KSIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWNvcmUiIEAyCi0JCQlsb2NhdGlvbiAgIAkoMjU2LCAyNDApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyLCAxNTYpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpqYXZhIiBAMwotCQkJbG9jYXRpb24gICAJKDg5NiwgMjU2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzCi0JCQkgICAgbG9jYXRpb24gICAJKDc0OSwgMjIyKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiamF2YSIpCi0JCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJICAgIGxvY2F0aW9uICAgCSg3NDksIDE3MikKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkgICAgbmxpbmVzICAgICAJMQotCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiPDxtZXRhbW9kZWw+PiIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCQlxdWlkdSAgICAgIAkiMzY1NDlGMkMwMDRFIgotCQkJd2lkdGggICAgICAJMzA2Ci0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IE5vdGVWaWV3IEA0Ci0JCQlsb2NhdGlvbiAgIAkoNjg4LCA2ODgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjgwLCA1MzIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAk3Ci0JCQkgICAgbWF4X3dpZHRoICAJNzgwCi0JCQkgICAgbGFiZWwgICAgICAJIlRoZXNlIGFyZSBwYWNrYWdlcyAoY2F0IGZpbGVzKSB0aGF0IHRoaXMgbW9kZWwgZGVwZW5kcyBvbi4gVGhleSBtdXN0IG5vdCBiZSBlZGl0ZWQgaW4gaGVyZS4gVGhleSBhcmUgb25seSBiZSBlZGl0ZWQgYnkgdGhlIG1vZGVsIHRoYXQgb3ducyB0aGVtLiIpCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxNjc0NDcwMwotCQkJd2lkdGggICAgICAJODQwCi0JCQloZWlnaHQgICAgIAkzMjUpKSkpKQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDJBMSIKLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0E3OTk5QjcwMkY1IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMkEyIgotCVByb2NzTkRldnMgCShsaXN0Ci0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciCi0JCXF1aWQgICAgICAgCSIzQTc5OTlBRDAyQTQiCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY5IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjb25zdHJhaW50cyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbENvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb250ZW50S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkNvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbXB0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTWl4ZWQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudE9ubHkiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm9wZXJhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKSkKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMkEzIikpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9zY2hlbWEvcmVnaXN0cmF0aW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vc2NoZW1hL3JlZ2lzdHJhdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5MDM4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9zY2hlbWEvcmVnaXN0cmF0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIiBpZD0icmVnaXN0cmF0aW9ucyIgbmFtZT0iQmVhbkluZm8gRXh0ZW5zaW9uIFJlZ2lzdHJhdGlvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byByZWdpc3RlciBjb250cmlidXRvcnMsIGJlYW5pbmZvLCBhbmQgb3ZlcnJpZGVzIGZvciBCZWFuSW5mbyBjb250cmlidXRpb25zLgotJmx0O3AmZ3Q7QW4gaW1wb3J0YW50IGNvbmNlcHQgaXMgdmlzaWJpbGl0eSBvZiBhIGNvbnRhaW5lciwgcGx1Z2luLCBvciBwcm9qZWN0IHRvIHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4gVGhlIHRvcC1sZXZlbCBwcm9qZWN0IGlzIHRoZSBwcm9qZWN0IGJlaW5nIGludHJvc3BlY3RlZC4gRm9yIGEgY29udGFpbmVyLCBwbHVnaW4sIG9yIHByb2plY3QgdG8gYmUgdmlzaWJsZSB0byB0aGF0IHByb2plY3QsIHRoZSBjb250YWluZXIsIHBsdWdpbiwgb3IgcHJvamVjdCBtdXN0IGJlIGluIHRoZSBjbGFzc3BhdGggb2YgdGhlIHRvcC1sZXZlbCBwcm9qZWN0LCBvciBpdCBtdXN0IGJlIGV4cG9ydGVkIGZyb20gYSB2aXNpYmxlIHByb2plY3Qgb3IgcGx1Z2luLiBPbmNlIGEgbm9uLXZpc2libGUgcHJvamVjdC9wbHVnaW4gaXMgcmVhY2hlZCwgYW55IHByb2plY3RzLCBjb250YWluZXJzLCBvciBwbHVnaW5zIHRoYXQgaXQgbWF5IGNvbnRhaW4gYXJlIG5vdCBjb25zaWRlcmVkIHRvIGJlIHZpc2libGUuCi0mbHQ7cCZndDtUaGUgcmVnaXN0cmF0aW9ucyBhcmUgaWRlbnRpZmllZCB3aXRoIHRoZSBjb250YWluZXIgaWQgYW5kL29yIHBsdWdpbiBpZC4gSWYgdGhhdCBjb250YWluZXIgb3IgcGx1Z2luIGlzIHZpc2libGUsIHRoZW4gdGhhdCByZWdpc3RyYXRpb24gd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4gSWYgdGhlIGNvbnRhaW5lci9wbHVnaW4gaXMgZm91bmQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGJ1aWxkIHBhdGggb2YgdGhlIHRvcC1sZXZlbCBwcm9qZWN0LCBpdCB3aWxsIG9ubHkgYmUgcHJvY2Vzc2VkIG9uY2UuCi0mbHQ7cCZndDtUaGVyZSBhcmUgdGhyZWUgZm9ybXMgb2YgcmVnaXN0cmF0aW9ucy4KLSZsdDt1bCZndDsKLSZsdDtsaSZndDtCZWFuSW5mbyByZWdpc3RyYXRpb25zLiBUaGVzZSBzdXBwbHkgc3RhbmRhcmQgQmVhbkluZm8gYW5kIG92ZXJyaWRlcy4KLSZsdDtsaSZndDsmbHQ7c2FtcCZndDtJQ2xhc3NwYXRoQ29udGFpbmVyJmx0Oy9zYW1wJmd0OyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7SUJlYW5JbmZvQ29udHJpYnV0b3ImbHQ7L3NhbXAmZ3Q7LgotJmx0O2xpJmd0O0FuIGV4cGxpY2l0IGNvbnRyaWJ1dG9yIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtJQmVhbkluZm9Db250cmlidXRvciZsdDsvc2FtcCZndDsuCi0mbHQ7L3VsJmd0OwotJmx0O3AmZ3Q7SXQgcnVucyB0aHJvdWdoIHRoZSB2aXNpYmxlIEJlYW5JbmZvIHJlZ2lzdHJhdGlvbnMuIAotJmx0O3AmZ3Q7Ci1UaGUgSUNsYXNzcGF0aENvbnRhaW5lciByZWdpc3RyYXRpb24gaXNuJmFwb3M7dCBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC4gRm9yIGFsbCB2aXNpYmxlIGNvbnRhaW5lcnMsIGlmIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIChmcm9tIEpEVCkgYWxzbyBpbXBsZW1lbnRzIElCZWFuSW5mb0NvbnRyaWJ1dG9yLCB0aGVuIGl0IHdpbGwgYmUgY2FsbGVkIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIEJlYW5JbmZvLgotJmx0O3AmZ3Q7VGhlbiBpdCBydW5zIHRocm91Z2ggdGhlIHZpc2libGUgZXhwbGljaXQgY29udHJpYnV0b3JzLiBOb3RlIHRoYXQgaWYgdGhlIGV4cGxpY2l0IGNvbnRyaWJ1dG9yIGFsc28gaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yJmx0Oy9zYW1wJmd0OyBpdCB3aWxsIGFsc28gYmUgY2FsbGVkIGZvciBwcm94eSBjb250cmlidXRpb25zLiBUaGlzIGFsbG93cyBmb3Igc3BlY2lhbCBzZXR1cCByZXF1aXJlZCBieSBhbnkgY29udHJpYnV0ZWQgQmVhbkluZm8gZm9yIHRoZSBsYXVuY2hlZCBwcm94eSByZWdpc3RyeS4gVGhpcyBzaG91bGRuJmFwb3M7dCBub3JtYWxseSBiZSBuZWNlc3NhcnkgYmVjYXVzZSBub3JtYWwgY2xhc3NwYXRoIHVwZGF0ZXMgdG8gaW5jbHVkZSB0aGUgQmVhbkluZm8gamFyIHdpbGwgYmUgZG9uZSBieSB0aGUgSUJlYW5JbmZvQ29udHJpYnV0b3IgaXRzZWxmIHRocm91Z2ggdGhlIEJlYW5JbmZvIHJlZ2lzdHJhdGlvbiBjYWxsYmFjay4KLSZsdDtwJmd0O1RoZSBvcmRlciBvZiBwcm9jZXNzaW5nIGZvciB0aGUgb3ZlcnJpZGVzIHdpbGwgYmUgdG8gZmlyc3QgcnVuIHRocm91Z2ggdGhlIHNwZWNpZmllZCBvdmVycmlkZXMgKHRocm91Z2ggQmVhbmluZm8gcmVnaXN0cmF0aW9ucykuIFRoZW4gaXQgcnVucyB0aHJvdWdoIHRoZSB2aXNpYmxlIGNvbnRhaW5lcnMgdGhhdCBpbXBsZW1lbnQgSUJlYW5JbmZvQ29udHJpYnV0b3IsIGFuZCB0aGVuIGZpbmFsbHkgaXQgcnVucyB0aHJvdWdoIHRoZSBleHBsaWNpdCBJQmVhbkluZm9Db250cmlidXRvcnMuIFRoaXMgb3JkZXIgaXMgY2hvc2VuIGJlY2F1c2UgdGhlIG92ZXJyaWRlcyBmaWxlcyBhcmUgbm90IGR5bmFtaWMgc28gdGhleSBuZWVkIHRvIGJlIGFwcGxpZWQgaW4gYSBjb25zaXN0ZW50IHdheS4gVGhlIGNvbnRyaWJ1dG9ycyBhcmUgZHluYW1pYyBhbmQgY2FuIGhhbmRsZSBjaGFuZ2UuCi0mbHQ7cCZndDtUaGUgb25seSBvcmRlciBndWFyYW50ZWUgaXMgdGhhdCBjb250cmlidXRpb25zIGZyb20gdGhpcyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBwcm9jZXNzZWQgaW4gcGx1Z2luIG9yZGVyIG9mIHdoZXJlIHRoZSBleHRlbnNpb24gd2FzIGRlY2xhcmVkLiBGb3IgZXhhbXBsZSBpZiB0aGVyZSB3YXMgYW4gZXh0ZW5zaW9uIGRlY2xhcmVkIGluIHBsdWdpbiBBIGFuZCBpbiBwbHVnaW4gQiwgYW5kIHBsdWdpbiBCIHJlcXVpcmVzIHBsdWdpbiBBLCB0aGVuIHRoZSBleHRlbnNpb25zIGRlY2xhcmF0aW9ucyBpbiBwbHVnaW4gQSB3aWxsIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGV4dGVuc2lvbiBkZWNsYXJhdGlvbnMgaW4gcGx1Z2luIEIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlZ2lzdHJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250cmlidXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlZ2lzdHJhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBpcyBhIHJlZ2lzdHJhdGlvbiBmb3IgYSBjb250YWluZXIgb3IgcGx1Z2luLiBJdCBzdXBwbGllcyB0aGUgQmVhbkluZm8gYW5kIHRoZSBvdmVycmlkZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImJlYW5pbmZvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgY29udHJpYnV0b3IgaXMgZm9yIGEgY29udGFpbmVyLiBUaGUgdmFsdWUgaXMgdGhlIGNvbnRhaW5lciBpZCAoZS5nLiAmbHQ7YiZndDsmcXVvdDtKUkVfQ09OVEFJTkVSJnF1b3Q7Jmx0Oy9iJmd0OykuIFRoaXMgd2lsbCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUiZxdW90OyBvciAmcXVvdDsvSlJFX0NPTlRBSU5FUi8uLi4mcXVvdDsuIE9yICZsdDtiJmd0OyZxdW90O0pSRV9DT05UQUlORVIvWFlaJnF1b3Q7Jmx0Oy9iJmd0OyB3b3VsZCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUi9YWVovLi4uJnF1b3Q7LgotJmx0O3AmZ3Q7Ci1Zb3UgY2FuIGFsc28gdXNlIGEgcmVndWxhciBleHByZXNzaW9uLiBBbiBleHByZXNzaW9uIHN1Y2ggYXMgJmx0O2ImZ3Q7JnF1b3Q7U1dUX0NPTlRBSU5FUi8uKi9KRkFDRSZxdW90OyZsdDsvYiZndDsgd2lsbCBtYXRjaCAmcXVvdDsvU1dUX0NPTlRBSU5FUi9QREUvSkZBQ0UmcXVvdDsgYnV0IHdpbGwgbm90IG1hdGNoICZxdW90Oy9TV1RfQ09OVEFJTkVSJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb250cmlidXRvciBpcyBmb3IgYSBwbHVnaW4uIFRoZSB2YWx1ZSBpcyB0aGUgcGx1Z2luIGlkIChlLmcuICZxdW90O29yZy5lY2xpcHNlLnN3dCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRyaWJ1dG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGlzIGEgY29udHJpYnV0b3IgZm9yIHRoZSB2aXNpYmxlIGNvbnRhaW5lci9wbHVnaW4gZGVmaW5lZCBieSBjb250YWluZXIgYW5kIHBsdWdpbiBhdHRyaWJ1dGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgY29udHJpYnV0b3IgaXMgZm9yIGEgY29udGFpbmVyLiBUaGUgdmFsdWUgaXMgdGhlIGNvbnRhaW5lciBpZCAoZS5nLiAmbHQ7YiZndDsmcXVvdDtKUkVfQ09OVEFJTkVSJnF1b3Q7Jmx0Oy9iJmd0OykuIFRoaXMgd2lsbCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUiZxdW90OyBvciAmcXVvdDsvSlJFX0NPTlRBSU5FUi8uLi4mcXVvdDsuIE9yICZsdDtiJmd0OyZxdW90O0pSRV9DT05UQUlORVIvWFlaJnF1b3Q7Jmx0Oy9iJmd0OyB3b3VsZCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUi9YWVovLi4uJnF1b3Q7LgotJmx0O3AmZ3Q7Ci1Zb3UgY2FuIGFsc28gdXNlIGEgcmVndWxhciBleHByZXNzaW9uLiBBbiBleHByZXNzaW9uIHN1Y2ggYXMgJmx0O2ImZ3Q7JnF1b3Q7U1dUX0NPTlRBSU5FUi8uKi9KRkFDRSZxdW90OyZsdDsvYiZndDsgd2lsbCBtYXRjaCAmcXVvdDsvU1dUX0NPTlRBSU5FUi9QREUvSkZBQ0UmcXVvdDsgYnV0IHdpbGwgbm90IG1hdGNoICZxdW90Oy9TV1RfQ09OVEFJTkVSJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb250cmlidXRvciBpcyBmb3IgYSBwbHVnaW4uIFRoZSB2YWx1ZSBpcyB0aGUgcGx1Z2luIGlkIChlLmcuICZxdW90O29yZy5lY2xpcHNlLnN3dCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRyaWJ1dG9yLiBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgSUJlYW5JbmZvQ29udHJpYnV0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbkluZm9Db250cmlidXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJiZWFuaW5mbyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgUHJvdmlkZSBhIEJlYW5JbmZvIGphciBmcm9tIHRoaXMgb3Igc29tZSBvdGhlciBwbHVnaW4sIGFuZCBwcm92aWRlIHNlYXJjaCBwYXRoIHBhY2thZ2VzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWFyY2hwYXRoIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXRoIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIEJlYW5JbmZvIGphciBmcm9tIHdpdGhpbiB0aGlzIG9yIHNvbWUgb3RoZXIgcGx1Z2luLiBJZiBpdCBpcyB3aXRoaW4gdGhpcyBwbHVnaW4sIHRoZXJlIHNob3VsZCBiZSBubyBsZWFkaW5nICZhcG9zOy8mYXBvczsuIFRoZXJlIGNhbiBiZSBzdWJmb2xkZXJzIHRob3VnaCwgZS5nLiAmbHQ7c2FtcCZndDt4eXovcXhyLmphciZsdDsvc2FtcCZndDsuIElmIGl0IGlzIHdpdGhpbiBhbm90aGVyIHBsdWdpbiwgdGhlbiBpdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCB3aXRoIGxlYWRpbmcgJmFwb3M7LyZhcG9zOyBmb2xsb3dlZCBieSBwbHVnaW4gaWQsIGZvbGxvd2VkIGJ5IGEgJmFwb3M7LyZhcG9zOyBhbmQgdGhlbiB0aGUgcGF0aCB0byB0aGUgamFyIHJlbGF0aXZlIHRvIHRoYXQgcGx1Z2luLCBlLmcuICZsdDtzYW1wJmd0Oy9vcmcueHl6L3F4ci9kZGQuamFyJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2VhcmNocGF0aCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBpcyBhIHNlYXJjaCBwYXRoLiBJdCBnaXZlcyB0aGUgcGFja2FnZSB0byBhZGQgdG8gdGhlIHNlYXJjaCBwYXRoIGZvciBCZWFuSW5mby4KLUl0IHJlZmVycyB0byBwYWNrYWdlcyB3aXRoaW4gdGhlIEJlYW5JbmZvIGphciBjb250cmlidXRlZCBieSB0aGUgJmx0O3NhbXAmZ3Q7YmVhbmluZm8mbHQ7L3NhbXAmZ3Q7IGVsZW1lbnQgdGhhdCBpdCBpcyBmb3VuZCB3aXRoaW4uCi1UaGVyZSByZWFsbHkgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBzZWFyY2ggcGF0aC4gVGhlIG9ubHkgd2F5IHRoaXMgamFyIGNvdWxkIGNvbnRyaWJ1dGUgQmVhbkluZm8gYW5kIG5vdCBuZWVkIHNvbWV0aGluZyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggaXMgaWYgdGhlIEJlYW5JbmZvcyBhcmUgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUgYmVhbiBpdHNlbGYuIFRoaXMgaXMgbm90IGEgcmVjb21tZW5kZWQgd2F5IG9mIHN1cHBseWluZyBCZWFuSW5mby4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBqYXZhIHBhY2thZ2UgdG8gc2VhcmNoIGludG8gZm9yIEJlYW5JbmZvLiBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzZWFyY2ggcGF0aHMgaW4gdGhpcyAmbHQ7c2FtcCZndDtiZWFuaW5mbyZsdDsvc2FtcCZndDsgZWxlbWVudCwgdGhlbiB0aGV5IHdpbGwgYmUgc2VhcmNoZWQgaW4gdGhlIG9yZGVyIGZvdW5kIGluIHRoZSBlbGVtZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvdmVycmlkZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0icGFja2FnZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGRlc2NyaWJlcyBhbiBvdmVycmlkZSBmaWxlIGZvciBCZWFuSW5mby4gQW4gb3ZlcnJpZGUgZmlsZSBpcyBhbiBYTUkgZmlsZSB0aGF0IGlzIHJlYWQgd2hlbiBhIGNsYXNzIGlzIGZpcnN0IGludHJvc3BlY3RlZC4gSXQgaGFwcGVucyBiZWZvcmUgdGhlIGFjdHVhbCBpbnRyb3NwZWN0aW9uLiBJdCBhbGxvd3Mgb3ZlcnJpZGVzIHRvIHRoZSBKYXZhIEVNRiBtb2RlbCBjbGFzcyAoJmx0O3NhbXAmZ3Q7SmF2YUNsYXNzJmx0Oy9zYW1wJmd0OykgdGhhdCBjYW4gYmUgZG9uZSB0aHJvdWdoIHN0YW5kYXJkIEJlYW5JbmZvLiBUaGVzZSBhcmUgYW5ub3RhdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIFZpc3VhbCBFZGl0b3IgaW1wbGVtZW50YXRpb24gaW4gRWNsaXBzZS4gVGhlIGFubm90YXRpb25zIGhhdmUgbm8gbWVhbmluZyB0byB0aGUgc3RhbmRhcmQgQmVhbkluZm8gc3BlY2lmaWNhdGlvbiBzbyB0aGV5IGFyZSBzdXBwbGllZCBoZXJlIGluc3RlYWQuIFRoZXkgcHJvdmlkZSBhIG11Y2ggZW5yaWNoZWQgZXhwZXJpZW5jZSBpbiB0aGUgVmlzdWFsIEVkaXRvciBieSBwcm92aWRpbmcgY2xhc3NlcyB0aGF0IHJ1biBpbiB0aGUgZWRpdG9yLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwYWNrYWdlIG9yIGEgcGFja2FnZSBmcmFnbWVudC4gV2hlbiB0aGlzIHBhY2thZ2Ugb3IgcGFja2FnZSBmcmFnbWVudCBtYXRjaGVzIHRoZSBwYWNrYWdlIG9yIGZyYWdtZW50IG9mIGEgY2xhc3MgYmVpbmcgaW50cm9zcGVjdGVkLCB0aGUgc3BlY2lmaWVkIG92ZXJyaWRlIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGFwcGxpZWQuIEZvciBleGFtcGxlIGlmIHRoZSBwYWNrYWdlIHdhcyAmbHQ7c2FtcCZndDtqYXZheC5zd2luZyZsdDsvc2FtcCZndDsgYW5kIHRoZSBwYXRoIHdhcyAmcXVvdDt4eXomcXVvdDssIHRoZW4gZm9yIGNsYXNzICZxdW90O2phdmF4LnN3aW5nLkNvbnRhaW5lciZxdW90OyBpdCB3aWxsIGxvb2sgZm9yIGZpbGUgJnF1b3Q7eHl6L0NvbnRhaW5lci5vdmVycmlkZSZxdW90OywgYW5kIGlmIGZvdW5kLCBpdCB3aWxsIGFwcGx5IGl0LiBJZiBpdCB3YXMgJmx0O3NhbXAmZ3Q7amF2YXguc3dpbmcudGV4dC5KVGV4dENvbXBvbmVudCZsdDsvc2FtcCZndDsgaXQgd2lsbCBsb29rIGZvciBmaWxlICZxdW90O3h5ei90ZXh0L0pUZXh0Q29tcG9uZW50Lm92ZXJyaWRlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIHdoZXJlIHRoaXMgZXh0ZW5zaW9uIGlzIGRlY2xhcmVkIGZvciB0aGUgZm9sZGVyIHRvIHNlYXJjaCBmb3IgdGhlIG92ZXJyaWRlIGZpbGVzLiBTZWUgdGhlIHBhY2thZ2UgYXR0cmlidXRlIGRlc2NyaXB0aW9uIGFib3ZlIGZvciBob3cgdGhpcyB3b3Jrcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcmVnaXN0cmF0aW9uOgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5yZWdpc3RyYXRpb24mcXVvdDsmZ3Q7Ci0gICAgJmx0O3JlZ2lzdHJhdGlvbiBjb250YWluZXI9JnF1b3Q7VkVfQ09OVEFJTkVSJnF1b3Q7Jmd0OwotICAgICAgJmx0O2JlYW5pbmZvIHBhdGg9JnF1b3Q7eHl6YmVhbmluZm8uamFyJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7c2VhcmNocGF0aCBwYWNrYWdlPSZxdW90O2NvbS54eXouYmVhbmluZm8mcXVvdDsvJmd0OwotICAgICAgICAmbHQ7c2VhcmNocGF0aCBwYWNrYWdlPSZxdW90O2NvbS54eXoucXhyLmJlYW5pbmZvJnF1b3Q7LyZndDsKLSAgICAgICZsdDsvYmVhbmluZm8mZ3Q7Ci0gICAgICAmbHQ7b3ZlcnJpZGUgcGFja2FnZT0mcXVvdDtjb20ueHl6JnF1b3Q7IHBhdGg9JnF1b3Q7b3ZlcnJpZGVzL2UmcXVvdDsvJmd0OwotICAgICZsdDsvcmVnaXN0cmF0aW9uJmd0OwotICAgICZsdDtjb250cmlidXRvciBwbHVnaW49JnF1b3Q7b3JnLmVjbGlwc2UudmUmcXVvdDsgY2xhc3M9JnF1b3Q7Y29tLnh5ei5teUNvbnRyaWJ1dG9yJnF1b3Q7LyZndDsKLSAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhpcyBzYXlzIHRoYXQgaWYgY29udGFpbmVyICZxdW90O1ZFX0NPTlRBSU5FUiZxdW90OyBpcyB2aXNpYmxlIHRvIHRoZSBwcm9qZWN0IGJlaW5nIGludHJvc3BlY3RlZCwgdGhlbiB0aGVuIEJlYW5JbmZvIGphciAmcXVvdDt4eXpiZWFuaW5mby5qYXImcXVvdDsgKGZvdW5kIGluIHRoZSBwbHVnaW4gdGhhdCBkZWNsYXJlZCB0aGlzIGV4dGVuc2lvbikgd2lsbCBiZSBsb29rZWQgaW50byBmb3IgQmVhbkluZm9zLiBUaGUgdHdvIHBhY2thZ2VzIGxpc3RlZCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZWFyY2ggcGF0aCBvZiBwYWNrYWdlcy4KLSZsdDtwJmd0OwotVGhlIG92ZXJyaWRlIHNheXMgdGhhdCwgYWdhaW4gZm9yICZxdW90O1ZFX0NPTlRBSU5FUiZxdW90OyB2aXNpYmxlLCBmb3IgYW55IGNsYXNzZXMgdGhhdCBzdGFydCB3aXRoICZxdW90O2NvbS54eXomcXVvdDssIHRoZW4gdGhlIG92ZXJyaWRlIGZpbGUgKGNsYXNzbmFtZS5vdmVycmlkZSkgd2lsbCBiZSBzZWFyY2hlZCBmb3IgaW4gdGhlIGRpcmVjdG9yeSAmcXVvdDtvdmVycmlkZXMvZSZxdW90Oy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjbGFzcyB3YXMgJmx0O3NhbXAmZ3Q7Y29tLnh5ei5BQkMmbHQ7L3NhbXAmZ3Q7IGl0IHdpbGwgbG9vayBmb3Igb3ZlcnJpZGUgZmlsZSAmcXVvdDtvdmVycmlkZXMvZS9BQkMub3ZlcnJpZGUmcXVvdDsuIElmIHRoZSBjbGFzcyB3YXMgJmx0O3NhbXAmZ3Q7Y29tLnh5ei5xeHIuQUJDJmx0Oy9zYW1wJmd0OyBpdCB3aWxsIGZvciBmaWxlICZxdW90O292ZXJyaWRlcy9lL3F4ci9BQkMub3ZlcnJpZGUmcXVvdDsuCi0mbHQ7cCZndDsKLUZpbmFsbHkgaWYgcGx1Z2luICZxdW90O29yZy5lY2xpcHNlLnZlJnF1b3Q7IGlzIHZpc2libGUgdG8gdGhlIHByb2plY3QsIHRoZW4gJmx0O3NhbXAmZ3Q7Y29tLnh5ei5teUNvbnRyaWJ1dG9yJmx0Oy9zYW1wJmd0OyB3aWxsIGJlIHVzZWQgdG8gY29udHJpYnV0ZSB0byB0aGUgQmVhbkluZm8uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlICZsdDtzYW1wJmd0O2NsYXNzJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgbXVzdCBiZSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuSUJlYW5JbmZvQ29udHJpYnV0b3ImbHQ7L3NhbXAmZ3Q7IGludGVyZmFjZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL3ZtL0Jhc2VCZWFuSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vQmFzZUJlYW5JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZmM4ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vQmFzZUJlYW5JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm07Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEJhc2VCZWFuSW5mby5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMSAkICAkRGF0ZTogMjAwNS8xMC8xOCAxNTozMjoxOSAkIAotICovCi0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsKLWltcG9ydCBqYXZhLmJlYW5zLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5jb21tb24uSUJhc2VCZWFuSW5mb0NvbnN0YW50czsKLQotCi0vKioKLSAqIEEgQmFzZUJlYW5JbmZvIHRoYXQgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIEJlYW5JbmZvcyB3aXRoaW4gdGhlIEpFTSBlbnZpcm9ubWVudC4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQmVhbkluZm8gZXh0ZW5kcyBTaW1wbGVCZWFuSW5mbyBpbXBsZW1lbnRzIElCYXNlQmVhbkluZm9Db25zdGFudHMgewotCi0JLy8gQ29uc3RhbnRzIHRvIHVzZSB0byBjcmVhdGUgYWxsIGRlc2NyaXB0b3JzIGV0Yy4KLQlwcm90ZWN0ZWQgc3RhdGljIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBSRVNCVU5ETEUgPSBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uYmVhbmluZm8iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQm91bmQgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9VTkQgPSAiYm91bmQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cmFpbmVkIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUkFJTkVEID0gImNvbnN0cmFpbmVkIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcm9wZXJ0eSBlZGl0b3IgY2xhc3MgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlFRElUT1JDTEFTUyA9ICJwcm9wZXJ0eUVkaXRvckNsYXNzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZWFkIE1ldGhvZCBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFETUVUSE9EID0gInJlYWRNZXRob2QiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFdyaXRlIG1ldGhvZCBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURU1FVEhPRCA9ICJ3cml0ZU1ldGhvZCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGlzcGxheW5hbWUgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUExBWU5BTUUgPSAiZGlzcGxheU5hbWUiOy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBFeHBlcnQgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRVJUID0gImV4cGVydCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSGlkZGVuIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJRERFTiA9ICJoaWRkZW4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcnJlZCBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJSRUQgPSAicHJlZmVycmVkIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaG9ydCBkZXNjcmlwdGlvbiBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVERFU0NSSVBUSU9OID0gInNob3J0RGVzY3JpcHRpb24iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEN1c3RvbWl6ZXIgY2xhc3MgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUkNMQVNTID0gImN1c3RvbWl6ZXJDbGFzcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW4gRGVmYXVsdCBldmVudHNldCBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFRkFVTFRFVkVOVFNFVCA9ICJpbkRlZmF1bHRFdmVudFNldCI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoaXMgaXMgYSBGZWF0dXJlIEF0dHJpYnV0ZSBLZXkuIFdoZW4gdGhpcyBrZXkgZXhpc3RzLCB0aGUgdmFsdWUgaXMgYSBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC4gSXQgbWVhbnMgdGhpcyBwcm9wZXJ0eQotCSAqIGlzIGEgZmllbGQgYW5kIG5vdCBhIGdldHRlci9zZXR0ZXIuIFRoZSBnZXR0ZXIvc2V0dGVyIHdpbGwgYmUgaWdub3JlZCBhbmQgdGhlIHByb3BlcnR5IHR5cGUgd2lsbCBiZSB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCi0JICogPHA+Ci0JICogQXQgdGhpcyB0aW1lLCBkbyBub3QgdXNlIGZpZWxkIG9uIGFuIGluZGV4ZWQgcHJvcGVydHkuIFRoaXMgaXMgY3VycmVudGx5IGFuIHVuZGVmaW5lZCBzaXR1YXRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERQUk9QRVJUWSA9ICJmaWVsZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9ic2N1cmUgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuIE9ic3VyZSBpcyBhIHByZS1kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lIHRvby4gVGhhdCBpcyB3aGVyZSB0aGUgb2JzY3VyZSBzZXR0aW5nIGlzIHN0b3JlZC4KLQkgKiA8cD4KLQkgKiBPYnN1cmUgbWVhbnMgbW9zdCB1c2VycyBkb24ndCBuZWVkIGl0LiBJbiB0aGUgZnV0dXJlIHN1Y2ggZmVhdHVyZXMgd29uJ3QgZXZlbiBiZSBjYWNoZWQgc28gYXMgdG8gcmVkdWNlIHRoZSBpbi1tZW1vcnkgY29zdHMuIEN1cnJlbnRseSB0aGlzCi0JICogZmxhZyBpcyBpZ25vcmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CU0NVUkUgPSAiaXZqT2JzY3VyZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGVzaWduIHRpbWUgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuIERlc2lnbiB0aW1lIGlzIGEgcHJlLWRlZmluZWQgYXR0cmlidXRlIG5hbWUgdG9vLiBUaGF0IGlzIHdoZXJlIHRoZSBkZXNpZ24gdGltZSBzZXR0aW5nIGlzCi0JICogc3RvcmVkLgotCSAqIDxwPgotCSAqIERlc2lnbiB0aW1lIG1lYW5zOgotCSAqIDx1bD4KLQkgKiA8bGk+Tm90IHNldDogV2lsbCBiZSBhIHByb3BlcnR5IHRoYXQgY2FuIGJlIGNvbm5lY3RlZCB0bywgYW5kIHNob3dzIG9uIHByb3BlcnR5IHNoZWV0IChpZiBub3QgaGlkZGVuKS4KLQkgKiA8bGk+PGNvZGU+dHJ1ZTwvY29kZT46IFNwZWNpYWwgcHJvcGVydHkgKGl0IHdpbGwgc2hvdyBvbiBwcm9wZXJ0eSBzaGVldCBpZiBub3QgaGlkZGVuKSwgYnV0IGl0IGNhbid0IGJlIGNvbm5lY3RlZCB0by4gVXN1YWxseSB0aGlzIGlzIGEKLQkgKiBwcm9wZXJ0eSB0aGF0IGlzIGZsdWZmZWQgdXAgZm9yIHRoZSBJREUgcHVycG9zZXMgYnV0IGRvZXNuJ3QgaGF2ZSBhIGdldC9zZXQgbWV0aG9kLiBUaGlzIG1lYW5zIGl0IGlzIGEgcHJvcGVydHkgZm9yIGRlc2lnbiB0aW1lIGFuZCBub3QgZm9yCi0JICogcnVudGltZS4KLQkgKiA8bGk+PGNvZGU+ZmFsc2U8L2NvZGU+OiBUaGlzIHByb3BlcnR5IHdpbGwgbm90IHNob3cgdXAgb24gcHJvcGVydHkgc2hlZXQgYnV0IGl0IGNhbiBiZSBjb25uZWN0ZWQgdG8uCi0JICogPC91bD4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNJR05USU1FUFJPUEVSVFkgPSAiaXZqRGVzaWduVGltZVByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEV2ZW50QWRhcHRlckNsYXNzIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLiBFdmVudCBhZGFwdGVyIGNsYXNzIGlzIGEgcHJlLWRlZmluZWQgYXR0cmlidXRlIG5hbWUgdG9vLiBUaGF0IGlzIHdoZXJlIHRoZSBldmVudAotCSAqIGFkYXB0ZXIgaXMgc3RvcmVkLgotCSAqIDxwPgotCSAqIEFkYXB0ZXIgY2xhc3MgZm9yIGV2ZW50U2V0RGVzY3JpcHRvcnMgdGhhdCBwcm92aWRlIGRlZmF1bHQgbm8tb3AgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZSBtZXRob2RzLiBGb3IgZXhhbXBsZQotCSAqIDxjb2RlPmphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyPC9jb2RlPiBoYXMgYW4gYWRhcHRlciBvZiA8Y29kZT5qYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyPC9jb2RlPi4gV2hhdCBpcyBzdG9yZWQgaXMgYWN0dWFsbHkgdGhlCi0JICogY2xhc3MgbmFtZSwgbm90IHRoZSBjbGFzcyBpdHNlbGYuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRBREFQVEVSQ0xBU1MgPSAiZXZlbnRBZGFwdGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBKVk1fMV8zID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iLCAiIikuc3RhcnRzV2l0aCgiMS4zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAgLy8kTk9OLU5MUy0zJAotCQotCS8qKgotCSAqIEVtcHR5IGFyZ3MgbGlzdCBmb3IgdGhvc2UgZGVzY3JpcHRvcnMgdGhhdCBkb24ndCBoYXZlIGFyZ3VtZW50cy4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSR1MgPSBuZXcgT2JqZWN0WzBdOwotCi0JLyoqCi0JICogQ2FwaXRhbGl6ZSB0aGUgc3RyaW5nLiBUaGlzIHVwcGVyY2FzZXMgb25seSB0aGUgZmlyc3QgY2hhcmFjdGVyLiBTbyBpZiB5b3UgaGF2ZSBwcm9wZXJ0eSBuYW1lIG9mICJhYmMiIGl0IHdpbGwgYmVjb21lICJBYmMiLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybiBzdHJpbmcgd2l0aCBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZShTdHJpbmcgcykgewotCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7IHJldHVybiBzOyB9Ci0JCWNoYXIgY2hhcnNbXSA9IHMudG9DaGFyQXJyYXkoKTsKLQkJY2hhcnNbMF0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2hhcnNbMF0pOwotCQlyZXR1cm4gbmV3IFN0cmluZyhjaGFycyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgQmVhbkRlc2NyaXB0b3Igb2JqZWN0IGdpdmVuIGFuIGFycmF5IG9mIGtleXdvcmQvdmFsdWUgYXJndW1lbnRzLiBVc2UgdGhlIGtleXdvcmRzIGRlZmluZWQgaW4gdGhpcyBjbGFzcywgZS5nLiBCT1VORCwgRVhQRVJULCBldGMuCi0JICogCi0JICogQHBhcmFtIGNscwotCSAqICAgICAgICAgICAgYmVhbiBmb3Igd2hpY2ggdGhlIGJlYW4gZGVzY3JpcHRvciBpcyBiZWluZyBjcmVhdGVkLgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBhcmcgcGFpcnMsIFswXSBrZXl3b3JkLCBbMV0gdmFsdWUsIFsyXSBrZXl3b3JkLCBbM10gdmFsdWUsIGV0Yy4KLQkgKiBAcmV0dXJuIG5ldyBiZWFuIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5EZXNjcmlwdG9yIGNyZWF0ZUJlYW5EZXNjcmlwdG9yKENsYXNzIGNscywgT2JqZWN0W10gYXJncykgewotCQlDbGFzcyBjdXN0b21pemVyQ2xhc3MgPSBudWxsOwotCi0JCS8qIEZpbmQgdGhlIHNwZWNpZmllZCBjdXN0b21pemVyQ2xhc3MgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQlpZiAoQ1VTVE9NSVpFUkNMQVNTLmVxdWFscyhhcmdzW2ldKSkgewotCQkJCWN1c3RvbWl6ZXJDbGFzcyA9IChDbGFzcykgYXJnc1tpICsgMV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlCZWFuRGVzY3JpcHRvciBiZCA9IG5ldyBCZWFuRGVzY3JpcHRvcihjbHMsIGN1c3RvbWl6ZXJDbGFzcyk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYXJnc1tpXTsKLQkJCU9iamVjdCB2YWx1ZSA9IGFyZ3NbaSArIDFdOwotCQkJc2V0RmVhdHVyZURlc2NyaXB0b3JWYWx1ZShiZCwga2V5LCB2YWx1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gYmQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgYmVhbnMgRXZlbnRTZXREZXNjcmlwdG9yIGdpdmVuIHRoZSBmb2xsb3dpbmc6Ci0JICogCi0JICogQHBhcmFtIGNscwotCSAqICAgICAgICAgICAgVGhlIGJlYW4gY2xhc3MKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgTmFtZSBvZiBldmVudCBzZXQKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgYXJnIHBhaXJzLCBbMF0ga2V5d29yZCwgWzFdIHZhbHVlLCBbMl0ga2V5d29yZCwgWzNdIHZhbHVlLCBldGMuCi0JICogQHBhcmFtIGxtZHMKLQkgKiAgICAgICAgICAgIGFycmF5IG9mIE1ldGhvZERlc2NyaXB0b3JzIGRlZmluaW5nIHRoZSBsaXN0ZW5lciBtZXRob2RzCi0JICogQHBhcmFtIGxpc3RlbmVyVHlwZQotCSAqICAgICAgICAgICAgdHlwZSBvZiBsaXN0ZW5lcgotCSAqIEBwYXJhbSBhZGRMaXN0ZW5lck5hbWUKLQkgKiAgICAgICAgICAgIGFkZCBsaXN0ZW5lciBtZXRob2QgbmFtZQotCSAqIEBwYXJhbSByZW1vdmVMaXN0ZW5lck5hbWVyZW1vdmUKLQkgKiAgICAgICAgICAgIGxpc3RlbmVyIG1ldGhvZCBuYW1lCi0JICogQHJldHVybiBuZXcgZXZlbnQgc2V0IGRlc2NyaXB0b3IKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV2ZW50U2V0RGVzY3JpcHRvciBjcmVhdGVFdmVudFNldERlc2NyaXB0b3IoQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSwgT2JqZWN0W10gYXJncywgTWV0aG9kRGVzY3JpcHRvcltdIGxtZHMsIENsYXNzIGxpc3RlbmVyVHlwZSwKLQkJCVN0cmluZyBhZGRMaXN0ZW5lck5hbWUsIFN0cmluZyByZW1vdmVMaXN0ZW5lck5hbWUpIHsKLQkJRXZlbnRTZXREZXNjcmlwdG9yIGVzZCA9IG51bGw7Ci0JCUNsYXNzW10gcGFyYW1UeXBlcyA9IHsgbGlzdGVuZXJUeXBlfTsKLQkJdHJ5IHsKLQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBhZGRNZXRob2QgPSBudWxsOwotCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHJlbW92ZU1ldGhvZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8qIGdldCBhZGRMaXN0ZW5lck1ldGhvZCB3aXRoIHBhcmFtZXRlciB0eXBlcy4gKi8KLQkJCQlhZGRNZXRob2QgPSBjbHMuZ2V0TWV0aG9kKGFkZExpc3RlbmVyTmFtZSwgcGFyYW1UeXBlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gaWUpIHsKLQkJCQl0aHJvd0Vycm9yKGllLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2dldF90aGVfbWV0aDFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQluZXcgT2JqZWN0W10geyBhZGRMaXN0ZW5lck5hbWV9KSk7Ci0JCQl9Ci0JCQk7Ci0JCQl0cnkgewotCQkJCS8qIGdldCByZW1vdmVMaXN0ZW5lck1ldGhvZCB3aXRoIHBhcmFtZXRlciB0eXBlcy4gKi8KLQkJCQlyZW1vdmVNZXRob2QgPSBjbHMuZ2V0TWV0aG9kKHJlbW92ZUxpc3RlbmVyTmFtZSwgcGFyYW1UeXBlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gaWUpIHsKLQkJCQl0aHJvd0Vycm9yKGllLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2dldF90aGVfbWV0aDFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQluZXcgT2JqZWN0W10geyByZW1vdmVMaXN0ZW5lck5hbWV9KSk7Ci0JCQl9Ci0JCQk7Ci0KLQkJCWVzZCA9IG5ldyBFdmVudFNldERlc2NyaXB0b3IobmFtZSwgbGlzdGVuZXJUeXBlLCBsbWRzLCBhZGRNZXRob2QsIHJlbW92ZU1ldGhvZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZSkgewotCQkJdGhyb3dFcnJvcihpZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9jcmVhdGVfdGhlX0UxX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBuYW1lfSkpOwotCQl9Ci0JCTsKLQkJLy8gc2V0IHRoZSBldmVudCBzZXQgZGVzY3JpcHRvciBwcm9wZXJ0aWVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFyZ3NbaV07Ci0JCQlPYmplY3QgdmFsdWUgPSBhcmdzW2kgKyAxXTsKLQkJCWlmIChJTkRFRkFVTFRFVkVOVFNFVC5lcXVhbHMoa2V5KSkgewotCQkJCWVzZC5zZXRJbkRlZmF1bHRFdmVudFNldCgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9IGVsc2UKLQkJCQlzZXRGZWF0dXJlRGVzY3JpcHRvclZhbHVlKGVzZCwga2V5LCB2YWx1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gZXNkOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGJlYW4ncyBNZXRob2REZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIGNsYXNzIG9mIHRoZSBtZXRob2QuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIG1ldGhvZC4KLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgYXJnIHBhaXJzLCBbMF0ga2V5d29yZCwgWzFdIHZhbHVlLCBbMl0ga2V5d29yZCwgWzNdIHZhbHVlLCBldGMuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcmFtZXRlciBkZXNjcmlwdG9ycy4KLQkgKiBAcGFyYW0gcGFyYW1UeXBlcwotCSAqICAgICAgICAgICAgcGFyYW1ldGVyIHR5cGVzCi0JICogQHJldHVybiBuZXcgbWV0aG9kIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZERlc2NyaXB0b3IgY3JlYXRlTWV0aG9kRGVzY3JpcHRvcihDbGFzcyBjbHMsIFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdzLCBQYXJhbWV0ZXJEZXNjcmlwdG9yW10gcGFyYW1zLCBDbGFzc1tdIHBhcmFtVHlwZXMpIHsKLQkJTWV0aG9kRGVzY3JpcHRvciBtZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgYU1ldGhvZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8qIGdldE1ldGhvZCB3aXRoIHBhcmFtZXRlciB0eXBlcy4gKi8KLQkJCQlhTWV0aG9kID0gY2xzLmdldE1ldGhvZChuYW1lLCBwYXJhbVR5cGVzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZSkgewotCQkJCXRocm93RXJyb3IoaWUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfZ2V0X3RoZV9tZXRoMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG5hbWV9KSk7Ci0JCQl9Ci0JCQk7Ci0JCQlpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLmxlbmd0aCA+IDApCi0JCQkJbWQgPSBuZXcgTWV0aG9kRGVzY3JpcHRvcihhTWV0aG9kLCBwYXJhbXMpOwotCQkJZWxzZQotCQkJCW1kID0gbmV3IE1ldGhvZERlc2NyaXB0b3IoYU1ldGhvZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZSkgewotCQkJdGhyb3dFcnJvcihpZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9jcmVhdGVfTWV0aG9kX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBuYW1lfSkpOwotCQl9Ci0JCTsKLQkJLy8gc2V0IHRoZSBtZXRob2QgcHJvcGVydGllcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDIpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhcmdzW2ldOwotCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0JCQlzZXRGZWF0dXJlRGVzY3JpcHRvclZhbHVlKG1kLCBrZXksIHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gbWQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZU90aGVyUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBuYW1lLCBDbGFzcyBjbHMpIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLQkJTWV0aG9kIHJlYWRNZXRob2QgPSBudWxsOwotCQlNZXRob2Qgd3JpdGVNZXRob2QgPSBudWxsOwotCQlTdHJpbmcgYmFzZSA9IGNhcGl0YWxpemUobmFtZSk7Ci0JCUNsYXNzW10gcGFyYW1ldGVycyA9IG5ldyBDbGFzc1swXTsKLQotCQkvLyBGaXJzdCB3ZSB0cnkgYm9vbGVhbiBhY2Nlc3NvciBwYXR0ZXJuCi0JCXRyeSB7Ci0JCQlyZWFkTWV0aG9kID0gY2xzLmdldE1ldGhvZCgiaXMiICsgYmFzZSwgcGFyYW1ldGVycyk7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgxKSB7Ci0JCX0KLQkJaWYgKHJlYWRNZXRob2QgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBFbHNlIHdlIHRyeSB0aGUgZ2V0IGFjY2Vzc29yIHBhdHRlcm4uCi0JCQkJcmVhZE1ldGhvZCA9IGNscy5nZXRNZXRob2QoImdldCIgKyBiYXNlLCBwYXJhbWV0ZXJzKTsvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0JCQkJLy8gRmluZCBieSBtYXRjaGluZyBtZXRob2RzIG9mIHRoZSBjbGFzcwotCQkJCXJlYWRNZXRob2QgPSBmaW5kTWV0aG9kKGNscywgImdldCIgKyBiYXNlLCAwKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAocmVhZE1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBGb3Igd3JpdGUtb25seSBwcm9wZXJ0aWVzLCBmaW5kIHRoZSB3cml0ZSBtZXRob2QKLQkJCXdyaXRlTWV0aG9kID0gZmluZE1ldGhvZChjbHMsICJzZXQiICsgYmFzZSwgMSk7Ly8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJLy8gSW4gU3VuJ3MgY29kZSwgcmVmbGVjdGlvbiBmYWlscyBpZiB0aGVyZSBhcmUgdHdvCi0JCQkvLyBzZXR0ZXJzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdGhlIGZpcnN0IHNldHRlciBsb2NhdGVkCi0JCQkvLyBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHJldHVybiB0eXBlIG9mIHRoZSBnZXR0ZXIuCi0JCQkvLyBUaGlzIGZpeGVzIHRoYXQuCi0JCQlwYXJhbWV0ZXJzID0gbmV3IENsYXNzWzFdOwotCQkJcGFyYW1ldGVyc1swXSA9IHJlYWRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJdHJ5IHsKLQkJCQl3cml0ZU1ldGhvZCA9IGNscy5nZXRNZXRob2QoInNldCIgKyBiYXNlLCBwYXJhbWV0ZXJzKTsvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgzKSB7Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCi0JCWlmICgocmVhZE1ldGhvZCAhPSBudWxsKSB8fCAod3JpdGVNZXRob2QgIT0gbnVsbCkpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIHJlYWRNZXRob2QsIHdyaXRlTWV0aG9kKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfZmluZF90aGVfYWNjMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZX0pKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGJlYW5zIHBhcmFtZXRlciBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHBhcmFtZXRlcgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBhcmcgcGFpcnMsIFswXSBrZXl3b3JkLCBbMV0gdmFsdWUsIFsyXSBrZXl3b3JkLCBbM10gdmFsdWUsIGV0Yy4KLQkgKiBAcmV0dXJuIG5ldyBwYXJhbWV0ZXIgZGVzY3JpcHRvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyRGVzY3JpcHRvciBjcmVhdGVQYXJhbWV0ZXJEZXNjcmlwdG9yKFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdzKSB7Ci0JCVBhcmFtZXRlckRlc2NyaXB0b3IgcGQgPSBudWxsOwotCQl0cnkgewotCQkJcGQgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRvcigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gaWUpIHsKLQkJCXRocm93RXJyb3IoaWUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfY3JlYXRlX1BhcmFtMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZX0pKTsKLQkJfQotCQk7Ci0JCS8vIHNldCB0aGUgbmFtZQotCQlwZC5zZXROYW1lKG5hbWUpOwotCQkvLyBzZXQgdGhlIG1ldGhvZCBwcm9wZXJ0aWVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFyZ3NbaV07Ci0JCQlPYmplY3QgdmFsdWUgPSBhcmdzW2kgKyAxXTsKLQkJCXNldEZlYXR1cmVEZXNjcmlwdG9yVmFsdWUocGQsIGtleSwgdmFsdWUpOwotCQl9Ci0KLQkJcmV0dXJuIHBkOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2QgR0VUQ0xBU1M7IAotCQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlHRVRDTEFTUyA9IE9iamVjdC5jbGFzcy5nZXRNZXRob2QoImdldENsYXNzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCS8qKgotCSAqIENyZWF0ZSBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZGVzY3JpYmluZyBhIGZpZWxkIHByb3BlcnR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgbm9uLXN0YW5kYXJkLiBUaGUgVkUga25vd3MgaG93IHRvIGhhbmRsZSB0aGlzLCBidXQgYW55IG9uZSBlbHNlIHVzaW5nIEJlYW5JbmZvIHdpbGwgc2VlIHRoaXMgYXMgYSBwcm9wZXJ0eSB3aXRoCi0JICogbm8gZ2V0dGVyIG9yIHNldHRlci4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBmaWVsZAotCSAqIEBwYXJhbSBhcmdzCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUZpZWxkUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBuYW1lLCBGaWVsZCBmaWVsZCwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBudWxsLCBudWxsKTsKLQkJCXBkLnNldFZhbHVlKEZJRUxEUFJPUEVSVFksIGZpZWxkKTsJLy8gU2V0IHRoZSBmaWVsZCBwcm9wZXJ0eSBzbyB3ZSBrbm93IGl0IGlzIGEgZmllbGQuCi0JCQlhcHBseUZpZWxkQXJndW1lbnRzKHBkLCBhcmdzKTsKLQkJCS8vIE5lZWQgdG8gc2V0IGluIGEgcGhvbnkgcmVhZCBtZXRob2QgYmVjYXVzZSBJbnRyb3NwZWN0b3Igd2lsbCB0aHJvdyBpdCBhd2F5IG90aGVyd2lzZS4gV2UganVzdCB1c2UgT2JqZWN0LmdldENsYXNzIGZvciB0aGlzLgotCQkJLy8gV2Ugd2lsbCBpZ25vcmUgdGhlIHByb3BlcnR5IHR5cGUgZm9yIGZpZWxkcy4gSWYgdXNlZCBvdXRzaWRlIG9mIFZFIHRoZW4gaXQgd2lsbCBsb29rIGxpa2UgYSBjbGFzcyBwcm9wZXJ0eS4KLQkJCXBkLnNldFJlYWRNZXRob2QoR0VUQ0xBU1MpOwotCQkJcmV0dXJuIHBkOwotCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93RXJyb3IoZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9jcmVhdGVfdGhlX1AxX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBuYW1lfSkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBiZWFuJ3MgcHJvcGVydHkgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gY2xzCi0JICogICAgICAgICAgICBjbGFzcyBvZiB3aG8gb3ducyB0aGUgcHJvcGVydHkgKHVzdWFsbHkgdGhlIGJlYW4pLiBJdCBpcyB1c2VkIHRvIGxvb2sgdXAgZ2V0L3NldCBtZXRob2RzIGZvciB0aGUgcHJvcGVydHkuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBJdCB3aWxsIHVzZSBnZXR7TmFtZX0gYW5kIHNldHtOYW1lfSB0byBmaW5kIGdldC9zZXQgbWV0aG9kcy4KLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgYXJnIHBhaXJzLCBbMF0ga2V5d29yZCwgWzFdIHZhbHVlLCBbMl0ga2V5d29yZCwgWzNdIHZhbHVlLCBldGMuCi0JICogQHJldHVybiBuZXcgcHJvcGVydHkgZGVzY3JpcHRvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihDbGFzcyBjbHMsIFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdzKSB7Ci0JCVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBDcmVhdGUgYXNzdW1pbmcgdGhhdCB0aGUgZ2V0dGVyL3NldHRlciBmb2xsb3dzIHJlZmxlY3Rpb24gcGF0dGVybnMKLQkJCXBkID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBjbHMpOwotCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRyeSBjcmVhdGluZyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHJlYWQtb25seSwgd3JpdGUtb25seQotCQkJLy8gb3IgaWYgU3VuJ3MgcmVmbGVjdGlvbiBmYWlscwotCQkJdHJ5IHsKLQkJCQlwZCA9IGNyZWF0ZU90aGVyUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGNscyk7Ci0JCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGllKSB7Ci0JCQkJdGhyb3dFcnJvcihpZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9jcmVhdGVfdGhlX1AxX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZX0pKTsKLQkJCX0KLQkJfQotCi0JCWFwcGx5UHJvcGVydHlBcmd1bWVudHMocGQsIGFyZ3MsIGNscyk7Ci0KLQkJcmV0dXJuIHBkOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFByb3BlcnR5RGVzY3JpcHRvciBiYXNlZCB1cG9uIHRoZSBQRCBzZW50IGluLiBJdCB3aWxsIGNsb25lIHRoZSBzZW50IGluIG9uZSwgYW5kIGFwcGx5IHRoZSBhcmdzIHRvIG92ZXJyaWRlIGFueSBzcGVjaWZpYyBzZXR0aW5nLgotCSAqIENsYXNzIGNscyBpcyB1c2VkIGZvciBmaW5kaW5nIHJlYWQvd3JpdGUgbWV0aG9kcywgaWYgYW55LgotCSAqIAotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHdhbnRpbmcgdG8gb3ZlcnJpZGUgb25seSBhIGZldyBzcGVjaWZpYyBzZXR0aW5ncyBmcm9tIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmcm9tIHRoZSBzdXBlciBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gZnJvbVBEUwotCSAqICAgICAgICAgICAgVGhlIFByb3BlcnR5RGVzY3JpcHRvciBhcnJheSB0byBmaW5kIHRoZSBlbnRyeSB0byBjbG9uZS4gSXQgd2lsbCBiZSBjaGFuZ2VkIGluIHBsYWNlIGluIHRoZSBhcnJheS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGZpbmQgYW5kIGNsb25lIGFuZCBvdmVycmlkZS4KLQkgKiBAcGFyYW0gY2xzCi0JICogICAgICAgICAgICBUaGUgY2xhc3MgdG8gdXNlIHRvIGZpbmQgcmVhZC93cml0ZSBtZXRob2RzIGluIGFyZ3MuIElmIG5vIHJlYWQvd3JpdGUgbWV0aG9kcyBzcGVjaWZpZWQsIHRoZW4gdGhpcyBtYXkgYmUgbnVsbC4KLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgVGhlIGFyZ3VtZW50cyB0byBvdmVycmlkZSBmcm9tIGZyb21QRC4gYXJnIHBhaXJzLCBbMF0ga2V5d29yZCwgWzFdIHZhbHVlLCBbMl0ga2V5d29yZCwgWzNdIHZhbHVlLCBldGMuCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZVByb3BlcnR5RGVzY3JpcHRvcihQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMsIFN0cmluZyBuYW1lLCBDbGFzcyBjbHMsIE9iamVjdFtdIGFyZ3MpIHsKLQkJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gbnVsbDsKLQkJaW50IGlQRCA9IGZpbmRQcm9wZXJ0eURlc2NyaXB0b3IocGRzLCBuYW1lKTsKLQkJaWYgKGlQRCA9PSAtMSkKLQkJCXJldHVybjsKLQkJUHJvcGVydHlEZXNjcmlwdG9yIGZyb21QRCA9IHBkc1tpUERdOwotCQl0cnkgewotCi0JCQlwZCA9IHBkc1tpUERdID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihmcm9tUEQuZ2V0TmFtZSgpLCBudWxsLCBudWxsKTsKLQkJfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvd0Vycm9yKGUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfY3JlYXRlX3RoZV9QMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZnJvbVBELmdldE5hbWUoKX0pKTsKLQkJfQotCi0JCS8vIE5vdyBjb3B5IG92ZXIgdGhlIGNvbnRlbnRzIG9mIGZyb21QRC4KLQkJY2xvbmVQcm9wZXJ0eVNldHRpbmdzKGZyb21QRCwgcGQpOwotCi0JCS8vIE5vdyBhcHBseSB0aGUgb3ZlcnJpZGVzCi0JCWFwcGx5UHJvcGVydHlBcmd1bWVudHMocGQsIGFyZ3MsIGNscyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvbmVQcm9wZXJ0eVNldHRpbmdzKFByb3BlcnR5RGVzY3JpcHRvciBmcm9tUEQsIFByb3BlcnR5RGVzY3JpcHRvciBwZCkgewotCQl0cnkgewotCQkJcGQuc2V0UmVhZE1ldGhvZChmcm9tUEQuZ2V0UmVhZE1ldGhvZCgpKTsKLQkJCXBkLnNldFdyaXRlTWV0aG9kKGZyb21QRC5nZXRXcml0ZU1ldGhvZCgpKTsKLQkJCXBkLnNldFByb3BlcnR5RWRpdG9yQ2xhc3MoZnJvbVBELmdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSk7Ci0JCQlwZC5zZXRCb3VuZChmcm9tUEQuaXNCb3VuZCgpKTsKLQkJCXBkLnNldENvbnN0cmFpbmVkKGZyb21QRC5pc0NvbnN0cmFpbmVkKCkpOwotCQkJY2xvbmVGZWF0dXJlU2V0dGluZ3MoZnJvbVBELCBwZCk7Ci0JCX0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3dFcnJvcihlLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2NyZWF0ZV90aGVfUDFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGZyb21QRC5nZXROYW1lKCl9KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvbmVGZWF0dXJlU2V0dGluZ3MoRmVhdHVyZURlc2NyaXB0b3IgZnJvbUZELCBGZWF0dXJlRGVzY3JpcHRvciBmZCkgewotCQlmZC5zZXRFeHBlcnQoZnJvbUZELmlzRXhwZXJ0KCkpOwotCQlmZC5zZXRIaWRkZW4oZnJvbUZELmlzSGlkZGVuKCkpOwotCQlmZC5zZXRQcmVmZXJyZWQoZnJvbUZELmlzUHJlZmVycmVkKCkpOwotCQlmZC5zZXRTaG9ydERlc2NyaXB0aW9uKGZyb21GRC5nZXRTaG9ydERlc2NyaXB0aW9uKCkpOwotCQlmZC5zZXREaXNwbGF5TmFtZShmcm9tRkQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0KLQkJamF2YS51dGlsLkVudW1lcmF0aW9uIGtleXMgPSBmcm9tRkQuYXR0cmlidXRlTmFtZXMoKTsKLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBmcm9tRkQuZ2V0VmFsdWUoa2V5KTsKLQkJCWZkLnNldFZhbHVlKGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgY29tbW9uIHByb3BlcnR5IGFyZ3VtZW50cyBiZXR3ZWVuIGZpZWxkIGFuZCBzdGFuZGFyZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXBwbHlDb21tb25Qcm9wZXJ0eUFyZ3VtZW50cyhQcm9wZXJ0eURlc2NyaXB0b3IgcGQsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoQk9VTkQuZXF1YWxzKGtleSkpIHsKLQkJCXBkLnNldEJvdW5kKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfSBlbHNlIGlmIChDT05TVFJBSU5FRC5lcXVhbHMoa2V5KSkgewotCQkJcGQuc2V0Q29uc3RyYWluZWQoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQl9IGVsc2UgaWYgKFBST1BFUlRZRURJVE9SQ0xBU1MuZXF1YWxzKGtleSkpIHsKLQkJCXBkLnNldFByb3BlcnR5RWRpdG9yQ2xhc3MoKENsYXNzKSB2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoRklFTERQUk9QRVJUWS5lcXVhbHMoa2V5KSkKLQkJCXJldHVybiB0cnVlOwkvLyBUaGlzIHNob3VsZCBub3QgYmUgYXBwbGllZCBleGNlcHQgdGhyb3VnaCBjcmVhdGVGaWVsZFByb3BlcnR5LgotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGx5UHJvcGVydHlBcmd1bWVudHMoUHJvcGVydHlEZXNjcmlwdG9yIHBkLCBPYmplY3RbXSBhcmdzLCBDbGFzcyBjbHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYXJnc1tpXTsKLQkJCU9iamVjdCB2YWx1ZSA9IGFyZ3NbaSArIDFdOwotCi0JCQlpZiAoIWFwcGx5Q29tbW9uUHJvcGVydHlBcmd1bWVudHMocGQsIGtleSwgdmFsdWUpKSB7Ci0JCQkJaWYgKFJFQURNRVRIT0QuZXF1YWxzKGtleSkpIHsKLQkJCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJTWV0aG9kIG1ldGhvZDsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1ldGhvZCA9IGNscy5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IENsYXNzWzBdKTsKLQkJCQkJCXBkLnNldFJlYWRNZXRob2QobWV0aG9kKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93RXJyb3IoZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoInswfV9ub19yZWFkX21ldGhvZF9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgY2xzLCBtZXRob2ROYW1lfSkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChXUklURU1FVEhPRC5lcXVhbHMoa2V5KSkgewotCQkJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgewotCQkJCQkJCXBkLnNldFdyaXRlTWV0aG9kKG51bGwpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlNZXRob2QgbWV0aG9kOwotCQkJCQkJCUNsYXNzIHR5cGUgPSBwZC5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJCQkJCQltZXRob2QgPSBjbHMuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHsgdHlwZX0pOwotCQkJCQkJCXBkLnNldFdyaXRlTWV0aG9kKG1ldGhvZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvd0Vycm9yKGUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJ7MH1fbm9fd3JpdGVfbWV0aG9kX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQluZXcgT2JqZWN0W10geyBjbHMsIG1ldGhvZE5hbWV9KSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBhcmJpdHJhcnkgdmFsdWUKLQkJCQkJc2V0RmVhdHVyZURlc2NyaXB0b3JWYWx1ZShwZCwga2V5LCB2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseUZpZWxkQXJndW1lbnRzKFByb3BlcnR5RGVzY3JpcHRvciBwZCwgT2JqZWN0W10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDIpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhcmdzW2ldOwotCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0KLQkJCWlmICghYXBwbHlDb21tb25Qcm9wZXJ0eUFyZ3VtZW50cyhwZCwga2V5LCB2YWx1ZSkpIHsKLQkJCQlpZiAoUkVBRE1FVEhPRC5lcXVhbHMoa2V5KSkgewotCQkJCQkvLyBpZ25vcmVkIGZvciBmaWVsZC4KLQkJCQl9IGVsc2UgaWYgKFdSSVRFTUVUSE9ELmVxdWFscyhrZXkpKSB7Ci0JCQkJCS8vIGlnbm9yZWQgZm9yIGZpZWxkLgotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGFyYml0cmFyeSB2YWx1ZQotCQkJCQlzZXRGZWF0dXJlRGVzY3JpcHRvclZhbHVlKHBkLCBrZXksIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSBtZXRob2QgYnkgY29tcGFyaW5nIChuYW1lICYgcGFyYW1ldGVyIHNpemUpIGFnYWluc3QgdGhlIG1ldGhvZHMgaW4gdGhlIGNsYXNzLiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjYWxsIGFuZCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmCi0JICogZ2V0TWV0aG9kIHdpdGggc3BlY2lmaWMgcGFyYW1ldGVyIHR5cGVzIGNhbid0IGZpbmQgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kCi0JICogQHBhcmFtIGFDbGFzcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFyYW1ldGVyQ291bnQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGZpbmRNZXRob2QoamF2YS5sYW5nLkNsYXNzIGFDbGFzcywgamF2YS5sYW5nLlN0cmluZyBtZXRob2ROYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKLQkJdHJ5IHsKLQkJCS8qCi0JCQkgKiBTaW5jZSB0aGlzIG1ldGhvZCBhdHRlbXB0cyB0byBmaW5kIGEgbWV0aG9kIGJ5IGdldHRpbmcgYWxsIG1ldGhvZHMgZnJvbSB0aGUgY2xhc3MsIHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBnZXRNZXRob2QKLQkJCSAqIGNhbm5vdCBmaW5kIHRoZSBtZXRob2QuCi0JCQkgKi8KLQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2RzW10gPSBhQ2xhc3MuZ2V0TWV0aG9kcygpOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1ldGhvZHMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaW5kZXhdOwotCQkJCWlmICgobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IHBhcmFtZXRlckNvdW50KSAmJiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpKSB7IHJldHVybiBtZXRob2Q7IH0KLQkJCQk7Ci0JCQl9Ci0JCQk7Ci0JCX0gY2F0Y2ggKGphdmEubGFuZy5UaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmQgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIGEgZ2l2ZW4gbmFtZSBpbiB0aGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGRzCi0JICogICAgICAgICAgICBUaGUgYXJyYXkgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgdG8gc2VhcmNoLCBtYXkgYmUgbnVsbC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgdG8gc2VhcmNoIGZvci4KLQkgKiBAcmV0dXJuIFRoZSBmb3VuZCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGluZGV4LCBvciAtMSBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZmluZFByb3BlcnR5RGVzY3JpcHRvcihQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMocGRzW2ldLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5iZWFucy5CZWFuSW5mbyNnZXREZWZhdWx0RXZlbnRJbmRleCgpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0RXZlbnRJbmRleCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5iZWFucy5CZWFuSW5mbyNnZXREZWZhdWx0UHJvcGVydHlJbmRleCgpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0UHJvcGVydHlJbmRleCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmJlYW5zLlNpbXBsZUJlYW5JbmZvI2dldEJlYW5EZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgQmVhbkRlc2NyaXB0b3IgZ2V0QmVhbkRlc2NyaXB0b3IoKSB7Ci0JCS8vIERlZmF1bHQgaXMgdG8gY3JlYXRlIGFuIGVtcHR5IG9uZS4KLQkJcmV0dXJuIGNyZWF0ZUJlYW5EZXNjcmlwdG9yKGdldEJlYW5DbGFzcygpLCBFTVBUWV9BUkdTKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBmb3IgQmVhbkluZm8uIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCByZXR1cm4gdGhlIEJlYW5JbmZvIG9mIHRoZSBzdXBlcmNsYXNzLgotCSAqIAotCSAqIEBzZWUgQmVhbkluZm8jZ2V0QWRkaXRpb25hbEJlYW5JbmZvKCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgQmVhbkluZm9bXSBnZXRBZGRpdGlvbmFsQmVhbkluZm8oKSB7Ci0JCXRyeSB7Ci0JCQlCZWFuSW5mb1tdIHJlc3VsdCA9IG5ldyBCZWFuSW5mb1tdIHsgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGdldEJlYW5DbGFzcygpLmdldFN1cGVyY2xhc3MoKSl9OwotCQkJUHJvcGVydHlEZXNjcmlwdG9yW10gb1BEcyA9IHJlc3VsdFswXS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCQlQcm9wZXJ0eURlc2NyaXB0b3JbXSBuUERzID0gb3ZlcnJpZGVQcm9wZXJ0eURlc2NyaXB0b3JzKG9QRHMpOwotCQkJaWYgKG9QRHMgIT0gblBEcykKLQkJCQlyZXN1bHRbMF0gPSBuZXcgT3ZlcnJpZGVQREJlYW5JbmZvKHJlc3VsdFswXSwgblBEcyk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgQmVhbkluZm9bMF07Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBPdmVycmlkZVBEQmVhbkluZm8gaW1wbGVtZW50cyBCZWFuSW5mbyB7Ci0KLQkJcHJpdmF0ZSBCZWFuSW5mbyBvcmlnaW5hbEJlYW5JbmZvOwotCi0JCXByaXZhdGUgUHJvcGVydHlEZXNjcmlwdG9yW10gb3ZlcnJpZGVQRHM7Ci0KLQkJcHVibGljIE92ZXJyaWRlUERCZWFuSW5mbyhCZWFuSW5mbyBiaSwgUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzKSB7Ci0JCQlvcmlnaW5hbEJlYW5JbmZvID0gYmk7Ci0JCQlvdmVycmlkZVBEcyA9IHBkczsKLQkJfQotCi0JCXB1YmxpYyBCZWFuSW5mb1tdIGdldEFkZGl0aW9uYWxCZWFuSW5mbygpIHsKLQkJCXJldHVybiBvcmlnaW5hbEJlYW5JbmZvLmdldEFkZGl0aW9uYWxCZWFuSW5mbygpOwotCQl9Ci0KLQkJcHVibGljIEJlYW5EZXNjcmlwdG9yIGdldEJlYW5EZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIG9yaWdpbmFsQmVhbkluZm8uZ2V0QmVhbkRlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEV2ZW50SW5kZXgoKSB7Ci0JCQlyZXR1cm4gb3JpZ2luYWxCZWFuSW5mby5nZXREZWZhdWx0RXZlbnRJbmRleCgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXREZWZhdWx0UHJvcGVydHlJbmRleCgpIHsKLQkJCXJldHVybiBvcmlnaW5hbEJlYW5JbmZvLmdldERlZmF1bHRQcm9wZXJ0eUluZGV4KCk7Ci0JCX0KLQotCQlwdWJsaWMgRXZlbnRTZXREZXNjcmlwdG9yW10gZ2V0RXZlbnRTZXREZXNjcmlwdG9ycygpIHsKLQkJCXJldHVybiBvcmlnaW5hbEJlYW5JbmZvLmdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJY29uKGludCBpY29uS2luZCkgewotCQkJcmV0dXJuIG9yaWdpbmFsQmVhbkluZm8uZ2V0SWNvbihpY29uS2luZCk7Ci0JCX0KLQotCQlwdWJsaWMgTWV0aG9kRGVzY3JpcHRvcltdIGdldE1ldGhvZERlc2NyaXB0b3JzKCkgewotCQkJcmV0dXJuIG9yaWdpbmFsQmVhbkluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKTsKLQkJfQotCi0JCXB1YmxpYyBQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQkJcmV0dXJuIG92ZXJyaWRlUERzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgb3ZlcnJpZGVzIHRvIHBhcmVudCBiZWFuaW5mby4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSB3aXNoIHRvIG92ZXJyaWRlIGFuZCBjaGFuZ2UgYW55IGluaGVyaXRlZCBwcm9wZXJ0aWVzLiBUaGlzCi0JICogYWxsb3dzIHJlbW92YWwgb2YgaW5oZXJpdGVkIHByb3BlcnRpZXMgb3IgY2hhbmdlcyBvZiBzcGVjaWZpYyBwcm9wZXJ0aWVzIChzdWNoIGFzIGNoYW5nZSBmcm9tIGhpZGRlbiB0byBub3QgaGlkZGVuKS4KLQkgKiAKLQkgKiBOb3RlOiBJZiB0aGVyZSBhbnkgY2hhbmdlcywgdGhpcyBtdXN0IHJldHVybiBhIERJRkZFUkVOVCBhcnJheS4gSWYgaXQgcmV0dXJucyB0aGUgc2FtZSBhcnJheSwgdGhlbiB0aGUgY2hhbmdlcyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4gSWYganVzdAotCSAqIG92ZXJyaWRpbmcsIHNob3VsZCB1c2UgcGRzLmNsb25lKCkgdG8gZ2V0IHRoZSBuZXcgYXJyYXkgYW5kIHRoZW4gY2hhbmdlIHRoZSBzcGVjaWZpYyBlbnRyaWVzLgotCSAqIAotCSAqIEBwYXJhbSBwZHMKLQkgKiBAcmV0dXJuIFRoZSBuZXcgY2hhbmdlZCBhcnJheSBvciB0aGUgc2FtZSBhcnJheSBpZiBubyBjaGFuZ2VzLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eURlc2NyaXB0b3JbXSBvdmVycmlkZVByb3BlcnR5RGVzY3JpcHRvcnMoUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzKSB7Ci0JCXJldHVybiBwZHM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiZWFuIGNsYXNzIHRoaXMgYmVhbmluZm8gaXMgZm9yLiBVc2VkIGJ5IHN1YmNsYXNzZXMgdG8gcXVpY2tseSBnZXQgdGhlIGJlYW4gY2xhc3Mgd2l0aG91dCBoYXZpbmcgdG8gY29kZSBpdCBvdmVyIGFuZCBvdmVyLgotCSAqIAotCSAqIEByZXR1cm4gYmVhbiBjbGFzcyBmb3IgdGhpcyBiZWFuaW5mby4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0QmVhbkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIGJlYW4gaW5mb3JtYXRpb24gY2xhc3MgdGhyb3dzIGFuIGV4Y2VwdGlvbi4gQnkgZGVmYXVsdCBpdCBwcmludHMgYSBtZXNzYWdlIGFuZCB0aGVuIGEgc3RhY2t0cmFjZSB0byBzeXMgZXJyLgotCSAqIAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5UaHJvd2FibGUKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlTeXN0ZW0uZXJyLnByaW50bG4oUkVTQlVORExFLmdldFN0cmluZygiVU5DQVVHSFRfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJAotCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRGZWF0dXJlRGVzY3JpcHRvclZhbHVlKEZlYXR1cmVEZXNjcmlwdG9yIGZkLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKERJU1BMQVlOQU1FLmVxdWFscyhrZXkpKSB7Ci0JCQlmZC5zZXREaXNwbGF5TmFtZSgoU3RyaW5nKSB2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoRVhQRVJULmVxdWFscyhrZXkpKSB7Ci0JCQlmZC5zZXRFeHBlcnQoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQl9IGVsc2UgaWYgKEhJRERFTi5lcXVhbHMoa2V5KSkgewotCQkJZmQuc2V0SGlkZGVuKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfSBlbHNlIGlmIChQUkVGRVJSRUQuZXF1YWxzKGtleSkpIHsKLQkJCWZkLnNldFByZWZlcnJlZCgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQlpZiAoSlZNXzFfMykgewotCQkJCS8vIEJ1ZyBpbiAxLjMgZG9lc24ndCBwcmVzZXJ2ZSB0aGUgcHJlZmVycmVkIGZsYWcsIHNvIHdlIHdpbGwgcHV0IGl0IGludG8gdGhlIGF0dHJpYnV0ZXMgdG9vLgotCQkJCWZkLnNldFZhbHVlKFBSRUZFUlJFRCwgdmFsdWUpOwotCQkJfQotCQl9IGVsc2UgaWYgKFNIT1JUREVTQ1JJUFRJT04uZXF1YWxzKGtleSkpIHsKLQkJCWZkLnNldFNob3J0RGVzY3JpcHRpb24oKFN0cmluZykgdmFsdWUpOwotCQl9Ci0JCS8vIE90aGVyd2lzZSBhc3N1bWUgYW4gYXJiaXRyYXJ5LW5hbWVkIHZhbHVlCi0JCS8vIEFzc3VtZSB0aGF0IHRoZSBGZWF0dXJlRGVzY3JpcHRvciBwcml2YXRlIGhhc2hUYWJsZVwKLQkJLy8gY29udGFpbnMgb25seSBhcmJpdHJhcnktbmFtZWQgYXR0cmlidXRlcwotCQllbHNlIHsKLQkJCWZkLnNldFZhbHVlKGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmF0YWwgZXJyb3JzIGFyZSBoYW5kbGVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QuIEJ5IGRlZmF1bHQgaXQgdGhyb3dzIGFuIEVycm9yIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIGV4Y2VwdGlvbiBtZXNzYWdlIHBsYWNlZCBpbnRvIHRoZSBuZXcgRXJyb3IgdGhyb3duLgotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBtZXNzYWdlIGFkZGVkIHRvIGV4Y2VwdGlvbiBtZXNzYWdlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3RoaW5nIHRvIGFkZC4KLQkgKiAKLQkgKiBAdGhyb3dzIEVycm9yCi0JICogICAgICAgICAgICAgdHVybnMgZXhjZXB0aW9uIGludG8gYW4gRXJyb3IuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRocm93RXJyb3IoRXhjZXB0aW9uIGUsIFN0cmluZyBzKSB7Ci0JCXRocm93IG5ldyBFcnJvcihlLnRvU3RyaW5nKCkgKyAiICIgKyBzKTsvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vYmFzZWJlYW5pbmZvbmxzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9iYXNlYmVhbmluZm9ubHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4ZmIxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9iYXNlYmVhbmluZm9ubHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9BdHRpYy9iYXNlYmVhbmluZm9ubHMucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjggJAotIwotCi0KLSMKLSMgUHJvcGVydGllcyBmb3IgdGhlIEl2akJlYW5JbmZvCi0jCi0KLSMKLSMgSXZqQmVhbkluZm8gU3RyaW5ncwotIwotQ2Fubm90X2dldF90aGVfbWV0aDFfRVhDXyA9IElXQVYwMDExRSBDYW5ub3QgZ2V0IHRoZSBtZXRob2QgezB9LgotQ2Fubm90X2NyZWF0ZV90aGVfRTFfRVhDXyA9IElXQVYwMDEyRSBDYW5ub3QgY3JlYXRlIHRoZSBFdmVudFNldERlc2NyaXB0b3IgZm9yIHswfS4KLUNhbm5vdF9jcmVhdGVfTWV0aG9kX0VYQ18gPSBJV0FWMDAxM0UgQ2Fubm90IGNyZWF0ZSB0aGUgTWV0aG9kRGVzY3JpcHRvciBmb3IgezB9LgotQ2Fubm90X2ZpbmRfdGhlX2FjYzFfRVhDXyA9IElXQVYwMDE0RSBDYW5ub3QgZmluZCBhdCBsZWFzdCB0aGUgd3JpdGUgb3IgcmVhZCBhY2Nlc3NvciBmb3IgcHJvcGVydHkgezB9LgotQ2Fubm90X2NyZWF0ZV9QYXJhbTFfRVhDXyA9IElXQVYwMDE1RSBDYW5ub3QgY3JlYXRlIHRoZSBQYXJhbWV0ZXJEZXNjcmlwdG9yIGZvciB7MH0uCi1DYW5ub3RfY3JlYXRlX3RoZV9QMSAgICAgID0gQ2Fubm90IGNyZWF0ZSB0aGUgUHJvcGVydHlEZXNjcmlwdG9yIGZvciB7MH0uCi17MH1fbm9fcmVhZF9tZXRob2RfRVhDXyAgID0gSVdBVjAwMTZFIENsYXNzIHswfSBkb2VzbicndCBoYXZlIHRoZSByZXF1ZXN0ZWQgcmVhZCBhY2Nlc3NvciB7MX0uCi17MH1fbm9fd3JpdGVfbWV0aG9kX0VYQ18gID0gSVdBVjAwMTdFIENsYXNzIHswfSBkb2VzbicndCBoYXZlIHRoZSByZXF1ZXN0ZWQgd3JpdGUgYWNjZXNzb3IgezF9LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vYmVhbmluZm8ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL3ZtL2JlYW5pbmZvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZmRkYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vYmVhbmluZm8ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9BdHRpYy9iZWFuaW5mby5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOCAkCi0jCi0KLQotIwotIyBQcm9wZXJ0aWVzIGZvciB0aGUgVkNFIEJlYW5pbmZvCi0jCi0KLSMKLSMgSXZqQmVhbkluZm8gU3RyaW5ncwotIwotQ2Fubm90X2dldF90aGVfbWV0aDFfRVhDXyA9IElXQVYwMDA3RSBDYW5ub3QgZ2V0IHRoZSBtZXRob2QgezB9LgotQ2Fubm90X2NyZWF0ZV90aGVfRTFfRVhDXyA9IElXQVYwMDA4RSBDYW5ub3QgY3JlYXRlIHRoZSBFdmVudFNldERlc2NyaXB0b3IgZm9yIHswfS4KLUNhbm5vdF9jcmVhdGVfTWV0aG9kX0VYQ18gPSBJV0FWMDAwOUUgQ2Fubm90IGNyZWF0ZSB0aGUgTWV0aG9kRGVzY3JpcHRvciBmb3IgezB9LgotQ2Fubm90X2ZpbmRfdGhlX2FjYzFfRVhDXyA9IElXQVYwMDEwRSBDYW5ub3QgZmluZCBhdCBsZWFzdCB0aGUgd3JpdGUgb3IgcmVhZCBhY2Nlc3NvciBmb3IgcHJvcGVydHkgezB9LgotQ2Fubm90X2NyZWF0ZV9QYXJhbTFfRVhDXyA9IElXQVYwMTQ2RSBDYW5ub3QgY3JlYXRlIHRoZSBQYXJhbWV0ZXJEZXNjcmlwdG9yIGZvciB7MH0uCi1DYW5ub3RfY3JlYXRlX3RoZV9QMV9FWENfID0gSVdBVjAxNDdFIENhbm5vdCBjcmVhdGUgdGhlIFByb3BlcnR5RGVzY3JpcHRvciBmb3IgezB9LgotezB9X25vX3JlYWRfbWV0aG9kX0VYQ18gICA9IElXQVYwMTQ4RSBDbGFzcyB7MH0gZG9lc24nJ3QgaGF2ZSB0aGUgcmVxdWVzdGVkIHJlYWQgYWNjZXNzb3IgezF9LgotezB9X25vX3dyaXRlX21ldGhvZF9FWENfICA9IElXQVYwMTQ5RSBDbGFzcyB7MH0gZG9lc24nJ3QgaGF2ZSB0aGUgcmVxdWVzdGVkIHdyaXRlIGFjY2Vzc29yIHsxfS4KLVVOQ0FVR0hUX0VYQ18gICAgICAgICAgICAgPSBJV0FWMDEyM0UgLS0tLS0tLS0tIFVOQ0FVR0hUIEVYQ0VQVElPTiAtLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0JlYW5EZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0JlYW5EZXNjcmlwdG9yRXF1YWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmMGIyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9CZWFuRGVzY3JpcHRvckVxdWFsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby52bTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5EZXNjcmlwdG9yRXF1YWxpdHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLio7Ci0vKioKLSAqIEVxdWFsaXR5IHRlc3RlciBmb3IgQmVhbkRlc2NyaXB0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuRGVzY3JpcHRvckVxdWFsaXR5IGV4dGVuZHMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB7Ci0Jc3RhdGljIHZvaWQgSU5JVCgpIHsKLQkJdHJ5IHsKLQkJCU1BUF9FUVVBTElUWS5wdXQoQmVhbkRlc2NyaXB0b3IuY2xhc3MsIChCZWFuRGVzY3JpcHRvckVxdWFsaXR5LmNsYXNzKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7QmVhbkRlc2NyaXB0b3IuY2xhc3N9KSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEJlYW5EZXNjcmlwdG9yRXF1YWxpdHkuCi0JICovCi0JcHVibGljIEJlYW5EZXNjcmlwdG9yRXF1YWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgQmVhbkRlc2NyaXB0b3JFcXVhbGl0eShCZWFuRGVzY3JpcHRvciBkZXNjcikgewotCQlzdXBlcihkZXNjcik7Ci0JfQotCQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgaGFzaGNvZGUgZm9yIHRoZSBjdXJyZW50IGZlYXR1cmUsIGFkZCB0aGlzCi0JICogdG8gdGhlIGhhc2hjb2RlIHJlY2VpdmVkIGZyb20gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUKLQkgKiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICoKLQkgKiBOT1RFOiBmb3Igc3ViY2xhc3NlcywgaXQgaXMgTUFORElUT1JZIHRoYXQgdGhlIGZpcnN0IGxpbmUgYmU6Ci0JICogICAgICAgICBpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCSAqICAgICAgIGFuZCB0aGUgbGFzdCBsaW5lIGJlOgotCSAqICAgICAgICAgcmV0dXJuIGhhc2hjb2RlKjMxICsgKHlvdXIgY2FsY3VsYXRlZCBoYXNoY29kZSBmb3IganVzdCB0aGlzIHN1YmNsYXNzKTsKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZUhhc2hDb2RlKCkgewotCQlpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCQlCZWFuRGVzY3JpcHRvciBiZCA9IChCZWFuRGVzY3JpcHRvcikgZkZlYXR1cmU7Ci0JCWludCBoYyA9IGJkLmdldEJlYW5DbGFzcygpLmhhc2hDb2RlKCk7Ci0JCWlmIChiZC5nZXRDdXN0b21pemVyQ2xhc3MoKSAhPSBudWxsKQotCQkJaGMgKz0gYmQuZ2V0Q3VzdG9taXplckNsYXNzKCkuaGFzaENvZGUoKTsKLQkJCQotCQlyZXR1cm4gaGFzaGNvZGUqMzEgKyBoYzsKLQl9Ci0JIAotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotIAkKLQkJQmVhbkRlc2NyaXB0b3Igb2IgPSAoQmVhbkRlc2NyaXB0b3IpICgoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkgb2JqKS5mRmVhdHVyZTsKLQkJQmVhbkRlc2NyaXB0b3IgZmIgPSAoQmVhbkRlc2NyaXB0b3IpIGZGZWF0dXJlOwotIAkJCi0JCWlmIChvYi5nZXRCZWFuQ2xhc3MoKSAhPSBmYi5nZXRCZWFuQ2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iLmdldEN1c3RvbWl6ZXJDbGFzcygpICE9IGZiLmdldEN1c3RvbWl6ZXJDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotIAkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9FdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiMWMyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9FdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLSAqICAkUkNTZmlsZTogRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotLyoqCi0gKiBFcXVhbGl0eSB0ZXN0ZXIgZm9yIEV2ZW50U2V0RGVzY3JpcHRvcnMKLSAqLwotcHVibGljIGNsYXNzIEV2ZW50U2V0RGVzY3JpcHRvckVxdWFsaXR5IGV4dGVuZHMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB7Ci0JCi0Jc3RhdGljIHZvaWQgSU5JVCgpIHsKLQkJdHJ5IHsKLQkJCU1BUF9FUVVBTElUWS5wdXQoRXZlbnRTZXREZXNjcmlwdG9yLmNsYXNzLCAoRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkuY2xhc3MpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtFdmVudFNldERlc2NyaXB0b3IuY2xhc3N9KSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBBcnJheUxpc3QgZkxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnM7CS8vIEFycmF5IG9mIE1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eSdzLgotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS4KLQkgKi8KLQlwdWJsaWMgRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkoRXZlbnRTZXREZXNjcmlwdG9yIGRlc2NyKSB7Ci0JCXN1cGVyKGRlc2NyKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBuZXcgZmVhdHVyZSBpcyBiZWluZyBzZXQgaW50byB0aGlzIG9iamVjdCwKLQkgKiBjbGVhciBhbnkgY2FjaGUgbWVtYmVycyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlY29uc3RydWN0ZWQuCi0JICoKLQkgKiBOT1RFOiBTdWJjbGFzc2VzIC0gcmVtZW1iZXIgdG8gY2FsbCBzdXBlci5jbGVhckZlYXR1cmUoKTsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckZlYXR1cmUoKSB7Ci0JCXN1cGVyLmNsZWFyRmVhdHVyZSgpOwotCQlmTGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyA9IG51bGw7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChmTGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlNZXRob2REZXNjcmlwdG9yW10gbWRzID0gKChFdmVudFNldERlc2NyaXB0b3IpIGZGZWF0dXJlKS5nZXRMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzKCk7Ci0JCQlmTGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QobWRzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8bWRzLmxlbmd0aDsgaSsrKQotCQkJCWZMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzLmFkZChuZXcgTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5KG1kc1tpXSkpOwotCQl9Ci0JCXJldHVybiBmTGlzdGVuZXJNZXRob2REZXNjcmlwdG9yczsKLQl9CQotCQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgaGFzaGNvZGUgZm9yIHRoZSBjdXJyZW50IGZlYXR1cmUsIGFkZCB0aGlzCi0JICogdG8gdGhlIGhhc2hjb2RlIHJlY2VpdmVkIGZyb20gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUKLQkgKiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICoKLQkgKiBOT1RFOiBmb3Igc3ViY2xhc3NlcywgaXQgaXMgTUFORElUT1JZIHRoYXQgdGhlIGZpcnN0IGxpbmUgYmU6Ci0JICogICAgICAgICBpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCSAqICAgICAgIGFuZCB0aGUgbGFzdCBsaW5lIGJlOgotCSAqICAgICAgICAgcmV0dXJuIGhhc2hjb2RlKjMxICsgKHlvdXIgY2FsY3VsYXRlZCBoYXNoY29kZSBmb3IganVzdCB0aGlzIHN1YmNsYXNzKTsKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZUhhc2hDb2RlKCkgewotCQlpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCQlFdmVudFNldERlc2NyaXB0b3IgYmQgPSAoRXZlbnRTZXREZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQkJaW50IGhjID0gYmQuZ2V0QWRkTGlzdGVuZXJNZXRob2QoKS5oYXNoQ29kZSgpOwotCQlNZXRob2RbXSBtZXRob2RzID0gYmQuZ2V0TGlzdGVuZXJNZXRob2RzKCk7Ci0JCWludCBtaGMgPSAwOwotCQlmb3IgKGludCBpPTA7IGk8bWV0aG9kcy5sZW5ndGg7IGkrKykKLQkJCW1oYyA9IG1oYyozMSArIG1ldGhvZHNbaV0uaGFzaENvZGUoKTsKLQkJaGMgKz0gbWhjOwotCQloYyArPSBsaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzKCkuaGFzaENvZGUoKTsKLQkJaGMgKz0gYmQuZ2V0TGlzdGVuZXJUeXBlKCkuaGFzaENvZGUoKTsKLQkJaGMgKz0gYmQuZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKS5oYXNoQ29kZSgpOwotCQloYyArPSAoYmQuaXNJbkRlZmF1bHRFdmVudFNldCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSkuaGFzaENvZGUoKTsKLQkJaGMgKz0gKGJkLmlzVW5pY2FzdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSkuaGFzaENvZGUoKTsJCQotCi0JCXJldHVybiBoYXNoY29kZSozMSArIGhjOwotCX0KLQotCSAKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoaWRlbnRpdHlUZXN0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQotIAkJCXJldHVybiBmYWxzZTsKLSAJCi0JCUV2ZW50U2V0RGVzY3JpcHRvciBvZSA9IChFdmVudFNldERlc2NyaXB0b3IpICgoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkgb2JqKS5mRmVhdHVyZTsKLQkJRXZlbnRTZXREZXNjcmlwdG9yIGZlID0gKEV2ZW50U2V0RGVzY3JpcHRvcikgZkZlYXR1cmU7Ci0JCQotCQlFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eSBvZWUgPSAoRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkpIG9iajsKLSAJCQotCQlpZiAoIW9lLmdldEFkZExpc3RlbmVyTWV0aG9kKCkuZXF1YWxzKGZlLmdldEFkZExpc3RlbmVyTWV0aG9kKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWphdmEudXRpbC5BcnJheXMuZXF1YWxzKG9lLmdldExpc3RlbmVyTWV0aG9kcygpLCBmZS5nZXRMaXN0ZW5lck1ldGhvZHMoKSkpCi0JCQlyZXR1cm4gZmFsc2U7CQotCQlpZiAob2UuZ2V0TGlzdGVuZXJUeXBlKCkgIT0gZmUuZ2V0TGlzdGVuZXJUeXBlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvZS5nZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpICE9IGZlLmdldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvZS5pc0luRGVmYXVsdEV2ZW50U2V0KCkgIT0gZmUuaXNJbkRlZmF1bHRFdmVudFNldCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob2UuaXNVbmljYXN0KCkgIT0gb2UuaXNVbmljYXN0KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoZkxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMgIT0gbnVsbCB8fCBvZWUuZkxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJLy8gV2UgYXJlIGluIGEgTWFwIGxvb2t1cCBzaXR1YXRpb24sIHNvIG9uZSBzaWRlIGhhcyBsaXN0ZW5lciBtZXRob2QgZXF1YWxpdGllcywgc28gd2Ugd2lsbCBjb21wYXJlIHRoYXQgd2F5LgotCQkJaWYgKCFvZWUubGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycygpLmVxdWFscyhsaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzKCkpKQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCS8vIFdlIGFyZSBpbiB0aGUgYnVpbGRpbmcgdGhlIGxpc3QgcGhhc2VzLCBkb24ndCB3YXN0ZSBzcGFjZSBidWlsZGluZyBlbnRpcmUgbGlzdC4KLQkJCU1ldGhvZERlc2NyaXB0b3JbXSBvdXJzID0gZmUuZ2V0TGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycygpOwotCQkJTWV0aG9kRGVzY3JpcHRvcltdIHRoZWlycyA9IG9lLmdldExpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMoKTsKLQkJCWlmIChvdXJzLmxlbmd0aCAhPSB0aGVpcnMubGVuZ3RoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvdXJzLmxlbmd0aCA+IDApIHsKLQkJCQlNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkgd29ya2luZ091cnMgPSBuZXcgTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5KCk7Ci0JCQkJTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5IHdvcmtpbmdUaGllcnMgPSBuZXcgTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXdvcmtpbmdPdXJzLnNldEZlYXR1cmUob3Vyc1tpXSk7Ci0JCQkJCXdvcmtpbmdUaGllcnMuc2V0RmVhdHVyZSh0aGVpcnNbaV0pOwotCQkJCQlpZiAoIXdvcmtpbmdPdXJzLmVxdWFscyh3b3JraW5nVGhpZXJzKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJCQotCQlyZXR1cm4gdHJ1ZTsJCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9GZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9GZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNmNjMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLSAqICAkUkNTZmlsZTogRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotLyoqCi0gKiBUaGlzIG9iamVjdCBpcyB1c2VkIHRvIHRlc3QgZm9yIHNlbWFudGljIGVxdWFsaXR5IChlcXVhbHMoKSkKLSAqIGJldHdlZW4gZmVhdHVyZSBvYmplY3RzLiBJdCBpcyBuZWVkZWQgYmVjYXVzZSBGZWF0dXJlJ3MgZG9uJ3QKLSAqIHByb3ZpZGUgYSBzZW1hbnRpYyBlcXVhbGl0eSwgb25seSBhbiBpZGVudGl0eSBlcXVhbGl0eS4gTmVlZAotICogc2VtYW50aWMgZXF1YWxpdHkgc28gdGhhdCBrZXlzIGluIG1hcCBjYW4gYmUgZm91bmQgZXF1YWwKLSAqIHNlbWFudGljYWxseS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB7Ci0JcHJvdGVjdGVkIEZlYXR1cmVEZXNjcmlwdG9yIGZGZWF0dXJlOwotCQotCXByaXZhdGUgSGFzaE1hcCBmVmFsdWVzOwkvLyBUaGUga2V5L3ZhbHVlcyBmb3IgdGhpcyBmZWF0dXJlLiBXZSBncmFiIHRoZW0gb3V0Ci0JCQkJCQkJCS8vIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIHJlLWdldHRpbmcgdGhlbSBmb3IgZXF1YWxpdHkKLQkJCQkJCQkJLy8gY29tcGFyZXMuIFRoaXMgaXMgZG9uZSB0aGUgZmlyc3QgdGltZSBuZWVkZWQgaW4gdGhlIGVxdWFscwotCQkJCQkJCQkvLyBzdGF0ZW1lbnQuCi0JCQkJCQkJCQotCXByaXZhdGUgaW50IGZIYXNoQ29kZSA9IDA7CS8vIEhhc2hjb2RlIG9mIHRoaXMgZXF1YWxpdHkgb2JqZWN0LiBUaGUgaGFzaGNvZGUgZm9yIHRoZSBmZWF0dXJlIGlzIGV4cGVuc2l2ZQotCQkJCQkvLyBzbyB3ZSB3aWxsIGNhbGN1bGF0ZSBpdCBvbmNlICh0aGUgYXNzdW1wdGlvbiBpcyB0aGF0Ci0JCQkJCS8vIGZlYXR1cmVzIG9uY2UgY3JlYXRlZCBhcmVuJ3QgY2hhbmdlZCwgd2hpY2ggZm9yIG91cgotCQkJCQkvLyBwdXJwb3NlcyBoZXJlIGluIGJlYW5pbmZvIGxhbmQgaXMgZ29vZCkuCi0JCQotCXByb3RlY3RlZCBzdGF0aWMgSGFzaE1hcCBNQVBfRVFVQUxJVFkgPSBuZXcgSGFzaE1hcCgxMCk7CS8vIE1hcCBmcm9tIGRlc2NyaXB0b3IgdG8gZXF1YWxpdHkgdHlwZS4KLQlzdGF0aWMgewotCQl0cnkgewotCQkJTUFQX0VRVUFMSVRZLnB1dChGZWF0dXJlRGVzY3JpcHRvci5jbGFzcywgKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkuY2xhc3MpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtGZWF0dXJlRGVzY3JpcHRvci5jbGFzc30pKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkvLyBOZWVkIHRvIHNldCB1cCB0aGUgb3RoZXJzLgotCQlCZWFuRGVzY3JpcHRvckVxdWFsaXR5LklOSVQoKTsKLQkJRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkuSU5JVCgpOwkJCi0JCUluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5JTklUKCk7Ci0JCU1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eS5JTklUKCk7CQkKLQkJUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5LklOSVQoKTsKLQl9Ci0JCQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGRlc2NyaXB0b3IgZXF1YWxpdHkgZm9yIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSBjcmVhdGVFcXVhbGl0eShGZWF0dXJlRGVzY3JpcHRvciBkZXNjcikgewotCQl0cnkgewotCQkJcmV0dXJuIChGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSAoKENvbnN0cnVjdG9yKSBNQVBfRVFVQUxJVFkuZ2V0KGRlc2NyLmdldENsYXNzKCkpKS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge2Rlc2NyfSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCi0JcHVibGljIEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkoKSB7Ci0JfQotCQotCS8qKgotCSAqIE5PVEU6IEV2ZXJ5IHN1YmNsYXNzIG5lZWRzIHRvIGltcGxlbWVudCBhbiBvdmVycmlkZSBmb3IgdGhlIG1ldGhvZHM6Ci0JICogICAgICAgY2FsY3VsYXRlSGFzaENvZGUKLQkgKiAgICAgICBlcXVhbHMKLQkgKiAgICAgICBjbGVhckZlYXR1cmUgLSBpZiBpdCBoYXMgYW55IGNhY2hlIHZhbHVlcwotCSAqLwotCQkJCQkKLQlwdWJsaWMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eShGZWF0dXJlRGVzY3JpcHRvciBmZWF0dXJlKSB7Ci0JCXNldEZlYXR1cmUoZmVhdHVyZSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEZlYXR1cmUoRmVhdHVyZURlc2NyaXB0b3IgZmVhdHVyZSkgewotCQljbGVhckZlYXR1cmUoKTsKLQkJZkZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQkKLQkvKioKLQkgKiBBIG5ldyBmZWF0dXJlIGlzIGJlaW5nIHNldCBpbnRvIHRoaXMgb2JqZWN0LAotCSAqIGNsZWFyIGFueSBjYWNoZSBtZW1iZXJzIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVjb25zdHJ1Y3RlZC4KLQkgKgotCSAqIE5PVEU6IFN1YmNsYXNzZXMgLSByZW1lbWJlciB0byBjYWxsIHN1cGVyLmNsZWFyRmVhdHVyZSgpOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyRmVhdHVyZSgpIHsKLQkJZlZhbHVlcyA9IG51bGw7Ci0JCWZIYXNoQ29kZSA9IDA7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7Ci0JCWlmIChmSGFzaENvZGUgPT0gMCkKLQkJCWZIYXNoQ29kZSA9IGNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JCXJldHVybiBmSGFzaENvZGU7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIEhhc2hNYXAgdmFsdWVzKCkgewotCQlpZiAoZlZhbHVlcyA9PSBudWxsKSB7Ci0JCQlmVmFsdWVzID0gbmV3IEhhc2hNYXAoNSk7Ci0JCQkKLQkJCUVudW1lcmF0aW9uIGtleXMgPSBmRmVhdHVyZS5hdHRyaWJ1dGVOYW1lcygpOwotCQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJCWZWYWx1ZXMucHV0KGtleSwgZkZlYXR1cmUuZ2V0VmFsdWUoa2V5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZWYWx1ZXM7Ci0JfQotCQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgaGFzaGNvZGUgZm9yIHRoZSBjdXJyZW50IGZlYXR1cmUsIGFkZCB0aGlzCi0JICogdG8gdGhlIGhhc2hjb2RlIHJlY2VpdmVkIGZyb20gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUKLQkgKiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICoKLQkgKiBOT1RFOiBmb3Igc3ViY2xhc3NlcywgaXQgaXMgTUFORElUT1JZIHRoYXQgdGhlIGZpcnN0IGxpbmUgYmU6Ci0JICogICAgICAgICBpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCSAqICAgICAgIGFuZCB0aGUgbGFzdCBsaW5lIGJlOgotCSAqICAgICAgICAgcmV0dXJuIGhhc2hjb2RlKjMxICsgKHlvdXIgY2FsY3VsYXRlZCBoYXNoY29kZSBmb3IganVzdCB0aGlzIHN1YmNsYXNzKTsKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZUhhc2hDb2RlKCkgewotCQlpbnQgaGFzaGNvZGUgPSAwOwotCQlpZiAoZkZlYXR1cmUuZ2V0TmFtZSgpICE9IG51bGwpCi0JCQloYXNoY29kZSArPSBmRmVhdHVyZS5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQkJCQotCQlpZiAoZkZlYXR1cmUuZ2V0RGlzcGxheU5hbWUoKSAhPSBmRmVhdHVyZS5nZXROYW1lKCkpCi0JCQloYXNoY29kZSArPSBmRmVhdHVyZS5nZXREaXNwbGF5TmFtZSgpLmhhc2hDb2RlKCk7Ci0JCWlmIChmRmVhdHVyZS5nZXRTaG9ydERlc2NyaXB0aW9uKCkgIT0gZkZlYXR1cmUuZ2V0RGlzcGxheU5hbWUoKSkKLQkJCWhhc2hjb2RlICs9IGZGZWF0dXJlLmdldFNob3J0RGVzY3JpcHRpb24oKS5oYXNoQ29kZSgpOwkJCQotCQkJCi0JCWhhc2hjb2RlICs9IChmRmVhdHVyZS5pc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSkuaGFzaENvZGUoKTsKLQkJaGFzaGNvZGUgKz0gKGZGZWF0dXJlLmlzSGlkZGVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwkJCi0JCWhhc2hjb2RlICs9IChmRmVhdHVyZS5pc1ByZWZlcnJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSkuaGFzaENvZGUoKTsKLQkJCi0JCWhhc2hjb2RlICs9IHZhbHVlcygpLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBoYXNoY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogZXF1YWxzOiBTZWUgaWYgdGhpcyBpcyBlcXVhbCBzZW1hbnRpY2FsbHkuCi0JICoKLQkgKiBOT1RFOiBFdmVyeSBzdWJjbGFzcyBuZWVkcyB0byBpbXBsZW1lbnQgdGhpcyBhbmQKLQkgKiAgICAgICB0aGUgZmlyc3QgZmV3IGxpbmVzIHNob3VsZCBiZToKLQkgKiAgICAgICAgIGlmIChpZGVudGl0eVRlc3QoKSkKLQkgKiAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0JICogICAgICAgICBpZiAoIXN1cGVyLmVxdWFscyhvYmopKQotCSAqICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICovCi0JIAotCSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoaWRlbnRpdHlUZXN0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSBvZmUgPSAoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkgb2JqOwkgCQkKLQkgCUZlYXR1cmVEZXNjcmlwdG9yIG9mID0gb2ZlLmZGZWF0dXJlOwotCSAJCQotCSAJaWYgKGZGZWF0dXJlLmdldENsYXNzKCkgIT0gb2YuZ2V0Q2xhc3MoKSkKLQkgCQlyZXR1cm4gZmFsc2U7Ci0JIAkJCi0JIAlpZiAoIWZGZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMob2YuZ2V0TmFtZSgpKSkKLQkgCQlyZXR1cm4gZmFsc2U7Ci0JIAlpZiAoIWZGZWF0dXJlLmdldERpc3BsYXlOYW1lKCkuZXF1YWxzKG9mLmdldERpc3BsYXlOYW1lKCkpKQotCSAJCXJldHVybiBmYWxzZTsKLQkgCWlmICghZkZlYXR1cmUuZ2V0U2hvcnREZXNjcmlwdGlvbigpLmVxdWFscyhvZi5nZXRTaG9ydERlc2NyaXB0aW9uKCkpKQotCSAJCXJldHVybiBmYWxzZTsJIAotCSAJaWYgKGZGZWF0dXJlLmlzRXhwZXJ0KCkgIT0gb2YuaXNFeHBlcnQoKSB8fAotCQkgCQlmRmVhdHVyZS5pc0hpZGRlbigpICE9IG9mLmlzSGlkZGVuKCkgfHwKLQkJIAkJZkZlYXR1cmUuaXNQcmVmZXJyZWQoKSAhPSBvZi5pc1ByZWZlcnJlZCgpKQotCSAJCXJldHVybiBmYWxzZTsKLQkgCQotCQlpZiAoIXZhbHVlcygpLmVxdWFscyhvZmUudmFsdWVzKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQkgfQotCSAKLQkgLyoKLQkgICogSWRlbnRpdHkgdGVzdDogVGVzdHMgZm9yIHF1aWNrIGlkZW50aXR5IG9mCi0JICAqIGRlc2NyaXB0b3JzLiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlbiAKLQkgICogbm8gb3RoZXIgdGVzdHMgcmVxdWlyZWQuCi0JICAqLwotCSBwcm90ZWN0ZWQgYm9vbGVhbiBpZGVudGl0eVRlc3QoT2JqZWN0IG9iaikgewotCSAJaWYgKCEob2JqIGluc3RhbmNlb2YgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkpCi0JIAkJcmV0dXJuIGZhbHNlOwotCSAJaWYgKHRoaXMgPT0gb2JqKQotCSAJCXJldHVybiB0cnVlOwotCi0JIAlpZiAoKChGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSBvYmopLmZGZWF0dXJlID09IGZGZWF0dXJlKQotCSAJCXJldHVybiB0cnVlOwotCSAJCQotCSAJcmV0dXJuIGZhbHNlOwkgCQotCSB9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9JbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U4NDkzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9JbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLSAqICAkUkNTZmlsZTogSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotLyoqCi0gKiBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yIGVxdWFsaXR5IHRlc3RlcgotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5IGV4dGVuZHMgUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkgewotCi0Jc3RhdGljIHZvaWQgSU5JVCgpIHsKLQkJdHJ5IHsKLQkJCU1BUF9FUVVBTElUWS5wdXQoSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvci5jbGFzcywgKEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5jbGFzcykuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge1Byb3BlcnR5RGVzY3JpcHRvci5jbGFzc30pKTsKLQkJCU1BUF9FUVVBTElUWS5wdXQoUHJvcGVydHlEZXNjcmlwdG9yLmNsYXNzLCAoSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5LmNsYXNzKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7UHJvcGVydHlEZXNjcmlwdG9yLmNsYXNzfSkpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5KCkgewotCX0KLQkKLQlwdWJsaWMgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5KFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcikgewotCQlzdXBlcihkZXNjcik7Ci0JfQkKLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIGhhc2hjb2RlIGZvciB0aGUgY3VycmVudCBmZWF0dXJlLCBhZGQgdGhpcwotCSAqIHRvIHRoZSBoYXNoY29kZSByZWNlaXZlZCBmcm9tIHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlCi0JICogYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqCi0JICogTk9URTogZm9yIHN1YmNsYXNzZXMsIGl0IGlzIE1BTkRJVE9SWSB0aGF0IHRoZSBmaXJzdCBsaW5lIGJlOgotCSAqICAgICAgICAgaW50IGhhc2hjb2RlID0gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkgKiAgICAgICBhbmQgdGhlIGxhc3QgbGluZSBiZToKLQkgKiAgICAgICAgIHJldHVybiBoYXNoY29kZSozMSArICh5b3VyIGNhbGN1bGF0ZWQgaGFzaGNvZGUgZm9yIGp1c3QgdGhpcyBzdWJjbGFzcyk7Ci0JICovCi0JcHJvdGVjdGVkIGludCBjYWxjdWxhdGVIYXNoQ29kZSgpIHsKLQkJaW50IGhhc2hjb2RlID0gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkJaWYgKGZGZWF0dXJlIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcikgewotCQkJSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvciBwZCA9IChJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQkJCQotCQkJaW50IGhjID0gcGQuZ2V0SW5kZXhlZFByb3BlcnR5VHlwZSgpLmhhc2hDb2RlKCk7Ci0JCi0JCQlpZiAocGQuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSAhPSBudWxsKQotCQkJCWhjICs9IHBkLmdldEluZGV4ZWRSZWFkTWV0aG9kKCkuaGFzaENvZGUoKTsKLQkJCWlmIChwZC5nZXRJbmRleGVkV3JpdGVNZXRob2QoKSAhPSBudWxsKQotCQkJCWhjICs9IHBkLmdldEluZGV4ZWRXcml0ZU1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCQlyZXR1cm4gaGFzaGNvZGUqMzEgKyBoYzsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gaGFzaGNvZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZkZlYXR1cmUuZ2V0Q2xhc3MoKSAhPSAoKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkpIG9iaikuZkZlYXR1cmUuZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsJLy8gSWYgdGhleSBhcmVuJ3QgYm90aCBQcm9wZXJ0eURlc2NpcHRvcnMgb3IgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcnMsIHRoZW4gdGhleSBkb24ndCBtYXRjaC4KLQkJaWYgKCFzdXBlci5lcXVhbHMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLSAJCi0JCWlmIChmRmVhdHVyZSBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIHsKLQkJCUluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3Igb3AgPSAoSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcikgKChGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSBvYmopLmZGZWF0dXJlOwotCQkJSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvciBmcCA9IChJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQotCQkJaWYgKG9wLmdldEluZGV4ZWRQcm9wZXJ0eVR5cGUoKSAhPSBmcC5nZXRJbmRleGVkUHJvcGVydHlUeXBlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9wLmdldEluZGV4ZWRSZWFkTWV0aG9kKCkgIT0gZnAuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob3AuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkgIT0gZnAuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkpCi0JCQkJcmV0dXJuIGZhbHNlOyAKLQkJfQkJCQkJCQkJCQkJCQkKLQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9NZXRob2REZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01ldGhvZERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjMzMTlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01ldGhvZERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLSAqICAkUkNTZmlsZTogTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotLyoqCi0gKiBFcXVhbGl0eSB0ZXN0ZXIgZm9yIE1ldGhvZERlc2NyaXB0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkgZXh0ZW5kcyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHsKLQkKLQlzdGF0aWMgdm9pZCBJTklUKCkgewotCQl0cnkgewotCQkJTUFQX0VRVUFMSVRZLnB1dChNZXRob2REZXNjcmlwdG9yLmNsYXNzLCAoTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5LmNsYXNzKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7TWV0aG9kRGVzY3JpcHRvci5jbGFzc30pKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBBcnJheUxpc3QgZlBhcmFtZXRlckRlc2NyaXB0b3JzOwkvLyBBcnJheSBvZiBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkncy4KLQkKLQlwdWJsaWMgTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5KCkgewotCX0KLQkKLQlwdWJsaWMgTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5KE1ldGhvZERlc2NyaXB0b3IgZGVzY3IpIHsKLQkJc3VwZXIoZGVzY3IpOwotCX0KLQkKLQkvKioKLQkgKiBBIG5ldyBmZWF0dXJlIGlzIGJlaW5nIHNldCBpbnRvIHRoaXMgb2JqZWN0LAotCSAqIGNsZWFyIGFueSBjYWNoZSBtZW1iZXJzIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVjb25zdHJ1Y3RlZC4KLQkgKgotCSAqIE5PVEU6IFN1YmNsYXNzZXMgLSByZW1lbWJlciB0byBjYWxsIHN1cGVyLmNsZWFyRmVhdHVyZSgpOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyRmVhdHVyZSgpIHsKLQkJc3VwZXIuY2xlYXJGZWF0dXJlKCk7Ci0JCWZQYXJhbWV0ZXJEZXNjcmlwdG9ycyA9IG51bGw7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IHBhcmFtZXRlckRlc2NyaXB0b3JzKCkgewotCQlpZiAoZlBhcmFtZXRlckRlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCVBhcmFtZXRlckRlc2NyaXB0b3JbXSBwZHMgPSAoKE1ldGhvZERlc2NyaXB0b3IpIGZGZWF0dXJlKS5nZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpOwotCQkJaWYgKHBkcyAhPSBudWxsKSB7CQkJCi0JCQkJZlBhcmFtZXRlckRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdChwZHMubGVuZ3RoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8cGRzLmxlbmd0aDsgaSsrKQotCQkJCQlmUGFyYW1ldGVyRGVzY3JpcHRvcnMuYWRkKG5ldyBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkocGRzW2ldKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZQYXJhbWV0ZXJEZXNjcmlwdG9yczsKLQl9Ci0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBoYXNoY29kZSBmb3IgdGhlIGN1cnJlbnQgZmVhdHVyZSwgYWRkIHRoaXMKLQkgKiB0byB0aGUgaGFzaGNvZGUgcmVjZWl2ZWQgZnJvbSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZQotCSAqIGFuZCByZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKgotCSAqIE5PVEU6IGZvciBzdWJjbGFzc2VzLCBpdCBpcyBNQU5ESVRPUlkgdGhhdCB0aGUgZmlyc3QgbGluZSBiZToKLQkgKiAgICAgICAgIGludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JICogICAgICAgYW5kIHRoZSBsYXN0IGxpbmUgYmU6Ci0JICogICAgICAgICByZXR1cm4gaGFzaGNvZGUqMzEgKyAoeW91ciBjYWxjdWxhdGVkIGhhc2hjb2RlIGZvciBqdXN0IHRoaXMgc3ViY2xhc3MpOwotCSAqLwotCXByb3RlY3RlZCBpbnQgY2FsY3VsYXRlSGFzaENvZGUoKSB7Ci0JCWludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JCU1ldGhvZERlc2NyaXB0b3IgYmQgPSAoTWV0aG9kRGVzY3JpcHRvcikgZkZlYXR1cmU7Ci0JCWludCBoYyA9IGJkLmdldE1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCWlmIChwYXJhbWV0ZXJEZXNjcmlwdG9ycygpICE9IG51bGwpCi0JCQloYyArPSBwYXJhbWV0ZXJEZXNjcmlwdG9ycygpLmhhc2hDb2RlKCk7IAotCi0JCXJldHVybiBoYXNoY29kZSozMSArIGhjOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCWlmICghc3VwZXIuZXF1YWxzKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5IG9lbSA9IChNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkpIG9iajsKLQkJTWV0aG9kRGVzY3JpcHRvciBvbSA9IChNZXRob2REZXNjcmlwdG9yKSBvZW0uZkZlYXR1cmU7Ci0JCU1ldGhvZERlc2NyaXB0b3IgZm0gPSAoTWV0aG9kRGVzY3JpcHRvcikgZkZlYXR1cmU7Ci0gCQkKLQkJaWYgKGZtLmdldE1ldGhvZCgpICE9IG9tLmdldE1ldGhvZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCQotCQlpZiAoZlBhcmFtZXRlckRlc2NyaXB0b3JzICE9IG51bGwgfHwgb2VtLmZQYXJhbWV0ZXJEZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQkvLyBXZSBhcmUgaW4gYSBNYXAgbG9va3VwIHNpdHVhdGlvbiwgc28gb25lIHNpZGUgaGFzIGxpc3RlbmVyIG1ldGhvZCBlcXVhbGl0aWVzLCBzbyB3ZSB3aWxsIGNvbXBhcmUgdGhhdCB3YXkuCi0JCQlpZiAocGFyYW1ldGVyRGVzY3JpcHRvcnMoKSA9PSBudWxsKQotCQkJCWlmICgoKE1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eSkgb2JqKS5wYXJhbWV0ZXJEZXNjcmlwdG9ycygpICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlIDsKLQkJCWVsc2UKLQkJCQlpZiAoIXBhcmFtZXRlckRlc2NyaXB0b3JzKCkuZXF1YWxzKCgoTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5KSBvYmopLnBhcmFtZXRlckRlc2NyaXB0b3JzKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXZSBhcmUgaW4gdGhlIGJ1aWxkaW5nIHRoZSBsaXN0IHBoYXNlcywgZG9uJ3Qgd2FzdGUgc3BhY2UgYnVpbGRpbmcgZW50aXJlIGxpc3QuCi0JCQlQYXJhbWV0ZXJEZXNjcmlwdG9yW10gb3VycyA9IGZtLmdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0JCQlQYXJhbWV0ZXJEZXNjcmlwdG9yW10gdGhlaXJzID0gb20uZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQkJCWlmIChvdXJzID09IHRoZWlycykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UgaWYgKG91cnMgPT0gbnVsbCkKLQkJCQlpZiAodGhlaXJzICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCTsKLQkJCWVsc2UgaWYgKHRoZWlycyA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UgaWYgKG91cnMubGVuZ3RoICE9IHRoZWlycy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZSBpZiAob3Vycy5sZW5ndGggPiAwKSB7Ci0JCQkJUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5IHdvcmtpbmdPdXJzID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eSgpOwotCQkJCVBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eSB3b3JraW5nVGhpZXJzID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3Vycy5sZW5ndGg7IGkrKykgewotCQkJCQl3b3JraW5nT3Vycy5zZXRGZWF0dXJlKG91cnNbaV0pOwotCQkJCQl3b3JraW5nVGhpZXJzLnNldEZlYXR1cmUodGhlaXJzW2ldKTsKLQkJCQkJaWYgKCF3b3JraW5nT3Vycy5lcXVhbHMod29ya2luZ1RoaWVycykpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCQkJCi0gCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01vZGVsaW5nQmVhbkluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01vZGVsaW5nQmVhbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0OTQzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IE1vZGVsaW5nQmVhbkluZm8uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTEgJCAgJERhdGU6IDIwMDUvMTAvMTggMTU6MzI6MTkgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5jb21tb24uSUJhc2VCZWFuSW5mb0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uQmFzZUJlYW5JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgYmVhbmluZm8gY2xhc3MgdGhhdCBpcyBjcmVhdGVkIHdoZW4gYmVhbmluZm8gbW9kZWxpbmcgaW50cm9zcGVjdHMgYSBiZWFuLiBJdHMgcHVycG9zZSBpcyB0byBnYXRoZXIgdG9nZXRoZXIgYW5kIGFuYWx5emUgdGhlCi0gKiBiZWFuaW5mby4gRm9yIGV4YW1wbGUsIGl0IGNoZWNrcyB3aXRoIHRoZSBzdXBlcnR5cGUgYmVhbmluZm8gdG8gc2VlIGlmIGFsbCBvZiB0aGUgc3VwZXJ0eXBlJ3MgZGVzY3JpcHRvcnMgYXJlIGluY2x1ZGVkIGluIHRoaXMgbGlzdC4gSWYgdGhleSBhcmUsCi0gKiB0aGVuIGl0IGtub3dzIHRoYXQgaXQgZG9lcyBhIHN0cmFpZ2h0IGluaGVyaXRhbmNlIG9mIHRoZSBzdXBlcnR5cGUncyBkZXNjcmlwdG9ycywgYW5kIHRob3NlIGRlc2NyaXB0b3JzIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFRoaXMgbWFrZXMgaXQKLSAqIGVhc2llciBvbiB0aGUgbW9kZWwgc2lkZSBzbyB0aGF0IHRoZXJlIGlzbid0IGEgZ3JlYXQgcHJvbGlmZXJhdGlvbiBvZiBkZXNjcmlwdG9ycyBhbGwgZGVzY3JpYmluZyB0aGUgc2FtZSBwcm9wZXJ0aWVzLiBJbiB0aGF0IGNhc2UgdGhleSBjYW4gYmUKLSAqIG1lcmdlZCBmcm9tIHRoZSBzdXBlcnR5cGUgbW9kZWwuIElmIHNvbWUgYXJlIG5vdCBmb3VuZCwgdGhlbiB0aGF0IG1lYW5zIHRoaXMgYmVhbmluZm8gaXMgdHJ5aW5nIHRvIGhpZGUgc29tZSBvZiB0aGVtLCBhbmQgaW4gdGhhdCBjYXNlIHRoaXMgaXMgdGhlCi0gKiBkZWZpbml0aXZlIGxpc3QgYW5kIGluaGVyaXRhbmNlIHNob3VsZG4ndCBiZSB1c2VkIG9uIHRoZSBtb2RlbCBzaWRlLiBIb3dldmVyLCBmb3IgdGhvc2UgZmVhdHVyZXMgd2hpY2ggYXJlIGVzc2VudGlhbGx5IHRoZSBpbmhlcml0ZWQgZmVhdHVyZSAoaS5lLgotICogdGhlIEJlYW5JbmZvIHNpbXBseSBmaWx0ZXJlZCBvdXQgc29tZSBpbmhlcml0ZWQgYnV0IG5vdCBhbGwpLCB0aGV5IHdpbGwgYmUgcmV0dXJuYWJsZSAoYnkgbmFtZSkuIFRoZSBJREUgc2lkZSB3aWxsIHRha2UgdGhlc2UgdGhhdCBhcmUgImluaGVyaXRlZCIKLSAqIGFuZCB3aWxsIHJldHVybiB0aGUgYWN0dWFsIHN0cnVjdHVyZWQgZmVhdHVyZSBmcm9tIHRoZSBpbmhlcml0ZWQgY2xhc3MuCi0gKiAKLSAqIFRoZSB0ZXN0IGZvciBzZWVpbmcgaWYgdGhlIHN1cGVyIGZlYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGJlYW5pbmZvIGlzIGZpcnN0IHRvIHNlZSBpZiB0aGUgdGhlIGZlYXR1cmUgaXMgaW4gdGhlIGJlYW5pbmZvIGJ5IG5hbWUsIGlmIGl0IGlzIHRoZW4KLSAqIGl0IGlzIG1hcmtlZCBhcyBpbmNsdWRlZC4gVGhlbiBhIGNoZWNrIGlzIG1hZGUgb24gZXF1YWxpdHksIGlmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIHRoZSBmZWF0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgYmVhbmluZm8gbGlzdCwgYnV0IHRoZSBtZXJnZQotICogZmxhZyBpcyBzdGlsbCBsZWZ0IG9uLCBhbmQgcmVtb3ZlZCBpbmhlcml0ZWQgZmVhdHVyZSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiBpbmhlcml0ZWQgZmVhdHVyZXMuIElmIGFsbCBpbmhlcml0ZWQgZmVhdHVyZXMgYXJlIGZvdW5kLCB0aGlzIGxpc3QgaXMKLSAqIGNsZWFyZWQgYW5kIGZsYWcgaXMgc2V0IHdoaWNoIHNpbXBseSBzYXlzIG1lcmdlIGFsbCBpbmhlcml0ZWQuIFRoaXMgYWxsb3dzIG1lcmdpbmcgdG8gb2NjdXIgYnV0IGl0IGFsc28gYWxsb3dzIG92ZXJyaWRlcyB0byBvY2N1ci4KLSAqIAotICogTm90ZTogVGVzdCBmb3IgaWRlbnRpdHkgaXMgZGlmZmVyZW50IGJldHdlZW4gSkRLIDEuNSBhbmQgYWJvdmUgYW5kIGJlbG93LiAxLjUgYW5kIGFib3ZlLCB3ZSBjYW4gdXNlIGFjdHVhbCBlcXVhbHMoKSBiZWNhdXNlIHRoZSBzYW1lIGRlc2NyaXB0b3IgaXMKLSAqIHJldHVybmVkIGZyb20gaW5oZXJpdGVkIGZlYXR1cmVzLiBJbiAxLjMsIGNsb25lcyB3ZXJlIGFsd2F5cyByZXR1cm5lZCBhbmQgZXF1YWxzKCkgd291bGQgYW5zd2VyIGZhbHNlLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgZXF1YWxpdHkKLSAqIGRlc2NyaXB0b3Igd2hpY2ggdHVybnMgdGhlIGVxdWFscygpIGludG8gb25lIHRoYXQgY2FuIHRlc3QgY2xvbmVzIGZvciBzZW1hbnRpYyBlcXVhbGl0eS4gU2VlIEphdmEgQnVnIElEIzQ5OTY2NzMgVGhlIHByb2JsZW0gd2FzIHN1cHBvc2VkIHRvIGJlCi0gKiBmaXhlZCBpbiAxLjQgYnV0IGl0IHdhcyBub3QgZml4ZWQuIE9yaWdpbmFsbHkgYSBuZXcgY2xvbmUgd2FzIGNyZWF0ZWQgZWFjaCB0aW1lIGEgYmVhbmluZm8gd2FzIHJlcXVlc3RlZC4gVGhhdCBpcyBubyBsb25nZXIgZG9uZSBpbiAxLjQsIGJ1dCB0aGUKLSAqIHByb2Nlc3NpbmcgdG8gY3JlYXRlIHRoZSBvcmlnaW5hbCBiZWFuaW5mbyBkb2VzIGEgY2xvbmUgYWNjaWRlbnRseSB1bmRlciB0aGUgY292ZXJzLiBMb29raW5nIGF0IDEuNSBpdCBsb29rcyB0aGlzIHdhcyBmaXhlZCwgYnV0IGl0IGhhc24ndCBiZWVuCi0gKiB0ZXN0ZWQgaGVyZSB5ZXQuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsaW5nQmVhbkluZm8gaW1wbGVtZW50cyBJQ2FsbGJhY2sgewotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBQUkUxNTsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmVyc2lvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJUFJFMTUgPSB2ZXJzaW9uLnN0YXJ0c1dpdGgoIjEuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKFBSRTE1KSB7Ci0JCQkvLyBDb250aW51ZSB0byBjaGVjaywgZ2V0IHRoZSByZXZpc2lvbi4KLQkJCWludCByZXZpc2lvbiA9IDA7Ci0JCQlpZiAodmVyc2lvbi5sZW5ndGgoKSA+IDIpIHsKLQkJCQlpbnQgcmV2RW5kID0gdmVyc2lvbi5pbmRleE9mKCcuJywgMik7Ci0JCQkJcmV2aXNpb24gPSB2ZXJzaW9uLmxlbmd0aCgpID4gMiA/IEludGVnZXIucGFyc2VJbnQocmV2RW5kICE9IC0xID8gdmVyc2lvbi5zdWJzdHJpbmcoMiwgcmV2RW5kKSA6IHZlcnNpb24uc3Vic3RyaW5nKDIpKSA6IDA7Ci0JCQkJUFJFMTUgPSByZXZpc2lvbiA8IDU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgRmVhdHVyZUVxdWFsaXR5U2V0IGV4dGVuZHMgSGFzaFNldCB7Ci0KLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNzQ0Nzc2NzQwNjA0MzI4MzI0TDsKLQkJcHJpdmF0ZSBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHdvcmtpbmdLZXk7Ci0KLQkJcHVibGljIEZlYXR1cmVFcXVhbGl0eVNldChMaXN0IGZlYXR1cmVzKSB7Ci0JCQlzdXBlcihmZWF0dXJlcy5zaXplKCkpOwotCQkJLy8gR2V0IGZpcnN0IGZlYXR1cmUgdG8gZmlxdXJlIG91dCB0eXBlIG9mIHdvcmtpbmcga2V5LiBUaGlzIHdpbGwgbm90IGJlIHJlZW50cmFudC4KLQkJCXdvcmtpbmdLZXkgPSBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5LmNyZWF0ZUVxdWFsaXR5KChGZWF0dXJlRGVzY3JpcHRvcikgZmVhdHVyZXMuZ2V0KDApKTsKLQkJCXRoaXMuYWRkQWxsKGZlYXR1cmVzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZChPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBzdXBlci5hZGQoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5jcmVhdGVFcXVhbGl0eSgoRmVhdHVyZURlc2NyaXB0b3IpIG8pKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2NvbnRhaW5zKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCQl3b3JraW5nS2V5LnNldEZlYXR1cmUoKEZlYXR1cmVEZXNjcmlwdG9yKSBvKTsKLQkJCXJldHVybiBzdXBlci5jb250YWlucyh3b3JraW5nS2V5KTsKLQkJfQotCi0JfQotCi0JLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgaW5kaWNhdGUgaWYgdGhlIHN1cGVyIGluZm8gc2hvdWxkIGJlIG1lcmdlZAotCS8vIGluIG9uIHRoZSBtb2RlbCBzaWRlLiBubyBtZXJnZSBtZWFucyB0aGVyZSB3ZXJlIG5vIGluaGVyaXRlZCBtZXRob2RzIGF0IGFsbC4gU28gdGhlCi0JLy8gYmVhbmluZm8gcHJlc2VudGVkIGlzIGRlZmluaXRpdmUuIElmIG1lcmdlLCB0aGVuIGdldC4uLkRlc2NyaXB0b3JzIHdpbGwgcmV0dXJuIGp1c3QKLQkvLyB0aGUgb25lcyBmb3IgdGhpcyBsZXZlbCwgYW5kIGdldFN1cGVyLi4uRGVzY3JpcHRvcnMgd2lsbCByZXR1cm4gdGhlIGluaGVyaXRlZCBvbmVzLgotCS8vIFRob3VnaCBpbiB0aGlzIGNhc2UsIGlmIHRoZSByZXR1cm5lZCBzdXBlciBsaXN0IGlzIG51bGwsIHRoZW4gdGhhdCBtZWFucyB1c2UgQUxMIG9mCi0JLy8gdGhlIGluaGVyaXRlZCBvbmVzLgotCS8vIFRoZSBzdXBlciBsaXN0IHJldHVybnMgc2ltcGx5IHRoZSBuYW1lcywgZG9uJ3QgbmVlZCB0byBoYXZlIHRoZSBmdWxsIGRlc2NyaXB0b3JzIGluIHRoYXQgY2FzZS4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmTWVyZ2VJbmhlcml0ZWRFdmVudHMgPSBmYWxzZSwgZk1lcmdlSW5oZXJpdGVkTWV0aG9kcyA9IGZhbHNlLCBmTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQmVhbkluZm8gZlRhcmdldEJlYW5JbmZvOyAvLyBUaGUgYmVhbmluZm8gYmVpbmcgbW9kZWxlZC4KLQotCS8vIExvY2FsIGRlc2NyaXB0b3JzCi0JcHJvdGVjdGVkIEV2ZW50U2V0RGVzY3JpcHRvcltdIGZFdmVudFNldHM7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRGVzY3JpcHRvcltdIGZNZXRob2RzOwotCi0JcHJvdGVjdGVkIFByb3BlcnR5RGVzY3JpcHRvcltdIGZQcm9wZXJ0aWVzOwotCi0JLy8gTm90IGluaGVyaXRlZCBkZXNjcmlwdG9yIG5hbWVzLCB3aWxsIGJlIG51bGwgaWYgbm8gbWVyZ2Ugb3IgaWYgbWVyZ2UgYWxsLiBUaGlzIGlzIGxpc3Qgb2YgbmFtZXMgdG8gTk9UIG1lcmdlLiBJdCBpcyB1c3VhbGx5IHNob3J0ZXIgdGhhbiB0aGUgbGlzdCB0byBtZXJnZSBmcm9tIHN1cGVyLgotCi0JLy8gTWV0aG9kcyBhcmUgc3BlY2lhbC4gWW91IGNhbiBoYXZlIGR1cGxpY2F0ZXMsIHNvIG5hbWUgaXMgbm90IHN1ZmZpY2llbnQuCi0JLy8gU28gZm9yIG1ldGhvZHMsCi0JLy8gd2lsbCB1c2UgYW4gYXJyYXkgb2YgU3RyaW5ncyB3aGVyZToKLQkvLyAgIEZvciBlYWNoIG9uZSB0aGUgZnVsbCBzaWduYXR1cmUKLQkvLyAgIHdpbGwgYmUgaW4gdGhlIGxpc3QsIGUuZy4gIm5hbWU6bWV0aG9kTmFtZShhcmd0eXBlLC4uLiIgd2hlcmUgYXJndHlwZSBpcyB0aGUgZnVsbHlxdWFsaWZpZWQKLQkvLyAgIGNsYXNzbmFtZSAodXNpbmcgIi4iIG5vdGF0aW9uIGZvciBpbm5lciBjbGFzc2VzKSwgYW5kIHVzaW5nIGZvcm1hdCAiamF2YS5sYW5nLlN0cmluZ1tdIiBmb3IKLQkvLyAgIGFycmF5cy4KLQkvLwotCS8vIFRoaXMgaXMgYmVjYXVzZSBldmVuIGlmIHRoZXJlIGFyZSBubyBkdXBsaWNhdGVzLCBpdCB3aWxsIHRha2UgbGVzcyB0aW1lL3NwYWNlIHRvIHNpbXBseSBjcmVhdGUgdGhlIGVudHJpZXMKLQkvLyB0aGVuIGl0IHdvdWxkIHRvIGNyZWF0ZSBhIHNldCB0byBzZWUgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgYW5kIHRoZW4gY3JlYXRlIHRoZSBmaW5hbCBhcnJheS4KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZk5vdEluaGVyaXRlZEV2ZW50U2V0czsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBmTm90SW5oZXJpdGVkTWV0aG9kczsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBmTm90SW5oZXJpdGVkUHJvcGVydGllczsKLQkKLQlwcm90ZWN0ZWQgaW50IGRvRmxhZ3M7Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCB0byBkbyBpbnRyb3NwZWN0aW9uIGFuZCBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIE1vZGVsaW5nQmVhbkluZm8KLQkgKiAKLQkgKiBUaGlzIHdpbGwgYWx3YXlzIGludHJvc3BlY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbGluZ0JlYW5JbmZvIGludHJvc3BlY3QoQ2xhc3MgaW50cm9zcGVjdENsYXNzLCBpbnQgZG9GbGFncykgdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24gewotCQlyZXR1cm4gaW50cm9zcGVjdChpbnRyb3NwZWN0Q2xhc3MsIHRydWUsIGRvRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIHRvIGRvIGludHJvc3BlY3Rpb24gYW5kIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgTW9kZWxpbmdCZWFuSW5mbwotCSAqIAotCSAqIGludHJvc3BlY3RJZk5vQmVhbkluZm86IElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiBpZiBubyBleHBsaWNpdCBiZWFuaW5mbyB3YXMgZm91bmQgZm9yIHRoaXMgY2xhc3MsIHRoZW4gaW50cm9zcGVjdGlvbiB3aWxsIGJlIGRvbmUgYW55d2F5LiBUaGUKLQkgKiBJbnRyb3NwZWN0b3Igd2lsbCB1c2UgcmVmbGVjdGlvbiBmb3IgbG9jYWwgbWV0aG9kcy9ldmVudHMvcHJvcGVydGllcyBvZiB0aGlzIGNsYXNzIGFuZCB0aGVuIGFkZCBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgc3VwZXJjbGFzcyBpbnRyb3NwZWN0aW9uLgotCSAqIElmIHRoaXMgcGFyYW1ldGVyIGlzIGZhbHNlLCB0aGVuIGlmIHRoZSBleHBsaWNpdCBiZWFuaW5mbyBpcyBub3QgZm91bmQsIHRoZW4gbm8gaW50cm9zcGVjdGlvbiB3aWxsIGJlIGRvbmUgYW5kIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsaW5nQmVhbkluZm8gaW50cm9zcGVjdChDbGFzcyBpbnRyb3NwZWN0Q2xhc3MsIGJvb2xlYW4gaW50cm9zcGVjdElmTm9CZWFuSW5mbywgaW50IGRvRmxhZ3MpIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFCZWFucy5pc0Rlc2lnblRpbWUoKSkKLQkJCUJlYW5zLnNldERlc2lnblRpbWUodHJ1ZSk7CS8vIFNpbmNlIHRoaXMgYSBqZW0gYmVhbmluZm8gc3BlY2lmaWMgdm0sIHdlIHNob3VsZCBhbHNvIGJlIGNvbnNpZGVyZWQgZGVzaWduIHRpbWUuCi0JCWlmICghaW50cm9zcGVjdElmTm9CZWFuSW5mbykgewotCQkJLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgYmVhbmluZm8gaXMgZXhwbGljaXRseSBzdXBwbGllZC4KLQkJCS8vIElmIG5vdCwgdGhlbiB3ZSByZXR1cm4gbnVsbC4KLQkJCS8vIFRoZSBjaGVja3Mgd2lsbCBiZSB0aGUgc2FtZSB0aGF0IEludHJvc3BlY3RvciB3aWxsIHVzZS4KLQotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJLy8gMS4gSXMgdGhlcmUgYSBCZWFuSW5mbyBjbGFzcyBpbiB0aGUgc2FtZSBwYWNrYWdlCi0JCQlpZiAoIWNsYXNzRXhpc3RzKGludHJvc3BlY3RDbGFzcy5nZXROYW1lKCkgKyAiQmVhbkluZm8iLCBpbnRyb3NwZWN0Q2xhc3MpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAyLiBJcyB0aGlzIGNsYXNzIGEgQmVhbkluZm8gY2xhc3MgZm9yIGl0c2VsZi4KLQkJCQlpZiAoIShCZWFuSW5mby5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShpbnRyb3NwZWN0Q2xhc3MpKSB7Ci0JCQkJCS8vIDMuIENhbiB0aGlzIGNsYXNzIGJlIGZvdW5kIGluIHRoZSBCZWFuaW5mbyBzZWFyY2hwYXRoLgotCQkJCQlTdHJpbmdbXSBzZWFyY2hQYXRoID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvU2VhcmNoUGF0aCgpOwotCQkJCQlpbnQgc3RhcnRDbGFzc25hbWUgPSBpbnRyb3NwZWN0Q2xhc3MuZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCIuIikgKyAxOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBiaU5hbWUgPSAiLiIgKyBpbnRyb3NwZWN0Q2xhc3MuZ2V0TmFtZSgpLnN1YnN0cmluZyhzdGFydENsYXNzbmFtZSkgKyAiQmVhbkluZm8iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hQYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoY2xhc3NFeGlzdHMoc2VhcmNoUGF0aFtpXSArIGJpTmFtZSwgaW50cm9zcGVjdENsYXNzKSkgewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9IGVsc2UKLQkJCQlmb3VuZCA9IHRydWU7Ci0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlCZWFuSW5mbyBiSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhpbnRyb3NwZWN0Q2xhc3MpOwotCQlDbGFzcyBzdXBlckNsYXNzID0gaW50cm9zcGVjdENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQotCQlpZiAoc3VwZXJDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIFBSRTE1ID8gKE1vZGVsaW5nQmVhbkluZm8pIG5ldyBNb2RlbGluZ0JlYW5JbmZvUHJlMTUoYkluZm8sIGRvRmxhZ3MpIDogbmV3IE1vZGVsaW5nQmVhbkluZm8xNShiSW5mbywgZG9GbGFncyk7Ci0JCWVsc2UKLQkJCXJldHVybiBQUkUxNSA/IChNb2RlbGluZ0JlYW5JbmZvKSBuZXcgTW9kZWxpbmdCZWFuSW5mb1ByZTE1KGJJbmZvLCBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oc3VwZXJDbGFzcyksIGRvRmxhZ3MpIDogbmV3IE1vZGVsaW5nQmVhbkluZm8xNShiSW5mbywKLQkJCQkJSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKHN1cGVyQ2xhc3MpLCBkb0ZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgaWYgdGhpcyBjbGFzcyBleGlzdHMsIGZpcnN0IGluIHRoZSBjbGFzcyBsb2FkZXIgb2YgdGhlIHNlbnQgY2xhc3MsIHRoZW4gaW4gdGhlIHN5c3RlbSBsb2FkZXIsIHRoZW4gdGhlIGJvb3RzdHJhcCBsb2FkZXIsIGFuZCBmaW5hbGx5IHRoZQotCSAqIGN1cnJlbnQgdGhyZWFkIGNvbnRleHQgY2xhc3MgbG9hZGVyLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjbGFzc0V4aXN0cyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzcyBmcm9tQ2xhc3MpIHsKLQkJaWYgKGZyb21DbGFzcy5nZXRDbGFzc0xvYWRlcigpICE9IG51bGwpCi0JCQl0cnkgewotCQkJCWZyb21DbGFzcy5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCWlmIChDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpICE9IG51bGwpCi0JCQl0cnkgewotCQkJCUNsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJdHJ5IHsKLQkJCUNsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBVc2UgdGhlIGNsYXNzbG9hZGVyIGZyb20gdGhlIGN1cnJlbnQgVGhyZWFkLgotCQkJQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQkJY2wubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIG9ubHkgZm9yIE9iamVjdCBzaW5jZSB0aGF0IGlzIHRoZSBvbmx5IGJlYW4gdGhhdCBkb2Vzbid0IGhhdmUgYSBzdXBlcmNsYXNzLiBTdXBlcmNsYXNzIGJlYW5pbmZvIHJlcXVpcmVkIGZvciBhbGwgb3RoZXIgY2xhc3Nlcy4gSWYgdGhpcyBpcwotCSAqIGNvbnN0cnVjdGVkIHRoZW4gdGhpcyBtZWFucyBubyBtZXJnZSBhbmQgdGhlIGxpc3QgaXMgZGVmaW5pdGl2ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kZWxpbmdCZWFuSW5mbyhCZWFuSW5mbyBiZWFuSW5mbywgaW50IGRvRmxhZ3MpIHsKLQkJZlRhcmdldEJlYW5JbmZvID0gYmVhbkluZm87Ci0JCXRoaXMuZG9GbGFncyA9IGRvRmxhZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIE1vZGVsaW5nQmVhbkluZm8oQmVhbkluZm8gYmVhbkluZm8sIEJlYW5JbmZvIHN1cGVyQmVhbkluZm8sIGludCBkb0ZsYWdzKSB7Ci0JCXRoaXMoYmVhbkluZm8sIGRvRmxhZ3MpOwotCi0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBiZWFuaW5mbyB0byBkZXRlcm1pbmUgdGhlIG1lcmdlIHN0YXRlLgotCQkvLyBUaGUgZGVmYXVsdCBpcyBubyBtZXJnZS4KLQotCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX0VWRU5UUykgIT0gMCkgewotCQkJTGlzdCBmdWxsID0gYWRkQWxsKGJlYW5JbmZvLmdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKSk7Ci0JCQlMaXN0IGluaGVyaXRlZCA9IGFkZEFsbChzdXBlckJlYW5JbmZvLmdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKSk7Ci0KLQkJCWZNZXJnZUluaGVyaXRlZEV2ZW50cyA9IHN0cmlwTGlzdChmdWxsLCBpbmhlcml0ZWQpOwotCQkJaWYgKGZNZXJnZUluaGVyaXRlZEV2ZW50cykgewotCQkJCWlmICghZnVsbC5pc0VtcHR5KCkpCi0JCQkJCWZFdmVudFNldHMgPSAoRXZlbnRTZXREZXNjcmlwdG9yW10pIGZ1bGwudG9BcnJheShuZXcgRXZlbnRTZXREZXNjcmlwdG9yW2Z1bGwuc2l6ZSgpXSk7Ci0JCQkJaWYgKCFpbmhlcml0ZWQuaXNFbXB0eSgpKQotCQkJCQljcmVhdGVFdmVudEFycmF5KGluaGVyaXRlZCk7IC8vIFRoaXMgaXMgYWN0dWFsbHkgYSBsaXN0IG9mIHRob3NlIE5PVCBpbmhlcml0ZWQuCi0JCQl9Ci0JCX0KLQotCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX01FVEhPRFMpICE9IDApIHsKLQkJCUxpc3QgZnVsbCA9IGFkZEFsbChiZWFuSW5mby5nZXRNZXRob2REZXNjcmlwdG9ycygpKTsKLQkJCUxpc3QgaW5oZXJpdGVkID0gYWRkQWxsKHN1cGVyQmVhbkluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKSk7Ci0KLQkJCWZNZXJnZUluaGVyaXRlZE1ldGhvZHMgPSBzdHJpcExpc3QoZnVsbCwgaW5oZXJpdGVkKTsKLQkJCWlmIChmTWVyZ2VJbmhlcml0ZWRNZXRob2RzKSB7Ci0JCQkJaWYgKCFmdWxsLmlzRW1wdHkoKSkKLQkJCQkJZk1ldGhvZHMgPSAoTWV0aG9kRGVzY3JpcHRvcltdKSBmdWxsLnRvQXJyYXkobmV3IE1ldGhvZERlc2NyaXB0b3JbZnVsbC5zaXplKCldKTsKLQkJCQlpZiAoIWluaGVyaXRlZC5pc0VtcHR5KCkpCi0JCQkJCWNyZWF0ZU1ldGhvZEVudHJpZXMoaW5oZXJpdGVkKTsgLy8gVGhpcyBpcyBhY3R1YWxseSBhIGxpc3Qgb2YgdGhvc2UgTk9UIGluaGVyaXRlZC4KLQkJCX0KLQkJfQotCi0JCWlmICgoZG9GbGFncyAmIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9fUFJPUEVSVElFUykgIT0gMCkgewotCQkJTGlzdCBmdWxsID0gYWRkQWxsKGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSk7Ci0JCQlMaXN0IGluaGVyaXRlZCA9IGFkZEFsbChzdXBlckJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSk7Ci0KLQkJCWZNZXJnZUluaGVyaXRlZFByb3BlcnRpZXMgPSBzdHJpcExpc3QoZnVsbCwgaW5oZXJpdGVkKTsKLQkJCWlmIChmTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzKSB7Ci0JCQkJaWYgKCFmdWxsLmlzRW1wdHkoKSkKLQkJCQkJZlByb3BlcnRpZXMgPSAoUHJvcGVydHlEZXNjcmlwdG9yW10pIGZ1bGwudG9BcnJheShuZXcgUHJvcGVydHlEZXNjcmlwdG9yW2Z1bGwuc2l6ZSgpXSk7Ci0JCQkJaWYgKCFpbmhlcml0ZWQuaXNFbXB0eSgpKQotCQkJCQljcmVhdGVQcm9wZXJ0eUFycmF5KGluaGVyaXRlZCk7IC8vIFRoaXMgaXMgYWN0dWFsbHkgYSBsaXN0IG9mIHRob3NlIE5PVCBpbmhlcml0ZWQuCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFdmVudEFycmF5KExpc3QgZmVhdHVyZXMpIHsKLQkJZk5vdEluaGVyaXRlZEV2ZW50U2V0cyA9IGNyZWF0ZURlc2NyaXB0b3JOYW1lcyhmZWF0dXJlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWV0aG9kRW50cmllcyhMaXN0IGZlYXR1cmVzKSB7Ci0JCWludCBzID0gZmVhdHVyZXMuc2l6ZSgpOwotCQlmTm90SW5oZXJpdGVkTWV0aG9kcyA9IG5ldyBTdHJpbmdbc107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlmTm90SW5oZXJpdGVkTWV0aG9kc1tpXSA9IGxvbmdOYW1lKChNZXRob2REZXNjcmlwdG9yKSBmZWF0dXJlcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBsb25nTmFtZShNZXRob2REZXNjcmlwdG9yIG1kKSB7Ci0JCVN0cmluZyBuID0gbWQuZ2V0TmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG4ubGVuZ3RoKCkgKyAyMCk7Ci0JCXNiLmFwcGVuZChuKTsKLQkJc2IuYXBwZW5kKCc6Jyk7Ci0JCU1ldGhvZCBtID0gbWQuZ2V0TWV0aG9kKCk7Ci0JCXNiLmFwcGVuZChtLmdldE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlDbGFzc1tdIHBhcm1zID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcm1zLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAoaiA+IDApCi0JCQkJc2IuYXBwZW5kKCcsJyk7Ci0JCQlpZiAoIXBhcm1zW2pdLmlzQXJyYXkoKSkKLQkJCQlzYi5hcHBlbmQocGFybXNbal0uZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJCWVsc2UgewotCQkJCUNsYXNzIGZpbmFsVHlwZSA9IHBhcm1zW2pdLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQlpbnQgaW5zcnQgPSBzYi5sZW5ndGgoKTsKLQkJCQl3aGlsZSAoZmluYWxUeXBlLmlzQXJyYXkoKSkgewotCQkJCQlzYi5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZmluYWxUeXBlID0gZmluYWxUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQl9Ci0JCQkJc2IuaW5zZXJ0KGluc3J0LCBmaW5hbFR5cGUuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9wZXJ0eUFycmF5KExpc3QgZmVhdHVyZXMpIHsKLQkJZk5vdEluaGVyaXRlZFByb3BlcnRpZXMgPSBjcmVhdGVEZXNjcmlwdG9yTmFtZXMoZmVhdHVyZXMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBjcmVhdGVEZXNjcmlwdG9yTmFtZXMoTGlzdCBmZWF0dXJlcykgewotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2ZlYXR1cmVzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSAoKEZlYXR1cmVEZXNjcmlwdG9yKSBmZWF0dXJlcy5nZXQoaSkpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGFkZEFsbChPYmplY3RbXSBzZXQpIHsKLQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQlBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3Qoc2V0Lmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykgewotCQkJCWwuYWRkKHNldFtpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlbiBhbGwgb2YgdGhlIHN1cGVyIGNsYXNzJ3MgZXZlbnRzIHNob3VsZCBiZSBtZXJnZWQgaW4uIElmIGl0IHJldHVybnMgZmFsc2UsIHRoZW4gdGhlIGV2ZW50cyByZXR1cm5lZCBhcmUgaXQsIHRoZXJlIGFyZQotCSAqIG5vIG90aGVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01lcmdlSW5oZXJpdGVkRXZlbnRzKCkgewotCQlyZXR1cm4gZk1lcmdlSW5oZXJpdGVkRXZlbnRzOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGVuIGFsbCBvZiB0aGUgc3VwZXIgY2xhc3MncyBtZXRob2RzIHNob3VsZCBiZSBtZXJnZWQgaW4uIElmIGl0IHJldHVybnMgZmFsc2UsIHRoZW4gdGhlIG1ldGhvZHMgcmV0dXJuZWQgYXJlIGl0LCB0aGVyZQotCSAqIGFyZSBubyBvdGhlcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZUluaGVyaXRlZE1ldGhvZHMoKSB7Ci0JCXJldHVybiBmTWVyZ2VJbmhlcml0ZWRNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGVuIGFsbCBvZiB0aGUgc3VwZXIgY2xhc3MncyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBtZXJnZWQgaW4uIElmIGl0IHJldHVybnMgZmFsc2UsIHRoZW4gdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgYXJlIGl0LAotCSAqIHRoZXJlIGFyZSBubyBvdGhlcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZUluaGVyaXRlZFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyBCZWFuSW5mb1tdIGdldEFkZGl0aW9uYWxCZWFuSW5mbygpIHsKLQkJcmV0dXJuIGZUYXJnZXRCZWFuSW5mby5nZXRBZGRpdGlvbmFsQmVhbkluZm8oKTsKLQl9Ci0KLQlwdWJsaWMgQmVhbkRlc2NyaXB0b3IgZ2V0QmVhbkRlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBmVGFyZ2V0QmVhbkluZm8uZ2V0QmVhbkRlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgRXZlbnRTZXREZXNjcmlwdG9yW10gZ2V0RXZlbnRTZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGZNZXJnZUluaGVyaXRlZEV2ZW50cyA/IGZFdmVudFNldHMgOiBmVGFyZ2V0QmVhbkluZm8uZ2V0RXZlbnRTZXREZXNjcmlwdG9ycygpOwotCX0KLQotCXB1YmxpYyBqYXZhLmF3dC5JbWFnZSBnZXRJY29uKGludCBpY29uS2luZCkgewotCQlyZXR1cm4gZlRhcmdldEJlYW5JbmZvLmdldEljb24oaWNvbktpbmQpOwotCX0KLQotCXB1YmxpYyBNZXRob2REZXNjcmlwdG9yW10gZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBmTWVyZ2VJbmhlcml0ZWRNZXRob2RzID8gZk1ldGhvZHMgOiBmVGFyZ2V0QmVhbkluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGZNZXJnZUluaGVyaXRlZFByb3BlcnRpZXMgPyBmUHJvcGVydGllcyA6IGZUYXJnZXRCZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldE5vdEluaGVyaXRlZEV2ZW50U2V0RGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBmTm90SW5oZXJpdGVkRXZlbnRTZXRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXROb3RJbmhlcml0ZWRNZXRob2REZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGZOb3RJbmhlcml0ZWRNZXRob2RzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gZk5vdEluaGVyaXRlZFByb3BlcnRpZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlS2V5KEZlYXR1cmVEZXNjcmlwdG9yIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgaW5zdGFuY2VvZiBNZXRob2REZXNjcmlwdG9yID8gbG9uZ05hbWUoKE1ldGhvZERlc2NyaXB0b3IpIGZlYXR1cmUpIDogZmVhdHVyZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBTdHJpcCB0aGUgbGlzdCBkb3duIHVzaW5nIHRoZSBFcXVhbGl0eSBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN0cmlwTGlzdChMaXN0IGZ1bGxMaXN0LCBMaXN0IGluaGVyaXRlZExpc3QpIHsKLQkJLy8gVGhlIHByb2Nlc3MgaXMgdG8gY3JlYXRlIGEgYm9vbGVhbiBsaXN0IG1pcnJvcmluZyB0aGUgaW5oZXJpdGVkTGlzdC4KLQkJLy8gVGhpcyBib29sZWFuIGxpc3QgaW5kaWNhdGVzIGlmIHRoZSBjb3JyZXNwb25kaW5nIChieSBpbmRleCkKLQkJLy8gZW50cnkgZnJvbSB0aGUgaW5oZXJpdGVkTGlzdCBpcyB0byBiZSByZXRhaW5lZCBpbiB0aGUgZmluYWwgY29tcHV0ZWQKLQkJLy8gbGlzdC4KLQkJLy8KLQkJLy8gQSBIYXNobWFwIGlzIGNyZWF0ZWQgd2hlcmUgdGhlIGtleSBpcyB0aGUgY29tcHV0ZWRLZXkgZnJvbSB0aGUgaW5oZXJpdGVkTGlzdAotCQkvLyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBpbmhlcml0ZWRMaXN0LiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIHRoZQotCQkvLyBlbnRyeSBpcyBtYXRjaGluZy4KLQkJLy8KLQkJLy8gVGhlbiB0aGUgZnVsbExpc3Qgd2lsbCBiZSBzdGVwcGVkIHRocm91Z2ggYW5kIHNlZSBpZiB0aGVyZSBpcwotCQkvLyBhbiBlbnRyeSBpbiB0aGUgSGFzaG1hcCBmb3IgaXQuIElmIHRoZXJlIGlzIGFuIGVudHJ5LCB0aGVuCi0JCS8vIHRoZSBlbnRyeSBpcyBjaGVja2VkIHRvIHNlZSBpZiBpdCBpcyBzZW1hbnRpY2FsbHkgZXF1YWwuCi0JCS8vIElmIGl0IGlzLCB0aGVuIHRoZSBib29sZWFuIGxpc3QgZW50cnkgaXMgbWFya2VkIHNvIHRoYXQKLQkJLy8gdGhlIGluaGVyaXRlZExpc3QgZW50cnkgd2lsbCBiZSByZXRhaW5lZCwgdGhlIGZ1bGxMaXN0IGVudHJ5IHJlbW92ZWQgYW5kIHRoZSBjb3VudGVyCi0JCS8vIG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaW5oZXJpdGVkTGlzdCBjb3B5IGlzIGluY3JlbWVudGVkLgotCQkvLyBJZiB0aGV5IGFyZW4ndCBzZW1hbnRpY2FsbHkgZXF1YWwsIHRoZW4gd2Uga25vdyB0aGF0IHRoaXMgaXMKLQkJLy8gYW4gb3ZlcnJpZGUuIEluIHRoYXQgY2FzZSwgdGhlIGZ1bGxMaXN0IGVudHJ5IGlzIGtlcHQsIHRoZSBpbmhlcml0ZWRMaXN0Ci0JCS8vIGVudHJ5IGlzIG5vdCByZXRhaW5lZCwgYnV0IHdlIGRvbid0IHByZXZlbnQgbWVyZ2UgbGF0ZXIuCi0JCS8vCi0JCS8vIElmIHRoZSBmdWxsTGlzdCBlbnRyeSBpcyBub3QgZm91bmQgaW4gdGhlIEhhc2hNYXAsIHRoZW4gd2Uga25vdyBpdCBpcyBub3QKLQkJLy8gZnJvbSB0aGUgaW5oZXJpdGVkTGlzdCwgc28gaXQgd2lsbCBiZSByZXRhaW5lZCBpbiB0aGUgZnVsbExpc3QuCi0JCS8vCi0JCS8vIElmIHdlIGdldCBhbGwgb2YgdGhlIHdheSB0aHJvdWdoLCB0aGVuIHdlIGtub3cgdGhhdCB3aGF0IGlzIGxlZnQKLQkJLy8gaW4gZnVsbExpc3QgaXMganVzdCB0aGlzIGxldmVsLgotCQkvLwotCQkvLyBXaGVuIHdlIHJldHVybiB3ZSBrbm93IHRoYXQKLQkJLy8gICBhKSBmdWxsTGlzdCBoYXMgb25seSB0aGUgZmVhdHVyZXMgdGhhdCBhcmUgZm91bmQgYXQgdGhlIGxvY2FsIGxldmVsCi0JCS8vICAgYikgaW5oZXJpdGVkTGlzdCBpZiBub3QgZW1wdHkgY29udGFpbnMgdGhlIG9uZXMgZnJvbSBzdXBlciB0aGF0IFNIT1VMRCBOT1QgYmUgaW5oZXJpdGVkLgotCQkvLyAgICAgIElmIGl0IGlzIGVtcHR5LCB0aGVuIGlmIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgdGhlbiBBTEwgc2hvdWxkIGJlIGluaGVyaXRlZCwKLQkJLy8gICAgICBvciBpZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2Ugd2UgYXJlbid0IG1lcmdpbmcgYW55LgotCQkvLwotCQkvLyBBbGwgb2YgdGhpcyBpcyBiYXNlZCB1cG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGxpc3QgY2FuCi0JCS8vIGdldCBxdWl0ZSBsYXJnZSAod2hpY2ggaXQgZG9lcyBmb3IgamF2YXguc3dpbmcpIGFuZCB0aGF0Ci0JCS8vIGEgc2ltcGxlIG4tc3F1YXJlZCBvcmRlciBzZWFyY2ggd291bGQgYmUgdG9vIHNsb3cuCi0KLQkJaWYgKGZ1bGxMaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOyAvLyBUaGVyZSBhcmUgbm9uZSBpbiB0aGUgZnVsbCBsaXN0LCBzbyB0aGVyZSBzaG91bGQgYmUgbm9uZSwgYW5kIGRvbid0IG1lcmdlLgotCQl9IGVsc2UgaWYgKGluaGVyaXRlZExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBUaGVyZSBhcmUgbm8gaW5oZXJpdGVkTGlzdCBmZWF0dXJlcywgc28gdHJlYXQgYXMgbm8gbWVyZ2UuCi0KLQkJLy8gV2UgaGF2ZSBzb21lIGZlYXR1cmVzIGFuZCBzb21lIGluaGVyaXRlZExpc3QgZmVhdHVyZXMsIHNvIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgbGlzdHMuCi0KLQkJLy8gQ3JlYXRlIGEgd29ya2luZyBjb3B5IG9mIHRoZSBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IGZvciBmdWxsTGlzdCBhbmQgc3RyaXBMaXN0IGFuZCBqdXN0IHJldXNlIHRoZW0KLQkJRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB3b3JraW5nU3RyaXAgPSBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5LmNyZWF0ZUVxdWFsaXR5KChGZWF0dXJlRGVzY3JpcHRvcikgaW5oZXJpdGVkTGlzdC5nZXQoMCkpOwotCQlGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHdvcmtpbmdGdWxsID0gRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5jcmVhdGVFcXVhbGl0eSgoRmVhdHVyZURlc2NyaXB0b3IpIGZ1bGxMaXN0LmdldCgwKSk7Ci0KLQkJaW50IGluaGVyaXRlZFNpemUgPSBpbmhlcml0ZWRMaXN0LnNpemUoKTsKLQkJYm9vbGVhbltdIGNvcHkgPSBuZXcgYm9vbGVhbltpbmhlcml0ZWRTaXplXTsKLQotCQlIYXNoTWFwIGluaGVyaXRlZE1hcCA9IG5ldyBIYXNoTWFwKGluaGVyaXRlZFNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluaGVyaXRlZFNpemU7IGkrKykgewotCQkJRmVhdHVyZURlc2NyaXB0b3IgZiA9IChGZWF0dXJlRGVzY3JpcHRvcikgaW5oZXJpdGVkTGlzdC5nZXQoaSk7Ci0JCQlTdHJpbmcga2V5ID0gY29tcHV0ZUtleShmKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGluaGVyaXRlZE1hcC5nZXQoa2V5KTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCWluaGVyaXRlZE1hcC5wdXQoa2V5LCBuZXcgSW50ZWdlcihpKSk7Ci0JCQllbHNlIHsKLQkJCQkvLyBTaG91bGRuJ3Qgb2NjdXIuCi0JCQl9Ci0KLQkJfQotCi0JCS8vIFdoZW4gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHByb2Nlc3NpbmcsIGluaGVyaXRlZExpc3Qgd2lsbCBjb250YWluIHRoZSBzdXBlciB0aGF0IHNob3VsZCBub3QgYmUgdXNlZCwgYW5kIGZ1bGwgbGlzdCB3aWxsIGNvbnRhaW4gb25seSB0aGUgbG9jYWxzCi0JCS8vICh0aG9zZSBkZWZpbmVkIGF0IHRoaXMgY2xhc3MgbGV2ZWwpLjsKLQkJaW50IGluaGVyaXRlZFJldGFpbmVkID0gMDsKLQkJSXRlcmF0b3IgZnVsbEl0ciA9IGZ1bGxMaXN0Lml0ZXJhdG9yKCk7Ci0JCS8vIENvbnRpbnVlIHdoaWxlIHdlJ3ZlIHJldGFpbmVkIGxlc3MgdGhhbiB0aGUgZnVsbCBzdXBlciBhbW91bnQuIElmIHdlJ3ZlIHJldGFpbmVkIGFsbCBvZiB0aGUgaW5oZXJpdGVkTGlzdCwgdGhlcmUgaXMgbm8KLQkJLy8gbmVlZCB0byBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBmdWxsTGlzdCBiZWNhdXNlIHRoZXJlIGNhbid0IHBvc3NpYmx5IGJlIGFueSBpbmhlcml0ZWRMaXN0IGVudHJpZXMgbGVmdCB0byBmaW5kLgotCQl3aGlsZSAoaW5oZXJpdGVkUmV0YWluZWQgPCBpbmhlcml0ZWRTaXplICYmIGZ1bGxJdHIuaGFzTmV4dCgpKSB7Ci0JCQlGZWF0dXJlRGVzY3JpcHRvciBmID0gKEZlYXR1cmVEZXNjcmlwdG9yKSBmdWxsSXRyLm5leHQoKTsKLQkJCWJvb2xlYW4gZm91bmRGdWxsID0gZmFsc2U7Ci0JCQlPYmplY3QgaW5kZXggPSBpbmhlcml0ZWRNYXAuZ2V0KGNvbXB1dGVLZXkoZikpOwotCQkJaWYgKGluZGV4ICE9IG51bGwpIHsKLQkJCQl3b3JraW5nRnVsbC5zZXRGZWF0dXJlKGYpOwotCQkJCWludCBuZHggPSAoKEludGVnZXIpIGluZGV4KS5pbnRWYWx1ZSgpOwotCQkJCXdvcmtpbmdTdHJpcC5zZXRGZWF0dXJlKChGZWF0dXJlRGVzY3JpcHRvcikgaW5oZXJpdGVkTGlzdC5nZXQobmR4KSk7Ci0JCQkJaWYgKHdvcmtpbmdGdWxsLmVxdWFscyh3b3JraW5nU3RyaXApKSB7Ci0JCQkJCS8vIFRoZXkgYXJlIHNlbWFudGljYWxseSBpZGVudGljYWwsIHNvIHJldGFpbiBpbiB0aGUgaW5oZXJpdGVkTGlzdC4KLQkJCQkJY29weVtuZHhdID0gdHJ1ZTsKLQkJCQkJZm91bmRGdWxsID0gdHJ1ZTsKLQkJCQkJaW5oZXJpdGVkUmV0YWluZWQrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmb3VuZEZ1bGwpIHsKLQkJCQkvLyBXZSBmb3VuZCB0aGUgaW5oZXJpdGVkTGlzdCBlbnRyeSBzZW1hbnRpY2FsbHkgZXF1YWwgaW4gdGhlIGZ1bGwgbGlzdCBzb21ld2hlcmUsIHNvIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBmdWxsIGVudHJ5LgotCQkJCWZ1bGxJdHIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5oZXJpdGVkUmV0YWluZWQgPT0gaW5oZXJpdGVkU2l6ZSkgewotCQkJaW5oZXJpdGVkTGlzdC5jbGVhcigpOyAvLyBBbGwgd2VyZSBmb3VuZCBpbiBpbmhlcml0ZWRMaXN0LCBzbyBqdXN0IGNsZWFyIHRoZSBpbmhlcml0ZWRMaXN0IGFuZCByZXR1cm4ganVzdCB3aGF0IHdhcyBsZWZ0IGluIHRoZSBmb3VuZC4KLQkJCQkJCQkJICAgLy8gVGhvc2UgaW4gZnVsbCBmb3VuZCBpbiBzdXBlciBoYWQgYmVlbiByZW1vdmVkIGZyb20gZnVsbCBkdXJpbmcgdGhlIHByb2Nlc3NpbmcuCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gV2UgbWVyZ2Ugd2l0aCBhbGwgaW5oZXJpdGVkLiAKLQkJfSBlbHNlCWlmIChpbmhlcml0ZWRSZXRhaW5lZCAhPSAwKSB7Ci0JCQkvLyBTb21lIHdlcmUgcmV0YWluZWQsIHRha2Ugb3V0IG9mIHRoZSBsaXN0IHRob3NlIHRoYXQgd2VyZSByZXRhaW5lZC4KLQkJCS8vIFdoZW4gZG9uZSB0aGUgbGlzdCB3aWxsIGNvbnRhaW4gdGhvc2UgdGhhdCBzaG91bGQgYmUgZHJvcHBlZCBmcm9tIHRoZSBpbmhlcml0ZWQgbGlzdC4KLQkJCS8vIFdlIHN0YXJ0IGZyb20gZW5kIGJlY2F1c2UgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgbW92ZWQgb3ZlcmFsbCB3aWxsIGJlIGxlc3MgdGhhbiBpZiB3ZSBzdGFydGVkIGZyb20gdGhlIGZyb250LgotCQkJZm9yIChMaXN0SXRlcmF0b3IgaXRyID0gaW5oZXJpdGVkTGlzdC5saXN0SXRlcmF0b3IoaW5oZXJpdGVkTGlzdC5zaXplKCkpOyBpdHIuaGFzUHJldmlvdXMoKTspIHsKLQkJCQlpbnQgaSA9IGl0ci5wcmV2aW91c0luZGV4KCk7Ci0JCQkJaXRyLnByZXZpb3VzKCk7CS8vIFRvIGJhY2sgdXAgdGhlIGl0ciBzbyB0aGF0IHJlbW92ZSBjYW4gcmVtb3ZlIGl0LiBXZSBhY3R1YWxseSBkb24ndCBjYXJlIHdoYXQgdGhlIHZhbHVlIGlzLgotCQkJCWlmIChjb3B5W2ldKQotCQkJCQlpdHIucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsJLy8gV2UgbWVyZ2UsIGFuZCB0aGUgbGlzdCBpcyBub3QgZW1wdHkgYnV0IGl0IGRpZCBoYXZlIHNvbWUgcmVtb3ZlZCwgc28gd2UgbGVhdmUgdGhlIGxpc3QgYWxvbmUuIFRob3NlIGFyZSBub3QgaW5oZXJpdGVkLgotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsJLy8gQWxsIHdlcmUgcmVtb3ZlZCAocmV0YWluZWQgPT0gMCkuIE5vbmUgd2VyZSByZXRhaW5lZC4gU28gd2UganVzdCBkb24ndCBkbyBhIG1lcmdlLiBUaGUgbGlzdCB3aWxsIGJlIGlnbm9yZWQuCi0JfQotCi0JLy8gVGhlIG1vZGVsaW5nIGJlYW5pbmZvIGlzIGFsc28gdXNlZCB0byBzZW5kIGl0c2VsZiBiYWNrIGluIHNlcmlhbGl6ZWQgbW9kZSBhcyBhIGNhbGxiYWNrLgotCi0JcHJpdmF0ZSBJVk1DYWxsYmFja1NlcnZlciB2bVNlcnZlcjsKLQotCXByaXZhdGUgaW50IGNhbGxiYWNrSUQ7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUNhbGxiYWNrI2luaXRpYWxpemVDYWxsYmFjayhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLklWTVNlcnZlciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDYWxsYmFjayhJVk1DYWxsYmFja1NlcnZlciB2bVNlcnZlciwgaW50IGNhbGxiYWNrSUQpIHsKLQkJdGhpcy52bVNlcnZlciA9IHZtU2VydmVyOwotCQl0aGlzLmNhbGxiYWNrSUQgPSBjYWxsYmFja0lEOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGRvRmxhZ3MgIT0gMCkgewotCQkJT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0odm1TZXJ2ZXIucmVxdWVzdFN0cmVhbShjYWxsYmFja0lELCAwKSk7Ci0JCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX0JFQU5fREVDT1IpICE9IDApCi0JCQkJc2VuZEJlYW5EZWNvcmF0b3Ioc3RyZWFtKTsKLQkJCWlmICgoZG9GbGFncyAmIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9fUFJPUEVSVElFUykgIT0gMCkKLQkJCQlzZW5kUHJvcGVydHlEZWNvcmF0b3JzKHN0cmVhbSk7Ci0JCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX01FVEhPRFMpICE9IDApCi0JCQkJc2VuZE1ldGhvZERlY29yYXRvcnMoc3RyZWFtKTsKLQkJCWlmICgoZG9GbGFncyAmIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9fRVZFTlRTKSAhPSAwKQotCQkJCXNlbmRFdmVudERlY29yYXRvcnMoc3RyZWFtKTsKLQkJCXN0cmVhbS53cml0ZUludChJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPTkUpOwotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgSURFIHRvIHNlbmQgdGhlIGJlYW4gZGVjb3JhdG9yIGluZm9ybWF0aW9uIGJhY2sgdGhyb3VnaCB0aGUgY2FsbGJhY2suCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRCZWFuRGVjb3JhdG9yKE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCUJlYW5SZWNvcmQgYnIgPSBuZXcgQmVhblJlY29yZCgpOwotCQlCZWFuRGVzY3JpcHRvciBiZCA9IGdldEJlYW5EZXNjcmlwdG9yKCk7Ci0KLQkJaWYgKGJkICE9IG51bGwpIHsKLQkJCWJyLmN1c3RvbWl6ZXJDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoYmQuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQkJYnIubWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzID0gaXNNZXJnZUluaGVyaXRlZFByb3BlcnRpZXMoKTsKLQkJCWJyLm1lcmdlSW5oZXJpdGVkT3BlcmF0aW9ucyA9IGlzTWVyZ2VJbmhlcml0ZWRNZXRob2RzKCk7Ci0JCQlici5tZXJnZUluaGVyaXRlZEV2ZW50cyA9IGlzTWVyZ2VJbmhlcml0ZWRFdmVudHMoKTsKLQkJCWJyLm5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMgPSBnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCQlici5ub3RJbmhlcml0ZWRPcGVyYXRpb25OYW1lcyA9IGdldE5vdEluaGVyaXRlZE1ldGhvZERlc2NyaXB0b3JzKCk7Ci0JCQlici5ub3RJbmhlcml0ZWRFdmVudE5hbWVzID0gZ2V0Tm90SW5oZXJpdGVkRXZlbnRTZXREZXNjcmlwdG9ycygpOwotCQkJZmlsbChiZCwgYnIsIEJFQU5fUkVDT1JEX1RZUEUpOwotCQl9Ci0JCXN0cmVhbS53cml0ZUludChJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkJFQU5fREVDT1JBVE9SX1NFTlQpOwotCQlzdHJlYW0ud3JpdGVPYmplY3QoYnIpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBJREUgdG8gc2VuZCB0aGUgcHJvcGVydHkgZGVjb3JhdG9ycyBpbmZvcm1hdGlvbiBiYWNrIHRocm91Z2ggdGhlIGNhbGxiYWNrLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kUHJvcGVydHlEZWNvcmF0b3JzKE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCVByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5sZW5ndGggPiAwKSB7Ci0JCQkvLyBOb3cgc3RhcnQgd3JpdGluZyB0aGUgcmVjb3Jkcy4KLQkJCXN0cmVhbS53cml0ZUludChJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLlBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCk7Ci0JCQlzdHJlYW0ud3JpdGVJbnQocHJvcGVydGllcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gcHJvcGVydGllc1tpXTsKLQkJCQkvLyBNdWNoIG9mIHRoZSB0d28gdHlwZXMgYXJlIGNvbW1vbiwgc28gaWYgaW5kZXhlZCwgZmlsbCBpbiB0aGUgaW5kZXggcGFydCBhbmQgdGhlbiBwYXNzIG9uIHRvIHByb3BlcnR5IHBhcnQuCi0JCQkJUHJvcGVydHlSZWNvcmQgdXNlcHIgPSBudWxsOwotCQkJCWludCB1c2VUeXBlID0gMDsKLQkJCQlpZiAocGQuZ2V0Q2xhc3MoKSA9PSBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yLmNsYXNzKSB7Ci0JCQkJCUluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IgaXBkID0gKEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIHBkOwotCQkJCQlJbmRleGVkUHJvcGVydHlSZWNvcmQgaXByID0gbmV3IEluZGV4ZWRQcm9wZXJ0eVJlY29yZCgpOwotCQkJCQl1c2VwciA9IGlwcjsKLQkJCQkJdXNlVHlwZSA9IElOREVYRURQUk9QRVJUWV9SRUNPUkRfVFlQRTsKLQkJCQkJaXByLmluZGV4ZWRSZWFkTWV0aG9kID0gZ2V0UmVmbGVjdGVkTWV0aG9kUmVjb3JkKGlwZC5nZXRJbmRleGVkUmVhZE1ldGhvZCgpKTsKLQkJCQkJaXByLmluZGV4ZWRXcml0ZU1ldGhvZCA9IGdldFJlZmxlY3RlZE1ldGhvZFJlY29yZChpcGQuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkpOwotCQkJCQlpcHIuaW5kZXhlZFByb3BlcnR5VHlwZU5hbWUgPSBnZXRDbGFzc05hbWUoaXBkLmdldEluZGV4ZWRQcm9wZXJ0eVR5cGUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXNlcHIgPSBuZXcgUHJvcGVydHlSZWNvcmQoKTsKLQkJCQkJdXNlVHlwZSA9IFBST1BFUlRZX1JFQ09SRF9UWVBFOwotCQkJCX0KLQkJCQl1c2Vwci5wcm9wZXJ0eUVkaXRvckNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwZC5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkpOwotCQkJCXVzZXByLnByb3BlcnR5VHlwZU5hbWUgPSBnZXRDbGFzc05hbWUocGQuZ2V0UHJvcGVydHlUeXBlKCkpOwotCQkJCXVzZXByLnJlYWRNZXRob2QgPSBnZXRSZWZsZWN0ZWRNZXRob2RSZWNvcmQocGQuZ2V0UmVhZE1ldGhvZCgpKTsKLQkJCQl1c2Vwci53cml0ZU1ldGhvZCA9IGdldFJlZmxlY3RlZE1ldGhvZFJlY29yZCgocGQuZ2V0V3JpdGVNZXRob2QoKSkpOwotCQkJCXVzZXByLmJvdW5kID0gcGQuaXNCb3VuZCgpOwotCQkJCXVzZXByLmNvbnN0cmFpbmVkID0gcGQuaXNDb25zdHJhaW5lZCgpOwotCQkJCXVzZXByLmRlc2lnblRpbWUgPSBudWxsOwotCQkJCXVzZXByLmZpZWxkID0gbnVsbDsKLQkJCQlmaWxsKHBkLCB1c2VwciwgdXNlVHlwZSk7Ci0JCQkJc3RyZWFtLndyaXRlT2JqZWN0KHVzZXByKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBJREUgdG8gc2VuZCB0aGUgbWV0aG9kIGRlY29yYXRvcnMgaW5mb3JtYXRpb24gYmFjayB0aHJvdWdoIHRoZSBjYWxsYmFjay4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2VuZE1ldGhvZERlY29yYXRvcnMoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJTWV0aG9kRGVzY3JpcHRvcltdIG1ldGhvZHMgPSBnZXRNZXRob2REZXNjcmlwdG9ycygpOwotCQlpZiAobWV0aG9kcyAhPSBudWxsICYmIG1ldGhvZHMubGVuZ3RoID4gMCkgewotCQkJLy8gTm93IHN0YXJ0IHdyaXRpbmcgdGhlIHJlY29yZHMuCi0JCQlzdHJlYW0ud3JpdGVJbnQoSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5NRVRIT0RfREVDT1JBVE9SU19TRU5UKTsKLQkJCXN0cmVhbS53cml0ZUludChtZXRob2RzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlNZXRob2RSZWNvcmQgbXIgPSBuZXcgTWV0aG9kUmVjb3JkKCk7Ci0JCQkJZmlsbChtciwgbWV0aG9kc1tpXSk7Ci0JCQkJc3RyZWFtLndyaXRlT2JqZWN0KG1yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGwgaW4gYSBNZXRob2RSZWNvcmQgZnJvbSB0aGUgTWV0aG9kRGVzY3JpcHRvci4KLQkgKiBAcGFyYW0gbXIKLQkgKiBAcGFyYW0gbWQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsKE1ldGhvZFJlY29yZCBtciwgTWV0aG9kRGVzY3JpcHRvciBtZCkgewotCQltci5tZXRob2RGb3JEZXNjcmlwdG9yID0gZ2V0UmVmbGVjdGVkTWV0aG9kUmVjb3JkKG1kLmdldE1ldGhvZCgpKTsKLQkJUGFyYW1ldGVyRGVzY3JpcHRvcltdIHBhcm1zID0gbWQuZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQkJaWYgKHBhcm1zID09IG51bGwpCi0JCQltci5wYXJhbWV0ZXJzID0gbnVsbDsKLQkJZWxzZSB7Ci0JCQltci5wYXJhbWV0ZXJzID0gbmV3IFBhcmFtZXRlclJlY29yZFtwYXJtcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJtcy5sZW5ndGg7IGorKykgewotCQkJCVBhcmFtZXRlclJlY29yZCBwciA9IG5ldyBQYXJhbWV0ZXJSZWNvcmQoKTsKLQkJCQlmaWxsKHBhcm1zW2pdLCBwciwgUEFSQU1FVEVSX1JFQ09SRF9UWVBFKTsKLQkJCQltci5wYXJhbWV0ZXJzW2pdID0gcHI7Ci0JCQl9Ci0JCX0KLQkJZmlsbChtZCwgbXIsIE1FVEhPRF9SRUNPUkRfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IElERSB0byBzZW5kIHRoZSBldmVudCBzZXQgZGVjb3JhdG9ycyBpbmZvcm1hdGlvbiBiYWNrIHRocm91Z2ggdGhlIGNhbGxiYWNrLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kRXZlbnREZWNvcmF0b3JzKE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0gKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbW1hbmRFeGNlcHRpb24gewotCQlFdmVudFNldERlc2NyaXB0b3JbXSBldmVudHMgPSBnZXRFdmVudFNldERlc2NyaXB0b3JzKCk7Ci0JCWlmIChldmVudHMgIT0gbnVsbCAmJiBldmVudHMubGVuZ3RoID4gMCkgewotCQkJLy8gTm93IHN0YXJ0IHdyaXRpbmcgdGhlIHJlY29yZHMuCi0JCQlzdHJlYW0ud3JpdGVJbnQoSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5FVkVOVF9ERUNPUkFUT1JTX1NFTlQpOwotCQkJc3RyZWFtLndyaXRlSW50KGV2ZW50cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlFdmVudFNldERlc2NyaXB0b3IgZWQgPSBldmVudHNbaV07Ci0JCQkJRXZlbnRTZXRSZWNvcmQgZXIgPSBuZXcgRXZlbnRTZXRSZWNvcmQoKTsKLQkJCQllci5hZGRMaXN0ZW5lck1ldGhvZCA9IGdldFJlZmxlY3RlZE1ldGhvZFJlY29yZChlZC5nZXRBZGRMaXN0ZW5lck1ldGhvZCgpKTsKLQkJCQlNZXRob2REZXNjcmlwdG9yW10gbWRzID0gZWQuZ2V0TGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycygpOwotCQkJCWlmIChtZHMgPT0gbnVsbCkKLQkJCQkJZXIubGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyA9IG51bGw7Ci0JCQkJZWxzZSB7Ci0JCQkJCWVyLmxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMgPSBuZXcgTWV0aG9kUmVjb3JkW21kcy5sZW5ndGhdOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1kcy5sZW5ndGg7IGorKykgewotCQkJCQkJZmlsbChlci5saXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzW2pdID0gbmV3IE1ldGhvZFJlY29yZCgpLCBtZHNbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVyLmxpc3RlbmVyVHlwZU5hbWUgPSBnZXRDbGFzc05hbWUoZWQuZ2V0TGlzdGVuZXJUeXBlKCkpOwotCQkJCWVyLnJlbW92ZUxpc3RlbmVyTWV0aG9kID0gZ2V0UmVmbGVjdGVkTWV0aG9kUmVjb3JkKGVkLmdldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkpOwotCQkJCWVyLmluRGVmYXVsdEV2ZW50U2V0ID0gZWQuaXNJbkRlZmF1bHRFdmVudFNldCgpOwotCQkJCWVyLnVuaWNhc3QgPSBlZC5pc1VuaWNhc3QoKTsKLQkJCQllci5ldmVudEFkYXB0ZXJDbGFzc05hbWUgPSBudWxsOwotCQkJCWZpbGwoZWQsIGVyLCBFVkVOVFNFVF9SRUNPUkRfVFlQRSk7Ci0JCQkJc3RyZWFtLndyaXRlT2JqZWN0KGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJFQU5fUkVDT1JEX1RZUEUgPSAwOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVDT1JEX1RZUEUgPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhFRFBST1BFUlRZX1JFQ09SRF9UWVBFID0gMjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfUkVDT1JEX1RZUEUgPSAzOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBBUkFNRVRFUl9SRUNPUkRfVFlQRSA9IDQ7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRTRVRfUkVDT1JEX1RZUEUgPSA1OwotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgc3BlY2lhbCBhdHRyL3ZhbHVlcyBmb3IgdGhlIGdpdmVuIHJlY29yZCB0eXBlLiBUaGUgZGVmYXVsdCBoYW5kbGVzIHRoZSBzdGFuZGFyZCBvbmVzLgotCSAqIAotCSAqIEBwYXJhbSByZWNvcmQKLQkgKiBAcGFyYW0gZGVzY3IKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotCSAqIEBwYXJhbSByZWNvcmRUeXBlCi0JICogICAgICAgICAgICB0eXBlIG9mIHJlY29yZCB1bHRpbWF0ZWx5IGJlaW5nIHByb2Nlc3NlZC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYXR0cmlidXRlIGlzIGEgc3BlY2lhbCBvbmUgYW5kIHByb2Nlc3NlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCBzcGVjaWFsIGFuZCBzaG91bGQgYmUgYWRkZWQgdG8KLQkgKiAgICAgICAgIGF0dHJpYnV0ZXMgbGlzdCB0cmFuc2ZlcnJlZCB0byBJREUuCi0JICogCi0JICogQHNlZSBNb2RlbGluZ0JlYW5JbmZvI1BST1BFUlRZX1JFQ09SRF9UWVBFCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsbEZyb21BdHRyaWJ1dGVzKEZlYXR1cmVSZWNvcmQgcmVjb3JkLCBGZWF0dXJlRGVzY3JpcHRvciBkZXNjciwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCByZWNvcmRUeXBlKSB7Ci0JCXN3aXRjaCAocmVjb3JkVHlwZSkgewotCQkJY2FzZSBJTkRFWEVEUFJPUEVSVFlfUkVDT1JEX1RZUEU6Ci0JCQljYXNlIFBST1BFUlRZX1JFQ09SRF9UWVBFOgotCQkJCWlmIChCYXNlQmVhbkluZm8uREVTSUdOVElNRVBST1BFUlRZLmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkgewotCQkJCQkoKFByb3BlcnR5UmVjb3JkKSByZWNvcmQpLmRlc2lnblRpbWUgPSAoQm9vbGVhbikgZGVzY3IuZ2V0VmFsdWUoYXR0cmlidXRlTmFtZSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoQmFzZUJlYW5JbmZvLkZJRUxEUFJPUEVSVFkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKSB7Ci0JCQkJCUZpZWxkIGYgPSAoRmllbGQpIGRlc2NyLmdldFZhbHVlKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQkvLyBXZSBoYXZlIGEgZmllbGQsIHNldCB0aGUgcHJvcGVydHkgdHlwZSB0byB0aGlzIHNpbmNlIHdlIGNvdWxkbid0IGNvcnJlY3RseSBjcmVhdGUgdGhpcyBvdGhlcndpc2UuCi0JCQkJCVByb3BlcnR5UmVjb3JkIHByID0gKFByb3BlcnR5UmVjb3JkKSByZWNvcmQ7Ci0JCQkJCXByLnByb3BlcnR5VHlwZU5hbWUgPSBnZXRDbGFzc05hbWUoZi5nZXRUeXBlKCkpOwotCQkJCQlwci5maWVsZCA9IGdldFJlZmxlY3RlZEZpZWxkUmVjb3JkKGYpOwotCQkJCQlwci5yZWFkTWV0aG9kID0gbnVsbDsJLy8gTmVlZCB0byB3aXBlIG91dCBvdXIgZHVtbXkuCi0JCQkJCXByLndyaXRlTWV0aG9kID0gbnVsbDsJLy8gT3IgaWYgaXQgc2V0LCBub3QgdmFsaWQgZm9yIGEgZmllbGQuCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRVZFTlRTRVRfUkVDT1JEX1RZUEU6Ci0JCQkJaWYgKEJhc2VCZWFuSW5mby5FVkVOVEFEQVBURVJDTEFTUy5lcXVhbHMoYXR0cmlidXRlTmFtZSkpIHsKLQkJCQkJKChFdmVudFNldFJlY29yZCkgcmVjb3JkKS5ldmVudEFkYXB0ZXJDbGFzc05hbWUgPSAoU3RyaW5nKSBkZXNjci5nZXRWYWx1ZShhdHRyaWJ1dGVOYW1lKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsgLy8gRGlkbid0IGhhbmRsZSBpdC4KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgZmVhdHVyZSBwb3J0aW9uIG9mIHRoZSBEZXNjcmlwdG9yIGludG8gdGhlIHJlY29yZC4gV2UgY2FuIGJlIHJldXNpbmcgc29tZSByZWNvcmRzIChzbyB3ZSBkb24ndCBrZWVwIGFsbG9jYXRpbmcgd2hlbiBub3QgbmVlZGVkKSwgc28KLQkgKiB3ZSB3aWxsIG51bGwgb3V0IHVuc2V0IGZpZWxkcy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3IKLQkgKiBAcGFyYW0gcmVjb3JkCi0JICogQHBhcmFtIHJlY29yZFR5cGUKLQkgKiAgICAgICAgICAgIHR5cGUgb2YgcmVjb3JkIHVsdGltYXRlbHkgYmVpbmcgcHJvY2Vzc2VkLiBVc2VkIGZvciBmaWxsRnJvbUF0dHJpYnV0ZXMuCi0JICogCi0JICogQHNlZSBNb2RlbGluZ0JlYW5JbmZvI1BST1BFUlRZX1JFQ09SRF9UWVBFCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbChGZWF0dXJlRGVzY3JpcHRvciBkZXNjciwgRmVhdHVyZVJlY29yZCByZWNvcmQsIGludCByZWNvcmRUeXBlKSB7Ci0JCXJlY29yZC5uYW1lID0gZGVzY3IuZ2V0TmFtZSgpOwotCQlTdHJpbmcgZG4gPSBkZXNjci5nZXREaXNwbGF5TmFtZSgpOwotCQlpZiAoIXJlY29yZC5uYW1lLmVxdWFscyhkbikpCi0JCQlyZWNvcmQuZGlzcGxheU5hbWUgPSBkbjsgLy8gZGlzcGxheSBuYW1lIHJldHVybnMgbmFtZSBpZiBkaXNwbGF5IG5hbWUgbm90IHNldC4gV2UgZG9uJ3Qgd2FudCB0byBzZW5kIGl0IGlmIGlkZW50aWNhbC4gKE5vdGUgc29tZSBCZWFuaW5mb3MgYXJlIHNldHRpbmcgZGlzcGxheW5hbWUgdGhlIHNhbWUgdGV4dCBidXQgbm90IHNhbWUgc3RyaW5nKS4KLQkJZWxzZQotCQkJcmVjb3JkLmRpc3BsYXlOYW1lID0gbnVsbDsKLQkJU3RyaW5nIHNoZCA9IGRlc2NyLmdldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJaWYgKCFkbi5lcXVhbHMoc2hkKSkKLQkJCXJlY29yZC5zaG9ydERlc2NyaXB0aW9uID0gc2hkOyAvLyBzaG9ydCBkZXNjcmlwdGlvbiByZXR1cm5zIGRpc3BsYXluYW1lIGlmIHNob3J0IGRlc2NyaXB0aW9uIG5vdCBzZXQuIFdlIGRvbid0IHdhbnQgdG8gc2VuZCBpdCBpZgotCQkJCQkJCQkJCSAgIC8vIGlkZW50aWNhbC4KLQkJZWxzZQotCQkJcmVjb3JkLnNob3J0RGVzY3JpcHRpb24gPSBudWxsOwotCQlyZWNvcmQuZXhwZXJ0ID0gZGVzY3IuaXNFeHBlcnQoKTsKLQkJcmVjb3JkLmhpZGRlbiA9IGRlc2NyLmlzSGlkZGVuKCk7Ci0JCXJlY29yZC5wcmVmZXJyZWQgPSBkZXNjci5pc1ByZWZlcnJlZCgpOwotCQlyZWNvcmQuY2F0ZWdvcnkgPSBudWxsOyAvLyBDbGVhciBvdXQgaW4gY2FzZSBub3Qgc2V0LgotCQlFbnVtZXJhdGlvbiBhdHRycyA9IGRlc2NyLmF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWlmIChhdHRycy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJLy8gV2UgZG9uJ3QgaGF2ZSBhIHdheSBvZiBrbm93aW5nIGhvdyBtYW55IHRoZXJlIGFyZSBhaGVhZCBvZiB0aW1lLCBzbyB3ZSB3aWxsIGJ1aWxkIGludG8gbGlzdHMgYW5kIHRoZW4gdHVybiBpbnRvIGFycmF5cyBhdCB0aGUgZW5kLgotCQkJTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKGF0dHJzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgYXR0cnMubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKElCYXNlQmVhbkluZm9Db25zdGFudHMuQ0FURUdPUlkpKQotCQkJCQlyZWNvcmQuY2F0ZWdvcnkgPSAoU3RyaW5nKSBkZXNjci5nZXRWYWx1ZShJQmFzZUJlYW5JbmZvQ29uc3RhbnRzLkNBVEVHT1JZKTsKLQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoQmFzZUJlYW5JbmZvLlBSRUZFUlJFRCkpIHsKLQkJCQkJLy8gQSBidWcgaW4gSmF2YSAxLjMsIGRvaW5nIHNldFByZWZlcnJlZCB3YXMgbG9zdC4gU28gZm9yIHRob3NlIGFsc28gc3RvcmVkIGl0IGluIGF0dHJpYnV0ZXMuIFNvIGlmIHNldCBoZXJlLCB0aGVuIHVzZSBpdC4KLQkJCQkJcmVjb3JkLnByZWZlcnJlZCA9ICgoQm9vbGVhbikgZGVzY3IuZ2V0VmFsdWUoQmFzZUJlYW5JbmZvLlBSRUZFUlJFRCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCX0gZWxzZSBpZiAoIWZpbGxGcm9tQXR0cmlidXRlcyhyZWNvcmQsIGRlc2NyLCBhdHRyTmFtZSwgcmVjb3JkVHlwZSkpIHsKLQkJCQkJLy8gSnVzdCBjb3B5IGFjY3Jvc3MuIEZpbGxmcm9tQXR0cmlidXRlcyBkaWRuJ3QgaGFuZGxlIGl0LgotCQkJCQlGZWF0dXJlQXR0cmlidXRlVmFsdWUgZnYgPSBuZXcgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJCWZ2LnNldFZhbHVlKGRlc2NyLmdldFZhbHVlKGF0dHJOYW1lKSk7Ci0JCQkJCW5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCXZhbHVlcy5hZGQoZnYpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbmFtZXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmVjb3JkLmF0dHJpYnV0ZU5hbWVzID0gKFN0cmluZ1tdKSBuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSk7Ci0JCQkJcmVjb3JkLmF0dHJpYnV0ZVZhbHVlcyA9IChGZWF0dXJlQXR0cmlidXRlVmFsdWVbXSkgdmFsdWVzLnRvQXJyYXkobmV3IEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZVt2YWx1ZXMuc2l6ZSgpXSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlY29yZC5hdHRyaWJ1dGVOYW1lcyA9IG51bGw7Ci0JCQkJcmVjb3JkLmF0dHJpYnV0ZVZhbHVlcyA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZWNvcmQuYXR0cmlidXRlTmFtZXMgPSBudWxsOwotCQkJcmVjb3JkLmF0dHJpYnV0ZVZhbHVlcyA9IG51bGw7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogR2V0IHRoZSBjbGFzc25hbWUgZnJvbSB0aGUgY2xhc3MuIElmIGNsYXNzcyBpcyBudWxsLCB0aGVuIHRoaXMgcmV0dXJuIG51bGwuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NOYW1lKENsYXNzIGNsYXNzcykgewotCQlyZXR1cm4gY2xhc3NzICE9IG51bGwgPyBjbGFzc3MuZ2V0TmFtZSgpIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlZmxlY3RNZXRob2RSZWNvcmQgZ2V0UmVmbGVjdGVkTWV0aG9kUmVjb3JkKE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQlSZWZsZWN0TWV0aG9kUmVjb3JkIHJtciA9IG5ldyBSZWZsZWN0TWV0aG9kUmVjb3JkKCk7Ci0JCQlybXIuY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQkJCXJtci5tZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJCUNsYXNzW10gcGFybVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQlpZiAocGFybVR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQlybXIucGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IFN0cmluZ1twYXJtVHlwZXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlybXIucGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gZ2V0Q2xhc3NOYW1lKHBhcm1UeXBlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJtcjsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBSZWZsZWN0RmllbGRSZWNvcmQgZ2V0UmVmbGVjdGVkRmllbGRSZWNvcmQoRmllbGQgZmllbGQpIHsKLQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCVJlZmxlY3RGaWVsZFJlY29yZCByZiA9IG5ldyBSZWZsZWN0RmllbGRSZWNvcmQoKTsKLQkJCXJmLmNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQkJCXJmLmZpZWxkTmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLQkJCXJmLnJlYWRPbmx5ID0gTW9kaWZpZXIuaXNGaW5hbChmaWVsZC5nZXRNb2RpZmllcnMoKSk7Ci0JCQlyZXR1cm4gcmY7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTW9kZWxpbmdCZWFuSW5mbzE1LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1OTU4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvMTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLSAqICAkUkNTZmlsZTogTW9kZWxpbmdCZWFuSW5mbzE1LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLQotLyoqCi0gKiBUaGlzIHdhcyBzdXBwb3NlZCB0byBmb3IgMS40IG9yIGFib3ZlIHdoZXJlIGl0IGNhbiB1c2UgaWRlbnRpdHkKLSAqIHRvIHRlc3QgZm9yIGluaGVyaXRlZCBmZWF0dXJlcywgYnV0IGl0IHN0aWxsIGlzIG5vdCBjb3JyZWN0Ci0gKiBpbiAxLjQuIFNlZSB0aGUgaGVhZGVyIGNvbW1lbnRzIGluIE1vZGVsaW5nQmVhbkluZm8uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby52bS5Nb2RlbGluZ0JlYW5JbmZvCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbGluZ0JlYW5JbmZvMTUgZXh0ZW5kcyBNb2RlbGluZ0JlYW5JbmZvIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2RlbGluZ0JlYW5JbmZvMTUuCi0JICogQHBhcmFtIGJlYW5JbmZvCi0JICovCi0JcHVibGljIE1vZGVsaW5nQmVhbkluZm8xNShCZWFuSW5mbyBiZWFuSW5mbywgaW50IGRvRmxhZ3MpIHsKLQkJc3VwZXIoYmVhbkluZm8sIGRvRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2RlbGluZ0JlYW5JbmZvMTUuCi0JICogQHBhcmFtIGJlYW5JbmZvCi0JICogQHBhcmFtIHN1cGVyQmVhbkluZm8KLQkgKi8KLQlwdWJsaWMgTW9kZWxpbmdCZWFuSW5mbzE1KEJlYW5JbmZvIGJlYW5JbmZvLCBCZWFuSW5mbyBzdXBlckJlYW5JbmZvLCBpbnQgZG9GbGFncykgewotCQlzdXBlcihiZWFuSW5mbywgc3VwZXJCZWFuSW5mbywgZG9GbGFncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTW9kZWxpbmdCZWFuSW5mb1ByZTE1LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvUHJlMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmNTUzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvUHJlMTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLSAqICAkUkNTZmlsZTogTW9kZWxpbmdCZWFuSW5mb1ByZTE1LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBtb2RlbGluZyBCZWFuSW5mbyBmb3IgUHJlLUpESyAxLjQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbGluZ0JlYW5JbmZvUHJlMTUgZXh0ZW5kcyBNb2RlbGluZ0JlYW5JbmZvIHsKLQotCXB1YmxpYyBNb2RlbGluZ0JlYW5JbmZvUHJlMTUoQmVhbkluZm8gYmVhbkluZm8sIGludCBkb0ZsYWdzKSB7Ci0JCXN1cGVyKGJlYW5JbmZvLCBkb0ZsYWdzKTsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxpbmdCZWFuSW5mb1ByZTE1KEJlYW5JbmZvIGJlYW5JbmZvLCBCZWFuSW5mbyBzdXBlckJlYW5JbmZvLCBpbnQgZG9GbGFncykgewotCQlzdXBlcihiZWFuSW5mbywgc3VwZXJCZWFuSW5mbywgZG9GbGFncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9QYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwNmRhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9QYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLSAqICAkUkNTZmlsZTogUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotLyoqCi0gKiBQYXJhbWV0ZXJEZXNjcmlwdG9yIGVxdWFsaXR5IHRlc3RlcgotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5IGV4dGVuZHMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB7Ci0JCi0Jc3RhdGljIHZvaWQgSU5JVCgpIHsKLQkJdHJ5IHsKLQkJCU1BUF9FUVVBTElUWS5wdXQoUGFyYW1ldGVyRGVzY3JpcHRvci5jbGFzcywgKFBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eS5jbGFzcykuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge1BhcmFtZXRlckRlc2NyaXB0b3IuY2xhc3N9KSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkoKSB7Ci0JfQotCQotCXB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkoUGFyYW1ldGVyRGVzY3JpcHRvciBkZXNjcikgewotCQlzdXBlcihkZXNjcik7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL1Byb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMWMxZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLSAqICAkUkNTZmlsZTogUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLio7Ci0vKioKLSAqIFByb3BlcnR5RGVzY3JpcHRvciBlcXVhbGl0eSB0ZXN0ZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5IGV4dGVuZHMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB7CQotCQotCXB1YmxpYyBQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eSgpIHsKLQl9Ci0JCi0JcHVibGljIFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5KFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcikgewotCQlzdXBlcihkZXNjcik7Ci0JfQkKLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIGhhc2hjb2RlIGZvciB0aGUgY3VycmVudCBmZWF0dXJlLCBhZGQgdGhpcwotCSAqIHRvIHRoZSBoYXNoY29kZSByZWNlaXZlZCBmcm9tIHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlCi0JICogYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqCi0JICogTk9URTogZm9yIHN1YmNsYXNzZXMsIGl0IGlzIE1BTkRJVE9SWSB0aGF0IHRoZSBmaXJzdCBsaW5lIGJlOgotCSAqICAgICAgICAgaW50IGhhc2hjb2RlID0gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkgKiAgICAgICBhbmQgdGhlIGxhc3QgbGluZSBiZToKLQkgKiAgICAgICAgIHJldHVybiBoYXNoY29kZSozMSArICh5b3VyIGNhbGN1bGF0ZWQgaGFzaGNvZGUgZm9yIGp1c3QgdGhpcyBzdWJjbGFzcyk7Ci0JICovCi0JcHJvdGVjdGVkIGludCBjYWxjdWxhdGVIYXNoQ29kZSgpIHsKLQkJaW50IGhhc2hjb2RlID0gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gKFByb3BlcnR5RGVzY3JpcHRvcikgZkZlYXR1cmU7Ci0JCWludCBoYyA9IDA7Ci0JCWlmIChwZC5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkgIT0gbnVsbCkKLQkJCWhjICs9IHBkLmdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKS5oYXNoQ29kZSgpOwotCQlpZiAocGQuZ2V0UHJvcGVydHlUeXBlKCkgIT0gbnVsbCkKLQkJCWhjICs9IHBkLmdldFByb3BlcnR5VHlwZSgpLmhhc2hDb2RlKCk7Ci0JCWlmIChwZC5nZXRSZWFkTWV0aG9kKCkgIT0gbnVsbCkKLQkJCWhjICs9IHBkLmdldFJlYWRNZXRob2QoKS5oYXNoQ29kZSgpOwotCQlpZiAocGQuZ2V0V3JpdGVNZXRob2QoKSAhPSBudWxsKQotCQkJaGMgKz0gcGQuZ2V0V3JpdGVNZXRob2QoKS5oYXNoQ29kZSgpOwotCQkJCi0JCWhjICs9IChwZC5pc0JvdW5kKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCQloYyArPSAocGQuaXNDb25zdHJhaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSkuaGFzaENvZGUoKTsJCQotCQkJCQkJCi0JCXJldHVybiBoYXNoY29kZSozMSArIGhjOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCWlmICghc3VwZXIuZXF1YWxzKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0gCQotCQlQcm9wZXJ0eURlc2NyaXB0b3Igb3AgPSAoUHJvcGVydHlEZXNjcmlwdG9yKSAoKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkpIG9iaikuZkZlYXR1cmU7Ci0JCVByb3BlcnR5RGVzY3JpcHRvciBmcCA9IChQcm9wZXJ0eURlc2NyaXB0b3IpIGZGZWF0dXJlOwotIAkJCi0JCWlmIChvcC5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkgIT0gZnAuZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob3AuZ2V0UmVhZE1ldGhvZCgpICE9IGZwLmdldFJlYWRNZXRob2QoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9wLmdldFdyaXRlTWV0aG9kKCkgIT0gZnAuZ2V0V3JpdGVNZXRob2QoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9wLmlzQm91bmQoKSAhPSBmcC5pc0JvdW5kKCkpCi0JCQlyZXR1cm4gZmFsc2U7CQkJCQotCQlpZiAob3AuaXNDb25zdHJhaW5lZCgpICE9IGZwLmlzQ29uc3RyYWluZWQoKSkKLQkJCXJldHVybiBmYWxzZTsJCQkJCQkJCQkJCQkJCQotCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmODVlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJveHlDb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJpbml0UGFyc2VyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icmVtb3RlQ29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0idm1fYmluIiBraW5kPSJzcmMiIHBhdGg9InZtX3JlbW90ZXZtIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJveHkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm94eVJlbW90ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3h5aWRlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGZiMWNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1jb21tb25fYmluCi12bV9iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzA4MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLW9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvZGVidWd2bT1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9pb2NvbnNvbGU9ZmFsc2UKLW9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvdm10cmFjZW91dD1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9ub3RpbWVvdXRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvdHJhY2VleHByZXNzaW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL3RyYWNlZXhwcmVzc2lvbnN0aW1ldGhyZXNob2xkPTEwMAotb3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2d0cmFjZWZpbGU9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ2xldmVsPWRlZmF1bHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODIwMDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLnByb3h5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuZGVidWcuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnBkZS5jb3JlPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNzFhZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLSNUaHUgSnVuIDE2IDEyOjUxOjAxIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2ZmNjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNXZWQgTWF5IDExIDE2OjIwOjE1IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWFjZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEp1biAxNiAxMTowODoxMyBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXNlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjEwNWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS5wcm94eTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuYXd0LAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24sCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dCwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlciwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3QsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS5wZGUuY29yZTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UudWk7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0OWE3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdm0vcmVtb3Rldm0uamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBwcm94eS5qYXJzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuLFwKLSAgICAgICAgICAgICAgICAgICAgIHZtL3JlbW90ZXZtLmphcgotc291cmNlLnZtL3JlbW90ZXZtLmphciA9IHZtX3JlbW90ZXZtLwotb3V0cHV0LnZtL3JlbW90ZXZtLmphciA9IHZtX2Jpbi8KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBwcm94eUNvbW1vbi8sXAotICAgICAgICAgICBpbml0UGFyc2VyLyxcCi0gICAgICAgICAgIHJlbW90ZUNvbW1vbi8sXAotICAgICAgICAgICBwcm94eS8sXAotICAgICAgICAgICBwcm94eVJlbW90ZS8sXAotICAgICAgICAgICBwcm94eWlkZS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQXJyYXlBcmd1bWVudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQXJyYXlBcmd1bWVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2M2Y2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0FycmF5QXJndW1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFycmF5QXJndW1lbnRzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyB0aGUgYXJndW1lbnRzIGluIGEgbXVsdGkgZGltZW5zaW9uYWwgYXJyYXkgd2l0aCBjb25zdHJ1Y3Rpb24gcGFyYW1ldGVycywgZS5nLgotICogbmV3IGludFtdW10geyB7IDIgLDMgfSAsIHsgNCAsNSB9fQotICogdGhlIGFyZ3VtZW50cyBvZiB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSBpbnN0YW5jZSBvZiBBcnJheUFyZ3VtZW50cyAKLSAqLwotcHVibGljIGNsYXNzIEFycmF5QXJndW1lbnRzIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JCi0JU3RhdGljIGZUeXBlOwotCUxpc3QgYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgyKTsKLQlib29sZWFuIGFyZ3NDbG9zZWQ7Ci0JYm9vbGVhbiBpbnNpZGVBcmdzT3BlbmVkUGFyZW47Ci0JYm9vbGVhbiBpbnNpZGVBcmdzQ2xvc2VkUGFyZW47Ci0JCi1wdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiwgY2hhciB0b2tlbkRlbGltaXRlcikgewotCQotCS8vIElmIHRoZSBhcmdzIGFyZSBvcGVuZWQgYW5kIGEgdG9rZW4gd2FzIHN1cHBsaWVkIHRoZW4gaXQgbXVzdCBiZSBhbiBhcmd1bWVudAotCS8vaWYgKCBhcmdzT3BlbmVkICYmICggdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbiB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDb21tYSB8fCAKLQkvL3Rva2VuRGVsaW1pdGVyID09IERlbGltaXRlclNwYWNlIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclF1b3RlIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCkpIHsKLQlpZiAoIWFyZ3NDbG9zZWQpewkKLQkJaWYgKCBhcmd1bWVudHMuc2l6ZSgpID4gMCApewotCQkJRXhwcmVzc2lvbiBvcGVuQXJndW1lbnQgPSAoRXhwcmVzc2lvbilhcmd1bWVudHMuZ2V0KGFyZ3VtZW50cy5zaXplKCktMSk7Ci0JCQlpZiAoICFvcGVuQXJndW1lbnQuaXNDb21wbGV0ZSgpICkgewotCQkJCW9wZW5Bcmd1bWVudC5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCQkvLyBJZiB0aGUgYXJndW1lbnQgaXMgY29tcGxldGUgYW5kIHdlIHJlY2VpdmVkIGEgKSB0aGVuIHRoZSBtZXNzYWdlIGlzIGNvbXBsZXRlCi0JCQkJaWYgKCBvcGVuQXJndW1lbnQuaXNDb21wbGV0ZSgpICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlRWxpcHNlKXsKLQkJCQkJYXJnc0Nsb3NlZCA9IHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQl9CQotCQkKLQkJLy8gV2UgbXVzdCBoYXZlIGEgbmV3IGFyZ3VtZW50IC0gcHJvY2VzcyBhY2NvcmRpbmdseQkKLQkJRXhwcmVzc2lvbiBuZXdBcmd1bWVudCA9IG51bGw7Ci0JCWlmICghaW5zaWRlQXJnc09wZW5lZFBhcmVuICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbil7Ci0JCQlpbnNpZGVBcmdzT3BlbmVkUGFyZW4gPSB0cnVlOwotCQkJbmV3QXJndW1lbnQgPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcikucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBNZXNzYWdlQXJndW1lbnQobmV3QXJndW1lbnQpOwotCQkJYXJndW1lbnRzLmFkZChuZXdBcmd1bWVudCk7Ci0KLQkJfQotCQlpZiAoIHRva2VuLmxlbmd0aCA+IDAgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUXVvdGUgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU2luZ2xlUXVvdGUgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gT3Blck1pbnVzICkgewotCQkJbmV3QXJndW1lbnQgPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcikucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBNZXNzYWdlQXJndW1lbnQobmV3QXJndW1lbnQpOwotCQkJYXJndW1lbnRzLmFkZChuZXdBcmd1bWVudCk7Ci0JCX0KLQkJLy8gSWYgdGhlIHRva2VuIGFmdGVyIHRoZSBhcmd1bWVudCBpcyBhICkgdGhlbiB0aGUgbWVzc2FnZSBpcyBiZWluZyBjbG9zZWQKLQkJaWYgKCAhaW5zaWRlQXJnc09wZW5lZFBhcmVuICAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZUVsaXBzZSApIHsKLQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJaWYgKCBpbnNpZGVBcmdzT3BlbmVkUGFyZW4gICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlRWxpcHNlICkgewotCQkJaW5zaWRlQXJnc0Nsb3NlZFBhcmVuICA9IHRydWU7Ci0JCQlhcmdzQ2xvc2VkID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JfQotCXJldHVybiB0aGlzOwotfQotLyoqCi0gKiBJbiB0aGUgY2FzZSBvZiB0aGUgZXhwcmVzc2lvbiBuZXcgaW50W11bXSB7IHsyLDN9ICwgezQsNX0gfSB0aGVuIHdlIGFyZSB0aGUgMiwzIG9yIHRoZSA0LDUKLSAqIHRvIGV2YWx1YXRlIHdlIG11c3QgcmV0dXJuIGFuIGFycmF5IG9mIGludHMgYmFzZWQgb24gb3VyIHNpemUuICBUaGUgdHlwZSB3ZSByZXR1cm4gaXMgZGV0ZXJtaW5lZCBieSB0aGUgaW5pdGlhbCAKLSAqIGNvbnN0cnVjdG9yIHdobyB3aWxsIGhhdmUgZ2l2ZW4gdGhpcyB0byB1cyBhcyBvdXIgZlR5cGUKLSAqLwkKLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCU9iamVjdCByZXN1bHQgPSBBcnJheS5uZXdJbnN0YW5jZShmVHlwZS5nZXRQcmltaXRpdmVUeXBlQ2xhc3MoKSxhcmd1bWVudHMuc2l6ZSgpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7IGkrKykgewotCQlPYmplY3QgYXJndW1lbnRWYWx1ZSA9ICgoRXhwcmVzc2lvbilhcmd1bWVudHMuZ2V0KGkpKS5ldmFsdWF0ZSgpOwotCQlBcnJheS5zZXQocmVzdWx0LGksYXJndW1lbnRWYWx1ZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlyZXR1cm4gbnVsbDsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQlyZXR1cm4gYXJnc0Nsb3NlZDsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci1wdWJsaWMgdm9pZCBzZXRUeXBlKFN0YXRpYyB0eXBlKSB7Ci0JZlR5cGUgPSB0eXBlOwotfQotcHVibGljIHZvaWQgY29udHJpYnV0ZUFyZ3VtZW50TnVtYmVyKExpc3QgYXJndW1lbnROdW1iZXJMaXN0KXsKLQkKLQkvLyBBZGQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgd2UgaGF2ZSB0byB0aGUgbGlzdAotCWFyZ3VtZW50TnVtYmVyTGlzdC5hZGQobmV3IEludGVnZXIoYXJndW1lbnRzLnNpemUoKSkpOwotCS8vIElmIG91ciBhcmd1bWVudHMgYXJlIHRoZW1zZWx2ZXMgYXJyYXkgYXJndW1lbnRzICggd2hpY2ggd2lsbCBvY2N1ciBpbiBhbiBhcnJheSBvZiAzIG9yIG1vcmUgZGltZW5zaW9ucyApCi0JLy8gdGhlbiB3ZSBzaG91bGQgY2FzY2FkZSB0aGlzIG1lc3NhZ2UgdG8gb3VyIGFyZ3VtZW50IHNvIHRoYXQgdGhlIHRvdGFsIGFycmF5IGRlcHRoIGlzIGtub3duCi0JaWYgKCBhcmd1bWVudHMuc2l6ZSgpID4gMCApIHsKLQkJT2JqZWN0IGZpcnN0QXJndW1lbnQgPSBhcmd1bWVudHMuZ2V0KDApOwotCQlpZiAoIGZpcnN0QXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheUFyZ3VtZW50cyApIHsKLS8vCQkJKChBcnJheUFyZ3VtZW50cylmaXJzdEFyZ3VtZW50KWNvbnRyaWJ1dGVBcmd1bWVudE51bWJlcihhcmd1bWVudE51bWJlckxpc3QpOwotCQl9Ci0JfQotCQotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0Jd3JpdGVyLndyaXRlKCJBcmdzKCIpOyAvLyROT04tTkxTLTEkCi0Jd3JpdGVyLndyaXRlKG5ldyBJbnRlZ2VyKGFyZ3VtZW50cy5zaXplKCkpLnRvU3RyaW5nKCkpOwotCXdyaXRlci53cml0ZSgiKS0iKTsgLy8kTk9OLU5MUy0xJAotCXdyaXRlci53cml0ZShhcmd1bWVudHMudG9TdHJpbmcoKSk7Ci0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLmluaXRQYXJzZXIuRXhwcmVzc2lvbiNnZXRUeXBlQ2xhc3NOYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiAiIjsJLy8gTm90IGFwcGxpY2FibGUgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9CbG9jay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjMwZjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQmxvY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQmxvY2sgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSXNDbG9zZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSXNDb21wbGV0ZSA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGZNZXNzYWdlT3JGaWVsZCA9IGZhbHNlOwotCQotCXB1YmxpYyBCbG9jayhFeHByZXNzaW9uIGFuRXhwcmVzc2lvbil7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gYW5FeHByZXNzaW9uOwotCX0KLQotCXB1YmxpYyBCbG9jayhDbGFzc0xvYWRlciBmQ2xhc3NMb2FkZXIpewotCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBmSXNDb21wbGV0ZTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKTsKLQl9Ci0KLQotCXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuLCBjaGFyIHRva2VuRGVsaW1pdGVyKSB7Ci0JCQkKLQkJLy8gSWYgd2UgYXJlIGNsb3NlZCAoaS5lLiBjb21wbGV0ZWQgd2l0aCBhICkpIGFuZCB3ZSBnZXQgYSApIG9yICwgdGhlbiB3ZSBhcmUgYWxsIGZpbmlzaGVkIHVwCi0JCS8vIFdlIHNob3VsZCBub3QgZm9yd2FyZCB0aGlzIHRva2VuIHRvIHRoZSBleHByZXNzaW9uLCBhcyBpdCBpc0NvbXBsZXRlCi0JCWlmICgoZklzQ2xvc2VkIHx8IGN1cnJlbnRFeHByZXNzaW9uLmlzQ29tcGxldGUoKSkgJiYgKHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEpKXsKLQkJCWZJc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCQotCQkvLyBJZiB3ZSBhcmUgYSBtZXNzYWdlIG9mIGZpZWxkIGFuZCB3ZSBnZXQgYSAoIHdlIGFyZSBtZXNzYWdlIG9yIGEgZmllbGQgb3RoZXJ3aXNlCi0JCWlmIChmTWVzc2FnZU9yRmllbGQpewotCQkJZk1lc3NhZ2VPckZpZWxkID0gZmFsc2U7Ci0JCQkvLyBUaGUgcHJvYmxlbSBub3cgaXMgdGhhdCB3ZSBhcmUgYSBibG9jayBvZiBhbiBleHByZXNzaW9uIGFuZCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG1lc3NhZ2UKLQkJCS8vIHdoZXJlIHdlIGFyZSB0aGUgcmVjZWl2ZXIuICBIb3dldmVyIHdlIGFyZSBvbiB0aGUgc3RhY2sgYW5kIGdvaW5nIHRvIGJlIHBvcHBlZCB3aGVuIHRoZSBtZXNzYWdlIGZpbmlzaGVzCi0JCQkvLyBzbyB3ZSBtdXN0IGFsdGVyIG91cnNlbGYgdG8gYmUgYSBibG9jayB3aG9zZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgbWVzc2FnZSB3aG9zZSBhcmd1bWVudAotCQkJLy8gaXMgYSBjb3B5IG9mIHVzCi0JCQlpZiAoIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbil7Ci0JCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoY3VycmVudEV4cHJlc3Npb24sdG9rZW4sZkNsYXNzTG9hZGVyKTsKLQkJCQljdXJyZW50RXhwcmVzc2lvbiA9IG1lc3NhZ2U7Ci0JCQkJcmV0dXJuIG1lc3NhZ2U7Ci0JCQl9IGVsc2UgewotCQkJCUZpZWxkIGZpZWxkID0gbmV3IEZpZWxkKGN1cnJlbnRFeHByZXNzaW9uLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JCQkJY3VycmVudEV4cHJlc3Npb24gPSBmaWVsZDsKLQkJCQlyZXR1cm4gZmllbGQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIElmIHdlIGFyZSBjbG9zZWQgYW5kIHdlIGdldCBhIC4gdGhlbiB3ZSBtdXN0IGJlZ2luIGEgbWVzc2FnZSBvciBmaWVsZCBleHByZXNzaW9uCi0JCWlmIChjdXJyZW50RXhwcmVzc2lvbi5pc0NvbXBsZXRlKCkgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICl7Ci0JCQlmTWVzc2FnZU9yRmllbGQgPSB0cnVlOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJCi0JCUV4cHJlc3Npb24gcmVzdWx0ID0gY3VycmVudEV4cHJlc3Npb24ucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCS8vIElmIHRoZSByZXN1bHQgaWYgYSBwdXNoIHRoZW4gcHVzaCB0aGUgc3RhY2sKLQkJaWYgKCByZXN1bHQgIT0gY3VycmVudEV4cHJlc3Npb24gKSB7Ci0JCQlwdXNoRXhwcmVzc2lvblN0YWNrKHJlc3VsdCk7CQotCQl9Ci0JCS8vIElmIG91ciBjdXJyZW50IGV4cHJlc3Npb24gaXMgY29tcGxldGUgYW5kIHdlIGFyZSByZWNlaXZpbmcgYSBjbG9zZSBwYXJlbnQgdGhlbiB3ZSBhcmUgY2xvc2VkCi0JCWlmIChjdXJyZW50RXhwcmVzc2lvbi5pc0NvbXBsZXRlKCkgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbil7Ci0JCQlmSXNDbG9zZWQgPSB0cnVlOwotCi0JCX0KLQkJLy8gSWYgd2UgYXJlIGhlcmUgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyBzdGlsbCBwcm9jZXNzaW5nIHRva2VucyBzbyB3ZSBzaG91bGQgcmV0dXJuIGl0Ci0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiQmxvY2soIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsICkgewotCQkJYnVmZmVyLmFwcGVuZChjdXJyZW50RXhwcmVzc2lvbi50b1N0cmluZygpKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5pbml0UGFyc2VyLkV4cHJlc3Npb24jZ2V0VHlwZUNsYXNzTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Cb29sZWFuTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Cb29sZWFuTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTIwNGZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQm9vbGVhbkxpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBCb29sZWFuTGl0ZXJhbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgQm9vbGVhbkxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZTsKLXB1YmxpYyBCb29sZWFuTGl0ZXJhbChib29sZWFuIGFWYWx1ZSl7Ci0KLQl2YWx1ZSA9IGFWYWx1ZTsKLQotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgewotCXJldHVybiBuZXcgQm9vbGVhbih2YWx1ZSk7Ci19Ci0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCl7Ci0JcmV0dXJuIEJvb2xlYW4uVFlQRTsKLX0KLS8qKgotICogdHJ1ZSBvciBmYWxzZSBjYW5ub3QgY29uc3VtZSBhbnkga2luZCBvZiBleHByZXNzaW9uIHNvIHdlIG11c3QgcmV0dXJuIG51bGwKLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIGRlbGltaXRlcil7Ci0KLQlyZXR1cm4gbnVsbDsJCi0KLX0KLQotLyoqCi0gKiBUaGlzIGlzIHByaW1pdGl2ZQotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5pbml0UGFyc2VyLkV4cHJlc3Npb24jZ2V0VHlwZUNsYXNzTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gQm9vbGVhbi5UWVBFLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2Fubm90UHJvY2Vzc0FycmF5VHlwZXNFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2Fubm90UHJvY2Vzc0FycmF5VHlwZXNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyZDgwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhbm5vdFByb2Nlc3NBcnJheVR5cGVzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQ2Fubm90UHJvY2Vzc0FycmF5VHlwZXNFeGNlcHRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLS8qKgotICogRXhjZXB0aW9uIHRvIGluZGljYXRlIHRoYXQgdGhlIGluaXRTdHJpbmdQYXJzZXIgY2FuJ3QgZGVhbCB3aXRoIGFycmF5cyByaWdodCBub3cKLSAqLwotcHVibGljIGNsYXNzIENhbm5vdFByb2Nlc3NBcnJheVR5cGVzRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MjQ1OTg0MDIwMDY1NzYxNjM0TDsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2Fubm90UHJvY2Vzc0lubmVyQ2xhc3Nlc0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DYW5ub3RQcm9jZXNzSW5uZXJDbGFzc2VzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzkwYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DYW5ub3RQcm9jZXNzSW5uZXJDbGFzc2VzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQ2Fubm90UHJvY2Vzc0lubmVyQ2xhc3Nlc0V4Y2VwdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gdG8gaW5kaWNhdGUgdGhhdCBpbm5lciBjbGFzc2VzIGNhbm5vdCBiZSBwcm9jZXNzZWQKLSAqLwotcHVibGljIGNsYXNzIENhbm5vdFByb2Nlc3NJbm5lckNsYXNzZXNFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODI5MDUwNDU4MDczODQ5OTQ0NUw7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2FzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DYXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWQ1NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DYXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IENhc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgQ2FzdCBleHRlbmRzIEV4cHJlc3Npb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJZVEVfVFlQRSA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlRfVFlQRSA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1RZUEUgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExPTkdfVFlQRSA9IDM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkxPQVRfVFlQRSA9IDQ7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFX1RZUEUgPSA1OwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSGFzaE1hcCBzVHlwZUxvb2t1cDsKLQlzdGF0aWMgewotCQlzVHlwZUxvb2t1cCA9IG5ldyBIYXNoTWFwKDYpOwotCQlzVHlwZUxvb2t1cC5wdXQoQnl0ZS5UWVBFLCBuZXcgSW50ZWdlcihCWVRFX1RZUEUpKTsKLQkJc1R5cGVMb29rdXAucHV0KFNob3J0LlRZUEUsIG5ldyBJbnRlZ2VyKFNIT1JUX1RZUEUpKTsKLQkJc1R5cGVMb29rdXAucHV0KEludGVnZXIuVFlQRSwgbmV3IEludGVnZXIoSU5UX1RZUEUpKTsKLQkJc1R5cGVMb29rdXAucHV0KExvbmcuVFlQRSwgbmV3IEludGVnZXIoTE9OR19UWVBFKSk7Ci0JCXNUeXBlTG9va3VwLnB1dChGbG9hdC5UWVBFLCBuZXcgSW50ZWdlcihGTE9BVF9UWVBFKSk7Ci0JCXNUeXBlTG9va3VwLnB1dChEb3VibGUuVFlQRSwgbmV3IEludGVnZXIoRE9VQkxFX1RZUEUpKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBTdGF0aWMgZkNhc3RUeXBlOwotCXByb3RlY3RlZCBib29sZWFuIGZJc0Nsb3NlZCA9IGZhbHNlOwotCQotCXB1YmxpYyBDYXN0KFN0YXRpYyBjYXN0VHlwZSwgQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKSB7Ci0JCWZDYXN0VHlwZSA9IGNhc3RUeXBlOwotCQlmQ2xhc3NMb2FkZXIgPSBhQ2xhc3NMb2FkZXI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUeXBlQ2xhc3MoKS5pc1ByaW1pdGl2ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgdHlwZSBvZiBhIENhc3QgZXhwcmVzc2lvbiBpcyB0aGUgdHlwZSBvZiB0aGUgY2FzdCB0eXBlLgotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZDYXN0VHlwZS5nZXRUeXBlQ2xhc3MoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwgJiYgY3VycmVudEV4cHJlc3Npb24uaXNDb21wbGV0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgdHlwZSBpcyBwcmltaXRpdmUsIHRoZW4gd2UgbmVlZCB0bwotCSAqIGNvbnZlcnQgdGhlIHZhbHVlLCBvdGhlcndpc2UganVzdCBwYXNzCi0JICogdGhlIHZhbHVlIG9uLgotCSAqCi0JICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHByaW1pdGl2ZXMgYmVjYXVzZSBpZiB5b3VyCi0JICogZW50aXJlIGluaXRpYWxpemF0aW9uIHN0cmluZyB3YXMgc2ltcGx5ICIoc2hvcnQpIDMiCi0JICogdGhlbiBhIFNob3J0IHZhbHVlIG11c3QgYmUgcmV0dXJuZWQgc28gdGhhdCB0aGUKLQkgKiBjb3JyZWN0IGtpbmQgb2YgcHJpbWl0aXZlIHByb3h5IGlzIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZ2V0VHlwZUNsYXNzKCkgPT0gY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCkpCi0JCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKTsJLy8gVGhleSdyZSB0aGUgc2FtZSwgc28ganVzdCByZXR1cm4gaXQuCi0JCWlmIChnZXRUeXBlQ2xhc3MoKS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkvLyBDYW4gb25seSBjYXN0IGEgcHJpbWl0aXZlIHRvIGEgcHJpbWl0aXZlLCBleGNlcHQgbnVsbCBjYW4ndCBiZSBjYXN0IHRvIGEgcHJpbWl0aXZlLgotCQkJaWYgKCFjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKS5pc1ByaW1pdGl2ZSgpIHx8IGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpID09IFZvaWQuVFlQRSkKLQkJCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpLmdldE5hbWUoKSkpOwkJCQotCQkJLy8gYm9vbGVhbiBvbmx5IGFsbG93cyBib29sZWFuIGNhc3QuCi0JCQlpZiAoZkNhc3RUeXBlLmdldFR5cGVDbGFzcygpID09IEJvb2xlYW4uVFlQRSB8fCBjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKSA9PSBCb29sZWFuLlRZUEUpCi0JCQkJdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24obmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJCWlmIChmQ2FzdFR5cGUuZ2V0VHlwZUNsYXNzKCkgPT0gQ2hhcmFjdGVyLlRZUEUpIHsKLQkJCQkvLyBTbyB3ZSBoYXZlIGVpdGhlciBhIENoYXJhY3RlciBvciBhIG51bWJlciBhcyB0aGUgdmFsdWUuIENhc3QgdGhhdC4JCQkJCi0JCQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIoKGNoYXIpICgoTnVtYmVyKSBjdXJyZW50RXhwcmVzc2lvbi5ldmFsdWF0ZSgpKS5pbnRWYWx1ZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTnVtYmVyIHZhbHVlID0gbnVsbDsKLQkJCQkvLyBTZWUgaWYgdGhlIHZhbHVlIGlzIGNoYXJhY3RlciBvciBhIG51bWJlci4KLQkJCQlpZiAoY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCkgPT0gQ2hhcmFjdGVyLlRZUEUpCi0JCQkJCXZhbHVlID0gbmV3IEludGVnZXIoKChDaGFyYWN0ZXIpIGN1cnJlbnRFeHByZXNzaW9uLmV2YWx1YXRlKCkpLmNoYXJWYWx1ZSgpKTsKLQkJCQllbHNlCi0JCQkJCXZhbHVlID0gKE51bWJlcikgY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKTsKLQkJCQlzd2l0Y2ggKCgoSW50ZWdlcikgc1R5cGVMb29rdXAuZ2V0KGZDYXN0VHlwZS5nZXRUeXBlQ2xhc3MoKSkpLmludFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBCWVRFX1RZUEU6Ci0JCQkJCQlyZXR1cm4gbmV3IEJ5dGUodmFsdWUuYnl0ZVZhbHVlKCkpOwotCQkJCQljYXNlIFNIT1JUX1RZUEU6Ci0JCQkJCQlyZXR1cm4gbmV3IFNob3J0KHZhbHVlLnNob3J0VmFsdWUoKSk7Ci0JCQkJCWNhc2UgSU5UX1RZUEU6Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQkJCWNhc2UgTE9OR19UWVBFOgotCQkJCQkJcmV0dXJuIG5ldyBMb25nKHZhbHVlLmxvbmdWYWx1ZSgpKTsKLQkJCQkJY2FzZSBGTE9BVF9UWVBFOgotCQkJCQkJcmV0dXJuIG5ldyBGbG9hdCh2YWx1ZS5mbG9hdFZhbHVlKCkpOwotCQkJCQljYXNlIERPVUJMRV9UWVBFOgotCQkJCQkJcmV0dXJuIG5ldyBEb3VibGUodmFsdWUuZG91YmxlVmFsdWUoKSk7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm4gbnVsbDsJLy8gU2hvdWxkbid0IG9jY3VyLiBKdXN0IHNhdGlzaWZpZXMgY29tcGlsZXIuCi0JCQkJfQotCQkJfQotCQkJCi0JCX0gZWxzZQotCQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JfQotCS8qKgotCSAqIEEgY2FzdCBleHByZXNzaW9uIGFsd2F5cyBwdXNoZXMgb250byB0aGUgY2FzdCB2YWx1ZQotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciB0b2tlbkRlbGltaXRlcikgewotCQkvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2xhc3MgeWV0IHRoZW4gd2UgYXJlIHdpdGhpbiB0aGUgc3RhdGVtZW50IHRvIHRyeSBhbmQgZGV0ZXJpbmUgdGhlIHR5cGUgYmVpbmcgY2FzdCB0bwotCQlpZihmQ2FzdFR5cGUuZ2V0UHJpbWl0aXZlVHlwZUNsYXNzKCkgPT0gbnVsbCAmJiAhZklzQ2xvc2VkKXsKLQkJCWZDYXN0VHlwZS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCS8vIElmIHRoZSB0eXBlIHdhcyBjb21wbGV0ZWQgYW5kIHdlIGhhdmUgYSApIHRoZW4gY2xvc2UgdXMKLQkJCWlmKGZDYXN0VHlwZS5nZXRQcmltaXRpdmVUeXBlQ2xhc3MoKSAhPSBudWxsICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4pewotCQkJCWZJc0Nsb3NlZCA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpczsJCQkKLQkJfQotCQkKLQkJaWYgKCFmSXNDbG9zZWQpIHsKLQkJCS8vIFRoZSBjYXN0IGlzIG5vdCBjbG9zZWQsIGJ1dCB3ZSBoYXZlIGEgc3RhdGljIGNsYXNzLiAgVGhpcyBjbGFzcyBtdXN0IHRoZXJlZm9yZSBrZWVwIHByb2Nlc3NpbmcgdGhlIHRva2VucyBhcyBpdCBjb3VsZCBiZSBhIG1ldGhvZCBvciBtZXNzYWdlIHNlbmQKLQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gIGZDYXN0VHlwZS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCXJlc3VsdC5wYXJlbnRoZXNpc0xldmVsKys7Ci0JCQlyZXR1cm4gcmVzdWx0OyAKLQkJfQotCQkKLQkJLy8gSWYgd2UgaGF2ZSBubyBleHByZXNzaW9uIHB1c2ggb250byB0aGUgY2FzdCB2YWx1ZQkJCi0JCWlmKGN1cnJlbnRFeHByZXNzaW9uID09IG51bGwpewotCQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcik7Ci0JCQljdXJyZW50RXhwcmVzc2lvbiA9IGN1cnJlbnRFeHByZXNzaW9uLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gCi0JCUV4cHJlc3Npb24gcmVzdWx0ID0gY3VycmVudEV4cHJlc3Npb24ucHVzaCh0b2tlbiwgdG9rZW5EZWxpbWl0ZXIpOwotCQkvLyBJZiB0aGUgcmVzdWx0IGlmIGEgcHVzaCB0aGVuIHB1c2ggdGhlIHN0YWNrCi0JCWlmICggcmVzdWx0LmlzQ29tcGxldGUoKSApIHsKLQkJCXBvcEV4cHJlc3Npb25TdGFjaygpOwotCQl9IGVsc2UgaWYgKCByZXN1bHQgIT0gY3VycmVudEV4cHJlc3Npb24gKSB7Ci0JCQlwdXNoRXhwcmVzc2lvblN0YWNrKHJlc3VsdCk7Ci0JCX0JCQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJDYXN0KCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmQ2FzdFR5cGUgIT0gbnVsbCl7Ci0JCQlidWZmZXIuYXBwZW5kKGZDYXN0VHlwZS50b1N0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIj8/PyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiKSAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwpewotCQkJYnVmZmVyLmFwcGVuZChjdXJyZW50RXhwcmVzc2lvbi50b1N0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIj8/PyIpOwkJCSAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5pbml0UGFyc2VyLkV4cHJlc3Npb24jZ2V0VHlwZUNsYXNzTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZkNhc3RUeXBlLmdldFR5cGVDbGFzc05hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2hhckxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2hhckxpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkZDRkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0NoYXJMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IENoYXJMaXRlcmFsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ2hhckxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBsZXRlOwotCXB1YmxpYyBjaGFyIHZhbHVlOwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgdmFsdWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFc2NhcGVkID0gZmFsc2U7Ci0KLS8qKgotICogY29uc3RydWN0b3IKLSAqLwotcHVibGljIENoYXJMaXRlcmFsKCl7Ci19Ci0JCi0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JaWYgKHZhbHVlQnVmZmVyLmxlbmd0aCgpID09IDEpCi0JCXJldHVybiBuZXcgQ2hhcmFjdGVyKHZhbHVlQnVmZmVyLmNoYXJBdCgwKSk7Ci0JZWxzZQotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbigKLQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuZ2V0U3RyaW5nKCJDaGFyVG9vQ29tcGxpY2F0ZWRfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJbmV3IE9iamVjdFtdIHt2YWx1ZUJ1ZmZlci50b1N0cmluZygpfSkpKTsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpewotCXJldHVybiBpc0NvbXBsZXRlOwotfQotLyoqCi0gKiBXZSBtdXN0IGV2YWx1YXRlIG91cnNlbGYgYW5kIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0Ci0gKi8KLSAKLXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB7Ci0JcmV0dXJuIENoYXJhY3Rlci5UWVBFOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JcmV0dXJuIENoYXJhY3Rlci5UWVBFLmdldE5hbWUoKTsKLX0KLS8qKgotICpUaGlzIHN0cmluZyBtaWdodCBiZSBicm9rZW4gaW50byBhIGZldyB0b2tlbnMKLSAqc28gd2UgbmVlZCBhIFN0cmluZ0J1ZmZlciAKLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIGRlbGltaXRlcil7Ci0JCi0JaWYgKGlzRXNjYXBlZCkgewotCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJaWYgKHRva2VuLmxlbmd0aCAhPSAwKSB7Ci0JCQkvLyBIYWQgYW4gZXNjYXBlIGZvbGxvd2VkIGJ5IHN0dWZmLCBzbyBub3QgYSB0cnVlIGVzYyBmb3Igb3VyIGN1cnJlbnQgZGVmaW5pdGlvbgotCQkJdmFsdWVCdWZmZXIuYXBwZW5kKERlbGltaXRlckVzY2FwZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJFc2NhcGUpCi0JCQkJdmFsdWVCdWZmZXIuYXBwZW5kKGRlbGltaXRlcik7CS8vIEl0IHdhcyBhIHRydWUgZXNjYXBlLgotCQkJZWxzZSB7Ci0JCQkJdmFsdWVCdWZmZXIuYXBwZW5kKERlbGltaXRlckVzY2FwZSk7CS8vIElmIHdhc24ndCBhIHRydWUgZXNjYXBlCi0JCQkJdmFsdWVCdWZmZXIuYXBwZW5kKGRlbGltaXRlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0KLQkKLQl2YWx1ZUJ1ZmZlci5hcHBlbmQodG9rZW4pOwotCQotCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU2luZ2xlUXVvdGUpewkJCi0JCWlzQ29tcGxldGUgPXRydWU7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvLyBJZiB0aGUgZGVsaW1pdGVyIGlzIGFuIGVzY2FwZSBjaGFyYWN0ZXIgcmVtZW1iZXIgaXQgc28gd2UgY2FuIGVzY2FwZQotCS8vIHRoZSBuZXh0IHRva2VuLCBvdGhlcndpc2UgdHJlYXQgaXQgYXMgYSBsaXRlcmFsCi0JaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJFc2NhcGUgKXsKLQkJaXNFc2NhcGVkID0gdHJ1ZTsKLQl9IGVsc2UgewotCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoZGVsaW1pdGVyKTsKLQl9Ci0JcmV0dXJuIHRoaXM7Ci19Ci0KLS8qKgotICogY2hhcnMgYXJlIHByaW1pdGl2ZXMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCXJldHVybiB0cnVlOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmZmVyLmFwcGVuZCgiQ2hhcignIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIHZhbHVlQnVmZmVyICE9IG51bGwgKSB7Ci0JCWJ1ZmZlci5hcHBlbmQodmFsdWVCdWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ29uc3RydWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ29uc3RydWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4ODUxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0NvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IENvbnN0cnVjdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWV0aG9kSGVscGVyOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzAxLzAwIDg6NTI6MzYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvciBleHRlbmRzIEV4cHJlc3Npb24gewotCXB1YmxpYyBib29sZWFuIGFyZ3NPcGVuZWQgPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiBhcmdzQ2xvc2VkID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gdHJhaWxpbmdQZXJpb2QgPSBmYWxzZTsKLQlwdWJsaWMgQXJyYXlMaXN0IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JcHVibGljIFN0YXRpYyB0eXBlOwotCXByb3RlY3RlZCBib29sZWFuIGZJc0NvbXBsZXRlOwotCXB1YmxpYyBib29sZWFuIGluc2lkZUFyZ3NPcGVuZWRQYXJlbiA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIGluc2lkZUFyZ3NDbG9zZWRQYXJlbiA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIGlzU3RyaW5nID0gZmFsc2U7Ci0JcHVibGljIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGN0b3I7Ci0vKioKLSAqIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBDb25zdHJ1Y3RvcihDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpIHsKLQlzdXBlcigpOwotCWZDbGFzc0xvYWRlciA9IGFDbGFzc0xvYWRlcjsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpewotCXJldHVybiBmSXNDb21wbGV0ZTsKLX0KLQotLyoqCi0gKiBJbnZva2UgdGhlIGNvbnN0cnV0b3IKLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JaWYgKCB0eXBlLmlzQXJyYXkoKSApIHsKLQkJLy8gRm9yIGFycmF5cyB3ZSBnZXQgdGhlIGFycmF5IHRoYXQgaXMgYWN0dWFsbHkgaGVsZCBpbnNpZGUgdGhlIHN0YXRpYwotCQkvLyBUbyBpbnN0YW50aWF0ZSB0aGUgYXJyYXkgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc3RhdGljIGtub3dzIHRoZSBhcnJheSBzaXplLCBlLmcuIG5ldyBpbnRbMl0KLQkJLy8gb3IgZWxzZSBpdCBtdXN0IGJlIGdpdmVuIHRoaXMgZnJvbSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB3ZSBoYXZlLCBlLmcuIG5ldyBpbnRbXSB7IDIgLCAzIH0KLQkJaWYgKCBhcmd1bWVudHMuc2l6ZSgpID4gMCApIHsKLQkJCXR5cGUuc2V0QXJyYXlBcmd1bWVudHMoYXJndW1lbnRzKTsKLQkJfQotCQlPYmplY3QgcmVzdWx0ID0gdHlwZS5ldmFsdWF0ZSgpOwotCQkvLyBEZWFsIHdpdGggYXJyYXkgaW5pdGlhbGl6YXRpb24gYXJndW1lbnRzCi0JCXJldHVybiByZXN1bHQ7Ci0JfSBlbHNlIHsKLQkJLy8gRm9yIG5vbiBhcnJheXMgd2UgZmluZCB0aGUgbWV0aG9kIGFuZCBpbnZva2UgaXQgb24gdGhlIHR5cGUKLQkJY2FjaGVDdG9yKCk7Ci0JCS8vIEdldCB0aGUgYXJyYXkgb2YgYXJndW1lbnRzCi0JCU9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W2FyZ3VtZW50cy5zaXplKCldOwotCQlJdGVyYXRvciBpdHIgPSBhcmd1bWVudHMuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMuc2l6ZSgpIDsgaSsrKXsKLQkJCUV4cHJlc3Npb24gYW5FeHByZXNzaW9uID0gKEV4cHJlc3Npb24paXRyLm5leHQoKTsKLQkJCWFyZ3NbaV0gPSBhbkV4cHJlc3Npb24uZXZhbHVhdGUoKTsKLQkJfQotCQotCQl0cnkgewotCQkJcmV0dXJuIGN0b3IubmV3SW5zdGFuY2UoYXJncyk7CQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyLCB0aGVuIHdlIGhhdmUgYSB2YWxpZCBwYXJzZSwgc28gYW55dGhpbmcgaXMgYW4gZXZhbHVhdGlvbiBleGNlcHRpb24uCi0JCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KLS8qKiBBIGNvbnN0cnVjdG9yIGNhbiBvbmx5IHJldHVybiB0aGUgY2xhc3Mgb2YgaXRzIHR5cGUKLSAqLwotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCWlmICggdHlwZS5pc0FycmF5KCkgKSB7Ci0JCS8vIEZvciBhcnJheXMgd2UgZ2V0IHRoZSBhcnJheSB0aGF0IGlzIGFjdHVhbGx5IGhlbGQgaW5zaWRlIHRoZSBzdGF0aWMKLQkJLy8gVG8gaW5zdGFudGlhdGUgdGhlIGFycmF5IGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHN0YXRpYyBrbm93cyB0aGUgYXJyYXkgc2l6ZSwgZS5nLiBuZXcgaW50WzJdCi0JCS8vIG9yIGVsc2UgaXQgbXVzdCBiZSBnaXZlbiB0aGlzIGZyb20gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgd2UgaGF2ZSwgZS5nLiBuZXcgaW50W10geyAyICwgMyB9Ci0JCWlmICggYXJndW1lbnRzLnNpemUoKSA+IDAgKSB7Ci0JCQl0eXBlLnNldEFycmF5QXJndW1lbnRzKGFyZ3VtZW50cyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHR5cGUuZ2V0VHlwZUNsYXNzKCk7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gdHlwZS5nZXRUeXBlQ2xhc3NOYW1lKCk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjYWNoZUN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQlpZiAoY3RvciA9PSBudWxsKSB7Ci0JCUNsYXNzW10gYXJnVHlwZXMgPSBuZXcgQ2xhc3NbYXJndW1lbnRzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ciA9IGFyZ3VtZW50cy5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpPTA7IGk8YXJnVHlwZXMubGVuZ3RoOyBpKyspCi0JCQlhcmdUeXBlc1tpXSA9IGdldEV2YWx1YXRpb25UeXBlQ2xhc3MoKEV4cHJlc3Npb24pIGl0ci5uZXh0KCkpOwotCQkJCi0JCXRyeSB7Ci0JCQljdG9yID0gTWV0aG9kSGVscGVyLmZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3IoZ2V0RXZhbHVhdGlvblR5cGVDbGFzcyh0aGlzKSwgYXJnVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KLXByb3RlY3RlZCBib29sZWFuIGlzRGVsaW1pdGVyT3BlbmVkKGNoYXIgdG9rZW4pewotCXJldHVybiB0eXBlLmlzQXJyYXkoKSA/IHRva2VuID09IERlbGltaXRlck9wZW5FbGlwc2UgOiB0b2tlbiA9PSBEZWxpbWl0ZXJPcGVuUGFyZW47CQotfQotcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxpbWl0ZXJDbG9zZWQoY2hhciB0b2tlbil7Ci0JcmV0dXJuIHR5cGUuaXNBcnJheSgpID8gdG9rZW4gPT0gRGVsaW1pdGVyQ2xvc2VFbGlwc2UgOiB0b2tlbiA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuOwotfQotLyoqCi0gKiBwdXNoIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiwgY2hhciB0b2tlbkRlbGltaXRlcikgewotCi0JLy8gSWYgd2UgYXJlIGNsb3NlZCBhbmQgd2UgcmVjZWl2ZSBhIC4gd2l0aCBubyB0b2tlbiB0aGVuIHJlbWVtYmVyIHRoaXMKLQlpZiAoIGFyZ3NDbG9zZWQgJiYgIXRyYWlsaW5nUGVyaW9kICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCAmJiB0b2tlbi5sZW5ndGggPT0gMCApIHsKLQkJdHJhaWxpbmdQZXJpb2QgPSB0cnVlOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JLy8gSWYgd2UgaGF2ZSBiZWVuIGNsb3NlZCB3aXRoIGEgLiBhbmQgd2UgcmVjZWl2ZSBhIC4gdGhlbiB3ZSBhcmUgYSBmaWVsZAotCWlmICggdHJhaWxpbmdQZXJpb2QgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICkgewotCQlyZXR1cm4gbmV3IEZpZWxkKHRoaXMsdG9rZW4sZkNsYXNzTG9hZGVyKTsKLQl9Ci0JLy8gSWYgd2UgaGF2ZSBiZWVuIGNsb3NlZCB3aXRoIGEgLiBhbmQgd2UgcmVjZWl2ZSBhICggd2UgYXJlIGEgbWVzc2FnZQotCWlmICggdHJhaWxpbmdQZXJpb2QgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuICkgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2UodGhpcyx0b2tlbixmQ2xhc3NMb2FkZXIpOwotCX0KLQkKLQkvLyBMYXp5IGluaXRpYWxpemUgdGhlIHR5cGUgaWYgcmVxdWlyZWQKLQlpZiAoIHR5cGUgPT0gbnVsbCApIHsKLQkJc3dpdGNoICggdG9rZW5EZWxpbWl0ZXIgKSB7Ci0JCQljYXNlIERlbGltaXRlclBlcmlvZDogewotCQkJCXR5cGUgPSBuZXcgU3RhdGljKHRva2VuLHRva2VuRGVsaW1pdGVyLGZDbGFzc0xvYWRlcik7Ci0JCQkJdHlwZS5zZXRDbGFzc0xvYWRlcihmQ2xhc3NMb2FkZXIpOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQkJY2FzZSBEZWxpbWl0ZXJPcGVuUGFyZW46IHsKLQkJCQl0eXBlID0gbmV3IFN0YXRpYyh0b2tlbix0b2tlbkRlbGltaXRlcixmQ2xhc3NMb2FkZXIpOwotCQkJCXR5cGUuc2V0Q2xhc3NMb2FkZXIoZkNsYXNzTG9hZGVyKTsKLQkJCQlhcmdzT3BlbmVkID0gdHJ1ZTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0gCi0JCQljYXNlIERlbGltaXRlck9wZW5TcXVhcmVCcmFjZTogeyAKLS8vCQkJCXRocm93IG5ldyBDYW5ub3RQcm9jZXNzQXJyYXlUeXBlc0V4Y2VwdGlvbigpOwotCQkJCS8vIEFycmF5IGRpbWVuaW9ucyBhcmUgY3JlYXRlZCBhcyBzdGFlbWVudHMgaW4gdGhlIGFycmF5RGltZW5zaW9ucwotCQkJCS8vIFRoaXMgaXMgZm9yIGV4cHJlc3Npb25zIGxpa2UgbmV3IFN0cmluZ1tdIG9yIG5ldyBTdHJpbmdbM10sIHdoZXJlIHRoZSBTdGF0ZW1lbnQgcmVwcmVzZW50cyB0aGUgMywgaS5lLgotCQkJCS8vIHRoZSBjb2RlIHRoYXQgZGVjbGFyZXMgdGhlIHNpemUgb2YgdGhlIGFycmF5Ci0JCQkJdHlwZSA9IG5ldyBTdGF0aWModG9rZW4sdG9rZW5EZWxpbWl0ZXIsZkNsYXNzTG9hZGVyLHRydWUpOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQkJLy8gSWYgd2UgZ2V0IGEgeyBhbmQgb3VyIHN0YXRpYyBpcyBhbiBhcnJheSB0aGVuIHRoaXMgaXMgdGhlIGFycmF5IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKLQkJCWNhc2UgRGVsaW1pdGVyT3BlbkVsaXBzZTogeyAKLQkJCQlpZiAoIHR5cGUgIT0gbnVsbCAmJiB0eXBlLmlzQXJyYXkoKSApIHsKLQkJCQkJYXJnc09wZW5lZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZGVmYXVsdDogewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCS8vIElmIHdlIGhhdmUgYSBzdGF0aWMgdGhhdCBpcyBhbiBhcnJheSB0aGVuIGl0IGNvbnN1bWVzIHRva2VuIHVudGlsIGl0IGlzIGNvbXBsZXRlCi0JaWYgKCB0eXBlICE9IG51bGwgJiYgdHlwZS5pc0FycmF5KCkgKSB7Ci0JCS8vIFRoZSB0eXBlIGNvbnN1bWVzIHRva2VuIGFzIGxvbmcgYXMgaXQgaXMgc3RpbGwgaW4gdGhlIGFycmF5IGRlY2xhcmF0aW9uIHNlY3Rpb24KLQkJaWYgKCB0eXBlLmlzUHJvY2Vzc2luZ0FycmF5RGltZW5zaW9uIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5TcXVhcmVCcmFjZSApIHsKLQkJCXR5cGUucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0KLQkJCi0JLy8gSWYgdGhlIHR5cGUgaXMgaW5jb21wbGV0ZSBhbmQgdGhlIHRva2VuIGlzIGEgLiAoIGZvciBhbm90aGVyIGNsYXNzICkgb3IgYSBbIGZvciBhbiBhcnJheSB0aGVuIHB1c2ggaXQgb250byB0aGUgdHlwZQotCWlmICghdHlwZS5pc0FycmF5KCkgJiYgdHlwZS5nZXRUeXBlQ2xhc3MoKSA9PSBudWxsICYmICh0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblNxdWFyZUJyYWNlKSkgewotCQl0eXBlLnB1c2godG9rZW4gLCB0b2tlbkRlbGltaXRlcik7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkvLyBJZiB0aGUgdHlwZSBpcyBpbmNvbXBsZXRlIGFuZCB0aGUgdG9rZW4gaXMgYSAoIHRoZW4gcHVzaCBpdCBvbnRvIHRoZSB0eXBlIGFuZCBvcGVuIHRoZSBwYXJlbnMKLQlpZiAoIXR5cGUuaXNBcnJheSgpKXsKLQkJaWYgKHR5cGUuZ2V0VHlwZUNsYXNzKCkgPT0gbnVsbCAmJiAhYXJnc09wZW5lZCAmJiBpc0RlbGltaXRlck9wZW5lZCh0b2tlbkRlbGltaXRlcikpIHsKLQkJCWFyZ3NPcGVuZWQgPSB0cnVlOwotCQkJaW5zaWRlQXJnc09wZW5lZFBhcmVuID0gdHJ1ZTsKLQkJCXR5cGUucHVzaCh0b2tlbiAsIERlbGltaXRlclNwYWNlICk7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0gZWxzZSB7IAotCQlpZiAoICFhcmdzT3BlbmVkICYmIGlzRGVsaW1pdGVyT3BlbmVkKHRva2VuRGVsaW1pdGVyKSkgewotCQkJYXJnc09wZW5lZCA9IHRydWU7Ci0JCQlpbnNpZGVBcmdzT3BlbmVkUGFyZW4gPSB0cnVlOwotCQkJcmV0dXJuIHRoaXM7CQkJCi0JCX0KLQl9Ci0JCi0JLy8gSWYgdGhlIGFyZ3MgYXJlIGFscmVhZHkgY2xvc2VkIGFuZCB3ZSBnZXQgYW5vdGhlciBjbG9zZSBleHByZXNzaW9uLCB0aGVuIGp1c3QgcmV0dXJuIG91cnNlbHZlcwotCS8vIFRoaXMgb2NjdXJzIGluIHRoZSBjYXNlIG9mIG5lc3RlZCBhcnJheSBhcmd1bWVudHMgd2l0aGluIGNvbnN0cnVjdG9ycwotCWlmICggYXJnc0Nsb3NlZCAmJiAodG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbikpewotCQlmSXNDb21wbGV0ZSA9IHRydWU7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvLyBJZiB0aGUgYXJndW1lbnRzIGFyZSBjbG9zZWQgYW5kIHdlIHJlY2VpdmUgYSB7IHRoZW4gdGhpcyBpcyBhbiBpbm5lciBjbGFzcyBkZWNsYXJhdGlvbiwgZS5nLgotCS8vIG5ldyBqYXZheC5zd2luZy50YWJsZS5EZWZhdWx0VGFibGVNb2RlbCgpe30KLQkvLyBUaGlzIGNhbid0IGJlIHByb2Nlc3NlZCBieSB1cyBzbyB3ZSBuZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbgotCWlmIChhcmdzQ2xvc2VkICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5FbGlwc2UgKSB7Ci0JCXRocm93IG5ldyBDYW5ub3RQcm9jZXNzSW5uZXJDbGFzc2VzRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gSWYgdGhlIGFyZ3MgYXJlIG9wZW5lZCBhbmQgYSB0b2tlbiB3YXMgc3VwcGxpZWQgdGhlbiBpdCBtdXN0IGJlIGFuIGFyZ3VtZW50Ci0JaWYgKGFyZ3NPcGVuZWQpewotCQkvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYW4gaW5jb21wbGV0ZSBhcmd1bWVudCB0aGVuIHRoaXMgbWF5IGJlIGEgY29uc3RydWN0b3IsIGEgc3RhdGljIHJlZmVyZW5jZSwgZXRjLi4uCi0JCS8vIGFuZCB3ZSBzaG91bGQgZm9yd2FyZCB0aGUgcmVxdWVzdCB0byB0aGUgYXJndW1lbnQKLQkJRXhwcmVzc2lvbiBvcGVuQXJndW1lbnQgPSBudWxsOwotCQlpZiAoIGFyZ3VtZW50cy5zaXplKCkgPiAwICl7Ci0JCQlvcGVuQXJndW1lbnQgPSAoRXhwcmVzc2lvbilhcmd1bWVudHMuZ2V0KGFyZ3VtZW50cy5zaXplKCktMSk7Ci0JCQlpZiAoICFvcGVuQXJndW1lbnQuaXNDb21wbGV0ZSgpICkgewotCQkJCW9wZW5Bcmd1bWVudC5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCQkvLyBJZiB0aGUgYXJndW1lbnQgaXMgY29tcGxldGUgYW5kIHdlIHJlY2VpdmVkIGEgKSB0aGVuIHRoZSBjb25zdHJ1Y3RvciBpcyBjb21wbGV0ZQotCQkJCS8vIG9yIGlmIHdlIHJlY2VpdmUgYSB9IGFuZCBhcmUgYW4gYXJyYXkgd2UgYXJlIGNvbXBsZXRlCi0JCQkJaWYgKCBvcGVuQXJndW1lbnQuaXNDb21wbGV0ZSgpICYmIGlzRGVsaW1pdGVyQ2xvc2VkKHRva2VuRGVsaW1pdGVyKSApewotCQkJCQlhcmdzQ2xvc2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9IAotCQl9Ci0JCQkKLQkJRXhwcmVzc2lvbiBuZXdBcmd1bWVudCA9IG51bGw7Ci0JCS8vIElmIHdlIGFyZSBub3QgYWxyZWFkeSBpbnNpZGUgdGhlIG9wZW4gYXJnIGFuZCB3ZSBnZXQgYW5vdGhlciBvcGVuIHBhcmVuIHRoaXMgaXMgcHJvYmFibHkgYSBjYXN0Ci0JCS8vIG9yIHNvbWUga2luZCBvZiBzdGF0ZW1lbnQsIGFuZCBPcGVyTWludXMgaXMgcHJvYmFibHkgdGhlIHN0YXJ0IG9mIGEgbnVtYmVyCi0JCS8vIElmIHRoZSBhcmdzIGFyZSBub3QgYWxyZWFkeSBvcGVuIHdlIG11c3QgYmUgb3BlbmVkIHdpdGggZWl0aGVyIGEgeyBvciBhICggZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlIGFuIGFycmF5IG9yIG5vdAotCQkvLyBob3dldmVyIGlmIHRoZSBhcmdzIGFyZSBvcGVuZWQgYWxyZWFkeSBhbmQgd2UgcmVjZWl2ZSBhICggdGhlbiB0aGlzIGlzIHRoZSBzdGFydCBvZiBhIG5ldyBzdGF0ZW1lbnQKLS8vCQlpZiAoKCFpbnNpZGVBcmdzT3BlbmVkUGFyZW4gJiYgaXNEZWxpbWl0ZXJPcGVuZWQodG9rZW5EZWxpbWl0ZXIpKSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pewotCQlpZiAodG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlbkVsaXBzZSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pewotCQkJaW5zaWRlQXJnc09wZW5lZFBhcmVuID0gdHJ1ZTsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJaWYgKCBuZXdBcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5QXJndW1lbnRzICkgewotCQkJCSgoQXJyYXlBcmd1bWVudHMpbmV3QXJndW1lbnQpLnNldFR5cGUodHlwZSk7Ci0JCQl9Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBNZXNzYWdlQXJndW1lbnQobmV3QXJndW1lbnQpOwotCQkJYXJndW1lbnRzLmFkZChuZXdBcmd1bWVudCk7Ci0KLQkJfQotCQkKLQkJLy8gU3RhcnQgb2YgYSBwb3NzaWJsZSBzdHJpbmcgb3IgbnVtYmVyIG9yIGNoYXJhY3RlcgotCQlpZiAoICggdG9rZW4ubGVuZ3RoID4gMCB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJRdW90ZSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJTaW5nbGVRdW90ZSkgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gT3Blck1pbnVzICl7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IE1lc3NhZ2VBcmd1bWVudChuZXdBcmd1bWVudCk7Ci0JCQlhcmd1bWVudHMuYWRkKG5ld0FyZ3VtZW50KTsKLQkJfQotCQkvLyBJZiB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGFyZ3VtZW50IGlzIGEgKSB0aGVuIHRoZSBtZXNzYWdlIGlzIGJlaW5nIGNsb3NlZAotCQlpZiAoICFpbnNpZGVBcmdzT3BlbmVkUGFyZW4gfHwgYXJndW1lbnRzQXJlQ29tcGxldGUoKSAmJiBpc0RlbGltaXRlckNsb3NlZCh0b2tlbkRlbGltaXRlcikgKSB7Ci0JCQlhcmdzQ2xvc2VkID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWlmICggaW5zaWRlQXJnc09wZW5lZFBhcmVuICYmIGlzRGVsaW1pdGVyQ2xvc2VkKHRva2VuRGVsaW1pdGVyKSApIHsKLQkJCWluc2lkZUFyZ3NDbG9zZWRQYXJlbiAgPSB0cnVlOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQotCQkvLyBJZiB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGFyZ3VtZW50IGlzIGEgLCBvciBhICcgJyB0aGVuIHRoZSBhcmd1bWVudCBpcyBiZWluZyBjbG9zZWQKLQkJaWYgKCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDb21tYSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJTcGFjZSApIHsKLQkJCS8vIElmIG91ciBhcmd1bWVudHMgYXJlIGNsb3NlZCB0aGVuIHdlIG11c3QgYmUgY29tcGxldGUuICBXZSBuZWVkIHRvIHNpZ25hbCB0aGUgZmFjdCB3ZSBhcmUgY2xvc2VkCi0JCQkvLyBvdGhlcndpc2Ugd2Ugd2lsbCBub3QgYmUgcHJvY2Vzc2VkIGNvcnJlY3RseSBpZiB3ZSBhcmUgcGFydCBvZiBhIHN0YWNrIAotCQkJaWYgKCBhcmdzQ2xvc2VkICkgewotCQkJCWZJc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCX0JCQkKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCQotCQkvLyBJZiB3ZSByZWNlaXZlIGEgY2xvc2UgYnJhY2tldCB0aGVuIHdlIGFyZSBjbG9zZWQgYXMgbG9uZyBhcyB0aGUgbGFzdCBhcmd1bWVudCBpcyBjbG9zZWQKLQkJaWYoYXJnc09wZW5lZCAmJiAgaXNEZWxpbWl0ZXJDbG9zZWQodG9rZW5EZWxpbWl0ZXIpKXsKLQkJCS8vIE5vIHBhcm1zIC0gd2UgYXJlIGEgY2xvc2VkIGNvbnN0cnVjdG9yCi0JCQlpZihhcmd1bWVudHMuc2l6ZSgpID09IDApewotCQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJCXJldHVybiB0aGlzOwotCQkJfSAKLQkJfQotCQkKLQkJLy8gSWYgb3VyIGxhc3QgYXJndW1lbnQgaXMgY2xvc2VkIGFuZCByZWNlaXZlIGEgKSBhbmQgd2UgaGF2ZSBubyBuZXcgYXJndW1lbnQgdGhlbiB3ZSBhcmUgY2xvc2VkCi0JCWlmICh0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuICYmIG5ld0FyZ3VtZW50ID09IG51bGwpewotCQkJRXhwcmVzc2lvbiBsYXN0QXJndW1lbnQgPSAoRXhwcmVzc2lvbilhcmd1bWVudHMuZ2V0KGFyZ3VtZW50cy5zaXplKCktMSk7Ci0JCQlpZiAoIGxhc3RBcmd1bWVudC5pc0NvbXBsZXRlKCkgKSB7Ci0JCQkJYXJnc0Nsb3NlZCA9IHRydWU7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9Ci0JCX0JCQkKLQkJCQkKLQkJLy8gT3RoZXJ3aXNlIHRoZSBuZXcgYXJndW1lbnQgaXMgc3RpbCBwcm9jZXNzaW5nLiAgUmV0dXJuIGl0Ci0JCXJldHVybiBuZXdBcmd1bWVudDsKLQl9Ci0KLQlyZXR1cm4gdGhpczsKLX0KLXByb3RlY3RlZCBib29sZWFuIGFyZ3VtZW50c0FyZUNvbXBsZXRlKCl7Ci0JaWYgKCBhcmd1bWVudHMuc2l6ZSgpID09IDApIHJldHVybiB0cnVlOwotCXJldHVybiAoKEV4cHJlc3Npb24pYXJndW1lbnRzLmdldChhcmd1bWVudHMuc2l6ZSgpLTEpKS5pc0NvbXBsZXRlKCk7Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0KLQlqYXZhLmlvLlN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIkNvbnN0cnVjdG9yIFwiIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIHR5cGUgIT0gbnVsbCApIHsKLQkJd3JpdGVyLndyaXRlKHR5cGUudHlwZVdyaXRlci50b1N0cmluZygpKTsKLQl9IGVsc2UgewotCQl3cml0ZXIud3JpdGUoIlVOVFlQRUQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCkgOyBpKyspewotCQl3cml0ZXIud3JpdGUoIiBBcmcoIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKCIiICsgKGkrMSkpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZSgiKSA9ICIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZShhcmd1bWVudHMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci0KLX0KLQotLyoqCi0gKiBUaGlzIGlzIG5ldmVyIHByaW1pdGl2ZQotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0V2YWx1YXRpb25FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvRXZhbHVhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDk3Y2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvRXZhbHVhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEV2YWx1YXRpb25FeGNlcHRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uLCBidXQKLSAqIGluIGFkZGl0aW9uLCB0aGUgZXhjZXB0aW9uIHRoYXQgaXQgd3JhcHBlcnMgaXMgd2hhdCBzaG91bGQgYmUKLSAqIHJldHVybmVkLiBUaGlzIG1lYW5zIGl0IHdhcyBhIHZhbGlkIGV4Y2VwdGlvbiwgcGFyc2luZyBoYWQKLSAqIGdvbmUgZmluZSwgYnV0IGl0IHdhcyBhbiBldmFsdWF0aW9uIHRoYXQgb2NjdXJlZC4gVGhpcyBpcwotICogZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSBzdHJhaWdodCBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24sCi0gKiB3aGljaCBtZWFucyBzb21lIGVycm9yIGR1cmluZyBwYXJzaW5nIGFuZCBldmFsdWF0aW9uLgotICogCi0gKiBOb3RlOiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9ucyB3aWxsIGJlIHVud3JhcHBlcmVkIHRvIHRoZSB0cnVlIGV4Y2VwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEV2YWx1YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjk5NzIzOTAyMTg4NTMxMDk4Nkw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmV0dXJuYWJsZUV4Y2VwdGlvbi4KLQkgKiBAcGFyYW0gZXhjCi0JICovCi0JcHVibGljIEV2YWx1YXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGV4YykgewotCQlzdXBlcihleGMgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uID8gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBleGMpLmdldFRhcmdldEV4Y2VwdGlvbigpIDogZXhjKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvRXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9FeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlN2VjMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9FeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEV4cHJlc3Npb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzAxLzAwIDg6NDY6NDQgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uIGltcGxlbWVudHMgSVBhcnNlckNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIEV4cHJlc3Npb24gY3VycmVudEV4cHJlc3Npb247Ci0JcHJvdGVjdGVkIExpc3QgZkV4cHJlc3Npb25TdGFjazsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZkNsYXNzTG9hZGVyOwotCXB1YmxpYyBpbnQgcGFyZW50aGVzaXNMZXZlbCA9IDA7Ci0vKiogQ29tcGFyZSB0aGUgdHdvIGNoYXIgYXJyYXlzCi0gKi8KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlKGNoYXJbXSBmcm9tICwgY2hhcltdIHRvKXsKLQotCXJldHVybiBBcnJheXMuZXF1YWxzKGZyb20sIHRvKTsKLX0KLS8qKgotICogRXhwcmVzc2lvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotICogTm90ZTogSWYgYW55IGV4Y2VwdGlvbnMgdGhhdCBhcmUgZHVlIHRvIGV2YWx1YXRpb24sIGFuZCBub3QgZHVlIHRvIHNvbWUKLSAqIGludmFsaWQgc3RhdGUsIHRoZW4gdGhlIGV4Y2VwdGlvbiBzaG91bGQgYmUgd3JhcHBlcmVkIGluIGFuIEV2YWx1YXRpb25FeGNlcHRpb24sCi0gKiBhbmQgdGhlIEV2YWx1YXRpb25FeGNlcHRpb24gdGhyb3duIGluc3RlYWQuIFRoaXMgd2F5IHdlIGNhbiBkaXN0aW5xdWlzaCBiZXR3ZWVuCi0gKiB2YWxpZCBleGNlcHRpb25zIHRoYXQgcmVzdWx0IGV2YWx1YXRpb25zIChzdWNoIGFzIG51bGwgcG9pbnRlciBleGNlcHRpb25zKSBmcm9tCi0gKiBwYXJzZXIgZXJyb3JzIGR1ZSB0byBzdHJpbmcgaXMgdG9vIGNvbXBsaWNhdGVkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb21wbGV0ZSgpOwotLyoqCi0gKiBSZXR1cm4gYSBjbGFzcyB0eXBlIHRoYXQgdGhlIGV4cHJlc3Npb24gc3ludGFjdGljYWxseSB3b3VsZCBwcm9kdWNlLgotICogRm9yIGV4YW1wbGUsIGlmIGEgZmllbGQgaXMgb2YgdHlwZSBYWVosIHJldHVybiBYWVosIGV2ZW4gdGhvdWdoCi0gKiB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG1heSBiZSBTdWJYWVogd2hlcmUgU3ViWFlaIGlzIGEgc3ViY2xhc3Mgb2YgWFlaLgotICovCi1wdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLS8qKgotICogSW4gZXZhbHVhdGlvbiBwaGFzZSwgZ2V0IHRoZSB0eXBlIGNsYXNzIGZyb20gdGhlIGV4cHJlc3Npb24uCi0gKiBJZiB0eXBlY2xhc3Mgbm90IGZvdW5kLCB0aGVuIGEgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93bi4KLSAqIEBwYXJhbSBleHAgVG8gZ2V0VHlwZUNsYXNzIGZyb20KLSAqIEByZXR1cm4gdHlwZSBjbGFzcy4KLSAqIEB0aHJvd3MgRXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdHlwZSBub3QgZm91bmQuCi0gKi8KLXB1YmxpYyBDbGFzcyBnZXRFdmFsdWF0aW9uVHlwZUNsYXNzKEV4cHJlc3Npb24gZXhwKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlDbGFzcyBjbHMgPSBleHAuZ2V0VHlwZUNsYXNzKCk7Ci0JaWYgKGNscyA9PSBudWxsKQotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihleHAuZ2V0VHlwZUNsYXNzTmFtZSgpKSk7Ci0JcmV0dXJuIGNsczsKLX0KLQotLyoqCi0gKiBAcmV0dXJuIFR5cGUgbmFtZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgZXhwcmVzc2lvbi4KLSAqLwotcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCk7Ci0KLXB1YmxpYyBib29sZWFuIGlzTnVtYmVyKGNoYXJbXSB0b2tlbil7Ci0KLQlpZiAoIHRva2VuLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7Ci0JLy8gU2VlIHdoZXRoZXIgdGhlIHRva2VuIGlzIGEgbnVtYmVyCi0JaW50IHBhcnNlUG9zaXRpb24gPSAwOwotCS8vIFRha2UgaW50byBhY2NvdW50IGl0IG1heSBzdGFydCB3aXRoIGEgLSBzaWduLCBlLmcuIC0xCi0JaWYgKCB0b2tlblswXSA9PSAnLScgKSBwYXJzZVBvc2l0aW9uID0gMTsKLQlmb3IgKGludCBpID0gcGFyc2VQb3NpdGlvbjsgaSA8IHRva2VuLmxlbmd0aCA7IGkrKyl7Ci0JCS8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgZGlnaXQgcmV0dXJuIHRydWUKLQkJLy8gT3RoZXIgdGhpbmdzIGxpa2UgZGVjaW1hbHMgb3IgcHJpbWl0aXZlIHR5cGVzLCBlLmcuIDIuMiBvciAyLjJmIGFyZSAKLQkJLy8gaGFuZGxlZCBieSBOdW1iZXJMaXRlcmFsCi0JCXJldHVybiBDaGFyYWN0ZXIuaXNEaWdpdCh0b2tlbltpXSk7Ci0JfQotCXJldHVybiB0cnVlOwotfQotcHVibGljIGJvb2xlYW4gaXNQb3AoKXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBwb3BFeHByZXNzaW9uU3RhY2soKXsKLQotCWlmICggZkV4cHJlc3Npb25TdGFjayAhPSBudWxsICYmIGZFeHByZXNzaW9uU3RhY2suc2l6ZSgpID4gMCApIHsKLQkJY3VycmVudEV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbikgZkV4cHJlc3Npb25TdGFjay5yZW1vdmUoZkV4cHJlc3Npb25TdGFjay5zaXplKCktMSk7Ci0JfQkKLX0KLXByb3RlY3RlZCB2b2lkIHB1c2hFeHByZXNzaW9uU3RhY2soRXhwcmVzc2lvbiBhbkV4cHJlc3Npb24pewotCi0JaWYgKCBmRXhwcmVzc2lvblN0YWNrID09IG51bGwgKSBmRXhwcmVzc2lvblN0YWNrID0gbmV3IEFycmF5TGlzdCgyKTsKLQkvLyBUaGUgY3VycmVudCBleHByZXNzaW9uIHNob3VsZCBnbyBvbnRvIHRoZSBzdGFjawotCWZFeHByZXNzaW9uU3RhY2suYWRkKGN1cnJlbnRFeHByZXNzaW9uKTsKLQkvLyBUaGUgY3VycmVudCBleHByZXNzaW9uIGlzIHJlcGxhY2VkIHdpdGggdGhlIGFyZ3VtZW50Ci0JY3VycmVudEV4cHJlc3Npb24gPSBhbkV4cHJlc3Npb247Ci0JCi19CQotCi12b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcil7Ci19Ci0KLS8qKgotICogUHVzaCBhbiBleHByZXNzaW9uIG9udG8gdXMKLSAqIFJldHVybiB0aGUgbmV3IGV4cHJlc3Npb24gb250byB3aGljaCBzdWJzZXF1ZW50IHRva2VuIHNob3VsZCBiZSBwdXNoZWQKLSAqLwotcHVibGljIGFic3RyYWN0IEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIHRva2VuRGVsaW1pdGVyKTsKLQotLyoqCi0gKiBBbnN3ZXIgaWYgdGhpcyBleHByZXNzaW9uIHJlc3VsdHMgaW4gYSBwcmltaXRpdmUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUHJpbWl0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgZGVwdGgsIGJvb2xlYW4gYUJyZWFrKXsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWlmICggYUJyZWFrICkgewotCQlidWZmZXIuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eSgiU3lzdGVtLmxpbmVTZXBhcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JZm9yKGludCBpPTA7aTxkZXB0aDtpKyspewotCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JYnVmZmVyLmFwcGVuZCh0b1N0cmluZygpKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0ZpZWxkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0ZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTg0OGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9GaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBGaWVsZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDUvMDAgMTA6Mzk6MjggUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZCBleHRlbmRzIEV4cHJlc3Npb24gewotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGU7Ci0JcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZGaWVsZDsKLQlwdWJsaWMgRXhwcmVzc2lvbiByZWNlaXZlcjsKLQlwdWJsaWMgU3RyaW5nIGZpZWxkTmFtZTsKLQlwcm90ZWN0ZWQgQ2xhc3MgZlJlc3VsdFR5cGU7Ci0JCi1wdWJsaWMgRmllbGQoRXhwcmVzc2lvbiBhUmVjZWl2ZXIgLCBjaGFyW10gdG9rZW4gLCBDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpewotCi0JcmVjZWl2ZXIgPSBhUmVjZWl2ZXI7Ci0JaWYgKCB0b2tlbi5sZW5ndGggPiAwICl7Ci0JCWZpZWxkTmFtZSA9IG5ldyBTdHJpbmcodG9rZW4pOwotCX0KLQotfQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpewotCXJldHVybiBpc0NvbXBsZXRlOwotfQotCi0vKioKLSAqIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHJlY2VpdmVyCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlPYmplY3QgcmVjZWl2ZXJWYWx1ZSA9IHJlY2VpdmVyLmV2YWx1YXRlKCk7CS8vIFNvIGlmIGl0IGZhaWxzLCB3ZSBnZXQgYW4gZXZhbHVhdGlvbiBleGNlcHRpb24gZ29pbmcgb24gdXAuCi0JdHJ5IHsKLQkJY2FjaGVGaWVsZCgpOwkJCi0JCXJldHVybiBmRmllbGQuZ2V0KHJlY2VpdmVyVmFsdWUpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwkvLyBBbnkgZXhjZXB0aW9uIGF0IHRoaXMgcG9pbnQgaXMgYW4gZXZhbHVhdGlvbiBleGNlcHRpb24uCi0JfQotfQotCi0vKioKLSAqIEdldCB0aGUgZmllbGQgZnJvbSByZWZsZWN0aW9uLgotICovCi1wcm90ZWN0ZWQgdm9pZCBjYWNoZUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JaWYgKGZGaWVsZCA9PSBudWxsKSB7Ci0JCUNsYXNzIGFSZWNlaXZlckNsYXNzID0gZ2V0RXZhbHVhdGlvblR5cGVDbGFzcyhyZWNlaXZlcik7Ci0JCWZGaWVsZCA9IGFSZWNlaXZlckNsYXNzLmdldEZpZWxkKGZpZWxkTmFtZSk7Ci0JCWZSZXN1bHRUeXBlID0gZkZpZWxkLmdldFR5cGUoKTsJCQotCX0KLX0KLQotLyoqCi0gKiBUaGUgcmVzdWx0IHR5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIGZpZWxkLgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JaWYgKCBmUmVzdWx0VHlwZSA9PSBudWxsICkgewotCQljYWNoZUZpZWxkKCk7Ci0JfQotCXJldHVybiBmUmVzdWx0VHlwZTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiAiIjsJLy8gSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSBkb24ndCBrbm93IHdoYXQgaXQgaXMuIC8vJE5PTi1OTFMtMSQKLX0KLS8qKgotICogcHVzaCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4sIGNoYXIgdG9rZW5EZWxpbWl0ZXIpIHsKLQotCS8vIElmIHRoZSBkZWxpbWl0ZXIgaXMgYSAoIHRoZW4gdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlCi0JaWYgKCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4gKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZSh0aGlzICwgdG9rZW4gLCBmQ2xhc3NMb2FkZXIpOwotCX0KLQotCS8vIElmIHRoZSBkZWxpbWl0ZXIgaXMgYSAuIHRoZW4gdGhpcyBpcyBhIGZpZWxkCi0JaWYgKHRva2VuLmxlbmd0aCA+IDAgICYmICggdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclNwYWNlCi0JfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEpKSB7Ci0JCWlzQ29tcGxldGUgPSB0cnVlOwotCQlyZXR1cm4gbmV3IEZpZWxkKHRoaXMgLCB0b2tlbiAsIGZDbGFzc0xvYWRlcik7Ci0JCQotCX0KLQkKLQlpZihmaWVsZE5hbWUgIT0gbnVsbCAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDb21tYSl7Ci0JCWlzQ29tcGxldGUgPSB0cnVlOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JLy8gSWYgd2UgaGF2ZSBubyBkZWxpbWl0ZXIgb3IgYSBjbG9zZSBwYXJlbiB0aGVuIHdlIGhhdmUganVzdCByZWNlaXZlZCB0aGUgZmllbGQgbmFtZQotCWlmICghaXNDb21wbGV0ZSAmJiBmaWVsZE5hbWUgPT0gbnVsbCkgewotCQlmaWVsZE5hbWUgPSBuZXcgU3RyaW5nKHRva2VuKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCWlmKHRva2VuRGVsaW1pdGVyID09IEJpdE9SIHx8IHRva2VuRGVsaW1pdGVyID09IEJpdEFORCl7Ci0JCWlzQ29tcGxldGUgPSB0cnVlOwotCQlQcmltaXRpdmVPcGVyYXRpb24gcmVzdWx0ID0gbmV3IFByaW1pdGl2ZU9wZXJhdGlvbih0aGlzLHRva2VuRGVsaW1pdGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLy8gSWdub3JlIHNwYWNlcyBhcyB0aGlzIG1heWJlIHBhZGRpbmcgYmV0d2VlbiB0aGUgZmllbGQgYW5kIHRoZSBuZXh0IHZhbGlkIHRva2VuCi0JaWYodG9rZW4ubGVuZ3RoID09IDAgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gJyAnKSByZXR1cm4gdGhpczsKLQotCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eUluaXRQYXJzZXJNZXNzYWdlcy5nZXRTdHJpbmcoUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuVU5FWFBFQ1RFRF9UT0tFTiksIG5ldyBPYmplY3RbXSB7bmV3IFN0cmluZ0J1ZmZlcih0b2tlbi5sZW5ndGgrMSkuYXBwZW5kKHRva2VuKS5hcHBlbmQodG9rZW5EZWxpbWl0ZXIpLnRvU3RyaW5nKCl9KSk7Ci0JCi19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0KLQlqYXZhLmlvLlN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIkZpZWxkIE5hbWU9XCIiKTsgLy8kTk9OLU5MUy0xJAotCWlmICggZmllbGROYW1lICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZShmaWVsZE5hbWUpOwotCX0gZWxzZSB7Ci0JCXdyaXRlci53cml0ZSgiVU5OQU1FRCIpOyAvLyROT04tTkxTLTEkCi0JfQotCXdyaXRlci53cml0ZSgiXCIgUmVjZWl2ZXI9Iik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIHJlY2VpdmVyICE9IG51bGwgKXsKLQkJd3JpdGVyLndyaXRlKHJlY2VpdmVyLnRvU3RyaW5nKCkpOwotCX0gZWxzZSB7Ci0JCXdyaXRlci53cml0ZSgiTk9ORSIpOyAvLyROT04tTkxTLTEkCi0JfQotCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLQotfQotCi0vKioKLSAqIFRlc3QgdGhlIGZpZWxkIHR5cGUgdG8gZGV0ZXJtaW5lIGlmIHByaW1pdGl2ZSBvciBub3QuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JY2FjaGVGaWVsZCgpOwotCXJldHVybiBnZXRUeXBlQ2xhc3MoKS5pc1ByaW1pdGl2ZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9JUGFyc2VyQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0lQYXJzZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwYzIyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0lQYXJzZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBJUGFyc2VyQ29uc3RhbnRzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLS8qKgotICogQ29uc3RhbnRzIGZvciB0aGUgcGFyc2VyLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzA1LzAwIDk6Mzc6NDUgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBhcnNlckNvbnN0YW50cyB7Ci0JLy8gRGVmaW5lIHRoZSBkZWxpbWl0ZXJzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlclNwYWNlID0gJyAnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJQZXJpb2QgPSAnLic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlck9wZW5QYXJlbiA9ICcoJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyQ2xvc2VQYXJlbiA9ICcpJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyQ29tbWEgPSAnLCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlclF1b3RlID0gJyInOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJFc2NhcGUgPSAnXFwnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJTaW5nbGVRdW90ZSA9ICdcJyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlck9wZW5FbGlwc2UgPSAneyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlckNsb3NlRWxpcHNlID0gJ30nOwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyT3BlblNxdWFyZUJyYWNlID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJDbG9zZVNxdWFyZUJyYWNlID0gJ10nOwotCS8vIERlZmluZSB0aGUgbWF0aCBmdW5jdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT3BlclBsdXMgPSAnKyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9wZXJNaW51cyA9ICctJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT3Blck11bHRpcGx5ID0gJyonOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPcGVyRGl2aWRlID0gJy8nOwotCS8vIERlZmluZSB0aGUgcHJpbWl0aXZlIGZ1bmN0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBCaXRPUiA9ICd8JzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQml0QU5EID0gJyYnOwotCQotCS8vIERlZmluZSBjb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDb25zdGFudE5ldyA9IG5ldyBjaGFyW10geyAnbicgLCAnZScgLCAndycgfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDb25zdGFudFRydWUgPSBuZXcgY2hhcltdIHsgJ3QnICwgJ3InICwgJ3UnICwgJ2UnIH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ29uc3RhbnRGYWxzZSA9IG5ldyBjaGFyW10geyAnZicgLCAnYScgLCAnbCcgLCAncycgLCAnZScgfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDb25zdGFudE51bGwgPSBuZXcgY2hhcltdIHsgJ24nICwgJ3UnICwgJ2wnICwgJ2wnIH07Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0luaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Jbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmM2NhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0luaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi0KLXB1YmxpYyBjbGFzcyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQotCQotLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODYzMzM5MDkyNjIxMDI3NjcyN0w7Ci1wdWJsaWMgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBleGMpewotCXN1cGVyKGV4Yyk7Ci19Ci1wdWJsaWMgVGhyb3dhYmxlIGdldE9yaWdpbmFsRXhjZXB0aW9uKCl7Ci0JcmV0dXJuIGdldENhdXNlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0luaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0luaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5M2NlODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Jbml0aWFsaXphdGlvblN0cmluZ1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wMS8wMCA4OjUzOjQ1IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyQ29uc3RhbnRzIHsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZkNsYXNzTG9hZGVyOwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcGxldGUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZJbml0U3RyaW5nOwotCXByb3RlY3RlZCBpbnQgZlNvdXJjZUxlbmd0aDsKLQlwcm90ZWN0ZWQgY2hhcltdIGZTb3VyY2U7Ci0JcHJvdGVjdGVkIGludCBmU291cmNlUG9zaXRpb24gPSAtMTsKLQlwcml2YXRlIGNoYXJbXSBmQ3VycmVudFRva2VuOwotCXByaXZhdGUgY2hhciBmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gMDsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGZFeHByZXNzaW9uU3RhY2sgPSBuZXcgQXJyYXlMaXN0KDQpOwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGZFeHByZXNzaW9uOwotLyoqCi0gKiBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIoU3RyaW5nIGluaXRTdHJpbmcpewotCi0JZkluaXRTdHJpbmcgPSBpbml0U3RyaW5nOwotCWZTb3VyY2UgPSBpbml0U3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JZlNvdXJjZUxlbmd0aCA9IGZTb3VyY2UubGVuZ3RoOwotCi19Ci0vKiogTG9vayBmb3IgYSBrbm93biB0b2tlbgotICovCi1wcm90ZWN0ZWQgdm9pZCBjcmVhdGVOZXh0VG9rZW4oKXsKLQotCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSAwOwotCWlmICggZlNvdXJjZVBvc2l0aW9uID49IGZTb3VyY2VMZW5ndGggLSAxICkgewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuOwotCX0KLQotCWZTb3VyY2VQb3NpdGlvbisrOwotCS8vIElmIHdlIGFyZSBub3QgaW4gYSB0b2tlbiB0aGVuIGxvb2sgZm9yICIgIiBvciBlbHNlIGZvciBhIHBlcmlvZAotCWNoYXJbXSBmQ3VycmVudFRva2VuU291cmNlID0gbmV3IGNoYXJbZlNvdXJjZUxlbmd0aF07Ci0JaW50IGkgPSAwOwotCXNjYW5uZXIgOiBmb3IgKCA7IGZTb3VyY2VQb3NpdGlvbiA8IGZTb3VyY2VMZW5ndGggOyBmU291cmNlUG9zaXRpb24rKyAsIGkrKyApewotCQkvLyBBZHZhbmNlIHRoZSBzb3VyY2UgcG9zaXRpb24gc28gd2hlbiBmaW5kaW5nIHRoZSBuZXh0IHRva2VuIHdlIHNraXAgb3ZlciB0aGUgJy4nIG9yICcgJwotCQkvLyBSZWNvcmQgdGhlIGRlbGltaXRlciB0aGF0IHdhcyBmb3VuZAotCQlzd2l0Y2ggKCBmU291cmNlW2ZTb3VyY2VQb3NpdGlvbl0gKSB7Ci0JCQljYXNlIERlbGltaXRlclBlcmlvZDogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJQZXJpb2Q7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyT3BlblBhcmVuOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlck9wZW5QYXJlbjsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQotCQkJY2FzZSBEZWxpbWl0ZXJDbG9zZVBhcmVuOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlckNsb3NlUGFyZW47Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyQ29tbWE6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyQ29tbWE7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyU3BhY2U6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyU3BhY2U7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyUXVvdGU6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyUXVvdGU7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyU2luZ2xlUXVvdGU6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyU2luZ2xlUXVvdGU7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0JCQkKLQkJCWNhc2UgRGVsaW1pdGVyRXNjYXBlOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlckVzY2FwZTsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQotCQkJY2FzZSBEZWxpbWl0ZXJPcGVuRWxpcHNlOnsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyT3BlbkVsaXBzZTsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQotCQkJY2FzZSBEZWxpbWl0ZXJPcGVuU3F1YXJlQnJhY2U6ewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJPcGVuU3F1YXJlQnJhY2U7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyQ2xvc2VTcXVhcmVCcmFjZTp7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlckNsb3NlU3F1YXJlQnJhY2U7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0JCQkKLQkJCWNhc2UgRGVsaW1pdGVyQ2xvc2VFbGlwc2U6ewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJDbG9zZUVsaXBzZTsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQkJCQkKLQkJCS8vIERvIHRoZSBtYXRoIGZ1bmN0aW9ucwotCQkJY2FzZSBPcGVyUGx1czogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBPcGVyUGx1czsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQotCQkJY2FzZSBPcGVyTWludXM6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gT3Blck1pbnVzOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIE9wZXJNdWx0aXBseTogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBPcGVyTXVsdGlwbHk7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgT3BlckRpdmlkZTogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBPcGVyRGl2aWRlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQkvLyBEbyB0aGUgcHJpbWl0aXZlIEJpdFdpc2Ugb3BlcmF0aW9ucwotCQkJY2FzZSBCaXRPUjogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBCaXRPUjsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQotCQkJY2FzZSBCaXRBTkQ6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gQml0QU5EOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9CQkJCi0JCQlkZWZhdWx0OiB7Ci0JCQkJZkN1cnJlbnRUb2tlblNvdXJjZVtpXSA9IGZTb3VyY2VbZlNvdXJjZVBvc2l0aW9uXTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIFB1c2ggdGhlIHRva2VuIG9udG8gdGhlIHN0YWNrIGZvciBsYXRlciBkZWNvZGluZwotCWlmICggaSA+PSAxICkgewotCQlmQ3VycmVudFRva2VuID0gbmV3IGNoYXJbaV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoIGZDdXJyZW50VG9rZW5Tb3VyY2UgLCAwICwgZkN1cnJlbnRUb2tlbiAsIDAgLCBpICk7Ci0JfSBlbHNlIHsKLQkJZkN1cnJlbnRUb2tlbiA9IG5ldyBjaGFyWzBdOwotCX0KLQotfQotLyoqIEFuc3dlciB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24KLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gewotCi0JdHJ5IHsKLQkJcmV0dXJuIGZFeHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCX0gY2F0Y2ggKEV2YWx1YXRpb25FeGNlcHRpb24gZSkgewotCQl0aHJvdyBlOwkvLyBEb24ndCBsb29zZSB0aGVzZQotCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCXRocm93IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24oZSk7Ci0JfQotCi19Ci1wdWJsaWMgc3RhdGljIE9iamVjdCBldmFsdWF0ZShTdHJpbmcgaW5pdFN0cmluZykgdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiB7Ci0KLQlyZXR1cm4gZXZhbHVhdGUoaW5pdFN0cmluZyxudWxsKTsKLQotfQotcHVibGljIHN0YXRpYyBPYmplY3QgZXZhbHVhdGUoU3RyaW5nIGluaXRTdHJpbmcsQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIHsKLQotCUluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIHBhcnNlciA9IG51bGw7OwotCXRyeSB7Ci0JCXBhcnNlciA9IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlcihpbml0U3RyaW5nKTsKLQkJcGFyc2VyLnNldENsYXNzTG9hZGVyKGFDbGFzc0xvYWRlcik7Ci0JCXBhcnNlci5wYXJzZSgpOwotCX0gY2F0Y2ggKCBUaHJvd2FibGUgZXhjICkgewotCQl0aHJvdyBuZXcgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uKGV4Yyk7Ci0JfQkJCi0JcmV0dXJuIHBhcnNlci5ldmFsdWF0ZSgpOwotfQotCi0vKioKLSAqIFJldHVybiBhIHBhcnNlciBhbHJlYWR5IHBhcnNlZC4gVXNlIHRoZSBkZWZhdWx0IGNsYXNzbG9hZGVyIChpLmUuIGNsYXNzbG9hZGVyIHRoYXQgbG9hZGVkIEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyKS4KLSAqIAotICogQHBhcmFtIGluaXRTdHJpbmcKLSAqIEByZXR1cm4gVGhlIHBhcnNlciwgYWxyZWFkeSBwYXJzZWQuCi0gKiBAdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbgotICovCi0KLXB1YmxpYyBzdGF0aWMgSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgY3JlYXRlUGFyc2VyKFN0cmluZyBpbml0U3RyaW5nKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIHsKLQlyZXR1cm4gY3JlYXRlUGFyc2VyKGluaXRTdHJpbmcsIG51bGwpOwotfQotIAotLyoqCi0gKiBSZXR1cm4gYSBwYXJzZXIgYWxyZWFkeSBwYXJzZWQuIFVzZSB0aGUgZ2l2ZW4gY2xhc3Nsb2FkZXIuCi0gKiAKLSAqIEBwYXJhbSBpbml0U3RyaW5nCi0gKiBAcGFyYW0gY2xhc3NMb2FkZXIKLSAqIEByZXR1cm4gVGhlIHBhcnNlciwgYWxyZWFkeSBwYXJzZWQuCi0gKiBAdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbgotICovCi1wdWJsaWMgc3RhdGljIEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIGNyZWF0ZVBhcnNlcihTdHJpbmcgaW5pdFN0cmluZywgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gewotCi0JdHJ5IHsKLQkJSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgcGFyc2VyID0gbmV3IEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyKGluaXRTdHJpbmcpOwotCQlwYXJzZXIuc2V0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotCQlwYXJzZXIucGFyc2UoKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9IGNhdGNoICggVGhyb3dhYmxlIGV4YyApIHsKLQkJdGhyb3cgbmV3IEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbihleGMpOwotCX0KLQotfQotCi0vKiogQW5hbHl6ZSB0aGUgc3RyaW5nCi0gKi8KLXB1YmxpYyB2b2lkIHBhcnNlKCl7Ci0JCi0JY3JlYXRlRmlyc3RFeHByZXNzaW9uKCk7Ci0JaW50IGkgPTE7Ci0Jd2hpbGUgKCB0cnVlICl7Ci0JCWNyZWF0ZU5leHRUb2tlbigpOwotCQlpZiAoIGlzQ29tcGxldGUgKSB7Ci0JCQkvLyBJZiB0aGUgY3VycmVudCBleHByZXNzaW9uIGlzIGluY29tcGxldGUgaXQgbXVzdCBiZSBjb21wbGV0ZWQgCi0JCQkvLyBieSB0aGUgZW5kLCB3aGljaCBpcyBiYXNpY2FsbHkgdGhlIGVxdWlhdmxlbnQgb2YgYTsKLQkJCXJldHVybjsKLQkJfSBlbHNlICB7Ci0JCQlpKys7Ci0JCQlFeHByZXNzaW9uIHJlc3VsdCA9IGZFeHByZXNzaW9uLnB1c2goIGZDdXJyZW50VG9rZW4gLCBmQ3VycmVudFRva2VuRGVsaW1pdGVyICk7Ci0JCQkvLyBJZiB0aGUgcmVzdWx0IGlmIGEgcHVzaCB0aGVuIHB1c2ggdGhlIHN0YWNrCi0JCQlpZiAoIHJlc3VsdC5pc0NvbXBsZXRlKCkgKSB7Ci0JCQkJcG9wRXhwcmVzc2lvblN0YWNrKCk7Ci0JCQl9IGVsc2UgaWYgKCByZXN1bHQgIT0gZkV4cHJlc3Npb24gKSB7Ci0JCQkJcHVzaEV4cHJlc3Npb25TdGFjayhyZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioKLSAqIEFuc3dlciBpZiB0aGUgc3RyaW5nIHJlc3VsdHMgaW4gYSBwcmltaXRpdmUuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJcmV0dXJuIGZFeHByZXNzaW9uLmlzUHJpbWl0aXZlKCk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQl9Ci19Ci0KLXB1YmxpYyBDbGFzcyBnZXRFeHBlY3RlZFR5cGUoKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIHsKLQl0cnkgewotCQlyZXR1cm4gZkV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQl9Ci19Ci0KLS8qIFBvcCB0aGUgdG9wIGV4cHJlc3Npb24gb2ZmIHRoZSBzdGFjawotICovCi1wcm90ZWN0ZWQgdm9pZCBwb3BFeHByZXNzaW9uU3RhY2soKXsKLQotCWlmICggZkV4cHJlc3Npb25TdGFjay5zaXplKCkgPiAwICkgewotCQlmRXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBmRXhwcmVzc2lvblN0YWNrLnJlbW92ZShmRXhwcmVzc2lvblN0YWNrLnNpemUoKS0xKTsKLQl9CQotfQotLyogUHVzaCB0aGUgZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjawotICovCi1wcm90ZWN0ZWQgdm9pZCBwdXNoRXhwcmVzc2lvblN0YWNrKEV4cHJlc3Npb24gYW5FeHByZXNzaW9uKXsKLQotCS8vIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gc2hvdWxkIGdvIG9udG8gdGhlIHN0YWNrCi0JZkV4cHJlc3Npb25TdGFjay5hZGQoZkV4cHJlc3Npb24pOwotCS8vIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXJndW1lbnQKLQlmRXhwcmVzc2lvbiA9IGFuRXhwcmVzc2lvbjsKLQkKLX0KLXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpcnN0RXhwcmVzc2lvbigpewotCWlmICggZkV4cHJlc3Npb24gPT0gbnVsbCApIHsKLQkJZkV4cHJlc3Npb24gPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcik7Ci0JfTsKLX0KLXB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcil7Ci0JZkNsYXNzTG9hZGVyID0gYUNsYXNzTG9hZGVyOwkKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQlTdHJpbmdCdWZmZXIgd3JpdGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXdyaXRlci5hcHBlbmQoIlBhcnNlci4gdG9rZW49XCIiKTsgLy8kTk9OLU5MUy0xJAotCWlmICggZkN1cnJlbnRUb2tlbiAhPSBudWxsICkgewotCQl3cml0ZXIuYXBwZW5kKGZDdXJyZW50VG9rZW4pOwotCX0gCi0Jd3JpdGVyLmFwcGVuZCgiXCIsIGRlbGltPVwiIik7IC8vJE5PTi1OTFMtMSQKLQl3cml0ZXIuYXBwZW5kKGZDdXJyZW50VG9rZW5EZWxpbWl0ZXIpOwotCXdyaXRlci5hcHBlbmQoIlwiLCBpbml0U3RyaW5nPVwiIik7IC8vJE5PTi1OTFMtMSQKLQl3cml0ZXIuYXBwZW5kKGZJbml0U3RyaW5nKTsKLQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL01lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxZTA3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL01lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogTWVzc2FnZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NZXRob2RIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhaWxpbmdQZXJpb2QgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTWV0aG9kIGZNZXRob2Q7Ci0JcHVibGljIEV4cHJlc3Npb24gcmVjZWl2ZXI7Ci0JcHVibGljIFN0cmluZyBtZXNzYWdlOwotCXB1YmxpYyBib29sZWFuIGFyZ3NDbG9zZWQgPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiBpbnNpZGVBcmdzT3BlbmVkUGFyZW4gPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiBpbnNpZGVBcmdzQ2xvc2VkUGFyZW4gPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBsZXRlID0gZmFsc2U7Ci0JcHVibGljIEFycmF5TGlzdCBhcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQotcHVibGljIE1lc3NhZ2UoRXhwcmVzc2lvbiBhUmVjZWl2ZXIgLCBjaGFyW10gdG9rZW4gLCBDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpewotCXJlY2VpdmVyID0gYVJlY2VpdmVyOwotCW1lc3NhZ2UgPSBuZXcgU3RyaW5nKHRva2VuKTsKLQlmQ2xhc3NMb2FkZXIgPSBhQ2xhc3NMb2FkZXI7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIGlzQ29tcGxldGU7Ci19Ci0KLS8qKgotICogU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgcmVjZWl2ZXIKLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWNhY2hlTWV0aG9kKCk7Ci0JCi0JLy8gR2V0IHRoZSBhcnJheSBvZiBhcmd1bWVudHMKLQlPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFthcmd1bWVudHMuc2l6ZSgpXTsKLQlJdGVyYXRvciBpdHIgPSBhcmd1bWVudHMuaXRlcmF0b3IoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCkgOyBpKyspewotCQlFeHByZXNzaW9uIGFuRXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKWl0ci5uZXh0KCk7Ci0JCWFyZ3NbaV0gPSBhbkV4cHJlc3Npb24uZXZhbHVhdGUoKTsKLQl9Ci0JCi0JT2JqZWN0IHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlci5ldmFsdWF0ZSgpOwkvLyBTbyBpZiBldmFsdWF0aW9uIGV4Y2VwdGlvbiB0aHJvd24sIHdlIGRvbid0IHdyYXBwZXIgYWdhaW4uCi0JCi0JdHJ5IHsKLQkJcmV0dXJuIGZNZXRob2QuaW52b2tlKHJlY2VpdmVyVmFsdWUsIGFyZ3MpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCX0KLX0KLQotLyoqCi0gKiBDYWNoZSB0aGUgbWVzc2FnZQotICovCi1wcm90ZWN0ZWQgdm9pZCBjYWNoZU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCWlmIChmTWV0aG9kID09IG51bGwpIHsKLQkJQ2xhc3NbXSBhcmdUeXBlcyA9IG5ldyBDbGFzc1thcmd1bWVudHMuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaXRyID0gYXJndW1lbnRzLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhcmdUeXBlcy5sZW5ndGg7IGkrKykKLQkJCWFyZ1R5cGVzW2ldID0gZ2V0RXZhbHVhdGlvblR5cGVDbGFzcygoRXhwcmVzc2lvbikgaXRyLm5leHQoKSk7Ci0JCQkKLQkJdHJ5IHsKLQkJCWZNZXRob2QgPSBNZXRob2RIZWxwZXIuZmluZENvbXBhdGlibGVNZXRob2QoZ2V0RXZhbHVhdGlvblR5cGVDbGFzcyhyZWNlaXZlciksIG1lc3NhZ2UsIGFyZ1R5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19Ci0KLQotLyoqCi0gKiBnZXRUeXBlQ2xhc3MgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQljYWNoZU1ldGhvZCgpOwotCXJldHVybiBmTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiAiIjsJLy8gSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSBkb24ndCBrbm93IHdoYXQgaXQgaXMuIC8vJE5PTi1OTFMtMSQKLX0KLS8qKgotICogcHVzaCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4sIGNoYXIgdG9rZW5EZWxpbWl0ZXIpIHsKLQkKLQkvLyBJZiB3ZSBhcmUgY2xvc2VkIGFuZCB3ZSByZWNlaXZlIGEgLiB3aXRoIG5vIHRva2VuIHRoZW4gcmVtZW1iZXIgdGhpcwotCWlmICggYXJnc0Nsb3NlZCAmJiAhdHJhaWxpbmdQZXJpb2QgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICYmIHRva2VuLmxlbmd0aCA9PSAwICkgewotCQl0cmFpbGluZ1BlcmlvZCA9IHRydWU7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkvLyBJZiB3ZSBoYXZlIGJlZW4gY2xvc2VkIHdpdGggYSAuIGFuZCB3ZSByZWNlaXZlIGEgLiB0aGVuIHdlIGFyZSBhIGZpZWxkCi0JaWYgKCB0cmFpbGluZ1BlcmlvZCAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QgKSB7Ci0JCXJldHVybiBuZXcgRmllbGQodGhpcyx0b2tlbixmQ2xhc3NMb2FkZXIpOwotCX0KLQkvLyBJZiB3ZSBoYXZlIGJlZW4gY2xvc2VkIHdpdGggYSAuIGFuZCB3ZSByZWNlaXZlIGEgKCB3ZSBhcmUgYSBtZXNzYWdlCi0JaWYgKCB0cmFpbGluZ1BlcmlvZCAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4gKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZSh0aGlzLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JfQotCQotCS8vIElmIHdlIGhhdmUgYmVlbiBjbG9zZWQgYW5kIHdlIHJlY2VpdmUgYSAsIG9yIGEgKSB3ZSBhcmUgY29tcGxldGUgLSB0aGlzIGlzIGEgc3RydWN0dXJhbCB0b2tlbiBpbnRlbmRlZCBmb3Igc29tZW9uZSBlbHNlLAotCS8vIHByb2JhYmx5IGEgbWVzc2FnZSBhcmd1bWVudCBsb3dlciBkb3duIHRoZSBzdGFjawotCWlmIChhcmdzQ2xvc2VkICYmICh0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDb21tYSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuKSl7Ci0JCWlzQ29tcGxldGUgPSB0cnVlOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0KLQkvLyBJZiB0aGUgYXJncyBhcmUgb3BlbmVkIGFuZCBhIHRva2VuIHdhcyBzdXBwbGllZCB0aGVuIGl0IG11c3QgYmUgYW4gYXJndW1lbnQKLQkvL2lmICggYXJnc09wZW5lZCAmJiAoIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEgfHwgCi0JLy90b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJTcGFjZSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJRdW90ZSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QpKSB7Ci0JaWYgKCFhcmdzQ2xvc2VkKXsJCi0JCWlmICggYXJndW1lbnRzLnNpemUoKSA+IDAgKXsKLQkJCUV4cHJlc3Npb24gb3BlbkFyZ3VtZW50ID0gKEV4cHJlc3Npb24pYXJndW1lbnRzLmdldChhcmd1bWVudHMuc2l6ZSgpLTEpOwotCQkJaWYgKCAhb3BlbkFyZ3VtZW50LmlzQ29tcGxldGUoKSApIHsKLQkJCQlvcGVuQXJndW1lbnQucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQkJLy8gSWYgdGhlIGFyZ3VtZW50IGlzIGNvbXBsZXRlIGFuZCB3ZSByZWNlaXZlZCBhICkgdGhlbiB0aGUgbWVzc2FnZSBpcyBjb21wbGV0ZQotCQkJCWlmICggb3BlbkFyZ3VtZW50LmlzQ29tcGxldGUoKSAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuKXsKLQkJCQkJYXJnc0Nsb3NlZCA9IHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQl9CQotCQkKLQkJLy8gV2UgbXVzdCBoYXZlIGEgbmV3IGFyZ3VtZW50IC0gcHJvY2VzcyBhY2NvcmRpbmdseQkKLQkJRXhwcmVzc2lvbiBuZXdBcmd1bWVudCA9IG51bGw7Ci0JCWlmICghaW5zaWRlQXJnc09wZW5lZFBhcmVuICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbil7Ci0JCQlpbnNpZGVBcmdzT3BlbmVkUGFyZW4gPSB0cnVlOwotCQkJbmV3QXJndW1lbnQgPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcikucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBNZXNzYWdlQXJndW1lbnQobmV3QXJndW1lbnQpOwotCQkJYXJndW1lbnRzLmFkZChuZXdBcmd1bWVudCk7Ci0KLQkJfQotCQlpZiAoIG5ld0FyZ3VtZW50ID09IG51bGwgJiYgKHRva2VuLmxlbmd0aCA+IDAgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUXVvdGUgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU2luZ2xlUXVvdGUgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuICkpIHsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJbmV3QXJndW1lbnQgPSBuZXcgTWVzc2FnZUFyZ3VtZW50KG5ld0FyZ3VtZW50KTsKLQkJCWFyZ3VtZW50cy5hZGQobmV3QXJndW1lbnQpOwotCQl9Ci0JCS8vIElmIHRoZSB0b2tlbiBhZnRlciB0aGUgYXJndW1lbnQgaXMgYSApIHRoZW4gdGhlIG1lc3NhZ2UgaXMgYmVpbmcgY2xvc2VkCi0JCWlmICggIWluc2lkZUFyZ3NPcGVuZWRQYXJlbiAgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbiApIHsKLQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJaWYgKCBpbnNpZGVBcmdzT3BlbmVkUGFyZW4gICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gKSB7Ci0JCQlpbnNpZGVBcmdzQ2xvc2VkUGFyZW4gID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0KLQkJLy8gSWYgdGhlIHRva2VuIGFmdGVyIHRoZSBhcmd1bWVudCBpcyBhICwgb3IgYSAnICcgdGhlbiB0aGUgYXJndW1lbnQgaXMgYmVpbmcgY2xvc2VkCi0JCWlmICggdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU3BhY2UgKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQkKLQkJLy8gT3RoZXJ3aXNlIHRoZSBuZXcgYXJndW1lbnQgaXMgc3RpbCBwcm9jZXNzaW5nLiAgUmV0dXJuIGl0Ci0vLwkJcmV0dXJuIG5ld0FyZ3VtZW50OwotCX0KLQkKLQkvLyBJZiB3ZSBkb24ndCBoYXZlIGEgbWVzc2FnZSB5ZXQsIHRoZW4gY29uc3VtZSB0aGlzIG9uZQotCWlmICggbWVzc2FnZS5sZW5ndGgoKSA9PSAwICkgewotCQltZXNzYWdlID0gbmV3IFN0cmluZyh0b2tlbik7Ci0JCXJldHVybiB0aGlzOwotCX0JCi0KLQlyZXR1cm4gdGhpczsJCi19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0KLQlqYXZhLmlvLlN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIk1zZyBOYW1lPVwiIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIG1lc3NhZ2UgIT0gbnVsbCApIHsKLQkJd3JpdGVyLndyaXRlKG1lc3NhZ2UpOwotCX0gZWxzZSB7Ci0JCXdyaXRlci53cml0ZSgiVU5OQU1FRCIpOyAvLyROT04tTkxTLTEkCi0JfQotCXdyaXRlci53cml0ZSgiXCIgUmN2PSgiKTsgLy8kTk9OLU5MUy0xJAotCWlmICggcmVjZWl2ZXIgIT0gbnVsbCApewotCQl3cml0ZXIud3JpdGUocmVjZWl2ZXIudG9TdHJpbmcoKSk7Ci0JfSBlbHNlIHsKLQkJd3JpdGVyLndyaXRlKCJOT05FIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0Jd3JpdGVyLndyaXRlKCcpJyk7Ci0JaWYgKCBhcmd1bWVudHMgIT0gbnVsbCApIHsKLQkJd3JpdGVyLndyaXRlKCJBcmdzKCIpOwkJIC8vJE5PTi1OTFMtMSQKLQkJSXRlcmF0b3IgaXRlciA9IGFyZ3VtZW50cy5pdGVyYXRvcigpOwotCQlpbnQgaT0xOwotCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQl3cml0ZXIud3JpdGUobmV3IEludGVnZXIoaSkudG9TdHJpbmcoKSk7Ci0JCQl3cml0ZXIud3JpdGUoJygnKTsKLQkJCXdyaXRlci53cml0ZShpdGVyLm5leHQoKS50b1N0cmluZygpKTsKLQkJCXdyaXRlci53cml0ZSgiKSwiKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXdyaXRlci53cml0ZSgnKScpOwkJCQkKLQl9Ci0JCi0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotCi19Ci0KLS8qKgotICogSXMgdGhlIG1lc3NhZ2UgcmVzdWx0IGEgcHJpbWl0aXZlLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWNhY2hlTWV0aG9kKCk7Ci0JcmV0dXJuIGZNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmlzUHJpbWl0aXZlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL01lc3NhZ2VBcmd1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlQXJndW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmODU4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL01lc3NhZ2VBcmd1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBNZXNzYWdlQXJndW1lbnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUFyZ3VtZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBsZXRlID0gZmFsc2U7Ci0JRXhwcmVzc2lvbiBmRXhwcmVzc2lvbjsKLQlBcnJheUxpc3QgZkV4cHJlc3Npb25TdGFjayA9IG5ldyBBcnJheUxpc3QoKTsKLQotcHVibGljIE1lc3NhZ2VBcmd1bWVudChFeHByZXNzaW9uIGFuRXhwcmVzc2lvbil7Ci0JZkV4cHJlc3Npb24gPSBhbkV4cHJlc3Npb247Ci19Ci0JCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JcmV0dXJuIGZFeHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JCi19CQotCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JcmV0dXJuIGZFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpOwotCQotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JcmV0dXJuIGZFeHByZXNzaW9uLmdldFR5cGVDbGFzc05hbWUoKTsKLX0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gaXNDb21wbGV0ZSB8fCBmRXhwcmVzc2lvbi5pc0NvbXBsZXRlKCk7Ci19Ci0JCi1wdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiAsIGNoYXIgZGVsaW1pdGVyKXsKLQotCS8vIEV2ZW4gaWYgb3VyIGV4cHJlc3Npb24gaXMgY29tcGxldGUgYW5kIHdlIHJlY2VpdmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhICwgdGhlbiB0aGUgZXhwcmVzc2lvbiBtdXN0IHByb2Nlc3MgaXQgYXMgdGhpcyBtYXkgYmUgYSBmaWVsZCBvciBtZXNzYWdlCi0JLy8gdGhhdCBpcyBiZWluZyBzZW50IHRvIHRoZSBleHByZXNzaW9uIHRvIG1ha2UgdXAgYSBjb21wbGV4IGFyZ3VtZW50CQotCUV4cHJlc3Npb24gcmVzdWx0ID0gZkV4cHJlc3Npb24ucHVzaCh0b2tlbixkZWxpbWl0ZXIpOwotCS8vIElmIHRoZSByZXN1bHQgaWYgYSBwdXNoIHRoZW4gcHVzaCB0aGUgc3RhY2sKLQlpZiAoIHJlc3VsdCAhPSBmRXhwcmVzc2lvbiApIHsKLQkJcHVzaEV4cHJlc3Npb25TdGFjayhyZXN1bHQpOwotCX0gZWxzZSBpZiAocmVzdWx0LmlzQ29tcGxldGUoKSl7Ci0JCS8vIElmIG91ciBleHByZXNzaW9uIGlzIGNvbXBsZXRlLCB3ZSBhcmUgY29tcGxldGVkIHdpdGggYSApIHBvcCB0aGUgc3RhY2sgc28gdGhlIHByZXZpb3VzIGV4cHJlc3Npb24gY2FuIHByb2Nlc3MgdXMKLQkJaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuICkgewotCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQlwb3BFeHByZXNzaW9uU3RhY2soKTsKLQkJfSBlbHNlIGlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEgfHwgZGVsaW1pdGVyID09IERlbGltaXRlclF1b3RlICkgewotCQkJLy8gSWYgd2UgcmVjZWl2ZSBhIGNvbW1hIHdlIHBvcCB0aGUgc3RhY2sgc28gdGhlIHByZXZpb3VzIGV4cHJlc3Npb24gY2FuIHByb2Nlc3MgdXMgYnV0IHdlIGRvbid0IGZsYWcgdXMgYXMgY29tcGxldGUKLQkJCXBvcEV4cHJlc3Npb25TdGFjaygpOwotCQkJLy8gdW5sZXNzIG91ciBleHByZXNzaW9uIGlzIHNvbWUgYXJyYXkgYXJndW1lbnQgQU5EIGl0IGlzIGNvbXBsZXRlIEFORCB3ZSBoYXZlIGEgY2xvc2UgZWxpcHNlIH0KLQkJfSBlbHNlIGlmICggZGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlRWxpcHNlICkgewotCQkJcG9wRXhwcmVzc2lvblN0YWNrKCk7Ci0JCQlpZiAoIGZFeHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXlBcmd1bWVudHMgKSB7Ci0JCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHRoaXM7Ci19CQotCQotLyogUG9wIHRoZSB0b3AgZXhwcmVzc2lvbiBvZmYgdGhlIHN0YWNrCi0gKi8KLXByb3RlY3RlZCB2b2lkIHBvcEV4cHJlc3Npb25TdGFjaygpewotCi0JaWYgKCBmRXhwcmVzc2lvblN0YWNrLnNpemUoKSA+IDAgKSB7Ci0JCUV4cHJlc3Npb24gbGFzdEV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbilmRXhwcmVzc2lvblN0YWNrLmdldChmRXhwcmVzc2lvblN0YWNrLnNpemUoKSAtIDEpOwotCQlpZiAoICFsYXN0RXhwcmVzc2lvbi5pc0NvbXBsZXRlKCkgKSB7Ci0JCQlmRXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBmRXhwcmVzc2lvblN0YWNrLnJlbW92ZShmRXhwcmVzc2lvblN0YWNrLnNpemUoKSAtIDEpOwotCQl9IGVsc2UgeyAKLQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQl9IAotCX0gZWxzZSB7Ci0JCWlzQ29tcGxldGUgPSB0cnVlOwotCX0KLX0KLQotLyogUHVzaCB0aGUgZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjawotICovCi1wcm90ZWN0ZWQgdm9pZCBwdXNoRXhwcmVzc2lvblN0YWNrKEV4cHJlc3Npb24gYW5FeHByZXNzaW9uKXsKLQotCS8vIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gc2hvdWxkIGdvIG9udG8gdGhlIHN0YWNrCi0JZkV4cHJlc3Npb25TdGFjay5hZGQoZkV4cHJlc3Npb24pOwotCS8vIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXJndW1lbnQKLQlmRXhwcmVzc2lvbiA9IGFuRXhwcmVzc2lvbjsKLQkKLX0KLQotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIkFyZygiKTsgLy8kTk9OLU5MUy0xJAotCWlmICggZkV4cHJlc3Npb24gIT0gbnVsbCApIHsKLQkJd3JpdGVyLndyaXRlKGZFeHByZXNzaW9uLnRvU3RyaW5nKCkpOwotCX0KLQl3cml0ZXIud3JpdGUoIikiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVBcmd1bWVudE51bWJlcihMaXN0IGFyZ3VtZW50TnVtYmVyTGlzdCl7Ci0KLQlpZiAoIGZFeHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXlBcmd1bWVudHMgKSB7Ci0JCSgoQXJyYXlBcmd1bWVudHMpZkV4cHJlc3Npb24pLmNvbnRyaWJ1dGVBcmd1bWVudE51bWJlcihhcmd1bWVudE51bWJlckxpc3QpOwotCX0JCi0JCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL051bGxMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL051bGxMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMjAxNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9OdWxsTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWV0aG9kSGVscGVyOwotCi0vKgotICogICRSQ1NmaWxlOiBOdWxsTGl0ZXJhbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgTnVsbExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLXB1YmxpYyBOdWxsTGl0ZXJhbCgpewotfQotLyoqCi0gKiBldmFsdWF0ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHsKLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogZXZhbHVhdGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKXsKLQlyZXR1cm4gTWV0aG9kSGVscGVyLk5VTExfVFlQRTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiBNZXRob2RIZWxwZXIuTlVMTF9UWVBFLmdldE5hbWUoKTsKLX0KLS8qKgotICogdHJ1ZSBvciBmYWxzZSBjYW5ub3QgY29uc3VtZSBhbnkga2luZCBvZiBleHByZXNzaW9uIHNvIHdlIG11c3QgcmV0dXJuIG51bGwKLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIGRlbGltaXRlcil7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBOdWxsIGlzIG5vdCBwcmltaXRpdmUKLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTnVtYmVyTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9OdW1iZXJMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZTBlODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9OdW1iZXJMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IE51bWJlckxpdGVyYWwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotcHVibGljIGNsYXNzIE51bWJlckxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIG51bWJlclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZSA9IGZhbHNlOwotCXByb3RlY3RlZCBDbGFzcyBudW1iZXJDbGFzcyA9IEludGVnZXIuVFlQRTsKLQlwcm90ZWN0ZWQgaW50IGV4cG9uZW50RmxhZyA9IE5PX0VYUE9ORU5UOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50Ci0JCU5PX0VYUE9ORU5UID0gMCwKLQkJSEFTX0VYUE9ORU5UID0gMSwKLQkJSEFTX0VYUE9ORU5UX01JTlVTID0gMjsKLS8qKgotICogZXZhbHVhdGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXJMaXRlcmFsKCl7Ci19Ci0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJLy8gUmV0dXJuIGEgbnVtYmVyIG9mIHRoZSBjb3JyZWN0IGluc3RhbmNlCi0JCWlmIChudW1iZXJDbGFzcyA9PSBGbG9hdC5UWVBFKXsKLQkJCXJldHVybiBuZXcgRmxvYXQoRmxvYXQucGFyc2VGbG9hdChudW1iZXJTdHJpbmcpKTsKLQkJfSBlbHNlIGlmIChudW1iZXJDbGFzcyA9PSBMb25nLlRZUEUgKSB7Ci0JCQlyZXR1cm4gTG9uZy5kZWNvZGUobnVtYmVyU3RyaW5nKTsKLQkJfSBlbHNlIGlmIChudW1iZXJDbGFzcyA9PSBEb3VibGUuVFlQRSApewotCQkJcmV0dXJuIG5ldyBEb3VibGUoRG91YmxlLnBhcnNlRG91YmxlKG51bWJlclN0cmluZykpOwotCQl9IGVsc2UKLQkJCXJldHVybiBJbnRlZ2VyLmRlY29kZShudW1iZXJTdHJpbmcpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCX0KLQkKLX0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gaXNDb21wbGV0ZTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIHR5cGUgb2YgbnVtYmVyIHRoYXQgd2UgYXJlLgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCl7Ci0JcmV0dXJuIG51bWJlckNsYXNzOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JcmV0dXJuIG51bWJlckNsYXNzICE9IG51bGwgPyBudW1iZXJDbGFzcy5nZXROYW1lKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotfQotLyoqCi0gKiBJZiB0aGUgZGVsaW1pdGVyIGlzIGFuIG9wZXJhdGlvbiBzdWNoIGFzIGEgKywtLC8sKiB0aGVuIHdlIGNhbiBjb25zdW1lIGl0Ci0gKiBJZiB0aGUgZGVsaW1pdGVyIGlzIHBlcmlvZCBhbmQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZSB0aGVuIGl0IGlzIHRoZSBkZWNpbWFsIHBvcnRpb24gb2YgdXMKLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIGRlbGltaXRlcil7Ci0JCQotCS8vIENsb3NlIGJyYWNrZXRzIGNvbXBsZXRlIHVzZQkJCi0JaWYoZGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gfHwgZGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZUVsaXBzZSl7Ci0JCWlzQ29tcGxldGUgPSB0cnVlOwotCX0KLQkKLQlpZiAoZGVsaW1pdGVyID09IE9wZXJNaW51cyAmJiBudW1iZXJTdHJpbmcubGVuZ3RoKCkgPT0gMCkKLQkJbnVtYmVyU3RyaW5nKz1PcGVyTWludXM7CS8vIE5vIGRpZ2l0cyB5ZXQsIGJ1dCB3ZSBoYXZlIGEgbWludXMgc2lnbiwgc28gYWRkIHRvIGFjY3VtdWxhdGluZyBudW1iZXIuCi0JCQotCW51bWJlclN0cmluZyArPSBwcm9jZXNzTnVtYmVyVG9rZW4odG9rZW4pOwkKLQkKLQkvLyBJZiB3ZSBoYXZlIHBhcnQgb2YgYSBudW1iZXIgYW5kIGFyZSBhc2tlZCB0byBkbyBzb21lIGFyaXRobWV0aWMgdGhyb3cgYW4gCi0JLy8gZXJyb3IgdGhhdCB0aGlzIGhhcyBub3QgYmVlbiBjb2RlZCB5ZXQsIGV4Y2VwdCBtaW51cyBjb3VsZCBiZSBwYXJ0IG9mIGFuIGV4cG9uZW50LgotCWlmKG51bWJlclN0cmluZy5sZW5ndGgoKSA+IDAgJiYgdG9rZW4ubGVuZ3RoID4gMSkgewotCQlzd2l0Y2goZGVsaW1pdGVyKXsKLQkJCWNhc2UgT3Blck1pbnVzOgotCQkJCWlmIChleHBvbmVudEZsYWcgPT0gSEFTX0VYUE9ORU5UKSB7Ci0JCQkJCWV4cG9uZW50RmxhZyA9IEhBU19FWFBPTkVOVF9NSU5VUzsKLQkJCQkJbnVtYmVyU3RyaW5nICs9IE9wZXJNaW51czsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJY2FzZSBPcGVyUGx1czoJCQkKLQkJCWNhc2UgT3Blck11bHRpcGx5OgotCQkJY2FzZSBPcGVyRGl2aWRlOgotCQkJewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBkbyBhcml0aG1ldGljIHlldCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QpewotCQludW1iZXJDbGFzcyA9IERvdWJsZS5UWVBFOwkvLyBBIGRlY2ltYWwgbWFrZXMgaXQgZG91YmxlLgotCQludW1iZXJTdHJpbmcgKz0gRGVsaW1pdGVyUGVyaW9kOwotCX0JCi0KLQlpZihkZWxpbWl0ZXIgPT0gQml0T1IgfHwgZGVsaW1pdGVyID09IEJpdEFORCl7Ci0JCQlFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBQcmltaXRpdmVPcGVyYXRpb24odGhpcyxkZWxpbWl0ZXIpOwotCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXJldHVybiB0aGlzOwotCQotfQotcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzTnVtYmVyVG9rZW4oY2hhcltdIHRva2VuKXsKLQkKLQlmb3IgKGludCBpPTA7IGk8dG9rZW4ubGVuZ3RoOyBpKyspCi0JCWlmICh0b2tlbltpXSA9PSAnRScgfHwgdG9rZW5baV0gPT0gJ2UnKSB7Ci0JCQludW1iZXJDbGFzcyA9IERvdWJsZS5UWVBFOwkvLyBEZWZpbml0ZWx5IGEgZmxvYXRpbmcgYmVjYXVzZSBvZiB0aGlzLgotCQkJZXhwb25lbnRGbGFnID0gSEFTX0VYUE9ORU5UOwotCQkJYnJlYWs7Ci0JCX0KLQkJCQotCS8vIFRoZSB0b2tlbiBjb3VsZCBiZSBhIG51bWJlciwgZS5nLiAxMCBvciA1IG9yIGNvdWxkIGJlIHF1YWxpZmllZCB3aXRoIGEgcHJpbWl0aXZlCi0JLy8gc3VmZml4LCBlLmcuIDEwbCBvciA1ZgotCWNoYXJbXSBudW1iZXJUb2tlbiA9IHRva2VuOwotCWlmICggdG9rZW4ubGVuZ3RoID4gMCApIHsKLQkJc3dpdGNoKHRva2VuW3Rva2VuLmxlbmd0aCAtIDFdKXsKLQkJCWNhc2UgJ0YnOiAJCQkKLQkJCWNhc2UgJ2YnOgotCQkJCW51bWJlckNsYXNzID0gRmxvYXQuVFlQRTsKLQkJCQludW1iZXJUb2tlbiA9IG5ldyBjaGFyW3Rva2VuLmxlbmd0aCAtIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodG9rZW4sMCxudW1iZXJUb2tlbiwwLG51bWJlclRva2VuLmxlbmd0aCk7Ci0JCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdMJzoJCQkKLQkJCWNhc2UgJ2wnOgotCQkJCW51bWJlckNsYXNzID0gTG9uZy5UWVBFOwotCQkJCW51bWJlclRva2VuID0gbmV3IGNoYXJbdG9rZW4ubGVuZ3RoIC0gMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weSh0b2tlbiwwLG51bWJlclRva2VuLDAsbnVtYmVyVG9rZW4ubGVuZ3RoKTsJCQkJCi0JCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdEJzoJCQkKLQkJCWNhc2UgJ2QnOgotCQkJCW51bWJlckNsYXNzID0gRG91YmxlLlRZUEU7Ci0JCQkJbnVtYmVyVG9rZW4gPSBuZXcgY2hhclt0b2tlbi5sZW5ndGggLSAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRva2VuLDAsbnVtYmVyVG9rZW4sMCxudW1iZXJUb2tlbi5sZW5ndGgpOwkJCQkKLQkJCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQkJCQotCXJldHVybiBuZXcgU3RyaW5nKG51bWJlclRva2VuKTsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQotCWphdmEuaW8uU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1dyaXRlcigpOwotCXdyaXRlci53cml0ZSgiTnVtYmVyIFwiIik7IC8vJE5PTi1OTFMtMSQKLQl3cml0ZXIud3JpdGUobnVtYmVyU3RyaW5nKTsKLQl3cml0ZXIud3JpdGUoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci0KLX0KLQotLyoqCi0gKiBOdW1iZXIgbGl0ZXJhbHMgYXJlIHByaW1pdGl2ZQotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvUHJpbWl0aXZlT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1ByaW1pdGl2ZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2UyNTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvUHJpbWl0aXZlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFRoaXMgaXMgZm9yIHByaW1pdGl2ZSBleHByZXNzaW9ucyB0aGF0IGFyZSBvcHRpbWl6ZWQgb3V0IHRoZSBjb21waWxlciBzdWNoIGFzIGJpdCBvciwgYml0IGFuZCwgZXRjLi4KLSAgICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IFByaW1pdGl2ZU9wZXJhdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotcHVibGljIGNsYXNzIFByaW1pdGl2ZU9wZXJhdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewotCQotCXByb3RlY3RlZCBpbnQgb3BlcmF0aW9uOwkJCQkvLyBUaGlzIGNhbiBiZSBCaXRPUiBvciBCaXRBTkQKLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiByZWNlaXZlcjsJLy8gVGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBleHByZXNzaW9uCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZSA9IGZhbHNlOwotCQotCXB1YmxpYyBQcmltaXRpdmVPcGVyYXRpb24oRXhwcmVzc2lvbiBhUmVjZWl2ZXIsIGludCBhbk9wZXJhdGlvbil7Ci0JCXJlY2VpdmVyID0gYVJlY2VpdmVyOwotCQlvcGVyYXRpb24gPSBhbk9wZXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBsZWZ0SGFuZFNpZGUgPSByZWNlaXZlci5ldmFsdWF0ZSgpOwotCQlPYmplY3QgcmlnaHRIYW5kU2lkZSA9IGN1cnJlbnRFeHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JCWlmIChsZWZ0SGFuZFNpZGUgaW5zdGFuY2VvZiBJbnRlZ2VyICYmIHJpZ2h0SGFuZFNpZGUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQlpZihvcGVyYXRpb24gPT0gQml0T1IpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChJbnRlZ2VyKWxlZnRIYW5kU2lkZSkuaW50VmFsdWUoKSB8ICgoSW50ZWdlcilyaWdodEhhbmRTaWRlKS5pbnRWYWx1ZSgpKTsJCQkJCi0JCQl9IGVsc2UgaWYob3BlcmF0aW9uID09IEJpdEFORCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKEludGVnZXIpbGVmdEhhbmRTaWRlKS5pbnRWYWx1ZSgpICYgKChJbnRlZ2VyKXJpZ2h0SGFuZFNpZGUpLmludFZhbHVlKCkpOwkJCQkKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eUluaXRQYXJzZXJNZXNzYWdlcy5nZXRTdHJpbmcoIlByaW1pdGl2ZU9wZXJhdGlvbi5FdmFsdWF0ZS5JbnZhbGlkT3BlcmF0b3JfRVhDXyIpLCBuZXcgT2JqZWN0W117Z2V0T3BlckRlc2NyaXB0aW9uKCksIGxlZnRIYW5kU2lkZSwgcmlnaHRIYW5kU2lkZX0pKTsJCSAvLyROT04tTkxTLTEkCi0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3BlckRlc2NyaXB0aW9uKCl7Ci0JCWlmKG9wZXJhdGlvbiA9PSBCaXRPUikgcmV0dXJuICJ8IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob3BlcmF0aW9uID09IEJpdEFORCkgcmV0dXJuICImIjsJCQkgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gIj8/PyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gaXNDb21wbGV0ZTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBJbnRlZ2VyLlRZUEU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gSW50ZWdlci5UWVBFLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiwgY2hhciB0b2tlbkRlbGltaXRlcikgewotCQotCQkvLyBDcmVhdGUgYSBuZXcgc3RhdGVtZW50IGlmIHRoZSBhcmd1bWVudCBpcyBudWxsICggd2UgYXJlIGFsd2F5cyBjcmVhdGVkIHdpdGggYSByZWNlaXZlciApCi0JCWlmKGN1cnJlbnRFeHByZXNzaW9uID09IG51bGwgJiYgdG9rZW4ubGVuZ3RoID4gMCl7Ci0JCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCXB1c2hFeHByZXNzaW9uU3RhY2soY3VycmVudEV4cHJlc3Npb24pOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gCi0JCQotCQkvLyBJZ25vcmUgd2hpdGVzcGFjZQotCQlpZih0b2tlbi5sZW5ndGggPT0gMCAmJiB0b2tlbkRlbGltaXRlciA9PSAnICcpIHJldHVybiB0aGlzOwotCQkKLQkJLy8gSWYgd2UgaGF2ZSBhbiBhcmd1bWVudCB3ZSBqdXN0IGtlZXAgcHVzaGluZyB0aGUgZXhwcmVzc2lvbiBvbnRvIHRoaXMKLQkJaWYoY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCl7Ci0JCQlFeHByZXNzaW9uIHJlc3VsdCA9IGN1cnJlbnRFeHByZXNzaW9uLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJaWYocmVzdWx0ICE9IGN1cnJlbnRFeHByZXNzaW9uKXsKLQkJCQlwdXNoRXhwcmVzc2lvblN0YWNrKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwgJiYgY3VycmVudEV4cHJlc3Npb24uaXNDb21wbGV0ZSgpKXsKLQkJCWlmKHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hKXsKLQkJCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0gZWxzZSBpZiAodG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbil7Ci0JCQkJaWYocmVjZWl2ZXIucGFyZW50aGVzaXNMZXZlbCA+IDApewotCQkJCQlyZWNlaXZlci5wYXJlbnRoZXNpc0xldmVsLS07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaXNDb21wbGV0ZSA9IHRydWU7CQkJCi0JCQkJCXJldHVybiB0aGlzOwkJCi0JCQkJfQotCQkJfQotCQl9CQkJCQotCQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAocmVjZWl2ZXIgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChyZWNlaXZlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRPcGVyRGVzY3JpcHRpb24oKSk7Ci0JCWlmIChjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKGN1cnJlbnRFeHByZXNzaW9uLnRvU3RyaW5nKCkpOyAKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Qcm94eUluaXRQYXJzZXJNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Qcm94eUluaXRQYXJzZXJNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDZkZjVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBQcm94eUluaXRQYXJzZXJNZXNzYWdlcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0vKioKLSAqIEdlbmVyYWwgUHJveHkgTkxTIENvbnN0YW50cwotICogQ3JlYXRpb24gZGF0ZTogKDQvMTMvMDAgMTA6NDY6NTggQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eUluaXRQYXJzZXJNZXNzYWdlcyB7Ci0JLy8gUmVzb3VyY2UgQnVuZGxlIHRvIHVzZSBmb3IgYmFzaWMgUHJveHkgTkxTIHJlc291cmNlcy4KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLm1lc3NhZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEtleXMgZm9yIG1lc3NhZ2VzL3N0cmluZ3Mgd2l0aGluIHRoZSByZXNvdXJjZSBidW5kbGUuCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcKLQkJVU5FWFBFQ1RFRF9UT0tFTiA9ICJVbmV4cGVjdGVkVG9rZW5fRVhDXyIsIC8vJE5PTi1OTFMtMSQKLQkJU1RBVEVNRU5UX1VORVhQRUNURURfRVhFQ1VUSU9OID0gIlN0YXRlbWVudC5VbmV4cGVjdGVkRXhlY3V0aW9uX0VYQ18iLCAvLyROT04tTkxTLTEkCi0JCVNUQVRFTUVOVF9VTkVYUEVDVEVEX0VWQUxVQVRJT04gPSAiU3RhdGVtZW50LlVuZXhwZWN0ZWRFdmFsdWF0aW9uX0VYQ18iCQk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHJpdmF0ZSBQcm94eUluaXRQYXJzZXJNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9CQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9TdGF0ZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjRhNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9TdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogU3RhdGVtZW50LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLQotcHVibGljIGNsYXNzIFN0YXRlbWVudCBleHRlbmRzIEV4cHJlc3Npb24gewotCXB1YmxpYyBib29sZWFuIGlzU3RyaW5nT2JqZWN0ID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gaXNDYXN0ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbWVzc2FnZU9yRmllbGRTdGFydGVkOwotCQotLyoqCi0gKiBTdGF0ZW1lbnQgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFN0YXRlbWVudChDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpIHsKLQlzdXBlcigpOwotCWZDbGFzc0xvYWRlciA9IGFDbGFzc0xvYWRlcjsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpewotCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsICYmIGN1cnJlbnRFeHByZXNzaW9uLmlzQ29tcGxldGUoKTsKLX0KLQotLyoqIERlZmVyIHRoaXMgdG8gdGhlIGV4cHJlc3Npb24KLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWlmICggY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCApIHsKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JfSBlbHNlIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuZ2V0U3RyaW5nKFByb3h5SW5pdFBhcnNlck1lc3NhZ2VzLlNUQVRFTUVOVF9VTkVYUEVDVEVEX0VYRUNVVElPTikpOwkvLyBUaGlzIGlzIG5vdCBhbiBldmFsdWF0aW9uIGVycm9yLCBpdCBzaG91bGRuJ3Qgb2Ygb2NjdXJlZCwgc28gaXQgaXMgYSBwYXJzZXIgZXJyb3IuCi0JfQotfQotLyoqCi0gKi8KLXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCk7Ci0JLy90aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihQcm94eUJhc2VWTU5MUy5SRVNCVU5ETEUuZ2V0U3RyaW5nKFByb3h5QmFzZVZNTkxTLlNUQVRFTUVOVF9VTkVYUEVDVEVEX0VWQUxVQVRJT04pKTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3NOYW1lKCk7Ci19Ci0vKiogVGhlcmUgYXJlIHNldmVyYWwgdHlwZXMgb2YgdG9rZW4gdGhhdCBjYW4gYmVnaW4gYSBzdGF0ZW1lbnQuCi0gKiAgbmV3ICwgJyAnCQkJCQkJLQlDcmVhdGUgYSBjb25zdHJ1Y3RvcgotICoJMS0xMCwgdHJ1ZSwgZmFsc2UsIGV0Yy4uLgkJLQlDcmVhdGUgYSBsaXRlcmFsCi0gKiAgRm9vLCAgJy4nCQkJCQkJLQlDcmVhdGUgYSBUeXBlCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCQotCS8vIElmIG1lc3NhZ2VPckZpZWxkU3RhcnQgaXMgdHJ1ZSB0aGVuIG91ciBleHByZXNzaW9uIGlzIGNvbXBsZXRlIGFuZCBlaXRoZXIgYSBtZXNzYWdlIG9yIGZpZWxkIGlzIGJlaW5nIGNyZWF0ZWQKLQkvLyBTZWUgd2hpY2ggaXQgaXMgYW5kIGNyZWF0ZSB0aGUgY29ycmVjdCBleHByZXNzaW9uCi0JaWYgKG1lc3NhZ2VPckZpZWxkU3RhcnRlZCl7Ci0JCW1lc3NhZ2VPckZpZWxkU3RhcnRlZCA9IGZhbHNlOwotCQlpZiAoIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pewotCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoY3VycmVudEV4cHJlc3Npb24sdG9rZW4sZkNsYXNzTG9hZGVyKTsKLQkJCWN1cnJlbnRFeHByZXNzaW9uID0gbWVzc2FnZTsKLQkJCXJldHVybiBtZXNzYWdlOwotCQl9IGVsc2UgeyAKLQkJCUZpZWxkIGZpZWxkID0gbmV3IEZpZWxkKGN1cnJlbnRFeHByZXNzaW9uLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JCQljdXJyZW50RXhwcmVzc2lvbiA9IGZpZWxkOwotCQkJcmV0dXJuIGZpZWxkOwotCQl9Ci0JfQkKLQkKLQkvLyBMb29rIGZvciAibmV3ICIgZm9yIGEgY29uc3RydWN0b3IiCi0JaWYgKCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU3BhY2UgJiYgY29tcGFyZSggdG9rZW4gLCBDb25zdGFudE5ldyApICkgewotCQkvLyBJZiB3ZSB0aG91Z2h0IHdlIHdlcmUgYSBwb3NzaWJsZSBjYXN0IGFuZCB3ZSBub3cgYXJlbid0IHRoZW4gd2UgbXVzdCBiZSBhIGJsb2NrIGV4cHJlc3Npb24KLQkJaWYgKCBpc0Nhc3QgKSB7Ci0JCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBCbG9jayhuZXcgQ29uc3RydWN0b3IoZkNsYXNzTG9hZGVyKSk7Ci0JCX0gZWxzZSB7Ci0JCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBDb25zdHJ1Y3RvcihmQ2xhc3NMb2FkZXIpOwotCQl9Ci0JCWlzQ2FzdCA9IGZhbHNlOwkvLyBDYW4ndCBiZSBhIGNhc3Qgbm93CQkKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uOwotCX0KLQkKLQkvLyBMb29rIGZvciAibnVsbCIgCi0JaWYgKCBjb21wYXJlKCB0b2tlbiAsIENvbnN0YW50TnVsbCApICkgewotCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBOdWxsTGl0ZXJhbCgpOwotCQlpc0Nhc3QgPSBmYWxzZTsJLy8gQ2FuJ3QgYmUgYSBjYXN0IG5vdwkJCi0JCS8vIE51bGwgY2Fubm90IHByb2Nlc3MgYW55dGhpbmcgc28gd2UgcmV0dXJuIHRoZSBzdGF0ZW1lbnQKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLy8gTG9vayBmb3IgYSBudW1iZXIKLQlpZiAoIGlzTnVtYmVyKCB0b2tlbiApIHx8IGRlbGltaXRlciA9PSBPcGVyTWludXMgKSB7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IE51bWJlckxpdGVyYWwoKTsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBjdXJyZW50RXhwcmVzc2lvbi5wdXNoKHRva2VuLGRlbGltaXRlcik7Ci0JCWlzQ2FzdCA9IGZhbHNlOwkvLyBDYW4ndCBiZSBhIGNhc3Qgbm93CQkKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uOwotCX0KLQotCWlmICggY29tcGFyZSggdG9rZW4gLCBDb25zdGFudFRydWUgKSApIHsKLQkJY3VycmVudEV4cHJlc3Npb24gID0gbmV3IEJvb2xlYW5MaXRlcmFsKHRydWUpOwotCQkvLyB0cnVlIGNhbm5vdCBwcm9jZXNzIGFueXRoaW5nIHNvIHdlIHJldHVybiB0aGUgc3RhdGVtZW50Ci0JCWlzQ2FzdCA9IGZhbHNlOwkvLyBDYW4ndCBiZSBhIGNhc3Qgbm93CQkKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uOwotLy8JCXJldHVybiB0aGlzOwotCX0KLQotCWlmICggY29tcGFyZSggdG9rZW4gLCBDb25zdGFudEZhbHNlICkgKSB7Ci0JCS8vIGZhbHNlIGNhbm5vdCBwcm9jZXNzIGFueXRoaW5nIHNvIHdlIHJldHVybiB0aGUgc3RhdGVtZW50Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IEJvb2xlYW5MaXRlcmFsKGZhbHNlKTsKLQkJaXNDYXN0ID0gZmFsc2U7CS8vIENhbid0IGJlIGEgY2FzdCBub3cJCQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JaWYgKCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUXVvdGUgKSB7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IFN0cmluZ0xpdGVyYWwoKTsKLQkJaXNDYXN0ID0gZmFsc2U7CS8vIENhbid0IGJlIGEgY2FzdCBub3cJCQotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247CQkKLQl9Ci0JCi0JaWYgKCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU2luZ2xlUXVvdGUgKSB7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IENoYXJMaXRlcmFsKCk7Ci0JCWlzQ2FzdCA9IGZhbHNlOwkvLyBDYW4ndCBiZSBhIGNhc3Qgbm93CQkKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uOwkJCi0JfQkKLQkKLQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCAmJiB0b2tlbi5sZW5ndGggPT0gMCAmJiBjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsKXsKLQkJaWYgKGN1cnJlbnRFeHByZXNzaW9uIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbCl7Ci0JCQkvL1N0cmluZyBzID0gIlwiIiArIChTdHJpbmcpKGN1cnJlbnRFeHByZXNzaW9uLmV2YWx1YXRlKCkpICsgIlwiIiA7Ci0JCQkvL3JldHVybiBuZXcgQ29uc3RydWN0b3Iocyk7Ci0JCQlpc1N0cmluZ09iamVjdCA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0KLQkKLQlpZiAoaXNTdHJpbmdPYmplY3QgJiYgKHRva2VuLmxlbmd0aCA+IDApICYmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuKSl7Ci0JCXJldHVybiBuZXcgTWVzc2FnZShjdXJyZW50RXhwcmVzc2lvbiwgdG9rZW4sZkNsYXNzTG9hZGVyKTsKLQl9Ci0JCi0JLy9oYW5kbGUgdHlwZSBjYXN0aW5nCi0JaWYgKCh0b2tlbi5sZW5ndGggPT0gMCkgJiYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pKXsKLQkJLy8gSWYgd2UgYXJlIGEgYWxyZWFkeSBhIGNhc3QgdGhlbiB3ZSBtdXN0IGJlIGEgYmxvY2suCi0JCWlmICggaXNDYXN0ICkgewotCQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgQmxvY2soZkNsYXNzTG9hZGVyKTsKLQkJfSBlbHNlIHsKLQkJCWlzQ2FzdCA9IHRydWU7CS8vIFBvc3NpYmx5IGEgY2FzdAotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0JCi0JaWYgKGlzQ2FzdCAmJiAoZGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gfHwgdG9rZW4ubGVuZ3RoICE9IDApKXsKLQkJU3RhdGljIGFTdGF0aWMgPSBuZXcgU3RhdGljKGZDbGFzc0xvYWRlcik7Ci0JCUNhc3QgYUNhc3QgPSBuZXcgQ2FzdChhU3RhdGljLGZDbGFzc0xvYWRlcik7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gYUNhc3QucHVzaCh0b2tlbixkZWxpbWl0ZXIpOwotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247Ci0JfQotCQotCWlmICggdG9rZW4ubGVuZ3RoICE9IDAgKSB7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IFN0YXRpYyhmQ2xhc3NMb2FkZXIpLnB1c2godG9rZW4sZGVsaW1pdGVyKTsKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uOwotCX0KLQkKLQkvLyBJZiB3ZSBnZXQgYSB7IHRoZW4gd2UgYXJlIHBhcnQgb2YgYW4gYXJyYXkgYXJndW1lbnQKLQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlck9wZW5FbGlwc2UpewotCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBBcnJheUFyZ3VtZW50cygpOwotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247Ci0JfQotCQotCS8vIElmIG91ciBleHByZXNzaW9uIGlzIGNsb3NlZCBhbmQgd2UgcmVjZWl2ZSBhIC4gd2UgYXJlIGVpdGhlciBhIG1lc3NhZ2Ugb3IgYSBmaWVsZC4gIFdlIHdvbid0IGtub3cgdGhpcyB1bnRpbAotCS8vIHRoZSBuZXh0IHRva2VuIHdlIHJlY2VpdmUsIHdoaWNoIHdpbGwgYmUgZWl0aGVyIGJlIGRlbGltaXRlZCBieSBhICggaW4gd2hpY2ggY2FzZSBpdCBpcyBhIG1lc3NhZ2UsIGVsc2UgaXQgaXMgYSBmaWVsZAotCWlmIChjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsICYmIGN1cnJlbnRFeHByZXNzaW9uLmlzQ29tcGxldGUoKSAmJiBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kKXsKLQkJbWVzc2FnZU9yRmllbGRTdGFydGVkID0gdHJ1ZTsKLQl9Ci0JCQotCXJldHVybiB0aGlzOwotfQotCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWZmZXIuYXBwZW5kKCJTdGF0ZW1lbnR7Iik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwgKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoY3VycmVudEV4cHJlc3Npb24udG9TdHJpbmcoKSk7Ci0JfQotCWJ1ZmZlci5hcHBlbmQoJ30nKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0vKioKLSAqIElzIHRoaXMgc3RhdGVtZW50IGEgcHJpbWl0aXZlLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWlmICggY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCApIHsKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uLmlzUHJpbWl0aXZlKCk7Ci0JfSBlbHNlIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuZ2V0U3RyaW5nKFByb3h5SW5pdFBhcnNlck1lc3NhZ2VzLlNUQVRFTUVOVF9VTkVYUEVDVEVEX0VYRUNVVElPTikpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvU3RhdGljLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1N0YXRpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGU0NWEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvU3RhdGljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFN0YXRpYy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBIYXNoTWFwIHNQcmltaXRpdmVUeXBlczsKLQkKLQlzdGF0aWMgewotCQlzUHJpbWl0aXZlVHlwZXMgPSBuZXcgSGFzaE1hcCgxMCk7Ci0JCXNQcmltaXRpdmVUeXBlcy5wdXQoImJ5dGUiLCBCeXRlLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXNQcmltaXRpdmVUeXBlcy5wdXQoImNoYXIiLCBDaGFyYWN0ZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJc1ByaW1pdGl2ZVR5cGVzLnB1dCgic2hvcnQiLCBTaG9ydC5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlzUHJpbWl0aXZlVHlwZXMucHV0KCJpbnQiLCBJbnRlZ2VyLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXNQcmltaXRpdmVUeXBlcy5wdXQoImxvbmciLCBMb25nLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXNQcmltaXRpdmVUeXBlcy5wdXQoImZsb2F0IiwgRmxvYXQuVFlQRSk7CQkgLy8kTk9OLU5MUy0xJAotCQlzUHJpbWl0aXZlVHlwZXMucHV0KCJkb3VibGUiLCBEb3VibGUuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGFycmF5RGltZW5zaW9uczsKLQlwcm90ZWN0ZWQgTGlzdCBmQXJyYXlBcmd1bWVudHM7Ci0JcHJvdGVjdGVkIFN0cmluZ1dyaXRlciB0eXBlV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCXByb3RlY3RlZCBib29sZWFuIGNvbXBsZXRlZFdpdGhQZXJpb2QgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgY2hhcltdIGNvbXBsZXRpb25Ub2tlbjsKLQlwdWJsaWMgQ2xhc3MgdHlwZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBsZXRlOwotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb247Ci0vKioKLSAqIENyZWF0ZSBhbiB1bmtub3duIGV4cHJlc3Npb24KLSAqLwotcHVibGljIFN0YXRpYyhDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpewotCWZDbGFzc0xvYWRlciA9IGFDbGFzc0xvYWRlcjsKLX0KLXB1YmxpYyBTdGF0aWMoY2hhcltdIGFUb2tlbixjaGFyIGRlbGltaXRlcixDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpewotCQotCWZDbGFzc0xvYWRlciA9IGFDbGFzc0xvYWRlcjsKLQl0cnkgeyAKLQkJdHlwZVdyaXRlci53cml0ZShhVG9rZW4pOwotCX0gY2F0Y2ggKCBJT0V4Y2VwdGlvbiBleGMgKSB7fTsKLQljaGVja0ZvclZhbGlkVHlwZSgpOwotCWlmICggdHlwZSA9PSBudWxsICYmIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QgKXsKLQkJdHlwZVdyaXRlci53cml0ZShEZWxpbWl0ZXJQZXJpb2QpOwotCX0KLQkJCi19Ci1wdWJsaWMgU3RhdGljKGNoYXJbXSBhVG9rZW4sY2hhciBkZWxpbWl0ZXIsQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyLGJvb2xlYW4gaXNBcnJheSl7Ci0JdGhpcyhhVG9rZW4sZGVsaW1pdGVyLGFDbGFzc0xvYWRlcik7Ci0JaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb24gPSB0cnVlOwotCWFycmF5RGltZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JYXJyYXlEaW1lbnNpb25zLmFkZChuZXcgU3RhdGVtZW50KGFDbGFzc0xvYWRlcikpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIGlzQ29tcGxldGU7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0FycmF5KCl7Ci0JcmV0dXJuIGFycmF5RGltZW5zaW9ucyAhPSBudWxsOwotfQotLyoqCi0gKiBTZWUgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhIHZhbGlkIHR5cGUKLSAqIFRoaXMgdXNlcyB0aGUgY2xhc3MgbG9hZGVyIGdpdmVuIHRvIHVzIGlmIG9uZSBzcGVjaWZpZWQuICBUaGUgcmVhc29uIGZvciB0aGlzCi0gKiBpcyB0aGF0IEVjbGlwc2UgdXNlcyBhIHNwZWNpYWwgcGx1Z2luIGNsYXNzIGxvYWRlciBhbmQgd2hlbiB3ZSBhcmUgcnVubmluZwotICogaW4gYSBWTSBpbnNpZGUgZWNsaXBzZSAoIGUuZy4gZm9yIElERVZNIHByb3h5IHN0dWZmICkgd2UgbXVzdCBoYXZlCi0gKiByZWZlcmVuY2UgdG8gdGhlIHBsdWdpbiB0aGF0IGlzIHVzaW5nIHVzIG90aGVyd2lzZSB3ZSBjYW4ndCBsb2FkIGl0cyBjbGFzc2VzCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNoZWNrRm9yVmFsaWRUeXBlKCl7Ci0KLQl0eXBlID0gKENsYXNzKSBzUHJpbWl0aXZlVHlwZXMuZ2V0KHR5cGVXcml0ZXIudG9TdHJpbmcoKSk7Ci0JaWYgKHR5cGUgPT0gbnVsbCkKLQkJdHJ5IHsKLQkJCWlmICggZkNsYXNzTG9hZGVyID09IG51bGwgKSB7Ci0JCQkJdHlwZSA9IENsYXNzLmZvck5hbWUodHlwZVdyaXRlci50b1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdHlwZSA9IGZDbGFzc0xvYWRlci5sb2FkQ2xhc3ModHlwZVdyaXRlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfSBjYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXhjICkgewotCQkJdHJ5IHsKLQkJCQl0eXBlID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLiIgKyB0eXBlV3JpdGVyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQl3cml0ZXIud3JpdGUodHlwZS5nZXROYW1lKCkpOwotCQkJCXR5cGVXcml0ZXIgPSB3cml0ZXI7Ci0JCQl9IGNhdGNoICggQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGMxICkge30KLQkJfSBjYXRjaCAoIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGV4YyApIHsKLQkJCS8vIEEgbWlzbWF0Y2ggaW4gc29tZSB3YXkuIEZvdW5kIGEgY2xhc3MsIHByb2JhYmx5IGRpZmZlcmVudCBjYXNlLiBPbmUgcG9zc2liaWxpdHkKLQkJCS8vIGlzIGZvdW5kIGEgY2xhc3MsIGJ1dCB0aGlzIHdhcyByZWFsbHkgYSBwYWNrYWdlLiBTbyBjbGFzcyBhbmQgcGFja2FnZSB3aXRoIHNhbWUgbmFtZQotCQkJLy8gYnV0IGRpZmZlcmVudCBjYXNlIGNhdXNlZCB0aGlzIHRvIG9jY3VyLiBbNDYzNzZdLgotCQl9Ci0JCi19Ci0vKioKLSAqIElmIHdlIGhhdmUgYW55IHN0YXRpYyBtZXRob2RzIHJldHVybiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlbSBhZ2FpbnN0IHRoZSB0eXBlCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB7Ci0KLQkvLyBJZiB3ZSBhcmUgYW4gYXJyYXkgYnV0IGhhdmVuJ3QgY3JlYXRlZCBpdCBkbyBzbwotCWlmICggaXNBcnJheSgpICkgewotCQlpZiAoIGFycmF5ID09IG51bGwgKSB7Ci0JCQlldmFsdWF0ZUFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0gZWxzZSB7Ci0JCWlmICggdHlwZSAhPSBudWxsICkgeyAKLQkJCXJldHVybiB0eXBlOwotCQl9IGVsc2UgeyAKLQkJCS8vIElmIHdlIGhhdmUgbm8gdHlwZSB0aGVuIHdlIGFyZSBzb21lIGtpbmQgaW5jb21wbGV0ZSBleHByZXNzaW9uIHRoYXQgY2Fubm90IGJlIGV2YWx1dGVkCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBUaGUgdHlwZSBvZiB1cyBpcyBlaXRoZXIgc2ltcGx5IHRoZSBjbGFzcywgb3IgaWYgd2UgYXJlIGFuIGFycmF5IHRoZW4gd2UgbXVzdCBjcmVhdGUgdGhlIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Ci0gKiB1c2luZyB0aGUgcmVmbGVjdGl2ZSBBUElzCi0gKi8KLXByb3RlY3RlZCBPYmplY3QgYXJyYXk7Ci1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgewotCi0JaWYgKCBpc0FycmF5KCkgKSB7Ci0JCWlmICggYXJyYXkgPT0gbnVsbCApIHsKLQkJCS8vIERvIG5vdCBldmFsdWF0ZSB0aGUgYXJyYXkgYW5kIHJldHVybiBpdHMgY2xhc3MuICBJbnN0ZWFkIGp1c3Qgd29yayBvdXQgdGhlIGNsYXNzIGJ5IG91ciB0eXBlCi0JCQkvLyBhbmQgbnVtYmVyIG9mIGRpbWVuc2lvbnMKLQkJCU9iamVjdCByZXN1bHQgPSBBcnJheS5uZXdJbnN0YW5jZSh0eXBlLGdldE51bWJlck9mRGltZW5zaW9ucygpKTsKLQkJCXJldHVybiByZXN1bHQuZ2V0Q2xhc3MoKTsKLQkJfSBlbHNlIHsgCi0JCQlyZXR1cm4gYXJyYXkuZ2V0Q2xhc3MoKTsKLQkJfQotCX0gZWxzZSB7IAotCQlyZXR1cm4gdHlwZTsKLQl9Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gdHlwZVdyaXRlci50b1N0cmluZygpOwotfQotcHVibGljIENsYXNzIGdldFByaW1pdGl2ZVR5cGVDbGFzcygpewotCXJldHVybiB0eXBlOwotfQotcHJvdGVjdGVkIGludFtdIGdldE51bWJlck9mRGltZW5zaW9ucygpewotCUxpc3QgZGltZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JZGltZW5zaW9ucy5hZGQobmV3IEludGVnZXIoZkFycmF5QXJndW1lbnRzLnNpemUoKSkpOwotCSgoTWVzc2FnZUFyZ3VtZW50KWZBcnJheUFyZ3VtZW50cy5nZXQoMCkpLmNvbnRyaWJ1dGVBcmd1bWVudE51bWJlcihkaW1lbnNpb25zKTsKLQkvLyBUaGUgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBhIHNldCBvZiBJbnRlZ2VyIG9iamVjdHMgaW4gdGhlIGRpbWVuc2lvbnMgbGlzdAotCS8vIGNvbnZlcnQgdGhpcyB0byBhbiBpbnRbXQotCWludFtdIGludERpbWVuc2lvbnMgPSBuZXcgaW50W2RpbWVuc2lvbnMuc2l6ZSgpXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGRpbWVuc2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJaW50RGltZW5zaW9uc1tpXSA9ICgoSW50ZWdlcilkaW1lbnNpb25zLmdldChpKSkuaW50VmFsdWUoKTsKLQl9Ci0JcmV0dXJuIGludERpbWVuc2lvbnM7Ci19Ci0vKioKLSAqIEV2YWx1YXRlIHRoZSBhcnJheQotICovCi1wcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZUFycmF5KCl7Ci0JaWYgKCBmQXJyYXlBcmd1bWVudHMgIT0gbnVsbCApIHsgCi0JCS8vIElmIHRoZSBhcnJheSBpc24ndCBkZWNsYXJlZCB3aXRoIGEgc2l6ZSBidXQgdGhpcyBpcyBzdXBwbGllZCB3aXRoIGFyZ3VtZW50IHRoZXNlIHdpbGwgYmUgaW4gdGhlIGZBcnJheUFyZ3VtZW50cwotCQkvLyBuZXcgaW50W10geyAyICwzIH0gd2lsbCBoYXZlIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgc3VwcGxpZWQgYXMgdHdvIG1lc3NhZ2UgYXJndW1lbnRzIHdpdGggCi0JCWlmICggYXJyYXkgPT0gbnVsbCApIHsKLQkJCS8vIFRoZSBzaXplIG9mIHRoZSBhcnJheSBhcmd1bWVudHMgaXMgb3VyIGFycmF5IHNpemUsIGhvd2V2ZXIgZm9yIGEgbXVsdGkgYXJnIGFycmF5IHdlIG5lZWQKLQkJCS8vIHRvIGZpbmQgdGhlIHNpemUgb2YgYW55IG5lc3RlZCBhcnJheXMgd2l0aGluIGFyZ3VtZW50cyB0aGVtc2VsdmVzLCBlLmcuIAotCQkJLy8gbmV3IGludFtdW10geyB7MiwzfSAsIHszLDR9IH0gdGhlbiB3ZSBoYXZlIHR3byBhcnJheSBhcmd1bWVudHMsIGVhY2ggb2Ygd2hpY2ggaXMgYSBNZXNzYWdlQXJndW1lbnQKLQkJCS8vIHdob3NlIHN0YXRlbWVudCBpcyBhbiBBcnJheUFyZ3VtZW50cyB0aGF0IGhhcyB0d28gYXJndW1lbnRzLCBldGMuLi4KLQkJCS8vIFRvIGZpbmQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgd2UgY3JlYXRlIGEgbGlzdCB0aGF0IHdlIGFkZCBvdXIgbnVtYmVyIG9mIGFyZ3VtZW50cyB0bywgYW5kIHRoZW4KLQkJCS8vIHBhc3MgdGhpcyBhbGwgdGhlIHdheSB1cCB0aGUgYXJndW1lbnRzIGNoYWluIHVzaW5nIGNvbnRyaWJ1dGVBcmd1bWVudE51bWJlcihMaXN0KSBzbyB0aGF0IGVhY2ggZWxlbWVudAotCQkJLy8gY2FuIGFkZCB0byB0aGUgbGlzdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIGlmIGFueSApIHRoYXQgdGhleSBoYXZlLiAgCi0JCQlhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKHR5cGUsZ2V0TnVtYmVyT2ZEaW1lbnNpb25zKCkpOwotCQkJLy8gU2V0IHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgdG8gYmUgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkFycmF5QXJndW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pZkFycmF5QXJndW1lbnRzLmdldChpKTsKLQkJCQl0cnkgewkKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBleHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JCQkJCUFycmF5LnNldChhcnJheSxpLGVsZW1lbnQpOwotCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gZXhjICkgewotCQkJCQkvLyBBbnkgZXZhbHVhdGlvbiBleGNlcHRpb25zIHNob3VsZCBiZSB0aHJvd24gYmFjawotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoIGFycmF5RGltZW5zaW9ucyAhPSBudWxsICkgewotCQkvLyBUbyBnZXQgdGhlIGNsYXNzIG9mIGEgcmVmbGVjdGl2ZSBhcnJheSB3ZSBtdXN0IGFjdHVhbGx5IGZpcnN0IGNyZWF0ZSBpdCBhbmQgdGhlbiBhc2sgaXQgZm9yIGl0cyBjbGFzcwotCQkvLyBUaGUgYXJyYXkgRGltZW5zaW9ucyBhcmUgcHJlc2VudCBpZiB0aGUgYXJyYXkgd2FzIGV4cGxpY2l0bHkgZGVjbGFyZWQgd2l0aCBhIHNpemUsIGUuZy4gbmV3IGludFsyXVszXQotCQkvLyB3aWxsIGhhdmUgdG8gYXJyYXlEaW1lbnNpb25zIHRoYXQgcmVwcmVzZW50IHRoZSBleHByZXNzaW9ucyAyIGFuZCAzICggYXMgTnVtYmVyTGl0ZXJhbCBpbnN0YW5jZXMgKQotCQlpZiAoIGFycmF5ID09IG51bGwgKSB7Ci0JCQkvLyBFdmFsdWF0ZSBhbGwgb2YgdGhlIGFycmF5RGltZW5zaW9ucy4gIFRoZXNlIHNob3VsZCBiZSBpbnRlZ2VycwotCQkJaW50W10gZGltZW5zaW9uU2l6ZXMgPSBuZXcgaW50W2FycmF5RGltZW5zaW9ucy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25TaXplcy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7IAotCQkJCQlJbnRlZ2VyIGRpbWVuc2lvblNpemUgPSAoSW50ZWdlcikgKChFeHByZXNzaW9uKWFycmF5RGltZW5zaW9ucy5nZXQoaSkpLmV2YWx1YXRlKCk7Ci0JCQkJCWRpbWVuc2lvblNpemVzW2ldID0gZGltZW5zaW9uU2l6ZS5pbnRWYWx1ZSgpOwotCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gZXhjICkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEZvciBhIG11bHRpIGFyZyBhcnJheSB3ZSBuZWVkIHRvIGNyZWF0ZSB1c2luZyB0aGUgc3RhdGljIG1ldGhvZCBvbiBhcnJheSB0aGF0IHRha2VzIGFuIGludFtdIHRoYXQgcmVwcmVzZW50cwotCQkJLy8gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLCBlLmcuIGZvciBuZXcgU3RyaW5nWzJdWzNdIHdlIGRvIEFycmF5Lm5ld0luc3RhbmNlKFN0cmluZy5jbGFzcyxuZXcgaW50W10geyAyICwgMyB9OwotCQkJYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZSh0eXBlLGRpbWVuc2lvblNpemVzKTsKLQkJfQotCX0KLX0KLS8qKgotICogSWYgdGhlIHRva2VuIGlzIGEgcGVyaW9kIHRoZW4gaXQgY291bGQgZWl0aGVyIGJlIHBhcnQgb2YgdGhlIHR5cGUgb3IgZWxzZSBhIHN0YXRpYyBtZXRob2QgY2FsbAotICovCi1wdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiAsIGNoYXIgZGVsaW1pdGVyICkgewotCi0JLy8gSWYgd2UgZG9uJ3QgeWV0IGhhdmUgYSB2YWxpZCB0eXBlIHRoZW4gc2VlIGlmIHdlIG5vdyBkbwotCWlmICh0eXBlID09IG51bGwpewotCQl0cnkgeyAKLQkJCXR5cGVXcml0ZXIud3JpdGUodG9rZW4pOwotCQl9IGNhdGNoICggSU9FeGNlcHRpb24gZXhjICkge307Ci0JCWNoZWNrRm9yVmFsaWRUeXBlKCk7Ci0JCS8vIElmIHdlIGdvdCBhIHZhbGlkIHR5cGUgYW5kIGEgcGVyaW9kIHRoZW4gcmVtZW1iZXIgaXQKLQkJaWYgKCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICkgewotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWNvbXBsZXRlZFdpdGhQZXJpb2QgPSB0cnVlOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQl9CQkKLQl9Ci0JCi0JaWYgKCBhcnJheURpbWVuc2lvbnMgIT0gbnVsbCAmJiBpc1Byb2Nlc3NpbmdBcnJheURpbWVuc2lvbiApIHsKLQkJRXhwcmVzc2lvbiBsYXN0QXJyYXlEaW1lbnNpb24gPSAoRXhwcmVzc2lvbilhcnJheURpbWVuc2lvbnMuZ2V0KGFycmF5RGltZW5zaW9ucy5zaXplKCktMSk7Ci0JCWxhc3RBcnJheURpbWVuc2lvbi5wdXNoKHRva2VuLGRlbGltaXRlcik7Ci0JCWlmICggZGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlU3F1YXJlQnJhY2UgJiYgaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb24gKSB7Ci0JCQlpc1Byb2Nlc3NpbmdBcnJheURpbWVuc2lvbiA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlpZiAoIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuU3F1YXJlQnJhY2UgJiYgIWlzUHJvY2Vzc2luZ0FycmF5RGltZW5zaW9uICkgewotCQlpZiAoIGFycmF5RGltZW5zaW9ucyA9PSBudWxsICkgYXJyYXlEaW1lbnNpb25zID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKTsKLQkJYXJyYXlEaW1lbnNpb25zLmFkZChzdGF0ZW1lbnQpOwotCQlpc1Byb2Nlc3NpbmdBcnJheURpbWVuc2lvbiA9IHRydWU7Ci0JCXJldHVybiB0aGlzOwkJCi0JfQotCQotCS8vIElmIHdlIGhhdmUgYSB0eXBlIGFuZCB0aGUgZGVsaW1pdGVyIGlzIGEgKCB0aGVuIGl0IG11c3QgYmUgYSBtZXNzYWdlIGJlZ2lubmluZwotCWlmICggdHlwZSAhPSBudWxsICkgewotCQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbikgewotCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gbmV3IE1lc3NhZ2UoIHRoaXMgLCB0b2tlbiAsIGZDbGFzc0xvYWRlciApOwotCQl9IGVsc2UgaWYgKGNvbXBsZXRlZFdpdGhQZXJpb2QpewotCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQlGaWVsZCBmaWVsZCA9IG5ldyBGaWVsZCh0aGlzLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JCQkvLyBJZiBvdXIgdG9rZW4gaXMgYSApLCAnICcgb3IgLCB0aGVuIHRoZSBmaWVsZCBpcyBjb21wbGV0ZWQsCi0JCQkvLyBvdGhlcndpc2UgbGVhdmUgaXQgb3BlbiBzbyBpdCB3aWxsIHByb2Nlc3MgdGhlIHJlbWFpbmluZyB0b2tlbnMKLS8vCQkJaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJTcGFjZSB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEpIHsKLQkJCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbiB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEpIHsKLQkJCQlmaWVsZC5pc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmaWVsZDsKLQkJfQotCX0KLQkJCQotCS8vIFdlIGFyZSBzdGlsbCBsb29raW5nIGZvciBhIHR5cGUgc28gYXBwZW5kIGEgLgotCWlmICggdHlwZSA9PSBudWxsICkgewotCQl0eXBlV3JpdGVyLndyaXRlKCcuJyk7Ci0JfQotCXJldHVybiB0aGlzOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCi0JU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIlN0YXRpYyAiKTsgLy8kTk9OLU5MUy0xJAotCWlmICggdHlwZSA9PSBudWxsICkgeyAKLQkJd3JpdGVyLndyaXRlKCIoSW5jb21wbGV0ZSkgeyIpOyAvLyROT04tTkxTLTEkCi0JfSBlbHNlIHsKLQkJd3JpdGVyLndyaXRlKCIoQ29tcGxldGUpIHsiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQl3cml0ZXIud3JpdGUodHlwZVdyaXRlci50b1N0cmluZygpKTsKLQl3cml0ZXIud3JpdGUoIn0iKTsgLy8kTk9OLU5MUy0xJAotCWlmICggYXJyYXlEaW1lbnNpb25zICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZSgiIGFycmF5IGRpbWVuc2lvbnM9Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKG5ldyBJbnRlZ2VyKGFycmF5RGltZW5zaW9ucy5zaXplKCkpLnRvU3RyaW5nKCkpOwotCX0KLQlpZiAoIGZBcnJheUFyZ3VtZW50cyAhPSBudWxsICkgewkKLQkJd3JpdGVyLndyaXRlKCIgYXJyYXkgZGltZW5zaW9ucz0iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUobmV3IEludGVnZXIoZkFycmF5QXJndW1lbnRzLnNpemUoKSkudG9TdHJpbmcoKSk7Ci0JfQotCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLQotfQotCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQlyZXR1cm4gZ2V0VHlwZUNsYXNzKCkuaXNQcmltaXRpdmUoKTsKLX0KLXB1YmxpYyB2b2lkIHNldEFycmF5QXJndW1lbnRzKExpc3QgYXJndW1lbnRzKSB7Ci0JZkFycmF5QXJndW1lbnRzID0gYXJndW1lbnRzOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9TdHJpbmdMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1N0cmluZ0xpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1NWE4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1N0cmluZ0xpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogU3RyaW5nTGl0ZXJhbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZTsKLQlwdWJsaWMgU3RyaW5nIHZhbHVlOwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgdmFsdWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFc2NhcGVkID0gZmFsc2U7Ci0KLS8qKgotICogY29uc3RydWN0b3IKLSAqLwotcHVibGljIFN0cmluZ0xpdGVyYWwoKXsKLX0KLQkKLS8qKgotICogZXZhbHVhdGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB7Ci0JcmV0dXJuIHZhbHVlQnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gaXNDb21wbGV0ZTsKLX0KLS8qKgotICogV2UgbXVzdCBldmFsdWF0ZSBvdXJzZWxmIGFuZCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHJlc3VsdAotICovCi0gCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgewotCXJldHVybiBTdHJpbmcuY2xhc3M7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gU3RyaW5nLmNsYXNzLmdldE5hbWUoKTsKLX0KLQotLyoqCi0gKlRoaXMgc3RyaW5nIG1pZ2h0IGJlIGJyb2tlbiBpbnRvIGEgZmV3IHRva2VucwotICpzbyB3ZSBuZWVkIGEgU3RyaW5nQnVmZmVyLgotICogCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCWludCBhcHBlbmRUb2tlblN0YXJ0ID0gMDsKLQlpbnQgYXBwZW5kVG9rZW5MZW5ndGggPSB0b2tlbi5sZW5ndGg7Ci0JaWYgKGlzRXNjYXBlZCkgewotCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJaWYgKHRva2VuLmxlbmd0aCAhPSAwKSB7Ci0JCQljaGFyIGMgPSB0b2tlblswXTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ2InOgotCQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoJ1xiJyk7Ci0JCQkJCWFwcGVuZFRva2VuU3RhcnQgPSAxOwotCQkJCQlhcHBlbmRUb2tlbkxlbmd0aC0tOwotCQkJCQlicmVhazsKLQkJCQljYXNlICd0JzoKLQkJCQkJdmFsdWVCdWZmZXIuYXBwZW5kKCdcdCcpOwotCQkJCQlhcHBlbmRUb2tlblN0YXJ0ID0gMTsKLQkJCQkJYXBwZW5kVG9rZW5MZW5ndGgtLTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnbic6Ci0JCQkJCXZhbHVlQnVmZmVyLmFwcGVuZCgnXG4nKTsKLQkJCQkJYXBwZW5kVG9rZW5TdGFydCA9IDE7Ci0JCQkJCWFwcGVuZFRva2VuTGVuZ3RoLS07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ3InOgotCQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoJ1xyJyk7Ci0JCQkJCWFwcGVuZFRva2VuU3RhcnQgPSAxOwotCQkJCQlhcHBlbmRUb2tlbkxlbmd0aC0tOwotCQkJCQlicmVhazsKLQkJCQljYXNlICd1JzoKLQkJCQkJLy8gVW5pY29kZSwgbmV4dCBmb3VyIGdhdGhlciBmb3IgdGV4dDsKLQkJCQkJaWYgKGFwcGVuZFRva2VuTGVuZ3RoPj01KSB7Ci0JCQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQobmV3IFN0cmluZyh0b2tlbiwgMSwgNCksIDE2KSk7Ci0JCQkJCQlhcHBlbmRUb2tlblN0YXJ0PTU7Ci0JCQkJCQlhcHBlbmRUb2tlbkxlbmd0aC09NTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCS8vIElmIHdlIGRpZG4ndCBhcHBlbmQgYW55dGhpbmcsIHRoZW4gbm90IGEgdHJ1ZSBlc2NhcGUsIHNvIHB1dCB0aGUgZXNjYXBlIG9uLgotCQkJaWYgKGFwcGVuZFRva2VuU3RhcnQ9PTApCi0JCQkJdmFsdWVCdWZmZXIuYXBwZW5kKERlbGltaXRlckVzY2FwZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlclF1b3RlIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJFc2NhcGUgfHwgZGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlKQotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwkvLyBJdCB3YXMgYSB0cnVlIGVzY2FwZS4KLQkJCWVsc2UgewotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChEZWxpbWl0ZXJFc2NhcGUpOwkvLyBJZiB3YXNuJ3QgYSB0cnVlIGVzY2FwZQotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwotCQkJfQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQl9Ci0JCi0JaWYgKGFwcGVuZFRva2VuTGVuZ3RoID4gMCkKLQkJdmFsdWVCdWZmZXIuYXBwZW5kKHRva2VuLCBhcHBlbmRUb2tlblN0YXJ0LCBhcHBlbmRUb2tlbkxlbmd0aCk7Ci0JCi0JaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJRdW90ZSl7CQkKLQkJaXNDb21wbGV0ZSA9dHJ1ZTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCS8vIElmIHRoZSBkZWxpbWl0ZXIgaXMgYW4gZXNjYXBlIGNoYXJhY3RlciByZW1lbWJlciBpdCBzbyB3ZSBjYW4gZXNjYXBlCi0JLy8gdGhlIG5leHQgdG9rZW4sIG90aGVyd2lzZSB0cmVhdCBpdCBhcyBhIGxpdGVyYWwKLQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlckVzY2FwZSApewotCQlpc0VzY2FwZWQgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwotCX0KLQlyZXR1cm4gdGhpczsKLX0KLQotLyoqCi0gKiBTdHJpbmdzIGFyZSBub3QgcHJpbWl0aXZlcy4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmZmVyLmFwcGVuZCgiU3RyaW5nKFwiIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIHZhbHVlQnVmZmVyICE9IG51bGwgKSB7Ci0JCWJ1ZmZlci5hcHBlbmQodmFsdWVCdWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCWJ1ZmZlci5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTY5MjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvbWVzc2FnZXMucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJAotIwotCi0KLSMKLSMgUHJvcGVydGllcyBmb3IgdGhlIFByb3h5IEJhc2UgVk0gU3VwcG9ydAotIwotVW5leHBlY3RlZFRva2VuX0VYQ18gICAgICAgICAgICAgICAgPSBJV0FWMDEyN0UgVW5leHBlY3RlZCBUb2tlbiAiezB9Ii4KLVN0YXRlbWVudC5VbmV4cGVjdGVkRXhlY3V0aW9uX0VYQ18gID0gSVdBVjAxMjhFIFN0YXRlbWVudCB3YXMgZXhlY3V0ZWQgdW5leHBlY3RlZGx5LgotU3RhdGVtZW50LlVuZXhwZWN0ZWRFdmFsdWF0aW9uX0VYQ18gPSBJV0FWMDEyOUUgU3RhdGVtZW50cyBzaG91bGQgbm90IGJlIGV2YWx1YXRlZC4KLUNoYXJUb29Db21wbGljYXRlZF9FWENfICAgICAgICAgICAgID0gSVdBVjAxMzBFIElucHV0IHRleHQgbm90IGEgY2hhciB0aGF0IGNhbiBiZSBldmFsdWF0ZWQuIFRvbyBjb21wbGljYXRlZC4gXCJ7MH0iCi1QcmltaXRpdmVPcGVyYXRpb24uRXZhbHVhdGUuSW52YWxpZE9wZXJhdG9yX0VYQ189SW52YWxpZCBvcGVyYXRvciB7MH0gYmV0d2VlbiB7MX0gYW5kIHsyfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0Fic3RyYWN0RW51bS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0Fic3RyYWN0RW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTBiMGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BYnN0cmFjdEVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBYnN0cmFjdEVudW0uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wNS8xMSAxOTowMToxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLS8qKgotICogQmFzZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZW51bS4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbnVtIGltcGxlbWVudHMgRW51bSB7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgZW51bWVyYXRvci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluaXRpYWxpemVkIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbnVtZXJhdG9yLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEVudW0oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW51bWVyYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW51bWVyYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9FbnVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDJmYjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9FbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogRW51bS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA1LzExIDE5OjAxOjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotLyoqCi0gKiBUeXBlU2FmZSBlbnVtZXJhdGlvbnMgZm9yIHRoZSBJRXhwcmVzc2lvbiBwcm9jZXNzaW5nLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbnVtIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZS4KLQkgKi8KLQlpbnQgZ2V0VmFsdWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvRXhwcmVzc2lvblByb2Nlc3Nlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0V4cHJlc3Npb25Qcm9jZXNzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliMzk1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvRXhwcmVzc2lvblByb2Nlc3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBFeHByZXNzaW9uUHJvY2Vzc2VyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIxICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci5Jbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIuSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXI7Ci0gCi0vKioKLSAqIEV4cHJlc3Npb24gcHJvY2Vzc2luZy4gVGhpcyBkb2VzIHRoZSBhY3R1YWwgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIHdpdGggdGhlIGxpdmUgb2JqZWN0cy4KLSAqIEl0IGlzIG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgb25seSB0byBwcm92aWRlIGFkZGl0aW9uYWwgZXhwcmVzc2lvbiB0eXBlcy4gQWxsIG9mIHRoZQotICogY3VycmVudCBleHByZXNzaW9ucyBjYW5ub3QgYmUgb3ZlcnJpZGRlbi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBzdGFjayBpcyB2ZXJ5IHNlbnNpdGl2ZSB0byAKLSAqIGNhbGwgb3JkZXIuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwcmVzc2lvblByb2Nlc3NlciB7Ci0KLQkvKioKLQkgKiBBIHZhcmlhYmxlIHJlZmVyZW5jZSBmb3IgYSBmaWVsZCBhY2Nlc3MuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBGaWVsZEFjY2Vzc1JlZmVyZW5jZSBleHRlbmRzIFZhcmlhYmxlUmVmZXJlbmNlIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgRmllbGQgZmllbGQ7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHJlY2VpdmVyOwotCi0JCS8qKgotCQkgKiBVc2UgdGhpcyB0byBjb25zdHJ1Y3QgYSBGaWVsZEFjY2Vzc1JlZmVyZW5jZS4gVGhpcyB3aWxsIGRvIGNoZWNrcyB0byBtYWtlIHN1cmUKLQkJICogaXQgaXMgdmFsaWQgc28gdGhhdCBleGNlcHRpb25zIHdvbid0IGJlIHRocm93biBsYXRlciB3aGVuIGFjdHVhbGx5IGRlcmVmZXJlbmNlZC4KLQkJICogCi0JCSAqIEBwYXJhbSBmaWVsZAotCQkgKiBAcGFyYW0gcmVjZWl2ZXIKLQkJICogQHJldHVybgotCQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEZpZWxkQWNjZXNzUmVmZXJlbmNlIGNyZWF0ZUZpZWxkQWNjZXNzUmVmZXJlbmNlKEZpZWxkIGZpZWxkLCBPYmplY3QgcmVjZWl2ZXIpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQkJLy8gSWYgc3RhdGljLCB0aGVuIHJlY2VpdmVyIGlzIGlnbm9yZWQuCi0JCQlpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkgewotCQkJCWlmICghZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0luc3RhbmNlKHJlY2VpdmVyKSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5DcmVhdGVGaWVsZEFjY2Vzc1JlZmVyZW5jZS5GaWVsZHNUeXBlc05vdE1hdGNoaW5nX0VYQ18iKSwgbmV3IE9iamVjdFtde2ZpZWxkLmdldFR5cGUoKSwgKHJlY2VpdmVyIT1udWxsID8gcmVjZWl2ZXIuZ2V0Q2xhc3MoKSA6IG51bGwpfSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwkvLyBNYWtlIGl0IGFsd2F5cyBhY2Nlc3NpYmxlLiBUcnVzdCBpdC4gCi0JCQlyZXR1cm4gbmV3IEZpZWxkQWNjZXNzUmVmZXJlbmNlKGZpZWxkLCByZWNlaXZlcik7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBGaWVsZEFjY2Vzc1JlZmVyZW5jZShGaWVsZCBmaWVsZCwgT2JqZWN0IHJlY2VpdmVyKSB7Ci0JCQl0aGlzLmZpZWxkID0gZmllbGQ7Ci0JCQl0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5FeHByZXNzaW9uUHJvY2Vzc2VyLlZhcmlhYmxlUmVmZXJlbmNlI2RlcmVmZXJlbmNlKCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZGVyZWZlcmVuY2UoKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmaWVsZC5nZXQocmVjZWl2ZXIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTaG91bGRuJ3Qgb2NjdXIuIEFscmVhZHkgdGVzdGVkIGZvciB0aGlzLgotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTaG91bGRuJ3Qgb2NjdXIuIEFscmVhZHkgdGVzdGVkIGZvciB0aGlzLgotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkV4cHJlc3Npb25Qcm9jZXNzZXIuVmFyaWFibGVSZWZlcmVuY2Ujc2V0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBPYmplY3Qgc2V0KE9iamVjdCB2YWx1ZSwgQ2xhc3MgdHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0JCQlmaWVsZC5zZXQocmVjZWl2ZXIsIHZhbHVlKTsKLQkJCXJldHVybiBmaWVsZC5nZXQocmVjZWl2ZXIpOwkvLyBKdXN0IGluIGNhc2Ugc29tZSBjb252ZXJzaW9uIGhhcHBlbmVkLiBUZWNobmljYWxseSBpdCBpcyBub3QgdGhlIHZhbHVlIHNldCBidXQgdGhlIHJldHJpZXZlZCB3aGVuIGluIGFuIGFzc2lnbm1lbnQuCi0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJGaWVsZEFjY2Vzc3siK2ZpZWxkLnRvU3RyaW5nKCkrIn0gb24gIisocmVjZWl2ZXIgIT0gbnVsbCA/IHJlY2VpdmVyLnRvU3RyaW5nKCkgOiAiPHN0YXRpYyBhY2Nlc3M+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQSB2YXJpYWJsZSByZWZlcmVuY2UgZm9yIGFuIEFycmF5IGFjY2Vzcy4gSXQgd2lsbCByZWZlcmVuY2Ugb25seSB0aGUgbGFzdCBpbmRleGVkIGVudHJ5IG9mIHRoZSBhcnJheS4KLQkgKiBGb3IgZXhhbXBsZSBpZiA8Y29kZT54WzNdWzRdPC9jb2RlPiBpcyB0aGUgYWNjZXNzLCB0aGVuIHdoYXQgd2lsbCBiZSBnaXZlbiB0byB0aGlzIHJlZmVyZW5jZSB3aWxsIGJlCi0JICogdGhlIGFycmF5IGVudHJ5IGF0IHhbM11bNF0sIG5vdCB0aGUgeCBhcnJheSBpdHNlbGYuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBBcnJheUFjY2Vzc1JlZmVyZW5jZSBleHRlbmRzIFZhcmlhYmxlUmVmZXJlbmNlIHsKLQkJCi0JCQotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBhcnJheTsKLQkJcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0KLQkJLyoqCi0JCSAqIFVzZSB0aGlzIHRvIGNvbnN0cnVjdCBhbiBhcnJheSBhY2Nlc3MgcmVmZXJlbmNlLiBUaGlzIHdpbGwgZG8gY2hlY2tzIHRvIG1ha2Ugc3VyZQotCQkgKiBpdCBpcyB2YWxpZCBzbyB0aGF0IGV4Y2VwdGlvbnMgd29uJ3QgYmUgdGhyb3duIGxhdGVyIHdoZW4gYWN0dWFsbHkgZGVyZWZlcmVuY2VkLgotCQkgKiAKLQkJICogQHBhcmFtIGFycmF5Ci0JCSAqIEBwYXJhbSBpbmRleAotCQkgKiBAcmV0dXJuCi0JCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQXJyYXlBY2Nlc3NSZWZlcmVuY2UgY3JlYXRlQXJyYXlBY2Nlc3NSZWZlcmVuY2UoT2JqZWN0IGFycmF5LCBpbnQgaW5kZXgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7Ci0JCQlpbnQgbGVuID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKLQkJCWlmIChpbmRleCA8IDAgfHwgbGVuIDw9IGluZGV4KQotCQkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuQ3JlYXRlQXJyYXlBY2Nlc3NSZWZlcmVuY2UuT3V0T2ZCb3VuZHNfRVhDXyIpLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoaW5kZXgpLCBuZXcgSW50ZWdlcihsZW4pfSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IEFycmF5QWNjZXNzUmVmZXJlbmNlKGFycmF5LCBpbmRleCk7Ci0JCX0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdCB0aGUgcmVmZXJlbmNlIHdpdGggdGhlIGFycmF5IGFuZCB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGJlaW5nIHJlZmVyZW5jZWQuCi0JCSAqIEBwYXJhbSBhcnJheQotCQkgKiBAcGFyYW0gaW5kZXgKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJvdGVjdGVkIEFycmF5QWNjZXNzUmVmZXJlbmNlKE9iamVjdCBhcnJheSwgaW50IGluZGV4KSB7Ci0JCQl0aGlzLmFycmF5ID0gYXJyYXk7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5WYXJpYWJsZVJlZmVyZW5jZSNkZXJlZmVyZW5jZSgpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGRlcmVmZXJlbmNlKCkgewotCQkJcmV0dXJuIEFycmF5LmdldChhcnJheSwgaW5kZXgpOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuVmFyaWFibGVSZWZlcmVuY2Ujc2V0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBPYmplY3Qgc2V0KE9iamVjdCB2YWx1ZSwgQ2xhc3MgdHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQlBcnJheS5zZXQoYXJyYXksIGluZGV4LCB2YWx1ZSk7Ci0JCQlyZXR1cm4gQXJyYXkuZ2V0KGFycmF5LCBpbmRleCk7CS8vIEluIGNhc2UgdGhlcmUgd2FzIHNvbWUgY29udmVyc2lvbiBhcHBsaWVkLiBUZWNobmljYWxseSBpdCBpcyBub3QgdGhlIHZhbHVlIHNldCBidXQgdGhlIHJldHJpZXZlZCB3aGVuIGluIGFuIGFzc2lnbm1lbnQuCi0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJBcnJheUFjY2Vzc1siK2luZGV4KyJdOiAiK2FycmF5LnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBleHByZXNzaW9uIHJlc3VsdCBzdGFjayBhbmQgdGhlIGV4cHJlc3Npb24gcmVzdWx0IHR5cGUgc3RhY2suCi0JICogVGhlIHR5cGUgc3RhY2sgaXMgdXNlZCB0byBiZSBleHBlY3RlZCB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0JICogZXhwcmVzc2lvbiByZXN1bHQuIFRoaXMgaXMgbmVlZGVkIGZvciBjb252ZXJ0aW5nIHRvIHByaW1pdGl2ZXMKLQkgKiBhbmQgZm9yIGZpbmRpbmcgY29ycmVjdCBtZXRob2QgY2FsbCBmcm9tIHRoZSBhcmd1bWVudCB0eXBlcy4gSW4KLQkgKiB0aGlzIGNhc2UsIGl0IGlzIG5vdCB0aGUgdHJ1ZSB2YWx1ZSwgYnV0IHRoZSB2YWx1ZSBleHBlY3RlZCwgZS5nLgotCSAqIDxjb2RlPk9iamVjdCBnZXRPYmplY3QoKTwvY29kZT4gcmV0dXJucyBzb21ldGhpbmcgb2YgdHlwZSBPYmplY3QuCi0JICogVGhpcyBuZWVkcyB0byBiZSBtYWludGFpbmVkIHNvIHRoYXQgaWYgaXQgZ29lcyBpbnRvIGFub3RoZXIgbWV0aG9kCi0JICogd2UgZG9uJ3QgYWNjaWRlbnRseSByZXR1cm4gYSBtb3JlIHNwZWNpZmljIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZQotCSAqIG9uZSB0aGF0IHRha2VzIE9iamVjdCBhcyBhbiBhcmd1bWVudC4gCi0JICogCi0JICogZXhwcmVzc2lvblN0YWNrIGhhcyByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24uCi0JICogZXhwcmVzc2lvblR5cGVTdGFjayBoYXMgdGhlIGNvbXB1dGVkIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gaS5lLgotCSAqIHRoZSB0eXBlIHRoYXQgdGhlIGV4cHJlc3Npb24gcmV0dXJucywgbm90IHRoZSB0eXBlIG9mIHRoZSB2YWx1ZS4KLQkgKiBUaGVzZSBjYW4gYmUgZGlmZmVyZW50IGJlY2F1c2UgdGhlIGV4cHJlc3Npb24gKGUuZy4gbWV0aG9kKSBtYXkKLQkgKiByZXR1cm4gYW4gT2JqZWN0LCBidXQgdGhlIGV4cHJlc3Npb24gdmFsdWUgd2lsbCBiZSBzb21lIHNwZWNpZmljCi0JICogc3ViY2xhc3MuIFNvIHRoZSBleHByZXNzaW9uVHlwZVN0YWNrIHdvdWxkIGhhdmUgYSA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0LmNsYXNzPC9jb2RlPgotCSAqIG9uIGl0IGluIHRoYXQgY2FzZS4KLQkgKiBOb3RlOiBpZiB0aGUgZXhwcmVzc2lvblN0YWNrIGhhcyBhIDxjb2RlPm51bGw8L2NvZGU+IG9uIGl0LCB0aGVuIHRoZSB0eXBlIHN0YWNrCi0JICogbWF5IGVpdGhlciBoYXZlIGEgc3BlY2lmaWMgdHlwZSBpbiBpdCwgb3IgaXQgbWF5IGJlIDxjb2RlPk1ldGhvZEhlbHBlci5OVUxMX1RZUEU8L2NvZGU+LiBJdAotCSAqIHdvdWxkIGJlIHRoaXMgaWYgaXQgd2FzIGV4cGxpY2l0bHkgcHVzaGVkIGluIGFuZCBub3QgYXMgdGhlCi0JICogcmVzdWx0IG9mIGEgY29tcHV0YXRpb24uIElmIHRoZSByZXN1bHQgb2YgYSBjb21wdXRhdGlvbiwgaXQgd291bGQgaGF2ZSB0aGUKLQkgKiB0cnVlIHZhbHVlLgotCSAqIE5vdGU6IGlmIHRoZSBleHByZXNzaW9uU3RhY2sgaGFzIGEgPGNvZGU+Vm9pZC50eXBlPC9jb2RlPiBvbiBpdCwgdGhlbiB0aGF0Ci0JICogbWVhbnMgdGhlIHByZXZpb3VzIGV4cHJlc3Npb24gaGFkIG5vIHJlc3VsdC4gVGhpcyBpcyBhbiBlcnJvciBpZiB0cnlpbmcgdG8KLQkgKiB1c2UgdGhlIGV4cHJlc3Npb24gaW4gYW5vdGhlciBleHByZXNzaW9uLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIuTWV0aG9kSGVscGVyI05VTExfVFlQRQotCSAqLwotCXByaXZhdGUgTGlzdCBleHByZXNzaW9uU3RhY2sgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQlwcml2YXRlIExpc3QgZXhwcmVzc2lvblR5cGVTdGFjayA9IG5ldyBBcnJheUxpc3QoMTApOwotCQotCS8qKgotCSAqIExpc3Qgb2YgdGhlIGV4cHJlc3Npb24gcHJveGllcy4gVGhlIGluZGV4IGludG8gdGhlIGxpc3QgaXMgdGhlCi0JICogc2FtZSBhcyB0aGUgZXhwcmVzc2lvbiBwcm94eSBpZC4gCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3QgZXhwcmVzc2lvblByb3hpZXM7CS8vIEl0IGlzIGFycmF5IGxpc3QgYmVjYXVzZSB3ZSB3YW50IHRvIGNhbGwgZW5zdXJlQ2FwYWNpdHkgYW5kIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBvbiBMaXN0LgotCQotCS8qKgotCSAqIEFuIGVycm9yIGhhcyBvY2N1cnJlZC4gQXQgdGhpcyBwb2ludCBhbGwgc3ViY29tbWFuZHMgd2lsbCBzaW1wbHkgbWFrZSBzdXJlIHRoZXkgZmx1c2ggdGhlIGlucHV0IHN0cmVhbQotCSAqIGNvcnJlY3RseSwgYnV0IHRoZXkgZG8gbm90IHByb2Nlc3MgaXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGVycm9yT2NjdXJyZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gbm92YWx1ZUV4Y2VwdGlvbiA9IGZhbHNlOwotCQotCXByaXZhdGUgVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG51bGw7CS8vIFdhcyB0aGVyZSBhbm90aGVyIGtpbmQgb2YgZXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodC4KLQkKLQkvKioKLQkgKiBQcm9jZXNzIGFsbCBvdGhlciBleGNlcHRpb25zIHRoZW4gdGhlIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB1c2FnZSBjb2RlIHNvIHRoYXQgaWYgdGhlcmUgd2FzIGFuIGVycm9yCi0JICogaW4gc2V0dGluZyB1cCBmb3IgYSBjYWxsIHRvIHRoZSBwcm9jZXNzZXIgaXQgY2FuIGJlIGxvZ2dlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3NFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJLy8gUHJvY2VzcyBhbGwgb3RoZXIgZXhjZXB0aW9ucy4KLQkJbm92YWx1ZUV4Y2VwdGlvbiA9IGZhbHNlOwotCQl3aGlsZSAoZS5nZXRDYXVzZSgpICE9IG51bGwpCi0JCQllID0gZS5nZXRDYXVzZSgpOwotCQlpZiAodHJhY2VPbikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIqKioqKiA+Pj5cdEV4Y2VwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfQotCQl0aHJvd0V4Y2VwdGlvbihlKTsJLy8gVHJlYXQgYXMgYSB0aHJvdyB0byBsZXQgdHJ5L2NhdGNoZXMgZXhwcmVzc2lvbnMgaGFuZGxlIGl0LgotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIGEgc3ludGF4IGV4Y2VwdGlvbi4gVGhpcyBtZWFucyBkYXRhIGNvbWluZyBhY3Jvc3MgaXMgY29ycnVwdGVkIGluCi0JICogc29tZSB3YXkgc28gbm8gZnVydGhlciBwcm9jZXNzaW5nIHNob3VsZCBvY2N1ci4gCi0JICogQHBhcmFtIGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzU3ludGF4RXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCWVycm9yT2NjdXJyZWQgPSB0cnVlOwotCQlub3ZhbHVlRXhjZXB0aW9uID0gZmFsc2U7Ci0JCWV4Y2VwdGlvbiA9IGU7CQkKLQl9Ci0JCQotCS8qKgotCSAqIFByb2Nlc3MgYSBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbi4gRG9uJ3Qgd3JhcHBlciB0aGVzZS4KLQkgKiBAcGFyYW0gZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTeW50YXhFeGNlcHRpb24oTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQlpZiAodHJhY2VPbikgewotCQkJLy8gVGhpcyBjYW4gaGFwcGVuIGF0IGFueSB0aW1lLCBzbyBtYWtlIHN1cmUgd2UgYXJlIG9uIGEgbmV3IGxpbmUuCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCXByaW50VHJhY2UoIkV4cHJlc3Npb24gaGFzIG5vIHZhbHVlIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVycm9yT2NjdXJyZWQgPSB0cnVlOwotCQkJbm92YWx1ZUV4Y2VwdGlvbiA9IHRydWU7Ci0JCQlleGNlcHRpb24gPSBlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbm8gZXJyb3JzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIG5vRXJyb3JzKCkgewotCQlyZXR1cm4gIWVycm9yT2NjdXJyZWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlcnJvciBpcyBhIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIG9yIG5vdC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb0V4cHJlc3Npb25WYWx1ZSgpIHsKLQkJcmV0dXJuIG5vdmFsdWVFeGNlcHRpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGhyb3dhYmxlIGlmIGEgVGhyb3dhYmxlIHdhcyBjYXVnaHQuCi0JICogCi0JICogQHJldHVybiBUaGUgdGhyb3dhYmxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXJyb3JUaHJvd2FibGUoKSB7Ci0JCXJldHVybiBleGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogUHVzaCB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBhbmQgaXRzIGV4cGVjdGVkIHR5cGUuCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdHlwZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHB1c2hFeHByZXNzaW9uVmFsdWUoT2JqZWN0IG8sIENsYXNzIHR5cGUpIHsKLQkJZXhwcmVzc2lvblN0YWNrLmFkZChvKTsKLQkJZXhwcmVzc2lvblR5cGVTdGFjay5hZGQodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogUG9wIGp1c3QgdGhlIGV4cHJlc3Npb24gdmFsdWUuIEl0IGlzIGltcGVyaXRpdmUgdGhhdCB0aGUgZXhwcmVzc2lvbiB0eXBlCi0JICogaXMgcG9wcGVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZy4gU2VwYXJhdGVkIHRoZSBtZXRob2RzIHNvIHRoYXQgd2UKLQkgKiBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhbiBhcnJheSB0byByZXR1cm4gdHdvIHZhbHVlcy4gVGhpcyB3aWxsIGRlcmVmZXJlbmNlCi0JICogYW55IHZhcmlhYmxlIHJlZmVyZW5jZXMuCi0JICogCi0JICogQHJldHVybiBUaGUgdmFsdWUuCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgcG9wRXhwcmVzc2lvbigpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwb3BFeHByZXNzaW9uKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBQb3AganVzdCB0aGUgZXhwcmVzc2lvbiB2YWx1ZS4gSXQgaXMgaW1wZXJpdGl2ZSB0aGF0IHRoZSBleHByZXNzaW9uIHR5cGUKLQkgKiBpcyBwb3BwZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nLiBTZXBhcmF0ZWQgdGhlIG1ldGhvZHMgc28gdGhhdCB3ZQotCSAqIGRvbid0IG5lZWQgdG8gY3JlYXRlIGFuIGFycmF5IHRvIHJldHVybiB0d28gdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBkZVJlZmVyZW5jZSBJZiB0aGUgdG9wIGV4cHJlc3Npb24gaXMgYSBSZWZlcmVuY2UsIHRoZW4gZGVyZWZlcmVuY2UgaXQuCi0JICogQHJldHVybiBUaGUgdmFsdWUuCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgcG9wRXhwcmVzc2lvbihib29sZWFuIGRlUmVmZXJlbmNlKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gRG8gbm90IHBvcCBhYm92ZSB0aGUgY3VycmVudCBzdWJleHByZXNzaW9uIHBvcywgaWYgYW55LgotCQkJaWYgKHRvcFN1YmV4cHJlc3Npb24gIT0gLTEpCi0JCQkJaWYgKGV4cHJlc3Npb25TdGFjay5zaXplKCkgPT0gc3ViZXhwcmVzc2lvblN0YWNrUG9zW3RvcFN1YmV4cHJlc3Npb25dKQotCQkJCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKTsKLQkJCQotCQkJT2JqZWN0IHJlc3VsdCA9IGV4cHJlc3Npb25TdGFjay5yZW1vdmUoZXhwcmVzc2lvblN0YWNrLnNpemUoKS0xKTsKLQkJCWlmIChkZVJlZmVyZW5jZSAmJiByZXN1bHQgaW5zdGFuY2VvZiBWYXJpYWJsZVJlZmVyZW5jZSkKLQkJCQlyZXN1bHQgPSAoKFZhcmlhYmxlUmVmZXJlbmNlKSByZXN1bHQpLmRlcmVmZXJlbmNlKCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBleHByZXNzaW9uIGF0IDxjb2RlPmZyb21Ub3A8L2NvZGU+IGRvd24gZnJvbSB0aGUgdG9wLiBUaGlzIGlzCi0JICogbmVlZCBmb3Igd2hlbiBtdWx0aS1vcGVyYXRvcnMgaGFwcGVuIGFuZCB0aGV5IGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSBvZiAKLQkgKiB3aGF0IGlzIG5lZWRlZC4gVGhleSB3b3VsZCBub3JtYWxseSBiZSBzdG9yZWQgbGVmdCB0byByaWdodCwgd2l0aCB0aGUKLQkgKiByaWdodG1vc3Qgb25lIG9uIHRvcC4gQnV0IHRoZXkgbmVlZCB0byBiZSBwcm9jZXNzZWQgbGVmdCB0byByaWdodCwgc28KLQkgKiB0byBnZXQgdGhlIGxlZnQgbW9zdCBvbmUgcmVxdWlyZXMgZGlnZ2luZyBkb3duIGluIHRoZSBzdGFjay4KLQkgKiA8cD4KLQkgKiBXaGVuIGRvbmUsIDxjb2RlPnBvcEV4cHJlc3Npb25zKGludCBjb3VudCk8L2NvZGU+IG11c3QgYmUgY2FsbGVkIHRvCi0JICogY2xlYW4gdGhlbSBvdXQgc2luY2UgdGhleSB3ZXJlIHByb2Nlc3NlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgbm90IGRlcmVmZXJlbmNlIHRoZSBleHByZXNzaW9uLiBJdCBpcyB0aGUgam9iIG9mIHRoZSBjYWxsZXIgdG8gZG8gdGhpcy4gCi0JICogIAotCSAqIEBwYXJhbSBmcm9tVG9wIDxjb2RlPjE8L2NvZGU+IGlzIHRoZSB0b3Agb25lLCA8Y29kZT4yPC9jb2RlPiBpcyB0aGUgbmV4dCBvbmUgZG93bi4KLQkgKiBAcmV0dXJuIFRoZSBlbnRyeSBmcm9tIHRoZSB0b3AgdGhhdCB3YXMgcmVxdWVzdGVkLgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElERUV4cHJlc3Npb24jcG9wRXhwcmVzc2lvbnMoaW50KQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgZ2V0RXhwcmVzc2lvbihpbnQgZnJvbVRvcCkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vIERvIG5vdCBwdWxsIGFib3ZlIHRoZSBjdXJyZW50IHN1YmV4cHJlc3Npb24gcG9zLCBpZiBhbnkuCQkJCi0JCQlpZiAodG9wU3ViZXhwcmVzc2lvbiAhPSAtMSkKLQkJCQlpZiAoZXhwcmVzc2lvblN0YWNrLnNpemUoKS1mcm9tVG9wIDwgc3ViZXhwcmVzc2lvblN0YWNrUG9zW3RvcFN1YmV4cHJlc3Npb25dKQotCQkJCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKTsKLQkJCQotCQkJcmV0dXJuIGV4cHJlc3Npb25TdGFjay5nZXQoZXhwcmVzc2lvblN0YWNrLnNpemUoKS1mcm9tVG9wKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHRvcCA8Y29kZT5jb3VudDwvY29kZT4gaXRlbXMuIFRoaXMgd2lsbCBub3QgY2F1c2UgZGVyZWZlcmVuY2luZyB0byBvY2N1ci4gSXQKLQkgKiByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgc3RhY2sgZW50cmllcy4KLQkgKiAKLQkgKiBAcGFyYW0gY291bnQKLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcG9wRXhwcmVzc2lvbnMoaW50IGNvdW50KSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gRG8gbm90IHBvcCBhYm92ZSB0aGUgY3VycmVudCBzdWJleHByZXNzaW9uIHBvcywgaWYgYW55LgotCQkJaW50IHN0b3AgPSB0b3BTdWJleHByZXNzaW9uICE9IC0xID8gc3ViZXhwcmVzc2lvblN0YWNrUG9zW3RvcFN1YmV4cHJlc3Npb25dIDogLTE7Ci0JCQlpbnQgcmVtb3ZlID0gZXhwcmVzc2lvblN0YWNrLnNpemUoKS0xOwotCQkJd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0JCQkJaWYgKGV4cHJlc3Npb25TdGFjay5zaXplKCkgPD0gc3RvcCkKLQkJCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCk7CS8vIFRyeSB0byBnbyBhYm92ZSB0aGUgY3VycmVudCBzdWJleHByZXNzaW9uLgotCQkJCWV4cHJlc3Npb25TdGFjay5yZW1vdmUocmVtb3ZlKTsKLQkJCQlleHByZXNzaW9uVHlwZVN0YWNrLnJlbW92ZShyZW1vdmUtLSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUG9wIGp1c3QgdGhlIGV4cHJlc3Npb24gdHlwZS4gSXQgaXMgaW1wZXJpdGl2ZSB0aGF0IHRoZSBleHByZXNzaW9uIHR5cGUKLQkgKiBpcyBwb3BwZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHBvcEV4cHJlc3Npb24uIFNlcGFyYXRlZCB0aGUgbWV0aG9kcyBzbyB0aGF0IHdlCi0JICogZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW4gYXJyYXkgdG8gcmV0dXJuIHR3byB2YWx1ZXMuCi0JICogPHA+Ci0JICogSWYgdGhlIGFsbG93Vm9pZCBpcyBmYWxzZSBhbmQgdHlwZSBpcyB2b2lkLCB0aGVuIGEgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0JICogVGhpcyBpcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGV4cHJlc3Npb24gd2FzIHRyeWluZyB0byBiZSB1c2VkIGluIGEgZGlmZmVyZW50Ci0JICogZXhwcmVzc2lvbi4gVGhpcyB3aWxsIGJlIHNldCB0byB2b2lkIG9ubHkgb24gZXhwcmVzc2lvbnMgdGhhdCByZXR1cm4gbm8gdmFsdWUgKG9ubHkKLQkgKiBtZXRob2QncyBkbyB0aGlzIGZvciBub3cpLgotCSAqIAotCSAqIEBwYXJhbSBhbGxvd1ZvaWQgQWxsb3cgdm9pZCB0eXBlcyBpZiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIEByZXR1cm4gVGhlIHR5cGUuCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDbGFzcyBwb3BFeHByZXNzaW9uVHlwZShib29sZWFuIGFsbG93Vm9pZCkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUNsYXNzIHJlc3VsdCA9IChDbGFzcykgZXhwcmVzc2lvblR5cGVTdGFjay5yZW1vdmUoZXhwcmVzc2lvblR5cGVTdGFjay5zaXplKCktMSk7Ci0JCQlpZiAoIWFsbG93Vm9pZCAmJiByZXN1bHQgPT0gVm9pZC5UWVBFKQotCQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5Qb3BFeHByZXNzaW9uVHlwZS5FeHByZXNzaW9uVm9pZF9FWENfIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVzdWx0OwotCQkJCQotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBleHByZXNzaW9uIHR5cGUgYXQgPGNvZGU+ZnJvbVRvcDwvY29kZT4gZG93biBmcm9tIHRoZSB0b3AuIFRoaXMgaXMKLQkgKiBuZWVkIGZvciB3aGVuIG11bHRpLW9wZXJhdG9ycyBoYXBwZW4gYW5kIHRoZXkgYXJlIHN0b3JlZCBpbiByZXZlcnNlIG9mIAotCSAqIHdoYXQgaXMgbmVlZGVkLiBUaGV5IHdvdWxkIG5vcm1hbGx5IGJlIHN0b3JlZCBsZWZ0IHRvIHJpZ2h0LCB3aXRoIHRoZQotCSAqIHJpZ2h0bW9zdCBvbmUgb24gdG9wLiBCdXQgdGhleSBuZWVkIHRvIGJlIHByb2Nlc3NlZCBsZWZ0IHRvIHJpZ2h0LCBzbwotCSAqIHRvIGdldCB0aGUgbGVmdCBtb3N0IG9uZSByZXF1aXJlcyBkaWdnaW5nIGRvd24gaW4gdGhlIHN0YWNrLgotCSAqIDxwPgotCSAqIFdoZW4gZG9uZSwgPGNvZGU+cG9wRXhwcmVzc2lvblR5cGVzKGludCBjb3VudCk8L2NvZGU+IG11c3QgYmUgY2FsbGVkIHRvCi0JICogY2xlYW4gdGhlbSBvdXQgc2luY2UgdGhleSB3ZXJlIHByb2Nlc3NlZC4KLQotCSAqIEBwYXJhbSBmcm9tVG9wIDxjb2RlPjE8L2NvZGU+IGlzIHRoZSB0b3Agb25lLCA8Y29kZT4yPC9jb2RlPiBpcyB0aGUgbmV4dCBvbmUgZG93bi4KLQkgKiBAcGFyYW0gYWxsb3dWb2lkIEFsbG93IHZvaWQgdHlwZXMgaWYgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBAcmV0dXJuIFRoZSB0eXBlIGZyb20gdGhlIHRvcCB0aGF0IHdhcyByZXF1ZXN0ZWQuCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElERUV4cHJlc3Npb24jcG9wRXhwcmVzc2lvblR5cGVzKGludCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2xhc3MgZ2V0RXhwcmVzc2lvblR5cGUoaW50IGZyb21Ub3AsIGJvb2xlYW4gYWxsb3dWb2lkKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQl0cnkgewotCQkJQ2xhc3MgcmVzdWx0ID0gKENsYXNzKSBleHByZXNzaW9uVHlwZVN0YWNrLmdldChleHByZXNzaW9uVHlwZVN0YWNrLnNpemUoKS1mcm9tVG9wKTsKLQkJCWlmICghYWxsb3dWb2lkICYmIHJlc3VsdCA9PSBWb2lkLlRZUEUpCi0JCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEZsYWcgaW5kaWNhdGluZyBleHByZXNzaW9uIHNob3VsZCBiZSBpZ25vcmVkIGFuZCBub3QgcHJvY2Vzc2VkLgotCSAqIFRoaXMgaGFwcGVucyBiZWNhdXNlIG9mIGZldyBjYXNlcywgbGlrZSBjb25kaXRpb25hbCBhbmQsIHRoYXQKLQkgKiBpZiBvbmUgcmV0dXJucyBmYWxzZSwgdGhlIHJlc3Qgb2YgdGhlIGV4cHJlc3Npb25zIGluIHRoYXQgY29uZGl0aW9uYWwgYW5kCi0JICogZXhwcmVzc2lvbiBzaG91bGQgYmUgaWdub3JlZCBhbmQgbm90IHByb2Nlc3NlZC4KLQkgKiA8cD4KLQkgKiBJdCBpcyBhbiBPYmplY3QgdGhhdCBhY3RzIGFzIGFuIGVudW0gZm9yIHRoZSB0eXBlIG9mIGV4cHJlc3Npb24gdGhhdCBpbml0aWF0ZWQgdGhlIGlnbm9yZS4gCi0JICogSWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBubyBvbmUgaXMgaWdub3JpbmcuIAotCSAqIDxwPgotCSAqIEFsbCBvZiB0aGUgcHVzaFRvLi4uUHJveHkgbWV0aG9kcyBtdXN0IHRlc3QgdGhpcyBmb3IgdGhpcyB0byB3b3JrIGNvcnJlY3RseS4KLQkgKiBFYWNoIGV4cHJlc3Npb24gaGFzIHNvbWUgd2F5IG9mIHRlc3RpbmcgdGhhdCB0aGVpciBwYXJ0aWN1bGFyIG5lc3Rpbmcgb2YgCi0JICogZXhwcmVzc2lvbnMgaXMgY29tcGxldGUgYW5kIHRoZXkgY2FuIHR1cm4gb2ZmIHRoZSBpZ25vcmUgZmxhZy4KLQkgKiA8cD4KLQkgKiBPbmx5IG9uZSB0eXBlIG9mIGlnbm9yZSBjYW4gZXhpc3QgYXQgYSB0aW1lLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7CQotCQotCQotCXByaXZhdGUgTGlzdCBzYXZlU3RhdGVzOwotCQotCS8qKgotCSAqIEFyZSB3ZSB0cmFjaW5nIG9yIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB0cmFjZU9uOwotCXByaXZhdGUgZmluYWwgbG9uZyB0aHJlc2hvbGRUaW1lOwotCXByaXZhdGUgbG9uZyBzdGFydEV4cHJlc3Npb25TdGVwVGltZTsKLQlwcml2YXRlIGxvbmcgc3RhcnRFeHByZXNzaW9uVGltZTsKLQlwcml2YXRlIGxvbmcgbGFzdEV4cHJlc3Npb25FbmRUaW1lOwotCQotCS8qKgotCSAqIFRyYWNlIGhlYWQgb2YgdGhpcyBleHByZXNzaW9uLiBTbyB0aGF0IHRyYWNlcyBmcm9tIGRpZmZlcmVudCBleHByZXNzaW9ucyBjYW4gYmUgZGlzdGlucXVpc2hlZC4KLQkgKiBJdCBpcyBzaW1wbHkgYW4gbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGNvdW50ZXIuIEl0IGlzIHRoZSBoZWFkZXIgc3RyaW5nIGZvciBhbnkgdHJhY2Ugb3V0cHV0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdHJhY2VIZWFkZXI7Ci0JCi0JcHJpdmF0ZSBpbnQgaW5kZW50ID0gMDsJLy8gSW5kZW50ZWQgZm9yIGNlcnRhaW4gYmxvY2sgZXhwcmVzc2lvbnMuCi0JCi0JLyoKLQkgKiBUcmFjZSBjb3VudGVyLiBJdCBpcyBpbmNyZW1lbnRlZCBvbmNlIGZvciBlYWNoIGV4cHJlc3Npb24gYW5kIGFzc2lnbmVkIHRvIHRoZSB0cmFjZUlkIG9mIHRoZSBleHByZXNzaW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBUUkFDRV9DT1VOVEVSOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgRXhwcmVzc2lvbiB3aXRob3V0IHRyYWNpbmcuCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm9jZXNzZXIoKSB7Ci0JCXRoaXMoZmFsc2UsIC0xKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBleHByZXNzaW9uLCBhbmQgc2V0IHRoZSB0cmFjaW5nIG1vZGUgYW5kIHRocmVzaG9sZCB0aW1lLiBVc2UgLTEKLQkgKiBmb3IgZGVmYXVsdCB0aW1lIG9mIDEwMG1zLgotCSAqIEBwYXJhbSB0cmFjZU9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm9jZXNzZXIoYm9vbGVhbiB0cmFjZU9uLCBsb25nIHRocmVzaG9sZCkgewotCQl0aGlzLnRyYWNlT24gPSB0cmFjZU9uOwotCQlpZiAodHJhY2VPbikgewotCQkJdHJhY2VIZWFkZXIgPSAiKioiKygrK1RSQUNFX0NPVU5URVIpKyc6JzsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludCh0cmFjZUhlYWRlcik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBTdGFydCBleHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMudGhyZXNob2xkVGltZSA9IHRocmVzaG9sZCAhPSAtMSA/IHRocmVzaG9sZCA6IDEwMDsKLQkJCWxhc3RFeHByZXNzaW9uRW5kVGltZSA9IHN0YXJ0RXhwcmVzc2lvblRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfSBlbHNlIHsKLQkJCXRyYWNlSGVhZGVyID0gbnVsbDsKLQkJCXRocmVzaG9sZFRpbWUgPSAxMDA7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgbXNnIGhlbHBlci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRyYWNlT24gaXMgdHJ1ZS4gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIHRvIHN0YXJ0IGEgbmV3IHRyYWNlIG1lc3NhZ2UuCi0JICogVGhlIGNhbGxlciBpcyBtdXN0IGNhbGwgcHJpbnRUcmFjZUVuZCBhdCB0aGUgZW5kLgotCSAqICAKLQkgKiBAcGFyYW0gbXNnIG1lc3NhZ2UgdG8gcHJpbnQKLQkgKiBAcGFyYW0gaWdub3JlIGFyZSB3ZSBpZ25vcmluZyB0aGUgZXhwcmVzc2lvbiwgb3IgaXMgaXQgYmVpbmcgcHJvY2Vzc2VkICh0aGlzIGp1c3QgYWx0ZXJzIHRoZSB0cmFjZSBvdXRwdXQgc2xpZ2h0bHkpLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50VHJhY2UoU3RyaW5nIG1zZywgYm9vbGVhbiBpZ25vcmUpIHsKLQkJc3RhcnRFeHByZXNzaW9uU3RlcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJbG9uZyBzaW5jZUxhc3RFeHByZXNzaW9uID0gc3RhcnRFeHByZXNzaW9uU3RlcFRpbWUgLSBsYXN0RXhwcmVzc2lvbkVuZFRpbWU7Ci0JCVN5c3RlbS5vdXQucHJpbnQodHJhY2VIZWFkZXIpOwotCQlpZiAoc2luY2VMYXN0RXhwcmVzc2lvbiA+IDApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnQoJygnKTsKLQkJCWlmIChzaW5jZUxhc3RFeHByZXNzaW9uID4gdGhyZXNob2xkVGltZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCIqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludChzaW5jZUxhc3RFeHByZXNzaW9uKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIm1zKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludCgnXHQnKTsKLQkJaWYgKCFpZ25vcmUpCi0JCQlTeXN0ZW0ub3V0LnByaW50KCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCVN5c3RlbS5vdXQucHJpbnQoIiMjXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcHJpbnRJbmRlbnQoKTsKLQkJU3lzdGVtLm91dC5wcmludChtc2cpOwotCX0KLQkKLQkvKioKLQkgKiBwcmludCB0aGUgaW5kZW50LiBJdCB3aWxsIG5vdCBkbyBhIG5ldyBsaW5lIGJlZm9yZSBub3IgYWZ0ZXIuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRJbmRlbnQoKSB7Ci0JCWZvcihpbnQgaT1pbmRlbnQ7IGk+MDsgaS0tKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmludFRyYWNlRW5kKCkgewotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1zdGFydEV4cHJlc3Npb25TdGVwVGltZTsKLQkJaWYgKHN0b3AgPiAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgKCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc3RvcCA+IHRocmVzaG9sZFRpbWUpCi0JCQkJU3lzdGVtLm91dC5wcmludCgiKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnQoc3RvcCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJtcykiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlsYXN0RXhwcmVzc2lvbkVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogRG8gYW4gaW5kZW50ICh1bmRlbnQpIGFjY29yZGluZyB0byBpbmRlbnQgZmxhZy4KLQkgKiBAcGFyYW0gaW5kZW50IDxjb2RlPnRydWU8L2NvZGU+IHRvIGluY3JlbWVudCBpbmRlbnQsIG9yIG90aGVyd2lzZSBkZWNyZW1lbnQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50KGJvb2xlYW4gaW5kZW50KSB7Ci0JCXRoaXMuaW5kZW50ICs9IChpbmRlbnQgPyAxIDogLTEpOwotCQlpZiAodGhpcy5pbmRlbnQgPCAwKQotCQkJdGhpcy5pbmRlbnQgPSAwOwotCX0KLQkKLQkvKioKLQkgKiBQcmludCB0aGUgb2JqZWN0IGFuZCB0eXBlLiBJdCB3aWxsIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUgY2hhciwgc28gb25lIHdpbGwgYmUgbmVlZGVkIGFmdGVyd2FyZHMuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50T2JqZWN0QW5kVHlwZShPYmplY3QgbywgQ2xhc3MgdCkgewotCQlTeXN0ZW0ub3V0LnByaW50KCcgJyk7Ci0JCVN5c3RlbS5vdXQucHJpbnQoIk9iamVjdC0iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50KG8pOwotCQlTeXN0ZW0ub3V0LnByaW50KCIgVHlwZS0iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50KHQpOwotCQlTeXN0ZW0ub3V0LnByaW50KCcgJyk7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIHRoZSBleGNlcHRpb24gcHJvY2Vzc2luZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNsb3NlKCkgewotCQlib29sZWFuIGZpcnN0Q2xvc2UgPSBleHByZXNzaW9uU3RhY2sgIT0gbnVsbDsKLQkJaWYgKGZpcnN0Q2xvc2UgJiYgdHJhY2VPbikgewotCQkJcHJpbnRUcmFjZSgiRW5kIGV4cHJlc3Npb24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxvbmcgdG90YWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnRFeHByZXNzaW9uVGltZTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIiBUb3RhbCBleHByZXNzaW9uIGV2YWx1YXRpb24gdGltZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnQodG90YWxUaW1lKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIm1zLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWV4cHJlc3Npb25TdGFjayA9IG51bGw7Ci0JCQlleHByZXNzaW9uVHlwZVN0YWNrID0gbnVsbDsKLQkJCWV4cHJlc3Npb25Qcm94aWVzID0gbnVsbDsKLQkJCWV4Y2VwdGlvbiA9IG51bGw7Ci0JCQljYXRjaFRocm93YWJsZSA9IG51bGw7Ci0JCQlzYXZlU3RhdGVzID0gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChmaXJzdENsb3NlICYmIHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHVsbCB0aGUgdmFsdWUuIFRoZSB2YWx1ZSB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSBhcnJheSBwYXNzZWQgaW4uCi0JICogSXQgd2lsbCBiZSBzdG9yZWQgYXMgdmFsdWVbMF0gPSB2YWx1ZSB2YWx1ZVsxXSA9IHZhbHVldHlwZShDbGFzcykuCi0JICogCi0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBhcnJheSB0byBzdG9yZSB0aGUgdmFsdWUgYW5kIHR5cGUgaW50by4KLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVsbFZhbHVlKE9iamVjdFtdIHZhbHVlKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIlB1bGwgdmFsdWU6IiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQl2YWx1ZVswXSA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCXZhbHVlWzFdID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlwcmludE9iamVjdEFuZFR5cGUodmFsdWVbMF0sIChDbGFzcykgdmFsdWVbMV0pOwotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJCX0KLQkJfQotCQljbG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBQdWxsIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBwcm94eSwgZGVyZWZlcmVuY2luZyBpdCBpZiBuZWNlc3NhcnkuIFRoaXMgaXMgZm9yIHJlc29sdXRpb24gb25seSBwdXJwb3NlcyBhdCB0aGUKLQkgKiBlbmQgb2YgdGhlIGV4cHJlc3Npb24gYmVpbmcgcHJvY2Vzc2VkLiBOb3QgbWVhbnQgZm9yIGdlbmVyYWwgYWNjZXNzIHRvIHRoZSB2YWx1ZSBvZiBleHByZXNzaW9uIHByb3h5LiBVc2UgCi0JICoge0BsaW5rIEV4cHJlc3Npb25Qcm9jZXNzZXIjZ2V0RXhwcmVzc2lvblByb3h5VmFsdWUoaW50LCBPYmplY3RbXSl9IGluc3RlYWQgZm9yIGdlbmVyYWwgYWNjZXNzIHRvIHRoZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHlpZAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdWxsRXhwcmVzc2lvblByb3h5VmFsdWUoaW50IHByb3h5aWQsIE9iamVjdFtdIHZhbHVlKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlnZXRFeHByZXNzaW9uUHJveHlWYWx1ZShwcm94eWlkLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgZXhwcmVzc2lvbiBwcm94eSB2YWx1ZS4gSWYgdGhlIGV4cHJlc3Npb24gaGFzIG5vdCB5ZXQgYmVlbiBldmFsdWF0ZWQgaXQgd2lsbAotCSAqIHJldHVybiBmYWxzZS4gSWYgaXQgaGFzIGl0IHdpbGwgcmV0dXJuIHRydWUuCi0JICogQHBhcmFtIHByb3h5aWQKLQkgKiBAcGFyYW0gdmFsdWUgcHV0IHZhbHVlIGludG8gdmFsdWVbMF0gYW5kIHRoZSB0eXBlIGludG8gdmFsdWVbMV0uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGV4cHJlc3Npb24gcHJveHkgd2FzIG5ldmVyIHJlc29sdmVkIG9yIGRvZXNuJ3QgZXhpc3QuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwcmVzc2lvblByb3h5VmFsdWUoaW50IHByb3h5aWQsIE9iamVjdFtdIHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RXhwcmVzc2lvblByb3h5VmFsdWUocHJveHlpZCwgdmFsdWUsIHRydWUsIGZhbHNlKTsKLQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgZXhwcmVzc2lvbiBwcm94eSB2YWx1ZSwgb3IgdGhlIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGlmIG5vdCByZXNvbHZlZC4gVGhpcwotCSAqIGlzIHVzZWZ1bCBmb3IgY2FsbGVycyB0aGF0IG5lZWQgdG8gaGFuZGxlIHRoZSBwcm94eSBpdHNlbGYgZm9yIGZhaWxlZCBjYWxscy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHlpZAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQsIE9iamVjdFtdIHZhbHVlKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlnZXRFeHByZXNzaW9uUHJveHlWYWx1ZShwcm94eWlkLCB2YWx1ZSwgdHJ1ZSwgZmFsc2UpOwotCX0KLQkKLQkvKgotCSAqIEludGVybmFsIG1ldGhvZCB1c2UgdG8gYWN0dWFsbHkgZ2V0IHRoZSB2YWx1ZSwgYnV0IHRvIGRpc3RpbnF1aXNoIGJldHdlZW4gcHVsbCBhbmQgZ2V0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgotCSAqIEdldCB3aWxsIHByb2Nlc3MgdGhlIGVycm9ycyBhcyBub3JtYWwgZXhlY3V0aW9uIGVycm9ycywgd2hpbGUgcHVsbCB3aWxsIHRocm93IHRoZSBlcnJvcnMuIGZpbmFsVHJhY2UgaXMgd2hlbgotCSAqIHRoaXMgaXMgdGhlIGZpbmFsIGNhbGwgdG8gcmV0dXJuIHRoZSB2YWx1ZXMgdG8gdGhlIGNsaWVudC4gV2Ugd2lsbCB0cmFjZSB0aGUgcmVzdWx0cyBpbiB0aGF0IGNhc2UuCi0JICogUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0RXhwcmVzc2lvblByb3h5VmFsdWUoaW50IHByb3h5aWQsIE9iamVjdFtdIHZhbHVlLCBib29sZWFuIHB1bGwsIGJvb2xlYW4gZmluYWxUcmFjZSkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gTm90ZTogVGhpcyB3aWxsIHRocm93IHRoZSBleGNlcHRpb25zIHJpZ2h0IGF3YXkgc2luY2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBvdXRzaWRlIHRvIGZpbGwgaW4gdGhlIHZhbHVlIGFuZAotCQkvLyBzbyB3ZSBhcmUgaG9sZGluZyBzdWNoIGV4Y2VwdGlvbnMuCi0JCWJvb2xlYW4gZG9UcmFjZSA9IGZpbmFsVHJhY2UgJiYgdHJhY2VPbjsKLQkJdHJ5IHsKLQkJCWlmIChleHByZXNzaW9uUHJveGllcyAhPSBudWxsICYmIGV4cHJlc3Npb25Qcm94aWVzLnNpemUoKSA+IHByb3h5aWQpIHsKLQkJCQlJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSBwcm94eSA9IChJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSkgZXhwcmVzc2lvblByb3hpZXMuZ2V0KHByb3h5aWQpOwotCQkJCWlmIChwcm94eSAhPSBudWxsICYmIHByb3h5LmlzU2V0KCkpIHsKLQkJCQkJdmFsdWVbMF0gPSBwcm94eS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWVbMF0gaW5zdGFuY2VvZiBWYXJpYWJsZVJlZmVyZW5jZSkKLQkJCQkJCXZhbHVlWzBdID0gKChWYXJpYWJsZVJlZmVyZW5jZSkgdmFsdWVbMF0pLmRlcmVmZXJlbmNlKCk7IC8vIEhlcmUgd2Ugd2FudCB0aGUgZmluYWwgY3VycmVudCB2YWx1ZS4KLQkJCQkJdmFsdWVbMV0gPSBwcm94eS5nZXRUeXBlKCk7Ci0JCQkJCWlmIChkb1RyYWNlKQotCQkJCQkJaWYgKHZhbHVlWzFdICE9IFZvaWQuVFlQRSkgewotCQkJCQkJCXByaW50VHJhY2UoIlJldHVybiBQcm94eSAjIiArIHByb3h5aWQgKyAiIFJlc29sdmVkIHRvIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlwcmludE9iamVjdEFuZFR5cGUodmFsdWVbMF0sIChDbGFzcykgdmFsdWVbMV0pOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJcHJpbnRUcmFjZSgiUmV0dXJuIFByb3h5ICMiICsgcHJveHlpZCArICIgUmVzb2x2ZWQgdG8gdm9pZC4iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChkb1RyYWNlKQotCQkJCQkJcHJpbnRUcmFjZSgiUmV0dXJuIFByb3h5ICMiICsgcHJveHlpZCArICI6IE5vdCByZXNvbHZlZCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCU5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUgPSBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuR2V0RXhwcmVzc2lvblByb3h5VmFsdWUuRXhwcmVzc2lvblByb3h5Tm90U2V0X0VYQ18iKSwgcHJveHkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChwdWxsKQotCQkJCQkJdGhyb3cgZTsKLQkJCQkJZWxzZQotCQkJCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRvVHJhY2UpCi0JCQkJCXByaW50VHJhY2UoIlJldHVybiBQcm94eSAjIiArIHByb3h5aWQgKyAiOiBOZXZlciBjcmVhdGVkLiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSA9IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5HZXRFeHByZXNzaW9uUHJveHlWYWx1ZS5FeHByZXNzaW9uUHJveHlEb2VzbnRFeGlzdF9FWENfIikpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHB1bGwpCi0JCQkJCXRocm93IGU7Ci0JCQkJZWxzZQotCQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChkb1RyYWNlKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBleHByZXNzaW9uIChqdXN0IGEgdmFsdWUpIG9udG8gdGhlIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBvCi0JICogQHBhcmFtIHQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoRXhwcmVzc2lvbihPYmplY3QgbywgQ2xhc3MgdCkgewotCQlib29sZWFuIGlnbm9yZSA9IChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCWlmICh0cmFjZU9uKSB7Ci0JCQlwcmludFRyYWNlKCJQdXNoOiAiLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQlwcmludE9iamVjdEFuZFR5cGUobywgdCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQkJcHVzaEV4cHJlc3Npb25WYWx1ZShvLCB0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIHByb3h5IChmcm9tIHByb3h5IGlkKSwgYW5kIHB1c2ggdGhlIHZhbHVlIG9udG8gdGhlIHN0YWNrLgotCSAqICAKLQkgKiBAcGFyYW0gcHJveHlpZCBUaGUgcHJveHkgaWQgb2YgdGhlIEV4cHJlc3Npb25Qcm94eSB0byBwdXNoIGFzIGEgdmFsdWUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlpZCkgewotCQlib29sZWFuIGlnbm9yZSA9KGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJQdXNoIEV4cHJlc3Npb24gUHJveHkgIyIrcHJveHlpZCwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZXhwcmVzc2lvblByb3hpZXMgIT0gbnVsbCAmJiBleHByZXNzaW9uUHJveGllcy5zaXplKCkgPiBwcm94eWlkKSB7Ci0JCQkJSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgcHJveHkgPSAoSW50ZXJuYWxFeHByZXNzaW9uUHJveHkpIGV4cHJlc3Npb25Qcm94aWVzLmdldChwcm94eWlkKTsKLQkJCQlpZiAocHJveHkgIT0gbnVsbCAmJiBwcm94eS5pc1NldCgpKSB7Ci0JCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKHByb3h5LmdldFZhbHVlKCksIHByb3h5LmdldFR5cGUoKSk7Ci0JCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUocHJveHkuZ2V0VmFsdWUoKSwgcHJveHkuZ2V0VHlwZSgpKTsJLy8gQ2FuIHB1c2ggYSBWYXJpYWJsZVJlZmVyZW5jZS4gVGhpcyBpcyBvay4gV2hlbiB1c2VkIGl0IHdpbGwgdGhlbiBkZXJlZiB3aXRoIHRoZSBjdXJyZW50IHZhbHVlLgotCQkJCX0gZWxzZQotCQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigiUHJveHkgaWQ6ICIrcHJveHlpZCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigiUHJveHkgaWQ6ICIrcHJveHlpZCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHVzaCBhIGNhc3Qgb250byBzdGFjay4gVGhlIHR5cGUgcGFzc2VkIGluIGlzIGVpdGhlciBhIFN0cmluZyAod2l0aCBjbGFzc25hbWUgdG8gY2FzdCB0bykgb3IgdGhlCi0JICogdHlwZSB0byBjYXN0IHRvLgotCSAqIEBwYXJhbSB0eXBlIFRvIGNhc3QgdG8uIElmIDxjb2RlPlN0cmluZzwvY29kZT4gdGhlbiBjb252ZXJ0IHRvIHR5cGUgKHVzaW5nIHNvbWV0aGluZyBsaWtlIDxjb2RlPkNsYXNzLmZvck5hbWUoKTwvY29kZT4pIG9yIGl0IGlzIGEgQ2xhc3MKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQ2FzdChDbGFzcyB0eXBlKSB7Ci0JCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJDYXN0IHRvOiAiK3R5cGUsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQl0cnkgewotCQkJCU9iamVjdCBleHAgPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJQ2xhc3MgZXhwdHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQkKLQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKGNhc3RCZWFuKHR5cGUsIGV4cCwgZXhwdHlwZSksIHR5cGUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0JCi0JLyoqCi0JICogQ2FzdCBhIGJlYW4gaW50byB0aGUgcmV0dXJuIHR5cGUuIElmIHRoZSByZXR1cm4gdHlwZSBpcyBub3QgcHJpbWl0aXZlLCB0aGVuCi0JICogdGhlIGJlYW4gaXMgbGVmdCBhbG9uZSwgaG93ZXZlciBpdCBpcyBjaGVja2VkIHRvIGJlIGFuIGluc3RhbmNlIG9mCi0JICogdGhlIHJldHVybiB0eXBlLiBJZiB0aGUgcmV0dXJuIHR5cGUgaXMgcHJpbWl0aXZlLCB0aGVuIHRoZQotCSAqIGNvcnJlY3QgcHJpbWl0aXZlIHdyYXBwZXIgaXMgY3JlYXRlZCBmcm9tIHRoZSBiZWFuIChiZWFuIG11c3QgYmUgYSBudW1iZXIgb3IgY2hhcmFjdGVyIG9yIGJvb2xlYW4gcHJpbWl0dmUgc28KLQkgKiB0aGF0IGNhc3Qgd2lsbCB3b3JrKS4KLQkgKiA8cD4KLQkgKiBIb3dldmVyIGlmIGNhbid0IGJlIGNhc3QgZm9yIHByaW1pdGl2ZSBvciBpZiBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlCi0JICogcmV0dXJudHlwZSBmb3Igb2JqZWN0cywgYSBDbGFzc0Nhc3RFeGNlcHRpb24gd2lsbCBiZSByYWlzZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2VyIHRvIGNhc3QgYSBiZWFuLiBTaW5jZSBpdCBpcyBhIGhlbHBlciBtZXRob2QgaXQgZG9lc24ndAotCSAqIGNoZWNrIG5vciBwcm9jZXNzIHRoZSBleGNlcHRpb24uIEl0IHRocm93cyBpdC4gQ2FsbGVycyBtdXN0IGhhbmRsZSBpdCBhcyB0aGV5IHNlZSBmaXQuCi0JICogCi0JICogQHBhcmFtIHJldHVyblR5cGUKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEBwYXJhbSBiZWFuVHlwZSBUaGUgdHlwZSB0aGF0IGJlYW4gaXMgc3VwcG9zZWQgdG8gYmUgKGUuZy4gZXZlbiB0aG91Z2ggaXQgaXMgYSBOdW1iZXIsIGl0IGFjdHVhbGx5IHJlcHJlc2VudHMgYSBwcmltaXRpdmUpLgotCSAqIEByZXR1cm4gVGhlIGNhc3QgYmVhbiAoZWl0aGVyIHRvIHRoZSBhcHByb3ByaWF0ZSBwcmltaXRpdmUgd3JhcHBlciB0eXBlIG9yIGJlYW4pCi0JICogCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGNhc3RCZWFuKENsYXNzIHJldHVyblR5cGUsIE9iamVjdCBiZWFuLCBDbGFzcyBiZWFuVHlwZSkgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7Ci0JCS8vIENhc3QgdXNlcyB0cnVlIHZhbHVlIGFuZCB0cnVlIGNsYXNzIG9mIGJlYW4sIG5vdCBleHBlY3RlZCB0eXBlIChpLmUuIG5vdCBiZWFuVHlwZSkuCi0JCWlmIChiZWFuID09IG51bGwpCi0JCQlpZiAoIXJldHVyblR5cGUuaXNQcmltaXRpdmUoKSkKLQkJCQlyZXR1cm4gYmVhbjsJLy8gYmVhbiBpcyBudWxsLCBhbmQgcmV0dXJuIHR5cGUgaXMgbm90IHByaW1pdGl2ZSwgc28gdGhpcyBpcyBhIHZhbGlkIGNhc3QuCi0JCQllbHNlIAotCQkJCXRocm93Q2xhc3NDYXN0KHJldHVyblR5cGUsIGJlYW4pOwotCQllbHNlIGlmIChyZXR1cm5UeXBlLmVxdWFscyhiZWFuLmdldENsYXNzKCkpKQotCQkJcmV0dXJuIGJlYW47CS8vIFRoZXkgYXJlIGFscmVhZHkgdGhlIHNhbWUuCi0JCWVsc2UgaWYgKCFyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCWlmICghYmVhblR5cGUuaXNQcmltaXRpdmUoKSAmJiByZXR1cm5UeXBlLmlzSW5zdGFuY2UoYmVhbikpCi0JCQkJcmV0dXJuIGJlYW47Ci0JCQllbHNlCi0JCQkJdGhyb3dDbGFzc0Nhc3QocmV0dXJuVHlwZSwgYmVhbik7CS8vIEVpdGhlciBiZWFuIHR5cGUgd2FzIHdyYXBwZXJpbmcgcHJpbWl0aXZlIG9yIG5vdCBpbnN0YW5jZW9mIHJldHVybnR5cGUuCi0JCX0gZWxzZSB7Ci0JCQlpZiAoIWJlYW5UeXBlLmlzUHJpbWl0aXZlKCkpCi0JCQkJdGhyb3dDbGFzc0Nhc3QocmV0dXJuVHlwZSwgYmVhbik7CS8vIGJlYW4gdHlwZSB3YXMgbm90IHdyYXBwZXJpbmcgYSBwcmltaXRpdmUuIENhbid0IGNhc3QgdG8gcHJpbWl0aXZlLgotCQkJLy8gSXQgaXMgcmV0dXJuIHR5cGUgb2YgcHJpbWl0aXZlLiBOb3cgY29udmVydCB0byBjb3JyZWN0IHByaW1pdGl2ZS4KLQkJCWlmIChyZXR1cm5UeXBlID09IEJvb2xlYW4uVFlQRSkKLQkJCQlpZiAoYmVhbiBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCQkJCXJldHVybiBiZWFuOwotCQkJCWVsc2UKLQkJCQkJdGhyb3dDbGFzc0Nhc3QocmV0dXJuVHlwZSwgYmVhbik7Ci0JCQllbHNlIHsKLQkJCQlpZiAoYmVhbiBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQlpZiAocmV0dXJuVHlwZSA9PSBJbnRlZ2VyLlRZUEUpCi0JCQkJCQlpZiAoYmVhbiBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQkJCQkJcmV0dXJuIGJlYW47Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKCgoTnVtYmVyKSBiZWFuKS5pbnRWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBCeXRlLlRZUEUpCi0JCQkJCQlpZiAoYmVhbiBpbnN0YW5jZW9mIEJ5dGUpCi0JCQkJCQkJcmV0dXJuIGJlYW47Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBCeXRlKCgoTnVtYmVyKSBiZWFuKS5ieXRlVmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gQ2hhcmFjdGVyLlRZUEUpCi0JCQkJCQlpZiAoYmVhbiBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCQkJCQlyZXR1cm4gYmVhbjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IENoYXJhY3RlcigoY2hhcikgKChOdW1iZXIpIGJlYW4pLmludFZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IERvdWJsZS5UWVBFKQotCQkJCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBEb3VibGUpCi0JCQkJCQkJcmV0dXJuIGJlYW47Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBEb3VibGUoKChOdW1iZXIpIGJlYW4pLmRvdWJsZVZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IEZsb2F0LlRZUEUpCi0JCQkJCQlpZiAoYmVhbiBpbnN0YW5jZW9mIEZsb2F0KQotCQkJCQkJCXJldHVybiBiZWFuOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBuZXcgRmxvYXQoKChOdW1iZXIpIGJlYW4pLmZsb2F0VmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gTG9uZy5UWVBFKQotCQkJCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBMb25nKQotCQkJCQkJCXJldHVybiBiZWFuOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBuZXcgTG9uZygoKE51bWJlcikgYmVhbikubG9uZ1ZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IFNob3J0LlRZUEUpCi0JCQkJCQlpZiAoYmVhbiBpbnN0YW5jZW9mIFNob3J0KQotCQkJCQkJCXJldHVybiBiZWFuOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBuZXcgU2hvcnQoKChOdW1iZXIpIGJlYW4pLnNob3J0VmFsdWUoKSk7CQotCQkJCQllbHNlCi0JCQkJCQl0aHJvd0NsYXNzQ2FzdChyZXR1cm5UeXBlLCBiZWFuKTsKLQkJCQl9IGVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJaWYgKHJldHVyblR5cGUgPT0gQ2hhcmFjdGVyLlRZUEUpCi0JCQkJCQlyZXR1cm4gYmVhbjsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBJbnRlZ2VyLlRZUEUpCi0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBCeXRlLlRZUEUpCi0JCQkJCQlyZXR1cm4gbmV3IEJ5dGUoKGJ5dGUpICgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gRG91YmxlLlRZUEUpCi0JCQkJCQlyZXR1cm4gbmV3IERvdWJsZSgoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IEZsb2F0LlRZUEUpCi0JCQkJCQlyZXR1cm4gbmV3IEZsb2F0KCgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gTG9uZy5UWVBFKQotCQkJCQkJcmV0dXJuIG5ldyBMb25nKCgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gU2hvcnQuVFlQRSkKLQkJCQkJCXJldHVybiBuZXcgU2hvcnQoKHNob3J0KSAoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCkpOwkKLQkJCQkJZWxzZQotCQkJCQkJdGhyb3dDbGFzc0Nhc3QocmV0dXJuVHlwZSwgYmVhbik7Ci0JCQkJfSBlbHNlCi0JCQkJCXRocm93Q2xhc3NDYXN0KHJldHVyblR5cGUsIGJlYW4pOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7CS8vIEl0IHNob3VsZCBuZXZlciBnZXQgaGVyZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRocm93Q2xhc3NDYXN0KENsYXNzIHJldHVyblR5cGUsIE9iamVjdCBiZWFuKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5DYW5ub3RDYXN0WFRvWV9FWENfIiksIG5ldyBPYmplY3RbXSB7YmVhbiAhPSBudWxsID8gYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSA6IG51bGwsIHJldHVyblR5cGUuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgdHlwZSB0aGF0IHRoZSB3cmFwcGVyIGJlYW4gcmVwcmVzZW50cyAoaS5lLiBCb29sZWFuIGluc3RhbmNlIHJldHVybnMgQm9vbGVhbi5UWVBFKSAKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgZXhwcmVzc2lvbiBwcm9jZXNzZXIgdG8gZ2V0IHRoZSBwcmltaXRpdmUgdHlwZS4gU2luY2UgaXQgaXMgYSBoZWxwZXIgbWV0aG9kIGl0IGRvZXNuJ3QKLQkgKiBjaGVjayBub3IgcHJvY2VzcyB0aGUgZXhjZXB0aW9uLiBJdCB0aHJvd3MgaXQuIENhbGxlcnMgbXVzdCBoYW5kbGUgaXQgYXMgdGhleSBzZWUgZml0LgotCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuIHRoZSBwcmltaXRpdmUgdHlwZSBjbGFzcyBvZiB0aGUgZ2l2ZW4gYmVhbi4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiZWFuIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIG5vdCBvZiB0aGUgdHlwZSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBwcmltaXRpdmUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENsYXNzIGdldFByaW1pdGl2ZVR5cGUoT2JqZWN0IGJlYW4pIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlpZiAoYmVhbiBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCQlyZXR1cm4gQm9vbGVhbi5UWVBFOwotCQllbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgSW50ZWdlcikKLQkJCXJldHVybiBJbnRlZ2VyLlRZUEU7Ci0JCWVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBCeXRlKQotCQkJcmV0dXJuIEJ5dGUuVFlQRTsKLQkJZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCXJldHVybiBDaGFyYWN0ZXIuVFlQRTsKLQkJZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIERvdWJsZSkKLQkJCXJldHVybiBEb3VibGUuVFlQRTsKLQkJZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIEZsb2F0KQotCQkJcmV0dXJuIEZsb2F0LlRZUEU7Ci0JCWVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBMb25nKQotCQkJcmV0dXJuIExvbmcuVFlQRTsKLQkJZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIFNob3J0KQotCQkJcmV0dXJuIFNob3J0LlRZUEU7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYmVhbiAhPSBudWxsID8gYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSA6ICJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElGRUxTRV9JR05PUkUgPSAiSUYvRUxTRSBJR05PUkUiOwkvLyBGbGFnIGZvciBpZi9lbHNlIGluIGluZ29yZSAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBpbnQgaWZFbHNlTmVzdGluZyA9IDA7CS8vIE5lc3Rpbmcgb2YgaWYvZWxzZSBleHByZXNzaW9ucy4KLQlwcml2YXRlIGludCBpZkVsc2VJZ25vcmVOZXN0Q291bnQgPSAwOwkvLyBXaGVuIGlnbm9yaW5nIGlmL2Vsc2UgZXhwcmVzc2lvbnMsIGlnbm9yZSB1bnRpbCB0aGlzIG5lc3QgY291bnQuCi0JcHJpdmF0ZSBib29sZWFuIGlmRWxzZVNraXBUcnVlUGFydDsKLQotCQotCS8qKgotCSAqIFB1c2ggYW4gaWYgdGVzdCBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBoYXNFbHNlQ2xhdXNlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaElmRWxzZSgpIHsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gaWdub3JlID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJCXJldHVybjsKLQkJCQkvLyBTbGlnaHRseSBkaWZmZXJlbnQgaGVyZSBpbiB0aGF0IGlmIGFuIGlnbm9yaW5nIG9jY3VycmVkIHdlIHN0aWxsIG5lZWQgdG8gcHJvY2VzcyBhdCBsZWFzdCBwYXJ0IG9mIGl0IHNvIHRoYXQKLQkJCQkvLyB3ZSBjYW4gZ2V0IHRoZSBleHByZXNzaW9uIGdyb3VwaW5nIGNvcnJlY3QuCi0JCQkJaWZFbHNlTmVzdGluZysrOwkvLyBXZSBoYXZlIHRoZSB0ZXN0LgotCQotCQkJCWlmIChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlpZ25vcmUgPSBmYWxzZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50VHJhY2UoIklmIHRlc3QgY29uZGl0aW9uIiwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCQkKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IGNvbmRpdGlvbiA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQlDbGFzcyB0eXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCWlmICh0eXBlICE9IEJvb2xlYW4uVFlQRSkKLQkJCQkJdGhyb3dDbGFzc0Nhc3QoQm9vbGVhbi5UWVBFLCBjb25kaXRpb24pOwotCQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQoIiBUZXN0IFJlc3VsdD0iK2NvbmRpdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJpbnRUcmFjZUVuZCgpOwotCQkJCQlpbmRlbnQodHJ1ZSk7Ci0JCQkJCXByaW50VHJhY2UoIkJlZ2luIFRydWUgRXhwcmVzc2lvbi4iLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJCQkJaW5kZW50KHRydWUpOwotCQkJCX0JCQkJCi0JCQkJaWYgKCgoQm9vbGVhbikgY29uZGl0aW9uKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkvLyBDb25kaXRpb24gd2FzIHRydWUuCi0JCQkJCS8vIERvIG5vdGhpbmcuIExldCB0cnVlIGNvbmRpdGlvbiBiZSBwcm9jZXNzZWQuCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ29uZGl0aW9uIHdhcyBmYWxzZS4KLQkJCQkJaWZFbHNlU2tpcFRydWVQYXJ0ID0gdHJ1ZTsJLy8gVGVsbCB0aGUgdHJ1ZSBjb25kaXRpb24gc2hvdWxkIGJlIGlnbm9yZWQuCi0JCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBJRkVMU0VfSUdOT1JFOwotCQkJCQlpZkVsc2VJZ25vcmVOZXN0Q291bnQgPSBpZkVsc2VOZXN0aW5nOwotCQkJCX0KLQkJCQkvLyBXZSBkb24ndCBwdXQgYW55dGhpbmcgYmFjayBvbiB0aGUgc3RhY2sgYmVjYXVzZSB0aGUgY29uZGl0aW9uIHRlc3QgaXMgbm90IGV2ZXIgcmV0dXJuZWQuCi0JCQkJLy8gVGhlIGFwcHJvcHJpYXRlIHRydWUgb3IgZmFsc2UgY29uZGl0aW9uIGV2YWx1YXRpb24gd2lsbCBiZSBsZWZ0IG9uIHRoZSBzdGFjay4KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1c2ggYW4gaWYvZWxzZSBjbGF1c2UuIEl0IGNhbiBiZSBhbnkgY2xhdXNlIG9mIHRoZSBpZiAodHJ1ZSwgb3IgZmFsc2UgY2xhdXNlKS4KLQkgKiBAcGFyYW0gY2xhdXNlVHlwZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hJZkVsc2UoSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZSBjbGF1c2VUeXBlKSB7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGlnbm9yZSA9IHRydWU7Ci0JCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBTbGlnaHRseSBkaWZmZXJlbnQgaGVyZSBpbiB0aGF0IGlmIGFuIGlnbm9yaW5nIG9jY3VycmVkIHdlIHN0aWxsIG5lZWQgdG8gcHJvY2VzcyBhdCBsZWFzdCBwYXJ0IG9mIGl0IHNvIHRoYXQKLQkJCS8vIHdlIGNhbiBnZXQgdGhlIGV4cHJlc3Npb24gZ3JvdXBpbmcgY29ycmVjdC4KLQkJCXN3aXRjaCAoY2xhdXNlVHlwZS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuVFJVRV9DTEFVU0VfVkFMVUU6Ci0JCQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJCQlpbmRlbnQoZmFsc2UpOwotCQkJCQkJcHJpbnRUcmFjZSgiQmVnaW4gRmFsc2UgRXhwcmVzc2lvbi4iLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCQkJCQlpbmRlbnQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGlmRWxzZVNraXBUcnVlUGFydCAmJiBpZ25vcmVFeHByZXNzaW9uID09IElGRUxTRV9JR05PUkUgJiYgaWZFbHNlSWdub3JlTmVzdENvdW50ID09IGlmRWxzZU5lc3RpbmcpIHsKLQkJCQkJCS8vIHN0b3AgaWdub3JpbmcsIHdlJ3ZlIGlnbm9yZWQgdGhlIHRydWUgY29uZGl0aW9uIG9mIGludGVyZXN0LgotCQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCQlyZXR1cm47IC8vIEhvd2V2ZXIsIGxlYXZlIGJlY2F1c2Ugc2luY2UgdGhpcyBjb25kaXRpb24gd2FzIGlnbm9yZWQuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlLkVMU0VfQ0xBVVNFX1ZBTFVFOgotCQkJCQlpZiAodHJhY2VPbikgewotCQkJCQkJaW5kZW50KGZhbHNlKTsKLQkJCQkJCWluZGVudChmYWxzZSk7Ci0JCQkJCQlwcmludFRyYWNlKCJFbmQgSUYvRUxTRSBFeHByZXNzaW9uLiIsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJCQkJfQkJCQkJCi0JCQkJCWludCBjdXJyZW50TmVzdGluZyA9IGlmRWxzZU5lc3RpbmctLTsKLQkJCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gPT0gSUZFTFNFX0lHTk9SRSAmJiBpZkVsc2VJZ25vcmVOZXN0Q291bnQgPT0gY3VycmVudE5lc3RpbmcpIHsKLQkJCQkJCS8vIHN0b3AgaWdub3JpbmcsIHdlJ3ZlIGlnbm9yZWQgdGhlIGZhbHNlIGNvbmRpdGlvbiBvZiBpbnRlcmVzdC4KLQkJCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwotCQkJCQkJcmV0dXJuOyAvLyBIb3dldmVyLCBsZWF2ZSBiZWNhdXNlIHNpbmNlIHRoaXMgY29uZGl0aW9uIHdhcyBpZ25vcmVkLgotCQkJCQl9Ci0JCQl9Ci0JCi0JCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCi0JCQkJCQotCQkJdHJ5IHsKLQkJCQlzd2l0Y2ggKGNsYXVzZVR5cGUuZ2V0VmFsdWUoKSkgewotCQkJCQljYXNlIEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuVFJVRV9DTEFVU0VfVkFMVUU6Ci0JCQkJCQlpZkVsc2VTa2lwVHJ1ZVBhcnQgPSBmYWxzZTsJLy8gVGVsbCB0aGUgZmFsc2UgY29uZGl0aW9uIHNob3VsZCBiZSBpZ25vcmVkLgotCQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IElGRUxTRV9JR05PUkU7Ci0JCQkJCQlpZkVsc2VJZ25vcmVOZXN0Q291bnQgPSBpZkVsc2VOZXN0aW5nOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5FTFNFX0NMQVVTRV9WQUxVRToKLQkJCQkJCS8vIFRoZXJlJ3Mgbm90aGluZyB0byBkbywgaWYgaXQgd2FzIGlnbm9yZWQgZHVlIHRvIHRydWUsIHdlIHdvdWxkbid0IG9mIGdvdHRvbiBoZXJlLgotCQkJCQkJLy8gSWYgaXQgd2Fzbid0IGlnbm9yZWQsIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgZmFsc2UgZXhwcmVzc2lvbiBpcyBvbiB0aGUgc3RhY2ssIHdoaWNoIGlzIHdoYXQgaXQgc2hvdWxkIGJlLgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1c2ggdGhlIGluc3RhbmNlb2YgZXhwcmVzc2lvbi4gIFRoZSB0eXBlIHBhc3NlZCBpbiBpcyBlaXRoZXIgYSBTdHJpbmcgKHdpdGggY2xhc3NuYW1lIHRvIHRlc3QgYWdhaW5zdCkgb3IgdGhlCi0JICogdHlwZSB0byB0ZXN0IGFnYWluc3QuCi0JICogQHBhcmFtIHR5cGUgVG8gdGVzdCBhZ2FpbnN0LgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hJbnN0YW5jZW9mKENsYXNzIHR5cGUpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIkluc3RhbmNlb2YgdHlwZTogIit0eXBlLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkJCQotCQkJdHJ5IHsKLQkJCQlPYmplY3QgZXhwID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCUNsYXNzIGV4cHR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZShCb29sZWFuLnZhbHVlT2YoaXNJbnN0YW5jZSh0eXBlLCBleHAsIGV4cHR5cGUpKSwgQm9vbGVhbi5UWVBFKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IGlmIGluc3RhbmNlIG9mLiBJdCB3aWxsIG1ha2Ugc3VyZSB0aGF0IHByaW1pdGl2ZSB0byBub24tcHJpbWl0aXZlIGlzIG5vdCBwZXJtaXR0ZWQuCi0JICogVGhpcyBpcyBhIHRydWUgaW5zdGFuY2Ugb2YsIHdoaWNoIG1lYW5zIG51bGwgSVMgTk9UIEFOIGluc3RhbmNlIG9mIGFueSB0eXBlLiBUaGlzIGlzCi0JICogZGlmZmVyZW50IHRoZW4gYXNzaWduYWJsZSBmcm9tLCBpbiB0aGF0IGNhc2UgbnVsbCBjYW4gYmUgYXNzaWduZWQgdG8gYW55IGNsYXNzIHR5cGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2VyIHRvIGRvIGlzSW5zdGFuY2UuIFNpbmNlIGl0IGlzIGEgaGVscGVyIG1ldGhvZCBpdCBkb2Vzbid0Ci0JICogY2hlY2sgbm9yIHByb2Nlc3MgZXhjZXB0aW9ucy4KLQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gYmVhblR5cGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNJbnN0YW5jZShDbGFzcyB0eXBlLCBPYmplY3QgYmVhbiwgQ2xhc3MgYmVhblR5cGUpIHsKLQkJaWYgKHR5cGUuaXNQcmltaXRpdmUoKSkKLQkJCXJldHVybiBiZWFuVHlwZS5pc1ByaW1pdGl2ZSgpICYmIHR5cGUgPT0gYmVhblR5cGU7CS8vIENhbid0IHVzZSBpc0luc3RhbmNlIGJlY2F1c2UgZm9yIGEgcHJpbWl0aXZlIHR5cGUgaXNJbnN0YW5jZSByZXR1cm5zIGZhbHNlLgotCQllbHNlIAotCQkJcmV0dXJuIHR5cGUuaXNJbnN0YW5jZShiZWFuKTsKLQl9Ci0JCi0JLyoqCi0JICogUHVzaCBuZXcgaW5zdGFuY2UgZnJvbSBzdHJpbmcuCi0JICogQHBhcmFtIGluaXRpYWxpemF0aW9uU3RyaW5nCi0JICogQHBhcmFtIHJlc3VsdFR5cGUgZXhwZWN0ZWQgcmVzdWx0IHR5cGUuIElmIGl0IGlzbid0IG9mIHRoYXQgdHlwZSwgYSBjbGFzc2Nhc3Qgd2lsbCBiZSBwcm9jZXNzZWQuIAotCSAqIEBwYXJhbSBjbGFzc2xvYWRlciBjbGFzc2xvYWRlciB0byB1c2UgZm9yIGZpbmRpbmcgY2xhc3Nlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIGNsYXNzbG9hZGVyIG9mIEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmNsYXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hOZXdJbnN0YW5jZUZyb21TdHJpbmcoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nLCBDbGFzcyByZXN1bHRUeXBlLCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikgewotCQlib29sZWFuIGlnbm9yZSA9IChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiTmV3IGluc3RhbmNlIGZyb20gc3RyaW5nOiBcIiIraW5pdGlhbGl6YXRpb25TdHJpbmcrIlwiIFR5cGU9IityZXN1bHRUeXBlLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQl0cnkgewotCQkJCUluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIHBhcnNlciA9IEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmNyZWF0ZVBhcnNlcihpbml0aWFsaXphdGlvblN0cmluZywgY2xhc3Nsb2FkZXIpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHBhcnNlci5ldmFsdWF0ZSgpOwotCQkJCW5ld1ZhbHVlID0gY2FzdEJlYW4ocmVzdWx0VHlwZSwgbmV3VmFsdWUsIHBhcnNlci5nZXRFeHBlY3RlZFR5cGUoKSk7Ci0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZShuZXdWYWx1ZSwgcmVzdWx0VHlwZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHByZWZpeCBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBvcGVyYXRvciAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoUHJlZml4KFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpIHsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRUcmFjZSgiUHJlZml4OiBcJyIrb3BlcmF0b3IrIlwnIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKG9wZXJhdG9yID09IFByZWZpeE9wZXJhdG9yLlBSRV9QTFVTKQotCQkJCXJldHVybjsJLy8gRG8gbm90aGluZy4gIisiIGRvZXNuJ3QgYWZmZWN0IHRoZSByZXN1bHQgb2YgdGhlIGN1cnJlbnQgdG9wIGV4cHJlc3Npb24uCi0JCi0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlKCJQcmVmaXg6IFwnIitvcGVyYXRvcisiXCcgIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IGV4cCA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQlDbGFzcyBleHB0eXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCWlmICghZXhwdHlwZS5pc1ByaW1pdGl2ZSgpKQotCQkJCQl0aHJvd0ludmFsaWRQcmVmaXgob3BlcmF0b3IsIGV4cCk7Ci0JCQkJCi0JCQkJaW50IHByaW1UeXBlRW51bSA9IGdldEVudW1Gb3JQcmltaXRpdmUoZXhwdHlwZSk7Ci0JCQkJc3dpdGNoIChvcGVyYXRvci5nZXRWYWx1ZSgpKSB7Ci0JCQkJCWNhc2UgUHJlZml4T3BlcmF0b3IuUFJFX01JTlVTX1ZBTFVFOgotCQkJCQkJc3dpdGNoIChwcmltVHlwZUVudW0pIHsKLQkJCQkJCQljYXNlIEJPT0xFQU46Ci0JCQkJCQkJCXRocm93SW52YWxpZFByZWZpeChvcGVyYXRvciwgZXhwKTsJCQkJCQkKLQkJCQkJCQljYXNlIEJZVEU6Ci0JCQkJCQkJCWV4cCA9IG5ldyBJbnRlZ2VyKC0oKE51bWJlcikgZXhwKS5ieXRlVmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgQ0hBUjoKLQkJCQkJCQkJZXhwID0gbmV3IEludGVnZXIoLSgoQ2hhcmFjdGVyKSBleHApLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBET1VCTEU6Ci0JCQkJCQkJCWV4cCA9IG5ldyBEb3VibGUoLSgoTnVtYmVyKSBleHApLmRvdWJsZVZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEZMT0FUOgotCQkJCQkJCQlleHAgPSBuZXcgRmxvYXQoLSgoTnVtYmVyKSBleHApLmZsb2F0VmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSU5UOgotCQkJCQkJCQlleHAgPSBuZXcgSW50ZWdlcigtKChOdW1iZXIpIGV4cCkuaW50VmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgTE9ORzoKLQkJCQkJCQkJZXhwID0gbmV3IExvbmcoLSgoTnVtYmVyKSBleHApLmxvbmdWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBTSE9SVDoKLQkJCQkJCQkJZXhwID0gbmV3IEludGVnZXIoLSgoTnVtYmVyKSBleHApLnNob3J0VmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJZXhwdHlwZSA9IGdldFByaW1pdGl2ZVR5cGUoZXhwKTsJLy8gSXQgY2FuIGFjdHVhbGx5IGNoYW5nZSB0aGUgdHlwZS4JCQkJCi0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIFByZWZpeE9wZXJhdG9yLlBSRV9DT01QTEVNRU5UX1ZBTFVFOgotCQkJCQkJc3dpdGNoIChwcmltVHlwZUVudW0pIHsKLQkJCQkJCQljYXNlIEJPT0xFQU46Ci0JCQkJCQkJY2FzZSBET1VCTEU6Ci0JCQkJCQkJY2FzZSBGTE9BVDoKLQkJCQkJCQkJdGhyb3dJbnZhbGlkUHJlZml4KG9wZXJhdG9yLCBleHApOwkJCQkJCQotCQkJCQkJCWNhc2UgQllURToKLQkJCQkJCQkJZXhwID0gbmV3IEludGVnZXIofigoTnVtYmVyKSBleHApLmJ5dGVWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBDSEFSOgotCQkJCQkJCQlleHAgPSBuZXcgSW50ZWdlcih+KChDaGFyYWN0ZXIpIGV4cCkuY2hhclZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIElOVDoKLQkJCQkJCQkJZXhwID0gbmV3IEludGVnZXIofigoTnVtYmVyKSBleHApLmludFZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIExPTkc6Ci0JCQkJCQkJCWV4cCA9IG5ldyBMb25nKH4oKE51bWJlcikgZXhwKS5sb25nVmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgU0hPUlQ6Ci0JCQkJCQkJCWV4cCA9IG5ldyBJbnRlZ2VyKH4oKE51bWJlcikgZXhwKS5zaG9ydFZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWV4cHR5cGUgPSBnZXRQcmltaXRpdmVUeXBlKGV4cCk7CS8vIEl0IGNhbiBhY3R1YWxseSBjaGFuZ2UgdGhlIHR5cGUuCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBQcmVmaXhPcGVyYXRvci5QUkVfTk9UX1ZBTFVFOgotCQkJCQkJc3dpdGNoIChwcmltVHlwZUVudW0pIHsKLQkJCQkJCQljYXNlIEJPT0xFQU46Ci0JCQkJCQkJCWV4cCA9ICEoKEJvb2xlYW4pIGV4cCkuYm9vbGVhblZhbHVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEJZVEU6Ci0JCQkJCQkJY2FzZSBDSEFSOgotCQkJCQkJCWNhc2UgRE9VQkxFOgotCQkJCQkJCWNhc2UgRkxPQVQ6Ci0JCQkJCQkJY2FzZSBJTlQ6Ci0JCQkJCQkJY2FzZSBMT05HOgotCQkJCQkJCWNhc2UgU0hPUlQ6Ci0JCQkJCQkJCXRocm93SW52YWxpZFByZWZpeChvcGVyYXRvciwgZXhwKTsJCQkJCQkKLQkJCQkJCX0JCQkJCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludE9iamVjdEFuZFR5cGUoZXhwLCBleHB0eXBlKTsKLQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKGV4cCwgZXhwdHlwZSk7CS8vIFB1c2ggdGhlIHJlc3VsdCBiYWNrIG9uIHRoZSBzdGFjay4KLQkKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQkJCQotCX0KLQkKLQkvKioKLQkgKiBBc3NpZ24gdGhlIHJpZ2h0IGV4cHJlc3Npb24gdG8gdGhlIGxlZnQgZXhwcmVzc2lvbi4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQXNzaWdubWVudCgpIHsKLQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKSB7Ci0JCQlpZiAodHJhY2VPbikgewotCQkJCXByaW50VHJhY2UoIkFzc2lnbm1lbnQiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCS8vIEtMVURHRTogVGhlIG9ubHkgcmVhc29uIGxlZnRWYWx1ZS9yZWZUeXBlIGFyZSBvdXRzaWRlIG9mIHRyeS9maW5hbGx5IGlzIGJlY2F1c2UKLQkJCS8vIG9mIHRyYWNpbmcuIHB1c2hFeHByZXNzaW9uKCkgZG9lcyBpdHMgb3duIHRyYWNlIHN0YXRlbWVudHMsIHNvIHdlIG5lZWQgdG8gZW5kCi0JCQkvLyBvdXIgdHJhY2UgYmVmb3JlIGNhbGxpbmcgcHVzaEV4cHJlc3Npb24uIAotCQkJT2JqZWN0IGxlZnRWYWx1ZTsKLQkJCUNsYXNzIHJlZlR5cGU7Ci0JCQl0cnkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlKCJBc3NpZ25tZW50OiAiLCBmYWxzZSk7CQkJIC8vJE5PTi1OTFMtMSQJCi0JCQkJLy8gVGhlIG9yZGVyIG9uIHRoZSBzdGFjayBpcyByaWdodCB0aGVuIGxlZnQgb3BlcmFuZC4KLQkJCQkvLyBGaXJzdCB0aGUgcmlnaHQgb3BlcmFuZAotCQkJCU9iamVjdCB2YWx1ZSA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQlDbGFzcyB0eXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCi0JCQkJLy8gTmV4dCB0aGUgbGVmdCBvcGVyYW5kLCBzaG91bGQgYmUgYSByZWZlcmVuY2UuCi0JCQkJVmFyaWFibGVSZWZlcmVuY2UgbGVmdCA9IChWYXJpYWJsZVJlZmVyZW5jZSkgcG9wRXhwcmVzc2lvbihmYWxzZSk7IC8vIERvbid0IGRlcmVmZXJlbmNlIGl0LgotCQkJCXJlZlR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0KLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKGxlZnQsIHJlZlR5cGUpOwotCi0JCQkJbGVmdFZhbHVlID0gbGVmdC5zZXQodmFsdWUsIHR5cGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRUcmFjZUVuZCgpOwotCQkJfQotCQkJCi0JCQkvLyBOb3cgZG8gYXNzaWdubWVudCBhbmQgcmV0dXJuIHRoZSB2YWx1ZSB0byB0aGUgc3RhY2suCi0JCQlwdXNoRXhwcmVzc2lvbihsZWZ0VmFsdWUsIHJlZlR5cGUpOwkvLyBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IGlzIHRoZSB0eXBlIG9mIHRoZSByZWZlcmVuY2UuCi0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JCQkKLQl9Ci0JCi0JLyoqCi0JICogQXNzaWduIHRoZSBleHByZXNzaW9uIHByb3h5IHRvIHRoZSB0b3AgZXhwcmVzc2lvbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQXNzaWdubWVudChJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSBwcm94eSkgewotCQlib29sZWFuIGlnbm9yZSA9IChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCXRyeSB7Ci0JCQlpZiAodHJhY2VPbikgewotCQkJCXByaW50VHJhY2UoIkFzc2lnbiB0byBQcm94eSAjIitwcm94eS5nZXRQcm94eUlEKCksIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQl0cnkgewotCQkJCWFzc2lnblRvRXhwcmVzc2lvblByb3h5RnJvbVRvcFN0YWNrRW50cnkocHJveHkpOwotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludE9iamVjdEFuZFR5cGUocHJveHkuZ2V0VmFsdWUoKSwgcHJveHkuZ2V0VHlwZSgpKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQXNzaWduIHRoZSB0b3Agc3RhY2sgZW50cnkgdG8gdGhlIG5ldyBleHByZXNzaW9uIHByb3h5IGFuZCBhbGxvY2F0ZSBpdCBmb3IgY2FsbGJhY2sgbGF0ZXIuCi0JICogQHBhcmFtIHByb3h5Ci0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFzc2lnblRvRXhwcmVzc2lvblByb3h5RnJvbVRvcFN0YWNrRW50cnkoSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgcHJveHkpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldEV4cHJlc3Npb24oMSk7Ci0JCUNsYXNzIHR5cGUgPSBnZXRFeHByZXNzaW9uVHlwZSgxLCB0cnVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgVmFyaWFibGVSZWZlcmVuY2UpCi0JCQl2YWx1ZSA9ICgoVmFyaWFibGVSZWZlcmVuY2UpIHZhbHVlKS5kZXJlZmVyZW5jZSgpOwkvLyBIZXJlIHdlIHdhbnQgdGhlIGZpbmFsIGN1cnJlbnQgdmFsdWUuCi0KLQkJcHJveHkuc2V0UHJveHkodmFsdWUsIHR5cGUpOwotCQlhbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShwcm94eSk7Ci0JfQotCi0JLyoqCi0JICogQWxsb2NhdGUgYW4gZXhwcmVzc2lvbiBwcm94eS4gVGhpcyBpcyB1c2VkIHRvIG1ha2UgYW4gZXhwcmVzc2lvbiBwcm94eSBrbm93biB0byB0aGUgcHJvY2Vzc29yLiBUaGUgZXhwcmVzc2lvbiBwcm94eSBtdXN0Ci0JICogaGF2ZSBiZWVuIHNldFByb3h5KCkgYXQgdGhpcyBwb2ludC4gVGhpcyBpcyB1c2VkIHRvIGFzc2lnbiBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrIG9yIHRvIGFkZCBmcm9tIG91dHNpZGUgYW4gZXZhbHVhdGVkIHByb3h5Ci0JICogdG8gYmUgdXNlZCBsYXRlciBieSBvdGhlcnMuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgcHJveHkpIHsKLQkJaW50IG1pblNpemUgPSBwcm94eS5nZXRQcm94eUlEKCkrMTsKLQkJaWYgKGV4cHJlc3Npb25Qcm94aWVzID09IG51bGwpCi0JCQlleHByZXNzaW9uUHJveGllcyA9IG5ldyBBcnJheUxpc3QobWluU2l6ZSsxMCk7CS8vIEFsbG93IHJvb20gdG8gZ3JvdyB0ZW4gbW9yZS4KLQkJZWxzZSBpZiAoZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpIDwgbWluU2l6ZSkKLQkJCWV4cHJlc3Npb25Qcm94aWVzLmVuc3VyZUNhcGFjaXR5KG1pblNpemUrMTApOwkvLyBBbGxvdyByb29tIHRvIGdyb3cgdGVuIG1vcmUuCi0JCWludCBmaWxsID0gbWluU2l6ZS1leHByZXNzaW9uUHJveGllcy5zaXplKCk7CS8vIE51bWJlciBvZiAibnVsbCIgZmlsbCBlbnRyaWVzIG5lZWRlZC4gUHJvYmFibHkgc2hvdWxkbid0IG9jY3VyLCBidXQgdG8gYmUgc2FmZS4KLQkJaWYgKGZpbGwgPiAwKSB7Ci0JCQl3aGlsZSAoLS1maWxsID4gMCkKLQkJCQlleHByZXNzaW9uUHJveGllcy5hZGQobnVsbCk7Ci0JCQlleHByZXNzaW9uUHJveGllcy5hZGQocHJveHkpOwotCQl9IGVsc2UKLQkJCWV4cHJlc3Npb25Qcm94aWVzLnNldChwcm94eS5nZXRQcm94eUlEKCksIHByb3h5KTsJLy8gQWxyZWFkeSBsYXJnZSBlbm91Z2gsIHJlcGxhY2UgZW50cnkuCi0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWl0aXZlIGVudW1zLiAKLQkgKiBOT1RFOiBUaGVpciBvcmRlciBtdXN0IG5vdCBjaGFuZ2VkLiBUaGV5IGFyZSBpbiBvcmRlciBvZiBwZXJtaXR0ZWQgd2lkZW5pbmcuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQKLQkJQk9PTEVBTiA9IDAsCi0JCUJZVEUgPSAxLAotCQlTSE9SVCA9IDIsCQotCQlDSEFSID0gMywKLQkJSU5UID0gNCwKLQkJTE9ORyA9IDUsCi0JCUZMT0FUID0gNiwKLQkJRE9VQkxFID0gNzsKLQkJCi0JCQotCQotCS8qKgotCSAqIEdldCB0aGUgZW51bSBjb25zdGFudCBmb3IgdGhlIHR5cGUgb2YgcHJpbWl0aXZlIHBhc3NlZCBpbi4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgZXhwcmVzc2lvbiBwcm9jZXNzZXIgdG8gZ2V0IHRoZSBlbnVtIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUuIFNpbmNlIGl0IGlzIGEgaGVscGVyIG1ldGhvZCBpdCBkb2Vzbid0Ci0JICogY2hlY2sgbm9yIHByb2Nlc3MgdGhlIGV4Y2VwdGlvbi4gSXQgdGhyb3dzIGl0LiBDYWxsZXJzIG11c3QgaGFuZGxlIGl0IGFzIHRoZXkgc2VlIGZpdC4KLQotCSAqIEBwYXJhbSBwcmltaXRpdmVUeXBlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHR5cGUgaXMgbm90IGEgcHJpbWl0aXZlLgotCSAqIAotCSAqIEBzZWUgRXhwcmVzc2lvblByb2Nlc3NlciNCT09MRUFOCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBnZXRFbnVtRm9yUHJpbWl0aXZlKENsYXNzIHByaW1pdGl2ZVR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlpZiAocHJpbWl0aXZlVHlwZSA9PSBCb29sZWFuLlRZUEUpCi0JCQlyZXR1cm4gQk9PTEVBTjsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBJbnRlZ2VyLlRZUEUpCi0JCQlyZXR1cm4gSU5UOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IEJ5dGUuVFlQRSkKLQkJCXJldHVybiBCWVRFOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IENoYXJhY3Rlci5UWVBFKQotCQkJcmV0dXJuIENIQVI7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gRG91YmxlLlRZUEUpCi0JCQlyZXR1cm4gRE9VQkxFOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IEZsb2F0LlRZUEUpCi0JCQlyZXR1cm4gRkxPQVQ7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gTG9uZy5UWVBFKQotCQkJcmV0dXJuIExPTkc7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gU2hvcnQuVFlQRSkKLQkJCXJldHVybiBTSE9SVDsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwcmltaXRpdmVUeXBlICE9IG51bGwgPyBwcmltaXRpdmVUeXBlLmdldE5hbWUoKSA6ICJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRocm93SW52YWxpZFByZWZpeChQcmVmaXhPcGVyYXRvciBvcGVyYXRvciwgT2JqZWN0IGV4cCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuSW52YWxpZE9wZXJhbmRPZlByZWZpeE9wZXJhdG9yX0VYQ18iKSwgbmV3IE9iamVjdFtdIHtleHAgIT0gbnVsbCA/IGV4cC50b1N0cmluZygpIDogbnVsbCwgb3BlcmF0b3IudG9TdHJpbmcoKX0pKTsgLy8kTk9OLU5MUy0xJAotCX0JCQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJTkZJWF9JR05PUkUgPSAiSU5GSVggSUdOT1JFIjsJLy8gRmxhZyBmb3IgaW5maXggaW4gaW5nb3JlIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGludCBpbmZpeE5lc3RpbmcgPSAwOwkvLyBOZXN0aW5nIG9mIGluZml4IGV4cHJlc3Npb25zLgotCXByaXZhdGUgaW50IGluZml4SWdub3JlTmVzdENvdW50ID0gMDsJLy8gV2hlbiBpZ25vcmluZyBpbmZpeCBleHByZXNzaW9ucywgaWdub3JlIHVudGlsIHRoaXMgbmVzdCBjb3VudC4KLQkvKioKLQkgKiBQdXNoIHRoZSBpbmZpeCBleHByZXNzaW9uIG9udG8gdGhlIHN0YWNrLgotCSAqIEBwYXJhbSBvcGVyYXRvcgotCSAqIEBwYXJhbSBvcGVyYW5kVHlwZSBUaGUgb3BlcmF0b3IgdHlwZS4gTGVmdCwgcmlnaHQsIG90aGVyLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hJbmZpeChJbmZpeE9wZXJhdG9yIG9wZXJhdG9yLCBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUgb3BlcmFuZFR5cGUpIHsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gaWdub3JlID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVycm9yT2NjdXJyZWQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvLyBTbGlnaHRseSBkaWZmZXJlbnQgaGVyZSBpbiB0aGF0IGlmIGFuIGlnbm9yZWQgb2NjdXJyZWQgd2Ugc3RpbGwgbmVlZCB0byBwcm9jZXNzIGF0IGxlYXN0IHBhcnQgb2YgaXQgc28gdGhhdAotCQkJCS8vIHdlIGNhbiBnZXQgdGhlIGV4cHJlc3Npb24gZ3JvdXBpbmcgY29ycmVjdC4KLQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJaW5maXhOZXN0aW5nKys7Ci0JCQkJZWxzZSBpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xBU1RfT1BFUkFORCkgewotCQkJCQlpbnQgY3VycmVudE5lc3QgPSBpbmZpeE5lc3RpbmctLTsKLQkJCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gPT0gSU5GSVhfSUdOT1JFICYmIGN1cnJlbnROZXN0ID09IGluZml4SWdub3JlTmVzdENvdW50KSB7Ci0JCQkJCQkvLyBXZSB3ZXJlIGlnbm9yaW5nLCBhbmQgaXQgd2FzIHRoaXMgZXhwcmVzc2lvbiB0aGF0IHdhcyBiZWluZyBpZ25vcmUuCi0JCQkJCQkvLyBXZSBoYXZlIHJlY2VpdmVkIHRoZSBsYXN0IG9wZXJhbmQgb2YgdGhlIG5lc3RlZCBleHByZXNzaW9uIHRoYXQgd2FzIGJlaW5nIGlnbm9yZWQsCi0JCQkJCQkvLyBzbyB3ZSBjYW4gc3RvcCBpZ25vcmluZy4gQnV0IHdlIHN0aWxsIGxlYXZlIHNpbmNlIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBvbiB0aGUKLQkJCQkJCS8vIHRvcCBvZiB0aGUgc3RhY2suCi0JCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gbnVsbDsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlKCJJbmZpeDogIitvcGVyYXRvciwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCU9iamVjdCByaWdodCA9IG51bGw7Ci0JCQkJQ2xhc3MgcmlnaHRUeXBlID0gbnVsbDsKLQkJCQlpZiAob3BlcmFuZFR5cGUgIT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkgewotCQkJCQkvLyBXZSBhcmUgbm90IHRoZSBsZWZ0IG9wZXJhbmQsIHNvIHRoZSBzdGFjayBoYXMgdGhlIHJpZ2h0IG9uIHRoZSB0b3AsIGZvbGxvd2VkIGJ5IHRoZSBsZWZ0LgotCQkJCQlyaWdodCA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJcmlnaHRUeXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCX0gCi0JCQkJCi0JCQkJT2JqZWN0IHZhbHVlID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCUNsYXNzIHZhbHVlVHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkKLQkJCQlzd2l0Y2ggKG9wZXJhdG9yLmdldFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0FORF9WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9BTkQpOwotCQkJCQkJdGVzdFZhbGlkQml0VHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fQU5EKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpICYgZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCBpcyBpbnQuIChldmVuIHR3byBzaG9ydHMgdG9nZXRoZXIgcHJvZHVjZSBhbiBpbnQpLgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSAmIGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfQU5EX1ZBTFVFOgotCQkJCQkJLy8gVGhpcyBpcyB0cmlja3kuCi0JCQkJCQkvLyBGaXJzdCBpZiB0aGlzIGlzIGxlZnQgdHlwZSwgdGhlbiBqdXN0IGNvbnRpbnVlLgotCQkJCQkJLy8gRWxzZSBpZiB0aGlzIG90aGVyIG9yIGxhc3QsIHRoZW4gbmVlZCB0byBtYWtlIGl0IHRoZSBuZXcgdmFsdWUuCi0JCQkJCQlpZiAob3BlcmFuZFR5cGUgIT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkgewotCQkJCQkJCXZhbHVlID0gcmlnaHQ7Ci0JCQkJCQkJdmFsdWVUeXBlID0gcmlnaHRUeXBlOwotCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJLy9JZiB0aGUgdmFsdWUgaXMgbm93IGZhbHNlLCB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUgcmVzdC4KLQkJCQkJCWlmICh2YWx1ZVR5cGUgIT0gQm9vbGVhbi5UWVBFKQotCQkJCQkJCXRocm93SW52YWxpZEluZml4KG9wZXJhdG9yLCB2YWx1ZSk7Ci0JCQkJCQlpZiAoISgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpICYmIG9wZXJhbmRUeXBlICE9IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MQVNUX09QRVJBTkQpCi0JCQkJCQkJc3RhcnRJbmZpeElnbm9yZSgpOwkvLyBTdGFydCBpZ25vcmluZyBiZWNhdXNlIHdlIGtub3cgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGF0IHRoaXMgcG9pbnQuIEl0IGlzIGZhbHNlLgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9PUl9WQUxVRToKLQkJCQkJCS8vIFRoaXMgaXMgdHJpY2t5LgotCQkJCQkJLy8gRmlyc3QgaWYgdGhpcyBpcyBsZWZ0IHR5cGUsIHRoZW4ganVzdCBjb250aW51ZS4KLQkJCQkJCS8vIEVsc2UgaWYgdGhpcyBvdGhlciBvciBsYXN0LCB0aGVuIG5lZWQgdG8gbWFrZSBpdCB0aGUgbmV3IHZhbHVlLgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlICE9IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpIHsKLQkJCQkJCQl2YWx1ZSA9IHJpZ2h0OwotCQkJCQkJCXZhbHVlVHlwZSA9IHJpZ2h0VHlwZTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy9JZiB0aGUgdmFsdWUgaXMgbm93IHRydWUsIHdlIG5lZWQgdG8gaWdub3JlIHRoZSByZXN0LgotCQkJCQkJaWYgKHZhbHVlVHlwZSAhPSBCb29sZWFuLlRZUEUpCi0JCQkJCQkJdGhyb3dJbnZhbGlkSW5maXgob3BlcmF0b3IsIHZhbHVlKTsKLQkJCQkJCWlmICgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSAmJiBvcGVyYW5kVHlwZSAhPSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEFTVF9PUEVSQU5EKQotCQkJCQkJCXN0YXJ0SW5maXhJZ25vcmUoKTsgLy8gU3RhcnQgaWdub3JpbmcgYmVjYXVzZSB3ZSBrbm93IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBhdCB0aGlzIHBvaW50LiBJdCBpcyB0cnVlLgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9ESVZJREVfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0RJVklERSk7Ci0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fRElWSURFKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCB0aGUgcmVzdWx0IHdpbGwgYmUgZG91YmxlLgotCQkJCQkJCXZhbHVlID0gbmV3IERvdWJsZShnZXREb3VibGUodmFsdWUpIC8gZ2V0RG91YmxlKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRG91YmxlLlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIHRoZSByZXN1bHQgd2lsbCBiZSBmbG9hdC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdChnZXRGbG9hdCh2YWx1ZSkgLyBnZXRGbG9hdChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEZsb2F0LlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgLyBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IHdpbGwgcmVzdWx0IGluIGFuIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgLyBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0VRVUFMU19WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJLy8gV2Ugc2hvdWxkIG5ldmVyIGdldCBleHRlbmRlZCBvcGVyYXRvciBmb3IgdGhpcywgYnV0IHdlJ2xsIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkuCi0JCQkJCQlpZiAodmFsdWVUeXBlLmlzUHJpbWl0aXZlKCkgJiYgcmlnaHRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQkvLyBQcmltaXRpdmVzIHJlcXVpcmUgbW9yZSB0ZXN0aW5nIHRoYW4ganVzdCA9PS4gYm9vbGVhbiBwcmltaXRpdmVzIAotCQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gQm9vbGVhbi5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBCb29sZWFuLlRZUEUpIHsKLQkJCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgYSBib29sZWFuLCB0aGVuIHRoZSBvdGhlciBzaWRlIG5lZWRzIHRvIGJlIGJvb2xlYW4gZm9yIGl0IHRvIGV2ZW4gdHJ5IHRvIGJlIHRydWUuCi0JCQkJCQkJCWlmICh2YWx1ZVR5cGUgIT0gQm9vbGVhbi5UWVBFIHx8IHZhbHVlVHlwZSAhPSBCb29sZWFuLlRZUEUpCi0JCQkJCQkJCQl2YWx1ZSA9IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCXZhbHVlID0gKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpID09ICgoQm9vbGVhbikgcmlnaHQpLmJvb2xlYW5WYWx1ZSgpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gTm93IGRvIG51bWJlciB0ZXN0cyBzaW5jZSBub3QgYm9vbGVhbiBwcmltaXRpdmUsIG9ubHkgbnVtYmVycyBhcmUgbGVmdAotCQkJCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCBjb21wYXJlIGFzIGRvdWJsZS4KLQkJCQkJCQkJCXZhbHVlID0gKGdldERvdWJsZSh2YWx1ZSkgPT0gZ2V0RG91YmxlKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgY29tcGFyZSBhcyBmbG9hdC4KLQkJCQkJCQkJCXZhbHVlID0gKGdldEZsb2F0KHZhbHVlKSA9PSBnZXRGbG9hdChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSBjb21wYXJlIGFzIGxvbmcuCi0JCQkJCQkJCQl2YWx1ZSA9IChnZXRMb25nKHZhbHVlKSA9PSBnZXRMb25nKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJLy8gRWxzZSBpdCB3aWxsIGNvbXBhcmUgYXMgaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCQkJdmFsdWUgPSAoZ2V0SW50KHZhbHVlKSA9PSBnZXRJbnQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZS5pc1ByaW1pdGl2ZSgpIHx8IHJpZ2h0VHlwZS5pc1ByaW1pdGl2ZSgpKQotCQkJCQkJCXZhbHVlID0gQm9vbGVhbi5GQUxTRTsJLy8gQ2FuJ3QgYmUgdHJ1ZSBpZiBvbmUgc2lkZSBwcmltIGFuZCB0aGUgb3RoZXIgaXNuJ3QKLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIEp1c3QgZG8gb2JqZWN0ID09Ci0JCQkJCQkJdmFsdWUgPSAodmFsdWUgPT0gcmlnaHQpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0KLQkJCQkJCXZhbHVlVHlwZSA9IEJvb2xlYW4uVFlQRTsJLy8gV2Uga25vdyByZXN1bHQgd2lsbCBiZSBhIGJvb2xlYW4uCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVJfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVIpOwotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVIpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIGNvbXBhcmUgd2lsbCBiZSBkb3VibGUuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0RG91YmxlKHZhbHVlKSA+IGdldERvdWJsZShyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgY29tcGFyZSB3aWxsIGJlIGZsb2F0LgotCQkJCQkJCXZhbHVlID0gKGdldEZsb2F0KHZhbHVlKSA+IGdldEZsb2F0KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCBjb21wYXJlIHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IChnZXRMb25nKHZhbHVlKSA+IGdldExvbmcocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgY29tcGFyZSB3aWxsIGJlIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQl2YWx1ZSA9IChnZXRJbnQodmFsdWUpID4gZ2V0SW50KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfQotCQkJCQkJdmFsdWVUeXBlID0gQm9vbGVhbi5UWVBFOwkvLyBXZSBrbm93IHJlc3VsdCB3aWxsIGJlIGEgYm9vbGVhbi4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fR1JFQVRFUl9FUVVBTFNfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVJfRVFVQUxTKTsKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSX0VRVUFMUyk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgY29tcGFyZSB3aWxsIGJlIGRvdWJsZS4KLQkJCQkJCQl2YWx1ZSA9IChnZXREb3VibGUodmFsdWUpID49IGdldERvdWJsZShyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgY29tcGFyZSB3aWxsIGJlIGZsb2F0LgotCQkJCQkJCXZhbHVlID0gKGdldEZsb2F0KHZhbHVlKSA+PSBnZXRGbG9hdChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgY29tcGFyZSB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0TG9uZyh2YWx1ZSkgPj0gZ2V0TG9uZyhyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBjb21wYXJlIHdpbGwgYmUgaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCXZhbHVlID0gKGdldEludCh2YWx1ZSkgPj0gZ2V0SW50KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfQotCQkJCQkJdmFsdWVUeXBlID0gQm9vbGVhbi5UWVBFOwkvLyBXZSBrbm93IHJlc3VsdCB3aWxsIGJlIGEgYm9vbGVhbi4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fTEVGVF9TSElGVF9WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9MRUZUX1NISUZUKTsKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0xFRlRfU0hJRlQpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgPDwgZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCBpcyBpbnQuIChldmVuIHR3byBzaG9ydHMgdG9nZXRoZXIgcHJvZHVjZSBhbiBpbnQpLgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSA8PCBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0xFU1NfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0xFU1MpOwotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0xFU1MpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIGNvbXBhcmUgd2lsbCBiZSBkb3VibGUuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0RG91YmxlKHZhbHVlKSA8IGdldERvdWJsZShyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgY29tcGFyZSB3aWxsIGJlIGZsb2F0LgotCQkJCQkJCXZhbHVlID0gKGdldEZsb2F0KHZhbHVlKSA8IGdldEZsb2F0KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCBjb21wYXJlIHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IChnZXRMb25nKHZhbHVlKSA8IGdldExvbmcocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgY29tcGFyZSB3aWxsIGJlIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQl2YWx1ZSA9IChnZXRJbnQodmFsdWUpIDwgZ2V0SW50KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfQotCQkJCQkJdmFsdWVUeXBlID0gQm9vbGVhbi5UWVBFOwkvLyBXZSBrbm93IHJlc3VsdCB3aWxsIGJlIGEgYm9vbGVhbi4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fTEVTU19FUVVBTFNfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0xFU1NfRVFVQUxTKTsKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9MRVNTX0VRVUFMUyk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgY29tcGFyZSB3aWxsIGJlIGRvdWJsZS4KLQkJCQkJCQl2YWx1ZSA9IChnZXREb3VibGUodmFsdWUpIDw9IGdldERvdWJsZShyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgY29tcGFyZSB3aWxsIGJlIGZsb2F0LgotCQkJCQkJCXZhbHVlID0gKGdldEZsb2F0KHZhbHVlKSA8PSBnZXRGbG9hdChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgY29tcGFyZSB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0TG9uZyh2YWx1ZSkgPD0gZ2V0TG9uZyhyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBjb21wYXJlIHdpbGwgYmUgaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCXZhbHVlID0gKGdldEludCh2YWx1ZSkgPD0gZ2V0SW50KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfQotCQkJCQkJdmFsdWVUeXBlID0gQm9vbGVhbi5UWVBFOwkvLyBXZSBrbm93IHJlc3VsdCB3aWxsIGJlIGEgYm9vbGVhbi4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fTUlOVVNfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTKTsKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9NSU5VUyk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgdGhlIHJlc3VsdCB3aWxsIGJlIGRvdWJsZS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoZ2V0RG91YmxlKHZhbHVlKSAtIGdldERvdWJsZShyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IERvdWJsZS5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCB0aGUgcmVzdWx0IHdpbGwgYmUgZmxvYXQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoZ2V0RmxvYXQodmFsdWUpIC0gZ2V0RmxvYXQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBGbG9hdC5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpIC0gZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCB3aWxsIHJlc3VsdCBpbiBhbiBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpIC0gZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9OT1RfRVFVQUxTX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkvLyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGV4dGVuZGVkIG9wZXJhdG9yIGZvciB0aGlzLCBidXQgd2UnbGwgaWdub3JlIHRoZSBwb3NzaWJpbGl0eS4KLQkJCQkJCWlmICh2YWx1ZVR5cGUuaXNQcmltaXRpdmUoKSAmJiByaWdodFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCQkJCS8vIFByaW1pdGl2ZXMgcmVxdWlyZSBtb3JlIHRlc3RpbmcgdGhhbiBqdXN0ID09LiBib29sZWFuIHByaW1pdGl2ZXMgCi0JCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBCb29sZWFuLlRZUEUgfHwgcmlnaHRUeXBlID09IEJvb2xlYW4uVFlQRSkgewotCQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBhIGJvb2xlYW4sIHRoZW4gdGhlIG90aGVyIHNpZGUgbmVlZHMgdG8gYmUgYm9vbGVhbiBmb3IgaXQgdG8gZXZlbiB0cnkgdG8gYmUgdHJ1ZS4KLQkJCQkJCQkJaWYgKHZhbHVlVHlwZSAhPSBCb29sZWFuLlRZUEUgfHwgdmFsdWVUeXBlICE9IEJvb2xlYW4uVFlQRSkKLQkJCQkJCQkJCXZhbHVlID0gQm9vbGVhbi5UUlVFOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQl2YWx1ZSA9ICgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSAhPSAoKEJvb2xlYW4pIHJpZ2h0KS5ib29sZWFuVmFsdWUoKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIE5vdyBkbyBudW1iZXIgdGVzdHMgc2luY2Ugbm90IGJvb2xlYW4gcHJpbWl0aXZlLCBvbmx5IG51bWJlcnMgYXJlIGxlZnQKLQkJCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgY29tcGFyZSBhcyBkb3VibGUuCi0JCQkJCQkJCQl2YWx1ZSA9IChnZXREb3VibGUodmFsdWUpICE9IGdldERvdWJsZShyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIGNvbXBhcmUgYXMgZmxvYXQuCi0JCQkJCQkJCQl2YWx1ZSA9IChnZXRGbG9hdCh2YWx1ZSkgIT0gZ2V0RmxvYXQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgY29tcGFyZSBhcyBsb25nLgotCQkJCQkJCQkJdmFsdWUgPSAoZ2V0TG9uZyh2YWx1ZSkgIT0gZ2V0TG9uZyhyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCS8vIEVsc2UgaXQgd2lsbCBjb21wYXJlIGFzIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQkJCXZhbHVlID0gKGdldEludCh2YWx1ZSkgIT0gZ2V0SW50KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUuaXNQcmltaXRpdmUoKSB8fCByaWdodFR5cGUuaXNQcmltaXRpdmUoKSkKLQkJCQkJCQl2YWx1ZSA9IEJvb2xlYW4uVFJVRTsJLy8gTXVzdCBiZSB0cnVlIGlmIG9uZSBzaWRlIHByaW0gYW5kIHRoZSBvdGhlciBpc24ndAotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gSnVzdCBkbyBvYmplY3QgIT0KLQkJCQkJCQl2YWx1ZSA9ICh2YWx1ZSAhPSByaWdodCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfQotCQkJCQkJdmFsdWVUeXBlID0gQm9vbGVhbi5UWVBFOwkvLyBXZSBrbm93IHJlc3VsdCB3aWxsIGJlIGEgYm9vbGVhbi4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fT1JfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQml0VHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fT1IpOwotCQkJCQkJdGVzdFZhbGlkQml0VHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fT1IpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgfCBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IGlzIGludC4gKGV2ZW4gdHdvIHNob3J0cyB0b2dldGhlciBwcm9kdWNlIGFuIGludCkuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpIHwgZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9QTFVTX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpIHsKLQkJCQkJCQlpZiAodmFsdWVUeXBlID09IFN0cmluZy5jbGFzcykgewotCQkJCQkJCQkvLyBTcGVjaWFsLiBsZWZ0IGFyZ3VtZW50IGlzIGEgc3RyaW5nLCBzbyB3ZSB3YW50IHRvIHN0b3JlIGEgc3RyaW5nIGJ1ZmZlciBpbnN0ZWFkCi0JCQkJCQkJCS8vIHNpbmNlIHdlIGtub3cgd2Ugd2lsbCBiZSBhcHBlbmRpbmcgdG8gaXQuIAotCQkJCQkJCQl2YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKFN0cmluZykgdmFsdWUpOwotCQkJCQkJCX0JCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZFBsdXNUeXBlKHZhbHVlVHlwZSwgcmlnaHRUeXBlKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gU3RyaW5nLmNsYXNzIHx8IHJpZ2h0VHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKLQkJCQkJCQkvLyBTcGVjaWFsIHdlIGhhdmUgYSBzdHJpbmcgb24gb25lIHNpZGUuIE5lZWQgdG8gZG8gaXQgYXMgc3RyaW5ncyBpbnN0ZWFkLgotCQkJCQkJCS8vIFdlIGFyZSBnb2luZyB0byBiZSB0cmlja3kgaW4gdGhhdCB3ZSB3aWxsIHN0b3JlIGEgU3RyaW5nQnVmZmVyIG9uIHRoZSBzdGFjayAoaWYgbm90IGxhc3Qgb3BlcmFuZCkKLQkJCQkJCQkvLyBidXQgY2FsbCBpdCBhIHN0cmluZy4KLQkJCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBudWxsOwotCQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gU3RyaW5nLmNsYXNzKSB7Ci0JCQkJCQkJCXNiID0gKFN0cmluZ0J1ZmZlcikgdmFsdWU7CS8vIFdlIGtub3cgdGhhdCBpZiB0aGUgdmFsdWUgKGxlZnQpIGlzIHN0cmluZyB0eXBlLCB3ZSd2ZSBhbHJlYWR5IGNvbnZlcnRlZCBpdCB0byBidWZmZXIuCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gVGhlIHJpZ2h0IGlzIHRoZSBvbmUgdGhhdCBpbnRyb2R1Y2VzIHRoZSBzdHJpbmcsIHNvIHdlIGNoYW5nZSB0aGUgdmFsdWUgb3ZlciB0byBhIHN0cmluZyBidWZmZXIuCi0JCQkJCQkJCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigoKFN0cmluZykgcmlnaHQpLmxlbmd0aCgpKzE2KTsJLy8gV2UgY2FuJ3QgcHV0IHRoZSB2YWx1ZSBpbiB5ZXQsIG5lZWQgdG8gZ2V0IGxlZnQgaW50byBpdC4KLQkJCQkJCQkJYXBwZW5kVG9CdWZmZXIoc2IsIHZhbHVlLCB2YWx1ZVR5cGUpOwkvLyBQdXQgdGhlIGxlZnQgdmFsdWUgaW4gbm93Ci0JCQkJCQkJCXZhbHVlID0gc2I7Ci0JCQkJCQkJCXZhbHVlVHlwZSA9IFN0cmluZy5jbGFzczsJLy8gTWFrZSBpdCBhIHN0cmluZyBjbGFzcwotCQkJCQkJCX0KLQkJCQkJCQlhcHBlbmRUb0J1ZmZlcihzYiwgcmlnaHQsIHJpZ2h0VHlwZSk7Ci0JCQkJCQkJLy8gTm93IGlmIHdlIGFyZSB0aGUgbGFzdCBvcGVyYW5kLCB3ZSBzaG91bGQgZ2V0IHJpZCBvZiB0aGUgYnVmZmVyIGFuZCBwdXQgYSB0cnVlIHN0cmluZyBiYWNrIGluLgotCQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEFTVF9PUEVSQU5EKQotCQkJCQkJCQl2YWx1ZSA9IHNiLnRvU3RyaW5nKCk7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIHRoZSByZXN1bHQgd2lsbCBiZSBkb3VibGUuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKGdldERvdWJsZSh2YWx1ZSkgKyBnZXREb3VibGUocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBEb3VibGUuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgdGhlIHJlc3VsdCB3aWxsIGJlIGZsb2F0LgotCQkJCQkJCXZhbHVlID0gbmV3IEZsb2F0KGdldEZsb2F0KHZhbHVlKSArIGdldEZsb2F0KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRmxvYXQuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSArIGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgd2lsbCByZXN1bHQgaW4gYW4gaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSArIGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fUkVNQUlOREVSX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVIpOwotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1JFTUFJTkRFUik7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgdGhlIHJlc3VsdCB3aWxsIGJlIGRvdWJsZS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoZ2V0RG91YmxlKHZhbHVlKSAlIGdldERvdWJsZShyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IERvdWJsZS5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCB0aGUgcmVzdWx0IHdpbGwgYmUgZmxvYXQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoZ2V0RmxvYXQodmFsdWUpICUgZ2V0RmxvYXQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBGbG9hdC5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpICUgZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCB3aWxsIHJlc3VsdCBpbiBhbiBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpICUgZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9TSUdORURfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQml0VHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfU0lHTkVEKTsKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1NJR05FRCk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSA+PiBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IGlzIGludC4gKGV2ZW4gdHdvIHNob3J0cyB0b2dldGhlciBwcm9kdWNlIGFuIGludCkuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpID4+IGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfVU5TSUdORURfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQml0VHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfVU5TSUdORUQpOwotCQkJCQkJdGVzdFZhbGlkQml0VHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfVU5TSUdORUQpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgPj4+IGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgaXMgaW50LiAoZXZlbiB0d28gc2hvcnRzIHRvZ2V0aGVyIHByb2R1Y2UgYW4gaW50KS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgPj4+IGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fVElNRVNfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1RJTUVTKTsKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9USU1FUyk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgdGhlIHJlc3VsdCB3aWxsIGJlIGRvdWJsZS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoZ2V0RG91YmxlKHZhbHVlKSAqIGdldERvdWJsZShyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IERvdWJsZS5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCB0aGUgcmVzdWx0IHdpbGwgYmUgZmxvYXQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoZ2V0RmxvYXQodmFsdWUpICogZ2V0RmxvYXQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBGbG9hdC5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpICogZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCB3aWxsIHJlc3VsdCBpbiBhbiBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpICogZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9YT1JfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQml0VHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fWE9SKTsKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1hPUik7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSBeIGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgaXMgaW50LiAoZXZlbiB0d28gc2hvcnRzIHRvZ2V0aGVyIHByb2R1Y2UgYW4gaW50KS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgXiBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfSAKLQkJCQkKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKHZhbHVlLCB2YWx1ZVR5cGUpOwotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUodmFsdWUsIHZhbHVlVHlwZSk7CS8vIFB1c2ggdGhlIHJlc3VsdCBiYWNrIG9uIHRoZSBzdGFjay4KLQkKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCQkJCi0JfQotCi0JLyoqCi0JICogU3RhcnQgaWdub3JpbmcgcmVzdCBvZiB0aGUgY3VycmVudCBpbmZpeCBleHByZXNzaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgdm9pZCBzdGFydEluZml4SWdub3JlKCkgewotCQlpZ25vcmVFeHByZXNzaW9uID0gSU5GSVhfSUdOT1JFOwotCQlpbmZpeElnbm9yZU5lc3RDb3VudCA9IGluZml4TmVzdGluZzsJLy8gSWdub3JlIHVudGlsIHdlIGdldCBiYWNrIHRvIHRoZSBjdXJyZW50IG5lc3RpbmcuCi0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgaW50IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciBiZWFuIHBhc3NlZCBpbiAobXVzdCBiZSBlaXRoZXIgYSA8Y29kZT5OdW1iZXIvY29kZT4gb3IgPGNvZGU+Q2hhcmFjdGVyPC9jb2RlPi4KLQkgKiBBbnl0aGluZyBlbHNlIHdpbGwgY2F1c2UgYSBjbGFzcyBjYXN0IGVycm9yLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciBleHByZXNzaW9uIHByb2Nlc3NlciB0byBnZXQgdGhlIGludCB2YWx1ZSBvZiB0aGUgb2JqZWN0LiBTaW5jZSBpdCBpcyBhIGhlbHBlciBtZXRob2QgaXQgZG9lc24ndAotCSAqIGNoZWNrIG5vciBwcm9jZXNzIHRoZSBleGNlcHRpb24uIEl0IHRocm93cyBpdC4gQ2FsbGVycyBtdXN0IGhhbmRsZSBpdCBhcyB0aGV5IHNlZSBmaXQuCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuIHRoZSBpbnQgdmFsdWUgb2YgdGhlIG51bWJlci9jaGFyYWN0ZXIKLQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0SW50KE9iamVjdCBiZWFuKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIChiZWFuIGluc3RhbmNlb2YgTnVtYmVyKSA/ICgoTnVtYmVyKSBiZWFuKS5pbnRWYWx1ZSgpIDogKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgZmxvYXQgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIGJlYW4gcGFzc2VkIGluIChtdXN0IGJlIGVpdGhlciBhIDxjb2RlPk51bWJlci9jb2RlPiBvciA8Y29kZT5DaGFyYWN0ZXI8L2NvZGU+LgotCSAqIEFueXRoaW5nIGVsc2Ugd2lsbCBjYXVzZSBhIGNsYXNzIGNhc3QgZXJyb3IuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2VyIHRvIGdldCB0aGUgZmxvYXQgdmFsdWUgb2YgdGhlIG9iamVjdC4gU2luY2UgaXQgaXMgYSBoZWxwZXIgbWV0aG9kIGl0IGRvZXNuJ3QKLQkgKiBjaGVjayBub3IgcHJvY2VzcyB0aGUgZXhjZXB0aW9uLiBJdCB0aHJvd3MgaXQuIENhbGxlcnMgbXVzdCBoYW5kbGUgaXQgYXMgdGhleSBzZWUgZml0LgotCSAqIEBwYXJhbSBiZWFuIAotCSAqIEByZXR1cm4gZmxvYXQgdmFsdWUgb2YgdGhlIE51bWJlci9jaGFyYWN0ZXIKLQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBmbG9hdCBnZXRGbG9hdChPYmplY3QgYmVhbikgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoYmVhbiBpbnN0YW5jZW9mIE51bWJlcikgPyAoKE51bWJlcikgYmVhbikuZmxvYXRWYWx1ZSgpIDogKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCBkb3VibGUgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIGJlYW4gcGFzc2VkIGluIChtdXN0IGJlIGVpdGhlciBhIDxjb2RlPk51bWJlci9jb2RlPiBvciA8Y29kZT5DaGFyYWN0ZXI8L2NvZGU+LgotCSAqIEFueXRoaW5nIGVsc2Ugd2lsbCBjYXVzZSBhIGNsYXNzIGNhc3QgZXJyb3IuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2VyIHRvIGdldCB0aGUgZmxvYXQgdmFsdWUgb2YgdGhlIG9iamVjdC4gU2luY2UgaXQgaXMgYSBoZWxwZXIgbWV0aG9kIGl0IGRvZXNuJ3QKLQkgKiBjaGVjayBub3IgcHJvY2VzcyB0aGUgZXhjZXB0aW9uLiBJdCB0aHJvd3MgaXQuIENhbGxlcnMgbXVzdCBoYW5kbGUgaXQgYXMgdGhleSBzZWUgZml0LgotCSAqIAotCSAqIEBwYXJhbSBiZWFuCi0JICogQHJldHVybiBkb3VibGUgdmFsdWUgb2YgdGhlIE51bWJlci9DaGFyYWN0ZXIuCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgZG91YmxlIGdldERvdWJsZShPYmplY3QgYmVhbikgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoYmVhbiBpbnN0YW5jZW9mIE51bWJlcikgPyAoKE51bWJlcikgYmVhbikuZG91YmxlVmFsdWUoKSA6ICgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGxvbmcgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIGJlYW4gcGFzc2VkIGluIChtdXN0IGJlIGVpdGhlciBhIDxjb2RlPk51bWJlci9jb2RlPiBvciA8Y29kZT5DaGFyYWN0ZXI8L2NvZGU+LgotCSAqIEFueXRoaW5nIGVsc2Ugd2lsbCBjYXVzZSBhIGNsYXNzIGNhc3QgZXJyb3IuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2VyIHRvIGdldCB0aGUgZmxvYXQgdmFsdWUgb2YgdGhlIG9iamVjdC4gU2luY2UgaXQgaXMgYSBoZWxwZXIgbWV0aG9kIGl0IGRvZXNuJ3QKLQkgKiBjaGVjayBub3IgcHJvY2VzcyB0aGUgZXhjZXB0aW9uLiBJdCB0aHJvd3MgaXQuIENhbGxlcnMgbXVzdCBoYW5kbGUgaXQgYXMgdGhleSBzZWUgZml0LgotCSAqIAotCSAqIEBwYXJhbSBiZWFuCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGxvbmcgZ2V0TG9uZyhPYmplY3QgYmVhbikgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoYmVhbiBpbnN0YW5jZW9mIE51bWJlcikgPyAoKE51bWJlcikgYmVhbikubG9uZ1ZhbHVlKCkgOiAoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0aHJvd0ludmFsaWRJbmZpeChJbmZpeE9wZXJhdG9yIG9wZXJhdG9yLCBPYmplY3QgdmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLkludmFsaWRPcGVyYW5kT2ZPcGVyYXRvcl9FWENfIiksIG5ldyBPYmplY3RbXSB7dmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsLCBvcGVyYXRvci50b1N0cmluZygpfSkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgdm9pZCB0ZXN0VmFsaWRCaXRUeXBlKENsYXNzIHR5cGUsIEluZml4T3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJaWYgKCF0eXBlLmlzUHJpbWl0aXZlKCkgfHwgdHlwZSA9PSBCb29sZWFuLlRZUEUgfHwgdHlwZSA9PSBEb3VibGUuVFlQRXx8IHR5cGUgPT0gRmxvYXQuVFlQRSkKLQkJCXRocm93SW52YWxpZEluZml4KG9wZXJhdG9yLCB0eXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKENsYXNzIHR5cGUsIEluZml4T3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJaWYgKCF0eXBlLmlzUHJpbWl0aXZlKCkgfHwgdHlwZSA9PSBCb29sZWFuLlRZUEUpCi0JCQl0aHJvd0ludmFsaWRJbmZpeChvcGVyYXRvciwgdHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RWYWxpZFBsdXNUeXBlKENsYXNzIGxlZnQsIENsYXNzIHJpZ2h0KSB7Ci0JCS8vIFBsdXMgaXMgc3BlY2lhbCBpbiB0aGF0IHN0cmluZyBvYmplY3RzIGFyZSBhbHNvIHZhbGlkLgotCQlpZiAobGVmdCA9PSBTdHJpbmcuY2xhc3MgfHwgcmlnaHQgPT0gU3RyaW5nLmNsYXNzKQotCQkJcmV0dXJuOwkvLyBBcyBsb25nIGFzIG9uZSBzaWRlIGlzIHN0cmluZy4gQW55dGhpbmcgaXMgdmFsaWQuCi0JCS8vIElmIG5laXRoZXIgaXMgc3RyaW5nLCB0aGVuIHN0YW5kYXJkIGFyaXRobWV0aWMgdGVzdC4KLQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUobGVmdCwgSW5maXhPcGVyYXRvci5JTl9QTFVTKTsKLQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUocmlnaHQsIEluZml4T3BlcmF0b3IuSU5fUExVUyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhcHBlbmRUb0J1ZmZlcihTdHJpbmdCdWZmZXIgc2IsIE9iamVjdCB2YWx1ZSwgQ2xhc3MgdmFsdWVUeXBlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJc2IuYXBwZW5kKChPYmplY3QpbnVsbCk7Ci0JCWVsc2UgaWYgKHZhbHVlVHlwZSA9PSBTdHJpbmcuY2xhc3MpCi0JCQlzYi5hcHBlbmQoKFN0cmluZykgdmFsdWUpOwotCQllbHNlIGlmICh2YWx1ZVR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJc3dpdGNoIChnZXRFbnVtRm9yUHJpbWl0aXZlKHZhbHVlVHlwZSkpIHsKLQkJCQljYXNlIEJPT0xFQU46Ci0JCQkJCXNiLmFwcGVuZCgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQllURToKLQkJCQkJc2IuYXBwZW5kKCgoTnVtYmVyKSB2YWx1ZSkuYnl0ZVZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENIQVI6Ci0JCQkJCXNiLmFwcGVuZCgoKENoYXJhY3RlcikgdmFsdWUpLmNoYXJWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBET1VCTEU6Ci0JCQkJCXNiLmFwcGVuZCgoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEZMT0FUOgotCQkJCQlzYi5hcHBlbmQoKChOdW1iZXIpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElOVDoKLQkJCQkJc2IuYXBwZW5kKCgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTE9ORzoKLQkJCQkJc2IuYXBwZW5kKCgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNIT1JUOgotCQkJCQlzYi5hcHBlbmQoKChOdW1iZXIpIHZhbHVlKS5zaG9ydFZhbHVlKCkpOwotCQkJCQlicmVhazsJCQotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gSnVzdCBhbiBvYmplY3QuCi0JCQlzYi5hcHBlbmQodmFsdWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggdGhlIGFycmF5IGFjY2VzcyBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleENvdW50IE51bWJlciBvZiBkaW1lbnNpb25zIGJlaW5nIGFjY2Vzc2VkCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEFycmF5QWNjZXNzKGludCBpbmRleENvdW50KSB7Ci0JCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJCi0JCWlmICh0cmFjZU9uKSB7Ci0JCQlwcmludFRyYWNlKCJBcnJheSBBY2Nlc3NbIitpbmRleENvdW50KyddJywgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkJCQotCQkJdHJ5IHsKLQkJCQkvLyBXZSBuZWVkIHRvIHBvcCBvZmYgdGhlIGFyZ3MuIFRoZSB0b3Btb3N0IHdpbGwgYmUgdGhlIHJpZ2h0bW9zdCBpbmRleCwgYW5kIHRoZSBib3R0b20gbW9zdCB3aWxsIGJlIHRoZSBhcnJheSBpdHNlbGYuCi0JCQkJaW50W10gYXJndW1lbnRzID0gbmV3IGludFtpbmRleENvdW50XTsKLQkJCQkvLyBGaWxsIHRoZSBhcmcgYXJyYXkgaW4gcmV2ZXJzZSBvcmRlci4KLQkJCQlmb3IoaW50IGk9aW5kZXhDb3VudC0xOyBpID49IDA7IGktLSkgewotCQkJCQlPYmplY3QgaW5kZXggPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJCUNsYXNzIGluZGV4VHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQkJaWYgKGluZGV4VHlwZS5pc1ByaW1pdGl2ZSgpICYmIChpbmRleFR5cGUgPT0gSW50ZWdlci5UWVBFIHx8IGluZGV4VHlwZSA9PSBTaG9ydC5UWVBFIHx8IGluZGV4VHlwZSA9PSBDaGFyYWN0ZXIuVFlQRSB8fCBpbmRleFR5cGUgPT0gQnl0ZS5UWVBFKSkgewotCQkJCQkJYXJndW1lbnRzW2ldID0gZ2V0SW50KGluZGV4KTsKLQkJCQkJfSBlbHNlCi0JCQkJCQl0aHJvd0NsYXNzQ2FzdChJbnRlZ2VyLlRZUEUsIGluZGV4KTsKLQkJCQl9Ci0JCQkJCi0JCQkJT2JqZWN0IGFycmF5ID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCUNsYXNzIGFycmF5VHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQlpZiAoYXJyYXlUeXBlLmlzQXJyYXkoKSkgewotCQkJCQkvLyBGaXJzdCBmaWd1cmUgb3V0IGhvdyBtYW55IGRpbWVuc2lvbnMgYXJlIGF2YWlsYWJsZS4gU3RvcCB3aGVuIHdlIGhpdCBpbmRleGNvdW50IGJlY2F1c2Ugd2Ugd29uJ3QgYmUgZ29pbmcgZnVydGhlci4KLQkJCQkJaW50IGRpbWNvdW50ID0gMDsKLQkJCQkJQ2xhc3NbXSBjb21wb25lbnRUeXBlcyA9IG5ldyBDbGFzc1tpbmRleENvdW50XTsJLy8gCi0JCQkJCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBhcnJheVR5cGU7Ci0JCQkJCXdoaWxlIChkaW1jb3VudCA8IGluZGV4Q291bnQgJiYgY29tcG9uZW50VHlwZS5pc0FycmF5KCkpIHsKLQkJCQkJCWNvbXBvbmVudFR5cGVzW2RpbWNvdW50KytdID0gY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoZGltY291bnQgPCBpbmRleENvdW50KQotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5YSXNHcmVhdGVyVGhhbk51bWJlck9mRGltZW5zaW9uc0luQXJyYXlfRVhDXyIpLCBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGluZGV4Q291bnQpLCBuZXcgSW50ZWdlcihkaW1jb3VudCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCi0JCQkJCS8vIE5vdyBzdGFydCBhY2Nlc3Npbmcgb25lIGluZGV4IGF0IGEgdGltZSwgc3RvcCBqdXN0IGJlZm9yZSB0aGUgbGFzdCBvbmUuIFRoZSBsYXN0IG9uZSB3aWxsIGJlIHR1cm5lZCBpbnRvIGFuIEFycmF5QWNjZXNzUmVmZXJlbmNlLgotCQkJCQlPYmplY3QgdmFsdWUgPSBhcnJheTsJLy8gRmluYWwgdmFsdWUsIHN0YXJ0IHdpdGggZnVsbCBhcnJheS4KLQkJCQkJaW50IHB1bGxDb3VudCA9IGluZGV4Q291bnQtMTsKLQkJCQkJZm9yKGludCBpPTA7IGk8cHVsbENvdW50OyBpKyspIHsKLQkJCQkJCXZhbHVlID0gQXJyYXkuZ2V0KHZhbHVlLCBhcmd1bWVudHNbaV0pOwotCQkJCQl9Ci0JCQkJCUFycmF5QWNjZXNzUmVmZXJlbmNlIGFycmF5VmFsdWUgPSBBcnJheUFjY2Vzc1JlZmVyZW5jZS5jcmVhdGVBcnJheUFjY2Vzc1JlZmVyZW5jZSh2YWx1ZSwgYXJndW1lbnRzW3B1bGxDb3VudF0pOwotCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCXByaW50T2JqZWN0QW5kVHlwZShhcnJheVZhbHVlLCBjb21wb25lbnRUeXBlc1twdWxsQ291bnRdKTsKLQkJCQkJcHVzaEV4cHJlc3Npb25WYWx1ZShhcnJheVZhbHVlLCBjb21wb25lbnRUeXBlc1twdWxsQ291bnRdKTsKLQkJCQl9ICBlbHNlCi0JCQkJCSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLk5vdEFuQXJyYXlfRVhDXyIpLCBuZXcgT2JqZWN0W10ge2FycmF5VHlwZX0pKTsgLy8kTk9OLU5MUy0xJAotCQotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggdGhlIGFycmF5IGNyZWF0aW9uIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIGFycmF5VHlwZSBUaGUgdHlwZSBvZiB0aGUgYXJyYXkKLQkgKiBAcGFyYW0gZGltZW5zaW9uQ291bnQgVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGJlaW5nIGluaXRpYWxpemVkLiBaZXJvIGlmIHVzaW5nIGFuIGluaXRpYWxpemVyLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hBcnJheUNyZWF0aW9uKENsYXNzIGFycmF5VHlwZSwgaW50IGRpbWVuc2lvbkNvdW50KSB7Ci0JCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJBcnJheSBDcmVhdGlvbjogIithcnJheVR5cGUuZ2V0TmFtZSgpKydbJytkaW1lbnNpb25Db3VudCsnXScsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkJCQotCQkJdHJ5IHsKLQkJCQlpZiAoZGltZW5zaW9uQ291bnQgPT0gMCkgewotCQkJCQkvLyBUaGUgdG9wIHZhbHVlIGlzIHRoZSBhcnJheSBpdHNlbGYsIGZyb20gdGhlIGFycmF5IGluaXRpYWxpemVyLgotCQkJCQkvLyBTbyB3ZSBkbyBub3RoaW5nLgotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFN0cmlwIG9mZiBkaW1lbnNpb25Db3VudHMgZnJvbSB0aGUgYXJyYXkgdHlwZSwgZS5nLgotCQkJCQkvLyBBcnJheVR5cGUgaXMgaW50W11bXVtdCi0JCQkJCS8vIERpbWVuc2lvbmNvdW50IGlzIDIKLQkJCQkJLy8gVGhlbiB3ZSBuZWVkIHRvIHN0cmlwIHR3byBjb21wb25lbnR0eXBlcyBvZmYgb2YgdGhlIGFycmF5IHR5cGUKLQkJCQkJLy8gd2luZCB1cCB3aXRoIGludFtdCi0JCQkJCS8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgQXJyYXkubmV3IHdpbGwgYWRkIHRob3NlIGRpbWVuc2lvbnMgYmFjawotCQkJCQkvLyBvbiB0aHJvdWdoIHRoZSBkaW1lbnNpb24gY291bnQuCi0JCQkJCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBhcnJheVR5cGU7Ci0JCQkJCWZvcihpbnQgaT0wOyBpIDwgZGltZW5zaW9uQ291bnQgJiYgY29tcG9uZW50VHlwZSAhPSBudWxsOyBpKyspCi0JCQkJCQljb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJCWlmIChjb21wb25lbnRUeXBlID09IG51bGwpCi0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLkFycmF5dHlwZUhhc0Zld2VyRGltZW5zaW9uc1RoYW5SZXF1ZXN0ZWRfRVhDXyIpLCBuZXcgT2JqZWN0W10ge2FycmF5VHlwZSwgbmV3IEludGVnZXIoZGltZW5zaW9uQ291bnQpfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCQkvLyBXZSBuZWVkIHRvIHB1bGwgaW4gdGhlIGRpbWVuc2lvbiBpbml0aWFsaXplcnMuIFRoZXkgYXJlIHN0YWNrZWQgaW4gcmV2ZXJzZSBvcmRlci4KLQkJCQkJaW50W10gZGltSW5pdCA9IG5ldyBpbnRbZGltZW5zaW9uQ291bnRdOwotCQkJCQlmb3IoaW50IGk9ZGltZW5zaW9uQ291bnQtMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCU9iamVjdCBpbmRleCA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJCUNsYXNzIGRpbVR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJCQlpZiAoZGltVHlwZS5pc1ByaW1pdGl2ZSgpICYmIChkaW1UeXBlID09IEludGVnZXIuVFlQRSB8fCBkaW1UeXBlID09IFNob3J0LlRZUEUgfHwgZGltVHlwZSA9PSBDaGFyYWN0ZXIuVFlQRSB8fCBkaW1UeXBlID09IEJ5dGUuVFlQRSkpIHsKLQkJCQkJCQlkaW1Jbml0W2ldID0gZ2V0SW50KGluZGV4KTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXRocm93Q2xhc3NDYXN0KEludGVnZXIuVFlQRSwgaW5kZXgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBGaW5hbGx5IGNyZWF0ZSB0aGUgYXJyYXkuCi0JCQkJCU9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudFR5cGUsIGRpbUluaXQpOwotCQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKGFycmF5LCBhcnJheVR5cGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCQkJCi0JfQotCi0JLyoqCi0JICogUHVzaCB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXJyYXlUeXBlIFRoZSBvcmlnaW5hbCB0eXBlIG9mIHRoZSBhcnJheSB0byBjcmVhdGUuCi0JICogQHBhcmFtIHN0cmlwQ291bnQgdGhlIGNvdW50IG9mIGhvdyBtYW55IGRpbWVuc2lvbnMgdG8gc3RyaXAgdG8gZ2V0IHRoZSB0eXBlIG5lZWRlZCBmb3IgdGhpcyBpbml0aWFsaXplci4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbkNvdW50Ci0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEFycmF5SW5pdGlhbGl6ZXIoQ2xhc3MgYXJyYXlUeXBlLCBpbnQgc3RyaXBDb3VudCwgaW50IGV4cHJlc3Npb25Db3VudCkgewotCQlib29sZWFuIGlnbm9yZSA9IChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCQotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIkluaXRpYWxpemUgQXJyYXk6ICIrYXJyYXlUeXBlLmdldE5hbWUoKSsneycrZXhwcmVzc2lvbkNvdW50Kyd9JywgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQotCQkJdHJ5IHsKLQkJCQlpZiAoIWFycmF5VHlwZS5pc0FycmF5KCkpIHsKLQkJCQkJLy8gSXQgaXMgbm90IGFuIGFycmF5IHR5cGUuCi0JCQkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuQ2Fubm90Q2FzdFhUb1lfRVhDXyIpLCBuZXcgT2JqZWN0W10ge2FycmF5VHlwZSwgImFycmF5In0pKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfSAKLQkJCQkvLyBTdHJpcCBvZmYgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHNwZWNpZmllZC4KLQkJCQl3aGlsZShzdHJpcENvdW50LS0+MCkgewotCQkJCQlhcnJheVR5cGUgPSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCX0KLQkJCQlPYmplY3RbXSBkaW1WYWx1ZXMgPSBudWxsOwotCQkJCWlmIChleHByZXNzaW9uQ291bnQgPiAwKSB7Ci0JCQkJCS8vIFdlIG5lZWQgdG8gcHVsbCBpbiB0aGUgaW5pdGlhbGl6ZXJzLiBUaGV5IGFyZSBzdGFja2VkIGluIHJldmVyc2Ugb3JkZXIuCi0JCQkJCWRpbVZhbHVlcyA9IG5ldyBPYmplY3RbZXhwcmVzc2lvbkNvdW50XTsKLQkJCQkJZm9yIChpbnQgaSA9IGV4cHJlc3Npb25Db3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCQlPYmplY3QgZGltVmFsdWUgPSBkaW1WYWx1ZXNbaV0gPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJCQlDbGFzcyBkaW1UeXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCQkJaWYgKGFycmF5VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJCQkJaWYgKGRpbVZhbHVlID09IG51bGwgfHwgIWRpbVR5cGUuaXNQcmltaXRpdmUoKSkKLQkJCQkJCQkJdGhyb3dDbGFzc0Nhc3QoYXJyYXlUeXBlLCBkaW1UeXBlKTsKLQkJCQkJCQkvLyBBIGxpdHRsZSB0cmlja2llci4gQ2FuIGFzc2lnbiBzaG9ydCB0byBhbiBpbnQsIGJ1dCBjYW4ndCBhc3NpZ24gbG9uZyB0byBhbiBpbnQuIFdpZGVuaW5nIGlzIHBlcm1pdHRlZC4KLQkJCQkJCQlpZiAoYXJyYXlUeXBlICE9IGRpbVR5cGUpIHsKLQkJCQkJCQkJaW50IGNvbXBFbnVtID0gZ2V0RW51bUZvclByaW1pdGl2ZShhcnJheVR5cGUpOwotCQkJCQkJCQlpbnQgZGltRW51bSA9IGdldEVudW1Gb3JQcmltaXRpdmUoZGltVHlwZSk7Ci0JCQkJCQkJCWlmIChjb21wRW51bSA9PSBCT09MRUFOIHx8IGRpbUVudW0gPT0gQk9PTEVBTikKLQkJCQkJCQkJCXRocm93Q2xhc3NDYXN0KGFycmF5VHlwZSwgZGltVHlwZSk7Ci0JCQkJCQkJCWludCBkaW1WYWx1ZUFzSW50ID0gZ2V0SW50KGRpbVZhbHVlKTsKLQkJCQkJCQkJc3dpdGNoIChjb21wRW51bSkgewotCQkJCQkJCQkJY2FzZSBCWVRFIDoKLQkJCQkJCQkJCQkvLyBDYW4gYWNjZXB0IGJ5dGUsIHNob3J0LCBjaGFyLCBvciBpbnQgYXMgbG9uZyBhcyB2YWx1ZSBpcyA8PSBieXRlIG1heC4gQ2FuJ3QgYWNjZXB0IGxvbmcsIGRvdWJsZSwgZmxvYXQgYXQgYWxsLgotCQkJCQkJCQkJCS8vIE5vdGU6IFRoaXMgaXNuJ3QgYWN0dWFsbHkgdHJ1ZS4gVGhlIG1heC9taW4gdGVzdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSB2YWx1ZSBpcyBhIGxpdGVyYWwsIG5vdCBhbiBleHByZXNzaW9uLAotCQkJCQkJCQkJCS8vIGhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQgaW4gdGltZSB3ZSBubyBsb25nZXIga25vdyB0aGlzLiBTbyB3ZSB3aWxsIHNpbXBseSBhbGxvdyBpdC4KLQkJCQkJCQkJCQlpZiAoZGltRW51bSA+IElOVCB8fCBkaW1WYWx1ZUFzSW50ID4gQnl0ZS5NQVhfVkFMVUUgfHwgZGltVmFsdWVBc0ludCA8IEJ5dGUuTUlOX1ZBTFVFKQotCQkJCQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChhcnJheVR5cGUsIGRpbVR5cGUpOwotCQkJCQkJCQkJCS8vIEJ1dCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIGFycmF5LnNldCB0byB3b3JrLgkJCQkJCQkJCQotCQkJCQkJCQkJCWRpbVZhbHVlc1tpXSA9IG5ldyBCeXRlKChieXRlKWRpbVZhbHVlQXNJbnQpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBTSE9SVCA6CQkJCQkJCQkKLQkJCQkJCQkJCQkvLyBDYW4gYWNjZXB0IGJ5dGUsIHNob3J0LCBjaGFyLCBvciBpbnQgYXMgbG9uZyBhcyB2YWx1ZSBpcyA8PSBieXRlIG1heC4gQ2FuJ3QgYWNjZXB0IGxvbmcsIGRvdWJsZSwgZmxvYXQgYXQgYWxsLgotCQkJCQkJCQkJCS8vIE5vdGU6IFRoaXMgaXNuJ3QgYWN0dWFsbHkgdHJ1ZS4gVGhlIG1heC9taW4gdGVzdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSB2YWx1ZSBpcyBhIGxpdGVyYWwsIG5vdCBhbiBleHByZXNzaW9uLAotCQkJCQkJCQkJCS8vIGhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQgaW4gdGltZSB3ZSBubyBsb25nZXIga25vdyB0aGlzLiBTbyB3ZSB3aWxsIHNpbXBseSBhbGxvdyBpdC4KLQkJCQkJCQkJCQlpZiAoZGltRW51bSA+IElOVCB8fCBkaW1WYWx1ZUFzSW50ID4gU2hvcnQuTUFYX1ZBTFVFIHx8IGRpbVZhbHVlQXNJbnQgPCBTaG9ydC5NSU5fVkFMVUUpCi0JCQkJCQkJCQkJCXRocm93Q2xhc3NDYXN0KGFycmF5VHlwZSwgZGltVHlwZSk7Ci0JCQkJCQkJCQkJLy8gQnV0IG5lZWQgdG8gYmUgY2hhbmdlZCB0byBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgYXJyYXkuc2V0IHRvIHdvcmsuCQkJCQkJCQkJCi0JCQkJCQkJCQkJZGltVmFsdWVzW2ldID0gbmV3IFNob3J0KChzaG9ydClkaW1WYWx1ZUFzSW50KTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgQ0hBUiA6Ci0JCQkJCQkJCQkJLy8gQ2FuIGFjY2VwdCBieXRlLCBzaG9ydCwgY2hhciwgb3IgaW50IGFzIGxvbmcgYXMgdmFsdWUgaXMgPD0gYnl0ZSBtYXguIENhbid0IGFjY2VwdCBsb25nLCBkb3VibGUsIGZsb2F0IGF0IGFsbC4KLQkJCQkJCQkJCQkvLyBOb3RlOiBUaGlzIGlzbid0IGFjdHVhbGx5IHRydWUuIFRoZSBtYXgvbWluIHRlc3QgaXMgb25seSB2YWxpZCBpZiB0aGUgdmFsdWUgaXMgYSBsaXRlcmFsLCBub3QgYW4gZXhwcmVzc2lvbiwKLQkJCQkJCQkJCQkvLyBob3dldmVyLCBhdCB0aGlzIHBvaW50IGluIHRpbWUgd2Ugbm8gbG9uZ2VyIGtub3cgdGhpcy4gU28gd2Ugd2lsbCBzaW1wbHkgYWxsb3cgaXQuCi0JCQkJCQkJCQkJaWYgKGRpbUVudW0gPiBJTlQgfHwgZGltVmFsdWVBc0ludCA+IENoYXJhY3Rlci5NQVhfVkFMVUUgfHwgZGltVmFsdWVBc0ludCA8IENoYXJhY3Rlci5NSU5fVkFMVUUpCi0JCQkJCQkJCQkJCXRocm93Q2xhc3NDYXN0KGFycmF5VHlwZSwgZGltVHlwZSk7Ci0JCQkJCQkJCQkJLy8gQnV0IG5lZWQgdG8gYmUgY2hhbmdlZCB0byBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgYXJyYXkuc2V0IHRvIHdvcmsuCQkJCQkJCQkJCi0JCQkJCQkJCQkJZGltVmFsdWVzW2ldID0gbmV3IENoYXJhY3RlcigoY2hhcilkaW1WYWx1ZUFzSW50KTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgSU5UIDoKLQkJCQkJCQkJCQkvLyBDYW4gYWNjZXB0IGJ5dGUsIHNob3J0LCBjaGFyLCBvciBpbnQuIENhbid0IGFjY2VwdCBsb25nLCBkb3VibGUsIGZsb2F0IGF0IGFsbC4KLQkJCQkJCQkJCQlpZiAoZGltRW51bSA+IElOVCkKLQkJCQkJCQkJCQkJdGhyb3dDbGFzc0Nhc3QoYXJyYXlUeXBlLCBkaW1UeXBlKTsKLQkJCQkJCQkJCQkvLyBCdXQgbmVlZCB0byBiZSBjaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBhcnJheS5zZXQgdG8gd29yay4JCQkJCQkJCQkKLQkJCQkJCQkJCQlkaW1WYWx1ZXNbaV0gPSBuZXcgSW50ZWdlcihkaW1WYWx1ZUFzSW50KTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgTE9ORyA6Ci0JCQkJCQkJCQkJLy8gQ2FuIGFjY2VwdCBieXRlLCBzaG9ydCwgY2hhciwgaW50LCBvciBsb25nLiBDYW4ndCBhY2NlcHQgZG91YmxlLCBmbG9hdCBhdCBhbGwuCi0JCQkJCQkJCQkJaWYgKGRpbUVudW0gPiBMT05HKQotCQkJCQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChhcnJheVR5cGUsIGRpbVR5cGUpOwotCQkJCQkJCQkJCS8vIEJ1dCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIGFycmF5LnNldCB0byB3b3JrLgkJCQkJCQkJCQotCQkJCQkJCQkJCWRpbVZhbHVlc1tpXSA9IG5ldyBMb25nKGdldExvbmcoZGltVmFsdWUpKTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgRkxPQVQgOgotCQkJCQkJCQkJCS8vIENhbiBhY2NlcHQgYnl0ZSwgc2hvcnQsIGNoYXIsIGludCwgbG9uZywgb3IgZmxvYXQuIENhbid0IGFjY2VwdCBkb3VibGUgYXQgYWxsLgotCQkJCQkJCQkJCWlmIChkaW1FbnVtID4gRkxPQVQpCi0JCQkJCQkJCQkJCXRocm93Q2xhc3NDYXN0KGFycmF5VHlwZSwgZGltVHlwZSk7Ci0JCQkJCQkJCQkJLy8gQnV0IG5lZWQgdG8gYmUgY2hhbmdlZCB0byBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgYXJyYXkuc2V0IHRvIHdvcmsuCQkJCQkJCQkJCi0JCQkJCQkJCQkJZGltVmFsdWVzW2ldID0gbmV3IEZsb2F0KGdldEZsb2F0KGRpbVZhbHVlKSk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIERPVUJMRSA6Ci0JCQkJCQkJCQkJLy8gQnV0IG5lZWQgdG8gYmUgY2hhbmdlZCB0byBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgYXJyYXkuc2V0IHRvIHdvcmsuCQkJCQkJCQkJCi0JCQkJCQkJCQkJZGltVmFsdWVzW2ldID0gbmV3IERvdWJsZShnZXREb3VibGUoZGltVmFsdWUpKTsKLQkJCQkJCQkJCQlicmVhazsKLQkKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkvLyBDb21wYXRpYmxlLCBzbyBvay4KLQkJCQkJCX0gZWxzZSBpZiAoZGltVHlwZSAhPSBNZXRob2RIZWxwZXIuTlVMTF9UWVBFICYmICFhcnJheVR5cGUuaXNBc3NpZ25hYmxlRnJvbShkaW1UeXBlKSkgewotCQkJCQkJCS8vIElmIGl0IGlzIE5VTExfVFlQRSwgdGhlbiB0aGlzIGlzIGEgcHVzaGVkIG51bGwuIFRoaXMgaXMgYWx3YXlzIGFzc2lnbmFibGUgdG8gYSBub24tcHJpbWl0aXZlLgotCQkJCQkJCS8vIFNvIHdlIGRvbid0IGVudGVyIGhlcmUgaW4gdGhhdCBjYXNlLiBIb3dldmVyLCBhIG51bGwgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSBzb21lIGV4cHJlc3Npb24KLQkJCQkJCQkvLyB3b24ndCBoYXZlIGEgTlVMTF9UWVBFLCBpdCB3aWxsIGluc3RlYWQgaGF2ZSB0aGUgZXhwZWN0ZWQgcmV0dXJuIHR5cGUuIFRoYXQgbXVzdCBiZSB1c2VkCi0JCQkJCQkJLy8gaW4gdGhlIGFzc2lnbm1lbnQgaW5zdGVhZC4gVGhhdCBpcyBiZWNhdXNlIGluIGphdmEgaXQgdXNlcyB0aGUgZXhwZWN0ZWQgdHlwZSB0byBkZXRlcm1pbmUKLQkJCQkJCQkvLyBjb21wYXRpYmlsaXR5LCBub3QgdGhlIGFjdHVhbCB0eXBlLgotCQkJCQkJCXRocm93Q2xhc3NDYXN0KGFycmF5VHlwZSwgZGltVHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJCQotCQkJCS8vIE5vdyB3ZSBmaW5hbGx5IGNyZWF0ZSB0aGUgYXJyYXkuCi0JCQkJT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoYXJyYXlUeXBlLCBuZXcgaW50W10ge2V4cHJlc3Npb25Db3VudH0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwcmVzc2lvbkNvdW50OyBpKyspIHsKLQkJCQkJQXJyYXkuc2V0KGFycmF5LCBpLCBkaW1WYWx1ZXNbaV0pOwotCQkJCX0KLQkJCQkKLQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKGFycmF5LCBhcnJheS5nZXRDbGFzcygpKTsJLy8gQWRqdXN0IHRvIHRydWUgYXJyYXkgdHlwZSwgbm90IHRoZSBpbmNvbWluZyB0eXBlICh3aGljaCBpcyBvbmUgZGltZW5zaW9uIHRvbyBzbWFsbCkuCi0JCi0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQkJCQotCX0KLQotCS8qKgotCSAqIFB1c2ggdGhlIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mCi0JICogQHBhcmFtIGFyZ3VtZW50Q291bnQgVGhlIG51bWJlciBvZiBhcmd1bWVudHMgKHdoaWNoIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrKS4JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb24oQ2xhc3MgdHlwZSwgaW50IGFyZ3VtZW50Q291bnQpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQkKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJDcmVhdGUgQ2xhc3M6ICIrdHlwZSsiICgiLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQkJCQkJCi0JCQl0cnkgewotCQkJCS8vIFdlIG5lZWQgdG8gcHVsbCBpbiB0aGUgYXJndW1lbnRzLiBUaGV5IGFyZSBzdGFja2VkIGluIHJldmVyc2Ugb3JkZXIuCi0JCQkJT2JqZWN0IHZhbHVlID0gbnVsbDsJLy8gVGhlIG5ldyBpbnN0YW5jZS4KLQkJCQlpZiAoYXJndW1lbnRDb3VudCA+IDApIHsKLQkJCQkJT2JqZWN0W10gIGFyZ3MgPSBuZXcgT2JqZWN0W2FyZ3VtZW50Q291bnRdOwotCQkJCQlDbGFzc1tdIGFyZ1R5cGVzID0gbmV3IENsYXNzW2FyZ3VtZW50Q291bnRdOwotCQkJCQlmb3IgKGludCBpID0gYXJndW1lbnRDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCQlhcmdzW2ldID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQkJYXJnVHlwZXNbaV0gPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yLgotCQkJCQlDb25zdHJ1Y3RvciBjdG9yOwotCQkJCQljdG9yID0gTWV0aG9kSGVscGVyLmZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3IodHlwZSwgYXJnVHlwZXMpOwotCQkJCQlpZiAodHJhY2VPbikgewotCQkJCQkJU3lzdGVtLm91dC5wcmludChjdG9yKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoJyknKTsKLQkJCQkJfQotCQkJCQl2YWx1ZSA9IGN0b3IubmV3SW5zdGFuY2UoYXJncyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gTm8gYXJncywganVzdCBkbyBkZWZhdWx0IGN0b3IuCi0JCQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJEZWZhdWx0IGN0b3IpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl2YWx1ZSA9IHR5cGUubmV3SW5zdGFuY2UoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZSh2YWx1ZSwgdHlwZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChFcnJvciBlKSB7Ci0JCQkJaWYgKGUuZ2V0Q2xhc3MoKSA9PSBFcnJvci5jbGFzcykgewotCQkJCQkvLyBJZiBleGFjdGx5IEVycm9yLmNsYXNzLCB0aGVuIHByb2Nlc3MgaXQuIFRoaXMgaXMgaG9wZWZ1bGx5IGp1c3QgYSAidW5yZXNvbHZlZCBjb21waWxhdGlvbiBlcnJvciIuCi0JCQkJCXByb2Nlc3NFeGNlcHRpb24obmV3IFVucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yKGUpKTsKLQkJCQl9IGVsc2UKLQkJCQkJdGhyb3cgZTsJLy8gQWxsIHN1YmNsYXNzZXMgd2UgdGhyb3cgb24gb3V0LgotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gZmllbGQgU3RyaW5nIGZvciBmaWVsZG5hbWUsIG9yIGEgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuCi0JICogQHBhcmFtIGZpZWxkSXNTdHJpbmcgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmllbGQgaXMgYSBzdHJpbmcgbmFtZSwgYW5kIG5vdCBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLgotCSAqIEBwYXJhbSBoYXNSZWNlaXZlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hGaWVsZEFjY2VzcyhPYmplY3QgZmllbGQsIGJvb2xlYW4gZmllbGRJc1N0cmluZywgYm9vbGVhbiBoYXNSZWNlaXZlcikgewotCQl0cnkgewotCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKSB7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50VHJhY2UoIkZpZWxkIEFjY2VzcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2UoIkZpZWxkIEFjY2VzczogIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCS8vIEdldCB0aGUgcmVjZWl2ZXIgb2ZmIG9mIHRoZSBzdGFjay4KLQkJCQlPYmplY3QgcmVjZWl2ZXIgPSBudWxsOwotCQkJCUNsYXNzIHJlY2VpdmVyVHlwZSA9IG51bGw7Ci0JCQkJaWYgKGhhc1JlY2VpdmVyKSB7Ci0JCQkJCXJlY2VpdmVyID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQlyZWNlaXZlclR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIEZpbmQgdGhlIGZpZWxkLgotCQkJCUZpZWxkIHJlZmxlY3RGaWVsZCA9IGZpZWxkSXNTdHJpbmcgPyByZWNlaXZlclR5cGUuZ2V0RmllbGQoKFN0cmluZykgZmllbGQpIDogKEZpZWxkKSBmaWVsZDsKLQkJCQkvLyBBY2Nlc3MgdGhlIGZpZWxkLgotCQkJCU9iamVjdCB2YWx1ZSA9IEZpZWxkQWNjZXNzUmVmZXJlbmNlLmNyZWF0ZUZpZWxkQWNjZXNzUmVmZXJlbmNlKHJlZmxlY3RGaWVsZCwgcmVjZWl2ZXIpOwotCQkJCUNsYXNzIHZhbHVlVHlwZSA9IHJlZmxlY3RGaWVsZC5nZXRUeXBlKCk7Ci0JCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludCgiRmllbGQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChmaWVsZElzU3RyaW5nKQotCQkJCQkJU3lzdGVtLm91dC5wcmludCgiKGxvb2tlZCB1cCkgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludChyZWZsZWN0RmllbGQpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50KCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKHZhbHVlLCB2YWx1ZVR5cGUpOwotCQkJCX0KLQkJCQkJCi0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZSh2YWx1ZSwgdmFsdWVUeXBlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiBAcGFyYW0gbWV0aG9kSXNTdHJpbmcgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbWV0aG9kIGlzIGEgc3RyaW5nIChzbyBzdHJpbmcgbmFtZSkgb3IgZWxzZSBpdCBpcyBhIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC4KLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIKLQkgKiBAcGFyYW0gYXJnQ291bnQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoTWV0aG9kSW52b2NhdGlvbihPYmplY3QgbWV0aG9kLCBib29sZWFuIG1ldGhvZElzU3RyaW5nLCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJnQ291bnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlKCJJbnZva2UiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZSgiSW52b2tlOiAiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJTWV0aG9kIHJlZmxlY3RNZXRob2QgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBXZSBuZWVkIHRvIHB1bGwgaW4gdGhlIGFyZ3VtZW50cy4gVGhleSBhcmUgc3RhY2tlZCBpbiByZXZlcnNlIG9yZGVyLgotCQkJCU9iamVjdFtdICBhcmdzID0gbmV3IE9iamVjdFthcmdDb3VudF07Ci0JCQkJQ2xhc3NbXSBhcmdUeXBlcyA9IG5ldyBDbGFzc1thcmdDb3VudF07Ci0JCQkJZm9yIChpbnQgaSA9IGFyZ0NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJYXJnc1tpXSA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJYXJnVHlwZXNbaV0gPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIE5vdyBnZXQgcmVjZWl2ZXIKLQkJCQlPYmplY3QgcmVjZWl2ZXIgPSBudWxsOwotCQkJCUNsYXNzIHJlY2VpdmVyVHlwZSA9IG51bGw7Ci0JCQkJaWYgKGhhc1JlY2VpdmVyKSB7Ci0JCQkJCXJlY2VpdmVyID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQlyZWNlaXZlclR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZC4gSWYgaXQgaXMgYSBzdHJpbmcgdGhlbiB0aGVyZSBtdXN0IGJlIGEgcmVjZWl2ZXIsIG90aGVyd2lzZSBubyB3YXkgdG8ga25vdy4KLQkJCQlpZiAobWV0aG9kSXNTdHJpbmcpIHsKLQkJCQkJcmVmbGVjdE1ldGhvZCA9IE1ldGhvZEhlbHBlci5maW5kQ29tcGF0aWJsZU1ldGhvZChyZWNlaXZlclR5cGUsIChTdHJpbmcpIG1ldGhvZCwgYXJnVHlwZXMpOwotCQkJCX0gZWxzZQotCQkJCQlyZWZsZWN0TWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kOwotCQkJCQotCQkJCWlmICh0cmFjZU9uICYmIHJlZmxlY3RNZXRob2QgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJNZXRob2Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChtZXRob2RJc1N0cmluZykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIihsb29rZWQgdXApICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnQocmVmbGVjdE1ldGhvZCk7CQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCFNb2RpZmllci5pc1N0YXRpYyhyZWZsZWN0TWV0aG9kLmdldE1vZGlmaWVycygpKSAmJiByZWNlaXZlciA9PSBudWxsKQotCQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5vIHJlY2VpdmVyIGZvciBub24tc3RhdGljIG1ldGhvZDogIityZWZsZWN0TWV0aG9kLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IHJlZmxlY3RNZXRob2QuaW52b2tlKHJlY2VpdmVyLCBhcmdzKTsKLQkJCQkKLQkJCQlpZiAodHJhY2VPbikgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgcmV0dXJuczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKHZhbHVlLCByZWZsZWN0TWV0aG9kLmdldFJldHVyblR5cGUoKSk7Ci0JCQkJfQotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUodmFsdWUsIHJlZmxlY3RNZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZml4VXBNZXRob2RFeGNlcHRpb24oZSwgcmVmbGVjdE1ldGhvZCkpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZml4VXBNZXRob2RFeGNlcHRpb24oZSwgcmVmbGVjdE1ldGhvZCkpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihmaXhVcE1ldGhvZEV4Y2VwdGlvbihlLCByZWZsZWN0TWV0aG9kKSk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGZpeFVwTWV0aG9kRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSwgcmVmbGVjdE1ldGhvZCkpOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0JCi0JLyoKLQkgKiBNYW55IG9mIHRoZSBleGNlcHRpb25zIGRvbid0IGFkZCBpbiB3aGF0IG1ldGhvZCBoYWQgdGhlIGVycm9yLCBzbyB3ZQotCSAqIHdpbGwgZG8gdGhhdCBoZXJlLgotCSAqLwotCXByaXZhdGUgVGhyb3dhYmxlIGZpeFVwTWV0aG9kRXhjZXB0aW9uKFRocm93YWJsZSBlLCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybiBlOwotCQl0cnkgewotCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJQ29uc3RydWN0b3IgZVdpdGhTdHJpbmdDdG9yID0gZS5nZXRDbGFzcygpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsKLQkJCVN0cmluZyBuZXdNc2c7Ci0JCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQluZXdNc2cgPSBtZXRob2QudG9TdHJpbmcoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3TXNnID0gbWV0aG9kLnRvU3RyaW5nKCkrIjogXCIiK21zZysnXCInOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlFeGNlcHRpb24gZml4ZWR1cEUgPSAoRXhjZXB0aW9uKSBlV2l0aFN0cmluZ0N0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHtuZXdNc2d9KTsKLQkJCWZpeGVkdXBFLnNldFN0YWNrVHJhY2UoZS5nZXRTdGFja1RyYWNlKCkpOwotCQkJcmV0dXJuIGZpeGVkdXBFOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCXJldHVybiBlOwotCQl9Ci0gIAotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBDT05ESVRJT05BTF9JR05PUkUgPSAiQ09ORElUSU9OQUwgSUdOT1JFIjsJLy8gRmxhZyBmb3IgY29uZGl0aW9uYWwgaW4gaW5nb3JlIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGludCBjb25kaXRpb25hbE5lc3RpbmcgPSAwOwkvLyBOZXN0aW5nIG9mIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zLgotCXByaXZhdGUgaW50IGNvbmRpdGlvbmFsSWdub3JlTmVzdENvdW50ID0gMDsJLy8gV2hlbiBpZ25vcmluZyBjb25kaXRpb25hbCBleHByZXNzaW9ucywgaWdub3JlIHVudGlsIHRoaXMgbmVzdCBjb3VudC4KLQlwcml2YXRlIGJvb2xlYW4gc2tpcFRydWVQYXJ0OwotCi0JLyoqCi0JICogUHVzaCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uIEl0IGNhbiBiZSBhbnkgY2xhdXNlIG9mIHRoZSBjb25kaXRpb25hbCAodGVzdCwgdHJ1ZSwgb3IgZmFsc2UgY2xhdXNlKS4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvblR5cGUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQ29uZGl0aW9uYWwoSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIGV4cHJlc3Npb25UeXBlKSB7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGlnbm9yZSA9IHRydWU7Ci0JCQl0cnkgewotCQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gU2xpZ2h0bHkgZGlmZmVyZW50IGhlcmUgaW4gdGhhdCBpZiBhbiBpZ25vcmluZyBvY2N1cnJlZCB3ZSBzdGlsbCBuZWVkIHRvIHByb2Nlc3MgYXQgbGVhc3QgcGFydCBvZiBpdCBzbyB0aGF0Ci0JCQkJLy8gd2UgY2FuIGdldCB0aGUgZXhwcmVzc2lvbiBncm91cGluZyBjb3JyZWN0LgotCQkJCXN3aXRjaCAoZXhwcmVzc2lvblR5cGUuZ2V0VmFsdWUoKSkgewotCQkJCQljYXNlIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5DT05ESVRJT05BTF9URVNUX1ZBTFVFOgotCQkJCQkJY29uZGl0aW9uYWxOZXN0aW5nKys7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfVFJVRV9WQUxVRToKLQkJCQkJCWlmIChza2lwVHJ1ZVBhcnQgJiYgaWdub3JlRXhwcmVzc2lvbiA9PSBDT05ESVRJT05BTF9JR05PUkUgJiYgY29uZGl0aW9uYWxJZ25vcmVOZXN0Q291bnQgPT0gY29uZGl0aW9uYWxOZXN0aW5nKSB7Ci0JCQkJCQkJLy8gc3RvcCBpZ25vcmluZywgd2UndmUgaWdub3JlZCB0aGUgdHJ1ZSBjb25kaXRpb24gb2YgaW50ZXJlc3QuCi0JCQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCQkJcmV0dXJuOyAvLyBIb3dldmVyLCBsZWF2ZSBiZWNhdXNlIHNpbmNlIHRoaXMgY29uZGl0aW9uIHdhcyBpZ25vcmVkLgotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLkNPTkRJVElPTkFMX0ZBTFNFX1ZBTFVFOgotCQkJCQkJaW50IGN1cnJlbnROZXN0aW5nID0gY29uZGl0aW9uYWxOZXN0aW5nLS07Ci0JCQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiA9PSBDT05ESVRJT05BTF9JR05PUkUgJiYgY29uZGl0aW9uYWxJZ25vcmVOZXN0Q291bnQgPT0gY3VycmVudE5lc3RpbmcpIHsKLQkJCQkJCQkvLyBzdG9wIGlnbm9yaW5nLCB3ZSd2ZSBpZ25vcmVkIHRoZSBmYWxzZSBjb25kaXRpb24gb2YgaW50ZXJlc3QuCi0JCQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCQkJcmV0dXJuOyAvLyBIb3dldmVyLCBsZWF2ZSBiZWNhdXNlIHNpbmNlIHRoaXMgY29uZGl0aW9uIHdhcyBpZ25vcmVkLgotCQkJCQkJfQotCQkJCX0KLQkKLQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlKCJDb25kaXRpb25hbCAiK2V4cHJlc3Npb25UeXBlLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkJCQotCQkJdHJ5IHsKLQkJCQlzd2l0Y2ggKGV4cHJlc3Npb25UeXBlLmdldFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfVEVTVF9WQUxVRToKLQkJCQkJCU9iamVjdCBjb25kaXRpb24gPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJCQlDbGFzcyB0eXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCQkJaWYgKHR5cGUgIT0gQm9vbGVhbi5UWVBFKQotCQkJCQkJCXRocm93Q2xhc3NDYXN0KEJvb2xlYW4uVFlQRSwgY29uZGl0aW9uKTsKLQkJCQkJCWlmICgoKEJvb2xlYW4pIGNvbmRpdGlvbikuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkvLyBDb25kaXRpb24gd2FzIHRydWUuCi0JCQkJCQkJLy8gRG8gbm90aGluZy4gTGV0IHRydWUgY29uZGl0aW9uIGJlIHByb2Nlc3NlZC4KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gQ29uZGl0aW9uIHdhcyBmYWxzZS4KLQkJCQkJCQlza2lwVHJ1ZVBhcnQgPSB0cnVlOwkvLyBUZWxsIHRoZSB0cnVlIGNvbmRpdGlvbiBzaG91bGQgYmUgaWdub3JlZC4KLQkJCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gQ09ORElUSU9OQUxfSUdOT1JFOwotCQkJCQkJCWNvbmRpdGlvbmFsSWdub3JlTmVzdENvdW50ID0gY29uZGl0aW9uYWxOZXN0aW5nOwotCQkJCQkJfQotCQkJCQkJLy8gV2UgZG9uJ3QgcHV0IGFueXRoaW5nIGJhY2sgb24gdGhlIHN0YWNrIGJlY2F1c2UgdGhlIGNvbmRpdGlvbiB0ZXN0IGlzIG5vdCBldmVyIHJldHVybmVkLgotCQkJCQkJLy8gVGhlIGFwcHJvcHJpYXRlIHRydWUgb3IgZmFsc2UgY29uZGl0aW9uIGV2YWx1YXRpb24gd2lsbCBiZSBsZWZ0IG9uIHRoZSBzdGFjay4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5DT05ESVRJT05BTF9UUlVFX1ZBTFVFOgotCQkJCQkJc2tpcFRydWVQYXJ0ID0gZmFsc2U7CS8vIFRlbGwgdGhlIGZhbHNlIGNvbmRpdGlvbiBzaG91bGQgYmUgaWdub3JlZC4KLQkJCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBDT05ESVRJT05BTF9JR05PUkU7Ci0JCQkJCQljb25kaXRpb25hbElnbm9yZU5lc3RDb3VudCA9IGNvbmRpdGlvbmFsTmVzdGluZzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5DT05ESVRJT05BTF9GQUxTRV9WQUxVRToKLQkJCQkJCS8vIFRoZXJlJ3Mgbm90aGluZyB0byBkbywgaWYgaXQgd2FzIGlnbm9yZWQgZHVlIHRvIHRydWUsIHdlIHdvdWxkbid0IG9mIGdvdHRvbiBoZXJlLgotCQkJCQkJLy8gSWYgaXQgd2Fzbid0IGlnbm9yZWQsIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgZmFsc2UgZXhwcmVzc2lvbiBpcyBvbiB0aGUgc3RhY2ssIHdoaWNoIGlzIHdoYXQgaXQgc2hvdWxkIGJlLgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBCTE9DS19JR05PUkUgPSAiQkxPQ0sgSUdOT1JFIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgaW50W10gYmxvY2tzOwkvLyBTdGFjayBvZiBibG9jayBudW1iZXJzIGN1cnJlbnRseSBldmFsdWF0aW5nLgotCXByaXZhdGUgaW50IHRvcEJsb2NrID0gLTE7CS8vIFRvcCBibG9jayBpbmRleC4KLQlwcml2YXRlIGludCBicmVha0Jsb2NrID0gLTE7CS8vIEJsb2NrIG51bWJlciB3ZSBhcmUgYnJlYWtpbmcgdG8uCi0JCi0JLyoqCi0JICogUHVzaCBhIGJlZ2luIGJsb2NrLgotCSAqIEBwYXJhbSBibG9ja051bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hCbG9ja0JlZ2luKGludCBibG9ja051bWJlcikgewotCQlpZiAodHJhY2VPbikgewotCQkJcHJpbnRUcmFjZSgiQmVnaW4gQmxvY2sgIyIrYmxvY2tOdW1iZXIsIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkCi0JCQlpbmRlbnQodHJ1ZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmIChibG9ja3MgPT0gbnVsbCkKLQkJCQlibG9ja3MgPSBuZXcgaW50WzEwXTsKLQkJCWlmICgrK3RvcEJsb2NrID49IGJsb2Nrcy5sZW5ndGgpIHsKLQkJCQlpbnRbXSBuZXdMaXN0ID0gbmV3IGludFtibG9ja3MubGVuZ3RoKjJdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYmxvY2tzLCAwLCBuZXdMaXN0LCAwLCBibG9ja3MubGVuZ3RoKTsKLQkJCQlibG9ja3MgPSBuZXdMaXN0OwotCQkJfQotCQkJYmxvY2tzW3RvcEJsb2NrXSA9IGJsb2NrTnVtYmVyOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYSBibG9jayBlbmQuIFRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgdGhlIGdpdmVuIG51bWJlciwgb3IgaXQgaXMgYW4gZXJyb3IuCi0JICogCi0JICogQHBhcmFtIGJsb2NrTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEJsb2NrRW5kKGludCBibG9ja051bWJlcikgewotCQl0cnkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlpbmRlbnQoZmFsc2UpOwotCQkJCXByaW50VHJhY2UoIkVuZCBCbG9jayAjIitibG9ja051bWJlciwgZXJyb3JPY2N1cnJlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmIChibG9ja3MgPT0gbnVsbCB8fCB0b3BCbG9jayA8IDAgfHwgYmxvY2tzW3RvcEJsb2NrXSAhPSBibG9ja051bWJlcikgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoQmxvY2tFbmQuUmVjZWl2ZWRFbmRCbG9ja3NPdXRPZk9yZGVyX0VYQ18iKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXRvcEJsb2NrLS07Ci0JCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gPT0gQkxPQ0tfSUdOT1JFICYmIGJsb2NrTnVtYmVyID09IGJyZWFrQmxvY2spIHsKLQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkJCi0JfQotCQotCS8qKgotCSAqIFNraXAgYWxsIGZvbGxvd2luZyB1bnRpbCB3ZSBoaXQgdGhlIHJlcXVlc3RlZCBibG9jayBudW1iZXIuCi0JICogQHBhcmFtIGJsb2NrTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEJsb2NrQnJlYWsoaW50IGJsb2NrTnVtYmVyKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlKCJCcmVhayBCbG9jayAjIitibG9ja051bWJlciwgZXJyb3JPY2N1cnJlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCWlmIChpZ25vcmVFeHByZXNzaW9uID09IG51bGwpIHsKLQkJCQlpZ25vcmVFeHByZXNzaW9uID0gQkxPQ0tfSUdOT1JFOwkvLyBTdGFydCBpZ25vcmluZyBleHByZXNzaW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGJsb2NrIG51bWJlciBlbmQgYmxvY2suCi0JCQkJYnJlYWtCbG9jayA9IGJsb2NrTnVtYmVyOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBUUllfVEhST1dfSUdOT1JFID0gIlRSWSBUSFJPVyBJR05PUkUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFRSWV9GSU5BTF9JR05PUkUgPSAiVFJZIEZJTkFMIElHTk9SRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGludFtdIHRyeXM7CS8vIFN0YWNrIG9mIHRyeSBudW1iZXJzIGN1cnJlbnRseSBldmFsdWF0aW5nLgotCS8vIFN0YWNrIG9mIHRyeXMgaW4gY2F0Y2ggY2xhdXNlIChpLmUuIHN0YXJ0aW5nIGV4ZWN1dGluZyBhIGNhdGNoL2ZpbmFsIGNsYXVzZSBmb3IgdGhlIHRyeSkuIENvcnJlc3BvbmRzIHdpdGggdHJ5IGZyb20gc2FtZSBpbmRleCBpbiB0cnlzLiBDb250YWlucyB0aGUgdGhyb3dhYmxlIGZvciB0aGUgY2F0Y2guCi0JLy8gVGhpcyBpcyB1c2VkIHRvIGtub3cgd2UgYXJlIGV4ZWN1dGluZyBhIGNhdGNoIChlbnRyeSBub3QgbnVsbCkgYW5kIGZvciB0aGUgcmV0aHJvdyBzaG9ydC1oYW5kIHRvIHJldGhyb3cgdGhlIHNhbWUgZXhjZXB0aW9uIHdpdGhpbiB0aGUgY2F0Y2guCi0JcHJpdmF0ZSBUaHJvd2FibGVbXSB0cnlzSW5DYXRjaDsJCi0JcHJpdmF0ZSBpbnQgdG9wVHJ5ID0gLTE7CS8vIFRvcCB0cnkgaW5kZXguCi0JcHJpdmF0ZSBpbnQgYnJlYWtUcnkgPSAtMTsJLy8gVHJ5IG51bWJlciB3ZSBhcmUgYnJlYWtpbmcgdG8uCi0JcHJpdmF0ZSBUaHJvd2FibGUgY2F0Y2hUaHJvd2FibGU7CS8vIFRoZSB0aHJvd2FibGUgdG8gY2hlY2sgY2F0Y2hlcyBhZ2FpbnN0LgotCQotCS8qKgotCSAqIFB1c2ggYSB0cnkgc3RhdGVtZW50LgotCSAqIEBwYXJhbSB0cnlOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoVHJ5QmVnaW4oaW50IHRyeU51bWJlcikgewotCQl0cnkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlwcmludFRyYWNlKCJCZWdpbiBUcnkgIyIrdHJ5TnVtYmVyLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGVudCh0cnVlKTsKLQkJCX0KLQkKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmICh0cnlzID09IG51bGwpIHsKLQkJCQl0cnlzID0gbmV3IGludFsxMF07Ci0JCQkJdHJ5c0luQ2F0Y2ggPSBuZXcgVGhyb3dhYmxlWzEwXTsKLQkJCX0KLQkJCWlmICgrK3RvcFRyeSA+PSB0cnlzLmxlbmd0aCkgewotCQkJCWludFtdIG5ld0xpc3QgPSBuZXcgaW50W3RyeXMubGVuZ3RoKjJdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodHJ5cywgMCwgbmV3TGlzdCwgMCwgdHJ5cy5sZW5ndGgpOwotCQkJCXRyeXMgPSBuZXdMaXN0OwotCQkJCVRocm93YWJsZVtdIG5ld0NhdGNoZXMgPSBuZXcgVGhyb3dhYmxlW3RyeXMubGVuZ3RoXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRyeXNJbkNhdGNoLCAwLCBuZXdDYXRjaGVzLCAwLCB0cnlzSW5DYXRjaC5sZW5ndGgpOwotCQkJCXRyeXNJbkNhdGNoID0gbmV3Q2F0Y2hlczsKLQkJCX0KLQkJCXRyeXNbdG9wVHJ5XSA9IHRyeU51bWJlcjsKLQkJCXRyeXNJbkNhdGNoW3RvcFRyeV0gPSBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhyb3cgdGhlIHRvcCBzdGFjayBlbnRyeS4gSXQgbXVzdCBiZSBhbiBleGNlcHRpb24uCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFRocm93RXhjZXB0aW9uKCkgewotCQl0cnkgewotCQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZSgiVGhyb3cgZXhjZXB0aW9uOiAiLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQotCQkJdHJ5IHsKLQkJCQlPYmplY3QgdCA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQlwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludCh0KTsKLQkJCQl9Ci0JCQkJdGhyb3dFeGNlcHRpb24oKFRocm93YWJsZSkgdCk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQkJCQotCX0KLQkKLQkvKioKLQkgKiBUaHJvdyB0aGlzIGV4Y2VwdGlvbiAobWVhbnMgdGhyb3cgdGhyb3VnaCB0aGUgZXhwcmVzc2lvbiBiZWluZyBwcm9jZXNzZWQsIG5vdCB0aHJvdyBmb3IgdGhpcyB0aHJlYWQpLgotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB0aHJvd0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmICh0b3BUcnkgPT0gLTEpIHsKLQkJCS8vIFRoZXJlIGFyZSBubyB0cmllcywgc28gdHJlYXQgdGhpcyBhcyBhIHN5bnRheCBlcnJvci4KLQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfSBlbHNlIGlmICh0cnlzSW5DYXRjaFt0b3BUcnldID09IG51bGwpIHsKLQkJCS8vIFdlIGFyZSBub3QgaW4gYSBjYXRjaCBjbGF1c2Ugb2YgdGhlIHRvcCB0cnkuIFNvIGRvIGEgdGhyb3cgaWdub3JlIGZvciB0b3B0cnkuCi0JCQlpZ25vcmVFeHByZXNzaW9uID0gVFJZX1RIUk9XX0lHTk9SRTsKLQkJCWJyZWFrVHJ5ID0gdHJ5c1t0b3BUcnldOwotCQkJY2F0Y2hUaHJvd2FibGUgPSBleGNlcHRpb247Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXZSBhcmUgaW4gYSBjYXRjaCBvZiB0aGUgdG9wIHRyeS4gU28gZG8gYSB0aHJvdyB0byBmaW5hbGx5IGluc3RlYWQuCi0JCQlpZ25vcmVFeHByZXNzaW9uID0gVFJZX0ZJTkFMX0lHTk9SRTsKLQkJCXRyeXNJbkNhdGNoW3RvcFRyeV0gPSBGSU5BTF9DQVRDSDsKLQkJCWJyZWFrVHJ5ID0gdHJ5c1t0b3BUcnldOwotCQkJY2F0Y2hUaHJvd2FibGUgPSBleGNlcHRpb247Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHVzaCBhIGNhdGNoIGNsYXVzZQotCSAqIEBwYXJhbSB0cnlOdW1iZXIKLQkgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZQotCSAqIEBwYXJhbSBleHByZXNzaW9uUHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoVHJ5Q2F0Y2hDbGF1c2UoaW50IHRyeU51bWJlciwgQ2xhc3MgZXhjZXB0aW9uVHlwZSwgSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgZXhwcmVzc2lvblByb3h5KSB7Ci0JCXRyeSB7Ci0JCQlpZiAodHJhY2VPbikgewotCQkJCWluZGVudChmYWxzZSk7Ci0JCQkJaWYgKGV4cHJlc3Npb25Qcm94eSA9PSBudWxsKQotCQkJCQlwcmludFRyYWNlKCJDYXRjaCBUcnkgIyIrdHJ5TnVtYmVyKyIgKCIrZXhjZXB0aW9uVHlwZSsnKScsIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQllbHNlCi0JCQkJCXByaW50VHJhY2UoIkNhdGNoIFRyeSAjIit0cnlOdW1iZXIrIiAoIitleGNlcHRpb25UeXBlKyIpIFJldHVybiBleGNlcHRpb24gaW4gcHJveHkgIyIrZXhwcmVzc2lvblByb3h5LmdldFByb3h5SUQoKSwgZXJyb3JPY2N1cnJlZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJaW5kZW50KHRydWUpOwotCQkJfQotCQkJCi0JCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmICh0cnlzID09IG51bGwgfHwgdG9wVHJ5IDwgMCB8fCB0cnlzW3RvcFRyeV0gIT0gdHJ5TnVtYmVyKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlDYXRjaENsYXVzZS5DYXRjaFJlY2VpdmVkT3V0T2ZPcmRlcl9FWENfIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIE5vcm1hbCBmbG93LCBubyB0aHJvdyBpbiBwcm9ncmVzcywgc28ganVzdCBpZ25vcmUgbm93IHVudGlsIHRoZSBmaW5hbGx5IG9yIGVuZCB0cnkgcmVhY2hlZC4KLQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IFRSWV9GSU5BTF9JR05PUkU7Ci0JCQkJCWJyZWFrVHJ5ID0gdHJ5TnVtYmVyOwotCQkJCX0gZWxzZSBpZiAoaWdub3JlRXhwcmVzc2lvbiA9PSBUUllfVEhST1dfSUdOT1JFICYmIHRyeU51bWJlciA9PSBicmVha1RyeSkgewotCQkJCQkvLyBXZSBhcmUgaGVyZSBkdWUgdG8gYSB0aHJvdyBvY2N1cmluZyBpbiB0aGlzIHRyeSBibG9jaywgc2VlIGlmIGZvciB1cywgYW5kIGlmIGl0IGlzLCBzdG9wIGlnbm9yaW5nLgotCQkJCQkvLyBFbHNlIGp1c3QgY29udGludWUgaWdub3JpbmcuCi0JCQkJCWlmIChleGNlcHRpb25UeXBlLmlzSW5zdGFuY2UoY2F0Y2hUaHJvd2FibGUpKSB7Ci0JCQkJCQkvLyBGb3IgdXMsIHNvIGp1c3QgdHVybiBldmVyeXRoaW5nIGJhY2sgb24sIGV4Y2VwdCBtYXJrIHRoYXQgd2UgYXJlIGluIHRoZSBjYXRjaCBwaGFzZS4KLQkJCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwotCQkJCQkJdHJ5c0luQ2F0Y2hbdG9wVHJ5XSA9IGNhdGNoVGhyb3dhYmxlOyAvLyBUaGlzIGlzIHNvIHRoYXQgd2Uga25vdyBpZiB3ZSB0aHJvdyBhZ2FpbiB0aGF0IHdlIHNob3VsZCBub3QgY2F0Y2ggYW55dGhpbmcuCi0JCQkJCQlicmVha1RyeSA9IC0xOwotCQkJCQkJaWYgKGV4cHJlc3Npb25Qcm94eSAhPSBudWxsKSB7Ci0JCQkJCQkJZXhwcmVzc2lvblByb3h5LnNldFByb3h5KGNhdGNoVGhyb3dhYmxlLCBjYXRjaFRocm93YWJsZS5nZXRDbGFzcygpKTsKLQkJCQkJCQlhbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShleHByZXNzaW9uUHJveHkpOwotCQkJCQkJfQotCQkJCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgQ2F1Z2h0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoY2F0Y2hUaHJvd2FibGUpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2hUaHJvd2FibGUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkJCi0JfQotCQotCS8vIFRoaXMgaXMgdXNlZCBvbmx5IHNvIHRoYXQgZmluYWxseSBjbGF1c2UgY2FuIGluZGljYXRlIGl0IHdhcyBleGVjdXRpbmcgc28gdGhhdCBlbmQgZXhwcmVzc2lvbiBrbm93cyB0aGlzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRocm93YWJsZSBGSU5BTF9DQVRDSCA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSB0cnkgZmluYWxseSBjbGF1c2UuCi0JICogQHBhcmFtIHRyeU51bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hUcnlGaW5hbGx5Q2xhdXNlKGludCB0cnlOdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJaW5kZW50KGZhbHNlKTsKLQkJCQlwcmludFRyYWNlKCJGaW5hbGx5IFRyeSAjIit0cnlOdW1iZXIsIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5kZW50KHRydWUpOwotCQkJfQotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJLy8gV2UgYXJlIG5vdCBjaGVja2luZyBpZ25vcmUgYmVjYXVzZSB0aGlzIGlzIGEgc3RydWN0dXJhbCBjb25jZXB0IGluc3RlYWQgb2YgZXhlY3V0YWJsZSBleHByZXNzaW9ucywgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZXNlLgotCQkJaWYgKHRyeXMgPT0gbnVsbCB8fCB0b3BUcnkgPCAwIHx8IHRyeXNbdG9wVHJ5XSAhPSB0cnlOdW1iZXIpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeUZpbmFsbHlDbGF1c2UuRmluYWxseVJlY2VpdmVkT3V0T2ZPcmRlcl9FWENfIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlpZiAodHJ5TnVtYmVyID09IGJyZWFrVHJ5ICYmIChpZ25vcmVFeHByZXNzaW9uID09IFRSWV9USFJPV19JR05PUkUgfHwgaWdub3JlRXhwcmVzc2lvbiA9PSBUUllfRklOQUxfSUdOT1JFKSkgewotCQkJCQkvLyBXZSBhcmUgaGVyZSBkdWUgdG8gYSB0aHJvdyBvY2N1cmluZyBpbiB0aGlzIHRyeSBibG9jayBvciBhIGNhdGNoIHdhcyByZWFjaGVkIChpbiB3aGljaCBjYXNlIGFsbCBpbnRlcnZlbmluZyBjYXRjaCdzIHdlcmUgaWdub3JlZCkuCi0JCQkJCS8vIE5vdyBkbyBhIG5vcm1hbCBleGVjdXRpb24uIElmIHdlIGFyZSBoZXJlIGR1ZSB0byBhIHRocm93IHRoYXQgd2Fzbid0IGNsZWFyZWQgKGVpdGhlciBubyBjYXRjaCBvciBhbm90aGVyIHRocm93IG9jY3VyZWQgd2l0aGluIHRoZSBjYXRjaCkKLQkJCQkJLy8gdGhlbiB3ZSBsZWF2ZSBpdCB1bmNsZWFyZWQgc28gdGhhdCB0cnkvZW5kIG1heSByZXRocm93IGl0LgotCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gbnVsbDsKLQkJCQkJdHJ5c0luQ2F0Y2hbdG9wVHJ5XSA9IEZJTkFMX0NBVENIOyAvLyBXZSBhcmUgaW4gdGhlIGZpbmFsbHkgY2xhdXNlIG9mIGEgZXhjZXB0aW9uIGJlaW5nIHRocm93biB3aXRoaW4gdGhpcyB0cnkuCi0JCQkJCWJyZWFrVHJ5ID0gLTE7Ci0JCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJU3lzdGVtLm91dC5wcmludCgiIEV4ZWN1dGluZyBmaW5hbGx5LiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkJCi0JfQotCQotCS8qKgotCSAqIFJldGhyb3cgdGhlIGNhdWdodCBleGNlcHRpb24uIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3I6Ci0JICogfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgKiAgIC4uLiBkbyBzdHVmZiAuLi4KLQkgKiAgIHRocm93IGU7Ci0JICogfQotCSAqIEBwYXJhbSB0cnlOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoVHJ5UmV0aHJvdyhpbnQgdHJ5TnVtYmVyKSB7Ci0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiUmV0aHJvdyBUcnkgIyIrdHJ5TnVtYmVyLCBlcnJvck9jY3VycmVkICB8fCBpZ25vcmVFeHByZXNzaW9uICE9IG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0cnkgewotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJLy8gV2UgYXJlIG5vdCBjaGVja2luZyBpZ25vcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIG5vdCBjYWxsZWQgb3V0IG9mIG9yZGVyLgotCQkJaWYgKHRyeXMgPT0gbnVsbCB8fCB0b3BUcnkgPCAwIHx8IHRyeXNbdG9wVHJ5XSAhPSB0cnlOdW1iZXIpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeVJldGhyb3cuUmV0aHJvd1JlY2VpdmVkT3V0T2ZPcmRlcl9FWENfIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChpZ25vcmVFeHByZXNzaW9uID09IG51bGwpIHsKLQkJCQlpZiAodHJ5c0luQ2F0Y2hbdG9wVHJ5XSA9PSBudWxsIHx8IHRyeXNJbkNhdGNoW3RvcFRyeV0gPT0gRklOQUxfQ0FUQ0gpCi0JCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoVHJ5UmV0aHJvdy5SZXRyeVJlY2VpdmVkT3V0T2ZFeGVjdXRpbmdDYXRjaENsYXVzZV9FWENfIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgewotCQkJCQl0aHJvd0V4Y2VwdGlvbih0cnlzSW5DYXRjaFt0b3BUcnldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoVHJ5RW5kKGludCB0cnlOdW1iZXIpIHsKLQkJaWYgKHRyYWNlT24pIHsKLQkJCWluZGVudChmYWxzZSk7Ci0JCQlwcmludFRyYWNlKCJFbmQgVHJ5ICMiK3RyeU51bWJlciwgZXJyb3JPY2N1cnJlZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJLy8gV2UgYXJlIG5vdCBjaGVja2luZyBpZ25vcmUgYmVjYXVzZSB0aGlzIGlzIGEgc3RydWN0dXJhbCBjb25jZXB0IGluc3RlYWQgb2YgZXhlY3V0YWJsZSBleHByZXNzaW9ucywgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZXNlLgotCQkJaWYgKHRyeXMgPT0gbnVsbCB8fCB0b3BUcnkgPCAwIHx8IHRyeXNbdG9wVHJ5XSAhPSB0cnlOdW1iZXIpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeUVuZC5UcnlFbmRSZWNlaXZlZE91dE9mT3JkZXJfRVhDXyIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJYm9vbGVhbiBpbkNhdGNoID0gdHJ5c0luQ2F0Y2hbdG9wVHJ5XSAhPSBudWxsOwotCQkJCXRyeXNJbkNhdGNoW3RvcFRyeV0gPSBudWxsOwotCQkJCXRvcFRyeS0tOwotCQkJCWlmIChpbkNhdGNoIHx8ICh0cnlOdW1iZXIgPT0gYnJlYWtUcnkgJiYgKGlnbm9yZUV4cHJlc3Npb24gPT0gVFJZX1RIUk9XX0lHTk9SRSB8fCBpZ25vcmVFeHByZXNzaW9uID09IFRSWV9GSU5BTF9JR05PUkUpKSkgewotCQkJCQkvLyBXZSBhcmUgaGVyZSBkdWUgdG8gYSB0aHJvdyBvciBub3JtYWwgZmxvdyB0aHJvdWdoIGEgY2F0Y2guIEVpdGhlciB3YXkgaWYgdGhlcmUgaXMgYSB0aHJvd2FibGUgc3RpbGwgcGVuZGluZywgd2UgcmV0aHJvdy4KLQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCWJyZWFrVHJ5ID0gLTE7Ci0JCQkJCWlmIChjYXRjaFRocm93YWJsZSAhPSBudWxsKQotCQkJCQkJdGhyb3dFeGNlcHRpb24oY2F0Y2hUaHJvd2FibGUpOwotCQkJCX0gCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0JCQkKLQl9Ci0JCi0JLyoqCi0JICogQ2xhc3MgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZSBhdCB0aW1lIG9mIG1hcmsuIEl0IHdpbGwKLQkgKiBiZSB1c2VkIHRvIHJlc3RvcmUgc3RhdGUgaWYgZXJyb3IuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNhdmVTdGF0ZSB7Ci0JCXB1YmxpYyBpbnQgbWFya0lEOwotCQkKLQkJLy8gQmxvY2sgc3RhdGUKLQkJcHVibGljIGludCB0b3BCbG9jazsKLQkJcHVibGljIGludCBicmVha0Jsb2NrOwotCi0JCS8vIFN1YmV4cHJlc3Npb24gc3RhdGUKLQkJcHVibGljIGludCB0b3BTdWJleHByZXNzaW9uOwotCi0JCS8vIFRyeSBzdGF0ZQotCQlwdWJsaWMgaW50IHRvcFRyeTsKLQkJcHVibGljIGludCBicmVha1RyeTsKLQkJcHVibGljIFRocm93YWJsZSBjYXRjaFRocm93YWJsZTsKLQkJCi0JCS8vIEVycm9yIHN0YXRlCi0JCXB1YmxpYyBib29sZWFuIGVycm9yT2NjdXJyZWQ7Ci0JCXB1YmxpYyBib29sZWFuIG5vdmFsdWVFeGNlcHRpb247Ci0JCXB1YmxpYyBUaHJvd2FibGUgZXhjZXB0aW9uOwotCQlwdWJsaWMgT2JqZWN0IGlnbm9yZUV4cHJlc3Npb247Ci0JCQotCQkvLyBFeHByZXNzaW9uIHN0YWNrIHN0YXRlCi0JCXB1YmxpYyBpbnQgZXhwcmVzc2lvblN0YWNrUG9zOwotCQkKLQkJLy8gSWYvZWxzZSBzdGF0ZQotCQlwdWJsaWMgaW50IGlmRWxzZU5lc3Rpbmc7Ci0JCXB1YmxpYyBpbnQgaWZFbHNlSWdub3JlTmVzdENvdW50OwotCQlwdWJsaWMgYm9vbGVhbiBpZkVsc2VTa2lwVHJ1ZVBhcnQ7Ci0JCQotCQkvLyBPdGhlcgotCQlwdWJsaWMgaW50IGluZGVudDsKLQkJcHVibGljIGludCBleHByZXNzaW9uUHJveHlQb3M7Ci0JCQotCQkvKioKLQkJICogQ29uc3RydWN0IGFuZCBzYXZlIHRoZSBzdGF0ZS4KLQkJICogCi0JCSAqIEBwYXJhbSBtYXJrTnVtYmVyCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBTYXZlU3RhdGUoaW50IG1hcmtJRCkgewotCQkJdGhpcy5tYXJrSUQgPSBtYXJrSUQ7Ci0JCQkKLQkJCUV4cHJlc3Npb25Qcm9jZXNzZXIgZXAgPSBFeHByZXNzaW9uUHJvY2Vzc2VyLnRoaXM7Ci0JCQl0aGlzLnRvcEJsb2NrID0gZXAudG9wQmxvY2s7Ci0JCQl0aGlzLmJyZWFrQmxvY2sgPSBlcC5icmVha0Jsb2NrOwotCQkJCi0JCQl0aGlzLnRvcFN1YmV4cHJlc3Npb24gPSBlcC50b3BTdWJleHByZXNzaW9uOwotCQkJCi0JCQl0aGlzLnRvcFRyeSA9IGVwLnRvcFRyeTsKLQkJCXRoaXMuYnJlYWtUcnkgPSBlcC5icmVha1RyeTsKLQkJCXRoaXMuY2F0Y2hUaHJvd2FibGUgPSBlcC5jYXRjaFRocm93YWJsZTsKLQkJCQotCQkJdGhpcy5lcnJvck9jY3VycmVkID0gZXAuZXJyb3JPY2N1cnJlZDsKLQkJCXRoaXMubm92YWx1ZUV4Y2VwdGlvbiA9IGVwLm5vdmFsdWVFeGNlcHRpb247Ci0JCQl0aGlzLmV4Y2VwdGlvbiA9IGVwLmV4Y2VwdGlvbjsKLQkJCXRoaXMuaWdub3JlRXhwcmVzc2lvbiA9IGVwLmlnbm9yZUV4cHJlc3Npb247Ci0JCQkKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrUG9zID0gZXhwcmVzc2lvblN0YWNrLnNpemUoKS0xOwotCQkJCi0JCQl0aGlzLmlmRWxzZU5lc3RpbmcgPSBlcC5pZkVsc2VOZXN0aW5nOwotCQkJdGhpcy5pZkVsc2VJZ25vcmVOZXN0Q291bnQgPSBlcC5pZkVsc2VJZ25vcmVOZXN0Q291bnQ7Ci0JCQl0aGlzLmlmRWxzZVNraXBUcnVlUGFydCA9IGVwLmlmRWxzZVNraXBUcnVlUGFydDsKLQkJCQotCQkJdGhpcy5pbmRlbnQgPSBlcC5pbmRlbnQ7Ci0JCQl0aGlzLmV4cHJlc3Npb25Qcm94eVBvcyA9IGV4cHJlc3Npb25Qcm94aWVzICE9IG51bGwgPyBleHByZXNzaW9uUHJveGllcy5zaXplKCktMSA6IC0xOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmVzdG9yZSB0aGUgc3RhdGUuCi0JCSAqIAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoKSB7Ci0JCQlFeHByZXNzaW9uUHJvY2Vzc2VyIGVwID0gRXhwcmVzc2lvblByb2Nlc3Nlci50aGlzOwotCQkJZXAudG9wQmxvY2sgPSB0aGlzLnRvcEJsb2NrOwotCQkJZXAuYnJlYWtCbG9jayA9IHRoaXMuYnJlYWtCbG9jazsKLQotCQkJZXAudG9wU3ViZXhwcmVzc2lvbiA9IHRoaXMudG9wU3ViZXhwcmVzc2lvbjsKLQkJCQotCQkJZXAudG9wVHJ5ID0gdGhpcy50b3BUcnk7Ci0JCQllcC5icmVha1RyeSA9IHRoaXMuYnJlYWtUcnk7Ci0JCQllcC5jYXRjaFRocm93YWJsZSA9IHRoaXMuY2F0Y2hUaHJvd2FibGU7Ci0JCQlpZiAodHJ5c0luQ2F0Y2ggIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSB0b3BUcnkgKyAxOyBpIDwgZXAudHJ5c0luQ2F0Y2gubGVuZ3RoOyBpKyspIHsKLQkJCQkJZXAudHJ5c0luQ2F0Y2hbaV0gPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJZXAuZXJyb3JPY2N1cnJlZCA9IHRoaXMuZXJyb3JPY2N1cnJlZDsKLQkJCWVwLm5vdmFsdWVFeGNlcHRpb24gPSBlcC5ub3ZhbHVlRXhjZXB0aW9uOwotCQkJZXAuZXhjZXB0aW9uID0gdGhpcy5leGNlcHRpb247Ci0JCQllcC5pZ25vcmVFeHByZXNzaW9uID0gdGhpcy5pZ25vcmVFeHByZXNzaW9uOwotCQkJCi0JCQkvLyBQb3Agc3RhY2sgZG93biB0byBzYXZlZCBzdGF0ZS4KLQkJCWZvciAoaW50IGkgPSBleHByZXNzaW9uU3RhY2suc2l6ZSgpLTE7IGkgPiB0aGlzLmV4cHJlc3Npb25TdGFja1BvczsgaS0tKSB7Ci0JCQkJZXhwcmVzc2lvblN0YWNrLnJlbW92ZShpKTsKLQkJCQlleHByZXNzaW9uVHlwZVN0YWNrLnJlbW92ZShpKTsKLQkJCX0KLQkJCQotCQkJZXAuaWZFbHNlTmVzdGluZyA9IHRoaXMuaWZFbHNlTmVzdGluZzsKLQkJCWVwLmlmRWxzZUlnbm9yZU5lc3RDb3VudCA9IHRoaXMuaWZFbHNlSWdub3JlTmVzdENvdW50OwotCQkJZXAuaWZFbHNlU2tpcFRydWVQYXJ0ID0gdGhpcy5pZkVsc2VTa2lwVHJ1ZVBhcnQ7Ci0JCQkKLQkJCWVwLmluZGVudCA9IHRoaXMuaW5kZW50OwotCQkJCi0JCQlpZiAoZXhwcmVzc2lvblByb3hpZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSBleHByZXNzaW9uUHJveGllcy5zaXplKCkgLSAxOyBpID4gdGhpcy5leHByZXNzaW9uUHJveHlQb3M7IGktLSkgewotCQkJCQlleHByZXNzaW9uUHJveGllcy5yZW1vdmUoaSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBUaGVzZSBzZXR0aW5ncyBjYW4ndCBjcm9zcyBtYXJrIGJvdW5kYXJpZXMsIHNvIHJlc2V0IHRoZW0gdG8gbm90IHNldC4gVGhpcyBpcyBpbiBjYXNlIHdlIHdlcmUgaW4gdGhpcyBzdGF0ZSBzb21ld2hlcmUKLQkJCS8vIGluIHRoZSBtYXJrIHdoZW4gdGhlIHJlc3RvcmUgb2NjdXJyZWQuCi0JCQllcC5jb25kaXRpb25hbElnbm9yZU5lc3RDb3VudCA9IDA7Ci0JCQllcC5jb25kaXRpb25hbE5lc3RpbmcgPSAwOwotCQkJZXAuc2tpcFRydWVQYXJ0ID0gZmFsc2U7Ci0JCQkKLQkJCWVwLmluZml4SWdub3JlTmVzdENvdW50ID0gMDsKLQkJCWVwLmluZml4TmVzdGluZyA9IDA7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBzYXZlIHN0YXRlIHdpdGggdGhlIGdpdmVuIGlkLgotCSAqIEBwYXJhbSBtYXJrSUQKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdGF0ZSBjcmVhdGVTYXZlU3RhdGUoaW50IG1hcmtJRCkgewotCQlyZXR1cm4gbmV3IFNhdmVTdGF0ZShtYXJrSUQpOwotCX0KLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBzdGFydCBvZiBhIG1hcmsuCi0JICogQHBhcmFtIG1hcmtOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoTWFyayhpbnQgbWFya051bWJlcikgewotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIk1hcmsjIittYXJrTnVtYmVyLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmIChzYXZlU3RhdGVzID09IG51bGwpCi0JCQlzYXZlU3RhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzYXZlU3RhdGVzLmFkZChjcmVhdGVTYXZlU3RhdGUobWFya051bWJlcikpOwotCQkKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlRW5kKCk7Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggdGhlIGVuZCBtYXJrLiBJZiB0aGVyZSBpcyBubyBlcnJvciwgaXQgd2lsbCBzaW1wbHkKLQkgKiByZW1vdmUgaXQgYW5kIGFsbCBzYXZlIHN0YXRlcyBpbiB0aGUgbWFwIGFmdGVyIGl0LiBJZiB0aGVyZQotCSAqIGlzIGFuIGVycm9yIGl0IHdpbGwgZG8gdGhpcyBwbHVzIGl0IHdpbGwgcmVzdG9yZSB0aGUgc3RhdGUuCi0JICogPHA+Ci0JICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBjYWxscyBhcmUgY29taW5nIGluIGNvcnJlY3Qgb3JkZXIgZnJvbQotCSAqIHRoZSBzZXJ2ZXIgc28gd2Ugd29uJ3QgY2hlY2sgdmFsaWRpdHkuCi0JICogCi0JICogQHBhcmFtIG1hcmtJRAotCSAqIEBwYXJhbSByZXN0b3JlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEVuZG1hcmsoaW50IG1hcmtJRCwgYm9vbGVhbiByZXN0b3JlKSB7Ci0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiRW5kIE1hcmsjIittYXJrSUQrIiBSZXN0b3JlZD0iK3Jlc3RvcmUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQl0cnkgewotCQkJaWYgKHNhdmVTdGF0ZXMgIT0gbnVsbCkgewotCQkJCS8vIFN0YXJ0IGZyb20gdGhlIGVuZCAoc2luY2UgdGhhdCBpcyB3aGVyZSBpdCBtb3N0IGxpa2VseSB3aWxsIGJlKSBhbmQgc3RhcnQKLQkJCQkvLyBzZWFyY2gsIHJlbW92aW5nIHRoZSBlbmQgb25lIHVudGlsIHdlIHJlYWNoIHRoZSBtYXJrSUQuCi0JCQkJZm9yIChpbnQgaSA9IHNhdmVTdGF0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJU2F2ZVN0YXRlIHN0YXRlID0gKFNhdmVTdGF0ZSkgc2F2ZVN0YXRlcy5yZW1vdmUoaSk7Ci0JCQkJCWlmIChzdGF0ZS5tYXJrSUQgPT0gbWFya0lEKSB7Ci0JCQkJCQkvLyBXZSBmb3VuZCBpdC4KLQkJCQkJCWlmIChyZXN0b3JlKQotCQkJCQkJCXN0YXRlLnJlc3RvcmVTdGF0ZSgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEJ1dCB0byBiZSBzYWZlLCBpZiB3ZSBnb3QgaGVyZSwgdGhpcyBpcyBiYWQuIFdlIHRyaWVkIHJlc3RvcmUgYSBtYXJrIHdlIGRpZG4ndCBoYXZlLgotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoRW5kbWFyay5FbmRNYXJrT25Ob25FeGlzdGluZ0lEX0VYQ18iKSwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKG1hcmtJRCl9KSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBpbnRbXSBzdWJleHByZXNzaW9uczsJLy8gU3RhY2sgb2Ygc3ViZXhwcmVzc2lvbiBudW1iZXJzIGN1cnJlbnRseSBldmFsdWF0aW5nLgotCXByaXZhdGUgaW50W10gc3ViZXhwcmVzc2lvblN0YWNrUG9zOwkvLyBTdGFjayBvZiB0aGUgZXhwcmVzc2lvbiBzdGFjayBwb3NpdGlvbnMgKG5leHQgZW50cnkgaW5kZXgpIGZvciBjdXJyZW50bHkgZXZhbHVhdGluZyBleHByZXNzaW9ucy4gVGhlIGV2YWx1YXRpb24gc3RhY2sgY2Fubm90IGJlIHBvcHBlZCBiZXlvbmQgdGhlIGN1cnJlbnQgdG9wLiBBbmQgYXQgZW5kIGl0IHdpbGwgYmUgY2xlYW5lZCB1cCB0byB0aGUgcG9zaXRpb24uCi0JcHJpdmF0ZSBpbnQgdG9wU3ViZXhwcmVzc2lvbiA9IC0xOwkvLyBUb3Agc3ViZXhwcmVzc2lvbiBpbmRleC4KLQotCQotCS8qKgotCSAqIFB1c2ggYSBiZWdpbiBzdWJleHByZXNzaW9uLgotCSAqIEBwYXJhbSBzdWJleHByZXNzaW9uTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFN1YmV4cHJlc3Npb25CZWdpbihpbnQgc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQlpZiAodHJhY2VPbikgewotCQkJcHJpbnRUcmFjZSgiQmVnaW4gU3ViZXhwcmVzc2lvbiAjIitzdWJleHByZXNzaW9uTnVtYmVyLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5kZW50KHRydWUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBXZSBhcmUgbm90IGNoZWNraW5nIGlnbm9yZSBiZWNhdXNlIHRoaXMgaXMgYSBzdHJ1Y3R1cmFsIGNvbmNlcHQgaW5zdGVhZCBvZiBleGVjdXRhYmxlIGV4cHJlc3Npb25zLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlc2UuCi0JCQlpZiAoc3ViZXhwcmVzc2lvbnMgPT0gbnVsbCkgewotCQkJCXN1YmV4cHJlc3Npb25zID0gbmV3IGludFsxMF07Ci0JCQkJc3ViZXhwcmVzc2lvblN0YWNrUG9zID0gbmV3IGludFsxMF07Ci0JCQl9Ci0JCQlpZiAoKyt0b3BTdWJleHByZXNzaW9uID49IHN1YmV4cHJlc3Npb25zLmxlbmd0aCkgewotCQkJCWludFtdIG5ld0xpc3QgPSBuZXcgaW50W3N1YmV4cHJlc3Npb25zLmxlbmd0aCoyXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHN1YmV4cHJlc3Npb25zLCAwLCBuZXdMaXN0LCAwLCBzdWJleHByZXNzaW9ucy5sZW5ndGgpOwotCQkJCXN1YmV4cHJlc3Npb25zID0gbmV3TGlzdDsKLQkJCQluZXdMaXN0ID0gbmV3IGludFtzdWJleHByZXNzaW9uU3RhY2tQb3MubGVuZ3RoKjJdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoc3ViZXhwcmVzc2lvblN0YWNrUG9zLCAwLCBuZXdMaXN0LCAwLCBzdWJleHByZXNzaW9uU3RhY2tQb3MubGVuZ3RoKTsKLQkJCQlzdWJleHByZXNzaW9uU3RhY2tQb3MgPSBuZXdMaXN0OwkJCQkKLQkJCX0KLQkJCXN1YmV4cHJlc3Npb25zW3RvcFN1YmV4cHJlc3Npb25dID0gc3ViZXhwcmVzc2lvbk51bWJlcjsKLQkJCXN1YmV4cHJlc3Npb25TdGFja1Bvc1t0b3BTdWJleHByZXNzaW9uXSA9IGV4cHJlc3Npb25TdGFjay5zaXplKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHVzaCBhIHN1YmV4cHJlc3Npb24gZW5kLiBUaGUgY3VycmVudCBzdWJleHByZXNzaW9uIG11c3QgYmUgdGhlIGdpdmVuIG51bWJlciwgb3IgaXQgaXMgYW4gZXJyb3IuCi0JICogCi0JICogQHBhcmFtIHN1YmV4cHJlc3Npb25OdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoU3ViZXhwcmVzc2lvbkVuZChpbnQgc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQl0cnkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlpbmRlbnQoZmFsc2UpOwotCQkJCXByaW50VHJhY2UoIkVuZCBTdWJleHByZXNzaW9uICMiK3N1YmV4cHJlc3Npb25OdW1iZXIsIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBXZSBhcmUgbm90IGNoZWNraW5nIGlnbm9yZSBiZWNhdXNlIHRoaXMgaXMgYSBzdHJ1Y3R1cmFsIGNvbmNlcHQgaW5zdGVhZCBvZiBleGVjdXRhYmxlIGV4cHJlc3Npb25zLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlc2UuCi0JCQlpZiAoc3ViZXhwcmVzc2lvbnMgPT0gbnVsbCB8fCB0b3BTdWJleHByZXNzaW9uIDwgMCB8fCBzdWJleHByZXNzaW9uc1t0b3BTdWJleHByZXNzaW9uXSAhPSBzdWJleHByZXNzaW9uTnVtYmVyKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hTdWJleHByZXNzaW9uRW5kLlJlY2VpdmVkRW5kU3ViZXhwcmVzc2lvbnNPdXRPZk9yZGVyX0VYQ18iKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCXBvcEV4cHJlc3Npb25zKGV4cHJlc3Npb25TdGFjay5zaXplKCktc3ViZXhwcmVzc2lvblN0YWNrUG9zW3RvcFN1YmV4cHJlc3Npb25dKTsKLQkJCQkJdG9wU3ViZXhwcmVzc2lvbi0tOwotCQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0JCQkKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ZvckV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Gb3JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MzQ2ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ZvckV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogRm9yRXhwcmVzc2lvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA1LzE4IDIzOjExOjI2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotLyoqCi0gKiBFbnVtIGZvciB0aGUgZm9yRXhwcmVzc2lvbiBwYXJhbWV0ZXJzLgotICogPHA+Ci0gKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBzdWJjbGFzc2VkIGJ5IGN1c3RvbWVycy4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9yRXhwcmVzc2lvbiBleHRlbmRzIEFic3RyYWN0RW51bSB7Ci0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyBhIHJvb3QgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPT1RFWFBSRVNTSU9OX1ZBTFVFID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBST09URVhQUkVTU0lPTiA9IG5ldyBGb3JFeHByZXNzaW9uKFJPT1RFWFBSRVNTSU9OX1ZBTFVFLCAiUm9vdCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgYXJyYXkgZXhwcmVzc2lvbiBmb3IgYW4gYXJyYXkgYWNjZXNzIChpLmUuIHRoZSBhcnJheSB0byBhY2Nlc3MpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlBQ0NFU1NfQVJSQVlfVkFMVUUgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIEFSUkFZQUNDRVNTX0FSUkFZID0gbmV3IEZvckV4cHJlc3Npb24oQVJSQVlBQ0NFU1NfQVJSQVlfVkFMVUUsICJBcnJheSBBY2Nlc3M6IEFycmF5IE9wZXJhbmQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYW4gaW5kZXggZXhwcmVzc2lvbiBmb3IgYW4gYXJyYXkgYWNjZXNzIChpLmUuIG9uZSBvZiB0aGUgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSA8Y29kZT5bXTwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZQUNDRVNTX0lOREVYX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBUlJBWUFDQ0VTU19JTkRFWCA9IG5ldyBGb3JFeHByZXNzaW9uKEFSUkFZQUNDRVNTX0lOREVYX1ZBTFVFLCAiQXJyYXkgQWNjZXNzOiBJbmRleCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyBhbiBkaW1lbnNpb24gZXhwcmVzc2lvbiBmb3IgYW4gYXJyYXkgY3JlYXRpb24gKGkuZS4gb25lIG9mIHRoZSBleHByZXNzaW9ucyB3aXRoaW4gdGhlIDxjb2RlPltdPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlDUkVBVElPTl9ESU1FTlNJT05fVkFMVUUgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIEFSUkFZQ1JFQVRJT05fRElNRU5TSU9OID0gbmV3IEZvckV4cHJlc3Npb24oQVJSQVlDUkVBVElPTl9ESU1FTlNJT05fVkFMVUUsICJBcnJheSBBY2Nlc3M6IERpbWVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyBhbiBleHByZXNzaW9uIGZvciBhbiBhcnJheSBpbml0aWFsaXplciAoaS5lLiBvbmUgb2YgdGhlIGV4cHJlc3Npb25zIHdpdGggdGhlIDxjb2RlPnt9PC9jb2RlPikuIFNwZWNpYWwgY2FzZSBpcyB0aGF0Ci0JICogYXJyYXkgaW5pdGlhbGl6ZXJzIGFyZSB2YWxpZCBhcyBhbiBleHByZXNzaW9uIHdpdGhpbiBhbiBhcnJheSBpbml0aWFsaXplciBhbmQgaXQgZG9lc24ndCB1c2UgYSBmb3IgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUUgPSA0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIEFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTiA9IG5ldyBGb3JFeHByZXNzaW9uKEFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTl9WQUxVRSwgIkFycmF5IEluaXRpYWxpemVyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBleHByZXNzaW9uIGZvciB0aGUgY2FzdCAoaS5lLiB0aGUgZXhwcmVzaW9uIGFmdGVyIHRoZSA8Y29kZT4odHlwZSk8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNUX0VYUFJFU1NJT05fVkFMVUUgPSA1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIENBU1RfRVhQUkVTU0lPTiA9IG5ldyBGb3JFeHByZXNzaW9uKENBU1RfRVhQUkVTU0lPTl9WQUxVRSwgIkNhc3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIGFyZ3VtZW50IGV4cHJlc3Npb24gZm9yIHRoZSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UX1ZBTFVFID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBDTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQgPSBuZXcgRm9yRXhwcmVzc2lvbihDTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlRfVkFMVUUsCi0JCQkiQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb246IEFyZ3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBjb25kaXRpb24gZm9yIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT05BTF9DT05ESVRJT05fVkFMVUUgPSA3OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIENPTkRJVElPTkFMX0NPTkRJVElPTiA9IG5ldyBGb3JFeHByZXNzaW9uKENPTkRJVElPTkFMX0NPTkRJVElPTl9WQUxVRSwgIkNvbmRpdGlvbmFsOiBDb25kaXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIHRydWUgKHRoZW4pIGV4cHJlc3Npb24gZm9yIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT05BTF9UUlVFX1ZBTFVFID0gODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBDT05ESVRJT05BTF9UUlVFID0gbmV3IEZvckV4cHJlc3Npb24oQ09ORElUSU9OQUxfVFJVRV9WQUxVRSwgIkNvbmRpdGlvbmFsOiBUcnVlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBmYWxzZSAoZWxzZSkgY29uZGl0aW9uIGZvciBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OQUxfRkFMU0VfVkFMVUUgPSA5OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIENPTkRJVElPTkFMX0ZBTFNFID0gbmV3IEZvckV4cHJlc3Npb24oQ09ORElUSU9OQUxfRkFMU0VfVkFMVUUsICJDb25kaXRpb25hbDogRmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIHJlY2VpdmVyIGZvciBhIGZpZWxkIGFjY2VzcyAoaS5lLiB0aGUgZXhwcmVzc2lvbiBiZWZvcmUgdGhlICIuIikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9SRUNFSVZFUl9WQUxVRSA9IDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIEZJRUxEX1JFQ0VJVkVSID0gbmV3IEZvckV4cHJlc3Npb24oRklFTERfUkVDRUlWRVJfVkFMVUUsICJGaWVsZCBBY2Nlc3M6IFJlY2VpdmVyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBsZWZ0IG9wZXJhbmQgb2YgYW4gaW5maXggZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZJWF9MRUZUX1ZBTFVFID0gMTE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gSU5GSVhfTEVGVCA9IG5ldyBGb3JFeHByZXNzaW9uKElORklYX0xFRlRfVkFMVUUsICJJbmZpeDogTGVmdCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgcmlnaHQgb3BlcmFuZCBvZiBhbiBpbmZpeCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklYX1JJR0hUX1ZBTFVFID0gMTI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gSU5GSVhfUklHSFQgPSBuZXcgRm9yRXhwcmVzc2lvbihJTkZJWF9SSUdIVF9WQUxVRSwgIkluZml4OiBSaWdodCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyBhbiBleHRlbmRlZCBvcGVyYW5kIG9mIGFuIGluZml4IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GSVhfRVhURU5ERURfVkFMVUUgPSAxMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBJTkZJWF9FWFRFTkRFRCA9IG5ldyBGb3JFeHByZXNzaW9uKElORklYX0VYVEVOREVEX1ZBTFVFLCAiSW5maXg6IEV4dGVuZGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSB2YWx1ZSBleHByZXNzaW9uIG9mIGFuIGluc3RhbmNlb2YuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5TVEFOQ0VPRl9WQUxVRV9WQUxVRSA9IDE0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElOU1RBTkNFT0ZfVkFMVUUgPSBuZXcgRm9yRXhwcmVzc2lvbihJTlNUQU5DRU9GX1ZBTFVFX1ZBTFVFLCAiSW5zdGFuY2VvZiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyBhIHJlY2VpdmVyIGV4cHJlc3Npb24gZm9yIGEgbWV0aG9kIGludm9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX1JFQ0VJVkVSX1ZBTFVFID0gMTU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gTUVUSE9EX1JFQ0VJVkVSID0gbmV3IEZvckV4cHJlc3Npb24oTUVUSE9EX1JFQ0VJVkVSX1ZBTFVFLCAiTWV0aG9kIEludm9rZTogUmVjZWl2ZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYW4gYXJndW1lbnQgZm9yIGEgbWV0aG9kIGludm9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0FSR1VNRU5UX1ZBTFVFID0gMTY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gTUVUSE9EX0FSR1VNRU5UID0gbmV3IEZvckV4cHJlc3Npb24oTUVUSE9EX0FSR1VNRU5UX1ZBTFVFLCAiTWV0aG9kIEludm9rZTogQXJndW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIG9wZXJhbmQgZXhwcmVzc2lvbiBmb3IgYSBwcmVmaXggb3BlcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFRklYX09QRVJBTkRfVkFMVUUgPSAxNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBQUkVGSVhfT1BFUkFORCA9IG5ldyBGb3JFeHByZXNzaW9uKFBSRUZJWF9PUEVSQU5EX1ZBTFVFLCAiUHJlZml4OiBPcGVyYW5kIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSByaWdodCBvcGVyYW5kIG9mIGFuIGFzc2lnbm1lbnQgb3BlcmF0b3IuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTSUdOTUVOVF9SSUdIVF9WQUxVRSA9IDE4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIEFTU0lHTk1FTlRfUklHSFQgPSBuZXcgRm9yRXhwcmVzc2lvbihBU1NJR05NRU5UX1JJR0hUX1ZBTFVFLCAiQXNzaWdubWVudDogUmlnaHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIGxlZnQgb3BlcmFuZCBvZiBhbiBhc3NpZ25tZW50IG9wZXJhdG9yLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBsZWZ0IGV4cHJlc3Npb24gY2FuIG9ubHkgYmUgYSBGaWVsZEFjY2VzcyBvciBBcnJheUFjY2Vzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NJR05NRU5UX0xFRlRfVkFMVUUgPSAxOTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBU1NJR05NRU5UX0xFRlQgPSBuZXcgRm9yRXhwcmVzc2lvbihBU1NJR05NRU5UX0xFRlRfVkFMVUUsICJBc3NpZ25tZW50OiBMZWZ0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSB0aHJvdyBvcGVyYW5kIG9mIHRoZSB0aHJvdyBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUk9XX09QRVJBTkRfVkFMVUUgPSAyMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBUSFJPV19PUEVSQU5EID0gbmV3IEZvckV4cHJlc3Npb24oVEhST1dfT1BFUkFORF9WQUxVRSwgIlRocm93IG9wZXJhbmQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIGlmIGNvbmRpdGlvbmFsIG9wZXJhbmQgb2YgdGhlIGlmIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUZfQ09ORElUSU9OX1ZBTFVFID0gMjE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gSUZfQ09ORElUSU9OID0gbmV3IEZvckV4cHJlc3Npb24oSUZfQ09ORElUSU9OX1ZBTFVFLCAiSWYgY29uZGl0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBpZiB0cnVlIGNsYXVzZSBvZiB0aGUgaWYgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRl9UUlVFX1ZBTFVFID0gMjI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gSUZfVFJVRSA9IG5ldyBGb3JFeHByZXNzaW9uKElGX1RSVUVfVkFMVUUsICJJZiB0cnVlIGNsYXVzZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgaWYgZWxzZSBjbGF1c2Ugb2YgdGhlIGlmIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUZfRUxTRV9WQUxVRSA9IDIzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElGX0VMU0UgPSBuZXcgRm9yRXhwcmVzc2lvbihJRl9FTFNFX1ZBTFVFLCAiSWYgZWxzZSBjbGF1c2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JCi0JLyoqCi0JICogVGhpcyBpcyBub3QgcHJpdmF0ZSwgYnV0IHByb3RlY3RlZCBvbmx5IHNvIHRoYXQgcHJveHkgY29yZSBjYW4gYWRkIGFuIGludGVybmFsIEZvckV4cHJlc3Npb24gZW51bS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBzdWJjbGFzc2VkIGJ5IGN1c3RvbWVycy4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBGb3JFeHByZXNzaW9uKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JRXhwcmVzc2lvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0lFeHByZXNzaW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZWRkNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0lFeHByZXNzaW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJRXhwcmVzc2lvbkNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLSAKLS8qKgotICogVGhlc2UgYXJlIGNvbnN0YW50cyBuZWVkZWQgYnkgSUV4cHJlc3Npb24gdGhhdCB3aWxsIGJlIGNvbW1vbiBiZXR3ZWVuCi0gKiB0aGUgdm0gYW5kIHRoZSBJREUuIFRoZXkgYXJlIGFsc28gYXZhaWxhYmxlIHRvIHVzZXJzIG9mIHRoZSBJRXhwcmVzc2lvbgotICogaW50ZXJmYWNlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbkNvbnN0YW50cyB7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5maXhPcGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0luZml4T3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiZTAwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5maXhPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJbmZpeE9wZXJhdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDUvMTggMjM6MTE6MjYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0vKioKLSAqIEVudW0gZm9yIEluZml4IG9wZXJhdG9yCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSW5maXhPcGVyYXRvciBleHRlbmRzIEFic3RyYWN0RW51bSB7Ci0KLQkvKioKLQkgKiBJbmZpeCB0aW1lcyAiKiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9USU1FU19WQUxVRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fVElNRVMgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9USU1FU19WQUxVRSwgIkluZml4ICoiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggZGl2aWRlICIvIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0RJVklERV9WQUxVRSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fRElWSURFID0gbmV3IEluZml4T3BlcmF0b3IoSU5fRElWSURFX1ZBTFVFLCAiSW5maXggLyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCByZW1haW5kZXIgIiUiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fUkVNQUlOREVSX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9SRU1BSU5ERVIgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9SRU1BSU5ERVJfVkFMVUUsICJJbmZpeCAlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IHBsdXMgIisiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fUExVU19WQUxVRSA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fUExVUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX1BMVVNfVkFMVUUsICJJbmZpeCArIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IG1pbnVzICItIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX01JTlVTX1ZBTFVFID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9NSU5VUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX01JTlVTX1ZBTFVFLCAiSW5maXggLSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBsZWZ0IHNoaWZ0ICIgPCA8IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0xFRlRfU0hJRlRfVkFMVUUgPSA1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0xFRlRfU0hJRlQgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9MRUZUX1NISUZUX1ZBTFVFLCAiSW5maXggPDwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggcmlnaHQgc2hpZnQgc2lnbmVkICI+PiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9SSUdIVF9TSElGVF9TSUdORURfVkFMVUUgPSA2OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX1JJR0hUX1NISUZUX1NJR05FRCA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX1JJR0hUX1NISUZUX1NJR05FRF9WQUxVRSwgIkluZml4ID4+Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IHJpZ2h0IHNoaWZ0IHVuc2lnbmVkICI+Pj4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fUklHSFRfU0hJRlRfVU5TSUdORURfVkFMVUUgPSA3OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX1JJR0hUX1NISUZUX1VOU0lHTkVEID0gbmV3IEluZml4T3BlcmF0b3IoSU5fUklHSFRfU0hJRlRfVU5TSUdORURfVkFMVUUsICJJbmZpeCA+Pj4iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggbGVzcyAiIDwiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fTEVTU19WQUxVRSA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fTEVTUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0xFU1NfVkFMVUUsICJJbmZpeCA8Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGdyZWF0ZXIgIj4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fR1JFQVRFUl9WQUxVRSA9IDk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fR1JFQVRFUiA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0dSRUFURVJfVkFMVUUsICJJbmZpeCA+Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGxlc3MgdGhhbiBvciBlcXVhbHMgIiA8PSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9MRVNTX0VRVUFMU19WQUxVRSA9IDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0xFU1NfRVFVQUxTID0gbmV3IEluZml4T3BlcmF0b3IoSU5fTEVTU19FUVVBTFNfVkFMVUUsICJJbmZpeCA8PSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBHcmVhdGVyIHRoYW4gb3IgZXF1bGFzICI+PSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9HUkVBVEVSX0VRVUFMU19WQUxVRSA9IDExOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0dSRUFURVJfRVFVQUxTID0gbmV3IEluZml4T3BlcmF0b3IoSU5fR1JFQVRFUl9FUVVBTFNfVkFMVUUsICJJbmZpeCA+PSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBlcXVhbHMgIj09IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0VRVUFMU19WQUxVRSA9IDEyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0VRVUFMUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0VRVUFMU19WQUxVRSwgIkluZml4ID09Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IG5vdCBlcXVhbHMgIiE9IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX05PVF9FUVVBTFNfVkFMVUUgPSAxMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9OT1RfRVFVQUxTID0gbmV3IEluZml4T3BlcmF0b3IoSU5fTk9UX0VRVUFMU19WQUxVRSwgIkluZml4ICE9Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGV4Y2x1c2l2ZSBvciAiXiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9YT1JfVkFMVUUgPSAxNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9YT1IgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9YT1JfVkFMVUUsICJJbmZpeCBeIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGJpdHdpc2UgYW5kICImIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0FORF9WQUxVRSA9IDE1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0FORCA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0FORF9WQUxVRSwgIkluZml4ICYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggYml0d2lzZSBvciAifCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9PUl9WQUxVRSA9IDE2OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX09SID0gbmV3IEluZml4T3BlcmF0b3IoSU5fT1JfVkFMVUUsICJJbmZpeCB8Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IENvbmRpdGlvbmFsIGxvZ2ljYWwgYW5kICImJiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9DT05ESVRJT05BTF9BTkRfVkFMVUUgPSAxNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9DT05ESVRJT05BTF9BTkQgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9DT05ESVRJT05BTF9BTkRfVkFMVUUsICJJbmZpeCAmJiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBDb25kaXRpb25hbCBsb2dpY2FsIG9yICJ8fCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9DT05ESVRJT05BTF9PUl9WQUxVRSA9IDE4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0NPTkRJVElPTkFMX09SID0gbmV3IEluZml4T3BlcmF0b3IoSU5fQ09ORElUSU9OQUxfT1JfVkFMVUUsICJJZm5peCB8fCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZml4IG9wZXJhdG9yIGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJbmZpeE9wZXJhdG9yIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBJTl9USU1FU19WQUxVRToKLQkJCQlyZXR1cm4gSU5fVElNRVM7Ci0JCQljYXNlIElOX0RJVklERV9WQUxVRToKLQkJCQlyZXR1cm4gSU5fRElWSURFOwotCQkJY2FzZSBJTl9SRU1BSU5ERVJfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX1JFTUFJTkRFUjsKLQkJCWNhc2UgSU5fUExVU19WQUxVRToKLQkJCQlyZXR1cm4gSU5fUExVUzsKLQkJCWNhc2UgSU5fTUlOVVNfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX01JTlVTOwotCQkJY2FzZSBJTl9MRUZUX1NISUZUX1ZBTFVFOgotCQkJCXJldHVybiBJTl9MRUZUX1NISUZUOwotCQkJY2FzZSBJTl9SSUdIVF9TSElGVF9TSUdORURfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX1JJR0hUX1NISUZUX1NJR05FRDsKLQkJCWNhc2UgSU5fUklHSFRfU0hJRlRfVU5TSUdORURfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX1JJR0hUX1NISUZUX1VOU0lHTkVEOwotCQkJY2FzZSBJTl9MRVNTX1ZBTFVFOgotCQkJCXJldHVybiBJTl9MRVNTOwotCQkJY2FzZSBJTl9HUkVBVEVSX1ZBTFVFOgotCQkJCXJldHVybiBJTl9HUkVBVEVSOwotCQkJY2FzZSBJTl9MRVNTX0VRVUFMU19WQUxVRToKLQkJCQlyZXR1cm4gSU5fTEVTU19FUVVBTFM7Ci0JCQljYXNlIElOX0dSRUFURVJfRVFVQUxTX1ZBTFVFOgotCQkJCXJldHVybiBJTl9HUkVBVEVSX0VRVUFMUzsKLQkJCWNhc2UgSU5fRVFVQUxTX1ZBTFVFOgotCQkJCXJldHVybiBJTl9FUVVBTFM7Ci0JCQljYXNlIElOX05PVF9FUVVBTFNfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX05PVF9FUVVBTFM7Ci0JCQljYXNlIElOX1hPUl9WQUxVRToKLQkJCQlyZXR1cm4gSU5fWE9SOwotCQkJY2FzZSBJTl9BTkRfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX0FORDsKLQkJCWNhc2UgSU5fT1JfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX09SOwotCQkJY2FzZSBJTl9DT05ESVRJT05BTF9BTkRfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX0NPTkRJVElPTkFMX0FORDsKLQkJCWNhc2UgSU5fQ09ORElUSU9OQUxfT1JfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX0NPTkRJVElPTkFMX09SOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSW5maXhPcGVyYXRvcihpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0luaXRwYXJzZXJUcmVlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljMzBiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3Igc3JpCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSW5pdHBhcnNlclRyZWVNZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgSW5pdHBhcnNlclRyZWVNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2YTIwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDUvMTggMjM6MTE6MjYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0vKioKLSAqIEludGVybmFsIGNsYXNzIGZvciB0aGUgQ29uZGl0aW9uYWwgb3BlcmFuZCB0eXBlLiBOb3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtIHsKLQotCS8qKgotCSAqIFVzZWQgaW4gQ29uZGl0aW9uYWwgcHJvY2Vzc2luZy4gRmFsc2Ugb3BlcmFuZCBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ORElUSU9OQUxfRkFMU0VfVkFMVUUgPSAwOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUgQ09ORElUSU9OQUxfRkFMU0UgPSBuZXcgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlKENPTkRJVElPTkFMX0ZBTFNFX1ZBTFVFLAotCQkJIkNvbmRpdGlvbmFsIEZhbHNlIE9wZXJhbmQgRmxhZyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVc2VkIGluIENvbmRpdGlvbmFsIHByb2Nlc3NpbmcuIFRydWUgb3BlcmFuZCBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ORElUSU9OQUxfVFJVRV9WQUxVRSA9IDE7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBDT05ESVRJT05BTF9UUlVFID0gbmV3IEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZShDT05ESVRJT05BTF9UUlVFX1ZBTFVFLAotCQkJIkNvbmRpdGlvbmFsIFRydWUgT3BlcmFuZCBGbGFnIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVzZWQgaW4gQ29uZGl0aW9uYWwgcHJvY2Vzc2luZy4gVGVzdCBvcGVyYW5kIG9uIGV4cHJlc3Npb24gc3RhY2sKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT05ESVRJT05BTF9URVNUX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIENPTkRJVElPTkFMX1RFU1QgPSBuZXcgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlKENPTkRJVElPTkFMX1RFU1RfVkFMVUUsCi0JCQkiQ29uZGl0aW9uYWwgVGVzdCBPcGVyYW5kIEZsYWciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbnVtIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBDT05ESVRJT05BTF9GQUxTRV9WQUxVRToKLQkJCQlyZXR1cm4gQ09ORElUSU9OQUxfRkFMU0U7Ci0JCQljYXNlIENPTkRJVElPTkFMX1RSVUVfVkFMVUU6Ci0JCQkJcmV0dXJuIENPTkRJVElPTkFMX1RSVUU7Ci0JCQljYXNlIENPTkRJVElPTkFMX1RFU1RfVkFMVUU6Ci0JCQkJcmV0dXJuIENPTkRJVElPTkFMX1RFU1Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEV4cHJlc3Npb25Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsRXhwcmVzc2lvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmN2QzZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsRXhwcmVzc2lvblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJbnRlcm5hbEV4cHJlc3Npb25Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLSAKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGZvciBleHByZXNzaW9uIHByb3hpZXMgaW4gdGhlIGV2YWx1YXRpb24gc2lkZSAoaW4ge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRXhwcmVzc2lvblByb2Nlc3Nlcn0pLgotICogPHA+Ci0gKiBJdCBpcyBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBvbmx5IGJ5IHVzZXJzIG9mIHRoZSBFeHByZXNzaW9uUHJvY2Vzc29yLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBpZCBvZiB0aGUgcHJveHkuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJveHlJRCgpOwotCQotCS8qKgotCSAqIENhbGxlZCBieSBFeHByZXNzaW9uUHJvY2Vzc2VyIHRvIGdpdmUgdGhlIGV4cHJlc3Npb24gcHJveHkgaXRzIHZhbHVlIGFuZCB0eXBlLCBpLmUuIGl0IGhhcyBiZWVuIGV2YWx1YXRlZC4KLQkgKiA8cD4KLQkgKiBUaGUgdHlwZSBtYXkgbm90IGJlIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgdmFsdWUsIGl0IG1heSBiZSBhIHN1cGVyY2xhc3Mgb2YgaXQuIEl0IGlzIHRoZSB0eXBlIHRoYXQgdGhlIHByb3h5Ci0JICogcmVwcmVzZW50cyBmcm9tIHRoZSByZXR1cm4gb2YgdGhlIGV4cHJlc3Npb24uIEZvciBpbnN0YW5jZSBpdCBtYXkgb2YgcmV0dXJuZWQgbnVsbCBidXQgaXQgaXMgc3VwcG9zZWQgdG8gYmUKLQkgKiBqYXZhLmxhbmcuU3RyaW5nLiBPciBpdCBpcyBzdXBwb3NlZCB0byBiZSBhIHByaW1pdGl2ZSBpbnQsIHNpbmNlIHdlIGNhbid0IHN0b3JlIHRoYXQsIHdlIG5lZWQgdG8gc3RvcmUKLQkgKiBhbiBJbnRlZ2VyIHZhbHVlIHdpdGggdGhlIHR5cGUgaW5kaWNhdGluZyBpdCBpcyBJbnRlcmdlci5UWVBFLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSB0eXBlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJveHkoT2JqZWN0IHZhbHVlLCBDbGFzcyB0eXBlKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm94eS4gCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHZhbHVlIG1heSBiZSBhIHtAbGluayBWYXJpYWJsZVJlZmVyZW5jZX0sIGluIHdoaWNoCi0JICogY2FzZSBmdXJ0aGVyIGRlcmVmZXJlbmNpbmcgbWF5IGJlIHdpdGggdGhlIHJldHVybmVkIHZhbHVlLgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm94eSwgaXQgbWF5IGJlIGFuIEV4cHJlc3Npb25Qcm9jZXNzZXIuVmFyaWFibGVSZWZlcmVuY2UuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgdHlwZSBvZiB0aGUgcHJveHkuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjc2V0UHJveHkoT2JqZWN0LCBDbGFzcykgZm9yIHdoYXQgdHlwZSBtZWFucy4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb3h5IGhhcyBoYWQgYSB2YWx1ZS9jbGFzcyBzZXQgaW50byBpdCB5ZXQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBoYXMgYmVlbiBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsRXhwcmVzc2lvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTM1ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsRXhwcmVzc2lvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0vKioKLSAqIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIGNvbW11bmljYXRpbmcgYmV0d2VlbiB0aGUgSURFIGFuZCB0aGUgcHJveHkgc2lkZSBmb3IgZXhwcmVzc2lvbiBldmFsdWF0aW9uLiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgZXh0ZW5kcyBBYnN0cmFjdEVudW0gewotCi0JLyoqCi0JICogQVJSQVkgQUNDRVNTIEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBUlJBWV9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRSA9IDE7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEFSUkFZX0FDQ0VTU19FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKEFSUkFZX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkFycmF5IEFjY2VzcyBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFSUkFZIENSRUFUSU9OIEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBUlJBWV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgQVJSQVlfQ1JFQVRJT05fRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhBUlJBWV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkFycmF5IENyZWF0aW9uIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQVJSQVkgSU5JVElBTElaRVIgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFSUkFZX0lOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUUgPSAzOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBBUlJBWV9JTklUSUFMSVpFUl9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKEFSUkFZX0lOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQXJyYXkgSW5pdGlhbGl6ZXIgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDQVNUIEV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0FTVF9FWFBSRVNTSU9OX1ZBTFVFID0gNDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgQ0FTVF9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKENBU1RfRVhQUkVTU0lPTl9WQUxVRSwgIkNhc3QgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDT05ESVRJT05BTCBleHByZXNzaW9uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9WQUxVRSA9IDU7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIENPTkRJVElPTkFMX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJDb25kaXRpb25hbCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENMQVNTIElOU1RBTkNFIENSRUFUSU9OIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTEFTU19JTlNUQU5DRV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFID0gNjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcygKLQkJCUNMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX0VYUFJFU1NJT05fVkFMVUUsICJDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbiBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZJRUxEIEFDQ0VTUyBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZJRUxEX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFID0gNzsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgRklFTERfQUNDRVNTX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoRklFTERfQUNDRVNTX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiRmllbGQgQWNjZXNzIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSU5TVEFOQ0VPRiBFeHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElOU1RBTkNFT0ZfRVhQUkVTU0lPTl9WQUxVRSA9IDg7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIElOU1RBTkNFT0ZfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhJTlNUQU5DRU9GX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiSW5zdGFuY2VvZiBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkZJWF9FWFBSRVNTSU9OX1ZBTFVFID0gOTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgSU5GSVhfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhJTkZJWF9FWFBSRVNTSU9OX1ZBTFVFLCAiSW5maXggRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBNZXRob2QgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRVRIT0RfRVhQUkVTU0lPTl9WQUxVRSA9IDEwOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBNRVRIT0RfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhNRVRIT0RfRVhQUkVTU0lPTl9WQUxVRSwgIk1ldGhvZCBJbnZva2UgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmaXggZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBSRUZJWF9FWFBSRVNTSU9OX1ZBTFVFID0gMTE7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFBSRUZJWF9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFBSRUZJWF9FWFBSRVNTSU9OX1ZBTFVFLCAiUHJlZml4IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHVzaCB0byBwcm94eSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBVU0hfVE9fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSA9IDEyOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBQVVNIX1RPX1BST1hZX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoUFVTSF9UT19QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggdG8gUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQdXNoIEJlYW5UeXBlIGV4cHJlc3Npb24gcHJveHkgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQVVNIX0JFQU5UWVBFX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFID0gMTM7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBQVVNIX0JFQU5UWVBFX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFBVU0hfQkVBTlRZUEVfRVhQUkVTU0lPTlBST1hZX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiUHVzaCBCZWFuVHlwZSBFeHByZXNzaW9uUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBUeXBlIHJlY2VpdmVyIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFlQRVJFQ0VJVkVSX0VYUFJFU1NJT05fVkFMVUUgPSAxNDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgVFlQRVJFQ0VJVkVSX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoVFlQRVJFQ0VJVkVSX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiVHlwZSBSZWNlaXZlciBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFzc2lnbm1lbnQgdG8gYW4gRXhwcmVzc2lvblByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVNTSUdOTUVOVF9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFID0gMTU7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEFTU0lHTk1FTlRfUFJPWFlfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhBU1NJR05NRU5UX1BST1hZX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQXNzaWdubWVudCB0byBQcm94eSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggZXhwcmVzc2lvbiBwcm94eSB2YWx1ZSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBVU0hfVE9fRVhQUkVTU0lPTl9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFID0gMTY7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFBVU0hfVE9fRVhQUkVTU0lPTl9QUk9YWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKAotCQkJUFVTSF9UT19FWFBSRVNTSU9OX1BST1hZX0VYUFJFU1NJT05fVkFMVUUsICJQdXNoIHRvIEV4cHJlc3Npb24gUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBc3NpZ25tZW50IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVNTSUdOTUVOVF9FWFBSRVNTSU9OX1ZBTFVFID0gMTc7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEFTU0lHTk1FTlRfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhBU1NJR05NRU5UX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQXNzaWdubWVudCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJsb2NrIEVuZCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJMT0NLX0JFR0lOX0VYUFJFU1NJT05fVkFMVUUgPSAxODsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEJMT0NLX0JFR0lOX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQkxPQ0tfQkVHSU5fRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJCZWdpbiBibG9jayBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJsb2NrIEVuZCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJMT0NLX0JSRUFLX0VYUFJFU1NJT05fVkFMVUUgPSAxOTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEJMT0NLX0JSRUFLX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQkxPQ0tfQlJFQUtfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJCcmVhayBibG9jayBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJsb2NrIEVuZCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJMT0NLX0VORF9FWFBSRVNTSU9OX1ZBTFVFID0gMjA7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBCTE9DS19FTkRfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhCTE9DS19FTkRfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJFbmQgYmxvY2sgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUcnkgQmVnaW4gZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBUUllfQkVHSU5fRVhQUkVTU0lPTl9WQUxVRSA9IDIxOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgVFJZX0JFR0lOX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoVFJZX0JFR0lOX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQmVnaW4gdHJ5IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVHJ5IENhdGNoIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFJZX0NBVENIX0VYUFJFU1NJT05fVkFMVUUgPSAyMjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRSWV9DQVRDSF9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFRSWV9DQVRDSF9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlRyeSBjYXRjaCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUcnkgRmluYWxseSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRSWV9GSU5BTExZX0VYUFJFU1NJT05fVkFMVUUgPSAyMzsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRSWV9GSU5BTExZX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoVFJZX0ZJTkFMTFlfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJUcnkgZmluYWxseSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRyeSBFbmQgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBUUllfRU5EX0VYUFJFU1NJT05fVkFMVUUgPSAyNDsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRSWV9FTkRfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhUUllfRU5EX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiRW5kIHRyeSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaHJvdyBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRIUk9XX0VYUFJFU1NJT05fVkFMVUUgPSAyNTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRIUk9XX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoVEhST1dfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJUaHJvdyBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldGhyb3cgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBSRVRIUk9XX0VYUFJFU1NJT05fVkFMVUUgPSAyNjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFJFVEhST1dfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhSRVRIUk9XX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiUmV0aHJvdyBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggTWV0aG9kIExvb2t1cCBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUFVTSF9NRVRIT0RfRVhQUkVTU0lPTlBST1hZX0VYUFJFU1NJT05fVkFMVUUgPSAyNzsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFBVU0hfTUVUSE9EX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFBVU0hfTUVUSE9EX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggTWV0aG9kIEV4cHJlc3Npb25Qcm94eSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggRmllbGQgTG9va3VwIGV4cHJlc3Npb24gcHJveHkgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQVVNIX0ZJRUxEX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFID0gMjg7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBQVVNIX0ZJRUxEX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFBVU0hfRklFTERfRVhQUkVTU0lPTlBST1hZX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiUHVzaCBGaWVsZCBFeHByZXNzaW9uUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQdXNoIElmL2Vsc2UgKHRoZSBjbGF1c2VzKSBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUZfRUxTRV9FWFBSRVNTSU9OX1ZBTFVFID0gMjk7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBJRl9FTFNFX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoSUZfRUxTRV9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggSWYvZWxzZSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggSWYvZWxzZSBjb25kaXRpb24gdGVzdCBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUZfVEVTVF9FWFBSRVNTSU9OX1ZBTFVFID0gMzA7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBJRl9URVNUX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoSUZfVEVTVF9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggSWYgVGVzdCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogUHVzaCBuZXcgaW5zdGFuY2UgZnJvbSBpbml0IHN0cmluZyBwcm94eSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5FV19JTlNUQU5DRV9WQUxVRSA9IDMxOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgTkVXX0lOU1RBTkNFID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKE5FV19JTlNUQU5DRV9WQUxVRSwKLQkJCSJQdXNoIE5ldyBJbnN0YW5jZSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogUHVzaCBtYXJrIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUFSS19WQUxVRSA9IDMyOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgTUFSSyA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhNQVJLX1ZBTFVFLAotCQkJIlB1c2ggTWFyayBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggZW5kIG1hcmsgcHJveHkgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTkRNQVJLX1ZBTFVFID0gMzM7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBFTkRNQVJLID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKEVORE1BUktfVkFMVUUsCi0JCQkiUHVzaCBFbmQgTWFyayBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN1YmV4cHJlc3Npb24gRW5kIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1VCRVhQUkVTU0lPTl9CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFID0gMzQ7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBTVUJFWFBSRVNTSU9OX0JFR0lOX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoU1VCRVhQUkVTU0lPTl9CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkJlZ2luIFN1YmV4cHJlc3Npb24gRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdWJleHByZXNzaW9uIEVuZCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNVQkVYUFJFU1NJT05fRU5EX0VYUFJFU1NJT05fVkFMVUUgPSAzNTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFNVQkVYUFJFU1NJT05fRU5EX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoU1VCRVhQUkVTU0lPTl9FTkRfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJFbmQgU3ViZXhwcmVzc2lvbiBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwcml2YXRlIEludGVybmFsRXhwcmVzc2lvblR5cGVzKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0OGE0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wNS8xOCAyMzoxMToyNiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MgZm9yIHRoZSBJZi9lbHNlIG9wZXJhbmQgdHlwZS4gTm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW0gewotCi0JLyoqCi0JICogVXNlZCBpbiBJZi9lbHNlIHByb2Nlc3NpbmcuIEZhbHNlIGNsYXVzZSBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRUxTRV9DTEFVU0VfVkFMVUUgPSAwOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIEVMU0VfQ0xBVVNFID0gbmV3IEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUoRUxTRV9DTEFVU0VfVkFMVUUsCi0JCQkiRWxzZSBDbGF1c2UgRmxhZyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVc2VkIGluIElmL2Vsc2UgcHJvY2Vzc2luZy4gSWYgb3BlcmFuZCBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFJVRV9DTEFVU0VfVkFMVUUgPSAxOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIFRSVUVfQ0xBVVNFID0gbmV3IEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUoVFJVRV9DTEFVU0VfVkFMVUUsCi0JCQkiSWYgVHJ1ZSBDbGF1c2UgRmxhZyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVudW0gZm9yIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBFTFNFX0NMQVVTRV9WQUxVRToKLQkJCQlyZXR1cm4gRUxTRV9DTEFVU0U7Ci0JCQljYXNlIFRSVUVfQ0xBVVNFX1ZBTFVFOgotCQkJCXJldHVybiBUUlVFX0NMQVVTRTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmMjBkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDUvMTggMjM6MTE6MjYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotIAotCi0vKioKLSAqIEludGVybmFsIGNsYXNzIGZvciB0aGUgUHJlZml4IG9wZXJhbmQgdHlwZS4gTm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW0gewotCi0JLyoqCi0JICogVXNlZCBpbiBJbmZpeCBwcm9jZXNzaW5nLiBMZWZ0IG9wZXJhbmQgb24gZXhwcmVzc2lvbiBzdGFjawotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElORklYX0xFRlRfT1BFUkFORF9WQUxVRSA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUgSU5GSVhfTEVGVF9PUEVSQU5EID0gbmV3IEludGVybmFsSW5maXhPcGVyYW5kVHlwZShJTkZJWF9MRUZUX09QRVJBTkRfVkFMVUUsICJJbmZpeCBMZWZ0IE9wZXJhbmQgRmxhZyIpOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVXNlZCBpbiBJbmZpeCBwcm9jZXNzaW5nLiBPdGhlciBvcGVyYW5kIChidXQgbm90IGxhc3QpIG9uIGV4cHJlc3Npb24gc3RhY2sKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkZJWF9PVEhFUl9PUEVSQU5EX1ZBTFVFID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsSW5maXhPcGVyYW5kVHlwZSBJTkZJWF9PVEhFUl9PUEVSQU5EID0gbmV3IEludGVybmFsSW5maXhPcGVyYW5kVHlwZShJTkZJWF9PVEhFUl9PUEVSQU5EX1ZBTFVFLAotCSJJbmZpeCBPdGhlciBPcGVyYW5kIEZsYWciKTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFVzZWQgaW4gSW5maXggcHJvY2Vzc2luZy4gUmlnaHRtb3N0IChsYXN0KSBvcGVyYW5kIG9uIGV4cHJlc3Npb24gc3RhY2sKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkZJWF9MQVNUX09QRVJBTkRfVkFMVUUgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIElORklYX0xBU1RfT1BFUkFORCA9IG5ldyBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUoSU5GSVhfTEFTVF9PUEVSQU5EX1ZBTFVFLCAiSW5maXggTGFzdCBPcGVyYW5kIEZsYWciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbnVtIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBJTkZJWF9MQVNUX09QRVJBTkRfVkFMVUU6Ci0JCQkJcmV0dXJuIElORklYX0xBU1RfT1BFUkFORDsKLQkJCWNhc2UgSU5GSVhfTEVGVF9PUEVSQU5EX1ZBTFVFOgotCQkJCXJldHVybiBJTkZJWF9MRUZUX09QRVJBTkQ7Ci0JCQljYXNlIElORklYX09USEVSX09QRVJBTkRfVkFMVUU6Ci0JCQkJcmV0dXJuIElORklYX09USEVSX09QRVJBTkQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL05vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZTZhNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL05vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wNy8yMCAxOToyNzoyNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0gCi0KLS8qKgotICogVGhlIGV4cHJlc3Npb24gKG9yIHNvbWUgbmVzdGVkIGV4cHJlc3Npb24pIGRpZCBub3QgcmV0dXJuIGEgdmFsdWUuIEkuZS4gaXQgd2FzIDxjb2RlPnZvaWQ8L2NvZGU+LgotICogVGhpcyB3b3VsZCBvY2N1ciBvbmx5IGlmIHRoZSB2YWx1ZSBvZiBleHByZXNzaW9uIHdhcyBiZWluZyByZXRyaWV2ZWQgdGhyb3VnaCBnZXRFeHByZXNzaW9uVmFsdWUsCi0gKiBvciBpZiBhIG5lc3RlZCBleHByZXNzaW9uIHdhcyB1c2VkLCBzaW5jZSBpbiB0aGF0IGNhc2UgdGhlIHZhbHVlIHdvdWxkIG9mIGJlZW4gdXNlZCBhcyBhbgotICogYXJndW1lbnQgb3IgcmVjZWl2ZXIgdG8gYW5vdGhlciBleHByZXNzaW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03OTUzMTAxODY3NzgyNDE3OTY0TDsKLQkKLQlwcml2YXRlIEludGVybmFsRXhwcmVzc2lvblByb3h5IHByb3h5OwotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggbm8gYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGEgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzKG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIG1lc3NhZ2UgYW5kIGEgcHJveHkuIFRoaXMgaXMgb25seSB1c2VkIGZyb20ge0BsaW5rIEV4cHJlc3Npb25Qcm9jZXNzZXIjZ2V0RXhwcmVzc2lvblByb3h5VmFsdWUoaW50LCBPYmplY3RbXSl9IHdoZW4KLQkgKiB0aGUgcHJveHkgZXhpc3RlZCBidXQgaXQgd2FzIG5vdCBzZXQuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEludGVybmFsRXhwcmVzc2lvblByb3h5IHByb3h5KSB7Ci0JCXN1cGVyIChtZXNzYWdlKTsKLQkJdGhpcy5wcm94eSA9IHByb3h5OwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHByb3h5IGlmIHRoZXJlIGlzIG9uZS4gSXQgd2lsbCBiZSBhIHByb3h5IGlmIHtAbGluayBFeHByZXNzaW9uUHJvY2Vzc2VyI2dldEV4cHJlc3Npb25Qcm94eVZhbHVlKGludCwgT2JqZWN0W10pfQotCSAqIHdhcyBmb3IgYW4gZXhpc3RpbmcgcHJveHkgYnV0IHRoYXQgcHJveHkgd2FzIG5vdCBzZXQuIE90aGVyd2lzZSBpdCB3aWxsIGJlIG51bGwuIFRoaXMgaXMgaGVyZSBmb3IgY2FsbGVycyB0bwotCSAqIHB1dCBzcGVjaWFsIGluZm8gaW4gdGhlIHByb3h5IGZvciB0aGUgbm90IHNldCBjb25kaXRpb24gYW5kIHJlcG9ydCBiZXR0ZXIgaW5mby4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm94eSAoaWYgbm90IHNldCkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJveHkgYXZhaWxhYmxlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSBnZXRQcm94eSgpIHsKLQkJcmV0dXJuIHByb3h5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvUHJlZml4T3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9QcmVmaXhPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWUwYTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9QcmVmaXhPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFByZWZpeE9wZXJhdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDUvMTggMjM6MTE6MjYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0vKioKLSAqIEVudW0gZm9yIHByZWZpeCBvcGVyYXRvci4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmaXhPcGVyYXRvciBleHRlbmRzIEFic3RyYWN0RW51bSB7Ci0KLQkvKioKLQkgKiBQcmVmaXggcGx1cyAiKyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfUExVU19WQUxVRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZpeE9wZXJhdG9yIFBSRV9QTFVTID0gbmV3IFByZWZpeE9wZXJhdG9yKFBSRV9QTFVTX1ZBTFVFLCAiUHJlZml4ICsiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZml4IG1pbnVzICItIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9NSU5VU19WQUxVRSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZpeE9wZXJhdG9yIFBSRV9NSU5VUyA9IG5ldyBQcmVmaXhPcGVyYXRvcihQUkVfTUlOVVNfVkFMVUUsICJQcmVmaXggLSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmaXggYml0d2lzZSBjb21wbGVtZW50ICJ+IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9DT01QTEVNRU5UX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZml4T3BlcmF0b3IgUFJFX0NPTVBMRU1FTlQgPSBuZXcgUHJlZml4T3BlcmF0b3IoUFJFX0NPTVBMRU1FTlRfVkFMVUUsICJQcmVmaXggfiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmaXggbG9naWNhbCBub3QgIiEiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX05PVF9WQUxVRSA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZpeE9wZXJhdG9yIFBSRV9OT1QgPSBuZXcgUHJlZml4T3BlcmF0b3IoUFJFX05PVF9WQUxVRSwgIlByZWZpeCAhIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZml4IG9wZXJhdG9yIGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVmaXhPcGVyYXRvciBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgUFJFX1BMVVNfVkFMVUU6Ci0JCQkJcmV0dXJuIFBSRV9QTFVTOwotCQkJY2FzZSBQUkVfTUlOVVNfVkFMVUU6Ci0JCQkJcmV0dXJuIFBSRV9NSU5VUzsKLQkJCWNhc2UgUFJFX0NPTVBMRU1FTlRfVkFMVUU6Ci0JCQkJcmV0dXJuIFBSRV9DT01QTEVNRU5UOwotCQkJY2FzZSBQUkVfTk9UX1ZBTFVFOgotCQkJCXJldHVybiBQUkVfTk9UOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUHJlZml4T3BlcmF0b3IoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL1ZhcmlhYmxlUmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvVmFyaWFibGVSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1ZjJiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvVmFyaWFibGVSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFZhcmlhYmxlUmVmZXJlbmNlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotIAotCi0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyBhIFZhcmlhYmxlIFJlZmVyZW5jZSB2YWx1ZS4gQSB2YXJpYWJsZSByZWZlcmVuY2UgdmFsdWUgY2FuIGJlIG9uIHRoZSBsZWZ0Ci0gKiBzaWRlIG9mIGFuIGFzc2lnbm1lbnQgKGUuZy4gZmllbGQgb3IgYXJyYXkgYWNjZXNzKSBvciBvbiBhbnkgc2lkZQotICogb2YgYW55IGV4cHJlc3Npb24uIFdoZW4gb24gdGhlIGxlZnQgc2lkZSBvZiBhbiBhc3NpZ25tZW50LCB0aGVuIHRoZQotICogdmFsdWUgY2FuIGFzc2lnbmVkIHRvLiBTdWNoIGFzIDxjb2RlPnhbM10gPSA0PC9jb2RlPi4gT3IgaXQgaXMgdmFsdWUKLSAqIHRoYXQgY2FuIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMsIHN1Y2ggYXMgPGNvZGU+eFszXSArIDI8L2NvZGU+LgotICogPHA+Ci0gKiBXaGVuIGRlcmVmZXJlbmNlZCwgdGhlIHZhbHVlIGlzIGdpdmVuIChzZWUge0BsaW5rIFZhcmlhYmxlUmVmZXJlbmNlI2RlcmVmZXJlbmNlKCl9KSBhcwotICogdGhlIHJlc3VsdCBvciBpdCBpcyBzZXQgd2l0aCBhIHZhbHVlIGFuZCB0aGVuIGRlZmVyZW5jZWQgKHNlZSB7QGxpbmsgVmFyaWFibGVSZWZlcmVuY2Ujc2V0KE9iamVjdCwgQ2xhc3MpfSkuCi0gKiA8cD4KLSAqIFRoZSB0eXBlIG9mIHRoZSByZWZlcmVuY2UgaXMgdGhlIHR5cGUgc3RvcmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb25UeXBlU3RhY2sgZW50cnkuIFRoaXMgaXMgdGhlIHR5cGUKLSAqIGZvciBhc3NpZ25tZW50LCBhbmQgdGhlIHR5cGUgZm9yIGRlcmVmZXJlbmNlZC4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVSZWZlcmVuY2UgewotCi0JLyoqCi0JICogRGVyZWZlcmVuY2UgdGhlIHZhbHVlLiAKLQkgKiBAcmV0dXJuIHRoZSBkZXJlZmVyZW5jZWQgdmFsdWUuIFN1Y2ggYXMgdGhlIHJlc3VsdCBvZiA8Y29kZT54WzNdPC9jb2RlPi4gVGhlIHR5cGUgb2YgdGhlIHJlZmVyZW5jZSAKLQkgKiBpcyB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblR5cGVTdGFjayBlbnRyeSBmb3IgdGhpcyByZWZlcmVuY2UuCi0JICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGRlcmVmZXJlbmNlKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBpbnRvIHRoZSB2YXJpYWJsZSBhbmQgZGVyZWZlcmVuY2UgaXQuIE9uY2UgaXQgaXMgc2V0IGl0IGlzCi0JICogbm8gbG9uZ2VyIGEgcmVmZXJlbmNlIGFuZCBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KLQkgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gc2V0IHRvLgotCSAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIHNldC4gSXQgbWF5IGJlIG9mIHVzZSB0byB0aGUgcmVmZXJlbmNlIG9yIG1heWJlIG5vdC4KLQkgKiBAcmV0dXJuIHRoZSBkZXJlZmVyZW5jZWQgdmFsdWUgYWZ0ZXIgYmVpbmcgc2V0LiBUaGUgdHlwZSBvZiB0aGUgZGVyZWZlcmVuY2VkIHZhbHVlIAotCSAqIGlzIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uVHlwZVN0YWNrIGVudHJ5IGZvciB0aGlzIHJlZmVyZW5jZS4KLQkgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3Qgc2V0KE9iamVjdCB2YWx1ZSwgQ2xhc3MgdHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNjg0MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRXhwcmVzc2lvblByb2Nlc3Nlci5DYW5ub3RDYXN0WFRvWV9FWENfICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE1NkUgQ2Fubm90IGNhc3QgInswfSIgdG8gYmUgInsxfSIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLkludmFsaWRPcGVyYW5kT2ZQcmVmaXhPcGVyYXRvcl9FWENfICAgICAgICAgICA9IElXQVYwMTU3RSB7MH0gbm90IHZhbGlkIGFzIHRoZSBvcGVyYW5kIG9mIHByZWZpeCBvcGVyYXRvciAiezF9Ii4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuUG9wRXhwcmVzc2lvblR5cGUuRXhwcmVzc2lvblZvaWRfRVhDXz1FeHByZXNzaW9uIHdhcyB2b2lkLgotRXhwcmVzc2lvblByb2Nlc3Nlci5JbnZhbGlkT3BlcmFuZE9mT3BlcmF0b3JfRVhDXyAgICAgICAgICAgICAgICAgPSBJV0FWMDE1OEUgezB9IG5vdCB2YWxpZCBhcyB0aGUgb3BlcmFuZCBvZiBvcGVyYXRvciAiezF9Ii4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuWElzR3JlYXRlclRoYW5OdW1iZXJPZkRpbWVuc2lvbnNJbkFycmF5X0VYQ18gID0gSVdBVjAxNTlFIHswfSBpcyBncmVhdGVyIHRoZW4gbnVtYmVyIG9mIGRpbWVuc2lvbnMgKHsxfSkgaW4gdGhlIGFycmF5Ci1FeHByZXNzaW9uUHJvY2Vzc2VyLkNyZWF0ZUFycmF5QWNjZXNzUmVmZXJlbmNlLk91dE9mQm91bmRzX0VYQ189SW5kZXg6IHswfSBzaXplOnsxfQotRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoVHJ5RW5kLlRyeUVuZFJlY2VpdmVkT3V0T2ZPcmRlcl9FWENfPVRyeS9lbmQgcmVjZWl2ZWQgb3V0IG9mIG9yZGVyLgotRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoRW5kbWFyay5FbmRNYXJrT25Ob25FeGlzdGluZ0lEX0VYQ189VHJpZWQgdG8gZG8gYW4gZW5kIG1hcmsgb24gYSBub24tZXhpc3RpbmcgbWFya0lEICh7MH0pCi1FeHByZXNzaW9uUHJvY2Vzc2VyLk5vdEFuQXJyYXlfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTYwRSAiezB9IiBpcyBub3QgYW4gYXJyYXkuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLkFycmF5dHlwZUhhc0Zld2VyRGltZW5zaW9uc1RoYW5SZXF1ZXN0ZWRfRVhDXyA9IElXQVYwMTYxRSBBcnJheXR5cGUgInswfSIgaGFzIGZld2VyIGRpbWVuc2lvbnMgdGhhbiBjcmVhdGlvbiByZXF1ZXN0ZWQgKHsxfSkuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLkNyZWF0ZUZpZWxkQWNjZXNzUmVmZXJlbmNlLkZpZWxkc1R5cGVzTm90TWF0Y2hpbmdfRVhDXz1GaWVsZCByZWNlaXZlciBkb2VzIG5vdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgZmllbGQ6IEZpZWxkOiB7MH0gcmVjZWl2ZXI6IHsxfQotRXhwcmVzc2lvblByb2Nlc3Nlci5HZXRFeHByZXNzaW9uUHJveHlWYWx1ZS5FeHByZXNzaW9uUHJveHlOb3RTZXRfRVhDXz1FeHByZXNzaW9uIFByb3h5IG5ldmVyIHNldC4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuR2V0RXhwcmVzc2lvblByb3h5VmFsdWUuRXhwcmVzc2lvblByb3h5RG9lc250RXhpc3RfRVhDXz1FeHByZXNzaW9uIHByb3h5IGRvZXNuJ3QgZXhpc3QuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hCbG9ja0VuZC5SZWNlaXZlZEVuZEJsb2Nrc091dE9mT3JkZXJfRVhDXz1FbmQgQmxvY2tzIHJlY2VpdmVkIG91dCBvZiBvcmRlci4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeUNhdGNoQ2xhdXNlLkNhdGNoUmVjZWl2ZWRPdXRPZk9yZGVyX0VYQ189Q2F0Y2ggcmVjZWl2ZWQgb3V0IG9mIG9yZGVyLgotRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoVHJ5RmluYWxseUNsYXVzZS5GaW5hbGx5UmVjZWl2ZWRPdXRPZk9yZGVyX0VYQ189RmluYWxseSByZWNlaXZlZCBvdXQgb2Ygb3JkZXIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlSZXRocm93LlJldGhyb3dSZWNlaXZlZE91dE9mT3JkZXJfRVhDXz1SZXRocm93IHJlY2VpdmVkIG91dCBvZiBvcmRlci4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeVJldGhyb3cuUmV0cnlSZWNlaXZlZE91dE9mRXhlY3V0aW5nQ2F0Y2hDbGF1c2VfRVhDXz1SZXRyeSByZWNlaXZlZCBvdXRzaWRlIG9mIGFuIGV4ZWN1dGluZyBjYXRjaCBjbGF1c2UKLUV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFN1YmV4cHJlc3Npb25FbmQuUmVjZWl2ZWRFbmRTdWJleHByZXNzaW9uc091dE9mT3JkZXJfRVhDXz1FbmQgU3ViZXhwcmVzc2lvbnMgcmVjZWl2ZWQgb3V0IG9mIG9yZGVyLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3ZGZjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wbHVnaW4ucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJAotIwotCi0KLXBsdWdpbk5hbWU9SmF2YSBFTUYgTW9kZWwgUHJveHkgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLWNvbnRyaWJ1dG9ycy5leHRlbnNpb25wb2ludC5uYW1lPVByb3h5IGNvbmZpZ3VyYXRpb24gY29udHJpYnV0b3JzCi1leHRlbnNpb25zLmV4dGVuc2lvbnBvaW50Lm5hbWU9UHJveHkgY29uZmlndXJhdGlvbiBleHRlbnNpb24gcmVnaXN0cmF0aW9ucwotTGF1bmNoLmxvY2FsUHJveHk9TG9jYWwgUHJveHkgQXBwbGljYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTc0YjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb250cmlidXRvcnMiIG5hbWU9IiVjb250cmlidXRvcnMuZXh0ZW5zaW9ucG9pbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvY29udHJpYnV0b3JzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dGVuc2lvbnMiIG5hbWU9IiVleHRlbnNpb25zLmV4dGVuc2lvbnBvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL2V4dGVuc2lvbnMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZXMiPgotICAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgICAgICBuYW1lPSIlTGF1bmNoLmxvY2FsUHJveHkiCi0gICAgICAgICAgICBkZWxlZ2F0ZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5Mb2NhbFByb3h5TGF1bmNoRGVsZWdhdGUiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuamVtLnByb3h5IgotICAgICAgICAgICAgbW9kZXM9InJ1biIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkuTG9jYWxQcm94eUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICAgc291cmNlTG9jYXRvcklkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnNvdXJjZUxvY2F0b3IuSmF2YVNvdXJjZUxvb2t1cERpcmVjdG9yIgotICAgICAgICAgICAgc291cmNlUGF0aENvbXB1dGVySWQ9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuc291cmNlTG9va3VwLmphdmFTb3VyY2VQYXRoQ29tcHV0ZXIiPgotICAgICAgPC9sYXVuY2hDb25maWd1cmF0aW9uVHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5LmphcnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS5qYXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGFlZGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5LmphcnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXByb3h5Y29tbW9uLmphcj0vb3JnLmVjbGlwc2UuamVtLnByb3h5L2NvbW1vbl9iaW4vCi1pbml0cGFyc2VyLmphcj0vb3JnLmVjbGlwc2UuamVtLnByb3h5L2NvbW1vbl9iaW4vCi1yZW1vdGVjb21tb24uamFyPS9vcmcuZWNsaXBzZS5qZW0ucHJveHkvY29tbW9uX2Jpbi8KLXZtL3JlbW90ZXZtLmphcj0vb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX2Jpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvYXd0L0lTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9hd3QvSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWUwM2ZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9hd3QvSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5RmFjdG9yeTsKLS8qKgotICogVGhlIFN0YW5kYXJkIGF3dCBiZWFuIHByb3h5IGZhY3RvcnkuCi0gKiBUaGlzIGlzIHRoZSBJbnRlcmZhY2UgdGhhdCB0aGUgZGVza3RvcCB3aWxsIHRhbGsKLSAqIHRvLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MDkgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkgZXh0ZW5kcyBJQmVhblByb3h5RmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHSVNUUllfS0VZID0gInN0YW5kYXJkLWphdmEuYXd0IjsgLy8kTk9OLU5MUy0xJAotCi0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgZGltZW5zaW9uIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElEaW1lbnNpb25CZWFuUHJveHkgY3JlYXRlRGltZW5zaW9uQmVhblByb3h5V2l0aChpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHBvaW50IGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElQb2ludEJlYW5Qcm94eSBjcmVhdGVQb2ludEJlYW5Qcm94eVdpdGgoaW50IHgsIGludCB5KTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSByZWN0YW5nbGUgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSVJlY3RhbmdsZUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9hd3QvSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2F3dC9KYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMmYyYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2F3dC9KYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBTdGFuZGFyZCBBV1QgQ29uc3RhbnRzCi0gKgotICogVXNlIHRoZSBzdGF0aWMgYWNjZXNzb3IgbWV0aG9kIChnZXRDb25zdGFudHMoKSkgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSAKLSAqIGNvbnN0YW50cyBpbnN0YW5jZSBmb3IgdGhlIHJlZ2lzdHJ5LiBUaGlzIGlzIGRvbmUgc28gdGhhdCB1bnRpbCB0aGUKLSAqIHRoZSBjb25zdGFudHMgYXJlIG5lZWRlZCwgdGhleSBhcmVuJ3QgcmVnaXN0ZXJlZC4KLSAqCi0gKiBOT1RFOiBTaW5jZSBldmVyeXRoaW5nIGluIGhlcmUganVzdCBwcm94aWVzLCB0aGVyZSBpcwotICogICAgICAgbm8gbmVlZCB0byBoYXZlIHRoZW0gc2VwYXJhdGVkIGJ5IFZNLiBUaGF0IGlzIHdoeQotICogICAgICAgdGhpcyBpbiB0aGUgUHJveHkgcGFja2FnZS4KLSAqCi0gKiBUaGlzIGlzIGZpbmFsIGJlY2F1c2UgdGhpcyBjYW4ndCBiZSBleHRlbmRlZC4gVGhpcyBzcGVjaWZpYyBvbmUKLSAqIHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBmYWN0b3J5IGZvciB0aGlzIGtleS4gQW55IGV4dGVuc2lvbnMKLSAqIG11c3QgYmUgZG9uZSBpbiB0aGVpciBvd24gY29uc3RhbnRzIGFuZCByZWdpc3RyeSBrZXkuCi0gKgotICogQ3JlYXRpb24gZGF0ZTogKDQvNy8wMCA0OjQ3OjQ4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cyB7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFJFR0lTVFJZX0tFWSA9IG5ldyBPYmplY3QoKTsKLQkJCQotCWZpbmFsIGJvb2xlYW4gQVdUTG9hZGVkOwkvLyBBV1QgbWF5IG5vdCBiZSBhdmFpbGFibGUuIFNvIG5vbi11aSBKVk0ncyBkb24ndCBoYXZlIEFXVC4KLQlmaW5hbCBib29sZWFuIEFXVFJlZ2lzdGVyZWQ7CS8vIEFXVCB3YXMgcmVnaXN0ZXJlZCB0byBiZSB1c2VkIGluIHRoaXMgVk0uIEl0IG1heSBiZSByZWdpc3RlcmVkLCBidXQgc3RpbGwgbm90IGF2YWlsYWJsZS4KLQkJCi0JZmluYWwgSUZpZWxkUHJveHkgZGltZW5zaW9uSGVpZ2h0UHJveHk7Ci0JZmluYWwgSUZpZWxkUHJveHkgZGltZW5zaW9uV2lkdGhQcm94eTsKLQlmaW5hbCBJTWV0aG9kUHJveHkgc2V0RGltZW5zaW9uU2l6ZUhXUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldERpbWVuc2lvblNpemVEUHJveHk7Ci0JCi0JZmluYWwgSUZpZWxkUHJveHkgcG9pbnRYUHJveHk7Ci0JZmluYWwgSUZpZWxkUHJveHkgcG9pbnRZUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFBvaW50TG9jYXRpb25YWVByb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXRQb2ludExvY2F0aW9uUFByb3h5OwotCQotCWZpbmFsIElGaWVsZFByb3h5IHJlY3RhbmdsZUhlaWdodFByb3h5OwotCWZpbmFsIElGaWVsZFByb3h5IHJlY3RhbmdsZVdpZHRoUHJveHk7Ci0JZmluYWwgSUZpZWxkUHJveHkgcmVjdGFuZ2xlWFByb3h5OwotCWZpbmFsIElGaWVsZFByb3h5IHJlY3RhbmdsZVlQcm94eTsKLQlmaW5hbCBJTWV0aG9kUHJveHkgc2V0UmVjdGFuZ2xlU2l6ZUhXUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFJlY3RhbmdsZVNpemVEUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFJlY3RhbmdsZUxvY2F0aW9uWFlQcm94eTsKLQlmaW5hbCBJTWV0aG9kUHJveHkgc2V0UmVjdGFuZ2xlTG9jYXRpb25QUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFJlY3RhbmdsZUJvdW5kc1hZSFdQcm94eTsKLQlmaW5hbCBJTWV0aG9kUHJveHkgc2V0UmVjdGFuZ2xlQm91bmRzUlByb3h5OwotCQotLyoqCi0gKiBHZXQgdGhlIGNvbnN0YW50cyBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCByZWdpc3RyeS4KLSAqLwotcHVibGljIHN0YXRpYyBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzIGdldENvbnN0YW50cyhQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMgY29uc3RhbnRzID0gKEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMpIHJlZ2lzdHJ5LmdldENvbnN0YW50cyhSRUdJU1RSWV9LRVkpOwotCWlmIChjb25zdGFudHMgPT0gbnVsbCkKLQkJcmVnaXN0cnkucmVnaXN0ZXJDb25zdGFudHMoUkVHSVNUUllfS0VZLCBjb25zdGFudHMgPSBuZXcgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cyhyZWdpc3RyeSwgcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeUV4dGVuc2lvbihJU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5LlJFR0lTVFJZX0tFWSkgIT0gbnVsbCkpOwotCXJldHVybiBjb25zdGFudHM7Ci19Ci0JCQotCi1wdWJsaWMgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cyhQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSwgYm9vbGVhbiBpc1JlZ2lzdGVyZWQpIHsKLQlzdXBlcigpOwotCQotCUFXVFJlZ2lzdGVyZWQgPSBpc1JlZ2lzdGVyZWQ7Ci0JaWYgKCFBV1RSZWdpc3RlcmVkKSB7Ci0JCUFXVExvYWRlZCA9IGZhbHNlOwotCQlkaW1lbnNpb25IZWlnaHRQcm94eSA9IGRpbWVuc2lvbldpZHRoUHJveHkgPSBwb2ludFhQcm94eSA9IHBvaW50WVByb3h5ID0gcmVjdGFuZ2xlSGVpZ2h0UHJveHkgPSByZWN0YW5nbGVXaWR0aFByb3h5ID0gcmVjdGFuZ2xlWFByb3h5ID0gcmVjdGFuZ2xlWVByb3h5ID0gbnVsbDsKLQkJc2V0RGltZW5zaW9uU2l6ZUhXUHJveHkgPSBzZXREaW1lbnNpb25TaXplRFByb3h5ID0gc2V0UG9pbnRMb2NhdGlvblhZUHJveHkgPSBzZXRQb2ludExvY2F0aW9uUFByb3h5ID0gc2V0UmVjdGFuZ2xlU2l6ZUhXUHJveHkgPSBzZXRSZWN0YW5nbGVTaXplRFByb3h5ID0gc2V0UmVjdGFuZ2xlTG9jYXRpb25YWVByb3h5ID0gc2V0UmVjdGFuZ2xlTG9jYXRpb25QUHJveHkgPSBzZXRSZWN0YW5nbGVCb3VuZHNYWUhXUHJveHkgPSBzZXRSZWN0YW5nbGVCb3VuZHNSUHJveHkgPSBudWxsOwkJCi0JCXJldHVybjsKLQl9Ci0JCi0JSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQotCUlCZWFuVHlwZVByb3h5IGRpbWVuc2lvblR5cGVQcm94eSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LkRpbWVuc2lvbiIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoZGltZW5zaW9uVHlwZVByb3h5ICE9IG51bGwpIHsKLQkJLy8gQVdUIGlzIGF2YWlsYWJsZS4KLQkJQVdUTG9hZGVkID0gdHJ1ZTsKLQkJSUJlYW5UeXBlUHJveHkgaW50VHlwZVByb3h5ID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiaW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWRpbWVuc2lvbkhlaWdodFByb3h5ID0gZGltZW5zaW9uVHlwZVByb3h5LmdldEZpZWxkUHJveHkoImhlaWdodCIpOy8vJE5PTi1OTFMtMSQKLQkJZGltZW5zaW9uV2lkdGhQcm94eSA9IGRpbWVuc2lvblR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJ3aWR0aCIpOy8vJE5PTi1OTFMtMSQKLQkJc2V0RGltZW5zaW9uU2l6ZUhXUHJveHkgPSBkaW1lbnNpb25UeXBlUHJveHkuZ2V0TWV0aG9kUHJveHkoInNldFNpemUiLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7aW50VHlwZVByb3h5LCBpbnRUeXBlUHJveHl9KTsgLy8kTk9OLU5MUy0xJAotCQlzZXREaW1lbnNpb25TaXplRFByb3h5ID0gZGltZW5zaW9uVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRTaXplIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge2RpbWVuc2lvblR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JCi0JCUlCZWFuVHlwZVByb3h5IHBvaW50VHlwZVByb3h5ID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKTsvLyROT04tTkxTLTEkCi0JCXBvaW50WFByb3h5ID0gcG9pbnRUeXBlUHJveHkuZ2V0RmllbGRQcm94eSgieCIpOy8vJE5PTi1OTFMtMSQKLQkJcG9pbnRZUHJveHkgPSBwb2ludFR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJ5Iik7CS8vJE5PTi1OTFMtMSQKLQkJc2V0UG9pbnRMb2NhdGlvblhZUHJveHkgPSBwb2ludFR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0TG9jYXRpb24iLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7aW50VHlwZVByb3h5LCBpbnRUeXBlUHJveHl9KTsgLy8kTk9OLU5MUy0xJAotCQlzZXRQb2ludExvY2F0aW9uUFByb3h5ID0gcG9pbnRUeXBlUHJveHkuZ2V0TWV0aG9kUHJveHkoInNldExvY2F0aW9uIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge3BvaW50VHlwZVByb3h5fSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCQotCQlJQmVhblR5cGVQcm94eSByZWN0YW5nbGVUeXBlUHJveHkgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5SZWN0YW5nbGUiKTsvLyROT04tTkxTLTEkCi0JCXJlY3RhbmdsZUhlaWdodFByb3h5ID0gcmVjdGFuZ2xlVHlwZVByb3h5LmdldEZpZWxkUHJveHkoImhlaWdodCIpOy8vJE5PTi1OTFMtMSQKLQkJcmVjdGFuZ2xlV2lkdGhQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJ3aWR0aCIpOy8vJE5PTi1OTFMtMSQKLQkJcmVjdGFuZ2xlWFByb3h5ID0gcmVjdGFuZ2xlVHlwZVByb3h5LmdldEZpZWxkUHJveHkoIngiKTsvLyROT04tTkxTLTEkCi0JCXJlY3RhbmdsZVlQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJ5Iik7Ly8kTk9OLU5MUy0xJAotCQlzZXRSZWN0YW5nbGVTaXplSFdQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0U2l6ZSIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtpbnRUeXBlUHJveHksIGludFR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JCXNldFJlY3RhbmdsZVNpemVEUHJveHkgPSByZWN0YW5nbGVUeXBlUHJveHkuZ2V0TWV0aG9kUHJveHkoInNldFNpemUiLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7ZGltZW5zaW9uVHlwZVByb3h5fSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0UmVjdGFuZ2xlTG9jYXRpb25YWVByb3h5ID0gcmVjdGFuZ2xlVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRMb2NhdGlvbiIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtpbnRUeXBlUHJveHksIGludFR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JCXNldFJlY3RhbmdsZUxvY2F0aW9uUFByb3h5ID0gcmVjdGFuZ2xlVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRMb2NhdGlvbiIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtwb2ludFR5cGVQcm94eX0pOwkJIC8vJE5PTi1OTFMtMSQKLQkJc2V0UmVjdGFuZ2xlQm91bmRzWFlIV1Byb3h5ID0gcmVjdGFuZ2xlVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRCb3VuZHMiLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7aW50VHlwZVByb3h5LCBpbnRUeXBlUHJveHksIGludFR5cGVQcm94eSwgaW50VHlwZVByb3h5fSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0UmVjdGFuZ2xlQm91bmRzUlByb3h5ID0gcmVjdGFuZ2xlVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRCb3VuZHMiLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7cmVjdGFuZ2xlVHlwZVByb3h5fSk7IC8vJE5PTi1OTFMtMSQKLQl9IGVsc2UgewotCQlBV1RMb2FkZWQgPSBmYWxzZTsKLQkJZGltZW5zaW9uSGVpZ2h0UHJveHkgPSBkaW1lbnNpb25XaWR0aFByb3h5ID0gcG9pbnRYUHJveHkgPSBwb2ludFlQcm94eSA9IHJlY3RhbmdsZUhlaWdodFByb3h5ID0gcmVjdGFuZ2xlV2lkdGhQcm94eSA9IHJlY3RhbmdsZVhQcm94eSA9IHJlY3RhbmdsZVlQcm94eSA9IG51bGw7Ci0JCXNldERpbWVuc2lvblNpemVIV1Byb3h5ID0gc2V0RGltZW5zaW9uU2l6ZURQcm94eSA9IHNldFBvaW50TG9jYXRpb25YWVByb3h5ID0gc2V0UG9pbnRMb2NhdGlvblBQcm94eSA9IHNldFJlY3RhbmdsZVNpemVIV1Byb3h5ID0gc2V0UmVjdGFuZ2xlU2l6ZURQcm94eSA9IHNldFJlY3RhbmdsZUxvY2F0aW9uWFlQcm94eSA9IHNldFJlY3RhbmdsZUxvY2F0aW9uUFByb3h5ID0gc2V0UmVjdGFuZ2xlQm91bmRzWFlIV1Byb3h5ID0gc2V0UmVjdGFuZ2xlQm91bmRzUlByb3h5ID0gbnVsbDsKLQl9Ci19Ci0KLS8qKgotICogQW5zd2VyIGlmIEFXVCBpcyBhdmFpbGFibGUuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzQVdUQXZhaWxhYmxlKCkgewotCXJldHVybiBBV1RMb2FkZWQ7Ci19Ci0KLS8qKgotICogQW5zd2VyIGlmIEFXVCB3YXMgcmVnaXN0ZXJlZCB0byBiZSBhdmFpbGFibGUuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzQVdUUmVnaXN0ZXJlZCgpIHsKLQlyZXR1cm4gQVdUUmVnaXN0ZXJlZDsKLX0KLQotCi0KLS8qKgotICogZ2V0RGltZW5zaW9uSGVpZ2h0RmllbGRQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldERpbWVuc2lvbkhlaWdodEZpZWxkUHJveHkoKSB7Ci0JcmV0dXJuIGRpbWVuc2lvbkhlaWdodFByb3h5OwotfQotLyoqCi0gKiBnZXREaW1lbnNpb25XaWR0aFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSUZpZWxkUHJveHkgZ2V0RGltZW5zaW9uV2lkdGhGaWVsZFByb3h5KCkgewotCXJldHVybiBkaW1lbnNpb25XaWR0aFByb3h5OwotfQotLyoqCi0gKiBnZXREaW1lbnNpb25TZXRTaXplV0hQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXREaW1lbnNpb25TZXRTaXplSFdQcm94eSgpIHsKLQlyZXR1cm4gc2V0RGltZW5zaW9uU2l6ZUhXUHJveHk7Ci19Ci0vKioKLSAqIGdldERpbWVuc2lvblNldFNpemVEUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGltZW5zaW9uU2V0U2l6ZURQcm94eSgpIHsKLQlyZXR1cm4gc2V0RGltZW5zaW9uU2l6ZURQcm94eTsKLX0KLQotLyoqCi0gKiBnZXRQb2ludFhGaWVsZFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSUZpZWxkUHJveHkgZ2V0UG9pbnRYRmllbGRQcm94eSgpIHsKLQlyZXR1cm4gcG9pbnRYUHJveHk7Ci19Ci0vKioKLSAqIGdldFBvaW50WUZpZWxkUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJRmllbGRQcm94eSBnZXRQb2ludFlGaWVsZFByb3h5KCkgewotCXJldHVybiBwb2ludFlQcm94eTsKLX0KLS8qKgotICogZ2V0UG9pbnRTZXRMb2NhdGlvblhZUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0UG9pbnRTZXRMb2NhdGlvblhZUHJveHkoKSB7Ci0JcmV0dXJuIHNldFBvaW50TG9jYXRpb25YWVByb3h5OwotfQotLyoqCi0gKiBnZXRQb2ludFNldExvY2F0aW9uUFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFBvaW50U2V0TG9jYXRpb25QUHJveHkoKSB7Ci0JcmV0dXJuIHNldFBvaW50TG9jYXRpb25QUHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZUhlaWdodEZpZWxkUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJRmllbGRQcm94eSBnZXRSZWN0YW5nbGVIZWlnaHRGaWVsZFByb3h5KCkgewotCXJldHVybiByZWN0YW5nbGVIZWlnaHRQcm94eTsKLX0KLS8qKgotICogZ2V0UmVjdGFuZ2xlV2lkdGhGaWVsZFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSUZpZWxkUHJveHkgZ2V0UmVjdGFuZ2xlV2lkdGhGaWVsZFByb3h5KCkgewotCXJldHVybiByZWN0YW5nbGVXaWR0aFByb3h5OwotfQotLyoqCi0gKiBnZXRSZWN0YW5nbGVYRmllbGRQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldFJlY3RhbmdsZVhGaWVsZFByb3h5KCkgewotCXJldHVybiByZWN0YW5nbGVYUHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVlGaWVsZFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSUZpZWxkUHJveHkgZ2V0UmVjdGFuZ2xlWUZpZWxkUHJveHkoKSB7Ci0JcmV0dXJuIHJlY3RhbmdsZVlQcm94eTsKLX0KLS8qKgotICogZ2V0UmVjdGFuZ2xlU2V0U2l6ZVdIUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0UmVjdGFuZ2xlU2V0U2l6ZUhXUHJveHkoKSB7Ci0JcmV0dXJuIHNldFJlY3RhbmdsZVNpemVIV1Byb3h5OwotfQotLyoqCi0gKiBnZXRSZWN0YW5nbGVTZXRTaXplRFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFJlY3RhbmdsZVNldFNpemVEUHJveHkoKSB7Ci0JcmV0dXJuIHNldFJlY3RhbmdsZVNpemVEUHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVNldExvY2F0aW9uWFlQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRSZWN0YW5nbGVTZXRMb2NhdGlvblhZUHJveHkoKSB7Ci0JcmV0dXJuIHNldFJlY3RhbmdsZUxvY2F0aW9uWFlQcm94eTsKLX0KLS8qKgotICogZ2V0UmVjdGFuZ2xlU2V0TG9jYXRpb25QUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0UmVjdGFuZ2xlU2V0TG9jYXRpb25QUHJveHkoKSB7Ci0JcmV0dXJuIHNldFJlY3RhbmdsZUxvY2F0aW9uUFByb3h5OwotfQotCi0vKioKLSAqIGdldFJlY3RhbmdsZVNldEJvdW5kc1hZSFdQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRSZWN0YW5nbGVTZXRCb3VuZHNYWUhXUHJveHkoKSB7Ci0JcmV0dXJuIHNldFJlY3RhbmdsZUJvdW5kc1hZSFdQcm94eTsKLX0KLS8qKgotICogZ2V0UmVjdGFuZ2xlU2V0Qm91bmRzUlByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFJlY3RhbmdsZVNldEJvdW5kc1JQcm94eSgpIHsKLQlyZXR1cm4gc2V0UmVjdGFuZ2xlQm91bmRzUlByb3h5OwotfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0Jhc2VQcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYWYxNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDYvMTUgMjA6MTk6MTEgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLS8qKgotICogVGhpcyBpcyB0aGUgQmFzZSBSZWdpc3RyeSB0aGF0IGFsbCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHN1YmNsYXNzLiAKLSAqIDxwPgotICogSXQgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLiBJdCBwcm92aWRlcyBwdWJsaWMgZnVuY3Rpb25zIG9ubHkgZm9yIGFjY2VzcyBvZiBpbmRpdmlkdWFsIGltcGxlbWVudGF0aW9ucy4KLSAqIEN1c3RvbWVycyBzaG91bGQgb25seSBhY2Nlc3Mge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5RmFjdG9yeVJlZ2lzdHJ5fS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBQcm94eUZhY3RvcnlSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyByZWdpc3RyeVR5cGVJRDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHJlZ2lzdHJ5IHR5cGUgSUQuIFRoZSB0eXBlIGlkIHNob3VsZCBiZSBwcm92aWRlZCBieQotCSAqIGVhY2ggaW1wbGVtZW50YXRpb24uIFRoaXMgd2lsbCBiZSB1c2VkIHRvIHByb3ZpZGUgc3BlY2lmaWMgdHlwZQotCSAqIHJlZ2lzdHJhdGlvbnMgdGhyb3VnaCBjb250cmlidXRpb25zLgotCSAqICAKLQkgKiBAcGFyYW0gcmVnaXN0cnlUeXBlSUQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5KFN0cmluZyByZWdpc3RyeVR5cGVJRCkgewotCQlzdXBlcigpOwotCQl0aGlzLnJlZ2lzdHJ5VHlwZUlEID0gcmVnaXN0cnlUeXBlSUQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVxaXN0cnkgdHlwZSBpZC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWdpc3RyeVR5cGVJRCgpIHsKLQkJcmV0dXJuIHJlZ2lzdHJ5VHlwZUlEOwotCX0KLQotCS8qKgotCSBSZWdpc3RlciB0aGUgY3VycmVudCByZWdpc3RlcmVkIGJlYW4gcHJveHkgZmFjdG9yeSB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBJQmVhblByb3h5IGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQmVhblByb3h5RmFjdG9yeShJU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGFTdGFuZGFyZEZhY3RvcnkpIHsKLQkJZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgPSBhU3RhbmRhcmRGYWN0b3J5OwotCX0KLQotCS8qKgotCSBSZWdpc3RlciBhIGZhY3RvcnkgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgSUJlYW5Qcm94eSBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckJlYW5Qcm94eUZhY3RvcnkoU3RyaW5nIHBhY2thZ2VOYW1lLCBJQmVhblByb3h5RmFjdG9yeSBhRmFjdG9yeSkgewotCQlmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5Qcm94eUZhY3Rvcmllcy5wdXQocGFja2FnZU5hbWUsIGFGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgUmVnaXN0ZXIgdGhlIGN1cnJlbnQgcmVnaXN0ZXJlZCBiZWFuIHR5cGUgcHJveHkgZmFjdG9yeSB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBJQmVhblR5cGVQcm94eSBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckJlYW5UeXBlUHJveHlGYWN0b3J5KElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGFTdGFuZGFyZEZhY3RvcnkpIHsKLQkJZkN1cnJlbnRTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5ID0gYVN0YW5kYXJkRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgUmVnaXN0ZXIgYSBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuVHlwZVByb3h5IGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQmVhblR5cGVQcm94eUZhY3RvcnkoU3RyaW5nIHBhY2thZ2VOYW1lLCBJQmVhblR5cGVQcm94eUZhY3RvcnkgYUZhY3RvcnkpIHsKLQkJZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yaWVzLnB1dChwYWNrYWdlTmFtZSwgYUZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgTWV0aG9kIFByb3h5IEZhY3RvcnkgZm9yIHRoaXMgVk0uCi0JICogQ3JlYXRpb24gZGF0ZTogKDMvMTMvMDAgMTA6NTg6MTkgQU0pCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJNZXRob2RQcm94eUZhY3RvcnkoSU1ldGhvZFByb3h5RmFjdG9yeSBuZXdNZXRob2RQcm94eUZhY3RvcnkpIHsKLQkJZk1ldGhvZFByb3h5RmFjdG9yeSA9IG5ld01ldGhvZFByb3h5RmFjdG9yeTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db2xsZWN0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWE4MWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IENvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhbiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBwcm94eS4KLSAqIEl0IHByb3ZpZGVzIHRoZSBjb2xsZWN0aW9uIG1ldGhvZHMgdG8gaW50ZXJmYWNlIHRvCi0gKiB0aGUgcHJveHkuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgSUJlYW5Qcm94eSBmQ29sbGVjdGlvbjsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIGZDb25zdGFudHM7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyKElCZWFuUHJveHkgYUNvbGxlY3Rpb25Qcm94eSkgewotCQlpZiAoIWFDb2xsZWN0aW9uUHJveHkuZ2V0VHlwZVByb3h5KCkuaXNLaW5kT2YoYUNvbGxlY3Rpb25Qcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5TWVzc2FnZXMuQ2xhc3NDYXN0X0VYQ19fSW5jb3JyZWN0VHlwZSwgbmV3IE9iamVjdFtdIHthQ29sbGVjdGlvblByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksICJqYXZhLnV0aWwuQ29sbGVjdGlvbiJ9KSk7IAotCQllbHNlCi0JCQlmQ29sbGVjdGlvbiA9IGFDb2xsZWN0aW9uUHJveHk7Ci0JCQkKLQkJZkNvbnN0YW50cyA9IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoYUNvbGxlY3Rpb25Qcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBjb2xsZWN0aW9uIHByb3h5IHRoYXQgdGhpcyBpcyB3cmFwcGVyaW5nLgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldEJlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIGZDb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIGVxdWFscyAtIFBhc3MgaXQgb24gdG8gdGhlIHByb3h5IHRvIGhhbmRsZSB0aGlzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmQ29sbGVjdGlvbi5lcXVhbHMob2JqZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogaGFzaENvZGUgLSBQYXNzIGl0IG9uIHRvIHRoZSBwcm94eSB0byBoYW5kbGUgdGhpcy4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkNvbGxlY3Rpb24uaGFzaENvZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29sbGVjdGlvbiBhY2Nlc3NvcnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25BZGQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG9iamVjdCkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoSUJlYW5Qcm94eSBjb2xsZWN0aW9uKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uQWRkQWxsKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uQ2xlYXIoKS5pbnZva2UoZkNvbGxlY3Rpb24pOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQmVhblByb3h5IG9iamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvbkNvbnRhaW5zKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKElCZWFuUHJveHkgY29sbGVjdGlvbikgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvbkNvbnRhaW5zQWxsKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCQotCX0JCQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uSXNFbXB0eSgpLmludm9rZShmQ29sbGVjdGlvbikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCQotCX0JCQotCXB1YmxpYyBJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIgaXRlcmF0b3IoKSB7Ci0JCXRyeSB7Ci0JCQlJQmVhblByb3h5IGl0ciA9IGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvbkl0ZXJhdG9yKCkuaW52b2tlKGZDb2xsZWN0aW9uKTsKLQkJCWlmIChpdHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlcihpdHIpOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCX0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25SZW1vdmUoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG9iamVjdCkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoSUJlYW5Qcm94eSBjb2xsZWN0aW9uKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uUmVtb3ZlQWxsKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQkJCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKElCZWFuUHJveHkgY29sbGVjdGlvbikgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvblJldGFpbkFsbCgpLmludm9rZShmQ29sbGVjdGlvbiwgY29sbGVjdGlvbikpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJSW50ZWdlckJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uU2l6ZSgpLmludm9rZShmQ29sbGVjdGlvbikpLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiAwOwotCQl9CQkJCi0JfQkKLQlwdWJsaWMgSUFycmF5QmVhblByb3h5IHRvQXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKElBcnJheUJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uVG9BcnJheSgpLmludm9rZShmQ29sbGVjdGlvbik7Ci0JfQotCXB1YmxpYyBJQXJyYXlCZWFuUHJveHkgdG9BcnJheShJQXJyYXlCZWFuUHJveHkgYXJyYXkpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoSUFycmF5QmVhblByb3h5KSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25Ub0FycmF5V2l0aEFycmF5KCkuaW52b2tlKGZDb2xsZWN0aW9uLCBhcnJheSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbmZpZ3VyYXRpb25Db250cmlidXRvckFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbmZpZ3VyYXRpb25Db250cmlidXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyNDJkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBDb25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLSAKLS8qKgotICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIHRoYXQgZG9lcyBub3RoaW5nLiBJdAotICogY2FuIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBzcGVjaWZpYyBvdmVycmlkZXMuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Db250cmlidXRvckFkYXB0ZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIHsKLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0b3IjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbykgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVDbGFzc3BhdGhzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRocyhJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb0NvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciNjb250cmlidXRlVG9SZWdpc3RyeShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9SZWdpc3RyeShQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDkyMTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0KLS8qKgotICogTWFwcGluZyBvZiBjb250YWluZXIgcGF0aHMgKFJlZ3VsYXIgZXhwcmVzc2lvbnMpIHRvIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0gKiA8cD4KLSAqIEl0IGNhbiBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cyB0aGF0IG5lZWQgdG8gYnVpbHQgdXAgYSBzdWJzZXQgb2YgdGhlIG1hcHBpbmcgZnJvbSB0aGUgCi0gKiBub3JtYWwgbWFwcGluZyBkb25lIGJ5IHtAbGluayBQcm94eVBsdWdpbiNnZXRQbHVnaW5FeHRlbnNpb25zKFN0cmluZyl9LgotICogPHA+Ci0gKiBUbyBidWlsZCBvbmUgdXAgc2VwYXJhdGVseSBjbGllbnRzIHdvdWxkOgotICogPHByZT48Y29kZT4KLSAqIENvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nIG1hcHBpbmcgPSBuZXcgQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcoY29udHJpYnV0aW9uVHlwZSk7Ci0gKiBtYXBwaW5nLmFkZENvbnRyaWJ1dGlvbihjb250YWluZXJpZCwgcGF0dGVybiwgY29udHJpYnV0aW9uKTsKLSAqIAkuLi4KLSAqIG1hcHBpbmcuZmluYWxpemVNYXBwaW5nKCk7Ci0gKiA8L2NvZGU+PC9wcmU+Ci0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcgewotCQotCS8qKgotCSAqIFVzZWQgaW4ge0BsaW5rIENvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nI2NvbnRhaW5lcklkVG9Db250cmlidXRpb25zfSBhcyB0aGUgdmFsdWUgb2YgdGhlIG1hcC4gCi0JICogVGhpcyBjb250YWlucyBhIFBhdHRlcm4gZm9yIGEgY29udGFpbmVyIHBhdGggdG8gbWF0Y2ggYWdhaW5zdCB0byBzZWUgaWYgdGhlIGNvbnRyaWJ1dGlvbgotCSAqIHNob3VsZCBiZSB1c2VkLgotCSAqIDxwPgotCSAqIE5vcm1hbGx5IGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2Uge0BsaW5rIENvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nI2dldENvbnRyaWJ1dG9ycyhTdHJpbmcsIFN0cmluZ1tdKX0KLQkgKiB0byBnZXQgYWxsIG9mIHRoZSBjb250cmlidXRvcnMgZm9yIGFsbCBvZiB0aGUgcGF0aHMgb2YgdGhlIHNhbWUgY29udGFpbmVyIGlkLiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRhaW5lckNvbnRyaWJ1dGlvbkVudHJ5IHsKLQkJCi0JCXByaXZhdGUgZmluYWwgT2JqZWN0IGNvbnRyaWJ1dGlvbjsKLQkJcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIGNvbnRhaW5lclBhdGhQYXR0ZXJuOwotCQotCQlwdWJsaWMgQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnkoT2JqZWN0IGNvbnRyaWJ1dGlvbiwgUGF0dGVybiBjb250YWluZXJQYXRoUGF0dGVybikgewotCQkJdGhpcy5jb250cmlidXRpb24gPSBjb250cmlidXRpb247Ci0JCQl0aGlzLmNvbnRhaW5lclBhdGhQYXR0ZXJuID0gY29udGFpbmVyUGF0aFBhdHRlcm47Ci0JCX0KLQkJCi0JCQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBjb250cmlidXRpb24uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0Q29udHJpYnV0aW9uKCkgewotCQkJcmV0dXJuIGNvbnRyaWJ1dGlvbjsKLQkJfQotCQkKLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnRhaW5lciBwYXR0ZXJuIGZvciBtYXRjaGluZy4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIFBhdHRlcm4gZ2V0Q29udGFpbmVyUGF0aFBhdHRlcm4oKSB7Ci0JCQlyZXR1cm4gY29udGFpbmVyUGF0aFBhdHRlcm47Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBNYXAgb2YgY29udGFpbmVyIGlkcyAoU3RyaW5nLCBmaXJzdCBzZWdtZW50IG9mIGNvbnRhaW5lciBwYXRoKSB0byB7QGxpbmsgQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnlbXX0uCi0JICogPHA+Ci0JICogTm9ybWFsbHkgaXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSB7QGxpbmsgI2dldENvbnRyaWJ1dG9ycyhTdHJpbmcsIFN0cmluZ1tdKX0KLQkgKiB0byBnZXQgYWxsIG9mIHRoZSBjb250cmlidXRvcnMgZm9yIGFsbCBvZiB0aGUgcGF0aHMgb2YgdGhlIHNhbWUgY29udGFpbmVyIGlkLiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgTWFwIGNvbnRhaW5lcklkVG9Db250cmlidXRpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQotCS8vIFRPRE8gV2hlbiAxLjUsIHRoaXMgY2FuIGdvIGF3YXkuCi0JcHJpdmF0ZSBmaW5hbCBDbGFzcyBjb250cmlidXRpb25UeXBlOwotCQotCS8qKgotCSAqIENyZWF0ZSB3aXRoIGNvbnRyaWJ1dGlvbiB0eXBlIChpLmUuIHRoZSBhcnJheSB0eXBlIHJldHVybmVkIGZyb20ge0BsaW5rICNnZXRDb250cmlidXRvcnMoU3RyaW5nLCBTdHJpbmdbXSl9LgotCSAqIDxwPgotCSAqIFRPRE8gVGhpcyB3aWxsIGdvIGF3YXkgd2l0aCAxLjUgYmVjYXVzZSB0aGlzIHdpbGwgYmUgdGVtcGxhdGVkLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIENvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nKENsYXNzIHR5cGUpIHsKLQkJY29udHJpYnV0aW9uVHlwZSA9IHR5cGU7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldCB0aGUgdW5pcXVlIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgKG5vIGR1cGxpY2F0ZXMpIGZvciB0aGUgZ2l2ZW4gY29udGFpbmVyIGlkLCBhbmQKLQkgKiB0aGUgc2V0IG9mIGNvbnRhaW5lciBwYXRocyBmb3IgdGhhdCBjb250YWluZXIgaWQuIEZvciBleGFtcGxlLCAiU1dUX0NPTlRBSU5FUiIgYXMgY29udGFpbmVySUQgYW5kCi0JICogeyIvU1dUX0NPTlRBSU5FUi8iLCAiL1NXVF9DT05UQUlORVIvUERFL0pGQUNFIn0gZm9yIGNvbnRhaW5lciBwYXRocy4gVGhpcyB3aWxsIHRoZW4gcmV0dXJuIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMKLQkgKiB0aGF0IG1hdGNoIHRoZXNlIHR3byBwYXRocyBpbiB0aGUgY29udGFpbmVyIGF0dHJpYnV0ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LiBUaGUgY29udGFpbmVyIGF0dHJpYnV0ZQotCSAqIGlzIGEgcmVndWxhciBleHByZXNzaW9uLiBGb3IgZXhhbXBsZSAiU1dUX0NPTlRBSU5FUiIgd2lsbCBtYXRjaCBib3RoICIvU1dUX0NPTlRBSU5FUi8iIGFuZCAiL1NXVF9DT05UQUlORVIvUERFL0pGQUNFIgotCSAqIHdoaWxlICJTV1RfQ09OVEFJTkVSLy4qIC9KRkFDRSIgd2lsbCBtYXRjaCAiL1NXVF9DT05UQUlORVIvUERFL0pGQUNFIi4gKE5vdGUgaXQgaXMgYWN0dWFsbHkgbm8gc3BhY2UgYmV0d2VlbiB0aGUgIioiIGFuZCAiLyIgYnV0IGphdmEgY29tbWVudCBzeW50YXggd29uJ3QgYWxsb3cgaXQuKSAgIAotCSAqIEBwYXJhbSBjb250YWluZXJJZCBpZCBvZiBhbGwgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIGxpc3Qgb2YgcGF0aHMgKHRoZSBmaXJzdCBzZWdtZW50IG9mIGFsbCBvZiB0aGUgcGF0aHMpLgotCSAqIEBwYXJhbSBjb250YWluZXJQYXRocyBhcnJheSBvZiBhbGwgb2YgdGhlIHBhdGhzIHRvIGxvb2sgZm9yIGNvbnRyaWJ1dGlvbnMgZm9yLgotCSAqIEByZXR1cm4gYXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIGxpc3Qgb2YgcGF0aHMuIFRoZXkgd2lsbCBiZSBpbiBvcmRlciBkZWNsYXJlZCB3aXRoaW4gYSBwbHVnaW4gd2l0aGluIHBsdWdpbiBvcmRlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q29udHJpYnV0b3JzKFN0cmluZyBjb250YWluZXJJZCwgU3RyaW5nW10gY29udGFpbmVyUGF0aHMpIHsKLQkJQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnlbXSBidW5kbGVDb250cmlidXRpb25zID0gKENvbnRhaW5lckNvbnRyaWJ1dGlvbkVudHJ5W10pIGNvbnRhaW5lcklkVG9Db250cmlidXRpb25zLmdldChjb250YWluZXJJZCk7Ci0JCWlmIChidW5kbGVDb250cmlidXRpb25zID09IG51bGwpCi0JCQlyZXR1cm4gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShjb250cmlidXRpb25UeXBlLCAwKTsKLQkJTGlzdCBjb250cmlidXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBQYXR0ZXJucyB0aGF0IGhhdmUgYmVlbiB0ZXN0ZWQuIEtleSBpcyBhIHBhdHRlcm4sIHZhbHVlIGlzIEJvb2xlYW4uIHRydWUgaWYgdGhpcyBwYXR0ZXJuIG1hdGNoZWQgYW55IG9mIHRoZSBjb250YWluZXIgcGF0aHMuCi0JCS8vIFRoaXMgd2F5IGEgcGF0dGVybiB3aWxsIG9ubHkgYmUgdGVzdGVkIG9uY2UgZm9yIHRoZSBsaXN0IG9mIHBhdGhzLiBJZiB0aGUgcGF0dGVybiBpcyBmb3VuZCB0aGUgbGlzdCBhZ2FpbiB3ZSB3aWxsIGtub3cgaWYgaXQKLQkJLy8gc2hvdWxkIGJlIHNlbGVjdGVkIG9yIG5vdC4KLQkJLy8gVGhlIGJ1bmRsZUNvbnRyaWJ1dGlvbnMgYXJlIGluIG9yZGVyIGRlY2xhcmVkIHdpdGhpbiBlYWNoIHBsdWdpbiB3aXRoaW4gcGx1Z2luIG9yZGVyLgotCQlNYXAgdGVzdGVkUGF0dGVybnMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZUNvbnRyaWJ1dGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUJvb2xlYW4gdGVzdGVkID0gKEJvb2xlYW4pIHRlc3RlZFBhdHRlcm5zLmdldChidW5kbGVDb250cmlidXRpb25zW2ldLmdldENvbnRhaW5lclBhdGhQYXR0ZXJuKCkpOwotCQkJaWYgKHRlc3RlZCA9PSBudWxsKSB7Ci0JCQkJLy8gTmVlZCB0byB0ZXN0IGl0LgotCQkJCS8vIFJ1biB0aHJvdWdoIGNvbnRhaW5lciBwYXRocyBhbmQgc2VlIGlmIGFueSBtYXRjaC4KLQkJCQl0ZXN0ZWQgPSBCb29sZWFuLkZBTFNFOwotCQkJCVBhdHRlcm4gcGF0dGVybiA9IGJ1bmRsZUNvbnRyaWJ1dGlvbnNbaV0uZ2V0Q29udGFpbmVyUGF0aFBhdHRlcm4oKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbnRhaW5lclBhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChwYXR0ZXJuLm1hdGNoZXIoY29udGFpbmVyUGF0aHNbal0pLm1hdGNoZXMoKSkgewotCQkJCQkJdGVzdGVkID0gQm9vbGVhbi5UUlVFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGVzdGVkUGF0dGVybnMucHV0KHBhdHRlcm4sIHRlc3RlZCk7Ci0JCQl9Ci0JCQlpZiAodGVzdGVkLmJvb2xlYW5WYWx1ZSgpKQotCQkJCWNvbnRyaWJ1dGlvbnMuYWRkKGJ1bmRsZUNvbnRyaWJ1dGlvbnNbaV0uZ2V0Q29udHJpYnV0aW9uKCkpOwotCQl9Ci0JCXJldHVybiBjb250cmlidXRpb25zLnRvQXJyYXkoKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShjb250cmlidXRpb25UeXBlLCBjb250cmlidXRpb25zLnNpemUoKSkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBjb250cmlidXRpb24gdG8gbWFwcGluZy4gVGhpcyBpcyBub3Qgbm9ybWFsbHkgbmVlZGVkIGJ5IGNsaWVudHMgdW5sZXNzIHRoZSBjbGllbnQgbmVlZHMgdG8KLQkgKiBidWlsZCB1cCBhIGRpZmZlcmVudCBjb250YWluZXIgcGF0aCBtYXBwaW5nIHRoYW4gdGhlIG9uZSBub3JtYWxseSBjcmVhdGVkIGJ5IHtAbGluayBQcm94eVBsdWdpbiNwcm9jZXNzQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoU3RyaW5nKX0uCi0JICogPHA+Ci0JICogQWZ0ZXIgYWxsIGNvbnRyaWJ1dGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHtAbGluayAjZmluYWxpemVNYXBwaW5nKCl9IG11c3QgYmUgY2FsbGVkLiBJZiB0aGlzCi0JICogaXMgbm90IGNhbGxlZCB0aGVuIHtAbGluayAjZ2V0Q29udHJpYnV0b3JzKFN0cmluZywgU3RyaW5nW10pfSB3aWxsIGZhaWwgd2l0aCBleGNlcHRpb25zLgotCi0JICogQHBhcmFtIGNvbnRhaW5lcklkCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiBAcGFyYW0gY29udHJpYnV0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29udHJpYnV0aW9uKFN0cmluZyBjb250YWluZXJJZCwgUGF0dGVybiBwYXR0ZXJuLCBPYmplY3QgY29udHJpYnV0aW9uKSB7Ci0JCWlmIChjb250YWluZXJJZFRvQ29udHJpYnV0aW9ucyA9PSBDb2xsZWN0aW9ucy5FTVBUWV9NQVApCi0JCQljb250YWluZXJJZFRvQ29udHJpYnV0aW9ucyA9IG5ldyBIYXNoTWFwKCk7CS8vIFRoaXMgaXMgZmlyc3QgY2FsbCB0byBhZGQgc29tZXRoaW5nLgotCQkvLyBXZSB3aWxsIGJ1aWxkIGFzIGxpc3QsIGJ1dCB0aGVuIGNoYW5nZSB0byBhcnJheSB3aGVuIGRvbmUuCi0JCU9iamVjdCBjb250cmlidXRpb25zID0gY29udGFpbmVySWRUb0NvbnRyaWJ1dGlvbnMuZ2V0KGNvbnRhaW5lcklkKTsKLQkJaWYgKGNvbnRyaWJ1dGlvbnMgPT0gbnVsbCkgewotCQkJY29udHJpYnV0aW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQljb250YWluZXJJZFRvQ29udHJpYnV0aW9ucy5wdXQoY29udGFpbmVySWQsIGNvbnRyaWJ1dGlvbnMpOwotCQl9IGVsc2UgaWYgKCEoY29udHJpYnV0aW9ucyBpbnN0YW5jZW9mIExpc3QpKSB7Ci0JCQkvLyBJdCBtdXN0IGJlIGFuIGFycmF5LCBzbyBjb252ZXJ0IGJhY2sgdG8gbGlzdCBzbyB0aGF0IHdlIGNhbiBhZGQgdG8gaXQuCi0JCQlMaXN0IG9sZENvbnRyaWJ1dGlvbnMgPSBBcnJheXMuYXNMaXN0KChPYmplY3RbXSkgY29udHJpYnV0aW9uKTsKLQkJCWNvbnRyaWJ1dGlvbnMgPSBuZXcgQXJyYXlMaXN0KG9sZENvbnRyaWJ1dGlvbnMuc2l6ZSgpKTsKLQkJCSgoTGlzdCkgY29udHJpYnV0aW9ucykuYWRkQWxsKG9sZENvbnRyaWJ1dGlvbnMpOwotCQkJY29udGFpbmVySWRUb0NvbnRyaWJ1dGlvbnMucHV0KGNvbnRhaW5lcklkLCBjb250cmlidXRpb25zKTsKLQkJfQotCQkoKExpc3QpIGNvbnRyaWJ1dGlvbnMpLmFkZChuZXcgQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnkoY29udHJpYnV0aW9uLCBwYXR0ZXJuKSk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogRmluYWxpemUgdGhlIG1hcHBpbmcuIFRoaXMgaXMgY2FsbGVkIHdoZW4gY2xpZW50cyBhcmUgZG9uZSB3aXRoIGFsbCB7QGxpbmsgI2FkZENvbnRyaWJ1dGlvbihTdHJpbmcpfS4KLQkgKiBJdCB0YWtlcyB0aGUgbWFwcGluZyBmcm9tIGFuIGludGVybmFsIGZvcm1hdCB0aGF0IGFsbG93ZWQgZm9yIHF1aWNrZXIgYnVpbGRpbmcgaW50byB0aGUgZmluYWwgZm9ybWF0LgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmFsaXplTWFwcGluZygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVySWRUb0NvbnRyaWJ1dGlvbnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBMaXN0KQotCQkJCWVudHJ5LnNldFZhbHVlKCgoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkudG9BcnJheShuZXcgQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnlbKChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpKS5zaXplKCldKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDA0NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogUmVzdWx0IGZyb20ge0BsaW5rIFByb3h5UGx1Z2luI3Byb2Nlc3NDb250cmlidXRpb25FeHRlbnNpb25Qb2ludChTdHJpbmcpfQotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvIHsKLQkKLQkvKioKLQkgKiBDb250cmlidXRpb25zIHRoYXQgYXJlIGJhc2VkIHVwb24gY29udGFpbmVyIHBhdGhzIHRoYXQgYXJlIGJ1aWx0IHVwIGZyb20KLQkgKiB0aGUgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBDb250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZyBjb250YWluZXJQYXRoQ29udHJpYnV0aW9uczsKLQotCUNvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvKCkgewotCQkvLyBOb3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiBQcm94eVBsdWdpbi4KLQl9Ci0JCi0JLyoqCi0JICogTWFwIG9mIHBsdWdpbiBpZHMgKFN0cmluZykgdG8gY29udHJpYnV0aW9ucyAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pIHRoYXQgd2FzIGZvdW5kIHdpdGggdGhhdCBpZC4gRm9yIGVhY2ggcGx1Z2luLAotCSAqIHRoZSBjb250cmlidXRpb25zIHdpbGwgYmUgbGlzdGVkIGluIHBsdWdpbiBwcmVyZXEgb3JkZXIuCi0JICovCi0JcHVibGljIE1hcCBwbHVnaW5Ub0NvbnRyaWJ1dGlvbnM7Ci0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FbnVtZXJhdGlvbkJlYW5Qcm94eVdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0VudW1lcmF0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjlkYTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0VudW1lcmF0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEVudW1lcmF0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhbiBqYXZhLnV0aWwuRW51bWVyYXRpb24gcHJveHkuCi0gKiBJdCBwcm92aWRlcyB0aGUgRW51bWVyYXRpb24gbWV0aG9kcyB0byBpbnRlcmZhY2UgdG8KLSAqIHRoZSBwcm94eS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25CZWFuUHJveHlXcmFwcGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgSUJlYW5Qcm94eSBmRW51bWVyYXRpb247Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBmQ29uc3RhbnRzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbkJlYW5Qcm94eVdyYXBwZXIoSUJlYW5Qcm94eSBhbkVudW1lcmF0aW9uUHJveHkpIHsKLQkJCi0JCWZFbnVtZXJhdGlvbiA9IGFuRW51bWVyYXRpb25Qcm94eTsKLQkJCQotCQlmQ29uc3RhbnRzID0gSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhhbkVudW1lcmF0aW9uUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgaXRlcmF0b3IgcHJveHkgdGhhdCB0aGlzIGlzIHdyYXBwZXJpbmcuCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0QmVhblByb3h5KCkgewotCQlyZXR1cm4gZkVudW1lcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIGVxdWFscyAtIFBhc3MgaXQgb24gdG8gdGhlIHByb3h5IHRvIGhhbmRsZSB0aGlzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmRW51bWVyYXRpb24uZXF1YWxzKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIGhhc2hDb2RlIC0gUGFzcyBpdCBvbiB0byB0aGUgcHJveHkgdG8gaGFuZGxlIHRoaXMuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZFbnVtZXJhdGlvbi5oYXNoQ29kZSgpOwotCX0KLQkKLQkvKioKLQkgKiBFbnVtZXJhdGlvbiBhY2Nlc3NvcnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRFbnVtZXJhdGlvbkhhc01vcmVFbGVtZW50cygpLmludm9rZShmRW51bWVyYXRpb24pKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQkJCi0JfQotCXB1YmxpYyBJQmVhblByb3h5IG5leHRFbGVtZW50KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGZDb25zdGFudHMuZ2V0RW51bWVyYXRpb25OZXh0RWxlbWVudCgpLmludm9rZShmRW51bWVyYXRpb24pOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMGVmYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBFeHByZXNzaW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE0ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLSAKLS8qKgotICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBvZiBJRXhwcmVzc2lvbi4gSXQgZW5jYXBzdWxhdGVzIG11Y2ggb2YgdGhlIHByb2Nlc3NpbmcgcmVxdWlyZWQKLSAqIGludG8gYSBjb21tb24gZm9ybSB0aGF0IHdpbGwgYmUgdHVybmVkIGludG8gc2ltcGxlIHB1c2gvcG9wL2V2YWx1YXRlIHR5cGUgb2YgaW50ZXJhY3Rpb24gd2l0aCB0aGUKLSAqIGFjdHVhbCBvdGhlciBzaWRlLiBBbGwgcmVnaXN0cnkgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mIElFeHByZXNzaW9uIG11c3Qgc3ViY2xhc3MgdGhpcyBjbGFzcy4KLSAqIDxwPgotICogSXQgd2lsbCBtYWludGFpbiBhIHN0YWNrIG9mIHRoZSBleHByZXNzaW9ucy4gQXMgdGhlIGV4cHJlc3Npb25zIGNvbWUgaW4gdGhleSB3aWxsIGJlIHN0YWNrZWQgaWYgbm90Ci0gKiBhYmxlIHRvIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LiBUaGUgZXhwcmVzc2lvbnMgY29tZSB0byB0aGlzIGNsYXNzIGluIGFuICBvdXRzaWRlIHRvIGluc2lkZSBvcmRlciwKLSAqIGJ1dCB0aGV5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGluIGFuIGluc2lkZS1vdXQgb3JkZXIgaW5zdGVhZC4gCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgd2lsbCBiZSB1c2VkIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHByb3h5IGludGVyZmFjZXMuIFRoZSBhYnN0cmFjdCBtZXRob2RzIHdpbGwKLSAqIHRoZW4gYmUgdGhlIHNpbXBsZSBpbnRlcmZhY2UuIAotICogPHA+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+Ci0JICogVGhlIGltcGxlbWVudGF0aW9uIE1VU1QgcmV0dXJuLiBUaGlzIGlzIAotCSAqIGJlY2F1c2UgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNvbXBsZXRlZAotCSAqIHVudGlsIGl0IGlzIHJldHVybmVkLCBhbmQgdGhlIHByb2Nlc3Mgd2lsbAotCSAqIG5vdCBjb250aW51ZSBvbiB0aGUgcmVtb3RlIHZtIHVudGlsIGl0IGlzCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIG1zZ0lECi0JICogQHBhcmFtIGlzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY2FsbGVkQmFja1N0cmVhbShpbnQgbXNnSUQsIElucHV0U3RyZWFtIGlzKTsJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2FsbGJhY2tSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNhbGxiYWNrUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiM2E4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2FsbGJhY2tSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElDYWxsYmFja1JlZ2lzdHJ5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHJlZ2lzdHJ5IGZvciBoYW5kbGluZyBjYWxsYmFja3MuCi0gKiBJdCBpcyB1c2VkIHRvIHJlZ2lzdGVyIGFuZCBkZXJlZ2lzdGVyIGNhbGxiYWNrcy4KLSAqCi0gKiBDYWxsYmFja3MgYXJlIHNwbGl0IGludG8gdHdvIHBhcnRzOgotICogMSkgQ2FsbGJhY2tQcm94eS4gVGhpcyBpcyBhbnkgcHJveHkgdGhhdCBpbXBsZW1lbnRzIHRoZQotICogICAgaW50ZXJmYWNlIElDYWxsYmFjay4gKE9yIHRoZQotICogICAgZXF1aXZhbGVudCBvbmUgaWYgbm90IHN0YW5kYXJkIHJlbW90ZSB2bSkuIFRoaXMgaXMgdGhlCi0gKiAgICBvYmplY3Qgd2hpY2ggd2lsbCBhY3R1YWxseSBzdWJtaXQgdGhlIGNhbGxiYWNrIG9uIHRoZSByZW1vdGUKLSAqICAgIHZtLiBGb3IgZXhhbXBsZSwgYW55IGtpbmQgb2YgbGlzdGVuZXIuIEl0IHdvdWxkIGltcGxlbWVudAotICogICAgYm90aCB0aGUgSUNhbGxiYWNrIGFuZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgaW50ZXJmYWNlLgotICogICAgVGhlbiB3aGVuIGl0IGdldHMgY2FsbGVkIGFzIGEgbGlzdGVuZXIsIGl0IHdpbGwgcmVkaXJlY3QgdGhlCi0gKiAgICBjYWxsIHRvIHRoZSByZW1vdGUgdm0gY2FsbGJhY2sgaGFuZGxlciB0byBzdWJtaXQgaXQgdG8gdGhlCi0gKiAgICBwcm94eSBzaWRlLgotICogMikgQ2FsbGJhY2suIFRoaXMgaXMgb24gdGhpcyBzaWRlIGFuZCBpcyB0aGUgb2JqZWN0IHRoYXQgd2lsbAotICogICAgYmUgbm90aWZpZWQgb2YgdGhlIGNhbGxiYWNrIGFuZCB3aWxsIGV4ZWN1dGUgYXQgdGhhdCB0aW1lLgotICoKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElDYWxsYmFja1JlZ2lzdHJ5IHsKLQkKLQkvKioKLQkgKiBSZWdpc3RlciB0aGlzIGNhbGxiYWNrIHByb3h5IGFuZCB0aGlzIGNhbGxiYWNrLgotCSAqCi0JICogVGhlIHByb2Nlc3MgaXMgdG86Ci0JICogMSkgQ3JlYXRlIHRoZSBjYWxsYmFja1Byb3h5IGFuZCB0aGUgY2FsbGJhY2sKLQkgKiAyKSByZWdpc3RlciB0aGVzZSB3aXRoIHJlZ2lzdGVyQ2FsbGJhY2sKLQkgKiAzKSBOb3cgY29ubmVjdCB0aGUgY2FsbGJhY2tQcm94eSBzbyB0aGF0IGl0IHdpbGwgc3RhcnQgbm90aWZ5aW5nLgotCSAqICAgIEZvciBleGFtcGxlLCBpZiBpdCBpcyBhIG5vcm1hbCBsaXN0ZW5lciwgYXQgdGhpcyB0aW1lIGRvIHRoZQotCSAqICAgIGFkZExpc3RlbmVyIGNhbGwgdG8gYWRkIHRoZSBjYWxsYmFja1Byb3h5IHRvIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QuCi0JICogICAgWW91IGRvbid0IHdhbnQgaXQgdG8gc3RhcnQgbm90aWZ5aW5nIGJlZm9yZSByZWdpc3RlcmluZyBpdC4KLQkgKiAgICAoVGhvdWdoIGl0IHdvbid0IGh1c3QgaXQsIGl0IHdpbGwganVzdCByZXR1cm4gbnVsbCkuCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhJQmVhblByb3h5IGNhbGxiYWNrUHJveHksIElDYWxsYmFjayBjYik7Ci0JCi0JLyoqCi0JICogU2FtZSBhcyB7QGxpbmsgSUNhbGxiYWNrUmVnaXN0cnkjcmVnaXN0ZXJDYWxsYmFjayhJQmVhblByb3h5LCBJQ2FsbGJhY2spIHJlZ2lzdGVyQ2FsbGJhY2t9IGV4Y2VwdCB0aGF0Ci0JICogaXQgaXMgZGVmZXJyZWQgb2ZmIGludG8gYW4gZXhwcmVzc2lvbi4KLQkgKiAgCi0JICogQHBhcmFtIGNhbGxiYWNrUHJveHkKLQkgKiBAcGFyYW0gY2IKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soSVByb3h5IGNhbGxiYWNrUHJveHksIElDYWxsYmFjayBjYiwgSUV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0JCi0JLyoqCi0JICogRGVyZWdpc3RlciB0aGUgY2FsbGJhY2sgcHJveHkuIFRoaXMgd2lsbCByZW1vdmUgaXQgZnJvbSB0aGUKLQkgKiByZWdpc3RyeSBhbmQgcmVsZWFzZSB0aGUgY2FsbGJhY2suCi0JICoKLQkgKiBUaGUgcHJvY2VzcyBpcyB0bzoKLQkgKiAxKSBTdG9wIHRoZSBwcm94eSBmcm9tIGxpc3RlbmluZyBzbyBpdCBubyBub3RpZmllcy4gVGhpcyBpcyB1c3VhbGx5Ci0JICogICAgcmVtb3ZlTGlzdGVuZXIgb24gdGhlIHJlbW90ZSB2bS4gWW91IGRvbid0IHdhbnQgaXQgbm90aWZ5aW5nCi0JICogICAgYWZ0ZXIgaXQgZGVyZWdpc3RlciAodGhvdWdoIGl0IHdvbid0IGh1cnQgaXQsIGl0IHdpbGwganVzdCByZXR1cm4gbnVsbCkuCi0JICogMikgZGVyZWdpc3RlciBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyQ2FsbGJhY2soSUJlYW5Qcm94eSBjYWxsYmFja1Byb3h5KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDaGFyYWN0ZXJCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDaGFyYWN0ZXJCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhNmI0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2hhcmFjdGVyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUNoYXJhY3RlckJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0vKioKLSAqIE9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBjaGFyYWN0ZXIgcHJveGllcyB0aGF0Ci0gKiBhbGxvd3MgdGhlIElERSBWTSB0byBnZXQgdGhlIGNoYXJhY3RlciB2YWx1ZSBlYXNpbHkKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1ODoyMiBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNoYXJhY3RlckJlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHksIElOdW1iZXJCZWFuUHJveHkgewotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3hpZWQgY2hhcmFjdGVyIGFzIGEgY2hhciB0aGF0IHRoZSBJREUgY2FuIHVzZQotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjU4OjMyIEFNKQotICovCi1jaGFyIGNoYXJWYWx1ZSgpOwotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3hpZWQgY2hhcmFjdGVyIGFzIGEgQ2hhcmFjdGVyIHRoYXQgdGhlIElERSBjYW4gdXNlCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTg6MzIgQU0pCi0gKi8KLUNoYXJhY3RlciBjaGFyYWN0ZXJWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhYjk5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjExICQgICREYXRlOiAyMDA1LzEwLzI2IDE4OjQ4OjE5ICQgCi0gKi8KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLTsKLS8qKgotICogQ29udHJvbHMgY29udHJpYnV0aW9uIHRvIHRoZSBjb25maWd1cmF0aW9uLiBUaGlzIGFsbG93cyB0aGUgY2xhc3NwYXRoCi0gKiB0byBiZSBtb2RpZmllZCBpbiBhbiBhY2NlcHRhYmxlIG1hbm5lciwgc28gdGhhdCBkdXBsaWNhdGVzIGFyZW4ndCBpbgotICogdGhlIHBhdGgsIG9yIGFkZGluZyBhIHByb2plY3QgdG8gdGhlIHBhdGggaW4gYW4gYWNjZXB0YWJsZSB3YXkuCi0gKiAKLSAqIElmIG9ubHkgZGVsZXRpbmcgb3IgbW92aW5nIGVudHJpZXMgZnJvbSB0aGUgY2xhc3NwYXRoLCB0aGF0IGNhbiBiZSBkb25lIGRpcmVjdGx5Ci0gKiB0byB0aGUgY2xhc3NwYXRoIGxpc3QgcGFzc2VkIGluLiBBZGRpbmcgZW50cmllcyBuZWVkcyB0byBnbyB0aHJvdWdoIHRoaXMKLSAqIGNvbnRyb2xsZXIuCi0gKiAKLSAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgZGV2ZWxvcGVycyBvZiBwcm94eSBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi0gKiAKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgewotCQotCS8qKgotCSAqIEFwcGVuZCB0byB0aGUgdXNlciBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQRU5EX1VTRVJfQ0xBU1NQQVRIID0gMDsKLQkKLQkvKioKLQkgKiBQcmVwZW5kIHRvIHRoZSB1c2VyIGNsYXNzcGF0aC4gVGhpcyB3aWxsIHN0aWNrIGl0IGluIHBvc2l0aW9uIDAuIElmCi0JICogYW5vdGhlciBwcmVwZW5kIGNvbWVzIGFsb25nLCBpdCB3aWxsIGdvIGluIHBvcyAwIGFuZCB0aGlzIG9uZSB3aWxsIG1vdmUgdG8gMS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVQRU5EX1VTRVJfQ0xBU1NQQVRIID0gMTsKLQkKLQotCS8qKgotCSAqIEFwcGVuZCB0byB0aGUgYm9vdCBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQRU5EX0JPT1RfQ0xBU1NQQVRIID0gMjsKLQotCS8qKgotCSAqIFByZXBlbmQgdG8gdGhlIGJvb3QgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVBFTkRfQk9PVF9DTEFTU1BBVEggPSAzOwotCQotCS8qKgotCSAqIEFwcGVuZCBhIGZvbGRlciB0byB0aGUgamF2YS5saWJyYXJ5LnBhdGggKGZvciB0aGluZ3MgbGlrZQotCSAqIGRsbCdzKS4gVGhpcyBzaG91bGQgcmVzdWx0IGluIGEgZm9sZGVyIG9ubHkuCi0JICogVGhlIG5sc0xvY2FsaXplIGZsYWcgY29udHJpYnV0ZSB2aWEgcGx1Z2luIHdpbGwgYmUKLQkgKiBpZ25vcmVkIGZvciB0aGlzIHR5cGUgZmxhZy4gCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIID0gNDsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGphdmEgcHJvamVjdCB0aGF0IHdlIGFyZSBjb250cmlidXRpbmcgZm9yLgotCSAqIAotCSAqIEByZXR1cm4gamF2YXByb2plY3QsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKTsKLQkJCi0JLyoqCi0JICogQWRkIGEgcHJvamVjdCB0byB0aGUgY2xhc3NwYXRoLiBUaGUgdHlwZSBmbGFnIHRlbGxzIHdoZXJlIHRvIGFkZCBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEFkZCBhbiBleHRlcm5hbCBmaWxlL2ZvbGRlciB0byB0aGUgY2xhc3NwYXRoLiBUaGUgdHlwZSBmbGFnIHRlbGxzIHdoZXJlIHRvIGFkZCBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NwYXRoCi0JICogQHBhcmFtIHR5cGVGbGFnIE9uZSBvZiA8Y29kZT5BUFBFTkRfVVNFUl9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5BUFBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5QUkVQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgb3IgPGNvZGU+QVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIPC9jb2RlPi4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY29udHJpYnV0ZUNsYXNzcGF0aChVUkwsIGludCkgaW5zdGVhZC4KLQkgKiBAc2VlICNjb250cmlidXRlQ2xhc3NwYXRoKFVSTCwgaW50KQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoU3RyaW5nIGNsYXNzcGF0aCwgaW50IHR5cGVGbGFnKTsKLQkKLQkvKioKLQkgKiBBZGQgYW4gZXh0ZXJuYWwgZmlsZS9mb2xkZXIgdG8gdGhlIGNsYXNzcGF0aC4gVGhlIHR5cGUgZmxhZyB0ZWxscyB3aGVyZSB0byBhZGQgaXQuCi0JICogCi0JICogQHBhcmFtIGNsYXNzcGF0aFVSTAotCSAqIEBwYXJhbSB0eXBlRmxhZyBPbmUgb2YgPGNvZGU+QVBQRU5EX1VTRVJfQ0xBU1NQQVRIPC9jb2RlPiwgPGNvZGU+QVBQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgPGNvZGU+UFJFUEVORF9CT09UX0NMQVNTUEFUSDwvY29kZT4sIG9yIDxjb2RlPkFQUEVORF9KQVZBX0xJQlJBUllfUEFUSDwvY29kZT4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChVUkwgY2xhc3NwYXRoVVJMLCBpbnQgdHlwZUZsYWcpOwkKLQkKLQkvKioKLQkgKiBBZGQgYW4gZXh0ZXJuYWwgZmlsZXMvZm9sZGVycyB0byB0aGUgY2xhc3NwYXRoLiBUaGUgdHlwZSBmbGFnIHRlbGxzIHdoZXJlIHRvIGFkZCBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NwYXRocwotCSAqIEBwYXJhbSB0eXBlRmxhZyBPbmUgb2YgPGNvZGU+QVBQRU5EX1VTRVJfQ0xBU1NQQVRIPC9jb2RlPiwgPGNvZGU+QVBQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgPGNvZGU+UFJFUEVORF9CT09UX0NMQVNTUEFUSDwvY29kZT4sIG9yIDxjb2RlPkFQUEVORF9KQVZBX0xJQlJBUllfUEFUSDwvY29kZT4uCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNvbnRyaWJ1dGVDbGFzc3BhdGgoVVJMW10sIGludCkgaW5zdGVhZC4KLQkgKiBAc2VlICNjb250cmlidXRlQ2xhc3NwYXRoKFVSTFtdLCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChTdHJpbmdbXSBjbGFzc3BhdGhzLCBpbnQgdHlwZUZsYWcpOwkKLQotCS8qKgotCSAqIEFkZCBhbiBleHRlcm5hbCBmaWxlcy9mb2xkZXJzIHRvIHRoZSBjbGFzc3BhdGguIFRoZSB0eXBlIGZsYWcgdGVsbHMgd2hlcmUgdG8gYWRkIGl0LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGhVUkxzCi0JICogQHBhcmFtIHR5cGVGbGFnIE9uZSBvZiA8Y29kZT5BUFBFTkRfVVNFUl9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5BUFBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5QUkVQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgb3IgPGNvZGU+QVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKFVSTFtdIGNsYXNzcGF0aFVSTHMsIGludCB0eXBlRmxhZyk7CQotCQotCS8qKgotCSAqIEFkZCBhIGZpbGUvZm9sZGVyIGZyb20gYSBwbHVnaW4gaW4gdGhlIHJ1bm5pbmcgRWNsaXBzZSB0byB0aGUgY2xhc3NwYXRoLiBUaGUgdHlwZSBmbGFnIHRlbGxzIHdoZXJlIHRvIGFkZCBpdC4KLQkgKiBJbiBkZXZlbG9wbWVudCBtb2RlIGl0IHdpbGwgZmluZCB0aGUgYmluIGNsYXNzIGZpbGVzIGluc3RlYWQgaWYgcHJveHkuamFycyBpcyBzZXR1cCBjb3JyZWN0bHkuCi0JICogPHA+Ci0JICogSWYgbmxzTG9jYWxpemUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gaXQgd2lsbCBhbHNvIHNlYXJjaCB0aHJvdWdoIHRoZSBmcmFnbWVudHMgaW4gdGhpcyBtYW5uZXI6Ci0JICogKE5vdGU6IGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpdCB3aWxsIHN0aWxsIHNlYXJjaCBpbiB0aGUgZnJhZ21lbnRzLCBidXQgaXQgd2lsbCBvbmx5IHJldHVybiB0aGUgZmlyc3QgZmlsZSBmb3VuZCB0aGF0IG1hdGNoZXMuCi0JICogPHA+Ci0JICogRmluZCBpbiB0aGUgcGx1Z2luIGFuZCBhbGwgb2YgdGhlIGZyYWdtZW50cyB0aG9zZSB0aGF0IG1hdGNoIHRoZSBuYW1lIGV4YWN0bHkKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbmxzIHdoZXJlIHRoZSBubHMgZm9yIHRoZSBmaWxlbmFtZSB3aWxsIGJlIGluIG9uZSBvciBtb3JlIG9mIHRoZSBmcmFnbWVudHMgb2YgdGhlIHBsdWdpbi4JIAkgCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIGl0IGNhbiBiZSBmb3VuZCBpbi4KLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFBhdGggdG8gZmlsZS9mb2xkZXIgcmVsYXRpdmUgdG8gYnVuZGxlIHJvb3QuIE9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIHRoZSBidW5kbGUvZnJhZ21lbnQgaXRzZWxmIChmb3Igd2hlbiB0aGUgYnVuZGxlIGhhcyBiZWVuIGphcidlZCB1cCkuIAotCSAqICAgPGI+Tm90ZTogPC9iPklmIGl0IGlzIDxjb2RlPkFQUEVORF9KQVZBX0xJQlJBUllfUEFUSDwvY29kZT4sIGl0IHNob3VsZCBiZSBmb2xkZXIgYW5kIG5sc0xvY2FsaXplIHdpbGwgYmUgaWdub3JlZC4KLQkgKiAgIEluIHRoaXMgY2FzZSBiZSBjYXJlZnVsIHRoYXQgaWYgYSBmb2xkZXIgYW5kIHRoZSBwbHVnaW4gaXMgamFycmVkIHRoYXQgdGhlIGZvbGRlciA8Yj5JUyBOT1QgVEhFIFJPT1QgT0YgVEhFIFBMVUdJTjwvYj4uIFRoaXMgd2lsbAotCSAqICAgY2F1c2UgdGhlIGVudGlyZSBwbHVnaW4gdG8gYmUgZXh0cmFjdGVkIGluc3RlYWQgb2YganVzdCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpYnJhcmllcy4gSWYgdGhlIGxpYnJhcmllcyBhcmUgaW4gdGhlIHJvb3QKLQkgKiAgIG9mIGEgamFycmVkIHBsdWdpbiB0aGVuIGEgc2VwYXJhdGUgY2FjaGUgZGlyZWN0b3J5IHNob3VsZCBiZSBjcmVhdGVkIGluc3RlYWQgYW5kIHRoZSBsaWJyYXJpZXMgb2YgaW50ZXJlc3QgZXh0cmFjdGVkIHRvIHRoZXJlLiBBbmQKLQkgKiAgIHRoZW4gcG9pbnQgdG8gdGhlIGNhY2hlIGRpcmVjdG9yeSBpbnN0ZWFkLgotCSAqIEBwYXJhbSB0eXBlRmxhZyBPbmUgb2YgPGNvZGU+QVBQRU5EX1VTRVJfQ0xBU1NQQVRIPC9jb2RlPiwgPGNvZGU+QVBQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgPGNvZGU+UFJFUEVORF9CT09UX0NMQVNTUEFUSDwvY29kZT4sIG9yIDxjb2RlPkFQUEVORF9KQVZBX0xJQlJBUllfUEFUSDwvY29kZT4uCi0JICogQHBhcmFtIG5sc0xvY2FsaXplIFRoZSB1c3VhbCB2YWx1ZSBzaG91bGQgYmUgPGNvZGU+ZmFsc2U8L2NvZGU+LiBVc2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2hvdWxkIGxvb2sgdGhyb3VnaCBmcmFnbWVudHMgdG8gZ2F0aGVyIHRoZW0gYWxsIGFzIGRlc2NyaWJlZCBpbiB0aGlzIG1ldGhvZHMgZGVzY3JpcHRpb24uIFRoaXMgd2lsbCB3b3JrIGZvciBqYXJyZWQgYnVuZGxlcy9mcmFnbWVudHMgdG9vLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHJlbGF0aXZlUGF0aCwgaW50IHR5cGVGbGFnLCBib29sZWFuIG5sc0xvY2FsaXplKTsJCi0JCi0JLyoqCi0JICogU2FtZSBhcyB7QGxpbmsgI2NvbnRyaWJ1dGVDbGFzc3BhdGgoQnVuZGxlLCBTdHJpbmcsIGludCwgYm9vbGVhbil9IGV4Y2VwdCBhbiBJUGF0aCBjYW4gYmUgdXNlZCBhcyB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHBhcmFtIHJlbGF0aXZlUGF0aCBwYXRoIHRvIGZpbGUgd2l0aGluIGJ1bmRsZS4gT3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgdGhlIGJ1bmRsZS9mcmFnbWVudCBpdHNlbGYgKGZvciB3aGVuIHRoZSBidW5kbGUgaGFzIGJlZW4gamFyJ2VkIHVwKS4KLQkgKiBAcGFyYW0gdHlwZUZsYWcKLQkgKiBAcGFyYW0gbmxzTG9jYWxpemUKLQkgKiAKLQkgKiBAc2VlICNjb250cmlidXRlQ2xhc3NwYXRoKEJ1bmRsZSwgU3RyaW5nLCBpbnQsIGJvb2xlYW4pCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChCdW5kbGUgYnVuZGxlLCBJUGF0aCByZWxhdGl2ZVBhdGgsIGludCB0eXBlRmxhZywgYm9vbGVhbiBubHNMb2NhbGl6ZSk7CQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMGQ3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8xMC8xNCAxNzo0NTowMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLSAKLS8qKgotICogVGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBwYXNzZWQgdG8gdGhlIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IgaW5pdGlhbGl6ZSBtZXRob2QuIEl0IGhhcyBpbmZvCi0gKiB0aGF0IG1heSBiZSBuZWVkZWQgYnkgdGhlIGNvbnRyaWJ1dG9yLiBJdCBtYXkgYmUgc2F2ZWQgZm9yIGxhdGVyIHVzZSwgYnV0IGlmIGNsYXNzcGF0aHMgaGF2ZSBjaGFuZ2VkLAotICogaXQgd29uJ3QgYmUga2VwdCB1cCB0byBkYXRlLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yI2luaXRpYWxpemUoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIHsKLQkKLQkvKioKLQkgKiBIb2xkIHRoZSB2aXNpYmxlIGFuZCBoaWRkZW4gY29udGFpbmVyIHBhdGhzLiAKLQkgKiBBIHZpc2libGUgY29udGFpbmVyIHBhdGggbWVhbnMgaXQgaGFzIGJlZW4gZXhwb3J0ZWQgdXAgdG8gdGhlIHRvcC1sZXZlbCBwcm9qZWN0LiBBbmQgYWxzbwotCSAqIHRoZSBhcnJheSBvZiB0aG9zZSBub3QgdmlzaWJsZS4gVGhlIHBhdGhzIGFyZSB0aGUgU3RyaW5nIGZvcm0gKGkuZS4gSVBhdGgudG9TdHJpbmcoKSkuCi0JICogPHA+Ci0JICogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIHtAbGluayBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8jZ2V0Q29udGFpbmVySWRzKCl9IG1hcC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRhaW5lclBhdGhzIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gdmlzaWJsZVBhdGg7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gaGlkZGVuUGF0aHM7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRhaW5lcklkOwotCQotCQlDb250YWluZXJQYXRocyhTdHJpbmcgY29udGFpbmVySWQsIFN0cmluZ1tdIHZpc2libGVQYXRoLCBTdHJpbmdbXSBoaWRkZW5QYXRocykgewotCQkJLy8gTm90IG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgb3IgY29uc3RydWN0ZWQgYnkgY2xpZW50cy4KLQkJCXRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJJZDsKLQkJCXRoaXMudmlzaWJsZVBhdGggPSB2aXNpYmxlUGF0aDsKLQkJCXRoaXMuaGlkZGVuUGF0aHMgPSBoaWRkZW5QYXRoczsKLQkJfQotCQkKLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnRhaW5lcklkLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldENvbnRhaW5lcklkKCkgewotCQkJcmV0dXJuIGNvbnRhaW5lcklkOwotCQl9Ci0JCQotCQkvKioKLQkJICogQXJyYXkgb2YgdmlzaWJsZSBjb250YWluZXIgcGF0aHMuIEEgcGF0aCBpcyB2aXNpYmxlIGlmIGl0IGlzIGV4cG9ydGVkIHVwIHRvIGFuZCBjYW4KLQkJICogc2VlIGJ5IHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldFZpc2libGVDb250YWluZXJQYXRocygpIHsKLQkJCXJldHVybiB2aXNpYmxlUGF0aDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFycmF5IG9mIGhpZGRlbiBjb250YWluZXIgcGF0aHMuIEEgcGF0aCBpcyBoaWRkZW4gaWYgaXQgaXMgbm90IGV4cG9ydGVkIHVwIHRvIGFuZCBjYW5ub3QKLQkJICogc2VlIGJ5IHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldEhpZGRlbkNvbnRhaW5lclBhdGhzKCkgewotCQkJcmV0dXJuIGhpZGRlblBhdGhzOwotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IGFsbCBvZiB0aGUgcGF0aHMgdG9nZXRoZXIsIGJvdGggdmlzaWJsZSBhbmQgaGlkZGVuLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRBbGxQYXRocygpIHsKLQkJCVN0cmluZ1tdIGFsbFBhdGhzID0gbmV3IFN0cmluZ1t2aXNpYmxlUGF0aC5sZW5ndGgraGlkZGVuUGF0aHMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodmlzaWJsZVBhdGgsIDAsIGFsbFBhdGhzLCAwLCB2aXNpYmxlUGF0aC5sZW5ndGgpOwotCQkJU3lzdGVtLmFycmF5Y29weShoaWRkZW5QYXRocywgMCwgYWxsUGF0aHMsIHZpc2libGVQYXRoLmxlbmd0aCwgaGlkZGVuUGF0aHMubGVuZ3RoKTsKLQkJCXJldHVybiBhbGxQYXRoczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgamF2YSBwcm9qZWN0IHRoYXQgd2UgYXJlIGNvbnRyaWJ1dGluZyBmb3IuCi0JICogCi0JICogQHJldHVybiBqYXZhcHJvamVjdCwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwIG9mIGNvbnRhaW5lcnMgKHRoZSBrZXkpIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBjbGFzc3BhdGguIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZwotCSAqIGlmIHRoZSBjb250YWluZXIgaW1wbGltZW50cyBhIGNvbnRyaWJ1dG9yIGludGVyZmFjZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSB3aWxsIGJlIHtAbGluayBDb250YWluZXJQYXRoc30KLQkgKiAKLQkgKiBAcmV0dXJuIE1hcCBvZiBjb250YWluZXJzLiBLZXlzIG9mIHR5cGUgU3RyaW5nIGZvciBjb250YWluZXIgaWQgKGUuZy4gIlNXVF9DT05UQUlORVIiIGZvciBhIGNvbnRhaW5lciBjbGFzc3BhdGggb2YgIi9TV1RfQ09OVEFJTkVSL1BERS94eXoiLgotCSAqIAlWYWx1ZXMgd2lsbCBiZSB7QGxpbmsgQ29udGFpbmVyUGF0aHN9IEVtcHR5IGlmIGxhdW5jaCBub3QgaW4gYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29udGFpbmVycygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwIG9mIGNvbnRhaW5lciBpZHMgdGhhdCBhcmUgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KLQkgKiA8cD4KLQkgKiBLZXkgd2lsbCBiZSBTdHJpbmcgYW5kIGl0IGlzIHRoZSBmaXJzdCBzZWdtZW50IG9mIGEgY29udGFpbmVyIHBhdGguIFZhbHVlIHdpbGwge0BsaW5rIENvbnRhaW5lclBhdGhzfS4gVGhpcwotCSAqIHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIHZpc2libGUgYW5kIGhpZGRlbiBwYXRocyB0aGF0IHRoZSBwcm9qZWN0IGNhbiBzZWUuIEFsbCBvZiB0aGUgcGF0aHMgd2lsbCBoYXZlCi0JICogdGhlIGtleSAoY29udGFpbmVyIGlkKSBhcyB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIG1hcCBvZiBjb250YWluZXIgaWRzLiBLZXlzIG9mIHR5cGUgU3RyaW5nLiBWYWx1ZXMgd2lsbCBiZSB7QGxpbmsgQ29udGFpbmVyUGF0aHN9IEVtcHR5IGlmIGxhdW5jaCBub3QgaW4gYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29udGFpbmVySWRzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXAgb2YgcGx1Z2luIGlkcyAodGhlIGtleSkgdGhhdCBhcmUgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSB3aWxsIDxjb2RlPkJvb2xlYW48L2NvZGU+IGFuZCB3aWxsIGJlIHRydWUgaWYgcGx1Z2luIHdhcyB2aXNpYmxlIHRvIHRvcC1sZXZlbCBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gbWFwIG9mIHBsdWdpbiBpZHMuIEtleSBvZiB0eXBlIFN0cmluZy4gRW1wdHkgaWYgbGF1bmNoIG5vdCBpbiBhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIE1hcCBnZXRQbHVnaW5JZHMoKTsJCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXAgb2YgcHJvamVjdCBwYXRocyAodGhlIGtleSkgdGhhdCBhcmUgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4gVGhlIHRvcC1sZXZlbCBwcm9qZWN0Ci0JICogd2lsbCBOT1QgYmUgaW4gdGhpcyBsaXN0IHNpbmNlIGl0IGlzIGFzc3VtZWQgdG8gYmUgdmlzaWJsZSB0byBpdHNlbGYuCi0JICogPHA+Ci0JICogVmFsdWUgd2lsbCA8Y29kZT5Cb29sZWFuPC9jb2RlPiBhbmQgd2lsbCBiZSB0cnVlIGlmIHByb2plY3Qgd2FzIHZpc2libGUgdG8gdG9wLWxldmVsIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBtYXAgb2YgcHJvamVjdCBwYXRocy4gS2V5IG9mIHR5cGUgPGNvZGU+SVBhdGg8L2NvZGU+LiBFbXB0eSBpZiBsYXVuY2ggbm90IGluIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvamVjdFBhdGhzKCk7Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZWIwY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbmZpZ3VyYXRpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gY29udHJpYnV0ZSB0byB0aGUgY29uZmlndXJhdGlvbiB0aGF0IHdpbGwgYmUKLSAqIHVzZWQgdG8gc3RhcnQgYSBwcm94eSByZWdpc3RyeS4gCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IgewotCQotCS8qKgotCSAqIENhbGxlZCBmaXJzdCBiZWZvcmUgYW55IG9mIHRoZSBvdGhlciBjYWxscy4gVGhpcyBjYW4gYmUgdXNlZCB0byBkbyBhbnkgaW50ZXJuYWwgaW5pdGlhbGl6YXRpb25zCi0JICogcmVxdWlyZWQgYnkgdGhlIG90aGVyIGNhbGxzLiBUaGF0IHdheSB0aGUgb3RoZXIgY2FsbHMgY2FuIGhhdmUgdGhlIG9yZGVyIGNoYW5nZWQgYXMgdGhlIGltcGxlbWVudGF0aW9uCi0JICogcmVxdWlyZXMuCi0JICogPHA+Ci0JICogTk9URTogRm9yIHRob3NlIHdobyBuZXN0IGNvbmZpZ3VyYXRpb24gY29udHJpYnV0b3JzIChpLmUuIHdpdGhpbiBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbnRyaWJ1dG9yLCBtb3JlCi0JICogY29udHJpYnV0b3JzIGFyZSBkaXNjb3ZlcmVkKSB0aGVuIGl0IGlzIGltcGVyaXRpdmUgdGhhdCB3aGVuIHRob3NlIGNvbnRyaWJ1dG9ycyBhcmUgZGlzY292ZXJlZCB0aGF0IHRoaXMgbWV0aG9kCi0JICogYmUgY2FsbGVkIG9uIHRoZW0gdG9vLiBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGUgY29udHJhY3Qgd2l0aCBjb250cmlidXRvcnMgY2FuIGJlIGZvbGxvd2VkLiBJdCBpcyBiZXN0IGlmIHRoZQotCSAqIGRpc2NvdmVyaWVzIGFyZSBhY3R1YWxseSBkb25lIGluIHRoZSBpbml0aWFsaXplIG1ldGhvZCBpdHNlbGYgc28gdGhhdCBpdCBjYW4gcGFzcyB0aGUgbGF1bmNoIGluZm8gcmlnaHQgdGhlcmUuCi0JICogCi0JICogQHBhcmFtIGluZm8gaW5mbyBjb250YWlucyB0aGluZ3MgbGlrZSBjb250YWluZXJzIHZpc2libGUsIGV0Yy4KLQkgKiAKLQkgKiBAc2VlIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbwotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGluZm8pOwotCQotCS8qKgotCSAqIENvbnRyaWJ1dGUgdG8gdGhlIGNsYXNzcGF0aC4gVGhlIGNvbnRyb2xsZXIgaXMgdXNlZCB0byBkbyB0aGUgYWN0dWFsIGNvbnRyaWJ1dGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbGxlcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGhzKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnRyaWJ1dGUgdXBkYXRlcyB0byB0aGUgY29uZmlndXJhdGlvbi4gSXQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsYXVuY2ggaGFzIHN0YXJ0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENvbnRyaWJ1dGUgdG8gdGhlIHJlZ2lzdHJ5IChvciBpbnRlcmFjdCB3aXRoIHRoZSByZW1vdGUgdm0pIGFmdGVyIHRoZSByZWdpc3RyeSBoYXMgYmVlbgotCSAqIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUmVnaXN0cnkoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbnN0cnVjdG9yUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25zdHJ1Y3RvclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTRlMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbnN0cnVjdG9yUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJQ29uc3RydWN0b3JQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi0vKioKLSAqIFRoaXMgaXMgYSBwcm94eSB0aGF0IGFsbG93cyBhIGNvbnN0cnVjdG9yIHRvIGV4aXN0IGluIHRoZSB0YXJnZXQgVk0KLSAqIGFuZCBiZSByZWZlcmVuY2VkIGluIHRoZSBJREUgVk0KLSAqIENyZWF0aW9uIGRhdGU6ICgxLzE3LzAwIDE6MjE6NTIgUE0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25zdHJ1Y3RvclByb3h5IGV4dGVuZHMgSUFjY2Vzc2libGVPYmplY3RQcm94eSB7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSB3aXRoIG5vIGNyZWF0aW9uIGFyZ3VtZW50cywKLSAqIGkuZS4gZm9yIGEgbnVsbCBjb25zdHJ1Y3RvcgotICogQ3JlYXRpb24gZGF0ZTogKDEvMTcvMDAgMToyMjoxMSBQTSkKLSAqLwotSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBjcmVhdGlvbiBhcmd1bWVudHMKLSAqIENyZWF0aW9uIGRhdGU6ICgxLzE3LzAwIDE6MjI6MTEgUE0pCi0gKi8KLUlCZWFuUHJveHkgbmV3SW5zdGFuY2UoSUJlYW5Qcm94eVtdIGNyZWF0aW9uQXJndW1lbnRzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0KLUlCZWFuUHJveHkgbmV3SW5zdGFuY2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoKTsKLUlCZWFuUHJveHkgbmV3SW5zdGFuY2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eVtdIGNyZWF0aW9uQXJndW1lbnRzKTsKLQotSUJlYW5UeXBlUHJveHlbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRGltZW5zaW9uQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRGltZW5zaW9uQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDMwYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSURpbWVuc2lvbkJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElEaW1lbnNpb25CZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotCi0vKioKLSAqIEludGVyZmFjZSB0byBhIERpbWVuc2lvbiBiZWFuIHByb3h5LgotICogPHA+Ci0gKiBUaGVzZSBhcmUgY29tbW9uIGZvciBkaWZmZXJlbnQgd2luZG93aW5nIHN5c3RlbXMsIGUuZy4gQVdUIGFuZCBTV1QuIFNvIHRoaXMgaGVyZQotICogaXMgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlbS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzcvMDAgMzo0NjozOSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGltZW5zaW9uQmVhblByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSB7Ci0JcHVibGljIGludCBnZXRIZWlnaHQoKTsKLQlwdWJsaWMgaW50IGdldFdpZHRoKCk7Ci0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpOwotCXB1YmxpYyB2b2lkIHNldFdpZHRoKGludCB3aWR0aCk7Ci0JcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCXB1YmxpYyB2b2lkIHNldFNpemUoSURpbWVuc2lvbkJlYW5Qcm94eSBkaW0pOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NmFkZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUV4cHJlc3Npb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSUV4cHJlc3Npb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbjsKLSAKLS8qKgotICogVGhpcyBpcyBhbiBleHByZXNzaW9uLiBJdCB3aWxsIGJlIGV2YWx1YXRlZCBvbiB0aGUgb3RoZXIgc2lkZS4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhbgotICogZXhwcmVzc2lvbiBhbmQgdXNpbmcgSU1ldGhvZFByb3h5J3MsIElDb25zdHJ1Y3RvclByb3h5J3MsIGV0Yy4gaXMgdGhlIGdyYW51bGFyaXR5LiBUaGUgcHJveGllcwotICogYXJlIG9uZSByb3VuZC10cmlwIHRvIHRoZSBvdGhlciBzaWRlIGZvciBlYWNoIGFjY2VzcyBvciBleGVjdXRpb24uIFRoZSBleHByZXNzaW9uIGJ1aWxkcyB0aGVtIHVwCi0gKiBhbmQgd2lsbCBleGVjdXRlIHRoZW0gYWxsIGF0IG9uY2Ugb24gdGhlIG90aGVyIHNpZGUuIEFub3RoZXIgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSByZWZsZWN0aW9uCi0gKiB3aWxsIGJlIGRvbmUgb24gdGhlIG90aGVyIHNpZGUgdG9vLiBGb3IgaW5zdGFuY2Ugd2hlbiBpbnZva2luZyBhIG1ldGhvZCwgdGhlIG1ldGhvZCBuYW1lIGlzCi0gKiBwYXNzZWQgaW50byB0aGUgZXhwcmVzc2lvbiBhcyBhIHN0cmluZyB0aGVuIHJlZmxlY3RlZCBhbmQgdGhlbiBpbnZva2VkLCB3aGlsZSB3aXRoIG1ldGhvZAotICogcHJveGllcywgdGhlIHN0cmluZyBpcyB1c2VkIHRvIGZpbmQgdGhlIHByb3h5IG9uIHRoZSBvdGhlciBzaWRlLCBhbmQgdGhlbiBhIGxhdGVyIHJvdW5kLXRyaXAKLSAqIHdpbGwgYmUgdXNlZCB0byBpbnZva2UgaXQuCi0gKiA8cD4KLSAqIEFsc28gYW4gZXhwcmVzc2lvbiBpcyBhIG9uZS10aW1lIHVzZSBvYmplY3QuIEl0IGNhbid0IGJlIHJldXNlZCBhIHNlY29uZCB0aW1lLiBBIG5ldyBvbmUgbXVzdCBiZQotICogYnVpbHQgdXAgYWdhaW4uCi0gKiA8cD4KLSAqIFdlIGFyZSBub3QgdXNpbmcgc2VwYXJhdGUgaW5zdGFuY2VzIG9mIGV4cHJlc3Npb25zLCBhbmQgdHlwZXMgb2YgZXhwcmVzc2lvbnMsIGJlY2F1c2Ugd2UgZG9uJ3QKLSAqIHdhbnQgdG8gYnVpbGQgdXAgbWFueSBvYmplY3RzIChpbiBhIGZvcm0gb2YgYW4gZXhwcmVzc2lvbiB0cmVlKSB0aGF0IHdpbGwgdGhlbiBiZSB0aHJvd24gYXdheQotICogKG9uZSBmb3IgZWFjaCBleHByZXNzaW9uIGluIHRoZSBuZXN0ZWQgbGlzdCBvZiBleHByZXNzaW9ucykuIFdlIGp1c3QgYnVpbGQgdGhlIGNvbW1hbmQgbGlzdCBhcwotICogd2UgYnVpbGQgdGhlIGV4cHJlc3Npb24uCi0gKiA8cD4KLSAqIFRvIHVzZSwgeW91IGNhbGwgdGhlIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkncyBjcmVhdGVFeHByZXNzaW9uIG1ldGhvZC4gQW4gSUV4cHJlc3Npb24gaXMKLSAqIHJldHVybmVkLiBGcm9tIHRoZXJlIHlvdSB3aWxsIHN0YXJ0IGNyZWF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZXhwcmVzc2lvbi4gQW5kIHRoZW4geW91IHdpbGwKLSAqIGZpbmFsbHkgZWl0aGVyIGdldEV4cHJlc3Npb25WYWx1ZSgpIHRvIGdldCB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24sIG9yIHVzZQotICogaW52b2tlRXhwcmVzc2lvbigpIHRvIGp1c3QgZXhlY3V0ZSB0aGUgZXhwcmVzc2lvbihzKS4gSWYgeW91IHVzZSBnZXRFeHByZXNzaW9uVmFsdWUoKSwgdGhlcmUgY2FuCi0gKiBvbmx5IGJlIG9uZSByb290IGV4cHJlc3Npb24uIElmIHlvdSB1c2UgaW52b2tlRXhwcmVzc2lvbiB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSByb290Ci0gKiBleHByZXNzaW9uLCBhbmQgdGhleSB3aWxsIGFsbCBiZSBleGVjdXRlZC4KLSAqIDxwPgotICogU2luY2Ugc2VxdWVuY2UgaXMgc28gaW1wb3J0YW50LCBpdCB3aWxsIGJlIHRlc3RlZCBhbmQgaWYgYW55dGhpbmcgaXMgZG9uZSBvdXQgb2Ygb3JkZXIgYW4KLSAqIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAqIDxwPgotICogRWFjaCB0aW1lIGFuIGV4cHJlc3Npb24gaXMgY3JlYXRlZCwgb25lIGFyZ3VtZW50IHBhc3NlZCBpbiB3aWxsIGJlIDxjb2RlPmZvckV4cHJlc3Npb248L2NvZGU+IGZsYWcuCi0gKiBUaGlzIGlzIGEgc2V0IG9mIGNvbnN0YW50cyB1c2VkIGFzIGEgY2x1ZSBmb3Igd2hhdCBleHByZXNzaW9uIHRoaXMgZXhwcmVzc2lvbiBpcyBiZWluZyBjcmVhdGVkLgotICogVGhpcyBpcyBmb3IgYSBzYW5pdHkgY2hlY2sgb24gdGhlIHN0YXRlLiBGb3IgZXhhbXBsZSwgd2hlbiBjcmVhdGluZyB0aGUgYXJyYXkgZXhwcmVzc2lvbiBmb3IgYW4KLSAqIGFycmF5IGFjY2VzcywgdGhlIEFSUkFZQUNDRVNTX0FSUkFZIGZsYWcgaXMgcGFzc2VkIGluLiBUaGlzIHdheSBpZiB0aGUgY3VycmVudCBleHByZXNzaW9uIG9uIHRoZQotICogc3RhY2sgaXMgbm90IGZvciBhbiBhcnJheSBhY2Nlc3Mgd2FpdGluZyBmb3IgdGhlIGFycmF5IGV4cHJlc3Npb24sIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAqIFdpdGhvdXQgdGhpcyBmbGFnLCBpdCB3b3VsZCBiZSBlYXN5IHRvIGFjY2lkZW50bHkgY3JlYXRlIHRoZSB3cm9uZyBleHByZXNzaW9uIGF0IHRoZSB3cm9uZyB0aW1lLgotICogT25jZSBzdWNoIGFuIGVycm9yIG9jY3VycywgdGhpcyBJRXhwcmVzc2lvbiB3aWxsIG5vIGxvbmdlciBiZSB2YWxpZC4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCi0gKiBmb3IgYW55IHR5cGUgb2YgYWNjZXNzLgotICogPHA+Ci0gKiBJdCBpcyBndWFyZW50ZWVkIHRoYXQgdGhlIGVudGlyZSBzdGFjayBvZiBjb21tYW5kcyB3aWxsIGJlIHNlbnQgd2l0aG91dCBzdG9wcGluZyBleGNlcHQgZm9yIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICogZHVlIHRvIG91dCBvZiBvcmRlciBleHByZXNzaW9ucy4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBtZWFudCB0byBiZSBuZWl0aGVyIGluc3RhbnRpYXRlZCBub3IgaW1wbGVtZW50ZWQgYnkgY3VzdG9tZXJzLgotICogSXQgaXMgdGhlIGludGVyZmFjZSBpbnRvIHRoZSBleHByZXNzaW9uIHByb2Nlc3NpbmcuIEl0IGlzIHRvIGJlIGluc3RhbnRpYXRlZCB0aHJvdWdoIHRoZSBjcmVhdGVFeHByZXNzaW9uIHJlcXVlc3QuCi0gKiBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb259IGNsYXNzIGlzIGF2YWlsYWJsZSBhcyBBUEkuIEl0IGlzIG5vdCBtZWFudCB0bwotICogYmUgaW5zdGFudGlhdGVkIGJ5IGN1c3RvbWVycywgYnV0IGN1c3RvbWVycyBjYW4gdGFrZSB0aGUgSUV4cHJlc3Npb24gYW5kIGNhc3QgdG8gRXhwcmVzc2lvbiBmb3Igc29tZSBhZHZhbmNlZAotICogQVBJLgotICogIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5I2NyZWF0ZUV4cHJlc3Npb24oKQotICogQHNlZSBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbiBleHRlbmRzIElFeHByZXNzaW9uQ29uc3RhbnRzIHsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lzdHJ5IHRoaXMgZXhwcmVzc2lvbiBpcyB3b3JraW5nIGFnYWluc3QuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpOwotCQotCS8qKgotCSAqIEludm9rZSB0aGUgZXhwcmVzc2lvbihzKS4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByb290IGV4cHJlc3Npb24sIGl0IHdpbGwgaW52b2tlIHRoZW0KLQkgKiBpbiB0aGUgb3JkZXIgY3JlYXRlZC4gSWYgdGhlIGV4cHJlc3Npb24gc3RhY2sgaXMgbm90IGNvbXBsZXRlLCB0aGVuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHRocm93bi4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgaW52b2tlRXhwcmVzc2lvbigpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZXhwcmVzc2lvbiBpcyB2YWxpZC4gSXQgd291bGQgYmUgaW52YWxpZCBpZiBhbnkgb2YgdGhlIGNyZWF0ZS4uLiBjYWxscyBoYWQgdGhyb3duIGFuCi0JICogZXhjZXB0aW9uIG9yIGlmIHRoZSBleHByZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkIChpbnZva2VkIG9yIGdldEV4cHJlc3Npb25WYWx1ZSgpKS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGV4cHJlc3Npb24gaXMgdmFsaWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBoYWQgYmVlbiBzb21lIGVycm9yLCBvciBpZiB0aGUgZXhwcmVzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCk7Ci0JCi0JLyoqCi0JICogQ2xvc2UgdGhlIGV4cHJlc3Npb24uIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGlmIGZvciBzb21lIHJlYXNvbiB7QGxpbmsgSUV4cHJlc3Npb24jaW52b2tlRXhwcmVzc2lvbigpfSBvciB7QGxpbmsgSUV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvblZhbHVlKCl9Ci0JICogd2VyZSBub3QgY2FsbGVkLiBJdCBpcyBub3QgYW4gZXJyb3IgdG8gYWx3YXlzIGNhbGwgdGhpcyBhZnRlciB0aGVzZSBjYWxscy4gSXQgd2lsbCBub3QgaGF2ZSBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgZXhwcmVzc2lvbiBhbHJlYWR5Ci0JICogYmVpbmcgY2xvc2VkLiBpbnZva2UgYW5kIGdldHZhbHVlIGF1dG9tYXRpY2FsbHkgY2FsbCBjbG9zZSBmb3IgeW91LiBJZiB5b3UgZG9uJ3QgY2FsbCBjbG9zZSBpbiBjYXNlIG9mIGFuIGVycm9yLCB0aGUgcmVzb3VyY2VzCi0JICogZm9yIHRoZSBleHByZXNzaW9uIHdpbGwgbm90IGJlIGZyZWVkIHVwLiAKLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpOwotCQotCS8qKgotCSAqIEludm9rZSB0aGUgcm9vdCBleHByZXNzaW9uIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiBJZiB0aGUgZXhwcmVzc2lvbiBzdGFjawotCSAqIGlzIG5vdCBjb21wbGV0ZSwgb3IgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByb290IGV4cHJlc3Npb24sIHRoZW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgdGhyb3duLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSByb290IGV4cHJlc3Npb24uIAotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXRFeHByZXNzaW9uVmFsdWUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gQXJyYXkgQWNjZXNzIChlLmcuIHhbM10pLgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGUgZXhwcmVzc2lvbnMgZm9yOgotCSAqIDxwcmU+Ci0JICogIDxjb2RlPkFSUkFZQUNDRVNTX0FSUkFZPC9jb2RlPgotCSAqICA8Y29kZT5BUlJBWUFDQ0VTU19JTkRFWDwvY29kZT4gYW4gaW5kZXhDb3VudCB0aW1lcy4gCi0JICogPC9wcmU+Ci0JICogPHA+Ci0JICogU28gdGhlIGFycmF5IGFjY2VzcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IDEraW5kZXhDb3VudCBleHByZXNzaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbiBUaGlzIGlzIGZvciB3aGF0IGV4cHJlc3Npb24gdGhpcyBleHByZXNzaW9uIGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogQHBhcmFtIGluZGV4Q291bnQgVGhlIG51bWJlciBvZiBpbmRleCBleHByZXNzaW9ucyB0aGF0IHdpbGwgYmUgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFycmF5QWNjZXNzKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgaW50IGluZGV4Q291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIEFycmF5IENyZWF0aW9uIChlLmcuIDxjb2RlPm5ldyBpbnRbM108L2NvZGU+IG9yIDxjb2RlPm5ldyBpbnRbM11bXTwvY29kZT4gb3IgPGNvZGU+bmV3IGludFtdIHszLCA0fTwvY29kZT4pLgotCSAqIElmIDxjb2RlPmRpbWVuc2lvbkV4cHJlc3Npb25Db3VudDwvY29kZT4gaXMgemVybywgdGhlbiB0aGVyZSBtdXN0IGJlIGFuIGluaXRpYWxpemVyLiBUaGlzIGlzIGJlY2F1c2UKLQkgKiBpZiB0aGVyZSBhcmUgYW55IGRpbWVuc2lvbiBleHByZXNzaW9ucywgdGhlbiBpbml0aWFsaXplcnMgYXJlIGludmFsaWQgYW5kIHZpc2EtdmVyc2EuCi0JICogPHA+Ci0JICogVGhlIGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCBpcyBmb3IgaG93IG1hbnkgZGltZW5zaW9ucyBoYXZlIGFuIGV4cHJlc3Npb24gaW4gdGhlbS4gRm9yIGluc3RhbmNlLAotCSAqIDxjb2RlPm5ldyBpbnRbM108L2NvZGU+IHdpbGwgaGF2ZSBhIGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCBvZiAxLiBXaGlsZQotCSAqIDxjb2RlPm5ldyBpbnRbM11bXTwvY29kZT4gd2lsbCBhbHNvIGhhdmUgY291bnQgb2YgMS4gQW5kIGZpbmFsbHkKLQkgKiA8Y29kZT5uZXcgaW50IFtdPC9jb2RlPiB3aWxsIGhhdmUgYSBjb3VudCBvZiAwLgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGUgZXhwcmVzc2lvbnMgZm9yOgotCSAqIDxwcmU+Ci0JICogIDxjb2RlPkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OPC9jb2RlPiBhIGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCB0aW1lcywgCi0JICogIG9yIGFuIDxjb2RlPmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoKTwvY29kZT4gaWYgZGltZW5zaW9uIGNvdW50IGlzIDAuCi0JICogPC9wcmU+Ci0JICogIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQgYW5kIGlmIGFuIGlubmVyIGNsYXNzLCBpdCBtdXN0IGhhdmUgdGhlICIkIiBmb3JtYXQuIEl0IG11c3QgYWxzbyBpbmNsdWRlIHRoZSBjb3JyZWN0IG51bWJlciBvZiAgPGNvZGU+W108L2NvZGU+IGF0IHRoZSBlbmQuCi0JICogQHBhcmFtIGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyB0eXBlLCBpbnQgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIEFycmF5IENyZWF0aW9uIChlLmcuIDxjb2RlPm5ldyBpbnRbM108L2NvZGU+IG9yIDxjb2RlPm5ldyBpbnRbM11bXTwvY29kZT4gb3IgPGNvZGU+bmV3IGludFtdIHszLCA0fTwvY29kZT4pLgotCSAqIElmIDxjb2RlPmRpbWVuc2lvbkV4cHJlc3Npb25Db3VudDwvY29kZT4gaXMgemVybywgdGhlbiB0aGVyZSBtdXN0IGJlIGFuIGluaXRpYWxpemVyLiBUaGlzIGlzIGJlY2F1c2UKLQkgKiBpZiB0aGVyZSBhcmUgYW55IGRpbWVuc2lvbiBleHByZXNzaW9ucywgdGhlbiBpbml0aWFsaXplcnMgYXJlIGludmFsaWQgYW5kIHZpc2EtdmVyc2EuCi0JICogPHA+Ci0JICogVGhlIGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCBpcyBmb3IgaG93IG1hbnkgZGltZW5zaW9ucyBoYXZlIGFuIGV4cHJlc3Npb24gaW4gdGhlbS4gRm9yIGluc3RhbmNlLAotCSAqIDxvbD4KLQkgKiA8bGk+PGNvZGU+bmV3IGludFszXTwvY29kZT4gd2lsbCBoYXZlIGEgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50IG9mIDEuIFdoaWxlCi0JICogPGxpPjxjb2RlPm5ldyBpbnRbM11bXTwvY29kZT4gd2lsbCBhbHNvIGhhdmUgY291bnQgb2YgMS4gQW5kIGZpbmFsbHkKLQkgKiA8bGk+PGNvZGU+bmV3IGludCBbXTwvY29kZT4gd2lsbCBoYXZlIGEgY291bnQgb2YgMC4KLQkgKiA8L29sPgotCSAqIFRoZSBleHByZXNzaW9ucyB0aGF0IGZvbGxvdyBpZiBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQgaXMgbm90IHplcm8gbXVzdCBldmFsdWF0ZSB0byBiZSBjb21wYXRpYmxlIHRvIGFuIGludCB0eXBlIChpLmUuIGJ5dGUsIGNoYXIsIHNob3J0LCBvciBpbnQpLgotCSAqIEVhY2ggZXhwcmVzc2lvbiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFycmF5IGZvciB0aGF0IGRpbWVuc2lvbiBvZiB0aGF0IHNpemUuIEZvciBleGFtcGxlIDxjb2RlPm5ldyBpbnRbM11bXTwvY29kZT4gd2lsbCBoYXZlIGFuCi0JICogZGltZW5zaW9uIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gIjMiLCBhbmQgc28gaXQgd2lsbCBjcmVhdGUgYW4gYXJyYXkgaW50WzNdW10uCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZSBleHByZXNzaW9ucyBmb3I6Ci0JICogCWRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCB0aW1lcyBhbjogPGNvZGU+QVJSQVlDUkVBVElPTl9ESU1FTlNJT048L2NvZGU+Ci0JICogIG9yIGFuIGNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIgaWYgZGltZW5zaW9uIGNvdW50IGlzIDAuCi0JICogIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4gVGhpcyBtdXN0IGJlIHRoZSBhY3R1YWwgdHlwZSB3aXRoIHRoZSBjb3JyZWN0IHRvdGFsIG51bWJlciBvZiBkaW1lbnNpb25zIChlLmcuICJqYXZhLmxhbmcuT2JqZWN0W11bXSIpLgotCSAqIEBwYXJhbSBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQgbnVtYmVyIG9mIGludCB2YWx1ZWQgZXhwcmVzc2lvbnMgdGhhdCBmb2xsb3cgdGhhdCBnaXZlIHRoZSBzaXplIGZvciBlYWNoIGRpbWVuc2lvbi4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gYXJyYXkgaW5pdGlhbGl6ZXIuIChlLmcuIDxjb2RlPnsyLDN9PC9jb2RlPikuCi0JICogVGhpcyBvbmUgaXMgdW51c3VhbCBpbiB0aGF0IHRoZXJlIGlzIG5vIGZvckV4cHJlc3Npb24uIFRoYXQgaXMgYmVjYXVzZSBhcnJheSBpbml0aWFsaXplcnMgYXJlIG9ubHkgdmFsaWQgaW4KLQkgKiBjZXJ0YWluIHBsYWNlcy4gQW5kIHNvIGlmIGNhbGxlZCB3aGVuIG5vdCBleHBlY3RlZCwgdGhpcyBpcyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJZXhwcmVzc2lvbkNvdW50IHRpbWVzIGFuOiA8Y29kZT5BUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT048L2NvZGU+Ci0JICogCQlleGNlcHQgaWYgdGhlIGV4cHJlc3Npb24gaXMgYW5vdGhlciBhcnJheSBpbml0aWFsaXplci4gVGhhdCBpcyB2YWxpZCBhbmQgZG9lc24ndCBoYXZlIGEgZm9yRXhwcmVzc2lvbiwKLQkgKiAJCWJ1dCBpdCBkb2VzIGNvdW50IGFzIG9uZSBvZiB0aGUgZXhwcmVzc2lvbkNvdW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbkNvdW50IE51bWJlciBvZiBleHByZXNzaW9ucywgbWF5IGJlIDAuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBcnJheUluaXRpYWxpemVyKGludCBleHByZXNzaW9uQ291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCQotCS8qKgotCSAqIENyZWF0ZSBhIGNhc3QgZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT4oc2hvcnQpMTA8L2NvZGU+IG9yIDxjb2RlPihqYXZhLmxhbmcuU3RyaW5nKSAiYXNkIjwvY29kZT4pCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJPGNvZGU+Q0FTVF9FWFBSRVNTSU9OPC9jb2RlPiAKLQkgKiAgCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCBhbmQgaWYgYW4gaW5uZXIgY2xhc3MsIGl0IG11c3QgaGF2ZSB0aGUgIiQiIGZvcm1hdC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNhc3RFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjYXN0IGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+KHNob3J0KTEwPC9jb2RlPiBvciA8Y29kZT4oamF2YS5sYW5nLlN0cmluZykgImFzZCI8L2NvZGU+KQotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCTxjb2RlPkNBU1RfRVhQUkVTU0lPTjwvY29kZT4gCi0JICogIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ2FzdEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0JCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBjbGFzcyBpbnN0YW5jZSBleHByZXNzaW9uIChlLmcuIDxjb2RlPm5ldyBqYXZhLmxhbmcuSW50ZWdlcig1KTwvY29kZT4pCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJYXJndW1lbnRDb3VudCB0aW1lcyBhbjogPGNvZGU+Q0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UPC9jb2RlPgotCSAqIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBjYW4gdGhyb3cge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uVW5yZXNvbHZlZENvbXBpbGF0aW9uRXJyb3J9IHdoaWxlIHByb2Nlc3NpbmcKLQkgKiBhbmQgY2FuIGJlIGNhdWdodCBieSBhbiBFeHByZXNzaW9uIHRyeS9jYXRjaC4gVGhpcyBpcyBub3QgdGhyb3duIHN1Y2ggdGhhdCBpdCBjYW4gYmUgY2F1Z2h0IGJ5IGEgcmVhbCBqYXZhIHRyeS9jYXRjaC4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkIGFuZCBpZiBhbiBpbm5lciBjbGFzcywgaXQgbXVzdCBoYXZlIHRoZSAiJCIgZm9ybWF0LgotCSAqIEBwYXJhbSBhcmd1bWVudENvdW50Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdHlwZSwgaW50IGFyZ3VtZW50Q291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgY2xhc3MgaW5zdGFuY2UgZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT5uZXcgamF2YS5sYW5nLkludGVnZXIoNSk8L2NvZGU+KQotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCWFyZ3VtZW50Q291bnQgdGltZXMgYW46IDxjb2RlPkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVDwvY29kZT4KLQkgKiAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgY2FuIHRocm93IHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLlVucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yfSB3aGlsZSBwcm9jZXNzaW5nCi0JICogYW5kIGNhbiBiZSBjYXVnaHQgYnkgYW4gRXhwcmVzc2lvbiB0cnkvY2F0Y2guIFRoaXMgaXMgbm90IHRocm93biBzdWNoIHRoYXQgaXQgY2FuIGJlIGNhdWdodCBieSBhIHJlYWwgamF2YSB0cnkvY2F0Y2guCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLgotCSAqIEBwYXJhbSBhcmd1bWVudENvdW50Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBhcmd1bWVudENvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT54ICE9IDMgPyA0IDogNTwvY29kZT4pCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJPGNvZGU+Q09ORElUSU9OQUxfQ09ORElUSU9OPC9jb2RlPgotCSAqIAk8Y29kZT5DT05ESVRJT05BTF9UUlVFPC9jb2RlPgotCSAqIAk8Y29kZT5DT05ESVRJT05BTF9GQUxTRTwvY29kZT4JCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24pIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZmllbGQgYWNjZXNzIChlLmcuIDxjb2RlPmphdmEuYXd0LkNvbG9yLnJlZDwvY29kZT4pCi0JICogPHA+Ci0JICogTm90ZTogQXQgdGhpcyB0aW1lIHdlIHJlcXVpcmUgYSByZWNlaXZlci4gSW4gdGhlIGZ1dHVyZSBpdCBtYXkgYmUgcG9zc2libGUgdG8gbm90IGhhdmUgb25lLCBidXQKLQkgKiBmb3IgdGhhdCB3ZSBuZWVkIGEgPGNvZGU+dGhpczwvY29kZT4gb2JqZWN0IHRvIGtub3cgd2hvIHRoZSByZWNlaXZlciBpbXBsaWNpdGx5IGlzLgotCSAqIFRoZSByZWNlaXZlciBtYXkgYmUgYSAidHlwZSByZWNlaXZlciIgaWYgaXQgaXMgYSB0eXBlLCBlLmcuIDxjb2RlPmphdmEuYXd0LkNvbG9yPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAk8Y29kZT5GSUVMRF9SRUNFSVZFUjwvY29kZT4gaWYgaGFzUmVjZWl2ZXIgaXMgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCSAqIEBwYXJhbSBoYXNSZWNlaXZlciBIYXMgYSByZWNlaXZlciBmbGFnLiBDdXJyZW50bHkgdGhpcyBtdXN0IGFsd2F5cyBiZSB0cnVlLiBUaGlzIGlzIGJlY2F1c2UgY2FuJ3QgdGVsbCB3aGF0IGNsYXNzIHRvIGxvb2sgaW50byBmb3IgdGhlIGZpZWxkIHdpdGhvdXQgYSByZWNlaXZlci4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBJRXhwcmVzc2lvbiNjcmVhdGVUeXBlUmVjZWl2ZXIoU3RyaW5nKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIGZpZWxkTmFtZSwgYm9vbGVhbiBoYXNSZWNlaXZlcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgZmllbGQgYWNjZXNzIChlLmcuIDxjb2RlPmphdmEuYXd0LkNvbG9yLnJlZDwvY29kZT4pCi0JICogPHA+Ci0JICogTm90ZTogQXQgdGhpcyB0aW1lIHdlIHJlcXVpcmUgYSByZWNlaXZlciBmb3Igbm9uLXN0YXRpYyBhY2Nlc3MuIEluIHRoZSBmdXR1cmUgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIG5vdCBoYXZlIG9uZSwgYnV0Ci0JICogZm9yIHRoYXQgd2UgbmVlZCBhIDxjb2RlPnRoaXM8L2NvZGU+IG9iamVjdCB0byBrbm93IHdobyB0aGUgcmVjZWl2ZXIgaW1wbGljaXRseSBpcy4KLQkgKiBUaGUgcmVjZWl2ZXIgbWF5IGJlIGEgInR5cGUgcmVjZWl2ZXIiIGlmIGl0IGlzIGEgdHlwZSwgZS5nLiA8Y29kZT5qYXZhLmF3dC5Db2xvcjwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiA8cHJlPgotCSAqIAk8Y29kZT5GSUVMRF9SRUNFSVZFUjwvY29kZT4gaWYgaGFzUmVjZWl2ZXIgaXMgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSBmaWVsZFByb3h5IFRoZSBmaWVsZCBwcm94eSBmb3IgdGhlIGZpZWxkLgotCSAqIEBwYXJhbSBoYXNSZWNlaXZlciBIYXMgYSByZWNlaXZlciBmbGFnLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElFeHByZXNzaW9uI2NyZWF0ZVR5cGVSZWNlaXZlcihTdHJpbmcpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlGaWVsZCBmaWVsZFByb3h5LCBib29sZWFuIGhhc1JlY2VpdmVyKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaWYvZWxzZSBzdG10LiBTaW5jZSB0aGlzIGlzIGEgc3RhdG1lbnQsIHRoZXJlIGlzIG5vIEZvckV4cHJlc3Npb24uIFJPT1RfRVhQUkVTU0lPTiBtdXN0IGJlIHRoZSBuZXh0IGV4cHJlc3Npb24gdHlwZS4KLQkgKiA8cDwKLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIDxwcmU+Ci0JICogICA8Y29kZT5JRl9DT05ESVRJT048L2NvZGU+IFRoZSBpZiB0ZXN0LCBtdXN0IHJldHVybiBib29sZWFuLgotCSAqICAgPGNvZGU+SUZfVFJVRTwvY29kZT4gVGhlIGlmIGNvbmRpdGlvbiBpcyB0cnVlIGNsYXVzZS4gVGhlIGNsYXVzZSBtYXkgYmUgYW4gZXhwcmVzc2lvbiwgb3IgYSBibG9jay4KLQkgKiAgIDxjb2RlPklGX0VMU0U8L2NvZGU+ICBpZiBoYXNFbHNlQ2xhdXNlIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBUaGUgZWxzZSBjbGF1c2UuIFRoZSBjbGF1c2UgbWF5IGJlIGFuIGV4cHJlc3Npb24sIG9yIGEgYmxvY2suCi0JICogPC9wcmU+Ci0JICogCi0JICogQHBhcmFtIGhhc0Vsc2VDbGF1c2UKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUlmRWxzZShib29sZWFuIGhhc0Vsc2VDbGF1c2UpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluZml4IGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+MyArIDQ8L2NvZGU+IG9yIDxjb2RlPjMgKyA0ICsgNTwvY29kZT4pLgotCSAqIDxwPgotCSAqIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMiBvcGVyYW5kcyAoYWxsIHdpdGggdGhlIHNhbWUgb3BlcmF0b3IpIHRoZW4gZm9yIGNvbnZpZW5lbmNlIGFsbCBvZgotCSAqIHRoZSBleHByZXNzaW9uIGNhbiBiZSBkb25lIGluIG9uZSBleHByZXNzaW9uIHRoYW4gcmVxdWlyaW5nIHNldmVyYWwsIG9uZSBmb3IgZWFjaCBvcGVyYXRvci4KLQkgKiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQgb3BlcmF0b3JzLCB0aGVuIGRpZmZlcmVudCBleHByZXNzaW9ucyB3aWxsIGJlIHJlcXVpcmVkLgotCSAqIDxwPgotCSAqIDxwcmU+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJPGNvZGU+SU5GSVhfTEVGVDwvY29kZT4KLQkgKiAJPGNvZGU+SU5GSVhfUklHSFQ8L2NvZGU+Ci0JICogCWV4dGVuZGVkT3BlcmFuZENvdW50IHRpbWVzIGFuOiA8Y29kZT5JTkZJWF9FWFRFTkRFRDwvY29kZT4KLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSBvcGVyYXRvciBUaGUgb3BlcmF0b3IuCi0JICogQHBhcmFtIGV4dGVuZGVkT3BlcmFuZENvdW50IFRoZSBudW1iZXIgb2YgZXh0ZW5kZWQgb3BlcmFuZHMuIE1heSBiZSB6ZXJvLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLklFeHByZXNzaW9uQ29uc3RhbnRzI0lOX0FORAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIEluZml4T3BlcmF0b3Igb3BlcmF0b3IsIGludCBleHRlbmRlZE9wZXJhbmRDb3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2VvZiBleHByZXNzaW9uIChlLmcuIDxjb2RlPnggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9uIGZvcjoKLQkgKiAJPGNvZGU+SU5TVEFOQ0VPRl9WQUxVRTwvY29kZT4KLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkIGFuZCBpZiBhbiBpbm5lciBjbGFzcywgaXQgbXVzdCBoYXZlIHRoZSAiJCIgZm9ybWF0LgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5zdGFuY2VvZkV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2VvZiBleHByZXNzaW9uIChlLmcuIDxjb2RlPnggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9uIGZvcjoKLQkgKiAJPGNvZGU+SU5TVEFOQ0VPRl9WQUxVRTwvY29kZT4KLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKDEwKTwvY29kZT4pLgotCSAqIFdoZW4gdXNpbmcgYSBzdHJpbmcgdGhlIG1ldGhvZCBpbnZva2VkIHdpbGwgYmUgdGhlIG9uZSBtb3N0IGNvbXBhdGlibGUgd2l0aCB0aGUgYXJndW1lbnRzIHNlbnQuIAotCSAqIFRoaXMgYWxsb3dzIG92ZXJsb2FkaW5nIGEgbWV0aG9kIHRvIG9jY3VyIHdoZW4gY29taW5nIGluIGZyb20gYSBwYXJzZSB0cmVlLCBzaW5jZSB0aGUgcGFyc2UgdHJlZQotCSAqIGRvZXNuJ3Qga25vdyB0aGUgZXhhY3QgbWV0aG9kIHRvIHVzZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBdCB0aGlzIHRpbWUgd2UgcmVxdWlyZSBhIHJlY2VpdmVyLiBJbiB0aGUgZnV0dXJlIGl0IG1heSBiZSBwb3NzaWJsZSB0byBub3QgaGF2ZSBvbmUsIGJ1dAotCSAqIGZvciB0aGF0IHdlIG5lZWQgYSA8Y29kZT50aGlzPC9jb2RlPiBvYmplY3QgdG8ga25vdyB3aG8gdGhlIHJlY2VpdmVyIGltcGxpY2l0bHkgaXMuCi0JICogVGhlIHJlY2VpdmVyIG1heSBiZSBhICJ0eXBlIHJlY2VpdmVyIiBpZiBpdCBpcyBhIHR5cGUsIGUuZy4gPGNvZGU+amF2YS5hd3QuQ29sb3I8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9uIGZvcjoKLQkgKiAJPGNvZGU+TUVUSE9EX1JFQ0VJVkVSPC9jb2RlPgotCSAqIAlhcmd1bWVudENvdW50cyB0aW1lcyBleHByZXNzaW9ucyBmb3I6IDxjb2RlPk1FVEhPRF9BUkdVTUVOVDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QKLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIgSGFzIGEgcmVjZWl2ZXIgZmxhZy4gQ3VycmVudGx5IHRoaXMgbXVzdCBhbHdheXMgYmUgdHJ1ZS4KLQkgKiBAcGFyYW0gYXJndW1lbnRDb3VudCBDb3VudCBvZiBudW1iZXIgb2YgYXJndW1lbnRzLiBNYXkgYmUgemVyby4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBJRXhwcmVzc2lvbiNjcmVhdGVUeXBlUmVjZWl2ZXIoU3RyaW5nKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBoYXNSZWNlaXZlciwgaW50IGFyZ3VtZW50Q291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKDEwKTwvY29kZT4pCi0JICogPHA+Ci0JICogTm90ZTogQXQgdGhpcyB0aW1lIHdlIHJlcXVpcmUgYSByZWNlaXZlci4gSW4gdGhlIGZ1dHVyZSBpdCBtYXkgYmUgcG9zc2libGUgdG8gbm90IGhhdmUgb25lLCBidXQKLQkgKiBmb3IgdGhhdCB3ZSBuZWVkIGEgPGNvZGU+dGhpczwvY29kZT4gb2JqZWN0IHRvIGtub3cgd2hvIHRoZSByZWNlaXZlciBpbXBsaWNpdGx5IGlzLgotCSAqIFRoZSByZWNlaXZlciBtYXkgYmUgYSAidHlwZSByZWNlaXZlciIgaWYgaXQgaXMgYSB0eXBlLCBlLmcuIDxjb2RlPmphdmEuYXd0LkNvbG9yPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbiBmb3I6Ci0JICogCTxjb2RlPk1FVEhPRF9SRUNFSVZFUjwvY29kZT4KLQkgKiAJYXJndW1lbnRDb3VudHMgdGltZXMgZXhwcmVzc2lvbnMgZm9yOiA8Y29kZT5NRVRIT0RfQVJHVU1FTlQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gbWV0aG9kUHJveHkgVGhlIHByb3h5IG9mIHRoZSBtZXRob2QKLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIgSGFzIGEgcmVjZWl2ZXIgZmxhZy4gQ3VycmVudGx5IHRoaXMgbXVzdCBhbHdheXMgYmUgdHJ1ZS4KLQkgKiBAcGFyYW0gYXJndW1lbnRDb3VudCBDb3VudCBvZiBudW1iZXIgb2YgYXJndW1lbnRzLiBNYXkgYmUgemVyby4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBJRXhwcmVzc2lvbiNjcmVhdGVUeXBlUmVjZWl2ZXIoU3RyaW5nKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlNZXRob2QgbWV0aG9kUHJveHksIGJvb2xlYW4gaGFzUmVjZWl2ZXIsIGludCBhcmd1bWVudENvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcmVmaXggZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT4hZmxhZzwvY29kZT4gb3IgPGNvZGU+LSgzKzQpPC9jb2RlPikuCi0JICogSWYgeW91IGFyZSBqdXN0IHRyeWluZyB0byBjcmVhdGUgYSBzaWduZWQgbnVtZXJpYyBsaXRlcmFsLCBqdXN0IHVzZSB0aGUgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbCBwYXNzaW5nIGluIGEKLQkgKiBuZWdhdGl2ZSB2YWx1ZS4gWW91IGRvbid0IG5lZWQgdG8gdXNlIHByZWZpeCBleHByZXNzaW9uIGZvciB0aGF0LgotCSAqIDxwPgotCSAqIDxwcmU+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJPGNvZGU+UFJFRklYX09QRVJBTkQ8L2NvZGU+Ci0JICogPC9wcmU+Ci0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gb3BlcmF0b3IgVGhlIG9wZXJhdG9yLiBUaGUgdmFsdWVzIGNvbWUgZnJvbSBJRXhwcmVzc2lvbkNvbnN0YW50cywgdGhlIHByZWZpeCBjb25zdGFudHMuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUV4cHJlc3Npb25Db25zdGFudHMjUFJFX1BMVVMKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmVmaXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVOdWxsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSB0eXBlIGxpdGVyYWwgKGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4pLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgdHlwZSBpcyBiZWluZyB1c2VkIGFzIHZhbHVlIGl0c2VsZiwgbm90Ci0JICogYXMgYSByZWNlaXZlciBmb3IgYSBmaWVsZCBvciBtZXRob2Qgb3IgY29uc3RydWN0b3Igb3IgaW5zdGFuY2VvZi4gTGlrZSBhcyBhbiBhcmd1bWVudCB0byBhIG1ldGhvZC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBJZiB5b3Ugd2FudCBhIHR5cGUgbGl0ZXJhbCB0byBiZSBhbiBJUHJveHlCZWFuVHlwZSwganVzdCB1c2Uge0BsaW5rIElFeHByZXNzaW9uI2NyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLCBJUHJveHkpfSBhbmQgcGFzcyBpbiB0aGUKLQkgKiBJUHJveHlCZWFuVHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkIGFuZCBpZiBhbiBpbm5lciBjbGFzcywgaXQgbXVzdCBoYXZlIHRoZSAiJCIgZm9ybWF0LgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVHlwZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSB0eXBlIHJlY2VpdmVyLiBUaGlzIGlzIHdoZXJlIGEgdHlwZSBpcyB1c2VkIGFzIHRoZSByZWNlaXZlciBvZiBhIGZpZWxkIGFjY2VzcyBvciBhIG1ldGhvZCBpbnZvY2F0aW9uLgotCSAqIChlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcudmFsdWVPZigxMCk8L2NvZGU+KS4gRm9yIHRoaXMgdGhlICJqYXZhLmxhbmcuU3RyaW5nIiBJQmVhblR5cGVQcm94eSBpcyB0aGUgdHlwZSByZWNlaXZlci4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVudXN1YWwgaW4gdGhhdCB0aGVyZSBpcyBubyBmb3JFeHByZXNzaW9uLiBJdCBpc24ndCBuZWVkZWQgYmVjYXVzZSB0aGVzZSBhcmUgb25seSB2YWxpZAotCSAqIGluIGNlcnRhaW4gc2l0dWF0aW9ucyAobWV0aG9kIG9yIGZpZWxkIHJlY2VpdmVyKSBhbmQgaWYgdXNlZCBhbnl3aGVyZSBlbHNlIGl0IGlzIGFuIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkIGFuZCBpZiBhbiBpbm5lciBjbGFzcywgaXQgbXVzdCBoYXZlIHRoZSAiJCIgZm9ybWF0LgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVHlwZVJlY2VpdmVyKFN0cmluZyB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgdHlwZSByZWNlaXZlci4gVGhpcyBpcyB3aGVyZSBhIHR5cGUgaXMgdXNlZCBhcyB0aGUgcmVjZWl2ZXIgb2YgYSBmaWVsZCBhY2Nlc3Mgb3IgYSBtZXRob2QgaW52b2NhdGlvbi4KLQkgKiAoZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoMTApPC9jb2RlPikuIEZvciB0aGlzIHRoZSAiamF2YS5sYW5nLlN0cmluZyIgSVByb3h5QmVhblR5cGUgaXMgdGhlIHR5cGUgcmVjZWl2ZXIuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1bnVzdWFsIGluIHRoYXQgdGhlcmUgaXMgbm8gZm9yRXhwcmVzc2lvbi4gSXQgaXNuJ3QgbmVlZGVkIGJlY2F1c2UgdGhlc2UgYXJlIG9ubHkgdmFsaWQKLQkgKiBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKG1ldGhvZCBvciBmaWVsZCByZWNlaXZlcikgYW5kIGlmIHVzZWQgYW55d2hlcmUgZWxzZSBpdCBpcyBhbiBlcnJvci4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlIHByb3h5LgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUeXBlUmVjZWl2ZXIoSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGJvb2xlYW4gcHJpbWl0aXZlIGxpdGVyYWwgKGUuZy4gPGNvZGU+dHJ1ZTwvY29kZT4pLgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhbHVlIFRoZSBib29sZWFuIHZhbHVlIGZvciB0aGUgbGl0ZXJhbC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBib29sZWFuIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGNoYXJhY3RlciBsaXRlcmFsIChlLmcuIDxjb2RlPidhJzwvY29kZT4gb3IgPGNvZGU+J1xuJzwvY29kZT4pCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIGNoYXJhY3RlciB2YWx1ZSBmb3IgdGhpcyBsaXRlcmFsLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGNoYXIgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBieXRlIGxpdGVyYWwgKGUuZy4gPGNvZGU+KGJ5dGUpMTA8L2NvZGU+KQotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhbHVlIFRoZSBieXRlIHZhbHVlIGZvciB0aGlzIGxpdGVyYWwuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgYnl0ZSB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIGRvdWJsZSBsaXRlcmFsIChlLmcuIDxjb2RlPjEwZDwvY29kZT4pCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIGRvdWJsZSB2YWx1ZSBmb3IgdGhpcyBsaXRlcmFsLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGRvdWJsZSB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIGZsb2F0IGxpdGVyYWwgKGUuZy4gPGNvZGU+MTBmPC9jb2RlPikKLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgZmxvYXQgdmFsdWUgZm9yIHRoaXMgbGl0ZXJhbC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBmbG9hdCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBpbnQgbGl0ZXJhbCAoZS5nLiA8Y29kZT4xMDAwMDA8L2NvZGU+KQotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhbHVlIFRoZSBpbnQgdmFsdWUgZm9yIHRoaXMgbGl0ZXJhbC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBpbnQgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbG9uZyBsaXRlcmFsIChlLmcuIDxjb2RlPjEwbDwvY29kZT4pCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIGxvbmcgdmFsdWUgZm9yIHRoaXMgbGl0ZXJhbC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBsb25nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHNob3J0IGxpdGVyYWwgKGUuZy4gPGNvZGU+KHNob3J0KTEwPC9jb2RlPikKLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgc2hvcnQgdmFsdWUgZm9yIHRoaXMgbGl0ZXJhbC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBzaG9ydCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBzdHJpbmcgbGl0ZXJhbCAoZS5nLiA8Y29kZT4iYXNkZiI8L2NvZGU+KS4gVGhlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nLCB3aXRoIGVzY2FwZXMgYWxyZWFkeQotCSAqIHRyYW5zbGF0ZWQgaW50byB0aGUgdHJ1ZSBjaGFyYWN0ZXIgdmFsdWVzLgotCSAqICAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHZhbHVlIGZvciB0aGlzIGxpdGVyYWwuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTdHJpbmdMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHN1YmV4cHJlc3Npb24uCi0JICogPHA+Ci0JICogQSBzdWJleHByZXNzaW9uIGFsbG93cywgYXQgYW55IHRpbWUsIHRvIGZvcmsgb2ZmIHRoZSBleHByZXNzaW9uIHN0YWNrIGFuZCBkbyBzb21lIG90aGVyIHNldHMgb2YgZXhwcmVzc2lvbnMuCi0JICogV2hlbiB0aGUgY29vcmVzcG9uZGluZyB7QGxpbmsgI2NyZWF0ZVN1YmV4cHJlc3Npb25FbmQoKX0gaXMgY2FsbGVkLCBhbGwgb2YgdGhlIGV4cHJlc3Npb24gcmVzdWx0cyBvbiB0aGUKLQkgKiBzdGFjayB0aGF0IGFjY3VtdWxhdGVkIGR1cmluZyB0aGUgc3ViZXhwcmVzc2lvbiBldmFsdWF0aW9uIHdpbGwgYmUgdGhyb3duIGF3YXkgYW5kIHRoZSBzdGFjayB3aWxsIGJlCi0JICogd2hhdCBpdCB3YXMgYXQgdGhlIHN0YXJ0IG9mIHN1YmV4cHJlc3Npb24uIEFueSBFeHByZXNzaW9uUHJveGllcyB0aGF0IHdlcmUgcmVzb2x2ZWQgZHVyaW5nIHRoZSBldmFsdWF0aW9uIAotCSAqIHdpbGwgbm90IGJlIHRocm93biBhd2F5IGFuZCB3aWxsIHN0aWxsIGJlIHZhbGlkLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZnVsIGlmIGluIHRoZSBtaWRkbGUgb2YgYW4gZXhwcmVzc2lvbiAoc3VjaCBhcyBtZXRob2QgaW52b2NhdGlvbiBhbmQgYW4gYXJndW1lbnQgaXMgbmVlZGVkKSB0bwotCSAqIGdvIG9mZiBhbmQgZ2V0IHRoZSBuZWNlc3NhcnkgdmFsdWUuIFRoaXMgd2lsbCBhbGxvdyBleHByZXNzaW9ucyB0aGF0IHJlcXVpcmUgUk9PVEVYUFJFU1NJT04gc3RhdGUgbGlrZSBhIAotCSAqIHRyeS9jYXRjaC4gSWYgeW91IGtub3cgdGhlIGV4cHJlc3Npb24gZG9lc24ndCBuZWVkIHRoaXMsIHRoZW4gaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gbm90IHVzZSBzdWJleHByZXNzaW9uLgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlOgotCSAqIDxwcmU+PGNvZGU+Ci0JICogICBuZXcgWFlaKAotCSAqICAgICB7KHN1YmV4cHJlc3Npb24pCi0JICogICAgICB0cnkgewotCSAqICAgICAgICAgeCA9IDMqeS5nZXQoKTsKLQkgKiAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICogICAgICAgICB4ID00OwotCSAqICAgICAgfQotCSAqICAgICAoZW5kIHN1YmV4cHJlc3Npb24pfQotCSAqICAgICB4KTsKLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogCi0JICogSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHdlIG5lZWRlZCB0byBjYWxjdWxhdGUgIngiIGFzIHRoZSBhcmd1bWVudCBmb3IgWFlaLCBidXQgaXQgd2FzIHRvbyBjb21wbGljYXRlZCBhbmQKLQkgKiBjb3VsZCB0aHJvdyBleGNlcHRpb25zLiBTbyB3ZSB1c2VkIGEgc3ViZXhwcmVzc2lvbiBpbnN0ZWFkLiAKLQkgKiA8cD4KLQkgKiBPZiBjb3Vyc2UgdGhlIGZvbGxvd2luZyB3b3VsZCBvZiBiZWVuIHRoZSBiZXR0ZXIgd2F5IHRvIGRvIGl0IHdpdGhvdXQgc3ViZXhwcmVzc2lvbnMuIEJ1dCBzb21ldGltZXMKLQkgKiB5b3VyIGNvZGUgaXMgaW4gYSBwb3NpdGlvbiB0aGF0IHlvdSBkb24ndCBrbm93IHlvdSBuZWVkIHRvIGRvIHRoaXMgdW50aWwgaXQgaXMgdG9vIGxhdGUuCi0JICogIDxwcmU+PGNvZGU+Ci0JICogICB0cnkgewotCSAqICAgICAgeCA9IDMqeS5nZXQoKTsKLQkgKiAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICogICAgICB4ID00OwotCSAqICAgfQotCSAqICAgbmV3IFhZWih4KTsKLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTdWJleHByZXNzaW9uKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVTdWJleHByZXNzaW9uRW5kKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gZXhwcmVzc2lvbiB0aGF0IGhhcyBhbiBleGlzdGluZyBiZWFuIHByb3h5IGFzIGl0cyB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbiBUaGlzIGlzIGZvciB3aGF0IGV4cHJlc3Npb24gdGhpcyBleHByZXNzaW9uIGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogQHBhcmFtIHByb3h5IFRoZSBwcm94eSB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGEgdmFsdWUsIGVpdGhlciBhIGJlYW4gcHJveHkgb3IgYW4gZXhwcmVzc2lvbiBwcm94eS4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5IHByb3h5KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0JCQotCS8qKgotCSAqIENyZWF0ZSBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gYmV0d2VlbiBhIFZhcmlhYmxlUmVmZXJlbmNlIGFuZCBhbiBleHByZXNzaW9uLiBUaGUgbGVmdCBvcGVyYW5kIG11c3QgYmUgYSB2YXJpYWJsZSByZWZlcmVuY2UgKGUuZy4gRmllbGRBY2Nlc3Mgb3IKLQkgKiBBcnJheUFjY2VzcykuIFRoZSByaWdodCBvcGVyYW5kIG1heSBiZSBhbnkgZXhwcmVzc2lvbiB0aGF0IHJlc3VsdHMgaW4gYSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiA8cHJlPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogIDxjb2RlPkFTU0lHTk1FTlRfTEVGVDwvY29kZT4KLQkgKiAJPGNvZGU+QVNTSUdOTUVOVF9SSUdIVDwvY29kZT4KLQkgKiA8L3ByZT4KLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24pIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiAoZS5nLiB4ID0gMys0KSB3aGVyZSB4IHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIEV4cHJlc3Npb25Qcm94eS4gCi0JICogSXQgbWF5IGJlIHVzZWQgbGF0ZXIgb24gYXMgYSB2YWx1ZSBpbiB7QGxpbmsgSUV4cHJlc3Npb24jY3JlYXRlRXhwcmVzc2lvblByb3h5RXhwcmVzc2lvbihpbnQsIEV4cHJlc3Npb25Qcm94eSl9LgotCSAqIE9yIGlmIGNhbGxiYWNrcyB3ZXJlIGFkZGVkLCB0aGUgY2FsbGJhY2tzIHdvdWxkIGJlIGNhbGxlZCB0byByZXR1cm4gdGhlIHRydWUgSUJlYW5Qcm94eSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBwcm94eSB3aGVuIHRoZSBjb21wbGV0ZQotCSAqIElFeHByZXNzaW9uIGhhcyBiZWVuIGV2YWx1YXRlZC4gVGhlIHZhbHVlIG9mIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24gKGUuZy4geCkgd2lsbCBiZSBwYXNzZWQgb24gaW50byB0aGUgbmV4dCBleHByZXNzaW9uLgotCSAqIDxwPgotCSAqIDxwcmU+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJPGNvZGU+QVNTSUdOTUVOVF9SSUdIVDwvY29kZT4KLQkgKiA8L3ByZT4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gSXQgaXMgZ3VhcmVudGVlZCBhcyBwYXJ0IG9mIHRoZSBjb250cmFjdCB0aGF0IGV4cHJlc3Npb24gcHJveGllcyB3aWxsIGJlIG5vdGlmaWVkIHRocm91Z2ggdGhlIGxpc3RlbmVycyBvZiB0aGUgZmluYWwgc3RhdGUgaW4gdGhlCi0JICogb3JkZXIgdGhlIGV4cHJlc3Npb24gcHJveGllcyB3ZXJlIGNyZWF0ZWQuIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uIFRoaXMgaXMgZm9yIHdoYXQgZXhwcmVzc2lvbiB0aGlzIGV4cHJlc3Npb24gaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiBAcmV0dXJuIGEgcHJveHkgdG8gdGhlIGV4cHJlc3Npb24gdmFsdWUuIAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSByZWFzc2lnbm1lbnQgZXhwcmVzc2lvbi4gVGhpcyBpcyBsaWtlIHRoZSBvcmlnaW5hbCBwcm94eSBhc3NpZ25tZW50IGV4Y2VwdCB0aGF0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGEgbmV3IHByb3h5LCBpdAotCSAqIHJlYXNzaWducyB0aGUgbmV3IHZhbHVlIHRvIHRoZSBleGlzdGluZyBwcm94eS4gVGhpcyBjYW5ub3QgYmUgdXNlZCBvbiBJQmVhblR5cGVFeHByZXNzaW9uUHJveHkncy4gVGhhdCBpcyBiZWNhdXNlCi0JICogdGhleSBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVnaXN0cnkgYW5kIHNldmVyZSBlcnJvcnMgd291bGQgb2NjdXIgaWYgdGhleSB3ZXJlIHJlYXNzaWduZWQuCi0JICogPHA+Ci0JICogPHByZT4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAk8Y29kZT5BU1NJR05NRU5UX1JJR0hUPC9jb2RlPgotCSAqIDwvcHJlPgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBTaW5jZSB3ZSBhcmUgbm90IGNyZWF0aW5nIGEgbmV3IHByb3h5LCB0aGUgbm90aWZpY2F0aW9uIG9uIHRoZSBjYWxsYmFja3Mgd2lsbCBiZSBpbiB0aGUgb3JpZ2luYWwgb3JkZXIgb2YgcHJveGllcy4gVGhpcwotCSAqIGRvZXMgbm90IGNoYW5nZSB0aGUgbm90aWZpY2F0aW9uIHBvc2l0aW9uIG9mIHRoaXMgcHJveHkuCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gcHJveHkKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBleHByZXNzaW9uIHByb3h5IGlzIGZvciBhIEJlYW5UeXBlIGluc3RlYWQgb2YganVzdCBhIHN0YW5kYXJkIGV4cHJlc3Npb24gcHJveHkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJveHlSZWFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgRXhwcmVzc2lvblByb3h5IHByb3h5KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQSBzaW1wbGUgbWV0aG9kIGludm9jYXRpb24uIFRoaXMgaXMgYSBoZWxwZXIgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIGEgc2ltcGxlIG1ldGhvZCBpbnZva2UuIEl0IHVzZXMgb25seSB0aGUgCi0JICogbWV0aG9kIHByb3h5IChub3QgYSBzdHJpbmcgdG8gbG9vayBpdCB1cCksIGl0IHVzZXMgYSBJQmVhblByb3h5IHJlY2VpdmVyIChub3QgYSBjb21wbGljYXRlZCBleHByZXNzaW9uKSwgYW5kIHRoZQotCSAqIGFyZ3VtZW50cyBhcmUgYSBtaXh0dXJlIG9mIElCZWFuUHJveGllcyBhbmQgRXhwcmVzc2lvblByb3hpZXMuIEFsc28gaXQgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlIG5leHQKLQkgKiBleHByZXNzaW9uIG11c3QgYmUgYSBSb290RXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kIG1ldGhvZHByb3h5IG9mIHRoZSBtZXRob2QKLQkgKiBAcGFyYW0gcmVjZWl2ZXIgdGhlIHJlY2VpdmVyIHByb3h5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgc3RhdGljIG1ldGhvZAotCSAqIEBwYXJhbSBhcmd1bWVudHMgYXJyYXkgb2YgYXJndW1lbnRzLCB3aGVyZSBlYWNoIGVsZW1lbnQgY2FuIG9ubHkgYmUgZWl0aGVyIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhIG51bGwgYXJndW1lbnQsIDxjb2RlPklQcm94eTwvY29kZT4uIFRoZSBhcnJheSBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXJndW1lbnRzLgotCSAqIEBwYXJhbSB3YW50UmVzdWx0IDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IGFuIEV4cHJlc3Npb25Qcm94eSBiYWNrLCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBvbmx5IHVzZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3UgcmVhbGx5IG5lZWQgdGhlIGV4cHJlc3Npb24gcHJveHkuCi0JICogQHJldHVybiBleHByZXNzaW9uIHByb3h5IGlmICJ3YW50UmVzdWx0IiB3YXMgdHJ1ZSwgZWxzZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVTaW1wbGVNZXRob2RJbnZva2UoSVByb3h5TWV0aG9kIG1ldGhvZCwgSVByb3h5IHJlY2VpdmVyLCBJUHJveHlbXSBhcmd1bWVudHMsIGJvb2xlYW4gd2FudFJlc3VsdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQSBzaW1wbGUgZmllbGQgYWNjZXNzLiBUaGlzIGlzIGEgaGVscGVyIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBhIHNpbXBsZSBmaWVsZCBhY2Nlc3MuIEl0IHVzZXMgb25seSB0aGUgCi0JICogZmllbGQgcHJveHkgKG5vdCBhIHN0cmluZyB0byBsb29rIGl0IHVwKSwgYW5kIHRoZSBiZWFuIHByb3h5IHRoYXQgaXMgdGhlIHJlY2VpdmVyLiBBbHNvIGl0IGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZSBuZXh0Ci0JICogZXhwcmVzc2lvbiBtdXN0IGJlIGEgUm9vdEV4cHJlc3Npb24uIEl0IGRvZXNuJ3QgYWxsb3cgY29tcGxpY2F0ZWQgZmllbGQgYWNjZXNzLCBzdWNoIGFzIDxjb2RlPmZpZWxkYS5maWVsZGIuZmllbGRjPC9jb2RlPi4KLQkgKiBTaW5jZSB0aGlzIGlzIGEgZmllbGQgYWNjZXNzLCBpdCB3aWxsIGFsd2F5cyByZXR1cm4gYW4gRXhwcmVzc2lvblByb3h5LiBJdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIHNpbXBsZSBmaWVsZCBhY2Nlc3MKLQkgKiB0aGF0IGRvZXNuJ3QgcmV0dXJuIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmllbGQgZmllbGQgcHJveHkgb2YgdGhlIGZpZWxkLgotCSAqIEBwYXJhbSByZWNlaXZlciB0aGUgcmVjZWl2ZXIgcHJveHkuIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBmb3Igc3RhdGljIGZpZWxkcy4KLQkgKiBAcmV0dXJuIGV4cHJlc3Npb24gcHJveHkgdG8gdGhlIHJlc3VsdCBvZiB0aGUgYWNjZXNzLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGNyZWF0ZVNpbXBsZUZpZWxkQWNjZXNzKElQcm94eUZpZWxkIGZpZWxkLCBJUHJveHkgcmVjZWl2ZXIpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEEgc2ltcGxlIGZpZWxkIHNldC4gVGhpcyBpcyBhIGhlbHBlciB0byBtYWtlIGl0IGVhc2llciBmb3IgYSBzaW1wbGUgZmllbGQgYWNjZXNzLiBJdCB1c2VzIG9ubHkgdGhlIAotCSAqIGZpZWxkIHByb3h5IChub3QgYSBzdHJpbmcgdG8gbG9vayBpdCB1cCksIGFuZCB0aGUgYmVhbiBwcm94eSB0aGF0IGlzIHRoZSByZWNlaXZlci4gQWxzbyBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGUgbmV4dAotCSAqIGV4cHJlc3Npb24gbXVzdCBiZSBhIFJvb3RFeHByZXNzaW9uLiBJdCBkb2Vzbid0IGFsbG93IGNvbXBsaWNhdGVkIGZpZWxkIGFjY2VzcyBzZXR0aW5nLCBzdWNoIGFzIDxjb2RlPmZpZWxkYS5maWVsZGIuZmllbGRjID0gMzwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGZpZWxkIGZpZWxkIHByb3h5IG9mIHRoZSBmaWVsZC4KLQkgKiBAcGFyYW0gcmVjZWl2ZXIgdGhlIHJlY2VpdmVyIHByb3h5LiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBhIHN0YXRpYyBmaWVsZC4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHByb3h5IHRvIHNldCBpdCB0byBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzZXQgdG8gbnVsbCB2YWx1ZS4KLQkgKiBAcGFyYW0gd2FudFJlc3VsdCA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBhbiBFeHByZXNzaW9uUHJveHkgYmFjaywgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgb25seSB1c2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHJlYWxseSBuZWVkIHRoZSBleHByZXNzaW9uIHByb3h5LgotCSAqIEByZXR1cm4gZXhwcmVzc2lvbiBwcm94eSBpZiAid2FudFJlc3VsdCIgd2FzIHRydWUsIGVsc2UgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJveHkgY3JlYXRlU2ltcGxlRmllbGRTZXQoSVByb3h5RmllbGQgZmllbGQsIElQcm94eSByZWNlaXZlciwgSVByb3h5IHZhbHVlLCBib29sZWFuIHdhbnRSZXN1bHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEJlZ2luIGEgYmxvY2suIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIDxwPgotCSAqIEV2ZW50dWFsbHkge0BsaW5rIEV4cHJlc3Npb24jY3JlYXRlQmxvY2tFbmQoKX0gbXVzdCBiZSBjYWxsZWQuIFlvdSBzaG91bGQgdXNlIHRoaXMgcGF0dGVybjoKLQkgKiA8cHJlPjxjb2RlPgotCSAqIGV4cC5jcmVhdGVCZWdpbkJsb2NrKCk7Ci0JICogdHJ5IHsKLQkgKiAgIGV4cC5jcmVhdGUgc29tZXRoaW5nIGVsc2UuCi0JICogICAuLi4KLQkgKiB9IGZpbmFsbHkgewotCSAqICAgZXhwLmNyZWF0ZUVuZEJsb2NrKCk7Ci0JICogfQotCSAqIDwvY29kZT48L3ByZT4KLQkgKiAKLQkgKiBAcmV0dXJuIGJsb2NrbnVtYmVyIGZvciB0aGUgYmxvY2sganVzdCBvcGVuZWQuIENhbiBiZSB1c2VkIGluIHtAbGluayBFeHByZXNzaW9uI2NyZWF0ZUJsb2NrQnJlYWsoaW50KX0uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgaW50IGNyZWF0ZUJsb2NrQmVnaW4oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIERvZXMgYSBicmVhayBmb3IgdGhlIHNwZWNpZmllZCBibG9jayBudW1iZXIuIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIEBwYXJhbSBibG9ja051bWJlcgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQmxvY2tCcmVhayhpbnQgYmxvY2tOdW1iZXIpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBFbmQgYSBibG9jay4gSXQgd2lsbCBhbHdheXMgZW5kIHRoZSBpbm5lciBtb3N0IGJsb2NrIHRoYXQgY3VycmVudGx5IGlzIG9uIHRoZSBzdGFjay4gTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIEV4cHJlc3Npb24jY3JlYXRlQmxvY2tCZWdpbigpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQmxvY2tFbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHRyeS9jYXRjaCBzdGF0ZW1lbnQuIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlIGJlZm9yZSB0cnkgZW5kIG9yIHRoaXMgaXMgaW52YWxpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIHNob3VsZCBiZSBleGVjdXRlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKLQkgKiA8cHJlPjxjb2RlPgotCSAqIGV4cC5jcmVhdGVUcnkoKTsKLQkgKiB0cnkgewotCSAqICAgLi4uIGNyZWF0ZSBvdGhlciBleGNlcHRpb25zIC4uLgotCSAqICAgLi4uIGNyZWF0ZSBjYXRjaC9maW5hbGx5IGNsYXVzZXMgYXMgbmVlZGVkLgotCSAqIH0gZmluYWxseSB7Ci0JICogICBpZiAoZXhwLmlzVmFsaWQoKSkKLQkgKiAgICAgZXhwLmNyZWF0ZVRyeUVuZCgpOwotCSAqIH0KLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUcnkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY2F0Y2ggY2xhdXNlIGZvciB0aGUgaW5uZXIgbW9zdCB0cnkgc3RhdGVtZW50LiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiA8cD4KLQkgKiBVc2luZyB0aGlzIHlvdSBjYW4gZ2V0IGp1c3QgdGhlIGV4Y2VwdGlvbiBhcyBhIHByb3h5IGFuZC9vciBleGVjdXRlIHNvbWUgZXhwcmVzc2lvbnMgYXMgcGFydCBvZiB0aGUgY2F0Y2ggY2xhdXNlLgotCSAqIDxwPgotCSAqIFRoaXMgY2FuIGJlIGZvbGxvd2VkIGJ5IFJvb3RFeHByZXNzaW9ucywgb3IgYW5vdGhlciBjYXRjaCwgb3IgYSBmaW5hbGx5LCBvciBhIHRyeSBlbmQuCi0JICogIAotCSAqIEBwYXJhbSBleGNlcHRpb25UeXBlIHRoZSB0eXBlIG9mIHRoZSBleGNlcHRpb24gdG8gY2F0Y2ggb24uCi0JICogQHBhcmFtIHdhbnRFeGNlcHRpb25SZXR1cm5lZCA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBhbiBleHByZXNzaW9uIHByb3h5IGZvciB0aGUgZXhjZXB0aW9uLgotCSAqIEByZXR1cm4gdGhlIEV4cHJlc3Npb25Qcm94eSBmb3IgdGhlIGV4Y2VwdGlvbiBpZiA8Y29kZT53YW50RXhjZXB0aW9uUmV0dXJuZWQ8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJveHkgY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UoSVByb3h5QmVhblR5cGUgZXhjZXB0aW9uVHlwZSwgYm9vbGVhbiB3YW50RXhjZXB0aW9uUmV0dXJuZWQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIGNhdGNoIGNsYXVzZSBmb3IgdGhlIGlubmVyIG1vc3QgdHJ5IHN0YXRlbWVudC4gTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogPHA+Ci0JICogVXNpbmcgdGhpcyB5b3UgY2FuIGdldCBqdXN0IHRoZSBleGNlcHRpb24gYXMgYSBwcm94eSBhbmQvb3IgZXhlY3V0ZSBzb21lIGV4cHJlc3Npb25zIGFzIHBhcnQgb2YgdGhlIGNhdGNoIGNsYXVzZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGNhbiBiZSBmb2xsb3dlZCBieSBSb290RXhwcmVzc2lvbnMsIG9yIGFub3RoZXIgY2F0Y2gsIG9yIGEgZmluYWxseSwgb3IgYSB0cnkgZW5kLgotCSAqICAKLQkgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZSB0aGUgdHlwZSBvZiB0aGUgZXhjZXB0aW9uIHRvIGNhdGNoIG9uLgotCSAqIEBwYXJhbSB3YW50RXhjZXB0aW9uUmV0dXJuZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgYW4gZXhwcmVzc2lvbiBwcm94eSBmb3IgdGhlIGV4Y2VwdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSBFeHByZXNzaW9uUHJveHkgZm9yIHRoZSBleGNlcHRpb24gaWYgPGNvZGU+d2FudEV4Y2VwdGlvblJldHVybmVkPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVUcnlDYXRjaENsYXVzZShTdHJpbmcgZXhjZXB0aW9uVHlwZSwgYm9vbGVhbiB3YW50RXhjZXB0aW9uUmV0dXJuZWQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgZmluYWxseSBjbGF1c2UgZm9yIHRoZSBpbm5lciBtb3N0IHRyeSBzdGF0ZW1lbnQuIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIFRoZXJlIG11c3QgYmUgbm8gbW9yZSBjYXRjaCBjbGF1c2VzIGZvciB0aGUgdHJ5IHN0YXRlbWVudCBhZnRlciB0aGlzIGZpbmFsbHkgY2xhdXNlLgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVHJ5RmluYWxseUNsYXVzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247OwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZW5kIG9mIHRoZSBpbm5lciBtb3N0IHRyeSBzdGF0ZW1lbnQuIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIFRoZXJlIG11c3QgYmUgbm8gbW9yZSBjYXRjaC9maW5hbGx5IGNsYXVzZXMgYWZ0ZXIgdGhpcyBleGNlcHQgaWYgYSBuZXcgdHJ5IHN0YXRlbWVudCBpcyBzdGFydGVkLgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVHJ5RW5kKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjs7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgdGhyb3cuIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIFRoZSBuZXh0IGV4cHJlc3Npb24gaXMgdGhlIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24uCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb24gZm9yOgotCSAqIAk8Y29kZT5USFJPV19PUEVSQU5EPC9jb2RlPgotCSAqICAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSByZXRocm93LiBUaGlzIG11c3QgYmUgd2l0aGluIGEgY2F0Y2ggY2xhdXNlIG9yIHRoZXJlIGlzIGFuIGVycm9yLgotCSAqIDxwPiAKLQkgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yOgotCSAqIDxwcmU+PGNvZGU+Ci0JICogdHJ5IHsKLQkgKiAgIC4uIGRvIHNvbWV0aGluZyAuLgotCSAqIH0gY2F0Y2ggKEFuRXhjZXB0aW9uIGUpIHsKLQkgKiAgIC4uIGRvIHNvbWV0aGluZyAuLgotCSAqICAgdGhyb3cgZTsKLQkgKiB9Ci0JICogPC9jb2RlPjwvcHJlPgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUmV0aHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkKLQkvKioKLQkgKiBNYXJrIHRoZSBleHByZXNzaW9uIHN0YWNrIHNvIHRoYXQgaWYgdGhlcmUgYXJlIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbnMgZXJyb3JzIHRoYXQgd291bGQgbWFrZSB0aGUKLQkgKiBleHByZXNzaW9uIGludmFsaWQsIHlvdSBjYW4gcmVzdG9yZSBiYWNrIHRvIHRoaXMgbWFyayBwb2ludCBhbmQgdGhlIGV4cHJlc3Npb24gd2lsbCBub3cgYmUgdmFsaWQKLQkgKiBhZ2FpbiBhbmQgYXQgdGhlIHN0YXRlIGl0IHdhcyB3aGVuIG1hcmsgd2FzIGNyZWF0ZWQuIEFsbCBtYXJrcyBtdXN0IGJlIGVuZGVkLCBhbmQgYXQgdGhlIHNhbWUgbmVzdGluZwotCSAqIGxldmVsLgotCSAqIDxwPgotCSAqIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIDxwPgotCSAqIEl0IG11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGVuZE1hcmsuIFlvdSBtdXN0IHVzZSA8Y29kZT5tYXJrO3RyeS9maW5hbGx5e2VuZE1hcms7fTwvY29kZT4gYmVjYXVzZQotCSAqIHRoZSBtYXJrL2VuZE1hcmsgbXVzdCBtYXRjaCB1cC4gCi0JICogPHByZT48Y29kZT4KLQkgKiBpbnQgbWFyayA9IGV4cHJlc3Npb24ubWFyaygpOwotCSAqIHRyeSB7Ci0JICogICBleHByZXNzaW9uLmNyZWF0ZSAuLi4KLQkgKiB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCSAqICAgcHJvY2VzcyB0aGUgZXJyb3IuCi0JICogfSBmaW5hbGx5IHsKLQkgKiAgIGV4cHJlc3Npb24uZW5kTWFyayhtYXJrKTsgLy8gQWZ0ZXIgdGhpcywgdGhlIGV4cHJlc3Npb24gd2lsbCBiZSB2YWxpZCBhZ2Fpbi4KLQkgKiB9Ci0JICogPC9jb2RlPjwvcHJlPgotCSAqIDxwPgotCSAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBiZSBpbnZhbGlkIG5lc3RpbmcsIGFuZCB3aWxsIHRocm93IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBvbiB0aGUgY3JlYXRlVHJ5RW5kLiBUaGlzIGlzIGJlY2F1c2UKLQkgKiB3ZSB0cmllZCB0byBlbmQgdGhlIFRyeSBzdGF0ZW1lbnQgd2l0aGluIHRoZSBtYXJrLiBUaGlzIGlzIGludmFsaWQgYmVjYXVzZSBpZiB3ZSBsZXQgaXQgZ28gdGhyb3VnaCBpdCB3b3VsZAotCSAqIG9mIHBvcHBlZCB0aGUgc3RhY2sgYW5kIHdoZW4gd2UgZ290IHRvIHRoZSBlbmRNYXJrIHRoZSBzdGFjayB3b3VsZCBvZiBiZWVuIHBvcHBlZCBwYXN0IGl0IGFuZCBpdCBjb3VsZCBub3QKLQkgKiBiZSByZXN0b3JlZCB0byB0aGUgc2FtZSBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhlIHRpbWUgb2YgdGhlIG1hcmsuIFRoZSB0cnkgd291bGQgb2YgYWxyZWFkeSBiZWVuIGVuZGVkLgotCSAqIDxwcmU+PGNvZGU+Ci0JICogZXhwcmVzc2lvbi5jcmVhdGVUcnkoKTsKLQkgKiBpbnQgbWFyayA9IGV4cHJlc3Npb24ubWFyaygpOwotCSAqIHRyeSB7Ci0JICogICBleHByZXNzaW9uLmNyZWF0ZSAuLi4KLQkgKiAgIGV4cHJlc3Npb24uY3JlYXRlVHJ5RW5kKCk7Ci0JICogfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkgKiAgIHByb2Nlc3MgdGhlIGVycm9yLiBUaGUgZXhwcmVzc2lvbiBpcyBub3cgaW52YWxpZC4KLQkgKiB9IGZpbmFsbHkgewotCSAqICAgZXhwcmVzc2lvbi5lbmRNYXJrKG1hcmspOyAvLyBBZnRlciB0aGlzLCB0aGUgZXhwcmVzc2lvbiB3aWxsIGJlIHZhbGlkIGFnYWluLCBpZiBpdCBoYWQgZ29uZSBpbnZhbGlkLgotCSAqIH0KLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogPHA+Ci0JICogSWYgbm90IGF0IFJvb3RFeHByZXNzaW9uIGF0IHRpbWUgb2YgbWFyaygpIHJlcXVlc3QsIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiBAcmV0dXJuIG1hcmsgbnVtYmVyLCB0aGlzIG51bWJlciB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvb3Jlc3BvbmRpbmcgZW5kTWFyay4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jZW5kTWFyayhpbnQpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGludCBtYXJrKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBUaGUgZW5kIG1hcmsgZm9yIGEgbWFyay4gCi0JICogPHA+Ci0JICogTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogQHBhcmFtIG1hcmtOdW1iZXIKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jbWFyaygpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgZW5kTWFyayhpbnQgbWFya051bWJlcikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lFeHRlbnNpb25SZWdpc3RyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lFeHRlbnNpb25SZWdpc3RyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxMzhhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRXh0ZW5zaW9uUmVnaXN0cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUV4dGVuc2lvblJlZ2lzdHJhdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA2LzE1IDIwOjE5OjExICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0gCi0KLS8qKgotICogRXh0ZW5zaW9ucyBwb2ludCAoImV4dGVuc2lvbnMiIGVsZW1lbnRzIG9mIHRoZSAib3JnLmVjbGlwc2UuamVtLnByb3h5LmNvbnRyaWJ1dG9ycyIgZXh0ZW5zaW9uIHBvaW50KS4KLSAqIDxwPgotICogSW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBjYWxsZWQgd2hlbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0cnkgdHlwZSBmb3IgYSBnaXZlbiBjbGFzc1BhdGgvcGx1Z2luIGlzIHByZXNlbnQuCi0gKiBJdCBpcyB1c2VkIHRvIHJlZ2lzdGVyIHRoZSByZWdpc3RyeSB0eXBlIHNwZWNpZmljIGV4dGVuc2lvbnMuCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRXh0ZW5zaW9uUmVnaXN0cmF0aW9uIHsKLQkKLQkvKioKLQkgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhbnkgY29udHJpYnV0ZVRvUmVnaXN0cnkncyBoYXZlIGJlZW4gY2FsbGVkLiBUeXBpY2FsbHkgYWxsIHRoYXQKLQkgKiBzaG91bGQgYmUgZG9uZSBpbiBoZXJlIGlzIHRvIHJlZ2lzdGVyIGV4dGVuc2lvbiBmYWN0b3JpZXMgb3IgY29uc3RhbnRzLiBJdCBpcyBiZXN0IGlmIG5vCi0JICogYWN0dWFsIHByb3h5IGNhbGxzIGFyZSBtYWRlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHJlZ2lzdHJ5IGRvZXMgbm90IHlldCBoYXZlIGFsbCBvZiB0aGUgCi0JICogYXBwcm9wcmlhdGUgZXh0ZW5zaW9ucyByZWdpc3RlcmVkIGFuZCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBhY2NpZGVudGx5IHJlZmVyZW5jZSBhIGJlYW4gdHlwZQotCSAqIHRoYXQgaGFzIG5vdCB5ZXQgaGFkIGl0cyBhcHByb3ByaWF0ZSBmYWN0b3J5IHJlZ2lzdGVyZWQuCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBpZiB1c2VkIGluIG1vcmUgdGhhbiBvbmUgZXh0ZW5zaW9uIG9yIGlmIHVzZWQgaW4gYSBwbHVnaW4gYW5kIGEgY29udGFpbmVyIHBhdGggYW5kIGJvdGggYXJlIGZvdW5kLgotCSAqIFNob3VsZCB0YWtlIHRoaXMgaW50byBhY2NvdW50IGFuZCBub3QgcmVnaXN0ZXIgdHdpY2UuCi0JICogQHBhcmFtIGJhc2VSZWdpc3RyeQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKEJhc2VQcm94eUZhY3RvcnlSZWdpc3RyeSBiYXNlUmVnaXN0cnkpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRmllbGRQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUZpZWxkUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwYWMzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRmllbGRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElGaWVsZFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLS8qKgotICogQSBQcm94eSB0byBhIGZpZWxkIHRoYXQgYWxsb3dzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSByZXRyaWV2ZWQgYW5kIHNldAotICogVGhpcyBhbGxvd3MgdGFyZ2V0IFZNIHByb3h5aW5nIG9mIHRoZSBmaWVsZCBhbmQgaXMgYW5hbGFnb3VzIHRvIHRoZSBqYXZhLmxhbmcuUmVmbGVjdC5GaWVsZAotICogaW4gdGhlIHNhbWUgd2F5IElNZXRob2RQcm94eSBpcyBhbmFsYWdvdXMgdG8gamF2YS5sYW5nLlJlZmxlY3QuTWV0aG9kCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxMjoxNzo1MiBQTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkUHJveHkgZXh0ZW5kcyBJQWNjZXNzaWJsZU9iamVjdFByb3h5LCBJUHJveHlGaWVsZCB7Ci0vKioKLSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCi0gKi8KLUlCZWFuVHlwZVByb3h5IGdldEZpZWxkVHlwZSgpOwotCi0vKioKLSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdXMgb24gdGhlIHN1YmplY3QgYXJndW1lbnQuCi0gKiBJZiB0aGUgZmllbGQgaXMgYSBwcmltaXRpdmUgdHlwZSwgdGhlIHJldHVybiBwcm94eQotICogd2lsbCBiZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUgdG9vLiAgCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxMjoyODo0OCBQTSkKLSAqLwotSUJlYW5Qcm94eSBnZXQoSUJlYW5Qcm94eSBhU3ViamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi0vKioKLSAqIFNldCB0aGUgYXJndW1lbnQgYXMgdGhlIGZpZWxkIHZhbHVlIG9uIHRoZSBzdWJqZWN0Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxMjoyODo0OCBQTSkKLSAqLwotdm9pZCBzZXQoSUJlYW5Qcm94eSBhU3ViamVjdCwgSUJlYW5Qcm94eSBhcmd1bWVudCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JSW50ZWdlckJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUludGVnZXJCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliZTlmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JSW50ZWdlckJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElJbnRlZ2VyQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotCi0KLS8qKgotICogSW50ZXJmYWNlIHRvIGFuIGludGVnZXIgYmVhbiBwcm94eS4KLSAqIFdlIG9yaWdpbmFsbHkgaGFkIG9ubHkgYW4gSW50ZWdlciBwcm94eSwKLSAqIHNvIHRoZSB1c2Ugb2YgaXQgd2FzIHRocm91Z2hvdXQgdGhlIHN5c3RlbS4KLSAqIFdlIGFyZSBub3cgc3VwcG9ydGluZyBOdW1iZXIgaW5zdGVhZCwgYnV0Ci0gKiBiZWNhdXNlIHRoZXJlIHdlcmUgc28gbWFueSBwbGFjZXMgdXNpbmcgaW50LAotICogd2UndmUgbGVmdCBpdCBpbi4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo0MiBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUludGVnZXJCZWFuUHJveHkgZXh0ZW5kcyBJTnVtYmVyQmVhblByb3h5IHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lJbnZva2FibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lJbnZva2FibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxOTA0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JSW52b2thYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJSW52b2thYmxlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGludm9raW5nIG1ldGhvZCBjYWxscyBvbiB0aGUgdm0uCi0gKiBJTWV0aG9kUHJveHkgaW1wbGVtZW50cyBpdCBmb3Igd2hlbiB5b3UgaGF2ZSBhIG1ldGhvZCBwcm94eSBhdmFpbGFibGUsCi0gKiBidXQgeW91IGNhbiBhbHNvIGdldCBhIHN0cmFpZ2h0IGludm9rYWJsZSB3aGljaCB3aWxsIGdldCB0aGUKLSAqIHByb3h5IG9uIHRoZSB2bSBhdCB0aGUgdGltZSBvZiBleGVjdXRpb24uCi0gKiA8cD4KLSAqIFRoZSBtZXRob2QgcHJveHkgZmFjdG9yeSBjYW4gYmUgdXNlZCB0byByZXR1cm4gZWl0aGVyIG1ldGhvZAotICogcHJveGllcyB3aGVuIHRoZSBpbnZva2FibGUgd2lsbCBiZSB1c2VkIG92ZXIgYW5kIG92ZXIsIGFuZAotICogaXQgY2FuIHJldHVybiBJSW52b2thYmxlJ3Mgd2hlbiBpdCBpcyBvbmUgc2hvdCBkZWFsLiBUaG91Z2ggZXZlbgotICogd2hlbiBvbmUtc2hvdCBkZWFsIGl0IGNhbiBiZSB1c2VkIG92ZXIgYW5kIG92ZXIuIFRoZXJlIGlzIGp1c3Qgb3ZlcmhlYWQgYmVjYXVzZSB0aGUgCi0gKiBtZXRob2QgaXMgbG9va2VkIHVwIGVhY2ggdGltZS4gU28gYSByZWFzb25hYmxlIGNvbXByb21pc2Ugd291bGQgYmUgaWYKLSAqIHVzaW5nIGl0IGluZnJlcXVlbnRseSBvciB1c2UgY2xvc2VseSB0b2dldGhlciBvbmNlIG9yIHR3aWNlIGl0IGlzIGJldHRlcgotICogdG8gdXNlIGEgSW52b2thYmxlIGluc3RlYWQgb2YgYSBtZXRob2QgcHJveHkuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW52b2thYmxlIHsKLQotCS8qKgotCSAqIEludm9rZSB1cyBvbiB0aGUgc3ViamVjdAotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQotCS8qKgotCSAqIEludm9rZSB1cyBvbiB0aGUgc3ViamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQKLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzoxMiBBTSkKLQkgKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0JICovCi0JSUJlYW5Qcm94eSBpbnZva2UoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IGFyZ3VtZW50KSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0KLQkvKioKLQkgKiBJbnZva2UgdXMgb24gdGhlIHN1YmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cwotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBhcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQotCS8qKgotCSAqIEludm9rZSB1cyBvbiB0aGUgc3ViamVjdCwgaG93ZXZlciBjYXRjaCBhbGwgZXhjZXB0aW9ucwotCSAqIE9ubHkgdG8gYmUgdXNlZCB3aGVuIHlvdSBkb24ndCB3YW50IFRocm93YWJsZUV4Y2VwdGlvbnMuIFRoaXMgc2hvdWxkCi0JICogbm90IGJlIHRoZSBub3JtYWwgd2F5IHRvIGludm9rZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzoxMiBBTSkKLQkgKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0JICovCi0JSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0KTsKLQotCS8qKgotCSAqIEludm9rZSB1cyBvbiB0aGUgc3ViamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQsIGhvd2V2ZXIgY2F0Y2ggYWxsIGV4Y2VwdGlvbnMKLQkgKiBPbmx5IHRvIGJlIHVzZWQgd2hlbiB5b3UgZG9uJ3Qgd2FudCBUaHJvd2FibGVFeGNlcHRpb25zLiBUaGlzIHNob3VsZAotCSAqIG5vdCBiZSB0aGUgbm9ybWFsIHdheSB0byBpbnZva2UuCi0JICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MTIgQU0pCi0JICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotCSAqLwotCUlCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eSBhcmd1bWVudCk7Ci0KLQkvKioKLQkgKiBJbnZva2UgdXMgb24gdGhlIHN1YmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cywgaG93ZXZlciBjYXRjaCBhbGwgZXhjZXB0aW9ucwotCSAqIE9ubHkgdG8gYmUgdXNlZCB3aGVuIHlvdSBkb24ndCB3YW50IFRocm93YWJsZUV4Y2VwdGlvbnMuIFRoaXMgc2hvdWxkCi0JICogbm90IGJlIHRoZSBub3JtYWwgd2F5IHRvIGludm9rZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzoxMiBBTSkKLQkgKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0JICovCi0JSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5W10gYXJndW1lbnRzKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSU1ldGhvZFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTWV0aG9kUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxMjFlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTWV0aG9kUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElNZXRob2RQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBNZXRob2QgUHJveGllcyBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNjoyOSBBTSkKLSAqIAotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kUHJveHkgZXh0ZW5kcyBJQWNjZXNzaWJsZU9iamVjdFByb3h5LCBJSW52b2thYmxlLCBJUHJveHlNZXRob2QgewotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBjbGFzcyB0aGUgbWV0aG9kIGlzIGRlZmluZWQgaW4uIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIAotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblR5cGVQcm94eSBnZXRDbGFzc1R5cGUoKTsKLQotCS8qKgotCSAqIEFuc3dlciB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIAotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIG1ldGhvZCBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzoxMiBBTSkKLQkgKiAKLQkgKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0JICovCi0JSUJlYW5UeXBlUHJveHlbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOwotCi0JLyoqCi0JICogQW5zd2VyIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIAotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblR5cGVQcm94eSBnZXRSZXR1cm5UeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lNZXRob2RQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lNZXRob2RQcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwYjFiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTWV0aG9kUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJTWV0aG9kUHJveHlGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBtZXRob2QgcHJveGllcy4KLSAqIAotICogVGhlIGZhY3RvcnkgZXhpc3RzIGZvciB1c2UsIGJ1dCBnZW5lcmFsbHkgaXQgaXMgYmV0dGVyIHRvIGdvIHRocm91Z2ggdGhlIGJlYW4gdHlwZSBwcm94eSB0byBnZXQgYSBtZXRob2QgcHJveHkuIFRoaXMgaXMgdXNlZnVsIGZvciBzZXR0aW5nIHVwIGEKLSAqIGJ1bmNoIG9mIG1ldGhvZCBwcm94aWVzIGluIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIHNvIHlvdSBkb24ndCBuZWVkIHRvIGhhdmUgYSBiZWFuIHR5cGUgcHJveHkgZm9yIGVhY2guCi0gKiAKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDY6MjE6NTIgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFByb3h5RmFjdG9yeSBleHRlbmRzIElCZWFuUHJveHlGYWN0b3J5IHsKLQotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBwcm94eSBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLCBhcmd1bWVudHMgZnJvbSB0aGUgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogICAgICAgICAgICBwYXJhbWV0ZXIgdHlwZSBuYW1lcyBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgcGFyYW1ldGVyVHlwZXMgbWVhbnMgbm8gcGFyYW1ldGVycy4KLQkgKiBAcmV0dXJuIGEgbWV0aG9kIHByb3h5IG9yIG51bGwgaWYgY2FuJ3QgYmUgZm91bmQuIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUlNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpOwotCQotCS8qKgotCSAqIFJldHVybiBhbiBJUHJveHlNZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZSwgYXJndW1lbnRzIGZyb20gdGhlIGdpdmVuIGNsYXNzLgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCUlQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIElQcm94eUZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUsIGFyZ3VtZW50cyBmcm9tIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCUlQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSk7Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaW52b2thYmxlIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUsIGFyZ3VtZW50cyBmcm9tIHRoZSBjbGFzcy4gVGhlIG1ldGhvZCBwcm94eSBpcyBub3QgcmV0cmlldmVkLiBJbnN0ZWFkIHRoZSBtZXRob2Qgd2lsbCBiZSBsb29rZWQgdXAKLQkgKiBlYWNoIHRpbWUgb24gdGhlIHZtLiBCZWNhdXNlIG9mIHRoaXMgdGhlc2UgYXJlIHN1aXRhYmxlIG9ubHkgZm9yIG9uZS1zaG90IGludm9rYXRpb25zLiBJZiBpdCBpcyB0byBiZSBpbnZva2VkIG9mdGVuLCB0aGVuIGEgbWV0aG9kIHByb3h5IHNob3VsZAotCSAqIGJlIHJldHJpZXZlZCBpbnN0ZWFkLgotCSAqIDxwPgotCSAqIFRob3VnaCB0eXBpY2FsIGZvciBvbmUtc2hvdCBkZWFsIHRoZSBpbnZva2FibGUgY2FuIGJlIHVzZWQgb3ZlciBhbmQgb3Zlci4gVGhlcmUgaXMganVzdCBvdmVyaGVhZCBiZWNhdXNlIHRoZSBtZXRob2QgaXMgbG9va2VkIHVwIGVhY2ggdGltZS4gU28gYSByZWFzb25hYmxlIGNvbXByb21pc2UKLQkgKiB3b3VsZCBiZSBpZiB1c2luZyBpdCBpbmZyZXF1ZW50bHkgb3IgaXMgdXNlZCBjbG9zZWx5IHRvZ2V0aGVyIG9uY2Ugb3IgdHdpY2UgaXQgaXMgYmV0dGVyIHRvIHVzZSBhIEludm9rYWJsZSBpbnN0ZWFkIG9mIGEgbWV0aG9kIHByb3h5LgotCSAqIDxwPgotCSAqIE5vdGUgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUuIFRoaXMgd29uJ3QgYmUga25vd24gdW50aWwgdGhlIGFjdHVhbCBpbnZva2UgaXMgZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiAgICAgICAgICAgIHBhcmFtZXRlciB0eXBlIG5hbWVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBwYXJhbWV0ZXJUeXBlcyBtZWFucyBubyBwYXJhbWV0ZXJzLgotCSAqIEByZXR1cm4gYW4gaW52b2thYmxlIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUlJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTnVtYmVyQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTnVtYmVyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDQyNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSU51bWJlckJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElOdW1iZXJCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYW4gaW50ZWdlciBiZWFuIHByb3h5LgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjUyOjQyIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTnVtYmVyQmVhblByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSB7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGJ5dGUgdmFsdWUgb2YgdGhlIHByb3hpZWQgTnVtYmVyCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTI6NTkgQU0pCi0gKi8KLWJ5dGUgYnl0ZVZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGRvdWJsZSB2YWx1ZSBvZiB0aGUgcHJveGllZCBOdW1iZXIKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo1OSBBTSkKLSAqLwotZG91YmxlIGRvdWJsZVZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGZsb2F0IHZhbHVlIG9mIHRoZSBwcm94aWVkIE51bWJlcgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjUyOjU5IEFNKQotICovCi1mbG9hdCBmbG9hdFZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGludCB2YWx1ZSBvZiB0aGUgcHJveGllZCBOdW1iZXIKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo1OSBBTSkKLSAqLwotaW50IGludFZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGxvbmcgdmFsdWUgb2YgdGhlIHByb3hpZWQgTnVtYmVyCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTI6NTkgQU0pCi0gKi8KLWxvbmcgbG9uZ1ZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgdmFsdWUgYXMgYSBOdW1iZXIuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTI6NTkgQU0pCi0gKi8KLU51bWJlciBudW1iZXJWYWx1ZSgpOwotLyoqCi0gKiBSZXR1cm4gdGhlIHByaW1pdGl2ZSBzaG9ydCB2YWx1ZSBvZiB0aGUgcHJveGllZCBOdW1iZXIKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo1OSBBTSkKLSAqLwotc2hvcnQgc2hvcnRWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQREVDb250cmlidXRlQ2xhc3NwYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDBjMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElQREVDb250cmlidXRlQ2xhc3NwYXRoLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMTAvMTQgMTc6NDU6MDIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0KLS8qKgotICogQ29udHJpYnV0ZSB0byBjbGFzc3BhdGggUERFIGVudHJpZXMgdGhhdCBhcmUgbmVlZGVkIGZvciBhIGxhdW5jaC4KLSAqIDxwPiAKLSAqIFVzZSB0aGUgPGNvZGU+SU5TVEFOQ0UoKTwvY29kZT4gdG8gYWNjZXNzIHRoZSBjb250cmlidXRvci4gSWYgdGhlIHZhbHVlCi0gKiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBQREUgaXMgbm90IGF2YWlsYWJsZS4KLSAqIAotICogQHNpbmNlIDEuMC4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGggewotCQotCXB1YmxpYyBzdGF0aWMgSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGggSU5TVEFOQ0UgPSBQREVDb250cmlidXRlQ2xhc3NwYXRoSW5zdGFuY2UuZ2V0SW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3NwYXRoIGNvbnRyaWJ1dGlvbnMgZm9yIHRoZSBwbHVnaW5zIGluIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBhZGQgaW4gdGhlIGxpYnJhcmllcyBmcm9tIGFueSBmcmFnbWVudHMgb2YgYW55IHBsdWdpbiB0aGF0IHRoaXMKLQkgKiBwcm9qZWN0IHJlZmVyZW5jZXMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggb3RoZXIgcGx1Z2lucy4KLQkgKiA8cD4KLQkgKiBJdCBpcyB1c2VkIGJ5IGxhdW5jaGVzIHRvIGdldCB0aGUgZnJhZ21lbnQgbGlicmFyaWVzIHNpbmNlIHRoZXNlIGFyZSBub3QKLQkgKiBhZGRlZCBieSBkZWZhdWx0IHRvIHRoZSBjbGFzc3BhdGggZm9yIGEgcHJvamVjdCBieSBQREUuIFRoYXQgaXMgYmVjYXVzZSB0aGV5Ci0JICogYXJlbid0IG5lZWRlZCBmb3IgY29tcGlsYXRpb24gcHVycG9zZXMsIGJ1dCB0aGV5IGFyZSBuZWVkZWQgZm9yIHJ1bm5pbmcuCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2xsZXIgdGhlIGNvbnRyb2xsZXIgdG8gY29udHJpYnV0ZSB0by4KLQkgKiBAcGFyYW0gaW5mbyBjb25maWd1cmF0aW9uIGluZm8gZm9yIHRoZSBwcm9qZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0UERFQ29udHJpYnV0aW9ucyhJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlciwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVBvaW50QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUG9pbnRCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4ZWUxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUG9pbnRCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJUG9pbnRCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYSBQb2ludCBiZWFuIHByb3h5LgotICogPHA+Ci0gKiBUaGVzZSBhcmUgY29tbW9uIGZvciBkaWZmZXJlbnQgd2luZG93aW5nIHN5c3RlbXMsIGUuZy4gQVdUIGFuZCBTV1QuIFNvIHRoaXMgaGVyZQotICogaXMgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlbS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzcvMDAgMzo0NjozOSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJUG9pbnRCZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLQlwdWJsaWMgaW50IGdldFgoKTsKLQlwdWJsaWMgaW50IGdldFkoKTsKLQlwdWJsaWMgdm9pZCBzZXRYKGludCB4KTsKLQlwdWJsaWMgdm9pZCBzZXRZKGludCB5KTsKLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihpbnQgeCwgaW50IHkpOwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQb2ludEJlYW5Qcm94eSBwb2ludCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzk2M2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBBIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHByb3hpZXMuIEl0IGlzIHVzZWQgYnkgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yIHRvIGVhc2lseSBkaXN0aW5xdWlzaCBiZXR3ZWVuCi0gKiBhIHByb3h5IGFuZCBhbiBFeHByZXNzaW9uIHByb3h5LiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lzdHJ5IHRoaXMgcHJveHkgd2FzIGNyZWF0ZWQgd2l0aC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCi0JLyoqCi0JICogSXMgdGhpcyBhIGJlYW4gcHJveHkgKGluY2x1ZGluZyBhbGwgb2YgdGhlIHN1YmludGVyZmFjZXMgb2YgaXQsIGxpa2UgSU1ldGhvZFByb3h5KS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBiZWFuIHByb3h5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmVhblByb3h5KCk7Ci0KLQkvKioKLQkgKiBJcyB0aGlzIGFuIGV4cHJlc3Npb24gcHJveHkuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGFuIGV4cHJlc3Npb24gcHJveHkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eUJlYW5UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlCZWFuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJlNGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eUJlYW5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSVByb3h5QmVhblR5cGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wNS8xOCAxODo0MToyMCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGZvciBJQmVhblR5cGVQcm94eSdzIGFuZCBCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSdzIHNvIHRoYXQgd2UgY2FuIGxhemlseQotICogZ2V0IHRoZSBiZWFudHlwZSBwcm94eSBhbmQgaGF2ZSB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzIGl0IHdoZW4gbmVlZGVkLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHlCZWFuVHlwZSBleHRlbmRzIElQcm94eSB7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIHR5cGUgd2UgYXJlIHByb3h5aW5nIFRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBGb3IgYXJyYXlzIGl0IHdpbGwgcmV0dXJuIHRoZSBmb3JtYXQ6IFtMY2xhc3NuYW1lOyAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgSVByb3h5TWV0aG9kIGZvciB0aGUgbWV0aG9kIGZyb20gdGhpcyBiZWFudHlwZS4gSXQgbWF5IGJlIGVpdGhlciBhIHJlc29sdmVkIG1ldGhvZCBwcm94eSAoaWYgYWxyZWFkeSByZXNvbHZlZCkgb3IKLQkgKiBpdCBtYXkgYmUgYW4gRXhwcmVzc2lvblByb3h5IGlmIG5vdCB5ZXQgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyBhcnJheSBvZiBwYXJhbWV0ZXIgdHlwZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVycy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcyk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHlNZXRob2QgZm9yIHRoZSBtZXRob2QgZnJvbSB0aGlzIGJlYW50eXBlIHdoZXJlIHRoZSBtZXRob2QgaGFzIG5vIGFyZ3VtZW50cy4gSXQgbWF5IGJlIGVpdGhlciBhIHJlc29sdmVkIG1ldGhvZCBwcm94eSAoaWYgYWxyZWFkeSByZXNvbHZlZCkgb3IKLQkgKiBpdCBtYXkgYmUgYW4gRXhwcmVzc2lvblByb3h5IGlmIG5vdCB5ZXQgcmVzb2x2ZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBnZXRNZXRob2RQcm94eSgpIHRoYXQgdGFrZXMgYXJndW1lbnRzIG5hbWVzIHdoZXJlIHRoZSBuYW1lcyBoYXZlIGJlZW4gc2VudCBhcyBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHlNZXRob2QgZm9yIHRoZSBtZXRob2QgZnJvbSB0aGlzIGJlYW50eXBlLiBJdCBtYXkgYmUgZWl0aGVyIGEgcmVzb2x2ZWQgbWV0aG9kIHByb3h5IChpZiBhbHJlYWR5IHJlc29sdmVkKSBvcgotCSAqIGl0IG1heSBiZSBhbiBFeHByZXNzaW9uUHJveHkgaWYgbm90IHlldCByZXNvbHZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIGFycmF5IG9mIHBhcmFtZXRlciB0eXBlcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXJhbWV0ZXJzLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHl5RmllbGQgZm9yIHRoZSBmaWVsZCBmcm9tIHRoaXMgYmVhbnR5cGUuIEl0IG1heSBiZSBlaXRoZXIgYSByZXNvbHZlZCBmaWVsZCBwcm94eSAoaWYgYWxyZWFkeSByZXNvbHZlZCkgb3IKLQkgKiBpdCBtYXkgYmUgYW4gRXhwcmVzc2lvblByb3h5IGlmIG5vdCB5ZXQgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4N2UwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElQcm94eUNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0gCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIHdpdGggdGhlIHBsdWdpbiB4bWwuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUNvbnN0YW50cyB7Ci0JCi0JLyoqCi0JICogTGF1bmNoIGdyb3VwIGlkIGZvciBwcm94eSBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BST1hZX0xBVU5DSF9HUk9VUCA9ICJvcmcuZWNsaXBzZS5qZW0ucHJveHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gdHlwZSBmb3IgbG9jYWwgcHJveHkuIEl0IGlzIGxvY2FsIGluIHRoYXQgaXQgaXMgb24gdGhlIHNhbWUgbWFjaGluZSwgYnV0IGEgZGlmZmVyZW50Ci0JICogVk0gdGhlbiB0aGUgb25lIHJ1bm5pbmcgdGhlIElERS4gCi0JICogCi0JICogSXQgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIGRlZmF1bHQgY29uZmlnIHR5cGUgd2hlbiBubyBsYXVuY2ggY29uZmlnIHNwZWNpZmllZCBmb3IgYSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0xBVU5DSF9UWVBFID0gIm9yZy5lY2xpcHNlLmplbS5wcm94eS5Mb2NhbFByb3h5TGF1bmNoQ29uZmlndXJhdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQXR0cmlidXRlIG9uIFByb3h5IExhdW5jaCBDb25maWd1cmF0aW9uOgotCSAqIAotCSAqIEtleSB1c2VkIGluIExhdW5jaCBDb25maWd1cmF0aW9uIGZvciBhdHRhY2hpbmcgQVdUL1N3aW5nIHRvIHRoZSByZWdpc3RyeS4gVGhpcyBtZWFucyBzaW1wbHkKLQkgKiB0aGF0IEFXVC9Td2luZyBzaG91bGQgYmUgdHJlYXRlZCBhcyBiZWluZyBpbiB0aGUgcmVnaXN0cnkgb3Igbm90LiBJdCBkb2Vzbid0IGFjdHVhbGx5IHByZXZlbnQKLQkgKiB0aGVtIGZyb20gYmVpbmcgdGhlcmUuCi0JICoKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgInRydWUiLCBzbyBpdCBzaG91bGQgYmUgc2V0IG9ubHkgdG8gImZhbHNlIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQVdUX1NXSU5HID0gIm9yZy5lY2xpcHNlLmplbS5wcm94eS5BV1QvU3dpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQXR0cmlidXRlIG9uIFByb3h5IExhdW5jaCBDb25maWd1cmF0aW9uOgotCSAqIAotCSAqIEtleSB1c2VkIGluIExhdW5jaCBDb25maWd1cmF0aW9uIGZvciB0aGUgY29udHJpYnV0b3JzIGFuZCByZXR1cm5pbmcgdGhlIHJlZ2lzdHJ5LiBBZnRlciByZXRyaWV2aW5nIGtleSwKLQkgKiBnbyBiYWNrIHRvIFByb3h5TGF1bmNoU3VwcG9ydCB0byByZXRyaWV2ZSB0aGUgY29udHJpYnV0b3JzLiBBbmQgaXQgdXNlcyBpdCB0byByZXR1cm4gdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIE5vdCB0byBiZSBzZXQgYnkgY29udHJpYnV0b3JzLiBUaGlzIHdpbGwgYmUgc2V0IG9ubHkgYnkgdGhlIFByb3h5TGF1bmNoU3VwcG9ydCBzdGFydCBpbXBsZW1lbnRhdGlvbiBtZXRob2RzLgotCSAqIEl0IGlzIGhlcmUgb25seSBiZWNhdXNlIGV4dGVybmFsIGRldmVsb3BlcidzIGxhdW5jaCBjb25maWd1cmF0aW9ucyB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhpcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTEFVTkNIX0tFWSA9ICJvcmcuZWNsaXBzZS5qZW0ucHJveHkuTGF1bmNoS2V5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEF0dHJpYnV0ZSBvbiBQcm94eSBMYXVuY2ggQ29uZmlndXJhdGlvbjoKLQkgKiAgCi0JICogVk0gdGl0bGUgdXNlZCBmb3IgdGhlIGxhdW5jaCByZWdpc3RyeS4KLQkgKiAKLQkgKiBOb3QgdG8gYmUgc2V0IGJ5IGNvbnRyaWJ1dG9ycy4gVGhpcyB3aWxsIGJlIHNldCBvbmx5IGJ5IHRoZSBQcm94eUxhdW5jaFN1cHBvcnQgc3RhcnQgaW1wbGVtZW50YXRpb24gbWV0aG9kcy4KLQkgKiBJdCBpcyBoZXJlIG9ubHkgYmVjYXVzZSBleHRlcm5hbCBkZXZlbG9wZXIncyBsYXVuY2ggY29uZmlndXJhdGlvbnMgd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gYWNjZXNzIHRoaXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZNX1RJVExFID0gIm9yZy5lY2xpcHNlLmplbS5wcm94eS52bXRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlGaWVsZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5RmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlZjk1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElQcm94eUZpZWxkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBmb3IgSUZpZWxkUHJveHkncyBhbmQgRmllbGRFeHByZXNzaW9uUHJveHkncyBzbyB0aGF0IHdlIGNhbiBsYXppbHkKLSAqIGdldCB0aGUgZmllbGQgcHJveHkgYW5kIGhhdmUgdGhlIGV4cHJlc3Npb24gcHJvY2VzcyBpdCB3aGVuIG5lZWRlZC4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUZpZWxkIGV4dGVuZHMgSVByb3h5IHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5TWV0aG9kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2ODg2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJUHJveHlNZXRob2QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wNS8xMSAxOTowMToxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGZvciBJTWV0aG9kUHJveHkncyBhbmQgTWV0aG9kRXhwcmVzc2lvblByb3h5J3Mgc28gdGhhdCB3ZSBjYW4gbGF6aWx5Ci0gKiBnZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgaGF2ZSB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzIGl0IHdoZW4gbmVlZGVkLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHlNZXRob2QgZXh0ZW5kcyBJUHJveHkgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUmVjdGFuZ2xlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUmVjdGFuZ2xlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZmJmMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElSZWN0YW5nbGVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYSBSZWN0YW5nbGUgYmVhbiBwcm94eS4KLSAqIDxwPgotICogVGhlc2UgYXJlIGNvbW1vbiBmb3IgZGlmZmVyZW50IHdpbmRvd2luZyBzeXN0ZW1zLCBlLmcuIEFXVCBhbmQgU1dULiBTbyB0aGlzIGhlcmUKLSAqIGlzIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZW0uCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC83LzAwIDM6NDY6MzkgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlY3RhbmdsZUJlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHkgewotCXB1YmxpYyBpbnQgZ2V0WCgpOwotCXB1YmxpYyBpbnQgZ2V0WSgpOwotCXB1YmxpYyB2b2lkIHNldFgoaW50IHgpOwotCXB1YmxpYyB2b2lkIHNldFkoaW50IHkpOwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGludCB4LCBpbnQgeSk7Ci0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBvaW50QmVhblByb3h5IHBvaW50KTsKLQkKLQlwdWJsaWMgaW50IGdldEhlaWdodCgpOwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKTsKLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGhlaWdodCk7Ci0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKTsKLQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0JcHVibGljIHZvaWQgc2V0U2l6ZShJRGltZW5zaW9uQmVhblByb3h5IGRpbSk7Ci0JCi0JcHVibGljIHZvaWQgc2V0Qm91bmRzKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQlwdWJsaWMgdm9pZCBzZXRCb3VuZHMoSVJlY3RhbmdsZUJlYW5Qcm94eSByZWN0KTsJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNDAzOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLQotLyoKLSAqICAkUkNTZmlsZTogSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0vKioKLSAqIFRoZSBTdGFuZGFyZCBiYXNlIGJlYW4gcHJveHkgZmFjdG9yeS4KLSAqIFRoaXMgaXMgdGhlIEludGVyZmFjZSB0aGF0IHRoZSBkZXNrdG9wIHdpbGwgdGFsawotICogdG8uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjowOSBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBleHRlbmRzIElCZWFuUHJveHlGYWN0b3J5IHsKLQkKLS8qKgotICogR2V0IHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JVk1TZXJ2ZXJ9IHByb3h5IGZvciB0aGUKLSAqIHRoaXMgcmVnaXN0cnkuIFRoaXMgaXMgb25seSBuZWVkZWQgaWYgeW91IG5lZWQgdG8gZ2l2ZSB0aGUgSVZNc2VydmVyIHRvIGEgcHJveHkgc28gdGhhdAotICogaXQgY2FuIGFjY2VzcyBpdC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IERvZXMgbm90IG5lZWQgdG8gYmUgZ2l2ZW4gdG8gY2FsbGJhY2sgcHJveGllcyBiZWNhdXNlIHRoZXkgYXJlIGdpdmVuCi0gKiBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JVk1DYWxsYmFja1NlcnZlcn0gb24gaW5pdGlhbGl6YXRpb24sIGFuZAotICogdGhhdCBpbnRlcmZhY2UgaW1wbGVtZW50cyB0aGUgSVZNU2VydmVyIGludGVyZmFjZSB0b28uCi0gKiAKLSAqIEByZXR1cm4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IGdldElWTVNlcnZlclByb3h5KCk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgcHJpbWl0aXZlIGludGVnZXIgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSUludGVnZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgYVByaW1pdGl2ZUludGVnZXIpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHByaW1pdGl2ZSBjaGFyYWN0ZXIgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGNoYXIgYVByaW1pdGl2ZUNoYXJhY3Rlcik7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgcHJpbWl0aXZlIGJ5dGUgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGJ5dGUgYVByaW1pdGl2ZUJ5dGUpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHByaW1pdGl2ZSBzaG9ydCBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoc2hvcnQgYVByaW1pdGl2ZVNob3J0KTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBwcmltaXRpdmUgbG9uZyBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgobG9uZyBhUHJpbWl0aXZlTG9uZyk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgcHJpbWl0aXZlIGZsb2F0IGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChmbG9hdCBhUHJpbWl0aXZlRmxvYXQpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHByaW1pdGl2ZSBkb3VibGUgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGRvdWJsZSBhUHJpbWl0aXZlRG91YmxlKTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBCb29sZWFuIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElCb29sZWFuQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoQm9vbGVhbiBhQm9vbGVhbik7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgSW50ZWdlciBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKEludGVnZXIgYW5JbnRlZ2VyKTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBDaGFyYWN0ZXIgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKENoYXJhY3RlciBhQ2hhcmFjdGVyKTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBOdW1iZXIgYXJndW1lbnQsIGNhbiBoYW5kbGUgYW55IG9mIHRoZSBudW1iZXJzLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoTnVtYmVyIGFOdW1iZXIpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHN0cmluZyBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJU3RyaW5nQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoU3RyaW5nIGFTdHJpbmcpOwotCi0vKioKLSAqIENvbnZlcnQgdGhlIG5vbi1wcmltaXRpdmUgcHJveHkgdG8gYSBwcmltaXRpdmUgcHJveHksIGlmIGl0Ci0gKiBvZiBvbmUgb2YgdGhlIHdyYXBwZXIgdHlwZXMuIElmIG5vdCwgdGhlbiBqdXN0IHJldHVybiB0aGUgcHJveHkgYXMgaXMuCi0gKiA8cD4KLSAqIEkuRS4gQm9vbGVhbkNsYXNzUHJveHkgd2lsbCBjb252ZXJ0IHRvIEJvb2xlYW5UeXBlUHJveHksIGJ1dCBPYmplY3RDbGFzc1Byb3h5IHdpbGwganVzdCByZXR1cm4gdW5jaGFuZ2VkLgotICogQHBhcmFtIG5vblByaW1pdGl2ZVByb3h5Ci0gKiBAcmV0dXJuIGVpdGhlciB0aGUgcHJpbWl0aXZlIHByb3h5IHRoYXQgbm9uUHJpbWl0aXZlIHdyYXBwZXJzLCBvciB0aGUgbm9uLXByaW1pdGl2ZSBpZiBub3QgYSB3cmFwcGVyIHR5cGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkoSUJlYW5Qcm94eSBub25QcmltaXRpdmVQcm94eSk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgYm9vbGVhbiBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGJvb2xlYW4gYUJvb2xlYW4pOwotLyoqCi0gKiBDcmVhdGUgYW4gYXJyYXkgYmVhbiBwcm94eS4KLSAqCi0gKiAgIC0gKGludCwgbmV3IGludFsyXSB7MywgNH0pIHdpbGwgY3JlYXRlOgotICogICAgICBpbnQgWzNdIFs0XQotICoKLSAqICAgLSAoaW50W10sIG5ldyBpbnRbMV0gezF9KQotICogICAgICBpbnQgWzFdCi0gKgotICogICAtIChpbnRbXSwgbmV3IGludFsyXSB7MiwzfSkKLSAqICAgICAgaW50IFsyXSBbM10KLSAqIAotICoKLSAqICAgLSAoaW50W10sIG51bGwpIG9yIChpbnRbXSwgbmV3IGludFswXSkgb3IgKGludCwgbnVsbCkgb3IgKGludCwgbmV3IGludFswXSkKLSAqICAgICAgaW50IFswXS4uLgotICogICAgIG9yCi0gKiAgICAgKGludFtdW10uLi4sIG51bGwpIG9yIChpbnRbXVtdLi4uLCBuZXcgaW50WzBdKQotICogICAgICBpbnRbMF1bXS4uLgotICogICAgIFRoaXMgaXMgYmVjYXVzZSBhbiBhcnJheSBpbnN0YW5jZSB3aXRoIG5vIHNwZWNpZmllZCBkaW1lbnNpb25zIGlzIG5vdCB2YWxpZC4gCi0gKgotICogICAtIChpbnRbXVtdLCBuZXcgaW50WzFdIHszfSkKLSAqICAgICAgaW50WzNdW10KLSAqLwotcHVibGljIElBcnJheUJlYW5Qcm94eSAgY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBpbnRbXSBkaW1lbnNpb25zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0vKioKLSAqIENyZWF0ZSBhIG9uZS1kaW1lbnNpb25hbCBhcnJheS4gCi0gKiBUaGUgcmVzdWx0IHdpbGwgYmUgdGhlIHNhbWUgYXMgY2FsbGluZyAKLSAqICAgY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBuZXcgaW50WzFdIHt4fSkKLSAqIHdoZXJlICd4JyBpcyB0aGUgdmFsdWUgcGFzc2VkIGluIGFzIHRoZSBkaW1lbnNpb24uCi0gKi8KLXB1YmxpYyBJQXJyYXlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBpbnQgZGltZW5zaW9uKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0KLS8qKgotICogQ3JlYXRlIGEgYmVhbiBwcm94eSBmcm9tIGFuIGluaXRpYWxpemF0aW9uIHN0cmluZy4gCi0gKiA8cD4KLSAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0aGF0IHRoaXMgbWV0aG9kIGJlIGNvbW1vbmx5IHVzZWQuIFRoYXQgaXMgYmVjYXVzZSBubyB0eXBlIGNoZWNraW5nIHdpbGwgYmUgcGVyZm9ybWVkCi0gKiBvbiB0aGUgcmVzdWx0LiBXaGF0ZXZlciBpdCBldmFsdWF0ZXMgdG8gYmUgd2lsbCBiZSB3aGF0IGl0IGlzLiBJdCBpcyB1c2VmdWwgZm9yIHRoZSByYXJlIGNhc2VzIHdoZXJlIHRoZSBkZXNpcmVkCi0gKiByZXN1bHQgdHlwZSBpcyBub3Qga25vd24uCi0gKiA8cD4KLSAqIEl0IGlzIHJlY29tbWVuZGVkIGluc3RlYWQgdG8gdXNlIHRoZSBuZXdJbnN0YW5jZShpbml0U3RyaW5nKSBtZXRob2Qgb24gdGhlIGFwcHJvcHJpYXRlIElCZWFuVHlwZVByb3h5IHNvIHRoYXQgdGhlCi0gKiByZXN1bHQgY2FuIGJlIHR5cGUtY2hlY2tlZCB0byBtYWtlIHN1cmUgdGhlIHN0cmluZyBldmFsdWF0ZXMgdG8gc29tZXRoaW5nIG9mIHRoYXQgdHlwZS4KLSAqIAotICogQHBhcmFtIGluaXRpYWxpemF0aW9uU3RyaW5nCi0gKiBAcmV0dXJuCi0gKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0gKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlGcm9tKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBDbGFzc0Nhc3RFeGNlcHRpb247Ci0KLS8qKgotICogUmVsZWFzZSB0aGUgcHJveHkuIEluIHRoZSBjYXNlIG9mIFJlbW90ZSBWTSwgdGhpcyBtZWFucwotICogaXQgd2lsbCByZW1vdmUgdGhlIHByb3h5IG9uIHRoZSBjbGllbnQgc2lkZSwgYW5kIHJlbW92ZQotICogdGhlIHJlZmVyZW5jZSB0byB0aGUgcmVhbCBvYmplY3Qgb24gdGhlIHNlcnZlciBzaWRlLiBPbiB0aGUgc2VydmVyCi0gKiBzaWRlIHRoZSByZWFsIG9iamVjdCBtYXkgbm90IGdvIGF3YXkgYmVjYXVzZSBzb21ldGhpbmcgZWxzZSBjb3VsZAotICogYmUgaG9sZGluZyBvbnRvIGl0LCBidXQgaXQgd29uJ3QgYmUgaGVsZCBzaW1wbHkgYmVjYXVzZSB0aGUgY2xpZW50Ci0gKiBpcyBob2xkaW5nIG9udG8gaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbGVhc2VQcm94eShJQmVhblByb3h5IHByb3h5KTsKLQotLyoqCi0gKiBDcmVhdGUgYW4gZXhwcmVzc2lvbi4KLSAqIEByZXR1cm4gVGhlIGV4cHJlc3Npb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgSUV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZDMwMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotLyoqCi0gKiBUaGUgc3RhbmRhcmQgYmVhbiB0eXBlIHByb3h5IGZhY3RvcnkuCi0gKiBUaGlzIGlzIHRoZSBJbnRlcmZhY2UgdGhhdCB0aGUgZGVza3RvcCB3aWxsIHRhbGsKLSAqIHRvLCB0aGUgb25lIHRoYXQgaXMgcmV0dXJuZWQgd2hlbiBnZXRDdXJyZW50KCkgaXMgY2FsbGVkLgotICogQ3JlYXRpb24gZGF0ZTogKDMvMTAvMDAgMTE6MDA6NTAgQU0pCi0gKiBAYXV0aG9yOiBSaWNoYXJkIExlZSBLdWxwCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZXh0ZW5kcyBJQmVhblByb3h5RmFjdG9yeSB7Ci0JCi0vKioKLSAqIFVzZWQgYnkgb3RoZXIgcmVnaXN0ZXJlZCBiZWFuIHR5cGUgcHJveHkgZmFjdG9yaWVzIHRvCi0gKiByZWdpc3RlciB0aGVpciBiZWFuIHR5cGUgcHJveGllcyB3aXRoIHRoZSBzdGFuZGFyZCBmYWN0b3J5Ci0gKiBzbyB0aGF0IGl0IHdpbGwgYmUgY2FjaGVkIHRoZXJlLiAKLSAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY3VzdG9tZXJzLiBJdCBpcyBoZXJlIGZvciB0aGUgdXNhZ2UKLSAqIG9mIHJlZ2lzdHJ5IGV4dGVuc2lvbnMuCi0gKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLSAqIEBwYXJhbSBwZXJtYW5lbnQgaW5kaWNhdGVzIHRoYXQgYmVhbnR5cGUgd2lsbCBuZXZlciBiZSByZWxlYXNlZCwKLSAqIG5vdCBldmVuIGlmIGV4cGxpY2l0IHJlcXVlc3QgaXMgbWFkZS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBib29sZWFuIHBlcm1hbmVudCk7Ci0KLS8qKgotICogVXNlZCBieSBvdGhlciByZWdpc3RlcmVkIGJlYW4gdHlwZSBwcm94eSBmYWN0b3JpZXMgdG8KLSAqIHJlZ2lzdGVyIHRoZWlyIHByb3h5IGJlYW4gdHlwZSB3aXRoIHRoZSBzdGFuZGFyZCBmYWN0b3J5Ci0gKiBzbyB0aGF0IGl0IHdpbGwgYmUgY2FjaGVkIHRoZXJlLiAKLSAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY3VzdG9tZXJzLiBJdCBpcyBoZXJlIGZvciB0aGUgdXNhZ2UKLSAqIG9mIHJlZ2lzdHJ5IGV4dGVuc2lvbnMuCi0gKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLSAqIEBwYXJhbSBwZXJtYW5lbnQgaW5kaWNhdGVzIHRoYXQgYmVhbnR5cGUgd2lsbCBuZXZlciBiZSByZWxlYXNlZCwKLSAqIG5vdCBldmVuIGlmIGV4cGxpY2l0IHJlcXVlc3QgaXMgbWFkZS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5LCBib29sZWFuIHBlcm1hbmVudCk7Ci0KLS8qKgotICogUmV0dXJuIHRoZSBiZWFuVHlwZSBwcm94eSBmb3IgdGhlIGdpdmVuIGNsYXNzIG5hbWUuCi0gKiBJdCBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZC4gQW5kIGZvciBhcnJheXMgaXQgY2FuIGhhbmRsZQotICogZWl0aGVyIHRoZSBqbmkgdHlwZSAoW0xqYXZhLmxhbmcuT2JqZWN0Oykgb3IgdGhlIEphdmEgRU1GIE1vZGVsCi0gKiBmb3JtYWwgdHlwZSAoamF2YS5sYW5nLk9iamVjdFtdKS4KLSAqLwotSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcgY2xhc3NOYW1lKTsKLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlIHByb3h5IHN1aXRhYmxlIGZvciBhbiBleHByZXNzaW9uLgotICogCi0gKiBAcGFyYW0gZXhwcmVzc2lvbgotICogQHBhcmFtIHR5cGVOYW1lCi0gKiBAcmV0dXJuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1JUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZVByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyB0eXBlTmFtZSk7Ci0KLS8qKgotICogUmV0dXJuIGFuIEFycmF5IHR5cGUgcHJveHkgZm9yIHRoZSBnaXZlbiBjbGFzcyBuYW1lIG9mCi0gKiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLiBUaGUKLSAqIHNhbWUgcmVzdWx0IGNhbiBiZSBnb3R0b24gZnJvbSBnZXRCZWFuVHlwZVByb3h5LgotICogZS5nLgotICogICAgICBnZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IiwgMykKLSAqICAgIGlzIHRoZSBzYW1lIGFzOgotICogICAgICBnZXRCZWFuVHlwZVByb3h5KCJbW1tMamF2YS5sYW5nLk9iamVjdDsiKQotICoKLSAqICAgIFRoZXkgYm90aCByZXN1bHQgaW4gYSB0eXBlIG9mOgotICogICAgICBPYmplY3QgW11bXVtdCi0gKiAKLSAqICAgIG9yIGlmIHVzaW5nIHRoZSBKTkkgZm9ybWF0IChwcm94eSBmb3JtYXQpCi0gKiAgICAgIGdldEJlYW5UeXBlUHJveHkoIltMamF2YS5sYW5nT2JqZWN0OyIsIDMpCi0gKiAgICBiZWNvbWVzCi0gKiAgICAgIE9iamVjdCBbXVtdW11bXSAKLSAqIAotICogICAgb3IgaWYgdXNpbmcgdGhlIHN0YW5kYXJkIGphdmEgZm9ybWF0IChhcyBpbiBhY3R1YWwgY29kZSkKLSAqICAgICAgZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nT2JqZWN0W107IiwgMykKLSAqICAgIGJlY29tZXMKLSAqICAgICAgT2JqZWN0IFtdW11bXVtdCi0gKi8KLUlCZWFuVHlwZVByb3h5IGdldEJlYW5UeXBlUHJveHkoU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpOwotCi0vKioKLSAqIFJldHVybiBhbiBBcnJheSB0eXBlIHByb3h5IGZvciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBvZgotICogdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zLiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZC4gVGhlCi0gKiBzYW1lIHJlc3VsdCBjYW4gYmUgZ290dG9uIGZyb20gZ2V0QmVhblR5cGVQcm94eS4KLSAqIGUuZy4KLSAqICAgICAgZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk9iamVjdCIsIDMpCi0gKiAgICBpcyB0aGUgc2FtZSBhczoKLSAqICAgICAgZ2V0QmVhblR5cGVQcm94eSgiW1tbTGphdmEubGFuZy5PYmplY3Q7IikKLSAqCi0gKiAgICBUaGV5IGJvdGggcmVzdWx0IGluIGEgdHlwZSBvZjoKLSAqICAgICAgT2JqZWN0IFtdW11bXQotICogCi0gKiAgICBvciBpZiB1c2luZyB0aGUgSk5JIGZvcm1hdCAocHJveHkgZm9ybWF0KQotICogICAgICBnZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZ09iamVjdDsiLCAzKQotICogICAgYmVjb21lcwotICogICAgICBPYmplY3QgW11bXVtdW10gCi0gKiAKLSAqICAgIG9yIGlmIHVzaW5nIHRoZSBzdGFuZGFyZCBqYXZhIGZvcm1hdCAoYXMgaW4gYWN0dWFsIGNvZGUpCi0gKiAgICAgIGdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZ09iamVjdFtdOyIsIDMpCi0gKiAgICBiZWNvbWVzCi0gKiAgICAgIE9iamVjdCBbXVtdW11bXQotICogCi0gKiBAcGFyYW0gZXhwcmVzc2lvbgotICogQHBhcmFtIGNvbXBvbmVudENsYXNzTmFtZQotICogQHBhcmFtIGRpbWVuc2lvbnMKLSAqIEByZXR1cm4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLUlQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpOwotCi0vKioKLSAqIFRlc3QgaWYgYSBzcGVjaWZpYyBiZWFuIHR5cGUgaGFzIGJlZW4gcmVnaXN0ZXJlZC4gRG9uJ3QgYWNjZXNzIGFuZCBjcmVhdGUKLSAqIGlmIGl0IGlzbid0IGN1cnJlbnRseSByZWdpc3RlcmVkLgotICovCi1ib29sZWFuIGlzQmVhblR5cGVSZWdpc3RlcmVkKFN0cmluZyBjbGFzc05hbWUpOwotCi0vKioKLSAqIFJlZ2lzdGVyZWQgdHlwZXMuIFJldHVybiBhIHNldCBvZiBzdHJpbmdzIHRoYXQgYXJlIHRoZSByZWdpc3RlcmVkIGNsYXNzZXMuCi0gKiBUaGlzIFNldCBpc24ndCBzeW5jaHJvbml6ZWQsIHRoZXJlIG1heSBiZSBjaGFuZ2VzIHdoaWxlIGFjY2Vzc2luZyBpdC4KLSAqLwotU2V0IHJlZ2lzdGVyZWRUeXBlcygpOwotCi0vKioKLSAqIE1haW50YWluIGxpc3Qgb2Ygbm90IGZvdW5kIHR5cGVzLiBUaGlzIGxpc3QgaXMgdHlwZXMgdGhhdCB3ZXJlIHJlcXVlc3RlZCwKLSAqIGJ1dCBkaWRuJ3QgZXhpc3QuIFRoaXMgbWV0aG9kIHNldHMgd2hldGhlciBsaXN0IHNob3VsZCBiZSBtYWludGFpbmVkIG9yIG5vdC4KLSAqIElmIHNldCB0byBmYWxzZSwgdGhlIGxpc3Qgd2lsbCBiZSBlbXB0eS4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gKiAKLSAqIEBwYXJhbSBtYWludGFpbgotICovCi12b2lkIHNldE1haW50YWluTm90Rm91bmRUeXBlcyhib29sZWFuIG1haW50YWluKTsKLQotLyoqCi0gKiBNYWludGFpbiBsaXN0IG9mIG5vdCBmb3VuZCB0eXBlcy4gVGhpcyBsaXN0IGlzIHR5cGVzIHRoYXQgd2VyZSByZXF1ZXN0ZWQsCi0gKiBidXQgZGlkbid0IGV4aXN0LiBUaGlzIG1ldGhvZCByZXR1cm5zIHdoZXRoZXIgbGlzdCBzaG91bGQgYmUgbWFpbnRhaW5lZCBvciBub3QuCi0gKiBJZiBmYWxzZSwgdGhlIGxpc3Qgd2lsbCBiZSBlbXB0eS4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gKiAKLSAqIEByZXR1cm4gbWFpbnRhaW5pbmcgbm90IGZvdW5kIHR5cGVzLgotICovCi1ib29sZWFuIGlzTWFpbnRhaW5Ob3RGb3VuZFR5cGVzKCk7Ci0KLS8qKgotICogTWFpbnRhaW4gbGlzdCBvZiBub3QgZm91bmQgdHlwZXMuIFRoaXMgbGlzdCBpcyB0eXBlcyB0aGF0IHdlcmUgcmVxdWVzdGVkLAotICogYnV0IGRpZG4ndCBleGlzdC4gCi0gKgotICogQHBhcmFtIGNsYXNzTmFtZSBDbGFzc25hbWUgdG8gc2VhcmNoIGZvciB0byBzZWUgaWYgZXZlciBub3QgZm91bmQuCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJlYW4gdHlwZSBoYWQgYmVlbiBzZWFyY2hlZCBmb3IgYnV0IHdhcyBub3QgZm91bmQuIElmIG5vdCBtYWludGFpbmluZywgdGhlbiByZXN1bHQgd2lsbCBiZSBmYWxzZS4KLSAqLwotYm9vbGVhbiBpc0JlYW5UeXBlTm90Rm91bmQoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdHJpbmdCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdHJpbmdCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3ZDQ1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JU3RyaW5nQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSVN0cmluZ0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0vKioKLSAqIE9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBzdHJpbmcgcHJveGllcyB0aGF0Ci0gKiBhbGxvd3MgdGhlIElERSBWTSB0byBnZXQgdGhlIHN0cmluZyB2YWx1ZSBlYXNpbHkKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1ODoyMiBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cmluZ0JlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHkgewotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3hpZWQgc3RyaW5nIGFzIGEgc3RyaW5nIHRoYXQgdGhlIElERSBjYW4gdXNlCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTg6MzIgQU0pCi0gKi8KLVN0cmluZyBzdHJpbmdWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVVJUnVubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JVUlSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiYmE5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JVUlSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElVSVJ1bm5lci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLSAKLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBkb2Vzbid0IHJlcXVpcmUgVUkuIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsLiBUaGlzIHdpbGwKLSAqIG9ubHkgYmUgdXNlZCBpZiB3aXRoaW4gVUkgZW52aXJvbm1lbnQuCi0gKiAKLSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBzaG91bGQgb25seSBiZSB1c2VkIHdpdGhpbiBoZXJlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotaW50ZXJmYWNlIElVSVJ1bm5lciB7Ci0JLyoqCi0JICogSGFuZGxlIHRoZSBidWlsZC4gSWYgbm90IGluIFVJIHRocmVhZCwganVzdCBjYWxsIGJhY2sgdG8gUHJveHlMYXVuY2hTdXBwb3J0Ci0JICogdG8gaGFuZGxlIHRoZSBidWlsZC4gSWYgb24gVUkgdGhyZWFkLCB0aGVuIHVzZSB0aGUgSVByb2dyZXNzU2VydmljZSB0byBkbyBpdC4KLQkgKiBUaGlzIHdpbGwga2VlcCB0aGUgVUkgZnJvbSAibG9ja2luZyIsIHRob3VnaCBpdCB3aWxsIGJlIGRpc2FibGVkIGl0IHdvbid0IGRlYWRsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwbQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUJ1aWxkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkMDU1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIGFuIGphdmEudXRpbC5JdGVyYXRvciBwcm94eS4KLSAqIEl0IHByb3ZpZGVzIHRoZSBpdGVyYXRvciBtZXRob2RzIHRvIGludGVyZmFjZSB0bwotICogdGhlIHByb3h5LgotICovCi0KLXB1YmxpYyBjbGFzcyBJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIgewotCXByb3RlY3RlZCBmaW5hbCBJQmVhblByb3h5IGZJdGVyYXRvcjsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIGZDb25zdGFudHM7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlcihJQmVhblByb3h5IGFuSXRlcmF0b3JQcm94eSkgewotCQlpZiAoIWFuSXRlcmF0b3JQcm94eS5nZXRUeXBlUHJveHkoKS5pc0tpbmRPZihhbkl0ZXJhdG9yUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5JdGVyYXRvciIpKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eU1lc3NhZ2VzLkNsYXNzQ2FzdF9FWENfX0luY29ycmVjdFR5cGUsIG5ldyBPYmplY3RbXSB7YW5JdGVyYXRvclByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksICJqYXZhLnV0aWwuSXRlcmF0b3IifSkpOyAKLQkJZWxzZQotCQkJZkl0ZXJhdG9yID0gYW5JdGVyYXRvclByb3h5OwotCQkJCi0JCWZDb25zdGFudHMgPSBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGFuSXRlcmF0b3JQcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBpdGVyYXRvciBwcm94eSB0aGF0IHRoaXMgaXMgd3JhcHBlcmluZy4KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXRCZWFuUHJveHkoKSB7Ci0JCXJldHVybiBmSXRlcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogZXF1YWxzIC0gUGFzcyBpdCBvbiB0byB0aGUgcHJveHkgdG8gaGFuZGxlIHRoaXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZJdGVyYXRvci5lcXVhbHMob2JqZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogaGFzaENvZGUgLSBQYXNzIGl0IG9uIHRvIHRoZSBwcm94eSB0byBoYW5kbGUgdGhpcy4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkl0ZXJhdG9yLmhhc2hDb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIEl0ZXJhdG9yIGFjY2Vzc29ycwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRJdGVyYXRvckhhc05leHQoKS5pbnZva2UoZkl0ZXJhdG9yKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCQotCX0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXh0KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGZDb25zdGFudHMuZ2V0SXRlcmF0b3JOZXh0KCkuaW52b2tlKGZJdGVyYXRvcik7Ci0JfQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlmQ29uc3RhbnRzLmdldEl0ZXJhdG9yUmVtb3ZlKCkuaW52b2tlKGZJdGVyYXRvcik7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0phdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MjUwY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi0vKioKLSAqIFN0YW5kYXJkIFByb3h5IGNvbnN0YW50cy4KLSAqCi0gKiBVc2UgdGhlIHN0YXRpYyBhY2Nlc3NvciBtZXRob2QgKGdldENvbnN0YW50cygpKSB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIAotICogY29uc3RhbnRzIGluc3RhbmNlIGZvciB0aGUgcmVnaXN0cnkuIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHVudGlsIHRoZQotICogdGhlIGNvbnN0YW50cyBhcmUgbmVlZGVkLCB0aGV5IGFyZW4ndCByZWdpc3RlcmVkLgotICoKLSAqIFRoZXJlIGFyZSBzb21lIHN0YW5kYXJkIHV0aWxpdHkgZnVuY3Rpb25zIHRvby4KLSAqCi0gKiBOT1RFOiBTaW5jZSBldmVyeXRoaW5nIGluIGhlcmUganVzdCBwcm94aWVzLCB0aGVyZSBpcwotICogICAgICAgbm8gbmVlZCB0byBoYXZlIHRoZW0gc2VwYXJhdGVkIGJ5IFZNLiBUaGF0IGlzIHdoeQotICogICAgICAgdGhpcyBpbiB0aGUgUHJveHkgcGFja2FnZS4KLSAqCi0gKiBUaGlzIGlzIGZpbmFsIGJlY2F1c2UgdGhpcyBjYW4ndCBiZSBleHRlbmRlZC4gVGhpcyBzcGVjaWZpYyBvbmUKLSAqIHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBmYWN0b3J5IGZvciB0aGlzIGtleS4gQW55IGV4dGVuc2lvbnMKLSAqIG11c3QgYmUgZG9uZSBpbiB0aGVpciBvd24gY29uc3RhbnRzIGFuZCByZWdpc3RyeSBrZXkuCi0gKgotICogQ3JlYXRpb24gZGF0ZTogKDQvNy8wMCA0OjQ3OjQ4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdJU1RSWV9LRVkgPSBuZXcgT2JqZWN0KCk7Ci0JCQotCWZpbmFsIElCZWFuVHlwZVByb3h5IGZDb2xsZWN0aW9uVHlwZTsKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmTGlzdFR5cGU7Ci0JZmluYWwgSUJlYW5UeXBlUHJveHkgZkl0ZXJhdG9yVHlwZTsKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmTGlzdEl0ZXJhdG9yVHlwZTsKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmRW51bWVyYXRpb25UeXBlOwkKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmU3lzdGVtVHlwZTsKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmU3RyaW5nVHlwZTsKLQkKLQlJTWV0aG9kUHJveHkgZkNvbGxlY3Rpb25BZGQsIGZDb2xsZWN0aW9uQWRkQWxsLCBmQ29sbGVjdGlvbkNsZWFyLCBmQ29sbGVjdGlvbkNvbnRhaW5zLAotCQlmQ29sbGVjdGlvbkNvbnRhaW5zQWxsLCBmQ29sbGVjdGlvbklzRW1wdHksIGZDb2xsZWN0aW9uSXRlcmF0b3IsIGZDb2xsZWN0aW9uUmVtb3ZlLAotCQlmQ29sbGVjdGlvblJlbW92ZUFsbCwgZkNvbGxlY3Rpb25SZXRhaW5BbGwsIGZDb2xsZWN0aW9uU2l6ZSwgZkNvbGxlY3Rpb25Ub0FycmF5LAotCQlmQ29sbGVjdGlvblRvQXJyYXlXaXRoQXJyYXk7Ci0JCQotCUlNZXRob2RQcm94eSBmTGlzdEFkZFdpdGhJbnQsIGZMaXN0QWRkQWxsV2l0aEludCwgZkxpc3RHZXQsIGZMaXN0SW5kZXhPZiwgZkxpc3RMYXN0SW5kZXhPZiwKLQkJZkxpc3RMaXN0SXRlcmF0b3IsIGZMaXN0TGlzdEl0ZXJhdG9yV2l0aEludCwgZkxpc3RSZW1vdmVJbnQsIAotCQlmTGlzdFNldCwgZkxpc3RTdWJMaXN0OwotCQkKLQlJTWV0aG9kUHJveHkgZkl0ZXJhdG9ySGFzTmV4dCwgZkl0ZXJhdG9yTmV4dCwgZkl0ZXJhdG9yUmVtb3ZlOwotCi0JSU1ldGhvZFByb3h5IGZMaXN0SXRlcmF0b3JBZGQsIGZMaXN0SXRlcmF0b3JIYXNQcmV2aW91cywgZkxpc3RJdGVyYXRvck5leHRJbmRleCwgZkxpc3RJdGVyYXRvclByZXZpb3VzLAotCQlmTGlzdEl0ZXJhdG9yUHJldmlvdXNJbmRleCwgZkxpc3RJdGVyYXRvclJlbW92ZSwgZkxpc3RJdGVyYXRvclNldDsKLQkJCi0JSU1ldGhvZFByb3h5IGZFbnVtZXJhdGlvbkhhc01vcmVFbGVtZW50cywgZkVudW1lcmF0aW9uTmV4dEVsZW1lbnQ7Ci0JCi0JSU1ldGhvZFByb3h5IGZTeXN0ZW1BcnJheWNvcHk7Ci0KLS8qKgotICogR2V0IHRoZSBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIGdldENvbnN0YW50cyhQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCUphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBjb25zdGFudHMgPSAoSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzKSByZWdpc3RyeS5nZXRDb25zdGFudHMoUkVHSVNUUllfS0VZKTsKLQlpZiAoY29uc3RhbnRzID09IG51bGwpCi0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RhbnRzKFJFR0lTVFJZX0tFWSwgY29uc3RhbnRzID0gbmV3IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyhyZWdpc3RyeSkpOwkKLQlyZXR1cm4gY29uc3RhbnRzOwotfQotCi0KLS8qKgotICogSURFSmF2YUJlYW5Db25zdGFudHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHJpdmF0ZSBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQlzdXBlcigpOwotCQotCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gcmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQlmQ29sbGVjdGlvblR5cGUgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLQlmTGlzdFR5cGUgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuTGlzdCIpOyAvLyROT04tTkxTLTEkCi0JZkl0ZXJhdG9yVHlwZSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5JdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JZkxpc3RJdGVyYXRvclR5cGUgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQlmRW51bWVyYXRpb25UeXBlID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLkVudW1lcmF0aW9uIik7CSAvLyROT04tTkxTLTEkCi0JZlN5c3RlbVR5cGUgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuU3lzdGVtIik7IC8vJE5PTi1OTFMtMSQKLQlmU3RyaW5nVHlwZSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5TdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0U3RyaW5nVHlwZSgpIHsKLQlyZXR1cm4gZlN0cmluZ1R5cGU7Ci19Ci0KLS8qKgotICogQ29sbGVjdGlvbiBtZXRob2QgYWNjZXNzb3JzCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvbkFkZCgpIHsKLQlpZiAoZkNvbGxlY3Rpb25BZGQgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25BZGQgPSBmQ29sbGVjdGlvblR5cGUuZ2V0TWV0aG9kUHJveHkoImFkZCIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ29sbGVjdGlvbkFkZDsKLX0KLQkKLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvbkFkZEFsbCgpewotCWlmIChmQ29sbGVjdGlvbkFkZEFsbCA9PSBudWxsKQotCQlmQ29sbGVjdGlvbkFkZEFsbCA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiYWRkQWxsIiwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ29sbGVjdGlvbkFkZEFsbDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uQ2xlYXIoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uQ2xlYXIgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25DbGVhciA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiY2xlYXIiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmQ29sbGVjdGlvbkNsZWFyOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25Db250YWlucygpIHsKLQlpZiAoZkNvbGxlY3Rpb25Db250YWlucyA9PSBudWxsKQotCQlmQ29sbGVjdGlvbkNvbnRhaW5zID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJjb250YWlucyIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ29sbGVjdGlvbkNvbnRhaW5zOwotfQotCQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uQ29udGFpbnNBbGwoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uQ29udGFpbnNBbGwgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25Db250YWluc0FsbCA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiY29udGFpbnNBbGwiLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uQ29udGFpbnNBbGw7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvbklzRW1wdHkoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uSXNFbXB0eSA9PSBudWxsKQotCQlmQ29sbGVjdGlvbklzRW1wdHkgPSBmQ29sbGVjdGlvblR5cGUuZ2V0TWV0aG9kUHJveHkoImlzRW1wdHkiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmQ29sbGVjdGlvbklzRW1wdHk7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvbkl0ZXJhdG9yKCkgewotCWlmIChmQ29sbGVjdGlvbkl0ZXJhdG9yID09IG51bGwpCi0JCWZDb2xsZWN0aW9uSXRlcmF0b3IgPSBmQ29sbGVjdGlvblR5cGUuZ2V0TWV0aG9kUHJveHkoIml0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkNvbGxlY3Rpb25JdGVyYXRvcjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uUmVtb3ZlKCkgewotCWlmIChmQ29sbGVjdGlvblJlbW92ZSA9PSBudWxsKQotCQlmQ29sbGVjdGlvblJlbW92ZSA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgicmVtb3ZlIiwgImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uUmVtb3ZlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25SZW1vdmVBbGwoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uUmVtb3ZlQWxsID09IG51bGwpCi0JCWZDb2xsZWN0aW9uUmVtb3ZlQWxsID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJyZW1vdmVBbGwiLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uUmVtb3ZlQWxsOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25SZXRhaW5BbGwoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uUmV0YWluQWxsID09IG51bGwpCi0JCWZDb2xsZWN0aW9uUmV0YWluQWxsID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJyZXRhaW5BbGwiLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uUmV0YWluQWxsOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25TaXplKCkgIHsKLQlpZiAoZkNvbGxlY3Rpb25TaXplID09IG51bGwpCi0JCWZDb2xsZWN0aW9uU2l6ZSA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgic2l6ZSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZDb2xsZWN0aW9uU2l6ZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uVG9BcnJheSgpIHsKLQlpZiAoZkNvbGxlY3Rpb25Ub0FycmF5ID09IG51bGwpCi0JCWZDb2xsZWN0aW9uVG9BcnJheSA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgidG9BcnJheSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZDb2xsZWN0aW9uVG9BcnJheTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uVG9BcnJheVdpdGhBcnJheSgpIHsKLQlpZiAoZkNvbGxlY3Rpb25Ub0FycmF5V2l0aEFycmF5ID09IG51bGwpCi0JCWZDb2xsZWN0aW9uVG9BcnJheVdpdGhBcnJheSA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgidG9BcnJheSIsICJbTGphdmEubGFuZy5PYmplY3Q7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ29sbGVjdGlvblRvQXJyYXlXaXRoQXJyYXk7Ci19Ci0KLS8qKgotICogSXRlcmF0b3IgYWNjZXNzb3JzCi0gKi8KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRJdGVyYXRvckhhc05leHQoKSB7Ci0JaWYgKGZJdGVyYXRvckhhc05leHQgPT0gbnVsbCkKLQkJZkl0ZXJhdG9ySGFzTmV4dCA9IGZJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoImhhc05leHQiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmSXRlcmF0b3JIYXNOZXh0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEl0ZXJhdG9yTmV4dCgpIHsKLQlpZiAoZkl0ZXJhdG9yTmV4dCA9PSBudWxsKQotCQlmSXRlcmF0b3JOZXh0ID0gZkl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgibmV4dCIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZJdGVyYXRvck5leHQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0SXRlcmF0b3JSZW1vdmUoKSB7Ci0JaWYgKGZJdGVyYXRvclJlbW92ZSA9PSBudWxsKQotCQlmSXRlcmF0b3JSZW1vdmUgPSBmSXRlcmF0b3JUeXBlLmdldE1ldGhvZFByb3h5KCJyZW1vdmUiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmSXRlcmF0b3JSZW1vdmU7Ci19Ci0KLS8qKgotICogTGlzdGFjY2Vzc29ycwotICovCi0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEFkZFdpdGhJbnQoKSB7Ci0JaWYgKGZMaXN0QWRkV2l0aEludCA9PSBudWxsKQotCQlmTGlzdEFkZFdpdGhJbnQgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImFkZCIsIG5ldyBTdHJpbmdbXSB7ImludCIsICJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmTGlzdEFkZFdpdGhJbnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEFkZEFsbFdpdGhJbnQoKSB7Ci0JaWYgKGZMaXN0QWRkQWxsV2l0aEludCA9PSBudWxsKQotCQlmTGlzdEFkZEFsbFdpdGhJbnQgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImFkZEFsbCIsIG5ldyBTdHJpbmdbXSB7ImludCIsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkxpc3RBZGRBbGxXaXRoSW50OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RHZXQoKSB7Ci0JaWYgKGZMaXN0R2V0ID09IG51bGwpCi0JCWZMaXN0R2V0ID0gZkxpc3RUeXBlLmdldE1ldGhvZFByb3h5KCJnZXQiLCAiaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdEdldDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0SW5kZXhPZigpIHsKLQlpZiAoZkxpc3RJbmRleE9mID09IG51bGwpCi0JCWZMaXN0SW5kZXhPZiA9IGZMaXN0VHlwZS5nZXRNZXRob2RQcm94eSgiaW5kZXhPZiIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdEluZGV4T2Y7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdExhc3RJbmRleE9mKCkgewotCWlmIChmTGlzdExhc3RJbmRleE9mID09IG51bGwpCi0JCWZMaXN0TGFzdEluZGV4T2YgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImxhc3RJbmRleE9mIiwgImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZMaXN0TGFzdEluZGV4T2Y7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdExpc3RJdGVyYXRvcigpIHsKLQlpZiAoZkxpc3RMaXN0SXRlcmF0b3IgPT0gbnVsbCkKLQkJZkxpc3RMaXN0SXRlcmF0b3IgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImxpc3RJdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZMaXN0TGlzdEl0ZXJhdG9yOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RMaXN0SXRlcmF0b3JXaXRoSW50KCkgewotCWlmIChmTGlzdExpc3RJdGVyYXRvcldpdGhJbnQgPT0gbnVsbCkKLQkJZkxpc3RMaXN0SXRlcmF0b3JXaXRoSW50ID0gZkxpc3RUeXBlLmdldE1ldGhvZFByb3h5KCJsaXN0SXRlcmF0b3IiLCAiaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdExpc3RJdGVyYXRvcldpdGhJbnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdFJlbW92ZUludCgpIHsKLQlpZiAoZkxpc3RSZW1vdmVJbnQgPT0gbnVsbCkKLQkJZkxpc3RSZW1vdmVJbnQgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoInJlbW92ZSIsICJpbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZMaXN0UmVtb3ZlSW50OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RTZXQoKSB7Ci0JaWYgKGZMaXN0U2V0ID09IG51bGwpCi0JCWZMaXN0U2V0ID0gZkxpc3RUeXBlLmdldE1ldGhvZFByb3h5KCJzZXQiLCBuZXcgU3RyaW5nW10geyJpbnQiLCAiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkxpc3RTZXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdFN1Ykxpc3QoKSB7Ci0JaWYgKGZMaXN0U3ViTGlzdCA9PSBudWxsKQotCQlmTGlzdFN1Ykxpc3QgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoInN1Ykxpc3QiLCBuZXcgU3RyaW5nW10geyJpbnQiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmTGlzdFN1Ykxpc3Q7Ci19Ci0KLS8qKgotICogTGlzdEl0ZXJhdG9yIGFjY2Vzc29ycwotICovCi0gCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvckFkZCgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvckFkZCA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yQWRkID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoImFkZCIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdEl0ZXJhdG9yQWRkOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvckhhc1ByZXZpb3VzKCkgewotCWlmIChmTGlzdEl0ZXJhdG9ySGFzUHJldmlvdXMgPT0gbnVsbCkKLQkJZkxpc3RJdGVyYXRvckhhc1ByZXZpb3VzID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoImhhc1ByZXZpb3VzIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkxpc3RJdGVyYXRvckhhc1ByZXZpb3VzOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvck5leHRJbmRleCgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvck5leHRJbmRleCA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yTmV4dEluZGV4ID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoIm5leHRJbmRleCIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZMaXN0SXRlcmF0b3JOZXh0SW5kZXg7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEl0ZXJhdG9yUHJldmlvdXMoKSB7Ci0JaWYgKGZMaXN0SXRlcmF0b3JQcmV2aW91cyA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yUHJldmlvdXMgPSBmTGlzdEl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgicHJldmlvdXMiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmTGlzdEl0ZXJhdG9yUHJldmlvdXM7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEl0ZXJhdG9yUHJldmlvdXNJbmRleCgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvclByZXZpb3VzSW5kZXggPT0gbnVsbCkKLQkJZkxpc3RJdGVyYXRvclByZXZpb3VzSW5kZXggPSBmTGlzdEl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgicHJldmlvdXNJbmRleCIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZMaXN0SXRlcmF0b3JQcmV2aW91c0luZGV4OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvclNldCgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvclNldCA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yU2V0ID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoInNldCIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdEl0ZXJhdG9yU2V0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvclJlbW92ZSgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvclJlbW92ZSA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yUmVtb3ZlID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoInJlbW92ZSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZMaXN0SXRlcmF0b3JSZW1vdmU7Ci19Ci0KLXByb3RlY3RlZCBJTWV0aG9kUHJveHkgZ2V0U3lzdGVtQXJyYXljb3B5KCkgewotCWlmIChmU3lzdGVtQXJyYXljb3B5ID09IG51bGwpCi0JCWZTeXN0ZW1BcnJheWNvcHkgPSBmU3lzdGVtVHlwZS5nZXRNZXRob2RQcm94eSgiYXJyYXljb3B5IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQiLCAiamF2YS5sYW5nLk9iamVjdCIsICJpbnQiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCXJldHVybiBmU3lzdGVtQXJyYXljb3B5OwotfQotCi0vKioKLSAqIEVudW1lcmF0aW9uIGFjY2Vzc29ycwotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEVudW1lcmF0aW9uSGFzTW9yZUVsZW1lbnRzKCkgewotCWlmIChmRW51bWVyYXRpb25IYXNNb3JlRWxlbWVudHMgPT0gbnVsbCkKLQkJZkVudW1lcmF0aW9uSGFzTW9yZUVsZW1lbnRzID0gZkVudW1lcmF0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiaGFzTW9yZUVsZW1lbnRzIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkVudW1lcmF0aW9uSGFzTW9yZUVsZW1lbnRzOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEVudW1lcmF0aW9uTmV4dEVsZW1lbnQoKSB7Ci0JaWYgKGZFbnVtZXJhdGlvbk5leHRFbGVtZW50ID09IG51bGwpCi0JCWZFbnVtZXJhdGlvbk5leHRFbGVtZW50ID0gZkVudW1lcmF0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgibmV4dEVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmRW51bWVyYXRpb25OZXh0RWxlbWVudDsKLX0KLQotLyoqCi0gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvcHkgYW4gYXJyYXkuCi0gKi8KLXB1YmxpYyB2b2lkIGFycmF5Y29weShJQmVhblByb3h5IHNyYywgaW50IHNyY1Bvc2l0aW9uLCBJQmVhblByb3h5IGRlc3QsIGludCBkZXN0UG9zaXRpb24sIGludCBsZW5ndGgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmYWN0b3J5ID0gc3JjLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpOwotCUlCZWFuUHJveHlbXSBhcmdzID0gbmV3IElCZWFuUHJveHlbXSB7Ci0JCXNyYywKLQkJZmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHNyY1Bvc2l0aW9uKSwKLQkJZGVzdCwKLQkJZmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGRlc3RQb3NpdGlvbiksCi0JCWZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChsZW5ndGgpCQkKLQl9OwotCQotCWdldFN5c3RlbUFycmF5Y29weSgpLmludm9rZShudWxsLCBhcmdzKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RCZWFuUHJveHlXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0QmVhblByb3h5V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEyNTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RCZWFuUHJveHlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IExpc3RCZWFuUHJveHlXcmFwcGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhbiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBwcm94eS4KLSAqIEl0IHByb3ZpZGVzIHRoZSBjb2xsZWN0aW9uIG1ldGhvZHMgdG8gaW50ZXJmYWNlIHRvCi0gKiB0aGUgcHJveHkuCi0gKi8KLQotcHVibGljIGNsYXNzIExpc3RCZWFuUHJveHlXcmFwcGVyIGV4dGVuZHMgQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIgewotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHRoZSBMaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0QmVhblByb3h5V3JhcHBlcihJQmVhblByb3h5IGFMaXN0UHJveHkpIHsKLQkJc3VwZXIoYUxpc3RQcm94eSk7Ci0JCQotCQlpZiAoIWFMaXN0UHJveHkuZ2V0VHlwZVByb3h5KCkuaXNLaW5kT2YoYUxpc3RQcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLkxpc3QiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlNZXNzYWdlcy5DbGFzc0Nhc3RfRVhDX19JbmNvcnJlY3RUeXBlLCBuZXcgT2JqZWN0W10ge2FMaXN0UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgImphdmEudXRpbC5MaXN0In0pKTsgCi0JfQotCQotCQotCS8qKgotCSAqIExpc3QgYWNjZXNzb3JzCi0JICovCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWZDb25zdGFudHMuZ2V0TGlzdEFkZFdpdGhJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG5ldyBJQmVhblByb3h5W10ge2ZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpLCBvYmplY3R9KTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgSUJlYW5Qcm94eSBhQ29sbGVjdGlvbikgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0TGlzdEFkZEFsbFdpdGhJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG5ldyBJQmVhblByb3h5W10ge2ZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpLCBhQ29sbGVjdGlvbn0pKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgZ2V0KGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGZDb25zdGFudHMuZ2V0TGlzdEdldCgpLmludm9rZShmQ29sbGVjdGlvbiwgZkNvbGxlY3Rpb24uZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChpbmRleCkpOwotCX0KLQlwdWJsaWMgaW50IGluZGV4T2YoSUJlYW5Qcm94eSBvYmplY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKElJbnRlZ2VyQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldExpc3RJbmRleE9mKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gLTE7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIGludCBsYXN0SW5kZXhPZihJQmVhblByb3h5IG9iamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUludGVnZXJCZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0TGlzdExhc3RJbmRleE9mKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gLTE7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIExpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIgbGlzdEl0ZXJhdG9yKCkgewotCQl0cnkgewotCQkJSUJlYW5Qcm94eSBpdHIgPSBmQ29uc3RhbnRzLmdldExpc3RMaXN0SXRlcmF0b3IoKS5pbnZva2UoZkNvbGxlY3Rpb24pOwotCQkJaWYgKGl0ciAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlcihpdHIpOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCX0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlJQmVhblByb3h5IGl0ciA9IGZDb25zdGFudHMuZ2V0TGlzdExpc3RJdGVyYXRvcldpdGhJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIGZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpKTsKLQkJCWlmIChpdHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IExpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIoaXRyKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgcmVtb3ZlKGludCBpbmRleCwgSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBmQ29uc3RhbnRzLmdldExpc3RTZXQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIGZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpKTsKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgc2V0KGludCBpbmRleCwgSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBmQ29uc3RhbnRzLmdldExpc3RSZW1vdmVJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG5ldyBJQmVhblByb3h5W10ge2ZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpLCBvYmplY3R9KTsKLQl9CQkJCQkJCQkJCQkKLQlwdWJsaWMgTGlzdEJlYW5Qcm94eVdyYXBwZXIgc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5Qcm94eSBsaXN0ID0gZkNvbnN0YW50cy5nZXRMaXN0U3ViTGlzdCgpLmludm9rZShmQ29sbGVjdGlvbiwgbmV3IElCZWFuUHJveHlbXSB7ZkNvbGxlY3Rpb24uZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChmcm9tSW5kZXgpLCBmQ29sbGVjdGlvbi5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHRvSW5kZXgpfSk7Ci0JCWlmIChsaXN0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IExpc3RCZWFuUHJveHlXcmFwcGVyKGxpc3QpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkJCQkJCQkJCQkJCQotCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1YjVhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0SXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gamF2YS51dGlsLkxpc3RJdGVyYXRvciBwcm94eS4KLSAqIEl0IHByb3ZpZGVzIHRoZSBMaXN0SXRlcmF0b3IgbWV0aG9kcyB0byBpbnRlcmZhY2UgdG8KLSAqIHRoZSBwcm94eS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciBleHRlbmRzIEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCB0aGUgTGlzdEl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyKElCZWFuUHJveHkgYW5JdGVyYXRvclByb3h5KSB7Ci0JCXN1cGVyKGFuSXRlcmF0b3JQcm94eSk7Ci0JCQotCQlpZiAoIWFuSXRlcmF0b3JQcm94eS5nZXRUeXBlUHJveHkoKS5pc0tpbmRPZihhbkl0ZXJhdG9yUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5MaXN0SXRlcmF0b3IiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlNZXNzYWdlcy5DbGFzc0Nhc3RfRVhDX19JbmNvcnJlY3RUeXBlLCBuZXcgT2JqZWN0W10ge2FuSXRlcmF0b3JQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCAiamF2YS51dGlsLkxpc3RJdGVyYXRvciJ9KSk7IAotCX0KLQkKLQkKLQkvKioKLQkgKiBMaXN0SXRlcmF0b3IgYWNjZXNzb3JzCi0JICovCi0JcHVibGljIHZvaWQgYWRkKElCZWFuUHJveHkgb2JqZWN0KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlmQ29uc3RhbnRzLmdldExpc3RJdGVyYXRvckFkZCgpLmludm9rZShmSXRlcmF0b3IsIG9iamVjdCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0TGlzdEl0ZXJhdG9ySGFzUHJldmlvdXMoKS5pbnZva2UoZkl0ZXJhdG9yKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCQotCX0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKElJbnRlZ2VyQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldExpc3RJdGVyYXRvck5leHRJbmRleCgpLmludm9rZShmSXRlcmF0b3IpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gLTE7Ci0JCX0JCQkKLQl9CQkJCi0JcHVibGljIElCZWFuUHJveHkgcHJldmlvdXMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gZkNvbnN0YW50cy5nZXRMaXN0SXRlcmF0b3JQcmV2aW91cygpLmludm9rZShmSXRlcmF0b3IpOwotCX0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJSW50ZWdlckJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRMaXN0SXRlcmF0b3JQcmV2aW91c0luZGV4KCkuaW52b2tlKGZJdGVyYXRvcikpLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlmQ29uc3RhbnRzLmdldExpc3RJdGVyYXRvclJlbW92ZSgpLmludm9rZShmSXRlcmF0b3IpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXQoSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWZDb25zdGFudHMuZ2V0TGlzdEl0ZXJhdG9yU2V0KCkuaW52b2tlKGZJdGVyYXRvciwgb2JqZWN0KTsKLQl9CQkJCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvTGlzdGVuZXJMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0ZW5lckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkOTBhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBMaXN0ZW5lckxpc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtYWludGFpbiBhIGxpc3Qgb2YgbGlzdGVuZXJzLCBhbmQKLSAqIGlzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9ucyBvZiBzZXZlcmFsIGNsYXNzZXMgd2l0aGluIGplbQotICogd2hpY2ggYWxsb3cgeW91IHRvIHJlZ2lzdGVyIGxpc3RlbmVycyBvZiB2YXJpb3VzIGtpbmRzLgotICogSXQgaXMgYSBmYWlybHkgbGlnaHR3ZWlnaHQgb2JqZWN0LCBvY2N1cHlpbmcgbWluaW1hbCBzcGFjZSB3aGVuCi0gKiBubyBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgPGNvZGU+YWRkPC9jb2RlPiBtZXRob2QgY2hlY2tzIGZvciBhbmQgZWxpbWluYXRlcyAKLSAqIGR1cGxpY2F0ZXMgYmFzZWQgb24gaWRlbnRpdHkgKG5vdCBlcXVhbGl0eSkuICBMaWtld2lzZSwgdGhlCi0gKiA8Y29kZT5yZW1vdmU8L2NvZGU+IG1ldGhvZCBjb21wYXJlcyBiYXNlZCBvbiBpZGVudGl0eS4KLSAqIDwvcD4KLSAqIDxwPgotICogVXNlIHRoZSA8Y29kZT5nZXRMaXN0ZW5lcnM8L2NvZGU+IG1ldGhvZCB3aGVuIG5vdGlmeWluZyBsaXN0ZW5lcnMuCi0gKiBOb3RlIHRoYXQgbm8gZ2FyYmFnZSBpcyBjcmVhdGVkIGlmIG5vIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZC4KLSAqIFRoZSByZWNvbW1lbmRlZCBjb2RlIHNlcXVlbmNlIGZvciBub3RpZnlpbmcgYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0gKiBvZiBzYXksIDxjb2RlPkZvb0xpc3RlbmVyLmV2ZW50SGFwcGVuZWQ8L2NvZGU+LCBpczoKLSAqIDxwcmU+Ci0gKiBPYmplY3RbXSBsaXN0ZW5lcnMgPSBteUxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLSAqIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gKiAgICAoKEZvb0xpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLmV2ZW50SGFwcGVuZWQoZXZlbnQpOwotICogfQotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKi8KLQotcHVibGljIGNsYXNzIExpc3RlbmVyTGlzdCB7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgbGlzdC4gQWx3YXlzID49IDEuCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FwYWNpdHk7Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgbGlzdGVuZXJzLgotCSAqIE1haW50YWlucyBpbnZhcmlhbnQ6IDAgPD0gc2l6ZSA8PSBsaXN0ZW5lcnMubGVuZ3RoLgotCSAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMuICBJbml0aWFsbHkgPGNvZGU+bnVsbDwvY29kZT4gYnV0IGluaXRpYWxpemVkCi0JICogdG8gYW4gYXJyYXkgb2Ygc2l6ZSBjYXBhY2l0eSB0aGUgZmlyc3QgdGltZSBhIGxpc3RlbmVyIGlzIGFkZGVkLgotCSAqIE1haW50YWlucyBpbnZhcmlhbnQ6IGxpc3RlbmVycyAhPSBudWxsIElGRiBzaXplICE9IDAKLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGxpc3RlbmVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZW1wdHkgYXJyYXkgc2luZ2xldG9uIGluc3RhbmNlLCByZXR1cm5lZCBieSBnZXRMaXN0ZW5lcnMoKQotCSAqIHdoZW4gc2l6ZSA9PSAwLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVtcHR5QXJyYXkgPSBuZXcgT2JqZWN0WzBdOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3RlbmVyIGxpc3Qgd2l0aCBhbiBpbml0aWFsIGNhcGFjaXR5IG9mIDEuCi0JICovCi0JcHVibGljIExpc3RlbmVyTGlzdCgpIHsKLQkJdGhpcygxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGlzdGVuZXIgbGlzdCB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5LgotCSAqCi0JICogQHBhcmFtIGNhcGFjaXR5IHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHdoaWNoIHRoaXMgbGlzdCBjYW4gaW5pdGlhbGx5IGFjY2VwdCAKLQkgKiAgICB3aXRob3V0IGdyb3dpbmcgaXRzIGludGVybmFsIHJlcHJlc2VudGF0aW9uOyBtdXN0IGJlIGF0IGxlYXN0IDEKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJMaXN0KGludCBjYXBhY2l0eSkgewotCQlpZiAoIShjYXBhY2l0eSA+PSAxKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5OwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIHRvIHRoaXMgbGlzdC4gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIKLQkgKiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkKE9iamVjdCBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJaWYgKHNpemUgPT0gMCkgewotCQkJbGlzdGVuZXJzID0gbmV3IE9iamVjdFtjYXBhY2l0eV07Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcyB1c2luZyBpZGVudGl0eQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQlpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBncm93IGFycmF5IGlmIG5lY2Vzc2FyeQotCQkJaWYgKHNpemUgPT0gbGlzdGVuZXJzLmxlbmd0aCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCWxpc3RlbmVycywKLQkJCQkJMCwKLQkJCQkJbGlzdGVuZXJzID0gbmV3IE9iamVjdFtzaXplICogMiArIDFdLAotCQkJCQkwLAotCQkJCQlzaXplKTsKLQkJCX0KLQkJfQotCQlsaXN0ZW5lcnNbc2l6ZSsrXSA9IGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBmcm9tIHRoaXMgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc2l6ZSA9IDA7Ci0JCWxpc3RlbmVycyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMsCi0JICogaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC4KLQkgKiA8cD4KLQkgKiBUaGUgcmVzdWx0aW5nIGFycmF5IGlzIHVuYWZmZWN0ZWQgYnkgc3Vic2VxdWVudCBhZGRzIG9yIHJlbW92ZXMuCi0JICogSWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGFycmF5Ci0JICogc2luZ2xldG9uIGluc3RhbmNlIChubyBnYXJiYWdlIGlzIGNyZWF0ZWQpLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIG5vdGlmeWluZyBsaXN0ZW5lcnMsIHNvIHRoYXQgYW55IG1vZGlmaWNhdGlvbnMKLQkgKiB0byB0aGUgbGlzdGVuZXIgbGlzdCBkdXJpbmcgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIHRoZQotCSAqIG5vdGlmaWNhdGlvbiBpdHNlbGYuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gRW1wdHlBcnJheTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIHJlc3VsdCwgMCwgc2l6ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eS4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLCBhbmQKLQkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBsaXN0LiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbAotCSAqIGxpc3RlbmVyIHdhcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7Ci0JCQkJaWYgKHNpemUgPT0gMSkgewotCQkJCQlsaXN0ZW5lcnMgPSBudWxsOwotCQkJCQlzaXplID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCQkJbGlzdGVuZXJzLAotCQkJCQkJaSArIDEsCi0JCQkJCQlsaXN0ZW5lcnMsCi0JCQkJCQlpLAotCQkJCQkJLS1zaXplIC0gaSk7Ci0JCQkJCWxpc3RlbmVyc1tzaXplXSA9IG51bGw7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9NYXBKTklUeXBlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvTWFwSk5JVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiZTgxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9NYXBKTklUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IE1hcEpOSVR5cGVzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWFwVHlwZXM7Ci0gCi0KLS8qKgotICogVGhpcyBpcyBhIHB1YmxpYyBjbGFzcyB0byBtYXAgYmV0d2VlbiBKTkkgYW5kIG5vcm1hbCBmb3JtYXQgKGUuZy4gIltMamF2YS5sYW5nLlN0cmluZzsiIHRvICJqYXZhLmxhbmcuU3RyaW5nW10iKSBhbmQgYmFjayBhZ2Fpbi4KLSAqIFRoaXMgaXMgZm9yIGFycmF5cywgbm9uLWFycmF5cyB3aWxsIGJlIGxlZnQgYWxvbmUgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBjb3JyZWN0LgotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBKTklUeXBlcyB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBmb3JtYWwgdHlwZSBuYW1lIHRvIHRoZSBKTkkgZm9ybWF0LgotCSAqIEBwYXJhbSBmb3JtYWxUeXBlTmFtZQotCSAqIEByZXR1cm4gSk5JIGZvcm1hdAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpOSVR5cGVOYW1lKFN0cmluZyBmb3JtYWxUeXBlTmFtZSkgewotCQlyZXR1cm4gTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShmb3JtYWxUeXBlTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgdGhlIEpOSSBmb3JtYXQgdG8gdGhlIGZvcm1hbCB0eXBlIG5hbWUuCi0JICogQHBhcmFtIGpuaVR5cGVOYW1lCi0JICogQHJldHVybiBmb3JtYWwgdHlwZSBuYW1lIG9yICIiIGlmIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYWxUeXBlTmFtZShTdHJpbmcgam5pVHlwZU5hbWUpIHsKLQkJcmV0dXJuIE1hcFR5cGVzLmdldEZvcm1hbFR5cGVOYW1lKGpuaVR5cGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGZvcm1hbCB0eXBlIG5hbWUgaXMgZm9yIGEgcHJpbWl0aXZlIG9yIG5vdC4KLQkgKiBAcGFyYW0gZm9ybWFsVHlwZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZm9yIGEgcHJpbWl0aXZlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Zvcm1hbFR5cGVQcmltaXRpdmUoU3RyaW5nIGZvcm1hbFR5cGUpIHsKLQkJcmV0dXJuIE1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5nZXQoZm9ybWFsVHlwZSkgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCB0aGUgZm9ybWFsIHR5cGUgbmFtZSwgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGRpbWVuc2lvbnMsCi0JICogdG8gYW4gYXJyYXkgSk5JIHR5cGUuCi0JICogQHBhcmFtIGZpbmFsQ29tcG9uZW50IGZpbmFsIGNvbXBvbmVudCBuYW1lLCBzaG91bGQgbm90IGJlIGFuIGFycmF5IHR5cGUuCi0JICogQHBhcmFtIGRpbWVuc2lvbnMgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIHRoZSBhcnJheS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Sk5JVHlwZU5hbWUoU3RyaW5nIGZpbmFsQ29tcG9uZW50LCBpbnQgZGltZW5zaW9ucykgewotCQlyZXR1cm4gTWFwVHlwZXMuZ2V0Sk5JVHlwZU5hbWUoZmluYWxDb21wb25lbnQsIGRpbWVuc2lvbnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkYzY0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVDb250cmlidXRlQ2xhc3NwYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUERFQ29udHJpYnV0ZUNsYXNzcGF0aC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzEwLzE0IDE3OjQ1OjAyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS4qOwotCi0gCi0KLS8qKgotICogQ29udHJpYnV0ZSB0byBjbGFzc3BhdGggUERFIGVudHJpZXMgdGhhdCBhcmUgbmVlZGVkIGZvciBhIGxhdW5jaC4KLSAqIDxwPgotICogVGhpcyBpcyBhIHNwZWNpYWwgY2xhc3MgdGhhdCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgZnJvbSBjb2RlLiBSZWZlcmVuY2UgaXQgdGhyb3VnaCB0aGUKLSAqIGludGVyZmFjZSB0aGF0IGl0IGltcGxlbWVudHMuIAotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQREVDb250cmlidXRlQ2xhc3NwYXRoCi0gKiBAc2luY2UgMS4wLjIKLSAqLwotY2xhc3MgUERFQ29udHJpYnV0ZUNsYXNzcGF0aCBpbXBsZW1lbnRzIElQREVDb250cmlidXRlQ2xhc3NwYXRoIHsKLQotCXB1YmxpYyB2b2lkIGdldFBERUNvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghaW5mby5nZXRQbHVnaW5JZHMoKS5pc0VtcHR5KCkpIHsKLQkJCUNvbGxlY3Rpb24gcGx1Z2luSWRzID0gaW5mby5nZXRQbHVnaW5JZHMoKS5rZXlTZXQoKTsKLQkJCVBsdWdpbk1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBQREVDb3JlLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJCUlGcmFnbWVudE1vZGVsW10gZnJhZ21lbnRzID0gbW9kZWxNYW5hZ2VyLmdldEZyYWdtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRnJhZ21lbnQgZnJhZ21lbnQgPSBmcmFnbWVudHNbaV0uZ2V0RnJhZ21lbnQoKTsKLQkJCQlpZiAocGx1Z2luSWRzLmNvbnRhaW5zKGZyYWdtZW50LmdldFBsdWdpbklkKCkpKSB7Ci0JCQkJCS8vIFdlJ2xsIGRvIGEgY2hlYXQgZm9yIG5vdyBhbmQgYXNzdW1lIGZyYWdtZW50IGlzIGZvciBzYW1lIHZlcnNpb24gb2YgcGx1Z2luLiBQREVDb3JlIGFjdHVhbGx5Ci0JCQkJCS8vIGNoZWNrcyB0aGUgdmVyc2lvbiBvZiB0aGUgZnJhZ21lbnQgYWdhaW5zdCB0aGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luIHRvIHNlZSB0aGV5IGFyZSBmb3IgZWFjaAotCQkJCQkvLyBvdGhlciwgYnV0IHdlJ2xsIGp1c3QgYXNzdW1lIHRoZXkgYXJlIGZvciBub3cuIENoYW5nZSB0aGlzIGxhdGVyIGlmIHdlIGFjdHVhbGx5IGRvIHJ1biBpbnRvIHRoaXMgY2FzZS4KLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gZnJhZ21lbnQuZ2V0TW9kZWwoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCUlQcm9qZWN0IGZyYWdQcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQkJaWYgKGZyYWdQcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQkJY29udHJvbGxlci5jb250cmlidXRlUHJvamVjdChmcmFnUHJvamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCUlQbHVnaW5MaWJyYXJ5W10gbGlicmFyaWVzID0gZnJhZ21lbnQuZ2V0TGlicmFyaWVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGlicmFyaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJUGx1Z2luTGlicmFyeSBsaWJyYXJ5ID0gbGlicmFyaWVzW2pdOwotCQkJCQkJU3RyaW5nIG5hbWUgPSBsaWJyYXJ5LmdldE5hbWUoKTsKLQkJCQkJCVN0cmluZyBleHBhbmRlZE5hbWUgPSBDbGFzc3BhdGhVdGlsQ29yZS5leHBhbmRMaWJyYXJ5TmFtZShuYW1lKTsKLQotCQkJCQkJSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IGxpYnJhcnkuZ2V0UGx1Z2luTW9kZWwoKTsKLQkJCQkJCVVSTCB1cmwgPSBnZXRQYXRoKG1vZGVsLCBleHBhbmRlZE5hbWUpOwotCQkJCQkJaWYgKHVybCAhPSBudWxsKQotCQkJCQkJCWNvbnRyb2xsZXIuY29udHJpYnV0ZUNsYXNzcGF0aCh1cmwsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfVVNFUl9DTEFTU1BBVEgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm47Ci0JfQotCQotCXByaXZhdGUgVVJMIGdldFBhdGgoSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCwgU3RyaW5nIGxpYnJhcnlOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBtb2RlbC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIGphckZpbGUgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCkuZmluZE1lbWJlcihsaWJyYXJ5TmFtZSk7Ci0JCQkJaWYgKGphckZpbGUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGphckZpbGUuZ2V0RnVsbFBhdGgoKS50b0ZpbGUoKS50b1VSTCgpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShtb2RlbC5nZXRJbnN0YWxsTG9jYXRpb24oKSwgbGlicmFyeU5hbWUpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCQlyZXR1cm4gZmlsZS50b1VSTCgpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUERFQ29udHJpYnV0ZUNsYXNzcGF0aEluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVDb250cmlidXRlQ2xhc3NwYXRoSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0YjcxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVDb250cmlidXRlQ2xhc3NwYXRoSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBERUNvbnRyaWJ1dGVDbGFzc3BhdGhJbnN0YW5jZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotIAotCi0vKioKLSAqIEFjY2Vzc29yIHRvIHRoZSBJUERFQ29udHJpYnV0ZUNsYXNzcGF0aCBpbnN0YW5jZSB0byB1c2UuCi0gKiA8cGFjYWtnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSBJUERFQ29udHJpYnV0ZUNsYXNzcGF0aCBzaG91bGQgYWNjZXNzIGl0LgotICogCi0gKiBAc2luY2UgMS4wLjIKLSAqLwotY2xhc3MgUERFQ29udHJpYnV0ZUNsYXNzcGF0aEluc3RhbmNlIHsKLQotCS8qKgotCSAqIEdldCB0aGUgaW5zdGFuY2UgdG8gdXNlLiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSB0byB1c2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgUERFIG5vdCBhdmFpbGFibGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUERFQ29udHJpYnV0ZUNsYXNzcGF0aCBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UucGRlLmNvcmUiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJQ2xhc3MgcGRlQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5QREVDb250cmlidXRlQ2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gKElQREVDb250cmlidXRlQ2xhc3NwYXRoKSBwZGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gUERFIG5vdCBhdmFpbGFibGUsIHRoaXMgaXMgb2suCi0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZS5nZXRDYXVzZSgpLCBMZXZlbC5XQVJOSU5HKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVQcm9jZXNzRm9yUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVQcm9jZXNzRm9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOTVhY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUERFUHJvY2Vzc0ZvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUERFUHJvY2Vzc0ZvclBsdWdpbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzEwLzE0IDE3OjQ1OjAyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLmNvcmUuUERFQ29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luLkZvdW5kSURzOwotIAotCi0vKgotICogVXNlZCBmb3IgUERFIFByb2Nlc3NpbmcgZm9yIHRoZSBQcm94eSBQbHVnaW4gY2xhc3MuIEl0IHdpbGwgYmUgb3B0aW9uYWxseSBsb2FkZWQKLSAqIGlmIFBERSBwbHVnaW4gaXMgaW5zdGFsbGVkLiBUaGlzIGFsbG93cyB1c2FnZSBpbiBhbiBpbnN0YWxsYXRpb24gdGhhdCBkb2Vzbid0IGhhdmUKLSAqIFBERSBpbnN0YWxsZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMgotICovCi1jbGFzcyBQREVQcm9jZXNzRm9yUGx1Z2luIGltcGxlbWVudHMgUHJveHlQbHVnaW4uSVBERVByb2Nlc3NGb3JQbHVnaW4gewotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW4uSVBERVByb2Nlc3NGb3JQbHVnaW4jcHJvY2Vzc1BsdWdpbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QsIGphdmEudXRpbC5NYXAsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgZmluZFBsdWdpbnMoSUphdmFQcm9qZWN0IHByb2plY3QsIEZvdW5kSURzIGZvdW5kSWRzLCBib29sZWFuIHZpc2libGUsIGJvb2xlYW4gZmlyc3QpIHsKLQkJSVBsdWdpbk1vZGVsQmFzZSBtID0gUERFQ29yZS5nZXREZWZhdWx0KCkuZ2V0TW9kZWxNYW5hZ2VyKCkuZmluZE1vZGVsKHByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKG0gaW5zdGFuY2VvZiBJUGx1Z2luTW9kZWwpIHsKLQkJCS8vIGl0IGlzIGEgcGx1Z2luLCBwcm9jZXNzIGl0LgotCQkJSVBsdWdpbiBwbHVnaW4gPSAoKElQbHVnaW5Nb2RlbCkgbSkuZ2V0UGx1Z2luKCk7Ci0JCQlpZiAoZm91bmRJZHMucGx1Z2luSWRzLmNvbnRhaW5zS2V5KHBsdWdpbi5nZXRJZCgpKSkKLQkJCQlyZXR1cm47CS8vIGFscmVhZHkgcHJvY2Vzc2VkIGl0Ci0JCQlmb3VuZElkcy5wbHVnaW5JZHMucHV0KHBsdWdpbi5nZXRJZCgpLCBmaXJzdCB8fCB2aXNpYmxlID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CQkJCi0JCQlleHBhbmRQbHVnaW4ocGx1Z2luLCBmb3VuZElkcywgdmlzaWJsZSwgZmlyc3QpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFBsdWdpbihJUGx1Z2luIHBsdWdpbiwgRm91bmRJRHMgZm91bmRJZHMsIGJvb2xlYW4gdmlzaWJsZSwgYm9vbGVhbiBmaXJzdCkgewotCQlJUGx1Z2luSW1wb3J0W10gaW1wb3J0cyA9IHBsdWdpbi5nZXRJbXBvcnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJSVBsdWdpbkltcG9ydCBwaSA9IGltcG9ydHNbaV07Ci0JCQlCb29sZWFuIHBpVmFsdWUgPSAoQm9vbGVhbikgZm91bmRJZHMucGx1Z2luSWRzLmdldChwaS5nZXRJZCgpKTsKLQkJCWJvb2xlYW4gaW1wb3J0VmlzaWJsZSA9IGZpcnN0IHx8ICh2aXNpYmxlICYmIHBpLmlzUmVleHBvcnRlZCgpKTsKLQkJCWlmIChwaVZhbHVlICE9IG51bGwgJiYgKCFpbXBvcnRWaXNpYmxlIHx8IHBpVmFsdWUuYm9vbGVhblZhbHVlKCkpKQotCQkJCWNvbnRpbnVlOwkvLyB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCwgdGhpcyB0aW1lIG5vdCB2aXNpYmxlLCBvciB0aGlzIHRpbWUgdmlzaWJsZSBhbmQgd2FzIHByZXZpb3VzbHkgdmlzaWJsZS4KLQkJCS8vIE5vdyBlaXRoZXIgZmlyc3QgdGltZSwgb3IgaXQgd2FzIHRoZXJlIGJlZm9yZSwgYnV0IG5vdyB2aXNpYmxlLCBidXQgdGhpcyB0aW1lIGl0IGlzIHZpc2libGUuCi0JCQkvLyBXZSB3YW50IGl0IHRvIGJlY29tZSB2aXNpYmxlIGluIHRoYXQgY2FzZS4gCi0JCQlmb3VuZElkcy5wbHVnaW5JZHMucHV0KHBpLmdldElkKCksIGltcG9ydFZpc2libGUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsJCQkKLQkJCUlQbHVnaW4gcGIgPSBQREVDb3JlLmdldERlZmF1bHQoKS5maW5kUGx1Z2luKHBpLmdldElkKCksCi0JCQkJcGkuZ2V0VmVyc2lvbigpLAotCQkJCXBpLmdldE1hdGNoKCkpOwotCQkJaWYgKHBiICE9IG51bGwpCi0JCQkJZXhwYW5kUGx1Z2luKHBiLCBmb3VuZElkcywgaW1wb3J0VmlzaWJsZSwgZmFsc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1Byb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NjQyZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlRpbWVyVGVzdHM7Ci0KLS8qKgotICogUmVnaXN0cnkgb2YgcHJveHkgZmFjdG9yaWVzIG9uIGEgcGVyLVZNIGJhc2lzLgotICogVGhlcmUgY2FuIGJlIG11bHRpcGxlIFZNJ3MsIHRoaXMgd291bGQgYmUgcmVxdWlyZWQgYnkgdGhlCi0gKiBkZXNrdG9wIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSBwcm9qZWN0IGNvdWxkIGJlIG9wZW4sIGFuZCBlYWNoCi0gKiB3b3VsZCByZXF1aXJlIHRoZWlyIG93biBWTSBiZWNhdXNlIHRoZSBjbGFzc3BhdGhzIHdvdWxkIGJlIGRpZmZlcmVudC4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBtb3JlIGZhY3RvcmllcyBmb3IgYSBwYXJ0aWN1bGFyCi0gKiBWTS4gCi0gKiBDcmVhdGlvbiBkYXRlOiAoMy8xMy8wMCAxMDo0ODoxMCBBTSkKLSAqIEBhdXRob3I6IFJpY2hhcmQgTGVlIEt1bHAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSXNWYWxpZCA9IHRydWU7CS8vIFRoZSByZWdpc3RyeSBpcyB2YWxpZCB1bnRpbCB0ZXJtaW5hdGVkLgotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3QgcmVnaXN0cnlMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCi0JLyoqCi0JICogSVJlZ2lzdHJ5TGlzdGVuZXIKLQkgKiBMaXN0ZW4gZm9yIHRoZSByZWdpc3RyeSBiZWluZyB0ZXJtaW5hdGVkLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgSVJlZ2lzdHJ5TGlzdGVuZXIgewotCQkvKioKLQkJICogTWV0aG9kIHJlZ2lzdHJ5VGVybWluYXRlZC4KLQkJICogCi0JCSAqIFRoZSByZWdpc3RyeSBoYXMgYmVlbiB0ZXJtaW5hdGVkLiBXaGVuIHRoaXMgaXMgY2FsbGVkIHRoZSByZWdpc3RyeQotCQkgKiBpcyBubyBsb25nZXIgdmFsaWQuIEl0IHNob3VsZCBub3QgYmUgYXNzdW1lZCBhbnkgY2FsbHMgY2FuIGJlIG1hZGUKLQkJICogdG8gdGhlIHJlZ2lzdHJ5LgotCQkgKiAKLQkJICogQHBhcmFtIHJlZ2lzdHJ5Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpc3RyeVRlcm1pbmF0ZWQoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpOwotCX0KLQkJCi0KLQkvLyBGYWN0b3J5IHJlZ2lzdHJhdGlvbiBJUyBOT1QgYSBkeW5hbWljIHJlZ2lzdHJhdGlvbi4gT25jZSByZWdpc3RlcmVkIGZvciBhIFZNIG9yIGFuIGluc3RhbmNlCi0JLy8gdGhleSBzaG91bGQgbm90IGJlIGNoYW5nZWQuIFRoaXMgaXMgYmVjYXVzZSByZWZlcmVuY2VzIGFyZSBjYWNoZWQgaW4gb3RoZXIgb2JqZWN0cy4KLQkvLyBUaGUgVk0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVnaXN0cnkgc2hvdWxkbid0IGV4aXRlZCBhbmQgcmVzdGFydGVkIGJlY2F1c2UKLQkvLyB0aGUgY2FjaGVkIG9iamVjdCB3aWxsIHRoZW4gaGF2ZSBpbnZhbGlkIHJlZmVyZW5jZXMgdG8gbm8gbG9uZ2VyIGV4aXN0aW5nIG9iamVjdHMuCi0JLy8gSWYgdGhlIFZNIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwgdGhlbiBhbGwgcHJveGllcyBuZWVkIHRvIGJlIHRvc3NlZC4KLQkKLQkvLwotCS8vIEluZGl2aWR1YWwgUHJveHlGYWN0b3J5UmVnaXN0cnksIGFwcGxpZXMgdG8gYSBwYXJ0aWN1bGFyIFZNLgotCS8vCi0KLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkvLwotCS8vIElCZWFuUHJveHlGYWN0b3J5IFJlZ2lzdHJ5Ci0JLy8KLQkKLQkvLyBUaGUgc3RhbmRhcmQgYmVhbiAgcHJveHkgZmFjdG9yeSwgdGhlIG9uZSB0aGUgZGVza3RvcCB3aWxsIHVzZSBmb3IgcGFja2FnZXMgdGhhdCBoYXZlIG5vdAotCS8vIGJlZW4gZXh0ZW5kZWQgYW5kIHJlZ2lzdGVyZWQgYnkgY3VzdG9taXphdGlvbiBkZXZlbG9wZXJzLgotCXByb3RlY3RlZCBJU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZDdXJyZW50U3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5OwotCi0JLy8gVGhlIGRpcmVjdG9yeSBvZiByZWdpc3RlcmVkIGV4dGVuc2lvbiBmYWN0b3JpZXMsIHR5cGljYWxseSByZWdpc3RlcmVkIGJ5IHBhY2thZ2UuCi0JZmluYWwgcHJvdGVjdGVkIEhhc2h0YWJsZSBmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5Qcm94eUZhY3RvcmllcyA9IG5ldyBIYXNodGFibGUoKTsKLQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCS8vCi0JLy8gSUJlYW5UeXBlUHJveHlGYWN0b3J5IFJlZ2lzdHJ5Ci0JLy8KLQkKLQkvLyBUaGUgc3RhbmRhcmQgYmVhbiB0eXBlIHByb3h5IGZhY3RvcnksIHRoZSBvbmUgdGhlIGRlc2t0b3Agd2lsbCB1c2UgZm9yIHBhY2thZ2VzIHRoYXQgaGF2ZSBub3QKLQkvLyBiZWVuIGV4dGVuZGVkIGFuZCByZWdpc3RlcmVkIGJ5IGN1c3RvbWl6YXRpb24gZGV2ZWxvcGVycy4KLQlwcm90ZWN0ZWQgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZkN1cnJlbnRTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5OwotCi0JLy8gVGhlIGRpcmVjdG9yeSBvZiByZWdpc3RlcmVkIGV4dGVuc2lvbiBmYWN0b3JpZXMsIHR5cGljYWxseSByZWdpc3RlcmVkIGJ5IHBhY2thZ2UuCi0JZmluYWwgcHJvdGVjdGVkIEhhc2h0YWJsZSBmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3JpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCi0KLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkvLwotCS8vIE90aGVyIGZhY3RvcmllcwotCS8vCi0JCQotCXByb3RlY3RlZCBJTWV0aG9kUHJveHlGYWN0b3J5IGZNZXRob2RQcm94eUZhY3RvcnkgPSBudWxsOwkvLyBNZXRob2QgUHJveHkgRmFjdG9yeQotCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JLy8KLQkvLyBDb25zdGFudHMgUmVnaXN0cnkuIERpZmZlcmVudCBleHRlbnNpb25zIGNhbiBzdG9yZQotCS8vIG9iamVjdHMgYnkga2V5IGFzIGEgcmVnaXN0cnkgb2YgY29uc3RhbnRzLgotCS8vIEZvciBleGFtcGxlLCBqYXZhLmF3dCBleHRlbnNpb24gd2lsbCBzdG9yZSBhbiBvYmplY3QKLQkvLyB3aGljaCBoYXMgc29tZSBwcmUtZmV0Y2hlZCBtZXRob2QgcHJveGllcyBzdG9yZWQgaW4gaXQgc28KLQkvLyB0aGF0IHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBjb250aW51YWxseSByZWNyZWF0ZWQuCi0JLy8KLQkvLyBUaGlzIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLCBzbyB0aGF0Ci0JLy8gb25seSBwcm94aWVzIHRoYXQgcmVhbGx5IG5lZWQgdG8gYmUgY2FjaGVkIHNob3VsZAotCS8vIGJlIGNhY2hlZC4KLQkvLwotCS8vIERvbid0IHN0b3JlIHByb3hpZXMgdG8gbGl2ZSBiZWFucyBpbiBoZXJlIGJlY2F1c2UKLQkvLyB0aG9zZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCBvdmVyIGFuZCBvdmVyLAotCS8vIGFuZCB0aGUgaW5zdGFuY2UgaW4gdGhpcyBjYWNoZSB3aWxsIGdldCBzdGFsZS4KLQkvLyBTaG91bGQgb25seSBzdG9yZSB0aGluZ3MgbGlrZSBvZnRlbiB1c2VkIG1ldGhvZAotCS8vIHByb3hpZXMgdGhhdCBvbmNlIGNyZWF0ZWQgYXJlIHJhcmVseSBjaGFuZ2VkLgotCS8vCi0JLy8gU2luY2UgdGhlIHByb3hpZXMgY2FuIGJlIG9uIGFueSBWTSwgeW91IHNob3VsZCBoYXZlCi0JLy8gYW4gaW50ZXJmYWNlIGRlZmluaW5nIHdoYXQncyBhdmFpbGFibGUgaW4geW91cgotCS8vIGNvbnN0YW50cyBlbnRyeSwgYW5kIGFjY2VzcyBpdCB0aHJvdWdoIHRoYXQuCi0KLQlwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlIGZSZWdpc3RlcmVkQ29uc3RhbnRzID0gbmV3IEhhc2h0YWJsZSgpOwkJCi0KLQkvKioKLQkgKiBQcm94eUZhY3RvcnlSZWdpc3RyeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIGFkZFJlZ2lzdHJ5TGlzdGVuZXIuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVnaXN0cnlMaXN0ZW5lcihJUmVnaXN0cnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZWdpc3RyeUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgcmVtb3ZlUmVnaXN0cnlMaXN0ZW5lci4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWdpc3RyeUxpc3RlbmVyKElSZWdpc3RyeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJlZ2lzdHJ5TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpcmVSZWdpc3RyeVRlcm1pbmF0ZWQoKSB7Ci0JCWlmICghcmVnaXN0cnlMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBsaXN0ID0gcmVnaXN0cnlMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElSZWdpc3RyeUxpc3RlbmVyKSBsaXN0W2ldKS5yZWdpc3RyeVRlcm1pbmF0ZWQodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JIFJldHVybiB0aGUgY3VycmVudCBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuUHJveHkgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgZ2V0QmVhblByb3h5RmFjdG9yeSgpIHsKLQkJaWYgKGZDdXJyZW50U3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFByb3h5TWVzc2FnZXMuUHJveHlGYWN0b3J5X0VYQ19fTm9CZWFuUHJveHlGYWN0b3J5KTsKLQkJfQotCQlyZXR1cm4gZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3Rvcnk7Ci0JfQotCS8qKgotCSBSZXR1cm4gdGhlIGN1cnJlbnQgcmVnaXN0ZXJlZCBiZWFuIHByb3h5IGZhY3RvcnkgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgSUJlYW5Qcm94eSBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eUZhY3RvcnkgZ2V0QmVhblByb3h5RmFjdG9yeUV4dGVuc2lvbihTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJcmV0dXJuIChJQmVhblByb3h5RmFjdG9yeSlmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5Qcm94eUZhY3Rvcmllcy5nZXQocGFja2FnZU5hbWUpOwotCX0KLQkKLQkvKioKLQkgUmV0dXJuIHRoZSBjdXJyZW50IGZhY3RvcnkgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgSUJlYW5UeXBlUHJveHkgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkgewotCQlpZiAoZkN1cnJlbnRTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFByb3h5TWVzc2FnZXMuUHJveHlGYWN0b3J5X0VYQ19fTm9CZWFuVHlwZVByb3h5RmFjdG9yeSk7Ci0JCX0KLQkJcmV0dXJuIGZDdXJyZW50U3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeTsKLQl9Ci0JLyoqCi0JIFJldHVybiB0aGUgY3VycmVudCByZWdpc3RlcmVkIGJlYW4gdHlwZSBwcm94eSBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuVHlwZVByb3h5IGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eUZhY3RvcnkgZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24oU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCXJldHVybiAoSUJlYW5UeXBlUHJveHlGYWN0b3J5KWZSZWdpc3RlcmVkRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3Rvcmllcy5nZXQocGFja2FnZU5hbWUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlcXVlc3RlZCBjb25zdGFudHMgZW50cnkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnN0YW50cyhPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBmUmVnaXN0ZXJlZENvbnN0YW50cy5nZXQoa2V5KTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBNZXRob2RQcm94eUZhY3RvcnkgZm9yIHRoaXMgVk0uCi0JICogQ3JlYXRpb24gZGF0ZTogKDMvMTMvMDAgMTA6NTQ6NTkgQU0pCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHlGYWN0b3J5Ci0JICovCi0JcHVibGljIElNZXRob2RQcm94eUZhY3RvcnkgZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkgewotCQlyZXR1cm4gZk1ldGhvZFByb3h5RmFjdG9yeTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogU2V0IHRoZSByZXF1ZXN0ZWQgY29uc3RhbnRzIGVudHJ5IGZvciB0aGlzIFZNLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRzKE9iamVjdCBrZXksIE9iamVjdCBjb25zdGFudCkgewotCQlmUmVnaXN0ZXJlZENvbnN0YW50cy5wdXQoa2V5LCBjb25zdGFudCk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgY29uc3RhbnRzIGZvciB0aGUgZ2l2ZW4ga2V5LgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4xLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyQ29uc3RhbnRzKE9iamVjdCBrZXkpIHsKLSAgICAgICAgZlJlZ2lzdGVyZWRDb25zdGFudHMucmVtb3ZlKGtleSk7Ci0gICAgfQotCS8qKgotCSAqIFJlbGVhc2UgdGhlIHByb3h5LCBubyBsb25nZXIgbmVlZGVkLgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRvIGVhc2lseSBhY2Nlc3MgdGhlIHJlbGVhc2UgZnJvbSB0aGUgYmVhbiBwcm94eSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VQcm94eShJQmVhblByb3h5IHByb3h5KSB7Ci0JCS8vIFRvIHNpbXBseSB0aGluZ3MgaWYgcmVsZWFzZSBpcyBjYWxsZWQgd2hlbiB0aGUgZmFjdG9yeSBpcyBkb3duIChpbnZhbGlkKSwgdGhlbiBqdXN0Ci0JCS8vIGdvIG9uIGJlY2F1c2UgdGhlIHByb3h5IGlzIGFscmVhZHkgcmVsZWFzZWQuCi0JCWlmIChmQ3VycmVudFN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSAhPSBudWxsKQotCQkJZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkucmVsZWFzZVByb3h5KHByb3h5KTsKLQl9IAotCi0JLyoqCi0JICogSXMgdGhpcyBhIHZhbGlkIHJlZ2lzdHJ5LCBpLmUuIGlzIGl0IG5vdCB0ZXJtaW5hdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBmSXNWYWxpZDsKLQl9Ci0JCi0JLyoqCi0JICogVGVybWluYXRlIHRoZSByZWdpc3RyeSB3aXRob3V0IHdhaXRpbmcuCi0JICogPHA+Ci0JICogVGVybWluYXRlIHRoZSByZWdpc3RyeSwgYnV0IGRvbid0IG5lY2Vzc2FyaWx5IHdhaXQgZm9yIGl0LgotCSAqCi0JICogQHNlZSAjdGVybWluYXRlUmVnaXN0cnkoYm9vbGVhbikKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXJtaW5hdGVSZWdpc3RyeSgpIHsKLQkJdGVybWluYXRlUmVnaXN0cnkoZmFsc2UpOwotCX0KLQkJCi0JLyoqCi0JICogVGVybWluYXRlIHRoZSByZWdpc3RyeS4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgZ28gdGhyb3VnaCBlYWNoIGZhY3RvcnkgYW5kIHRlcm1pbmF0ZSBpdCwgYW5kCi0JICogbGV0IHRoZSBzdWJjbGFzcyB0ZXJtaW5hdGUuIEl0IHdpbGwgdGhlbiByZW1vdmUgYWxsIG9mIHRoZSBmYWN0b3JpZXMgc28gdGhhdAotCSAqIGlmIHRoZXJlIGFyZSBhbnkgcHJveGllcyBzdGlsbCBoYW5naW5nIGFyb3VuZCB0aGV5IHdvbid0IGhvbGQgb250byBldmVyeXRoaW5nLAotCSAqIGp1c3QgdGhlIHRoaXMgcmVnaXN0cnkgd2lsbCBiZSBoZWxkIG9udG8uCi0JICo8cD4KLQkgKiBOb3RlIGR1cmluZyB0ZXJtaW5hdGlvbiwgdGhlIGZhY3RvcmllcyBzaG91bGQgbm90IHJlZmVyZW5jZSBhbnkgb3RoZXIgZmFjdG9yeS4KLQkgKiBJdCBjYW4gYXNzdW1lIHRoYXQgdGhlIGZhY3RvcmllcyB3aWxsIHRha2UgY2FyZSBvZiB0aGVtc2VsdmVzIGFuZCB0aGV5IHNob3VsZAotCSAqIG9ubHkgcmVsZWFzZSB0aGVpciByZXNvdXJjZXMuCi0JICogPHA+Ci0JICogVGhlIGNvbnN0YW50cyByZWdpc3RyeSB3aWxsIG5vdCBiZSB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhleSBhcmVuJ3QgZmFjdG9yaWVzLgotCSAqIEhvd2V2ZXIsIHRoZXkgd2lsbCBiZSBjbGVhcmVkIChubyBsb25nZXIgcmVmZXJlbmNlZCkgZnJvbSBoZXJlIHNvIHRoYXQgdGhleQotCSAqIGNhbiBiZSBHQydkLgotCSAqIAotCSAqIEBwYXJhbSB3YWl0IDxjb2RlPnRydWU8L2NvZGU+IHRvIHdhaXQgZm9yIGNvbXBsZXRlIHRlcm1pbmF0aW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gdG8ga2ljayBvZmYgdGVybWluYXRpb24gYnV0IHJldHVybiBBU0FQLgotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlcm1pbmF0ZVJlZ2lzdHJ5KGJvb2xlYW4gd2FpdCkgewotCQlpZiAoIWZJc1ZhbGlkKQotCQkJcmV0dXJuOwkvLyBBbHJlYWR5IG9yIGFyZSBhbHJlYWR5IHRlcm1pbmF0aW5nLiBEb24ndCBkbyBpdCBhZ2FpbiBhbmQgZG9uJ3Qgbm90aWZ5IGFnYWluLgotCQlmSXNWYWxpZCA9IGZhbHNlOwotCQlpZiAoZkN1cnJlbnRTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5ICE9IG51bGwpIHsKLS8vCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRTdGVwKCJUZXJtaW5hdGUgQmVhbiBUeXBlIEZhY3RvcnkiKTsKLQkJCWZDdXJyZW50U3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS50ZXJtaW5hdGVGYWN0b3J5KHdhaXQpOwotLy8JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wU3RlcCgiVGVybWluYXRlIEJlYW4gVHlwZSBGYWN0b3J5Iik7Ci0JCQlmQ3VycmVudFN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCWlmIChmQ3VycmVudFN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmQ3VycmVudFN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS50ZXJtaW5hdGVGYWN0b3J5KHdhaXQpOwotCQkJZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCWlmIChmTWV0aG9kUHJveHlGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZNZXRob2RQcm94eUZhY3RvcnkudGVybWluYXRlRmFjdG9yeSh3YWl0KTsKLQkJCWZNZXRob2RQcm94eUZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdHIgPSBmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCSgoSUJlYW5Qcm94eUZhY3RvcnkpIGl0ci5uZXh0KCkpLnRlcm1pbmF0ZUZhY3Rvcnkod2FpdCk7Ci0JCX0KLQkJZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yaWVzLmNsZWFyKCk7Ci0JCQotCQlpdHIgPSBmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5Qcm94eUZhY3Rvcmllcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJKChJQmVhblByb3h5RmFjdG9yeSkgaXRyLm5leHQoKSkudGVybWluYXRlRmFjdG9yeSh3YWl0KTsKLQkJfQotCQlmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5Qcm94eUZhY3Rvcmllcy5jbGVhcigpOwotCQkKLQkJZlJlZ2lzdGVyZWRDb25zdGFudHMuY2xlYXIoKTsKLQkJCi0JCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0U3RlcCgiUmVnaXN0cnkgVGVybWluYXRlZCIpOyAvLyROT04tTkxTLTEkCi0JCXJlZ2lzdHJ5VGVybWluYXRlZCh3YWl0KTsKLQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcFN0ZXAoIlJlZ2lzdHJ5IFRlcm1pbmF0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkKLS8vCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydFN0ZXAoIlJlZ2lzdHJ5IFRlcm1pbmF0ZWQgTm90aWZpY2F0aW9uIik7Ci0JCWZpcmVSZWdpc3RyeVRlcm1pbmF0ZWQoKTsJLy8gTGV0IGV2ZXJ5b25lIGtub3cgdGhhdCB3ZSBhcmUgZ29uZS4gVGhpcyBpcyBmaXJlZCBldmVuIGlmIHdhaXQgaXMgZmFsc2UgYmVjYXVzZSBhdCB0aGlzIHBvaW50IGluIHRpbWUgdGhlIHJlZ2lzdHJ5IGlzIGludmFsaWQuCi0vLwkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcFN0ZXAoIlJlZ2lzdHJ5IFRlcm1pbmF0ZWQgTm90aWZpY2F0aW9uIik7Ci0JfQotCQotCi0JLyoqCi0JICogVGVybWluYXRlIHRoZSBSZWdpc3RyeS4gCi0JICogPHA+Ci0JICogSXQgaXMgdXAgdG8gZWFjaCByZWdpc3RyeSB0byBkZXRlcm1pbmUgd2hhdCB0aGlzIG1lYW5zLgotCSAqIDxwPgotCSAqIFRoZSB3YWl0IHBhcm0gaXMgYSBzdWdnZXN0aW9uIGlmIGl0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgYnV0IGl0IG11c3QgYmUgaG9ub3VyZWQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gd2FpdCB3YWl0IGZvciByZWdpc3RyeSB0byB0ZXJtaW5hdGUgZmxhZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWdpc3RyeVRlcm1pbmF0ZWQoYm9vbGVhbiB3YWl0KTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGNhbGxiYWNrIHJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQ2FsbGJhY2tSZWdpc3RyeSBnZXRDYWxsYmFja1JlZ2lzdHJ5KCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUZpbmRTdXBwb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUZpbmRTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGM0YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlGaW5kU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFByb3h5RmluZFN1cHBvcnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8xMC8yNiAyMjoxNDowMSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotIAotCi0vKioKLSAqIFV0aWxpdHkgdG8gaGVscCBmaW5kaW5nIGZpbGVzLiBJdCBpcyB1c2VkIHRvIGZpbmQgdGhlbSB3aXRoaW4gcGx1Z2lucyBvZiB0aGUgY3VycmVudCBwbGF0Zm9ybSBvciB0byBmaW5kIHRoZW0gaW4gdGhlIFBERSB0YXJnZXQgcGxhdGZvcm0uCi0gKiBBbHNvIGlmIGluIHRoZSBjdXJyZW50IHBsYXRmb3JtIGFuZCB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBpbiBkZXZlbG9wbWVudCBtb2RlIGl0IHdpbGwgZmluZCB0aGUgYmluIGRpcmVjdG9yaWVzIGZvciB0aGUgamFycyBpbnN0ZWFkIHNpbmNlCi0gKiB0aGVyZSBhcmUgbm8gamFycyBpbiB0aGF0IGNhc2UuCi0gKiBJdCBjYW4gYWxzbyBleHRyYWN0IG5vbi1sb2NhbCBmaWxlcyAoc3VjaCBhcyBmaWxlcyB3aXRoaW4gYSBqYXIpIGFuZCBtYWtlIGEgY2FjaGUgb2YgdGhlbSBzbyB0aGF0IGFyZSBhIGxvY2FsIGZpbGUgYW5kIG5vdCBleHRyYWN0ZWQgZXZlcnl0aW1lCi0gKiB0aGV5IGFyZSBuZWVkZWQuCi0gKgotICogVE9ETyBJZiB3ZSBldmVyIGdldCBiYWNrIHRvIGNvbnRpbnVpbmcgZGV2ZWxvcG1lbnQgd2Ugc2hvdWxkIGFkZCB0byB0aGlzIFBERSBUYXJnZXQgc3VwcG9ydC4gQW5kIHRlc3QgdGhlIGNvZGUgaGVyZSAKLSAqIHNpbmNlIGl0IGhhc24ndCBiZWVuIHRlc3RlZCB5ZXQuIEFsc28gbm90ZSB0aGF0IGluIGNvbmZpZ3VyYXRpb24gY29udHJpYnV0b3IsCi0gKiB3aGVuIHdlIGFkZCB0aGUgbGlicmFyeSBwYXRoIHdlIGV4cGVjdCBpdCB0byBiZSBhIGZvbGRlci4gVGhpcyB3b3VsZCBiZSBhIHByb2JsZW0gd2l0aCBqYXJyZWQgcGx1Z2lucyBiZWNhdXNlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKLSAqIGxpYnJhcmllcyBtYXkgYmUgdGhlIHJvb3Qgb2YgdGhlIHBsdWdpbiBhbmQgbG9jYWxpemluZyBhIGRpcmVjdG9yeSB3b3VsZCBleHRyYWN0IGFuZCBjYWNoZSB0aGUgZW50aXJlIHBsdWdpbi4gTmVlZCB0byBjaGFuZ2UgdG8gZmlndXJlIG91dAotICogaG93IHRvIG9ubHkgZXh0cmFjdCB0aGUgZGxsL3NvIG5lZWRlZCBpbnN0ZWFkLiBBbHNvLCBub25lIG9mIHRoZXNlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgYnVuZGxlIGlzIGFjdHVhbGx5IG5vbi1sb2NhbCAoZS5nLiAiaHR0cDovIikuCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIFByb3h5RmluZFN1cHBvcnQgewotCi0JCi0JLyoqCi0JICogRmluZCB0aGUgZmlsZW5hbWUgcmVsYXRpdmUgdG8gdGhlIHBsYXRmb3JtIGJ1bmRsZS4gSXQgd2lsbCBzZWFyY2ggaW4gdGhlIGJ1bmRsZSBhbmQgaW4gYWxsIGZyYWdtZW50cyBmb3IgdGhlIGZpbGUgbmFtZS4KLQkgKiBJdCB3aWxsIHJldHVybiBhIFVSTCBmb3IgZWFjaCBmb3VuZCBmaWxlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBOTFMgcHVycG9zZXMuIEluIE5MUyBzaXR1YXRpb25zIHRoZSBtYWluIGJ1bmRsZSB3b3VsZCBjb250YWluIHRoZSBtYWluIG5vbi1saWJyYXJ5IGphciB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXMgZmlsZXMuCi0JICogVGhlbiBhIGZyYWdtZW50IGZvciBlYWNoIHNldCBvZiBsYW5ndWFnZXMgd2lsbCBiZSBpbnN0YWxsZWQuIFdpdGhpbiBlYWNoIGZyYWdtZW50IHdpbGwgYmUgYSBqYXIgd2l0aCB0aGUgc2FtZSBmaWxlcGF0aCwgYW5kIGl0IHdpbGwKLQkgKiBjb250YWluIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIGZvciB0aGF0IGxhbmd1YWdlLiBUaGlzIHdvdWxkIGJlIGRvbmUgb25seSBmb3IgcGx1Z2luIG5vbi1saWJyYXJ5IGphcnMuIAotCSAqIFRoZSBOTFMgZm9yIGxpYnJhcnkgamFycyBvZiBhIHBsdWdpbiAoaS5lLiB0aG9zZSBqYXJzIHRoYXQgYXJlIHRoZSA8cnVudGltZT4gamFycyBmb3IgdGhlIHBsdWdpbikgYXJlIHVzdWFsbHkgbGlicmFyeSBqYXJzIHRoZW1zZWx2ZXMgaW4KLQkgKiB0aGUgZnJhZ21lbnQsIGFuZCB0aGV5IHVzdWFsbHkgaGF2ZSBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIG1haW4gbGlicmFyeSBqYXIuIFNvIHRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBsaWJyYXJ5IGphcnMuCi0JICogPHA+Ci0JICogSWYgaW4gZGV2ZWxvcG1lbnQgbW9kZSwgdGhlbiBpZiB0aGUgamFyIGlzIG5vdCBmb3VuZCBpdCB3aWxsIGxvb2sgaW4gdGhlIHBsdWdpbiBwcm9qZWN0J3MgYnVpbGQucHJvcGVydGllcyB0byBmaW5kIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0JICogb2YgdGhlIGphci4gSWYgbm90IGluIHRoZSBidWlsZC5wcm9wZXJ0aWVzIChtZWFuaW5nIGl0IGlzbid0IGJlaW5nIGJ1aWx0IGJ5IFBERSksIGl0IHdpbGwgbG9vayBpbiB0aGUgcHJveHkuamFycyBmaWxlIChpZiB0aGVyZSBpcyBvbmUpLgotCSAqIFRoaXMgZmlsZSBpcyB1c2VkIGZvciBqYXJzIHRoYXQgYXJlIGJ1aWx0IGluIGEgc2VwYXJhdGUgcHJvamVjdCBmcm9tIHRoZSBwbHVnaW4gYnV0IHdpbGwgYmUgZm91bmQgaW4gdGhlIHBsdWdpbiBhdCBleGVjdXRpb24uCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZSBidW5kbGUgYW5kIGl0cyBmcmFnbWVudHMgdG8gbG9vayBpbi4KLQkgKiBAcGFyYW0gZmlsZW5hbWVXaXRoaW5CdW5kbGUgcGF0aCB0byBmaWxlbmFtZSB3aXRoaW4gdGhlIGJ1bmRsZSBhbmQgZnJhZ21lbnRzLiA8Yj5UaGlzIG11c3QgYmUgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkuPC9iPiAKLQkgKiAgIEZvciBmaW5kaW5nIHRoZSBidW5kbGUgaXRzZWxmIChvbmx5IHdoZW4gdGhlIGJ1bmRsZSBpcyBwYWNrYWdlZCBhcyBhIGphciksIHVzZSA8QGxpbmsgI3BsYXRmb3JtRmluZChCdW5kbGUpPi4gVGhpcyBkb2VzIG5vdCB1c2UKLQkgKiAgIHRoZSBwbGF0Zm9ybSBzaG9ydGN1dHMgbGlrZSAiJG9zJCIuIEl0IGZpbmRzIHRoZSBmaWxlcyBleGFjdGx5IGFzIHNwZWNpZmllZC4KLQkgKiBAcGFyYW0gYXNMb2NhbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXJscyBuZWVkIHRvIHBvaW50IHRvIGxvY2FsIGZpbGVzeXN0ZW0gZmlsZXMuIFRoaXMgbWF5IGNhdXNlIGNhY2hpbmcgb2YgZmlsZXMgbG9jYWxseS4gVGhpcwotCSAqIGNvdWxkIGhhcHBlbiBpZiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBwbHVnaW4gdGhhdCBpcyBqYXJyZWQuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXJsIGNhbiBiZSBhIG5vbi1sb2NhbCBmaWxlc3lzdGVtIHVybC4gCi0JICogQHJldHVybiBhcnJheSBvZiBVUkwncyBmb3IgZm91bmQgZmlsZXMuIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMW10gcGxhdGZvcm1GaW5kQWxsKEJ1bmRsZSBidW5kbGUsIElQYXRoIGZpbGVuYW1lV2l0aGluQnVuZGxlLCBib29sZWFuIGFzTG9jYWwpIHsKLQkJQnVuZGxlW10gZnJhZ21lbnRzID0gUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7Ci0JCUFycmF5TGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgoZnJhZ21lbnRzID09IG51bGwgPyAwIDogZnJhZ21lbnRzLmxlbmd0aCkgKyAxKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZW5hbWVXaXRoaW5CdW5kbGUudG9TdHJpbmcoKTsKLQkJVVJMIHVybCA9IGludGVybmFsRmluZEZyb21CdW5kbGVPbmx5KGJ1bmRsZSwgZmlsZW5hbWUsIGFzTG9jYWwpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQl1cmxzLmFkZCh1cmwpOwotCQlpZiAoZnJhZ21lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQnVuZGxlIGZyYWdtZW50ID0gZnJhZ21lbnRzW2ldOwotCQkJCXVybCA9IGludGVybmFsRmluZEZyb21CdW5kbGVPbmx5KGZyYWdtZW50LCBmaWxlbmFtZSwgYXNMb2NhbCk7Ci0JCQkJaWYgKHVybCAhPSBudWxsKQotCQkJCQl1cmxzLmFkZCh1cmwpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVVJMW10pIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gZmlsZW5hbWVXaXRoaW5CdW5kbGUKLQkgKiBAcGFyYW0gYXNMb2NhbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkwgaW50ZXJuYWxGaW5kRnJvbUJ1bmRsZU9ubHkoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlLCBib29sZWFuIGFzTG9jYWwpIHsKLQkJdHJ5IHsKLQkJCVVSTCBwdm0gPSBidW5kbGUuZ2V0RW50cnkoZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQkJaWYgKHB2bSAhPSBudWxsKQotCQkJCXJldHVybiBhc0xvY2FsID8gUGxhdGZvcm0uYXNMb2NhbFVSTChwdm0pIDogcHZtOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmlzRGV2TW9kZSgpKSB7Ci0JCQlyZXR1cm4gZmluZERldihidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlLCBhc0xvY2FsKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSBmaWxlbmFtZSByZWxhdGl2ZSB0byB0aGUgcGxhdGZvcm0gYnVuZGxlLiBJdCB3aWxsIHNlYXJjaCBpbiB0aGUgYnVuZGxlIGFuZCBpbiBhbGwgZnJhZ21lbnRzIGZvciB0aGUgZmlsZSBuYW1lLiBJdCB3aWxsIHJldHVybgotCSAqIFVSTCBmb3IgdGhlIGZpbGUgaWYgZm91bmQuCi0JICogPHA+Ci0JICogSWYgaW4gZGV2ZWxvcG1lbnQgbW9kZSwgdGhlbiBpZiB0aGUgamFyIGlzIG5vdCBmb3VuZCBpdCB3aWxsIGxvb2sgaW4gdGhlIHBsdWdpbiBwcm9qZWN0J3MgYnVpbGQucHJvcGVydGllcyB0byBmaW5kIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0JICogb2YgdGhlIGphci4gSWYgbm90IGluIHRoZSBidWlsZC5wcm9wZXJ0aWVzIChtZWFuaW5nIGl0IGlzbid0IGJlaW5nIGJ1aWx0IGJ5IFBERSksIGl0IHdpbGwgbG9vayBpbiB0aGUgcHJveHkuamFycyBmaWxlIChpZiB0aGVyZSBpcyBvbmUpLgotCSAqIFRoaXMgZmlsZSBpcyB1c2VkIGZvciBqYXJzIHRoYXQgYXJlIGJ1aWx0IGluIGEgc2VwYXJhdGUgcHJvamVjdCBmcm9tIHRoZSBwbHVnaW4gYnV0IHdpbGwgYmUgZm91bmQgaW4gdGhlIHBsdWdpbiBhdCBleGVjdXRpb24uCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZSBidW5kbGUgYW5kIGl0cyBmcmFnbWVudHMgdG8gbG9vayBpbi4KLQkgKiBAcGFyYW0gZmlsZW5hbWVXaXRoaW5CdW5kbGUgcGF0aCB0byBmaWxlbmFtZSB3aXRoaW4gdGhlIGJ1bmRsZSBhbmQgZnJhZ21lbnRzLiA8Yj5UaGlzIG11c3QgYmUgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkuPC9iPiAKLQkgKiAgIEZvciBmaW5kaW5nIHRoZSBidW5kbGUgaXRzZWxmIChvbmx5IHdoZW4gdGhlIGJ1bmRsZSBpcyBwYWNrYWdlZCBhcyBhIGphciksIHVzZSA8QGxpbmsgI3BsYXRmb3JtRmluZChCdW5kbGUpPi4KLQkgKiBAcGFyYW0gYXNMb2NhbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXJscyBuZWVkIHRvIHBvaW50IHRvIGxvY2FsIGZpbGVzeXN0ZW0gZmlsZXMuIFRoaXMgbWF5IGNhdXNlIGNhY2hpbmcgb2YgZmlsZXMgbG9jYWxseS4gVGhpcwotCSAqIGNvdWxkIGhhcHBlbiBpZiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBwbHVnaW4gdGhhdCBpcyBqYXJyZWQuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXJsIGNhbiBiZSBhIG5vbi1sb2NhbCBmaWxlc3lzdGVtIHVybC4gIAotCSAqIEByZXR1cm4gdGhlIGZvdW5kIHVybCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgcGxhdGZvcm1GaW5kKEJ1bmRsZSBidW5kbGUsIElQYXRoIGZpbGVuYW1lV2l0aGluQnVuZGxlLCBib29sZWFuIGFzTG9jYWwpIHsKLQkJdHJ5IHsKLQkJCVVSTCBwdm0gPSBQbGF0Zm9ybS5maW5kKGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQkJaWYgKHB2bSAhPSBudWxsKQotCQkJCXJldHVybiBhc0xvY2FsID8gUGxhdGZvcm0uYXNMb2NhbFVSTChwdm0pIDogcHZtOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmlzRGV2TW9kZSgpKSB7Ci0JCQlyZXR1cm4gZmluZERldihidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlLnRvU3RyaW5nKCksIGFzTG9jYWwpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEUFJPUEVSVElFUyA9ICJidWlsZC5wcm9wZXJ0aWVzIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWUpBUlMgPSAicHJveHkuamFycyI7CS8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBVUkwgZmluZERldihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgZmlsZW5hbWVXaXRoaW5CdW5kbGUsIGJvb2xlYW4gYXNMb2NhbCkgewotCQkvLyBHb3QgdGhpcyBmYXIgYW5kIGluIGRldiBtb2RlIG1lYW5zIGl0IHdhc24ndCBmb3VuZCwgc28gd2UnbGwgdHJ5IGZvciBkZXZlbG9wbWVudCBzdHlsZS4KLQkJLy8gSXQgaXMgYXNzdW1lZCB0aGF0IGluIGRldiBtb2RlLCB3ZSBhcmUgcnVubmluZyB3aXRoIHRoZSBJREUgYXMgbG9jYWwgYW5kIGFueSAKLQkJLy8gYnVpbGQgb3V0cHV0cyB3aWxsIGJlIGxvY2FsIHNvIGxvY2FsIGZpbGUgcHJvdG9jb2wgd2lsbCBiZSByZXR1cm5lZAotCQkvLyBmcm9tIFBsYXRmb3JtLnJlc29sdmUoKS4gV2Ugd29uJ3QgYmUgcnVubmluZyBpbiBkZXYgbW9kZSB3aXRoIG91ciBlbnRpcmVwbHVnaW4gYmVpbmcgaW4gYSBqYXIsCi0JCS8vIG9yIG9uIGEgc2VwYXJhdGUgc3lzdGVtLgotCQl0cnkgewotCQkJVVJMIGJwID0gYnVuZGxlLmdldEVudHJ5KEJVSUxEUFJPUEVSVElFUyk7Ci0JCQlpZiAoYnAgIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGlvcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW9zID0gYnAub3BlblN0cmVhbSgpOwotCQkJCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQkJcHJvcHMubG9hZChpb3MpOwotCQkJCQlTdHJpbmcgcGF0aFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KCJvdXRwdXQuIitmaWxlbmFtZVdpdGhpbkJ1bmRsZS50b1N0cmluZygpKTsKLQkJCQkJaWYgKHBhdGhTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJVVJMIHB2bSA9IGJ1bmRsZS5nZXRFbnRyeShwYXRoU3RyaW5nKTsKLQkJCQkJCWlmIChwdm0gIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gYXNMb2NhbCA/IFBsYXRmb3JtLmFzTG9jYWxVUkwocHZtKSA6IHB2bTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpb3MgIT0gbnVsbCkKLQkJCQkJCWlvcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJdHJ5IHsKLQkJCVVSTCBwdm0gPSBidW5kbGUuZ2V0RW50cnkoUFJPWFlKQVJTKTsKLQkJCWlmIChwdm0gIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGlvcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW9zID0gcHZtLm9wZW5TdHJlYW0oKTsKLQkJCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJCXByb3BzLmxvYWQoaW9zKTsKLQkJCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShmaWxlbmFtZVdpdGhpbkJ1bmRsZS50b1N0cmluZygpKTsKLQkJCQkJaWYgKHBhdGhTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJVVJMIHVybCA9IFBsYXRmb3JtLnJlc29sdmUoYnVuZGxlLmdldEVudHJ5KCIvIikpOwkvLyBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgaW4gZGVidWcgbW9kZSwgdGhlbiB0aGlzIHBsdWdpbiBpcyBhbiBpbXBvcnRlZCBwbHVnaW4gd2l0aGluIHRoZSBkZXZlbG9wZW1lbnQgd29ya3NwYWNlLiAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmdldFBhcmVudEZpbGUoKTsJLy8gVGhpcyBnZXRzIHVzIHRvIHdvcmtzcGFjZSByb290IG9mIGRldmVsb3BtZW50IHdvcmtzcGFjZS4KLQkJCQkJCQlmaWxlID0gbmV3IEZpbGUoZmlsZSwgcGF0aFN0cmluZyk7Ci0JCQkJCQkJcmV0dXJuIGZpbGUudG9VUkwoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpb3MgIT0gbnVsbCkKLQkJCQkJCWlvcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIEZpbmQgdGhlIGJ1bmRsZSBhbmQgYWxsIGFjdGl2ZSBmcmFnbWVudHMgbGlicmFyaWVzLiBUaGlzIHNob3VsZCBub3JtYWxseSBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgYnVuZGxlIGlzIHBhY2thZ2VkIGFzIGEgamFyIGFuZCBub3QgYXMgYSBkaXJlY3RvcnkuIEl0IHdpbGwKLQkgKiByZXR1cm4gdGhlIHVybHMgdG8gdGhlIGphcnMgb2YgdGhlIGJ1bmRsZSBhbmQgZnJhZ21lbnRzLiBJZiBpbiBkZXZlbG9wbWVudCBtb2RlIGl0IHdpbGwgZmluZCB0aGUgYnVuZGxlJ3MgIi4iIG91dHB1dCBkaXJlY3RvcnkuCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEByZXR1cm4gYXJyYXkgb2YgVVJMJ3MgZm9yIHRoZSBqYXJyZWQgYnVuZGxlIGFuZCBmcmFnbWVudHMuIElmIHRoZSBidW5kbGUvZnJhZ21lbnRzIGFyZSBub3QgcGFja2FnZWQgYXMgamFycywgdGhlbiB0aGUgYXJyYXkgd2lsbCBiZSBlbXB0eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTFtdIHBsYXRmb3JtRmluZChCdW5kbGUgYnVuZGxlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlMYXVuY2hTdXBwb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUxhdW5jaFN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExZTg3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUxhdW5jaFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQcm94eUxhdW5jaFN1cHBvcnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMzAgJCAgJERhdGU6IDIwMDUvMTAvMjYgMTQ6MjQ6NTEgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mby5Db250YWluZXJQYXRoczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbi5Gb3VuZElEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlRpbWVyVGVzdHM7Ci0KLSAKLS8qKgotICogVGhpcyBpcyB0aGUgdXNlZCB0byBsYXVuY2ggdGhlIHByb3h5IHJlZ2lzdHJpZXMuCi0gKiBUaGlzIGlzIGEgc3RhdGljIGhlbHBlciBjbGFzcywgaXQgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eUxhdW5jaFN1cHBvcnQgewotCQotCS8vIFRoZSBrZXkgZm9yIHRoZSBwZXJzaXN0ZW4gcHJvcGVydHkgaXMgaW4gUHJveHlQbHVnaW4gc28gdGhhdCBpdCBjYW4gc2V0IGl0IG9uIHN0YXJ0dXAgd2l0aG91dAotCS8vIGNhdXNpbmcgdGhpcyBjbGFzcyB0byBiZSBpbml0aWFsaXplZC4gV2UgZG9uJ3Qgd2FudCB0aGlzIGNsYXNzIGluaXRpYWxpemVkIHVudGlsIHRoZSB2ZXJ5IGxhc3QKLQkvLyBtb21lbnQgd2hlbiBuZWVkZWQuIFRoaXMgaXMgYmVjYXVzZSBpdCBuZWVkcyBVSSB0byBiZSBhY3RpdmUgd2hlbiBpbml0aWFsaXplZCB0byBxdWVyeSBzb21lIAotCS8vIHZhbHVlcyBhbmQgaWYgUHJveHlQbHVnaW4uc3RhcnQoKSBjYXVzZXMgdGhpcyBjbGFzcyB0byBpbml0aWFsaXplLCBpdCBtYXkgYmUgdG9vIHNvb24uCi0JLy8KLQkvLyBJZiBhIHByb2plY3QncyBwZXJzaXN0ZW50IHByb3BlcnR5IGlzIHNldCB3aXRoIHRoaXMgdmFsdWUsIHRoYXQgbWVhbnMgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0JLy8gbGF1bmNoIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGlzIHByb2plY3QsIGJ1dCBub25lIGFyZSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdC4gVGhpcyBpcyBoZXJlCi0JLy8gc28gdGhhdCB3ZSBjYW4gY2hlY2sgaW4gdGhlIG9iamVjdCBjb250cmlidXRpb24gdGhhdCBpZiBub3Qgc2V0IHRoZW4gZG9uJ3Qgc2hvdyB0aGUgbWVudQotCS8vIGl0ZW0gYXQgYWxsLiBUaGlzIGlzIHRvIGNsZWFuIHVwIHRoZSBwb3B1cCBtZW51IHNvIG5vdCBzbyBjbHV0dGVyZWQuCi0JLy8gSWYgdGhlIHByb3BlcnR5IGlzIHRydWxseSBub3Qgc2V0LCB0aGVuIHRoZXJlIGlzIG5vIGRlZmF1bHQgYW5kIHRoZXJlIGFyZSBubyBjb25maWd1cmF0aW9ucyBmb3IgaXQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX1NFVCA9ICIuLi5ub3QuLnNldC4uIjsJICAvLyROT04tTkxTLTEkCi0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fVFJBQ0lORyA9ICIvZGVidWcvdHJhY2VleHByZXNzaW9ucyI7CS8vIFRyYWNlIElFeHByZXNzaW9ucy4gLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRpbWVyIHRocmVzaG9sZCBmb3IgaW5kaWNhdGluZyBhbnkgZXhwcmVzc2lvbnMgdGhhdCB0b29rIGxvbmdlciB0aGFuIHRoaXMuCi0JICogSWYgbm90IHNldCwgdGhlbiB0aHJlc2hvbGQgd2lsbCBkZWZhdWx0IHRvIDEwMG1zLgotCSAqIEl0IHdpbGwgb25seSBiZSB1c2VkIGlmIHRyYWNlZXhwcmVzc2lvbnMgaXMgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1RSQUNFSU5HX1RJTUVSX1RIUkVTSE9MRCA9ICIvZGVidWcvdHJhY2VleHByZXNzaW9uc3RpbWV0aHJlc2hvbGQiOwkgLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogUmVnaXN0cnkgb2YgbGF1bmNoIGtleSB0byBMYXVuY2hJbmZvIGNsYXNzZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIExBVU5DSF9JTkZPID0gbmV3IEhhc2hNYXAoMik7Ci0KLQkvKioKLQkgKiBQdWJsaWMgb25seSBmb3IgYWNjZXNzIGJ5IG90aGVyIGxhdW5jaCBkZWxlZ2F0ZXMgdG8gc2V0IHVwIGlmIHRoZXkgZ28gb3V0c2lkZSBvZiBQcm94eUxhdW5jaFN1cHBvcnQsCi0JICogZS5nLiBJREUgcHJveHkuIE11c3Qgbm90IGJlIHVzZWQgZm9yIGFueSBwdXJwb3NlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGF1bmNoU3VwcG9ydElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyB7Ci0JCQotCQkvKioKLQkJICogQ29uc3RydWN0IHdpdGggbm8gc2V0dGluZ3MuIFRoaXMgaXMgdG8gYmUgdXNlZCBieSBvdGhlciBsYXVuY2ggZGVsZWdhdGVzIHRoYXQKLQkJICogZG9uJ3QgaGF2ZSBhIHtAbGluayBGb3VuZElEc30gYXZhaWxhYmxlIHRvIGZpbGwgaW4gdGhlIGZpZWxkcy4gVGhvc2UgCi0JCSAqIGRlbGVnYXRlcyBtdXN0IGZpbGwgdGhlIGZpZWxkcyB0aGVtc2VsdmVzLiAgCi0JCSAqIAotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgTGF1bmNoU3VwcG9ydElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJfQotCQkKLQkJcHVibGljIExhdW5jaFN1cHBvcnRJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8oSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBGb3VuZElEcyBmb3VuZElEcykgewotCQkJdGhpcyhqYXZhUHJvamVjdCk7Ci0JCQljb250YWluZXJJZHMgPSBmb3VuZElEcy5jb250YWluZXJJZHM7Ci0JCQljb250YWluZXJzID0gZm91bmRJRHMuY29udGFpbmVyczsKLQkJCXBsdWdpbklkcyA9IGZvdW5kSURzLnBsdWdpbklkczsKLQkJCXByb2plY3RQYXRocyA9IGZvdW5kSURzLnByb2plY3RzOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIE1hcCBvZiBjb250YWluZXJzIChJQ2xhc3NwYXRoQ29udGFpbmVyKSBmb3VuZCBpbiBjbGFzc3BhdGggKGluY2x1ZGluZyByZXF1aXJlZCBwcm9qZWN0cykuCi0JCSAqIFRoaXMgaXMgZm9yIGVhY2ggcHJvamVjdCBmb3VuZC4gSWYgdGhlcmUgd2FzIGEgY29udGFpbmVyIGluIG1vcmUgdGhhbiBvbmUgcHJvamVjdCB3aXRoIHRoZQotCQkgKiBpZCwgdGhpcyBzZXQgd2lsbCBjb250YWluIHRoZSBjb250YWluZXIgZnJvbSBlYWNoIHN1Y2ggcHJvamVjdC4gVGhleSBhcmUgbm90IGNvbnNpZGVyZWQgdGhlCi0JCSAqIHNhbWUgYmVjYXVzZSB0aGV5IGNvbWUgZnJvbSBhIGRpZmZlcmVudCBwcm9qZWN0LgotCQkgKiA8cD4KLQkJICogVGhlIGtleSB3aWxsIGJlIHRoZSBjb250YWluZXJzLCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPiwgd2hlcmUgdHJ1ZSBtZWFucyBpdAotCQkgKiBpcyB2aXNpYmxlIHRvIHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICogPHA+Ci0JCSAqIFRoaXMgaXMgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBwcm9qZWN0J3MgY29udGFpbmVyIGltcGxlbWVudHMgdGhlIGRlc2lyZWQgY29udHJpYnV0b3IuCi0JCSAqIAotCQkgKiBXaWxsIGJlIGVtcHR5IGlmIG5vIHByb2plY3Qgc2VudCBpbiB0byBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBNYXAgY29udGFpbmVycyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBNYXAgb2YgdW5pcXVlIGNvbnRhaW5lciBpZCBzdHJpbmdzIGZvdW5kIGluIGNsYXNzcGF0aCAoaW5jbHVkaW5nIHJlcXVpcmVkIHByb2plY3RzKS4KLQkJICogSWYgYSBjb250YWluZXIgd2l0aCB0aGUgc2FtZSBpZCB3YXMgZm91bmQgaW4gbW9yZSB0aGFuIG9uZSBwcm9qZWN0LCBvbmx5IG9uZSBpZCB3aWxsCi0JCSAqIGJlIGluIHRoaXMgc2V0IHNpbmNlIHRoZXkgYXJlIHRoZSBzYW1lLgotCQkgKiA8cD4KLQkJICogVGhlIGtleSB3aWxsIGJlIHRoZSBjb250YWluZXIgaWRzLCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgQ29udGFpbmVyUGF0aHMKLQkJICogCi0JCSAqIFdpbGwgYmUgZW1wdHkgaWYgbm8gcHJvamVjdCBzZW50IGluIHRvIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBNYXAgY29udGFpbmVySWRzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBTZXQgb2YgdW5pcXVlIHBsdWdpbiBpZCBzdHJpbmdzIGZvdW5kIGluIGNsYXNzcGF0aCAoaW5jbHVkaW5nIHJlcXVpcmVkIHByb2plY3RzKS4KLQkJICogSWYgYSByZXF1aXJlZCBwbHVnaW4gd2l0aCB0aGUgc2FtZSBpZCB3YXMgZm91bmQgaW4gbW9yZSB0aGFuIG9uZSBwcm9qZWN0LCBvbmx5IG9uZSBpZCB3aWxsCi0JCSAqIGJlIGluIHRoaXMgc2V0IHNpbmNlIHRoZXkgYXJlIHRoZSBzYW1lLgotCQkgKiA8cD4KLQkJICogVGhlIGtleSB3aWxsIGJlIHRoZSBwbHVnaW4gaWRzLCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPiwgd2hlcmUgdHJ1ZSBtZWFucyBpdAotCQkgKiBpcyB2aXNpYmxlIHRvIHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICogCi0JCSAqIFdpbGwgYmUgZW1wdHkgaWYgbm8gcHJvamVjdCBzZW50IGluIHRvIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCQkgKi8JCQotCQlwdWJsaWMgTWFwIHBsdWdpbklkcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDs7Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIE1hcCBvZiB1bmlxdWUgcHJvamVjdHMgZm91bmQgaW4gY2xhc3NwYXRoIChpbmNsdWRpbmcgcmVxdWlyZWQgcHJvamVjdHMpLCBidXQgbm90IGluY2x1ZGluZyB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICogPHA+Ci0JCSAqIFRoZSBrZXkgd2lsbCBiZSB0aGUgPGNvZGU+SVBhdGg8L2NvZGU+IGZvciB0aGUgcHJvamVjdCwgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4sIHdoZXJlIHRydWUgbWVhbnMgaXQKLQkJICogaXMgdmlzaWJsZSB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqIAotCQkgKiBXaWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2plY3Qgc2VudCBpbiB0byBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkJICovCQkKLQkJcHVibGljIE1hcCBwcm9qZWN0UGF0aHM7Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEphdmEgcHJvamVjdCBmb3IgdGhpcyBsYXVuY2guIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3IgYSBwcm9qZWN0LgotCQkgKi8KLQkJcHVibGljIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8jZ2V0Q29udGFpbmVySWRzKCkKLQkJICovCi0JCXB1YmxpYyBNYXAgZ2V0Q29udGFpbmVySWRzKCkgewotCQkJcmV0dXJuIGNvbnRhaW5lcklkczsKLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvI2dldENvbnRhaW5lcnMoKQotCQkgKi8KLQkJcHVibGljIE1hcCBnZXRDb250YWluZXJzKCkgewotCQkJcmV0dXJuIGNvbnRhaW5lcnM7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8jZ2V0SmF2YVByb2plY3QoKQotCQkgKi8KLQkJcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCXJldHVybiBqYXZhUHJvamVjdDsKLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvI2dldFBsdWdpbklkcygpCi0JCSAqLwotCQlwdWJsaWMgTWFwIGdldFBsdWdpbklkcygpIHsKLQkJCXJldHVybiBwbHVnaW5JZHM7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyNnZXRQcm9qZWN0UGF0aHMoKQotCQkgKi8KLQkJcHVibGljIE1hcCBnZXRQcm9qZWN0UGF0aHMoKSB7Ci0JCQlyZXR1cm4gcHJvamVjdFBhdGhzOwotCQl9Ci0JCQotCX0KLQkJCi0JLyoqCi0JICogTGF1bmNoSW5mbyBmb3IgYSBsYXVuY2guIFN0b3JlZCBieSBrZXkgYW5kIHJldHJpZXZhYmxlIGJ5IHRoZSBrZXkuCi0JICogVGhpcyBpcyBvbmx5IHBhc3NlZCB0byBsYXVuY2ggZGVsZWdhdGVzLiBJdCBzaG91bGQgbm90IGJlIHBhc3NlZCBvbiB0bwotCSAqIG90aGVycywgdGhvdWdoIHRoZSBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gbWF5IGJlLgotCSAqIAotCSAqIDxwPgotCSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBQcm94eUxhdW5jaFN1cHBvcnQjZ2V0SW5mbyhTdHJpbmcpCi0JICogQHNlZSBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExhdW5jaEluZm8gewotCQkvKioKLQkJICogQ29udHJpYnV0b3JzIGZvciB0aGlzIGxhdW5jaC4gSXQgd2lsbCBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSXQgbWF5IGJlIGVtcHR5LgotCQkgKi8KLQkJcHVibGljIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBjb250cmlidXRvcnM7Ci0JCQotCQkvKioKLQkJICogVGhlIHJlZ2lzdHJ5IHJldHVybmVkIGZyb20gdGhlIGxhdW5jaC4gVGhlIGxhdW5jaCBuZWVkcyB0byBzZXQgdGhpcyBiZWZvcmUgaXQgcmV0dXJucy4KLQkJICovCi0JCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSByZXN1bHRSZWdpc3RyeTsKLQkJCi0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyNnZXRKYXZhUHJvamVjdCgpCi0JCSAqLwotCQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJcmV0dXJuIGNvbmZpZ0luZm8uZ2V0SmF2YVByb2plY3QoKTsKLQkJfQkJCi0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gZm9yIHRoaXMgbGF1bmNoLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gZ2V0Q29uZmlnSW5mbygpIHsKLQkJCXJldHVybiBjb25maWdJbmZvOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGNvbmZpZ0luZm87Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBTdGFydCBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIDxwPiAKLQkgKiBUaGlzIHdpbGwgd2FpdCBmb3IgYnVpbGQuIElmIHlvdQotCSAqIGtub3cgdGhlIGJ1aWxkIGhhcyBiZWVuIHN1c3BlbmRlZCBieSB5b3VyIHRocmVhZCwgdGhlbiB5b3UgbXVzdCB1c2UgdGhlIG90aGVyIG1ldGhvZCB0aGF0IHRha2VzIGEgd2FpdEZvclRocmVhZAotCSAqIGJvb2xlYW4sIGFuZCB5b3UgbXVzdCBwYXNzIGluIGZhbHNlLiBPdGhlcndpc2UgaXQgd2lsbCBkZWFkbG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdC4gSXQgbXVzdCBiZSBhIGphdmEgcHJvamVjdCwgYW5kIGl0IGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdm1UaXRsZSB0aXRsZSBmb3IgVk0uIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gYUNvbnRyaWJzIFRoZSBjb250cmlidXRpb25zIGFycmF5LiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHBtCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCByZWdpc3RyeS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIFByb3h5TGF1bmNoU3VwcG9ydCNzdGFydEltcGxlbWVudGF0aW9uKElQcm9qZWN0LCBTdHJpbmcsIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHN0YXJ0SW1wbGVtZW50YXRpb24oCi0JCQlJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nIHZtVGl0bGUsCi0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gYUNvbnRyaWJzLAotCQkJSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdGFydEltcGxlbWVudGF0aW9uKHByb2plY3QsIHZtVGl0bGUsIGFDb250cmlicywgdHJ1ZSwgcG0pOwotCX0KLQkKLQkvKioKLQkgKiBTdGFydCBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIDxwPiAKLQkgKiBJZiB5b3Uga25vdyB0aGUgYnVpbGQgaGFzIGJlZW4gc3VzcGVuZGVkIGJ5IHlvdXIgdGhyZWFkLCB0aGVuIHlvdSBtdXN0IHVzZSBjYWxsIHRoaXMgd2l0aCBmYWxzZSBmb3Igd2FpdEZvclRocmVhZC4gT3RoZXJ3aXNlIGl0IHdpbGwgZGVhZGxvY2suCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuIEl0IG11c3QgYmUgYSBqYXZhIHByb2plY3QsIGFuZCBpdCBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHZtVGl0bGUgdGl0bGUgZm9yIFZNLiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGFDb250cmlicyBUaGUgY29udHJpYnV0aW9ucyBhcnJheS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB3YWl0Rm9yQnVpbGQgd2FpdCBmb3IgdGhlIGJ1aWxkLiBJZiBjYWxsZXIga25vd3MgdGhhdCB0aGUgYnVpbGQgaGFzIGJlZW4gc3VzcGVuZGVkIGJ5IHRoaXMgdGhyZWFkLCB0aGVuIGl0IG11c3QgY2FsbCB0aGlzIHdpdGggZmFsc2UuIE90aGVyd2lzZSBhIGRlYWRsb2NrIHdpbGwgb2NjdXIuCi0JICogQHBhcmFtIHBtCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCByZWdpc3RyeS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHN0YXJ0SW1wbGVtZW50YXRpb24oCi0JCQlJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nIHZtVGl0bGUsCi0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gYUNvbnRyaWJzLAotCQkJYm9vbGVhbiB3YWl0Rm9yQnVpbGQsIAotCQkJSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEZpcnN0IGZpbmQgdGhlIGFwcHJvcHJpYXRlIGxhdW5jaCBjb25maWd1cmF0aW9uIHRvIHVzZSBmb3IgdGhpcyBwcm9qZWN0LgotCQkvLyBUaGUgcHJvY2VzcyBpczoKLQkJLy8JMSkgU2VlIGlmIHRoZSBwcm9qZWN0J3MgcGVyc2lzdGVudCBwcm9wZXJ0eSBoYXMgYSBzZXR0aW5nIGZvciAicHJveHlMYXVuY2hDb25maWd1cmF0aW9uIiwgaWYgaXQgZG9lcywKLQkJLy8JCWdldCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGF0IG5hbWUgYW5kIGNyZWF0ZSBhIHdvcmtpbmcgY29weSBvZiBpdC4KLQkJLy8JMikgSWYgbm90LCB0aGVuIGdldCB0aGUgIm9yZy5lY2xpcHNlLmplbS5wcm94eS5Mb2NhbFByb3h5TGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0JCS8vCQlhbmQgY3JlYXRlIGEgbmV3IGluc3RhbmNlIHdvcmtpbmcgY29weS4KLQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJMCwKLQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkJCVByb3h5TWVzc2FnZXMuTm90X0phdmFfUHJvamVjdF9XQVJOXywgCi0JCQkJCQkJCQluZXcgT2JqZWN0W10geyBwcm9qZWN0LmdldE5hbWUoKX0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCi0JCS8vIEZpcnN0IGlmIHNwZWNpZmljIHNldC4KLQkJU3RyaW5nIGxhdW5jaE5hbWUgPSBwcm9qZWN0LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShQcm94eVBsdWdpbi5QUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTik7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7CQkKLQkJaWYgKGxhdW5jaE5hbWUgIT0gbnVsbCAmJiAhTk9UX1NFVC5lcXVhbHMobGF1bmNoTmFtZSkpIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uW10gY29uZmlncyA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChjb25maWdzW2ldLmdldE5hbWUoKS5lcXVhbHMobGF1bmNoTmFtZSkpIHsKLQkJCQkJY29uZmlnID0gY29uZmlnc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNvbmZpZyA9PSBudWxsIHx8ICFjb25maWcuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgIiIpLmVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXByb2plY3Quc2V0UGVyc2lzdGVudFByb3BlcnR5KFByb3h5UGx1Z2luLlBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OLCAoU3RyaW5nKSBudWxsKTsJLy8gQ29uZmlnIG5vdCBmb3VuZCwgb3IgZm9yIGEgZGlmZmVyZW50IHByb2plY3QsIHNvIG5vIGxvbmdlciB0aGUgZGVmYXVsdC4KLQkJCQljb25maWcgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnd2MgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElQcm94eUNvbnN0YW50cy5MT0NBTF9MQVVOQ0hfVFlQRSkubmV3SW5zdGFuY2UobnVsbCwgRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5nZW5lcmF0ZVVuaXF1ZUxhdW5jaENvbmZpZ3VyYXRpb25OYW1lRnJvbSgiTG9jYWxQcm94eV8iK3Byb2plY3QuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbmZpZ3djLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsgCi0JCQljb25maWcgPSBjb25maWd3YzsKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXJ0SW1wbGVtZW50YXRpb24oY29uZmlnLCB2bVRpdGxlLCBhQ29udHJpYnMsIHdhaXRGb3JCdWlsZCwgcG0pOwotCX0KLQkKLQkvKioKLQkgKiBMYXVuY2ggYSByZWdpc3RyeSB1c2luZyB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4KLQkgKiA8cD4gCi0JICogVGhpcyB3aWxsIHdhaXQgZm9yIGJ1aWxkLiBJZiB5b3UKLQkgKiBrbm93IHRoZSBidWlsZCBoYXMgYmVlbiBzdXNwZW5kZWQgYnkgeW91ciB0aHJlYWQsIHRoZW4geW91IG11c3QgdXNlIHRoZSBvdGhlciBtZXRob2QgdGhhdCB0YWtlcyBhIHdhaXRGb3JUaHJlYWQKLQkgKiBib29sZWFuLCBhbmQgeW91IG11c3QgcGFzcyBpbiBmYWxzZS4gT3RoZXJ3aXNlIGl0IHdpbGwgZGVhZGxvY2suCi0JICoKLQkgKiBAcGFyYW0gY29uZmlnIAotCSAqIEBwYXJhbSB2bVRpdGxlIHRpdGxlIGZvciBWTS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBhQ29udHJpYnMgVGhlIGNvbnRyaWJ1dGlvbnMgYXJyYXkuIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcG0KLQkgKiBAcmV0dXJuIFRoZSByZWdpc3RyeSBmcm9tIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIFByb3h5TGF1bmNoU3VwcG9ydCNzdGFydEltcGxlbWVudGF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uLCBTdHJpbmcsIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHN0YXJ0SW1wbGVtZW50YXRpb24oCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlTdHJpbmcgdm1UaXRsZSwKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBhQ29udHJpYnMsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhcnRJbXBsZW1lbnRhdGlvbihjb25maWcsIHZtVGl0bGUsIGFDb250cmlicywgdHJ1ZSwgcG0pOwotCX0KLQotCS8qKgotCSAqIExhdW5jaCBhIHJlZ2lzdHJ5IHVzaW5nIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgotCSAqIDxwPiAKLQkgKiBJZiB5b3Uga25vdyB0aGUgYnVpbGQgaGFzIGJlZW4gc3VzcGVuZGVkIGJ5IHlvdXIgdGhyZWFkLCB0aGVuIHlvdSBtdXN0IHVzZSB5b3UgbXVzdCBwYXNzIGluIGZhbHNlIGZvciB3YWl0Rm9yVGhyZWFkLiBPdGhlcndpc2UgaXQgd2lsbCBkZWFkbG9jay4KLQkgKgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdm1UaXRsZSB0aXRsZSBmb3IgVk0uIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gYUNvbnRyaWJzIFRoZSBjb250cmlidXRpb25zIGFycmF5LiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHdhaXRGb3JCdWlsZCB3YWl0IGZvciB0aGUgYnVpbGQuIElmIGNhbGxlciBrbm93cyB0aGF0IHRoZSBidWlsZCBoYXMgYmVlbiBzdXNwZW5kZWQgYnkgdGhpcyB0aHJlYWQsIHRoZW4gaXQgbXVzdCBjYWxsIHRoaXMgd2l0aCBmYWxzZS4gT3RoZXJ3aXNlIGEgZGVhZGxvY2sgd2lsbCBvY2N1ci4KLQkgKiBAcGFyYW0gcG0KLQkgKiBAcmV0dXJuIFRoZSByZWdpc3RyeSBmcm9tIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHN0YXJ0SW1wbGVtZW50YXRpb24oCi0JCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJCVN0cmluZyB2bVRpdGxlLAotCQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBhQ29udHJpYnMsCi0JCQkJYm9vbGVhbiB3YWl0Rm9yQnVpbGQsCi0JCQkJSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHBtID09IG51bGwpCi0JCQlwbSA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCVN0cmluZyBzdGVwSWQgPSAiUHJlLWxhdW5jaCBWTSAoICIgKyB2bVRpdGxlICsgIiApIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0U3RlcChzdGVwSWQpOwotCQlpZiAodm1UaXRsZS5lcXVhbHMoIkJlYW5pbmZvIikpIC8vJE5PTi1OTFMtMSQKLQkJCVBlcmZvcm1hbmNlTW9uaXRvclV0aWwuZ2V0TW9uaXRvcigpLnNuYXBzaG90KDEyNSk7Ci0JCWZpbmFsIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnd2MgPSBjb25maWcuZ2V0V29ya2luZ0NvcHkoKTsKLQkJCi0JCXBtLmJlZ2luVGFzaygiIiwgNDAwKTsgLy8kTk9OLU5MUy0xJAotCQlwbS5zdWJUYXNrKFByb3h5TWVzc2FnZXMuUHJveHlMYXVuY2gpOwkKLQkJaWYgKHdhaXRGb3JCdWlsZCkgewotCQkJLy8gU2VlIGlmIGJ1aWxkIG5lZWRlZCBvciB3YWl0aW5nIG9yIGlucHJvZ3Jlc3MsIGlmIHNvLCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4gV2UndmUKLQkJCS8vIGRlY2lkZWQgdG9vIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgaWYgYnVpbGQgd291bGQgYWZmZWN0IHVzIG9yIG5vdCwgc28ganVzdCB3YWl0LgkJCi0JCQlpZiAoVUlfUlVOTkVSICE9IG51bGwpCi0JCQkJVUlfUlVOTkVSLmhhbmRsZUJ1aWxkKG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEwMCkpOwotCQkJZWxzZQotCQkJCXJ1bkJ1aWxkKG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEwMCkpOwotCQkJCi0JCQlpZiAocG0uaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQkJCi0JCWlmIChhQ29udHJpYnMgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIG5ld0NvbnRyaWJzID0gbmV3IElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbYUNvbnRyaWJzLmxlbmd0aCsxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYUNvbnRyaWJzLCAwLCBuZXdDb250cmlicywgMSwgYUNvbnRyaWJzLmxlbmd0aCk7Ci0JCQluZXdDb250cmlic1swXSA9IG5ldyBQcm94eUNvbnRyaWJ1dG9yKCk7Ci0JCQlhQ29udHJpYnMgPSBuZXdDb250cmliczsKLQkJfSBlbHNlCi0JCQlhQ29udHJpYnMgPSBuZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIHtuZXcgUHJveHlDb250cmlidXRvcigpfTsKLQotCQlTdHJpbmcgbGF1bmNoS2V5ID0gU3RyaW5nLnZhbHVlT2YoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlMYXVuY2hJbmZvIGxhdW5jaEluZm8gPSBuZXcgTGF1bmNoSW5mbygpOwotCQlzeW5jaHJvbml6ZWQgKFByb3h5TGF1bmNoU3VwcG9ydC5jbGFzcykgewotCQkJd2hpbGUgKExBVU5DSF9JTkZPLmNvbnRhaW5zS2V5KGxhdW5jaEtleSkpIHsKLQkJCQlsYXVuY2hLZXkgKz0gJ2EnOyAvLyBKdXN0IGFkZCBzb21ldGhpbmcgb24gdG8gbWFrZSBpdCB1bmlxdWUuCi0JCQl9Ci0JCQlMQVVOQ0hfSU5GTy5wdXQobGF1bmNoS2V5LCBsYXVuY2hJbmZvKTsKLQkJfQotCQkKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gY29uZmlnd2MuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgKFN0cmluZykgbnVsbCk7Ci0JCWFDb250cmlicyA9IGZpbGxJbkxhdW5jaEluZm8oYUNvbnRyaWJzLCBsYXVuY2hJbmZvLCBwcm9qZWN0TmFtZSk7Ci0JCQotCQl0cnkgewkJCi0JCQljb25maWd3Yy5zZXRBdHRyaWJ1dGUoSVByb3h5Q29uc3RhbnRzLkFUVFJJQlVURV9MQVVOQ0hfS0VZLCBsYXVuY2hLZXkpOwotCQkJaWYgKHZtVGl0bGUgIT0gbnVsbCAmJiB2bVRpdGxlLmxlbmd0aCgpPjApCi0JCQkJY29uZmlnd2Muc2V0QXR0cmlidXRlKElQcm94eUNvbnN0YW50cy5BVFRSSUJVVEVfVk1fVElUTEUsIHZtVGl0bGUpOwotCQkJCi0JCQlpZiAoQVRUUl9QUklWQVRFICE9IG51bGwpCi0JCQkJY29uZmlnd2Muc2V0QXR0cmlidXRlKEFUVFJfUFJJVkFURSwgdHJ1ZSk7CQkJCi0JCQkKLQkJCS8vIExldCBjb250cmlidXRvcnMgbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uLgotCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGNvbnRyaWJzID0gYUNvbnRyaWJzOwotCQkJZmluYWwgTGF1bmNoSW5mbyBsaW5mbyA9IGxhdW5jaEluZm87Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gRmlyc3QgcnVuIHRoZSBpbml0aWFsaXplLgotCQkJCS8vIFJ1biBpbiBzYWZlIG1vZGUgc28gdGhhdCBhbnl0aGluZyBoYXBwZW5zIHdlIGRvbid0IGdvIGF3YXkuCi0JCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiBQbGF0Zm9ybS5ydW4gbG9ncyBpdCBmb3IgbWUuCi0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCWNvbnRyaWJzW2lpXS5pbml0aWFsaXplKGxpbmZvLmdldENvbmZpZ0luZm8oKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCS8vIE5vdyBydW4gdGhlIGNvbnRyaWJ1dGUgdG8gY29uZmlndXJhdGlvbi4KLQkJCQkvLyBSdW4gaW4gc2FmZSBtb2RlIHNvIHRoYXQgYW55dGhpbmcgaGFwcGVucyB3ZSBkb24ndCBnbyBhd2F5LgotCQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuIFBsYXRmb3JtLnJ1biBsb2dzIGl0IGZvciBtZS4KLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJY29udHJpYnNbaWldLmNvbnRyaWJ1dGVUb0NvbmZpZ3VyYXRpb24oY29uZmlnd2MpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlwbS53b3JrZWQoMTAwKTsKLQkJCQotCQkJY29uZmlnd2MubGF1bmNoKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxMDApKTsKLQkJCQotCQkJZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnID0gbGF1bmNoSW5mby5yZXN1bHRSZWdpc3RyeTsKLQkJCWlmICghcG0uaXNDYW5jZWxlZCgpICYmIHJlZyA9PSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5Qcm94eUxhdW5jaFN1cHBvcnRfUmVnaXN0cnlDb3VsZE5vdFN0YXJ0Rm9yU29tZVJlYXNvbl9XQVJOXywgbnVsbCkpOyAKLQkJCWlmIChwbS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlpZiAocmVnICE9IG51bGwpCi0JCQkJCXJlZy50ZXJtaW5hdGVSZWdpc3RyeSgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlwZXJmb3JtRXh0ZW5zaW9uUmVnaXN0cmF0aW9ucygoQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSByZWcsIGxhdW5jaEluZm8pOwotCQkJCi0vLwkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0U3RlcCgiY29udHJpYnV0ZSB0byByZWdpc3RyeSIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlicy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIGludCBpaSA9IGk7Ci0JCQkJLy8gUnVuIGluIHNhZmUgbW9kZSBzbyB0aGF0IGFueXRoaW5nIGhhcHBlbnMgd2UgZG9uJ3QgZ28gYXdheS4KLQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiBQbGF0Zm9ybS5ydW4gbG9ncyBpdCBmb3IgbWUuCi0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQkJCQkJU3RyaW5nIHN0ZXBpZCA9ICJjb250cmlidXRlIHRvIHJlZ2lzdHJ5IGZvciAiICsgY29udHJpYnNbaWldLmdldENsYXNzKCk7Ci0vLwkJCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0U3RlcChzdGVwaWQpOwotCQkJCQkJY29udHJpYnNbaWldLmNvbnRyaWJ1dGVUb1JlZ2lzdHJ5KHJlZyk7Ci0vLwkJCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BTdGVwKHN0ZXBpZCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLS8vCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcFN0ZXAoImNvbnRyaWJ1dGUgdG8gcmVnaXN0cnkiKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIENsZWFuIHVwIGFuZCByZXR1cm4uCi0JCQlMQVVOQ0hfSU5GTy5yZW1vdmUobGF1bmNoS2V5KTsKLQkJfQkKLQkJCi0JCXBtLmRvbmUoKTsKLQkJaWYgKHZtVGl0bGUuZXF1YWxzKCJCZWFuaW5mbyIpKSAvLyROT04tTkxTLTEkCi0JCQlQZXJmb3JtYW5jZU1vbml0b3JVdGlsLmdldE1vbml0b3IoKS5zbmFwc2hvdCgxMjYpOwotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wU3RlcChzdGVwSWQpOwotCQlyZXR1cm4gbGF1bmNoSW5mby5yZXN1bHRSZWdpc3RyeTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZGVmYXVsdCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gZm9yIHRoZSBnaXZlbiBwcm9qZWN0LiBUaGlzIGlzIHVzZWZ1bCBpbmZvIGV2ZW4gd2hlbiBub3QgbGF1bmNoaW5nIGEKLQkgKiB2bS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiBAcmV0dXJuIG5ldyBjb250cmliIGluZm8uCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8oSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJTGF1bmNoU3VwcG9ydElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBjb25maWdJbmZvID0gbmV3IExhdW5jaFN1cHBvcnRJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8oamF2YVByb2plY3QsCi0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SURzRm91bmQoamF2YVByb2plY3QpKTsKLQkJcmV0dXJuIGNvbmZpZ0luZm87Ci0KLQl9Ci0JCi0JLyoqCi0JICogVXNlIGluIGNhbGxpbmcge0BsaW5rIFByb3h5TGF1bmNoU3VwcG9ydCNmaWxsSW5MYXVuY2hJbmZvKElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSwgTGF1bmNoSW5mbywgU3RyaW5nKX0gZm9yIHRoZSBjb25maWd1cmF0aW9uCi0JICogY29udHJpYnV0b3JzIGFycmF5IGlmIHRoZXJlIGFyZSBubyBpbmNvbWluZyBjb250cmlidXRvcnMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gRU1QVFlfQ09ORklHX0NPTlRSSUJVVE9SUyA9IG5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yWzBdOwotCS8qKgotCSAqIEZpbGwgaW4gdGhlIGxhdW5jaCBpbmZvIGNvbmZpZyBpbmZvIGFuZCBjb250cmlicy4gVGhlIGNvbnRyaWJzIHNlbnQgaW4gbWF5IGJlIGV4cGFuZGVkIGR1ZSB0byBleHRlbnNpb24KLQkgKiBwb2ludHMgYW5kIGEgbmV3IG9uZSBjcmVhdGVkLiBFaXRoZXIgdGhlIGV4cGFuZGVkIGNvcHkgb3IgdGhlIG9yaWdpbmFsIChpZiBubyBjaGFuZ2UpIHdpbGwgYmUgc3RvcmVkIGluCi0JICogdGhlIGxhdW5jaGluZm8gYW5kIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBhQ29udHJpYnMgdGhpcyBzaG91bGQgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFBhc3MgaW4ge0BsaW5rIFByb3h5TGF1bmNoU3VwcG9ydCNFTVBUWV9DT05GSUdfQ09OVFJJQlVUT1JTfSBpbiB0aGF0IGNhc2UuCi0JICogQHBhcmFtIGxhdW5jaEluZm8KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcmV0dXJuIGEgbW9kaWZpZWQgYUNvbnRyaWJzIGlmIGFueSBjaGFuZ2Ugd2FzIG1hZGUgdG8gaXQuICBUaGlzIHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uIEl0IHdpbGwgcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgYUNvbnRyaWJzIHdhcyBudWxsIGFuZCBubyBjaGFuZ2VzIHdlcmUgbWFkZS4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGZpbGxJbkxhdW5jaEluZm8oSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGFDb250cmlicywgTGF1bmNoSW5mbyBsYXVuY2hJbmZvLCBTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCkgewotCQkJcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZS50cmltKCk7Ci0JCQlpZiAocHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsICYmIGphdmFQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCWxhdW5jaEluZm8uY29uZmlnSW5mbyA9IGNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyhqYXZhUHJvamVjdCk7Ci0JCQkJCWlmICghbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcklkcygpLmlzRW1wdHkoKSB8fCAhbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcnMoKS5pc0VtcHR5KCkgfHwgIWxhdW5jaEluZm8uY29uZmlnSW5mby5nZXRQbHVnaW5JZHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJCUxpc3QgY29tcHV0ZWRDb250cmlidXRvcnMgPSBuZXcgQXJyYXlMaXN0KGxhdW5jaEluZm8uY29uZmlnSW5mby5nZXRDb250YWluZXJJZHMoKS5zaXplKCkrbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcnMoKS5zaXplKCkrbGF1bmNoSW5mby5jb25maWdJbmZvLmdldFBsdWdpbklkcygpLnNpemUoKSk7Ci0JCQkJCQkvLyBOb3RlOiBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSB2aXNpYmlsaXR5IGJ1c2luZXNzIGhlcmUuIEZvciBjb250cmlidXRvcnMgdG8gcHJveHkgaXQgbWVhbnMKLQkJCQkJCS8vIHNvbWUgY2xhc3NlcyBpbiB0aGUgcHJvamVjdHMvcGx1Z2lucy9ldGMuIG5lZWQgY29uZmlndXJhdGlvbiB3aGV0aGVyIHRoZXkgYXJlIHZpc2libGUgb3Igbm90LgotCQkJCQkJLy8gVGhpcyBpcyBiZWNhdXNlIGV2ZW4gdGhvdWdoIG5vdCB2aXNpYmxlLCBzb21lIG90aGVyIHZpc2libGUgY2xhc3MgbWF5IGluc3RhbnRpYXRlIGl0LiBTbyBpdAotCQkJCQkJLy8gbmVlZHMgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkJCQkvLyBGaXJzdCBoYW5kbGUgZXhwbGljaXQgY2xhc3NwYXRoIGNvbnRhaW5lcnMgdGhhdCBpbXBsZW1lbnQgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ2xhc3NwYXRoQ29udGFpbmVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkJY29tcHV0ZWRDb250cmlidXRvcnMuYWRkKGNvbnRhaW5lcik7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIFNlY29uZCBhZGQgaW4gY29udHJpYnV0b3JzIHRoYXQgZXhpc3QgZm9yIGEgY29udGFpbmVyIGlkLgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcklkcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUNvbnRhaW5lclBhdGhzIHBhdGhzID0gKENvbnRhaW5lclBhdGhzKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb250cmlidXRvcnMgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRDb250YWluZXJDb25maWd1cmF0aW9ucyhwYXRocy5nZXRDb250YWluZXJJZCgpLCBwYXRocy5nZXRBbGxQYXRocygpKTsKLQkJCQkJCQlpZiAoY29udHJpYnV0b3JzICE9IG51bGwpCi0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlPYmplY3QgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQcm94eVBsdWdpbi5QSV9DTEFTUyk7Ci0JCQkJCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKQotCQkJCQkJCQkJCWNvbXB1dGVkQ29udHJpYnV0b3JzLmFkZChjb250cmlidXRvcik7Ci0JCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gRmluYWxseSBhZGQgaW4gY29udHJpYnV0b3JzIHRoYXQgZXhpc3QgZm9yIGEgcGx1Z2luIGlkLgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGF1bmNoSW5mby5jb25maWdJbmZvLmdldFBsdWdpbklkcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCVN0cmluZyBwbHVnaW5JZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbnRyaWJ1dG9ycyA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpbkNvbmZpZ3VyYXRpb25zKHBsdWdpbklkKTsKLQkJCQkJCQlpZiAoY29udHJpYnV0b3JzICE9IG51bGwpCi0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlPYmplY3QgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQcm94eVBsdWdpbi5QSV9DTEFTUyk7Ci0JCQkJCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKQotCQkJCQkJCQkJCWNvbXB1dGVkQ29udHJpYnV0b3JzLmFkZChjb250cmlidXRvcik7Ci0JCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gTm93IHR1cm4gaW50byBhcnJheQotCQkJCQkJaWYgKCFjb21wdXRlZENvbnRyaWJ1dG9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gbmV3Q29udHJpYnMgPSBuZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvclthQ29udHJpYnMubGVuZ3RoCi0JCQkJCQkJCQkrIGNvbXB1dGVkQ29udHJpYnV0b3JzLnNpemUoKV07Ci0JCQkJCQkJU3lzdGVtLmFycmF5Y29weShhQ29udHJpYnMsIDAsIG5ld0NvbnRyaWJzLCAwLCBhQ29udHJpYnMubGVuZ3RoKTsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gY0NvbnRyaWJzID0gKElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSkgY29tcHV0ZWRDb250cmlidXRvcnMKLQkJCQkJCQkJCS50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW2NvbXB1dGVkQ29udHJpYnV0b3JzLnNpemUoKV0pOwotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoY0NvbnRyaWJzLCAwLCBuZXdDb250cmlicywgYUNvbnRyaWJzLmxlbmd0aCwgY0NvbnRyaWJzLmxlbmd0aCk7Ci0JCQkJCQkJYUNvbnRyaWJzID0gbmV3Q29udHJpYnM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWxhdW5jaEluZm8uY29udHJpYnV0b3JzID0gYUNvbnRyaWJzOwotCQlyZXR1cm4gYUNvbnRyaWJzOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBleHRlbnNpb24gcmVnaXN0cmF0aW9ucyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhpcyB0eXBlIG9mIHJlZ2lzdHJ5IGFuZCB0aGUgbGF1bmNoaW5mbyBwYXRocy4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG1lYW50IHRvIGJlIGNhbGxlZCBvbmx5IGJ5IHJlZ2lzdHJ5IGltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdCBsYXVuY2ggdGhyb3VnaCBhIGxhdW5jaCBjb25maWdyYXRpb24gYWZ0ZXIgdGhlIHJlZ2lzdHJ5IGlzIGNyZWF0ZWQgYnV0Ci0JICogYmVmb3JlIHRoZSB7QGxpbmsgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciNjb250cmlidXRlVG9SZWdpc3RyeShQcm94eUZhY3RvcnlSZWdpc3RyeSl9IGlzIGNhbGxlZC4gVGhpcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5Ci0JICogYnkgcmVnaXN0cmllcyB0aGF0IHVzZWQgYSBsYXVuY2ggY29uZmlndXJhdGlvbiB0byBsYXVuY2guCi0JICogCi0JICogQHBhcmFtIGJhc2VSZWdpc3RyeQotCSAqIEBwYXJhbSBsYXVuY2hJbmZvCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwZXJmb3JtRXh0ZW5zaW9uUmVnaXN0cmF0aW9ucyhmaW5hbCBCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkgYmFzZVJlZ2lzdHJ5LCBMYXVuY2hJbmZvIGxhdW5jaEluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGNvbmZpZ0luZm8gPSBsYXVuY2hJbmZvLmNvbmZpZ0luZm87Ci0JCWlmIChjb25maWdJbmZvICE9IG51bGwgJiYgKCFjb25maWdJbmZvLmdldENvbnRhaW5lcklkcygpLmlzRW1wdHkoKSB8fCAhY29uZmlnSW5mby5nZXRQbHVnaW5JZHMoKS5pc0VtcHR5KCkpKSB7Ci0JCQlTdHJpbmcgcmVnaXN0cnlJRCA9IGJhc2VSZWdpc3RyeS5nZXRSZWdpc3RyeVR5cGVJRCgpOwotCQkJLy8gTm90ZTogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgdmlzaWJpbGl0eSBidXNpbmVzcyBoZXJlLiBGb3IgY29udHJpYnV0b3JzIHRvIHByb3h5IGl0IG1lYW5zCi0JCQkvLyBzb21lIGNsYXNzZXMgaW4gdGhlIHByb2plY3RzL3BsdWdpbnMvZXRjLiBuZWVkIGNvbmZpZ3VyYXRpb24gd2hldGhlciB0aGV5IGFyZSB2aXNpYmxlIG9yIG5vdC4KLQkJCS8vIFRoaXMgaXMgYmVjYXVzZSBldmVuIHRob3VnaCBub3QgdmlzaWJsZSwgc29tZSBvdGhlciB2aXNpYmxlIGNsYXNzIG1heSBpbnN0YW50aWF0ZSBpdC4gU28gaXQKLQkJCS8vIG5lZWRzIHRoZSBjb25maWd1cmF0aW9uLgotCQkJCi0JCQkvLyBGaXJzdCBjYWxsIHJlZ2lzdHJhdGlvbnMgdGhhdCBleGlzdCBmb3IgYSBjb250YWluZXIgaWQuCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdJbmZvLmdldENvbnRhaW5lcklkcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUNvbnRhaW5lclBhdGhzIHBhdGhzID0gKENvbnRhaW5lclBhdGhzKSBpdGVyLm5leHQoKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb250cmlidXRvcnMgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRDb250YWluZXJFeHRlbnNpb25zKHBhdGhzLmdldENvbnRhaW5lcklkKCksIHBhdGhzLmdldEFsbFBhdGhzKCkpOwotCQkJCWlmIChjb250cmlidXRvcnMgIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChyZWdpc3RyeUlELmVxdWFscyhjb250cmlidXRvcnNbaV0uZ2V0QXR0cmlidXRlQXNJcyhQcm94eVBsdWdpbi5QSV9SRUdJU1RSWV9UWVBFKSkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cmF0aW9uIGNvbnRyaWJ1dG9yID0gKElFeHRlbnNpb25SZWdpc3RyYXRpb24pIGNvbnRyaWJ1dG9yc1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFByb3h5UGx1Z2luLlBJX0NMQVNTKTsKLQkJCQkJCQkJUGxhdGZvcm0ucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkJCQkKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJCQkJCWNvbnRyaWJ1dG9yLnJlZ2lzdGVyKGJhc2VSZWdpc3RyeSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCQkJCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLCBQbGF0Zm9ybSBsb2dzIGl0IGZvciBtZS4KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCX0pOwotCQkJCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIElmIG5vdCByaWdodCBjbGFzcywganVzdCBpZ25vcmUgaXQuCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIEZpbmFsbHkgYWRkIGluIGNvbnRyaWJ1dG9ycyB0aGF0IGV4aXN0IGZvciBhIHBsdWdpbiBpZC4KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ0luZm8uZ2V0UGx1Z2luSWRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29udHJpYnV0b3JzID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luRXh0ZW5zaW9ucyhwbHVnaW5JZCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9ycyAhPSBudWxsKQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKHJlZ2lzdHJ5SUQuZXF1YWxzKGNvbnRyaWJ1dG9yc1tpXS5nZXRBdHRyaWJ1dGVBc0lzKFByb3h5UGx1Z2luLlBJX1JFR0lTVFJZX1RZUEUpKSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWZpbmFsIElFeHRlbnNpb25SZWdpc3RyYXRpb24gY29udHJpYnV0b3IgPSAoSUV4dGVuc2lvblJlZ2lzdHJhdGlvbikgY29udHJpYnV0b3JzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUHJveHlQbHVnaW4uUElfQ0xBU1MpOwotCQkJCQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQkJCQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQkJY29udHJpYnV0b3IucmVnaXN0ZXIoYmFzZVJlZ2lzdHJ5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcsIFBsYXRmb3JtIGxvZ3MgaXQgZm9yIG1lLgotCQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gSWYgbm90IHJpZ2h0IGNsYXNzLCBqdXN0IGlnbm9yZSBpdC4KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCX0KLQl9Ci19Ci0KLQotCS8qCi0JICogUnVuIHRoZSBidWlsZC4gSWYgdGhlIG9yaWdpbmFsIGxhdW5jaCB3YXMgaW4gdGhlIFVJIHRocmVhZCwgdGhpcyB3aWxsCi0JICogYmUgY2FsbGVkIHVuZGVyIGNvbnRyb2wgb2YgYW4gSVByb2dyZXNzU2VydmljZSBzbyB0aGF0IGl0IGlzIGluIGEgc2VwYXJhdGUKLQkgKiB0aHJlYWQgYW5kIHRoZSBVSSB3aWxsIHJlbWFpbiByZXNwb25zaXZlIChpbiB0aGF0IGVpdGhlciBhIGJ1c3kgY3Vyc29yIGNvbWVzCi0JICogdXAgb3IgZXZlbnR1YWxseSBhIHByb2dyZXNzIGRpYWxvZykuCi0JICogSWYgdGhlIHBtIGlzIGNhbmNlbGVkLCB0aGlzIHdpbGwganVzdCByZXR1cm4sIGJ1dCB0aGUgY2FsbGVyIG11c3QgY2hlY2sgaWYgdGhlIHBtIGlzIGNhbmNlbGVkLgotCSAqIAotCSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gc28gdGhhdCBvbmx5IHRoZSBVSSBoYW5kbGVyIHdpbGwgYWNjZXNzIGl0LgotCSAqLwotCXN0YXRpYyB2b2lkIHJ1bkJ1aWxkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBhdXRvYnVpbGRpbmcgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKTsKLQkJaWYgKCFhdXRvYnVpbGRpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gV2UgYXJlIG5vdCBhdXRvYnVpbGRpbmcuIFNvIGtpY2sgb2ZmIGEgYnVpbGQgcmlnaHQgaGVyZSBhbmQKLQkJCQkvLyB3YWl0IGZvciBpdC4gKElmIHdlIGFscmVhZHkgd2l0aGluIGEgYnVpbGQgb24gdGhpcyB0aHJlYWQsIHRoZW4gdGhpcwotCQkJCS8vIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgYnVpbGRpbmcuIFdlIHdpbGwgdGFrZSB0aGF0IHJpc2suIElmCi0JCQkJLy8gc29tZSBvdGhlciB0aHJlYWQgaXMgYnVpbGRpbmcsIHdlIHdpbGwgd2FpdCBmb3IgaXQgZmluaXNoIGJlZm9yZSB3ZQotCQkJCS8vIGNhbiBnZXQgaXQgYW5kIGRvIG91ciBidWlsZC4KLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgcG0pOyAKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGUgcG0gaXMgYWxyZWFkeSBtYXJrZWQgY2FuY2VsZWQsIHNvIGNhbGxlciBjYW4gY2hlY2sgdGhhdCBpbnN0ZWFkLgotCQkJfSAKLQkJfSBlbHNlIHsKLQkJCXBtLmJlZ2luVGFzaygiIiwgMjAwKTsgLy8kTk9OLU5MUy0xJAotCQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlciA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKTsKLQkJCUpvYiBjdXJyZW50Sm9iID0gam9iTWFuYWdlci5jdXJyZW50Sm9iKCk7Ci0JCQlpZiAoY3VycmVudEpvYiA9PSBudWxsIHx8ICghY3VycmVudEpvYi5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxEKSAmJiAhY3VycmVudEpvYi5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpKSkgeyAKLQkJCQlpZiAoam9iTWFuYWdlci5maW5kKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkubGVuZ3RoID4gMCB8fCBqb2JNYW5hZ2VyLmZpbmQoUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpLmxlbmd0aCA+MCkgewotCQkJCQkvLyBXZSBhcmUgbm90IHdpdGhpbiBhIGJ1aWxkIGpvYi4gSWYgd2Ugd2VyZSwgdGhlbiB3ZSBkb24ndCBkbyB0aGUgYnVpbGQuIFdlIHdpbGwgdGFrZQotCQkJCQkvLyB0aGF0IHJpc2suIFRoZSBwcm9ibGVtIGlzIHRoYXQgaWYgd2l0aGluIHRoZSBidWlsZCwgd2UgY2FuJ3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoIGJlY2F1c2UKLQkJCQkJLy8gd2Ugd291bGQgc3RvcCB0aGUgdGhyZWFkIGFuZCBzbyB0aGUgYnVpbGQgd291bGQgbm90IGNvbXBsZXRlLgotCQkJCQlwbS5zdWJUYXNrKFByb3h5TWVzc2FnZXMuUHJveHlXYWl0Rm9yQnVpbGQpOyAKLQkJCQkJdHJ5IHsKLQkJCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJam9iTWFuYWdlci5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMTAwKSk7Ci0JCQkJCQkJCWpvYk1hbmFnZXIuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMTAwKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoKLQkgKiBUaGlzIHByZXZlbnRzIHRoZSBsYXVuY2ggZnJvbSBiZWluZyBzaG93bi4gSG93ZXZlciB0aGVzZSBjb25zdGFudHMgYXJlIGluIFVJIGNvbXBvbmVudCwgYW5kIHdlIGRvbid0Ci0JICogd2FudCB0byBwcmUtcmVxIHRoYXQuIFNvIHdlIHdpbGwgZ2V0IHRoZW0gcmVmbGVjdGl2ZWx5IGluc3RlYWQuCi0JICogcHVibGljIGJ1dCBvbmx5IHNvIHRoYXQgbGF1bmNoIGRlbGVnYXRlIGNhbiBnZXQgdG8gaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUl9QUklWQVRFOwotCXByaXZhdGUgc3RhdGljIElVSVJ1bm5lciBVSV9SVU5ORVIgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJQVRUUl9QUklWQVRFID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIFNlZSBpZiB3ZSBoYXZlIGEgVUkgYnVuZGxlIGFuZCBpdCBpcyBhY3RpdmUuIElmIGl0IGV4aXN0cyBidXQgaXMgbm90IGFjdGl2ZSwKLQkJCS8vIHRoZW4gd2Ugd29uJ3QgZG8gYW55dGhpbmcuIElmIHdlIHdlcmUgcnVubmluZyBhIFVJIGFwcGxpY2F0aW9uLCBpdCBzaG91bGQgYWxyZWFkeQotCQkJLy8gb2YgYmVlbiBhY3RpdmUgYmVmb3JlIHdlIGdvdCBoZXJlLgotCQkJQnVuZGxlIHVpQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51aSIpOwkvLyROT04tTkxTLTEkCi0JCQlpZiAodWlCdW5kbGUgIT0gbnVsbCAmJiB1aUJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBXZSBoYXZlIGEgVUkgYnVuZGxlLCBzbyB3ZSBjYW4gbG9hZCBvdXIgVUlSdW5uZXIgY2xhc3MgYW5kIGl0IHdpbGwgbG9hZCBmaW5lLgotCQkJCQlVSV9SVU5ORVIgPSAoSVVJUnVubmVyKSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5VSVJ1bm5lciIpLm5ld0luc3RhbmNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlMSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIFNvIHRoYXQgd2UgY2FuIHJ1biBoZWFkbGVzcyAody9vIHVpKSwgbmVlZCB0byBkbyBjbGFzcyBmb3JOYW1lIGZvciBkZWJ1Z3VpIGNvbnRhbnRzCi0JCQkJQnVuZGxlIGRlYnVndWlCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmRlYnVnLnVpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZGVidWd1aUJ1bmRsZSAhPSBudWxsICYmIGRlYnVndWlCdW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQkJCUNsYXNzIGRlYnVnVUlDb25zdGFudHMgPSBkZWJ1Z3VpQnVuZGxlLmxvYWRDbGFzcygib3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlBVFRSX1BSSVZBVEUgPSAoU3RyaW5nKSBkZWJ1Z1VJQ29uc3RhbnRzLmdldEZpZWxkKCJBVFRSX1BSSVZBVEUiKS5nZXQobnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9CQkJCi0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE9ubHkgcmVmZXJlbmNlZCBieSBsYXVuY2ggZGVsZWdhdGVzLiBwdWJsaWMgYmVjYXVzZSB0aGV5IGFyZSBpbiBvdGhlciBwYWNrYWdlcywKLQkgKiBvciBldmVuIGV4dGVybmFsIGRldmVsb3BlcnMgcGFja2FnZXMuIE5vdCBtZWFudCB0byBiZSBnZW5lcmFsbHkgYXZhaWxhYmxlLgotCSAqIAotCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgY2FuJ3QgcGFzcyB0aGUgZ2VuZXJpYyBpbmZvIGludG8gYSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIGJlY2F1c2UgYSBsYXVuY2ggY29uZmlndXJhdGlvbiBjYW4ndCB0YWtlIG9iamVjdHMuIE9ubHkgY2FuIHRha2Ugc3RyaW5ncyBhbmQgbnVtYmVycy4gIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExhdW5jaEluZm8gZ2V0SW5mbyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoTGF1bmNoSW5mbykgTEFVTkNIX0lORk8uZ2V0KGtleSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHN0cmluZyBwYXRoIGludG8gYSB2YWxpZCB1cmwuCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSB1cmwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGNvbnZlcnRhYmxlIChpLmUuIG5vdCB3ZWxsLWZvcm1lZCkuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgY29udmVydFN0cmluZ1BhdGhUb1VSTChTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJcmV0dXJuIHBhdGggIT0gbnVsbCA/IG5ldyBGaWxlKHBhdGgpLnRvVVJMKCkgOiBudWxsOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzdHJpbmcgcGF0aHMgaW50byBhIHZhbGlkIHVybHMuCi0JICogCi0JICogQHBhcmFtIHBhdGhzCi0JICogQHJldHVybiB0aGUgdXJscyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwYXRocyBpcyBudWxsLiBBbnkgcGF0aCBub3QgY29udmVydGFibGUgKGkuZS4gbm90IHdlbGwtZm9ybWVkKSB3aWxsIG5vdCBiZSBpbiB0aGUgZmluYWwgbGlzdC4KLQkgKiBTbyB0aGlzIG1lYW5zIHRoZSByZXN1bHQgbGVuZ3RoIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIHBhdGhzIGxlbmd0aC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTFtdIGNvbnZlcnRTdHJpbmdQYXRoc1RvVVJMKFN0cmluZ1tdIHBhdGhzKSB7Ci0JCWlmIChwYXRocyAhPSBudWxsKSB7Ci0JCQlVUkxbXSByZXN1bHQgPSBuZXcgVVJMW3BhdGhzLmxlbmd0aF07Ci0JCQlpbnQgbmV4dFVSTCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVVJMIHVybCA9IGNvbnZlcnRTdHJpbmdQYXRoVG9VUkwocGF0aHNbaV0pOwotCQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQkJcmVzdWx0W25leHRVUkwrK10gPSB1cmw7ICAgCi0JCQl9Ci0JCQlpZiAobmV4dFVSTCA9PSAwKQotCQkJCXJldHVybiBudWxsOwkvLyBOb25lIHdlcmUgZm91bmQuCi0JCQkKLQkJCWlmIChuZXh0VVJMICE9IHJlc3VsdC5sZW5ndGgpIHsKLQkJCQlVUkxbXSBuciA9IG5ldyBVUkxbbmV4dFVSTF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIG5yLCAwLCBuci5sZW5ndGgpOwotCQkJCXJlc3VsdCA9IG5yOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSB1cmxzIHRvIHN0cmluZyBhcnJheS4gSXQgaXMgYXNzdW1lZCB0aGUgdXJscyBhcmUgaW4gZmlsZSBwcm90b2NvbC4gCi0JICogQHBhcmFtIHVybHMKLQkgKiBAcmV0dXJuIHN0cmluZyBwYXRocyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1cmxzIGlzIDxjb2RlPm51bGw8L2NvZGU+LiBBbnkgPGNvZGU+bnVsbDwvY29kZT4gZW50cnkgb2YgdXJscyB3aWxsIHJlc3VsdCBpbiAKLQkgKiBhIGNvcnJlc3BvbmRpbmcgPGNvZGU+bnVsbDwvY29kZT4gaW4gdGhlIHN0cmluZ3MuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjb252ZXJ0VVJMc1RvU3RyaW5ncyhVUkxbXSB1cmxzKSB7Ci0JCWlmICh1cmxzICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW3VybHMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJCXN0cmluZ3NbaV0gPSB1cmxzW2ldICE9IG51bGwgPyB1cmxzW2ldLmdldEZpbGUoKSA6IG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyaW5nczsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTG9jYWwgY29udHJpYnV0b3IgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCBjZXJ0YWluIGphcnMgYXJlIGluIHRoZSBwYXRoLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXN0YXRpYyBjbGFzcyBQcm94eUNvbnRyaWJ1dG9yIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQWRhcHRlciB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGhzKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0JCQkvLyBBZGQgdGhlIHJlcXVpcmVkIGphcnMgdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoLiAoV2Ugd2FudCBwcm94eUNvbW1vbiBhbmQgaW5pdFBhcnNlciAoKyBpbml0UGFyc2VyIE5MUyksIGJ1dCB0aGV5IGFyZSBpbiB0aGUgcnVudGltZSBvZiB0aGUgcHJveHkgYnVuZGxlICh3aGljaCBpcyBqYXJyZWQgdXApLCBzbyB3ZSBjb250cmlidXRlIHRoZSBidW5kbGUgaW5zdGVhZC4KLQkJCWNvbnRyb2xsZXIuY29udHJpYnV0ZUNsYXNzcGF0aChQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKSwgKElQYXRoKSBudWxsLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuQVBQRU5EX1VTRVJfQ0xBU1NQQVRILCB0cnVlKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTc4NjUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1Byb3h5TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm94eU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQcm94eU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3NDYXN0X0VYQ19fSW5jb3JyZWN0VHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eUZhY3RvcnlfRVhDX19Ob0JlYW5Qcm94eUZhY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlGYWN0b3J5X0VYQ19fTm9CZWFuVHlwZVByb3h5RmFjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb3RfSmF2YV9Qcm9qZWN0X1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX1ZNX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX0ltcGxlbWVudGF0aW9uX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5TGF1bmNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5V2FpdEZvckJ1aWxkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fSW5JbnZhbGlkU3RhdGVEdWVUb19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fSW5JbnZhbGlkU3RhdGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHByZXNzaW9uX1R5cGVTZW50SW5JbnZhbGlkT3JkZXJfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHByZXNzaW9uX0FycmF5VHlwZU5vdEFuQXJyYXlfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHByZXNzaW9uX0Nhbm5vdEhhbmRsZU5vUmVjZWl2ZU9uRmllbGRBY2Nlc3NfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHByZXNzaW9uX01ldGhvZHNOZWVkUmVjZWl2ZXJfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHByZXNzaW9uX0ludmFsaWRNYXJrTmVzdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eVBsdWdpbl9DbGVhbnVwRGVmYXVsdFByb3h5TGF1bmNoQ29uZmlndXJhdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlMYXVuY2hTdXBwb3J0X1JlZ2lzdHJ5Q291bGROb3RTdGFydEZvclNvbWVSZWFzb25fV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwcmVzc2lvbl9DcmVhdGVQcm94eVJlYXNzaWdubWVudEV4cHJlc3Npb25fSW52YWxpZEZvclJlYXNzaWdubWVudF9FWENfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHJveHlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwcmVzc2lvbl9JbnZhbGlkUHJveHk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1Byb3h5UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGIxNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFByb3h5UGx1Z2luLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjU3ICQgICREYXRlOiAyMDA1LzEwLzI2IDIyOjE0OjAxICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkVjbGlwc2VMb2dnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8uQ29udGFpbmVyUGF0aHM7Ci0KLS8qKgotICogVGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlIHBsdWdpbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJveHlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCQotCS8qKgotCSAqIFRoaXMgaW50ZXJmYWNlIGlzIGZvciBhIGxpc3RlbmVyIHRoYXQgbmVlZHMgdG8ga25vdyBpZiB0aGlzIHBsdWdpbiAoUHJveHlQbHVnaW4pIGlzIGJlaW5nIHNodXRkb3duLiAKLQkgKiBJdCBpcyBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgc29tZSBleHRlbnNpb25zIHRoYXQgZ2V0IGFkZGVkIGR5bmFtaWNhbGx5IHRoYXQgbmVlZCB0byBrbm93IHdoZW4gdGhlCi0JICogcGx1Z2luIGlzIGJlaW5nIHNodXRkb3duLiBDYW4ndCB1c2UgbmV3IGJ1bmRsZSBsaXN0ZW5lciBmb3IgdGhpcyBiZWNhdXNlIGl0IG5vdGlmaWVzIEFGVEVSIHNodXRkb3duLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UGx1Z2luU2h1dGRvd25MaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBQcm94eVBsdWdpbiBpcyBpbiBzaHV0ZG93bi4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2h1dGRvd24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJveHlQbHVnaW4gUFJPWFlfUExVR0lOID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFU19WTV9OT1ZFUklGWV9LRVkgPSAiSkVNX1BSRUZFUkVOQ0VTX1ZNX05PVkVSSUZZX0tFWSI7IC8vIEtleSBmb3IgTk9WRVJJRlkgb3B0aW9uIG9mIFZNIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQREVfTkFUVVJFX0lEID0gIm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUiIDsgLy8kTk9OLU5MUy0xJAotCQkKLQkvLyBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVuIGluIGRldmVsb3BtZW50IG1vZGUgYW5kIGl0IHdpbGwgdHJ5IGZvciBwcm94eSBqYXJzIGluIGRpcmVjdG9yaWVzLgotCXByaXZhdGUgYm9vbGVhbiBkZXZNb2RlOwotCQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IHNodXRkb3duTGlzdGVuZXJzOwotCi0JcHVibGljIFByb3h5UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlQUk9YWV9QTFVHSU4gPSB0aGlzOwotCQlkZXZNb2RlID0gUGxhdGZvcm0uaW5EZXZlbG9wbWVudE1vZGUoKTsgIAkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZXZNb2RlKCkgewotCQlyZXR1cm4gZGV2TW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBBY2Nlc3MgdGhlIHNpbmdsZXRvbgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBwbHVnaW4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3h5UGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIFBST1hZX1BMVUdJTjsKLQl9Ci0JCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlpZiAobG9nZ2VyID09IG51bGwpCi0JCQlsb2dnZXIgPSBFY2xpcHNlTG9nZ2VyLmdldEVjbGlwc2VMb2dnZXIodGhpcyk7Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQkKLQotCS8qKgotCSAqIFRoaXMgd2lsbCB0YWtlIHRoZSBidW5kbGUgYW5kIGZpbGUgbmFtZSBhbmQgbWFrZSBpdCBsb2NhbCBhbmQgcmV0dXJuIHRoYXQKLQkgKiBmdWxseSBxdWFsaWZpZWQuIEl0IHdpbGwgbG9vayBpbiBmcmFnbWVudHMsIGJ1dCBvbmx5IHJldHVybnMgZmlyc3QgZm91bmQuIElmIHRoZXJlIGNhbiBiZSBtdWx0aXBsZXMgdXNlCi0JICogdGhlIG9uZSBmb3IgYnVuZGxlcyBhbmQgaXQgZnJhZ21lbnRzLgotCSAqIDxwPgotCSAqIElmIHdlIGFyZSBpbiBkZXZlbG9wbWVudCBhbmQgaXQgd2lsbCBwaWNrIGl0IHVwIGZyb20gdGhlIHBhdGgKLQkgKiB0aGF0IGlzIGxpc3RlZCBpbiB0aGUgcHJveHkuamFycyBmaWxlIGxvY2F0ZWQgaW4gdGhlIGJ1bmRsZSBwYXNzZWQgaW4uIFRoaXMgYWxsb3dzIGRldmVsb3BtZW50IGNvZGUgdG8gYmUKLQkgKiB1c2VkIGluIHBsYWNlIG9mIHRoZSBhY3R1YWwgcnVudGltZSBqYXJzLiBJZiB0aGUgcnVudGltZSBqYXJzIGFyZSBmb3VuZCwKLQkgKiB0aGV5IHdpbGwgYmUgdXNlZC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSBpZiBsb29raW5nIGZvciBmaWxlIHJ1bnRpbWUveHl6LmphciBpbiBidW5kbGUgYWJjLCB0aGVuIGluIGJ1bmRsZSBkaXJlY3RvcnkgZm9yIGFiYywKLQkgKiB0aGVyZSBzaG91bGQgYmUgYSBmaWxlIGNhbGxlZCBwcm94eS5qYXJzLiBUaGlzIHNob3VsZCBvbmx5IGJlIGluIGRldmVsb3BtZW50LCB0aGlzIGZpbGUgc2hvdWxkIG5vdAotCSAqIGJlIGRpc3RyaWJ1dGVkIGZvciBwcm9kdWN0aW9uLiBJdCB3b3VsZCBiZSBkaXN0cmlidXRlZCBpbiB0aGUgU0RLIGVudmlyb25tZW50IHdoZW4gdGVzdGluZyBpcyBkZXNpcmVkLgotCSAqIDxwPgotCSAqIFRoZSBmb3JtYXQgb2YgdGhlIGZpbGUgaXM6Ci0JICogCXJ1bnRpbWVmaWxlPS9wcm9qZWN0bmFtZS9idWlsZGRpcmVjdG9yeQotCSAqIDxwPgotCSAqIEZvciB0aGlzIHRvIHdvcmsgd2hlbiB0aGUgYWN0dWFsIGphciBpcyBub3QgZm91bmQsIHRoZSBFY2xpcHNlIG11c3Qgb2YgYmVlbiBzdGFydGVkIGluIAotCSAqIGRldiBtb2RlIChpLmUuIHRoZSBidW5kbGUgbG9jYXRpb24gd2lsbCBiZSBhIHByb2plY3Qgd2l0aGluIHRoZSBkZXZlbG9wZXIgRWNsaXBzZS4gVGhhdCB3YXkKLQkgKiB3ZSBjYW4gZ28gdXAgb25lIGxldmVsIGZvciB0aGUgY3VycmVudCBpbnN0YWxsIGxvY2F0aW9uIGFuZCBhc3N1bWUgdGhlIGFib3ZlIHByb2plY3RuYW1lCi0JICogd2lsbCBiZSBmb3VuZCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5LgotCSAqIDxwPgotCSAqIEZvciB0aGUgYWJvdmUgZXhhbXBsZToKLQkgKiAJcnVudGltZS94eXouamFyPS94eXpwcm9qZWN0L2JpbgotCSAqIDxwPgotCSAqIEl0IHdpbGwgcmV0dXJuICIuIiBpZiBmaWxlIGNhbid0IGJlIGZvdW5kLiBJdCBtZWFucyBub3RoaW5nIGJ1dCBpdCB3b24ndCBjYXVzZSBqdm0gdG8gY3Jhc2guCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBmaWxlbmFtZVdpdGhpbkJ1bmRsZQotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIGZpbGUgb3IgPGNvZGU+Ii4iPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2NhbGl6ZUZyb21CdW5kbGVPbmx5KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQlVUkwgdXJsID0gdXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJcmV0dXJuIHVybCAhPSBudWxsID8gZ2V0RmlsZUZyb21VUkwodXJsKSA6ICIuIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgU3RyaW5nIGxvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlLCBTdHJpbmcgZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJVVJMIHVybCA9IHVybExvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJcmV0dXJuIHVybCAhPSBudWxsID8gZ2V0RmlsZUZyb21VUkwodXJsKSA6ICIuIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBKdXN0IGxpa2UgbG9jYWxpemVGcm9tQnVuZGxlIGV4Y2VwdCBpdCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBTdHJpbmdzLiBJdCB3aWxsIGxvb2sgZm9yIHRoZSBmaWxlbmFtZQotCSAqIHdpdGhpbiB0aGUgYnVuZGxlIGFuZCBhbnkgZnJhZ21lbnRzIG9mIHRoZSBidW5kbGUuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLgotCSAqIDxwPgotCSAqIFRvIGZpbmQgdGhlIGZpbGVzIGluIHRoZSBmcmFnbWVudHMgdGhhdCBhcmUgaW4gdGhlIHJ1bnRpbWUgcGF0aCAoaS5lLiBsaWJyYXJpZXMpLCBpdCB3aWxsIG5lZWQgdG8gdXNlIGEgc3VmZml4LAotCSAqIFRoaXMgaXMgYmVjYXVzZSB0aGUgSkRUIHdpbGwgZ2V0IGNvbmZ1c2VkIGlmIGEgcnVudGltZSBqYXIgaW4gYSBmcmFnbWVudCBoYXMgdGhlIHNhbWUgbmFtZQotCSAqIGFzIGEgcnVudGltZSBqYXIgaW4gdGhlIG1haW4gYnVuZGxlLgotCSAqIE5PVEU6IFRoaXMgaXMgb2Jzb2xldGUuIEpEVCBubyBsb25nZXIgaGFzIHRoaXMgcHJvYmxlbS4gU28gd2UgY2FuIGZpbmQgbGlicmFyaWVzIGluIGZyYWdtZW50cyB0aGF0IGhhdmUgdGhlCi0JICogc2FtZSBmaWxlIHBhdGguIAotCSAqIDxwPgotCSAqIFNvIHdlIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcgc2VhcmNoIHBhdHRlcm46Ci0JICogPG9sPgotCSAqIDxsaT5GaW5kIGluIGFsbCBvZiB0aGUgZnJhZ21lbnRzIHRob3NlIHRoYXQgbWF0Y2ggdGhlIG5hbWUgZXhhY3RseSBpbiB0aGUgc2FtZSBwYXRocyBpZiBwYXRocyBhcmUgc3VwcGxpZWQuPC9saT4KLQkgKiA8bGk+RmluZCBpbiBhbGwgb2YgdGhlIGZyYWdtZW50cywgaW4gdGhlaXIgcnVudGltZSBwYXRoIChsaWJyYXJ5IHN0bXQpLCB0aG9zZSB0aGF0IG1hdGNoIHRoZSBuYW1lIAotCSAqICAgIGJ1dCBoYXZlIGEgc3VmZml4IHRoZSBzYW1lIGFzIHRoZSB1bmlxdWVpZCBvZiB0aGUgZnJhZ21lbnQgKHByZWNlZWRlZCBieSBhIHBlcmlvZCkuIFRoaXMgaXMgc28gdGhhdCBpdCBjYW4gYmUgZWFzaWx5Ci0JICogICAgZm91bmQgYnV0IHlldCBiZSB1bmlxdWUgaW4gdGhlIGVudGlyZSBsaXN0IG9mIGZyYWdtZW50cy4gRm9yIGV4YW1wbGUgaWYgbG9va2luZyBmb3IgInJ1bnRpbWUveHl6LmphciIKLQkgKiAgICBhbmQgd2UgaGF2ZSBmcmFnbWVudCAiYS5iLmMuZC5mcmFnIiwgdGhlbiBpbiB0aGUgcnVudGltZSBwYXRoIHdlIHdpbGwgbG9vayBmb3IgdGhlIGZpbGUKLQkgKiAgICAicnVudGltZS94eXouYS5iLmMuZC5mcmFnLmphciIuIE5vdGU6IFRoaXMgaXMgb2Jzb2xldGUuIFN0aWxsIGhlcmUgb25seSBmb3IgcG9zc2libGUgb2xkIGNvZGUuIFdpbGwgZ28gCi0JICogICAgYXdheSBpbiBmdXR1cmUuPC9saT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgZmlsZXMgaW4gdGhlIGZyYWdtZW50cyBhcmUgbm90IGluIHRoZSBmcmFnbWVudHMgbGlicmFyeSBwYXRoIHRoZW4gaXQgY2FuIGhhdmUgdGhlIHNhbWUgbmFtZS4gTk9URTogT2Jzb2xldGUsCi0JICogSkRUIGNhbiBub3cgaGFuZGxlIHNhbWUgbmFtZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbmxzIHdoZXJlIHRoZSBubHMgZm9yIHRoZSBmaWxlbmFtZSB3aWxsIGJlIGluIG9uZSBvciBtb3JlIG9mIHRoZSBmcmFnbWVudHMgb2YgdGhlIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHBhcmFtIGZpbGVuYW1lV2l0aGluQnVuZGxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBsb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCVVSTFtdIHVybHMgPSB1cmxMb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSk7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbdXJscy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGdldEZpbGVGcm9tVVJMKHVybHNbaV0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVGcm9tVVJMKFVSTCB1cmwpIHsKLQkJLy8gV2UgbmVlZCB0byBkbyB0aGlzIGluIGEgZGV2aWNlIGluZGVwZW5kZW50IHdheS4gVGhlIFVSTCB3aWxsIGFsd2F5cyBwdXQgYSBsZWFkaW5nICcvJyBpbiB0aGUKLQkJLy8gZmlsZSBwYXJ0IG9mIHRoZSBVUkwsIGJ1dCBvbiBXaW5kb3dzIHdlIG5lZWQgdG8gaGF2ZSB0aGlzICcvJyByZW1vdmVkLiBTb21lIEpSRSdzIGRvbid0IHVuZGVyc3RhbmQgaXQuCi0JCXJldHVybiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCX0KLQotCXB1YmxpYyBVUkwgdXJsTG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQlyZXR1cm4gdXJsTG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgbmV3IFBhdGgoZmlsZW5hbWVXaXRoaW5CdW5kbGUpKTsKLQl9Ci0JcHVibGljIFVSTCB1cmxMb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHMoQnVuZGxlIGJ1bmRsZSwgSVBhdGggZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBwdm0gPSBQbGF0Zm9ybS5maW5kKGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQkJaWYgKHB2bSAhPSBudWxsKQotCQkJCXJldHVybiBQbGF0Zm9ybS5hc0xvY2FsVVJMKHB2bSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlpZiAoZGV2TW9kZSkgewotCQkJVVJMW10gdXJscyA9IGZpbmREZXZBbGxGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUudG9TdHJpbmcoKSk7Ci0JCQlpZiAodXJscy5sZW5ndGggPiAwKQotCQkJCXJldHVybiB1cmxzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBMaWtlIDxjb2RlPmxvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50czwvY29kZT4gZXhjZXB0IGl0IHJldHVybnMgVVJMJ3MgaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHBhcmFtIGZpbGVuYW1lV2l0aGluQnVuZGxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgUHJveHlQbHVnaW4jbG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSwgU3RyaW5nKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBVUkxbXSB1cmxMb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCXJldHVybiB1cmxMb2NhbGl6ZUFsbEJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIFBsYXRmb3JtLmdldEZyYWdtZW50cyhidW5kbGUpLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSk7Ci0JfQotCXB1YmxpYyBVUkxbXSB1cmxMb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoQnVuZGxlIGJ1bmRsZSwgSVBhdGggZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJcmV0dXJuIHVybExvY2FsaXplQWxsQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKGJ1bmRsZSksIGZpbGVuYW1lV2l0aGluQnVuZGxlLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHBhcmFtIGZpbGVuYW1lV2l0aGluQnVuZGxlCi0JICogQHBhcmFtIGZyYWdtZW50cwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcml2YXRlIFVSTFtdIHVybExvY2FsaXplQWxsQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUsIEJ1bmRsZVtdIGZyYWdtZW50cywgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0KLQkJQXJyYXlMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KChmcmFnbWVudHMgPT0gbnVsbCA/IDAgOiBmcmFnbWVudHMubGVuZ3RoKSArIDEpOwotCQlVUkwgdXJsID0gaW50ZXJuYWxVcmxMb2NhbGl6ZUZyb21CdW5kbGVPbmx5KGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQl1cmxzLmFkZCh1cmwpOwotCQlpZiAoZnJhZ21lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQnVuZGxlIGZyYWdtZW50ID0gZnJhZ21lbnRzW2ldOwotCQkJCXVybCA9IGludGVybmFsVXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShmcmFnbWVudCwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQkJdXJscy5hZGQodXJsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFVSTFtdKSB1cmxzLnRvQXJyYXkobmV3IFVSTFt1cmxzLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWUpBUlMgPSAicHJveHkuamFycyI7CS8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBAc2VlIFByb3h5UGx1Z2luI2xvY2FsaXplRnJvbUJ1bmRsZShCdW5kbGUsIFN0cmluZykKLQkgKiAKLQkgKiBUaGlzIGlzIGp1c3QgYSBoZWxwZXIgdG8gcmV0dXJuIGEgdXJsIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBmaWxlbmFtZVdpdGhpbkJ1bmRsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgVVJMIHVybExvY2FsaXplRnJvbUJ1bmRsZU9ubHkoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCS8vIElmIHRoZSBmaWxlbmFtZVdpdGhpbkJ1bmRsZSBiZWdpbnMgd2l0aCBvbmUgb2YgdGhlc2Ugc3BlY2lhbCBjaGFyYWN0ZXJzLAotCQkvLyBpdCBtaWdodCBiZSBpbiBhIGZyYWdtZW50LgotCQlpZiAoZmlsZW5hbWVXaXRoaW5CdW5kbGUuY2hhckF0KDApID09ICckJwotCQkJCSYmIChmaWxlbmFtZVdpdGhpbkJ1bmRsZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsICIkbmwkIiwgMCwgIiRubCQiLmxlbmd0aCgpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXx8IGZpbGVuYW1lV2l0aGluQnVuZGxlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgIiRvcyQiLCAwLCAiJG9zJCIubGVuZ3RoKCkpIHx8IGZpbGVuYW1lV2l0aGluQnVuZGxlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkiJHdzJCIsIDAsICIkd3MkIi5sZW5ndGgoKSkpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiB1cmxMb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSk7Ci0JCXRyeSB7Ci0JCQlVUkwgcHZtID0gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCQlwdm0gPSB2ZXJpZnlGb3VuZChQbGF0Zm9ybS5hc0xvY2FsVVJMKHB2bSkpOwotCQkJaWYgKHB2bSAhPSBudWxsKQotCQkJCXJldHVybiBwdm07Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmluZERldihidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgVVJMIGludGVybmFsVXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShCdW5kbGUgYnVuZGxlLCBTdHJpbmcgZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBwdm0gPSBidW5kbGUuZ2V0RW50cnkoZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQkJaWYgKHB2bSAhPSBudWxsKQotCQkJCXJldHVybiBQbGF0Zm9ybS5hc0xvY2FsVVJMKHB2bSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmluZERldihidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsJCQotCQkKLQl9CQotCQotCXByaXZhdGUgVVJMIHZlcmlmeUZvdW5kKFVSTCBwdm0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChkZXZNb2RlKSB7Ci0JCQkvLyBOZWVkIHRvIHRlc3QgaWYgZm91bmQgaW4gZGV2bW9kZS4gT3RoZXJ3aXNlIHdlIHdpbGwganVzdCBhc3N1bWUgaXQgaXMgZm91bmQuIElmIG5vdCBmb3VuZCBvbiByZW1vdGUgYW5kIG1vdmVkIHRvIGNhY2hlLCBhbiBJT0V4Y2VwdGlvbiB3b3VsZCBiZSB0aHJvd24uCi0JCQlpZiAocHZtICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBpb3MgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWlvcyA9IHB2bS5vcGVuU3RyZWFtKCk7Ci0JCQkJCWlmIChpb3MgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBwdm07IC8vIEZvdW5kIGl0LCBzbyByZXR1cm4gaXQuCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGlvcyAhPSBudWxsKQotCQkJCQkJaW9zLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UKLQkJCXJldHVybiBwdm07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJveHlQbHVnaW4jbG9jYWxpemVGcm9tQnVuZGxlKGJ1bmRsZSwgU3RyaW5nKQotCSAqIAotCSAqIFRoaXMgaXMganVzdCBhIGhlbHBlciB0byByZXR1cm4gYSB1cmwgaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHBhcmFtIGZpbGVuYW1lV2l0aGluQnVuZGxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBVUkwgdXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShCdW5kbGUgYnVuZGxlLCBJUGF0aCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewkJCQkJCi0JCXJldHVybiB1cmxMb2NhbGl6ZUZyb21CdW5kbGVPbmx5KGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUudG9TdHJpbmcoKSk7Ci0JfQotCQotCXByaXZhdGUgVVJMIGZpbmREZXYoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCWlmIChkZXZNb2RlKSB7Ci0JCQkvLyBHb3QgdGhpcyBmYXIgYW5kIGluIGRldiBtb2RlIG1lYW5zIGl0IHdhc24ndCBmb3VuZCwgc28gd2UnbGwgdHJ5IGZvciBkZXZlbG9wbWVudCBzdHlsZS4KLQkJCS8vIEl0IGlzIGFzc3VtZWQgdGhhdCBpbiBkZXYgbW9kZSwgd2UgYXJlIHJ1bm5pbmcgd2l0aCB0aGUgSURFIGFzIGxvY2FsIGFuZCBhbnkgCi0JCQkvLyBidWlsZCBvdXRwdXRzIHdpbGwgYmUgbG9jYWwgc28gbG9jYWwgZmlsZSBwcm90b2NvbCB3aWxsIGJlIHJldHVybmVkCi0JCQkvLyBmcm9tIFBsYXRmb3JtLnJlc29sdmUoKS4gV2Ugd29uJ3QgYmUgcnVubmluZyBpbiBkZXYgbW9kZSB3aXRoIG91ciBlbnRpcmVwbHVnaW4gYmVpbmcgaW4gYSBqYXIsCi0JCQkvLyBvciBvbiBhIHNlcGFyYXRlIHN5c3RlbS4KLQkJCXRyeSB7Ci0JCQkJVVJMIHB2bSA9IGJ1bmRsZS5nZXRFbnRyeShQUk9YWUpBUlMpOwotCQkJCWlmIChwdm0gIT0gbnVsbCkgewotCQkJCQlJbnB1dFN0cmVhbSBpb3MgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJaW9zID0gcHZtLm9wZW5TdHJlYW0oKTsKLQkJCQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCQkJcHJvcHMubG9hZChpb3MpOwotCQkJCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShmaWxlbmFtZVdpdGhpbkJ1bmRsZS50b1N0cmluZygpKTsKLQkJCQkJCWlmIChwYXRoU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCQlVUkwgdXJsID0gUGxhdGZvcm0ucmVzb2x2ZShidW5kbGUuZ2V0RW50cnkoIi8iKSk7CS8vIEl0IGlzIGFzc3VtZWQgdGhhdCBpZiBpbiBkZWJ1ZyBtb2RlLCB0aGVuIHRoaXMgcGx1Z2luIGlzIGFuIGltcG9ydGVkIHBsdWdpbiB3aXRoaW4gdGhlIGRldmVsb3BlbWVudCB3b3Jrc3BhY2UuIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRQYXJlbnRGaWxlKCk7CS8vIFRoaXMgZ2V0cyB1cyB0byB3b3Jrc3BhY2Ugcm9vdCBvZiBkZXZlbG9wbWVudCB3b3Jrc3BhY2UuCi0JCQkJCQkJCWZpbGUgPSBuZXcgRmlsZShmaWxlLCBwYXRoU3RyaW5nKTsKLQkJCQkJCQkJcmV0dXJuIGZpbGUudG9VUkwoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAoaW9zICE9IG51bGwpCi0JCQkJCQkJaW9zLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCi0JfQotCXByaXZhdGUgVVJMW10gZmluZERldkFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCUJ1bmRsZSBbXSBmcmFnbWVudHMgPSBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKTsKLQkJQXJyYXlMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KChmcmFnbWVudHMgPT0gbnVsbCA/IDAgOiBmcmFnbWVudHMubGVuZ3RoKSArIDEpOwotCQlVUkwgdXJsID0gZmluZERldihidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJdXJscy5hZGQodXJsKTsKLQkJaWYgKGZyYWdtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUJ1bmRsZSBmcmFnbWVudCA9IGZyYWdtZW50c1tpXTsKLQkJCQl1cmwgPSBmaW5kRGV2KGZyYWdtZW50LCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSk7Ci0JCQkJaWYgKHVybCAhPSBudWxsKQotCQkJCQl1cmxzLmFkZCh1cmwpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVVJMW10pIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdXJscyBmb3IgdGhlIGJ1bmRsZSBhbmQgYWxsIGZyYWdtZW50cy4gVGhpcyBpcyB1c2VkIHdoZW4gYnVuZGxlcy9mcmFnbWVudHMgYXJlIGphcnJlZC4gSXQgd29uJ3Qgd29yayBjb3JyZWN0bHkgaWYgbm90IAotCSAqIGEgamFycmVkIGJ1bmRsZSBhbmQgZnJhZ21lbnRzLiBUaGlzIHdvdWxkIG1vc3QgbGlrZWx5IGJlIHVzZWQgZm9yIE5MUwotCSAqIHB1cnBvc2VzIHRvIGJyaW5nIGluIHRoZSBidW5kbGUgYW5kIGFsbCBvZiB0aGUgbmxzLiBJZiBhIHNwZWNpZmljIGZyYWdtZW50IHdhcyB3YW50ZWQgdXNlIHtAbGluayAjdXJsTG9jYWxpemVCdW5kbGUoQnVuZGxlKX0gaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHJldHVybiB1cmxzIGZvciBidW5kbGUgYW5kIGFsbCBmcmFnbWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFVSTFtdIHVybExvY2FsaXplQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUpIHsKLQkJQnVuZGxlW10gZnJhZ21lbnRzID0gUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7Ci0JCUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKGZyYWdtZW50cyA9PSBudWxsID8gMCA6IGZyYWdtZW50cy5sZW5ndGgpICsgMSk7Ci0JCVVSTFtdIGJ1cmxzID0gdXJsTG9jYWxpemVCdW5kbGUoYnVuZGxlKTsKLQkJaWYgKGJ1cmxzICE9IG51bGwpIHsKLQkJCXVybHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYnVybHMpKTsKLQkJfQotCQlpZiAoZnJhZ21lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVybHMgPSB1cmxMb2NhbGl6ZUJ1bmRsZShmcmFnbWVudHNbaV0pOwotCQkJCWlmIChidXJscyAhPSBudWxsKQotCQkJCQl1cmxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGJ1cmxzKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKFVSTFtdKSB1cmxzLnRvQXJyYXkobmV3IFVSTFt1cmxzLnNpemUoKV0pOwotCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdXJscyBmb3IgdGhlIGJ1bmRsZSBsaWJyYXJpZXMgb25seS4gSWYgYSBmcmFnbWVudCBpcyB3YW50ZWQsIHRoZW4gcGFzcyBpbiB0aGUgZnJhZ21lbnQgaW5zdGVhZC4KLQkgKiBJZiBidW5kbGUgYW5kIGFsbCBmcmFnbWVudHMgYXJlIHdhbnRlZCB1c2Uge0BsaW5rICN1cmxMb2NhbGl6ZUJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUpfSBpbnN0ZWFkLgotCSAqIDxwPgotCSAqIElmIGluIGRldiBtb2RlLCBpdCB3aWxsIHVzZSB0aGUgYmluYXJ5IG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBwbHVnaW4gbGlicmFyaWVzIGZyb20gdGhlIGJ1aWxkLnByb3BlcnRpZXMgZmlsZS4gCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEByZXR1cm4gVVJMIGFycmF5IG9mIGxvY2FsIGxpYnJhcnkgcmVmZXJlbmNlcyBmb3IgdGhlIGJ1bmRsZSBvciBudWxsIGlmIGNhbid0IHJlc29sdmUgdG8gbG9jYWwuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFVSTFtdIHVybExvY2FsaXplQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLQkJVVJMW10gcHZtczsKLQkJdHJ5IHsKLQkJCXB2bXMgPSBuZXcgVVJMW10ge1BsYXRmb3JtLnJlc29sdmUoYnVuZGxlLmdldEVudHJ5KCIvIikpfTsKLQkJCWlmIChwdm1zWzBdLmdldFByb3RvY29sKCkuZXF1YWxzKCJqYXIiKSkgewotCQkJCS8vIFRoZSBidW5kbGUgaXMgYSBqYXIsIHNvIHVzZSBhcyBpcy4gCi0JCQkJcHZtc1swXSA9IGdldEZpbGVQYXRoKHB2bXNbMF0pOwotCQkJCXJldHVybiBwdm1zOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlwdm1zID0gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJLy8gSXQgaXMgYSBkaXJlY3RvcnkuIFdlIGNvdWxkIGJlIGluIGVpdGhlciBkZXZlbG9wbWVudCBtb2RlIG9yIG5vdC4gV2FsayB0aGUgbWFuaWZlc3QgY2xhc3NwYXRoIGFuZCBmaW5kIHRoZSBsaWJyYXJpZXMuCi0JCQlQcm9wZXJ0aWVzIGJ1aWxkUHJvcHMgPSBudWxsOwotCQkJU3RyaW5nIGxpYnJhcmllcyA9IChTdHJpbmcpIGJ1bmRsZS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfQ0xBU1NQQVRIKTsKLQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnRzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKENvbnN0YW50cy5CVU5ETEVfQ0xBU1NQQVRILCBsaWJyYXJpZXMpOwotCQkJTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlVUkwgcHZtID0gYnVuZGxlLmdldEVudHJ5KGVsZW1lbnRzW2ldLmdldFZhbHVlKCkpOwotCQkJCQkJaWYgKHB2bSAhPSBudWxsKSB7Ci0JCQkJCQkJdXJscy5hZGQoUGxhdGZvcm0uYXNMb2NhbFVSTChwdm0pKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9CQkJCQotCQkJCQlpZiAoZGV2TW9kZSkgewotCQkJCQkJLy8gTm90IGZvdW5kIGFzIGEgamFyLCBzbyBzZWUgaWYgY2FuIGJlIGZvdW5kIGluIGRldm1vZGUuCi0JCQkJCQlpZiAoYnVpbGRQcm9wcyA9PSBudWxsKSB7Ci0JCQkJCQkJYnVpbGRQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVVJMIGJwID0gYnVuZGxlLmdldEVudHJ5KCJidWlsZC5wcm9wZXJ0aWVzIik7Ci0JCQkJCQkJCWlmIChicCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlJbnB1dFN0cmVhbSBpb3MgPSBudWxsOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlpb3MgPSBicC5vcGVuU3RyZWFtKCk7Ci0JCQkJCQkJCQkJYnVpbGRQcm9wcy5sb2FkKGlvcyk7Ci0JCQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQkJCWlmIChpb3MgIT0gbnVsbCkKLQkJCQkJCQkJCQkJaW9zLmNsb3NlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBidWlsZFByb3BzLmdldFByb3BlcnR5KCJvdXRwdXQuIitlbGVtZW50c1tpXS5nZXRWYWx1ZSgpKTsKLQkJCQkJCWlmIChwYXRoU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQl1cmxzLmFkZChQbGF0Zm9ybS5hc0xvY2FsVVJMKGJ1bmRsZS5nZXRFbnRyeShwYXRoU3RyaW5nKSkpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChVUkxbXSkgdXJscy50b0FycmF5KG5ldyBVUkxbdXJscy5zaXplKCldKTsKLQkJCX0gZWxzZSBpZiAoZGV2TW9kZSkgewotCQkJCS8vIElmIGRldiBtb2RlIHRoZW4gd2Ugd291bGQgbG9vayBpbiB0aGUgYnVpbGQucHJvcGVydGllcyB0byBmaW5kIHRoZSBvdXRwdXQuLiBlbnRyeS4gVGhpcyB0ZWxscyB3aGVyZSB0aGUgYmluYXJpZXMgYXJlIAotCQkJCS8vIGZvciBwcm9qZWN0LiBJZiB0aGVyZSBpcyBubyAib3V0cHV0Li4iIGVudHJ5IHRoZW4gZWl0aGVyIGl0IGlzIG5vdCBhIHJ1bm5hYmxlIHBsdWdpbiBvciB0aGUgcmFyZSBjYXNlIGlzIGl0IGlzIG9ubHkKLQkJCQkvLyBjbGFzc2ZpbGVzIGluIGEgZm9sZGVyLiBJbiB0aGF0IGNhc2Ugc2VlIGlmIHRoZXJlIGlzIGEgInNvdXJjZS4uIiBlbnRyeSBhbmQgdXNlIHRoYXQuCi0JCQkJdHJ5IHsKLQkJCQkJVVJMIGJwID0gYnVuZGxlLmdldEVudHJ5KCJidWlsZC5wcm9wZXJ0aWVzIik7Ci0JCQkJCWlmIChicCAhPSBudWxsKSB7Ci0JCQkJCQlJbnB1dFN0cmVhbSBpb3MgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpb3MgPSBicC5vcGVuU3RyZWFtKCk7Ci0JCQkJCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJCQkJcHJvcHMubG9hZChpb3MpOwotCQkJCQkJCVN0cmluZyBwYXRoU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoIm91dHB1dC4uIik7Ci0JCQkJCQkJaWYgKHBhdGhTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJCQlyZXR1cm4gbmV3IFVSTFtdIHtQbGF0Zm9ybS5yZXNvbHZlKGJ1bmRsZS5nZXRFbnRyeShwYXRoU3RyaW5nKSl9OwotCQkJCQkJCX0gZWxzZSBpZiAoKHBhdGhTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eSgic291cmNlLi4iKSkgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBQcm9iYWJseSBhIGNsYXNzIGZvbGRlciwgc28gdXNlIHRoZSBzb3VyY2UgaW5zdGVhZC4KLQkJCQkJCQkJcmV0dXJuIG5ldyBVUkxbXSB7UGxhdGZvcm0ucmVzb2x2ZShidW5kbGUuZ2V0RW50cnkocGF0aFN0cmluZykpfTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJcmV0dXJuIHB2bXM7CS8vIFRyeSB0aGUgcm9vdCBvZiB0aGUgcGx1Z2luLgotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlpZiAoaW9zICE9IG51bGwpCi0JCQkJCQkJCWlvcy5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHVybCBhcyBmaWxlIHVybCBpZiBpdCBjYW4uIElmIGl0IGlzIGFscmVhZHkgYSBmaWxlIHVybCwgaXQgd2lsbCBqdXN0IHJldHVybiBpdC4KLQkgKiBJZiBpdCBpcyAiamFyOmZpbGU6Li4uLiIgdHlwZSBwcm90b2NvbCwgdGhlbiBpdCB3aWxsIHN0cmlwIGl0IGRvd24gdG8gdGhlIGZpbGUgcGFydCwgd2hpY2ggaXMKLQkgKiB0aGUgamFyIGl0c2VsZiwgYW5kIG5vdCB0aGUgZmlsZSB3aXRoaW4gdGhlIGphci4gCi0JICogQHBhcmFtIGwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0RmlsZVBhdGgoVVJMIGwpIHsKLQkJaWYgKGwgIT0gbnVsbCkgewotCQkJaWYgKGwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJICAgICByZXR1cm4gbDsKLQkJCWVsc2UgaWYgKGwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImphciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgZiA9IGwuZ2V0RmlsZSgpOwotCQkJCWludCBpZHggPSBmLmxhc3RJbmRleE9mKCchJyk7Ci0JCQkJaWYgKGlkeD49MCkKLQkJCQkJZiA9IGYuc3Vic3RyaW5nKDAsaWR4KTsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gZ2V0RmlsZVBhdGgobmV3IFVSTChmKSk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHt9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEEgaGVscGVyIHRvIG9yZGVyIHRoZSBwbHVnaW5zIGludG8gcHJlLXJlcSBvcmRlci4gCi0JICogSWYgQSBldmVudHVhbGx5IGRlcGVuZHMgb24gQiwgdGhlbiBCIHdpbGwgYmUgYWhlYWQgb2YgQSBpbiB0aGUKLQkgKiBsaXN0IG9mIHBsdWdpbnMuIChJLmUuIEIgaXMgYSBwcmUtcmVxIHNvbWV3aGVyZSBvZiBBKS4KLQkgKiAgCi0JICogQHBhcmFtIGJ1bmRsZXNUb09yZGVyIC0gQnVuZGxlcyBvZiBpbnRlcmVzdC4gVGhlIHJlc3VsdHMgd2lsbCBoYXZlIHRoZXNlIGluIHRoaWVlIGNvcnJlY3Qgb3JkZXIuCi0JICogQHJldHVybiBBbiBhcnJheSBvZiB0aGUgQnVuZGxlcnMgaW4gdGhlcmUgb3JkZXIgZnJvbSBubyBwcmVyZXFzIGluIHNldCB0byB0aGUgbGVhdmVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnVuZGxlW10gb3JkZXJQbHVnaW5zKGZpbmFsIFNldCBidW5kbGVzVG9PcmRlcikgewotCQlNYXAgcHJlcmVxc01hcCA9IG5ldyBIYXNoTWFwKGJ1bmRsZXNUb09yZGVyLnNpemUoKSozKTsKLQkJaW50IG5keCA9IGJ1bmRsZXNUb09yZGVyLnNpemUoKTsKLQkJQnVuZGxlW10gcmVzdWx0ID0gbmV3IEJ1bmRsZVtuZHhdOwotCQlNYXAgZGVwZW5kZW50cyA9IGdldERlcGVuZGVudENvdW50cyhmYWxzZSwgYnVuZGxlc1RvT3JkZXIsIHByZXJlcXNNYXApOwkvLyBXZSB3YW50IHRoZSBpbmFjdGl2ZSBvbmVzIHRvby4gVGhhdCB3YXkgaGF2ZSBjb21wbGV0ZSBvcmRlci4gVGhleSBjYW4gYmUgaWdub3JlZCBsYXRlciBpZiBuZWNlc3NhcnkuCi0JCS8vIGtlZXAgaXRlcmF0aW5nIHVudGlsIGFsbCBoYXZlIGJlZW4gdmlzaXRlZC4gVGhpcyB3aWxsIGFjdHVhbGx5IGZpbmQgdGhlbSBpbiByZXZlcnNlIG9yZGVyIGZyb20gd2hhdCB3ZQotCQkvLyB3YW50LCBpLmUuIGl0IHdpbGwgZmluZCB0aGUgbGVhdmVzIGZpcnN0LiBTbyB3ZSB3aWxsIGJ1aWxkIHJlc3VsdCBhcnJheSBpbiByZXZlcnNlIG9yZGVyLgotCQl3aGlsZSAoIWRlcGVuZGVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBsb29wIG92ZXIgdGhlIGRlcGVuZGVudHMgbGlzdC4gIEZvciBlYWNoIGVudHJ5LCBpZiB0aGVyZSBhcmUgbm8gZGVwZW5kZW50cywgdmlzaXQKLQkJCS8vIHRoZSBidW5kbGUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LiAgTWFrZSBhIGNvcHkgb2YgdGhlIGtleXMgc28gd2UgZG9uJ3QgZW5kIHVwCi0JCQkvLyB3aXRoIGNvbmN1cnJlbnQgYWNjZXNzZXMgKHNpbmNlIHdlIGFyZSBkZWxldGluZyB0aGUgdmFsdWVzIGFzIHdlIGdvKQotCQkJSXRlcmF0b3IgaWIgPSBkZXBlbmRlbnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpYi5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpYi5uZXh0KCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpIGVudHJ5LmdldEtleSgpIDsKLQkJCQlpbnRbXSBjb3VudCA9IChpbnRbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoY291bnQgIT0gbnVsbCAmJiBjb3VudFswXSA8PSAwKSB7Ci0JCQkJCWlmIChidW5kbGVzVG9PcmRlci5jb250YWlucyhidW5kbGUpKSB7Ci0JCQkJCQlyZXN1bHRbLS1uZHhdID0gYnVuZGxlOwotCQkJCQkJaWYgKG5keCA9PSAwKQotCQkJCQkJCXJldHVybiByZXN1bHQ7CS8vIFdlJ3ZlIG9yZGVyZWQgYWxsIHRoYXQgd2UgY2FyZSBhYm91dC4gQW55dGhpbmcgbGVmdCBvdmVyIGlzIHVuaW1wb3J0YW50LgotCQkJCQl9Ci0JCQkJCWliLnJlbW92ZSgpOwotCQkJCQkvLyBkZWNyZW1lbnQgdGhlIGRlcGVuZGVudCBjb3VudCBmb3IgYWxsIG9mIHRoZSBwcmVyZXF1aXNpdGVzLgotCQkJCQlCdW5kbGVbXSByZXF1aXJlcyA9IGdldFByZXJlcXMoYnVuZGxlLCBwcmVyZXFzTWFwKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZXF1aXJlcy5sZW5ndGg7IGorKykgewotCQkJCQkJQnVuZGxlIHByZXJlcSA9IHJlcXVpcmVzW2pdOwotCQkJCQkJaW50W10gY291bnRQcmVyZXEgPSAoaW50W10pIGRlcGVuZGVudHMuZ2V0KHByZXJlcSk7Ci0JCQkJCQlpZiAoY291bnRQcmVyZXEgIT0gbnVsbCkKLQkJCQkJCQktLWNvdW50UHJlcmVxWzBdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGFsbCBvZiB0aGUgcHJlcmVxcyBmb3IgdGhpcyBidW5kbGUsIGFsbCBvZiB0aGUgd2F5IGRvd24gdG8gdGhlIHJvb3QuCi0JICogVGhleSB3aWxsIGJlIGluIHRvcC1kb3duIGRlcHRoLWZpcnN0IG9yZGVyLiBUaGVyZSB3b24ndCBiZSBkdXBsaWNhdGVzLiBUaGV5IHdpbGwgc2hvdyB1cAotCSAqIG9ubHkgb25jZSB0aGUgZmlyc3QgdGltZSB0aGV5IGFyZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHJldHVybiBsaXN0IG9mIGFsbCBwcmUtcmVxcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsUHJlcmVxcyhCdW5kbGUgYnVuZGxlKSB7Ci0JCUxpc3QgcHJlcmVxcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QWxsUHJlcmVxcyhidW5kbGUsIHByZXJlcXMsIG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gcHJlcmVxczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbGxQcmVyZXFzKEJ1bmRsZSBidW5kbGUsIExpc3QgcHJlcmVxcywgTWFwIHByZXJlcXNNYXApIHsKLQkJQnVuZGxlW10gcHJzID0gZ2V0UHJlcmVxcyhidW5kbGUsIHByZXJlcXNNYXApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBycy5sZW5ndGg7IGkrKykgewotCQkJQnVuZGxlIHByZSA9IHByc1tpXTsKLQkJCWlmIChwcmVyZXFzTWFwLmNvbnRhaW5zS2V5KHByZSkpCi0JCQkJY29udGludWU7CS8vIEFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgb25lIG9uY2UuCi0JCQlwcmVyZXFzLmFkZChwcmUpOwkvLyBBZGQgdG8gdGhlIGxpc3Qgb2YgcHJlLXJlcXMgYWNjdW11bGF0ZWQgc28gZmFyLgotCQkJZ2V0QWxsUHJlcmVxcyhwcmUsIHByZXJlcXMsIHByZXJlcXNNYXApOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZVtdIGdldFByZXJlcXMoQnVuZGxlIGJ1bmRsZSwgTWFwIHByZXJlcXNNYXApIHsKLQkJQnVuZGxlW10gcHJlcmVxcyA9IChCdW5kbGVbXSkgcHJlcmVxc01hcC5nZXQoYnVuZGxlKTsKLQkJaWYgKHByZXJlcXMgPT0gbnVsbCkgewotCQkJcHJlcmVxcyA9IGdldFByZXJlcXMoYnVuZGxlKTsKLQkJCXByZXJlcXNNYXAucHV0KGJ1bmRsZSwgcHJlcmVxcyk7Ci0JCX0KLQkJcmV0dXJuIHByZXJlcXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlW10gZ2V0UHJlcmVxcyhCdW5kbGUgYnVuZGxlKSB7Ci0JCUJ1bmRsZVtdIGwgPSAoQnVuZGxlW10pIHBsdWdpblJlcXVpcmVkTWFwLmdldChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQlpZiAobCA9PSBudWxsKSB7Ci0JCQlCdW5kbGVTcGVjaWZpY2F0aW9uIHNwZWNzW10gPSBQbGF0Zm9ybS5nZXRQbGF0Zm9ybUFkbWluKCkuZ2V0U3RhdGUoZmFsc2UpLmdldEJ1bmRsZShidW5kbGUuZ2V0QnVuZGxlSWQoKSkuZ2V0UmVxdWlyZWRCdW5kbGVzKCk7Ci0JCQlBcnJheUxpc3QgYnVuZGxlcyA9IG5ldyBBcnJheUxpc3Qoc3BlY3MubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BlY3MubGVuZ3RoOyBpKyspIHsKLQkJCQlCdW5kbGUgYiA9IFBsYXRmb3JtLmdldEJ1bmRsZShzcGVjc1tpXS5nZXROYW1lKCkpOwotCQkJCWlmIChiICE9IG51bGwpCi0JCQkJCWJ1bmRsZXMuYWRkKGIpOwotCQkJfQotCQkJbCA9IChCdW5kbGVbXSkgYnVuZGxlcy50b0FycmF5KG5ldyBCdW5kbGVbYnVuZGxlcy5zaXplKCldKTsKLQkJCXBsdWdpblJlcXVpcmVkTWFwLnB1dChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIGwpOwotCQl9Ci0JCXJldHVybiBsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0RGVwZW5kZW50Q291bnRzKGJvb2xlYW4gYWN0aXZlT25seSwgU2V0IHN0YXJ0aW5nU2V0LCBNYXAgcHJlcmVxc01hcCkgewotCQkvLyBUcnkgdG8gbWFpbnRhaW4gaW5kZXBlbmRlbnRzIGluIG9yZGVyIGZyb20gdGhlIHN0YXJ0aW5nIHNldCAod2hpY2ggaGFwcGVucyB0byBiZSBvcmRlcmVkLCBhbmQgaG9wZWZ1bGx5IHJldmVyc2VkLikuCi0JCS8vIFRyeWluZyB0byBoYXZlIGxlYXZlcyBzaG93IHVwIGluIHNhbWUgb3JkZXIgdGhleSBhcmUgZm91bmQgaW4gdGhlIEVjbGlwc2UgZXh0ZW5zaW9ucywgc28gd2Ugc2hvdWxkCi0JCS8vIGhhdmUgdGhlIHN0YXJ0aW5nIHNldCBiZSBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhhdC4gVGhlIGFjdHVhbCBwcm9jZXNzCi0JCS8vIGJ1aWxkcyB0aGVtIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aGUgc3RhcnRpbmcgc2V0LCBzbyB3ZSBleHBlY3QgdGhlIHN0YXJ0aW5nU2V0IHRvIGJlIGluICByZXZlcnNlIG9yZGVyIHNvIHRoZXkgd2lsbCBiZSBpbiBmb3J3YXJkIG9yZGVyCi0JCS8vIGhvcGVmdWxseS4gVGhpcyBpcyBqdXN0IGEgaGV1cmlzdGljLiBUaGVyZSBpcyBubyBndWFyZW50ZWUgaXQgd2lsbCBhY3R1YWxseSBwcm9kdWNlIHRoZSAKLQkJLy8gZGVzaXJlZCBvdXRwdXQuCi0JCU1hcCBkZXBlbmRlbnRzID0gbmV3IExpbmtlZEhhc2hNYXAoc3RhcnRpbmdTZXQuc2l6ZSgpKTsJCi0JCS8vIGJ1aWxkIGEgdGFibGUgb2YgYWxsIGRlcGVuZGVudCBjb3VudHMuICBUaGUgdGFibGUgaXMga2V5ZWQgYnkgZGVzY3JpcHRvciBhbmQKLQkJLy8gdGhlIHZhbHVlIHRoZSBpbnRlZ2VyIG51bWJlciBvZiBkZXBlbmRlbnQgcGx1Z2lucy4KLQkJTGlzdCBwcm9jZXNzTm93ID0gbmV3IEFycmF5TGlzdChzdGFydGluZ1NldCk7Ci0JCUxpc3QgcHJvY2Vzc05leHQgPSBuZXcgQXJyYXlMaXN0KHByb2Nlc3NOb3cuc2l6ZSgpKTsKLQkJaWYgKCFwcm9jZXNzTm93LmlzRW1wdHkoKSkgewotCQkJLy8gR28gdGhyb3VnaCB0aGUgZmlyc3QgdGltZSBmcm9tIHRoZSBzdGFydGluZyBzZXQgdG8gZ2V0IGFuIGVudHJ5IGludG8gdGhlIGxpc3QuCi0JCQkvLyBJZiB0aGVyZSBpcyBhbiBlbnRyeSwgdGhlbiBpdCB3b24ndCBiZSBtYXJrZWQgZm9yIHByb2Nlc3NOZXh0LiBPbmx5IG5ldyBlbnRyaWVzCi0JCQkvLyBhcmUgYWRkZWQgdG8gcHJvY2Vzc05leHQgaW4gdGhlIGZvbGxvd2luZyBsb29wLgotCQkJaW50IHBuU2l6ZSA9IHByb2Nlc3NOb3cuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwblNpemU7IGkrKykgewotCQkJCUJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKSBwcm9jZXNzTm93LmdldChpKTsKLQkJCQlpZiAoYWN0aXZlT25seSAmJiBidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBlbnN1cmUgdGhlcmUgaXMgYW4gZW50cnkgZm9yIHRoaXMgZGVzY3JpcHRvciAob3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlIHZpc2l0ZWQpCi0JCQkJaW50W10gZW50cnkgPSAoaW50W10pIGRlcGVuZGVudHMuZ2V0KGJ1bmRsZSk7Ci0JCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJCWRlcGVuZGVudHMucHV0KGJ1bmRsZSwgbmV3IGludFsxXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIE5vdyBwcm9jZXNzIHRoZSBwcm9jZXNzTm93IHRvIGZpbmQgdGhlIHJlcXVpcmVkcywgaW5jcmVtZW50IHRoZW0sIGFuZCBhZGQgdG8gcHJvY2Vzc05leHQgaWYgbmV2ZXIgZm91bmQgYmVmb3JlLgotCQl3aGlsZSAoIXByb2Nlc3NOb3cuaXNFbXB0eSgpKSB7Ci0JCQlwcm9jZXNzTmV4dC5jbGVhcigpOwotCQkJaW50IHBuU2l6ZSA9IHByb2Nlc3NOb3cuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwblNpemU7IGkrKykgewotCQkJCUJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKSBwcm9jZXNzTm93LmdldChpKTsKLQkJCQlpZiAoYWN0aXZlT25seSAmJiBidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKQotCQkJCQljb250aW51ZTsJCQkKLQkJCQlCdW5kbGVbXSByZXF1aXJlcyA9IGdldFByZXJlcXMoYnVuZGxlLCBwcmVyZXFzTWFwKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlcXVpcmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUJ1bmRsZSBwcmVyZXEgPSByZXF1aXJlc1tqXTsKLQkJCQkJaWYgKHByZXJlcSA9PSBudWxsIHx8IGFjdGl2ZU9ubHkKLQkJCQkJCQkmJiBidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWludFtdIGVudHJ5ID0gKGludFtdKSBkZXBlbmRlbnRzLmdldChwcmVyZXEpOwotCQkJCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJCQkJZGVwZW5kZW50cy5wdXQocHJlcmVxLCBuZXcgaW50W117MX0pOwotCQkJCQkJcHJvY2Vzc05leHQuYWRkKHByZXJlcSk7IC8vIE5ldmVyIHByb2Nlc3NlZCBiZWZvcmUsIHNvIHdlIGFkZCBpdCB0byB0aGUgbmV4dCBwcm9jZXNzIGxvb3AuCi0JCQkJCX0gZWxzZQotCQkJCQkJKytlbnRyeVswXTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIE5vdyBzd2FwIHRoZSBsaXN0cyBzbyB0aGF0IHdlIHByb2Nlc3NOZXh0IHdpbGwgYmUgbm93IGFuZCB2aXNhLXZlcnNhLgotCQkJTGlzdCB0ID0gcHJvY2Vzc05leHQ7Ci0JCQlwcm9jZXNzTmV4dCA9IHByb2Nlc3NOb3c7Ci0JCQlwcm9jZXNzTm93ID0gdDsKLQkJfQotCQlyZXR1cm4gZGVwZW5kZW50czsKLQl9Ci0JCQotCS8qKgotCSAqIEFkZCBhIHNodXRkb3duIGxpc3RlbmVyCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJveHlTaHV0ZG93bkxpc3RlbmVyKElQcm94eVBsdWdpblNodXRkb3duTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHNodXRkb3duTGlzdGVuZXJzID09IG51bGwpCi0JCQlzaHV0ZG93bkxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJc2h1dGRvd25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBzaHV0ZG93biBsaXN0ZW5lcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3h5U2h1dGRvd25MaXN0ZW5lcihJUHJveHlQbHVnaW5TaHV0ZG93bkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChzaHV0ZG93bkxpc3RlbmVycyAhPSBudWxsKQotCQkJc2h1dGRvd25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbkxpc3RlbmVyIGxhdW5jaExpc3RlbmVyID0gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxhdW5jaENvbmZpZ3VyYXRpb25BZGRlZChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCQl0cnkgewotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc1dvcmtpbmdDb3B5KCkgJiYgSVByb3h5Q29uc3RhbnRzLklEX1BST1hZX0xBVU5DSF9HUk9VUC5lcXVhbHMoY29uZmlndXJhdGlvbi5nZXRDYXRlZ29yeSgpKSkKLQkJCQkJc3RhcnRDbGVhbnVwSm9iKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGF1bmNoQ29uZmlndXJhdGlvbkNoYW5nZWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkJdHJ5IHsKLQkJCQlpZiAoIWNvbmZpZ3VyYXRpb24uaXNXb3JraW5nQ29weSgpICYmIElQcm94eUNvbnN0YW50cy5JRF9QUk9YWV9MQVVOQ0hfR1JPVVAuZXF1YWxzKGNvbmZpZ3VyYXRpb24uZ2V0Q2F0ZWdvcnkoKSkpCi0JCQkJCXN0YXJ0Q2xlYW51cEpvYigpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxhdW5jaENvbmZpZ3VyYXRpb25SZW1vdmVkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJCXRyeSB7Ci0JCQkJLy8gT24gZGVsZXRlIHlvdSBjYW4ndCB0ZWxsIHRoZSBjYXRlZ29yeSBvciBhbnl0aGluZyBiZWNhdXNlIGFsbCBvZiB0aGF0IGluZm8gaGFzIGFscmVhZHkgcmVtb3ZlZC4KLQkJCQlpZiAoIWNvbmZpZ3VyYXRpb24uaXNXb3JraW5nQ29weSgpKQotCQkJCQlzdGFydENsZWFudXBKb2IoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgSm9iIGNsZWFudXBKb2IgPSBuZXcgSm9iKFByb3h5TWVzc2FnZXMuUHJveHlQbHVnaW5fQ2xlYW51cERlZmF1bHRQcm94eUxhdW5jaENvbmZpZ3VyYXRpb25zKSB7IAotCQl7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7CS8vIFNvIGl0IGRvZXNuJ3Qgc2hvdyB1cCBpbiBwcm9ncmVzcyBtb25pdG9yLiBObyBuZWVkIHRvIGludGVycnVwdCB1c2VyLgotCQkJc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsJLy8gQSBxdWljayBydW5uaW5nIGpvYi4KLQkJfQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJCS8vIGFsbCB3ZSB3YW50IHRvIGRvIGlzIGZpbmQgb3V0IGlmIGFueSBsYXVuY2ggY29uZmlndXJhdGlvbnMgKGZyb20gcHJveHkgbGF1bmNoIGdyb3VwKSBleGlzdCBmb3IKLQkJCS8vIGEgcHJvamVjdC4gSWYgdGhleSBkb24ndCwgdGhlbiB1bnNldCB0aGUgcHJvamVjdCdzIHByb3BlcnR5LiBJZiB0aGV5IGRvLCBhbmQgdGhlIHByb3BlcnR5IGlzIG5vdAotCQkJLy8gc2V0LCB0aGVuIHNldCBpdCB0byBOT1RfU0VUIHRvIGluZGljYXRlIG5vdCBzZXQsIGJ1dCB0aGVyZSBhcmUgc29tZSBjb25maWdzIGZvciBpdC4KLQkJCS8vIFdlIGp1c3QgZ2F0aGVyIHRoZSBwcm9qZWN0IG5hbWVzIHRoYXQgaGF2ZSBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi0JCQl0cnkgewotCQkJCVNldCBwcm9qZWN0TmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCUlMYXVuY2hDb25maWd1cmF0aW9uW10gY29uZmlncyA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKElQcm94eUNvbnN0YW50cy5JRF9QUk9YWV9MQVVOQ0hfR1JPVVAuZXF1YWxzKGNvbmZpZ3NbaV0uZ2V0Q2F0ZWdvcnkoKSkKLQkJCQkJCSYmIChQcm94eUxhdW5jaFN1cHBvcnQuQVRUUl9QUklWQVRFID09IG51bGwgfHwgIWNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKFByb3h5TGF1bmNoU3VwcG9ydC5BVFRSX1BSSVZBVEUsIGZhbHNlKSkpCi0JCQkJCQlwcm9qZWN0TmFtZXMuYWRkKGNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCUlKYXZhTW9kZWwgbW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBtb2RlbC5nZXRDaGlsZHJlbigpOwotCQkJCWludCBjYW5jZWxDb3VudCA9IDEwOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKGNoaWxkcmVuW2pdLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCQkJaWYgKC0tY2FuY2VsQ291bnQgPD0gMCkKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJCQkJY2FuY2VsQ291bnQgPSAxMDsJLy8gUmVzdCBmb3IgbmV4dCBzZXQgb2YgdGVuLgotCQkJCQkJCQkvLyBDaGVja2luZyBvbiBldmVyeSAxMCBwcm9qZWN0cyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1hbnkgcHJvamVjdHMsIHdoaWxlIG9ubHkgZmV3IGNvbmZpZ3MuCi0JCQkJCQkJCS8vIFRoaXMgd2F5IGl0IHdpbGwgc3RvcCBzb29uZXIuCi0JCQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQlJUHJvamVjdCBwID0gKChJSmF2YVByb2plY3QpIGNoaWxkcmVuW2pdKS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQlpZiAocHJvamVjdE5hbWVzLmNvbnRhaW5zKHAuZ2V0TmFtZSgpKSkgewotCQkJCQkJCS8vIFRoaXMgcHJvamVjdCBoYXMgYSBsYXVuY2ggY29uZmlnLiBJZiBpdCBoYXMgYSBzZXR0aW5nLCB0aGVuIGRvIG5vdGhpbmcsIGVsc2UgbmVlZCB0byBwdXQgb24gbm90IHNldC4gCi0JCQkJCQkJaWYgKHAuZ2V0UGVyc2lzdGVudFByb3BlcnR5KFByb3h5UGx1Z2luLlBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OKSA9PSBudWxsKQotCQkJCQkJCQlwLmdldFByb2plY3QoKS5zZXRQZXJzaXN0ZW50UHJvcGVydHkoCi0JCQkJCQkJCQlQcm94eVBsdWdpbi5QUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTiwKLQkJCQkJCQkJCVByb3h5TGF1bmNoU3VwcG9ydC5OT1RfU0VUKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gVGhpcyBwcm9qZWN0IGhhcyBubyBsYXVuY2ggY29uZmlncy4gUmVtb3ZlIGFueSBzZXR0aW5nIGlmIGl0IGV4aXN0cy4KLQkJCQkJCQlwLnNldFBlcnNpc3RlbnRQcm9wZXJ0eShQcm94eVBsdWdpbi5QUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTiwgKFN0cmluZykgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Q2xlYW51cEpvYigpIHsKLQkJY2xlYW51cEpvYi5jYW5jZWwoKTsJLy8gU3RvcCB3aGF0IHdlIGFyZSBkb2luZy4KLQkJY2xlYW51cEpvYi5zY2hlZHVsZSgxMDAwbCk7CS8vIFNjaGVkdWxlIHRvIHN0YXJ0IGluIG9uZSBzZWNvbmQuCi0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5hZGRMYXVuY2hDb25maWd1cmF0aW9uTGlzdGVuZXIobGF1bmNoTGlzdGVuZXIpOwotCQljb250ZXh0LmFkZEJ1bmRsZUxpc3RlbmVyKG5ldyBCdW5kbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGJ1bmRsZUNoYW5nZWQoQnVuZGxlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0QnVuZGxlKCkgIT0gUHJveHlQbHVnaW4udGhpcy5nZXRCdW5kbGUoKSkKLQkJCQkJcmV0dXJuOwkvLyBOb3Qgb2YgaW50ZXJlc3QgdG8gdXMuCi0JCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCQkJY2FzZSBCdW5kbGVFdmVudC5TVEFSVEVEOgotCQkJCQkJY29udGV4dC5yZW1vdmVCdW5kbGVMaXN0ZW5lcih0aGlzKTsJLy8gU2luY2Ugd2UgZG9uJ3QgY2FyZSBhbnltb3JlCi0JCQkJCQlzdGFydENsZWFudXBKb2IoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEJ1bmRsZUV2ZW50LlNUT1BQRUQ6Ci0JCQkJCWNhc2UgQnVuZGxlRXZlbnQuVU5JTlNUQUxMRUQ6Ci0JCQkJCWNhc2UgQnVuZGxlRXZlbnQuVU5SRVNPTFZFRDoKLQkJCQkJCWNvbnRleHQucmVtb3ZlQnVuZGxlTGlzdGVuZXIodGhpcyk7CS8vIFdlIHN0b3BwZWQgYmVmb3JlIHdlIHN0YXJ0ZWQsIHNvIHJlbW92ZSBvdXJzZWx2ZXMuCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlnZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldERlZmF1bHQoUFJFRkVSRU5DRVNfVk1fTk9WRVJJRllfS0VZLCB0cnVlKTsKLQl9Ci0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBIYW5kbGUgY2FzZSB3aGVyZSBkZWJ1ZyBwbHVnaW4gc2h1dHMgZG93biBiZWZvcmUgd2UgZG8gc2luY2Ugb3JkZXIgbm90IGd1YXJlbnRlZWQuCi0JCWlmIChEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkgIT0gbnVsbCkKLQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCkucmVtb3ZlTGF1bmNoQ29uZmlndXJhdGlvbkxpc3RlbmVyKGxhdW5jaExpc3RlbmVyKTsKLQkJY2xlYW51cEpvYi5jYW5jZWwoKTsJLy8gU3RvcCB3aGF0IHdlIGFyZSBkb2luZy4JCQotCQlpZiAoc2h1dGRvd25MaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gc2h1dGRvd25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSVByb3h5UGx1Z2luU2h1dGRvd25MaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5zaHV0ZG93bigpOwotCQkJfQotCQl9CQkKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ09ORklHVVJBVElPTl9DT05UUklCVVRJT05fRVhURU5TSU9OX1BPSU5UID0gIm9yZy5lY2xpcHNlLmplbS5wcm94eS5jb250cmlidXRvcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfRVhURU5TSU9OX1JFR0lTVFJBVElPTl9FWFRFTlNJT05fUE9JTlQgPSAib3JnLmVjbGlwc2UuamVtLnByb3h5LmV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ09OVEFJTkVSID0gImNvbnRhaW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9QTFVHSU4gPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1JFR0lTVFJZX1RZUEUgPSAicmVnaXN0cnlUeXBlIjsJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIHBsdWdpblJlcXVpcmVkTWFwID0gbmV3IEhhc2hNYXAoNTApOwotCQotCS8qCi0JICogUHJvY2Vzc2VkIGV4dGVuc2lvbiBwb2ludCBpbmZvIGZvciBjb250cmlidXRvcnMuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvIGNvbnRyaWJ1dGlvbnM7Ci0JCQotCS8qCi0JICogUHJvY2Vzc2VkIGV4dGVuc2lvbiBwb2ludCBpbmZvIGZvciByZWdpc3RyeSBleHRlbnNpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb250cmlidXRvckV4dGVuc2lvblBvaW50SW5mbyBleHRlbnNpb25zOwotCi0KLQkvKioKLQkgKiBUaGVzZSBhcmUgcHVibGljIG9ubHkgc28gdGhhdCBqZW0udWkgY2FuIGFjY2VzcyB0aGlzIGNvbnN0YW50LiBOb3QgbWVhbnQgdG8gYmUgYWNjZXNzZWQgYnkgb3RoZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTiA9IG5ldyBRdWFsaWZpZWROYW1lKCJvcmcuZWNsaXBzZS5qZW0ucHJveHkiLCAicHJveHlMYXVuY2hDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Z2luIG9yZGVyZWQgYXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGNvbnRyaWJ1dGVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXJpZCB0aGUgZmlyc3Qgc2VnbWVudCBvZiBhbGwgb2YgdGhlIGNvbnRhaW5lciBwYXRocyBpcyB0aGUgY29udGFpbmVyIGlkLgotCSAqIEBwYXJhbSBjb250YWluZXJQYXRocyBhcnJheSBvZiBjb250YWluZXIgcGF0aHMgdG8gbWF0Y2ggYWdhaW5zdCBmb3IgY29udHJpYnV0aW9ucy4gVGhlIHBhdGhzIG11c3QgYWxsIGJlIG9mIHRoZSBzYW1lIGNvbnRhaW5lciBpZC4KLQkgKiBAcmV0dXJuIEFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q29udGFpbmVyQ29uZmlndXJhdGlvbnMoU3RyaW5nIGNvbnRhaW5lcmlkLCBTdHJpbmdbXSBjb250YWluZXJQYXRocykgewotCQlpZiAoY29udHJpYnV0aW9ucyA9PSBudWxsKQotCQkJcHJvY2Vzc1Byb3h5Q29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgY29udHJpYnV0aW9ucy5jb250YWluZXJQYXRoQ29udHJpYnV0aW9ucy5nZXRDb250cmlidXRvcnMoY29udGFpbmVyaWQsIGNvbnRhaW5lclBhdGhzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBsdWdpbiBvcmRlcmVkIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgZm9yIHRoZSBnaXZlbiBwbHVnaW4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBjb250cmlidXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luaWQKLQkgKiBAcmV0dXJuIEFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBwbHVnaW4gaGFzIG5vIGNvbnRyaWJ1dGlvbnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRQbHVnaW5Db25maWd1cmF0aW9ucyhTdHJpbmcgcGx1Z2luaWQpIHsKLQkJaWYgKGNvbnRyaWJ1dGlvbnMgPT0gbnVsbCkKLQkJCXByb2Nlc3NQcm94eUNvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KCk7Ci0JCXJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pIGNvbnRyaWJ1dGlvbnMucGx1Z2luVG9Db250cmlidXRpb25zLmdldChwbHVnaW5pZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gb3JkZXJlZCBhcnJheSBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgY29udHJpYnV0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcmlkIHRoZSBmaXJzdCBzZWdtZW50IG9mIGFsbCBvZiB0aGUgY29udGFpbmVyIHBhdGhzIGlzIHRoZSBjb250YWluZXIgaWQuCi0JICogQHBhcmFtIGNvbnRhaW5lclBhdGhzIGFycmF5IG9mIGNvbnRhaW5lciBwYXRocyB0byBtYXRjaCBhZ2FpbnN0IGZvciBjb250cmlidXRpb25zLiBUaGUgcGF0aHMgbXVzdCBhbGwgYmUgb2YgdGhlIHNhbWUgY29udGFpbmVyIGlkLgotCSAqIEByZXR1cm4gQXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbnRhaW5lckV4dGVuc2lvbnMoU3RyaW5nIGNvbnRhaW5lcmlkLCBTdHJpbmdbXSBjb250YWluZXJQYXRocykgewotCQlpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJcHJvY2Vzc1Byb3h5RXh0ZW5zaW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgZXh0ZW5zaW9ucy5jb250YWluZXJQYXRoQ29udHJpYnV0aW9ucy5nZXRDb250cmlidXRvcnMoY29udGFpbmVyaWQsIGNvbnRhaW5lclBhdGhzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBsdWdpbiBvcmRlcmVkIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgZm9yIHRoZSBnaXZlbiBwbHVnaW4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBjb250cmlidXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luaWQKLQkgKiBAcmV0dXJuIEFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBwbHVnaW4gaGFzIG5vIGNvbnRyaWJ1dGlvbnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRQbHVnaW5FeHRlbnNpb25zKFN0cmluZyBwbHVnaW5pZCkgewotCQlpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJcHJvY2Vzc1Byb3h5RXh0ZW5zaW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgZXh0ZW5zaW9ucy5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnMuZ2V0KHBsdWdpbmlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcHJvY2Vzc1Byb3h5Q29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCWNvbnRyaWJ1dGlvbnMgPSBwcm9jZXNzQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoUElfQ09ORklHVVJBVElPTl9DT05UUklCVVRJT05fRVhURU5TSU9OX1BPSU5UKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHByb2Nlc3NQcm94eUV4dGVuc2lvbkV4dGVuc2lvblBvaW50KCkgewotCQlleHRlbnNpb25zID0gcHJvY2Vzc0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KFBJX0VYVEVOU0lPTl9SRUdJU1RSQVRJT05fRVhURU5TSU9OX1BPSU5UKTsKLQl9CQotCQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGV4dGVuc2lvbiBwb2ludCBsb29raW5nIGNvbnRyaWJ1dG9ycy4gSXQgd2lsbCBmaW5kIGVudHJpZXMgdGhhdCBoYXZlIHRoZSAiY29udGFpbmVyIiBvciAicGx1Z2luIiBhdHRyaWJ1dGVzCi0JICogc2V0IG9uIHRoZW0uCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50IGZ1bGx5LXF1YWxpZmllZCBleHRlbnNpb24gcG9pbnQgaWQsIGluY2x1ZGluZyBwbHVnaW4gaWQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkgKiBAcmV0dXJuIHRoZSBjb250cmlidXRvciBpbmZvIHJlY29yZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvIHByb2Nlc3NDb250cmlidXRpb25FeHRlbnNpb25Qb2ludChTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsJCi0JCS8vIFdlIGFyZSBwcm9jZXNzaW5nIHRoaXMgb25jZSBiZWNhdXNlIGl0IGlzIGFjY2Vzc2VkIG9mdGVuIChvbmNlIHBlciB2bSBwZXIgcHJvamVjdCkuCi0JCS8vIFRoaXMgY2FuIGFkZCB1cCBzbyB3ZSBnZXQgaXQgdG9nZXRoZXIgb25jZSBoZXJlLgotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0cCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoZXh0ZW5zaW9uUG9pbnQpOwotCQlDb250cmlidXRvckV4dGVuc2lvblBvaW50SW5mbyByZXN1bHQgPSBuZXcgQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8oKTsKLQkJcmVzdWx0LmNvbnRhaW5lclBhdGhDb250cmlidXRpb25zID0gbmV3IENvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nKElDb25maWd1cmF0aW9uRWxlbWVudC5jbGFzcyk7Ci0JCWlmIChleHRwID09IG51bGwpIHsKLQkJCXJlc3VsdC5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dHAuZ2V0RXh0ZW5zaW9ucygpOwotCQlpZiAoZXh0ZW5zaW9ucy5sZW5ndGggPiAwKSB7Ci0JCQkvLyBOZWVkIHRvIGJlIGluIHBsdWdpbiBvcmRlciBzbyB0aGF0IGZpcnN0IG9uZXMgcHJvY2Vzc2VkIGhhdmUgbm8gZGVwZW5kZW5jaWVzIG9uIG90aGVycy4KLQkJCS8vIEdhdGhlciBpbiBleHRlbnNpb24gb3JkZXIuCi0JCQkvLyBXZSB3YW50IHRoZSBsaXN0IGluIHJldmVyc2Ugb3JkZXIgb2YgZm91bmQgZXh0ZW5zaW9ucyBmb3IgYSBidW5kbGUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gdHJ5Ci0JCQkvLyB0byBnZXQgbGVhdmVzIG9yZGVyZWQgaW4gdGhlIG9yZGVyIGZvdW5kIGZyb20gdGhlIGV4dGVuc2lvbiBsaXN0LiBTaW5jZSB0aGUgb3JkZXJQbHVnaW5zIGFjdHVhbGx5Ci0JCQkvLyByZXZlcnNlcyB0aGUgbGVhZiBvcmRlciwgaG9wZWZ1bGx5IHRoaXMgd2lsbCBzZXQgaXQgYmFjayB0byB3aGF0IHdlIHdhbnQgYXQgdGhlIGVuZC4KLQkJCUhhc2hNYXAgYnVuZGxlc1RvRXh0ZW5zaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwKGV4dGVuc2lvbnMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSBleHRlbnNpb25zLmxlbmd0aC0xOyBpID49IDA7IGktLSkgewotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZXh0ZW5zaW9uc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dCA9IChJRXh0ZW5zaW9uW10pIGJ1bmRsZXNUb0V4dGVuc2lvbnMuZ2V0KGJ1bmRsZSk7Ci0JCQkJaWYgKGV4dCA9PSBudWxsKQotCQkJCQlidW5kbGVzVG9FeHRlbnNpb25zLnB1dChidW5kbGUsIG5ldyBJRXh0ZW5zaW9uW10geyBleHRlbnNpb25zW2ldfSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIE1vcmUgdGhhbiBvbmUgZXh0ZW5zaW9uIGRlZmluZWQgaW4gdGhpcyBwbHVnaW4uCi0JCQkJCUlFeHRlbnNpb25bXSBuZXdFeHQgPSBuZXcgSUV4dGVuc2lvbltleHQubGVuZ3RoICsgMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZXh0LCAwLCBuZXdFeHQsIDAsIGV4dC5sZW5ndGgpOwotCQkJCQluZXdFeHRbbmV3RXh0Lmxlbmd0aCAtIDFdID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJYnVuZGxlc1RvRXh0ZW5zaW9ucy5wdXQoYnVuZGxlLCBuZXdFeHQpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gTm93IG9yZGVyIHRoZW0gc28gd2UgcHJvY2VzcyBpbiByZXF1aXJlZCBvcmRlci4KLQkJCUJ1bmRsZVtdIG9yZGVyZWQgPSBQcm94eVBsdWdpbi5vcmRlclBsdWdpbnMoYnVuZGxlc1RvRXh0ZW5zaW9ucy5rZXlTZXQoKSk7Ci0JCQlNYXAgcGF0dGVyblN0cmluZ1RvSURfUGF0dGVybiA9IG5ldyBIYXNoTWFwKCk7IC8vIE1hcCBvZiBzdHJpbmcgcGF0dGVybnMgdG8gdGhlIHtjb250YWluZXIgaWQsIGNvbXBpbGVkIHBhdHRlcm59LiBUaGlzIHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGNvbXBpbGVkIHBhdHRlcm4gZXZlcnl3aGVyZS4KLQkJCXJlc3VsdC5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnMgPSBuZXcgSGFzaE1hcChvcmRlcmVkLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9yZGVyZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0cyA9IChJRXh0ZW5zaW9uW10pIGJ1bmRsZXNUb0V4dGVuc2lvbnMuZ2V0KG9yZGVyZWRbaV0pOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdzID0gZXh0c1tqXS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJLy8gVGVjaG5pY2FsbHkgd2UgZXhwZWN0IHRoZSBjb25maWcgZWxlbWVudHMgdG8gaGF2ZSBhIG5hbWUgb2YgImNvbnRyaWJ1dG9yIiwgYnV0IHNpbmNlIHRoYXQKLQkJCQkJLy8gaXMgYWxsIHRoYXQgY2FuIGJlIHRoZXJlLCB3ZSB3aWxsIGlnbm9yZSBpdC4gVGhlIGNvbnRlbnQgaXMgd2hhdCBpcyBpbXBvcnRhbnQuCi0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY29uZmlncy5sZW5ndGg7IGsrKykgewotCQkJCQkJU3RyaW5nIGNvbnRhaW5lclBhdHRlcm4gPSBjb25maWdzW2tdLmdldEF0dHJpYnV0ZUFzSXMoUElfQ09OVEFJTkVSKTsKLQkJCQkJCWlmIChjb250YWluZXJQYXR0ZXJuICE9IG51bGwpIHsKLQkJCQkJCQlPYmplY3RbXSBpZF9QYXR0ZXJuID0gKE9iamVjdFtdKSBwYXR0ZXJuU3RyaW5nVG9JRF9QYXR0ZXJuLmdldChjb250YWluZXJQYXR0ZXJuKTsKLQkJCQkJCQlpZiAoaWRfUGF0dGVybiA9PSBudWxsKSB7Ci0JCQkJCQkJCWludCBzbGFzaCA9IGNvbnRhaW5lclBhdHRlcm4uaW5kZXhPZignLycpOwotCQkJCQkJCQlTdHJpbmcgY29udGFpbmVySUQgPSBzbGFzaCAhPSAtMSA/IGNvbnRhaW5lclBhdHRlcm4uc3Vic3RyaW5nKDAsIHNsYXNoKSA6IGNvbnRhaW5lclBhdHRlcm47Ci0JCQkJCQkJCS8vIFRoZSBwYXR0ZXJuIGJlY29tZXMgZm9yIHRoZSBjb250YWluZXJQYXR0ZXJuICJTV1RfQ09OVEFJTkVSIiBiZWNvbWVzICJTV1RfQ09OVEFJTkVSKC8uKikqIi4gVGhpcwotCQkJCQkJCQkvLyBtZWFucyB0byBtYXRjaCB0aGUgc3RyaW5nIG11c3Qgc3RhcnQgd2l0aCAiU1dUX0NPTlRBSU5FUiIgYW5kIGl0IG11c3QgaGF2ZSBlaXRoZXIgbm90aGluZyBhZnRlciB0aGlzCi0JCQkJCQkJCS8vIG9yIGl0IG11c3QgaGF2ZSBhICIvIiBhbmQgYW55IGNoYXJhY3RlcnMgYWZ0ZXIgdGhhdC4gU28gdGhpcyBtZWFucyBpdCB3aWxsIG5vdCBtYXRjaCAiU1dUX0NPTlRBSU5FUlhaIgotCQkJCQkJCQkvLyBidXQgaXQgd2lsbCBtYXRjaCAiU1dUX0NPTlRBSU5FUi9YWVoiLgotCQkJCQkJCQlpZF9QYXR0ZXJuID0gbmV3IE9iamVjdFtdIHsgY29udGFpbmVySUQsIFBhdHRlcm4uY29tcGlsZShjb250YWluZXJQYXR0ZXJuICsgIigvLiopKiIpfTsKLQkJCQkJCQkJcGF0dGVyblN0cmluZ1RvSURfUGF0dGVybi5wdXQoY29udGFpbmVyUGF0dGVybiwgaWRfUGF0dGVybik7Ci0JCQkJCQkJfQotCQkJCQkJCXJlc3VsdC5jb250YWluZXJQYXRoQ29udHJpYnV0aW9ucy5hZGRDb250cmlidXRpb24oKFN0cmluZykgaWRfUGF0dGVyblswXSwgKFBhdHRlcm4pIGlkX1BhdHRlcm5bMV0sIGNvbmZpZ3Nba10pOwotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgcGx1Z2luID0gY29uZmlnc1trXS5nZXRBdHRyaWJ1dGVBc0lzKFBJX1BMVUdJTik7Ci0JCQkJCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGNvbnRyaWJ1dGlvbnMgPSAoTGlzdCkgcmVzdWx0LnBsdWdpblRvQ29udHJpYnV0aW9ucy5nZXQocGx1Z2luKTsKLQkJCQkJCQlpZiAoY29udHJpYnV0aW9ucyA9PSBudWxsKSB7Ci0JCQkJCQkJCWNvbnRyaWJ1dGlvbnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJCQkJCQlyZXN1bHQucGx1Z2luVG9Db250cmlidXRpb25zLnB1dChwbHVnaW4sIGNvbnRyaWJ1dGlvbnMpOwotCQkJCQkJCX0KLQkJCQkJCQljb250cmlidXRpb25zLmFkZChjb25maWdzW2tdKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gRmluYWxpemUgdGhlIG1hcHBpbmdzIGZvciBib3RoIGNvbnRhaW5lciBwYXRocyBhbmQgcGx1Z2lucy4KLQkJCXJlc3VsdC5jb250YWluZXJQYXRoQ29udHJpYnV0aW9ucy5maW5hbGl6ZU1hcHBpbmcoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3VsdC5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQllbnRyeS5zZXRWYWx1ZSgoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnRvQXJyYXkobmV3IElDb25maWd1cmF0aW9uRWxlbWVudFsoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnNpemUoKV0pKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlyZXN1bHQucGx1Z2luVG9Db250cmlidXRpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBUaGUgcmVzdWx0IG9mIHRoZSB7QGxpbmsgUHJveHlQbHVnaW4jZ2V0SURzRm91bmQoSUphdmFQcm9qZWN0KX0uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGb3VuZElEcyB7Ci0JCQotCQkvKioKLQkJICogTWFwIG9mIChjb250YWluZXJJZHMoU3RyaW5nKS0+e0BsaW5rIENvbnRhaW5lclBhdGhzfSkgb2YgY29udGFpbmVycyBjbGFzc3BhdGhzIGZvdW5kIGluIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBNYXAgY29udGFpbmVySWRzID0gbmV3IEhhc2hNYXAoMik7Ci0JCQotCQkvKioKLQkJICogTWFwIG9mIChjb250YWluZXJzKHtAbGluayBJQ2xhc3NwYXRoQ29udGFpbmVyfSktPkJvb2xlYW4pIG9mIGNvbnRhaW5lcnMgZm91bmQgaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguIFRoZSB2YWx1ZSB3aWxsIGJlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250YWluZXIgaXMgdmlzaWJsZSB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqLwotCQlwdWJsaWMgTWFwIGNvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcCgyKTsKLQkJCi0JCS8qKgotCQkgKiBNYXAgb2YgKHBsdWdpbklkcyhTdHJpbmcpLT5Cb29sZWFuKSBvZiBwbHVnaW4gaWRzIGZvdW5kIGluIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoIGlmIHRoZSBwcm9qZWN0IGlzIGEgcGx1Z2luIHByb2plY3QuIFRoZSB2YWx1ZSB3aWxsIGJlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwbHVnaW4gaXMgdmlzaWJsZSB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqLwotCQlwdWJsaWMgTWFwIHBsdWdpbklkczsKLQkJCi0JCS8qKgotCQkgKiBNYXAgb2YgKHByb2plY3RzKHtAbGluayBJUGF0aH0tPkJvb2xlYW4pIG9mIHByb2plY3QgZm91bmQgaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguIFRoZSB2YWx1ZSB3aWxsIGJlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGlzIHZpc2libGUgdG8gdGhlIHRvcC1sZXZlbCBwcm9qZWN0LgotCQkgKi8KLQkJcHVibGljIE1hcCBwcm9qZWN0cyA9IG5ldyBIYXNoTWFwKDIpOwotCQkKLQkJRm91bmRJRHMoKSB7Ci0JCQkvLyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBGb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdCwgcmV0dXJuIHRoZSBtYXBzIG9mIGZvdW5kIGlkcy4KLQkgKgotCSAqIEBwYXJhbSBqcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIGZvdW5kIGlkcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgRm91bmRJRHMgZ2V0SURzRm91bmQoSUphdmFQcm9qZWN0IGpwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsJCQotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGpwcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOwotCQlGb3VuZElEcyBmb3VuZElEcyA9IG5ldyBGb3VuZElEcygpOwotCQlmb3VuZElEcy5wcm9qZWN0cy5wdXQocHJvamVjdFBhdGgsIEJvb2xlYW4uVFJVRSk7CQkKLQkJZXhwYW5kUHJvamVjdChwcm9qZWN0UGF0aCwgZm91bmRJRHMsIHRydWUsIHRydWUpOwotCQkKLQkJLy8gVGhlIGNvbnRhaW5lcklkcyB2YWx1ZXMgd2lsbCBhY3R1YWxseSBiZSBhbiBNYXBbXSB7TWFwKHZpc2libGVJUGF0aC0+cGF0aFN0cmluZyksIE1hcChoaWRkZW5JUGF0aC0+cGF0aFN0cmluZyl9LiBOZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBDb250YWluZXJQYXRocyBub3cKLQkJLy8gdGhhdCB3ZSBhcmUgZG9uZS4KLQkJZm9yIChJdGVyYXRvciBpdHIgPSBmb3VuZElEcy5jb250YWluZXJJZHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdHIubmV4dCgpOwotCQkJTWFwW10gdmFsdWUgPSAoTWFwW10pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQllbnRyeS5zZXRWYWx1ZShuZXcgQ29udGFpbmVyUGF0aHMoKFN0cmluZykgZW50cnkuZ2V0S2V5KCksIChTdHJpbmdbXSkgdmFsdWVbMF0udmFsdWVzKCkudG9BcnJheShuZXcgU3RyaW5nW3ZhbHVlWzBdLnNpemUoKV0pLCAoU3RyaW5nW10pIHZhbHVlWzFdLnZhbHVlcygpLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZVsxXS5zaXplKCldKSkpOwotCQl9Ci0JCQotCQlpZiAoZm91bmRJRHMucGx1Z2luSWRzID09IG51bGwpCi0JCQlmb3VuZElEcy5wbHVnaW5JZHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCQotCQlmb3VuZElEcy5wcm9qZWN0cy5yZW1vdmUocHJvamVjdFBhdGgpOwkvLyBEb24ndCBuZWVkIHRvIGluY2x1ZGUgaXRzZWxmIG5vdywgd2FzIG5lZWRlZCBmb3IgdGVzdGluZyBzbyBpZiBjaXJ1Y2xhciB3ZSBkb24ndCBnZXQgaW50byBhIGxvb3AuCi0JCWlmIChmb3VuZElEcy5wcm9qZWN0cy5pc0VtcHR5KCkpCi0JCQlmb3VuZElEcy5wcm9qZWN0cyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJCi0JCXJldHVybiBmb3VuZElEczsKLQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBKUkVfQ09OVEFJTkVSX1BBVEggPSBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKTsKLQkKLQkvKgotCSAqIFRoZSBwYXNzZWQgaW4gdmlzaWJsZSBmbGFnIHRlbGxzIGlmIHRoaXMgcHJvamVjdCBpcyB2aXNpYmxlIGFuZCBpdHMgY29udGVudHMgYXJlIHZpc2libGUgaWYgdGhleSBhcmUgZXhwb3J0ZWQuCi0JICogT25seSBleGNlcHRpb24gaXMgaWYgZmlyc3QgaXMgdHJ1ZSwgdGhlbiBhbGwgY29udGVudHMgYXJlIHZpc2libGUgdG8gdGhlIHRvcCBsZXZlbCBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBleHBhbmRQcm9qZWN0KElQYXRoIHByb2plY3RQYXRoLCBGb3VuZElEcyBmb3VuZElkcywgYm9vbGVhbiB2aXNpYmxlLCBib29sZWFuIGZpcnN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwcm9qZWN0UGF0aC5sYXN0U2VnbWVudCgpKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmV0dXJuOwkvLyBOb3QgZXhpc3Qgc28gZG9uJ3QgZGVsdmUgaW50byBpdC4KLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSAoSUphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShyZXMpOwotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmV4aXN0cygpIHx8ICFwcm9qZWN0LmdldFByb2plY3QoKS5pc09wZW4oKSkKLQkJCXJldHVybjsJLy8gTm90IGV4aXN0IGFzIGEgamF2YSBwcm9qZWN0IG9yIG5vdCBvcGVuLCBzbyBkb24ndCBkZWx2ZSBpbnRvIGl0LgotCi0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlCb29sZWFuIGN1cnJlbnRGbGFnID0gbnVsbDsJLy8gQ3VycmVudCBzZXR0aW5nIHZhbHVlLgotCQkJYm9vbGVhbiBuZXdGbGFnOwkvLyBUaGUgbmV3IHNldHRpbmcgdmFsdWUuIAotCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOgotCQkJCQkvLyBGb3JjZSB0cnVlIGlmIGFscmVhZHkgdHJ1ZSwgb3IgdGhpcyBpcyB0aGUgZmlyc3QgcHJvamVjdCwgb3IgdGhpcyBwcm9qZWN0IGlzIHZpc2libGUgYW5kIHRoZSBlbnRyeSBpcyBleHBvcnRlZC4gVGhlc2Ugb3ZlcnJpZGUgYSBwcmV2aW91cyBmYWxzZS4KLQkJCQkJY3VycmVudEZsYWcgPSAoQm9vbGVhbikgZm91bmRJZHMucHJvamVjdHMuZ2V0KGVudHJ5LmdldFBhdGgoKSk7Ci0JCQkJCW5ld0ZsYWcgPSAoY3VycmVudEZsYWcgIT0gbnVsbCAmJiBjdXJyZW50RmxhZy5ib29sZWFuVmFsdWUoKSkgfHwgZmlyc3QgfHwgKHZpc2libGUgJiYgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJaWYgKGN1cnJlbnRGbGFnID09IG51bGwgfHwgY3VycmVudEZsYWcuYm9vbGVhblZhbHVlKCkgIT0gbmV3RmxhZykKLQkJCQkJCWZvdW5kSWRzLnByb2plY3RzLnB1dChlbnRyeS5nZXRQYXRoKCksICBuZXdGbGFnID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSApOwotCQkJCQlpZiAoY3VycmVudEZsYWcgPT0gbnVsbCkKLQkJCQkJCWV4cGFuZFByb2plY3QoZW50cnkuZ2V0UGF0aCgpLCBmb3VuZElkcywgdmlzaWJsZSAmJiBlbnRyeS5pc0V4cG9ydGVkKCksIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoKLQkJCQkJaWYgKCFmaXJzdCAmJiBKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwkvLyBUaGUgZmlyc3QgcHJvamVjdCBkZXRlcm1pbmVzIHRoZSBKUkUsIHNvIGFueSBzdWJzZXF1ZW50IG9uZXMgY2FuIGJlIGlnbm9yZWQuCi0JCQkJCU1hcFtdIHBhdGhzID0gKE1hcFtdKSBmb3VuZElkcy5jb250YWluZXJJZHMuZ2V0KGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKTsKLQkJCQkJaWYgKHBhdGhzID09IG51bGwpIHsKLQkJCQkJCXBhdGhzID0gbmV3IE1hcFtdIHtuZXcgSGFzaE1hcCgyKSwgbmV3IEhhc2hNYXAoMil9OwotCQkJCQkJZm91bmRJZHMuY29udGFpbmVySWRzLnB1dChlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSwgcGF0aHMpOwotCQkJCQl9Ci0JCQkJCWN1cnJlbnRGbGFnID0gbnVsbDsKLQkJCQkJaWYgKHBhdGhzWzBdLmNvbnRhaW5zS2V5KGVudHJ5LmdldFBhdGgoKSkpCi0JCQkJCQljdXJyZW50RmxhZyA9IEJvb2xlYW4uVFJVRTsKLQkJCQkJZWxzZSBpZiAocGF0aHNbMV0uY29udGFpbnNLZXkoZW50cnkuZ2V0UGF0aCgpKSkKLQkJCQkJCWN1cnJlbnRGbGFnID0gQm9vbGVhbi5GQUxTRTsKLQkJCQkJbmV3RmxhZyA9IChjdXJyZW50RmxhZyAhPSBudWxsICYmIGN1cnJlbnRGbGFnLmJvb2xlYW5WYWx1ZSgpKSB8fCBmaXJzdCB8fCAodmlzaWJsZSAmJiBlbnRyeS5pc0V4cG9ydGVkKCkpOwkJCQkJCi0JCQkJCWlmIChjdXJyZW50RmxhZyA9PSBudWxsIHx8IGN1cnJlbnRGbGFnLmJvb2xlYW5WYWx1ZSgpICE9IG5ld0ZsYWcpIHsKLQkJCQkJCWlmIChuZXdGbGFnKSB7Ci0JCQkJCQkJLy8gSXQgaXMgdmlzaWJsZSwgcmVtb3ZlIGZyb20gaGlkZGVuLCBpZiB0aGVyZSwgYW5kIGFkZCB0byB2aXNpYmxlLgotCQkJCQkJCXBhdGhzWzFdLnJlbW92ZShlbnRyeS5nZXRQYXRoKCkpOwotCQkJCQkJCXBhdGhzWzBdLnB1dChlbnRyeS5nZXRQYXRoKCksIGVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gSXQgaXMgaGlkZGVuLCByZW1vdmUgZnJvbSB2aXNpYmxlLCBpZiB0aGVyZSwgYW5kIGFkZCB0byBoaWRkZW4uCi0JCQkJCQkJcGF0aHNbMF0ucmVtb3ZlKGVudHJ5LmdldFBhdGgoKSk7Ci0JCQkJCQkJcGF0aHNbMV0ucHV0KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoZW50cnkuZ2V0UGF0aCgpLCBwcm9qZWN0KTsKLQkJCQkJLy8gRm9yY2UgdHJ1ZSBpZiBhbHJlYWR5IHRydWUsIG9yIHRoaXMgaXMgdGhlIGZpcnN0IHByb2plY3QsIG9yIHRoaXMgcHJvamVjdCBpcyB2aXNpYmxlIGFuZCB0aGUgZW50cnkgaXMgZXhwb3J0ZWQuIFRoZXNlIG92ZXJyaWRlIGEgcHJldmlvdXMgZmFsc2UuCi0JCQkJCWN1cnJlbnRGbGFnID0gKEJvb2xlYW4pIGZvdW5kSWRzLmNvbnRhaW5lcnMuZ2V0KGNvbnRhaW5lcik7Ci0JCQkJCW5ld0ZsYWcgPSAoY3VycmVudEZsYWcgIT0gbnVsbCAmJiBjdXJyZW50RmxhZy5ib29sZWFuVmFsdWUoKSkgfHwgZmlyc3QgfHwgKHZpc2libGUgJiYgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJaWYgKGN1cnJlbnRGbGFnID09IG51bGwgfHwgY3VycmVudEZsYWcuYm9vbGVhblZhbHVlKCkgIT0gbmV3RmxhZykJCQkJCQotCQkJCQkJZm91bmRJZHMuY29udGFpbmVycy5wdXQoY29udGFpbmVyLCAgbmV3RmxhZyA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UgKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotCQkJCQkvLyBXZSBvbmx5IGNhcmUgYWJvdXQgSlJFX0xJQi4gSWYgd2UgaGF2ZSB0aGF0LCB0aGVuIHdlIHdpbGwgdHJlYXQgaXQgYXMgSlJFX0NPTlRBSU5FUi4gT25seQotCQkJCQkvLyBjYXJlIGFib3V0IGZpcnN0IHByb2plY3QgdG9vLCBiZWNhdXNlIHRoZSBmaXJzdCBwcm9qZWN0IGlzIHRoZSBvbmUgdGhhdCBkZXRlcm1pbmVzIHRoZSBKUkUgdHlwZS4KLQkJCQkJaWYgKGZpcnN0ICYmIEphdmFSdW50aW1lLkpSRUxJQl9WQVJJQUJMRS5lcXVhbHMoZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhdGhzID0gKE1hcFtdKSBmb3VuZElkcy5jb250YWluZXJJZHMuZ2V0KEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpOwotCQkJCQkJaWYgKHBhdGhzID09IG51bGwpIHsKLQkJCQkJCQlwYXRocyA9IG5ldyBNYXBbXSB7bmV3IEhhc2hNYXAoMiksIG5ldyBIYXNoTWFwKDIpfTsKLQkJCQkJCQlmb3VuZElkcy5jb250YWluZXJJZHMucHV0KEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIsIHBhdGhzKTsKLQkJCQkJCX0KLQkJCQkJCWN1cnJlbnRGbGFnID0gbnVsbDsKLQkJCQkJCWlmIChwYXRoc1swXS5jb250YWluc0tleShKUkVfQ09OVEFJTkVSX1BBVEgpKQotCQkJCQkJCWN1cnJlbnRGbGFnID0gQm9vbGVhbi5UUlVFOwotCQkJCQkJZWxzZSBpZiAocGF0aHNbMV0uY29udGFpbnNLZXkoSlJFX0NPTlRBSU5FUl9QQVRIKSkKLQkJCQkJCQljdXJyZW50RmxhZyA9IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQluZXdGbGFnID0gKGN1cnJlbnRGbGFnICE9IG51bGwgJiYgY3VycmVudEZsYWcuYm9vbGVhblZhbHVlKCkpIHx8IGZpcnN0IHx8ICh2aXNpYmxlICYmIGVudHJ5LmlzRXhwb3J0ZWQoKSk7CQkJCQkKLQkJCQkJCWlmIChjdXJyZW50RmxhZyA9PSBudWxsIHx8IGN1cnJlbnRGbGFnLmJvb2xlYW5WYWx1ZSgpICE9IG5ld0ZsYWcpIHsKLQkJCQkJCQlpZiAobmV3RmxhZykgewotCQkJCQkJCQkvLyBJdCBpcyB2aXNpYmxlLCByZW1vdmUgZnJvbSBoaWRkZW4sIGlmIHRoZXJlLCBhbmQgYWRkIHRvIHZpc2libGUuCi0JCQkJCQkJCXBhdGhzWzFdLnJlbW92ZShKUkVfQ09OVEFJTkVSX1BBVEgpOwotCQkJCQkJCQlwYXRoc1swXS5wdXQoSlJFX0NPTlRBSU5FUl9QQVRILCBKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBJdCBpcyBoaWRkZW4sIHJlbW92ZSBmcm9tIHZpc2libGUsIGlmIHRoZXJlLCBhbmQgYWRkIHRvIGhpZGRlbi4KLQkJCQkJCQkJcGF0aHNbMF0ucmVtb3ZlKEpSRV9DT05UQUlORVJfUEFUSCk7Ci0JCQkJCQkJCXBhdGhzWzFdLnB1dChKUkVfQ09OVEFJTkVSX1BBVEgsIEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQkJCi0JCQotCQlmaW5kUGx1Z2lucyhmb3VuZElkcywgdmlzaWJsZSwgZmlyc3QsIHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kIHRoZSBwbHVnaW5zIHRoYXQgdGhlIGdpdmVuIHByb2plY3QgcmVmZXJlbmNlcywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCi0JICogPHA+Ci0JICogVGhlIG1hcCB3aWxsIGJlIG9mIHBsdWdpbiBpZHMgdG8gYSBCb29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5Cb29sZWFuVFJVRTwvY29kZT4sCi0JICogdGhlbiB0aGUgcGx1Z2luIGlzIHZpc2libGUgdG8gdGhlIGdpdmVuIHByb2plY3QuIHRoZSB2aXNpYmxlIGFuZCBmaXJzdCBmbGFncwotCSAqIHdpbGwgbW9kaWZ5IHRoaXMuIElmIGZpcnN0IGlzIHRydWUsIHRoZW4gYWxsIGRpcmVjdCBwbHVnaW5zIHdpbGwgYmUgdmlzaWJsZSwKLQkgKiBlbHNlIG9ubHkgZXhwb3J0ZWQgcGx1Z2lucyB3aWxsIGJlIHZpc2libGUuIElmIHZpc2libGUgaXMgZmFsc2UgYW5kIGZpcnN0IGlzIGZhbHNlLCB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyLCBhbGwgb2YgdGhlCi0JICogcGx1Z2lucyB3aWxsIG5vdCBiZSB2aXNpYmxlLiAKLQkgKiA8cD4KLQkgKiBWaXNpYmxlIG1lYW5zIHRoYXQgY2xhc3NlcyBpbiB0aGUgcGx1Z2luIGNhbiBiZSByZWZlcmVuY2VkIGRpcmVjdGx5IGZyb20gY29kZS4gTm90IHZpc2libGUKLQkgKiBtZWFucyB0aGF0IHRoZXkgY2FuIG9ubHkgYmUgcmVmZXJlbmNlZCBmcm9tIHNvbWUgb3RoZXIgcGx1Z2luIGluIHRoZSBsaXN0LiBJbiBvdGhlciB3b3JkcywKLQkgKiB2aXNpYmxlIG9uZXMgY2FuIGJlIGRpcmVjdGx5IHJlZmVyZW5jZWQsIGJ1dCBpbnZpc2libGUgb25lcyBjYW4gb25seSBiZSByZWZlcmVuY2VkIGZyb20KLQkgKiBwbHVnaW5zIHRoYXQgY2FuIHNlZSBpdC4KLQkgKiA8cD4KLQkgKiBGb3IgbW9zdCB1c2VzLCBmaXJzdCBhbmQgdmlzaWJsZSBzaG91bGQgYmUgdHJ1ZS4gVGhlbiBpdCB3aWxsIHRyZWF0IHRoZSBwcm9qZWN0IGFzIHRoZSB0b3BsZXZlbAotCSAqIHByb2plY3QgYW5kIHdpbGwgcmV0dXJuIHRydWUgZm9yIHRob3NlIHRoYXQgYXJlIHZpc2libGUgdG8gaXQsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotCSAqIFRoZXNlIGZsYWdzIHdlcmUgYWRkZWQgZm9yIG1vcmUgc3BlY2lhbCBjYXNlcyB3aGVyZSBtYXkgYmUgY2FsbGluZyBvbiBhIHByb2plY3QgdGhhdCBpcyBkZWVwZXIKLQkgKiBkb3duIGluIHRoZSBjbGFzc3BhdGggd2VyZSB2aXNpYmlsdHkgaGFzIGFscmVhZHkgYmVlbiBkZWNpZGVkLgotCSAqIDxwPgotCSAqIE5vdGU6IFBERSBtdXN0IGJlIGluc3RhbGxlZCBmb3IgdGhpcyB0byByZXR1cm4gYW55dGhpbmcsIG90aGVyd2lzZSBpdCB3aWxsIGxlYXZlCi0JICogdGhlIG1hcCBhbG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZm91bmRJZHMgZm91bmRJZHMgc3RydWN0dXJlIHRvIGdldCBwbHVnaW4gaW5mbyBmcm9tLgotCSAqIEBwYXJhbSB2aXNpYmxlIDxjb2RlPnRydWU8L2NvZGU+IG1lYW5zIHRoaXMgcHJvamVjdCBpcyB2aXNpYmxlLCBzbyBhbnkgcGx1Z2lucyB2aXNpYmxlIHRvIGl0IHdpbGwgYmUgdmlzaWJsZSwgZWxzZSBub25lIHdpbGwgYmUgdmlzaWJsZS4KLQkgKiBAcGFyYW0gZmlyc3QgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyB0aGUgdG9wIHByb2plY3Qgb2YgaW50ZXJlc3QuIFRoaXMgbWVhbnMgdGhhdCBhbGwgcGx1Z2lucyB3aXRoaW4gdGhlIHByb2plY3QgYXJlIHZpc2libGUuIEVsc2Ugb25seSBleHBvcnRlZCBwcm9qZWN0cyB3aWxsIGJlIHZpc2libGUuCi0JICogQHBhcmFtIHByb2plY3QgcHJvamVjdCB0byBzdGFydCBsb29raW5nIGZyb20KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5kUGx1Z2lucyhGb3VuZElEcyBmb3VuZElkcywgYm9vbGVhbiB2aXNpYmxlLCBib29sZWFuIGZpcnN0LCBJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJLy8gVG8gcHJldmVudCB1bm5lY2Vzc2FyeSBsb2FkaW5nIG9mIHRoZSBQREUgcGx1Z2luLCBmaW5kIHRoZSBwbHVnaW5zIG9ubHkgaWYgdGhpcyBwcm9qZWN0IGlzIGEgUERFIHBsdWdpbiBwcm9qZWN0LgotCQkJaWYgKGlzUERFUHJvamVjdChwcm9qZWN0KSkgewotCQkJCUlQREVQcm9jZXNzRm9yUGx1Z2luIHBkZXByb2Nlc3MgPSBnZXRQREVQcm9jZXNzRm9yUGx1Z2luKCk7Ci0JCQkJaWYgKHBkZXByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQlpZiAoZm91bmRJZHMucGx1Z2luSWRzID09IG51bGwpCi0JCQkJCQlmb3VuZElkcy5wbHVnaW5JZHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlwZGVwcm9jZXNzLmZpbmRQbHVnaW5zKHByb2plY3QsIGZvdW5kSWRzLCB2aXNpYmxlLCBmaXJzdCk7IC8vIGV4cGFuZCB0aGUgcGx1Z2lucyBmb3IgdGhpcyBwcm9qZWN0LCBpZiBhbnkuCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBQbHVnaW4gcHJvamVjdCBvciBmYWxzZSBpZiBub3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQREVQcm9qZWN0KElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwcm9qZWN0LmdldFByb2plY3QoKS5oYXNOYXR1cmUoUERFX05BVFVSRV9JRCk7Ci0JfQotCi0KLQkvKgotCSAqIEludGVyZmFjZSBmb3IgcHJvY2Vzc2luZyBQbHVnaW5zLiBVc2VkIHdoZW4gUERFIHBsdWdpbiBpcyBwcmVzZW50IGluIHRoZSBpbnN0YWxsYXRpb24uIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCWludGVyZmFjZSBJUERFUHJvY2Vzc0ZvclBsdWdpbiB7Ci0KLQkJLyoKLQkJICogR28gdGhyb3VnaCB0aGUgcHJvamVjdCBhbmQgZmluZCBhbGwgb2YgdGhlIHBsdWdpbnMgaXQgcmVmZXJlbmNlcywgZWl0aGVyIGRpcmVjdGx5IG9yIHRocm91Z2gKLQkJICogdGhlIHJlZmVyZW5jZWQgcGx1Z2lucywgYW5kIG1hcmsgdGhlbSBhcyB2aXNpYmxlIG9yIG5vdC4KLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbmRQbHVnaW5zKElKYXZhUHJvamVjdCBwcm9qZWN0LCBGb3VuZElEcyBmb3VuZElkcywgYm9vbGVhbiB2aXNpYmxlLCBib29sZWFuIGZpcnN0KTsKLQl9Ci0JCi0JLyoKLQkgKiBUcnkgdG8gZ2V0IHRoZSBwZGUgcHJvY2VzcyBmb3IgcGx1Z2luLiBJZiBhbHJlYWR5IHRyaWVkIG9uY2UgYW5kIG5vdCBmb3VuZCwgdGhlbiBmb3JnZXQgaXQuCi0JICogPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIFBERUNvbnRyaWJ1dGVDbGFzc3BhdGggbmVlZHMgaXQgdG9vLgotCSAqLwotCXByaXZhdGUgSVBERVByb2Nlc3NGb3JQbHVnaW4gcGRlUHJvY2Vzc0ZvclBsdWdpbjsKLQlwcml2YXRlIGJvb2xlYW4gdHJpZWRQREVQcm9jZXNzOwotCUlQREVQcm9jZXNzRm9yUGx1Z2luIGdldFBERVByb2Nlc3NGb3JQbHVnaW4oKSB7Ci0JCWlmICghdHJpZWRQREVQcm9jZXNzKSB7Ci0JCQl0cmllZFBERVByb2Nlc3MgPSB0cnVlOwotCQkJaWYgKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UucGRlLmNvcmUiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlDbGFzcyBjbGFzc1BERVByb2Nlc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5QREVQcm9jZXNzRm9yUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcGRlUHJvY2Vzc0ZvclBsdWdpbiA9IChJUERFUHJvY2Vzc0ZvclBsdWdpbikgY2xhc3NQREVQcm9jZXNzLm5ld0luc3RhbmNlKCk7Ci0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIE5vdCBmb3VuZCwgZG8gbm90aGluZy4KLQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQlnZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwZGVQcm9jZXNzRm9yUGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHRyaWVzIHRvIGZpbmQgYSBqYXIgaW4gdGhlIGJ1bmRsZSBzcGVjaWZpZWQsIGFuZCB0aGUgYXR0YWNoZWQgc291cmNlIHVzaW5nIHRoZQotCSAqIFBERSBzb3VyY2UgbG9jYXRpb24gZXh0ZW5zaW9uIHBvaW50LiBUaGUgamFyIG11c3QgZXhpc3QgZm9yIHNvdXJjZSB0byBiZSBhdHRhY2hhYmxlLgotCSAqIFRoZSBzb3VyY2UgbXVzdCBiZSBpbiB0aGUgc3RhbmRhcmQgUERFIHNvdXJjZSBwbHVnaW4uIEkuZS4gaXQgbXVzdCBiZSBpbiBhIGRpcmVjdG9yeQotCSAqIG9mIHRoZSBuYW1lICJidW5kbGVuYW1lX2J1bmRsZXZlcnNpb24iLCBhbmQgaW4gdGhlIHNhbWUgcGF0aCBmcm9tIHRoZXJlIGFzIGluIHRoZQotCSAqIGphciwgcGx1cyB0aGUgbmFtZSBtdXN0IGJlICJqYXJuYW1lc3JjLnppcCIuCi0JICogPHA+Ci0JICogVGhlIHJldHVybmVkIFVSTCdzIHdpbGwgbm90IGJlIFBsYXRmb3JtLnJlc29sdmUoKS4gVGhleSB3aWxsIGJlIGluIGZvcm0gcmV0dXJuZWQgZnJvbQotCSAqIFBsYXRmb3JtLmZpbmQoKS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlIGJ1bmRsZSB0byBzZWFyY2gsIHdpbGwgc2VhcmNoIGZyYWdtZW50cyB0b28uCi0JICogQHBhcmFtIGZpbGVwYXRoIGZpbGVwYXRoIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGJ1bmRsZS9mcmFnbWVudCB3aGVyZSB0aGUgamFyIHdpbGwgYmUgZm91bmQuIAotCSAqIEByZXR1cm4gdHdvIFVSTCdzLiBbMF0gaXMgdGhlIFVSTCB0byB0aGUgamFyLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQsIFsyXSBpcyB0aGUgVVJMIHRvIHRoZSBzb3VyY2UgemlwLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFVSTFtdIGZpbmRQbHVnaW5KYXJBbmRBdHRhY2hlZFNvdXJjZShCdW5kbGUgYnVuZGxlLCBJUGF0aCBmaWxlcGF0aCkgewotCQkvLyBUaGlzIGlzIGEgYml0IGtsdWRneSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgdG8gZmluZCB0aGUgZmlsZSBmaXJzdCwgYW5kIHRoZW4gZ2V0IHRoZSByb290IHVybCBvZiB0aGUgYnVuZGxlL2ZyYWdtZW50Ci0JCS8vIHRoYXQgbWF0Y2hlcyB0aGUgZm91bmQgZmlsZS4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdW5kZXIgdGhlIHNvdXJjZS4gRnJvbSB0aGVyZQotCQkvLyBhbGwgb2YgdGhlIHNvdXJjZSBleHRlbnNpb25zIHdpbGwgYmUgc2VhcmNoZWQgZm9yIHRoZSBzb3VyY2UgemlwIGZpbGUuCi0JCS8vIFRoaXMgaXMgYXNzdW1pbmcgdGhhdCBmaW5kIHJldHVybnMgYSB1cmwgd2hlcmUgdGhlIGZpbGUgcGFydCBvZiB0aGUgdXJsIGlzIGEgc3RhbmRhcmQgcGF0aCBhbmQgZG9lc24ndCBoYXZlCi0JCS8vIHRoaW5ncyBsaWtlIHNwZWNpYWwgY2hhcnMgdG8gaW5kaWNhdGUgd2l0aGluIGEgamFyLiBUaGF0IHdvdWxkIGFwcGVhciB3aGVuIGl0IGlzIHJlc29sdmVkLCBidXQgSSB0aGluayB0aGF0IHRoZQotCQkvLyB1bnJlc29sdmVkIG9uZXMgZnJvbSBmaW5kIGFyZSB0eXBpY2FsbHkgImphcmJ1bmRsZTovL25ubi9wYXRoIiBvciBzb21ldGhpbmcgbGlrZSB0aGF0LiBUaGlzIGlzIGEgZ3JheSBhcmVhLgotCQlVUkwgamFyVVJMID0gUGxhdGZvcm0uZmluZChidW5kbGUsIGZpbGVwYXRoKTsKLQkJaWYgKGphclVSTCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBVUkxbMl07Ci0JCQotCQkvLyBGb3VuZCBpdCwgc28gbGV0J3MgdHJ5IHRvIGZpbmQgd2hpY2ggYnVuZGxlL2ZyYWdtZW50IGl0IHdhcyBmb3VuZCBpbi4KLQkJU3RyaW5nIGphclN0cmluZyA9IGphclVSTC50b0V4dGVybmFsRm9ybSgpOwotCQkvLyBGaXJzdCB0aGUgYnVuZGxlIGl0c2VsZi4KLQkJU3RyaW5nIGluc3RhbGxMb2MgPSBidW5kbGUuZ2V0RW50cnkoIi8iKS50b0V4dGVybmFsRm9ybSgpOyAvLyROT04tTkxTLTEkCi0JCVVSTCBzb3VyY2VVUkwgPSBudWxsOwotCQlpZiAoamFyU3RyaW5nLnN0YXJ0c1dpdGgoaW5zdGFsbExvYykpCi0JCQlzb3VyY2VVUkwgPSBnZXRTcmNGcm9tKGJ1bmRsZSwgaW5zdGFsbExvYywgamFyU3RyaW5nKTsKLQkJZWxzZSB7Ci0JCQkvLyBOb3cgbG9vayBpbiB0aGUgZnJhZ21lbnRzLgotCQkJQnVuZGxlW10gZnJhZ3MgPSBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnN0YWxsTG9jID0gZnJhZ3NbaV0uZ2V0RW50cnkoIi8iKS50b0V4dGVybmFsRm9ybSgpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGphclN0cmluZy5zdGFydHNXaXRoKGluc3RhbGxMb2MpKSB7Ci0JCQkJCXNvdXJjZVVSTCA9IGdldFNyY0Zyb20oZnJhZ3NbaV0sIGluc3RhbGxMb2MsIGphclN0cmluZyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFVSTFtdIHtqYXJVUkwsIHNvdXJjZVVSTH07Ci0JfQotCQotCXByaXZhdGUgVVJMIGdldFNyY0Zyb20oQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGluc3RhbGxMb2MsIFN0cmluZyBqYXJTdHJpbmcpIHsKLQkJLy8gZm9ybWF0IG9mIHBhdGggaW4gYSBQREUgc291cmNlIHBsdWdpbiBpcyAodW5kZXIgdGhlICJzcmMiIGRpcmVjdG9yeSBmcm9tIHRoZSBleHRlbnNpb24gcG9pbnQpLAotCQkvLyAiYnVuZGxlbmFtZV9idW5kbGV2ZXJzaW9uL3BhdGhPZkphci9qYXJuYW1lc3JjLnppcCIuIEhvd2V2ZXIgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cKLQkJLy8gd2hpY2ggZXh0ZW5zaW9uIGhhcyB0aGUgc291cmNlIGluIGl0LCBzbyB3ZSBuZWVkIHRvIHNlYXJjaCB0aGVtIGFsbC4KLQkJCi0JCUlQYXRoIHNyY1BhdGggPSBuZXcgUGF0aChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkrIl8iKyAoU3RyaW5nKSBidW5kbGUuZ2V0SGVhZGVycygiIikuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgJE5PTi1OTFMtMiQKLQkJc3JjUGF0aCA9IHNyY1BhdGguYXBwZW5kKG5ldyBQYXRoKGphclN0cmluZy5zdWJzdHJpbmcoaW5zdGFsbExvYy5sZW5ndGgoKSkpKTsKLQkJaWYgKHNyY1BhdGguc2VnbWVudENvdW50KCkgPCAyKQotCQkJcmV0dXJuIG51bGw7CS8vIFNvbWV0aGluZyBpcyBub3QgcmlnaHQuIE5vIGphciBuYW1lLgotCQlzcmNQYXRoID0gc3JjUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7CS8vIFJlbW92ZSB0aGUgLmphci4KLQkJU3RyaW5nIGphck5hbWUgPSBzcmNQYXRoLmxhc3RTZWdtZW50KCk7CS8vIFRoaXMgc2hvdWxkIGJlIHRoZSBqYXIgbmFtZS4KLQkJc3JjUGF0aCA9IHNyY1BhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChqYXJOYW1lKyJzcmMuemlwIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIE5vdyBsb29rIHRocm91Z2ggYWxsIG9mIHRoZSBzcmMgZXh0ZW5zaW9ucy4gQ2FuJ3QgdGVsbCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGZyb20gYSBmcmFnbWVudCBvciBhIGJ1bmRsZSwgc28gd2UgbmVlZCB0bwotCQkvLyB1c2UgUGxhdGZvcm0uZmluZCgpIHRvIGxvb2sgaW4gdGhlIGJ1bmRsZSBhbmQgZnJhZ21lbnQuIFNvIHdlIG1heSBnZXQgYSBkdXAgc2VhcmNoIGlmIHRoZXJlIGlzIGEgZnJhZ21lbnQgc291cmNlIAotCQkvLyAoZm9yIGV4YW1wbGUgcGxhdGZvcm0gc291cmNlIGFuZCB3aW4zMiBwbGF0Zm9ybSBzb3VyY2UgKHdoaWNoIGlzIGEgZnJhZ21lbnQgb2YgcGxhdGZvcm0gc291cmNlKS4KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2VzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLnBkZS5jb3JlLnNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGF0aCBzcmNzcmNoID0gbmV3IFBhdGgoY2VzW2ldLmdldEF0dHJpYnV0ZUFzSXMoInBhdGgiKSkuYXBwZW5kKHNyY1BhdGgpOyAvLyROT04tTkxTLTEkCi0JCQlCdW5kbGUgc3JjQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGNlc1tpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQlVUkwgc3JjVXJsID0gUGxhdGZvcm0uZmluZChzcmNCdW5kbGUsIHNyY3NyY2gpOwotCQkJaWYgKHNyY1VybCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNyY1VybDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9UaHJvd2FibGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvVGhyb3dhYmxlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5YzVjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9UaHJvd2FibGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRocm93YWJsZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotCi0KLS8qKgotICogVGhpcyBpcyBhIHByb3h5IHdyYXBwZXIgZm9yIGFuIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24gb24gdGhlCi0gKiByZW1vdmUgVk0uIFRoZSBzdGFuZGFyZCBleGNlcHRpb24gbWV0aG9kcyByZWZlciB0byB0aGlzIHByb3h5LgotICogVG8gcmVmZXIgdG8gdGhlIHByb3hpZWQgZXhjZXB0aW9uIGl0c2VsZiwgdGhlIG1ldGhvZHMgZGVmaW5lZAotICogaW4gaGVyZSB3b3VsZCBiZSB1c2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGhyb3dhYmxlUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIGltcGxlbWVudHMgSUJlYW5Qcm94eSB7Ci0gICAvKioKLSAgICAqIENvbnN0cnVjdHMgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiB3aXRoIG5vIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4gCi0gICAgKi8KLSAgIHB1YmxpYyBUaHJvd2FibGVQcm94eSgpIHsKLQkJc3VwZXIoKTsKLSAgIH0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGNhdXNlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZVByb3h5KFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgVGhyb3dhYmxlUHJveHkoVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKGNhdXNlKTsKLQl9Ci0gICAvKioKLSAgICAqIENvbnN0cnVjdHMgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuIAotICAgICoKLSAgICAqIEBwYXJhbSAgIHMgICB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gICAgKi8KLSAgIHB1YmxpYyBUaHJvd2FibGVQcm94eShTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLSAgIH0KLQkKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3h5TG9jYWxpemVkTWVzc2FnZSgpOwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJveHlNZXNzYWdlKCk7Ci0JcHVibGljIGFic3RyYWN0IHZvaWQgcHJpbnRQcm94eVN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciB3cml0ZXIpOwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gc3RyZWFtKTsKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZSgpOwotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiUHJveHk6ICIgKyB0b0JlYW5TdHJpbmcoKTsJLy8kTk9OLU5MUzEkIC0gdG9TdHJpbmcncyBhcmVuJ3QgbmxzJ2VkLiAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvVUlSdW5uZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1VJUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTUwMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvVUlSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBVSVJ1bm5lci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0gCi0KLS8qKgotICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiBJVUlSdW5uZXIgdG8gcnVuIHRoZSBidWlsZCB1bmRlcgotICogSVByb2dyZXNzU2VydmljZSBjb250cm9sIGlmIGluIHRoZSBVSSB0aHJlYWQuCi0gKiAKLSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBzaG91bGQgb25seSBiZSB1c2VkIHdpdGhpbiBoZXJlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotY2xhc3MgVUlSdW5uZXIgaW1wbGVtZW50cyBJVUlSdW5uZXIgewotCQotCS8qCi0JICogU3BlY2lhbCBjbGFzcyB0aGF0IHRha2VzIGEgcHJvZ3Jlc3MgbW9uaXRvciAxIGFuZCBvbmx5IGhhbmRsZXMgaXNDYW5jZWxlZCBmcm9tIGl0LAotCSAqIGJ1dCBldmVyeXRoaW5nIGVsc2UgaXMgZm9yd2FyZGVkIHRvIHByb2dyZXNzIG1vbml0b3IgMi4gVGhpcyBhbGxvd3MgdGhlIHBtIHRoYXQKLQkgKiBpcyBzZW50IGludG8gaGFuZGxlQnVpbGQgdG8gc2lnbmFsIGEgY2FuY2VsIGV2ZW4gdGhvdWdoIHRoZSBwcm9ncmVzcyBzZXJ2aWNlCi0JICogc2VuZHMgaW4gaXRzIG93biBwbS4gCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVUlSdW5uZXJQcm9ncmVzc01vbml0b3IgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JXcmFwcGVyIHsKLQkJcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHBtY2FuY2VsOwotCQkKLQkJcHVibGljIFVJUnVubmVyUHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgcG1jYW5jZWwsIElQcm9ncmVzc01vbml0b3IgcG1tYWluKSB7Ci0JCQlzdXBlcihwbW1haW4pOwotCQkJdGhpcy5wbWNhbmNlbCA9IHBtY2FuY2VsOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJCXJldHVybiBwbWNhbmNlbC5pc0NhbmNlbGVkKCkgfHwgc3VwZXIuaXNDYW5jZWxlZCgpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3Ijc2V0Q2FuY2VsZWQoYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJCXN1cGVyLnNldENhbmNlbGVkKHZhbHVlKTsKLQkJCXBtY2FuY2VsLnNldENhbmNlbGVkKHZhbHVlKTsJLy8gQ2FuY2VsIGl0IHRvbyBub3cuCi0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVVJUnVubmVyI2hhbmRsZUJ1aWxkKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUJ1aWxkKGZpbmFsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpIHx8IERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCVByb3h5TGF1bmNoU3VwcG9ydC5ydW5CdWlsZChwbSk7Ci0JCX0gZWxzZSB7Ci0JCQlwbS5iZWdpblRhc2soIiIsIDEwMCk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5idXN5Q3Vyc29yV2hpbGUobmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJSVByb2dyZXNzTW9uaXRvciB1aXBtID0gbmV3IFVJUnVubmVyUHJvZ3Jlc3NNb25pdG9yKHBtLCBtb25pdG9yKTsgCi0JCQkJCQl0cnkgewotCQkJCQkJCVByb3h5TGF1bmNoU3VwcG9ydC5ydW5CdWlsZCh1aXBtKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQkJaWYgKHVpcG0uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJcG0uc2V0Q2FuY2VsZWQodHJ1ZSk7CS8vIE1ha2Ugc3VyZSB0aGF0IGNhbmNlbCBnb3QgdGhyb3VnaCAoY291bGQgb2YgY29tZSBmcm9tIG1vbml0b3IgaW5zdGVhZCkuCi0JCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCWlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJCQl0aHJvdyAoQ29yZUV4Y2VwdGlvbikgZS5nZXRDYXVzZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLmdldENhdXNlKCksIExldmVsLldBUk5JTkcpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIEl0IHdhcyBjYW5jZWxlZCwgbGF1bmNoIHdpbGwgYmUgY2FuY2VsZWQgdG9vLiBwbSBpcyBhbHJlYWR5IG1hcmtlZCBjYW5jZWxlZCBhbmQgY2FsbGVyIGNhbiBjaGVjayB0aGF0Ci0JCQl9Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlMDhjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkCi0jCi0KLQotCi0jCi0jIEV4Y2VwdGlvbiBNZXNzYWdlcy4gQWxsIG9mIHRoZXNlIG1lc3NhZ2VzIGFyZSB0aGUgdGV4dCBvZiBhbiBqYXZhIGV4Y2VwdGlvbi4KLSMKLVVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNjRFIFVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93bi4KLQotIyB7MH0gYW5kIHsxfSBhcmUgamF2YSBjbGFzc2VzIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi1DbGFzc0Nhc3RfRVhDX19JbmNvcnJlY3RUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDY1RSAiezB9IiBpcyBuZWl0aGVyIGEgc3ViY2xhc3Mgb2YsIG5vciBkb2VzIGl0IGltcGxlbWVudCwgY2xhc3MgInsxfSIuCi0KLSMgU3RhbmRhcmQgQmVhbiBQcm94eSBGYWN0b3J5IGFuZCBTdGFuZGFyZCBCZWFuIFR5cGUgUHJveHkgRmFjdG9yeSBhcmUgdGVybXMgaW4gYmVhbmluZm8uIFRoZXkgYXJlIHRoZQotIyBzdGFuZGFyZCAoaS5lLiBiYXNlKSBmYWN0b3JpZXMgZm9yIGJlYW5zIG9yIGJlYW4gdHlwZXMuIEJlYW4gdHlwZXMgYXJlIGphdmEgY2xhc3Nlcy4KLVByb3h5RmFjdG9yeV9FWENfX05vQmVhblByb3h5RmFjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNjZFIE5vIFN0YW5kYXJkIEJlYW4gUHJveHkgRmFjdG9yeSBoYXMgYmVlbiBzZXQuCi1Qcm94eUZhY3RvcnlfRVhDX19Ob0JlYW5UeXBlUHJveHlGYWN0b3J5ICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDY3RSBObyBTdGFuZGFyZCBCZWFuIFR5cGUgUHJveHkgRmFjdG9yeSBoYXMgYmVlbiBzZXQuCi0KLQotIyB7MH0gaXMgdGhlIHRpdGxlIG9mIGEgcHJvamVjdC4KLU5vdF9KYXZhX1Byb2plY3RfV0FSTl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNjhXIFByb2plY3QgInswfSIgaXMgbm90IGEgamF2YSBwcm9qZWN0LgotTm9fVk1fV0FSTl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA2OVcgUHJvamVjdCAiezB9IiBoYXMgbm8gSmF2YSBKUkUgZGVmaW5lZCB0byB1c2UgdG8gcnVuIHByb2dyYW1zIHdpdGhpbiB0aGlzIHByb2plY3QuCi1Ob19JbXBsZW1lbnRhdGlvbl9XQVJOXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDcwVyBDYW5ub3QgZmluZCBhIHByb3h5IGltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IgcHJvamVjdCAiezB9LiIKLQotUHJveHlMYXVuY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMYXVuY2hpbmcgTG9jYWwgUHJveHkgVk0KLVByb3h5V2FpdEZvckJ1aWxkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gV2FpdGluZyBmb3IgYnVpbGQgdG8gY29tcGxldGUKLUV4cHJlc3Npb25fSW5JbnZhbGlkU3RhdGVEdWVUb19FWENfICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNjJFIEV4cHJlc3Npb24gaXMgaW4gaW52YWxpZCBzdGF0ZSBkdWUgdG8gInswfSIKLUV4cHJlc3Npb25fSW5JbnZhbGlkU3RhdGVfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNjNFIEV4cHJlc3Npb24gaXMgaW4gaW52YWxpZCBzdGF0ZQotRXhwcmVzc2lvbl9UeXBlU2VudEluSW52YWxpZE9yZGVyX0VYQ18gICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE2NEUgRXhwcmVzc2lvbiB0eXBlIHNlbnQgaW4gaW52YWxpZCBvcmRlciwgcmVjZWl2ZWQ6IHswfSwgZXhwZWN0ZWQgezF9LgotRXhwcmVzc2lvbl9BcnJheVR5cGVOb3RBbkFycmF5X0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE2NUUgQXJyYXlUeXBlICJ7MH0iIGlzIG5vdCBhbiBhcnJheS4KLUV4cHJlc3Npb25fQ2Fubm90SGFuZGxlTm9SZWNlaXZlT25GaWVsZEFjY2Vzc19FWENfICAgICAgICAgID0gSVdBVjAxNjZFIEFjY2VzcyBieSBmaWVsZCBuYW1lICh7MH0pIChub3QgYnkgcHJveHkpIHJlcXVpcmVzIGEgcmVjZWl2ZXIuCi1FeHByZXNzaW9uX01ldGhvZHNOZWVkUmVjZWl2ZXJfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTY3RSBBY2Nlc3MgYnkgbWV0aG9kIG5hbWUgKHswfSkgKG5vdCBieSBwcm94eSkgcmVxdWlyZXMgYSByZWNlaXZlci4KLUV4cHJlc3Npb25fSW52YWxpZE1hcmtOZXN0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNjhFIEltcHJvcGVyIG5lc3Rpbmcgb2YgbWFyayBzdGF0ZW1lbnRzIGluIEV4cHJlc3Npb24uIFRyaWVkIHRvIHBvcCBvciBlbmRNYXJrIHRvIGJlZm9yZSBjdXJyZW50IG1hcmsuIFRyaWVkIHRvIGdvIHBhc3QgTWFyayMgezB9LgotRXhwcmVzc2lvbl9JbnZhbGlkUHJveHk9RXhwcmVzc2lvbiBQcm94eSBpcyBmb3IgYSBkaWZmZXJlbnQgZXhwcmVzc2lvbgotUHJveHlQbHVnaW5fQ2xlYW51cERlZmF1bHRQcm94eUxhdW5jaENvbmZpZ3VyYXRpb25zICAgICAgICAgPSBDbGVhbiB1cCBkZWZhdWx0IHByb3h5IGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLVByb3h5TGF1bmNoU3VwcG9ydF9SZWdpc3RyeUNvdWxkTm90U3RhcnRGb3JTb21lUmVhc29uX1dBUk5fID0gSVdBVjAxNjhXIFJlZ2lzdHJ5IGNvdWxkIG5vdCBiZSBzdGFydGVkIGZvciBzb21lIHJlYXNvbi4KLUV4cHJlc3Npb25fQ3JlYXRlUHJveHlSZWFzc2lnbm1lbnRFeHByZXNzaW9uX0ludmFsaWRGb3JSZWFzc2lnbm1lbnRfRVhDXz1JbnZhbGlkIGV4cHJlc3Npb24gdHlwZSBmb3IgcmVhc3NpZ25tZW50OiB7MH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0FtYmlndW91c01ldGhvZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODMyY2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDYvMTYgMTc6NDY6MTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uOwotIAotCi0vKioKLSAqIEFtYmlndW91cyBNZXRob2QgRXhjZXB0aW9uLiBJLkUuIFRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgdGhhdCBjb3VsZCBiZSB1c2VkLgotICovCi1wdWJsaWMgY2xhc3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MDg0MTM3NjEyMzQ0MzczMzgxTDsKLQlwdWJsaWMgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uKCkgewotCX0KLQlwdWJsaWMgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJc3VwZXIobXNnKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9Db21tYW5kRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0NvbW1hbmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4ODNmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0NvbW1hbmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IENvbW1hbmRFeGNlcHRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0vKioKLSAqIEFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBjb21tYW5kIHByb2Nlc3NpbmcuCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNTE5MjM4NTcxMTQ1NjgyNTE0TDsKLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGZFeGNlcHRpb25EYXRhOwotCQotCXB1YmxpYyBDb21tYW5kRXhjZXB0aW9uKCkgewotCQlmRXhjZXB0aW9uRGF0YSA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kRXhjZXB0aW9uKE9iamVjdCBkYXRhKSB7Ci0JCWZFeGNlcHRpb25EYXRhID0gZGF0YTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmRFeGNlcHRpb24oU3RyaW5nIG1zZywgT2JqZWN0IGRhdGEpIHsKLQkJc3VwZXIobXNnKTsKLQkJZkV4Y2VwdGlvbkRhdGEgPSBkYXRhOwotCX0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRFeGNlcHRpb25EYXRhKCkgewotCQlyZXR1cm4gZkV4Y2VwdGlvbkRhdGE7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUmVjb3ZlcmFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsJLy8gQnkgZGVmYXVsdCBDb21tYW5kIEV4Y2VwdGlvbnMgYXJlIG5vdCByZWNvdmVyYWJsZS4KLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9HZW5lcmljRXZlbnRRdWV1ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9HZW5lcmljRXZlbnRRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjhiYWE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vR2VuZXJpY0V2ZW50UXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlJAotICogICRSZXZpc2lvbiQgICREYXRlJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLS8qKgotICogQSBnZW5lcmljIGV2ZW50IHF1ZXVlLiBJdCBydW5zIG9uIGl0cyBvd24gdGhyZWFkIGFuZCB3aWxsIGV4ZWN1dGUgYW55IHF1ZXVlZCB1cCBydW5uYWJsZXMuCi0gKiA8cD4KLSAqIFdoZW4gYSBydW5uYWJsZSBpcyBhZGRlZCB0byB0aGUgcXVldWUsIHRoZSB0aHJlYWQgd2lsbCBiZSBub3RpZmllZC4gSWYgdGhlIHRocmVhZCBpcyBmcmVlIGl0IHdpbGwKLSAqIHJ1biB0aGUgcnVubmFibGUuIElmIGl0IGlzIG5vdCBmcmVlLCB0aGUgcnVubmFibGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuIFRoZSB0aHJlYWQgd2lsbCBwcm9jZXNzCi0gKiBhbGwgaW50ZXJ2ZW5pbmcgcnVubmFibGVzIGFuZCB0aGVuIGV4ZWN1dGUgdGhlIHJ1bm5hYmxlIGluIHNlcXVlbmNlIHdpdGggYWxsIG9mIHRoZSByZXN0LgotICogPHA+Ci0gKiBUaGlzIGlzIHVzZWQgd2hlbiB5b3UgY2FuJ3QgdXNlIHRoZSBzeXN0ZW0gd2lkZ2V0IChlLmcuIEFXVCBldmVudCBxdWV1ZSBvciBTV1QgYXN5bmNFeGVjKSBvciB3aGVuIHRoZQotICogcnVubmFibGUgbXVzdCBiZSBleGVjdXRlZCBvbiBhIG5vbi11aSB0aHJlYWQuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBJdCBpcyByZXF1aXJlZCB0aGF0IHtAbGluayAjY2xvc2UoKX0gYmUgY2FsbGVkIHNvIHRoYXQgcmVzb3VyY2VzIGFyZSBjbGVhcmVkIHVwLgotICogCi0gKiBAc2luY2UgMS4xLjAuMQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0V2ZW50UXVldWUgewotCQotCXByaXZhdGUgTGlua2VkTGlzdCBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQlwcml2YXRlIGNsYXNzIEV2ZW50VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHJpdmF0ZSBib29sZWFuIHJ1biA9IHRydWU7Ci0JCQotCQlwdWJsaWMgRXZlbnRUaHJlYWQoU3RyaW5nIHRpdGxlKSB7Ci0JCQlzdXBlcih0aXRsZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJc3luY2hyb25pemVkIChxdWV1ZSkgewotCQkJCXJ1biA9IGZhbHNlOwotCQkJCXF1ZXVlLmNsZWFyKCk7Ci0JCQkJcXVldWUubm90aWZ5QWxsKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBvc3RFdmVudChSdW5uYWJsZSBydW4pIHsKLQkJCWlmICghdGhpcy5pc0FsaXZlKCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFdmVudCBxdWV1ZSB0aHJlYWQgaXMgbm90IGV4ZWN1dGluZy4iKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplZCAocXVldWUpIHsKLQkJCQlpZiAocnVuICE9IG51bGwpCi0JCQkJCXF1ZXVlLmFkZExhc3QocnVuKTsKLQkJCQlxdWV1ZS5ub3RpZnlBbGwoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZTsKLQkJCQlzeW5jaHJvbml6ZWQgKHF1ZXVlKSB7Ci0JCQkJCXdoaWxlIChydW4gJiYgcXVldWUuaXNFbXB0eSgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXF1ZXVlLndhaXQoKTsKLQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXJ1bikKLQkJCQkJCXJldHVybjsJLy8gRG9uZS4KLQkJCQkJZWxzZSB7Ci0JCQkJCQlydW5uYWJsZSA9IChSdW5uYWJsZSkgcXVldWUucmVtb3ZlRmlyc3QoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXJ1bm5hYmxlID0gbnVsbDsJLy8gU2V0IHRoaXMgc28gdGhhdCB3ZSBkb24ndCBob2xkIG9udG8gcmVzb3VyY2VzIGluIHRoZSBydW5uYWJsZSB3aGlsZSB3YWl0aW5nIGZvciBuZXh0IHF1eS4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBFdmVudFRocmVhZCBldmVudFRocmVhZDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIHRpdGxlLiAoVGhpcyB0aXRsZSB3aWxsIGJlIHRoZSB0aXRsZSBvbiB0aGUgVGhyZWFkIGZvciB0aGUgcXVldWUpLgotCSAqIFRoZSB0aHJlYWQgd2lsbCBoYXZlIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBjdXJyZW50IHRocmVhZC4gCi0JICogQHBhcmFtIHF1ZXVlVGl0bGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyBHZW5lcmljRXZlbnRRdWV1ZShTdHJpbmcgcXVldWVUaXRsZSkgewotCQl0aGlzKHF1ZXVlVGl0bGUsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0UHJpb3JpdHkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGEgdGl0bGUuIChUaGlzIHRpdGxlIHdpbGwgYmUgdGhlIHRpdGxlIG9uIHRoZSBUaHJlYWQgZm9yIHRoZSBxdWV1ZSkuCi0JICogQW5kIGEgcHJpb3JpdHkgZm9yIHRoZSBldmVudCBxdWV1ZSdzIHByb2Nlc3NpbmcgdGhyZWFkLgotCSAqIEBwYXJhbSBxdWV1ZVRpdGxlCi0JICogQHBhcmFtIHByaW9yaXR5IHByaW9yaXR5IHRvIHVzZSBmb3IgZXZlbnQgcXVldWUncyB0aHJlYWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY0V2ZW50UXVldWUoU3RyaW5nIHF1ZXVlVGl0bGUsIGludCBwcmlvcml0eSkgewotCQlldmVudFRocmVhZCA9IG5ldyBFdmVudFRocmVhZChxdWV1ZVRpdGxlKTsKLQkJZXZlbnRUaHJlYWQuc2V0UHJpb3JpdHkocHJpb3JpdHkpOwotCQlzeW5jaHJvbml6ZWQocXVldWUpIHsKLQkJCWV2ZW50VGhyZWFkLnN0YXJ0KCk7Ci0JCQl0cnkgewotCQkJCXF1ZXVlLndhaXQoMTAwKTsJLy8gV2FpdCBmb3IgdGhyZWFkIHRvIHN0YXJ0LgotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDbG9zZSB0aGUgZXZlbnQgcXVldWUuIFRoaXMgd2lsbCBjbGVhciBvdXQgYW55IHBlbmRpbmcgZXZlbnRzLiBUaGV5IHdpbGwgbm90Ci0JICogYmUgZXhlY3V0ZWQuIAotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWV2ZW50VGhyZWFkLmNsb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFBvc3QgdGhlIGV2ZW50LgotCSAqIEBwYXJhbSBydW5uYWJsZSBydW5uYWJsZSB0byBleGVjdXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBraWNrLXN0YXJ0IHRoZSB0aHJlYWQgaWYgZm9yIHNvbWUgcmVhc29uIGl0IG1heSBiZSB3YWl0aW5nIGFuZCBpdCBzaG91bGRuJ3QgYmUuCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBldmVudCBxdWV1ZSB0aHJlYWQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQsIG9yIGVuZGVkIGZvciBzb21lIHNldmVyZSBlcnJvci4KLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RFdmVudChSdW5uYWJsZSBydW5uYWJsZSkgewotCQlldmVudFRocmVhZC5wb3N0RXZlbnQocnVubmFibGUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjRkN2U2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0vKgotICogICRSQ1NmaWxlOiBJQ2FsbGJhY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYW55IGNhbGxiYWNrLgotICogVGhlIGNhbGxiYWNrIHdpbGwgdXNlIHRoZSBJVk1DYWxsYmFja1NlcnZlciBwYXNzZWQgaW4gdG8KLSAqIGdldCBjYWxsYmFjayBoYW5kbGVycywgYW5kIHRoZSBpZCBwYXNzZWQgaW4gaXMKLSAqIHRvIGJlIHBhc3NlZCB0byB0aGVzZSBoYW5kbGVycy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2FsbGJhY2sgewotCQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNhbGxiYWNrKElWTUNhbGxiYWNrU2VydmVyIHZtU2VydmVyLCBpbnQgY2FsbGJhY2tJRCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JQ2FsbGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjdmZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JQ2FsbGJhY2tIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uOwotLyoKLSAqICAkUkNTZmlsZTogSUNhbGxiYWNrSGFuZGxlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGEgY2FsbGJhY2sgaGFuZGxlci4KLSAqIFVzZXJzIHdpbGwgdGFsayB0byB0aGlzIGludGVyZmFjZSB0byBwZXJmb3JtIAotICogY2FsbGJhY2tzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYWxsYmFja0hhbmRsZXIgewotCi0JLyoqCi0JICogQ2FsbGJhY2ssIGJ1dCBzZW5kIHRoZSBwYXJtIGFzIGFuIG9iamVjdCwgaWUuIGl0IG11c3QKLQkgKiBiZSBub3RoaW5nIGJ1dCBjb25zdGFudHMsIGUuZy4gU3RyaW5nLCBJbnRlZ2VyLCBvciBhbgotCSAqIGFycmF5IG9mIGNvbnN0YW50cy4gQ29uc3RhbnRzIHNob3VsZCBub3QgYmUgdGhpbmdzIGxpa2UKLQkgKiByZWd1bGFyIG9iamVjdHMuIFRoaXMgaXMgYmVjYXVzZSBvbmx5IHN0YW5kYXJkIGphdmEubGFuZwotCSAqIHR5cGUgY29uc3RhbnRzIGNhbiBiZSBhc3N1cmVkIHRvIGJlIGF2YWlsYWJsZSBvbiB0aGUgb3RoZXIKLQkgKiBjbGllbnQuIEFsc28geW91IGRvbid0IHdhbnQgdG8gc2VuZCBiaWcgb2JqZWN0cy4gSXQgbXVzdAotCSAqIGJlIGNvbnN0YW50cyB0aGF0IGRvbid0IG5lZWQgdG8gYmUgc2VudCBiYWNrIGZvciBhbnkgcmVhc29uCi0JICogc2luY2UgdGhlaXIgaWRlbnRpdHkgd2lsbCBiZSBsb3N0IGluIHRoZSB0cmFuc2Zlci4KLQkgKiA8cD4KLQkgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGlmIHRoZXJlIGFyZSBubyBwYXJtcyAoaS5lLiBpdCBpcyBudWxsKS4KLQkgKiA8cD4KLQkgKiBUbyBzZW5kIGJpZyBvYmplY3RzLCB1c2UgdGhlIGNhbGxiYWNrIHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gY2FsbGJhY2tJRAotCSAqIEBwYXJhbSBtc2dJRAotCSAqIEBwYXJhbSBwYXJtCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgSVZNQ2FsbGJhY2tTZXJ2ZXIjcmVxdWVzdFN0cmVhbShpbnQsIGludCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhbGxiYWNrQXNDb25zdGFudHMoaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCwgT2JqZWN0IHBhcm0pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGJhY2sgdG8gcmVnaXN0ZXJlZCBjbGllbnQuCi0JICogPHA+Ci0JICogIFRoZSBwYXJtcyBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFybXMsIG9yIGl0IGlzIGFuIGFycmF5IG9mIHBhcm1zLgotCSAqIFRoZSBwYXJtcwotCSAqICAgIHdpbGwgYmUgdHVybmVkIGludG8gcHJveGllcyBvbiB0aGUgY2xpZW50IHZtLiBTbyB0aGUgY2FsbGJhY2sKLQkgKiAgICB3aWxsIHJlY2lldmUgYW4gYXJyYXkgb2YgcHJveGllcyB0byB0aGUgdmFsdWVzIGluIHRoZSBwYXJtcy4KLQkgKiAgICBJZiBhbnkgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGFycmF5IGlzIGl0c2VsZiBhbiBhcnJheSwgYQotCSAqICAgIHByb3h5IHRvIHRoZSBhcnJheSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHNlbnQuIFRoZSBhcnJheSBpdHNlbGYKLQkgKiAgICB3aWxsIG5vdCBiZSBzZW50LgotCSAqIDxwPgotCSAqICAgIElmIGFuIGFycmF5IGVudHJ5IHNob3VsZCBnbyBhY3Jvc3MgYXMgYW4gYXJyYXkgb2YgcHJveGllcyBhbmQKLQkgKiAgICBub3QgYXMgb25lIHByb3h5IHRvIGFuIGFycmF5LCB0aGVuIHRoZSBlbnRyeSBuZWVkcyB0byBiZSBhbgotCSAqICAgIGluc3RhbmNlIG9mIHtAbGluayBJQ2FsbGJhY2tIYW5kbGVyLlRyYW5zbWl0YWJsZUFycmF5IHRyYW5zbWl0YWJsZUFycmF5fS4gVGhpcyB3aWxsIGZsYWcKLQkgKiAgICB0aGF0IGl0IHNob3VsZCB0cmFuc21pdCB0aGUgZW50aXJlIGVudHJ5IGFzIHByb3hpZXMuIFRoaXMgc2hvdWxkCi0JICogICAgYmUgdXNlZCBzcGFyaW5nbHksIG9ubHkgaWYgdGhlcmUgaXNuJ3QgbXVjaCBkYXRhIGluIHRoZSBhcnJheSBhbmQKLQkgKiAgICBhbGwgb2YgdGhlIGFycmF5IHdvdWxkIGJlIHVzZWQgb24gdGhlIGNsaWVudC4gVGhhdCB3YXkgdHJhbnNtaXR0aW5nCi0JICogICAgdGhlIGVudGlyZSBhcnJheSB3aWxsIGJlIGZhc3RlciB0aGFuIGFjY2Vzc2luZyBpbmRpdmlkdWFsIGNvbXBvbmVudHMuCi0JICogPHA+Ci0JICogSWYgdGhlIGFycmF5IGNvbnRhaW5zIG9ubHkgb25lIGVudHJ5IG9yIHRoZSBwYXJtIGl0c2VsZiBpcyBudWxsLCB0aGVuIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2sjY2FsbGVkQmFjayhpbnQsIElCZWFuUHJveHkpfQotCSAqIHdpbGwgYmUgY2FsbGVkLiBFbHNlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2sjY2FsbGVkQmFjayhpbnQsIE9iamVjdFtdKX0gd2lsbCBiZSBjYWxsZWQgd2l0aCBhbGwgb2YgdGhlIHBhcm1zCi0JICogdHVybmVkIGludG8gcHJveGllcyBhcyBtZW50aW9uZWQgaW4gdGhlIHByZXZpb3VzIHBhcmFncmFwaC4KLQkgKgotCSAqIEBwYXJhbSBjYWxsYmFja0lEIFRoZSBpZCBvZiB0aGUgY2FsbGJhY2suIFRoaXMgd2lsbCBiZSBnaXZlbgotCSAqICAgIHRvIHRoZSBjYWxsYmFjayB3aGVuIGl0IGlzIGNyZWF0ZWQsIGFuZCBpdCBtdXN0IHBhc3MKLQkgKiAgICBvbiB0byB0aGUgaGFuZGxlci4gVGhhdCB3YXkgaXQgaXMga25vdyB3aGljaCBjYWxsYmFjawotCSAqICAgIHRvIGNhbGwgb24gdGhlIGNsaWVudC4KLQkgKiBAcGFyYW0gbXNnSUQgVGhlIGlkIG9mIHRoZSBtZXNzYWdlIGZvciB0aGUgY2FsbGJhY2suIFRoaXMgaXMgYW4KLQkgKiAgICBhZ3JlZWQgdXBvbiBpZCBvZiB0aGUgZGV2ZWxvcGVycyBvZiB0aGUgY2FsbGJhY2sgb24gYm90aAotCSAqICAgIHNpZGVzLgotCSAqIEBwYXJhbSBwYXJtcyBOdWxsIGlmIG5vIHBhcm1zLCBvciBhbiBhcnJheSBvZiBvYmplY3RzIHRvIHNlbmQgdG8gdGhlIGNsaWVudCB2bS4gU2VlIHRoZSBjb21tZW50cyAKLQkgKiBhYm92ZSBmb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVyLgotCSAqIAotCSAqIEBzZWUgSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheQotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FsbGJhY2tXaXRoUGFybXMoaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCwgT2JqZWN0W10gcGFybXMpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQXJyYXkgd3JhcHBlciB0aGF0IHR1cm5zIGFuIGFycmF5IGZvciBwYXJhbWV0ZXJzIGludG8gYSB0cmFuc21pdHRhYmxlIGFycmF5LgotCSAqIAotCSAqIEBzZWUgSUNhbGxiYWNrSGFuZGxlciNjYWxsYmFja1dpdGhQYXJtcyhpbnQsIGludCwgT2JqZWN0W10pCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUcmFuc21pdGFibGVBcnJheSB7Ci0JCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBmQXJyYXk7Ci0JCXB1YmxpYyBUcmFuc21pdGFibGVBcnJheShPYmplY3RbXSBhcnJheSkgewotCQkJZkFycmF5ID0gYXJyYXk7Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGdldEFycmF5KCkgewotCQkJcmV0dXJuIGZBcnJheTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrUnVubmFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrUnVubmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0Yzc5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFja1J1bm5hYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJQ2FsbGJhY2tSdW5uYWJsZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLQotLyoqCi0gKiBVc2VycyB3b3VsZCBpbXBsZW1lbnQgdGhpcyBhcyBhIHJ1bm5hYmxlIHRvIAotICogc2VuZCBhIGNhbGxiYWNrIHJlcXVlc3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhbGxiYWNrUnVubmFibGUgewotCQotCS8qKgotCSAqIFRoZSBhY3R1YWwgcnVuIGNvZGUuCi0JICovCi0JcHVibGljIE9iamVjdCBydW4oSUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JQ29tbWFuZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmVlMzJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNvbW1hbmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IElDb21tYW5kRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBJQ29tbWFuZEV4Y2VwdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSVZNQ2FsbGJhY2tTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSVZNQ2FsbGJhY2tTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5MzQ5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lWTUNhbGxiYWNrU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0vKgotICogICRSQ1NmaWxlJAotICogICRSZXZpc2lvbiQgICREYXRlJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIHRoZSAKLSAqIFZNIGNhbGxiYWNrIFNlcnZlci4gSXQgd2lsbCBiZSBnaXZlbiB0byBhbgotICogSUNhbGxiYWNrIHNvIHRoYXQgdGhlIGNhbGxiYWNrIGNhbiBhY2Nlc3MKLSAqIHRoZSBzZXJ2ZXIgdG8gcmVxdWVzdCBhIGNhbGxiYWNrLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWTUNhbGxiYWNrU2VydmVyIHsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIElWTVNlcnZlciBmb3IgdGhpcyBjYWxsYmFjayBzZXJ2ZXIuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJVk1TZXJ2ZXIgZ2V0SVZNU2VydmVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUHJvY2VzcyBhIGNhbGxiYWNrLiBUaGUgcnVubmFibGUgY29udGFpbnMgdGhlCi0JICogYWN0dWFsIGNvZGUuCi0JICovCi0JcHVibGljIE9iamVjdCBkb0NhbGxiYWNrKElDYWxsYmFja1J1bm5hYmxlIHJ1bm5hYmxlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXF1ZXN0IGEgc3RyZWFtIGZvciB3cml0aW5nIGEgbG90IG9mIGRhdGEgKHN1Z2dlc3RlZCBmb3IgbGFyZ2VyCi0JICogdGhhbiBzZXZlcmFsIHRob3VzYW5kIGJ5dGVzKS4gVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBhc3NpZ25lZAotCSAqIHRvIHRoaXMgc3RyZWFtIHVudGlsIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgotCSAqLwotCXB1YmxpYyBPdXRwdXRTdHJlYW0gcmVxdWVzdFN0cmVhbShpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JVk1TZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSVZNU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZDhhYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JVk1TZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElWTVNlcnZlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA3LzA4IDE3OjUxOjQ3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLSAKLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBzZXJ2ZXIgZm9yIHRoZSB2bSBvbiB0aGUgdm0gc2lkZSAoaS5lLiBub3QgdGhlIGNsaWVudCBzaWRlKS4KLSAqIDxwPgotICogSXQgY2FuIGJlIHBhc3NlZCB0byBwcm94aWVzIGlmIHRoZXkgbmVlZCB0byBhY2Nlc3MgdGhlIHZtIHNlcnZlci4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWTVNlcnZlciB7Ci0KLQkvKioKLQkgKiBBZGQgYSBydW5uYWJsZSB0aGF0IHdpbGwgYmUgY2FsbGVkIGlmIHNodXRkb3duIGlzIHJlcXVlc3RlZC4gSWYgYWxyZWFkeSBhZGRlZCwKLQkgKiBpdCB3aWxsIG5vdCBiZSBhZGRlZCBhZ2Fpbi4KLQkgKiA8cD4KLQkgKiBUaGUgYm9keSBvZiB0aGUgcnVubmFibGUgbXVzdCBub3QgZG8gYW55IHZtIHNlcnZlciBjYWxscy4gVGhhdCBpcyBiZWNhdXNlCi0JICogdGhlIHNlcnZlciBpcyBzaHV0ZG93biBhdCB0aGlzIHBvaW50LiBUaGUgYm9keSBtdXN0IHNpbXBseSBkbyBjbGVhbiB1cCBjb2RlLgotCSAqIFRoZSBzaHV0ZG93biB3aWxsIG5vdCBjb250aW51ZSB1bnRpbCB0aGUgY2FsbCB0byB0aGUgcnVubmFibGUgaXMgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogQ2FsbHMgdG8gdGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgc2h1dGRvd24gaGFzIGFscmVhZHkgc3RhcnRlZC4KLQkgKiBAcGFyYW0gcnVubmFibGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc2h1dGRvd24gcnVubmFibGUgZnJvbSB0aGUgbGlzdC4gSWYgbm90IGFkZGVkLCB0aGVuIG5vdCBhbiBlcnJvciB0byBjYWxsIHRoaXMuCi0JICogPHA+Ci0JICogQ2FsbHMgdG8gdGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgc2h1dGRvd24gaGFzIGFscmVhZHkgc3RhcnRlZC4KLQkgKiBAcGFyYW0gcnVubmFibGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9NYXBUeXBlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9NYXBUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWQxNDIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vTWFwVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBNYXBUeXBlcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCBmb3IgbWFwcGluZyBiZXR3ZWVuIEpOSSBmb3JtYXQgYW5kIG5vbi1KTkkgZm9ybWF0LiBJdCBhbHNvIGhhcyB0aGUKLSAqIG1hcHMgZm9yIHByaW1pdGl2ZXMuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIE1hcFR5cGVzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSGFzaE1hcCBNQVBfU0hPUlRTSUdfVE9fVFlQRSA9IG5ldyBIYXNoTWFwKDgpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSGFzaE1hcCBNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcgPSBuZXcgSGFzaE1hcCg4KTsKLQlzdGF0aWMgewotCQlNYXBUeXBlcy5NQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkIiLCBCeXRlLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1hcFR5cGVzLk1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiQyIsIENoYXJhY3Rlci5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNYXBUeXBlcy5NQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkQiLCBEb3VibGUuVFlQRSk7CQkgLy8kTk9OLU5MUy0xJAotCQlNYXBUeXBlcy5NQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkYiLCBGbG9hdC5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNYXBUeXBlcy5NQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkkiLCBJbnRlZ2VyLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1hcFR5cGVzLk1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiSiIsIExvbmcuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJTIiwgU2hvcnQuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJaIiwgQm9vbGVhbi5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgiYnl0ZSIsIkIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImNoYXIiLCJDIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJkb3VibGUiLCJEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJmbG9hdCIsIkYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImludCIsIkkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImxvbmciLCJKIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJzaG9ydCIsIlMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImJvb2xlYW4iLCJaIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCQotCi0JLyoqCi0JICogQ29udmVydCBmb3JtYWwgdHlwZSBuYW1lIGZvciBhbiBhcnJheSAoaS5lLiBqYXZhLmxhbmcuT2JqZWN0W10KLQkgKiB0byB0aGUgam5pIGZvcm1hdCAoaS5lLiBbTGphdmEubGFuZy5PYmplY3Q7KQotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIGEgbmFtZSBpcyBwYXNzZWQgaW4gZnJvbSB0aGUgSURFIHNpZGUuCi0JICogVGhlIFZNIHNpZGUgdXNlcyB0aGUgam5pIGZvcm1hdCwgYW5kIGFsbCBvZiBwcm94eSB1c2VzIHRoZSBqbmkgZm9ybWF0LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc25hbWUKLQkgKiBAcmV0dXJuIHN0cmluZyBqbmkgZm9ybSBvZiBuYW1lLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpOSUZvcm1hdE5hbWUoU3RyaW5nIGNsYXNzbmFtZSkgewotCQlpZiAoY2xhc3NuYW1lLmxlbmd0aCgpID09IDAgfHwgIWNsYXNzbmFtZS5lbmRzV2l0aCgiXSIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gY2xhc3NuYW1lOwkvLyBOb3QgYW4gYXJyYXksb3IgaW52YWxpZAotCQkKLQkJU3RyaW5nQnVmZmVyIGpuaSA9IG5ldyBTdHJpbmdCdWZmZXIoY2xhc3NuYW1lLmxlbmd0aCgpKTsKLQkJaW50IGZpcnN0T3BlbkJyYWNrZXQgPSBjbGFzc25hbWUuaW5kZXhPZignWycpOwotCQlpbnQgb2IgPSBmaXJzdE9wZW5CcmFja2V0OwotCQl3aGlsZSAob2IgPiAtMSkgewotCQkJaW50IGNiID0gY2xhc3NuYW1lLmluZGV4T2YoJ10nLCBvYik7Ci0JCQlpZiAoY2IgPT0gLTEpCi0JCQkJYnJlYWs7Ci0JCQlqbmkuYXBwZW5kKCdbJyk7Ci0JCQlvYiA9IGNsYXNzbmFtZS5pbmRleE9mKCdbJywgY2IpOwotCQl9Ci0JCQotCQlTdHJpbmcgZmluYWxUeXBlID0gY2xhc3NuYW1lLnN1YnN0cmluZygwLCBmaXJzdE9wZW5CcmFja2V0KS50cmltKCk7Ci0JCWlmIChmaW5hbFR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHNob3J0U2lnID0gKFN0cmluZykgTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLmdldChmaW5hbFR5cGUpOwotCQkJaWYgKHNob3J0U2lnID09IG51bGwpIHsKLQkJCQlqbmkuYXBwZW5kKCdMJyk7Ci0JCQkJam5pLmFwcGVuZChmaW5hbFR5cGUpOwotCQkJCWpuaS5hcHBlbmQoJzsnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJam5pLmFwcGVuZChzaG9ydFNpZyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBqbmkudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb252ZXJ0cyBmcm9tIHRoZSBKTkkgZm9ybWF0IHRvIHRoZSBmb3JtYWwgdHlwZW5hbWUuCi0JICogCi0JICogQHBhcmFtIGpuaU5hbWUKLQkgKiBAcmV0dXJuIGZvcm1hbCB0eXBlbmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKFN0cmluZyBqbmlOYW1lKSB7Ci0JCWlmIChqbmlOYW1lLmNoYXJBdCgwKSA9PSAnWycpIHsKLQkJCS8vIEl0IGlzIGFuIGFycmF5Ci0JCQlpbnQgZGltcyA9IGpuaU5hbWUubGFzdEluZGV4T2YoJ1snKSsxOwkvLyBOdW1iZXIgb2YgZGltZW5zaW9ucwotCQkJaW50IHN0YXJ0VHlwZSA9IGRpbXM7Ci0JCQlTdHJpbmdCdWZmZXIgZk5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGpuaU5hbWUubGVuZ3RoKCkrKDIqZGltcykpOyAKLQkJCWlmIChqbmlOYW1lLmNoYXJBdChzdGFydFR5cGUpID09ICdMJykKLQkJCQlmTmFtZS5hcHBlbmQoam5pTmFtZS5zdWJzdHJpbmcoc3RhcnRUeXBlKzEsIGpuaU5hbWUubGVuZ3RoKCktMSkpOwkvLyBGb3IgIltMamF2YS5sYW5nLlN0cmluZzsiIHJldHVybiAiamF2YS5sYW5nLlN0cmluZyIKLQkJCWVsc2UgaWYgKGpuaU5hbWUubGVuZ3RoKCkgPT0gc3RhcnRUeXBlKzEpIHsKLQkJCQkvLyBQb3NzaWJsZSBwcmltaXRpdmUKLQkJCQlDbGFzcyB0eXBlID0gKENsYXNzKSBNQVBfU0hPUlRTSUdfVE9fVFlQRS5nZXQoam5pTmFtZS5zdWJzdHJpbmcoc3RhcnRUeXBlLCBzdGFydFR5cGUrMSkpOwotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJZk5hbWUuYXBwZW5kKHR5cGUuZ2V0TmFtZSgpKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuICIiOwkvLyBJbnZhbGlkIGlmIG5vICdMJyBhbmQgbm90IGEgcHJpbWl0aXZlLiAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gIiI7CS8vIEludmFsaWQsIG11c3QgYmUgZWl0aGVyIGEgcHJpbWl0aXZlIG9yICdMJyB0eXBlLiAvLyROT04tTkxTLTEkCi0JCQl3aGlsZShkaW1zLS0gPiAwKSB7Ci0JCQkJZk5hbWUuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZk5hbWUudG9TdHJpbmcoKTsKLQkJfSBlbHNlIGlmIChqbmlOYW1lLmxlbmd0aCgpID09IDEpIHsKLQkJCS8vIFBvc3NpYmxlIHByaW1pdGl2ZS4KLQkJCUNsYXNzIHR5cGUgPSAoQ2xhc3MpIE1BUF9TSE9SVFNJR19UT19UWVBFLmdldChqbmlOYW1lKTsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHlwZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIElmIGdvdCBoZXJlIHRoZW4ganVzdCBhIG5hbWUgYXMgaXMuCi0JCXJldHVybiBqbmlOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBmb3JtYWwgdHlwZSBuYW1lLCB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgZGltZW5zaW9ucywKLQkgKiB0byBhbiBhcnJheSBKTkkgdHlwZS4KLQkgKiBAcGFyYW0gZmluYWxDb21wb25lbnQgZmluYWwgY29tcG9uZW50IG5hbWUsIHNob3VsZCBub3QgYmUgYW4gYXJyYXkgdHlwZS4KLQkgKiBAcGFyYW0gZGltZW5zaW9ucyBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgdGhlIGFycmF5LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKTklUeXBlTmFtZShTdHJpbmcgZmluYWxDb21wb25lbnQsIGludCBkaW1lbnNpb25zKSB7Ci0JCVN0cmluZ0J1ZmZlciBqbmkgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbmFsQ29tcG9uZW50Lmxlbmd0aCgpK2RpbWVuc2lvbnMrMik7Ci0JCXdoaWxlIChkaW1lbnNpb25zLS0gPiAwKSB7Ci0JCQlqbmkuYXBwZW5kKCdbJyk7Ci0JCX0KLQkJCi0JCVN0cmluZyBzaG9ydFNpZyA9IChTdHJpbmcpIE1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5nZXQoZmluYWxDb21wb25lbnQpOwotCQlpZiAoc2hvcnRTaWcgPT0gbnVsbCkgewotCQkJam5pLmFwcGVuZCgnTCcpOwotCQkJam5pLmFwcGVuZChmaW5hbENvbXBvbmVudCk7Ci0JCQlqbmkuYXBwZW5kKCc7Jyk7Ci0JCX0gZWxzZSB7Ci0JCQlqbmkuYXBwZW5kKHNob3J0U2lnKTsKLQkJfQotCQkKLQkJcmV0dXJuIGpuaS50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vTWV0aG9kSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL01ldGhvZEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc3MmMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vTWV0aG9kSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgaXMgYSBjbGFzcyB0byBkbyBtZXNzYWdlL2NvbnN0cnVjdG9yIHdvcmsuIAotICogU3BlY2lmaWNhbGx5IHRvIGZpbmQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgbWV0aG9kLgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kSGVscGVyIHsKLQkKLQkvKgotCSAqIFRoZSBjbGFzcyB0aGF0IGlzIHVzZWQgdG8gcmVwcmVzZW50IE51bGwgY2xhc3MgdHlwZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOVUxMX0NMQVNTIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBOVUxMX1RZUEUgPSBOVUxMX0NMQVNTLmNsYXNzOwotCQotCXN0YXRpYyBmaW5hbCBBcnJheUxpc3Qgc1ByaW1pdGl2ZXNPcmRlcjsKLQlzdGF0aWMgZmluYWwgaW50IHNDaGFyUG9zOwotCQotCXN0YXRpYyB7Ci0JCXNQcmltaXRpdmVzT3JkZXIgPSBuZXcgQXJyYXlMaXN0KDYpOwotCQlzUHJpbWl0aXZlc09yZGVyLmFkZChCeXRlLlRZUEUpOwotCQlzUHJpbWl0aXZlc09yZGVyLmFkZChTaG9ydC5UWVBFKTsKLQkJc1ByaW1pdGl2ZXNPcmRlci5hZGQoSW50ZWdlci5UWVBFKTsKLQkJc1ByaW1pdGl2ZXNPcmRlci5hZGQoTG9uZy5UWVBFKTsKLQkJc1ByaW1pdGl2ZXNPcmRlci5hZGQoRmxvYXQuVFlQRSk7Ci0JCXNQcmltaXRpdmVzT3JkZXIuYWRkKERvdWJsZS5UWVBFKTsKLQotCQkvLyBjaGFyIGNhbiBiZSB0cmVhdGVkIGxpa2UgYSBzaG9ydCBmb3IgcHVycG9zZXMgb2Ygb3JkZXJpbmcuCi0JCXNDaGFyUG9zID0gc1ByaW1pdGl2ZXNPcmRlci5pbmRleE9mKFNob3J0LlRZUEUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZTIgY2FuIGJlIGFzc2lnbmVkIHRvIHR5cGUxIGluCi0JICogbWV0aG9kIGFyZ3VtZW50IGNvbnZlcnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oQ2xhc3MgdHlwZTEsIENsYXNzIHR5cGUyKSB7Ci0JCWlmICh0eXBlMSA9PSB0eXBlMikKLQkJCXJldHVybiB0cnVlOwkvLyBUaGV5J3JlIHRoZSBzYW1lLCBzbyBhc3NpZ25hYmxlLgotCQlpZiAodHlwZTEuaXNQcmltaXRpdmUoKSkgewotCQkJaWYgKHR5cGUyLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQlpZiAodHlwZTEgPT0gQm9vbGVhbi5UWVBFIHx8IHR5cGUyID09IEJvb2xlYW4uVFlQRSkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBTaW5jZSBub3QgZXF1YWwgYW5kIG9uZSBpcyBib29sZWFuIGFuZCB0aGUgb3RoZXIgaXNuJ3QsIG5vdCBhc3NpZ25hYmxlCi0JCQkJaW50IHR5cGUxUG9zID0gKHR5cGUxICE9IENoYXJhY3Rlci5UWVBFKSA/IHNQcmltaXRpdmVzT3JkZXIuaW5kZXhPZih0eXBlMSkgOiBzQ2hhclBvczsKLQkJCQlpbnQgdHlwZTJQb3MgPSAodHlwZTIgIT0gQ2hhcmFjdGVyLlRZUEUpID8gc1ByaW1pdGl2ZXNPcmRlci5pbmRleE9mKHR5cGUyKSA6IHNDaGFyUG9zOwotCQkJCXJldHVybiB0eXBlMVBvcyA+IHR5cGUyUG9zOwkvLyBJdCBjYW4gYmUgd2lkZW5lZCBpZiB0eXBlMSBpcyBoaWdoZXIgaW4gdGhlIG9yZGVyCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7CS8vIHByaW1pdGl2ZSB0byBub24tcHJpbWl0aXZlLCBub3QgYXNzaWduYWJsZS4KLQkJfSBlbHNlCi0JCQlpZiAodHlwZTIgPT0gTlVMTF9UWVBFKQotCQkJCXJldHVybiB0cnVlOwkvLyBOVUxMX1RZUEUgcmVwcmVzZW50cyBudWxsIGZvciB1cywgYW5kIG51bGwgY2FuIGJlIGFzc2lnbmVkIHRvIGFueSBvYmplY3QKLQkJCWVsc2UJCQotCQkJCXJldHVybiB0eXBlMS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUyKTsJLy8gQ2FuIHR5cGUyIGJlIGFzc2lnbmVkIHRvIHR5cGUxCi0JfQotCQotCQotCS8qKgotCSAqIEV2ZXJ5IGVudHJ5IGluIEFycmF5MiBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gQXJyYXkxLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKENsYXNzW10gdHlwZXMxLCBDbGFzc1tdIHR5cGVzMikgewotCQlpZiAodHlwZXMxLmxlbmd0aCAhPSB0eXBlczIubGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwkvLyBOb3QgdGhlIHNhbWUgc2l6ZSwgc28gbm90IGNvbXBhdGlibGUuCi0JCWZvciAoaW50IGk9MDsgaTx0eXBlczEubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghaXNBc3NpZ25hYmxlRnJvbSh0eXBlczFbaV0sIHR5cGVzMltpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwkvLyBBbGwgYXJlIGFzc2lnbmFibGUKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbW9zdCBjb21wYXRpYmxlIG1ldGhvZC9jb25zdHJ1Y3RvciBmcm9tIHRoZSBsaXN0cyBwYXNzZWQgaW4uCi0JICogTWV0aG9kc0xpc3Q6IExpc3Qgb2YgbWV0aG9kcyAoaWYgbnVsbCB0aGVuIHRoaXMgaXMgZm9yIGNvbnN0cnVjdG9ycykKLQkgKiBQYXJtc0xpc3Q6IExpc3Qgb2YgcGFybXMgZm9yIGVhY2ggbWV0aG9kIChlYWNoIGVudHJ5IHdpbGwgYmUgQ2xhc3NbXSkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRNb3N0Q29tcGF0aWJsZShMaXN0IG1ldGhvZHMsIExpc3QgcGFybXMsIFN0cmluZyBhbWJpZ3VvdXNOYW1lKSB0aHJvd3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIHsKLQkJLy8gVGhlIGFsZ29yaXRobSB1c2VkIGlzIGZyb20gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiAxNS4xMi4yLjIKLQkJLy8gRmluZCB0aGUgbWF4aW1hbGx5IHNwZWNpZmljIG9uZXMKLQkJLy8gVGhpcyBpcyBkZWZpbmVkIGFzIHRoZSBvbmUgdGhhdCBpcyBtb3JlIHNwZWNpZmljIHRoZW4gYWxsIG9mIHRoZSByZXN0LgotCQkvLyBJZiB0aGVyZSBhcmUgZHVwbGljYXRlcyBwYXJtcyB0aGF0IGFyZSBtYXhpbWFsbHkgc3BlY2lmaWMsIHRoZW4gaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggY2hvb3NlbgotCQkvLyBiZWNhdXNlIHdoZW4gaW52b2tlZCB0aGUgSlZNIHdpbGwgbWFrZSBzdXJlIHRoZSByaWdodCB0aGluZyBpcyBkb25lLgotCQkvLyAKLQkJQ2xhc3NbXVtdIHBhcm1zQ29weSA9IChDbGFzc1tdW10pIHBhcm1zLnRvQXJyYXkobmV3IENsYXNzW3Bhcm1zLnNpemUoKV1bXSk7Ci0JCWludCBzaXplID0gcGFybXNDb3B5Lmxlbmd0aDsKLQkJLy8gRm9yIGVhY2ggZW50cnkgc2VlIGlmIGl0IGlzIG1heGltYWxseSBzcGVjaWZpYywgaS5lLiBpdCBpcyBtb3JlIHNwZWNpZmljIHRoZW4gYWxsIG9mIHRoZSBvdGhlcnMuCi1uZXh0TWV0aG9kOglmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCQkvLyBGb3IgY3RvcnMgd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHRoZSBkZWNsYXJpbmcgY2xhc3MgYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBjbGFzcy4KLQkJCUNsYXNzIGRjbENsYXNzaSA9IG1ldGhvZHMgIT0gbnVsbCA/ICgoTWV0aG9kKSBtZXRob2RzLmdldChpKSkuZ2V0RGVjbGFyaW5nQ2xhc3MoKSA6IG51bGw7Ci0JCQlDbGFzc1tdIHBhcm1zaSA9IHBhcm1zQ29weVtpXTsKLQkJCWZvciAoaW50IGo9MDsgajxzaXplOyBqKyspIHsKLQkJCQlpZiAoaSA9PSBqKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBNZXRob2RpIGlzIG1vcmUgc3BlY2lmaWMgaWYKLQkJCQkvLyAgIGEpIE1ldGhvZGkgZGVjbGFyaW5nIGNsYXNzIGlzIGFzc2lnbmFibGUgdG8gTWV0aG9kaiBkZWNsYXJpbmcgY2xhc3MKLQkJCQkvLyAgIGIpIE1ldGhvZGkgcGFybXMgYXJlIGFzc2lnbmFibGUgdG8gTWV0aG9kaiBwYXJtcwotCQkJCS8vCi0JCQkJLy8gRmlyc3Qgc2VlIGlmIE1ldGhvZGkgaXMgbW9yZSBzcGVjaWZpYywgaWYgaXQgaXMKLQkJCQkvLyB0aGVuIHRocm93IG91dCBNZXRob2RqIGFuZCBjb250aW51ZQotCQkJCS8vIElmIE1ldGhvZGkgaXMgbm90IGNvbXBhdGlibGUgdG8gTWV0aG9kaiwgZ28gdG8gdGhlIG5leHQgbWV0aG9kIGZvciBpLiBNZXRob2RpIGlzIG5vdCB0aGUgbW9zdCBzcGVjaWZpYwotCQkJCS8vIFNvbWV0aGluZyBlbHNlIGlzIGVpdGhlciBtb3JlIHNwZWNpZmljIG9yIG5vbmUgYXJlIG1hCi0JCQkJaWYgKGRjbENsYXNzaSAhPSBudWxsKSB7Ci0JCQkJCS8vIFN0ZXAgYQotCQkJCQlpZiAoIWlzQXNzaWduYWJsZUZyb20oKChNZXRob2QpIG1ldGhvZHMuZ2V0KGopKS5nZXREZWNsYXJpbmdDbGFzcygpLCBkY2xDbGFzc2kpKQotCQkJCQkJY29udGludWUgbmV4dE1ldGhvZDsJLy8gTWV0aG9kaSBpcyBub3QgbW9yZSBzcGVjaWZpYyB0aGFuIE1ldGhvZGosIHNvIHRyeSBuZXh0IGkuCi0JCQkJfQotCQkJCQotCQkJCS8vIFN0ZXAgYgotCQkJCUNsYXNzW10gcGFybXNqID0gcGFybXNDb3B5W2pdOwotCQkJCWlmICghaXNBc3NpZ25hYmxlRnJvbShwYXJtc2osIHBhcm1zaSkpIHsKLQkJCQkJLy8gTWV0aG9kaSBpcyBub3QgbW9yZSBzcGVjaWZpYyB0aGFuIE1ldGhvZGosIHNvIGdvIHRvIG5leHQgaS4KLQkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaTsJLy8gTWV0aG9kaSBpcyBtb3JlIHNwZWNpZmljIHRoYW4gYWxsIG9mIHRoZSBvdGhlciBvbmVzLgotCQl9Ci0KLQkJdGhyb3cgbmV3IEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbihhbWJpZ3VvdXNOYW1lKTsJLy8gVGhlcmUgd2FzIG5vdCBvbmUgbW9yZSBzcGVjaWZpYyB0aGFuIGFsbCBvZiB0aGUgb3RoZXJzLgotCX0KLQkKLQkvKioKLQkgKiBGaW5kIHRoZSBtb3N0IGNvbXBhdGlibGUgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGZpbmRDb21wYXRpYmxlTWV0aG9kKENsYXNzIHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBhcmd1bWVudHMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgbXRoZCA9IHJlY2VpdmVyLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmd1bWVudHMpOwotCQkJcmV0dXJuIG10aGQ7CS8vIEZvdW5kIGV4YWN0IG1hdGNoCi0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleGMpIHsKLQkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkJCS8vIE5lZWQgdG8gZmluZCBtb3N0IGNvbXBhdGlibGUgb25lLgotCQkJCU1ldGhvZCBtdGhkc1tdID0gcmVjZWl2ZXIuZ2V0TWV0aG9kcygpOwotCQkJCUFycmF5TGlzdCBwYXJtc0xpc3QgPSBuZXcgQXJyYXlMaXN0KG10aGRzLmxlbmd0aCk7IC8vIFRoZSBwYXJtIGxpc3QgZnJvbSBlYWNoIGNvbXBhdGlibGUgbWV0aG9kLgotCQkJCUFycmF5TGlzdCBtdGhkc0xpc3QgPSBuZXcgQXJyYXlMaXN0KG10aGRzLmxlbmd0aCk7IC8vIFRoZSBsaXN0IG9mIGNvbXBhdGlibGUgbWV0aG9kcywgc2FtZSBvcmRlciBhcyB0aGUgcGFybXMgYWJvdmUuCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtdGhkcy5sZW5ndGg7IGkrKykgewotCQkJCQlNZXRob2QgbXRoZCA9IG10aGRzW2ldOwotCQkJCQlpZiAoIW10aGQuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkKLQkJCQkJCWNvbnRpbnVlOyAvLyBOb3QgY29tcGF0aWJsZSwgbm90IHNhbWUgbmFtZQotCQkJCQlDbGFzc1tdIHBhcm1zID0gbXRoZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJCQlpZiAoIWlzQXNzaWduYWJsZUZyb20ocGFybXMsIGFyZ3VtZW50cykpCi0JCQkJCQljb250aW51ZTsgLy8gTm90IGNvbXBhdGlibGUsIHBhcm1zCi0JCQkJCS8vIEl0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVxdWVzdGVkIG1ldGhvZAotCQkJCQlwYXJtc0xpc3QuYWRkKHBhcm1zKTsKLQkJCQkJbXRoZHNMaXN0LmFkZChtdGhkKTsKLQkJCQl9Ci0KLQkJCQkvLyBOb3cgaGF2ZSBsaXN0IG9mIGNvbXBhdGlibGUgbWV0aG9kcy4KLQkJCQlpZiAocGFybXNMaXN0LnNpemUoKSA9PSAwKQotCQkJCQl0aHJvdyB0aHJvd0ZpeGVkTm9TdWNoTWV0aG9kKGV4YywgcmVjZWl2ZXIsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7IC8vIE5vbmUgZm91bmQsIHNvIHJldGhyb3cgdGhlIGV4Y2VwdGlvbgotCQkJCWlmIChwYXJtc0xpc3Quc2l6ZSgpID09IDEpCi0JCQkJCXJldHVybiAoTWV0aG9kKSBtdGhkc0xpc3QuZ2V0KDApOyAvLyBPbmx5IG9uZSwgc28gcmV0dXJuIGl0Ci0KLQkJCQkvLyBOb3cgZmluZCB0aGUgbW9zdCBjb21wYXRpYmxlIG1ldGhvZAotCQkJCWludCBtb3N0Q29tcGF0aWJsZSA9IGZpbmRNb3N0Q29tcGF0aWJsZShtdGhkc0xpc3QsIHBhcm1zTGlzdCwgbWV0aG9kTmFtZSk7Ci0JCQkJcmV0dXJuIChNZXRob2QpIG10aGRzTGlzdC5nZXQobW9zdENvbXBhdGlibGUpOwotCQkJfSBlbHNlCi0JCQkJdGhyb3cgdGhyb3dGaXhlZE5vU3VjaE1ldGhvZChleGMsIHJlY2VpdmVyLCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOyAvLyBOb25lIGZvdW5kLCBzbyByZXRocm93IHRoZSBleGNlcHRpb24KLQkJfQotCX0KLQkKLQkvKgotCSAqIE5vU3VjaE1FdGhvZEV4ZWNlcHRpb24gZG9lc24ndCBpbmNsdWRlIHRoZSBzaWduYXR1cmUuIFNpbmNlIHRoZXNlIGFyZSBkeW5hbWljIHNlYXJjaGVzLCB0aGUgZXhjZXB0aW9uIGl0c2VsZiBpcyB1c2VsZXNzIHdpdGhvdXQKLQkgKiB0aGUgc2lnbmF0dXJlLiBTbyB3ZSBhZGQgaXQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHRocm93Rml4ZWROb1N1Y2hNZXRob2QoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUsIENsYXNzIGRlY2xhcmVDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJnQ2xhc3NlcykgewotCi0JCS8vIFRoZSBkZWZhdWx0IHRyYWNlIGRvZXNuJ3Qgc2hvdyB3aGF0IG1ldGhvZCB3YXMgYmVpbmcgc2VhcmNoZWQgZm9yLCBzbyByZWNyZWF0ZSB3aXRoIHRoYXQuCi0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzLmFwcGVuZChkZWNsYXJlQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJcy5hcHBlbmQoJy4nKTsKLQkJcy5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCXMuYXBwZW5kKCcoJyk7Ci0JCWlmIChhcmdDbGFzc2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpID4gMCkKLQkJCQkJcy5hcHBlbmQoJywnKTsKLQkJCQlzLmFwcGVuZChhcmdDbGFzc2VzW2ldLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcy5hcHBlbmQoJyknKTsKLQkJTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5lID0gbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihzLnRvU3RyaW5nKCkpOwotCQluZS5zZXRTdGFja1RyYWNlKGUuZ2V0U3RhY2tUcmFjZSgpKTsKLQkJcmV0dXJuIG5lOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kIHRoZSBtb3N0IGNvbXBhdGlibGUgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb25zdHJ1Y3RvciBmaW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yKENsYXNzIHJlY2VpdmVyLCBDbGFzc1tdIGFyZ3VtZW50cykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGN0b3IgPSByZWNlaXZlci5nZXREZWNsYXJlZENvbnN0cnVjdG9yKGFyZ3VtZW50cyk7Ci0JCQljdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7CS8vIFdlIGFsbG93IGFsbCBhY2Nlc3MsIGxldCBpZGUgYW5kIGNvbXBpbGVyIGhhbmRsZSBzZWN1cml0eS4KLQkJCXJldHVybiBjdG9yOwkvLyBGb3VuZCBleGFjdCBtYXRjaAotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXhjKSB7Ci0JCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKLQkJCQkvLyBOZWVkIHRvIGZpbmQgbW9zdCBjb21wYXRpYmxlIG9uZS4KLQkJCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjdG9yc1tdID0gcmVjZWl2ZXIuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLQkJCQlBcnJheUxpc3QgcGFybXNMaXN0ID0gbmV3IEFycmF5TGlzdChjdG9ycy5sZW5ndGgpOyAvLyBUaGUgcGFybSBsaXN0IGZyb20gZWFjaCBjb21wYXRpYmxlIG1ldGhvZC4KLQkJCQlBcnJheUxpc3QgY3RvcnNMaXN0ID0gbmV3IEFycmF5TGlzdChjdG9ycy5sZW5ndGgpOyAvLyBUaGUgbGlzdCBvZiBjb21wYXRpYmxlIG1ldGhvZHMsIHNhbWUgb3JkZXIgYXMgdGhlIHBhcm1zIGFib3ZlLgotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY3RvciA9IGN0b3JzW2ldOwotCQkJCQlDbGFzc1tdIHBhcm1zID0gY3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJCQlpZiAoIWlzQXNzaWduYWJsZUZyb20ocGFybXMsIGFyZ3VtZW50cykpCi0JCQkJCQljb250aW51ZTsgLy8gTm90IGNvbXBhdGlibGUsIHBhcm1zCi0JCQkJCS8vIEl0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVxdWVzdGVkIG1ldGhvZAotCQkJCQlwYXJtc0xpc3QuYWRkKHBhcm1zKTsKLQkJCQkJY3RvcnNMaXN0LmFkZChjdG9yKTsKLQkJCQl9Ci0KLQkJCQkvLyBOb3cgaGF2ZSBsaXN0IG9mIGNvbXBhdGlibGUgbWV0aG9kcy4KLQkJCQlpZiAocGFybXNMaXN0LnNpemUoKSA9PSAwKQotCQkJCQl0aHJvdyBleGM7IC8vIE5vbmUgZm91bmQsIHNvIHJldGhyb3cgdGhlIGV4Y2VwdGlvbgotCQkJCWlmIChwYXJtc0xpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY3RvciA9IChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikgY3RvcnNMaXN0LmdldCgwKTsgLy8gT25seSBvbmUsIHNvIHJldHVybiBpdAotCQkJCQljdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7IC8vIFdlIGFsbG93IGFsbCBhY2Nlc3MsIGxldCBpZGUgYW5kIGNvbXBpbG9yIGhhbmRsZSBzZWN1cml0eS4KLQkJCQkJcmV0dXJuIGN0b3I7Ci0JCQkJfQotCi0JCQkJLy8gTm93IGZpbmQgdGhlIG1vc3QgY29tcGF0aWJsZSBjdG9yCi0JCQkJaW50IG1vc3RDb21wYXRpYmxlID0gZmluZE1vc3RDb21wYXRpYmxlKG51bGwsIHBhcm1zTGlzdCwgcmVjZWl2ZXIuZ2V0TmFtZSgpKTsKLQkJCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjdG9yID0gKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yKSBjdG9yc0xpc3QuZ2V0KG1vc3RDb21wYXRpYmxlKTsKLQkJCQljdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7IC8vIFdlIGFsbG93IGFsbCBhY2Nlc3MsIGxldCBpZGUgYW5kIGNvbXBpbG9yIGhhbmRsZSBzZWN1cml0eS4KLQkJCQlyZXR1cm4gY3RvcjsKLQkJCX0gZWxzZQotCQkJCXRocm93IGV4YzsgLy8gTm9uZSBmb3VuZCwgc28gcmV0aHJvdyB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9CQotCQkJCQotCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vVW5yZXNvbHZlZENvbXBpbGF0aW9uRXJyb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vVW5yZXNvbHZlZENvbXBpbGF0aW9uRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3ZGQ2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL1VucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlJAotICogICRSZXZpc2lvbiQgICREYXRlJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uOwotIAotLyoqCi0gKiBVc2VkIGJ5IHRoZSB0aGUgcmVnaXN0cmllcyB0byBpbmRpY2F0ZSAiVW5yZXNvbHZlZENvbXBpbGF0aW9uRXJyb3IiLiBUaGlzIGlzIGJlY2F1c2UgdGhlCi0gKiBub3JtYWwgamF2YSB0aHJvd3MganVzdCBhbiBFcnJvciB3aXRoIGEgbWVzc2FnZS4gVG8gbWFrZSBpdCBlYXNpZXIgaW4gcHJvY2Vzc2luZywgaXQgd2lsbAotICogYmUgdHVybmVkIGludG8gdGhpcyBlcnJvciBpbnN0ZWFkIHNvIHRoYXQgaXQgY2FuIGJlIGV4cGxpY2l0bHkgY2F1Z2h0LgotICogPHA+Ci0gKiBUaGlzIHdpbGwgb25seSBiZSB1c2VkIGluIGNlcnRhaW4gZXhwbGljaXQgcGFydHMgb2YgdGhlIGNvZGUuIEl0IHdpbGwgYmUgZGV0YWlsZWQgd2hlcmUKLSAqIGl0IGNhbiBiZSB0aHJvd24uCi0gKiAKLSAqIEBzaW5jZSAxLjEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnJlc29sdmVkQ29tcGlsYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3Nzc4ODQyMjExMDczNTkyNzkwTDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgZnJvbSBhbiBFcnJvci4KLQkgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRoYXQgaXMgdGhlIGFjdHVhbCBvbmUuIDxiPlRoaXMgd2lsbCBub3QgYmUgdGhlIGNhdXNlLCB0aGUgbWVzc2FnZSBhbmQgc3RhY2t0cmFjZSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoaXMgbmV3IGVycm9yLjwvYj4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyBVbnJlc29sdmVkQ29tcGlsYXRpb25FcnJvcihFcnJvciBlcnJvcikgewotCQlzdXBlcihlcnJvci5nZXRNZXNzYWdlKCkpOwotCQlzZXRTdGFja1RyYWNlKGVycm9yLmdldFN0YWNrVHJhY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0JlYW5Qcm94eVZhbHVlU2VuZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0JlYW5Qcm94eVZhbHVlU2VuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzFkMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9CZWFuUHJveHlWYWx1ZVNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5Qcm94eVZhbHVlU2VuZGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5UaHJvd2FibGVQcm94eTsKLSAKLS8qKgotICogVXNlZnVsIGluIFJFTSB0byBnZXQgdGhlIGFycmF5IG9mIEJlYW5Qcm94eVZhbHVlcy4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuUHJveHlWYWx1ZVNlbmRlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlU2VuZGVyIHsKLQlwcm90ZWN0ZWQgaW50IGluZGV4ID0gMDsKLQlwcm90ZWN0ZWQgT2JqZWN0W10gYXJyYXk7Ci0JcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uOwotCXByaXZhdGUgZmluYWwgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZhY3Rvcnk7Ci0JCi0JLyoqCi0JICogU2VlIGlmIHRoZXJlIHdhcyBhbiBleGNlcHRpb24gdGhyb3duIGR1cmluZyByZWFkaW5nLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZXhjZXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbjsKLQl9Ci0JCQotCXB1YmxpYyBCZWFuUHJveHlWYWx1ZVNlbmRlcihSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgZmFjdG9yeSkgewotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQlwdWJsaWMgQmVhblByb3h5VmFsdWVTZW5kZXIoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZhY3RvcnksIENvbW1hbmRzLlZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKSB7Ci0JCXRoaXMoZmFjdG9yeSk7Ci0JCWluaXRpYWxpemUoYXJyYXlIZWFkZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbW1hbmRzLlZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKSB7Ci0JCWluZGV4ID0gMDsKLQkJLy8gVGhlIGFycmF5IHR5cGUgZG9lc24ndCBtYXR0ZXIsIGl0IHdpbGwgYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLQkJLy8gVGhlIHZhbHVlcyB3aWxsIGVpdGhlciBiZSBJQmVhblByb3hpZXMgb3IgYW4gYXJyYXksIG9yIGNvbnN0YW50cy4KLQkJYXJyYXkgPSBuZXcgT2JqZWN0W2FycmF5SGVhZGVyLmFuSW50XTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWFycmF5ID0gbnVsbDsKLQkJaW5kZXggPSAwOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0QXJyYXkoKSB7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0JCQkJCi0JLy8gQSBuZXcgdmFsdWUgaXMgYmVpbmcgc2VudCB0byB0aGUgYXJyYXkKLQkvLyBOT1RFOiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGhhcyBiZWVuIGNhbGxlZCB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KLQlwdWJsaWMgdm9pZCBzZW5kVmFsdWUoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWFycmF5W2luZGV4KytdID0gZmFjdG9yeS5nZXRCZWFuUHJveHkodmFsdWUpOwkvLyBBZGQgaXQgdG8gdGhlIGFycmF5Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFdlIGNhbid0IHN0b3AgaXQgcmlnaHQgYXdheSBiZWNhdXNlIHdlIGNhbid0IHNlbmQgZXhjZXB0aW9uIG9uLCBob3dldmVyLAotCQkJLy8gd2UgY2FuIGxvZyBpdCBhbmQgc2F2ZSB0aGUgZXhjZXB0aW9uLgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWV4Y2VwdGlvbiA9IGU7CQkJCi0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gV2UgY2FuJ3Qgc3RvcCBpdCByaWdodCBhd2F5IGJlY2F1c2Ugd2UgY2FuJ3Qgc2VuZCBleGNlcHRpb24gb24sIGhvd2V2ZXIsCi0JCQkvLyB3ZSBjYW4gbG9nIGl0IGFuZCBzYXZlIHRoZSBleGNlcHRpb24uCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZXhjZXB0aW9uID0gZTsKLQkJfQotCX0KLQkJCQkKLQkvLyBUaGUgbmV4dCBlbnRyeSBpcyBhbiBhcnJheSB0b28hCi0JcHVibGljIENvbW1hbmRzLlZhbHVlU2VuZGVyIG5lc3RlZEFycmF5KENvbW1hbmRzLlZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKSB7Ci0JCUJlYW5Qcm94eVZhbHVlU2VuZGVyIHNlbmRlciA9IG5ldyBCZWFuUHJveHlWYWx1ZVNlbmRlcihmYWN0b3J5LCBhcnJheUhlYWRlcik7Ci0JCS8vIFRha2UgdGhlIG5ld2x5IGNyZWF0ZWQgYXJyYXkgYW5kIHB1dCBpdCBpbnRvIHRoZSBjdXJyZW50IGFycmF5LgotCQlhcnJheVtpbmRleCsrXSA9IHNlbmRlci5nZXRBcnJheSgpOwotCQlyZXR1cm4gc2VuZGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0RlYnVnTW9kZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9EZWJ1Z01vZGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhOTIzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0RlYnVnTW9kZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IERlYnVnTW9kZUhlbHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luOwotLyoqCi0gKiBUaGlzIGlzIGEgaGVscGVyIGZvciBkZWJ1ZyBtb2RlLiBJdCBhbGxvd3MgYWNjZXNzIHRvCi0gKiB0aGUgd29ya2JlbmNoLCBpZiBhdmFpbGFibGUsIG9yIEFXVCwgaWYgYXZhaWxhYmxlLCBmb3IKLSAqIHRoZSBkZWJ1ZyBwcm9tcHRzLiBJdCB1c2VzIHJlZmxlY3Rpb24gc28gdGhhdCBub3RoaW5nIGlzCi0gKiBmb3JjZWQgdG8gYmUgbG9hZGVkIG9yIHByZS1yZXFkLiBUaGF0IHdheSBpdCBjYW4gcnVuIGhlYWRsZXNzLgotICovCi0KLWNsYXNzIERlYnVnTW9kZUhlbHBlciB7Ci0JYm9vbGVhbiBhd3QgPSBmYWxzZTsKLQlib29sZWFuIGNvbnNvbGUgPSBmYWxzZTsKLQlib29sZWFuIHNldHVwID0gZmFsc2U7Ci0JamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlciBpblJlYWRlciA9IG51bGw7Ci0JCi0JLy8gV29ya2JlbmNoIHJlZmxlY3Rpb25zCi0JT2JqZWN0IGRpc3BsYXkgPSBudWxsOwkKLQlDb25zdHJ1Y3RvciBjTUIgPSBudWxsOwotCUZpZWxkIGZBcHBNb2RlbCA9IG51bGw7Ci0JTWV0aG9kIGZhc3luYyA9IG51bGw7Ci0JTWV0aG9kIGZzeW5jID0gbnVsbDsJCi0JTWV0aG9kIGZTZXRUZXh0ID0gbnVsbDsKLQlNZXRob2QgZlNldE1lc3NhZ2UgPSBudWxsOwotCU1ldGhvZCBmT3BlbiA9IG51bGw7Ci0JTWV0aG9kIGZHZXRXb3JrYmVuY2ggPSBudWxsOwotCUNsYXNzIGNTV1QgPSBudWxsOwotCQkKLQkKLQkvLyBBV1QgUmVmbGVjdGlvbnMKLQlDbGFzcyBjTWVzc2FnZURpYWxvZyA9IG51bGw7Ci0JTWV0aG9kIGZEb2l0ID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFR5cGUoKSB7Ci0JCWlmIChzZXR1cCkKLQkJCXJldHVybjsKLQkJCQotCQlzZXR1cCA9IHRydWU7Ci0JCQotCQkvLyBTZWUgaWYgdXNlIHN5c3RlbSBjb25zb2xlIGluc3RlYWQuIElmIGZhbHNlIG9yIG5vdCBzZXQsIHRoZW4gdHJ5IHRvIHF1ZXJ5IHVzYWdlLgkgCQkKLQkgCWNvbnNvbGUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKStQcm94eVJlbW90ZVV0aWwuSU9fQ09OU09MRSkpOyAvLyROT04tTkxTLTEkCi0JIAlpZiAoY29uc29sZSkKLQkgCQlyZXR1cm47Ci0JCQotCQl0cnkgewkJIAkJCi0JCSAJLy8gU2VlIGlmIFBsYXRmb3JtVUkgcGx1Z2luIGF2YWlsYWJsZS4KLQkJIAlCdW5kbGUgdWlCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVpIik7IC8vJE5PTi1OTFMtMSQKLQkJIAlpZiAodWlCdW5kbGUgPT0gbnVsbCkgewotCQkgCQlzZXR1cEFXVCgpOwkvLyBVSSBub3QgYXZhaWxhYmxlLCB0cnkgdGhyb3VnaCBBV1QuCi0JCSAJCXJldHVybjsKLQkJIAl9Ci0JCi0JIAkJLy8gU2V0dXAgRWNsaXBzZQotCQkgCUNsYXNzIGNQbGF0Zm9ybVVJID0gdWlCdW5kbGUubG9hZENsYXNzKCJvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJIik7IC8vJE5PTi1OTFMtMSQKLQkJIAlNZXRob2QgaXNXQlJ1bm5pbmcgPSBjUGxhdGZvcm1VSS5nZXRNZXRob2QoImlzV29ya2JlbmNoUnVubmluZyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCSAJaWYgKCEoKEJvb2xlYW4pIGlzV0JSdW5uaW5nLmludm9rZShudWxsLCBudWxsKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJIAkJc2V0dXBBV1QoKTsJLy8gVUkgbm90IGF2YWlsYWJsZSwgdHJ5IHRocm91Z2ggQVdULgotCQkgCQlyZXR1cm47Ci0JCSAJfQotCQkgCQotCQkgCWZHZXRXb3JrYmVuY2ggPSBjUGxhdGZvcm1VSS5nZXRNZXRob2QoImdldFdvcmtiZW5jaCIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCSAJT2JqZWN0IHcgPSBmR2V0V29ya2JlbmNoLmludm9rZShudWxsLCBudWxsKTsKLQotCQkJaWYgKHcgIT0gbnVsbCkgewotCSAJCQlDbGFzcyBjRGlzcGxheSA9IHVpQnVuZGxlLmxvYWRDbGFzcygib3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheSIpOyAvLyROT04tTkxTLTEkCi0JIAkJCU1ldGhvZCBmR2V0Q3VycmVudCA9IGNEaXNwbGF5LmdldE1ldGhvZCgiZ2V0Q3VycmVudCIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JIAkJCU1ldGhvZCBmR2V0RGVmYXVsdCA9IGNEaXNwbGF5LmdldE1ldGhvZCgiZ2V0RGVmYXVsdCIsIG51bGwpOwkgCQkJIC8vJE5PTi1OTFMtMSQKLQkgCQkJZmFzeW5jID0gY0Rpc3BsYXkuZ2V0TWV0aG9kKCJhc3luY0V4ZWMiLCBuZXcgQ2xhc3NbXSB7UnVubmFibGUuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCSAJCQlmc3luYyA9IGNEaXNwbGF5LmdldE1ldGhvZCgic3luY0V4ZWMiLCBuZXcgQ2xhc3NbXSB7UnVubmFibGUuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCSAJCQkKLQkgCQkJLy8gR2V0IHRoZSBkaXNwbGF5Ci0JIAkJCWRpc3BsYXkgPSBmR2V0Q3VycmVudC5pbnZva2UobnVsbCwgbnVsbCk7Ci0JIAkJCWlmIChkaXNwbGF5ID09IG51bGwpCi0JIAkJCQlkaXNwbGF5ID0gZkdldERlZmF1bHQuaW52b2tlKG51bGwsIG51bGwpOwotCQkJfQotCQkJCi0JCQlpZiAoZGlzcGxheSAhPSBudWxsKSB7IAkKLQkgCQkJQ2xhc3MgY1NoZWxsID0gdWlCdW5kbGUubG9hZENsYXNzKCJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCIpOyAvLyROT04tTkxTLTEkCi0JIAkJCUNsYXNzIGNNZXNzYWdlQm94ID0gdWlCdW5kbGUubG9hZENsYXNzKCJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94Iik7IC8vJE5PTi1OTFMtMSQKLQkgCQkJY01CID0gY01lc3NhZ2VCb3guZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge2NTaGVsbCwgSW50ZWdlci5UWVBFfSk7Ci0KLQkJCQlmU2V0VGV4dCA9IGNNZXNzYWdlQm94LmdldE1ldGhvZCgic2V0VGV4dCIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkJCWZTZXRNZXNzYWdlID0gY01lc3NhZ2VCb3guZ2V0TWV0aG9kKCJzZXRNZXNzYWdlIiwgbmV3IENsYXNzW10ge1N0cmluZy5jbGFzc30pOwkJCQkgLy8kTk9OLU5MUy0xJAotCQkJCWZPcGVuID0gY01lc3NhZ2VCb3guZ2V0TWV0aG9kKCJvcGVuIiwgbnVsbCk7CQkgCQkgLy8kTk9OLU5MUy0xJAkJCQkKLQkJIAkJCQotCSAJCQljU1dUID0gdWlCdW5kbGUubG9hZENsYXNzKCJvcmcuZWNsaXBzZS5zd3QuU1dUIik7IC8vJE5PTi1OTFMtMSQKLQkgCQkJZkFwcE1vZGVsID0gY1NXVC5nZXRGaWVsZCgiQVBQTElDQVRJT05fTU9EQUwiKTsgLy8kTk9OLU5MUy0xJAotCQkgCX0gZWxzZSB7Ci0JCSAJCXNldHVwQVdUKCk7CS8vIFVJIG5vdCBhdmFpbGFibGUsIHRyeSB0aHJvdWdoIEFXVC4KLQkJIAl9Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJcmV0dXJuOwkJIAkJCSAJCQotCQkgCQkJCi0JfQkKLQotCXByb3RlY3RlZCB2b2lkIHNldHVwQVdUKCkgewotCSAJCQotCSAJLy8gU2VlIGlmIEFXVCBpcyBhdmFpbGFibGUuCi0JIAl0cnkgewotCQkgCWNNZXNzYWdlRGlhbG9nID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5NZXNzYWdlRGlhbG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJIAlmRG9pdCA9IGNNZXNzYWdlRGlhbG9nLmdldE1ldGhvZCgiZG9pdCIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkgCWF3dCA9IHRydWU7Ci0JCSAJcmV0dXJuOwotCSAJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JIAl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCSAJfQotIAkJY29uc29sZSA9IHRydWU7CS8vIE5vIEFXVCBlaXRoZXIsIGkuZS4gdHJ1ZSBoZWFkbGVzcyBlbnZpcm9ubWVudAotCX0gCQotCQotCXB1YmxpYyBib29sZWFuIGRlYnVnTW9kZShmaW5hbCBTdHJpbmcgbmFtZSkgewotCSAJYm9vbGVhbiBkZWJ1Z01vZGUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKStQcm94eVJlbW90ZVV0aWwuREVCVUdfVk0pKTsgLy8kTk9OLU5MUy0xJAotCSAJaWYgKCFkZWJ1Z01vZGUpCi0JIAkJcmV0dXJuIGRlYnVnTW9kZTsKLQkgCQkKLQkgCXNldHVwVHlwZSgpOwotCi0JCS8vIFNlZSBpZiB1c2Ugc3lzdGVtIGNvbnNvbGUgaW5zdGVhZC4gSWYgZmFsc2Ugb3Igbm90IHNldCwgdGhlbiB0cnkgdG8gcXVlcnkgdXNhZ2UuCSAJCQotCSAJaWYgKGNvbnNvbGUpCi0JIAkJcmV0dXJuIGRlYnVnTW9kZUNvbnNvbGUobmFtZSk7Ci0JIAkJCi0JIAlpZiAoYXd0KQotCSAJCXJldHVybiBkZWJ1Z01vZGVBV1QobmFtZSk7Ci0JCQotCQl0cnkgewkJIAkJCi0gCQkJZmluYWwgRmllbGQgZlllcyA9IGNTV1QuZ2V0RmllbGQoIllFUyIpOyAvLyROT04tTkxTLTEkCi0gCQkJRmllbGQgZk5vID0gY1NXVC5nZXRGaWVsZCgiTk8iKTsgLy8kTk9OLU5MUy0xJAotIAkJCUZpZWxkIGZJY29uID0gY1NXVC5nZXRGaWVsZCgiSUNPTl9RVUVTVElPTiIpOyAvLyROT04tTkxTLTEkCi0JIAkJCQotIAkJCWZpbmFsIGludCBzdHlsZSA9IGZZZXMuZ2V0SW50KG51bGwpIHwgZk5vLmdldEludChudWxsKSB8IGZJY29uLmdldEludChudWxsKSB8IGZBcHBNb2RlbC5nZXRJbnQobnVsbCk7CSAJCQkKLSAJCQlmaW5hbCBib29sZWFuW10gZGIgPSBuZXcgYm9vbGVhblsxXTsKLQotCQkJZnN5bmMuaW52b2tlKGRpc3BsYXksIG5ldyBPYmplY3RbXSB7IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkvKioKLQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdCBzaGVsbCA9IGdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkJCQlPYmplY3QgbWIgPSBjTUIubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHtzaGVsbCwgbmV3IEludGVnZXIoc3R5bGUpfSk7CQkJCQkKLQkJCQkJCWZTZXRUZXh0Lmludm9rZShtYiwgbmV3IE9iamVjdFtdIHsiRGVidWcgUmVtb3RlVk0/In0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQlmU2V0TWVzc2FnZS5pbnZva2UobWIsIG5ldyBPYmplY3RbXSB7IkRvIHlvdSB3YW50IHRvIHN0YXJ0IHRoZSByZW1vdGUgdm0gKCIrbmFtZSsiKSBpbiBkZWJ1ZyBtb2RlPyJ9KTsJLy8gTm90IE5MUydkIGJlY2F1c2UgdGhpcyBpcyBmb3IgaW50ZXJuYWwgZGV2ZWxvcGVycyBvbmx5IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQotCQkJCQkJZGJbMF0gPSBmWWVzLmdldChudWxsKS5lcXVhbHMoZk9wZW4uaW52b2tlKG1iLCBudWxsKSk7Ci0JCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9fSk7Ci0JCSAJcmV0dXJuIGRiWzBdOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJcmV0dXJuIGRlYnVnTW9kZUFXVChuYW1lKTsKLSAJfQotIAkKLQotCS8qCi0JICogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZGlzcGxheSB0aHJlYWQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRBY3RpdmVTaGVsbCgpIHsKLQkgCU9iamVjdCBzaGVsbCA9IG51bGw7CQkKLQkJdHJ5IHsKLQkJCU9iamVjdCB3ID0gZkdldFdvcmtiZW5jaC5pbnZva2UobnVsbCwgbnVsbCk7Ci0JCQlPYmplY3Qgd3cgPSBudWxsOwotCQkJaWYgKHcgIT0gbnVsbCkgewotCQkJIAlDbGFzcyBjV29ya2JlbmNoID0gdy5nZXRDbGFzcygpOwotCQkJIAlNZXRob2QgZ2V0V29ya2JlbmNoV2luZG93ID0gY1dvcmtiZW5jaC5nZXRNZXRob2QoImdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJd3cgPSBnZXRXb3JrYmVuY2hXaW5kb3cuaW52b2tlKHcsIG51bGwpOwotCQkJfQotCQkJaWYgKHd3ICE9IG51bGwpIHsKLQkJCQlDbGFzcyBjV29ya2JlbmNoV2luZG93ID0gd3cuZ2V0Q2xhc3MoKTsKLQkJCQlNZXRob2QgZ2V0U2hlbGwgPSBjV29ya2JlbmNoV2luZG93LmdldE1ldGhvZCgiZ2V0U2hlbGwiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNoZWxsID0gZ2V0U2hlbGwuaW52b2tlKHd3LCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JIAkKLQkgCXJldHVybiBzaGVsbDsKLQl9CQotCQkgCQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnTW9kZUFXVChTdHJpbmcgbmFtZSkgewotCSAJCQotCSAJLy8gU2VlIGlmIEFXVCBpcyBhdmFpbGFibGUuCi0JIAl0cnkgewotCQkgCUludGVnZXIgciA9IChJbnRlZ2VyKSBmRG9pdC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsiRGVidWcgUmVtb3RlVk0/IiwgIkRvIHlvdSB3YW50IHRvIHN0YXJ0IHRoZSByZW1vdGUgdm0gKCIrbmFtZSsiKSBpbiBkZWJ1ZyBtb2RlPyIsICJZZXMiLCAiTm8ifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkgCXJldHVybiByLmludFZhbHVlKCkgPT0gMTsJLy8gaS5lLiBidXR0b24xIG9yICJ5ZXMiIHdhcyBoaXQuCi0JIAl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkgCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCSAJfQotCSAJCi0gCQlyZXR1cm4gZmFsc2U7CS8vIE5vIEFXVCBlaXRoZXIsIGkuZS4gaGVhZGxlc3MgZW52aXJvbm1lbnQsIHNob3VsZG4ndCBvZiBnb3R0b24gaGVyZS4KLQl9IAkKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1Z01vZGVDb25zb2xlKFN0cmluZyBuYW1lKSB7Ci0JIAkJCi0JIAkvLyBEZWJ1ZyB0aHJvdWdoIHRoZSBjb25zb2xlCi0gCQlpblJlYWRlciA9IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbik7Ci0gCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvIHlvdSB3YW50IHRvIHN0YXJ0IHRoZSByZW1vdGUgdm0gKCIrbmFtZSsiKSBpbiBkZWJ1ZyBtb2RlPyAoRW50ZXIgWSBvciBOKToiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gCQljaGFyIHIgPSAnICc7Ci0gCQl0cnkgewotIAkJCXIgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGluUmVhZGVyLnJlYWQoKSk7Ci0gCQkJLy8gTmVlZCB0byBmbHVzaCB0aGUgaW5wdXQgcmVhZGVyIG5vdy4KLSAJCQl3aGlsZSAoaW5SZWFkZXIucmVhZHkoKSkKLSAJCQkJaW5SZWFkZXIucmVhZCgpOwotCQkgCXJldHVybiByID09ICd5JzsJLy8gaS5lLiAieSIgd2FzIGVudGVyZWQuCSAJCQkKLSAJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotIAkJfQotCSAJCi0gCQlyZXR1cm4gZmFsc2U7CS8vIEVycm9yIHJlYWRpbmcsIHNvIG5vIGRlYnVnZ2luZy4KLQl9IAotIAkKLSAJLyoqCi0gCSAqIFJldHVybiB0cnVlIGlmIGNvbnRpbnVlIGRlYnVnZ2luZy4KLSAJICovCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0UG9ydChmaW5hbCBpbnQgZHBvcnQpIHsKLSAJCWlmIChhd3QpCi0gCQkJcmV0dXJuIHByb21wdFBvcnRBV1QoZHBvcnQpOwotIAkJZWxzZSBpZiAoY29uc29sZSkKLSAJCQlyZXR1cm4gcHJvbXB0UG9ydENvbnNvbGUoZHBvcnQpOwotIAkJCQotIAkJdHJ5IHsJCi0JCQlmaW5hbCBGaWVsZCBmT0sgPSBjU1dULmdldEZpZWxkKCJPSyIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWVsZCBmQ2FuY2VsID0gY1NXVC5nZXRGaWVsZCgiQ0FOQ0VMIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpZWxkIGZJY29uID0gY1NXVC5nZXRGaWVsZCgiSUNPTl9XT1JLSU5HIik7IC8vJE5PTi1OTFMtMSQKLQkgCQkJCi0JCQlmaW5hbCBpbnQgc3R5bGUgPSBmT0suZ2V0SW50KG51bGwpIHwgZkNhbmNlbC5nZXRJbnQobnVsbCkgfCBmSWNvbi5nZXRJbnQobnVsbCkgfCBmQXBwTW9kZWwuZ2V0SW50KG51bGwpOwotCi0JCQlmaW5hbCBib29sZWFuW10gb2sgPSBuZXcgYm9vbGVhblsxXTsKLQkJCWZzeW5jLmludm9rZShkaXNwbGF5LCBuZXcgT2JqZWN0W10geyBuZXcgUnVubmFibGUoKSB7CQotCQkJCS8qKgotCQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IHNoZWxsID0gZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCQkJCU9iamVjdCBtYiA9IGNNQi5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge3NoZWxsLCBuZXcgSW50ZWdlcihzdHlsZSl9KTsJCQkJCQotCQkJCQkJZlNldFRleHQuaW52b2tlKG1iLCBuZXcgT2JqZWN0W10geyJDb25uZWN0IERlYnVnZ2VyIHRvIFJlbW90ZVZNISJ9KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZlNldE1lc3NhZ2UuaW52b2tlKG1iLCBuZXcgT2JqZWN0W10geyJZb3UgbXVzdCBub3cgYXR0YWNoIHRoZSBkZWJ1Z2dlciB0byBwb3J0IG51bWJlciAiK2Rwb3J0KyIuIFByZXNzIE9LIHdoZW4gdGhlIGRlYnVnZ2VyIGlzIGF0dGFjaGVkLiBUaGUgcHJvZ3JhbSB3aWxsIG5vdCBjb250aW51ZSBwcm9wZXJseSB3aXRob3V0IHRoZSBkZWJ1Z2dlciBiZWluZyBhdHRhY2hlZC4gUHJlc3MgQ2FuY2VsIGlmIHlvdSBjb3VsZCBub3QgY29ubmVjdCB0aGUgZGVidWdnZXIuIFRoaXMgd2lsbCBzdGlsbCBjYXVzZSBhbiBlcnJvciwgYnV0IGl0IHdpbGwgY2xlYW4gdXAgYmV0dGVyLiJ9KTsJLy8gTm90IE5MUydkIGJlY2F1c2UgdGhpcyBpcyBmb3IgaW50ZXJuYWwgZGV2ZWxvcGVycyBvbmx5IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJb2tbMF0gPSBmT0suZ2V0KG51bGwpLmVxdWFscyhmT3Blbi5pbnZva2UobWIsIG51bGwpKTsKLQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX19KTsJCQkKLQkJCXJldHVybiBva1swXTsKLSAJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLSAJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotIAkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gCQl9Ci0gCQlyZXR1cm4gZmFsc2U7Ci0JfQkgCQotIAkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRQb3J0QVdUKGludCBkcG9ydCkgewotCQl0cnkgewotCQkgCUludGVnZXIgciA9IChJbnRlZ2VyKSBmRG9pdC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsiQ29ubmVjdCBEZWJ1Z2dlciB0byBSZW1vdGVWTSEiLCAiWW91IG11c3Qgbm93IGF0dGFjaCB0aGUgZGVidWdnZXIgdG8gcG9ydCBudW1iZXIgIitkcG9ydCsiLiBQcmVzcyBPSyB3aGVuIHRoZSBkZWJ1Z2dlciBpcyBhdHRhY2hlZC4gVGhlIHByb2dyYW0gd2lsbCBub3QgY29udGludWUgcHJvcGVybHkgd2l0aG91dCB0aGUgZGVidWdnZXIgYmVpbmcgYXR0YWNoZWQuIFByZXNzIENhbmNlbCBpZiB5b3UgY291bGQgbm90IGNvbm5lY3QgdGhlIGRlYnVnZ2VyLiBUaGlzIHdpbGwgc3RpbGwgY2F1c2UgYW4gZXJyb3IsIGJ1dCBpdCB3aWxsIGNsZWFuIHVwIGJldHRlci4iLCAiT0siLCAiQ2FuY2VsIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJIAlyZXR1cm4gci5pbnRWYWx1ZSgpID09IDE7CS8vIGkuZS4gYnV0dG9uMSBvciAiT0siIHdhcyBoaXQuCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJfQotIAkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCSAJCi0gCXByb3RlY3RlZCBib29sZWFuIHByb21wdFBvcnRDb25zb2xlKGludCBkcG9ydCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIllvdSBtdXN0IG5vdyBhdHRhY2ggdGhlIGRlYnVnZ2VyIHRvIHBvcnQgbnVtYmVyICIrZHBvcnQrIi4gRW50ZXIgJ3knIHdoZW4gdGhlIGRlYnVnZ2VyIGlzIGF0dGFjaGVkLiBUaGUgcHJvZ3JhbSB3aWxsIG5vdCBjb250aW51ZSBwcm9wZXJseSB3aXRob3V0IHRoZSBkZWJ1Z2dlciBiZWluZyBhdHRhY2hlZC4gUHJlc3MgJ24nIGlmIHlvdSBjb3VsZCBub3QgY29ubmVjdCB0aGUgZGVidWdnZXIuIFRoaXMgd2lsbCBzdGlsbCBjYXVzZSBhbiBlcnJvciwgYnV0IGl0IHdpbGwgY2xlYW4gdXAgYmV0dGVyLiBFbnRlciAneScgb3IgJ24nOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY2hhciByID0gJyAnOwotCQl0cnkgewotCQkJciA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgaW5SZWFkZXIucmVhZCgpKTsKLSAJCQl3aGlsZSAoaW5SZWFkZXIucmVhZHkoKSkKLSAJCQkJaW5SZWFkZXIucmVhZCgpOwotCQkJcmV0dXJuIHIgPT0gJ3knOwkvLyBpLmUuICJ5IiB3YXMgZW50ZXJlZCwgZ28gb24KLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLSAJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIERpc3BsYXkgYW4gZXJyb3IgbXNnLiBUaGVyZSB3aWxsIG9ubHkgYmUgYW4gT0sgYnV0dG9uLgotCSAqIFRoaXMgd2lsbCBhbHdheXMgZGlzcGxheSwgZGVidWcgbW9kZSB3b24ndCBiZSBsb29rZWQgYXQuCi0JICogVGhpcyBpcyBmb3IgZXJyb3JzLiBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGFzeW5jLCBzbyB0aGlzCi0JICogbWF5IHJldHVybiBiZWZvcmUgdGhlIG1zZyBoYXMgYmVlbiBkaXNwbGF5ZWQgYW5kIGFuc3dlcmVkLAotCSAqIGJ1dCBzaW5jZSB0aGUgb25seSByZXNwb25zZSBpcyBPSywgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvck1lc3NhZ2UoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCXNldHVwVHlwZSgpOwotCQlpZiAoY29uc29sZSkKLQkJCWRpc3BsYXlFcnJvck1lc3NhZ2VDb25zb2xlKHRpdGxlLCBtc2cpOwotCQllbHNlIGlmIChhd3QpCi0JCQlkaXNwbGF5RXJyb3JNZXNzYWdlQVdUKHRpdGxlLCBtc2cpOwotCQllbHNlIHsKLQkJCXRyeSB7IC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpbiBkaXNwbGF5IHRocmVhZC4KLQkJCQlGaWVsZCBmT0sgPSBjU1dULmdldEZpZWxkKCJPSyIpOyAvLyROT04tTkxTLTEkCi0JCQkJRmllbGQgZkljb24gPSBjU1dULmdldEZpZWxkKCJJQ09OX0VSUk9SIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWZpbmFsIGludCBzdHlsZSA9IGZPSy5nZXRJbnQobnVsbCkgfCBmSWNvbi5nZXRJbnQobnVsbCkgfCBmQXBwTW9kZWwuZ2V0SW50KG51bGwpOwotCQkJCWZhc3luYy5pbnZva2UoZGlzcGxheSwgbmV3IE9iamVjdFtdIHsgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJLyoqCi0JCQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJCQkJICovCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7IHRyeSB7IE9iamVjdCBzaGVsbCA9IGdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkJCQkJCU9iamVjdCBtYiA9IGNNQi5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyBzaGVsbCwgbmV3IEludGVnZXIoc3R5bGUpfSk7Ci0KLQkJCQkJCQkJZlNldFRleHQuaW52b2tlKG1iLCBuZXcgT2JqZWN0W10geyB0aXRsZSB9KTsKLQkJCQkJCQkJZlNldE1lc3NhZ2UuaW52b2tlKG1iLCBuZXcgT2JqZWN0W10geyBtc2cgfSk7Ci0JCQkJCQkJCWZPcGVuLmludm9rZShtYiwgbnVsbCk7Ci0JCQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQkKLQkKLSAJcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVycm9yTWVzc2FnZUNvbnNvbGUoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6ICIgKyB0aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIiArIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVycm9yTWVzc2FnZUFXVChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJdHJ5IHsKLQkJIAlmRG9pdC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHt0aXRsZSwgbXNnLCBQcm94eVJlbW90ZU1lc3NhZ2VzLk9LXzcsIG51bGx9KTsgCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0JCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1CZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlYTQ5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1CZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElSRU1CZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEEgUmVtb3RlIFZNIHByb3h5LiBBbGwgSUJlYW5Qcm94eSBpbXBsZW1lbnRhdGlvbnMKLSAqIGZvciB0aGUgUmVtb3RlIFZNIG11c3QgYWxzbyBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGZ1bmN0aW9uaW5nLgotICoKLSAqIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSBSZW1vdGUgVk0gUHJveHkuCi0gKiBJdCBNVVNUIG5vdCBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIHByb3h5IGZhY3RvcnkgZmFtaWx5LgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJFTUJlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHkgewotCS8qKgotCSAqIFJldHVybiB0aGUgSUQgb2YgdGhpcyBwcm94eQotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldElEKCk7Ci0JCi0JLyoqCi0JICogUHJveHkgaXMgYWJvdXQgdG8gYmUgcmVsZWFzZWQsIE1VU1QgbWFyayBpdCBpbnZhbGlkLgotCSAqIFRoaXMgaXMgcmVxdWlyZWQuIFJlc291cmNlcyBjYW4gYWxzbyBiZSBjbGVhbmVkIHVwCi0JICogaWYgdGhleSBhcmUgYmVpbmcgaGVsZCBhbmQgbmVlZCB0byBiZSBjbGVhbmVkIHVwLgotCSAqCi0JICogTk9URTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBwcm94eQotCSAqIGlzIGV4cGxpY2l0bHkgcmVsZWFzZWQuIElmIGl0IGlzIHNpbXBseSBnYXJiYWdlIGNvbGxlY3RlZCwKLQkgKiB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZC4gU2ltcGxlIGdhcmJhZ2UgY29sbGVjdGlvbgotCSAqIG1lYW5zIHRoYXQgbm8gb25lIGlzIHJlZmVyZW5jaW5nIHRoaXMgcHJveHkuIFRoZSBwcm94eSBmYWN0b3J5Ci0JICogd2lsbCBrbm93IHdoYXQgaWQgdGhpcyBwcm94eSB3YXMgcmVmZXJlbmNpbmcgYW5kIHdpbGwgcmVsZWFzZSBpdAotCSAqIG9uIHRoZSBzZXJ2ZXIgYXQgR0MgdGltZS4KLQkgKgotCSAqIElmIHRoZXJlIGFyZSByZXNvdXJjZXMKLQkgKiB0aGF0IGFic29sdXRlbHkgbXVzdCBiZSByZWxlYXNlZCwgdGhlbiB0aGUgZmluYWxpemUgbWV0aG9kCi0JICogc2hvdWxkIGJlIGltcGxlbWVudGVkIHRvIGRvIHRoZSBjbGVhbiB1cC4gSG93ZXZlciwgdHJ5IG5vdAotCSAqIHRvIGhhdmUgdGhpcyBiZSB0aGUgY2FzZS4gRmluYWxpemUgbWV0aG9kcyBhZGQgb3ZlcmhlYWQgdGhhdCBpcwotCSAqIHVzdWFsbHkgYmV0dGVyIG5vdCB0byBoYXZlLiBUaGUgYmV0dGVyIHdheSBpcyBmb3IgYW55IHVzZXJzCi0JICogdGhhdCBnZXQgdGhpcyBraW5kIG9mIHByb3h5IG9iamVjdCBrbm93IHRvIGNhbGwgcmVsZWFzZSBvbgotCSAqIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHRvIHJlbGVhc2UgaXQgYmVmb3JlIGdhcmJhZ2UgY29sbGVjdGlvbi4JIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLQkKLQkvKioKLQkgKiBSZW5kZXIgdGhpcyBiZWFuIGZvciB0cmFuc3BvcnQgdG8gdGhlIHNlcnZlciBpbnRvIGEgQ29tbWFuZHMuVmFsdWVPYmplY3QuCi0JICogRm9yIGV4YW1wbGUsIGEgc3RyaW5nIG1heSBwdXQgYSBzdHJpbmcuIEFuIGlkIHR5cGUgbWF5IHB1dCBvdXQgdGhlIGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgcmVuZGVySW50byk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1CZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1CZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMGZjNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogSVJFTUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIEFsbCBiZWFuIHR5cGUgcHJveGllcyBpbiByZW1vdGUgdm0gbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKgotICogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBpbnRlcmZhY2UgdG8gdGhlIFJlbW90ZSBWTSBQcm94eS4KLSAqIEl0IE1VU1Qgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgcHJveHkgZmFjdG9yeSBmYW1pbHkuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1CZWFuVHlwZVByb3h5IGV4dGVuZHMgSUJlYW5UeXBlUHJveHksIElSRU1CZWFuUHJveHkgewotCQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpOwotCi0vKioKLSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM3N2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElSRU1CZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogSW50ZXJmYWNlIGZvciBSZW1vdGUgVk0gQmVhbiBUeXBlIFByb3h5IEZhY3Rvcmllcy4KLSAqIEFsbCBleHRlbnNpb24gZmFjdG9yaWVzIGZvciBSZW1vdGUgVk0gbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkgZXh0ZW5kcyBJQmVhblR5cGVQcm94eUZhY3RvcnkgewotLyoqCi0gKiBSZXR1cm4gYSBiZWFuIHR5cGUgcHJveHkgZm9yIHRoZSBjbGFzcyBuYW1lLgotICogUmV0dXJuIG51bGwgaWYgdGhlIGV4dGVuc2lvbiBmYWN0b3J5IGRvZXNuJ3QgaGFuZGxlIHRoaXMgY2xhc3MuCi0gKiBEb24ndCByZWdpc3RlciBhbnkgcHJveGllcyByZXR1cm5lZCwgdGhleSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVnaXN0ZXJlZC4KLSAqIFRoaXMgc2hvdWxkIG9ubHkgcmV0dXJuIGJlYW4gdHlwZSBwcm94aWVzIHdoZXJlIHRoZSBmYWN0b3J5IGNhbiBkZXRlcm1pbmUKLSAqIGV2ZXJ5dGhpbmcgaXQgbmVlZHMsIHN1Y2ggYXMgc3VwZXJ0eXBlIGFuZCBjbGFzc0lELgotICogTk9URTogVGhpcyBpcyBpbXBsZW1lbnRlZCBmb3IgdGhlIHVzYWdlIG9mIHRoZQotICogICAgICAgc3RhbmRhcmQgQmVhblR5cGUgcHJveHkgZmFjdG9yeS4gSXQgc2hvdWxkCi0gKiAgICAgICBOT1QgYmUgY2FsbGVkIGJ5IGFueW9uZSBlbHNlLiBUaGV5IHNob3VsZAotICogICAgICAgZ28gdGhyb3VnaCB0aGUgSVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5Ci0gKiAgICAgICBpbnN0ZWFkLiBUaGUgc3RhbmRhcmQgYmVhbiB0eXBlIGZhY3RvcnkKLSAqICAgICAgIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCBvbiB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgIGV4dGVuc2lvbiB3aGVuIGl0IG5lZWRzIHRvLgotICoKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjY6MTIgUE0pCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSk7CQotCi0vKioKLSAqIFJldHVybiBhIGJlYW4gdHlwZSBwcm94eSBmb3IgdGhlIGNsYXNzIG5hbWUuCi0gKiBSZXR1cm4gbnVsbCBpZiB0aGUgZXh0ZW5zaW9uIGZhY3RvcnkgZG9lc24ndCBoYW5kbGUgdGhpcyBjbGFzcy4KLSAqIERvbid0IHJlZ2lzdGVyIGFueSBwcm94aWVzIHJldHVybmVkLCB0aGV5IHdpbGwgYXV0b21hdGljYWxseSBiZSByZWdpc3RlcmVkLgotICogVGhpcyBzaG91bGQgb25seSByZXR1cm4gYmVhbiB0eXBlIHByb3hpZXMgd2hlcmUgdGhlIGZhY3RvcnkgY2FuIGRldGVybWluZQotICogZXZlcnl0aGluZyBpdCBuZWVkcywgc3VjaCBhcyBzdXBlcnR5cGUgYW5kIGNsYXNzSUQuCi0gKiBOT1RFOiBUaGlzIGlzIGltcGxlbWVudGVkIGZvciB0aGUgdXNhZ2Ugb2YgdGhlCi0gKiAgICAgICBzdGFuZGFyZCBCZWFuVHlwZSBwcm94eSBmYWN0b3J5LiBJdCBzaG91bGQKLSAqICAgICAgIE5PVCBiZSBjYWxsZWQgYnkgYW55b25lIGVsc2UuIFRoZXkgc2hvdWxkCi0gKiAgICAgICBnbyB0aHJvdWdoIHRoZSBJU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkKLSAqICAgICAgIGluc3RlYWQuIFRoZSBzdGFuZGFyZCBiZWFuIHR5cGUgZmFjdG9yeQotICogICAgICAgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIG9uIHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgZXh0ZW5zaW9uIHdoZW4gaXQgbmVlZHMgdG8uCi0gCi0gKiBAcGFyYW0gdHlwZU5hbWUKLSAqIEBwYXJhbSBleHByZXNzaW9uCi0gKiBAcmV0dXJuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgSVByb3h5QmVhblR5cGUgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUsIElFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCi0vKioKLSAqIFJldHVybiBhIGJlYW4gdHlwZSBwcm94eSBmb3IgdGhlIGNsYXNzIGlkIGFuZCBjbGFzcyBuYW1lLgotICogUmV0dXJuIG51bGwgaWYgdGhlIGV4dGVuc2lvbiBmYWN0b3J5IGRvZXNuJ3QgaGFuZGxlIHRoaXMgY2xhc3MuIAotICogRG9uJ3QgcmVnaXN0ZXIgYW55IHByb3hpZXMgcmV0dXJuZWQsIHRoZXkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJlZ2lzdGVyZWQuIAotICogVGhpcyB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgY2FzZSB0aGF0IGEgbmV3IGNsYXNzIGlkIHdhcyByZXR1cm5lZAotICogZnJvbSB0aGUgc2VydmVyIHRoYXQgd2UgZG9uJ3QgaGF2ZSByZWdpc3RlcmVkIHlldC4gSW1wbGVtZW50ZXJzIHdpbGwKLSAqIGNyZWF0ZWQgYSBwcm94eSBvdXQgb2YgdGhlIG5hbWUgYW5kIHRoZSBpZCBhbmQgcmV0dXJuIGl0LgotICogVGhlIHN1cGVydHlwZSB3aWxsIGJlIHBhc3NlZCBpbiBzbyB0aGF0IHRoZSBleHRlbnNpb24gZmFjdG9yeSBkb2Vzbid0IG5lZWQgdG8KLSAqIHRyeSB0byBmaW5kIGl0LgotICogTk9URTogVGhpcyBpcyBpbXBsZW1lbnRlZCBmb3IgdGhlIHVzYWdlIG9mIHRoZQotICogICAgICAgc3RhbmRhcmQgQmVhblR5cGUgcHJveHkgZmFjdG9yeS4gSXQgc2hvdWxkCi0gKiAgICAgICBOT1QgYmUgY2FsbGVkIGJ5IGFueW9uZSBlbHNlLiBUaGV5IHNob3VsZAotICogICAgICAgZ28gdGhyb3VnaCB0aGUgSVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5Ci0gKiAgICAgICBpbnN0ZWFkLiBUaGUgc3RhbmRhcmQgYmVhbiB0eXBlIGZhY3RvcnkKLSAqICAgICAgIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCBvbiB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgIGV4dGVuc2lvbiB3aGVuIGl0IG5lZWRzIHRvLgotICoKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjY6MTIgUE0pCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSwgSW50ZWdlciBjbGFzc0lELCBJQmVhblR5cGVQcm94eSBzdXBlclR5cGUpOwkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUNvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUNvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiNjUzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogSVJFTUNvbm5lY3Rpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogSW50ZXJmYWNlIGZvciB0aGUgUmVtb3RlIFZNIENvbm5lY3Rpb24gb2JqZWN0LgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJFTUNvbm5lY3Rpb24gewotCQotCS8qKgotCSAqIERpZCB0aGlzIGNvbnN0cnVjdCBjb3JyZWN0bHkuCi0JICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBhbiBleGNlcHRpb24gY291bGQgYmUgdGhyb3duIGluIHRoZSBjdG9yIGFuZAotCSAqIHRoYXQncyBub3QgYSBnb29kIHRoaW5nIHRvIGRvLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCk7Ci0JCi0JLyoqCi0JICogVGVybWluYXRlIHRoZSBzZXJ2ZXIuCi0JICogV0FSTklORzogVGhpcyBpcyBvbmx5IGhlcmUgc28gdGhhdCBmYWN0b3J5IGNhbiB0byBpdC4gVGVybWluYXRpb24gc2hvdWxkIE9OTFkKLQkgKiBiZSBkb25lIGJ5IHRoZSBGYWN0b3J5IG5vdCBhbnkgb25lIGVsc2UuIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZVNlcnZlcigpOwotCQkJCi0JLyoqCi0JICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGNsYXNzIGluZm9ybWF0aW9uLiBOdWxsIHJldHVybiBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIENvbW1hbmRzLkdldENsYXNzUmV0dXJuIGdldENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpZC4gCi0JICovCi0JIHB1YmxpYyBDb21tYW5kcy5HZXRDbGFzc0lEUmV0dXJuIGdldENsYXNzRnJvbUlEKGludCBjbGFzc0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotCQotCi0JLyoqCi0JICogR2V0IG9iamVjdCBkYXRhIGZyb20gYW4gaWQuCi0JICovCQotCXB1YmxpYyB2b2lkIGdldE9iamVjdERhdGEoaW50IG9iamVjdElELCBDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZVJldHVybikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0JCQotCS8qKgotCSAqIEdldCBhIG5ldyBpbnN0YW5jZSB1c2luZyB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldE5ld0luc3RhbmNlKGludCBjbGFzc0lELCBTdHJpbmcgaW5pdFN0cmluZywgQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV3SW5zdGFuY2UpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCQkKLQkvKioKLQkgKiBJbnZva2UgdGhlIGdldCBhcnJheSBjb250ZW50cyBjb21tYW5kLgotCSAqIEBwYXJhbSBhcnJheUlECi0JICogQHBhcmFtIHJldHVyblZhbHVlCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QXJyYXlDb250ZW50cyhpbnQgYXJyYXlJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEludm9rZSB0aGUgbWV0aG9kIGNhbGwuCi0JICogVGhlIHBhcm1zIHZhbHVlT2JqZWN0IG11c3QgcmVwcmVzZW50IGFuIE9iamVjdFtdIChlaXRoZXIgdGhyb3VnaCBBUlJBWV9JRFMgb3IgT0JKRUNUKQotCSAqLwkKLQlwdWJsaWMgdm9pZCBpbnZva2VNZXRob2QoaW50IG1ldGhvZElELCBDb21tYW5kcy5WYWx1ZU9iamVjdCBpbnZva2VPbiwgQ29tbWFuZHMuVmFsdWVPYmplY3QgcGFybXMsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEludm9rZSB0aGUgbWV0aG9kIGNhbGwgd2l0aCBtZXRob2QgcGFzc2VkLgotCSAqIFRoZSBwYXJtcyB2YWx1ZU9iamVjdCBtdXN0IHJlcHJlc2VudCBhbiBPYmplY3RbXSAoZWl0aGVyIHRocm91Z2ggQVJSQVlfSURTIG9yIE9CSkVDVCkKLQkgKi8JCi0JcHVibGljIHZvaWQgaW52b2tlTWV0aG9kKENvbW1hbmRzLlZhbHVlT2JqZWN0IGNsYXNzVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1UeXBlcywgQ29tbWFuZHMuVmFsdWVPYmplY3QgaW52b2tlT24sIENvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1zLCBDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHRoZSBpZC4gSXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBvbiB0aGUgY2xpZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VJRChpbnQgaWQpOwotCQotCS8qKgotCSAqIFJlYWQgYXJyYXkgdmFsdWVzIGFzIEJlYW5Qcm94aWVzIGludG8gdmFsdWVTZW5kZXIuCi0JICogQHBhcmFtIHJldHVyblZhbHVlCi0JICogQHBhcmFtIHZhbHVlU2VuZGVyCi0JICogQHBhcmFtIGFsbG93RmxhZyA8Y29kZT50cnVlPC9jb2RlPiB0byBhbGxvdyBGTEFHIHZhbHVlcywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCBhbGxvdyBmbGFnIHZhbHVlcy4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUHJveHlBcnJheVZhbHVlcyhDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSwgQ29tbWFuZHMuVmFsdWVTZW5kZXIgdmFsdWVTZW5kZXIsIGJvb2xlYW4gYWxsb3dGbGFnKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUNvbnN0YW50QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGRhYWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUNvbnN0YW50QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBJUkVNQ29uc3RhbnRCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotLyoqCi0gKiBUYWcgaW50ZXJmYWNlIHRvIGluZGljYXRlIHRoaXMgcHJveHkgaXMgYSBjb25zdGFudCBwcm94eSwgaS5lLiB0aGVyZQotICogaXMgbm8gYmVhbiBvbiB0aGUgc2VydmVyIHJlcHJlc2VudGluZyB0aGlzIChlLmcuIFN0cmluZ3MgYW5kIEludGVnZXJzKS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1Db25zdGFudEJlYW5Qcm94eSBleHRlbmRzIElSRU1CZWFuUHJveHkgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25zdGFudEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWE3MzUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgYW55IEJlYW5UeXBlIHRoYXQgcmVwcmVzZW50cyBhIGNvbnN0YW50IHR5cGUgYmVhbi4KLSAqIFRoZXNlIGFyZSB0eXBlcyB0aGF0IGFyZSBpbW11dGFibGUgYW5kIGEgY29weSBvZiB0aGUgYWN0dWFsIHZhbHVlIGlzIGtlcHQgaGVyZQotICogaW4gdGhlIGNsaWVudCBhbmQgbm90IHN0b3JlZCBhcyBhbiBvYmplY3QgaWQuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IGV4dGVuZHMgSUJlYW5UeXBlUHJveHkgewotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1FeHByZXNzaW9uQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGUwNDdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLSAKLS8qKgotICogQWRkaXRpb25hbCBmdW5jdGlvbiBvbiBhIGNvbm5lY3Rpb24gZm9yIGV4cHJlc3Npb24gdHJlZSBwcm9jZXNzaW5nLgotICogQ29ubmVjdGlvbnMgcmV0dXJuZWQgKElSRU1Db25uZWN0aW9ucykgd2lsbCBhbHdheXMgYWxzbyBpbXBsZW1lbnQgSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uLAotICogYnV0IHRoZXkgYXJlIHNlcGFyYXRlZCBzbyB0aGF0IGV4cHJlc3Npb24gZnVuY3Rpb25zIGRvbid0IHBvbGx1dGUgdGhlIHJlZ3VsYXIKLSAqIGNvbm5lY3Rpb24gaW50ZXJmYWNlIHdpdGggYWRkZWQgY29tbWFuZHMgdGhhdCBzaG91bGRuJ3QgYmUgY2FsbGVkIGV4Y2VwdAotICogd2hlbiBwcm9jZXNzaW5nIGFuIGV4cHJlc3Npb24uIElmIHRoZXkgd2VyZSBjYWxsZWQgb3V0IG9mIG9yZGVyLCBiaWcgcHJvYmxlbXMKLSAqIGNhbiBvY2N1ci4KLSAqIDxwPgotICogVG8gdXNlLCBzaW1wbHkgY2FzdCB0aGUgSVJFTUNvbm5lY3Rpb24gdG8gYmUgYW4gSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gZXh0ZW5kcyBJUkVNQ29ubmVjdGlvbiB7Ci0JCi0JLyoqCi0JICogU3RhcnQgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQgCi0JICogQHBhcmFtIHRyYWNlIFRPRE8KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFeHByZXNzaW9uUHJvY2Vzc2luZyhpbnQgZXhwcmVzc2lvbklELCBieXRlIHRyYWNlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVHJhbnNmZXIgdGhlIGV4cHJlc3Npb24uIFRoaXMgdGVsbHMgdGhlIHJlbW90ZSB2bSB0byBzdG9wIHByb2Nlc3Npbmcgb24gdGhlCi0JICogZ2l2ZW4gY29ubmVjdGlvbiBhbmQgcmV0dXJuIHRoZSBleHByZXNzaW9uIHByb2Nlc3NpbmcgY29udHJvbGxlciBmb3IgdGhlIGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRAotCSAqIEBwYXJhbSBleHBDb250cm9sbGVyCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zZmVyRXhwcmVzc2lvbihpbnQgZXhwcmVzc2lvbklELCBDb21tYW5kcy5WYWx1ZU9iamVjdCBleHBDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXN1bWUgdGhlIGV4cHJlc3Npb24gb24gdGhpcyBjb25uZWN0aW9uLgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQKLQkgKiBAcGFyYW0gZXhwQ29udHJvbGxlciBleHByZXNzaW9uIHByb2Nlc3NvciBjb250cm9sbGVyIHRvIHVzZSBmb3IgdGhlIGV4cHJlc3Npb24gb24gdGhpcyBuZXcgY29ubmVjdGlvbi4KLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lRXhwcmVzc2lvbihpbnQgZXhwcmVzc2lvbklELCBDb21tYW5kcy5WYWx1ZU9iamVjdCBleHBDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBQdXNoIGFuIGV4cHJlc3Npb24gY29tbWFuZC4gVGhpcyBpcyB0aGUgY29tbW9uIHBvcnRpb24gb2YgdGhlCi0JICogc3ViY29tbWFuZC4gVGhlIGFjdHVhbCBkYXRhIG9mIHRoZSBjb21tYW5kIHdpbGwgYmUgc2VwYXJhdGVseSBkb25lLgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQgCi0JICogQHBhcmFtIHN1YmNvbW1hbmQgVGhlIHN1YmNvbW1hbmQgYmVpbmcgc2VudC4gRnJvbSBJSW50ZXJuYWxFeHByZXNzaW9uQ29uc3RhbnRzLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSUludGVybmFsRXhwcmVzc2lvbkNvbnN0YW50cyNQVVNIX1RPX1BST1hZX0VYUFJFU1NJT04KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoRXhwcmVzc2lvbkNvbW1hbmQoaW50IGV4cHJlc3Npb25JRCwgYnl0ZSBzdWJjb21tYW5kKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgdmFsdWUgb2JqZWN0IHRvIHRoZSByZW1vdGUgc2lkZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWVPYmplY3QKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoVmFsdWVPYmplY3QoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUHVzaCBqdXN0IHRoZSBzaW5nbGUgYnl0ZSB0byB0aGUgcmVtb3RlIHNpZGUuCi0JICogQHBhcmFtIGFieXRlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hCeXRlKGJ5dGUgYWJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBQdXNoIGp1c3QgdGhlIHNpbmdsZSBpbnQgdG8gdGhlIHJlbW90ZSBzaWRlLgotCSAqIAotCSAqIEBwYXJhbSBhbkludAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoSW50KGludCBhbkludCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCQotCS8qKgotCSAqIFB1c2gganVzdCB0aGUgc2luZ2Ugc3RyaW5nIHRvIHRoZSByZW1vdGUgc2lkZS4KLQkgKiAKLQkgKiBAcGFyYW0gYVN0cmluZwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoU3RyaW5nKFN0cmluZyBhU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUHVzaCBqdXN0IHRoZSBib29sIHRvIHRoZSByZW1vdGUgc2lkZS4KLQkgKiBAcGFyYW0gYUJvb2wKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEJvb2xlYW4oYm9vbGVhbiBhQm9vbCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEdldCB0aGUgZmluYWwgdmFsdWUuIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHByb3h5IGlkIHJlc29sdXRpb25zIGV2ZW4gZm9yIHN5bmMgKHNvIHRoYXQgd2UgY2FuIGdldAotCSAqIGFueSB0aHJvd24gZXJyb3JzKS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RmluYWxWYWx1ZShDb21tYW5kcy5WYWx1ZU9iamVjdCByZXN1bHQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFNlbmQgdGhlIHB1bGwgdmFsdWUgY29tbWFuZCwgd2l0aCB0aGUgcHJveHlpZHMgb2YgaW50ZXJlc2V0LiBJZiBhbiBlcnJvcgotCSAqIG9jY3VycywgY29tbWFuZCBleGNlcHRpb24gaXMgdGhyb3duLiAKLQkgKiA8cD4KLQkgKiBBZnRlciB0aGUgcHVsbCB2YWx1ZSBjYWxsLCBpZiBubyBlcnJvcnMsIHRoZSBwcm94eWlkcyBtdXN0IGJlIHJlYWQsIGFuZCB0aGVuIGdldEZpbmFsVmFsdWUgY2FsbCBtdXN0IGJlIHNlbnQuCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRAotCSAqIEBwYXJhbSBwcm94eWlkcyBleHByZXNzaW9uIHByb3h5aWRzIHRoYXQgcmVxdWVzdCBmZWVkYmFjayBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm94eSBpZHMuCi0JICogQHBhcmFtIHNlbmRlciBzZW5kZXIgdG8gdXNlIHRvIHByb2Nlc3MgdGhlIHJldHVybmVkIHByb3h5IGlkcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZXhwZWN0aW5nIG5vIHByb3h5IHJlc29sdXRpb25zLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHB1bGxWYWx1ZShpbnQgZXhwcmVzc2lvbklELCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcywgQ29tbWFuZHMuVmFsdWVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTZW5kIHRoZSBzeW5jIGNvbW1hbmQsIHdpdGggdGhlIHByb3h5aWRzIG9mIGludGVyZXNldC4gSWYgYW4gZXJyb3IKLQkgKiBvY2N1cnMsIGNvbW1hbmQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiA8cD4KLQkgKiBBZnRlciB0aGUgc3luYyBjYWxsLCBpZiBubyBlcnJvcnMsIHRoZSByZXR1cm5lZCBwcm94eWlkcyBtdXN0IGJlIHByb2Nlc3NlZCBhbmQgdGhlbiB0aGUgZmluYWwgZW5kVmFsdWUgY2FsbCBtdXN0IGJlIHNlbnQuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRCAKLQkgKiBAcGFyYW0gcHJveHlpZHMgZXhwcmVzc2lvbiBwcm94eWlkcyB0aGF0IHJlcXVlc3QgZmVlZGJhY2sgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJveHkgaWRzLgotCSAqIEBwYXJhbSBzZW5kZXIgc2VuZGVyIHRvIHVzZSB0byBwcm9jZXNzIHRoZSBwcm94eSBpZCByZXNvbHV0aW9ucywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZXhwZWN0aW5nIG5vIHByb3h5IGlkcy4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jKGludCBleHByZXNzaW9uSUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHByb3h5aWRzLCBDb21tYW5kcy5WYWx1ZVNlbmRlciBzZW5kZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwkKLQkKLQkvKioKLQkgKiBTdG9wIGV4cHJlc3Npb24gcHJvY2Vzc2luZy4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklEIAotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wRXhwcmVzc2lvblByb2Nlc3NpbmcoaW50IGV4cHJlc3Npb25JRCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1NZXRob2RQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNTWV0aG9kUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyMTIwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1NZXRob2RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogSVJFTU1ldGhvZFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBmb3IgUkVNTWV0aG9kUHJveHkgYWxsb3dzIHRoZSBpbnZva2F0aW9uIHdoZXJlCi0gKiB0aGUgcGFybXMgYXJlIGEgbWl4dHVyZSBvZiBjb25zdGFudCBvYmplY3RzIChpLmUuIGNhbiBiZSBzZW50Ci0gKiBhcyB2YWx1ZXMgdG8gdGhlIGNsaWVudCkgYW5kIElCZWFuUHJveGllcy4gSXQgaXMgb25seSB0byBiZQotICogdXNlZCBieSBvdGhlciBmYWN0b3JpZXMgdGhhdCB3YW50IHRvIGludm9rZSBtZXRob2RzIHdoZXJlCi0gKiBzb21lIG9mIHRoZSBwYXJtcyBhcmUgY29uc3RhbnRzIHNvIHRoYXQgdGhlcmUgaXMgbm8gbmVlZAotICogY3JlYXRlIElCZWFuUHJveGllcyBmb3IgdGhlbSwgZS5nLiBTdHJpbmcuIFRoaXMgc2hvdWxkIGJlCi0gKiB1c2VkIHdpdGggZXh0cmVtZSBjYXJlLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJFTU1ldGhvZFByb3h5IGV4dGVuZHMgSU1ldGhvZFByb3h5LCBJUkVNQmVhblByb3h5IHsKLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VXaXRoUGFybXMoSUJlYW5Qcm94eSBzdWJqZWN0LCBPYmplY3RbXSBwYXJtcykgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCQotCQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTc0ZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElSRU1TcGVjaWFsQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotLyoqCi0gKiBUaGlzIGlzIGEgc3BlY2lhbCBpbnRlcmZhY2UgZm9yIGFsbG93aW5nIGFic3RyYWN0Ci0gKiB0eXBlcyB0byBjcmVhdGUgdGhlIGNvcnJlY3Qgc3ViY2xhc3MgdHlwZXMuCi0gKiBPbmx5IG9uZXMgdGhhdCB1c2UgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkKLSAqIHNob3VsZCBpbXBsZW1lbnQgdGhpcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkgewotCQotCS8qKgotCSAqIENhbGxlZCBieSBSRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eSB0byBjcmVhdGUgYSBzdWJjbGFzcyBvZiBpdC4KLQkgKiBUaGlzIGFsbG93cyBjb3JyZWN0IHR5cGVzIHRvIGJlIGNyZWF0ZWQgZGVwZW5kaW5nIHVwb24gdGhlCi0JICogbWFpbiBzdXBlciB0eXBlLgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9Mb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzI2MTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9Mb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMyAkICAkRGF0ZTogMjAwNS8xMC8yNiAxODo0ODoxOSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLSAKLS8qKgotICogVGhpcyB2ZXJzaW9uIHdvcmtzIHdpdGggbG9jYWwgZmlsZXMgYmVpbmcgYWRkZWQgdG8gdGhlIGNsYXNzcGF0aCwgYW5kIHRoZSBjbGFzc3BhdGggaXMgc3RyaW5ncy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIHsKLQkKLQlwcml2YXRlIFVSTFtdIGNsYXNzcGF0aEluZm87Ci0JcHJpdmF0ZSBVUkxbXVtdIGJvb3RwYXRoSW5mbzsKLQlwcml2YXRlIExpc3QgY2xhc3NwYXRoOwotCXByaXZhdGUgTGlzdCBwcmVwZW5kQm9vdHBhdGg7Ci0JcHJpdmF0ZSBMaXN0IGFwcGVuZEJvb3RwYXRoOwotCXByaXZhdGUgTGlzdCBqYXZhTGlicmFyeVBhdGg7Ci0JcHJpdmF0ZSBQcm94eUxhdW5jaFN1cHBvcnQuTGF1bmNoSW5mbyBsYXVuY2hJbmZvOwotCQotCXB1YmxpYyBMb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyKFVSTFtdIGNsYXNzcGF0aEluZm8sIFVSTFtdW10gYm9vdHBhdGhJbmZvLCBQcm94eUxhdW5jaFN1cHBvcnQuTGF1bmNoSW5mbyBsYXVuY2hJbmZvKSB7Ci0JCXRoaXMuY2xhc3NwYXRoSW5mbyA9IGNsYXNzcGF0aEluZm87Ci0JCXRoaXMuYm9vdHBhdGhJbmZvID0gYm9vdHBhdGhJbmZvOwotCQl0aGlzLmxhdW5jaEluZm8gPSBsYXVuY2hJbmZvOwotCX0KLQkKLQlwdWJsaWMgVVJMW10gZ2V0RmluYWxDbGFzc3BhdGgoKSB7Ci0JCWlmIChjbGFzc3BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBjbGFzc3BhdGhJbmZvOwotCQllbHNlCi0JCQlyZXR1cm4gKFVSTFtdKSBjbGFzc3BhdGgudG9BcnJheShuZXcgVVJMW2NsYXNzcGF0aC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgVVJMW10gZ2V0RmluYWxQcmVwZW5kQm9vdHBhdGgoKSB7Ci0JCWlmIChwcmVwZW5kQm9vdHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBib290cGF0aEluZm9bMF07Ci0JCWVsc2UKLQkJCXJldHVybiAoVVJMW10pIHByZXBlbmRCb290cGF0aC50b0FycmF5KG5ldyBVUkxbcHJlcGVuZEJvb3RwYXRoLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgVVJMW10gZ2V0RmluYWxBcHBlbmRCb290cGF0aCgpIHsKLQkJaWYgKGFwcGVuZEJvb3RwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gYm9vdHBhdGhJbmZvWzJdOwotCQllbHNlCi0JCQlyZXR1cm4gKFVSTFtdKSBwcmVwZW5kQm9vdHBhdGgudG9BcnJheShuZXcgVVJMW2FwcGVuZEJvb3RwYXRoLnNpemUoKV0pOwotCX0JCi0KLQlwdWJsaWMgTGlzdCBnZXRGaW5hbEphdmFMaWJyYXJ5UGF0aCgpIHsKLQkJaWYgKGphdmFMaWJyYXJ5UGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWVsc2UKLQkJCXJldHVybiBqYXZhTGlicmFyeVBhdGg7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldENsYXNzcGF0aCgpIHsKLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0JCQljbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0KGNsYXNzcGF0aEluZm8ubGVuZ3RoKTsKLQkJCWFkZEFsbChjbGFzc3BhdGgsIGNsYXNzcGF0aEluZm8sIC0xKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcmVwZW5kQm9vdHBhdGgoKSB7Ci0JCWlmIChwcmVwZW5kQm9vdHBhdGggPT0gbnVsbCkgewotCQkJaWYgKGJvb3RwYXRoSW5mb1swXSAhPSBudWxsKSB7Ci0JCQkJcHJlcGVuZEJvb3RwYXRoID0gbmV3IEFycmF5TGlzdChib290cGF0aEluZm9bMF0ubGVuZ3RoKTsKLQkJCQlhZGRBbGwocHJlcGVuZEJvb3RwYXRoLCBib290cGF0aEluZm9bMF0sIC0xKTsKLQkJCX0gZWxzZQotCQkJCXByZXBlbmRCb290cGF0aCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCX0KLQkJcmV0dXJuIHByZXBlbmRCb290cGF0aDsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXBwZW5kQm9vdHBhdGgoKSB7Ci0JCWlmIChhcHBlbmRCb290cGF0aCA9PSBudWxsKSB7Ci0JCQlpZiAoYm9vdHBhdGhJbmZvWzJdICE9IG51bGwpIHsKLQkJCQlhcHBlbmRCb290cGF0aCA9IG5ldyBBcnJheUxpc3QoYm9vdHBhdGhJbmZvWzJdLmxlbmd0aCk7Ci0JCQkJYWRkQWxsKGFwcGVuZEJvb3RwYXRoLCBib290cGF0aEluZm9bMl0sIC0xKTsKLQkJCX0gZWxzZQotCQkJCWFwcGVuZEJvb3RwYXRoID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJfQotCQlyZXR1cm4gYXBwZW5kQm9vdHBhdGg7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRKYXZhTGlicmFyeVBhdGgoKSB7Ci0JCWlmIChqYXZhTGlicmFyeVBhdGggPT0gbnVsbCkgewotCQkJamF2YUxpYnJhcnlQYXRoID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJfQotCQlyZXR1cm4gamF2YUxpYnJhcnlQYXRoOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbGwoTGlzdCB0b0xpc3QsIE9iamVjdFtdIGFycmF5LCBpbnQgbG9jKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCS8vIE5lZWQgYSBkdXAgY2hlY2ssIHNvbWV0aW1lcyBkdXBzIGNvbWUgaW4gZXNwZWNpYWxseSBkdXJpbmcgZGV2ZWxvcG1lbnQKLQkJCWlmICh0b0xpc3QuY29udGFpbnMoYXJyYXlbaV0pKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGxvYyA9PSAtMSkKLQkJCQl0b0xpc3QuYWRkKGFycmF5W2ldKTsKLQkJCWVsc2UKLQkJCQl0b0xpc3QuYWRkKGxvYysrLCBhcnJheVtpXSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9jYXRpb25zKExpc3QgdG9MaXN0LCBJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJVVJMIGxvY2F0aW9uID0gUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRTdHJpbmdQYXRoVG9VUkwoZW50cnkuZ2V0TG9jYXRpb24oKSk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCAmJiAhdG9MaXN0LmNvbnRhaW5zKGxvY2F0aW9uKSkKLQkJCQl0b0xpc3QuYWRkKGxvY2F0aW9uKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIjZ2V0SmF2YVByb2plY3QoKQotCSAqLwotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBsYXVuY2hJbmZvLmdldEphdmFQcm9qZWN0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciNjb250cmlidXRlUHJvamVjdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIHByb2pQYXRoID0gSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRSdW50aW1lQ2xhc3NwYXRoKGpwcm9qZWN0KTsKLQkJYm9vbGVhbiBqcmVDb250YWluZXJGb3VuZD0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvalBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnk9IHByb2pQYXRoW2ldOwotCQkJaWYgKGVudHJ5LmdldENsYXNzcGF0aFByb3BlcnR5KCkgPT0gSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5CT09UU1RSQVBfQ0xBU1NFUyB8fCBlbnRyeS5nZXRDbGFzc3BhdGhQcm9wZXJ0eSgpID09IElSdW50aW1lQ2xhc3NwYXRoRW50cnkuU1RBTkRBUkRfQ0xBU1NFUykgewotCQkJCWludCBlbnRyeUtpbmQ9IGVudHJ5LmdldENsYXNzcGF0aEVudHJ5KCkuZ2V0RW50cnlLaW5kKCk7Ci0JCQkJU3RyaW5nIHNlZ21lbnQwPSBlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKTsKLQkJCQlpZiAoZW50cnlLaW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICYmIEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIuZXF1YWxzKHNlZ21lbnQwKQotCQkJCQkJfHwgZW50cnlLaW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgJiYgSmF2YVJ1bnRpbWUuSlJFTElCX1ZBUklBQkxFLmVxdWFscyhzZWdtZW50MCkpIHsKLQkJCQkJanJlQ29udGFpbmVyRm91bmQ9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGpyZUNvbnRhaW5lckZvdW5kKQotCQkJCQkJYWRkTG9jYXRpb25zKGdldEFwcGVuZEJvb3RwYXRoKCksIEphdmFSdW50aW1lLnJlc29sdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoZW50cnksIGpwcm9qZWN0KSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWFkZExvY2F0aW9ucyhnZXRQcmVwZW5kQm9vdHBhdGgoKSwgSmF2YVJ1bnRpbWUucmVzb2x2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShlbnRyeSwganByb2plY3QpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWFkZExvY2F0aW9ucyhnZXRDbGFzc3BhdGgoKSwgSmF2YVJ1bnRpbWUucmVzb2x2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShlbnRyeSwganByb2plY3QpKTsKLQkJCX0KLQkJfQkJCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciNjb250cmlidXRlQ2xhc3NwYXRoKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKFN0cmluZyBjbGFzc3BhdGgsIGludCB0eXBlRmxhZykgewotCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0U3RyaW5nUGF0aFRvVVJMKGNsYXNzcGF0aCksIHR5cGVGbGFnKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyI2NvbnRyaWJ1dGVDbGFzc3BhdGgoamF2YS5uZXQuVVJMLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChVUkwgY2xhc3NwYXRoVVJMLCBpbnQgdHlwZUZsYWcpIHsKLQkJaWYgKGNsYXNzcGF0aFVSTCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzd2l0Y2ggKHR5cGVGbGFnKSB7Ci0JCQljYXNlIFBSRVBFTkRfQk9PVF9DTEFTU1BBVEg6Ci0JCQkJaWYgKCFnZXRQcmVwZW5kQm9vdHBhdGgoKS5jb250YWlucyhjbGFzc3BhdGhVUkwpKQotCQkJCQlnZXRQcmVwZW5kQm9vdHBhdGgoKS5hZGQoY2xhc3NwYXRoVVJMKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUFJFUEVORF9VU0VSX0NMQVNTUEFUSDoKLQkJCQlpZiAoIWdldENsYXNzcGF0aCgpLmNvbnRhaW5zKGNsYXNzcGF0aFVSTCkpCi0JCQkJCWdldENsYXNzcGF0aCgpLmFkZCgwLCBjbGFzc3BhdGhVUkwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBFTkRfVVNFUl9DTEFTU1BBVEg6Ci0JCQkJaWYgKCFnZXRDbGFzc3BhdGgoKS5jb250YWlucyhjbGFzc3BhdGhVUkwpKQkJCQkJCi0JCQkJCWdldENsYXNzcGF0aCgpLmFkZChjbGFzc3BhdGhVUkwpOwotCQkJCWJyZWFrOwkJCQkKLQkJCWNhc2UgQVBQRU5EX0JPT1RfQ0xBU1NQQVRIOgotCQkJCWlmICghZ2V0QXBwZW5kQm9vdHBhdGgoKS5jb250YWlucyhjbGFzc3BhdGhVUkwpKQkJCQkJCi0JCQkJCWdldEFwcGVuZEJvb3RwYXRoKCkuYWRkKGNsYXNzcGF0aFVSTCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFQUEVORF9KQVZBX0xJQlJBUllfUEFUSDoKLQkJCQlpZiAoIWdldEphdmFMaWJyYXJ5UGF0aCgpLmNvbnRhaW5zKGNsYXNzcGF0aFVSTCkpCQkJCQkKLQkJCQkJZ2V0SmF2YUxpYnJhcnlQYXRoKCkuYWRkKGNsYXNzcGF0aFVSTCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIjY29udHJpYnV0ZUNsYXNzcGF0aChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcmVsYXRpdmVQYXRoLCBpbnQgdHlwZUZsYWcsIGJvb2xlYW4gbmxzTG9jYWxpemUpIHsKLQkJLy8gSWYgbm90IG5scyBsb2NhbGl6ZSwgb3IgaWYgaXQgaXMgamF2YSBsaWJyYXJ5IHBhdGgsIHRoZW4ganVzdCBmaW5kIHRoZSBvbmUgaW4gdGhlIHBsdWdpbi9mcmFnbWVudCBhbmQgYWRkIGl0LgotCQlpZiAobmxzTG9jYWxpemUpCi0JCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplQWxsRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIHJlbGF0aXZlUGF0aCksIHR5cGVGbGFnKTsKLQkJZWxzZSBpZiAodHlwZUZsYWcgPT0gSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9KQVZBX0xJQlJBUllfUEFUSCkgewotCQkJaWYgKHJlbGF0aXZlUGF0aCA9PSBudWxsIHx8IHJlbGF0aXZlUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJLy8gUERFIGlzIG5vdCBoZXJlIHRvIGhlbHAgdXMgZXh0cmFjdCB0aGF0IEAjJCBkbGwKLQkJCSAgICBKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZygiQ2FuJ3QgZXh0cmFjdCBhIGRpcmVjdG9yeSBmcm9tIHRoZSByb290IG9mIGEgcGx1Z2luLiIpOyAvLyROT04tTkxTLTEkCi0JCQkgICAgcmV0dXJuOwotCQkJfQotCQkJVVJMIGNvbnRyaWJ1dGlvbiA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIHJlbGF0aXZlUGF0aCk7Ci0JCQljb250cmlidXRlQ2xhc3NwYXRoKGNvbnRyaWJ1dGlvbiwgdHlwZUZsYWcpOwkJCQotCQl9IGVsc2UgewotCQkJaWYgKHJlbGF0aXZlUGF0aCAhPSBudWxsKQotCQkJCWNvbnRyaWJ1dGVDbGFzc3BhdGgoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkudXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShidW5kbGUsIHJlbGF0aXZlUGF0aCksIHR5cGVGbGFnKTsKLQkJCWVsc2UKLQkJCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplQnVuZGxlKGJ1bmRsZSksIHR5cGVGbGFnKTsKLQkJfQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIjY29udHJpYnV0ZUNsYXNzcGF0aChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKEJ1bmRsZSBidW5kbGUsIElQYXRoIHJlbGF0aXZlUGF0aCwgaW50IHR5cGVGbGFnLCBib29sZWFuIG5sc0xvY2FsaXplKSB7Ci0JCWlmIChubHNMb2NhbGl6ZSkKLQkJCWlmIChyZWxhdGl2ZVBhdGggIT0gbnVsbCkKLQkJCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplQWxsRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIHJlbGF0aXZlUGF0aCksIHR5cGVGbGFnKTsKLQkJCWVsc2UKLQkJCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSksIHR5cGVGbGFnKTsKLQkJZWxzZSBpZiAodHlwZUZsYWcgPT0gSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9KQVZBX0xJQlJBUllfUEFUSCkgewotCQkJaWYgKHJlbGF0aXZlUGF0aCA9PSBudWxsIHx8IHJlbGF0aXZlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAwKSB7Ci0JCQkJLy8gUERFIGlzIG5vdCBoZXJlIHRvIGhlbHAgdXMgZXh0cmFjdCB0aGF0IEAjJCBkbGwKLQkJCSAgICBKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZygiQ2FuJ3QgZXh0cmFjdCBhIGRpcmVjdG9yeSBmcm9tIHRoZSByb290IG9mIGEgcGx1Z2luLiIpOyAvLyROT04tTkxTLTEkCi0JCQkgICAgcmV0dXJuOwotCQkJfQotCQkJVVJMIGNvbnRyaWJ1dGlvbiA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIHJlbGF0aXZlUGF0aCk7Ci0JCQljb250cmlidXRlQ2xhc3NwYXRoKGNvbnRyaWJ1dGlvbiwgdHlwZUZsYWcpOwkJCQotCQl9IGVsc2UgewotCQkJaWYgKHJlbGF0aXZlUGF0aCAhPSBudWxsKQotCQkJCWNvbnRyaWJ1dGVDbGFzc3BhdGgoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkudXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShidW5kbGUsIHJlbGF0aXZlUGF0aCksIHR5cGVGbGFnKTsKLQkJCWVsc2UKLQkJCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplQnVuZGxlKGJ1bmRsZSksIHR5cGVGbGFnKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciNjb250cmlidXRlQ2xhc3NwYXRoKGphdmEubGFuZy5TdHJpbmdbXSwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoU3RyaW5nW10gY2xhc3NwYXRocywgaW50IHR5cGVGbGFnKSB7Ci0JCWNvbnRyaWJ1dGVDbGFzc3BhdGgoUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRTdHJpbmdQYXRoc1RvVVJMKGNsYXNzcGF0aHMpLCB0eXBlRmxhZyk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciNjb250cmlidXRlQ2xhc3NwYXRoKGphdmEubmV0LlVSTFtdLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChVUkxbXSBjbGFzc3BhdGhVUkxzLCBpbnQgdHlwZUZsYWcpIHsKLQkJaWYgKGNsYXNzcGF0aFVSTHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3dpdGNoICh0eXBlRmxhZykgewotCQkJY2FzZSBQUkVQRU5EX0JPT1RfQ0xBU1NQQVRIOgotCQkJCWFkZEFsbChnZXRQcmVwZW5kQm9vdHBhdGgoKSwgY2xhc3NwYXRoVVJMcywgLTEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQUkVQRU5EX1VTRVJfQ0xBU1NQQVRIOgotCQkJCWFkZEFsbChnZXRDbGFzc3BhdGgoKSwgY2xhc3NwYXRoVVJMcywgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFQUEVORF9VU0VSX0NMQVNTUEFUSDoKLQkJCQlhZGRBbGwoZ2V0Q2xhc3NwYXRoKCksIGNsYXNzcGF0aFVSTHMsIC0xKTsKLQkJCQlicmVhazsJCQkJCi0JCQljYXNlIEFQUEVORF9CT09UX0NMQVNTUEFUSDoKLQkJCQlhZGRBbGwoZ2V0QXBwZW5kQm9vdHBhdGgoKSwgY2xhc3NwYXRoVVJMcywgLTEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEg6Ci0JCQkJYWRkQWxsKGdldEphdmFMaWJyYXJ5UGF0aCgpLCBjbGFzc3BhdGhVUkxzLCAtMSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTG9jYWxQcm94eUxhdW5jaERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0xvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJkN2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTG9jYWxQcm94eUxhdW5jaERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICRSQ1NmaWxlOiBMb2NhbFByb3h5TGF1bmNoRGVsZWdhdGUuamF2YSx2ICQgJFJldmlzaW9uOiAxLjMxICQgJERhdGU6IDIwMDUvMTAvMTQgMTc6NDU6MDIgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkV4cHJlc3Npb25Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0LlJFTVJlZ2lzdGVyQVdUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlRpbWVyVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi0vKioKLSAqIExhdW5jaCBEZWxlZ2F0ZSBmb3IgbGF1bmNoaW5nIExvY2FsIChpLmUuIHJlbW90ZSB2bSBpcyBvbiBsb2NhbCBzeXN0ZW0pLiBIZXJlICJyZW1vdGUiIG1lYW5zIHRoZQotICogcmVnaXN0cnkgaXMgbm90IGluIHRoZSBJREUgYnV0IGluIGEgc2VwYXJhdGUgVk0sIGFuZCAibG9jYWwiIG1lYW5zIHRoYXQgaXMgaW4gb24gdGhlIGxvY2FsCi0gKiBwaHlzaWNhbCBtYWNoaW5lIGFuZCBub3Qgb24gYSBzZXBhcmF0ZSBtYWNoaW5lLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIExvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSNsYXVuY2gob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSUxhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgbGF1bmNoS2V5ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVByb3h5Q29uc3RhbnRzLkFUVFJJQlVURV9MQVVOQ0hfS0VZLCAoU3RyaW5nKSBudWxsKTsKLQkJaWYgKGxhdW5jaEtleSA9PSBudWxsKQotCQkJYWJvcnQoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eVJlbW90ZU5vTGF1bmNoS2V5LCBudWxsLCAwKTsgCi0KLQkJLy8gSW4gRWNsaXBzZSwgZXZlbiBpZiBwcml2YXRlLCBhIGxhdW5jaCB3aWxsIHNob3cgdXAgaW4gdGhlIGRlYnVnIHByb2Nlc3MgdHJlZSBhbmQgaW4gdGhlIGNvbnNvbGUgdmlld2VyLgotCQkvLyBUbyBiZSBhYnNvbHV0ZWx5IHByaXZhdGUsIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBsYXVuY2ggd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBhZGRlZC4KLQkJaWYgKFByb3h5TGF1bmNoU3VwcG9ydC5BVFRSX1BSSVZBVEUgIT0gbnVsbCAmJiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShQcm94eUxhdW5jaFN1cHBvcnQuQVRUUl9QUklWQVRFLCBmYWxzZSkpIAotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5yZW1vdmVMYXVuY2gobGF1bmNoKTsJCQotCQlpZiAocG0gPT0gbnVsbCkgewotCQkJcG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0KLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdChjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIG5hbWUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUHJveHlDb25zdGFudHMuQVRUUklCVVRFX1ZNX1RJVExFLCAoU3RyaW5nKSBudWxsKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5UmVtb3RlVk1OYW1lLCBuZXcgT2JqZWN0W10geyBwcm9qZWN0ICE9IG51bGwgPyBwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkgOiAiIiB9KTsgCi0JCWVsc2UKLQkJCW5hbWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5UmVtb3RlVk1OYW1lV2l0aENvbW1lbnQsIG5ldyBPYmplY3RbXSB7IHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSA6ICIiLCBuYW1lIH0pOyAKLQotCQlTdHJpbmcgc3RlcElkID0gIkxhdW5jaCBWTSAoICIgKyBuYW1lICsgIiApIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0U3RlcChzdGVwSWQpOwotCQkvLyBQcm9ibGVtIHdpdGggbGF1bmNoLCBjYW4ndCBoYXZlIGRvdWJsZS1xdW90ZXMgaW4gdm1OYW1lLgotCQlpZiAobmFtZS5pbmRleE9mKCciJykgIT0gLTEpCi0JCQluYW1lID0gbmFtZS5yZXBsYWNlKCciJywgJ1wnJyk7Ci0KLQkJcG0uYmVnaW5UYXNrKCIiLCA1MDApOyAvLyROT04tTkxTLTEkCi0JCXBtLnN1YlRhc2soTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eVJlbW90ZUxhdW5jaFZNLCBuZXcgT2JqZWN0W10geyBuYW1lIH0pKTsgCi0JCS8vIGNoZWNrIGZvciBjYW5jZWxsYXRpb24KLQkJaWYgKHBtLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQotCQlJVk1JbnN0YWxsIHZtID0gdmVyaWZ5Vk1JbnN0YWxsKGNvbmZpZ3VyYXRpb24pOwotCi0JCUlWTVJ1bm5lciBydW5uZXIgPSB2bS5nZXRWTVJ1bm5lcihtb2RlKTsKLQkJaWYgKHJ1bm5lciA9PSBudWxsKSB7Ci0JCQlhYm9ydChNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5X05vUnVubmVyX0VSUk9SXywgbmV3IE9iamVjdFtdIHsgbmFtZSB9KSwgbnVsbCwgMCk7IAotCQl9Ci0KLQkJRmlsZSB3b3JraW5nRGlyID0gdmVyaWZ5V29ya2luZ0RpcmVjdG9yeShjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHdvcmtpbmdEaXJOYW1lID0gbnVsbDsKLQkJaWYgKHdvcmtpbmdEaXIgIT0gbnVsbCkgewotCQkJd29ya2luZ0Rpck5hbWUgPSB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0KLQkJLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzCi0JCVN0cmluZ1tdIGVudnAgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmdldEVudmlyb25tZW50KGNvbmZpZ3VyYXRpb24pOwotCi0JCS8vIFByb2dyYW0gJiBWTSBhcmdzCi0JCVN0cmluZyBwZ21BcmdzID0gZ2V0UHJvZ3JhbUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHZtQXJncyA9IGdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlFeGVjdXRpb25Bcmd1bWVudHMgZXhlY0FyZ3MgPSBuZXcgRXhlY3V0aW9uQXJndW1lbnRzKHZtQXJncywgcGdtQXJncyk7Ci0KLQkJLy8gVk0tc3BlY2lmaWMgYXR0cmlidXRlcwotCQlNYXAgdm1BdHRyaWJ1dGVzTWFwID0gZ2V0Vk1TcGVjaWZpY0F0dHJpYnV0ZXNNYXAoY29uZmlndXJhdGlvbik7Ci0KLQkJcG0ud29ya2VkKDEwMCk7Ci0JCQotCQkvLyBOb3cgbGV0J3MgZ2V0IHRoZSBjbGFzc3BhdGhzIGNyZWF0ZWQgdGhyb3VnaCB0aGUgY29udHJpYnV0b3JzLgotCQlVUkxbXSBjbGFzc3BhdGggPSBQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhzVG9VUkwoZ2V0Q2xhc3NwYXRoKGNvbmZpZ3VyYXRpb24pKTsKLQkJU3RyaW5nW11bXSBib290cGF0aEluZm9TdHJpbmdzID0gZ2V0Qm9vdHBhdGhFeHQodm1BdHRyaWJ1dGVzTWFwKTsKLQkJVVJMW11bXSBib290cGF0aEluZm8gPSBuZXcgVVJMW11bXXsKLQkJCQlQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhzVG9VUkwoYm9vdHBhdGhJbmZvU3RyaW5nc1swXSksCi0JCQkJUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRTdHJpbmdQYXRoc1RvVVJMKGJvb3RwYXRoSW5mb1N0cmluZ3NbMV0pLAotCQkJCVByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0U3RyaW5nUGF0aHNUb1VSTChib290cGF0aEluZm9TdHJpbmdzWzJdKSwKLQkJfTsKLQkJUHJveHlMYXVuY2hTdXBwb3J0LkxhdW5jaEluZm8gbGF1bmNoSW5mbyA9IFByb3h5TGF1bmNoU3VwcG9ydC5nZXRJbmZvKGxhdW5jaEtleSk7Ci0JCWZpbmFsIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBjb250cmlidXRvcnMgPSBsYXVuY2hJbmZvLmNvbnRyaWJ1dG9yczsKLQkJZmluYWwgTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlciBjb250cm9sbGVyID0KLQkJCW5ldyBMb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyKGNsYXNzcGF0aCwgYm9vdHBhdGhJbmZvLCBsYXVuY2hJbmZvKTsKLQkJaWYgKGNvbnRyaWJ1dG9ycyAhPSBudWxsKSB7CQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gUnVuIGluIHNhZmUgbW9kZSBzbyB0aGF0IGFueXRoaW5nIGhhcHBlbnMgd2UgZG9uJ3QgZ28gYXdheS4KLQkJCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuIFBsYXRmb3JtLnJ1biBsb2dzIGl0IGZvciBtZS4KLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJY29udHJpYnV0b3JzW2lpXS5jb250cmlidXRlQ2xhc3NwYXRocyhjb250cm9sbGVyKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGluIHRoZSByZXF1aXJlZCBvbmVzIGJ5IHRoZSBQcm94eSBzdXBwb3J0LiBUaGVzZSBhcmUgaGFyZC1jb2RlZCBzaW5jZSB0aGV5IGFyZQotCQkvLyByZXF1aXJlZC4KLQkJUHJveHlSZW1vdGVVdGlsLnVwZGF0ZUNsYXNzUGF0aHMoY29udHJvbGxlcik7Ci0JCWFkZEluRnJhZ21lbnRMaWJyYXJpZXMoY29udHJvbGxlciwgbGF1bmNoSW5mby5nZXRDb25maWdJbmZvKCkpOwotCi0JCWNsYXNzcGF0aCA9IGNvbnRyb2xsZXIuZ2V0RmluYWxDbGFzc3BhdGgoKTsKLQkJaWYgKGJvb3RwYXRoSW5mb1swXSAhPSBjb250cm9sbGVyLmdldEZpbmFsUHJlcGVuZEJvb3RwYXRoKCkpIHsKLQkJICAgIGlmICh2bUF0dHJpYnV0ZXNNYXAgPT0gbnVsbCkKLQkJICAgICAgICB2bUF0dHJpYnV0ZXNNYXAgPSBuZXcgSGFzaE1hcCgyKTsKLQkJICAgIHZtQXR0cmlidXRlc01hcC5wdXQoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQk9PVFBBVEhfUFJFUEVORCwgUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRVUkxzVG9TdHJpbmdzKGJvb3RwYXRoSW5mb1swXSkpOwotCQl9Ci0JCWlmIChib290cGF0aEluZm9bMl0gIT0gY29udHJvbGxlci5nZXRGaW5hbEFwcGVuZEJvb3RwYXRoKCkpIHsKLQkJICAgIGlmICh2bUF0dHJpYnV0ZXNNYXAgPT0gbnVsbCkKLQkJICAgICAgICB2bUF0dHJpYnV0ZXNNYXAgPSBuZXcgSGFzaE1hcCgyKTsKLQkJICAgIHZtQXR0cmlidXRlc01hcC5wdXQoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQk9PVFBBVEhfQVBQRU5ELCBQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFVSTHNUb1N0cmluZ3MoYm9vdHBhdGhJbmZvWzJdKSk7Ci0JCX0KLQotCQkvLyBjaGVjayBmb3IgY2FuY2VsbGF0aW9uCi0JCWlmIChwbS5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCXBtLndvcmtlZCgxMDApOwotCi0JCS8vIENyZWF0ZSBWTSBjb25maWcKLQkJVk1SdW5uZXJDb25maWd1cmF0aW9uIHJ1bkNvbmZpZyA9Ci0JCQluZXcgVk1SdW5uZXJDb25maWd1cmF0aW9uKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLlJlbW90ZVZNQXBwbGljYXRpb24iLCBQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFVSTHNUb1N0cmluZ3MoY2xhc3NwYXRoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeShQcm94eVJlbW90ZVV0aWwuZ2V0UmVnaXN0cnlDb250cm9sbGVyKCksIG5hbWUpOwotCQlJbnRlZ2VyIHJlZ2lzdHJ5S2V5ID0gcmVnaXN0cnkuZ2V0UmVnaXN0cnlLZXkoKTsKLQotCQlJbnRlZ2VyIGJ1ZlNpemUgPSBJbnRlZ2VyLmdldEludGVnZXIoInByb3h5dm0uYnVmc2l6ZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChidWZTaXplID09IG51bGwpCi0JCQlidWZTaXplID0gbmV3IEludGVnZXIoMTYwMDApOwotCi0JCWludCBtYXN0ZXJTZXJ2ZXJQb3J0ID0gUHJveHlSZW1vdGVVdGlsLmdldFJlZ2lzdHJ5Q29udHJvbGxlcigpLmdldE1hc3RlclNvY2tldFBvcnQoKTsKLQotCQkvLyBTZWUgaWYgZGVidWcgbW9kZSBpcyByZXF1ZXN0ZWQuCi0JCURlYnVnTW9kZUhlbHBlciBkaCA9IG5ldyBEZWJ1Z01vZGVIZWxwZXIoKTsKLQkJYm9vbGVhbiBkZWJ1Z01vZGUgPSBkaC5kZWJ1Z01vZGUobmFtZSk7Ci0JCWJvb2xlYW4gdXNlTm92ZXJpZnkgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oUHJveHlQbHVnaW4uUFJFRkVSRU5DRVNfVk1fTk9WRVJJRllfS0VZKTsKLQotCQlTdHJpbmdbXSBldm1BcmdzID0gZXhlY0FyZ3MuZ2V0Vk1Bcmd1bWVudHNBcnJheSgpOwotCQkKLQkJaW50IGV4dHJhQXJncyA9IDQ7CS8vIE51bWJlciBvZiBleHRyYSBzdGFuZGFyZCBhcmdzIGFkZGVkIChpZiBudW1iZXIgY2hhbmdlcyBiZWxvdywgdGhpcyBtdXN0IGNoYW5nZSkKLQkJaWYgKGRlYnVnTW9kZSkKLQkJCWV4dHJhQXJncys9NDsJLy8gTnVtYmVyIG9mIGV4dHJhIGFyZ3MgYWRkZWQgZm9yIGRlYnVnIG1vZGUgKGlmIG51bWJlciBjaGFuZ2VzIGJlbG93LCB0aGlzIG11c3QgY2hhbmdlKS4KLQkJaWYodXNlTm92ZXJpZnkpCi0JCQlleHRyYUFyZ3MrKzsgLy8gQW4gZXh0cmEgYXJnIGFkZGVkIGZvciAnLW5vdmVyaWZ5JyBmbGFnIChpZiBudW1iZXIgY2hhbmdlcyBiZWxvdywgdGhpcyBtdXN0IGNoYW5nZSkuCi0JCQotCQlib29sZWFuIHVzZUV4cHJlc3Npb25UcmFjaW5nID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBQcm94eUxhdW5jaFN1cHBvcnQuRVhQUkVTU0lPTl9UUkFDSU5HKSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9uZyBleHByZXNzaW9uVHJhY2luZ1RocmVzaG9sZCA9IC0xOwotCQlpZiAodXNlRXhwcmVzc2lvblRyYWNpbmcpIHsKLQkJCWV4dHJhQXJncysrOwotCQkJU3RyaW5nIHRocmVzaG9sZFN0cmluZyA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgUHJveHlMYXVuY2hTdXBwb3J0LkVYUFJFU1NJT05fVFJBQ0VJTkdfVElNRVJfVEhSRVNIT0xEKTsKLQkJCWlmICh0aHJlc2hvbGRTdHJpbmcgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWV4cHJlc3Npb25UcmFjaW5nVGhyZXNob2xkID0gTG9uZy52YWx1ZU9mKHRocmVzaG9sZFN0cmluZykubG9uZ1ZhbHVlKCk7Ci0JCQkJCWV4dHJhQXJncysrOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlMaXN0IGphdmFMaWJQYXRocyA9IGNvbnRyb2xsZXIuZ2V0RmluYWxKYXZhTGlicmFyeVBhdGgoKTsKLQkJaW50IGV4aXN0aW5nTGlicGF0aHMgPSAtMTsKLQkJaWYgKCFqYXZhTGliUGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBmaXJzdCBuZWVkIHRvIHNlZSBpZiBqYXZhIGxpYiBwYXRoIGFsc28gc3BlY2lmaWVkIGluIHN0YW5kYXJkIGFyZ3MgYnkgc29tZW9uZSBjb25maWd1cmluZyB0aGUgY29uZmlndXJhdGlvbiBieSBoYW5kLgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldm1BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGV2bUFyZ3NbaV0uc3RhcnRzV2l0aCgiLURqYXZhLmxpYnJhcnkucGF0aCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gV2UgZm91bmQgb25lIGFscmVhZHkgaGVyZSwgc2F2ZSB0aGUgc3BvdCBzbyB3ZSB1cGRhdGUgaXQgbGF0ZXIuCi0JCQkJCWV4aXN0aW5nTGlicGF0aHMgPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZXhpc3RpbmdMaWJwYXRocyA9PSAtMSkKLQkJCQkrK2V4dHJhQXJnczsJLy8gTmVlZCB0byBoYXZlIHJvb20gZm9yIG9uZSBtb3JlLgotCQl9Ci0JCQotCQlTdHJpbmdbXSBjdm1BcmdzID0gbmV3IFN0cmluZ1tldm1BcmdzLmxlbmd0aCArIGV4dHJhQXJnc107Ci0JCVN5c3RlbS5hcnJheWNvcHkoZXZtQXJncywgMCwgY3ZtQXJncywgZXh0cmFBcmdzLCBldm1BcmdzLmxlbmd0aCk7CS8vIFB1dCBleGlzdGluZyBpbnRvIG5ldyBsaXN0IGF0IHRoZSBlbmQuCQkKLQkJCi0JCWludCBjdm1BcmdzQ291bnQ9MDsKLQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLURwcm94eXZtLnJlZ2lzdHJ5S2V5PSIgKyByZWdpc3RyeUtleTsgLy8kTk9OLU5MUy0xJAotCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItRHByb3h5dm0ubWFzdGVyUG9ydD0iICsgU3RyaW5nLnZhbHVlT2YobWFzdGVyU2VydmVyUG9ydCk7IC8vJE5PTi1OTFMtMSQKLQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLURwcm94eXZtLmJ1ZnNpemU9IiArIGJ1ZlNpemU7IC8vJE5PTi1OTFMtMSQKLQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLURwcm94eXZtLnNlcnZlcm5hbWU9IiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmKHVzZU5vdmVyaWZ5KQotCQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLW5vdmVyaWZ5IjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKHVzZUV4cHJlc3Npb25UcmFjaW5nKSB7Ci0JCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItRCIrRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05UUkFDRSsiPXRydWUiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChleHByZXNzaW9uVHJhY2luZ1RocmVzaG9sZCAhPSAtMSkKLQkJCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItRCIrRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05UUkFDRV9USU1FUl9USFJFU0hPTEQrJz0nK1N0cmluZy52YWx1ZU9mKGV4cHJlc3Npb25UcmFjaW5nVGhyZXNob2xkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gSWYgaW4gZGVidWcgbW9kZSwgd2UgbmVlZCB0byBmaW5kIGEgcG9ydCBmb3IgaXQgdG8gdXNlLgotCQlpbnQgZHBvcnQgPSAtMTsKLQkJaWYgKGRlYnVnTW9kZSkgewotCQkJZHBvcnQgPSBmaW5kVW51c2VkTG9jYWxQb3J0KCJsb2NhbGhvc3QiLCA1MDAwLCAxNTAwMCwgbmV3IGludFswXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1EamF2YS5jb21waWxlcj1OT05FIjsgLy8kTk9OLU5MUy0xJAotCQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLVhkZWJ1ZyI7IC8vJE5PTi1OTFMtMSQKLQkJCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1Ybm9hZ2VudCI7IC8vJE5PTi1OTFMtMSQKLQkJCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LGFkZHJlc3M9IiArIGRwb3J0OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWlmICghamF2YUxpYlBhdGhzLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nQnVmZmVyIGFwcGVuZFRvID0gbnVsbDsKLQkJCWlmIChleGlzdGluZ0xpYnBhdGhzICE9IC0xKSB7Ci0JCQkJYXBwZW5kVG8gPSBuZXcgU3RyaW5nQnVmZmVyKGV2bUFyZ3NbZXhpc3RpbmdMaWJwYXRoc10pOyAKLQkJCQlhcHBlbmRUby5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7CS8vIFBsdXMgYSBzZXBhcmF0b3Igc28gd2UgY2FuIGFwcGVuZAotCQkJfSBlbHNlIAotCQkJCWFwcGVuZFRvID0gbmV3IFN0cmluZ0J1ZmZlcigiLURqYXZhLmxpYnJhcnkucGF0aD0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIFtdIGxpYlBhdGhzID0gUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRVUkxzVG9TdHJpbmdzKChVUkxbXSkgamF2YUxpYlBhdGhzLnRvQXJyYXkobmV3IFVSTFtqYXZhTGliUGF0aHMuc2l6ZSgpXSkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJQYXRocy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFRvLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IpOwotCQkJCWFwcGVuZFRvLmFwcGVuZChsaWJQYXRoc1tpXSk7Ci0JCQl9Ci0JCQlpZiAoZXhpc3RpbmdMaWJwYXRocyAhPSAtMSkKLQkJCQljdm1BcmdzW2V4dHJhQXJncytleGlzdGluZ0xpYnBhdGhzXSA9IGFwcGVuZFRvLnRvU3RyaW5nKCk7Ci0JCQllbHNlCi0JCQkJY3ZtQXJnc1tleHRyYUFyZ3MtMV0gPSBhcHBlbmRUby50b1N0cmluZygpOwotCQl9Ci0KLQkJcnVuQ29uZmlnLnNldFByb2dyYW1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0UHJvZ3JhbUFyZ3VtZW50c0FycmF5KCkpOwotCQlydW5Db25maWcuc2V0RW52aXJvbm1lbnQoZW52cCk7Ci0JCXJ1bkNvbmZpZy5zZXRWTUFyZ3VtZW50cyhjdm1BcmdzKTsKLQkJcnVuQ29uZmlnLnNldFdvcmtpbmdEaXJlY3Rvcnkod29ya2luZ0Rpck5hbWUpOwotCQlydW5Db25maWcuc2V0Vk1TcGVjaWZpY0F0dHJpYnV0ZXNNYXAodm1BdHRyaWJ1dGVzTWFwKTsKLQotCQkvLyBCb290cGF0aAotCQlydW5Db25maWcuc2V0Qm9vdENsYXNzUGF0aChnZXRCb290cGF0aChjb25maWd1cmF0aW9uKSk7Ci0KLQkJLy8gY2hlY2sgZm9yIGNhbmNlbGxhdGlvbgotCQlpZiAocG0uaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQlwbS53b3JrZWQoMTAwKTsKLQotCQkvLyBzZXQgdGhlIGRlZmF1bHQgc291cmNlIGxvY2F0b3IgaWYgcmVxdWlyZWQKLQkJc2V0RGVmYXVsdFNvdXJjZUxvY2F0b3IobGF1bmNoLCBjb25maWd1cmF0aW9uKTsKLQotCQkvLyBMYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24gLSAxIHVuaXQgb2Ygd29yawotCQlydW5uZXIucnVuKHJ1bkNvbmZpZywgbGF1bmNoLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxMDApKTsKLQotCQkvLyBjaGVjayBmb3IgY2FuY2VsbGF0aW9uCi0JCWlmIChwbS5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJSVByb2Nlc3NbXSBwcm9jZXNzZXMgPSBsYXVuY2guZ2V0UHJvY2Vzc2VzKCk7Ci0JCUlQcm9jZXNzIHByb2Nlc3MgPSBwcm9jZXNzZXNbMF07IC8vIFRoZXJlIGlzIG9ubHkgb25lLgotCQkvLyBDaGVjayBpZiBpdCBpcyBhbHJlYWR5IHRlcm1pbmF0ZWQuIElmIGl0IGlzLCB0aGVuIHRoZXJlIHdhcyBhIGJhZCBlcnJvciwgc28ganVzdAotCQkvLyBwcmludCBvdXQgdGhlIHJlc3VsdHMgZnJvbSBpdC4KLQkJaWYgKHByb2Nlc3MuaXNUZXJtaW5hdGVkKCkpIHsKLQkJCUlTdHJlYW1zUHJveHkgc3RQcm94eSA9IHByb2Nlc3MuZ2V0U3RyZWFtc1Byb3h5KCk7Ci0JCQkvLyBVc2luZyBhIHByaW50V3JpdGVyIGZvciBwcmludGxuIGNhcGFiaWxpdHksIGJ1dCBpdCBuZWVkcyB0byBiZSBvbiBhbm90aGVyCi0JCQkvLyB3cml0ZXIsIHdoaWNoIHdpbGwgYmUgc3RyaW5nCi0JCQlqYXZhLmlvLlN0cmluZ1dyaXRlciBzID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0JCQlqYXZhLmlvLlByaW50V3JpdGVyIHcgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihzKTsKLQotCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9JTkZPXyk7IAotCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9MSU5FMSk7IAotCQkJdy5wcmludGxuKHN0UHJveHkuZ2V0RXJyb3JTdHJlYW1Nb25pdG9yKCkuZ2V0Q29udGVudHMoKSk7Ci0JCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9URVJNSU5BVEVEX0xJTkUyKTsgCi0JCQl3LnByaW50bG4oc3RQcm94eS5nZXRPdXRwdXRTdHJlYW1Nb25pdG9yKCkuZ2V0Q29udGVudHMoKSk7Ci0JCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9URVJNSU5BVEVEX0xJTkUzKTsgCi0JCQl3LmNsb3NlKCk7Ci0KLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5X1Rlcm1pbmF0ZWRfdG9vX3Nvb25fRVJST1JfLCBuZXcgT2JqZWN0W10geyBuYW1lIH0pOyAKLQkJCWRoLmRpc3BsYXlFcnJvck1lc3NhZ2UoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eV9FcnJvcl9UaXRsZSwgbXNnKTsgCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIHMudG9TdHJpbmcoKSwgbnVsbCkpOwotCQl9IGVsc2UgewotCQkJZmluYWwgU3RyaW5nIHRyYWNlTmFtZSA9IG5hbWU7Ci0JCQlJU3RyZWFtc1Byb3h5IGZTdHJlYW1zUHJveHkgPSBwcm9jZXNzLmdldFN0cmVhbXNQcm94eSgpOwotCi0JCQkvKioKLQkJCSAqIFN0cmVhbUxpc3RlbmVyLiBTaG91bGQgbm90IGJlIGNyZWF0ZWQgaWYgUHJveHlQbHVnaW4gbG9nZ2VyIGlzIG5vdCBsb2dnaW5nIHRoZSByZXF1ZXN0ZWQgbGV2ZWwuCi0JCQkgKiAKLQkJCSAqIEBzaW5jZSAxLjEuMAotCQkJICovCi0JCQljbGFzcyBTdHJlYW1MaXN0ZW5lciBpbXBsZW1lbnRzIElTdHJlYW1MaXN0ZW5lciB7Ci0JCQkJU3RyaW5nIHRyYWNlUHJlZml4OwotCQkJCUxldmVsIGxldmVsOwotCQkJCUpvYiBwcmludEpvYjsJLy8gSm9iIHRvIHRyeSB0byBnYXRoZXIgcHJpbnRpbmcgdG9nZXRoZXIuCi0JCQkJTG9nZ2VyIGxvZ2dlcjsKLQkJCQlTdHJpbmdCdWZmZXIgZ2F0aGVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQkJCXsKLQkJCQkJbG9nZ2VyID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCk7Ci0JCQkJCXByaW50Sm9iID0gbmV3IEpvYigiIikgeyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQltb25pdG9yLmJlZ2luVGFzayhQcm94eVJlbW90ZU1lc3NhZ2VzLkxvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZV9Nb25pdG9yX1ByaW50UmVtb3RlVHJhY2VfVGV4dCwgMSk7IAotCQkJCQkJCXdoaWxlKHRydWUpIHsKLQkJCQkJCQkJU3RyaW5nIG91dHB1dCA9IG51bGw7Ci0JCQkJCQkJCXN5bmNocm9uaXplZCAoZ2F0aGVyZWRUZXh0KSB7Ci0JCQkJCQkJCQlpZiAoZ2F0aGVyZWRUZXh0Lmxlbmd0aCgpIDw9IHRyYWNlUHJlZml4Lmxlbmd0aCgpKQotCQkJCQkJCQkJCWJyZWFrOwkvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQsIG5vIG1vcmUgdG8gcHJpbnQuCi0JCQkJCQkJCQlvdXRwdXQgPSBnYXRoZXJlZFRleHQudG9TdHJpbmcoKTsKLQkJCQkJCQkJCWdhdGhlcmVkVGV4dC5zZXRMZW5ndGgodHJhY2VQcmVmaXgubGVuZ3RoKCkpOwkvLyBSZXNldCB0aGUgbGVuZ3RoIHRvIHRoZSBwcmVmaXguCi0JCQkJCQkJCX0KLQkJCQkJCQkJbG9nZ2VyLmxvZyhvdXRwdXQsIGxldmVsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXByaW50Sm9iLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXByaW50Sm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIFN0cmVhbUxpc3RlbmVyKFN0cmluZyB0eXBlLCBMZXZlbCBsZXZlbCwgTG9nZ2VyIGxvZ2dlcikgewotCQkJCQl0cmFjZVByZWZpeCA9IHRyYWNlTmFtZSArICc6JyArIHR5cGUgKyAnPicgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2F0aGVyZWRUZXh0LmFwcGVuZCh0cmFjZVByZWZpeCk7Ci0JCQkJCXRoaXMubGV2ZWwgPSBsZXZlbDsKLQkJCQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc3RyZWFtQXBwZW5kZWQoU3RyaW5nIG5ld1RleHQsIElTdHJlYW1Nb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJc3luY2hyb25pemVkKGdhdGhlcmVkVGV4dCkgewotCQkJCQkJZ2F0aGVyZWRUZXh0LmFwcGVuZChuZXdUZXh0KTsKLQkJCQkJfQotCQkJCQlwcmludEpvYi5zY2hlZHVsZSgxMDBMKTsJLy8gV2FpdCB0ZW50aCBvZiBzZWNvbmQgdG8gZ2F0aGVyIGFzIG11Y2ggYXMgY2FuIHRvZ2V0aGVyLgotCQkJCX0KLQkJCX07Ci0KLQkJCUxvZ2dlciBsb2dnZXIgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQkvLyBBbHdheXMgbGlzdGVuIHRvIFN5c3RlbS5lcnIgb3V0cHV0IGlmIHdlIGFyZSBhdCBsZWFzdCBsb2dnaW5nIHdhcm5pbmdzLgotCQkJCUlTdHJlYW1Nb25pdG9yIG1vbml0b3IgPSBmU3RyZWFtc1Byb3h5LmdldEVycm9yU3RyZWFtTW9uaXRvcigpOwotCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCW1vbml0b3IuYWRkTGlzdGVuZXIobmV3IFN0cmVhbUxpc3RlbmVyKCJlcnIiLCBMZXZlbC5XQVJOSU5HLCBsb2dnZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkvLyBJZiBkZWJ1ZyB0cmFjZSBpcyByZXF1ZXN0ZWQsIHRoZW4gYXR0YWNoIHRyYWNlIGxpc3RlbmVyIGZvciBTeXN0ZW0ub3V0Ci0JCQkvLyBFeHByZXNzaW9uIHRyYWNpbmcgcmVxdWlyZXMgZGVidWcgdHJhY2UgdG9vIGJlY2F1c2UgaXQgcHJpbnRzIHRvIHN5c291dC4gSG93ZXZlciwgaXQgcmVxdWVzdGluZyBleHByZXNzaW9uVHJhY2luZywgY2hhbmdlIGxvZ2dpbmcgbGV2ZWwgdG8gSU5GTywKLQkJCS8vIHdlIHdhbnQgdGhlbSB0byBzaG93IGlmIHRoaXMgdHJ1ZS4gSXQgaXMgY29uZnVzaW5nIHRvIGFsc28gaGF2ZSB0byBjaGFuZ2UgbG9nZ2luZyBsZXZlbCBpbiAub3B0aW9ucyBmaWxlLgotCQkJaWYgKHVzZUV4cHJlc3Npb25UcmFjaW5nKQotCQkJCWlmICghbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLklORk8pKQotCQkJCQlsb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7Ci0JCQlpZiAodXNlRXhwcmVzc2lvblRyYWNpbmcgfHwgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBQcm94eVJlbW90ZVV0aWwuREVCVUdfVk1fVFJBQ0VPVVQpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gV2FudCB0byB0cmFjZSB0aGUgb3V0cHV0IG9mIHRoZSByZW1vdGUgdm0ncy4gQW5kIHdlIGFyZSBsb2dnaW5nIGF0IGxlYXN0IGxldmVsIGluZm8uCi0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5JTkZPKSkgewotCQkJCQlJU3RyZWFtTW9uaXRvciBtb25pdG9yID0gZlN0cmVhbXNQcm94eS5nZXRPdXRwdXRTdHJlYW1Nb25pdG9yKCk7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCQltb25pdG9yLmFkZExpc3RlbmVyKG5ldyBTdHJlYW1MaXN0ZW5lcigib3V0IiwgTGV2ZWwuSU5GTywgbG9nZ2VyKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCi0JCQkJfQkJCQkJCQkKLQkJCX0KLQkJfQotCi0JCS8vIElmIGluIGRlYnVnIG1vZGUsIHRlc3RlciBtdXN0IHN0YXJ0IGRlYnVnZ2VyIGJlZm9yZSBnb2luZyBvbi4KLQkJaWYgKGRlYnVnTW9kZSkgewotCQkJaWYgKCFkaC5wcm9tcHRQb3J0KGRwb3J0KSkgewotCQkJCXByb2Nlc3MudGVybWluYXRlKCk7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCTAsCi0JCQkJCQkiRGVidWdnZXIgYXR0YWNoIGNhbmNlbGVkIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbnVsbCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gTm93IHNldCB1cCB0aGUgcmVnaXN0cnkuCi0JCXJlZ2lzdHJ5LmluaXRpYWxpemVSZWdpc3RyeShwcm9jZXNzKTsKLQkJbmV3IFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkocmVnaXN0cnkpOwotCQluZXcgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJbmV3IFJFTU1ldGhvZFByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0KLQkJaWYgKGRlYnVnTW9kZSB8fCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeS5mR2xvYmFsTm9UaW1lb3V0cykKLQkJCXJlZ2lzdHJ5LmZOb1RpbWVvdXRzID0gdHJ1ZTsKLQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQcm94eUNvbnN0YW50cy5BVFRSSUJVVEVfQVdUX1NXSU5HLCB0cnVlKSkKLQkJCVJFTVJlZ2lzdGVyQVdULnJlZ2lzdGVyQVdUKHJlZ2lzdHJ5KTsKLQotCQlsYXVuY2hJbmZvLnJlc3VsdFJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0KLQkJcG0uZG9uZSgpOwotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wU3RlcChzdGVwSWQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250cm9sbGVyCi0JICogQHBhcmFtIGluZm8gCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEluRnJhZ21lbnRMaWJyYXJpZXMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQREVDb250cmlidXRlQ2xhc3NwYXRoIGluc3RhbmNlID0gSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGguSU5TVEFOQ0U7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlpbnN0YW5jZS5nZXRQREVDb250cmlidXRpb25zKGNvbnRyb2xsZXIsIGluZm8pOwotCQl9Ci0JfQotCi0JLy8gVXRpbGl0aWVzIHRvIGZpbmQgdGhlIGZyZWUgcG9ydAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBmZ1JhbmRvbSA9IG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRVbnVzZWRMb2NhbFBvcnQoU3RyaW5nIGhvc3QsIGludCBzZWFyY2hGcm9tLCBpbnQgc2VhcmNoVG8sIGludFtdIGV4Y2x1ZGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlpbnQgcG9ydCA9IDA7Ci0JCQluZXdwb3J0IDogd2hpbGUgKHRydWUpIHsKLQkJCQlwb3J0ID0gZ2V0UmFuZG9tUG9ydChzZWFyY2hGcm9tLCBzZWFyY2hUbyk7Ci0JCQkJaWYgKGV4Y2x1ZGUgIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgZSA9IDA7IGUgPCBleGNsdWRlLmxlbmd0aDsgZSsrKQotCQkJCQkJaWYgKHBvcnQgPT0gZXhjbHVkZVtlXSkKLQkJCQkJCQljb250aW51ZSBuZXdwb3J0OwotCQkJCWJyZWFrOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgU29ja2V0KGhvc3QsIHBvcnQpOwotCQkJfSBjYXRjaCAoQ29ubmVjdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIHBvcnQ7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXRSYW5kb21Qb3J0KGludCBsb3csIGludCBoaWdoKSB7Ci0JCXJldHVybiAoaW50KSAoZmdSYW5kb20ubmV4dEZsb2F0KCkgKiAoaGlnaCAtIGxvdykpICsgbG93OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZ1tdW10gZ2V0Qm9vdHBhdGhFeHQoTWFwIHZtTWFwKSB7Ci0JICAgIFN0cmluZ1tdW10gZXh0ID0gbmV3IFN0cmluZ1szXVtdOwotCSAgICBpZiAodm1NYXAgIT0gbnVsbCkgewotCQkgICAgZXh0WzBdID0gKFN0cmluZ1tdKSB2bU1hcC5nZXQoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQk9PVFBBVEhfUFJFUEVORCk7Ci0JCSAgICBleHRbMV0gPSAoU3RyaW5nW10pIHZtTWFwLmdldChJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CT09UUEFUSCk7Ci0JCSAgICBleHRbMl0gPSAoU3RyaW5nW10pIHZtTWFwLmdldChJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CT09UUEFUSF9BUFBFTkQpOwotCSAgICB9Ci0JICAgIHJldHVybiBleHQ7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL01lc3NhZ2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTWVzc2FnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTYxNGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IE1lc3NhZ2VEaWFsb2cuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBqYXZhLmF3dC4qOwotLyoqCi0gKiBUaGlzIGlzIGFuIEFXVCBtZXNzYWdlIGRpYWxvZy4gSXQgd2lsbCBvbmx5IGJlIHVzZWQKLSAqIGlmIG5vdCBydW5uaW5nIGluIHRoZSB3b3JrYmVuY2ggYnkgdGhlIGRlYnVnIG1vZGUgaGVscGVyLgotICogSXQgd29uJ3QgYmUgbG9hZGVkIHVubGVzcyBBV1QgaXMgYXZhaWxhYmxlLCBzbyBpdCBjYW4gYmUKLSAqIGRpc3RyaWJ1dGVkIHdpdGhvdXQgY2F1c2luZyBwcm9ibGVtcyBvbiBzeXN0ZW1zIHRoYXQKLSAqIGRvbid0IGhhdmUgQVdUIGJlY2F1c2UgaXQgd29uJ3QgYmUgbG9hZGVkIGluIHRoYXQgY2FzZS4KLSAqLwotY2xhc3MgTWVzc2FnZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNTQ3NjcwMzQ5MzcyMDY3MzQ1TDsKLQlwcml2YXRlIGphdmEuYXd0LlBhbmVsIGl2akNvbnRlbnRzUGFuZSA9IG51bGw7Ci0JSXZqRXZlbnRIYW5kbGVyIGl2akV2ZW50SGFuZGxlciA9IG5ldyBJdmpFdmVudEhhbmRsZXIoKTsKLQlwcml2YXRlIGphdmEuYXd0LlRleHRBcmVhIGl2alRleHRBcmVhMSA9IG51bGw7Ci0JcHJpdmF0ZSBqYXZhLmF3dC5CdXR0b24gaXZqQnV0dG9uMSA9IG51bGw7Ci0JcHVibGljIGludCByZXN1bHQgPSAyOwkvLyBOb3RoaW5nIGhpdCBpcyB0aGUgc2FtZSBhcyBidXR0b24gMi4KLQlwcml2YXRlIGphdmEuYXd0LkJ1dHRvbiBpdmpCdXR0b24yID0gbnVsbDsKLQotY2xhc3MgSXZqRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIsIGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IE1lc3NhZ2VEaWFsb2cudGhpcy5nZXRCdXR0b24xKCkpIAotCQkJCWNvbm5FdG9DMihlKTsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IE1lc3NhZ2VEaWFsb2cudGhpcy5nZXRCdXR0b24yKCkpIAotCQkJCWNvbm5FdG9DMyhlKTsKLQkJfTsKLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgZSkge307Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgZSkgewotCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gTWVzc2FnZURpYWxvZy50aGlzKSAKLQkJCQljb25uRXRvQzEoZSk7Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWljb25pZmllZChqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudCBlKSB7fTsKLQkJcHVibGljIHZvaWQgd2luZG93SWNvbmlmaWVkKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgZSkge307Ci0JfTsKLS8qKgotICogTWVzc2FnZURpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG93bmVyIGphdmEuYXd0LkZyYW1lCi0gKiBAcGFyYW0gdGl0bGUgamF2YS5sYW5nLlN0cmluZwotICogQHBhcmFtIG1vZGFsIGJvb2xlYW4KLSAqLwotcHVibGljIE1lc3NhZ2VEaWFsb2coRnJhbWUgb3duZXIsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCwgU3RyaW5nIG1zZywgU3RyaW5nIGJ1dHRvbjEsIFN0cmluZyBidXR0b24yKSB7Ci0Jc3VwZXIob3duZXIsIHRpdGxlLCBtb2RhbCk7Ci0KLQlpbml0aWFsaXplKCk7Ci0JZ2V0VGV4dEFyZWExKCkuc2V0VGV4dChtc2cpOwotCWdldEJ1dHRvbjEoKS5zZXRMYWJlbChidXR0b24xKTsKLQlpZiAoYnV0dG9uMiAhPSBudWxsKQotCQlnZXRCdXR0b24yKCkuc2V0TGFiZWwoYnV0dG9uMik7Ci0JZWxzZSB7Ci0JCS8vIFdlIG9ubHkgd2FudCBvbmUgYnV0dG9uLCBzbyByZW1vdmUgYnV0dG9uMgotCQlnZXRDb250ZW50c1BhbmUoKS5yZW1vdmUoZ2V0QnV0dG9uMigpKTsKLQl9Ci0JCi19Ci0vKioKLSAqIENvbW1lbnQKLSAqLwotcHVibGljIHZvaWQgYnV0dG9uMV9BY3Rpb25QZXJmb3JtZWQoKSB7Ci0JcmVzdWx0ID0gMTsKLQlzZXRWaXNpYmxlKGZhbHNlKTsKLQlyZXR1cm47Ci19Ci0vKioKLSAqIENvbW1lbnQKLSAqLwotcHVibGljIHZvaWQgYnV0dG9uMl9BY3Rpb25QZXJmb3JtZWQoKSB7Ci0JcmVzdWx0ID0gMjsKLQlzZXRWaXNpYmxlKGZhbHNlKTsKLQlyZXR1cm47Ci19Ci0vKioKLSAqIGNvbm5FdG9DMTogIChNZXNzYWdlRGlhbG9nLndpbmRvdy53aW5kb3dDbG9zaW5nKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50KSAtLT4gTWVzc2FnZURpYWxvZy5kaXNwb3NlKClWKQotICogQHBhcmFtIGFyZzEgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQKLSAqLwotLyogV0FSTklORzogVEhJUyBNRVRIT0QgV0lMTCBCRSBSRUdFTkVSQVRFRC4gKi8KLXByaXZhdGUgdm9pZCBjb25uRXRvQzEoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgYXJnMSkgewotCXRyeSB7Ci0JCS8vIHVzZXIgY29kZSBiZWdpbiB7MX0KLQkJLy8gdXNlciBjb2RlIGVuZAotCQl0aGlzLmRpc3Bvc2UoKTsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHszfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCX0KLX0KLS8qKgotICogY29ubkV0b0MyOiAgKEJ1dHRvbjEuYWN0aW9uLmFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCkgLS0+IE1lc3NhZ2VEaWFsb2cuYnV0dG9uMV9BY3Rpb25QZXJmb3JtZWQoKVYpCi0gKiBAcGFyYW0gYXJnMSBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudAotICovCi0vKiBXQVJOSU5HOiBUSElTIE1FVEhPRCBXSUxMIEJFIFJFR0VORVJBVEVELiAqLwotcHJpdmF0ZSB2b2lkIGNvbm5FdG9DMihqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBhcmcxKSB7Ci0JdHJ5IHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCXRoaXMuYnV0dG9uMV9BY3Rpb25QZXJmb3JtZWQoKTsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHszfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCX0KLX0KLS8qKgotICogY29ubkV0b0MzOiAgKEJ1dHRvbjIuYWN0aW9uLmFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCkgLS0+IE1lc3NhZ2VEaWFsb2cuYnV0dG9uMl9BY3Rpb25QZXJmb3JtZWQoKVYpCi0gKiBAcGFyYW0gYXJnMSBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudAotICovCi0vKiBXQVJOSU5HOiBUSElTIE1FVEhPRCBXSUxMIEJFIFJFR0VORVJBVEVELiAqLwotcHJpdmF0ZSB2b2lkIGNvbm5FdG9DMyhqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBhcmcxKSB7Ci0JdHJ5IHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCXRoaXMuYnV0dG9uMl9BY3Rpb25QZXJmb3JtZWQoKTsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHszfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCX0KLX0KLS8qKgotICogRGlzcGxheSBkaWFsb2cuCi0gKiBAcGFyYW0gYXJncyBqYXZhLmxhbmcuU3RyaW5nW10KLSAqLwotcHVibGljIHN0YXRpYyBpbnQgZG9pdChTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgYnV0dG9uMSwgU3RyaW5nIGJ1dHRvbjIpIHsKLQl0cnkgewotCQlGcmFtZSBmID0gbmV3IGphdmEuYXd0LkZyYW1lKHRpdGxlKTsKLQkJZi5zZXRWaXNpYmxlKHRydWUpOwotCQkvLyBOZWVkIHRvIG1hc3NhZ2UgdGhlIG1ldGhvZCBzaW5jZSBBV1QgZG9lc24ndCBoYXZlIHdvcmR3cmFwLiBUaGlzIGlzIGZvciBsZWZ0IHRvIHJpZ2h0IG9ubHkuCi0JCVN0cmluZyBtc2cgPSBtZXNzYWdlOwotCQlpZiAobWVzc2FnZS5sZW5ndGgoKSA+IDk1KSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotbmV4dFNlZzoJd2hpbGUgKG1lc3NhZ2UubGVuZ3RoKCkgPiA5NSkgewotCQkJCS8vIFRvbyB3aWRlLCB3cmFwcGluZyBzaG91bGQgYmUgZG9uZS4gVGhpcyBpcyBqdXN0IGEgcm91Z2ggZ3Vlc3MuCi0JCQkJZm9yIChpbnQgaT05NTsgMDw9aTsgaS0tKSB7Ci0JCQkJCWlmIChtZXNzYWdlLmNoYXJBdChpKSA9PSAnICcpIHsKLQkJCQkJCS8vIEJyZWFrIGhlcmUuCi0JCQkJCQltc2cgPSBtc2cgKyBtZXNzYWdlLnN1YnN0cmluZygwLCBpKSArICdcbic7Ci0JCQkJCQlpZiAoaSsxIDwgbWVzc2FnZS5sZW5ndGgoKSkKLQkJCQkJCQltZXNzYWdlID0gbWVzc2FnZS5zdWJzdHJpbmcoaSsxKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQltZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbnRpbnVlIG5leHRTZWc7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSWYgd2UgZ290IGhlcmUsIHRoZW4gdGhlcmUgd2VyZW4ndCBhbnkgc3BhY2VzIGluIHRoZSBmaXJzdCA4MCwgc28gbG9vayByaWdodCBmb3IgZmlyc3Qgc3BhY2UuCi0JCQkJZm9yIChpbnQgaT05NjsgaTxtZXNzYWdlLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKG1lc3NhZ2UuY2hhckF0KGkpID09ICcgJykgewotCQkJCQkJLy8gQnJlYWsgaGVyZQotCQkJCQkJbXNnID0gbXNnICsgbWVzc2FnZS5zdWJzdHJpbmcoMCwgaSkgKyAnXG4nOwotCQkJCQkJaWYgKGkrMSA8IG1lc3NhZ2UubGVuZ3RoKCkpCi0JCQkJCQkJbWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGkrMSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQljb250aW51ZSBuZXh0U2VnOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbXNnICs9IG1lc3NhZ2U7CS8vIE5vdyBwdXQgb24gd2hhdGV2ZXIgaXMgbGVmdC4KLQkJfQotCQlNZXNzYWdlRGlhbG9nIGFNZXNzYWdlRGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZix0aXRsZSx0cnVlLCBtc2csIGJ1dHRvbjEsIGJ1dHRvbjIpOwotCQlhTWVzc2FnZURpYWxvZy5wYWNrKCk7Ci0JCWFNZXNzYWdlRGlhbG9nLmdldFRvb2xraXQoKS5iZWVwKCk7Ci0JCWFNZXNzYWdlRGlhbG9nLnNldFZpc2libGUodHJ1ZSk7Ci0JCWYuZGlzcG9zZSgpOwotCQlhTWVzc2FnZURpYWxvZy5kaXNwb3NlKCk7Ci0KLQkJcmV0dXJuIGFNZXNzYWdlRGlhbG9nLnJlc3VsdDsKLQl9IGNhdGNoIChUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JfQotCi0JcmV0dXJuIDI7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgQnV0dG9uMSBwcm9wZXJ0eSB2YWx1ZS4KLSAqIEByZXR1cm4gamF2YS5hd3QuQnV0dG9uCi0gKi8KLS8qIFdBUk5JTkc6IFRISVMgTUVUSE9EIFdJTEwgQkUgUkVHRU5FUkFURUQuICovCi1wcml2YXRlIGphdmEuYXd0LkJ1dHRvbiBnZXRCdXR0b24xKCkgewotCWlmIChpdmpCdXR0b24xID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWl2akJ1dHRvbjEgPSBuZXcgamF2YS5hd3QuQnV0dG9uKCk7Ci0JCQlpdmpCdXR0b24xLnNldE5hbWUoIkJ1dHRvbjEiKTsgLy8kTk9OLU5MUy0xJAotCQkJaXZqQnV0dG9uMS5zZXRMYWJlbCgiQnV0dG9uMSIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB1c2VyIGNvZGUgYmVnaW4gezF9Ci0JCQkvLyB1c2VyIGNvZGUgZW5kCi0JCX0gY2F0Y2ggKGphdmEubGFuZy5UaHJvd2FibGUgaXZqRXhjKSB7Ci0JCQkvLyB1c2VyIGNvZGUgYmVnaW4gezJ9Ci0JCQkvLyB1c2VyIGNvZGUgZW5kCi0JCQloYW5kbGVFeGNlcHRpb24oaXZqRXhjKTsKLQkJfQotCX0KLQlyZXR1cm4gaXZqQnV0dG9uMTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBCdXR0b24yIHByb3BlcnR5IHZhbHVlLgotICogQHJldHVybiBqYXZhLmF3dC5CdXR0b24KLSAqLwotLyogV0FSTklORzogVEhJUyBNRVRIT0QgV0lMTCBCRSBSRUdFTkVSQVRFRC4gKi8KLXByaXZhdGUgamF2YS5hd3QuQnV0dG9uIGdldEJ1dHRvbjIoKSB7Ci0JaWYgKGl2akJ1dHRvbjIgPT0gbnVsbCkgewotCQl0cnkgewotCQkJaXZqQnV0dG9uMiA9IG5ldyBqYXZhLmF3dC5CdXR0b24oKTsKLQkJCWl2akJ1dHRvbjIuc2V0TmFtZSgiQnV0dG9uMiIpOyAvLyROT04tTkxTLTEkCi0JCQlpdmpCdXR0b24yLnNldExhYmVsKCJCdXR0b24yIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHVzZXIgY29kZSBiZWdpbiB7MX0KLQkJCS8vIHVzZXIgY29kZSBlbmQKLQkJfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJCS8vIHVzZXIgY29kZSBiZWdpbiB7Mn0KLQkJCS8vIHVzZXIgY29kZSBlbmQKLQkJCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCQl9Ci0JfQotCXJldHVybiBpdmpCdXR0b24yOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIENvbnRlbnRzUGFuZSBwcm9wZXJ0eSB2YWx1ZS4KLSAqIEByZXR1cm4gamF2YS5hd3QuUGFuZWwKLSAqLwotLyogV0FSTklORzogVEhJUyBNRVRIT0QgV0lMTCBCRSBSRUdFTkVSQVRFRC4gKi8KLXByaXZhdGUgamF2YS5hd3QuUGFuZWwgZ2V0Q29udGVudHNQYW5lKCkgewotCWlmIChpdmpDb250ZW50c1BhbmUgPT0gbnVsbCkgewotCQl0cnkgewotCQkJaXZqQ29udGVudHNQYW5lID0gbmV3IGphdmEuYXd0LlBhbmVsKCk7Ci0JCQlpdmpDb250ZW50c1BhbmUuc2V0TmFtZSgiQ29udGVudHNQYW5lIik7IC8vJE5PTi1OTFMtMSQKLQkJCWl2akNvbnRlbnRzUGFuZS5zZXRMYXlvdXQobmV3IGphdmEuYXd0LkZsb3dMYXlvdXQoKSk7Ci0JCQlnZXRDb250ZW50c1BhbmUoKS5hZGQoZ2V0VGV4dEFyZWExKCksIGdldFRleHRBcmVhMSgpLmdldE5hbWUoKSk7Ci0JCQlnZXRDb250ZW50c1BhbmUoKS5hZGQoZ2V0QnV0dG9uMSgpLCBnZXRCdXR0b24xKCkuZ2V0TmFtZSgpKTsKLQkJCWdldENvbnRlbnRzUGFuZSgpLmFkZChnZXRCdXR0b24yKCksIGdldEJ1dHRvbjIoKS5nZXROYW1lKCkpOwotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQl9IGNhdGNoIChqYXZhLmxhbmcuVGhyb3dhYmxlIGl2akV4YykgewotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQkJaGFuZGxlRXhjZXB0aW9uKGl2akV4Yyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGl2akNvbnRlbnRzUGFuZTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBUZXh0QXJlYTEgcHJvcGVydHkgdmFsdWUuCi0gKiBAcmV0dXJuIGphdmEuYXd0LlRleHRBcmVhCi0gKi8KLS8qIFdBUk5JTkc6IFRISVMgTUVUSE9EIFdJTEwgQkUgUkVHRU5FUkFURUQuICovCi1wcml2YXRlIGphdmEuYXd0LlRleHRBcmVhIGdldFRleHRBcmVhMSgpIHsKLQlpZiAoaXZqVGV4dEFyZWExID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWl2alRleHRBcmVhMSA9IG5ldyBUZXh0QXJlYSgpOwotCQkJaXZqVGV4dEFyZWExLnNldE5hbWUoIlRleHRBcmVhMSIpOyAvLyROT04tTkxTLTEkCi0JCQlpdmpUZXh0QXJlYTEuc2V0VGV4dCgiVGV4dEFyZWExIik7IC8vJE5PTi1OTFMtMSQKLQkJCWl2alRleHRBcmVhMS5zZXRSb3dzKDIwKTsKLQkJCWl2alRleHRBcmVhMS5zZXRDb2x1bW5zKDEwMCk7Ci0JCQlpdmpUZXh0QXJlYTEuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQl9IGNhdGNoIChqYXZhLmxhbmcuVGhyb3dhYmxlIGl2akV4YykgewotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQkJaGFuZGxlRXhjZXB0aW9uKGl2akV4Yyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGl2alRleHRBcmVhMTsKLX0KLS8qKgotICogQ2FsbGVkIHdoZW5ldmVyIHRoZSBwYXJ0IHRocm93cyBhbiBleGNlcHRpb24uCi0gKiBAcGFyYW0gZXhjZXB0aW9uIGphdmEubGFuZy5UaHJvd2FibGUKLSAqLwotcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihqYXZhLmxhbmcuVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCi0JLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gcHJpbnQgdW5jYXVnaHQgZXhjZXB0aW9ucyB0byBzdGRvdXQgKi8KLQkvLyBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZShMZXZlbC5XQVJOSU5HLCItLS0tLS0tLS0gVU5DQVVHSFQgRVhDRVBUSU9OIC0tLS0tLS0tLSIpOwotCS8vIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKExldmVsLldBUk5JTkcsZXhjZXB0aW9uKTsKLX0KLS8qKgotICogSW5pdGlhbGl6ZXMgY29ubmVjdGlvbnMKLSAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotICovCi0vKiBXQVJOSU5HOiBUSElTIE1FVEhPRCBXSUxMIEJFIFJFR0VORVJBVEVELiAqLwotcHJpdmF0ZSB2b2lkIGluaXRDb25uZWN0aW9ucygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQkvLyB1c2VyIGNvZGUgYmVnaW4gezF9Ci0JLy8gdXNlciBjb2RlIGVuZAotCXRoaXMuYWRkV2luZG93TGlzdGVuZXIoaXZqRXZlbnRIYW5kbGVyKTsKLQlnZXRCdXR0b24xKCkuYWRkQWN0aW9uTGlzdGVuZXIoaXZqRXZlbnRIYW5kbGVyKTsKLQlnZXRCdXR0b24yKCkuYWRkQWN0aW9uTGlzdGVuZXIoaXZqRXZlbnRIYW5kbGVyKTsKLX0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgY2xhc3MuCi0gKi8KLS8qIFdBUk5JTkc6IFRISVMgTUVUSE9EIFdJTEwgQkUgUkVHRU5FUkFURUQuICovCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQl0cnkgewotCQkvLyB1c2VyIGNvZGUgYmVnaW4gezF9Ci0JCS8vIHVzZXIgY29kZSBlbmQKLQkJc2V0TmFtZSgiTWVzc2FnZURpYWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCXNldExheW91dChuZXcgamF2YS5hd3QuQm9yZGVyTGF5b3V0KCkpOwotCQlzZXRTaXplKDQyNiwgMjQwKTsKLQkJYWRkKGdldENvbnRlbnRzUGFuZSgpLCAiQ2VudGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdENvbm5lY3Rpb25zKCk7Ci0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJaGFuZGxlRXhjZXB0aW9uKGl2akV4Yyk7Ci0JfQotCS8vIHVzZXIgY29kZSBiZWdpbiB7Mn0KLQkvLyB1c2VyIGNvZGUgZW5kCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1Byb3h5UmVtb3RlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUHJveHlSZW1vdGVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmJmOGQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUHJveHlSZW1vdGVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJveHlSZW1vdGVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQcm94eVJlbW90ZU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT19PVVRQVVRfRk9MREVSX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVk1fVEVSTUlOQVRFRF9JTkZPXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWTV9URVJNSU5BVEVEX0xJTkUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZNX1RFUk1JTkFURURfTElORTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVk1fVEVSTUlOQVRFRF9MSU5FMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVEVfVk1fVFJBQ0VfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1RFX1ZNX0xPQ0FMX1RSQUNFX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzY2FzdF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbnRpYXRlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlQ21kX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhjZXB0aW9uRXJyb3JNc2dfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPS183OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5X05vUnVubmVyX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eV9FcnJvcl9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eV9UZXJtaW5hdGVkX3Rvb19zb29uX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eVJlbW90ZVZNTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eVJlbW90ZVZNTmFtZVdpdGhDb21tZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5UmVtb3RlTm9MYXVuY2hLZXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlSZW1vdGVMYXVuY2hWTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwSm9iX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0NhbGxiYWNrQ29ubmVjdGlvbk5vdFdvcmtpbmdfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Db25uZWN0aW9uQ3JlYXRpb25GYWlsZWRfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfSm9iX1Rlcm1pbmF0ZVByb2Nlc3NfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ291bGROb3RDcmVhdGVTb2NrZXRDb25uZWN0aW9uVG9SZW1vdGVWTV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTUV4cHJlc3Npb25fSU9FeGNlcHRpb25TZWVMb2dfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNRXhwcmVzc2lvbl9Db21tYW5kRXhjZXB0aW9uU2VlTG9nX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZV9Nb25pdG9yX1ByaW50UmVtb3RlVHJhY2VfVGV4dDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb3h5UmVtb3RlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1Byb3h5UmVtb3RlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9Qcm94eVJlbW90ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0ZTViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1Byb3h5UmVtb3RlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUHJveHlSZW1vdGVVdGlsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA1LzEwLzI2IDE0OjI0OjUxICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFByb3h5UmVtb3RlVXRpbCB7Ci0KLQkvLyBEZWJ1ZyBvcHRpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfVk0gPSAiL3JlbW90ZS9kZWJ1Zy9kZWJ1Z3ZtIiwgLy8gQnJpbmcgdXAgZGVidWdnZXIgb24gcmVtb3RlIHZtJ3MuIC8vJE5PTi1OTFMtMSQKLQkJSU9fQ09OU09MRSA9ICIvcmVtb3RlL2RlYnVnL2lvY29uc29sZSIsIC8vIElPIFRocm91Z2ggY29uc29sZSAoc3lzdGVtIGluIGFuZCBvdXQpIGZvciBhc2tpbmcgcXVlc3Rpb25zLiAvLyROT04tTkxTLTEkCi0JCURFQlVHX1ZNX1RSQUNFT1VUID0gIi9yZW1vdGUvZGVidWcvdm10cmFjZW91dCIsIC8vIFRyYWNlIHRoZSBvdXRwdXQgZnJvbSB0aGUgcmVtb3RlIHZtJ3MuIC8vJE5PTi1OTFMtMSQKLQkJTk9fVElNRU9VVFMgPSAiL3JlbW90ZS9kZWJ1Zy9ub3RpbWVvdXRzIjsJLy8gTm8gc29ja2V0IHRpbWVvdXRzIHdoZW4gdGFsa2luZyB0byByZW1vdGUgdm0uIFR1cm4gdGhpcyBvbiB3aGVuIGRvaW5nIGNhbGxiYWNrIHRlc3RpbmcuIE5vdCBuZWVkZWQgb3RoZXJ3aXNlLiAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgUkVNUmVnaXN0cnlDb250cm9sbGVyIHBsdWdpblJlZ2lzdHJ5Q29udHJvbGxlcjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lzdHJ5IGNvbnRyb2xsZXIuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUkVNUmVnaXN0cnlDb250cm9sbGVyIGdldFJlZ2lzdHJ5Q29udHJvbGxlcigpIHsKLQkJcmV0dXJuIHBsdWdpblJlZ2lzdHJ5Q29udHJvbGxlciAhPSBudWxsID8gcGx1Z2luUmVnaXN0cnlDb250cm9sbGVyIDogKHBsdWdpblJlZ2lzdHJ5Q29udHJvbGxlciA9IG5ldyBSRU1SZWdpc3RyeUNvbnRyb2xsZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB0byB1cGRhdGUgYW55IGNsYXNzIHBhdGhzIHdpdGggYW55Ci0JICogcGF0aHMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIHRvIGEgVk0uIEluIHRoaXMgY2FzZSwgaXQgaXMKLQkgKiB0aGUgcmVtb3Rldm0uamFyIGFuZCB0aGUgcmVtb3RlY29tbW9uLmphciB0aGF0IG5lZWQgdG8gYmUgYWRkZWQuIFRoZSBmaXJzdCBqYXIgY29udGFpbnMKLQkgKiB0aGUgY29kZSBuZWNlc3NhcnkgdG8gcnVuIHRoZSByZW1vdGUgdm0gYW5kIGxpc3RlbiBmb3IgY29tbWFuZHMuIFRoZSBzZWNvbmQgamFyIGNvbnRhaW5zCi0JICogdGhlIGNvbW1vbiBjb2RlIHRoYXQgaXMgcmVxdWlyZWQgdG8gYmUgc2hhcmVkIG9uIGJvdGggdGhlIElERSBzaWRlIGFuZCByZW1vdGUgc2lkZS4gSXQKLQkgKiBpcyB0aGUgaW50ZXJmYWNlIGNvZGUgc28gdGhhdCB0aGV5IGJvdGggdGFsayB0aGUgc2FtZSBsYW5ndWFnZS4KLQkgKiBzdXBwb3J0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVDbGFzc1BhdGhzKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0JCUJ1bmRsZSBwcm94eUJ1bmRsZSA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpOwotCQkvLyBOZWVkIHRvIGhhdmUgb3VyIGphcnMgYXQgdGhlIGJlZ2lubmluZy4gKFN0cnV0cyBjYXVzZXMgYSBwcm9ibGVtIGJlY2F1c2UgCi0JCS8vIHRoZXkgaGF2ZSBhIGphciAoY29tbW9ucy1maWxldXBsb2FkLmphcikgdGhhdCBpZiB3aGVuIHNlYXJjaGluZyBmb3IgYSBjbGFzcyBhbmQKLQkJLy8gdGhpcyBqYXIgaXMgcmVhY2hlZCwgaXQgY2F1c2VzIHRoZSBjbGFzcyBsb2FkZXIgdG8gYmFyZi4gT3VyIGphcnMgdXNlZCB0byBiZSBhdAotCQkvLyB0aGUgZW5kLCBhbmQgc28gaXQgZm91bmQgdGhlIGZpbGV1cGxvYWQgamFyIGZpcnN0IGFuZCBubyByZW1vdGUgdm0gY291bGQgYmUgc3RhcnRlZAotCQkvLyBiZWNhdXNlIG9mIHRoaXMuCi0JCWNvbnRyb2xsZXIuY29udHJpYnV0ZUNsYXNzcGF0aChwcm94eUJ1bmRsZSwgKElQYXRoKSBudWxsLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuUFJFUEVORF9VU0VSX0NMQVNTUEFUSCwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRyb2xsZXIuY29udHJpYnV0ZUNsYXNzcGF0aChwcm94eUJ1bmRsZSwgInZtL3JlbW90ZXZtLmphciIsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5QUkVQRU5EX1VTRVJfQ0xBU1NQQVRILCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3RCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3RCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjOTIxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFic3RyYWN0QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQWJzdHJhY3RCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuKjsKLS8qKgotICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBJUkVNQmVhblByb3h5IHRoYXQgZG9lc24ndAotICogaGF2ZSB0aGUgYmVhbiB0eXBlIHN0b3JlZCBpbiBpdC4gVGhlIHN1YmNsYXNzZXMgd2lsbAotICogc3VwcGx5IGl0LiBJdCBkb2VzIGhvd2V2ZXIgaGF2ZSBhbiBJRCBiZWNhdXNlIGl0IGRvZXMKLSAqIGV4aXN0IG92ZXIgb24gdGhlIHJlbW90ZSBWTS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJFTUFic3RyYWN0QmVhblByb3h5IGltcGxlbWVudHMgSVJFTUJlYW5Qcm94eSB7Ci0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZGYWN0b3J5OwotCXByaXZhdGUgSW50ZWdlciBmSUQ7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBiZWFuIHdlIGFyZSBwcm94eWluZy4gIFdlIGFyZSBhIHByb3h5IGZvciBhIGJlYW4gcnVubmluZyBvbiB0aGUgcmVtb3RlIFZNLiAKLQkgKi8KLQlwcm90ZWN0ZWQgUkVNQWJzdHJhY3RCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQpewotCQlmRmFjdG9yeSA9IGFSZWdpc3RyeTsKLQkJZklEID0gYW5JRDsKLQl9Ci0JCi0JLyoqCi0JICogZXF1YWxzOiBFcXVhbCBpZjoKLQkgKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0JICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotCSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0JICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotCSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKHN1cGVyLmVxdWFscyhhbk9iamVjdCkpCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgSUJlYW5Qcm94eSAmJiAhKGFuT2JqZWN0IGluc3RhbmNlb2YgSVJFTUNvbnN0YW50QmVhblByb3h5KSAmJiBmRmFjdG9yeS5pc1ZhbGlkKCkgJiYgKChJQmVhblByb3h5KSBhbk9iamVjdCkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSA9PSBmRmFjdG9yeSkKLQkJCXRyeSB7Ci0JCQkJLy8gVGhlIG90aGVyIGlzIGEgYmVhbiBwcm94eSBhbmQgaXMgbm90IGEgY29uc3RhbnQgb25lLCBsZXQgdGhlIHNlcnZlciBkbyB0aGUgY2hlY2suCi0JCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0T2JqZWN0RXF1YWxzKCkuaW52b2tlKHRoaXMsIChJQmVhblByb3h5KSBhbk9iamVjdCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQkJcmV0dXJuIHRoaXMgPT0gYUJlYW5Qcm94eTsJLy8gV2UgY2FuIGJlIGFzc3VyZWQgaW4gUmVtb3RlIFByb3h5IHRoYXQgaWRlbnRpdHkgb2YgcHJveHkgYW5kIGlkZW50aXR5IG9mIG9iamVjdCBhcmUgdGhlIHNhbWUuCi0JfQotCQkKLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBmRmFjdG9yeTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IElELiBBbiBpbnRlcm5hbCBtZXRob2QgdG8gYmUgdXNlZCBvbmx5IHdpdGhpbiB0aGUgUHJveHlGYWN0b3J5IGZhbWlseS4KLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIGZJRDsKLQl9Ci0JCi0JLyoqCi0JICogaXNWYWxpZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gZklEICE9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFByb3h5IGlzIGFib3V0IHRvIGJlIHJlbGVhc2VkLCBNVVNUIG1hcmsgaXQgaW52YWxpZC4KLQkgKiBUaGlzIGlzIHJlcXVpcmVkLiBSZXNvdXJjZXMgY2FuIGFsc28gYmUgY2xlYW5lZCB1cAotCSAqIGlmIHRoZXkgYXJlIGJlaW5nIGhlbGQgYW5kIG5lZWQgdG8gYmUgY2xlYW5lZCB1cC4KLQkgKgotCSAqIE5PVEU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgcHJveHkKLQkgKiBpcyBleHBsaWNpdGx5IHJlbGVhc2VkLiBJZiBpdCBpcyBzaW1wbHkgZ2FyYmFnZSBjb2xsZWN0ZWQsCi0JICogdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQuIFNpbXBsZSBnYXJiYWdlIGNvbGxlY3Rpb24KLQkgKiBtZWFucyB0aGF0IG5vIG9uZSBpcyByZWZlcmVuY2luZyB0aGlzIHByb3h5LiBUaGUgcHJveHkgZmFjdG9yeQotCSAqIHdpbGwga25vdyB3aGF0IGlkIHRoaXMgcHJveHkgd2FzIHJlZmVyZW5jaW5nIGFuZCB3aWxsIHJlbGVhc2UgaXQKLQkgKiBvbiB0aGUgc2VydmVyIGF0IEdDIHRpbWUuCi0JICoKLQkgKiBJZiB0aGVyZSBhcmUgcmVzb3VyY2VzCi0JICogdGhhdCBhYnNvbHV0ZWx5IG11c3QgYmUgcmVsZWFzZWQsIHRoZW4gdGhlIGZpbmFsaXplIG1ldGhvZAotCSAqIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBkbyB0aGUgY2xlYW4gdXAuIEhvd2V2ZXIsIHRyeSBub3QKLQkgKiB0byBoYXZlIHRoaXMgYmUgdGhlIGNhc2UuIEZpbmFsaXplIG1ldGhvZHMgYWRkIG92ZXJoZWFkIHRoYXQgaXMKLQkgKiB1c3VhbGx5IGJldHRlciBub3QgdG8gaGF2ZS4gVGhlIGJldHRlciB3YXkgaXMgZm9yIGFueSB1c2VycwotCSAqIHRoYXQgZ2V0IHRoaXMga2luZCBvZiBwcm94eSBvYmplY3Qga25vdyB0byBjYWxsIHJlbGVhc2Ugb24KLQkgKiBQcm94eUZhY3RvcnlSZWdpc3RyeSB0byByZWxlYXNlIGl0IGJlZm9yZSBnYXJiYWdlIGNvbGxlY3Rpb24uCSAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmSUQgPSBudWxsOwotCX0KLQkJCQotCS8qKgotCSAqIFJldHVybiB0aGUgdG9TdHJpbmcgb2YgdGhlIGFjdHVhbCBiZWFuIG9uIHRoZSByZW1vdGUgc2lkZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJSVN0cmluZ0JlYW5Qcm94eSBzdHJpbmcgPSAoSVN0cmluZ0JlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRPYmplY3RUb1N0cmluZygpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzKTsKLQkJcmV0dXJuIChzdHJpbmcgIT0gbnVsbCkgPyBzdHJpbmcuc3RyaW5nVmFsdWUoKSA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlbmRlciB0aGUgYmVhbiBwcm94eSBpbnRvIHRoZSB2YWx1ZSBmaWVsZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCXZhbHVlLnNldE9iamVjdElEKGlzVmFsaWQoKSA/IGdldElEKCkuaW50VmFsdWUoKSA6IENvbW1hbmRzLlZPSUQpOwkvLyBObyBsb25nZXIgZXhpc3RzLCBzbyBzZW5kIG92ZXIgbnVsbC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNCZWFuUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmVhblByb3h5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzRXhwcmVzc2lvblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0V4cHJlc3Npb25Qcm94eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFic3RyYWN0QmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQxNWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE1ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5UcmFuc21pdGFibGVBcnJheTsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGlzIGZvciB3aGVyZSB0aGUgQmVhbiBpcyBvbiBhIGRpZmZlcmVudCBWTSB0aGVuIHRoZSBJREUKLSAqIAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTI6Mjk6MjYgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQmVhblR5cGVQcm94eSB7Ci0KLQlwcml2YXRlIEludGVnZXIgZklEOwotCi0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZSZWdpc3RyeTsKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZkNsYXNzbmFtZTsgLy8gVGhpcyBpcyBjYWNoZWQgaGVyZSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gZ28gb3ZlciB0aGUgbGluZSB0byBnZXQgaXQuCi0KLQlwcml2YXRlIElCZWFuVHlwZVByb3h5IGZTdXBlclR5cGU7IC8vIFRoaXMgaXMgY2FjaGVkIHNvIGFzIG5vdCB0byBoYXZlIHRvIGdvIG92ZXIgdGhlIGxpbmUgZm9yIGl0LgotCi0JLyoqCi0JICogQ3JlYXRlIHdpdGggYSByZWdpc3RyeSBhbmQgYSBjbGFzcy4gSXQgaXMgcHJvdGVjdGVkIHNvIHRoYXQgb25seSBzdWJjbGFzc2VzIGFuZCB0aGUgZmFjdG9yeSB3aXRoIHRoaXMgUkVNIHBhY2thZ2UgY2FuIGNhbGwgaXQuCi0JICovCi0JcHJvdGVjdGVkIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUpIHsKLQkJZlJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCQlmSUQgPSBhbklEOwotCQlmQ2xhc3NuYW1lID0gYUNsYXNzbmFtZTsKLQkJZlN1cGVyVHlwZSA9IGFTdXBlclR5cGU7Ci0JfQotCi0JLyoqCi0JICogZXF1YWxzOiBFcXVhbCBpZjogMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QgVGhpcyBpcyBhbGwgdGhhdCBpcyBuZWVkZWQgZm9yIEJlYW5UeXBlcyBiZWNhdXNlIHdlIGtub3cgdGhlc2UgYXJlIGNsYXNzZXMsCi0JICogdGhlcmUgaXMgb25seSBvbmUgcGVyIGNsYXNzLCBhbmQgQ2xhc3MgZXF1YWxzIGlzIHRydWUgb25seSBmb3IgaWRlbnRpdHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZXF1YWxzKGFuT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCQlyZXR1cm4gdGhpcyA9PSBhQmVhblByb3h5OyAvLyBXZSBjYW4gYmUgYXNzdXJlZCBpbiBSZW1vdGUgUHJveHkgdGhhdCBpZGVudGl0eSBvZiBwcm94eSBhbmQgaWRlbnRpdHkgb2Ygb2JqZWN0IGFyZSB0aGUgc2FtZS4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5Qcm94eSNnZXRJRCgpCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBmSUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I2lzVmFsaWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBmSUQgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5Qcm94eSNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBDbGVhciB0aGUgaWQgYW5kIHN1cGVydHlwZSAoc3VwZXJ0eXBlIGlzIGNsZWFyZWQgc28gdGhhdAotCQkvLyBpdCB3b24ndCBob2xkIG9udG8gaXQgYW5kIHdpbGwgbGV0IHRoZSBzdXBlcnR5cGUgYmUgR0MnZAotCQkvLyBpZiBuZWNlc3NhcnkuCi0KLQkJZklEID0gbnVsbDsKLQkJZlN1cGVyVHlwZSA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gSW50ZXJmYWNlcyBkb24ndCBoYXZlIGN0b3Incy4KLQotCQkvLyBUdXJuIGNsYXNzIG5hbWVzIGludG8gYXJyYXkgb2YgQmVhblR5cGVzLgotCQlJQmVhblR5cGVQcm94eVtdIGFyZ1R5cGVzID0gbnVsbDsKLQkJaWYgKGFyZ3VtZW50Q2xhc3NOYW1lcyAhPSBudWxsKSB7Ci0JCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSB0eXBlRmFjdG9yeSA9IGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQkJYXJnVHlwZXMgPSBuZXcgSUJlYW5UeXBlUHJveHlbYXJndW1lbnRDbGFzc05hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50Q2xhc3NOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCUlCZWFuVHlwZVByb3h5IHR5cGUgPSBhcmdUeXBlc1tpXSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoYXJndW1lbnRDbGFzc05hbWVzW2ldKTsKLQkJCQlpZiAodHlwZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gQ291bGRuJ3QgZmluZCB0aGUgdHlwZS4KLQkJCX0KLQkJfQotCi0JCXJldHVybiBnZXRDb25zdHJ1Y3RvclByb3h5KGFyZ1R5cGVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gSW50ZXJmYWNlcyBkb24ndCBoYXZlIGN0b3Incy4KLQotCQlJUkVNTWV0aG9kUHJveHkgZ2V0Q3Rvck1ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzQ29uc3RydWN0b3IoKTsKLQotCQkvLyBDcmVhdGUgdGhlIGFyZ3VtZW50IGFycmF5Ci0JCU9iamVjdFtdIGdldFBhcm1zID0gKGFyZ3VtZW50VHlwZXMgIT0gbnVsbCkgPyBuZXcgT2JqZWN0W10geyBuZXcgVHJhbnNtaXRhYmxlQXJyYXkoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MsIGFyZ3VtZW50VHlwZXMpfSA6IC8vIEdldCBDdG9yIGhhcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBvbmx5IG9uZSBwYXJtLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyB0aGUgYXJyYXkgb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gcGFybSB0eXBlcy4KLQkJCQludWxsOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKElDb25zdHJ1Y3RvclByb3h5KSBnZXRDdG9yTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBnZXRQYXJtcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWZSZWdpc3RyeS5yZWxlYXNlUHJveHkoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCUlSRU1NZXRob2RQcm94eSBnZXRDdG9yTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NDb25zdHJ1Y3RvcnMoKTsKLQotCQl0cnkgewotCQkJSUFycmF5QmVhblByb3h5IGN0b3JzID0gKElBcnJheUJlYW5Qcm94eSkgZ2V0Q3Rvck1ldGhvZC5pbnZva2VXaXRoUGFybXModGhpcywgbnVsbCk7Ci0JCQlJQmVhblByb3h5W10gcHJveGllcyA9IGN0b3JzLmdldFNuYXBzaG90KCk7Ci0JCQlJQ29uc3RydWN0b3JQcm94eVtdIGN0b3Jwcm94aWVzID0gbmV3IElDb25zdHJ1Y3RvclByb3h5W3Byb3hpZXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJveGllcywgMCwgY3RvcnByb3hpZXMsIDAsIHByb3hpZXMubGVuZ3RoKTsKLQkJCXJldHVybiBjdG9ycHJveGllczsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCS8vIFR1cm4gY2xhc3MgbmFtZXMgaW50byBhcnJheSBvZiBCZWFuVHlwZXMuCi0JCUlCZWFuVHlwZVByb3h5W10gYXJnVHlwZXMgPSBudWxsOwotCQlpZiAoYXJndW1lbnRDbGFzc05hbWVzICE9IG51bGwpIHsKLQkJCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCQlhcmdUeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVthcmd1bWVudENsYXNzTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUJlYW5UeXBlUHJveHkgdHlwZSA9IGFyZ1R5cGVzW2ldID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShhcmd1bWVudENsYXNzTmFtZXNbaV0pOwotCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOyAvLyBDb3VsZG4ndCBmaW5kIHRoZSB0eXBlLgotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShhcmdUeXBlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gSW50ZXJmYWNlcyBkb24ndCBoYXZlIGN0b3Incy4KLQotCQlJUkVNTWV0aG9kUHJveHkgZ2V0Q3Rvck1ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldERlY2xhcmVkQ2xhc3NDb25zdHJ1Y3RvcigpOwotCi0JCS8vIENyZWF0ZSB0aGUgYXJndW1lbnQgYXJyYXkKLQkJT2JqZWN0W10gZ2V0UGFybXMgPSAoYXJndW1lbnRUeXBlcyAhPSBudWxsKSA/IG5ldyBPYmplY3RbXSB7IG5ldyBUcmFuc21pdGFibGVBcnJheShDb21tYW5kcy5DTEFTU19DTEFTUywgYXJndW1lbnRUeXBlcyl9IDogLy8gR2V0IEN0b3IgaGFzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIG9ubHkgb25lIHBhcm0sCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIHRoZSBhcnJheSBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBwYXJtIHR5cGVzLgotCQkJCW51bGw7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoSUNvbnN0cnVjdG9yUHJveHkpIGdldEN0b3JNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIGdldFBhcm1zKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB7Ci0KLQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gSW50ZXJmYWNlcyBkb24ndCBoYXZlIGN0b3Incy4KLQotCQlJUkVNTWV0aG9kUHJveHkgZ2V0Q3Rvck1ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldERlY2xhcmVkQ2xhc3NDb25zdHJ1Y3RvcnMoKTsKLQotCQl0cnkgewotCQkJSUFycmF5QmVhblByb3h5IGN0b3JzID0gKElBcnJheUJlYW5Qcm94eSkgZ2V0Q3Rvck1ldGhvZC5pbnZva2VXaXRoUGFybXModGhpcywgbnVsbCk7Ci0JCQlJQmVhblByb3h5W10gcHJveGllcyA9IGN0b3JzLmdldFNuYXBzaG90KCk7Ci0JCQlJQ29uc3RydWN0b3JQcm94eVtdIGN0b3Jwcm94aWVzID0gbmV3IElDb25zdHJ1Y3RvclByb3h5W3Byb3hpZXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJveGllcywgMCwgY3RvcnByb3hpZXMsIDAsIHByb3hpZXMubGVuZ3RoKTsKLQkJCXJldHVybiBjdG9ycHJveGllczsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoKSB7Ci0KLQkJSVJFTU1ldGhvZFByb3h5IGdldEZpZWxkc01ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzR2V0RmllbGRzKCk7Ci0KLQkJdHJ5IHsKLQkJCUlBcnJheUJlYW5Qcm94eSBmaWVsZHMgPSAoSUFycmF5QmVhblByb3h5KSBnZXRGaWVsZHNNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIG51bGwpOwotCQkJSUJlYW5Qcm94eVtdIHByb3hpZXMgPSBmaWVsZHMuZ2V0U25hcHNob3QoKTsKLQkJCUlGaWVsZFByb3h5W10gZmllbGRQcm94aWVzID0gbmV3IElGaWVsZFByb3h5W3Byb3hpZXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJveGllcywgMCwgZmllbGRQcm94aWVzLCAwLCBwcm94aWVzLmxlbmd0aCk7Ci0JCQlyZXR1cm4gZmllbGRQcm94aWVzOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldERlY2xhcmVkRmllbGRzKCkgewotCi0JCUlSRU1NZXRob2RQcm94eSBnZXREZWNsYXJlZEZpZWxkc01ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzR2V0RGVjbGFyZWRGaWVsZHMoKTsKLQotCQl0cnkgewotCQkJSUFycmF5QmVhblByb3h5IGZpZWxkcyA9IChJQXJyYXlCZWFuUHJveHkpIGdldERlY2xhcmVkRmllbGRzTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBudWxsKTsKLQkJCUlCZWFuUHJveHlbXSBwcm94aWVzID0gZmllbGRzLmdldFNuYXBzaG90KCk7Ci0JCQlJRmllbGRQcm94eVtdIGZpZWxkUHJveGllcyA9IG5ldyBJRmllbGRQcm94eVtwcm94aWVzLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByb3hpZXMsIDAsIGZpZWxkUHJveGllcywgMCwgcHJveGllcy5sZW5ndGgpOwotCQkJcmV0dXJuIGZpZWxkUHJveGllczsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXREZWNsYXJlZEZpZWxkUHJveHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RGVjbGFyZWRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIChJRmllbGRQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NHZXREZWNsYXJlZEZpZWxkKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMsCi0JCQkJZlJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGZpZWxkTmFtZSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0RmllbGRQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnByb3h5Q29uc3RhbnRzLmdldEZpZWxkUHJveHkodGhpcyxmaWVsZE5hbWUpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRGaWVsZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGV4cHJlc3Npb24uZ2V0UmVnaXN0cnkoKTsKLQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RmllbGRQcm94eShleHByZXNzaW9uLCB0aGlzLCBmaWVsZE5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldE1ldGhvZHMoKSB7Ci0KLQkJSVJFTU1ldGhvZFByb3h5IGdldE1ldGhvZHNNZXRob2QgPSAoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRDbGFzc01ldGhvZHMoKTsKLQotCQl0cnkgewotCQkJSUFycmF5QmVhblByb3h5IG1ldGhvZHMgPSAoSUFycmF5QmVhblByb3h5KSBnZXRNZXRob2RzTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBudWxsKTsKLQkJCUlCZWFuUHJveHlbXSBwcm94aWVzID0gbWV0aG9kcy5nZXRTbmFwc2hvdCgpOwotCQkJSU1ldGhvZFByb3h5W10gbWV0aG9kUHJveGllcyA9IG5ldyBJTWV0aG9kUHJveHlbcHJveGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcm94aWVzLCAwLCBtZXRob2RQcm94aWVzLCAwLCBwcm94aWVzLmxlbmd0aCk7Ci0JCQlyZXR1cm4gbWV0aG9kUHJveGllczsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgewotCi0JCUlSRU1NZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZHNNZXRob2QgPSAoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRDbGFzc0RlY2xhcmVkTWV0aG9kcygpOwotCi0JCXRyeSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgbWV0aG9kcyA9IChJQXJyYXlCZWFuUHJveHkpIGdldERlY2xhcmVkTWV0aG9kc01ldGhvZC5pbnZva2VXaXRoUGFybXModGhpcywgbnVsbCk7Ci0JCQlJQmVhblByb3h5W10gcHJveGllcyA9IG1ldGhvZHMuZ2V0U25hcHNob3QoKTsKLQkJCUlNZXRob2RQcm94eVtdIG1ldGhvZFByb3hpZXMgPSBuZXcgSU1ldGhvZFByb3h5W3Byb3hpZXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJveGllcywgMCwgbWV0aG9kUHJveGllcywgMCwgcHJveGllcy5sZW5ndGgpOwotCQkJcmV0dXJuIG1ldGhvZFByb3hpZXM7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWZSZWdpc3RyeS5yZWxlYXNlUHJveHkoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRNZXRob2RQcm94eSh0aGlzLG1ldGhvZE5hbWUsKFN0cmluZ1tdKW51bGwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0TWV0aG9kUHJveHkodGhpcyxtZXRob2ROYW1lLGFyZ3VtZW50Q2xhc3NOYW1lcyk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZVtdKQotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGV4cHJlc3Npb24uZ2V0UmVnaXN0cnkoKTsKLQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgdGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSBleHByZXNzaW9uLmdldFJlZ2lzdHJ5KCk7Ci0JCXJldHVybiAoKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIHRoaXMsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShleHByZXNzaW9uLCBtZXRob2ROYW1lLCAoSVByb3h5QmVhblR5cGVbXSkgbnVsbCk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXJndW1lbnRRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0TWV0aG9kUHJveHkodGhpcyxtZXRob2ROYW1lLG5ldyBTdHJpbmdbXSB7YXJndW1lbnRRdWFsaWZpZWRUeXBlTmFtZX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnByb3h5Q29uc3RhbnRzLmdldE1ldGhvZFByb3h5KHRoaXMsbWV0aG9kTmFtZSxhcmd1bWVudFR5cGVzKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCi0JCS8vIFR1cm4gY2xhc3MgbmFtZXMgaW50byBhcnJheSBvZiBCZWFuVHlwZXMuCi0JCUlCZWFuVHlwZVByb3h5W10gYXJnVHlwZXMgPSBudWxsOwotCQlpZiAoYXJndW1lbnRDbGFzc05hbWVzICE9IG51bGwpIHsKLQkJCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCQlhcmdUeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVthcmd1bWVudENsYXNzTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUJlYW5UeXBlUHJveHkgdHlwZSA9IGFyZ1R5cGVzW2ldID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShhcmd1bWVudENsYXNzTmFtZXNbaV0pOwotCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOyAvLyBDb3VsZG4ndCBmaW5kIHRoZSB0eXBlLgotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldERlY2xhcmVkTWV0aG9kUHJveHkobWV0aG9kTmFtZSwgYXJnVHlwZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCUlSRU1NZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZE1ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzRGVjbGFyZWRNZXRob2QoKTsKLQkJSUJlYW5Qcm94eSBuYW1lUHJveHkgPSBmUmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgobWV0aG9kTmFtZSk7Ci0JCS8vIENyZWF0ZSB0aGUgYXJndW1lbnQgYXJyYXkKLQkJT2JqZWN0W10gZ2V0UGFybXMgPSAoYXJndW1lbnRUeXBlcyAhPSBudWxsKSA/IG5ldyBPYmplY3RbXSB7IG5hbWVQcm94eSwgbmV3IFRyYW5zbWl0YWJsZUFycmF5KENvbW1hbmRzLkNMQVNTX0NMQVNTLCBhcmd1bWVudFR5cGVzKX0gOiBuZXcgT2JqZWN0W10ge25hbWVQcm94eSwgbnVsbH07Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoSU1ldGhvZFByb3h5KSBnZXREZWNsYXJlZE1ldGhvZE1ldGhvZC5pbnZva2VXaXRoUGFybXModGhpcywgZ2V0UGFybXMpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0SW52b2thYmxlKHRoaXMsbWV0aG9kTmFtZSwoU3RyaW5nW10pbnVsbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRJbnZva2FibGUodGhpcyxtZXRob2ROYW1lLGFyZ3VtZW50Q2xhc3NOYW1lcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCXJldHVybiBnZXRJbnZva2FibGUobWV0aG9kTmFtZSwgbmV3IFN0cmluZ1tdIHsgYXJndW1lbnRRdWFsaWZpZWRUeXBlTmFtZX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnByb3h5Q29uc3RhbnRzLmdldEludm9rYWJsZSh0aGlzLG1ldGhvZE5hbWUsYXJndW1lbnRUeXBlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldE51bGxDb25zdHJ1Y3RvclByb3h5KCkgewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JQcm94eSgoSUJlYW5UeXBlUHJveHlbXSkgbnVsbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I2dldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkKLQkgKi8KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBmUmVnaXN0cnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRTdXBlckJlYW5UeXBlUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRTdXBlckJlYW5UeXBlUHJveHkoKSB7Ci0JCXJldHVybiBmU3VwZXJUeXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0VHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NuYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNBcnJheSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNJbnRlcmZhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc1ByaW1pdGl2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzS2luZE9mKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzS2luZE9mKElCZWFuVHlwZVByb3h5IGFCZWFuUHJveHlUeXBlKSB7Ci0JCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRDbGFzc0lzQXNzaWduYWJsZUZyb20oKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoCi0JCQkJYUJlYW5Qcm94eVR5cGUsIHRoaXMpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkpLmNyZWF0ZUJlYW5Qcm94eSh0aGlzLCBpbml0aWFsaXphdGlvblN0cmluZyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpICsgIigiICsgZ2V0VHlwZU5hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjZ2V0VHlwZVByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuY2xhc3NDbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjdG9CZWFuU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJcmV0dXJuIGdldFR5cGVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkpLmNyZWF0ZUJlYW5Qcm94eSh0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5Qcm94eSNyZW5kZXJCZWFuKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQkJdmFsdWUuc2V0T2JqZWN0SUQoZ2V0SUQoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEZvcm1hbFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEluaXRpYWxpemF0aW9uRXJyb3IoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpIHsKLQkJcmV0dXJuIG51bGw7IC8vIEJ5IGRlZmF1bHQgbm9uZSBoYXZlIGFuIGluaXRpYWxpemF0aW9uIGVycm9yLiBUaGVyZSBpcyBhIHNwZWNpYWwgaW5zdGFuY2UgZm9yIGluaXQgZXJyb3JzLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVDb25zdHJ1Y3RvcihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb21wYXRpYmxlQ29uc3RydWN0b3IoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gewotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCUlSRU1NZXRob2RQcm94eSBmaW5kQ29tcGF0aWJsZU1ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldEZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3JNZXRob2QoKTsKLQotCQkvLyBDcmVhdGUgdGhlIGFyZ3VtZW50IGFycmF5Ci0JCU9iamVjdFtdIGdldFBhcm1zID0gKGFyZ3VtZW50VHlwZXMgIT0gbnVsbCkgPyBuZXcgT2JqZWN0W10geyB0aGlzLCBuZXcgVHJhbnNtaXRhYmxlQXJyYXkoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MsIGFyZ3VtZW50VHlwZXMpfSA6IG5ldyBPYmplY3RbXSB7dGhpcywgbnVsbH07Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoSUNvbnN0cnVjdG9yUHJveHkpIGZpbmRDb21wYXRpYmxlTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBnZXRQYXJtcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGUuZ2V0VHlwZVByb3h5KCkuZXF1YWxzKGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihlLmdldFByb3h5TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQllbHNlIGlmIChlLmdldFR5cGVQcm94eSgpLmVxdWFscyhmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0aHJvdyBuZXcgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uKGUuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCX0KLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRDb21wYXRpYmxlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiB7Ci0KLQkJSVJFTU1ldGhvZFByb3h5IGZpbmRDb21wYXRpYmxlTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0RmluZENvbXBhdGlibGVNZXRob2RNZXRob2QoKTsKLQkJSUJlYW5Qcm94eSBtZXRob2ROYW1lUHJveHkgPSBmUmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgobWV0aG9kTmFtZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBhcmd1bWVudCBhcnJheQotCQlPYmplY3RbXSBnZXRQYXJtcyA9IChhcmd1bWVudFR5cGVzICE9IG51bGwpID8gbmV3IE9iamVjdFtdIHsgdGhpcywgbWV0aG9kTmFtZVByb3h5LCBuZXcgVHJhbnNtaXRhYmxlQXJyYXkoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MsIGFyZ3VtZW50VHlwZXMpfSA6IG5ldyBPYmplY3RbXSB7dGhpcywgbWV0aG9kTmFtZVByb3h5LCBudWxsfTsKLQotCQl0cnkgewotCQkJcmV0dXJuIChJTWV0aG9kUHJveHkpIGZpbmRDb21wYXRpYmxlTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBnZXRQYXJtcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGUuZ2V0VHlwZVByb3h5KCkuZXF1YWxzKGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihlLmdldFByb3h5TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQllbHNlIGlmIChlLmdldFR5cGVQcm94eSgpLmVxdWFscyhmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0aHJvdyBuZXcgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uKGUuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCX0KLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNCZWFuUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmVhblByb3h5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzRXhwcmVzc2lvblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0V4cHJlc3Npb25Qcm94eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBjNzQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIGFueSBvZiB0aGUgbnVtYmVyIGJlYW4gdHlwZSBzdWJjbGFzc2VzLgotICogTk9URTogVGhpcyBkb2VzIG5vdCByZXByZXNlbnQgdGhlIGJlYW50eXBlIE51bWJlci4gSXQgaXMgYQotICogY2xhc3MgdGhhdCBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIE51bWJlciBzdWJjbGFzcyBiZWFudHlwZXMuCi0gKiBUaGUgTnVtYmVyIGJlYW50eXBlIGl0c2VsZiBpcyBzaW1wbHkgYSBSRU1CZWFuVHlwZVByb3h5IHNpbmNlCi0gKiBOdW1iZXIgaXMgYWJzdHJhY3QgYW5kIGhhcyBubyBuZWNlc3NhcnkgZXh0cmEgZnVuY3Rpb24uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDgvMzEvMDAgMTE6NDk6MTIgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHsKLQotcHJvdGVjdGVkIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotfQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1wcm90ZWN0ZWQgYWJzdHJhY3QgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpOwotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBOdW1iZXIgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uIFRoZXkgYXJlIGNyZWF0ZWQKLSAqIGV4cGxpY2l0bHkgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgY3JlYXRlIG1ldGhvZC4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0gKgotICogRm9yIGFsbCBvZiB0aGUgTnVtYmVyIHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBOdW1iZXIncyBkb24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBFYWNoIGJlYW50eXBlIHdpbGwgcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZSAodXN1YWxseSBhIHZhbHVlIG9mIDApLgotICovCi1wdWJsaWMgYWJzdHJhY3QgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BY2Nlc3NpYmxlT2JqZWN0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlOTMzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUkVNQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQWNjZXNzaWJsZU9iamVjdFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlRocm93YWJsZVByb3h5OwotIAotLyoqCi0gKiBBY2Nlc3NpYmxlT2JqZWN0IFByb3h5LgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFJFTUFjY2Vzc2libGVPYmplY3RQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblByb3h5IGltcGxlbWVudHMgSUFjY2Vzc2libGVPYmplY3RQcm94eSB7Ci0KLQlwcm90ZWN0ZWQgUkVNQWNjZXNzaWJsZU9iamVjdFByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklEKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUFjY2Vzc2libGVPYmplY3RQcm94eSNpc0FjY2Vzc2libGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWNjZXNzaWJsZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFjY2Vzc2libGVJc0FjY2Vzc2libGUoKS5pbnZva2UodGhpcykpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklBY2Nlc3NpYmxlT2JqZWN0UHJveHkjc2V0QWNjZXNzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc2libGUoYm9vbGVhbiBmbGFnKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFjY2Vzc2libGVTZXRBY2Nlc3NpYmxlKCkuaW52b2tlKHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGZsYWcpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I2dldFR5cGVQcm94eSgpCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuYWNjZXNzaWJsZVR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmFmMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogVGhpcyBpcyBhIHByb3h5IGZvciBhbiBhYnN0cmFjdCBiZWFuIHR5cGUuIEkuZS4geW91IGNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBpdC4KLSAqIEl0IGNhbiBiZSB1c2VkIGFzIGEgZ2VuZXJhbCBhYnN0cmFjdCB0eXBlLiBJdCB3aWxsIHBhc3MgbmV3QmVhblR5cGVGb3JDbGFzcyB1bnRvCi0gKiB0aGUgbWFpbiBzdXBlciB0eXBlIHBhc3NlZCBpbi4KLSAqLwotIAotcHVibGljIGNsYXNzIFJFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHsKLQotCXByb3RlY3RlZCBJUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkgZk1haW5TdXBlclR5cGU7CS8vIFRoZSB0eXBlIHRoYXQgdGhpcyB3YXMgY3JlYXRlZCBmcm9tIHNvIHRoYXQKLQkJCQkJCQkvLyBhbnkgbm9uLWFic3RyYWN0IHN1YmNsYXNzZXMgY2FuIGNyZWF0ZSB0aGUgY29ycmVjdAotCQkJCQkJCS8vIHR5cGUgb2YgYmVhbnR5cGUgcHJveHkuCi0JCQkJCQotCXB1YmxpYyBSRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUsIElSRU1TcGVjaWFsQmVhblR5cGVQcm94eSBhVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotCQlmTWFpblN1cGVyVHlwZSA9IGFUeXBlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0JICoKLQkgKiBGb3IgYWxsIG9mIHRoZSBhYnN0cmFjdCB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9CQotCQotCS8qKgotCSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgYWJzdHJhY3QgY2xhc3NlcyBjYW4gbmV2ZXIgYmUgZG9uZSwKLQkgKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7IAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JCXJldHVybiBmTWFpblN1cGVyVHlwZS5uZXdCZWFuVHlwZUZvckNsYXNzKGFuSUQsIGFDbGFzc25hbWUsIGFuQWJzdHJhY3QsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiByZWxlYXNlIC0gQmVhblR5cGUgaXMgYWJvdXQgdG8gYmUgcmVsZWFzZWQuCi0JICogQ2xlYXIgdGhlIGZNYWluU3VwZXJ0eXBlIChzdXBlcnR5cGUgaXMgY2xlYXJlZCBzbyB0aGF0Ci0JICogaXQgd29uJ3QgaG9sZCBvbnRvIGl0IGFuZCB3aWxsIGxldCB0aGUgc3VwZXJ0eXBlIGJlIEdDJ2QKLQkgKiBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZk1haW5TdXBlclR5cGUgPSBudWxsOwotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQkJCQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFycmF5QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFycmF5QmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNTMzYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BcnJheUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUFycmF5QmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRFcnJvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBJREUgVk0gdmVyc2lvbiBvZiB0aGUgQXJyYXkgcHJveHkKLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUkVNQXJyYXlCZWFuUHJveHkgZXh0ZW5kcyBSRU1CZWFuUHJveHkgaW1wbGVtZW50cyBJQXJyYXlCZWFuUHJveHkgewotCXByaXZhdGUgaW50IGZMZW5ndGggPSAtMTsKLQkKLQlSRU1BcnJheUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgSUJlYW5UeXBlUHJveHkgYVR5cGUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhVHlwZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldChpbnQgaW5kZXgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIEZvcm1hdCBvZiBnZXR0ZXIgcGFybXMgaXM6IChPYmplY3QgKGFycmF5KSwgaW50IChpbmRleCkpLgotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbXSB7dGhpcywgbmV3IEludGVnZXIoaW5kZXgpfTsKLQkJLy8gSWYgdGhlIGNvbXBvbmVudCB0eXBlIGlzIHByaW1pdGl2ZSwgd2UgbmVlZCB0byB1c2UgdGhlIGNvcnJlY3QgZ2V0dGVyIHNvIHRoYXQgYSB2YWxpZCB2YWx1ZSBpcyByZXR1cm5lZCwKLQkJLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JCUlCZWFuVHlwZVByb3h5IGNvbXBUeXBlID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlpZiAoIWNvbXBUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCS8vIFVzZSBzdGFuZGFyZCBnZXR0ZXIuCi0JCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXQoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFVzZSB0aGUgY29ycmVjdCBwcmltaXRpdmUgZ2V0dGVyLgotCQkJaW50IGlkID0gKChJUkVNQmVhblByb3h5KSBjb21wVHlwZSkuZ2V0SUQoKS5pbnRWYWx1ZSgpOwotCQkJc3dpdGNoIChpZCkgewotCQkJCWNhc2UgQ29tbWFuZHMuQllURV9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXRCeXRlKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5CT09MRUFOX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldEJvb2xlYW4oKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkNIQVJBQ1RFUl9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXRDaGFyKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5ET1VCTEVfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5R2V0RG91YmxlKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5GTE9BVF9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXRGbG9hdCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuSU5URUdFUl9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXRJbnQoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkxPTkdfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5R2V0TG9uZygpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuU0hPUlRfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5R2V0U2hvcnQoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBtdWx0aS1kaW1lbnNpb25hbCBpbmRleC4KLQkgKiBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgc3BlY2lmaWVkLAotCSAqIGFuZCBlYWNoIGluZGV4IGFsb25nIHRoZSB3YXkgbXVzdCBleGlzdC4KLQkgKiBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKLQkgKiBvZiBkaW1lbnNpb25zIG9mIHRoZSByZWFsIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXQoaW50IFtdIGluZGV4ZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIEZvcm1hdCBvZiBnZXR0ZXIgcGFybXMgaXM6IChPYmplY3QgKGFycmF5KSwgaW50W10gKGluZGV4ZXMpKS4KLQkJT2JqZWN0W10gcGFybXMgPSBuZXcgT2JqZWN0W10ge3RoaXMsIGluZGV4ZXN9OwotCQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgYXQgdGhlIHNwZWNpZmllZCBkaW1lbnNpb24gaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCQkvLyBpZiB3ZSBqdXN0IHVzZWQgdGhlIHN0YW5kYXJkIGdldCwgaWYgdGhlIHR5cGUgd2FzICJpbnQiIHRoZSB2YWx1ZSByZXR1cm5lZCB3b3VsZCBiZSBhbiBqYXZhLmxhbmcuSW50ZWdlci4KLQkJaW50IGRpbXMgPSAoKElBcnJheUJlYW5UeXBlUHJveHkpIGdldFR5cGVQcm94eSgpKS5nZXREaW1lbnNpb25zKCk7Ci0JCWlmIChkaW1zIDwgaW5kZXhlcy5sZW5ndGgpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CS8vIFRvbyBtYW55IGRpbWVuc2lvbnMKLQkJSUJlYW5UeXBlUHJveHkgZmluYWxDb21wVHlwZSA9ICgoSUFycmF5QmVhblR5cGVQcm94eSkgZ2V0VHlwZVByb3h5KCkpLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwkJCQotCQlpZiAoZGltcyA9PSBpbmRleGVzLmxlbmd0aCAmJiBmaW5hbENvbXBUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCS8vIFVzZSB0aGUgY29ycmVjdCBwcmltaXRpdmUgZ2V0dGVyIGJlY2F1c2Ugd2UgYXJlIGFjY2Vzc2luZyB0aGUgZmluYWwgY29tcG9uZW50IGFuZCBpdCBpcyBwcmltaXRpdmUuCi0JCQlpbnQgaWQgPSAoKElSRU1CZWFuUHJveHkpIGZpbmFsQ29tcFR5cGUpLmdldElEKCkuaW50VmFsdWUoKTsKLQkJCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIENvbW1hbmRzLkJZVEVfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0Qnl0ZSgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuQk9PTEVBTl9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlIZWxwZXJHZXRCb29sZWFuKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5DSEFSQUNURVJfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0Q2hhcigpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuRE9VQkxFX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUhlbHBlckdldERvdWJsZSgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuRkxPQVRfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0RmxvYXQoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLklOVEVHRVJfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0SW50KCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5MT05HX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUhlbHBlckdldExvbmcoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLlNIT1JUX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUhlbHBlckdldFNob3J0KCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdCBpcyBub3QgdGhlIGZpbmFsIGNvbXBvbmVudCwgb3IgaXQgaXMgbm90IHByaW1pdGl2ZSwgdXNlIHRoZSBzdGFuZGFyZCBhY2Nlc3Nvci4KLQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUhlbHBlckdldCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUJlYW5Qcm94eSB2YWx1ZSwgaW50IGluZGV4KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBGb3JtYXQgb2Ygc2V0dGVyIHBhcm1zIGlzOiAoT2JqZWN0IChhcnJheSksIGludCAoaW5kZXgpLCBPYmplY3QgKHZhbHVlKSkuCi0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHt0aGlzLCBuZXcgSW50ZWdlcihpbmRleCksIHZhbHVlfTsKLQkJKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlTZXQoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQl9Ci0JCQotCS8qKgotCSAqIFNldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbXVsdGktZGltZW5zaW9uYWwgaW5kZXguCi0JICogVGhlIGFycmF5IG11c3QgYmUgYXQgbGVhc3QgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHNwZWNpZmllZCwKLQkgKiBhbmQgZWFjaCBpbmRleCBhbG9uZyB0aGUgd2F5IG11c3QgZXhpc3QuCi0JICogVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCi0JICogb2YgZGltZW5zaW9ucyBvZiB0aGUgcmVhbCBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElCZWFuUHJveHkgdmFsdWUsIGludCBbXSBpbmRleGVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBGb3JtYXQgb2Ygc2V0dGVyIHBhcm1zIGlzOiAoT2JqZWN0IChhcnJheSksIGludFtdIChpbmRleGVzKSwgT2JqZWN0ICh2YWx1ZSkpLgotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbXSB7dGhpcywgaW5kZXhlcywgdmFsdWV9OwotCQkoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUhlbHBlclNldCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoaXMgYXJyYXkuCi0JICogSWYgdGhlcmUgYXJlIG11bHRpLWRpbWVuc2lvbnMsIHlvdSBtdXN0IGdldCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBkaW1lbnNpb24gZnJvbSB0aGUgZ2V0IG1ldGhvZCB0byBzZWUgdGhlIHNpemUgb2YgdGhhdCBkaW1lbnNpb24uCi0JICoKLQkgKiBlLmcuCi0JICogICAgaW50IFszXSByZXR1cm5zIDMKLQkgKiAgICBpbnQgWzNdWzJdIHJldHVybnMgMwotCSAqCi0JICogICAgKChJQXJyYXlCZWFuUHJveHkpIGdldCgxKSkuZ2V0TGVuZ3RoKCkgcmV0dXJucyAyCi0JICogICAgU2luY2UgYXJyYXlzIGRvIG5vdCBoYXZlIHRvIGJlIGhvbW9nZW5vdXMsIHRoZXJlIGNvdWxkCi0JICogICAgYmUgYSBkaWZmZXJlbnQgbGVuZ3RoIGFycmF5IGZvciBlYWNoIG9mIHRoZSBhcnJheXMgCi0JICogICAgcmV0dXJuZWQgZnJvbSB0aGUgZmlyc3QgZGltZW5zaW9uLCB0aGUgcmV0dXJuZWQgbGVuZ3RoCi0JICogICAgZnJvbSBnZXQoMikgYW5kIGdldCgzKSBjb3VsZCByZXN1bHQgaW4gYSBkaWZmZXJlbnQgdmFsdWUKLQkgKiAgICBmcm9tIGdldCgxKS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKGZMZW5ndGggPT0gLTEpIHsKLQkJCS8vIEl0IGhhc24ndCB5ZXQgYmVlbiBxdWllcmVkLgotCQkJZkxlbmd0aCA9ICgoSUludGVnZXJCZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXRMZW5ndGgoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMobnVsbCwgdGhpcykpLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQkKLQkKLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXRDYXRjaFRocm93YWJsZUV4Y2VwdGlvbihpbnQgaW5kZXgpewotCQl0cnkgewotCQkJcmV0dXJuIGdldChpbmRleCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7CQkgLy8kTk9OLU5MUy0xJAotCQkJZkZhY3RvcnkucmVsZWFzZVByb3h5KGUpOwkvLyBTaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUFycmF5QmVhblByb3h5I2dldFNuYXBzaG90KCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eVtdIGdldFNuYXBzaG90KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSVJFTUNvbm5lY3Rpb24gY29ubmVjdCA9IGZGYWN0b3J5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCVJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSAoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JCXByb3h5RmFjdG9yeS5zdGFydFRyYW5zYWN0aW9uKCk7IC8vIFRoaXMgaXMgZGVmaW5hdGVseSBhIHRyYW5zYWN0aW9uLCBzbyBzdGFydCBpdC4KLQkJdHJ5IHsKLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQl0cnkgewotCQkJCXRyeSB7Ci0JCQkJCWNvbm5lY3QuZ2V0QXJyYXlDb250ZW50cyhnZXRJRCgpLmludFZhbHVlKCksIHJldHVyblZhbHVlKTsKLQkJCQkJcmV0dXJuIHByb2Nlc3NSZXR1cm5WYWx1ZShjb25uZWN0LCByZXR1cm5WYWx1ZSk7Ci0JCQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCQkJcHJveHlGYWN0b3J5LnByb2Nlc3NFcnJvclJldHVybihlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCS8vIENsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uCi0JCQkJCWZGYWN0b3J5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJCWNvbm5lY3QgPSBmRmFjdG9yeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQkJCQl0cnkgewotCQkJCQkJY29ubmVjdC5nZXRBcnJheUNvbnRlbnRzKGdldElEKCkuaW50VmFsdWUoKSwgcmV0dXJuVmFsdWUpOwotCQkJCQkJcmV0dXJuIHByb2Nlc3NSZXR1cm5WYWx1ZShjb25uZWN0LCByZXR1cm5WYWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCQkvLyBGYWlsZWQgYWdhaW4uIEp1c3QgY2xvc2UgYW5kIHByaW50IHRyYWNlLgotCQkJCQkJZkZhY3RvcnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZUFnYWluKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQSByZWNvdmVyYWJsZSBlcnJvciwgcHJpbnQgdHJhY2UgYW5kIHJldHVybgotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXByb3h5RmFjdG9yeS5zdG9wVHJhbnNhY3Rpb24oKTsKLQkJCWlmIChjb25uZWN0ICE9IG51bGwpCi0JCQkJZkZhY3RvcnkucmV0dXJuQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qCi0JICogQHBhcmFtIHJldHVyblZhbHVlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgSUJlYW5Qcm94eVtdIHByb2Nlc3NSZXR1cm5WYWx1ZShJUkVNQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBWYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5IHsKLQkJLy8gSXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBJRHMsIGFzIGl0IG5vcm1hbGx5IHdvdWxkIGJlLgotCQkvLyBIb3dldmVyIGl0IHdpbGwgYmVjb21lIElCZWFuUHJveHlbXS4gVGhhdCBpcyBiZWNhdXNlIGlmIElEJ3MKLQkJLy8gdGhleSBtdXN0IGJlIHByb3hpZXMgb3ZlciBoZXJlLgotCQlCZWFuUHJveHlWYWx1ZVNlbmRlciB2YWx1ZVNlbmRlciA9IG5ldyBCZWFuUHJveHlWYWx1ZVNlbmRlcigoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCksIHJldHVyblZhbHVlKTsKLQkJY29ubmVjdGlvbi5yZWFkUHJveHlBcnJheVZhbHVlcyhyZXR1cm5WYWx1ZSwgdmFsdWVTZW5kZXIsIGZhbHNlKTsKLQkJRXhjZXB0aW9uIGUgPSB2YWx1ZVNlbmRlci5nZXRFeGNlcHRpb24oKTsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBUaHJvd2FibGVQcm94eSkKLQkJCQl0aHJvdyAoVGhyb3dhYmxlUHJveHkpIGU7Ci0JCQllbHNlCi0JCQkJdGhyb3cgKENvbW1hbmRFeGNlcHRpb24pIGU7Ci0JCX0KLQkJT2JqZWN0IHZhbHMgPSB2YWx1ZVNlbmRlci5nZXRBcnJheSgpOwotCQlJQmVhblByb3h5W10gcHJveHlBcnJheSA9IG5ldyBJQmVhblByb3h5W0FycmF5LmdldExlbmd0aCh2YWxzKV07Ci0JCVN5c3RlbS5hcnJheWNvcHkodmFscywgMCwgcHJveHlBcnJheSwgMCwgcHJveHlBcnJheS5sZW5ndGgpOwotCQlyZXR1cm4gcHJveHlBcnJheTsKLQl9Ci0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BcnJheUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQXJyYXlCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTQwYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BcnJheUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1BcnJheUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NYXBUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBBcnJheSBUeXBlIFByb3h5IGZvciB0aGUgSURFIFZNLgotICoKLSAqIFRoZSBjbGFzcyBpcyBmaW5hbCBiZWNhdXNlIGFycmF5J3MgYXJlIHNwZWNpYWwgYW5kIHNob3VsZG4ndCBoYXZlCi0gKiBhbnkgc3ViY2xhc3NlcyBzaW5jZSB0aGUgZmFjdG9yeSB3b3VsZCBuZXZlciBjYWxsIGl0LgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSRU1BcnJheUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJQXJyYXlCZWFuVHlwZVByb3h5IHsKLQkKLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBhIHJlZ2lzdHJ5IGFuZCBhIGNsYXNzLiBJdCBpcyBwYWNrYWdlIHNvIHRoYXQgb25seSAKLQkgKiB0aGUgZmFjdG9yeSB3aXRoIHRoaXMgSURFIHBhY2thZ2UgY2FuIGNhbGwgaXQuCi0JICovCi0JcHJvdGVjdGVkIFJFTUFycmF5QmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IG9iamVjdFR5cGUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBvYmplY3RUeXBlKTsKLQl9Ci0JLyoqCi0JICogVGhpcyBpcyBhbiBhcnJheSB0eXBlIQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKSB7Ci0JCS8vIENvbXBvbmVudCB0eXBlIGlzIHN0cmlwIG9mZiBhbGwgJ1snIGFuZCByZXR1cm4gY2xhc3MgbmFtZSAoaWYgd2UgZXZlciBhZGQgY2xhc3NMb2FkZXIgc3VwcG9ydCwgdGhpcyB3b24ndCB3b3JrKS4KLQkJLy8gSG93ZXZlciwgaWYgdGhlIHR5cGUgaXMgYSBwcmltaXRpdmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBjaGFuZ2UgdGFibGUpLgotCQlpbnQgdHlwZVN0YXJ0ID0gZ2V0VHlwZU5hbWUoKS5sYXN0SW5kZXhPZignWycpKzE7Ci0JCWlmIChnZXRUeXBlTmFtZSgpLmNoYXJBdCh0eXBlU3RhcnQpID09ICdMJykgewotCQkJLy8gSXQgaXMgYSBjbGFzcy4KLQkJCS8vIFN0cmlwIG9mZiB1cCB0byB0aGUgJ0wnLCBhbmQgdGhlIHRyYWlsaW5nICc7Jy4gVGhhdCBpcyB0aGUgY2xhc3MgbmFtZS4KLQkJCXJldHVybiBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKHR5cGVTdGFydCsxLCBnZXRUeXBlTmFtZSgpLmxlbmd0aCgpLTEpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIEl0IGlzIGEgdHlwZS4gTmVlZCB0byBtYXAgaXQuCi0JCQlDbGFzcyBhVHlwZSA9IChDbGFzcykgTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUuZ2V0KGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKHR5cGVTdGFydCwgdHlwZVN0YXJ0KzEpKTsKLQkJCXJldHVybiBhVHlwZSAhPSBudWxsID8gZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShhVHlwZS5nZXROYW1lKCkpIDogbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRDb21wb25lbnRUeXBlKCkgewotCQkvLyBDb21wb25lbnQgdHlwZSBpcyBzdHJpcCBvZmYgZmlyc3QgJ1snIGFuZCByZXR1cm4gY2xhc3MgbmFtZSAoaWYgd2UgZXZlciBhZGQgY2xhc3NMb2FkZXIgc3VwcG9ydCwgdGhpcyB3b24ndCB3b3JrKS4KLQkJLy8gSG93ZXZlciwgaWYgdGhlIHR5cGUgaXMgYSBwcmltaXRpdmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBjaGFuZ2UgdGFibGUpLgotCQlpZiAoZ2V0VHlwZU5hbWUoKS5jaGFyQXQoMSkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBhIG9uZSBkaW1lbnNpb25hbCBhcnJheSwganVzdCBzZW5kIHRvIGdldEZpbmFsQ29tcG9uZW50VHlwZSB0byBmaWd1cmUgb3V0IHRoZSB0eXBlLgotCQkJcmV0dXJuIGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQl9IGVsc2UgewotCQkJLy8gSXQgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheS4gSnVzdCBzdHJpcCBvZmYgb25lICdbJyBhbmQgc2VuZCB0aGF0IHRvIHRoZSBiZWFuIHR5cGUgZmFjdG9yeS4KLQkJCXJldHVybiBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKDEpKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIGdldFR5cGVOYW1lKCkubGFzdEluZGV4T2YoJ1snKSsxOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogVXNlIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGFsbG93cyB0aGUgdHlwZSBwcm94eSB0byBiZSBzZXQgYXMgd2VsbCBhcyB0aGUgYmVhbgotCSAqIGJlY2F1c2Ugd2UgYXJlIHRoZSB0eXBlIGFuZCBieSBzZXR0aW5nIGl0IG5vdyB3ZSBtaWdodCBhdm9pZCBpdCBiZWluZyBsb29rdXAgZm9yIGluIHRoZQotCSAqIGZhY3RvcnkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQgZm9yLgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpIHsKLQkJcmV0dXJuIG5ldyBSRU1BcnJheUJlYW5Qcm94eShmUmVnaXN0cnksIGFuSUQsIHRoaXMpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIEFycmF5cyBjYW4ndCBiZSBzdWJjbGFzc2VkLgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bGwgY3RvciBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgZmllbGQgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTQotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCQotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RmllbGRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKiAKLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXREZWNsYXJlZEZpZWxkcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldE1ldGhvZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXREZWNsYXJlZE1ldGhvZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLgotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9CQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwkKLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXJndW1lbnRRdWFsaWZpZWRUeXBlTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gYXJyYXkgYmVhbiBwcm94eS4KLQkgKgotCSAqICAgLSAoaW50LCBuZXcgaW50WzJdIHszLCA0fSkgd2lsbCBjcmVhdGU6Ci0JICogICAgICBpbnQgWzNdIFs0XQotCSAqCi0JICogICAtIChpbnRbXSwgbmV3IGludFsxXSB7MX0pCi0JICogICAgICBpbnQgWzFdCi0JICoKLQkgKiAgIC0gKGludFtdLCBuZXcgaW50WzJdIHsyLDN9KQotCSAqICAgICAgaW50IFsyXSBbM10KLQkgKiAKLQkgKgotCSAqICAgLSAoaW50W10sIG51bGwpIG9yIChpbnRbXSwgbmV3IGludFswXSkgb3IgKGludCwgbnVsbCkgb3IgKGludCwgbmV3IGludFswXSkKLQkgKiAgICAgIGludCBbMF0KLQkgKiAgICAgKGludFtdW10sIG51bGwpIG9yIChpbnRbXVtdLCBuZXcgaW50WzBdKQotCSAqICAgICAgaW50WzBdW10KLQkgKiAgICAgVGhpcyBpcyBiZWNhdXNlIGFuIGFycmF5IGluc3RhbmNlIHdpdGggbm8gZGltZW5zaW9ucyBzcGVjaWZpZWQgaXMgbm90IHZhbGlkLiAKLQkgKgotCSAqICAgLSAoaW50W11bXSwgbmV3IGludFsxXSB7M30pCi0JICogICAgICBpbnRbM11bXQotCSAqCi0JICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gdGhhdCBvbmx5IHRoZSBSRU0gRmFjdG9yeSBjYW4gY2FsbCBpdC4KLQkgKi8KLQlSRU1BcnJheUJlYW5Qcm94eSAgY3JlYXRlQmVhblByb3h5V2l0aChpbnRbXSBkaW1lbnNpb25zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBJZiB0aGUgZGltZW5zaW9ucyBpcyBudWxsIG9yIHplcm8gbGVuZ3RoLCB0aGVuIGNyZWF0ZSB0aGUKLQkJLy8gYXJyYXkgYXMgYSAwIHNpemVkIGFycmF5IG9uZSBkaW1lbnNpb25hbCBhcnJheS4KLQkJaWYgKGRpbWVuc2lvbnMgPT0gbnVsbCB8fCBkaW1lbnNpb25zLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IGludFtdIHswfSk7Ci0JCQkKLQkJLy8gUmVtb3ZlIGZyb20gdGhpcyB0eXBlIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBzcGVjaWZpZWQKLQkJLy8gY29taW5nIGluLCB1cCB0byBidXQgbm8gZnVydGhlciB0aGFuIHRoZSBmaW5hbCBjb21wb25lbnQuCi0JCS8vIEZyb20gaGVyZSB3ZSBjYW4gdGhlbiB1c2UgdGhlIGFwcHJvcHJpYXRlIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Ci0JCS8vIG1ldGhvZCB0byBjcmVhdGUgdGhlIGFycmF5LgotCQlJQmVhblR5cGVQcm94eSBjb21wVHlwZSA9IG51bGw7CS8vIFRoZSB0eXBlIG9mIGFycmF5IHRvIGNyZWF0ZSAoaXQgbWF5IGJlIGRpZmZlcmVudCBudW1iZXIgb2YgZGltZW5zaW9ucykuCi0JCWludCBudW1EaW1zID0gZ2V0RGltZW5zaW9ucygpOwotCQlpZiAobnVtRGltcyA8PSBkaW1lbnNpb25zLmxlbmd0aCkKLQkJCWNvbXBUeXBlID0gZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7CS8vIFRoZXJlIGFyZSB0aGUgc2FtZSBvciBtb3JlIHJlcXVlc3RlZCBkaW1lbnNpb25zLCBzbyB1c2UgZmluYWwgY29tcG9uZW50IHR5cGUKLQkJZWxzZSB7Ci0JCQkvLyBUaGVyZSBhcmUgZmV3ZXIgcmVxdWVzdGVkIGRpbWVuc2lvbnMsIHNvIHN0cmlwIG9mZiB0aGF0IG1hbnkKLQkJCVN0cmluZyBjb21wQ2xhc3MgPSBnZXRUeXBlTmFtZSgpLnN1YnN0cmluZyhkaW1lbnNpb25zLmxlbmd0aCk7Ci0JCQljb21wVHlwZSA9IGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoY29tcENsYXNzKTsKLQkJfQotCQkKLQkJaWYgKGRpbWVuc2lvbnMubGVuZ3RoID09IDEpIHsKLQkJCS8vIFVzZSB0aGUgb25lIGRpbWVuc2lvbiBjYWxsCi0JCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbXSB7Y29tcFR5cGUsIG5ldyBJbnRlZ2VyKGRpbWVuc2lvbnNbMF0pfTsKLQkJCXJldHVybiAoUkVNQXJyYXlCZWFuUHJveHkpICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRBcnJheU5ld0luc3RhbmNlT25lRGltZW5zaW9uKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBVc2UgdGhlIG11bHRpIGRpbWVuc2lvbiBjYWxsCi0JCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbXSB7Y29tcFR5cGUsIGRpbWVuc2lvbnN9OwotCQkJcmV0dXJuIChSRU1BcnJheUJlYW5Qcm94eSkgKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldEFycmF5TmV3SW5zdGFuY2VNdWx0aURpbWVuc2lvbigpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIElCZWFuVHlwZVByb3h5I2dldEZvcm1hbFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldFR5cGVOYW1lKCk7Ci0JCWludCBkaW1zID0gbmFtZS5sYXN0SW5kZXhPZignWycpICsgMTsKLQkJU3RyaW5nIHR5cGUgPSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKS5nZXRUeXBlTmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgZm9ybWFsVHlwZSA9IG5ldyBTdHJpbmdCdWZmZXIodHlwZS5sZW5ndGgoKSsoIltdIi5sZW5ndGgoKSpkaW1zKSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9ybWFsVHlwZS5hcHBlbmQodHlwZSk7Ci0JCWZvciAoaW50IGk9MDsgaTxkaW1zOyBpKyspCi0JCQlmb3JtYWxUeXBlLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZm9ybWFsVHlwZS50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVDb25zdHJ1Y3RvcihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb21wYXRpYmxlQ29uc3RydWN0b3IoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRDb21wYXRpYmxlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2IyM2QwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1CZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIElSRU1CZWFuUHJveHkKLSAqLwotCi1wdWJsaWMgY2xhc3MgUkVNQmVhblByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuUHJveHkgewotCXByaXZhdGUgSUJlYW5UeXBlUHJveHkgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgUkVNQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBJQmVhblR5cGVQcm94eSBhVHlwZSl7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCk7Ci0JCWZUeXBlID0gYVR5cGU7Ci0JfQotCQotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZlR5cGUgPSBudWxsOwotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhZmJmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBhIEJlYW5UeXBlUHJveHkuIFRoaXMgaXMgd2hhdCBpcyB1c2VkCi0gKiBmb3IgcmVndWxhciBkZWZhdWx0IGJlYW5zIGFuZCBiZWFudHlwZXMgd2hlbiBubyBzcGVjaWFsIGJlYW5zIG9yIGJlYW4gdHlwZXMgYXJlIG5lZWRlZC4KLSAqLwotcHVibGljIGNsYXNzIFJFTUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkgewotCi0JLyoqCi0JICogQ3JlYXRlIHdpdGggYSByZWdpc3RyeSBhbmQgYSBjbGFzcy4gSXQgaXMgcHJvdGVjdGVkIHNvIHRoYXQgb25seSBzdWJjbGFzc2VzCi0JICogYW5kIHRoZSBmYWN0b3J5IHdpdGggdGhpcyBSRU0gcGFja2FnZSBjYW4gY2FsbCBpdC4KLQkgKi8KLQlwdWJsaWMgUkVNQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBhU3VwZXJUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIE5PVEU6IEFsbCBzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdHlwZSBvZiBCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCQlyZXR1cm4gbmV3QmVhblR5cGVGb3JDbGFzcyhhbklELCBhQ2xhc3NuYW1lLCBhbkFic3RyYWN0LCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lhbCBtZXRob2QgdG8gaGFuZGxlIHN1YmNsYXNzaW5nIGZyb20gYW4gYWJzdHJhY3QpLgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKSB7Ci0JCWlmICghYW5BYnN0cmFjdCkgCi0JCQlyZXR1cm4gbmV3IFJFTUJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFJFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5KGZSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgc3VwZXJUeXBlLCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpewotCQotCQlyZXR1cm4gbmV3IFJFTUJlYW5Qcm94eShmUmVnaXN0cnksIGFuSUQsIHRoaXMpOwotCQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0RlY2ltYWxCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnRGVjaW1hbEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc5NmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnRGVjaW1hbEJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQmlnRGVjaW1hbEJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIFByb3h5IGZvciBCaWdEZWNpbWFscy4KLSAqLwotY2xhc3MgUkVNQmlnRGVjaW1hbEJlYW5Qcm94eSBleHRlbmRzIFJFTU51bWJlckJlYW5Qcm94eSB7Ci0KLVJFTUJpZ0RlY2ltYWxCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBCaWdEZWNpbWFsIGFCaWdEZWNpbWFsKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQmlnRGVjaW1hbCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmJpZ0RlY2ltYWxDbGFzczsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQobnVtYmVyVmFsdWUoKSwgKChJUkVNQmVhblR5cGVQcm94eSkgZ2V0VHlwZVByb3h5KCkpLmdldElEKCkuaW50VmFsdWUoKSk7Ci19CQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2MDQ1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1CaWdEZWNpbWFsQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBCaWdEZWNpbWFsLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBCaWdEZWNpbWFsIHplcm9WYWx1ZSA9IG5ldyBCaWdEZWNpbWFsKDBEKTsKLQotUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBudW1iZXJUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5CSUdfREVDSU1BTF9DTEFTUyksIEJpZ0RlY2ltYWwuY2xhc3MuZ2V0TmFtZSgpLCBudW1iZXJUeXBlKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNQmlnRGVjaW1hbEJlYW5Qcm94eShhUmVnaXN0cnksIHplcm9WYWx1ZSk7CQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCaWdEZWNpbWFsQmVhblByb3h5KEJpZ0RlY2ltYWwgYUJpZ0RlY2ltYWwpIHsKLQlyZXR1cm4gKCF6ZXJvVmFsdWUuZXF1YWxzKGFCaWdEZWNpbWFsKSkgPwotCQluZXcgUkVNQmlnRGVjaW1hbEJlYW5Qcm94eShmUmVnaXN0cnksIGFCaWdEZWNpbWFsKSA6IHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBHZW5lcmljIHdheSB0byBjcmVhdGUgYW4gQmlnRGVjaW1hbCBwcm94eSwgaG93ZXZlciwgdGhlIE51bWJlciBtdXN0IGJlIGEgQmlnRGVjaW1hbC4KLSAqLwotcHJvdGVjdGVkIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlTnVtYmVyQmVhblByb3h5KE51bWJlciBhTnVtYmVyKSB7Ci0JcmV0dXJuIGNyZWF0ZUJpZ0RlY2ltYWxCZWFuUHJveHkoKEJpZ0RlY2ltYWwpIGFOdW1iZXIpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQmlnRGVjaW1hbEJlYW5Qcm94eSgoQmlnRGVjaW1hbCkgdmFsdWUuYW5PYmplY3QpOwotfQkKLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnSW50ZWdlckJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdJbnRlZ2VyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MTViNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdJbnRlZ2VyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1CaWdJbnRlZ2VyQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotLyoqCi0gKiBSZW1vdGUgUHJveHkgZm9yIEJpZ0ludGVnZXJzLgotICovCi1jbGFzcyBSRU1CaWdJbnRlZ2VyQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNQmlnSW50ZWdlckJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEJpZ0ludGVnZXIgYUJpZ0ludGVnZXIpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFCaWdJbnRlZ2VyKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuYmlnSW50ZWdlckNsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChudW1iZXJWYWx1ZSgpLCAoKElSRU1CZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0SUQoKS5pbnRWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWJjNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdJbnRlZ2VyQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQmlnSW50ZWdlckJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgQmlnSW50ZWdlci4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQmlnSW50ZWdlciB6ZXJvVmFsdWUgPSBuZXcgQmlnSW50ZWdlcigiMCIpOyAvLyROT04tTkxTLTEkCi0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1CaWdJbnRlZ2VyQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG51bWJlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJJR19JTlRFR0VSX0NMQVNTKSwgQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1CaWdJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgemVyb1ZhbHVlKTsJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJpZ0ludGVnZXJCZWFuUHJveHkoQmlnSW50ZWdlciBhQmlnSW50ZWdlcikgewotCXJldHVybiAoIXplcm9WYWx1ZS5lcXVhbHMoYUJpZ0ludGVnZXIpKSA/Ci0JCW5ldyBSRU1CaWdJbnRlZ2VyQmVhblByb3h5KGZSZWdpc3RyeSwgYUJpZ0ludGVnZXIpIDogemVyb1Byb3h5OwotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhbiBCaWdJbnRlZ2VyIHByb3h5LCBob3dldmVyLCB0aGUgTnVtYmVyIG11c3QgYmUgYSBCaWdJbnRlZ2VyLgotICovCi1wcm90ZWN0ZWQgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlyZXR1cm4gY3JlYXRlQmlnSW50ZWdlckJlYW5Qcm94eSgoQmlnSW50ZWdlcikgYU51bWJlcik7Ci19CQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQmlnSW50ZWdlckJlYW5Qcm94eSgoQmlnSW50ZWdlcikgdmFsdWUuYW5PYmplY3QpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJvb2xlYW5DbGFzc0JlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDI2OWQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Cb29sZWFuQ2xhc3NCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQm9vbGVhbkJlYW5Qcm94eSBmb3IgQm9vbGVhbi5jbGFzcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUJvb2xlYW5DbGFzc0JlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSUJvb2xlYW5CZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgQm9vbGVhbiBmQm9vbGVhblZhbHVlOwotCi0vKioKLSAqIFN0b3JlIHRoZSBib29sZWFuIHZhbHVlIHNvIHRoYXQgd2UgY2FuIHJldHVybiB0aGUgYm9vbGVhblZhbHVlIGZhc3RlcgotICogd2l0aG91dCB0aGUgbmVlZCBmb3IgZ29pbmcgYWNyb3NzIHRoZSBsaW5lLiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGl0IGlzIGNyZWF0ZWQgaW4KLSAqIHNwZWNpYWwgd2F5LCBzbyBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZXNlLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQm9vbGVhbiB2YWx1ZSkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkJvb2xlYW5WYWx1ZSA9IHZhbHVlOwotfQotCi0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5KQotCQlyZXR1cm4gZkJvb2xlYW5WYWx1ZS5ib29sZWFuVmFsdWUoKSA9PSAoKFJFTUJvb2xlYW5DbGFzc0JlYW5Qcm94eSkgYW5PYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCXJldHVybiBmQm9vbGVhblZhbHVlLmJvb2xlYW5WYWx1ZSgpID09ICgoQm9vbGVhbikgYW5PYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUKLSAqLwotcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewotCXJldHVybiBmQm9vbGVhblZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGphdmEubGFuZy5Cb29sZWFuIHZhbHVlCi0gKi8KLXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gZkJvb2xlYW5WYWx1ZTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIHRvU3RyaW5nIG9mIHRoZSBiZWFuIGl0c2VsZi4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIGZCb29sZWFuVmFsdWUudG9TdHJpbmcoKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuYm9vbGVhbkNsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChmQm9vbGVhblZhbHVlKTsKLX0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MmZhMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Cb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBCb29sZWFuIEJlYW5UeXBlIFByb3h5IGZvciBCb29sZWFuLmNsYXNzLiAKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzIzLzAwIDE6NTk6MDIgUE0pCi0gKiBAYXV0aG9yOiBSaWNoYXJkIExlZSBLdWxwCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHsKLQotCS8vIENhY2hlIHRoZXNlIGluc3RhbmNlcy4gU2luY2UgdGhlIEJlYW5UeXBlIHByb3hpZXMgYXJlIGNhY2hlZCBhbHNvLCBvbmx5IG9uZSBpbnN0YW5jZQotCS8vIG9mIHRydWUvZmFsc2Ugd2lsbCBiZSBpbiBzeXN0ZW0uCi0JcHJvdGVjdGVkIGZpbmFsIElCb29sZWFuQmVhblByb3h5IHRydWVQcm94eTsKLQlwcm90ZWN0ZWQgZmluYWwgSUJvb2xlYW5CZWFuUHJveHkgZmFsc2VQcm94eTsKLS8qKgotICogUkVNQm9vbGVhbkJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHJvdGVjdGVkIFJFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBvYmplY3RUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5CT09MRUFOX0NMQVNTKSwgQm9vbGVhbi5jbGFzcy5nZXROYW1lKCksIG9iamVjdFR5cGUpOwotCQotCXRydWVQcm94eSA9IG5ldyBSRU1Cb29sZWFuQ2xhc3NCZWFuUHJveHkoIGZSZWdpc3RyeSwgQm9vbGVhbi5UUlVFKTsKLQlmYWxzZVByb3h5ID0gbmV3IFJFTUJvb2xlYW5DbGFzc0JlYW5Qcm94eSggZlJlZ2lzdHJ5LCBCb29sZWFuLkZBTFNFKTsJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICogVXNlIHRoZSBjYWNoZS4KLSAqLwotSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShCb29sZWFuIGFCb29sZWFuKSB7Ci0JcmV0dXJuIGFCb29sZWFuLmJvb2xlYW5WYWx1ZSgpID8gdHJ1ZVByb3h5IDogZmFsc2VQcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0gKgotICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uIFRoZXkgYXJlIGNyZWF0ZWQKLSAqIGV4cGxpY2l0bHkgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgY3JlYXRlIG1ldGhvZC4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0gKgotICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgdHlwZXMsIHRoZXkgYXJlIGZpbmFsIGNsYXNzZXMsIHNvIHlvdSBjYW4ndCBjcmVhdGUgYSBuZXdCZWFuVHlwZSAKLSAqIGZvciBzdWJjbGFzc2VzLgotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIEJvb2xlYW4gZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIGZhbHNlUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiBmYWxzZVByb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUJvb2xlYW5CZWFuUHJveHkodmFsdWUuYUJvb2wgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLX0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhblR5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhblR5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhMzc0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJvb2xlYW5UeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQm9vbGVhblR5cGVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQm9vbGVhbkJlYW5Qcm94eSBmb3IgQm9vbGVhbi5UWVBFLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQm9vbGVhblR5cGVCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElCb29sZWFuQmVhblByb3h5IHsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZkJvb2xlYW47Ci0KLS8qKgotICogU3RvcmUgdGhlIGJvb2xlYW4gdmFsdWUgc28gdGhhdCB3ZSBjYW4gcmV0dXJuIHRoZSBib29sZWFuVmFsdWUgZmFzdGVyCi0gKiB3aXRob3V0IHRoZSBuZWVkIGZvciBnb2luZyBhY3Jvc3MgdGhlIGxpbmUuIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgaXMgY3JlYXRlZCBpbgotICogc3BlY2lhbCB3YXksIHNvIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlc2UuCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1SRU1Cb29sZWFuVHlwZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIGJvb2xlYW4gdmFsdWUpIHsKLQlzdXBlcihhUmVnaXN0cnkpOwotCWZCb29sZWFuID0gdmFsdWU7Ci19Ci0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZCb29sZWFuID09ICgoUkVNQm9vbGVhblR5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5ib29sZWFuVmFsdWUoKTsKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBCb29sZWFuKQotCQlyZXR1cm4gZkJvb2xlYW4gPT0gKChCb29sZWFuKSBhbk9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0gKi8KLXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIFJFTUJvb2xlYW5UeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkJvb2xlYW4gPT0gKChSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuYm9vbGVhblZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZQotICovCi1wdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JcmV0dXJuIGZCb29sZWFuOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGphdmEubGFuZy5Cb29sZWFuIHZhbHVlCi0gKi8KLXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gZkJvb2xlYW4gPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgdG9TdHJpbmcgb2YgdGhlIGJlYW4gaXRzZWxmLgotICovCi1wdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQlyZXR1cm4gZkJvb2xlYW4gPyBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSA6IEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuYm9vbGVhblR5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZCb29sZWFuKTsKLX0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjQ1YzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEJvb2xlYW4gQmVhblR5cGUgUHJveHkgZm9yIEJvb2xlYW4uVFlQRQotICogQ3JlYXRpb24gZGF0ZTogKDIvMjMvMDAgMTo1OTowMiBQTSkKLSAqIEBhdXRob3I6IFJpY2hhcmQgTGVlIEt1bHAKLSAqLwotZmluYWwgY2xhc3MgUkVNQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci0KLQkvLyBDYWNoZSB0aGVzZSBpbnN0YW5jZXMuIFNpbmNlIHRoZSBCZWFuVHlwZSBwcm94aWVzIGFyZSBjYWNoZWQgYWxzbywgb25seSBvbmUgaW5zdGFuY2UKLQkvLyBvZiB0cnVlL2ZhbHNlIHdpbGwgYmUgaW4gc3lzdGVtLgotCXByb3RlY3RlZCBmaW5hbCBJQm9vbGVhbkJlYW5Qcm94eSB0cnVlUHJveHk7Ci0JcHJvdGVjdGVkIGZpbmFsIElCb29sZWFuQmVhblByb3h5IGZhbHNlUHJveHk7Ci0vKioKLSAqIFJFTUJvb2xlYW5CZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXByb3RlY3RlZCBSRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5CT09MRUFOX1RZUEUpLCBCb29sZWFuLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQl0cnVlUHJveHkgPSBuZXcgUkVNQm9vbGVhblR5cGVCZWFuUHJveHkoIGZSZWdpc3RyeSwgdHJ1ZSk7Ci0JZmFsc2VQcm94eSA9IG5ldyBSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eSggZlJlZ2lzdHJ5LCBmYWxzZSk7CQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqIFVzZSB0aGUgY2FjaGUuCi0gKi8KLUlCb29sZWFuQmVhblByb3h5IGNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoYm9vbGVhbiBhQm9vbGVhbikgewotCXJldHVybiBhQm9vbGVhbiA/IHRydWVQcm94eSA6IGZhbHNlUHJveHk7Ci19Ci0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIGJvb2xlYW4gaXMgYSBwcmltaXRpdmUsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgZmFsc2VQcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIGZhbHNlUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQm9vbGVhbkJlYW5Qcm94eSh2YWx1ZS5hQm9vbCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlQ2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZUNsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODhmZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlQ2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJ5dGVDbGFzc0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBSZW1vdGUgUHJveHkgZm9yIEJ5dGUuY2xhc3MuCi0gKi8KLWNsYXNzIFJFTUJ5dGVDbGFzc0JlYW5Qcm94eSBleHRlbmRzIFJFTU51bWJlckJlYW5Qcm94eSB7Ci0KLVJFTUJ5dGVDbGFzc0JlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEJ5dGUgYUJ5dGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFCeXRlKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuYnl0ZUNsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldCgoQnl0ZSkgbnVtYmVyVmFsdWUoKSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliY2E3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEJlYW5UeXBlIFByb3h5IGZvciBCeXRlLmNsYXNzLiAKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgb25lUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHR3b1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0aHJlZVByb3h5OwotLyoqCi0gKiBSRU1JbnRlZ2VyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNQnl0ZUNsYXNzQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG51bWJlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJZVEVfQ0xBU1MpLCBCeXRlLmNsYXNzLmdldE5hbWUoKSwgbnVtYmVyVHlwZSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTUJ5dGVDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBCeXRlKChieXRlKTApKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNQnl0ZUNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEJ5dGUoKGJ5dGUpMSkpOwotCXR3b1Byb3h5ID0gbmV3IFJFTUJ5dGVDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBCeXRlKChieXRlKTIpKTsKLQl0aHJlZVByb3h5ID0gbmV3IFJFTUJ5dGVDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBCeXRlKChieXRlKTMpKTsJCQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCeXRlQmVhblByb3h5KEJ5dGUgYUJ5dGUpIHsKLQlzd2l0Y2goYUJ5dGUuYnl0ZVZhbHVlKCkpIHsKLQkJY2FzZSAwOiByZXR1cm4gemVyb1Byb3h5OwotCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgUkVNQnl0ZUNsYXNzQmVhblByb3h5KGZSZWdpc3RyeSwgYUJ5dGUpOwotCX0KLX0KLQotLyoqCi0gKiBHZW5lcmljIHdheSB0byBjcmVhdGUgYW4gSW50ZWdlciBwcm94eSwgaG93ZXZlciwgdGhlIE51bWJlciBtdXN0IGJlIGFuIEludGVnZXIuCi0gKi8KLXByb3RlY3RlZCBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZU51bWJlckJlYW5Qcm94eShOdW1iZXIgYU51bWJlcikgewotCXJldHVybiBjcmVhdGVCeXRlQmVhblByb3h5KChCeXRlKSBhTnVtYmVyKTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIE51bWJlcidzIGRvbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVybyBwcm94eSBmb3IgdGhpcyBjYXNlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUJ5dGVCZWFuUHJveHkobmV3IEJ5dGUodmFsdWUuYUJ5dGUpKTsKLX0JCi0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVUeXBlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVUeXBlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMmJhMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlVHlwZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJ5dGVUeXBlQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSU51bWJlckJlYW5Qcm94eSBmb3IgQnl0ZS5UWVBFLgotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotY2xhc3MgUkVNQnl0ZVR5cGVCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElOdW1iZXJCZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgYnl0ZSBmQnl0ZTsKLQotLyoqCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTUJ5dGVUeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgYnl0ZSBhQnl0ZSkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkJ5dGUgPSBhQnl0ZTsKLX0KLQotLyoqCi0gKiBlcXVhbHM6IEVxdWFsIGlmOgotICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTUJ5dGVUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkJ5dGUgPT0gKChSRU1CeXRlVHlwZUJlYW5Qcm94eSkgYW5PYmplY3QpLmJ5dGVWYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIEJ5dGUpCi0JCXJldHVybiBmQnl0ZSA9PSAoKEJ5dGUpIGFuT2JqZWN0KS5ieXRlVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLSAqLwotcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhQmVhblByb3h5IGluc3RhbmNlb2YgUkVNQnl0ZVR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmQnl0ZSA9PSAoKFJFTUJ5dGVUeXBlQmVhblByb3h5KSBhQmVhblByb3h5KS5ieXRlVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIGZCeXRlOwotfQotLyoqCi0gKiBkb3VibGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gZkJ5dGU7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiBmQnl0ZTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZkJ5dGU7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiBmQnl0ZTsKLX0KLS8qKgotICogbnVtYmVyVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JcmV0dXJuIG5ldyBCeXRlKGZCeXRlKTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIGZCeXRlOwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBTdHJpbmcudmFsdWVPZihmQnl0ZSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmJ5dGVUeXBlOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChmQnl0ZSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNWRiNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgQnl0ZS5UWVBFLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQnl0ZVR5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSBvbmVQcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdHdvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5CWVRFX1RZUEUpLCBCeXRlLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNQnl0ZVR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoYnl0ZSkwKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNQnl0ZVR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoYnl0ZSkxKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1CeXRlVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIChieXRlKTIpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNQnl0ZVR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoYnl0ZSkzKTsJCQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCeXRlQmVhblByb3h5KGJ5dGUgYUJ5dGUpIHsKLQlzd2l0Y2goYUJ5dGUpIHsKLQkJY2FzZSAwOiByZXR1cm4gemVyb1Byb3h5OwotCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgUkVNQnl0ZVR5cGVCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhQnl0ZSk7Ci0JfQotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gYnl0ZSBpcyBhIHByaW1pdGl2ZSwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19CQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUJ5dGVCZWFuUHJveHkodmFsdWUuYUJ5dGUpOwotfQotCi0vKioKLSAqIFNob3J0IGN1dCBmb3IgbmV3SW5zdGFuY2Ugd2hlcmUgdGhlIHN0cmluZyBmb2xsb3dzIHRoZQotICogc3BlY2lmaWMgcGF0dGVybiB3ZSBleHBlY3QuIFRoYXQgd2F5IGl0IHdvbid0IGJlIG5lY2Vzc2FyeSB0byBzaGlwIG92ZXIgdG8gdGhlIHZtIAotICogdG8gcHJvY2VzcyBpdC4KLSAqCi0gKiBUaGUgcGF0dGVybiBpdCBjYW4gYWNjZXB0IGlzOgotICogCTEpIChieXRlKSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChieXRlKSBleHBsaWNpdGx5IGNhc3RzIGl0IGRvd24uCi0gKgkyKSB2YWxpZE51bWJlcgotICogSXQgd2lsbCB1c2UgdGhlIGRlY29kZSBmdW5jdGlvbiBvZiBieXRlIHRvIGRldGVybWluZSB0aGUgdmFsaWQgbnVtYmVyLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQlTdHJpbmcgdHJpbSA9IGluaXRpYWxpemF0aW9uU3RyaW5nLnRyaW0oKTsKLQlpZiAodHJpbS5sZW5ndGgoKSA9PSAwKQotCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkKLQlieXRlIGFCeXRlOwotCWlmICh0cmltLnN0YXJ0c1dpdGgoIihieXRlKSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJTnVtYmVyIHYgPSBwYXJzZVN0cmluZyh0cmltLnN1YnN0cmluZygiKGJ5dGUpIi5sZW5ndGgoKSkudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodiAhPSBudWxsKQotCQkJYUJ5dGUgPSB2LmJ5dGVWYWx1ZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBDYW4ndCBkZWNvZGUgaXQsIGxldCBmdWxsIHBhcnNlciBoYW5kbGUgaXQuCi0JfSBlbHNlIHsKLQkJdHJ5IHsKLQkJCWFCeXRlID0gQnl0ZS5kZWNvZGUodHJpbSkuYnl0ZVZhbHVlKCk7CS8vIFNlZSBpZiB2YWxpZCBieXRlIGZvcm1hdC4KLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQkJfQotCX0KLQotCXJldHVybiBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGFCeXRlKTsKLX0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2FsbGJhY2tJbnB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DYWxsYmFja0lucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOWIwNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DYWxsYmFja0lucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQ2FsbGJhY2tJbnB1dFN0cmVhbS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLklPQ29tbWFuZEV4Y2VwdGlvbjsKLS8qKgotICogVGhpcyBpcyB0aGUgaW5wdXRzdHJlYW0gdXNlZCB0byByZXR1cm4gYSBsb3Qgb2YgZGF0YSBmcm9tCi0gKiB0aGUgc2VydmVyLgotICovCi0KLXB1YmxpYyBjbGFzcyBSRU1DYWxsYmFja0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotCQotCXByb3RlY3RlZCBEYXRhSW5wdXRTdHJlYW0gZkluOwotCXByb3RlY3RlZCBEYXRhT3V0cHV0U3RyZWFtIGZPdXQ7Ci0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCXByb3RlY3RlZCBpbnQgZk5leHRCeXRlID0gMDsKLQlwcm90ZWN0ZWQgaW50IGZMYXN0Qnl0ZSA9IDA7Ci0JCi0JcHVibGljIFJFTUNhbGxiYWNrSW5wdXRTdHJlYW0oRGF0YUlucHV0U3RyZWFtIGluLCBEYXRhT3V0cHV0U3RyZWFtIG91dCkgewotCQlmSW4gPSBpbjsKLQkJZk91dCA9IG91dDsKLQkJCi0JCUludGVnZXIgYnVmU2l6ZSA9IEludGVnZXIuZ2V0SW50ZWdlcigicHJveHl2bS5idWZzaXplIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJ1ZlNpemUgPT0gbnVsbCkKLQkJCWJ1ZlNpemUgPSBuZXcgSW50ZWdlcigxNjAwMCk7CQkKLQkJZkJ1ZmZlciA9IG5ldyBieXRlW2J1ZlNpemUuaW50VmFsdWUoKV07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsZWFyU3RyZWFtKCkgewotCQlmSW4gPSBudWxsOwotCQlmT3V0ID0gbnVsbDsKLQkJZkJ1ZmZlciA9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpbGxCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZkluID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpOwotCQl0cnkgewotCQkJaWYgKGZMYXN0Qnl0ZSAhPSAtMSkgewotCQkJCWZMYXN0Qnl0ZSA9IENvbW1hbmRzLnJlYWRCeXRlcyhmSW4sIGZCdWZmZXIpOwotCQkJCWlmIChmTGFzdEJ5dGUgIT0gLTEpCi0JCQkJCWZOZXh0Qnl0ZSA9IDA7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZOZXh0Qnl0ZSA9IC0xOwotCQkJCX0KLQkJCX0JCi0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJdHJ5IHsKLQkJCQljbG9zZShmYWxzZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlMSkpOwkvLyBFcnJvciBkdXJpbmcgY2xvc2UsIGp1c3QgbG9nIGl0LiAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aHJvdyBuZXcgSU9Db21tYW5kRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQkJCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZOZXh0Qnl0ZSA+PSBmTGFzdEJ5dGUpIHsKLQkJCWZpbGxCdWZmZXIoKTsKLQkJfQotCQlpZiAoZkxhc3RCeXRlID09IC0xKQotCQkJcmV0dXJuIC0xOwkvLyBXZSd2ZSBwcmV2aW91c2x5IHJlYWNoZWQgdGhlIGVuZC4JCQotCQkKLQkJcmV0dXJuIGZCdWZmZXJbZk5leHRCeXRlKytdICYgMHhGRjsJLy8gU28gdGhhdCBpdCBpcyBpbiByYW5nZSAwIHRvIDI1NS4KLQl9Ci0JCi0JcHVibGljIGludCByZWFkKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfSBlbHNlIGlmICgob2ZmIDwgMCkgfHwgKG9mZiA+IGIubGVuZ3RoKSB8fCAobGVuIDwgMCkgfHwKLQkJCSgob2ZmICsgbGVuKSA+IGIubGVuZ3RoKSB8fCAoKG9mZiArIGxlbikgPCAwKSkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfSBlbHNlIGlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJCi0JCWludCByZWFkID0gMDsKLQkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCWlmIChmTmV4dEJ5dGUgPj0gZkxhc3RCeXRlKQotCQkJCWZpbGxCdWZmZXIoKTsKLQkJCWlmIChmTGFzdEJ5dGUgPT0gLTEpCi0JCQkJcmV0dXJuIHJlYWQgIT0gMCA/IHJlYWQgOiAtMTsJLy8gTm8gbW9yZSwgcmV0dXJuIGFtb3VudCByZWFkLCBvciBpZiBub25lIHJlYWQsIHRoZW4gLTEKLQkJCWludCBtb3ZlID0gZkxhc3RCeXRlIC0gZk5leHRCeXRlOwotCQkJaWYgKG1vdmUgPiBsZW4pCi0JCQkJbW92ZSA9IGxlbjsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZkJ1ZmZlciwgZk5leHRCeXRlLCBiLCBvZmYsIG1vdmUpOwotCQkJcmVhZCArPSBtb3ZlOwotCQkJZk5leHRCeXRlICs9IG1vdmU7Ci0JCQlvZmYgKz0gbW92ZTsKLQkJCWxlbiAtPSBtb3ZlOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVhZDsKLQl9Ci0JCQkKLQlwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmTGFzdEJ5dGUgIT0gLTEgPyBmTGFzdEJ5dGUgLSBmTmV4dEJ5dGUgOiAwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNsb3NlKHRydWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZShib29sZWFuIHdhaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmT3V0ID09IG51bGwpCi0JCQlyZXR1cm47CS8vIEFscmVhZHkgY2xvc2VkLgotCQl0cnkgewotCQkJZk91dC53cml0ZUJ5dGUoQ29tbWFuZHMuQ0FMTEJBQ0tfU1RSRUFNX1RFUk1JTkFURSk7Ci0JCQlmT3V0LmZsdXNoKCk7Ci0JCQlmT3V0ID0gbnVsbDsJLy8gU28gdGhhdCB3ZSBrbm93IHdlIGNsb3NlZCBhbHJlYWR5IGlmIGVycm9yIG9jY3VycyBkdXJpbmcgaW4gcmVhZCgpIGJlbG93LgotCQkJaWYgKHdhaXQpIHsKLQkJCQkvLyBOZWVkIHRvIHJlYWQgdW50aWwgRW5kIG9mIHN0cmVhbSBiZWNhdXNlIHdlIG5lZWQgdG8gZmx1c2ggb3V0IHRoZQotCQkJCS8vIHN0cmVhbSBzbyB0aGF0IG5leHQgdGltZSB3ZSB1c2UgdGhpcyBjb25uZWN0aW9uIHdlIHN0YXJ0IGZyZXNoLgotCQkJCS8vIElmIHRoZSBzZXJ2ZXIgaGFzIGFscmVhZHkgZmluaXNoZWQgd3JpdGluZywgd2Ugd2lsbCByZWFkIHVudGlsIHRoZW4uCi0JCQkJLy8gSWYgdGhlIHNlcnZlciBoYXMgbm90IHlldCBmaW5pc2hlZCB3cml0aW5nLCB3aGVuIGl0IHJlYWRzIHRoZSB0ZXJtaW5hdGUKLQkJCQkvLyByZXF1ZXN0IGl0IHdpbGwgc2VuZCBhbiBlbmQgb2Ygc3RyZWFtIG1hcmtlciBmb3IgdXMgdG8gcmVhZC4gQnV0IGVpdGhlcgotCQkJCS8vIHdheSB3ZSBjYW4ndCBsZWF2ZSB1bnRpbCB3ZSd2ZSByZWFkIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3RyZWFtLgotCQkJCQotCQkJCS8vIElmIGNhbGxlZCB3aXRoIG5vIHdhaXQsIHRoZW4gd2UgYXJlIGNsb3NpbmcgaGFyZCBhbmQgd2lsbCBiZSBjbG9zaW5nIHRoZSBzb2NrZXQgdG9vLgotCQkJCXdoaWxlIChyZWFkKCkgIT0gLTEpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQljbGVhclN0cmVhbSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DYWxsYmFja1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNhbGxiYWNrUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1MjYxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNhbGxiYWNrUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1DYWxsYmFja1JlZ2lzdHJ5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudDsKLQotLyoqCi0gKiBUaGlzIHJlZ2lzdHJ5IHdpbGwgaGFuZGxlIGNhbGxiYWNrcy4KLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2Ugbm8gb25lCi0gKiBzaG91bGQgYWNjZXNzIGl0IG91dHNpZGUuCi0gKi8KLWNsYXNzIFJFTUNhbGxiYWNrUmVnaXN0cnkgaW1wbGVtZW50cyBJQ2FsbGJhY2tSZWdpc3RyeSB7Ci0JZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZkZhY3Rvcnk7Ci0JZmluYWwgU3RyaW5nIGZOYW1lUG9zdGZpeDsKLQlMaXN0IGZUaHJlYWRzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgTGlua2VkTGlzdCgpKTsJLy8gTGlzdCBvZiBhY3RpdmUgY2FsbGJhY2sgdGhyZWFkcy4JCi0JCi0JTWFwIGZJZFRvQ2FsbGJhY2sgPSBuZXcgSGFzaE1hcCg1KTsJLy8gSUQgdG8gQ2FsbGJhY2sgbWFwLgotCU1hcCBmQ2FsbGJhY2tQcm94eVRvSWQgPSBuZXcgSGFzaE1hcCg1KTsJLy8gQ2FsbGJhY2sgdG8gSUQgbWFwLiBUaGlzIHdpbGwgYWxzbyBob2xkIG9udG8gdGhlIGNhbGxiYWNrIHByb3hpZXMgc28gdGhhdCB0aGV5IGRvbid0IGdldCBHQydkIHdoaWxlIHRoZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgotCQkKLQlJUkVNTWV0aG9kUHJveHkgZkluaXRpYWxpemVDYWxsYmFjazsKLQlJQmVhblByb3h5IGZSZW1vdGVTZXJ2ZXI7Ci0JCi0JYm9vbGVhbiByZWdpc3RyeU9wZW4gPSB0cnVlOwotCQotCXB1YmxpYyBSRU1DYWxsYmFja1JlZ2lzdHJ5KFN0cmluZyBuYW1lLCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhRmFjdG9yeSkgewotCQotCQlmRmFjdG9yeSA9IGFGYWN0b3J5OwotCQlmTmFtZVBvc3RmaXggPSBuYW1lOwotCQkKLQkJLy8gTm93IHJlZ2lzdGVyIGNvbW1vbiBwcm94aWVzLgotCQlJUkVNQmVhblR5cGVQcm94eSBjYWxsYmFja1R5cGUgPSBuZXcgUkVNSW50ZXJmYWNlQmVhblR5cGVQcm94eShmRmFjdG9yeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuSUNBTExCQUNLX0NMQVNTKSwgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuSUNhbGxiYWNrIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkJZkluaXRpYWxpemVDYWxsYmFjayA9IChJUkVNTWV0aG9kUHJveHkpICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkubWV0aG9kVHlwZS5uZXdCZWFuUHJveHkobmV3IEludGVnZXIoQ29tbWFuZHMuSU5JVElBTElaRUNBTExCQUNLX01FVEhPRF9JRCkpOwotCQkKLQkJZlJlbW90ZVNlcnZlciA9IGFGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5nZXRJVk1TZXJ2ZXJQcm94eSgpOwkvLyBGb3IgdXMsIHRoZSBJVk1TZXJ2ZXIgb24gdGhlIHJlbW90ZSB2bSBBTFNPIGltcGxlbWVudHMgSVZNQ2FsbGJhY2tTZXJ2ZXIuCi0KLQkJKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5yZWdpc3RlckJlYW5UeXBlUHJveHkoY2FsbGJhY2tUeXBlLCB0cnVlKTsKLQkJKChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSkucmVnaXN0ZXJQcm94eShmSW5pdGlhbGl6ZUNhbGxiYWNrKTsKLQkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZUNhbGxiYWNrKFNvY2tldCBpbmNvbWluZykgewotCQlpZiAocmVnaXN0cnlPcGVuKSB7Ci0JCQlUaHJlYWQgc3QgPSBuZXcgUkVNQ2FsbGJhY2tUaHJlYWQoaW5jb21pbmcsIHRoaXMsICJDYWxsYmFjayBUaHJlYWQtIitmTmFtZVBvc3RmaXgsIGZGYWN0b3J5LCBmRmFjdG9yeS5mTm9UaW1lb3V0cyk7IC8vJE5PTi1OTFMtMSQKLQkJCWZUaHJlYWRzLmFkZChzdCk7Ci0JCQlzdC5zdGFydCgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBVc2UgdGhpcyB0byByZXF1ZXN0IGEgc2h1dGRvd24uIElmIHRoZSBzZXJ2ZXIgaXMgYWxyZWFkeSBzaHV0ZG93biwgdGhpcyB3aWxsIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXF1ZXN0U2h1dGRvd24oKSB7CQkKLQkJaWYgKHJlZ2lzdHJ5T3BlbikKLQkJCXNodXRkb3duKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhIHRocmVhZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNhbGxiYWNrVGhyZWFkKFJFTUNhbGxiYWNrVGhyZWFkIHRocmVhZCkgewotCQlmVGhyZWFkcy5yZW1vdmUodGhyZWFkKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNodXRkb3duKCkgewotCQkKLQkJLy8gR28gdGhyb3VnaCBlYWNoIHRocmVhZCBhbmQgYXNrIGl0IHRvIGNsb3NlLiBNYWtlIGEgY29weSBvZiB0aGUgbGlzdCBzbyB0aGF0IHdlCi0JCS8vIHdvbid0IGdldCBpbnRvIGRlYWRsb2Nrcy4KLQkJUkVNQ2FsbGJhY2tUaHJlYWRbXSB0aHJlYWRzQXJyYXkgPSAoUkVNQ2FsbGJhY2tUaHJlYWRbXSkgZlRocmVhZHMudG9BcnJheShuZXcgUkVNQ2FsbGJhY2tUaHJlYWRbZlRocmVhZHMuc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGk9MDsgaTx0aHJlYWRzQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCS8vIFRoaXMgaXMgYSBoYXJzaCB3YXkgdG8gc2h1dCBhIGNvbm5lY3Rpb24gZG93biwgYnV0IHRoZXJlJ3Mgbm8KLQkJCS8vIG90aGVyIHdheSBJIGtub3cgb2YgdG8gaW50ZXJydXB0IHRoZSByZWFkIG9uIGEgc29ja2V0LgotCQkJdGhyZWFkc0FycmF5W2ldLmNsb3NlKCk7Ci0JCX0KLQkJCQotCQkvLyBOb3cgdGhhdCB0aGV5J3ZlIGJlZW4gdG9sZCB0byBjbG9zZSwgd2FpdCBvbiBlYWNoIG9uZSB0byBmaW5pc2guCi0JCWZvciAoaW50IGk9MDsgaTx0aHJlYWRzQXJyYXkubGVuZ3RoOyBpKyspCi0JCQl0cnkgewotCQkJCXRocmVhZHNBcnJheVtpXS5qb2luKDEwMDAwKTsJLy8gV2FpdCB0ZW4gc2Vjb25kcywgaWYgbG9uZ2VyLCBqdXN0IGdvIG9uIHRvIG5leHQgb25lLgotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQkJCi0JCWZUaHJlYWRzLmNsZWFyKCk7Ci0JCWZJZFRvQ2FsbGJhY2suY2xlYXIoKTsKLQkJZkNhbGxiYWNrUHJveHlUb0lkLmNsZWFyKCk7Ci0JCWZJbml0aWFsaXplQ2FsbGJhY2sgPSBudWxsOwotCQlmUmVtb3RlU2VydmVyID0gbnVsbDsKLQkJCQotCX0JCQotCQotCXB1YmxpYyBJQ2FsbGJhY2sgZ2V0UmVnaXN0ZXJlZENhbGxiYWNrKGludCBpZCkgewotCQlzeW5jaHJvbml6ZWQoZklkVG9DYWxsYmFjaykJewkKLQkJCXJldHVybiAoSUNhbGxiYWNrKSBmSWRUb0NhbGxiYWNrLmdldChuZXcgSW50ZWdlcihpZCkpOwotCQl9Ci0JfQotCQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2tSZWdpc3RyeSNyZWdpc3RlckNhbGxiYWNrKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHksIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjaykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckNhbGxiYWNrKElCZWFuUHJveHkgY2FsbGJhY2tQcm94eSwgSUNhbGxiYWNrIGNiKSB7Ci0JCXN5bmNocm9uaXplZChmSWRUb0NhbGxiYWNrKSB7Ci0JCQlmSWRUb0NhbGxiYWNrLnB1dCgoKElSRU1CZWFuUHJveHkpIGNhbGxiYWNrUHJveHkpLmdldElEKCksIGNiKTsKLQkJCWZDYWxsYmFja1Byb3h5VG9JZC5wdXQoY2FsbGJhY2tQcm94eSwgKChJUkVNQmVhblByb3h5KSBjYWxsYmFja1Byb3h5KS5nZXRJRCgpKTsKLQkJCWZJbml0aWFsaXplQ2FsbGJhY2suaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKGNhbGxiYWNrUHJveHksIG5ldyBJQmVhblByb3h5W10ge2ZSZW1vdGVTZXJ2ZXIsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSVJFTUJlYW5Qcm94eSkgY2FsbGJhY2tQcm94eSkuZ2V0SUQoKS5pbnRWYWx1ZSgpKX0pOwotCQl9Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFja1JlZ2lzdHJ5I3JlZ2lzdGVyQ2FsbGJhY2sob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2ssIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soSVByb3h5IGNhbGxiYWNrUHJveHksIGZpbmFsIElDYWxsYmFjayBjYiwgSUV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlmaW5hbCBJbnRlZ2VyIGlkOwotCQlpZiAoY2FsbGJhY2tQcm94eS5pc0JlYW5Qcm94eSgpKSB7Ci0JCQlpZCA9ICgoSVJFTUJlYW5Qcm94eSkgY2FsbGJhY2tQcm94eSkuZ2V0SUQoKTsKLQkJCXN5bmNocm9uaXplZChmSWRUb0NhbGxiYWNrKSB7Ci0JCQkJZklkVG9DYWxsYmFjay5wdXQoaWQsIGNiKTsKLQkJCQlmQ2FsbGJhY2tQcm94eVRvSWQucHV0KGNhbGxiYWNrUHJveHksIGlkKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlkID0gbmV3IEludGVnZXIoY2FsbGJhY2tQcm94eS5oYXNoQ29kZSgpKTsKLQkJCXN5bmNocm9uaXplZCAoZklkVG9DYWxsYmFjaykgewotCQkJCWZJZFRvQ2FsbGJhY2sucHV0KGlkLCBjYik7CS8vIFRoaXMgaXMgc28gdGhhdCBpdCBpcyByZWdpc3RlcmVkIGluIGNhc2UgY2FsbGJhY2sgaXMgaW52b2tlZCBmcm9tIHJlbW90ZSB2bSBkdXJpbmcgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLgotCQkJfQotCQkJKChFeHByZXNzaW9uUHJveHkpIGNhbGxiYWNrUHJveHkpLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCQlzeW5jaHJvbml6ZWQoZklkVG9DYWxsYmFjaykgewotCQkJCQkJZkNhbGxiYWNrUHJveHlUb0lkLnB1dChldmVudC5nZXRQcm94eSgpLCBpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIEZhaWxlZCwgc28gcmVtb3ZlIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZWx5LgotCQkJCQlzeW5jaHJvbml6ZWQgKGZJZFRvQ2FsbGJhY2spIHsKLQkJCQkJCWZJZFRvQ2FsbGJhY2sucmVtb3ZlKGlkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBwcm94eVZvaWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCQkvLyBGYWlsZWQsIHNvIHJlbW92ZSByZWdpc3RyYXRpb24gY29tcGxldGVseS4KLQkJCQkJc3luY2hyb25pemVkIChmSWRUb0NhbGxiYWNrKSB7Ci0JCQkJCQlmSWRUb0NhbGxiYWNrLnJlbW92ZShpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCQlleHByZXNzaW9uLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShmSW5pdGlhbGl6ZUNhbGxiYWNrLCBjYWxsYmFja1Byb3h5LCBuZXcgSVByb3h5W10ge2ZSZW1vdGVTZXJ2ZXIsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGlkLmludFZhbHVlKCkpfSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgcHVibGljIGludGVyZmFjZSBmb3IgZGVyZWdpc3RlcmluZyBjYWxsYmFja3MuCi0JICovCi0JcHVibGljIHZvaWQgZGVyZWdpc3RlckNhbGxiYWNrKElCZWFuUHJveHkgY2FsbGJhY2tQcm94eSkgewotCQlzeW5jaHJvbml6ZWQoZklkVG9DYWxsYmFjaykJewotCQkJSW50ZWdlciBpZCA9IChJbnRlZ2VyKSBmQ2FsbGJhY2tQcm94eVRvSWQucmVtb3ZlKGNhbGxiYWNrUHJveHkpOwotCQkJZklkVG9DYWxsYmFjay5yZW1vdmUoaWQpOwotCQl9Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNhbGxiYWNrVGhyZWFkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNhbGxiYWNrVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDE2OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DYWxsYmFja1RocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUNhbGxiYWNrVGhyZWFkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE2ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuVHJhbnNtaXRhYmxlQXJyYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIHRocmVhZCBoYW5kbGVzIHRoZSBhY3R1YWwgY2FsbGJhY2suCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIG5vIG9uZSBlbHNlIHNob3VsZCBhY2Nlc3MgaXQuCi0gKi8KLWNsYXNzIFJFTUNhbGxiYWNrVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQlmaW5hbCBSRU1Db25uZWN0aW9uIGZDb25uZWN0aW9uOwkvLyBBIGNvbm5lY3Rpb24gdG8gdXNlCi0JZmluYWwgUkVNQ2FsbGJhY2tSZWdpc3RyeSBmU2VydmVyOwotCWZpbmFsIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmRmFjdG9yeTsKLQlmaW5hbCBSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGZUeXBlRmFjdG9yeTsKLQlmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaHV0dGluZ0Rvd247Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5UcmFuc2FjdGlvbjsJLy8gSXMgdGhpcyB0aHJlYWQgY3VycmVudGx5IHBhcnRpY2lwYXRpbmcgaW4gYSB0cmFuc2FjdGlvbiwgKGkuZS4gcmVhZGluZy93cml0aW5nKSwgaWYgc28gdGhlbiB3ZSBjYW4ndCB1c2UgaXQgZm9yIGFub3RoZXIgdHJhbnNhY3Rpb24uCi0JCi0KLQkvKioKLQkgKiBJcyB0aGlzIGNhbGxiYWNrIHRocmVhZCBjdXJyZW50bHkgcGFydGljaXBhdGluZyBpbiBhIHRyYW5zYWN0aW9uIChyZWFkaW5nL3dyaXRpbmcpLiBJZiBzbyB0aGVuIGl0IGNhbid0IGJlIHVzZWQgZm9yIGFuCi0JICogaW5kZXBlbmRlbnQgbmV3IHRyYW5zYWN0aW9uLiBJbiBvdGhlciB3b3JkcyB5b3UgY2FuJ3Qgd3JpdGUvcmVhZCBkYXRhIHVzaW5nIHRoaXMgY2FsbGJhY2sgdGhyZWFkJ3MKLQkgKiBjb25uZWN0aW9uIGJlY2F1c2UgaXQgaXMgYmVpbmcgdXNlZCBieSBzb21lb25lIGVsc2UgZXhwZWN0aW5nIHRvIGhhdmUgZXhjbHVzaXZlIHJlYWQvd3JpdGUgb24gdGhpcyBjb25uZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpblRyYW5zYWN0aW9uKCkgewotCQlyZXR1cm4gaW5UcmFuc2FjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhpcyBjYWxsYmFjayB0aHJlYWQgaXMgaW4gYSB0cmFuc2FjdGlvbiBvciBub3QuIElmIGl0IGlzIGluIGEgdHJhbnNhY3Rpb24gaXQgY2Fubm90IGJlIHVzZWQKLQkgKiBmb3IgYW4gaW5kZXBlbmRlbnQgbmV3IHRyYW5zYWN0aW9uLiBJbiBvdGhlciB3b3JkcyB5b3UgY2FuJ3Qgd3JpdGUvcmVhZCBkYXRhIHVzaW5nIHRoaXMgY2FsbGJhY2sgdGhyZWFkJ3MKLQkgKiBjb25uZWN0aW9uIGJlY2F1c2UgaXQgaXMgYmVpbmcgdXNlZCBieSBzb21lb25lIGVsc2UgZXhwZWN0aW5nIHRvIGhhdmUgZXhjbHVzaXZlIHJlYWQvd3JpdGUgb24gdGhpcyBjb25uZWN0aW9uLgotCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50cmFuc2FjdGlvbihib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKLQkJdGhpcy5pblRyYW5zYWN0aW9uID0gaW5UcmFuc2FjdGlvbjsKLQl9Ci0JCi0JLy8gS2x1ZGdlOiBCdWcgaW4gTGludXggMS4zLnh4eCBvZiBKVk0uIENsb3NpbmcgYSBzb2NrZXQgd2hpbGUgdGhlIHNvY2tldCBpcyBiZWluZyByZWFkL2FjY2VwdCB3aWxsIG5vdCBpbnRlcnJ1cHQgdGhlCi0JLy8gd2FpdC4gTmVlZCB0byB0aW1lb3V0IHRvIHRoZSBzb2NrZXQgcmVhZC9hY2NlcHQgYmVmb3JlIHRoZSBzb2NrZXQgY2xvc2Ugd2lsbCBiZSBub3RpY2VkLiBUaGlzIGhhcyBiZWVuIGZpeGVkCi0JLy8gaW4gTGludXggMS40LiBTbyBvbiBMaW51eCAxLjMgbmVlZCB0byBwdXQgdGltZW91dHMgaW4gb24gdGhvc2Ugc29ja2V0cyB0aGF0IGNhbiBiZSBzZXBhcmF0ZWx5IGNsb3NlZCB3aGlsZSByZWFkaW5nL2FjY2VwdGluZy4KLQlzdGF0aWMgYm9vbGVhbiBMSU5VWF8xXzMgPSAibGludXgiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpICYmIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiwiIikuc3RhcnRzV2l0aCgiMS4zIik7CSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkKLQlwdWJsaWMgUkVNQ2FsbGJhY2tUaHJlYWQoU29ja2V0IHNvY2tldCwgUkVNQ2FsbGJhY2tSZWdpc3RyeSBzZXJ2ZXIsIFN0cmluZyBuYW1lLCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSwgYm9vbGVhbiBub1RpbWVvdXRzKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkKLQkJZkNvbm5lY3Rpb24gPSBuZXcgUkVNQ29ubmVjdGlvbihzb2NrZXQsIHRydWUpOwkvLyBObyB0aW1lb3V0cyBzaW5jZSB0aGlzIGlzIGEgc2VydmVyIHRocmVhZC4KLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlmU2VydmVyID0gc2VydmVyOwotCQlmRmFjdG9yeSA9IChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQkJZlR5cGVGYWN0b3J5ID0gKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmVxdWVzdCB0aGUgdGhyZWFkIHRvIGNsb3NlIGRvd24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlzaHV0dGluZ0Rvd24gPSB0cnVlOwkvLyBTbyB0aGF0IGlmIHRoaXMgaXMgYSBmb3JjZWQgY2xvc2UgdGhlbiBpdCB3aWxsIGtub3cgbm90IHRvIHByaW50IGVycm9yIG1zZ3MuCi0JCQlpZiAoZkNvbm5lY3Rpb24uZlNvY2tldCAhPSBudWxsKQotCQkJCWZDb25uZWN0aW9uLmZTb2NrZXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQkKLQkvKgotCSAqIFJldHVybiB0aGUgSVJFTUNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FsbGJhY2suIFVzZWQgYnkKLQkgKiB0aGUgY29ubmVjdGlvbiBzZXJ2ZXIgdG8gcmV0dXJuIHRoaXMgY29ubmVjdGlvbiBmb3IgYW55IHJlcXVlc3RzIAotCSAqIG1hZGUgb24gdGhpcyB0aHJlYWQuCi0JICogPHBhY2thZ2UtcHJvdGVjdGVkPiBzbyB0aGF0IG9ubHkgcmVtb3RlIHByb3h5IGNhbiBhY2Nlc3MuCi0JICovCi0JSVJFTUNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIGZDb25uZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLQkJRGF0YUlucHV0U3RyZWFtIGluID0gZkNvbm5lY3Rpb24uaW47Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gZkNvbm5lY3Rpb24ub3V0OwkKLQkJSW5wdXRTdHJlYW0gaW5zID0gbnVsbDsJCi0JCWJvb2xlYW4gc2h1dGRvd24gPSBmYWxzZTsKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsJLy8gV29ya2luZyB2YWx1ZSBvYmplY3Qgc28gbm90IGNvbnRpbnVhbGx5IHJlY3JlYXRlZC4KLQkJQmVhblByb3h5VmFsdWVTZW5kZXIgdmFsdWVTZW5kZXIgPSBuZXcgQmVhblByb3h5VmFsdWVTZW5kZXIodGhpcy5mRmFjdG9yeSk7CS8vIFdvcmtpbmcgdmFsdWVzZW5kZXIgc28gbm90IGNvbnRpbnVhbGx5IHJlY3JlYXRlZC4gCi0JCXRyeSB7Ci0JCQlib29sZWFuIGRvTG9vcCA9IHRydWU7Ci0KLQkJCS8qKgotCQkJICogTm90ZTogSW4gdGhlIGNhc2VzIGJlbG93IHlvdSB3aWxsIHNlZSBhIGxvdCBvZiBmaW5hbGx5IGNsYXVzZXMgdGhhdCBudWxsIHZhcmlhYmxlcyBvdXQuCi0JCQkgKiBUaGlzIGlzIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBsb29wLCBhbmQgdmFyaWFibGVzIGRlY2xhcmVkIHdpdGhpbiBibG9ja3MgYXJlIG5vdAotCQkJICogZ2FyYmFnZSBjb2xsZWN0ZWQgdW50aWwgdGhlIG1ldGhvZCBpcyB0ZXJtaW5hdGVkLCBzbyB0aGVzZSB2YXJpYWJsZXMgb25jZSBzZXQgd291bGQgbmV2ZXIKLQkJCSAqIGJlIEdDJ2QuIFRoZSBudWxsaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGNhc2UgbWFrZXMgc3VyZSB0aGF0IGFueSBvZiB0aG9zZSBvYmplY3RzIHNldCBhcmUKLQkJCSAqIG5vdyBhdmFpbGFibGUgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbiB3aGVuIG5lY2Vzc2FyeS4KLQkJCSAqLwkJCi0JCQl3aGlsZShkb0xvb3ApIHsKLQkJCQlieXRlIGNtZCA9IDA7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKExJTlVYXzFfMykKLQkJCQkJCWZDb25uZWN0aW9uLmZTb2NrZXQuc2V0U29UaW1lb3V0KDEwMDApOwkvLyBMaW51eCAxLjMgYnVnLCBzZWUgc3RhdGljIExJTlVYXzFfMyBhYm92ZQotCQkJCQljbWQgPSBpbi5yZWFkQnl0ZSgpOwotCQkJCQlpZiAoTElOVVhfMV8zKQotCQkJCQkJZkNvbm5lY3Rpb24uZlNvY2tldC5zZXRTb1RpbWVvdXQoMCk7CS8vIExpbnV4IDEuMyBidWcsIHNlZSBzdGF0aWMgTElOVVhfMV8zIGFib3ZlCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNvbnRpbnVlOwkvLyBUaW1lZCBvdXQsIHRyeSBhZ2FpbgotCQkJCX0KLQkJCQkJCi0JCQkJc3dpdGNoIChjbWQpIHsKLQkJCQkJY2FzZSBDb21tYW5kcy5RVUlUX0NPTk5FQ1RJT046CQkJCQotCQkJCQkJZG9Mb29wID0gZmFsc2U7CQotCQkJCQkJYnJlYWs7CS8vIENsb3NlIHRoaXMgY29ubmVjdGlvbgotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuVEVSTUlOQVRFX1NFUlZFUjoKLQkJCQkJCWRvTG9vcCA9IGZhbHNlOwkJCi0JCQkJCQlzaHV0ZG93biA9IHRydWU7CS8vIFNodXRkb3duIGV2ZXJ5dGhpbmcKLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuQ0FMTEJBQ0s6Ci0JCQkJCQlpbnQgY2FsbElEID0gaW4ucmVhZEludCgpOwkvLyBUaGUgaWQgb2YgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgdG8gY2FsbC4KLQkJCQkJCWludCBtc2dJRCA9IGluLnJlYWRJbnQoKTsJLy8gVGhlIGlkIG9mIHRoZSBtZXNzYWdlIHRvIGNhbGwuCi0JCQkJCQlPYmplY3QgcGFybSA9IG51bGw7Ci0JCQkJCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCQkJCUlDYWxsYmFjayBjYiA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIFRoZSByZWdpc3RlciBjYWxsYmFjayBoYW5kbGVyIHdpbGwga25vdyBob3cgdG8gaGFuZGxlIHRoZSBwYXJtLAotCQkJCQkJCS8vIGl0IHdpbGwga25vdyBpZiBpdCBpcyBhbiBhcnJheSBvZiBwcm94aWVzLCBvciBhbiBvYmplY3Qgb2Ygc29tZSBraW5kLgotCQkJCQkJCWZGYWN0b3J5LnN0YXJ0VHJhbnNhY3Rpb24oKTsJLy8gU3RhcnQgYSB0cmFuc2FjdGlvbi4KLQkJCQkJCQlzZXRJbnRyYW5zYWN0aW9uKHRydWUpOwkvLyBBbHNvIHRlbGwgb3Vyc2VsdmVzIHRoYXQgd2UgYXJlIGluIGEgdHJhbnNhY3Rpb24uCi0JCQkJCQkJYm9vbGVhbiBpc1Byb3hpZXMgPSB0cnVlOwkJCQkJCQkKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJaWYgKHZhbHVlT2JqZWN0LnR5cGUgPT0gQ29tbWFuZHMuQVJSQVlfSURTKSB7Ci0JCQkJCQkJCQkvLyBJdCBpcyBhbiBhcnJheSBjb250YWluaW5nIElEcywgYXMgaXQgbm9ybWFsbHkgd291bGQgYmUuCi0JCQkJCQkJCQkvLyBIb3dldmVyIGl0IHdpbGwgYmVjb21lIElCZWFuUHJveHlbXS4gVGhhdCBpcyBiZWNhdXNlIGlmIElEJ3MKLQkJCQkJCQkJCS8vIHRoZXkgbXVzdCBiZSBwcm94aWVzIG92ZXIgaGVyZS4KLQkJCQkJCQkJCXZhbHVlU2VuZGVyLmluaXRpYWxpemUodmFsdWVPYmplY3QpOwotCQkJCQkJCQkJQ29tbWFuZHMucmVhZEFycmF5KGluLCB2YWx1ZU9iamVjdC5hbkludCwgdmFsdWVTZW5kZXIsIHZhbHVlT2JqZWN0LCBmYWxzZSk7Ci0JCQkJCQkJCQlpZiAodmFsdWVTZW5kZXIuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWNsb3NlKCk7CS8vIFNvbWV0aGluZyB3cm9uZywgY2xvc2UgdGhlIHRocmVhZCBzbyBuZXh0IHRpbWUgd2UgZ2V0IGEgbmV3IG9uZS4KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXBhcm0gPSB2YWx1ZVNlbmRlci5nZXRBcnJheSgpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJLy8gSXQgaXMgb2JqZWN0IG9yIG51bGwuIEl0IGNvdWxkIGJlIGFuIGFycmF5IG9mIG9iamVjdHMsIG9yIG9uZSBvYmplY3QuCi0JCQkJCQkJCQlpc1Byb3hpZXMgPSBmYWxzZTsKLQkJCQkJCQkJCXBhcm0gPSB2YWx1ZU9iamVjdC5nZXRBc09iamVjdCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJc2V0SW50cmFuc2FjdGlvbihmYWxzZSk7Ci0JCQkJCQkJCWZGYWN0b3J5LnN0b3BUcmFuc2FjdGlvbigpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBOb3cgcGVyZm9ybSB0aGUgY2FsbGJhY2suCi0JCQkJCQkJY2IgPSBmU2VydmVyLmdldFJlZ2lzdGVyZWRDYWxsYmFjayhjYWxsSUQpOwotCQkJCQkJCWlmIChjYiAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIENhbGxiYWNrIHN0aWxsIHJlZ2lzdGVyZWQuIElmIHByb3hpZXMsIHRoZW4gaWYgZmlyc3QgZW50cnkgaXMganVzdCBhIHByb3h5LAotCQkJCQkJCQkvLyB0aGVuIHdlIGFyZSBzZW5kaW5nIG9ubHkgb25lLiBBIGNvbnZpZW5lbmNlIGZhY3RvciBmb3IgY2FsbGJhY2tzLgotCQkJCQkJCQkvLyBJZiBub3QgYSBzaW5nbGUgZW50cnkgb2YgSUJlYW5Qcm94eSwgdGhlbiBzZW5kIHdob2xlIGFycmF5LgotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaWYgKGlzUHJveGllcykKLQkJCQkJCQkJCQlpZiAoKChPYmplY3RbXSkgcGFybSkubGVuZ3RoID09IDEgJiYgKCgoT2JqZWN0W10pIHBhcm0pWzBdID09IG51bGwgfHwgKChPYmplY3RbXSkgcGFybSlbMF0gaW5zdGFuY2VvZiBJQmVhblByb3h5KSkKLQkJCQkJCQkJCQkJcmVzdWx0ID0gY2IuY2FsbGVkQmFjayhtc2dJRCwgKElCZWFuUHJveHkpICgoT2JqZWN0W10pIHBhcm0pWzBdKTsKLQkJCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkJCXJlc3VsdCA9IGNiLmNhbGxlZEJhY2sobXNnSUQsIChPYmplY3RbXSkgcGFybSk7Ci0JCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkJcmVzdWx0ID0gY2IuY2FsbGVkQmFjayhtc2dJRCwgcGFybSk7Ci0JCQkJCQkJCQkvLyBXZSBvbmx5IGFjY2VwdCBudWxsLCBJUkVNQmVhblByb3hpZXMsIGFuZCBPYmplY3RbXSwgd2hlcmUKLQkJCQkJCQkJCS8vIGNvbnRlbnRzIG9mIE9iamVjdFtdIGFyZSBiZWFuIHByb3hpZXMuCi0JCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBJUkVNQmVhblByb3h5KQotCQkJCQkJCQkJCSAoKElSRU1CZWFuUHJveHkpIHJlc3VsdCkucmVuZGVyQmVhbih2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQllbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYmplY3RbXSkgewotCQkJCQkJCQkJCWNsYXNzIFJldHJpZXZlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlUmV0cmlldmUgewotCQkJCQkJCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJCQkJCQlPYmplY3RbXSBhcnJheTsKLQkJCQkJCQkJCQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0KLQkJCQkJCQkJCQkJcHVibGljIFJldHJpZXZlcihPYmplY3RbXSBhbkFycmF5KSB7Ci0JCQkJCQkJCQkJCQlhcnJheSA9IGFuQXJyYXk7Ci0JCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJCQlwdWJsaWMgQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV4dFZhbHVlKCkgewotCQkJCQkJCQkJCQkJT2JqZWN0IHJldFBhcm0gPSBhcnJheVtpbmRleCsrXTsKLQkJCQkJCQkJCQkJCWlmIChyZXRQYXJtICE9IG51bGwpCi0JCQkJCQkJCQkJCQkJaWYgKHJldFBhcm0gaW5zdGFuY2VvZiBJUkVNQmVhblByb3h5KQotCQkJCQkJCQkJCQkJCQkgKChJUkVNQmVhblByb3h5KSByZXRQYXJtKS5yZW5kZXJCZWFuKHdvcmtlcik7Ci0JCQkJCQkJCQkJCQkJZWxzZSBpZiAocmV0UGFybSBpbnN0YW5jZW9mIFRyYW5zbWl0YWJsZUFycmF5KSB7Ci0JCQkJCQkJCQkJCQkJCS8vIEl0IGlzIGFub3RoZXIgYXJyYXksIGNyZWF0ZSBhIG5ldwotCQkJCQkJCQkJCQkJCQkvLyByZXRyaWV2ZXIuCi0JCQkJCQkJCQkJCQkJCXdvcmtlci5zZXRBcnJheUlEUygKLQkJCQkJCQkJCQkJCQkJCW5ldyBSZXRyaWV2ZXIoKChUcmFuc21pdGFibGVBcnJheSkgcmV0UGFybSkuYXJyYXkpLAotCQkJCQkJCQkJCQkJCQkJKChUcmFuc21pdGFibGVBcnJheSkgcmV0UGFybSkuYXJyYXkubGVuZ3RoLAotCQkJCQkJCQkJCQkJCQkJKChUcmFuc21pdGFibGVBcnJheSkgcmV0UGFybSkuY29tcG9uZW50VHlwZUlEKTsKLQkJCQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQkJCQkvLyBJdCdzIGFuIG9iamVjdC4gTmVlZCB0byBnZXQgYmVhbgotCQkJCQkJCQkJCQkJCQkvLyB0eXBlIHNvIHRoYXQgd2UgY2FuIHNlbmQgaXQuCi0JCQkJCQkJCQkJCQkJCUlSRU1CZWFuUHJveHkgdHlwZSA9Ci0JCQkJCQkJCQkJCQkJCQkoSVJFTUJlYW5Qcm94eSkgZlR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkocmV0UGFybS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCQkJCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJCQkJCQkJCQkJCWludCBjbGFzc0lEID0gdHlwZS5nZXRJRCgpLmludFZhbHVlKCk7Ci0JCQkJCQkJCQkJCQkJCXdvcmtlci5zZXRBc09iamVjdChyZXRQYXJtLCBjbGFzc0lEKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkJCQkJd29ya2VyLnNldCgpOwotCQkJCQkJCQkJCQkJcmV0dXJuIHdvcmtlcjsgCi0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9OwotCi0JCQkJCQkJCQkJdmFsdWVPYmplY3Quc2V0QXJyYXlJRFMoCi0JCQkJCQkJCQkJCW5ldyBSZXRyaWV2ZXIoKE9iamVjdFtdKSByZXN1bHQpLAotCQkJCQkJCQkJCQkoKE9iamVjdFtdKSByZXN1bHQpLmxlbmd0aCwKLQkJCQkJCQkJCQkJQ29tbWFuZHMuT0JKRUNUX0NMQVNTKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrRG9uZUNvbW1hbmQob3V0LCB2YWx1ZU9iamVjdCwgQ29tbWFuZHMuTk9fRVJST1IpOwotCQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCS8vIFNvbWV0aGluZyBoYXBwZW5lZCwgdHVybiBpdCBpbnRvIGFuIGVycm9yIG9iamVjdAotCQkJCQkJCQkJLy8gdG8gc2VuZCBiYWNrLgotCQkJCQkJCQkJdmFsdWVPYmplY3Quc2V0KGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnOicgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tEb25lQ29tbWFuZChvdXQsIHZhbHVlT2JqZWN0LCBDb21tYW5kcy5DQUxMQkFDS19SVU5USU1FX0VYQ0VQVElPTik7Ci0JCQkJCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7CS8vIEp1c3QgbG9nIGl0LCBidXQgYXNzdW1lIHNhZmUgZW5vdWdoIHRvIGp1c3QgZ28gYmFjayBhbmQgd2FpdCBmb3IgbmV4dCBjYWxsYmFjayByZXF1ZXN0LgotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJCUNvbW1hbmRzLnNlbmRDYWxsYmFja0RvbmVDb21tYW5kKG91dCwgdmFsdWVPYmplY3QsIENvbW1hbmRzLkNBTExCQUNLX05PVF9SRUdJU1RFUkVEKTsJLy8gU2VuZCBlcnJvciBtc2cgYmFjayB0byBpbmRpY2F0ZSB3ZSB3ZXJlbid0IHJlZ2lzdGVyZWQuCQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCXBhcm0gPSBudWxsOwkvLyBDbGVhciBvdXQgZm9yIEdDIHRvIHdvcmsKLQkJCQkJCQlyZXN1bHQgPSBudWxsOwotCQkJCQkJCWNiID0gbnVsbDsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQl2YWx1ZVNlbmRlci5jbGVhcigpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5DQUxMQkFDS19TVFJFQU06Ci0JCQkJCQkvLyBBIHJlcXVlc3QgZm9yIGEgc3RyZWFtCi0JCQkJCQljYWxsSUQgPSBpbi5yZWFkSW50KCk7CS8vIFRoZSBpZCBvZiB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayB0byBjYWxsLgotCQkJCQkJbXNnSUQgPSBpbi5yZWFkSW50KCk7CS8vIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSB0byBjYWxsLgotCQkJCQkJY2IgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBOb3cgcGVyZm9ybSB0aGUgY2FsbGJhY2suCi0JCQkJCQkJY2IgPSBmU2VydmVyLmdldFJlZ2lzdGVyZWRDYWxsYmFjayhjYWxsSUQpOwotCQkJCQkJCWlmIChjYiAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIENhbGxiYWNrIHN0aWxsIHJlZ2lzdGVyZWQKLQkJCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7CQkJCQkJCQkKLQkJCQkJCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrRG9uZUNvbW1hbmQob3V0LCB2YWx1ZU9iamVjdCwgQ29tbWFuZHMuTk9fRVJST1IpOwkvLyBTZW5kIG51bGwgdG8gbGV0IGl0IGtub3cgd2UndmUgYWNjZXB0ZWQgdGhlIHN0cmVhbQotCQkJCQkJCQlpbnMgPSBuZXcgUkVNQ2FsbGJhY2tJbnB1dFN0cmVhbShpbiwgb3V0KTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWNiLmNhbGxlZEJhY2tTdHJlYW0obXNnSUQsIGlucyk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWlucy5jbG9zZSgpOwkvLyBNYWtlIHN1cmUgaXQncyBjbG9zZWQuCi0JCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gRXhjZXB0aW9uIHdoaWxlIGNsb3NpbmcsIGp1c3QgbG9nIGl0IGFuZCB0aGVuIG1hcmsgdG8gZW5kIHRoZSBsb29wIHNvIHdlIGNsb3NlIGNvbm5lY3Rpb24gdG9vLgotCQkJCQkJCQkJCWRvTG9vcCA9IGZhbHNlOwotCQkJCQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiSW4gUkVNQ2FsbGJhY2tUaHJlYWQiLCBlKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCQkJCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrRG9uZUNvbW1hbmQob3V0LCB2YWx1ZU9iamVjdCwgQ29tbWFuZHMuQ0FMTEJBQ0tfTk9UX1JFR0lTVEVSRUQpOwkvLyBTZW5kIGVycm9yIG1zZyBiYWNrIHRvIGluZGljYXRlIHdlIHdlcmVuJ3QgcmVnaXN0ZXJlZC4JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJY2IgPSBudWxsOwkvLyBDbGVhciBvdXQgZm9yIEdDIHRvIHdvcmsKLQkJCQkJCQlpbnMgPSBudWxsOwotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQkJCQkJCi0JCQkJCQkKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCS8vIFVua25vd24gY29tbWFuZC4gV2UgZG9uJ3Qga25vdyBob3cgbG9uZyB0aGUgY29tbWFuZCBpcywgc28gd2UgbmVlZCB0byBjbG9zZSB0aGUgY29ubmVjdGlvbi4KLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiUkVNQ2FsbGJhY2s6IEludmFsaWQgY21kIHNlbnQ9IitjbWQsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9Mb29wID0gZmFsc2U7CQkJCQkJCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIG9rLiBJdCBtZWFucyB0aGF0IHRoZSBjb25uZWN0aW9uIG9uIHRoZSBvdGhlciBzaWRlIHdhcyB0ZXJtaW5hdGVkLgotCQkJLy8gU28ganVzdCBhY2NlcHQgdGhpcyBhbmQgZ28gZG93bi4KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWlmICghc2h1dHRpbmdEb3duKQotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiSW4gUkVNQ2FsbGJhY2tUaHJlYWQiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQljbG9zZSgpOwotCQl9CQkKLQkJZlNlcnZlci5yZW1vdmVDYWxsYmFja1RocmVhZCh0aGlzKTsKLQkJaWYgKHNodXRkb3duKQotCQkJZlNlcnZlci5yZXF1ZXN0U2h1dGRvd24oKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM1Y2Y5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogJFJDU2ZpbGU6IFJFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5LmphdmEsdiAkICRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSUNoYXJhY3RlckJlYW5Qcm94eSBmb3IgdGhlIENoYXJhY3RlciBjbGFzcy4gQ3JlYXRpb24gZGF0ZTogKDIvNi8wMAotICogOTowMjo1NCBBTSkgQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElDaGFyYWN0ZXJCZWFuUHJveHkgewotCXByb3RlY3RlZCBDaGFyYWN0ZXIgZkNoYXJWYWx1ZTsKLQotCS8qKgotCSAqIEFzIHdlbGwgYXMgc3RvcmluZyB0aGUgYmVhbiBzdG9yZSB0aGUgY2hhciB2YWx1ZSBzbyB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIGNoYXJWYWx1ZSBmYXN0ZXIKLQkgKiB3aXRob3V0IHRoZSBuZWVkIGZvciByZXBlYXRlZCByZS1jYXN0aW5nLiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGl0IGlzIGNyZWF0ZWQgaW4KLQkgKiBzcGVjaWFsIHdheSwgc28gbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gYUJlYW4KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENoYXJhY3RlciB2YWx1ZSkgewotCQlzdXBlcihhUmVnaXN0cnkpOwotCQlmQ2hhclZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZXF1YWxzOiBFcXVhbCBpZjogMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QgMikgRWxzZSBpZiBvdGhlciBpcyBhbgotCSAqIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZiBlcXVhbHMgb24gdGhlIHNlcnZlci4gMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50Ci0JICogcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudCB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLAotCSAqIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQkJcmV0dXJuIHRydWU7IC8vIElkZW50aXR5Ci0JCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5KQotCQkJcmV0dXJuIGZDaGFyVmFsdWUuY2hhclZhbHVlKCkgPT0gKChSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eSkgYW5PYmplY3QpLmNoYXJWYWx1ZSgpOwotCQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQlyZXR1cm4gZkNoYXJWYWx1ZS5jaGFyVmFsdWUoKSA9PSAoKENoYXJhY3RlcikgYW5PYmplY3QpLmNoYXJWYWx1ZSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyIHZhbHVlCi0JICovCi0JcHVibGljIGNoYXIgY2hhclZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXJWYWx1ZS5jaGFyVmFsdWUoKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBqYXZhLmxhbmcuQ2hhcmFjdGVyIHZhbHVlCi0JICovCi0JcHVibGljIENoYXJhY3RlciBjaGFyYWN0ZXJWYWx1ZSgpIHsKLQkJcmV0dXJuIGZDaGFyVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSB0b1N0cmluZygpIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJcmV0dXJuIGZDaGFyVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJlYW50eXBlCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuY2hhcmFjdGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQkJdmFsdWUuc2V0KGZDaGFyVmFsdWUpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjYnl0ZVZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JCXJldHVybiAoYnl0ZSkgZkNoYXJWYWx1ZS5jaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjZG91YmxlVmFsdWUoKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNmbG9hdFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGZDaGFyVmFsdWUuY2hhclZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2ludFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGludFZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXJWYWx1ZS5jaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjbG9uZ1ZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNudW1iZXJWYWx1ZSgpCi0JICovCi0JcHVibGljIE51bWJlciBudW1iZXJWYWx1ZSgpIHsKLQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGNoYXJWYWx1ZSgpKTsgLy8gS2x1ZGdlLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNzaG9ydFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQkJcmV0dXJuIChzaG9ydCkgZkNoYXJWYWx1ZS5jaGFyVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmJjYjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0KLS8qKgotICogQ2hhcmFjdGVyIEJlYW5UeXBlIFByb3h5IGZvciBDaGFyYWN0ZXIuY2xhc3MuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi8yMy8wMCAxOjU5OjAyIFBNKQotICogQGF1dGhvcjogUmljaGFyZCBMZWUgS3VscAotICovCi1maW5hbCBjbGFzcyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHsKLQlmaW5hbCBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eSBuaWxQcm94eTsJLy8gVmFsdWUgb2YgJ1wwJwotCi1SRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBvYmplY3RUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5DSEFSQUNURVJfQ0xBU1MpLCBDaGFyYWN0ZXIuY2xhc3MuZ2V0TmFtZSgpLCBvYmplY3RUeXBlKTsKLQkKLQluaWxQcm94eSA9IG5ldyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBDaGFyYWN0ZXIoJ1wwJykpOwotfQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JQ2hhcmFjdGVyQmVhblByb3h5IGNyZWF0ZUNoYXJhY3RlckJlYW5Qcm94eShDaGFyYWN0ZXIgYUNoYXJhY3RlcikgewotCXJldHVybiAoYUNoYXJhY3Rlci5jaGFyVmFsdWUoKSAhPSAnXDAnKSA/Ci0JCW5ldyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFDaGFyYWN0ZXIpIDogbmlsUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLiBUaGV5IGFyZSBjcmVhdGVkCi0gKiBleHBsaWNpdGx5IHRocm91Z2ggdGhlIGFwcHJvcHJpYXRlIGNyZWF0ZSBtZXRob2QuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBDaGFyYWN0ZXIgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIG5pbFByb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbmlsUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KG5ldyBDaGFyYWN0ZXIodmFsdWUuYUNoYXIpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg5NjZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAkUkNTZmlsZTogUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eS5qYXZhLHYgJCAkUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUmVtb3RlIGltcGxlbWVudGF0aW9uIG9mIElDaGFyYWN0ZXJCZWFuUHJveHkuIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkgQGF1dGhvcjogSm9lCi0gKiBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElDaGFyYWN0ZXJCZWFuUHJveHkgewotCXByb3RlY3RlZCBjaGFyIGZDaGFyOwotCi0JUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIGNoYXIgdmFsdWUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5KTsKLQkJZkNoYXIgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBlcXVhbHM6IEVxdWFsIGlmOiAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdCAyKSBFbHNlIGlmIG90aGVyIGlzIGFuCi0JICogSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmIGVxdWFscyBvbiB0aGUgc2VydmVyLiAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQKLQkgKiBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50IHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksCi0JICogdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gSWRlbnRpdHkKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eSkKLQkJCXJldHVybiBmQ2hhciA9PSAoKFJFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5jaGFyVmFsdWUoKTsKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJcmV0dXJuIGZDaGFyID09ICgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQkJcmV0dXJuIHRydWU7IC8vIElkZW50aXR5Ci0JCWlmIChhQmVhblByb3h5IGluc3RhbmNlb2YgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eSkKLQkJCXJldHVybiBmQ2hhciA9PSAoKFJFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkpIGFCZWFuUHJveHkpLmNoYXJWYWx1ZSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyIHZhbHVlCi0JICovCi0JcHVibGljIGNoYXIgY2hhclZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgamF2YS5sYW5nLkNoYXJhY3RlciB2YWx1ZQotCSAqLwotCXB1YmxpYyBDaGFyYWN0ZXIgY2hhcmFjdGVyVmFsdWUoKSB7Ci0JCXJldHVybiBuZXcgQ2hhcmFjdGVyKGZDaGFyKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHRvU3RyaW5nKCkgb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZkNoYXIpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmVhbnR5cGUKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5jaGFyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZS5zZXQoZkNoYXIpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjYnl0ZVZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JCXJldHVybiAoYnl0ZSkgZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2RvdWJsZVZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2Zsb2F0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2ludFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGludFZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2xvbmdWYWx1ZSgpCi0JICovCi0JcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I251bWJlclZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCQlyZXR1cm4gbmV3IEludGVnZXIoZkNoYXIpOyAvLyBLbHVkZ2UKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjc2hvcnRWYWx1ZSgpCi0JICovCi0JcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JCXJldHVybiAoc2hvcnQpIGZDaGFyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTczMTBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUNoYXJhY3RlclR5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotCi0vKioKLSAqIENoYXJhY3Rlci5UWVBFIEJlYW5UeXBlIFByb3h5LgotICogQ3JlYXRpb24gZGF0ZTogKDIvMjMvMDAgMTo1OTowMiBQTSkKLSAqIEBhdXRob3I6IFJpY2hhcmQgTGVlIEt1bHAKLSAqLwotZmluYWwgY2xhc3MgUkVNQ2hhcmFjdGVyVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLQotCWZpbmFsIFJFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkgbmlsUHJveHk7CS8vIFZhbHVlIG9mICdcMCcKLS8qKgotICogUkVNQ2hhcmFjdGVyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNQ2hhcmFjdGVyVHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5DSEFSQUNURVJfVFlQRSksIENoYXJhY3Rlci5UWVBFLmdldE5hbWUoKSk7Ci0JCi0JbmlsUHJveHkgPSBuZXcgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksICdcMCcpOwotfQotCi0vKioKLSAqIFN0YXRpYyBoZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKiBVc2UgdGhlIGNhY2hlLgotICovCi1JQ2hhcmFjdGVyQmVhblByb3h5IGNyZWF0ZUNoYXJhY3RlckJlYW5Qcm94eShjaGFyIGFDaGFyYWN0ZXIpIHsKLQlyZXR1cm4gbmV3IFJFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhQ2hhcmFjdGVyKTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIENoYXJhY3RlciBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgbmlsUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiBuaWxQcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVDaGFyYWN0ZXJCZWFuUHJveHkodmFsdWUuYUNoYXIpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjgxOWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1DbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFRoaXMgaXMgYSBiZWFuIHR5cGUgZm9yIHRoZSBDbGFzcyBvYmplY3QuIEl0IGlzIG5lZWRlZCBzbyB0aGF0Ci0gKiB3aGVuIGEgbmV3IG9iamVjdCBpZCBjb21lcyBpbiB0aGF0IHJlcHJlc2VudHMgYSBjbGFzcywgaXQgd2lsbAotICogZ28gdGhyb3VnaCB0aGlzIGJlYW4gdHlwZSB0byBjcmVhdGUgaXQuIFdlIG5lZWQgdG8gZG8gc29tZXRoaW5nCi0gKiBzcGVjaWFsIHNvIHRoYXQgdGhlIGNvcnJlY3QgYmVhbiB0eXBlIG9iamVjdCBpcyBjcmVhdGVkLgotICovCi0KLWZpbmFsIGNsYXNzIFJFTUNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB7Ci0KLQotUkVNQ2xhc3NCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgb2JqZWN0VHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MpLCBDbGFzcy5jbGFzcy5nZXROYW1lKCksIG9iamVjdFR5cGUpOwotfQotCi0vKioKLSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgQ2xhc3MgYXJlIG5ldmVyIGRvbmUgdGhyb3VnaCBhIGRlZmF1bHQgY3RvciwKLSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7IAotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgQ2xhc3MgYXJlIG5ldmVyIGRvbmUgdGhyb3VnaCBhIGluaXRpYWxpemF0aW9uIHN0cmluZ3MsCi0gKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQkJCi0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBOT1RFOiBTaW5jZSB0aGUgQ2xhc3MgdHlwZSBpcyBmaW5hbCwgdGhpcyBmdW5jdGlvbiBpc24ndCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLSAqCi0gKiBJbiB0aGlzIGNhc2UgaXQgbWVhbnMgd2UgbmVlZCBhIG5ldyBJQmVhblByb3h5VHlwZS4gV2Ugd2lsbCBsZXQgdGhlIAotICogQmVhbnR5cGUgZmFjdG9yeSBoYW5kbGUgdGhpcyBzaW5jZSBpdCBrbm93cyBob3cgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbgotICogZm9yIGEgc3BlY2lmaWMgaWQuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuY3JlYXRlQmVhblR5cGVQcm94eShhbklEKTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk2ODA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUNvbm5lY3Rpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMjAgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbm5lY3Rpb24uCi0gKgotICogSXQgdXNlcyB0aGUgcHJvcGVydHkgInByb3h5dm0uYnVmc2l6ZSIgdG8gZGV0ZXJtaW5lIHRoZSBidWZmZXIgc2l6ZSB0byB1c2UuIElmIG5vdCBzcGVjaWZpZWQsIGl0IHVzZXMgdGhlIHN5c3RlbSBkZWZhdWx0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSRU1Db25uZWN0aW9uIGltcGxlbWVudHMgSVJFTUNvbm5lY3Rpb24sIElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiB7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5WT0tFX1NURVAgPSAiSW52b2tlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVk9LRV9NRVRIT0RfU1RFUCA9ICJJbnZva2UgTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTb2NrZXQgZlNvY2tldCA9IG51bGw7Ci0JcHJvdGVjdGVkIERhdGFJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JcHJvdGVjdGVkIERhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9PVVQgPSAxMDAwICogMzA7CS8vIFdhaXQgdXAgdG8gaGFsZiBtaW51dGUgYmVmb3JlIHRpbWVvdXQuCi0JCi0JcHVibGljIFJFTUNvbm5lY3Rpb24oU29ja2V0IHNvY2tldCwgYm9vbGVhbiBub1RpbWVvdXRzKSB7Ci0JCXRyeSB7Ci0JCQlmU29ja2V0ID0gc29ja2V0OwotCQkJZlNvY2tldC5zZXRTb0xpbmdlcih0cnVlLCAxMCk7CS8vIFdhaXQgMTAgc2Vjb25kcyBpZiBuZWNlc3NhcnkgZm9yIHRoZSBmaW5hbCBzdHVmZiB0byBnbyBvdXQgYWZ0ZXIgY2xvc2luZy4KLQkJCWlmICghbm9UaW1lb3V0cykKLQkJCQlmU29ja2V0LnNldFNvVGltZW91dChUSU1FX09VVCk7CS8vIFRpbWVvdXQgcGVyaW9kCi0JCQlJbnRlZ2VyIGJ1ZlNpemUgPSBJbnRlZ2VyLmdldEludGVnZXIoInByb3h5dm0uYnVmc2l6ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYnVmU2l6ZSA9PSBudWxsKQotCQkJCWJ1ZlNpemUgPSBuZXcgSW50ZWdlcigxNjAwMCk7Ci0JCQlvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZlNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgYnVmU2l6ZS5pbnRWYWx1ZSgpKSk7CS8vIEl0IGRpZG4ndCB0YWtlIHRoZSBoaW50LCBzbyB3ZSB3aWxsIGJ1ZmZlciBpdC4KLQkJCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmU29ja2V0LmdldElucHV0U3RyZWFtKCksIGJ1ZlNpemUuaW50VmFsdWUoKSkpOwkvLyBJdCBkaWRuJ3QgdGFrZSB0aGUgaGludCwgc28gd2Ugd2lsbCBidWZmZXIgaXQuCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCX0KLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTMpIHsKLQkJCQl9Ci0JCQl0cnkgewotCQkJCWZTb2NrZXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGU0KSB7Ci0JCQl9Ci0JCQlmU29ja2V0ID0gbnVsbDsKLQkJCWluID0gbnVsbDsKLQkJCW91dCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRGlkIHRoaXMgY29uc3RydWN0IGNvcnJlY3RseS4KLQkgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGFuIGV4Y2VwdGlvbiBjb3VsZCBiZSB0aHJvd24gaW4gdGhlIGN0b3IgYW5kCi0JICogdGhhdCdzIG5vdCBhIGdvb2QgdGhpbmcgdG8gZG8uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0JCXJldHVybiBmU29ja2V0ICE9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRlcm1pbmF0ZSB0aGUgc2VydmVyLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVTZXJ2ZXIoKSB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0cnkgewotCQkJCUNvbW1hbmRzLnNlbmRUZXJtaW5hdGVDb21tYW5kKG91dCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQljbG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIHRoZSBjb25uZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlpZiAoaXNDb25uZWN0ZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlDb21tYW5kcy5zZW5kUXVpdENvbW1hbmQob3V0KTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMykgewotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlmU29ja2V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTQpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlmU29ja2V0ID0gbnVsbDsKLQkJCWluID0gbnVsbDsKLQkJCW91dCA9IG51bGw7Ci0JCX0KLQl9Ci0JCQotCQkJCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGluZm9ybWF0aW9uLgotCSAqLwotCXB1YmxpYyBHZXRDbGFzc1JldHVybiBnZXRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJdHJ5IHsKLQkJCQkvLyBJdCdzIHNpbXBsZSwganVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQkJcmV0dXJuIENvbW1hbmRzLnNlbmRHZXRDbGFzc0NvbW1hbmQob3V0LCBpbiwgY2xhc3NOYW1lKTsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGUuZ2V0RXJyb3JDb2RlKCkgIT0gQ29tbWFuZHMuR0VUX0NMQVNTX05PVF9GT1VORCkKLQkJCQkJdGhyb3cgZTsJLy8gTm90IGNsYXNzIG5vdCBmb3VuZCwgc2VuZCBpdCBvbgotCQkJfQkJCQotCQlyZXR1cm4gbnVsbDsJLy8gTm90IGZvdW5kLCBzbyByZXR1cm4gbnVsbAkJCQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiBnaXZlbiBhbiBJRC4KLQkgKi8KLQlwdWJsaWMgR2V0Q2xhc3NJRFJldHVybiBnZXRDbGFzc0Zyb21JRChpbnQgY2xhc3NJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gSXQncyBzaW1wbGUsIGp1c3QgcGFzcyBvbnRvIENvbW1hbmRzLgotCQkJcmV0dXJuIENvbW1hbmRzLnNlbmRHZXRDbGFzc0Zyb21JRENvbW1hbmQob3V0LCBpbiwgY2xhc3NJRCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CS8vIE5vdCBmb3VuZCwgc28gcmV0dXJuIG51bGwJCQotCX0JCi0JCi0JLyoqCi0JICogR2V0IHRoZSBvYmplY3QgZGF0YSBmcm9tIGFuIGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldE9iamVjdERhdGEoaW50IGNsYXNzSUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlUmV0dXJuKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyBKdXN0IHBhc3Mgb250byBDb21tYW5kcy4KLQkJCUNvbW1hbmRzLnNlbmRHZXRPYmplY3REYXRhKG91dCwgaW4sIGNsYXNzSUQsIHZhbHVlUmV0dXJuKTsKLQkJfSBlbHNlCi0JCQl2YWx1ZVJldHVybi5zZXQoKTsJLy8gU2V0IGl0IHRvIG51bGwgc2luY2Ugd2UgYXJlbid0IGNvbm5lY3RlZC4KLQl9CQotCi0JLyoqCi0JICogR2V0IGEgbmV3IGluc3RhbmNlIHVzaW5nIGFuIGluaXQgc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgZ2V0TmV3SW5zdGFuY2UoaW50IGNsYXNzSUQsIFN0cmluZyBpbml0U3RyaW5nLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXdJbnN0YW5jZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gSnVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQlDb21tYW5kcy5zZW5kTmV3SW5zdGFuY2Uob3V0LCBpbiwgY2xhc3NJRCwgaW5pdFN0cmluZywgbmV3SW5zdGFuY2UpOwotCQl9IGVsc2UKLQkJCW5ld0luc3RhbmNlLnNldCgpOwkvLyBTZXQgaXQgdG8gbnVsbCBzaW5jZSB3ZSBhcmVuJ3QgY29ubmVjdGVkLgotCX0KLQkKLQkvKioKLQkgKiBSZWxlYXNlIHRoZSBpZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlSUQoaW50IGlkKXsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQl0cnkgewotCQkJCS8vIEp1c3QgcGFzcyBvbnRvIENvbW1hbmRzLgotCQkJCUNvbW1hbmRzLnJlbGVhc2VPYmplY3RDb21tYW5kKG91dCwgaWQpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIERvbid0IGNhcmUgaXQgZGlkbid0IHdvcmsKLQkJCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1Db25uZWN0aW9uI2dldEFycmF5Q29udGVudHMoaW50LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRBcnJheUNvbnRlbnRzKGludCBhcnJheUlELCBDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gSXQncyBzaW1wbGUsIGp1c3QgcGFzcyBvbnRvIENvbW1hbmRzLgotCQkJQ29tbWFuZHMuc2VuZEdldEFycmF5Q29udGVudHNDb21tYW5kKG91dCwgaW4sIGFycmF5SUQsIHJldHVyblZhbHVlKTsKLQkJfQkJCQotCX0KLQkKLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCBjYWxsCi0JICovCQotCXB1YmxpYyB2b2lkIGludm9rZU1ldGhvZChpbnQgbWV0aG9kSUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IGludm9rZU9uLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtcywgQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKLQkJCS8vIEl0J3Mgc2ltcGxlLCBqdXN0IHBhc3Mgb250byBDb21tYW5kcy4KLQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoSU5WT0tFX01FVEhPRF9TVEVQKTsKLQkJCUNvbW1hbmRzLnNlbmRJbnZva2VNZXRob2RDb21tYW5kKG91dCwgaW4sIG1ldGhvZElELCBpbnZva2VPbiwgcGFybXMsIHJldHVyblZhbHVlKTsKLQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChJTlZPS0VfTUVUSE9EX1NURVApOwotCQl9CQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUNvbm5lY3Rpb24jaW52b2tlTWV0aG9kKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnZva2VNZXRob2QoVmFsdWVPYmplY3QgY2xhc3NUeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgVmFsdWVPYmplY3QgcGFybVR5cGVzLCBWYWx1ZU9iamVjdCBpbnZva2VPbiwgVmFsdWVPYmplY3QgcGFybXMsCi0JCQlWYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gSXQncyBzaW1wbGUsIGp1c3QgcGFzcyBvbnRvIENvbW1hbmRzLgotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChJTlZPS0VfU1RFUCk7Ci0JCQlDb21tYW5kcy5zZW5kSW52b2tlTWV0aG9kQ29tbWFuZChvdXQsIGluLCBjbGFzc1R5cGUsIG1ldGhvZE5hbWUsIHBhcm1UeXBlcywgaW52b2tlT24sIHBhcm1zLCByZXR1cm5WYWx1ZSk7Ci0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoSU5WT0tFX1NURVApOwotCQl9CQkJCi0JfQotCQotCS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFB1dCB0aGUgRXhwcmVzc2lvbiBwcm9jZXNzaW5nIGNvbW1hbmRzIGhlcmUuCi0JICogCi0JICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uI3N0YXJ0RXhwcmVzc2lvblByb2Nlc3NpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RXhwcmVzc2lvblByb2Nlc3NpbmcoaW50IGV4cHJlc3Npb25JRCwgYnl0ZSB0cmFjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZFN0YXJ0RXhwcmVzc2lvblByb2Nlc3NpbmdDb21tYW5kKGV4cHJlc3Npb25JRCwgdHJhY2UsIG91dCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jcHVzaEV4cHJlc3Npb25Db21tYW5kKGJ5dGUpCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEV4cHJlc3Npb25Db21tYW5kKGludCBleHByZXNzaW9uSUQsIGJ5dGUgc3ViY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZEV4cHJlc3Npb25Db21tYW5kKGV4cHJlc3Npb25JRCwgb3V0LCBzdWJjb21tYW5kKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jc3RvcEV4cHJlc3Npb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wRXhwcmVzc2lvblByb2Nlc3NpbmcoaW50IGV4cHJlc3Npb25JRCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZEVuZEV4cHJlc3Npb25Qcm9jZXNzaW5nQ29tbWFuZChleHByZXNzaW9uSUQsIG91dCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jcHVzaFZhbHVlT2JqZWN0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hWYWx1ZU9iamVjdChWYWx1ZU9iamVjdCB2YWx1ZU9iamVjdCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUNvbW1hbmRzLndyaXRlVmFsdWUob3V0LCB2YWx1ZU9iamVjdCwgZmFsc2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uI3B1c2hCeXRlKGJ5dGUpCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEJ5dGUoYnl0ZSBhYnl0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZEJ5dGUob3V0LCBhYnl0ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jcHVzaEludChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEludChpbnQgYW5JbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJRXhwcmVzc2lvbkNvbW1hbmRzLnNlbmRJbnQob3V0LCBhbkludCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jcHVzaFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hTdHJpbmcoU3RyaW5nIGFTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJRXhwcmVzc2lvbkNvbW1hbmRzLnNlbmRTdHJpbmcob3V0LCBhU3RyaW5nKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdXNoQm9vbGVhbihib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hCb29sZWFuKGJvb2xlYW4gYUJvb2wpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJRXhwcmVzc2lvbkNvbW1hbmRzLnNlbmRCb29sZWFuKG91dCwgYUJvb2wpOwotCX0KLQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uI2dldEZpbmFsVmFsdWUob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RmluYWxWYWx1ZShWYWx1ZU9iamVjdCByZXN1bHQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlDb21tYW5kcy5yZWFkQmFja1ZhbHVlKGluLCByZXN1bHQsIENvbW1hbmRzLk5PX1RZUEVfQ0hFQ0spOwotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdWxsVmFsdWUoaW50LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWxsVmFsdWUoaW50IGV4cHJlc3Npb25JRCwgVmFsdWVPYmplY3QgcHJveHlpZHMsIFZhbHVlU2VuZGVyIHNlbmRlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kUHVsbFZhbHVlQ29tbWFuZChleHByZXNzaW9uSUQsIG91dCwgaW4sIHByb3h5aWRzLCBzZW5kZXIpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uI3N5bmMoaW50LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jKGludCBleHByZXNzaW9uSUQsIFZhbHVlT2JqZWN0IHByb3h5aWRzLCBWYWx1ZVNlbmRlciBzZW5kZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZFN5bmNDb21tYW5kKGV4cHJlc3Npb25JRCwgb3V0LCBpbiwgcHJveHlpZHMsIHNlbmRlcik7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQ29ubmVjdGlvbiNyZWFkUHJveHlBcnJheVZhbHVlcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVTZW5kZXIsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcmVhZFByb3h5QXJyYXlWYWx1ZXMoQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUsIENvbW1hbmRzLlZhbHVlU2VuZGVyIHZhbHVlU2VuZGVyLCBib29sZWFuIGFsbG93RmxhZykgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUNvbW1hbmRzLnJlYWRBcnJheShpbiwgcmV0dXJuVmFsdWUuYW5JbnQsIHZhbHVlU2VuZGVyLCByZXR1cm5WYWx1ZSwgYWxsb3dGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmFuc2ZlckV4cHJlc3Npb24oaW50IGV4cHJlc3Npb25JRCwgVmFsdWVPYmplY3QgZXhwQ29udHJvbGxlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kVHJhbnNmZXJFeHByZXNzaW9uQ29tbWFuZChleHByZXNzaW9uSUQsIG91dCwgaW4sIGV4cENvbnRyb2xsZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3VtZUV4cHJlc3Npb24oaW50IGV4cHJlc3Npb25JRCwgVmFsdWVPYmplY3QgZXhwQ29udHJvbGxlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kUmVzdW1lRXhwcmVzc2lvbkNvbW1hbmQoZXhwcmVzc2lvbklELCBvdXQsIGV4cENvbnRyb2xsZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZmNjdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29uc3RhbnRCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeTsKLS8qKgotICogVGhpcyBpcyBhIGJhc2UgZm9yIGJlYW4gcHJveGllcyB0aGF0IGFyZSBjb25zdGFudHMgYW5kCi0gKiBkbyBub3QgaGF2ZSBhbiBvYmplY3Qgb24gdGhlIHJlbW90ZSBWTSBzaWRlLiBUaGV5IGFyZQotICogc2hpcHBlZCBiYWNrIGFuZCBmb3J0aCBieSB2YWx1ZS4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuUHJveHkgewotCXByb3RlY3RlZCBmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIElEID0gbmV3IEludGVnZXIoQ29tbWFuZHMuTk9UX0FOX0lEKTsKLQkKLQlwcm90ZWN0ZWQgUkVNQ29uc3RhbnRCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYUZhY3RvcnkpIHsKLQkJZkZhY3RvcnkgPSBhRmFjdG9yeTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSByZWdpc3RyeSB0aGlzIHByb3h5IHdhcyBjcmVhdGVkIHdpdGguCi0JICovCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gZkZhY3Rvcnk7Ci0JfQotCQotCS8qKgotCSAqIGVxdWFsczogRXF1YWwgaWY6Ci0JICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotCSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLQkgKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotCSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLQkgKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLQkgKiBUaGlzIGlzIGFic3RyYWN0IGJlY2F1c2UgZWFjaCB0eXBlIG5lZWRzIHRvIGRvIGEgdW5pcXVlIHRlc3QgZm9yIGVxdWFsaXR5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCQkvLyBXZSBjYW4ndCBiZSBhc3N1cmVkIHRoYXQgdGhlcmUgYXJlIG5vdCBub24taWRlbnRpY2FsIGNvbnN0YW50cyB0aGF0IGFyZSBhY3R1YWxseSBpZGVudGljYWwuCi0JCS8vIFRoaXMgaXMgYmVjYXVzZSBmb3IgY29uc3RhbnRzIHdlIGRvIG5vdCBrbm93IHRoZSBpZCBvZiB0aGUgb3JpZ2luYWwuIFRoYXQgaXMgbm90IHNlbnQgYWNyb3NzIGZyb20gdGhlIHZtLgkJCi0JCXJldHVybiB0aGlzID09IGFCZWFuUHJveHk7CQotCX0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRCBvZiB0aGlzIHByb3h5LgotCSAqIENvbnN0YW50cyBoYXZlIG5vIGlkJ3MsIHNvIHdlIHJldHVybiAtMS4KLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQkKLQkvKioKLQkgKiBpc1ZhbGlkLiBDb25zdGFudCBvbmVzIGFyZSBhbHdheXMgdmFsaWQgdW5sZXNzIHRoZSByZWdpc3RyeSBpcyB0ZXJtaW5hdGVkLCBleGNlcHQgaWYgYW4KLQkgKiBvdmVycmlkZSByZWxlYXNlcyByZXNvdXJjZXMuIEluIHRoYXQgY2FzZSB0aGUgb3ZlcnJpZGluZwotCSAqIHN1YmNsYXNzIHNob3VsZCBhbHNvIG92ZXJyaWRlIGlzVmFsaWQoKSB0byByZXR1cm4gZmFsc2UKLQkgKiBpZiByZWxlYXNlKCkgd2FzIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gZkZhY3RvcnkuaXNWYWxpZCgpOwotCX0KLQkKLQkvKioKLQkgKiByZWxlYXNlLiBDb25zdGFudCBvbmVzIGRvbid0IG5lZWQgdG8gdHlwaWNhbGx5IGJlIHJlbGVhc2VkLCBob3dldmVyCi0JICogaWYgYW4gb3ZlcnJpZGUgZG9lcyBkbyBzb21ldGhpbmcgdG8gcmVsZWFzZSwgdGhlbiBpdCBNVVNUIGFsc28KLQkgKiBvdmVycmlkZSBpc1ZhbGlkKCkgdG8gcmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNCZWFuUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmVhblByb3h5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzRXhwcmVzc2lvblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0V4cHJlc3Npb25Qcm94eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29uc3RydWN0b3JQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdHJ1Y3RvclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODRhYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdHJ1Y3RvclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQ29uc3RydWN0b3JQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5UcmFuc21pdGFibGVBcnJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBQcm94eSBmb3IgYSBjb25zdHJ1Y3Rvci4KLSAqLwotCi1maW5hbCBjbGFzcyBSRU1Db25zdHJ1Y3RvclByb3h5IGV4dGVuZHMgUkVNQWNjZXNzaWJsZU9iamVjdFByb3h5IGltcGxlbWVudHMgSUNvbnN0cnVjdG9yUHJveHkgewotCi0JUkVNQ29uc3RydWN0b3JQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQpOwotCX0KLQotCS8qKgotCSAqIFVzaW5nIHRoaXMgY29uc3RydWN0b3IgKGFzc3VtaW5nIGl0IHRha2VzIG5vIGFyZ3VtZW50cykgY3JlYXRlIGEgbmV3IGluc3RhbmNlLgotCSAqIEV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBpZiB0aGlzIGNvbnN0cnVjdG9yIHRha2VzIGFyZ3VtZW50cy4KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBwcm94eSBpcyBjb25zdGFudCBwcm94eSBvdXQgb2YgdGhlIG1ldGhvZCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmN0b3JUeXBlOwotCX0KLQotCS8qKgotCSAqIFVzaW5nIHRoaXMgY29uc3RydWN0b3IgKHdpdGggdGhlIGFyZ3VtZW50cykgY3JlYXRlIGEgbmV3IGluc3RhbmNlLgotCSAqIEV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBpZiBhcmd1bWVudHMgZG9uJ3QgbWF0Y2ggdGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKElCZWFuUHJveHlbXSBjcmVhdGlvbkFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSVJFTU1ldGhvZFByb3h5IG5ld0luc3RhbmNlTWV0aG9kID0KLQkJCShJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0Q29uc3RydWN0b3JOZXdJbnN0YW5jZSgpOwotCi0JCS8vIENvbnN0cnVjdG9yLm5ld0luc3RhbmNlIHRha2VzIG9uZSBwYXJtIChPYmplY3RbXSkgd2hlcmUgWzBdIGlzIGFuIE9iamVjdFtdIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLgotCQlPYmplY3RbXSBwYXJtcyA9IG51bGw7Ci0JCWlmIChjcmVhdGlvbkFyZ3VtZW50cyAhPSBudWxsKQotCQkJcGFybXMgPSBuZXcgT2JqZWN0W10geyBuZXcgVHJhbnNtaXRhYmxlQXJyYXkoQ29tbWFuZHMuT0JKRUNUX0NMQVNTLCBjcmVhdGlvbkFyZ3VtZW50cyl9OwotCi0JCXJldHVybiBuZXdJbnN0YW5jZU1ldGhvZC5pbnZva2VXaXRoUGFybXModGhpcywgcGFybXMpOwotCX0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlmRmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7IC8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eVtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXdJbnN0YW5jZShhcmdzKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZkZhY3RvcnkucmVsZWFzZVByb3h5KGUpOyAvLyBTaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUJlYW5UeXBlUHJveHlbXSBmUGFyYW1ldGVyVHlwZXM7Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbnN0cnVjdG9yUHJveHkjZ2V0UGFyYW1ldGVyVHlwZXMoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUJlYW5UeXBlUHJveHlbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLQkJaWYgKGZQYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgcGFybVR5cGVzID0gKElBcnJheUJlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KQotCQkJCQkuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJUeXBlc01lc3NhZ2UoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcyk7Ci0JCQlpZiAocGFybVR5cGVzID09IG51bGwpCi0JCQkJZlBhcmFtZXRlclR5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5WzBdOyAvLyBUaGVyZSB3YXMgc29tZSBlcnJvciwgb25seSB3YXkgbnVsbCBpcyByZXR1cm5lZAotCQkJZWxzZSB7Ci0JCQkJaW50IGxlbiA9IHBhcm1UeXBlcy5nZXRMZW5ndGgoKTsKLQkJCQlmUGFyYW1ldGVyVHlwZXMgPSBuZXcgSUJlYW5UeXBlUHJveHlbbGVuXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJCQl0cnkgewotCQkJCQkJZlBhcmFtZXRlclR5cGVzW2ldID0gKElCZWFuVHlwZVByb3h5KSBwYXJtVHlwZXMuZ2V0KGkpOwotCQkJCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkJCX0KLQkJCQlmRmFjdG9yeS5yZWxlYXNlUHJveHkocGFybVR5cGVzKTsgLy8gRG9uJ3QgbmVlZCB0aGUgYXJyYXkgb24gdGhlIHNlcnZlciBhbnltb3JlLgotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZQYXJhbWV0ZXJUeXBlczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0cnVjdG9yVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0cnVjdG9yVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZWE3ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdHJ1Y3RvclR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQ29uc3RydWN0b3JUeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEJlYW5UeXBlIFByb3h5IGZvciBNZXRob2QgY2xhc3MuCi0gKi8KLQotZmluYWwgY2xhc3MgUkVNQ29uc3RydWN0b3JUeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgewotCi1SRU1Db25zdHJ1Y3RvclR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IGFjY2Vzc2libGVUeXBlUHJveHkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNPTlNUUlVDVE9SX0NMQVNTKSwgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBhY2Nlc3NpYmxlVHlwZVByb3h5KTsKLX0KLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIGFjY2Vzc2libGUgb2JqZWN0IHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogU3BlY2lhbGl6ZWQgZnJvbSBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIENvbnN0cnVjdG9yIHByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCXJldHVybiBuZXcgUkVNQ29uc3RydWN0b3JQcm94eShmUmVnaXN0cnksIG9iamVjdElEKTsKLX0KLQotLyoqCi0gKiBOb3RlOiBTaW5jZSBuZXcgaW5zdGFuY2VzIG9mIENvbnN0cnVjdG9yIGFyZSBuZXZlciBkb25lIHRocm91Z2ggYSBkZWZhdWx0IGN0b3IsCi0gKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgeyAKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBOb3RlOiBTaW5jZSBuZXcgaW5zdGFuY2VzIG9mIENvbnN0cnVjdG9yIGFyZSBuZXZlciBkb25lIHRocm91Z2ggYW4gaW5pdGlhbGl6YXRpb24gc3RyaW5nLAotICogdGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0JCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZUNsYXNzQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZUNsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyY2YyOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNRG91YmxlQ2xhc3NCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBQcm94eSBmb3IgRG91YmxlLmNsYXNzLgotICovCi1jbGFzcyBSRU1Eb3VibGVDbGFzc0JlYW5Qcm94eSBleHRlbmRzIFJFTU51bWJlckJlYW5Qcm94eSB7Ci0KLVJFTURvdWJsZUNsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgRG91YmxlIGFEb3VibGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFEb3VibGUpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5kb3VibGVDbGFzczsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoKERvdWJsZSkgbnVtYmVyVmFsdWUoKSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZGFlZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTURvdWJsZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBEb3VibGUuY2xhc3MuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTURvdWJsZUNsYXNzQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG51bWJlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkRPVUJMRV9DTEFTUyksIERvdWJsZS5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1Eb3VibGVDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBEb3VibGUoMEQpKTsJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZURvdWJsZUJlYW5Qcm94eShEb3VibGUgYURvdWJsZSkgewotCXJldHVybiAoYURvdWJsZS5kb3VibGVWYWx1ZSgpICE9IDBEKSA/Ci0JCW5ldyBSRU1Eb3VibGVDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFEb3VibGUpIDogemVyb1Byb3h5OwotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhbiBEb3VibGUgcHJveHksIGhvd2V2ZXIsIHRoZSBOdW1iZXIgbXVzdCBiZSBhIERvdWJsZS4KLSAqLwotcHJvdGVjdGVkIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlTnVtYmVyQmVhblByb3h5KE51bWJlciBhTnVtYmVyKSB7Ci0JcmV0dXJuIGNyZWF0ZURvdWJsZUJlYW5Qcm94eSgoRG91YmxlKSBhTnVtYmVyKTsKLX0JCi0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBOdW1iZXIncyBkb24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm8gcHJveHkgZm9yIHRoaXMgY2FzZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVEb3VibGVCZWFuUHJveHkobmV3IERvdWJsZSh2YWx1ZS5hRG91YmxlKSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVUeXBlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmNTIxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Eb3VibGVUeXBlQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSU51bWJlclByb3h5IGZvciB0aGUgcHJpbWl0aXZlICJkb3VibGUiLgotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotY2xhc3MgUkVNRG91YmxlVHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSU51bWJlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBkb3VibGUgZkRvdWJsZTsKLQotLyoqCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTURvdWJsZVR5cGVCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBkb3VibGUgYURvdWJsZSkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkRvdWJsZSA9IGFEb3VibGU7Ci19Ci0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBSRU1Eb3VibGVUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkRvdWJsZSA9PSAoKFJFTURvdWJsZVR5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5kb3VibGVWYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIERvdWJsZSkKLQkJcmV0dXJuIGZEb3VibGUgPT0gKChEb3VibGUpIGFuT2JqZWN0KS5kb3VibGVWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotICovCi1wdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JaWYgKHRoaXMgPT0gYUJlYW5Qcm94eSkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBSRU1Eb3VibGVUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkRvdWJsZSA9PSAoKFJFTURvdWJsZVR5cGVCZWFuUHJveHkpIGFCZWFuUHJveHkpLmRvdWJsZVZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIGJ5dGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewotCXJldHVybiAoYnl0ZSkgZkRvdWJsZTsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZEb3VibGU7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiAoZmxvYXQpIGZEb3VibGU7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgaW50IHZhbHVlCi0gKi8KLXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JcmV0dXJuIChpbnQpIGZEb3VibGU7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiAobG9uZykgZkRvdWJsZTsKLX0KLS8qKgotICogbnVtYmVyVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JcmV0dXJuIG5ldyBEb3VibGUoZkRvdWJsZSk7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiAoc2hvcnQpIGZEb3VibGU7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIFN0cmluZy52YWx1ZU9mKGZEb3VibGUpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5kb3VibGVUeXBlOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChmRG91YmxlKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYTgzZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNRG91YmxlVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgRG91YmxlLlRZUEUKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTURvdWJsZVR5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotLyoqCi0gKiBSRU1JbnRlZ2VyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNRG91YmxlVHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5ET1VCTEVfVFlQRSksIERvdWJsZS5UWVBFLmdldE5hbWUoKSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTURvdWJsZVR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAwRCk7CQkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlRG91YmxlQmVhblByb3h5KGRvdWJsZSBhRG91YmxlKSB7Ci0JcmV0dXJuIChhRG91YmxlICE9IDBEKSA/Ci0JCW5ldyBSRU1Eb3VibGVUeXBlQmVhblByb3h5KGZSZWdpc3RyeSwgYURvdWJsZSkgOiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBkb3VibGUgaXMgYSBwcmltaXRpdmUsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVyb1Byb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVEb3VibGVCZWFuUHJveHkodmFsdWUuYURvdWJsZSk7Ci19Ci0KLS8qKgotICogU2hvcnQgY3V0IGZvciBuZXdJbnN0YW5jZSB3aGVyZSB0aGUgc3RyaW5nIGZvbGxvd3MgdGhlCi0gKiBzcGVjaWZpYyBwYXR0ZXJuIHdlIGV4cGVjdC4gVGhhdCB3YXkgaXQgd29uJ3QgYmUgbmVjZXNzYXJ5IHRvIHNoaXAgb3ZlciB0byB0aGUgdm0gCi0gKiB0byBwcm9jZXNzIGl0LgotICoKLSAqIFRoZSBwYXR0ZXJuIGl0IGNhbiBhY2NlcHQgaXM6Ci0gKiAJMSkgKGRvdWJsZSkgdmFsaWROdW1iZXIgLSBudW1iZXIgY2FuIGJlIGFueSBudW1iZXIgYmVjYXVzZSAoZG91YmxlKSBleHBsaWNpdGx5IGNhc3RzIGl0IGRvd24uCi0gKgkyKSB2YWxpZE51bWJlcgotICogSXQgd2lsbCB1c2UgdGhlIGRlY29kZSBmdW5jdGlvbiBvZiBkb3VibGUgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCBudW1iZXIuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCVN0cmluZyB0cmltID0gaW5pdGlhbGl6YXRpb25TdHJpbmcudHJpbSgpOwotCWlmICh0cmltLmxlbmd0aCgpID09IDApCi0JCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CQotCWRvdWJsZSBhRG91YmxlOwotCWlmICh0cmltLnN0YXJ0c1dpdGgoIihkb3VibGUpIikpIHsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXIgdiA9IHBhcnNlU3RyaW5nKHRyaW0uc3Vic3RyaW5nKCIoZG91YmxlKSIubGVuZ3RoKCkpLnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHYgIT0gbnVsbCkKLQkJCWFEb3VibGUgPSB2LmRvdWJsZVZhbHVlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQl9IGVsc2UgewotCQl0cnkgewotCQkJYURvdWJsZSA9IERvdWJsZS52YWx1ZU9mKGluaXRpYWxpemF0aW9uU3RyaW5nKS5kb3VibGVWYWx1ZSgpOwkvLyBTZWUgaWYgdmFsaWQgZG91YmxlIGZvcm1hdC4KLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQkJfQotCX0KLQotCXJldHVybiBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGFEb3VibGUpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1FeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMmI5NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1FeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUV4cHJlc3Npb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTkgJCAgJERhdGU6IDIwMDUvMDkvMDcgMTQ6MDY6MDggJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLio7Ci0gCi0vKioKLSAqIFRoZSBSZW1vdGUgcHJveHkgdmVyc2lvbiBvZiBFeHByZXNzaW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFJFTUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQotCXByaXZhdGUgSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb247Ci0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZDsJLy8gQXJlIHdlIGNsb3NlZC4KLQkKLQlwcm90ZWN0ZWQgQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyVmFsdWU7CS8vIEEgd29ya2VyIG9iamVjdCBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8ga2VlcCBjcmVhdGluZyBvbmUgYW5kIHRocm93aW5nIGl0IGF3YXkuCi0JCi0JcHJvdGVjdGVkIE1hcCBiZWFuVHlwZUNhY2hlOwkvLyBVc2UgdG8gY2FjaGUgcGVuZGluZyBCZWFuVHlwZXMuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBSRU1TdGFuZGFyZEJlYW5UeXBlRmFjdG9yeS4KLQlwcm90ZWN0ZWQgTWFwIG1ldGhvZHNDYWNoZTsJLy8gVXNlIHRvIGNhY2hlIHBlbmRpbmcgZXhwcmVzc2lvbiBtZXRob2QgcHJveGllcy4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFJFTVByb3h5Q29uc2FudHMuCi0JcHJvdGVjdGVkIE1hcCBmaWVsZHNDYWNoZTsJLy8gVXNlIHRvIGNhY2hlIHBlbmRpbmcgZXhwcmVzc2lvbiBmaWVsZCBwcm94aWVzLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggUkVNUHJveHlDb25zYW50cy4KLQkKLQkvKgotCSAqIFRoaXMgaXMgdmVyeSBzcGVjaWFsIGxpc3QuIEl0IHRyaWVzIHRvIGVsaW1pbmF0ZSB1bm5lZWRlZCB0cmFmZmljLiBGb3IgZXhhbXBsZSBhIG1hcmsgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gZW5kbWFyayBkb2VzCi0JICogbm90IG5lZWQgdG8gYmUgc2VudC4gTWFueSBleHByZXNzaW9ucyBjYW4gbG9vayBsaWtlOiBtYXJrLCBlbmRtYXJrLCBlbmR0cmFuc2FjdGlvbi4gVGhpcyBpcyBhIGRvIG5vdGhpbmcgYW5kIHdlIGRvbid0IHdhbnQKLQkgKiB0byBjcmVhdGUgYSBjb25uZWN0aW9uIHRvIGp1c3Qgc2VuZCB0aGlzLiBTbyB0aGlzIGxpc3QgaXMgdXNlZCB0byBxdWV1ZSB1cCB0aGVzZSBhbmQgcmVtb3ZlIHRoZW0gdG9vIHdoZW4gZm91bmQgYXMgbm90IG5lZWRlZC4KLQkgKiAKLQkgKiAgSG93ZXZlciwgdGhpcyBpcyB2ZXJ5IHRyaWNreSBiZWNhdXNlIGFsbCBwdXNoVG9Qcm94eSB0cmFuc2FjdGlvbnMgdGhhdCBhY3R1YWxseSBkbyBzb21ldGhpbmcgTVVTVCBjYWxsIHRoZSBwcm9jZXNzUGVuZGluZygpIG1ldGhvZCAKLQkgKiAgZmlyc3QgdG8gbWFrZSBzdXJlIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBhcmUgc3VibWl0dGVkLiBCZWNhdXNlIG9uY2UgYSByZWFsIHR5cGUgdHJhbnNhY3Rpb24sIHN1Y2ggYXMgYXNzaWdubWVudCBvY2N1cnMsIGFueQotCSAqICBwZW5kaW5nIHRyYW5zYWN0aW9uIGlzIGEgdmFsaWQgdHJhbnNhY3Rpb24sIGFuZCBubyBsb25nZXIgYSBkby1ub3RoaW5nIHRyYW5zYWN0aW9uLgotCSAqICAKLQkgKiAgRWFjaCB0cmFuc2FjdGlvbiB0eXBlIHVzZXMgYSBzdWJjbGFzcyBvZiBQZW5kaW5nVHJhbnNhY3Rpb24gdG8gYmUgYW4gZW50cnkgb24gdGhlIGxpc3QuCi0JICogIAotCSAqICBUaGUgcGVuZGluZ3MgY3VycmVudGx5IHN1cHBvcnRlZCBhcmU6Ci0JICogIG1hcmsvZW5kbWFyawotCSAqICB0cnkvY2F0Y2gvZW5kdHJ5Ci0JICogIGJsb2NrL2VuZGJsb2NrCi0JICogIAotCSAqICBTZWUgZWFjaCBpbmRpdmlkdWFsIHRyYW5zYWN0aW9uIHR5cGUgdG8gc2VlIGhvdyBpdCBpcyBoYW5kbGVkLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IHBlbmRpbmdUcmFuc2FjdGlvbnM7Ci0JCi0JLyoqCi0JICogUGVuZGluZ1RyYW5zYWN0aW9uIGVudHJ5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUGVuZGluZ1RyYW5zYWN0aW9uIHsKLQkJCi0JCS8qKgotCQkgKiBUaGUgdHJhbnNhY3Rpb24gaXMgbm93IGJlaW5nIHB1c2hlZC4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZAotCQkgKiBhY3R1YWxseSBkbyB0aGUgcHVzaC4KLQkJICogCi0JCSAqIEBwYXJhbSByZW1FeHByZXNzaW9uIFRoZSBSRU1FeHByZXNzaW9uIGZvciB0aGlzIHRyYW5zYWN0aW9uLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXNoVHJhbnNhY3Rpb24oUkVNRXhwcmVzc2lvbiByZW1FeHByZXNzaW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFJFTUV4cHJlc3Npb24oUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJc3VwZXIocmVnaXN0cnkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gaWQgZm9yIHRoaXMgUkVNRXhwcmVzc2lvbi4gVGhpcyBpZCBpcyB1c2VkIG9uIHRoZSByZW1vdGUgdm0gdG8KLQkgKiBpZGVudGlmeSB3aG8gdGhlIHJlcXVlc3QgaXMgZm9yLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFJFTUV4cHJlc3Npb25JRCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzaENvZGUoKTsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBsaXN0LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQZW5kaW5nVHJhbnNhY3Rpb25zKCkgewotCQlpZiAocGVuZGluZ1RyYW5zYWN0aW9ucyA9PSBudWxsKQotCQkJcGVuZGluZ1RyYW5zYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHBlbmRpbmdUcmFuc2FjdGlvbnM7Ci0JfQotCQotCS8vIFVzZSB0aGlzIGZsYWcgd2hlbiBkZWJ1Z2dpbmcgdG8gdGVzdCBpZiBlcnJvcnMgYXJlIGR1ZSB0byBpbXByb3BlciBwZW5kaW5nIHByb2Nlc3NpbmcuCi0JLy8gSWYgdHJ1ZSB0aGV5IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBub3QgcGVuZGluZyBhbmQgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYRUNVVEVfUEVORElOR19JTU1FRElBVEVMWSA9IGZhbHNlOwotCXByb3RlY3RlZCB2b2lkIGFkZFBlbmRpbmdUcmFuc2FjdGlvbihQZW5kaW5nVHJhbnNhY3Rpb24gcGVuZGluZykgewotCQlpZiAoIUVYRUNVVEVfUEVORElOR19JTU1FRElBVEVMWSkKLQkJCWdldFBlbmRpbmdUcmFuc2FjdGlvbnMoKS5hZGQocGVuZGluZyk7Ci0JCWVsc2UKLQkJCXBlbmRpbmcucHVzaFRyYW5zYWN0aW9uKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZW50RGF0YTsJLy8gRmxhZyB0byBpbmRpY2F0ZSBpZiB3ZSBoYXZlIHNlbnQgYW55dGhpbmcgeWV0IHRvIHRoZSByZW1vdGUgdm0uIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHBlbmRpbmcgb3B0aW1pemF0aW9ucy4KLQkKLQkvKioKLQkgKiBIYXZlIHdlIHNlbnQgYW55IGRhdGEgaW4gdGhpcyB0cmFuc2FjdGlvbiB5ZXQuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhdmVTZW50RGF0YSgpIHsKLQkJcmV0dXJuIHNlbnREYXRhOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbm5lY3Rpb24uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAoIXNlbnREYXRhKQotCQkJCWdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKS5zdGFydFRyYW5zYWN0aW9uKCk7CS8vIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2Ugc2VuZCBkYXRhLCBzbyBzdGFydCB0cmFuc2FjdGlvbi4KLQkJCQotCQkJc2VudERhdGEgPSB0cnVlOwkvLyBJZiB3ZSBhcmUgZ2V0dGluZyBhIHRyYW5zYWN0aW9uLCB0aGF0IG1lYW5zIHdlIGFyZSBzZW5kaW5nIGRhdGEuCi0JCQljb25uZWN0aW9uID0gKElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbikgZ2V0UkVNUmVnaXN0cnkoKS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQkJLy8gVGhpcyB3aWxsIGFjdHVhbGx5IG5vdCBiZSBzdG9wcGVkIHVudGlsIGNsb3NlcHJveHkuIFRoZXJlIGNvdWxkIGJlIGEgc2xpZ2h0IHByb2JsZW0gaWYgdGhlIGV4cHJlc3Npb24gaXMgbmV2ZXIgY2xvc2VkLgotCQkJLy8gQnV0IHRoYXQgc2hvdWxkbid0IGhhcHBlbi4gVGhpcyBpcyB0byBwcmV2ZW50IGFueSBwcm94eSB0aGF0IHdhcyByZWxlYXNlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBidXQgd2FzIHVzZWQgYnkKLQkJCS8vIHRoZSBleHByZXNzaW9uIGZyb20gYmVpbmcgcmVsZWFzZWQgb24gdGhlIHJlbW90ZSB2bSB1bnRpbCBhZnRlciB0aGUgZXhwcmVzc2lvbiBpcyBmaW5pc2hlZC4KLQkJCXRyeSB7Ci0JCQkJaWYgKHdvcmtlclZhbHVlID09IG51bGwpCi0JCQkJCXdvcmtlclZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQkJaWYgKGV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyID09IG51bGwpIHsKLQkJCQkJYnl0ZSB0cmFjZSA9ICFpc1RyYWNlU2V0KCkgPyBFeHByZXNzaW9uQ29tbWFuZHMuVFJBQ0VfREVGQVVMVCA6IChpc1RyYWNlKCkgPyBFeHByZXNzaW9uQ29tbWFuZHMuVFJBQ0VfT04gOiBFeHByZXNzaW9uQ29tbWFuZHMuVFJBQ0VfT0ZGKTsgCi0JCQkJCWNvbm5lY3Rpb24uc3RhcnRFeHByZXNzaW9uUHJvY2Vzc2luZyhnZXRSRU1FeHByZXNzaW9uSUQoKSwgdHJhY2UpOwkvLyBJdCBpcyBhIG5ldyBleHByZXNzaW9uLgotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpbGxQcm94eShleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciwgd29ya2VyVmFsdWUpOwotCQkJCQljb25uZWN0aW9uLnJlc3VtZUV4cHJlc3Npb24oZ2V0UkVNRXhwcmVzc2lvbklEKCksIHdvcmtlclZhbHVlKTsKLQkJCQkJZXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgPSBudWxsOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCQljb25uZWN0aW9uID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCi0JCX0KLQkJcmV0dXJuIGNvbm5lY3Rpb247Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhbCBJT0V4Y2VwdGlvbiBvY2N1cnJlZCBtc2cuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU9fRVhDRVBUSU9OX01TRyA9IFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNRXhwcmVzc2lvbl9JT0V4Y2VwdGlvblNlZUxvZ19JTkZPXzsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9FWENFUFRJT05fTVNHID0gUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1FeHByZXNzaW9uX0NvbW1hbmRFeGNlcHRpb25TZWVMb2dfSU5GT187IAotCQotCS8qKgotCSAqIFRocm93IGFuIGFuIGlsbGVnYWwgc3RhdGUgZXhjZXB0aW9uIGlmIHNvbWUgZ2VuZXJhbCBlcnJvciwgaW4gcGFydGljdWxhciBhbiBJL08gb3IgQ29tbWFuZCBFeGNlcHRpb24KLQkgKiBvY2N1cnJlZCBzbyB0aGF0IGNhbGxlcnMga25vdyB0aGVyZSBpcyBzb21ldGhpbmcgd3JvbmcuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nIG1zZykgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obXNnKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWdpc3RyeSBhcyBhIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSRU1SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgcmVnaXN0cnk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYmVhbiBwcm94eSBmYWN0b3J5IGFzIGEgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBiZWFuUHJveHlGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgYW55IHBlbmRpbmcgdHJhbnNhY3Rpb25zLgotCSAqIDxwPgotCSAqIDxiPk5vdGU6IDwvYj5JdCBpcyByZXF1aXJlZCB0aGF0IGFsbCBub24tcGVuZGluZy1wYXJ0aWNpcGF0aW5nIHRyYW5zYWN0aW9ucyBtdXN0Ci0JICogY2FsbCB0aGlzIG1ldGhvZCBmaXJzdCB0byBtYWtlIHN1cmUgcGVuZGluZyB0cmFuc2FjdGlvbnMgYXJlIHNlbnQuIElmIHRoaXMgaXMKLQkgKiBub3QgZG9uZSwgdGhlcmUgd2lsbCBiZSBlcnJvcnMgaW4gdGhlIGV4cHJlc3Npb24uCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKSB7Ci0JCWlmIChwZW5kaW5nVHJhbnNhY3Rpb25zICE9IG51bGwgJiYgIXBlbmRpbmdUcmFuc2FjdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGVuZGluZ1RyYW5zYWN0aW9ucy5zaXplKCk7IGkrKykgewotCQkJCQkoKFBlbmRpbmdUcmFuc2FjdGlvbikgcGVuZGluZ1RyYW5zYWN0aW9ucy5nZXQoaSkpLnB1c2hUcmFuc2FjdGlvbih0aGlzKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXBlbmRpbmdUcmFuc2FjdGlvbnMuY2xlYXIoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHBlbmRpbmcgZW50cnkgZnJvbSB0b3AuIElmIHRvcCBpcyAxLCB0aGVuIGdldCB0b3AgZW50cnkgKGkuZS4gbGFzdCBvbmUgYWRkZWQpLCAyIGlzIG5leHQgb25lLiAKLQkgKiBAcGFyYW0gZnJvbVRvcAotCSAqIEByZXR1cm4gZW50cnkgcmVxdWVzdGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGVudHJ5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBQZW5kaW5nVHJhbnNhY3Rpb24gZ2V0UGVuZGluZ0VudHJ5RnJvbVRvcChpbnQgZnJvbVRvcCkgewotCQlpZiAocGVuZGluZ1RyYW5zYWN0aW9ucyAhPSBudWxsICYmIHBlbmRpbmdUcmFuc2FjdGlvbnMuc2l6ZSgpID49IGZyb21Ub3ApIHsKLQkJCXJldHVybiAoUGVuZGluZ1RyYW5zYWN0aW9uKSBwZW5kaW5nVHJhbnNhY3Rpb25zLmdldChwZW5kaW5nVHJhbnNhY3Rpb25zLnNpemUoKS1mcm9tVG9wKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUG9wIHVwIHRoZSB0b3AgZW50cnkgZnJvbSB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbnMgcXVldWUuCi0JICogQHBhcmFtIGZyb21Ub3AgaG93IG1hbnkgZW50cmllcyB0byBwb3AgZnJvbSB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbiBsaXN0LgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcFBlbmRpbmdFbnRyeShpbnQgZnJvbVRvcCkgewotCQlpZiAocGVuZGluZ1RyYW5zYWN0aW9ucyAhPSBudWxsKQotCQkJaWYgKHBlbmRpbmdUcmFuc2FjdGlvbnMuc2l6ZSgpID4gZnJvbVRvcCkgewotCQkJCXdoaWxlKGZyb21Ub3AtLSA+MCkKLQkJCQkJcGVuZGluZ1RyYW5zYWN0aW9ucy5yZW1vdmUocGVuZGluZ1RyYW5zYWN0aW9ucy5zaXplKCktMSk7Ci0JCQl9IGVsc2UKLQkJCQlwZW5kaW5nVHJhbnNhY3Rpb25zLmNsZWFyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUb1Byb3h5KElQcm94eSBwcm94eSkgewotCQlpZiAocHJveHkgPT0gbnVsbCB8fCBwcm94eS5pc0JlYW5Qcm94eSgpKQotCQkJcHVzaFRvUHJveHkoKElCZWFuUHJveHkpIHByb3h5KTsKLQkJZWxzZQotCQkJcHVzaFRvRXhwcmVzc2lvblByb3h5KChFeHByZXNzaW9uUHJveHkpIHByb3h5KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHB1c2hUb1Byb3h5KElCZWFuUHJveHkgcHJveHkpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCVZhbHVlT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIHByb3h5LgotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlBVU0hfVE9fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlpZiAocHJveHkgPT0gbnVsbCkKLQkJCQl3b3JrZXJWYWx1ZS5zZXQoKTsKLQkJCWVsc2UKLQkJCQkoKElSRU1CZWFuUHJveHkpIHByb3h5KS5yZW5kZXJCZWFuKHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNjbG9zZVByb3h5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVByb3h5KCkgewotCQlpZiAoIWNsb3NlZCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY29ubmVjdGlvbiAhPSBudWxsICYmIGNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJCWNvbm5lY3Rpb24uc3RvcEV4cHJlc3Npb25Qcm9jZXNzaW5nKGdldFJFTUV4cHJlc3Npb25JRCgpKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLklORk8pOwotCQkJCQkJLy8gTm90IHRocm93aW5nIGFuIGlsbGVnYWwgc3RhdGUgaGVyZSBiZWNhdXNlIHdlIGRvbid0IGNhcmUsIG90aGVyIHRoYW4gbG9nZ2luZyBhbmQgbm90IAotCQkJCQkJLy8gcmV0dXJuaW5nIHRoZSBjb25uZWN0aW9uIHRvIHRoZSByZWdpc3RyeSB0aGF0IHRoZXJlIHdhcyBhbiBlcnJvciBvbiBjbG9zZS4KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWdldFJFTVJlZ2lzdHJ5KCkucmV0dXJuQ29ubmVjdGlvbihjb25uZWN0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJY2xvc2VkID0gdHJ1ZTsKLQkJCQlpZiAoc2VudERhdGEpCi0JCQkJCWdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKS5zdG9wVHJhbnNhY3Rpb24oKTsJLy8gUmVzdW1lIHByb3h5IHJlbGVhc2VzLiBXZSd2ZSBzZW50IGRhdGEgYXQgbGVhc3Qgb25jZS4KLQkJCX0KLQkJfQotCQltZXRob2RzQ2FjaGUgPSBudWxsOwotCQlmaWVsZHNDYWNoZSA9IG51bGw7Ci0JCWJlYW5UeXBlQ2FjaGUgPSBudWxsOwotCQlwZW5kaW5nVHJhbnNhY3Rpb25zID0gbnVsbDsKLQkJY29ubmVjdGlvbiA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBWT0lEVFlQRSA9IG5ldyBPYmplY3QoKTsJLy8gQSB2b2lkIHR5cGUgd2FzIHNlbnQgaW4gZXhwcmVzc2lvbiBwcm94eSByZXNvbHV0aW9uLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBOT1RSRVNPTFZFRCA9IG5ldyBPYmplY3QoKTsJLy8gQSBub3QgcmVzb2x2ZWQgdHlwZSB3YXMgc2VudCBpbiBleHByZXNzaW9uIHByb3h5IHJlc29sdXRpb24uCi0JCi0JLyoKLQkgKiBHZXQgdGhlIHNlbmRlciB0byB1c2UgZm9yIHB1bGxpbmcgdGhlIGV4cHJlc3Npb24gcHJveHkgcmVzb2x1dGlvbnMuCi0JICovCi0JcHJpdmF0ZSBCZWFuUHJveHlWYWx1ZVNlbmRlciBnZXRFeHByZXNzaW9uUHJveGllc1NlbmRlcigpIHsKLQkJcmV0dXJuIG5ldyBCZWFuUHJveHlWYWx1ZVNlbmRlcihnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLkJlYW5Qcm94eVZhbHVlU2VuZGVyI3NlbmRWYWx1ZShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc2VuZFZhbHVlKFZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmdldFR5cGUoKSA9PSBDb21tYW5kcy5GTEFHKSB7Ci0JCQkJCXN3aXRjaCAodmFsdWUuYW5JbnQpIHsKLQkJCQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05QUk9YWV9OT1RSRVNPTFZFRDoKLQkJCQkJCQlhcnJheVtpbmRleCsrXSA9IE5PVFJFU09MVkVEOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTlBST1hZX1ZPSURUWVBFOgotCQkJCQkJCWFycmF5W2luZGV4KytdID0gVk9JRFRZUEU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCS8vIFNob3VsZG4ndCBoYXBwZW4uCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJc3VwZXIuc2VuZFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCQotCS8qCi0JICogUHJvY2VzcyB0aGUgcHVsbGVkIGV4cHJlc3Npb24gcHJveHkgcmVzb2x1dGlvbnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NwdWxsZWRFeHByZXNzaW9uUHJveGllcyhMaXN0IGV4cHJlc3Npb25Qcm94aWVzLCBCZWFuUHJveHlWYWx1ZVNlbmRlciBzZW5kZXIpIHsKLQotCQkvLyBJdCBpcyBleHBlY3RlZCB0aGF0IGVhY2ggZW50cnkgd2lsbCBjb29yZXNwb25kIHRvIHRoZSBuZXh0IG5vbi1udWxsIGV4cHJlc3Npb24gcHJveHkgYW5kIHdpbGwgYmUgdGhlIGJlYW4gcHJveHkgb3Igb25lIG9mIHRoZSBzcGVjaWFsCi0JCS8vIHR5cGVzLgotCQlpbnQgbGVuID0gZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpOwotCQlpbnQgaiA9IDA7Ci0JCU9iamVjdFtdIHJlc29sdmVkcyA9IHNlbmRlci5nZXRBcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlFeHByZXNzaW9uUHJveHkgZXAgPSAoRXhwcmVzc2lvblByb3h5KSBleHByZXNzaW9uUHJveGllcy5nZXQoaSk7Ci0JCQlpZiAoZXAgIT0gbnVsbCkgewotCQkJCU9iamVjdCByZXNvbHZlZCA9IHJlc29sdmVkc1tqKytdOwotCQkJCWlmIChyZXNvbHZlZCA9PSBOT1RSRVNPTFZFRCkKLQkJCQkJZmlyZVByb3h5Tm90UmVzb2x2ZWQoZXApOwotCQkJCWVsc2UgaWYgKHJlc29sdmVkID09IFZPSURUWVBFKQotCQkJCQlmaXJlUHJveHlWb2lkKGVwKTsKLQkJCQllbHNlCi0JCQkJCWZpcmVQcm94eVJlc29sdmVkKGVwLCAoSUJlYW5Qcm94eSkgcmVzb2x2ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1bGxQcm94eVZhbHVlKGludCwgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIElCZWFuUHJveHkgcHVsbFByb3h5VmFsdWUoaW50IHByb3h5Y291bnQsIExpc3QgZXhwcmVzc2lvblByb3hpZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlpZiAoIWhhdmVTZW50RGF0YSgpKSB7Ci0JCQltYXJrQWxsUHJveGllc05vdFJlc29sdmVkKGV4cHJlc3Npb25Qcm94aWVzKTsKLQkJCXJldHVybiBudWxsOwkvLyBXZSBoYXZlbid0IHB1c2hlZCBhbnkgY29tbWFuZHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uIERvbid0IGNyZWF0ZSBhIGNvbm5lY3Rpb24gZm9yIHRoaXMuCi0JCX0KLQkJLy8gSWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBhdCB0aGlzIHBvaW50IGluIHRpbWUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCB0aGVtLiBUaGV5IHdvdWxkIGJlIGRvIG5vdGhpbmdzIGFueXdheS4KLQkJCi0JCWJvb2xlYW4gcHJvY2Vzc2VkRXhwcmVzc2lvblByb3hpZXMgPSBmYWxzZTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGxjbENvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCW1hcmtJblRyYW5zYWN0aW9uKGxjbENvbm5lY3Rpb24pOwotCQl0cnkgewotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcHJveHlpZHMgPSBudWxsOwotCQkJQmVhblByb3h5VmFsdWVTZW5kZXIgc2VuZGVyID0gbnVsbDsKLQkJCWlmIChwcm94eWNvdW50ID4gMCkgewotCQkJCXByb3h5aWRzID0gY3JlYXRlRXhwcmVzc2lvblByb3hpZXNWYWx1ZU9iamVjdChwcm94eWNvdW50LCBleHByZXNzaW9uUHJveGllcyk7Ci0JCQkJc2VuZGVyID0gZ2V0RXhwcmVzc2lvblByb3hpZXNTZW5kZXIoKTsKLQkJCX0KLQkJCQotCQkJbGNsQ29ubmVjdGlvbi5wdWxsVmFsdWUoZ2V0UkVNRXhwcmVzc2lvbklEKCksIHByb3h5aWRzLCBzZW5kZXIpOwotCQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyLCB0aGVuIGlmIHRoZXJlIGFyZSBwcm94aWVzLCB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlc2UgdG9vLgotCQkJaWYgKHByb3h5Y291bnQgPiAwKQotCQkJCXByb2Nlc3NwdWxsZWRFeHByZXNzaW9uUHJveGllcyhleHByZXNzaW9uUHJveGllcywgc2VuZGVyKTsKLQkJCXByb2Nlc3NlZEV4cHJlc3Npb25Qcm94aWVzID10cnVlOwotCQkJbGNsQ29ubmVjdGlvbi5nZXRGaW5hbFZhbHVlKHdvcmtlclZhbHVlKTsJLy8gR2V0IHRoZSByZXR1cm5lZCB2YWx1ZS4KLQkJCXJldHVybiBnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkuZ2V0QmVhblByb3h5KHdvcmtlclZhbHVlKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGUuZ2V0RXJyb3JDb2RlKCkgPT0gRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05fTk9FWFBSRVNTSU9OVkFMVUVfRVhDRVBUSU9OKSB7Ci0JCQkJCS8vIE5lZWQgdG8gdHVybiBpdCBpbnRvIGEgVGhyb3dhYmxlLgotCQkJCQlUaHJvd2FibGVQcm94eSB0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKS5nZXRCZWFuUHJveHkoZS5nZXRWYWx1ZSgpKTsJLy8gVGhpcyB3aWxsIGNhdXNlIGEgdGhyb3cgdG8gb2NjdXIsIGJ1dCB3ZSBkb24ndCB3YW50IGl0IGdvaW5nIG91dCwgd2Ugd2FudCB0byBjYXB0dXJlIGl0LgotCQkJCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlMSkgewotCQkJCQkJdCA9IGUxOwotCQkJCQl9Ci0JCQkJCXRocm93IG5ldyBSRU1Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbih0KTsKLQkJCQl9Ci0JCQkJZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpLnByb2Nlc3NFcnJvclJldHVybihlKTsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZTEpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQlsY2xDb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQkJfQkJCQotCQkJfQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQlsY2xDb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCW1hcmtFbmRUcmFuc2FjdGlvbihsY2xDb25uZWN0aW9uKTsKLQkJCWlmICghcHJvY2Vzc2VkRXhwcmVzc2lvblByb3hpZXMpCi0JCQkJbWFya0FsbFByb3hpZXNOb3RSZXNvbHZlZChleHByZXNzaW9uUHJveGllcyk7CS8vIFdlIGZhaWxlZCBiZWZvcmUgd2UgY291bGQgcHJvY2VzcyB0aGUgZXhwcmVzc2lvbiBwcm94aWVzLiBTbyBtYXJrIGFsbCBhcyBub3QgcmVzb2x2ZWQuCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IGNvbW1hbmRzIHRoYXQgd3JpdGUgc29tZSBkYXRhIGFuZCB3aWxsIGJlIHJlYWRpbmcgZGF0YSBiYWNrIGltbWVkaWF0ZWx5IAotCSAqIChpLmUuIHB1bGwgdmFsdWUgYW5kIGludm9rZSBleHByZXNzaW9uKS4gSWYgd2UgYXJlIG9uIGEgY2FsbGJhY2sgdGhyZWFkIGFuZCBoYXZlIHRoZSAKLQkgKiB1c2VkIHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIGNhbGxiYWNrIHRocmVhZCwgd2UgbmVlZCB0byB0ZWxsIHRoZSBjYWxsYmFjayB0aHJlYWQgdGhhdAotCSAqIGl0IGlzIGluIGEgdHJhbnNhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2hpbGUgcmVhZGluZyBkYXRhIGJhY2sgdGhlcmUgYXJlCi0JICogc29tZXRpbWVzIGNhbGxzIGJhY2sgdG8gdGhlIHZtIHRvIGdldCBiZWFudHlwZSBkYXRhIGZvciBuZXcgY2xhc3Nlcy4gVGhpcyB3b3VsZCAKLQkgKiBub3JtYWxseSBiZSB0aHJvdWdoIGEgbmV3IGNvbm5lY3Rpb24gc28gdGhhdCBpdCBkb2Vzbid0IGdldCBzdHVjayBpbiB0aGUgbWlkZGxlIG9mIHRoZQotCSAqIGRhdGEgYmVpbmcgc2VudCBiYWNrLiBCdXQgd2hlbiBydW5uaW5nIG9uIGEgY2FsbGJhY2sgdGhlIHNhbWUgY29ubmVjdGlvbiBpcyB1c2VkLiBTbyBpdAotCSAqIHdvdWxkIHN0aWNrIGRhdGEgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmV0dXJuIHN0cmVhbSBvZiBkYXRhLiBUbyBwcmV2ZW50IHRoaXMgd2UgbmVlZAotCSAqIHRvIHRlbGwgdGhlIGNhbGxiYWNrIHRocmVhZCB0aGF0IGl0IGlzIGluIGEgdHJhbnNhY3Rpb24gZHVyaW5nIHRoaXMgY2FsbCBzbyB0aGF0IGFueQotCSAqIHN1Y2ggbmV3IGNvbm5lY3Rpb24gcmVxdWVzdHMgd2lsbCBnZXQgYSBuZXcgY29ubmVjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5vdCBuZXN0YWJsZSAoaS5lLiB0aGUgZmlyc3QgbWFya0VuZFRyYW5zYWN0aW9uIHdpbGwgc2V0IGl0IGZhbHNlLCBldmVuIGlmIHNldmVyYWwgbmVzdGVkCi0JICogbWFya0luVHJhbnNhY3Rpb25zIGFyZSBjYWxsZWQpLgotCSAqIDxwPgotCSAqIG1hcmtFbmRUcmFuc2FjdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiBBTEwgY2FzZXMsIHN1Y2ggdXNlIHRyeS9maW5hbGx5LgotCSAqIEBwYXJhbSByZW1Db25uZWN0aW9uIHRoZSBjb25uZWN0aW9uIHRvIHNlZSBjaGVjayBhZ2FpbnN0IGFuZCBtYXJrIGluIHRyYW5zYWN0aW9uIGZvci4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYXJrSW5UcmFuc2FjdGlvbihJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gcmVtQ29ubmVjdGlvbikgewotCQlUaHJlYWQgdGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQkJaWYgKHRocmVhZCBpbnN0YW5jZW9mIFJFTUNhbGxiYWNrVGhyZWFkKSB7Ci0JCQkvLyBXZSBhcmUgaW4gYSBjYWxsYmFjaywgYW5kIHRoZSBjYWxsYmFjayBjb25uZWN0aW9uIGlzIG91ciBjb25uZWN0aW9uLCB0ZWxsIHRoZSBjYWxsYmFjayB0aGF0IGl0IGlzIGluIHRyYW5zYWN0aW9uLgotCQkJUkVNQ2FsbGJhY2tUaHJlYWQgY2FsbGJhY2tUaHJlYWQgPSAoUkVNQ2FsbGJhY2tUaHJlYWQpIHRocmVhZDsKLQkJCWlmIChjYWxsYmFja1RocmVhZC5nZXRDb25uZWN0aW9uKCkgPT0gcmVtQ29ubmVjdGlvbikgewotCQkJCWNhbGxiYWNrVGhyZWFkLnNldEludHJhbnNhY3Rpb24odHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTWFyayBlbmQgb2YgdHJhbnNhY3Rpb24uCi0JICogQHBhcmFtIHJlbUNvbm4gUkVNQ29ubmVjdGlvbiB0byB0ZXN0IGFuZCBtYXJrIG5vdCBpbiBjb25uZWN0aW9uIGZvci4KLQkgKiAKLQkgKiBAc2VlIFJFTUV4cHJlc3Npb24jbWFya0luVHJhbnNhY3Rpb24oSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uKQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1hcmtFbmRUcmFuc2FjdGlvbihJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gcmVtQ29ubikgewotCQlUaHJlYWQgdGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQkJaWYgKHRocmVhZCBpbnN0YW5jZW9mIFJFTUNhbGxiYWNrVGhyZWFkKSB7Ci0JCQkvLyBXZSBhcmUgaW4gYSBjYWxsYmFjaywgYW5kIHRoZSBjYWxsYmFjayBjb25uZWN0aW9uIGlzIG91ciBjb25uZWN0aW9uLCB0ZWxsIHRoZSBjYWxsYmFjayB0aGF0IGl0IGlzIGluIHRyYW5zYWN0aW9uLgotCQkJUkVNQ2FsbGJhY2tUaHJlYWQgY2FsbGJhY2tUaHJlYWQgPSAoUkVNQ2FsbGJhY2tUaHJlYWQpIHRocmVhZDsKLQkJCWlmIChjYWxsYmFja1RocmVhZC5nZXRDb25uZWN0aW9uKCkgPT0gcmVtQ29ubikgewotCQkJCWNhbGxiYWNrVGhyZWFkLnNldEludHJhbnNhY3Rpb24oZmFsc2UpOwotCQkJfQotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhwcmVzc2lvblByb3hpZXMKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIENvbW1hbmRzLlZhbHVlT2JqZWN0IGNyZWF0ZUV4cHJlc3Npb25Qcm94aWVzVmFsdWVPYmplY3QoaW50IGFjdHVhbENvdW50LCBMaXN0IGV4cHJlc3Npb25Qcm94aWVzKSB7Ci0JCWNsYXNzIEV4cHJlc3Npb25Qcm94eVJldHJpZXZlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlUmV0cmlldmUgewotCQkJSXRlcmF0b3IgZXhwcmVzc2lvblByb3hpZXNJdHI7Ci0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQotCQkJcHVibGljIEV4cHJlc3Npb25Qcm94eVJldHJpZXZlcihMaXN0IGV4cHJlc3Npb25Qcm94aWVzKSB7Ci0JCQkJdGhpcy5leHByZXNzaW9uUHJveGllc0l0ciA9IGV4cHJlc3Npb25Qcm94aWVzLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQkJd29ya2VyLnNldCgtMSk7Ci0JCQkJd2hpbGUgKGV4cHJlc3Npb25Qcm94aWVzSXRyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgcGFybSA9IGV4cHJlc3Npb25Qcm94aWVzSXRyLm5leHQoKTsKLQkJCQkJaWYgKHBhcm0gIT0gbnVsbCkgewotCQkJCQkJd29ya2VyLnNldCgoKEV4cHJlc3Npb25Qcm94eSkgcGFybSkuZ2V0UHJveHlJRCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQlyZXR1cm4gd29ya2VyOwotCQkJfQotCQl9OwotCi0JCXdvcmtlclZhbHVlLnNldEFycmF5SURTKG5ldyBFeHByZXNzaW9uUHJveHlSZXRyaWV2ZXIoZXhwcmVzc2lvblByb3hpZXMpLCBhY3R1YWxDb3VudCwgQ29tbWFuZHMuSU5UKTsKLQkJcmV0dXJuIHdvcmtlclZhbHVlOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaENhc3RUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hDYXN0VG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggY2FzdCB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggY2FzdCB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQ0FTVF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWZpbGxQcm94eSh0eXBlLCB3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsJCQkKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1c2ggdGhlIHByb3h5IGJlYW4gdHlwZSBpbiB0aGUgZm9ybWF0IGRlcGVuZGluZyBvbiBleHByZXNzaW9uIHByb3h5IG9yIGJlYW50eXBlIHByb3h5LgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxQcm94eShJUHJveHkgdHlwZSwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vCQlWYWx1ZU9iamVjdCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgaWYgSUJlYW5UeXBlUHJveHkgb3IgaW50IChmb3IgZXhwcmVzc2lvbiBwcm94eSBpZCkgaWYgZXhwcmVzc2lvbiBwcm94eS4KLQkJaWYgKHR5cGUuaXNCZWFuUHJveHkoKSkgewotCQkJKChJUkVNQmVhblByb3h5KSB0eXBlKS5yZW5kZXJCZWFuKHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCUV4cHJlc3Npb25Qcm94eSBlcCA9IChFeHByZXNzaW9uUHJveHkpIHR5cGU7Ci0JCQl2YWx1ZS5zZXQoZXAuZ2V0UHJveHlJRCgpKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJbnN0YW5jZW9mVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSW5zdGFuY2VvZlRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGluc3RhbmNlb2YgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGluc3RhbmNlb2YgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCVZhbHVlT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBvciB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiBjbGFzcy4KLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTlNUQU5DRU9GX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJZmlsbFByb3h5KHR5cGUsIHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSW5maXhUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW5maXhPcGVyYXRvciwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJbmZpeFRvUHJveHkoSW5maXhPcGVyYXRvciBvcGVyYXRvciwgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIG9wZXJhbmRUeXBlKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggaW5maXggdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGluZml4IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlieXRlOiBvcGVyYXRvcgotCQkJLy8JCWJ5dGU6IG9wZXJhbmRUeXBlCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSU5GSVhfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hCeXRlKChieXRlKSBvcGVyYXRvci5nZXRWYWx1ZSgpKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEJ5dGUoKGJ5dGUpIG9wZXJhbmRUeXBlLmdldFZhbHVlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQkJCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoUHJlZml4VG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLlByZWZpeE9wZXJhdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hQcmVmaXhUb1Byb3h5KFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggcHJlZml4IHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBwcmVmaXggdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWJ5dGU6IG9wZXJhdG9yCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFJFRklYX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoQnl0ZSgoYnl0ZSkgb3BlcmF0b3IuZ2V0VmFsdWUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQXJyYXlBY2Nlc3NUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXJyYXlBY2Nlc3NUb1Byb3h5KGludCBpbmRleENvdW50KSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggYXJyYXkgYWNjZXNzIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBhcnJheSBhY2NlcyB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJaW50OiBpbmRleENvdW50Ci0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfQUNDRVNTX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KGluZGV4Q291bnQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEFycmF5Q3JlYXRpb25Ub1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFycmF5Q3JlYXRpb25Ub1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBkaW1lbnNpb25Db3VudCkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGFycmF5IGNyZWF0aW9uIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBhcnJheSBjcmVhdGlvbiB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJVmFsdWVPYmplY3QgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IG9yIHRoZSBleHByZXNzaW9uIHByb3h5LgotCQkJLy8JCWludDogZGltZW5zaW9uIGNvdW50Ci0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlmaWxsUHJveHkodHlwZSwgd29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KGRpbWVuc2lvbkNvdW50KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFycmF5SW5pdGlhbGl6ZXJUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBzdHJpcENvdW50LCBpbnQgZXhwcmVzc2lvbkNvdW50KSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggYXJyYXkgaW5pdGlhbGl6ZXIgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGFycmF5IGluaXRpYWxpemVyIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlWYWx1ZU9iamVjdCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgb3IgZXhwcmVzc2lvbiBwcm94eS4KLQkJCS8vCQlpbnQ6IHN0cmlwIGNvdW50Ci0JCQkvLwkJaW50OiBleHByZXNzaW9uIGNvdW50Ci0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfSU5JVElBTElaRVJfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlmaWxsUHJveHkodHlwZSwgd29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KHN0cmlwQ291bnQpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KGV4cHJlc3Npb25Db3VudCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvblRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgYXJndW1lbnRDb3VudCkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJVmFsdWVPYmplY3QgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IG9yIHRoZSBleHByZXNzaW9uIHByb3h5Ci0JCQkvLwkJaW50OiBhcmd1bWVudCBjb3VudAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkNMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJZmlsbFByb3h5KHR5cGUsIHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChhcmd1bWVudENvdW50KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHlwZVJlY2VpdmVyVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8gCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFR5cGVSZWNlaXZlclRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHR5cGUgcmVjZWl2ZXIgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHR5cGUgcmVjZWl2ZXIgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCVZhbHVlT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBvciB0aGUgZXhwcmVzc2lvbiBwcm94eS4KLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UWVBFUkVDRUlWRVJfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlmaWxsUHJveHkodHlwZSwgd29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hGaWVsZEFjY2Vzc1RvUHJveHkoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoRmllbGRBY2Nlc3NUb1Byb3h5KE9iamVjdCBmaWVsZCwgYm9vbGVhbiBoYXNSZWNlaXZlcikgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGZpZWxkIGFjY2VzcyB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggZmllbGQgYWNjZXNzIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlDb21tYW5kcy5WYWx1ZTogZmllbGROYW1lIG9yIElQcm94eUZpZWxkCi0JCQkvLwkJYm9vbGVhbjogaGFzUmVjZWl2ZXIKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5GSUVMRF9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlpZiAoZmllbGQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQl3b3JrZXJWYWx1ZS5zZXQoKFN0cmluZykgZmllbGQpOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxsUHJveHkoKElQcm94eSkgZmllbGQsIHdvcmtlclZhbHVlKTsKLQkJCX0KLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEJvb2xlYW4oaGFzUmVjZWl2ZXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hNZXRob2RJbnZvY2F0aW9uVG9Qcm94eShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaE1ldGhvZEludm9jYXRpb25Ub1Byb3h5KE9iamVjdCBtZXRob2QsIGJvb2xlYW4gaGFzUmVjZWl2ZXIsIGludCBhcmdDb3VudCkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIG1ldGhvZCBpbnZvY2F0aW9uIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBtZXRob2QgaW52b2NhdGlvbiB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJQ29tbWFuZHMuVmFsdWVPYmplY3Q6IG1ldGhvZE5hbWUgb3IgSU1ldGhvZFByb3h5Ci0JCQkvLwkJYm9vbGVhbjogaGFzUmVjZWl2ZXIKLQkJCS8vCQlpbnQ6IGFyZ0NvdW50Ci0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuTUVUSE9EX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJaWYgKG1ldGhvZCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCXdvcmtlclZhbHVlLnNldCgoU3RyaW5nKSBtZXRob2QpOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxsUHJveHkoKElQcm94eSkgbWV0aG9kLCB3b3JrZXJWYWx1ZSk7Ci0JCQl9Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hCb29sZWFuKGhhc1JlY2VpdmVyKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChhcmdDb3VudCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaENvbmRpdGlvbmFsVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENvbmRpdGlvbmFsVG9Qcm94eShJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUgZXhwcmVzc2lvblR5cGUpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBjb25kaXRpb25hbCB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggY29uZGl0aW9uYWwgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWJ5dGU6IGV4cHJlc3Npb24gdHlwZQotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkNPTkRJVElPTkFMX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoQnl0ZSgoYnl0ZSkgZXhwcmVzc2lvblR5cGUuZ2V0VmFsdWUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBBIHNwZWNpYWwgb25lIHRoYXQgdGFrZXMgdGhlIFRocm93YWJsZVByb3h5IGZvciBubyBleHByZXNzaW9uIHZhbHVlIGFuZCAKLQkgKiB3cmFwcGVycyBpdCBwcmludHMgaXRzIHN0YWNrIHRyYWNlIGluc3RlYWQsIGJ1dCBzdGlsbCBtYWtlcyBpdCBhIHN1YmNsYXNzCi0JICogb2YgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUkVNTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZXh0ZW5kcyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNjkyNDA2Nzc3MzkxODEyNjk0TDsKLQotCi0JCXB1YmxpYyBSRU1Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbihUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlzdXBlcihlKTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI2dldExvY2FsaXplZE1lc3NhZ2UoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQkJcmV0dXJuICgoVGhyb3dhYmxlUHJveHkpIGdldENhdXNlKCkpLmdldFByb3h5TG9jYWxpemVkTWVzc2FnZSgpOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjZ2V0TWVzc2FnZSgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gKChUaHJvd2FibGVQcm94eSkgZ2V0Q2F1c2UoKSkuZ2V0UHJveHlNZXNzYWdlKCk7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLlRocm93YWJsZSNwcmludFN0YWNrVHJhY2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotCQkJZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHMpIHsKLQkJCWdldENhdXNlKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcykgewotCQkJZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSW52b2tlKGludCwgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEludm9rZShpbnQgcHJveHljb3VudCwgTGlzdCBleHByZXNzaW9uUHJveGllcykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCWlmICghaGF2ZVNlbnREYXRhKCkpIHsKLQkJCW1hcmtBbGxQcm94aWVzTm90UmVzb2x2ZWQoZXhwcmVzc2lvblByb3hpZXMpOwotCQkJcmV0dXJuOwkvLyBXZSBoYXZlbid0IHB1c2hlZCBhbnkgY29tbWFuZHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uIERvbid0IGNyZWF0ZSBhIGNvbm5lY3Rpb24gZm9yIHRoaXMuCi0JCX0KLQkJLy8gSWYgYXQgdGhpcyBwb2ludCB0aGVyZSBhcmUgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCB0aGVtIGJlY2F1c2UgdGhleSB3b3VsZCBhbGwgYmUgZG8tbm90aGluZ3MuCi0JCQotCQlib29sZWFuIHByb2Nlc3NlZEV4cHJlc3Npb25Qcm94aWVzID0gZmFsc2U7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBsY2xDb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQltYXJrSW5UcmFuc2FjdGlvbihsY2xDb25uZWN0aW9uKTsKLQkJdHJ5IHsKLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHByb3h5aWRzID0gbnVsbDsKLQkJCUJlYW5Qcm94eVZhbHVlU2VuZGVyIHNlbmRlciA9IG51bGw7Ci0JCQlpZiAocHJveHljb3VudCA+IDApIHsKLQkJCQlwcm94eWlkcyA9IGNyZWF0ZUV4cHJlc3Npb25Qcm94aWVzVmFsdWVPYmplY3QocHJveHljb3VudCwgZXhwcmVzc2lvblByb3hpZXMpOwotCQkJCXNlbmRlciA9IGdldEV4cHJlc3Npb25Qcm94aWVzU2VuZGVyKCk7Ci0JCQl9Ci0KLQkJCWxjbENvbm5lY3Rpb24uc3luYyhnZXRSRU1FeHByZXNzaW9uSUQoKSwgcHJveHlpZHMsIHNlbmRlcik7Ci0JCQkKLQkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciwgdGhlbiBpZiB0aGVyZSBhcmUgcHJveGllcywgd2UgbmVlZCB0byBwcm9jZXNzIHRoZXNlIHRvby4KLQkJCWlmIChwcm94eWNvdW50ID4gMCkKLQkJCQlwcm9jZXNzcHVsbGVkRXhwcmVzc2lvblByb3hpZXMoZXhwcmVzc2lvblByb3hpZXMsIHNlbmRlcik7Ci0JCQlwcm9jZXNzZWRFeHByZXNzaW9uUHJveGllcyA9IHRydWU7Ci0JCQlsY2xDb25uZWN0aW9uLmdldEZpbmFsVmFsdWUod29ya2VyVmFsdWUpOwkvLyBXZSBkb24ndCBjYXJlIHdoYXQgaXQgaXMsIHdlIGp1c3QgbmVlZCB0byBzZWUgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0JCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChlLmdldEVycm9yQ29kZSgpID09IEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OX05PRVhQUkVTU0lPTlZBTFVFX0VYQ0VQVElPTikgewotCQkJCQkvLyBOZWVkIHRvIHR1cm4gaXQgaW50byBhIFRocm93YWJsZS4KLQkJCQkJVGhyb3dhYmxlUHJveHkgdCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkuZ2V0QmVhblByb3h5KGUuZ2V0VmFsdWUoKSk7CS8vIFRoaXMgd2lsbCBjYXVzZSBhIHRocm93IHRvIG9jY3VyLCBidXQgd2UgZG9uJ3Qgd2FudCBpdCBnb2luZyBvdXQsIHdlIHdhbnQgdG8gY2FwdHVyZSBpdC4KLQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZTEpIHsKLQkJCQkJCXQgPSBlMTsKLQkJCQkJfQotCQkJCQl0aHJvdyBuZXcgUkVNTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24odCk7Ci0JCQkJfQotCQkJCWdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKS5wcm9jZXNzRXJyb3JSZXR1cm4oZSk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJbGNsQ29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJCX0JCQkKLQkJCX0KLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJbGNsQ29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0gZmluYWxseSB7Ci0JCQltYXJrRW5kVHJhbnNhY3Rpb24obGNsQ29ubmVjdGlvbik7Ci0JCQlpZiAoIXByb2Nlc3NlZEV4cHJlc3Npb25Qcm94aWVzKQotCQkJCW1hcmtBbGxQcm94aWVzTm90UmVzb2x2ZWQoZXhwcmVzc2lvblByb3hpZXMpOwkvLyBXZSBmYWlsZWQgYmVmb3JlIHdlIGNvdWxkIHByb2Nlc3MgdGhlIGV4cHJlc3Npb24gcHJveGllcy4gU28gbWFyayBhbGwgYXMgbm90IHJlc29sdmVkLgotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUkVNQmVhblR5cGVFeHByZXNzaW9uUHJveHkgZXh0ZW5kcyBFeHByZXNzaW9uUHJveHkgaW1wbGVtZW50cyBJQmVhblR5cGVFeHByZXNzaW9uUHJveHkgewotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIHByb3h5aWQKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBSRU1CZWFuVHlwZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlpZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQlzdXBlcihwcm94eWlkLCBCRUFOVFlQRV9FWFBSRVNTSU9OX1BST1hZLCBleHByZXNzaW9uKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCQl0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdHlwZU5hbWU7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiIC0gIitnZXRUeXBlTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlW10pCi0JCSAqLwotCQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgZXhwcmVzc2lvbi5nZXRSZWdpc3RyeSgpOwotCQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgdGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JCSAqLwotCQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGV4cHJlc3Npb24uZ2V0UmVnaXN0cnkoKTsKLQkJCXJldHVybiAoKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIHRoaXMsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQkKLQkJcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIG1ldGhvZE5hbWUsIChJUHJveHlCZWFuVHlwZVtdKSBudWxsKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRGaWVsZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGV4cHJlc3Npb24uZ2V0UmVnaXN0cnkoKTsKLQkJCXJldHVybiAoKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldEZpZWxkUHJveHkoZXhwcmVzc2lvbiwgdGhpcywgZmllbGROYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSRU1NZXRob2RFeHByZXNzaW9uUHJveHkgZXh0ZW5kcyBFeHByZXNzaW9uUHJveHkgaW1wbGVtZW50cyBJUHJveHlNZXRob2QgewotCQkKLQkJCS8qKgotCQkgKiBAcGFyYW0gcHJveHlpZAotCQkgKiBAcGFyYW0gcHJveHlUeXBlCi0JCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgUkVNTWV0aG9kRXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJCXN1cGVyKHByb3h5aWQsIE1FVEhPRF9FWFBSRVNTSU9OX1BST1hZLCBleHByZXNzaW9uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSRU1GaWVsZEV4cHJlc3Npb25Qcm94eSBleHRlbmRzIEV4cHJlc3Npb25Qcm94eSBpbXBsZW1lbnRzIElQcm94eUZpZWxkIHsKLQkJCi0JCQkvKioKLQkJICogQHBhcmFtIHByb3h5aWQKLQkJICogQHBhcmFtIHByb3h5VHlwZQotCQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIFJFTUZpZWxkRXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJCXN1cGVyKHByb3h5aWQsIEZJRUxEX0VYUFJFU1NJT05fUFJPWFksIGV4cHJlc3Npb24pOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jY3JlYXRlRXhwcmVzc2lvblByb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvblByb3h5IGNyZWF0ZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlUeXBlLCBpbnQgcHJveHlJRCkgewotCQlzd2l0Y2ggKHByb3h5VHlwZSkgewotCQkJY2FzZSBOT1JNQUxfRVhQUkVTU0lPTl9QUk9YWToKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5ldyBFeHByZXNzaW9uUHJveHkocHJveHlJRCwgTk9STUFMX0VYUFJFU1NJT05fUFJPWFksIHRoaXMpOwotCQkJCi0JCQljYXNlIEJFQU5UWVBFX0VYUFJFU1NJT05fUFJPWFk6Ci0JCQkJcmV0dXJuIG5ldyBSRU1CZWFuVHlwZUV4cHJlc3Npb25Qcm94eShwcm94eUlELCB0aGlzKTsKLQkJCQkKLQkJCWNhc2UgTUVUSE9EX0VYUFJFU1NJT05fUFJPWFk6Ci0JCQkJcmV0dXJuIG5ldyBSRU1NZXRob2RFeHByZXNzaW9uUHJveHkocHJveHlJRCwgdGhpcyk7Ci0JCQkJCi0JCQljYXNlIEZJRUxEX0VYUFJFU1NJT05fUFJPWFk6Ci0JCQkJcmV0dXJuIG5ldyBSRU1GaWVsZEV4cHJlc3Npb25Qcm94eShwcm94eUlELCB0aGlzKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hBc3NpZ25tZW50VG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFzc2lnbm1lbnRUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSBwcm94eSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGFzc2lnbm1lbnQgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGFzc2lnbm1lbnQgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWludDogcHJveHkgaWQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BU1NJR05NRU5UX1BST1hZX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KHByb3h5LmdldFByb3h5SUQoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEFzc2lnbm1lbnRUb1Byb3h5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXNzaWdubWVudFRvUHJveHkoKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHRoZSBwdXNoIGFzc2lnbm1lbnQgY29tbWFuZCBpczoKLQkJCS8vICAgUHVzaEFzc2lnbm1lbnRDb21tYW5kLgotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BU1NJR05NRU5UX0VYUFJFU1NJT05fVkFMVUUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBwdXNoVG9FeHByZXNzaW9uUHJveHkoRXhwcmVzc2lvblByb3h5IHByb3h5KSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gZXhwcmVzc2lvbiBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggZXhwcmVzc2lvbiBwcm94eSB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJaW50OiBwcm94eSBpZAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlBVU0hfVE9fRVhQUkVTU0lPTl9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChwcm94eS5nZXRQcm94eUlEKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEJsb2NrQmVnaW4gZXh0ZW5kcyBQZW5kaW5nVHJhbnNhY3Rpb24gewotCQlwdWJsaWMgaW50IGJsb2NrTnVtYmVyOwotCQkKLQkJcHVibGljIEJsb2NrQmVnaW4oaW50IGJsb2NrTnVtYmVyKSB7Ci0JCQl0aGlzLmJsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXI7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHB1c2hUcmFuc2FjdGlvbihSRU1FeHByZXNzaW9uIHJlbUV4cHJlc3Npb24pIHsKLQkJCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gcmVtRXhwcmVzc2lvbi5nZXRDb25uZWN0aW9uKCk7Ci0JCQl0cnkgewotCQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIGJsb2NrIGJlZ2luIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggYmxvY2sgYmVnaW4gcHJveHkgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJCS8vCQlpbnQ6IGJsb2NrIGlkCi0JCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQocmVtRXhwcmVzc2lvbi5nZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfQkVHSU5fRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQkJY29ubmVjdGlvbi5wdXNoSW50KGJsb2NrTnVtYmVyKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJlbUV4cHJlc3Npb24ubWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCXJlbUV4cHJlc3Npb24udGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEJsb2NrQmVnaW5Ub1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmxvY2tCZWdpblRvUHJveHkoaW50IGJsb2NrTnVtYmVyKSB7Ci0JCWFkZFBlbmRpbmdUcmFuc2FjdGlvbihuZXcgQmxvY2tCZWdpbihibG9ja051bWJlcikpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hCbG9ja0VuZFRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCbG9ja0VuZFRvUHJveHkoaW50IGJsb2NrTnVtYmVyKSB7Ci0JCS8vIFNlZSBpZiB0aGUgdG9wIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGlzIEJyZWFrQmxvY2soYmxvY2tOdW1iZXIpLiBJZiBpdCBpcyB0aGVuIHRoZSBCcmVha0Jsb2NrIGNhbiBiZSB0aHJvd24gYXdheS4KLQkJUGVuZGluZ1RyYW5zYWN0aW9uIHRvcEVudHJ5ID0gZ2V0UGVuZGluZ0VudHJ5RnJvbVRvcCgxKTsKLQkJaWYgKHRvcEVudHJ5IGluc3RhbmNlb2YgQmxvY2tCcmVhayAmJiAoKEJsb2NrQnJlYWspIHRvcEVudHJ5KS5ibG9ja051bWJlciA9PSBibG9ja051bWJlcikgewotCQkJcG9wUGVuZGluZ0VudHJ5KDEpOwotCQkJdG9wRW50cnkgPSBnZXRQZW5kaW5nRW50cnlGcm9tVG9wKDEpOwotCQl9Ci0JCS8vIFNlZSBpZiB0aGUgdG9wIHBlbmRpbmcgdHJhbnNhY3Rpb24gaXMgbm93IEJlZ2luQmxvY2soYmxvY2tOdW1iZXIpLiBJZiBpdCBpcywgdGhlbiB0aGlzIHRyYW5zYWN0aW9uIGFuZCB0aGUgYmxvY2sgYmVnaW4KLQkJLy8gY2FuIGJlIHRocm93biBhd2F5IGJlY2F1c2UgdGhleSBhcmUgYW4gZW1wdHkgYmxvY2suCi0JCWlmICh0b3BFbnRyeSBpbnN0YW5jZW9mIEJsb2NrQmVnaW4gJiYgKChCbG9ja0JlZ2luKSB0b3BFbnRyeSkuYmxvY2tOdW1iZXIgPT0gYmxvY2tOdW1iZXIpIHsKLQkJCXBvcFBlbmRpbmdFbnRyeSgxKTsKLQkJCXJldHVybjsKLQkJfQotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIGJsb2NrIGVuZCBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggYmxvY2sgZW5kIHByb3h5IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlpbnQ6IGJsb2NrIGlkCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfRU5EX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KGJsb2NrTnVtYmVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmxvY2tCcmVhayBleHRlbmRzIFBlbmRpbmdUcmFuc2FjdGlvbiB7Ci0JCXB1YmxpYyBpbnQgYmxvY2tOdW1iZXI7Ci0JCQotCQlwdWJsaWMgQmxvY2tCcmVhayhpbnQgYmxvY2tOdW1iZXIpIHsKLQkJCXRoaXMuYmxvY2tOdW1iZXIgPSBibG9ja051bWJlcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcHVzaFRyYW5zYWN0aW9uKFJFTUV4cHJlc3Npb24gcmVtRXhwcmVzc2lvbikgewotCQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSByZW1FeHByZXNzaW9uLmdldENvbm5lY3Rpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gYmxvY2sgYnJlYWsgcHJveHkgY29tbWFuZCBpczoKLQkJCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBibG9jayBicmVhayBwcm94eSB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkJLy8JCWludDogYmxvY2sgaWQKLQkJCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChyZW1FeHByZXNzaW9uLmdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5CTE9DS19CUkVBS19FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCQljb25uZWN0aW9uLnB1c2hJbnQoYmxvY2tOdW1iZXIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi5tYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi50aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJCX0KLQkJfQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQmxvY2tCcmVha1RvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCbG9ja0JyZWFrVG9Qcm94eShpbnQgYmxvY2tOdW1iZXIpIHsKLQkJLy8gRXZlbiBpZiB0aGVyZSBpcyBubyBwZW5kaW5nIGJsb2NrIGJlZ2luIGZvciB0aGlzIGJsb2NrLCB3ZSB3aWxsIHBlbmQgdGhlIGJyZWFrLgotCQkvLyBUaGlzIGlzIHNvIHRoYXQgaWYgdGhlIGJyZWFrIG9jY3VycmVkIGp1c3QgYmVmb3JlIHRoZSBibG9jayBlbmQsIHRoZW4gaXQgY2FuIGJlIGlnbm9yZWQuCi0JCWFkZFBlbmRpbmdUcmFuc2FjdGlvbihuZXcgQmxvY2tCcmVhayhibG9ja051bWJlcikpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRyeUJlZ2luIGV4dGVuZHMgUGVuZGluZ1RyYW5zYWN0aW9uIHsKLQotCQlwdWJsaWMgZmluYWwgaW50IHRyeU51bWJlcjsKLQkJCi0JCXB1YmxpYyBUcnlCZWdpbihpbnQgdHJ5TnVtYmVyKSB7Ci0JCQl0aGlzLnRyeU51bWJlciA9IHRyeU51bWJlcjsKLQkJCQotCQl9Ci0JCXB1YmxpYyB2b2lkIHB1c2hUcmFuc2FjdGlvbihSRU1FeHByZXNzaW9uIHJlbUV4cHJlc3Npb24pIHsKLQkJCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gcmVtRXhwcmVzc2lvbi5nZXRDb25uZWN0aW9uKCk7Ci0JCQl0cnkgewotCQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIHRyeSBiZWdpbiBwcm94eSBjb21tYW5kIGlzOgotCQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHRyeSBiZWdpbiB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkJLy8JCWludDogdHJ5IGlkCi0JCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQocmVtRXhwcmVzc2lvbi5nZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0JFR0lOX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJCWNvbm5lY3Rpb24ucHVzaEludCh0cnlOdW1iZXIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi5tYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi50aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHJ5QmVnaW5Ub1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJ5QmVnaW5Ub1Byb3h5KGludCB0cnlOdW1iZXIpIHsKLQkJYWRkUGVuZGluZ1RyYW5zYWN0aW9uKG5ldyBUcnlCZWdpbih0cnlOdW1iZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUcnlDYXRjaCBleHRlbmRzIFBlbmRpbmdUcmFuc2FjdGlvbiB7Ci0KLQkJcHVibGljIGZpbmFsIGludCB0cnlOdW1iZXI7Ci0JCXByaXZhdGUgZmluYWwgSVByb3h5QmVhblR5cGUgZXhjZXB0aW9uVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uUHJveHkgZXA7Ci0KLQkJcHVibGljIFRyeUNhdGNoKGludCB0cnlOdW1iZXIsIElQcm94eUJlYW5UeXBlIGV4Y2VwdGlvblR5cGUsIEV4cHJlc3Npb25Qcm94eSBlcCkgewotCQkJdGhpcy50cnlOdW1iZXIgPSB0cnlOdW1iZXI7Ci0JCQl0aGlzLmV4Y2VwdGlvblR5cGUgPSBleGNlcHRpb25UeXBlOwotCQkJdGhpcy5lcCA9IGVwOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwdXNoVHJhbnNhY3Rpb24oUkVNRXhwcmVzc2lvbiByZW1FeHByZXNzaW9uKSB7Ci0JCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHJlbUV4cHJlc3Npb24uZ2V0Q29ubmVjdGlvbigpOwotCQkJdHJ5IHsKLQkJCQkvLyBGb3JtYXQgb2YgcHVzaCB0byB0cnkgYmVnaW4gcHJveHkgY29tbWFuZCBpczoKLQkJCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCB0cnkgYmVnaW4gdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJCS8vCQlpbnQ6IHRyeSBpZAotCQkJCS8vCQlvYmplY3Q6IGV4cHJlc3Npb24gdHlwZSAoYXMgYmVhbnR5cGUgb3IgYXMgZXhwcmVzc2lvbiBwcm94eSkKLQkJCQkvLwkJaW50OiBwcm94eSBpZCBvciAoLTEgaWYgbnVsbCkuCi0JCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQocmVtRXhwcmVzc2lvbi5nZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0NBVENIX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJCWNvbm5lY3Rpb24ucHVzaEludCh0cnlOdW1iZXIpOwotCQkJCXJlbUV4cHJlc3Npb24uZmlsbFByb3h5KGV4Y2VwdGlvblR5cGUsIHJlbUV4cHJlc3Npb24ud29ya2VyVmFsdWUpOwotCQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHJlbUV4cHJlc3Npb24ud29ya2VyVmFsdWUpOwotCQkJCWlmIChlcCAhPSBudWxsKQotCQkJCQljb25uZWN0aW9uLnB1c2hJbnQoZXAuZ2V0UHJveHlJRCgpKTsKLQkJCQllbHNlCi0JCQkJCWNvbm5lY3Rpb24ucHVzaEludCgtMSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZW1FeHByZXNzaW9uLm1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQlyZW1FeHByZXNzaW9uLnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJlbUV4cHJlc3Npb24ubWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCQlyZW1FeHByZXNzaW9uLnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQkJfQkJCQotCQkJfQotCQl9Ci0JCQotCX0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUcnlDYXRjaENsYXVzZVRvUHJveHkoaW50LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUcnlDYXRjaENsYXVzZVRvUHJveHkoaW50IHRyeU51bWJlciwgSVByb3h5QmVhblR5cGUgZXhjZXB0aW9uVHlwZSwgRXhwcmVzc2lvblByb3h5IGVwKSB7Ci0JCWFkZFBlbmRpbmdUcmFuc2FjdGlvbihuZXcgVHJ5Q2F0Y2godHJ5TnVtYmVyLCBleGNlcHRpb25UeXBlLCBlcCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRyeUZpbmFsbHkgZXh0ZW5kcyBQZW5kaW5nVHJhbnNhY3Rpb24gewotCQkKLQkJcHVibGljIGZpbmFsIGludCB0cnlOdW1iZXI7Ci0KLQkJcHVibGljIFRyeUZpbmFsbHkoaW50IHRyeU51bWJlcikgewotCQkJdGhpcy50cnlOdW1iZXIgPSB0cnlOdW1iZXI7Ci0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHB1c2hUcmFuc2FjdGlvbihSRU1FeHByZXNzaW9uIHJlbUV4cHJlc3Npb24pIHsKLQkJCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gcmVtRXhwcmVzc2lvbi5nZXRDb25uZWN0aW9uKCk7Ci0JCQl0cnkgewotCQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIHRyeSBiZWdpbiBwcm94eSBjb21tYW5kIGlzOgotCQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHRyeSBmaW5hbGx5IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCQkvLwkJaW50OiB0cnkgaWQKLQkJCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChyZW1FeHByZXNzaW9uLmdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfRklOQUxMWV9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCQljb25uZWN0aW9uLnB1c2hJbnQodHJ5TnVtYmVyKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJlbUV4cHJlc3Npb24ubWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCXJlbUV4cHJlc3Npb24udGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRyeUZpbmFsbHlDbGF1c2VUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJ5RmluYWxseUNsYXVzZVRvUHJveHkoaW50IHRyeU51bWJlcikgewotCQlhZGRQZW5kaW5nVHJhbnNhY3Rpb24obmV3IFRyeUZpbmFsbHkodHJ5TnVtYmVyKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHJ5RW5kVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyeUVuZFRvUHJveHkoaW50IHRyeU51bWJlcikgewotCQkvLyBUaGlzIGlzIGEgbGl0dGxlIHRyaWNreS4gV2UgbmVlZCB0byBmaW5kIGlmIHRoZXJlIGlzIG5vdGhpbmcgYnV0IHRyeS9jYXRjaC9maW5hbGx5IGZvciB0aGlzIHRyeU51bWJlciBvbiB0aGUgcGVuZGluZwotCQkvLyB0cmFuc2FjdGlvbnMgdXAgdG8gdGhlIHRyeSBiZWdpbiwgaWYgdGhlcmUgaXMgbm90aGluZyBlbHNlLCB0aGVuIHdlIGNhbiB0aHJvdyB0aGUgZW50aXJlIHRyeSBhd2F5LiBUaGF0Ci0JCS8vIG1lYW5zIHRoZXJlIHdhcyBubyBjb2RlIGF0IGFsbCBpbiBhbnkgb2YgdGhlIHRyeS9jYXRjaC9maW5hbGx5IGJsb2Nrcy4KLQkJaW50IGZyb21Ub3AgPSAwOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJUGVuZGluZ1RyYW5zYWN0aW9uIHRvcEVudHJ5ID0gZ2V0UGVuZGluZ0VudHJ5RnJvbVRvcCgrK2Zyb21Ub3ApOwotCQkJaWYgKHRvcEVudHJ5IGluc3RhbmNlb2YgVHJ5RmluYWxseSkgewotCQkJCWlmICgoKFRyeUZpbmFsbHkpIHRvcEVudHJ5KS50cnlOdW1iZXIgIT0gdHJ5TnVtYmVyKQotCQkJCQlicmVhazsJLy8gV2UgbWV0IGEgZmluYWxseSB0aGF0IHdhc24ndCBvdXJzLCBzbyBlbnRpcmUgdHJ5IGdyb3VwIG11c3QgYmUgc2VudC4KLQkJCX0gZWxzZSBpZiAodG9wRW50cnkgaW5zdGFuY2VvZiBUcnlDYXRjaCkgewotCQkJCWlmICgoKFRyeUNhdGNoKSB0b3BFbnRyeSkudHJ5TnVtYmVyICE9IHRyeU51bWJlcikKLQkJCQkJYnJlYWs7CS8vIFdlIG1ldCBhIGNhdGNoIHRoYXQgd2Fzbid0IG91cnMsIHNvIGVudGlyZSB0cnkgZ3JvdXAgbXVzdCBiZSBzZW50LgotCQkJfSBlbHNlIGlmICh0b3BFbnRyeSBpbnN0YW5jZW9mIFRyeUJlZ2luKSB7Ci0JCQkJaWYgKCgoVHJ5QmVnaW4pIHRvcEVudHJ5KS50cnlOdW1iZXIgPT0gdHJ5TnVtYmVyKSB7Ci0JCQkJCS8vIFdlJ3ZlIG1ldCBvdXIgdHJ5IGJlZ2luLCBhbmQgbm90aGluZyBidXQgZW1wdHkgY2F0Y2gvZmluYWxseSBpbiBiZXR3ZWVuLCBzbyB0aGUgZW50aXJlIGdyb3VwIGNhbiBiZSB0aHJvd24gYXdheQotCQkJCQlwb3BQZW5kaW5nRW50cnkoZnJvbVRvcCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UKLQkJCQkJYnJlYWs7CS8vIFdlJ3ZlIGhpdCBhIHRyeSBiZWdpbiB0aGF0IHdhc24ndCBvdXJzLCBzbyB0aGUgZW50aXJlIHRyeSBncm91cCBtdXN0IGJlIHNlbnQuCQotCQkJfSBlbHNlCi0JCQkJYnJlYWs7CS8vIFdlJ3ZlIGhpdCBzb21ldGhpbmcgb3RoZXIgdGhhbiBvdXIgdHJ5IGdyb3VwLCBzbyBwcm9jZXNzIGV2ZXJ5dGhpbmcuCi0JCX0KLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0byB0cnkgYmVnaW4gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHRyeSBlbmQgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWludDogdHJ5IGlkCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0VORF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludCh0cnlOdW1iZXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRocm93VG9Qcm94eSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRocm93VG9Qcm94eSgpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0byB0cnkgYmVnaW4gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHRocm93IHRvIHByb3h5KQotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlRIUk9XX0VYUFJFU1NJT05fVkFMVUUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFJldGhyb3dUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoUmV0aHJvd1RvUHJveHkoaW50IHRyeU51bWJlcikgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIHJldGhvdyBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggcmV0aHJvdyB0byBwcm94eSkKLQkJCS8vCQlpbnQ6IHRyeSBpZAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlJFVEhST1dfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQodHJ5TnVtYmVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hCZWFuVHlwZVRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCZWFuVHlwZVRvUHJveHkoSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IHByb3h5KSB7Ci0JCS8vIFB1c2ggYmVhbnR5cGUgdG8gcHJveHkgaXMgc2VudCBvdXQgb2Ygc2VxdWVuY2Ugd2l0aG91dCByZXNwZWN0IHRvIHdoZXJlIGluIGV4cHJlc3Npb24gd2UgYXJlLAotCQkvLyBzbyBubyBuZWVkIHRvIGhhbmRsZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBhdCB0aGlzIHBvaW50LiBUaGV5IHdvdWxkIG5vdCBhZmZlY3QgdGhlIHJlc3VsdAotCQkvLyBvZiB0aGlzIGNhbGwuCi0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gYmVhblR5cGUgcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGJlYW4gdHlwZSBleHByZXNzaW9uIHByb3h5KQotCQkJLy8JCWludDogcHJveHkgaWQKLQkJCS8vCQlzdHJpbmc6IHR5cGVuYW1lCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9CRUFOVFlQRV9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlSRU1CZWFuVHlwZUV4cHJlc3Npb25Qcm94eSBlcCA9IChSRU1CZWFuVHlwZUV4cHJlc3Npb25Qcm94eSkgcHJveHk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQoZXAuZ2V0UHJveHlJRCgpKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFN0cmluZyhlcC5nZXRUeXBlTmFtZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hNZXRob2RUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlW10pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaE1ldGhvZFRvUHJveHkoRXhwcmVzc2lvblByb3h5IHByb3h5LCBJUHJveHlCZWFuVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkvLyBQdXNoIG1ldGhvZCB0byBwcm94eSBpcyBzZW50IG91dCBvZiBzZXF1ZW5jZSB3aXRob3V0IHJlc3BlY3QgdG8gd2hlcmUgaW4gZXhwcmVzc2lvbiB3ZSBhcmUsCi0JCS8vIHNvIG5vIG5lZWQgdG8gaGFuZGxlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGF0IHRoaXMgcG9pbnQuIFRoZXkgd291bGQgbm90IGFmZmVjdCB0aGUgcmVzdWx0Ci0JCS8vIG9mIHRoaXMgY2FsbC4KLQotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIG1ldGhvZCBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggbWV0aG9kIHR5cGUgZXhwcmVzc2lvbiBwcm94eSkKLQkJCS8vCQlpbnQ6IHByb3h5IGlkCi0JCQkvLwkJVmFsdWVPYmplY3Q6IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBvciB0aGUgZXhwcmVzc2lvbiBwcm94eSBmb3IgdGhlIGRlY2xhcmluZyB0eXBlCi0JCQkvLwkJc3RyaW5nOiBtZXRob2QgbmFtZQotCQkJLy8JCWludDogbnVtYmVyIG9mIHBhcmFtZXRlciB0eXBlcwotCQkJLy8JCVZhbHVlT2JqZWN0KHMpOiBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgb3IgdGhlIGV4cHJlc3Npb24gcHJveHkgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZXMuCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9NRVRIT0RfRVhQUkVTU0lPTlBST1hZX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KHByb3h5LmdldFByb3h5SUQoKSk7Ci0JCQlmaWxsUHJveHkoZGVjbGFyaW5nVHlwZSwgd29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoU3RyaW5nKG1ldGhvZE5hbWUpOwotCQkJaWYgKHBhcmFtZXRlclR5cGVzID09IG51bGwgfHwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IDApCi0JCQkJY29ubmVjdGlvbi5wdXNoSW50KDApOwotCQkJZWxzZSB7Ci0JCQkJY29ubmVjdGlvbi5wdXNoSW50KHBhcmFtZXRlclR5cGVzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlmaWxsUHJveHkocGFyYW1ldGVyVHlwZXNbaV0sIHdvcmtlclZhbHVlKTsKLQkJCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hGaWVsZFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoRmllbGRUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSBwcm94eSwgSVByb3h5QmVhblR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQkvLyBQdXNoIGZpZWxkIHRvIHByb3h5IGlzIHNlbnQgb3V0IG9mIHNlcXVlbmNlIHdpdGhvdXQgcmVzcGVjdCB0byB3aGVyZSBpbiBleHByZXNzaW9uIHdlIGFyZSwKLQkJLy8gc28gbm8gbmVlZCB0byBoYW5kbGUgcGVuZGluZyB0cmFuc2FjdGlvbnMgYXQgdGhpcyBwb2ludC4gVGhleSB3b3VsZCBub3QgYWZmZWN0IHRoZSByZXN1bHQKLQkJLy8gb2YgdGhpcyBjYWxsLgotCi0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gZmllbGQgcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGZpZWxkIHR5cGUgZXhwcmVzc2lvbiBwcm94eSkKLQkJCS8vCQlpbnQ6IHByb3h5IGlkCi0JCQkvLwkJVmFsdWVPYmplY3Q6IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBvciB0aGUgZXhwcmVzc2lvbiBwcm94eSBmb3IgdGhlIGRlY2xhcmluZyB0eXBlCi0JCQkvLwkJc3RyaW5nOiBmaWVsZCBuYW1lCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9GSUVMRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQocHJveHkuZ2V0UHJveHlJRCgpKTsKLQkJCWZpbGxQcm94eShkZWNsYXJpbmdUeXBlLCB3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hTdHJpbmcoZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWFwIG9mIElQcm94eU1ldGhvZHMgZm9yIGEgYmVhbnR5cGUuIE1lYW50IHRvIGJlIHVzZWQgb25seSBpbiBjb25qdW5jdGlvbiB3aXRoIFJFTVByb3h5Q29uc3RhbnRzLgotCSAqIEl0IGlzIGhlcmUgc28gdGhlIFJFTVByb3h5Q29uc3RhbnRzIGNhbiBzdG9yZSBwZW5kaW5nIHByb3hpZXMgcGVyIGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGJlYW5UeXBlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0TWV0aG9kcyhJUHJveHlCZWFuVHlwZSBiZWFuVHlwZSkgewotCQlpZiAobWV0aG9kc0NhY2hlID09IG51bGwpCi0JCQltZXRob2RzQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgbWV0aG9kcyA9IChNYXApIG1ldGhvZHNDYWNoZS5nZXQoYmVhblR5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0JCWlmKG1ldGhvZHMgPT0gbnVsbCl7Ci0JCQltZXRob2RzID0gbmV3IEhhc2hNYXAoMjApOwotCQkJbWV0aG9kc0NhY2hlLnB1dChiZWFuVHlwZS5nZXRUeXBlTmFtZSgpLG1ldGhvZHMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwkKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtYXAgb2YgSVByb3h5RmllbGRzIGZvciBhIGJlYW50eXBlLiBNZWFudCB0byBiZSB1c2VkIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCBSRU1Qcm94eUNvbnN0YW50cy4KLQkgKiBJdCBpcyBoZXJlIHNvIHRoZSBSRU1Qcm94eUNvbnN0YW50cyBjYW4gc3RvcmUgcGVuZGluZyBwcm94aWVzIHBlciBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBiZWFuVHlwZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgTWFwIGdldEZpZWxkcyhJUHJveHlCZWFuVHlwZSBiZWFuVHlwZSkgewotCQlpZiAoZmllbGRzQ2FjaGUgPT0gbnVsbCkKLQkJCWZpZWxkc0NhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIGZpZWxkcyA9IChNYXApIGZpZWxkc0NhY2hlLmdldChiZWFuVHlwZS5nZXRUeXBlTmFtZSgpKTsKLQkJaWYoZmllbGRzID09IG51bGwpewotCQkJZmllbGRzID0gbmV3IEhhc2hNYXAoMjApOwotCQkJZmllbGRzQ2FjaGUucHV0KGJlYW5UeXBlLmdldFR5cGVOYW1lKCksZmllbGRzKTsKLQkJfQotCQlyZXR1cm4gZmllbGRzOwkKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtYXAgb2YgSVByb3h5QmVhblR5cGVzIGZvciBhIGJlYW50eXBlIG5hbWUuIE1lYW50IHRvIGJlIHVzZWQgb25seSBpbiBjb25qdW5jdGlvbiB3aXRoIFJFTVNndGFuZGFyZEJlYW5UeXBlRmFjdG9yeS4KLQkgKiBJdCBpcyBoZXJlIHNvIHRoZSBSRU1TdGFuZGFyZEJlYW5UeXBlRmFjdG9yeSBjYW4gc3RvcmUgcGVuZGluZyBwcm94aWVzIHBlciBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBiZWFuVHlwZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5QmVhblR5cGUgZ2V0QmVhblR5cGUoU3RyaW5nIGJlYW5UeXBlTmFtZSkgewotCQlpZiAoYmVhblR5cGVDYWNoZSA9PSBudWxsKQotCQkJYmVhblR5cGVDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiAoSVByb3h5QmVhblR5cGUpIGJlYW5UeXBlQ2FjaGUuZ2V0KGJlYW5UeXBlTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgYmVhbnR5cGUgZXhwcmVzc2lvbiBwcm94eSB0byB0aGUgbWFwIG9mIGJlYW4gdHlwZSBleHByZXNzaW9uIHByb3hpZXMuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBSRU1TdGFuZGFyZEJlYW5UeXBlRmFjdG9yeS4KLQkgKiBJdCBpcyBoZXJlIHNvIHRoZSBSRU1TdGFuZGFyZEJlYW5UeXBlRmFjdG9yeSBjYW4gc3RvcmUgcGVuZGluZyBwcm94aWVzIHBlciBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBiZWFuVHlwZU5hbWUKLQkgKiBAcGFyYW0gYmVhbnR5cGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCZWFuVHlwZShTdHJpbmcgYmVhblR5cGVOYW1lLCBJUHJveHlCZWFuVHlwZSBiZWFudHlwZSkgewotCQliZWFuVHlwZUNhY2hlLnB1dChiZWFuVHlwZU5hbWUsIGJlYW50eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBiZWFudHlwZSBleHByZXNzaW9uIHByb3h5IGZyb20gdGhlIG1hcC4gVGhpcyBpcyBjYWxsZWQgYmVjYXVzZSB0aGVyZSB3YXMgYSByb2xsYmFjayBkdWUgdG8gYW4gZW5kbWFyay4KLQkgKiBAcGFyYW0gYmVhblR5cGVOYW1lCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQmVhblR5cGUoU3RyaW5nIGJlYW5UeXBlTmFtZSkgewotCQliZWFuVHlwZUNhY2hlLnJlbW92ZShiZWFuVHlwZU5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaElmVGVzdFRvUHJveHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJZlRlc3RUb1Byb3h5KCkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGlmIHRlc3QgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGlmIHRlc3QgdG8gcHJveHkpCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSUZfVEVTVF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJZkVsc2VUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSWZFbHNlVG9Qcm94eShJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIGNsYXVzZVR5cGUpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBjb25kaXRpb25hbCB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggaWYvZWxzZSBjbGF1c2UgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWJ5dGU6IGNsYXVzZSB0eXBlCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSUZfRUxTRV9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEJ5dGUoKGJ5dGUpIGNsYXVzZVR5cGUuZ2V0VmFsdWUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoTmV3SW5zdGFuY2VUb1Byb3h5KGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hOZXdJbnN0YW5jZVRvUHJveHkoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nLCBJUHJveHlCZWFuVHlwZSByZXN1bHRUeXBlKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggbmV3IGluc3RhbmNlIGZyb20gaW5pdHN0cmluZyB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggbmV3IGluc3RhbmNlIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlzdHJpbmc6IGluaXQgc3RyaW5nCi0JCQkvLwkJVmFsdWVPYmplY3Q6IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBvciB0aGUgZXhwcmVzc2lvbiBwcm94eSBmb3IgdGhlIGRlY2xhcmluZyB0eXBlCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuTkVXX0lOU1RBTkNFX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFN0cmluZyhpbml0aWFsaXphdGlvblN0cmluZyk7Ci0JCQlmaWxsUHJveHkocmVzdWx0VHlwZSwgd29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwkJCQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXJrIGV4dGVuZHMgUGVuZGluZ1RyYW5zYWN0aW9uIHsKLQkJcHVibGljIGludCBtYXJrSUQ7Ci0JCQotCQlwdWJsaWMgTWFyayhpbnQgbWFya0lEKSB7Ci0JCQl0aGlzLm1hcmtJRCA9IG1hcmtJRDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcHVzaFRyYW5zYWN0aW9uKFJFTUV4cHJlc3Npb24gcmVtRXhwcmVzc2lvbikgewotCQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSByZW1FeHByZXNzaW9uLmdldENvbm5lY3Rpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gRm9ybWF0IG9mIHB1c2ggbWFyayB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIG1hcmsgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJCS8vCQlpbnQ6IG1hcmtJRAotCQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKHJlbUV4cHJlc3Npb24uZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLk1BUktfVkFMVUUpOwotCQkJCWNvbm5lY3Rpb24ucHVzaEludChtYXJrSUQpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi5tYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi50aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHVzaE1hcmtUb1Byb3h5KGludCBtYXJrSUQpIHsKLQkJYWRkUGVuZGluZ1RyYW5zYWN0aW9uKG5ldyBNYXJrKG1hcmtJRCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hFbmRtYXJrVG9Qcm94eShpbnQgbWFya0lELCBib29sZWFuIHJlc3RvcmUpIHsKLQkJLy8gU2VlIGlmIHRoZSB0b3AgcGVuZGluZyB0cmFuc2FjdGlvbiBpcyBub3cgTWFyayhtYXJrSUQpLiBJZiBpdCBpcywgdGhlbiB0aGlzIHRyYW5zYWN0aW9uIGFuZCB0aGUgbWFyayBiZWdpbgotCQkvLyBjYW4gYmUgdGhyb3duIGF3YXkgYmVjYXVzZSB0aGV5IGFyZSBhbiBlbXB0eSBibG9jay4KLQkJUGVuZGluZ1RyYW5zYWN0aW9uIHRvcEVudHJ5ID0gZ2V0UGVuZGluZ0VudHJ5RnJvbVRvcCgxKTsKLQkJaWYgKHRvcEVudHJ5IGluc3RhbmNlb2YgTWFyayAmJiAoKE1hcmspIHRvcEVudHJ5KS5tYXJrSUQgPT0gbWFya0lEKSB7Ci0JCQlwb3BQZW5kaW5nRW50cnkoMSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBlbmQgbWFyayB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggZW5kIG1hcmsgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWludDogbWFya0lECi0JCQkvLwkJYm9vbGVhbjogcmVzdG9yZQotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkVORE1BUktfVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KG1hcmtJRCk7Ci0JCQljb25uZWN0aW9uLnB1c2hCb29sZWFuKHJlc3RvcmUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8vIFRoaXMgaXMgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yIGNvbnRyb2xsZXIgdXNlZCB0byB0cmFuc2Zlci4KLQkvLyBUaGlzIGlzIHRoZSBndXkgdGhhdCBtYWludGFpbnMgY29udGludWl0eSBvZiB0aGUgdHJhbnNhY3Rpb24gYXMKLQkvLyBpdCBpcyBwYXNzZWQgZnJvbSBvbmUgY29ubmVjdGlvbiB0byBhbm90aGVyLgotCXByb3RlY3RlZCBJQmVhblByb3h5IGV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyOwkKLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmVnaW5UcmFuc2ZlclRocmVhZFRvUHJveHkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBJZiB0aGUgY29udHJvbGxlciBpcyBub3QgbnVsbCwgdGhhdCBtZWFucyB3ZSBoYWQgYWxyZWFkeSByZXF1ZXN0ZWQgYSB0cmFuc2ZlcgotCQkvLyBidXQgaGFkIG5vdCB1c2VkIGl0IGluIHRoaXMgdGhyZWFkIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcuIEl0Ci0JCS8vIHdpbGwgYmUgaGFuZGxlZCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIHRoZSBvdGhlciB0aHJlYWQuCi0JCS8vIElmIHRoZSBjb25uZWN0aW9uIGlzIG51bGwsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgc2luY2UgdGhlcmUgaXMgbm8gY29ubmVjdGlvbgotCQkvLyB0byB0cmFuc2Zlci4KLQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCAmJiBleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciA9PSBudWxsKSB7Ci0JCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gbGNsQ29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJCW1hcmtJblRyYW5zYWN0aW9uKGxjbENvbm5lY3Rpb24pOwotCQkJdHJ5IHsKLQkJCQl3b3JrZXJWYWx1ZS5zZXQoKTsKLQkJCQlsY2xDb25uZWN0aW9uLnRyYW5zZmVyRXhwcmVzc2lvbihnZXRSRU1FeHByZXNzaW9uSUQoKSwgd29ya2VyVmFsdWUpOwotCQkJCWV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyID0gZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpLmdldEJlYW5Qcm94eSh3b3JrZXJWYWx1ZSk7Ci0JCQkJZ2V0UkVNUmVnaXN0cnkoKS5yZXR1cm5Db25uZWN0aW9uKGxjbENvbm5lY3Rpb24pOwotCQkJCXRoaXMuY29ubmVjdGlvbiA9IG51bGw7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQlsY2xDb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQkJfQkJCQotCQkJfSBmaW5hbGx5IHsKLQkJCQltYXJrRW5kVHJhbnNhY3Rpb24obGNsQ29ubmVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJhbnNmZXJUaHJlYWRUb1Byb3h5KCkgewotCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiBUaGUgbmV4dCB0aW1lIHdlIG5lZWQgdG8gcHVzaCBkYXRhIGFjcm9zcywgd2Ugd2lsbCBnZXQgYSBjb25uZWN0aW9uIGFuZCB0aGUgZ2V0Q29ubmVjdGlvbigpCi0JCS8vIHdpbGwgaG9vayB1cCB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzb3IgY29udHJvbGxlciBmb3IgdXMuIFRoaXMgd2F5IGlmIG5vdGhpbmcgaGFwcGVucyBpbiB0aGlzIHRocmVhZCB0aGVuIHdlIHdvbid0Ci0JCS8vIHdhc3RlIGNvbW11bmljYXRpb24gdGltZSBvbiBpdC4KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdWJleHByZXNzaW9uQmVnaW4gZXh0ZW5kcyBQZW5kaW5nVHJhbnNhY3Rpb24gewotCQlwdWJsaWMgaW50IHN1YmV4cHJlc3Npb25OdW1iZXI7Ci0JCQotCQlwdWJsaWMgU3ViZXhwcmVzc2lvbkJlZ2luKGludCBzdWJleHByZXNzaW9uTnVtYmVyKSB7Ci0JCQl0aGlzLnN1YmV4cHJlc3Npb25OdW1iZXIgPSBzdWJleHByZXNzaW9uTnVtYmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwdXNoVHJhbnNhY3Rpb24oUkVNRXhwcmVzc2lvbiByZW1FeHByZXNzaW9uKSB7Ci0JCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHJlbUV4cHJlc3Npb24uZ2V0Q29ubmVjdGlvbigpOwotCQkJdHJ5IHsKLQkJCQkvLyBGb3JtYXQgb2YgcHVzaCB0byBzdWJleHByZXNzaW9uIGJlZ2luIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggc3ViZXhwcmVzc2lvbiBiZWdpbiBwcm94eSB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkJLy8JCWludDogc3ViZXhwcmVzc2lvbiBpZAotCQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKHJlbUV4cHJlc3Npb24uZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlNVQkVYUFJFU1NJT05fQkVHSU5fRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQkJY29ubmVjdGlvbi5wdXNoSW50KHN1YmV4cHJlc3Npb25OdW1iZXIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi5tYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi50aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoU3ViZXhwcmVzc2lvbkJlZ2luVG9Qcm94eShpbnQgc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQlhZGRQZW5kaW5nVHJhbnNhY3Rpb24obmV3IFN1YmV4cHJlc3Npb25CZWdpbihzdWJleHByZXNzaW9uTnVtYmVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFN1YmV4cHJlc3Npb25FbmRUb1Byb3h5KGludCBzdWJleHByZXNzaW9uTnVtYmVyKSB7Ci0JCS8vIFNlZSBpZiB0aGUgdG9wIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGlzIFN1YmV4cHJlc3Npb25CZWdpbihzdWJleHByZXNzaW9uTnVtYmVyKS4gSWYgaXQgaXMgdGhlbiB0aGUgU3ViZXhwcmVzc2lvbkJlZ2luIGNhbiBiZSB0aHJvd24gYXdheS4KLQkJUGVuZGluZ1RyYW5zYWN0aW9uIHRvcEVudHJ5ID0gZ2V0UGVuZGluZ0VudHJ5RnJvbVRvcCgxKTsKLQkJaWYgKHRvcEVudHJ5IGluc3RhbmNlb2YgU3ViZXhwcmVzc2lvbkJlZ2luICYmICgoU3ViZXhwcmVzc2lvbkJlZ2luKSB0b3BFbnRyeSkuc3ViZXhwcmVzc2lvbk51bWJlciA9PSBzdWJleHByZXNzaW9uTnVtYmVyKSB7Ci0JCQlwb3BQZW5kaW5nRW50cnkoMSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0byBibG9jayBlbmQgcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHN1YmV4cHJlc3Npb24gZW5kIHByb3h5IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlpbnQ6IHN1YmV4cHJlc3Npb24gaWQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5TVUJFWFBSRVNTSU9OX0VORF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChzdWJleHByZXNzaW9uTnVtYmVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQkJfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GaWVsZFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZpZWxkUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiYmQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZpZWxkUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1GaWVsZFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotZmluYWwgY2xhc3MgUkVNRmllbGRQcm94eSBleHRlbmRzIFJFTUFjY2Vzc2libGVPYmplY3RQcm94eSBpbXBsZW1lbnRzIElGaWVsZFByb3h5IHsKLQlwcml2YXRlIElCZWFuVHlwZVByb3h5IGZGaWVsZFR5cGU7Ci0KLQlSRU1GaWVsZFByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklEKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0RmllbGRUeXBlKCkgewotCQlpZiAoZkZpZWxkVHlwZSA9PSBudWxsKQotCQkJZkZpZWxkVHlwZSA9Ci0JCQkJKElCZWFuVHlwZVByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0VHlwZSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygKLQkJCQkJdGhpcyk7Ci0KLQkJcmV0dXJuIGZGaWVsZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSB0aGUgcHJveHksIGkuZS4gbWFyayBpdCBpbnZhbGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZGaWVsZFR5cGUgPSBudWxsOwotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGZyb20gdGhlIHN1YmplY3QKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXQoSUJlYW5Qcm94eSBzdWJqZWN0KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBGb3JtYXQgb2YgZ2V0dGVyIHBhcm1zIGlzOiAoT2JqZWN0IChzdWJqZWN0KSkuCi0JCS8vIElmIHRoZSBjb21wb25lbnQgdHlwZSBpcyBwcmltaXRpdmUsIHdlIG5lZWQgdG8gdXNlIHRoZSBjb3JyZWN0IGdldHRlciBzbyB0aGF0IGEgdmFsaWQgdmFsdWUgaXMgcmV0dXJuZWQsCi0JCS8vIGlmIHdlIGp1c3QgdXNlZCB0aGUgc3RhbmRhcmQgZ2V0LCBpZiB0aGUgdHlwZSB3YXMgImludCIgdGhlIHZhbHVlIHJldHVybmVkIHdvdWxkIGJlIGFuIGphdmEubGFuZy5JbnRlZ2VyLgotCQlJQmVhblR5cGVQcm94eSBmaWVsZFR5cGUgPSBnZXRGaWVsZFR5cGUoKTsKLQkJaWYgKCFmaWVsZFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJLy8gVXNlIHN0YW5kYXJkIGdldHRlci4KLQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldCgpKS5pbnZva2UodGhpcywgc3ViamVjdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBVc2UgdGhlIGNvcnJlY3QgcHJpbWl0aXZlIGdldHRlci4KLQkJCWludCBpZCA9ICgoSVJFTUJlYW5Qcm94eSkgZmllbGRUeXBlKS5nZXRJRCgpLmludFZhbHVlKCk7Ci0JCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJY2FzZSBDb21tYW5kcy5CWVRFX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXRCeXRlKCkpLmludm9rZSh0aGlzLCBzdWJqZWN0KTsKLQkJCQljYXNlIENvbW1hbmRzLkJPT0xFQU5fVFlQRSA6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldEJvb2xlYW4oKSkuaW52b2tlKAotCQkJCQkJdGhpcywKLQkJCQkJCXN1YmplY3QpOwotCQkJCWNhc2UgQ29tbWFuZHMuQ0hBUkFDVEVSX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXRDaGFyKCkpLmludm9rZSh0aGlzLCBzdWJqZWN0KTsKLQkJCQljYXNlIENvbW1hbmRzLkRPVUJMRV9UWVBFIDoKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0RG91YmxlKCkpLmludm9rZSgKLQkJCQkJCXRoaXMsCi0JCQkJCQlzdWJqZWN0KTsKLQkJCQljYXNlIENvbW1hbmRzLkZMT0FUX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXRGbG9hdCgpKS5pbnZva2UoCi0JCQkJCQl0aGlzLAotCQkJCQkJc3ViamVjdCk7Ci0JCQkJY2FzZSBDb21tYW5kcy5JTlRFR0VSX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXRJbnQoKSkuaW52b2tlKHRoaXMsIHN1YmplY3QpOwotCQkJCWNhc2UgQ29tbWFuZHMuTE9OR19UWVBFIDoKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0TG9uZygpKS5pbnZva2UodGhpcywgc3ViamVjdCk7Ci0JCQkJY2FzZSBDb21tYW5kcy5TSE9SVF9UWVBFIDoKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0U2hvcnQoKSkuaW52b2tlKAotCQkJCQkJdGhpcywKLQkJCQkJCXN1YmplY3QpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGluIHRoaXMgc3ViamVjdCB0byB0aGlzIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgdmFsdWUpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCVJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRTZXQoKS5pbnZva2UodGhpcywgbmV3IElCZWFuUHJveHlbXSB7IHN1YmplY3QsIHZhbHVlIH0pOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIHByb3h5IGlzIGNvbnN0YW50IHByb3h5IG91dCBvZiB0aGUgbWV0aG9kIGZhY3RvcnkuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZmllbGRUeXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GaWVsZFR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GaWVsZFR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDg2MmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmllbGRUeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUZpZWxkVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBCZWFuVHlwZSBQcm94eSBmb3IgTWV0aG9kIGNsYXNzLgotICovCi0KLWZpbmFsIGNsYXNzIFJFTUZpZWxkVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHsKLQotUkVNRmllbGRUeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBhY2Nlc3NpYmxlVHlwZVByb3h5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5GSUVMRF9DTEFTUyksIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmNsYXNzLmdldE5hbWUoKSwgYWNjZXNzaWJsZVR5cGVQcm94eSk7Ci19Ci0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBhY2Nlc3NpYmxlIG9iamVjdCB0eXBlcywgdGhleSBhcmUgZmluYWwgY2xhc3Nlcywgc28geW91IGNhbid0IGNyZWF0ZSBhIG5ld0JlYW5UeXBlIAotICogZm9yIHN1YmNsYXNzZXMuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIFNwZWNpYWxpemVkIGZyb20gUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBDb25zdHJ1Y3RvciBwcm94aWVzIGFyZSBjcmVhdGVkIGNvcnJlY3RseS4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgb2JqZWN0SUQpIHsKLQlyZXR1cm4gbmV3IFJFTUZpZWxkUHJveHkoZlJlZ2lzdHJ5LCBvYmplY3RJRCk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDb25zdHJ1Y3RvciBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGEgZGVmYXVsdCBjdG9yLAotICogdGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsgCi0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDb25zdHJ1Y3RvciBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGFuIGluaXRpYWxpemF0aW9uIHN0cmluZywKLSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19CQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GbG9hdENsYXNzQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5NTdjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUZsb2F0Q2xhc3NCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBwcm94eSBpbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciBGbG9hdC5jbGFzcwotICovCi1jbGFzcyBSRU1GbG9hdENsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNRmxvYXRDbGFzc0JlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEZsb2F0IGFGbG9hdCkgewotCXN1cGVyKGFSZWdpc3RyeSwgYUZsb2F0KTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZmxvYXRDbGFzczsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoKEZsb2F0KSBudW1iZXJWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NDNiNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GbG9hdENsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQUm94eSBmb3IgRmxvYXQuY2xhc3MKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1GbG9hdENsYXNzQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG51bWJlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkZMT0FUX0NMQVNTKSwgRmxvYXQuY2xhc3MuZ2V0TmFtZSgpLCBudW1iZXJUeXBlKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNRmxvYXRDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBGbG9hdCgwRikpOwkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlRmxvYXRCZWFuUHJveHkoRmxvYXQgYUZsb2F0KSB7Ci0JcmV0dXJuIChhRmxvYXQuZmxvYXRWYWx1ZSgpICE9IDBGKSA/Ci0JCW5ldyBSRU1GbG9hdENsYXNzQmVhblByb3h5KGZSZWdpc3RyeSwgYUZsb2F0KSA6IHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBHZW5lcmljIHdheSB0byBjcmVhdGUgYW4gRmxvYXQgcHJveHksIGhvd2V2ZXIsIHRoZSBOdW1iZXIgbXVzdCBiZSBhIEZsb2F0LgotICovCi1wcm90ZWN0ZWQgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlyZXR1cm4gY3JlYXRlRmxvYXRCZWFuUHJveHkoKEZsb2F0KSBhTnVtYmVyKTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIE51bWJlcidzIGRvbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVybyBwcm94eSBmb3IgdGhpcyBjYXNlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUZsb2F0QmVhblByb3h5KG5ldyBGbG9hdCh2YWx1ZS5hRmxvYXQpKTsKLX0JCi0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0VHlwZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GbG9hdFR5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVhMGUxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0VHlwZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUZsb2F0VHlwZUJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElOdW1iZXJCZWFuUHJveHkgZm9yIHRoZSBwcmltaXRpdmUgImZsb2F0Ii4KLSAqIEl0IGNhbiBhbnN3ZXIgYWxsIG9mIHRoZSBwcmltaXRpdmUgbnVtYmVyIHR5cGVzIChpbnQsIGxvbmcsIHNob3J0LCBieXRlLCBkb3VibGUsIGZsb2F0KS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWNsYXNzIFJFTUZsb2F0VHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSU51bWJlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBmbG9hdCBmRmxvYXQ7Ci0KLS8qKgotICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkCi0gKiBpbiBhIHNwZWNpYWwgd2F5IGFuZCBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZW0uCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1SRU1GbG9hdFR5cGVCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBmbG9hdCBhRmxvYXQpIHsKLQlzdXBlcihhUmVnaXN0cnkpOwotCWZGbG9hdCA9IGFGbG9hdDsKLX0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBSRU1GbG9hdFR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmRmxvYXQgPT0gKChSRU1GbG9hdFR5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5mbG9hdFZhbHVlKCk7Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgRG91YmxlKQotCQlyZXR1cm4gZkZsb2F0ID09ICgoRmxvYXQpIGFuT2JqZWN0KS5mbG9hdFZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0gKi8KLXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIFJFTUZsb2F0VHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZGbG9hdCA9PSAoKFJFTUZsb2F0VHlwZUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuZmxvYXRWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIChieXRlKSBmRmxvYXQ7Ci19Ci0vKioKLSAqIGRvdWJsZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCXJldHVybiBmRmxvYXQ7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiBmRmxvYXQ7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgaW50IHZhbHVlCi0gKi8KLXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JcmV0dXJuIChpbnQpIGZGbG9hdDsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIChsb25nKSBmRmxvYXQ7Ci19Ci0vKioKLSAqIG51bWJlclZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCXJldHVybiBuZXcgRmxvYXQoZkZsb2F0KTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIChzaG9ydCkgZkZsb2F0OwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBTdHJpbmcudmFsdWVPZihmRmxvYXQpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5mbG9hdFR5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZGbG9hdCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GbG9hdFR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzN2FkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgRmxvYXQuVFlQRS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1GbG9hdFR5cGVCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuRkxPQVRfVFlQRSksIEZsb2F0LlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNRmxvYXRUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgMEYpOwkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUZsb2F0QmVhblByb3h5KGZsb2F0IGFGbG9hdCkgewotCXJldHVybiAoYUZsb2F0ICE9IDBGKSA/Ci0JCW5ldyBSRU1GbG9hdFR5cGVCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhRmxvYXQpIDogemVyb1Byb3h5OwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gZmxvYXQgaXMgYSBwcmltaXRpdmUsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVyb1Byb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUZsb2F0QmVhblByb3h5KHZhbHVlLmFGbG9hdCk7Ci19Ci0KLS8qKgotICogU2hvcnQgY3V0IGZvciBuZXdJbnN0YW5jZSB3aGVyZSB0aGUgc3RyaW5nIGZvbGxvd3MgdGhlCi0gKiBzcGVjaWZpYyBwYXR0ZXJuIHdlIGV4cGVjdC4gVGhhdCB3YXkgaXQgd29uJ3QgYmUgbmVjZXNzYXJ5IHRvIHNoaXAgb3ZlciB0byB0aGUgdm0gCi0gKiB0byBwcm9jZXNzIGl0LgotICoKLSAqIFRoZSBwYXR0ZXJuIGl0IGNhbiBhY2NlcHQgaXM6Ci0gKiAJMSkgKGZsb2F0KSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChmbG9hdCkgZXhwbGljaXRseSBjYXN0cyBpdCBkb3duLgotICoJMikgdmFsaWROdW1iZXIKLSAqIEl0IHdpbGwgdXNlIHRoZSBkZWNvZGUgZnVuY3Rpb24gb2YgZmxvYXQgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCBudW1iZXIuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCVN0cmluZyB0cmltID0gaW5pdGlhbGl6YXRpb25TdHJpbmcudHJpbSgpOwotCWlmICh0cmltLmxlbmd0aCgpID09IDApCi0JCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CQotCWZsb2F0IGFGbG9hdDsKLQlpZiAodHJpbS5zdGFydHNXaXRoKCIoZmxvYXQpIikpIHsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXIgdiA9IHBhcnNlU3RyaW5nKHRyaW0uc3Vic3RyaW5nKCIoZmxvYXQpIi5sZW5ndGgoKSkudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodiAhPSBudWxsKQotCQkJYUZsb2F0ID0gdi5mbG9hdFZhbHVlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQl9IGVsc2UgewotCQl0cnkgewotCQkJYUZsb2F0ID0gRmxvYXQudmFsdWVPZihpbml0aWFsaXphdGlvblN0cmluZykuZmxvYXRWYWx1ZSgpOwkvLyBTZWUgaWYgdmFsaWQgZmxvYXQgZm9ybWF0LgotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCQl9Ci0JfQotCi0JcmV0dXJuIGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoYUZsb2F0KTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUluaXRFcnJvckJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW5pdEVycm9yQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjM4ZmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW5pdEVycm9yQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUluaXRFcnJvckJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqL3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0KLS8qKgotICogQSBzcGVjaWFsIGJlYW4gdHlwZSBwcm94eS4gSXQgaXMgZm9yIHRob3NlIGJlYW4gdHlwZXMgdGhhdCBoYWQgYW4gaW5zdGFudGlhdGlvbiBlcnJvciB3aGlsZSBiZWluZyBpbml0aWFsaXplZC4gSXQgaXMgc28gd2UgaGF2ZSB0aGUgbWVzc2FnZS4gQWxsCi0gKiBvdGhlciBhY3Rpb25zIGFnYWluc3QgaXQgd2lsbCBmYWlsLgotICogCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1Jbml0RXJyb3JCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTUJlYW5UeXBlUHJveHkgewotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbml0aWFsaXphdGlvbkVycm9yOwotCi0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjbGFzc25hbWU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUkVNSW5pdEVycm9yQmVhblR5cGVQcm94eS4KLQkgKi8KLQlwdWJsaWMgUkVNSW5pdEVycm9yQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGluaXRpYWxpemF0aW9uRXJyb3IsIFN0cmluZyBjbGFzc25hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl0aGlzLmluaXRpYWxpemF0aW9uRXJyb3IgPSBpbml0aWFsaXphdGlvbkVycm9yOwotCQl0aGlzLmNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5UeXBlUHJveHkjbmV3QmVhblByb3h5KGphdmEubGFuZy5JbnRlZ2VyKQotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1CZWFuVHlwZVByb3h5I25ld0JlYW5UeXBlRm9yQ2xhc3MoamF2YS5sYW5nLkludGVnZXIsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RmllbGRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldERlY2xhcmVkRmllbGRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEZpZWxkUHJveHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RmllbGRQcm94eShTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0RGVjbGFyZWRGaWVsZFByb3h5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5IGdldERlY2xhcmVkRmllbGRQcm94eShTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldE1ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldERlY2xhcmVkTWV0aG9kcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXJndW1lbnRDbGFzc05hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TnVsbENvbnN0cnVjdG9yUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I2dldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkKLQkgKi8KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldFN1cGVyQmVhblR5cGVQcm94eSgpCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFN1cGVyQmVhblR5cGVQcm94eSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzbmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEZvcm1hbFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzQXJyYXkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzSW50ZXJmYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNQcmltaXRpdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc0tpbmRPZihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0tpbmRPZihJQmVhblR5cGVQcm94eSBhQmVhblByb3h5VHlwZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6YXRpb25FcnJvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5Qcm94eSNnZXRJRCgpCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblByb3h5I3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1CZWFuUHJveHkjcmVuZGVyQmVhbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHJlbmRlckludG8pIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjZ2V0VHlwZVByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjdG9CZWFuU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I2lzVmFsaWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCQlyZXR1cm4gdGhpcyA9PSBhQmVhblByb3h5OyAvLyBUaGlzIGlzIHBsYWNlIGhvbGRlciBhbnl3YXkuIFNvIG9ubHkgaWRlbnRpY2FsIGlmIHNhbWUgcHJveHkuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGFyZ3VtZW50Q2xhc3NOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzQmVhblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0V4cHJlc3Npb25Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlW10pCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBudWxsOwkvLyBTaW5jZSB0aGlzIGd1eSBpcyBpbnZhbGlkLCB3ZSBjYW4ndCByZXR1cm4gYSBtZXRob2QuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRGaWVsZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlZ2VyQ2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZWdlckNsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MjVjNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlZ2VyQ2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUludGVnZXJDbGFzc0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIFByb3h5IGZvciBJbnRlZ2Vycy4gU2luY2UgSW50ZWdlcnMgd2VyZSBmaXJzdCBpbXBsZW1lbnRlZAotICogaW4gdGhlIFZDRSwgYW5kIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gcmVmZXJlbmNlZCwgd2UndmUgY3JlYXRlZAotICogYSBzdWJjbGFzcyB0byBoYW5kbGUgdGhlbS4gVGhhdCB3YXkgd2Ugd291bGRuJ3QgbmVlZCB0byBjaGFuZ2UKLSAqIGV2ZXJ5b25lIHRoYXQgd2FzIHVzaW5nIHRoZSBJSW50ZWdlclByb3h5IGludGVyZmFjZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwOC8zMS8wMCAxMToyODo0OCBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotY2xhc3MgUkVNSW50ZWdlckNsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IGltcGxlbWVudHMgSUludGVnZXJCZWFuUHJveHkgewotCi1SRU1JbnRlZ2VyQ2xhc3NCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSW50ZWdlcikgewotCXN1cGVyKGFSZWdpc3RyeSwgYW5JbnRlZ2VyKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuaW50ZWdlckNsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldCgoSW50ZWdlcikgbnVtYmVyVmFsdWUoKSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0MzZmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciBJbnRlZ2VyLmNsYXNzLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElJbnRlZ2VyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElJbnRlZ2VyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSUludGVnZXJCZWFuUHJveHkgdHdvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJSW50ZWdlckJlYW5Qcm94eSB0aHJlZVByb3h5OwotLyoqCi0gKiBSRU1JbnRlZ2VyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG51bWJlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLklOVEVHRVJfQ0xBU1MpLCBJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgbnVtYmVyVHlwZSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTUludGVnZXJDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDApKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNSW50ZWdlckNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMSkpOwotCXR3b1Byb3h5ID0gbmV3IFJFTUludGVnZXJDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDIpKTsKLQl0aHJlZVByb3h5ID0gbmV3IFJFTUludGVnZXJDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDMpKTsKLQkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVJbnRlZ2VyQmVhblByb3h5KEludGVnZXIgYW5JbnRlZ2VyKSB7Ci0Jc3dpdGNoKGFuSW50ZWdlci5pbnRWYWx1ZSgpKSB7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJY2FzZSAxOiByZXR1cm4gb25lUHJveHkgOwotCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQlkZWZhdWx0OiByZXR1cm4gbmV3IFJFTUludGVnZXJDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFuSW50ZWdlcik7Ci0JfQotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhbiBJbnRlZ2VyIHByb3h5LCBob3dldmVyLCB0aGUgTnVtYmVyIG11c3QgYmUgYW4gSW50ZWdlci4KLSAqLwotcHJvdGVjdGVkIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlTnVtYmVyQmVhblByb3h5KE51bWJlciBhTnVtYmVyKSB7Ci0JcmV0dXJuIGNyZWF0ZUludGVnZXJCZWFuUHJveHkoKEludGVnZXIpIGFOdW1iZXIpOwotfQkKLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIE51bWJlcidzIGRvbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVybyBwcm94eSBmb3IgdGhpcyBjYXNlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUludGVnZXJCZWFuUHJveHkobmV3IEludGVnZXIodmFsdWUuYW5JbnQpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJUeXBlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJUeXBlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzI3ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUludGVnZXJUeXBlQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSUludGVnZXJCZWFuUHJveHkgZm9yIHRoZSBwcmltaXRpdmUgImludCIuCi0gKiBJdCBjYW4gYW5zd2VyIGFsbCBvZiB0aGUgcHJpbWl0aXZlIG51bWJlciB0eXBlcyAoaW50LCBsb25nLCBzaG9ydCwgYnl0ZSwgZG91YmxlLCBmbG9hdCkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1jbGFzcyBSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSUludGVnZXJCZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgaW50IGZJbnQ7Ci0KLS8qKgotICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkCi0gKiBpbiBhIHNwZWNpYWwgd2F5IGFuZCBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZW0uCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1SRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIGludCBhbkludCkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkludCA9IGFuSW50OwotfQotLyoqCi0gKiBlcXVhbHM6IEVxdWFsIGlmOgotICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTUludGVnZXJUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkludCA9PSAoKFJFTUludGVnZXJUeXBlQmVhblByb3h5KSBhbk9iamVjdCkuaW50VmFsdWUoKTsKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQlyZXR1cm4gZkludCA9PSAoKEludGVnZXIpIGFuT2JqZWN0KS5pbnRWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotICovCi1wdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JaWYgKHRoaXMgPT0gYUJlYW5Qcm94eSkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZJbnQgPT0gKChSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuaW50VmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIChieXRlKSBmSW50OwotfQotLyoqCi0gKiBkb3VibGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gZkludDsKLX0KLS8qKgotICogZmxvYXRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JcmV0dXJuIGZJbnQ7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgaW50IHZhbHVlCi0gKi8KLXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JcmV0dXJuIGZJbnQ7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiBmSW50OwotfQotLyoqCi0gKiBudW1iZXJWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE51bWJlciBudW1iZXJWYWx1ZSgpIHsKLQlyZXR1cm4gbmV3IEludGVnZXIoZkludCk7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiAoc2hvcnQpIGZJbnQ7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIFN0cmluZy52YWx1ZU9mKGZJbnQpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5pbnRUeXBlOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChmSW50KTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjNzI0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUludGVnZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBJbnRlZ2VyLlRZUEUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1JbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSUludGVnZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSUludGVnZXJCZWFuUHJveHkgb25lUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJSW50ZWdlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElJbnRlZ2VyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1JbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5JTlRFR0VSX1RZUEUpLCBJbnRlZ2VyLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNSW50ZWdlclR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAwKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNSW50ZWdlclR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAxKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIDIpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNSW50ZWdlclR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAzKTsKLQkJCi19Ci0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqIFVzZSB0aGUgY2FjaGUgdG8gc2VlIGlmIHRoZSB2YWx1ZSBpcyBiZWluZyBoZWxkIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUKLSAqLwotSUludGVnZXJCZWFuUHJveHkgY3JlYXRlSW50ZWdlckJlYW5Qcm94eShpbnQgYW5JbnQpIHsKLQotCXN3aXRjaChhbkludCkgewotCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHk7Ci0JCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJY2FzZSAyOiByZXR1cm4gdHdvUHJveHkgOwotCQljYXNlIDM6IHJldHVybiB0aHJlZVByb3h5IDsKLQkJZGVmYXVsdDogcmV0dXJuIG5ldyBSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eShmUmVnaXN0cnksIGFuSW50KTsKLQl9Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBpbnRlZ2VyIGlzIGEgcHJpbWl0aXZlLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm9Qcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVJbnRlZ2VyQmVhblByb3h5KHZhbHVlLmFuSW50KTsKLX0KLQotLyoqCi0gKiBTaG9ydCBjdXQgZm9yIG5ld0luc3RhbmNlIHdoZXJlIHRoZSBzdHJpbmcgZm9sbG93cyB0aGUKLSAqIHNwZWNpZmljIHBhdHRlcm4gd2UgZXhwZWN0LiBUaGF0IHdheSBpdCB3b24ndCBiZSBuZWNlc3NhcnkgdG8gc2hpcCBvdmVyIHRvIHRoZSB2bSAKLSAqIHRvIHByb2Nlc3MgaXQuCi0gKgotICogVGhlIHBhdHRlcm4gaXQgY2FuIGFjY2VwdCBpczoKLSAqIAkxKSAoaW50KSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChieXRlKSBleHBsaWNpdGx5IGNhc3RzIGl0IGRvd24uCi0gKgkyKSB2YWxpZE51bWJlcgotICogSXQgd2lsbCB1c2UgdGhlIGRlY29kZSBmdW5jdGlvbiBvZiBpbnQgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCBudW1iZXIuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCVN0cmluZyB0cmltID0gaW5pdGlhbGl6YXRpb25TdHJpbmcudHJpbSgpOwotCWlmICh0cmltLmxlbmd0aCgpID09IDApCi0JCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CQotCWludCBhbkludDsKLQlpZiAodHJpbS5zdGFydHNXaXRoKCIoaW50KSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJTnVtYmVyIHYgPSBwYXJzZVN0cmluZyh0cmltLnN1YnN0cmluZygiKGludCkiLmxlbmd0aCgpKS50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ICE9IG51bGwpCi0JCQlhbkludCA9IHYuaW50VmFsdWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlhbkludCA9IEludGVnZXIuZGVjb2RlKHRyaW0pLmludFZhbHVlKCk7CS8vIFNlZSBpZiB2YWxpZCBpbnQgZm9ybWF0LgotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCQl9Ci0JfQotCi0JcmV0dXJuIGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoYW5JbnQpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZXJmYWNlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Mzc1YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBEZWZhdWx0IGJlYW50eXBlIHByb3h5IGZvciBhbiBpbnRlcmZhY2UuCi0gKi8KLQotcHVibGljIGNsYXNzIFJFTUludGVyZmFjZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIG51bGwpOwotCX0KLQkKLQkvKiogCi0JICogSW50ZXJmYWNlcyBhcmUgaW50ZXJmYWNlcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLQkgKgotCSAqIEZvciBhbGwgb2YgdGhlIGludGVyZmFjZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBGb3IgYWxsIG9mIHRoZSBpbnRlcmZhY2UgdHlwZXMsIHlvdSBjYW4ndCBjcmVhdGUgYSBuZXdCZWFuVHlwZSBmb3Igc3ViY2xhc3NlcyBzaW5jZQotCSAqIGludGVyZmFjZSBhcmVuJ3Qgc3ViY2xhc3NhYmxlLCBvbmx5IGV4dGVuZGFibGUuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RhY3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgaW50ZXJmYWNlcyBjYW4gbmV2ZXIgYmUgZG9uZSwKLQkgKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7IAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpIGlzIHZhbGlkIGJlY2F1c2UgaXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlCi0JICogYW4gaW5zdGFuY2Ugb2YgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZS4KLQkgKi8KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnZva2FibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW52b2thYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OGVlOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnZva2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBSRU1JbnZva2FibGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JSW52b2thYmxlOwotIAotCi0vKioKLSAqIFJlbW90ZSBJbnZva2FibGUuIFRoaXMgaW52b2tlcyBvbiB0aGUgcmVtb3RlIHZtLCBidXQgaXQgZG9lc24ndCB1c2UgYSBtZXRob2QgcHJveHkuIEluc3RlYWQKLSAqIGl0IHNlbmRzIHRoZSBpbmZvcm1hdGlvbiB0byBnZXQgdGhlIG1ldGhvZCB0byB0aGUgcmVtb3RlIHZtIGFsb25nIHdpdGggdGhlIHBhcm1zLiBUaGF0IHdheQotICogaXQgd2lsbCBkbyB0aGUgbG9va3VwIG9uIHRoZSByZW1vdGUgdm0gYW5kIHdlIGRvbid0IGhhdmUgdGhlIG92ZXJoZWFkIG9mIHR3byBjYWxscywgb25lIHRvCi0gKiBnZXQgdGhlIG1ldGhvZHByb3h5IGFuZCB0aGUgb3RoZXIgdG8gYWN0dWFsbHkgZG8gdGhlIGludm9rZS4gVGhpcyBzaG91bGQgdHlwaWNhbGx5IGJlIHVzZWQKLSAqIG9ubHkgZm9yIGluZnJlcXVlbnQgY2FsbHMgc28gdGhhdCBjYWNoZSBvZiB0aGUgbWV0aG9kIHByb3h5IGlzIG5vdCBuZWVkZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1jbGFzcyBSRU1JbnZva2FibGUgaW1wbGVtZW50cyBJSW52b2thYmxlIHsKLQotCXByb3RlY3RlZCBmaW5hbCBJUkVNQmVhblR5cGVQcm94eSBiZWFuVHlwZTsJLy8gQmVhbnR5cGUgdG8gZ2V0IG1ldGhvZCBmcm9tLgotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZTsJLy8gTWV0aG9kIG5hbWUKLQlwcm90ZWN0ZWQgZmluYWwgSUJlYW5UeXBlUHJveHlbXSBtZXRob2RBcmdUeXBlczsJLy8gQXJndW1lbnQgdHlwZXMgKG9yIG51bGwgaWYgbm8gYXJndW1lbnRzKS4KLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeTsJLy8gRmFjdG9yeSBmb3IgdGhpcyBpbnZva2FibGUKLQkKLQkKLQlSRU1JbnZva2FibGUoSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIG1ldGhvZEFyZ1R5cGVzKSB7Ci0JCXRoaXMuYmVhblR5cGUgPSBiZWFuVHlwZTsKLQkJdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLQkJdGhpcy5tZXRob2RBcmdUeXBlcyA9IG1ldGhvZEFyZ1R5cGVzOwotCQl0aGlzLmZhY3RvcnkgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGJlYW5UeXBlLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JfQotCQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBpbnZva2Uoc3ViamVjdCwgKElCZWFuUHJveHlbXSkgbnVsbCk7Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eVtdIHBhcm1zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gaW52b2tlV2l0aFBhcm1zKHN1YmplY3QsIHBhcm1zKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW50ZXJuYWwgbWV0aG9kIHRoYXQgYWxsb3dzIG1peHR1cmUgb2YgY29uc3RhbnRzIChlLmcuIFN0cmluZykgd2l0aCBiZWFuIHByb3hpZXMuCi0JICogQSBwYXJtIHZhbHVlIGNhbiBiZSBhIFJFTU1ldGhvZFByb3h5LlBhcm1BcnJheS4gVGhpcyBtZWFucyB0aGlzIHBhcm0gaXMgYW4gYXJyYXkgdGhhdAotCSAqIG5lZWRzIHRvIGhhdmUgYSBWYWx1ZVJldHJpZXZlciBjcmVhdGVkIGZvciBpdC4gVGhpcyBpcyB1c2VkIGlmIHRoZSBhcnJheSBoYXMgSUQncyBpbgotCSAqIGl0IGFuZCBpcyBub3QgYW4gZXhpc3RpbmcgYXJyYXkgb24gdGhlIHNlcnZlciBvciBhbGwgY29uc3RhbnQgdmFsdWVzLgotCSAqCi0JICogTk9URTogSXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBJQmVhblR5cGVQcm94aWVzIG9mIHRoZSBwYXJtcyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICogICAgICAgSXQgc2hvdWxkIHN0aWxsIHdvcmssIGJ1dCBpdCBjb3VsZCBiZSBhc2tpbmcgZm9yIHRoZW0gaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmVxdWVzdAotCSAqICAgICAgIGlmIHRoZXkgYXJlIG5vdCBmaXJzdCBnb3R0b24uCi0JICoKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VXaXRoUGFybXMoSUJlYW5Qcm94eSBzdWJqZWN0LCBmaW5hbCBPYmplY3RbXSBwYXJtcykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSVJFTUNvbm5lY3Rpb24gY29ubmVjdCA9IGZhY3RvcnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpOwotCQlwcm94eUZhY3Rvcnkuc3RhcnRUcmFuc2FjdGlvbigpOyAvLyBUaGlzIGlzIGRlZmluYXRlbHkgYSB0cmFuc2FjdGlvbiwgc28gc3RhcnQgaXQuCi0JCXRyeSB7Ci0JCQkvLyBGaXJzdCBuZWVkIHRvIHNlbmQgdGhlIG1ldGhvZCBpbmZvLgotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgY2xhc3NWYWx1ZSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJYmVhblR5cGUucmVuZGVyQmVhbihjbGFzc1ZhbHVlKTsKLQkJCQotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcGFybVR5cGVzVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCWlmIChtZXRob2RBcmdUeXBlcyAhPSBudWxsKSB7Ci0JCQkJY2xhc3MgUmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCU9iamVjdFtdIGFycmF5OwotCQkJCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQotCQkJCQlwdWJsaWMgUmV0cmlldmVyKE9iamVjdFtdIGFuQXJyYXkpIHsKLQkJCQkJCWFycmF5ID0gYW5BcnJheTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQkJCQlPYmplY3QgcGFybSA9IGFycmF5W2luZGV4KytdOwotCQkJCQkJKChJUkVNQmVhblR5cGVQcm94eSkgcGFybSkucmVuZGVyQmVhbih3b3JrZXIpOwotCQkJCQkJcmV0dXJuIHdvcmtlcjsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlwYXJtVHlwZXNWYWx1ZS5zZXRBcnJheUlEUyhuZXcgUmV0cmlldmVyKG1ldGhvZEFyZ1R5cGVzKSwgbWV0aG9kQXJnVHlwZXMubGVuZ3RoLCBDb21tYW5kcy5DTEFTU19DTEFTUyk7IC8vIENyZWF0ZSBDbGFzc1tdLgotCQkJfQotCQkJCi0JCQkKLQkJCS8vIE5vdyB3ZSBzdGFydCBidWlsZGluZyB0aGUgYWN0dWFsIGludm9jYXRpb24uCi0JCQkKLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHN1YmplY3RWYWx1ZSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJaWYgKHN1YmplY3QgIT0gbnVsbCkKLQkJCQkgKChJUkVNQmVhblByb3h5KSBzdWJqZWN0KS5yZW5kZXJCZWFuKHN1YmplY3RWYWx1ZSk7Ci0KLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1zVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQotCQkJaWYgKHBhcm1zICE9IG51bGwpIHsKLQkJCQkvLyBIYXZlIGEgbG9jYWwgZGVmaW5pdGlvbiBvZiB0aGUgcmV0cmlldmVyIHNvIHRoYXQgdGhlIHJldHJpZXZlciBjYW4gY3JlYXRlCi0JCQkJLy8gYW5vdGhlciBvbmUgb2YgaXRzZWxmIGlmIG5lY2Vzc2FyeS4KLQkJCQlmaW5hbCBJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSB0eXBlRmFjdG9yeSA9IGZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQotCQkJCWNsYXNzIFJldHJpZXZlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlUmV0cmlldmUgewotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlPYmplY3RbXSBhcnJheTsKLQkJCQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0KLQkJCQkJcHVibGljIFJldHJpZXZlcihPYmplY3RbXSBhbkFycmF5KSB7Ci0JCQkJCQlhcnJheSA9IGFuQXJyYXk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV4dFZhbHVlKCkgewotCQkJCQkJT2JqZWN0IHBhcm0gPSBhcnJheVtpbmRleCsrXTsKLQkJCQkJCWlmIChwYXJtICE9IG51bGwpCi0JCQkJCQkJaWYgKHBhcm0gaW5zdGFuY2VvZiBJUkVNQmVhblByb3h5KQotCQkJCQkJCQkgKChJUkVNQmVhblByb3h5KSBwYXJtKS5yZW5kZXJCZWFuKHdvcmtlcik7Ci0JCQkJCQkJZWxzZSBpZiAocGFybSBpbnN0YW5jZW9mIFRyYW5zbWl0YWJsZUFycmF5KSB7Ci0JCQkJCQkJCS8vIEl0IGlzIGFub3RoZXIgYXJyYXksIGNyZWF0ZSBhIG5ldyByZXRyaWV2ZXIuCi0JCQkJCQkJCXdvcmtlci5zZXRBcnJheUlEUygKLQkJCQkJCQkJCW5ldyBSZXRyaWV2ZXIoKChUcmFuc21pdGFibGVBcnJheSkgcGFybSkuYXJyYXkpLAotCQkJCQkJCQkJKChUcmFuc21pdGFibGVBcnJheSkgcGFybSkuYXJyYXkubGVuZ3RoLAotCQkJCQkJCQkJKChUcmFuc21pdGFibGVBcnJheSkgcGFybSkuY29tcG9uZW50VHlwZUlEKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBJdCdzIGFuIG9iamVjdC4gTmVlZCB0byBnZXQgYmVhbiB0eXBlIHNvIHRoYXQgd2UgY2FuIHNlbmQgaXQuCi0JCQkJCQkJCUlSRU1CZWFuUHJveHkgdHlwZSA9IChJUkVNQmVhblByb3h5KSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHBhcm0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCQkJCQlpZiAodHlwZSA9PSBudWxsKQotCQkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCQkJCQlpbnQgY2xhc3NJRCA9IHR5cGUuZ2V0SUQoKS5pbnRWYWx1ZSgpOwotCQkJCQkJCQl3b3JrZXIuc2V0QXNPYmplY3QocGFybSwgY2xhc3NJRCk7Ci0JCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCXdvcmtlci5zZXQoKTsKLQkJCQkJCXJldHVybiB3b3JrZXI7IAotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCXBhcm1zVmFsdWUuc2V0QXJyYXlJRFMobmV3IFJldHJpZXZlcihwYXJtcyksIHBhcm1zLmxlbmd0aCwgQ29tbWFuZHMuT0JKRUNUX0NMQVNTKTsgLy8gQ3JlYXRlIE9iamVjdFtdLgotCQkJfQotCi0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJdHJ5IHsKLQkJCQlpbnZva2UoY29ubmVjdCwgcHJveHlGYWN0b3J5LCBjbGFzc1ZhbHVlLCBwYXJtVHlwZXNWYWx1ZSwgc3ViamVjdFZhbHVlLCBwYXJtc1ZhbHVlLCByZXR1cm5WYWx1ZSk7Ci0JCQkJcmV0dXJuIHByb3h5RmFjdG9yeS5nZXRCZWFuUHJveHkocmV0dXJuVmFsdWUpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQkvLyBDbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLgotCQkJCQlmYWN0b3J5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJCWNvbm5lY3QgPSBmYWN0b3J5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnZva2UoY29ubmVjdCwgcHJveHlGYWN0b3J5LCBjbGFzc1ZhbHVlLCBwYXJtVHlwZXNWYWx1ZSwgc3ViamVjdFZhbHVlLCBwYXJtc1ZhbHVlLCByZXR1cm5WYWx1ZSk7Ci0JCQkJCQlyZXR1cm4gcHJveHlGYWN0b3J5LmdldEJlYW5Qcm94eShyZXR1cm5WYWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCQkvLyBGYWlsZWQgYWdhaW4uIEp1c3QgY2xvc2UgYW5kIHByaW50IHRyYWNlLgotCQkJCQkJZmFjdG9yeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlQWdhaW4pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBBIHJlY292ZXJhYmxlIGVycm9yLCBwcmludCB0cmFjZSBhbmQgcmV0dXJuCi0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcHJveHlGYWN0b3J5LnN0b3BUcmFuc2FjdGlvbigpOwotCQkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKLQkJCQlmYWN0b3J5LnJldHVybkNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCX0KLQl9Ci0KLXByaXZhdGUgdm9pZCBpbnZva2UoCi0JCUlSRU1Db25uZWN0aW9uIGNvbm5lY3QsCi0JCVJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnksCi0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IGNsYXNzVHlwZVZhbHVlLAotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtVHlwZXNWYWx1ZSwKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgc3ViamVjdFZhbHVlLAotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtc1ZhbHVlLAotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkKLQkJdGhyb3dzIFRocm93YWJsZVByb3h5LCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNvbm5lY3QuaW52b2tlTWV0aG9kKGNsYXNzVHlwZVZhbHVlLCBtZXRob2ROYW1lLCBwYXJtVHlwZXNWYWx1ZSwgc3ViamVjdFZhbHVlLCBwYXJtc1ZhbHVlLCByZXR1cm5WYWx1ZSk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQlwcm94eUZhY3RvcnkucHJvY2Vzc0Vycm9yUmV0dXJuKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eSBwYXJtKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gaW52b2tlKHN1YmplY3QsIG5ldyBJQmVhblByb3h5W10geyBwYXJtIH0pOwotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbnZva2Uoc3ViamVjdCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZhY3RvcnkucmVsZWFzZVByb3h5KGUpOyAvLyBTaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eVtdIHBhcm1zKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKHN1YmplY3QsIHBhcm1zKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7IC8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IHBhcm0pIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbnZva2Uoc3ViamVjdCwgcGFybSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZhY3RvcnkucmVsZWFzZVByb3h5KGUpOyAvLyBTaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdDbGFzc0JlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Mb25nQ2xhc3NCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4YTJlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNTG9uZ0NsYXNzQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBSZW1vdGUgUHJveHkgZm9yIExvbmcuY2xhc3MuCi0gKi8KLWNsYXNzIFJFTUxvbmdDbGFzc0JlYW5Qcm94eSBleHRlbmRzIFJFTU51bWJlckJlYW5Qcm94eSB7Ci0KLVJFTUxvbmdDbGFzc0JlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIExvbmcgYUxvbmcpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFMb25nKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkubG9uZ0NsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldCgoTG9uZykgbnVtYmVyVmFsdWUoKSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Mb25nQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2YThkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBMb25nLmNsYXNzLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNTG9uZ0NsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSBvbmVQcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdHdvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1Mb25nQ2xhc3NCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuTE9OR19DTEFTUyksIExvbmcuY2xhc3MuZ2V0TmFtZSgpLCBudW1iZXJUeXBlKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNTG9uZ0NsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IExvbmcoMCkpOwkKLQlvbmVQcm94eSA9IG5ldyBSRU1Mb25nQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgTG9uZygxKSk7Ci0JdHdvUHJveHkgPSBuZXcgUkVNTG9uZ0NsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IExvbmcoMikpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNTG9uZ0NsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IExvbmcoMykpOwkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUxvbmdCZWFuUHJveHkoTG9uZyBhTG9uZykgewotCWlmIChhTG9uZy5sb25nVmFsdWUoKSA+PSAwICYmIGFMb25nLmxvbmdWYWx1ZSgpIDwgNCkgewotCQkvLyBTd2l0Y2ggc3RhdGVtZW50cyBkb24ndCB3b3JrIHdpdGggbG9uZ3MuCi0JCXN3aXRjaChhTG9uZy5pbnRWYWx1ZSgpKSB7Ci0JCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHk7Ci0JCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCQljYXNlIDM6IHJldHVybiB0aHJlZVByb3h5IDsKLQkJfQotCX0gCi0JcmV0dXJuIG5ldyBSRU1Mb25nQ2xhc3NCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhTG9uZyk7Ci19Ci0KLS8qKgotICogR2VuZXJpYyB3YXkgdG8gY3JlYXRlIGEgTG9uZyBwcm94eSwgaG93ZXZlciwgdGhlIE51bWJlciBtdXN0IGJlIGEgTG9uZy4KLSAqLwotcHJvdGVjdGVkIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlTnVtYmVyQmVhblByb3h5KE51bWJlciBhTnVtYmVyKSB7Ci0JcmV0dXJuIGNyZWF0ZUxvbmdCZWFuUHJveHkoKExvbmcpIGFOdW1iZXIpOwotfQkKLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIE51bWJlcidzIGRvbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVybyBwcm94eSBmb3IgdGhpcyBjYXNlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUxvbmdCZWFuUHJveHkobmV3IExvbmcodmFsdWUuYUxvbmcpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdUeXBlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdUeXBlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MjY2MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Mb25nVHlwZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUxvbmdUeXBlQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSU51bWJlckJlYW5Qcm94eSBmb3IgdGhlIHByaW1pdGl2ZSAibG9uZyIuCi0gKiBJdCBjYW4gYW5zd2VyIGFsbCBvZiB0aGUgcHJpbWl0aXZlIG51bWJlciB0eXBlcyAoaW50LCBsb25nLCBzaG9ydCwgYnl0ZSwgZG91YmxlLCBmbG9hdCkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1jbGFzcyBSRU1Mb25nVHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSU51bWJlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nIGZMb25nOwotCi0vKioKLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotUkVNTG9uZ1R5cGVCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBsb25nIGFMb25nKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmTG9uZyA9IGFMb25nOwotfQotLyoqCi0gKiBlcXVhbHM6IEVxdWFsIGlmOgotICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTUxvbmdUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkxvbmcgPT0gKChSRU1Mb25nVHlwZUJlYW5Qcm94eSkgYW5PYmplY3QpLmxvbmdWYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIExvbmcpCi0JCXJldHVybiBmTG9uZyA9PSAoKExvbmcpIGFuT2JqZWN0KS5sb25nVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLSAqLwotcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhQmVhblByb3h5IGluc3RhbmNlb2YgUkVNTG9uZ1R5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmTG9uZyA9PSAoKFJFTUxvbmdUeXBlQmVhblByb3h5KSBhQmVhblByb3h5KS5sb25nVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKioKLSAqIGJ5dGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewotCXJldHVybiAoYnl0ZSkgZkxvbmc7Ci19Ci0vKioKLSAqIGRvdWJsZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCXJldHVybiBmTG9uZzsKLX0KLS8qKgotICogZmxvYXRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JcmV0dXJuIGZMb25nOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGludCB2YWx1ZQotICovCi1wdWJsaWMgaW50IGludFZhbHVlKCkgewotCXJldHVybiAoaW50KSBmTG9uZzsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIGZMb25nOwotfQotLyoqCi0gKiBudW1iZXJWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE51bWJlciBudW1iZXJWYWx1ZSgpIHsKLQlyZXR1cm4gbmV3IExvbmcoZkxvbmcpOwotfQotLyoqCi0gKiBzaG9ydFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQlyZXR1cm4gKHNob3J0KSBmTG9uZzsKLX0KLQotLyoqCi0gKiBUaGUgYmVhbidzIHRvU3RyaW5nLgotICovCi1wdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZkxvbmcpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5sb25nVHlwZTsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoZkxvbmcpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ1R5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJjNmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ1R5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNTG9uZ1R5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSUJlYW5UeXBlUHJveHkgZm9yIExvbmcuVFlQRS8KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUxvbmdUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgb25lUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHR3b1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0aHJlZVByb3h5OwotLyoqCi0gKiBSRU1JbnRlZ2VyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNTG9uZ1R5cGVCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuTE9OR19UWVBFKSwgTG9uZy5UWVBFLmdldE5hbWUoKSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTUxvbmdUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgMCk7CQotCW9uZVByb3h5ID0gbmV3IFJFTUxvbmdUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgMSk7Ci0JdHdvUHJveHkgPSBuZXcgUkVNTG9uZ1R5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAyKTsKLQl0aHJlZVByb3h5ID0gbmV3IFJFTUxvbmdUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgMyk7CQkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlTG9uZ0JlYW5Qcm94eShsb25nIGFMb25nKSB7Ci0JaWYgKGFMb25nID49IDAgJiYgYUxvbmcgPCA0KSB7Ci0JCS8vIFN3aXRjaCBzdGF0ZW1lbnRzIGRvbid0IHdvcmsgd2l0aCBsb25ncy4KLQkJc3dpdGNoKChpbnQpIGFMb25nKSB7Ci0JCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHk7Ci0JCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCQljYXNlIDM6IHJldHVybiB0aHJlZVByb3h5IDsKLQkJfQotCX0gCi0JcmV0dXJuIG5ldyBSRU1Mb25nVHlwZUJlYW5Qcm94eShmUmVnaXN0cnksIGFMb25nKTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIGxvbmcgaXMgYSBwcmltaXRpdmUsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVyb1Byb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQkKLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVMb25nQmVhblByb3h5KHZhbHVlLmFMb25nKTsKLX0KLQotLyoqCi0gKiBTaG9ydCBjdXQgZm9yIG5ld0luc3RhbmNlIHdoZXJlIHRoZSBzdHJpbmcgZm9sbG93cyB0aGUKLSAqIHNwZWNpZmljIHBhdHRlcm4gd2UgZXhwZWN0LiBUaGF0IHdheSBpdCB3b24ndCBiZSBuZWNlc3NhcnkgdG8gc2hpcCBvdmVyIHRvIHRoZSB2bSAKLSAqIHRvIHByb2Nlc3MgaXQuCi0gKgotICogVGhlIHBhdHRlcm4gaXQgY2FuIGFjY2VwdCBpczoKLSAqIAkxKSAobG9uZykgdmFsaWROdW1iZXIgLSBudW1iZXIgY2FuIGJlIGFueSBudW1iZXIgYmVjYXVzZSAoYnl0ZSkgZXhwbGljaXRseSBjYXN0cyBpdCBkb3duLgotICoJMikgdmFsaWROdW1iZXIKLSAqIEl0IHdpbGwgdXNlIHRoZSBkZWNvZGUgZnVuY3Rpb24gb2YgbG9uZyB0byBkZXRlcm1pbmUgdGhlIHZhbGlkIG51bWJlci4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JU3RyaW5nIHRyaW0gPSBpbml0aWFsaXphdGlvblN0cmluZy50cmltKCk7Ci0JaWYgKHRyaW0ubGVuZ3RoKCkgPT0gMCkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsKLQlsb25nIGFMb25nOwotCWlmICh0cmltLnN0YXJ0c1dpdGgoIihsb25nKSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJTnVtYmVyIHYgPSBwYXJzZVN0cmluZyh0cmltLnN1YnN0cmluZygiKGxvbmcpIi5sZW5ndGgoKSkudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodiAhPSBudWxsKQotCQkJYUxvbmcgPSB2LmxvbmdWYWx1ZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBDYW4ndCBkZWNvZGUgaXQsIGxldCBmdWxsIHBhcnNlciBoYW5kbGUgaXQuCi0JfSBlbHNlIHsKLQkJaWYgKHRyaW0uY2hhckF0KHRyaW0ubGVuZ3RoKCktMSkgPT0gJ0wnIHx8IHRyaW0uY2hhckF0KHRyaW0ubGVuZ3RoKCktMSkgPT0gJ2wnKQotCQkJdHJpbSA9IHRyaW0uc3Vic3RyaW5nKDAsIHRyaW0ubGVuZ3RoKCktMSk7Ci0JCXRyeSB7Ci0JCQlhTG9uZyA9IExvbmcuZGVjb2RlKHRyaW0pLmxvbmdWYWx1ZSgpOwkvLyBTZWUgaWYgdmFsaWQgbG9uZyBmb3JtYXQuCi0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBDYW4ndCBkZWNvZGUgaXQsIGxldCBmdWxsIHBhcnNlciBoYW5kbGUgaXQuCi0JCX0KLQl9Ci0KLQlyZXR1cm4gZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChhTG9uZyk7Ci19Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1hc3RlclNlcnZlclRocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NYXN0ZXJTZXJ2ZXJUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlNjBlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1hc3RlclNlcnZlclRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTU1hc3RlclNlcnZlclRocmVhZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBNYXN0ZXIgU2VydmVyIHRocmVhZCBmb3IgdGhlIFJlbW90ZSBWTXMuCi0gKiAKLSAqIEl0IHJlc3BvbmRzIHRvIHRoZSByZW1vdGUgdm0gcmVxdWVzdHMgdG8gdGhpcyBJREUuCi0gKiAKLSAqIEl0IGlzIHBhY2thZ2UtcHJvdGVjdGVkIGJlY2F1c2Ugb25seSBQcm94eVJlbW90ZVBsdWd1aW4gc2hvdWxkIGFjY2VzcyBpdC4KLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqLwotY2xhc3MgUkVNTWFzdGVyU2VydmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkKLQlwcm90ZWN0ZWQgU2VydmVyU29ja2V0IG1hc3RlclNlcnZlclNvY2tldDsKLQlwcm90ZWN0ZWQgUkVNUmVnaXN0cnlDb250cm9sbGVyIHJlZ2lzdHJ5Q29udHJvbGxlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSBmYWxzZTsKLQkKLQkvLyBLbHVkZ2U6IEJ1ZyBpbiBMaW51eCAxLjMueHh4IG9mIEpWTS4gQ2xvc2luZyBhIHNvY2tldCB3aGlsZSB0aGUgc29ja2V0IGlzIGJlaW5nIHJlYWQvYWNjZXB0IHdpbGwgbm90IGludGVycnVwdCB0aGUKLQkvLyB3YWl0LiBOZWVkIHRvIHRpbWVvdXQgdG8gdGhlIHNvY2tldCByZWFkL2FjY2VwdCBiZWZvcmUgdGhlIHNvY2tldCBjbG9zZSB3aWxsIGJlIG5vdGljZWQuIFRoaXMgaGFzIGJlZW4gZml4ZWQKLQkvLyBpbiBMaW51eCAxLjQuIFNvIG9uIExpbnV4IDEuMyBuZWVkIHRvIHB1dCB0aW1lb3V0cyBpbiBvbiB0aG9zZSBzb2NrZXRzIHRoYXQgY2FuIGJlIHNlcGFyYXRlbHkgY2xvc2VkIHdoaWxlIHJlYWRpbmcvYWNjZXB0aW5nLgotCXN0YXRpYyBib29sZWFuIExJTlVYXzFfMyA9ICJsaW51eCIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkgJiYgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iLCIiKS5zdGFydHNXaXRoKCIxLjMiKTsJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQotCQotCXB1YmxpYyBSRU1NYXN0ZXJTZXJ2ZXJUaHJlYWQoUkVNUmVnaXN0cnlDb250cm9sbGVyIHJlZ2lzdHJ5Q29udHJvbGxlcikgewotCQlzdXBlcigiUmVtb3RlIFByb3h5IE1hc3RlciBTZXJ2ZXIgVGhyZWFkIik7CS8vJE5PTi1OTFMtMSQKLQkJdGhpcy5yZWdpc3RyeUNvbnRyb2xsZXIgPSByZWdpc3RyeUNvbnRyb2xsZXI7Ci0JCQotCQl0cnkgewotCQkJbWFzdGVyU2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwLCA1MCwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJsb2NhbGhvc3QiKSk7CS8vIEFueSBhdmFpbGFibGUgcG9ydCAvLyROT04tTkxTLTEkCi0JCQlpZiAoTElOVVhfMV8zKQotCQkJCW1hc3RlclNlcnZlclNvY2tldC5zZXRTb1RpbWVvdXQoMTAwMCk7CS8vIExpbnV4IDEuMyBidWcsIHNlZSBjb21tZW50IG9uIExJTlVYXzFfMwotCQl9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7CS8vIFRoaXMgaXMgYmFkLiBTaG91bGQgYmUgbm8gZXhjZXB0aW9ucyBjcmVhdGluZyBhIHNvY2tldC4gLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CQkJCQotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7CS8vIFRoaXMgaXMgYmFkLiBTaG91bGQgYmUgbm8gZXhjZXB0aW9ucyBjcmVhdGluZyBhIHNvY2tldC4gLy8kTk9OLU5MUy0xJAotCQl9CQkJCi0JfQotCi0JcHVibGljIFNlcnZlclNvY2tldCBnZXRNYXN0ZXJTb2NrZXQoKSB7Ci0JCXJldHVybiBtYXN0ZXJTZXJ2ZXJTb2NrZXQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlRocmVhZCNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCXdoaWxlIChtYXN0ZXJTZXJ2ZXJTb2NrZXQgIT0gbnVsbCkgewotCQkJCVNvY2tldCBpbmNvbWluZyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5jb21pbmcgPSBtYXN0ZXJTZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNvbnRpbnVlOyAvLyBUaW1lb3V0LCB0cnkgYWdhaW4KLQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNvbnRpbnVlOwkvLyBJbiBMaW51eCAxLjMgY2FzZSBtYXN0ZXJTZXJ2ZXJTb2NrZXQgY291bGQgb2YgZ29uZSBudWxsIGJldHdlZW4gbG9vcCB0ZXN0IGFuZCB0cnkgYmxvY2suCi0JCQkJfQotCQkJCWJvb2xlYW4gY2xvc2UgPSBmYWxzZTsJLy8gcHJvY2VzcyByZXF1ZXN0IHdpbGwgdGVsbCBpZiBzb2NrZXQgc2hvdWxkIGJlIGNsb3NlZC4gaXQgbWF5IGJlIHBhc3NlZCBvbnRvIGNhbGxiYWNrIHRocmVhZCBpbnN0ZWFkLgotCQkJCXRyeSB7Ci0JCQkJCWNsb3NlID0gcHJvY2Vzc1JlcXVlc3QoaW5jb21pbmcpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChjbG9zZSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCWluY29taW5nLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLX0KLQkJCQlpbmNvbWluZyA9IG51bGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoIXNodXR0aW5nRG93bikKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlzaHV0ZG93bigpOwkvLyBFaXRoZXIgYSBiYWQgZXhjZXB0aW9uIG9yIHdlIHdlcmUgY2xvc2VkLiBFaXRoZXIgd2F5IGlzIHNodXRkb3duLgotCX0KLQkKLQkvKioKLQkgKiBVc2UgdGhpcyB0byByZXF1ZXN0IGEgc2h1dGRvd24uCi0JICovCi0JcHVibGljIHZvaWQgcmVxdWVzdFNodXRkb3duKCkgewkJCi0JCWlmIChtYXN0ZXJTZXJ2ZXJTb2NrZXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gQ2xvc2luZyB0aGUgc2VydmVyIHNvY2tldCBzaG91bGQgY2F1c2UgYSBicmVhay4KLQkJdHJ5IHsKLQkJCXNodXR0aW5nRG93biA9IHRydWU7Ci0JCQltYXN0ZXJTZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm47Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUmVxdWVzdChTb2NrZXQgcmVtb3RlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhSW5wdXRTdHJlYW0JaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHJlbW90ZS5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShyZW1vdGUuZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQlib29sZWFuICBjbG9zZSA9IHRydWU7CS8vIGZsYWcgaW5kaWNhdGluZyBzb2NrZXQgbm90IGdpdmVuIG92ZXIgdG8gY2FsbGJhY2suIERvbid0IGNsb3NlIHRoZSBzb2NrZXQgd2hlbiBkb25lIGJlY2F1c2UgY2FsbGJhY2sgaGFzIGl0LgotCQl0cnkgewotCQkJYnl0ZSBjbWQgPSBpbi5yZWFkQnl0ZSgpOwotCQkJc3dpdGNoIChjbWQpIHsKLQkJCQljYXNlIENvbW1hbmRzLkFMSVZFOgotCQkJCQlpbnQgcmVnaXN0cnlJRCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJb3V0LndyaXRlQm9vbGVhbihyZWdpc3RyeUNvbnRyb2xsZXIuZ2V0UmVnaXN0cnkobmV3IEludGVnZXIocmVnaXN0cnlJRCkpICE9IG51bGwpOwkvLyBSZXR1cm4gaWYgcmVnaXN0cnkgc3RpbGwgYWxpdmUKLQkJCQkJb3V0LmZsdXNoKCk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIENvbW1hbmRzLlJFTU9URV9TVEFSVEVEOgotCQkJCQlyZWdpc3RyeUlEID0gaW4ucmVhZEludCgpOwotCQkJCQlpbnQgcmVtb3RlU2VydmVyUG9ydCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSByZWdpc3RyeUNvbnRyb2xsZXIuZ2V0UmVnaXN0cnkobmV3IEludGVnZXIocmVnaXN0cnlJRCkpOwotCQkJCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJCQkJcmVnaXN0cnkuc2V0U2VydmVyUG9ydChyZW1vdGVTZXJ2ZXJQb3J0KTsKLQkJCQkJCW91dC53cml0ZUJvb2xlYW4odHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJb3V0LndyaXRlQm9vbGVhbihmYWxzZSk7CS8vIE5vIHJlZ2lzdHJ5Ci0JCQkJCW91dC5mbHVzaCgpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBDb21tYW5kcy5BVFRBQ0hfQ0FMTEJBQ0s6Ci0JCQkJCXJlZ2lzdHJ5SUQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCXJlZ2lzdHJ5ID0gcmVnaXN0cnlDb250cm9sbGVyLmdldFJlZ2lzdHJ5KG5ldyBJbnRlZ2VyKHJlZ2lzdHJ5SUQpKTsKLQkJCQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCQkJCWNsb3NlID0gISgoUkVNQ2FsbGJhY2tSZWdpc3RyeSkgcmVnaXN0cnkuZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpKS5jcmVhdGVDYWxsYmFjayhyZW1vdGUpOwkvLyBjbG9zZSBpZiBmYWlsZWQsIGRvbid0IGNsb3NlIGlmIGdvb2QuCi0JCQkJCQlvdXQud3JpdGVCb29sZWFuKCFjbG9zZSk7CS8vIGlmIG5vdCBjbG9zZSwgdGhlbiByZXR1cm4gaXQgd29ya2VkLgotCQkJCQl9IGVsc2UKLQkJCQkJCW91dC53cml0ZUJvb2xlYW4oZmFsc2UpOwotCQkJCQlvdXQuZmx1c2goKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsJIC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjbG9zZSkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjbG9zZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNodXRkb3duKCkgewotCQlyZXF1ZXN0U2h1dGRvd24oKTsKLQkJbWFzdGVyU2VydmVyU29ja2V0ID0gbnVsbDsJCQotCX0JCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmM2NzRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWV0aG9kUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1NZXRob2RQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUmVtb3RlIFZNIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNZXRob2RQcm94eQotICovCi0KLWZpbmFsIGNsYXNzIFJFTU1ldGhvZFByb3h5IGV4dGVuZHMgUkVNQWNjZXNzaWJsZU9iamVjdFByb3h5IGltcGxlbWVudHMgSVJFTU1ldGhvZFByb3h5IHsKLQotCXByaXZhdGUgSUJlYW5UeXBlUHJveHkgZkRlY2xhcmluZ1R5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZk1ldGhvZE5hbWU7Ci0JcHJpdmF0ZSBJQmVhblR5cGVQcm94eVtdIGZQYXJhbWV0ZXJUeXBlczsKLQlwcml2YXRlIElCZWFuVHlwZVByb3h5IGZSZXR1cm5UeXBlOwotCi0JUkVNTWV0aG9kUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklEKTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0Q2xhc3NUeXBlKCkgewotCQlpZiAoZkRlY2xhcmluZ1R5cGUgPT0gbnVsbCkKLQkJCWZEZWNsYXJpbmdUeXBlID0KLQkJCQkoSUJlYW5UeXBlUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzCi0JCQkJCS5nZXRDb25zdGFudHMoZkZhY3RvcnkpCi0JCQkJCS5nZXRNZXRob2REZWNsYXJpbmdDbGFzc01lc3NhZ2UoKQotCQkJCQkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKAotCQkJCQl0aGlzKTsKLQkJcmV0dXJuIGZEZWNsYXJpbmdUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGZNZXRob2ROYW1lID09IG51bGwpIHsKLQkJCUlTdHJpbmdCZWFuUHJveHkgcHJveHkgPQotCQkJCShJU3RyaW5nQmVhblByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cwotCQkJCQkuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KQotCQkJCQkuZ2V0TWV0aG9kTWV0aG9kTmFtZU1lc3NhZ2UoKQotCQkJCQkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKAotCQkJCQl0aGlzKTsKLQkJCWlmIChwcm94eSAhPSBudWxsKQotCQkJCWZNZXRob2ROYW1lID0gcHJveHkuc3RyaW5nVmFsdWUoKTsKLQkJCWVsc2UKLQkJCQlmTWV0aG9kTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZNZXRob2ROYW1lOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUJlYW5UeXBlUHJveHlbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLQkJaWYgKGZQYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgcGFybVR5cGVzID0gKElBcnJheUJlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KQotCQkJCQkuZ2V0TWV0aG9kUGFyYW1ldGVyVHlwZXNNZXNzYWdlKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMpOwotCQkJaWYgKHBhcm1UeXBlcyA9PSBudWxsKQotCQkJCWZQYXJhbWV0ZXJUeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVswXTsgLy8gVGhlcmUgd2FzIHNvbWUgZXJyb3IsIG9ubHkgd2F5IG51bGwgaXMgcmV0dXJuZWQKLQkJCWVsc2UgewotCQkJCWludCBsZW4gPSBwYXJtVHlwZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJZlBhcmFtZXRlclR5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5W2xlbl07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCQkJdHJ5IHsKLQkJCQkJCWZQYXJhbWV0ZXJUeXBlc1tpXSA9IChJQmVhblR5cGVQcm94eSkgcGFybVR5cGVzLmdldChpKTsKLQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJCQl9Ci0JCQkJZkZhY3RvcnkucmVsZWFzZVByb3h5KHBhcm1UeXBlcyk7IC8vIERvbid0IG5lZWQgdGhlIGFycmF5IG9uIHRoZSBzZXJ2ZXIgYW55bW9yZS4KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmUGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFJldHVyblR5cGUoKSB7Ci0JCWlmIChmUmV0dXJuVHlwZSA9PSBudWxsKQotCQkJZlJldHVyblR5cGUgPQotCQkJCShJQmVhblR5cGVQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMKLQkJCQkJLmdldENvbnN0YW50cyhmRmFjdG9yeSkKLQkJCQkJLmdldE1ldGhvZFJldHVyblR5cGVNZXNzYWdlKCkKLQkJCQkJLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygKLQkJCQkJdGhpcyk7Ci0JCXJldHVybiBmUmV0dXJuVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2UoSUJlYW5Qcm94eSBzdWJqZWN0KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gaW52b2tlKHN1YmplY3QsIChJQmVhblByb3h5W10pIG51bGwpOwotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBwYXJtcykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGludm9rZVdpdGhQYXJtcyhzdWJqZWN0LCBwYXJtcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGludGVybmFsIG1ldGhvZCB0aGF0IGFsbG93cyBtaXh0dXJlIG9mIGNvbnN0YW50cyAoZS5nLiBTdHJpbmcpIHdpdGggYmVhbiBwcm94aWVzLgotCSAqIEEgcGFybSB2YWx1ZSBjYW4gYmUgYSBSRU1NZXRob2RQcm94eS5QYXJtQXJyYXkuIFRoaXMgbWVhbnMgdGhpcyBwYXJtIGlzIGFuIGFycmF5IHRoYXQKLQkgKiBuZWVkcyB0byBoYXZlIGEgVmFsdWVSZXRyaWV2ZXIgY3JlYXRlZCBmb3IgaXQuIFRoaXMgaXMgdXNlZCBpZiB0aGUgYXJyYXkgaGFzIElEJ3MgaW4KLQkgKiBpdCBhbmQgaXMgbm90IGFuIGV4aXN0aW5nIGFycmF5IG9uIHRoZSBzZXJ2ZXIgb3IgYWxsIGNvbnN0YW50IHZhbHVlcy4KLQkgKgotCSAqIE5PVEU6IEl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgSUJlYW5UeXBlUHJveGllcyBvZiB0aGUgcGFybXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqICAgICAgIEl0IHNob3VsZCBzdGlsbCB3b3JrLCBidXQgaXQgY291bGQgYmUgYXNraW5nIGZvciB0aGVtIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJlcXVlc3QKLQkgKiAgICAgICBpZiB0aGV5IGFyZSBub3QgZmlyc3QgZ290dG9uLgotCSAqCi0JICogTk9URTogVGhpcyBpcyBpbiBJUkVNTWV0aG9kUHJveHkgb25seSBzbyB0aGF0IG90aGVyIFJFTSBwcm94eSBpbXBsZW1lbnRhdGlvbnMgY2FuIGFjY2VzcyBpdC4KLQkgKi8KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZVdpdGhQYXJtcyhJQmVhblByb3h5IHN1YmplY3QsIGZpbmFsIE9iamVjdFtdIHBhcm1zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZkZhY3RvcnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQkJcHJveHlGYWN0b3J5LnN0YXJ0VHJhbnNhY3Rpb24oKTsgLy8gVGhpcyBpcyBkZWZpbmF0ZWx5IGEgdHJhbnNhY3Rpb24sIHNvIHN0YXJ0IGl0LgotCQl0cnkgewotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgc3ViamVjdFZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQlpZiAoc3ViamVjdCAhPSBudWxsKQotCQkJCSAoKElSRU1CZWFuUHJveHkpIHN1YmplY3QpLnJlbmRlckJlYW4oc3ViamVjdFZhbHVlKTsKLQotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcGFybXNWYWx1ZSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCi0JCQljbGFzcyBSZXRyaWV2ZXIgaW1wbGVtZW50cyBDb21tYW5kcy5WYWx1ZVJldHJpZXZlIHsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCU9iamVjdFtdIGFycmF5OwotCQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHdvcmtlciA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQotCQkJCXB1YmxpYyBSZXRyaWV2ZXIoT2JqZWN0W10gYW5BcnJheSkgewotCQkJCQlhcnJheSA9IGFuQXJyYXk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJCQlpbmRleCA9IDA7Ci0JCQkJfQotCi0JCQkJcHVibGljIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5leHRWYWx1ZSgpIHsKLQkJCQkJT2JqZWN0IHBhcm0gPSBhcnJheVtpbmRleCsrXTsKLQkJCQkJaWYgKHBhcm0gIT0gbnVsbCkKLQkJCQkJCWlmIChwYXJtIGluc3RhbmNlb2YgSVJFTUJlYW5Qcm94eSkKLQkJCQkJCQkgKChJUkVNQmVhblByb3h5KSBwYXJtKS5yZW5kZXJCZWFuKHdvcmtlcik7Ci0JCQkJCQllbHNlIGlmIChwYXJtIGluc3RhbmNlb2YgVHJhbnNtaXRhYmxlQXJyYXkpIHsKLQkJCQkJCQkvLyBJdCBpcyBhbm90aGVyIGFycmF5LCBjcmVhdGUgYSBuZXcgcmV0cmlldmVyLgotCQkJCQkJCXdvcmtlci5zZXRBcnJheUlEUygKLQkJCQkJCQkJbmV3IFJldHJpZXZlcigoKFRyYW5zbWl0YWJsZUFycmF5KSBwYXJtKS5hcnJheSksCi0JCQkJCQkJCSgoVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmFycmF5Lmxlbmd0aCwKLQkJCQkJCQkJKChUcmFuc21pdGFibGVBcnJheSkgcGFybSkuY29tcG9uZW50VHlwZUlEKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gSXQncyBhbiBvYmplY3QuIE5lZWQgdG8gZ2V0IGJlYW4gdHlwZSBzbyB0aGF0IHdlIGNhbiBzZW5kIGl0LgotCQkJCQkJCUlSRU1CZWFuUHJveHkgdHlwZSA9IChJUkVNQmVhblByb3h5KSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHBhcm0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQkJCQlpbnQgY2xhc3NJRCA9IHR5cGUuZ2V0SUQoKS5pbnRWYWx1ZSgpOwotCQkJCQkJCXdvcmtlci5zZXRBc09iamVjdChwYXJtLCBjbGFzc0lEKTsKLQkJCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJd29ya2VyLnNldCgpOwotCQkJCQlyZXR1cm4gd29ya2VyOyAKLQkJCQl9Ci0JCQl9OwotCQkJCi0JCQlSZXRyaWV2ZXIgcmV0cmlldmVyID0gbnVsbDsKLQotCQkJaWYgKHBhcm1zICE9IG51bGwpIHsKLQkJCQkvLyBIYXZlIGEgbG9jYWwgZGVmaW5pdGlvbiBvZiB0aGUgcmV0cmlldmVyIHNvIHRoYXQgdGhlIHJldHJpZXZlciBjYW4gY3JlYXRlCi0JCQkJLy8gYW5vdGhlciBvbmUgb2YgaXRzZWxmIGlmIG5lY2Vzc2FyeS4KLQkJCQlwYXJtc1ZhbHVlLnNldEFycmF5SURTKHJldHJpZXZlciA9IG5ldyBSZXRyaWV2ZXIocGFybXMpLCBwYXJtcy5sZW5ndGgsIENvbW1hbmRzLk9CSkVDVF9DTEFTUyk7IC8vIENyZWF0ZSBPYmplY3RbXS4KLQkJCX0KLQotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCXRyeSB7Ci0JCQkJaW52b2tlKGNvbm5lY3QsIHByb3h5RmFjdG9yeSwgc3ViamVjdFZhbHVlLCBwYXJtc1ZhbHVlLCByZXR1cm5WYWx1ZSk7Ci0JCQkJcmV0dXJuIHByb3h5RmFjdG9yeS5nZXRCZWFuUHJveHkocmV0dXJuVmFsdWUpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQkvLyBDbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLgotCQkJCQlmRmFjdG9yeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCWNvbm5lY3QgPSBudWxsOwotCQkJCQljb25uZWN0ID0gZkZhY3RvcnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChyZXRyaWV2ZXIgIT0gbnVsbCkKLQkJCQkJCQlyZXRyaWV2ZXIucmVzZXQoKTsKLQkJCQkJCWludm9rZShjb25uZWN0LCBwcm94eUZhY3RvcnksIHN1YmplY3RWYWx1ZSwgcGFybXNWYWx1ZSwgcmV0dXJuVmFsdWUpOwotCQkJCQkJcmV0dXJuIHByb3h5RmFjdG9yeS5nZXRCZWFuUHJveHkocmV0dXJuVmFsdWUpOwotCQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGVBZ2FpbikgewotCQkJCQkJLy8gRmFpbGVkIGFnYWluLiBKdXN0IGNsb3NlIGFuZCBwcmludCB0cmFjZS4KLQkJCQkJCWZGYWN0b3J5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQkJCWNvbm5lY3QgPSBudWxsOwotCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGVBZ2FpbikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEEgcmVjb3ZlcmFibGUgZXJyb3IsIHByaW50IHRyYWNlIGFuZCByZXR1cm4KLQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwcm94eUZhY3Rvcnkuc3RvcFRyYW5zYWN0aW9uKCk7Ci0JCQlpZiAoY29ubmVjdCAhPSBudWxsKQotCQkJCWZGYWN0b3J5LnJldHVybkNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCX0KLQl9Ci0KLXByaXZhdGUgdm9pZCBpbnZva2UoCi0JCUlSRU1Db25uZWN0aW9uIGNvbm5lY3QsCi0JCVJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnksCi0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHN1YmplY3RWYWx1ZSwKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcGFybXNWYWx1ZSwKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUpCi0JCXRocm93cyBUaHJvd2FibGVQcm94eSwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljb25uZWN0Lmludm9rZU1ldGhvZChnZXRJRCgpLmludFZhbHVlKCksIHN1YmplY3RWYWx1ZSwgcGFybXNWYWx1ZSwgcmV0dXJuVmFsdWUpOwotCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJcHJveHlGYWN0b3J5LnByb2Nlc3NFcnJvclJldHVybihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgcGFybSkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCBuZXcgSUJlYW5Qcm94eVtdIHsgcGFybSB9KTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKHN1YmplY3QpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlmRmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7IC8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5W10gcGFybXMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbnZva2Uoc3ViamVjdCwgcGFybXMpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlmRmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7IC8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IHBhcm0pIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbnZva2Uoc3ViamVjdCwgcGFybSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZGYWN0b3J5LnJlbGVhc2VQcm94eShlKTsgLy8gU2luY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLCBnZXQgcmlkIG9mIG5vdyBpbnN0ZWFkIG9mIEdDIHRpbWUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIHByb3h5IGlzIGNvbnN0YW50IHByb3h5IG91dCBvZiB0aGUgbWV0aG9kIGZhY3RvcnkuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkubWV0aG9kVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYmVhbiBpcyBiZWluZyByZWxlYXNlZCwgY2xlYXIgb3V0IHRoZSBmaWVsZHMgc28gdGhleSBjYW4gYmUgR0MnZCBpZiBuZWNlc3NhcnkuCi0JICogVXN1YWxseSBvbmx5IGJpZyBvYmplY3RzIGFuZCBwcm94eSBmaWVsZHMgbmVlZCB0byBiZSBjbGVhcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZEZWNsYXJpbmdUeXBlID0gbnVsbDsKLQkJZlBhcmFtZXRlclR5cGVzID0gbnVsbDsKLQkJZlJldHVyblR5cGUgPSBudWxsOwotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWV0aG9kUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTlkMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBSRU1NZXRob2RQcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5UcmFuc21pdGFibGVBcnJheTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBtZXRob2QgcHJveGllcy4gQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgNjoyOTo0MCBQTSkKLSAqIAotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGNsYXNzIFJFTU1ldGhvZFByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElNZXRob2RQcm94eUZhY3RvcnkgewotCi0JZmluYWwgcHJvdGVjdGVkIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZGYWN0b3J5UmVnaXN0cnk7Ci0KLQkvLyBDYWNoZWQgY29weSBvZiBhIGZldyB0eXBpY2FsIG1ldGhvZCB0eXBlIHByb3hpZXMuCi0JSVJFTUJlYW5UeXBlUHJveHkgYWNjZXNzaWJsZVR5cGU7Ci0KLQlSRU1NZXRob2RUeXBlUHJveHkgbWV0aG9kVHlwZTsKLQotCVJFTUZpZWxkVHlwZVByb3h5IGZpZWxkVHlwZTsKLQotCVJFTUNvbnN0cnVjdG9yVHlwZVByb3h5IGN0b3JUeXBlOwotCi0JUkVNTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHk7Ci0KLQlSRU1NZXRob2RQcm94eUZhY3RvcnkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWZGYWN0b3J5UmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWFSZWdpc3RyeS5yZWdpc3Rlck1ldGhvZFByb3h5RmFjdG9yeSh0aGlzKTsKLQkJUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSB0eXBlRmFjdG9yeSA9IChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBhUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQotCQlhY2Nlc3NpYmxlVHlwZSA9IHR5cGVGYWN0b3J5Lm9iamVjdENsYXNzLm5ld0JlYW5UeXBlRm9yQ2xhc3MobmV3IEludGVnZXIoQ29tbWFuZHMuQUNDRVNTSUJMRU9CSkVDVF9DTEFTUyksIEFjY2Vzc2libGVPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLAotCQkJCWZhbHNlKTsKLQkJbWV0aG9kVHlwZSA9IG5ldyBSRU1NZXRob2RUeXBlUHJveHkoYVJlZ2lzdHJ5LCBhY2Nlc3NpYmxlVHlwZSk7Ci0JCWZpZWxkVHlwZSA9IG5ldyBSRU1GaWVsZFR5cGVQcm94eShhUmVnaXN0cnksIGFjY2Vzc2libGVUeXBlKTsKLQkJY3RvclR5cGUgPSBuZXcgUkVNQ29uc3RydWN0b3JUeXBlUHJveHkoYVJlZ2lzdHJ5LCBhY2Nlc3NpYmxlVHlwZSk7Ci0JCWFSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLnJlZ2lzdGVyQmVhblR5cGVQcm94eShhY2Nlc3NpYmxlVHlwZSwgdHJ1ZSk7Ci0JCWFSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLnJlZ2lzdGVyQmVhblR5cGVQcm94eShtZXRob2RUeXBlLCB0cnVlKTsKLQkJYVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KGZpZWxkVHlwZSwgdHJ1ZSk7Ci0JCWFSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLnJlZ2lzdGVyQmVhblR5cGVQcm94eShjdG9yVHlwZSwgdHJ1ZSk7Ci0KLQkJZ2V0TWV0aG9kUHJveHkgPSAoUkVNTWV0aG9kUHJveHkpIG1ldGhvZFR5cGUubmV3QmVhblByb3h5KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkdFVF9NRVRIT0RfSUQpKTsKLQkJKChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGFSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkpLnJlZ2lzdGVyUHJveHkoZ2V0TWV0aG9kUHJveHkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHlGYWN0b3J5I2dldE1ldGhvZFByb3h5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSB0eXBlRmFjdG9yeSA9IGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJSUJlYW5UeXBlUHJveHkgY2xzUHJveHkgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGNsYXNzTmFtZSk7Ci0JCWlmIChjbHNQcm94eSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIFRoaXMgd2lsbCByZWRpcmVjdCB0byB0aGUgYmVhbnR5cGUsIHdoaWNoIHdpbGwgZ28gdGhyb3VnaCB0aGUgbWV0aG9kIGNhY2hlLgotCQlyZXR1cm4gY2xzUHJveHkuZ2V0TWV0aG9kUHJveHkobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBBIGhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBtZXRob2QgcHJveHkgZm9yIHRoZSBleHByZXNzaW9uLiBUaGlzIGlzIHVzZWQgYnkgcmVnaXN0cmllcyBhbmQgYmVhbnR5cGUgcHJveGllcy4gSXQgd2lsbCBnbyB0aHJvdWdoCi0JICogdGhlIG1ldGhvZCBjYWNoZSB0byBtYWtlIHN1cmUgd2UgZ2V0IG9ubHkgb25lLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGFCZWFuVHlwZVByb3h5Ci0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFybVR5cGVzCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgYUJlYW5UeXBlUHJveHksIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcyl7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgYUJlYW5UeXBlUHJveHksIG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIEEgaGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGZpZWxkIHByb3h5IGZvciB0aGUgZXhwcmVzc2lvbi4gVGhpcyBpcyB1c2VkIGJ5IHJlZ2lzdHJpZXMgYW5kIGJlYW50eXBlIHByb3hpZXMuIEl0IHdpbGwgZ28gdGhyb3VnaAotCSAqIHRoZSBtZXRob2QgY2FjaGUgdG8gbWFrZSBzdXJlIHdlIGdldCBvbmx5IG9uZS4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eQotCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgYUJlYW5UeXBlUHJveHksIFN0cmluZyBmaWVsZE5hbWUpewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnByb3h5Q29uc3RhbnRzLmdldEZpZWxkUHJveHkoZXhwcmVzc2lvbiwgYUJlYW5UeXBlUHJveHksIGZpZWxkTmFtZSk7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5RmFjdG9yeSNnZXRGaWVsZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJLy8gV2UgYXJlIGdldHRpbmcgdGhlIGNsYXNzIHJlc29sdmVkIHRocm91Z2ggdGhlIGV4cHJlc3Npb24uIE1pZ2h0IGFzIHdlbGwgYmVjYXVzZSBpdCBwcm9iYWJseSB3aWxsCi0JCS8vIGJlIG5lZWRlZCBhZ2FpbiBhbmQgdGhpcyB3YXkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmaW5pc2hlZCBpdCB3aWxsIGJlIHJlc29sdmVkIGZvciBsYXRlciB1c2FnZS4KLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYmVhblR5cGVQcm94eUZhY3RvcnkgPSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlID0gYmVhblR5cGVQcm94eUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShleHByZXNzaW9uLCBjbGFzc05hbWUpOwotCQlyZXR1cm4gYmVhblR5cGUuZ2V0RmllbGRQcm94eShleHByZXNzaW9uLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHlGYWN0b3J5I2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJLy8gV2UgYXJlIGdldHRpbmcgdGhlIGNsYXNzIGFuZCBwYXJtdHlwZXMgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgZXhwcmVzc2lvbi4gTWlnaHQgYXMgd2VsbCBiZWNhdXNlIHRoZXkgcHJvYmFibHkgd2lsbAotCQkvLyBiZSBuZWVkZWQgYWdhaW4gYW5kIHRoaXMgd2F5IHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgZmluaXNoZWQgdGhleSB3aWxsIGJlIHJlc29sdmVkIGZvciBsYXRlciB1c2FnZS4KLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYmVhblR5cGVQcm94eUZhY3RvcnkgPSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlID0gYmVhblR5cGVQcm94eUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShleHByZXNzaW9uLCBjbGFzc05hbWUpOwotCQlJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcyA9IGdldFBhcmFtZXRlclR5cGVzKGV4cHJlc3Npb24sIHBhcmFtZXRlclR5cGVzLCBiZWFuVHlwZVByb3h5RmFjdG9yeSk7Ci0JCXJldHVybiBiZWFuVHlwZS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCBtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIGZvciBCZWFuVHlwZXMgYW5kIHByb3h5IEJlYW50eXBlcy4gU28gdGhleSBkb24ndCBuZWVkIHRvIGhhdmUgY29tbW9uIGNvZGUgdG8gY29udmVydCBzdHJpbmcgdG8gcHJveHkgYmVhbiB0eXBlLgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGNsYXNzVHlwZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgY2xhc3NUeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJLy8gV2UgYXJlIGdldHRpbmcgdGhlIGNsYXNzIGFuZCBwYXJtdHlwZXMgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgZXhwcmVzc2lvbi4gTWlnaHQgYXMgd2VsbCBiZWNhdXNlIHRoZXkgcHJvYmFibHkgd2lsbAotCQkvLyBiZSBuZWVkZWQgYWdhaW4gYW5kIHRoaXMgd2F5IHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgZmluaXNoZWQgdGhleSB3aWxsIGJlIHJlc29sdmVkIGZvciBsYXRlciB1c2FnZS4KLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYmVhblR5cGVQcm94eUZhY3RvcnkgPSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCUlQcm94eUJlYW5UeXBlW10gcGFybVR5cGVzID0gZ2V0UGFyYW1ldGVyVHlwZXMoZXhwcmVzc2lvbiwgcGFyYW1ldGVyVHlwZXMsIGJlYW5UeXBlUHJveHlGYWN0b3J5KTsKLQkJcmV0dXJuIGNsYXNzVHlwZS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCBtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogQHBhcmFtIGJlYW5UeXBlUHJveHlGYWN0b3J5Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBJUHJveHlCZWFuVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzLCBJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBiZWFuVHlwZVByb3h5RmFjdG9yeSkgewotCQlJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlczsKLQkJaWYgKHBhcmFtZXRlclR5cGVzID09IG51bGwgfHwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IDApCi0JCQlwYXJtVHlwZXMgPSBudWxsOwotCQllbHNlIHsKLQkJCXBhcm1UeXBlcyA9IG5ldyBJUHJveHlCZWFuVHlwZVtwYXJhbWV0ZXJUeXBlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCXBhcm1UeXBlc1tpXSA9IGJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwcmVzc2lvbiwgcGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJtVHlwZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHlGYWN0b3J5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSB0eXBlRmFjdG9yeSA9IGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJSUJlYW5UeXBlUHJveHkgY2xzUHJveHkgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGNsYXNzTmFtZSk7Ci0JCWlmIChjbHNQcm94eSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjbHNQcm94eS5nZXRJbnZva2FibGUobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIGlkIGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0gYW5kIGNyZWF0ZSB0aGUgbWV0aG9kIHByb3h5LgotCSAqIAotCSAqIE5PVEU6IEl0IGlzIHB1YmxpYyBPTkxZIHNvIHRoYXQgSUJlYW5UeXBlUHJveHkgaW1wbGVtZW50YXRpb25zIGNhbiBjYWxsIGl0LiBJdCBtdXN0IG5vdCBiZSB1c2VkIGJ5IGFueW9uZSBlbHNlLgotCSAqIAotCSAqIEBwYXJhbSBiZWFuVHlwZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShJUkVNQmVhblR5cGVQcm94eSBiZWFuVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCS8vIEZpcnN0IGNvbnZlcnQgdGhlIHBhcmFtZXRlciB0eXBlcyBpbnRvIElCZWFuVHlwZVByb3h5W10uCi0JCUlSRU1CZWFuVHlwZVByb3h5W10gdHlwZXMgPSBudWxsOwotCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkgewotCQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCQl0eXBlcyA9IG5ldyBJUkVNQmVhblR5cGVQcm94eVtwYXJhbWV0ZXJUeXBlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCUlCZWFuVHlwZVByb3h5IHR5cGUgPSB0eXBlc1tpXSA9IChJUkVNQmVhblR5cGVQcm94eSkgdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7IC8vIE9uZSBvZiB0aGUgcGFybSB0eXBlcyBkb2Vzbid0IGV4aXN0LgotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldEludm9rYWJsZShiZWFuVHlwZSwgbWV0aG9kTmFtZSwgdHlwZXMpOwkJCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIGlkIGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0gYW5kIGNyZWF0ZSB0aGUgbWV0aG9kIHByb3h5LgotCSAqIFRoaXMgZG9lcyBub3QgZ28gdGhyb3VnaCB0aGUgbWV0aG9kIGNhY2hlLiBJdCBnb2VzIGRpcmVjdCB0byB0aGUgcmVtb3RlIHZtLgotCSAqIAotCSAqIE5PVEU6IEl0IGlzIHB1YmxpYyBPTkxZIHNvIHRoYXQgSUJlYW5UeXBlUHJveHkgaW1wbGVtZW50YXRpb25zIGNhbiBjYWxsIGl0LiBJdCBtdXN0IG5vdCBiZSB1c2VkIGJ5IGFueW9uZSBlbHNlLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkvLyBGaXJzdCBjb252ZXJ0IHRoZSBwYXJhbWV0ZXIgdHlwZXMgaW50byBJQmVhblR5cGVQcm94eVtdLgotCQlJQmVhblR5cGVQcm94eVtdIHR5cGVzID0gbnVsbDsKLQkJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwpIHsKLQkJCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQkJdHlwZXMgPSBuZXcgSUJlYW5UeXBlUHJveHlbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQmVhblR5cGVQcm94eSB0eXBlID0gdHlwZXNbaV0gPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCQlpZiAodHlwZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gT25lIG9mIHRoZSBwYXJtIHR5cGVzIGRvZXNuJ3QgZXhpc3QuCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkoYmVhblR5cGUsIG1ldGhvZE5hbWUsIHR5cGVzKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGludm9rYWJsZS4gCi0JICogCi0JICogTk9URTogSXQgaXMgcHVibGljIE9OTFkgc28gdGhhdCBJQmVhblR5cGVQcm94eSBpbXBsZW1lbnRhdGlvbnMgY2FuIGNhbGwgaXQuIEl0IG11c3Qgbm90IGJlIHVzZWQgYnkgYW55b25lIGVsc2UuCi0JICogQHBhcmFtIGJlYW5UeXBlCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKElSRU1CZWFuVHlwZVByb3h5IGJlYW5UeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gbmV3IFJFTUludm9rYWJsZShiZWFuVHlwZSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBpZCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtIGFuZCBjcmVhdGUgdGhlIG1ldGhvZCBwcm94eS4KLQkgKiA8cD4KLQkgKiBUaGlzIGRvZXMgbm90IGdvIHRocm91Z2ggdGhlIG1ldGhvZCBjYWNoZS4gSXQgZ29lcyBkaXJlY3QgdG8gdGhlIHJlbW90ZSB2bS4KLQkgKiAKLQkgKiBOT1RFOiBJdCBpcyBwdWJsaWMgT05MWSBzbyB0aGF0IElCZWFuVHlwZVByb3h5IGltcGxlbWVudGF0aW9ucyBjYW4gY2FsbCBpdC4gSXQgbXVzdCBub3QgYmUgdXNlZCBieSBhbnlvbmUgZWxzZS4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KElSRU1CZWFuVHlwZVByb3h5IGJlYW5UeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkvLyBUaGUgcGFybXMgdG8gZ2V0TWV0aG9kIGFyZToKLQkJLy8gcGFybVswXSA9IFN0cmluZyAtIG1ldGhvZCBuYW1lCi0JCS8vIHBhcm1bMV0gPSBDbGFzc1tdIC0gUGFyYW1ldGVyIENsYXNzZXMuCi0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHsgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMgIT0gbnVsbCA/IChuZXcgVHJhbnNtaXRhYmxlQXJyYXkoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MsIHBhcmFtZXRlclR5cGVzKSkgOiBudWxsfTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0TWV0aG9kUHJveHkuaW52b2tlV2l0aFBhcm1zKGJlYW5UeXBlLCBwYXJtcyk7Ci0JCQlyZXR1cm4gKElNZXRob2RQcm94eSkgcmVzdWx0OwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmRmFjdG9yeVJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsgLy8gU2luY2UgaXQncyBub3QgbmVlZGVkLCBnZXQgcmlkIG9mIG5vdyBpbnN0ZWFkIG9mIEdDIHRpbWUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNvbWUgdHJhY2UgbXNncyBiZWNhdXNlIHdlIGtlZXAgZ2V0dGluZyBpbnRvIGEgbW9kZSBhZnRlciBhd2hpbGUgKHRob3VnaCBub3QgcmVwcm9kdWNpYmxlKSB0aGF0IHJldHVybnMgbm9uLW1ldGhvZCBwcm94aWVzIGFuZCB3ZSBuZWVkCi0JCQkvLyBtb3JlIGluZm8uCi0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiTWV0aG9kIHJlcXVlc3RlZCBpcyBcIiIgKyBtZXRob2ROYW1lICsgIigiKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKQotCQkJCQlidWYuYXBwZW5kKCcsJyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWYuYXBwZW5kKHBhcmFtZXRlclR5cGVzW2ldLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQkJYnVmLmFwcGVuZCgiKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgYnVmLnRvU3RyaW5nKCksIG51bGwpKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCQkJIkNsYXNzQ2FzdEV4Y2VwdGlvbiBvZiByZXN1bHQuIFJldHVybiB0eXBlIGlzIFwiIiArIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpICsgIlwiXG4iICsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJSZXR1cm4gdHlwZSBiZWFuIHR5cGUgcHJveHkgY2xhc3M9XCIiICsgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlwiXG4iICsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJHZXRNZXRob2RQcm94eSB2YWxpZD0iICsgZ2V0TWV0aG9kUHJveHkuaXNWYWxpZCgpICsgIlxuIiArIC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiR2V0TWV0aG9kUHJveHkgcmVhbCBuYW1lIGlzIFwiIiArIGdldE1ldGhvZFByb3h5LmdldE5hbWUoKSArICJcIlxuIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQJCQkKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRocm93IGU7IC8vIFJldGhyb3cgaXQuCi0JCX0KLQl9Ci0KLQkvKgotCSAqIFRlcm1pbmF0ZSB0aGUgZmFjdG9yeS4gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBiZWNhdXNlIG9mIHRoZSBwcm94aWVzIGJlaW5nIGhlbGQgb250byBhcmUgcmVnaXN0ZXJlZCBhbnkgd2lsbCBiZSBjbGVhbmVkIHVwIHRoZW1zZWx2ZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWV0aG9kVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1ldGhvZFR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTUzZjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWV0aG9kVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1NZXRob2RUeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEJlYW5UeXBlIFByb3h5IGZvciBNZXRob2QgY2xhc3MuCi0gKi8KLQotZmluYWwgY2xhc3MgUkVNTWV0aG9kVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHsKLQotUkVNTWV0aG9kVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgYWNjZXNzaWJsZVR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuTUVUSE9EX0NMQVNTKSwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmNsYXNzLmdldE5hbWUoKSwgYWNjZXNzaWJsZVR5cGVQcm94eSk7Ci19Ci0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBhY2Nlc3NpYmxlIG9iamVjdCB0eXBlcywgdGhleSBhcmUgZmluYWwgY2xhc3Nlcywgc28geW91IGNhbid0IGNyZWF0ZSBhIG5ld0JlYW5UeXBlIAotICogZm9yIHN1YmNsYXNzZXMuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIFNwZWNpYWxpemVkIGZyb20gUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBDb25zdHJ1Y3RvciBwcm94aWVzIGFyZSBjcmVhdGVkIGNvcnJlY3RseS4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgb2JqZWN0SUQpIHsKLQlyZXR1cm4gbmV3IFJFTU1ldGhvZFByb3h5KGZSZWdpc3RyeSwgb2JqZWN0SUQpOwotfQotCi0vKioKLSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgQ29uc3RydWN0b3IgYXJlIG5ldmVyIGRvbmUgdGhyb3VnaCBhIGRlZmF1bHQgY3RvciwKLSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7IAotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgQ29uc3RydWN0b3IgYXJlIG5ldmVyIGRvbmUgdGhyb3VnaCBhbiBpbml0aWFsaXphdGlvbiBzdHJpbmcsCi0gKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTnVtYmVyQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU51bWJlckJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDNhNDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTnVtYmVyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNTnVtYmVyQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciBhbnkgTnVtYmVyIChpLmUuIHRoZSBub24tcHJpbWl0aXZlcykKLSAqIEl0IGNhbiBhbnN3ZXIgYWxsIG9mIHRoZSBwcmltaXRpdmUgbnVtYmVyIHR5cGVzIChpbnQsIGxvbmcsIHNob3J0LCBieXRlLCBkb3VibGUsIGZsb2F0KS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIFJFTU51bWJlckJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSU51bWJlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBOdW1iZXIgZk51bWJlclZhbHVlOwotCi0vKioKLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotUkVNTnVtYmVyQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgTnVtYmVyIGFOdW1iZXIpIHsKLQlzdXBlcihhUmVnaXN0cnkpOwotCWZOdW1iZXJWYWx1ZSA9IGFOdW1iZXI7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNTnVtYmVyQmVhblByb3h5KQotCQlyZXR1cm4gZk51bWJlclZhbHVlLmVxdWFscygoKFJFTU51bWJlckJlYW5Qcm94eSkgYW5PYmplY3QpLm51bWJlclZhbHVlKCkpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikKLQkJcmV0dXJuIGZOdW1iZXJWYWx1ZS5lcXVhbHMoYW5PYmplY3QpOwotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5ieXRlVmFsdWUoKTsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5kb3VibGVWYWx1ZSgpOwotfQotLyoqCi0gKiBmbG9hdFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmZsb2F0VmFsdWUoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmludFZhbHVlKCk7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUubG9uZ1ZhbHVlKCk7Ci19Ci0vKioKLSAqIG51bWJlclZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWU7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUuc2hvcnRWYWx1ZSgpOwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUudG9TdHJpbmcoKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzg3ODg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFByaW1pdGl2ZSBCZWFuVHlwZSBQcm94aWVzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSAgewotCQotCXByb3RlY3RlZCBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIHRoZSBwcmltaXRpdmUgQnl0ZS5UWVBFIG9yIEJ5dGUuY2xhc3MKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVsbCBjdG9yIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7CQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7CQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9CQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTQotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQkKLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKiAKLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RmllbGRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXREZWNsYXJlZEZpZWxkcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGZpZWxkIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCQotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0JICoKLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uIFRoZXkgYXJlIGNyZWF0ZWQKLQkgKiBleHBsaWNpdGx5IHRocm91Z2ggdGhlIGFwcHJvcHJpYXRlIGNyZWF0ZSBtZXRob2QuCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoZXkgYXJlbid0IGNsYXNzZXMsIHNvIHlvdSBjYW4ndCBjcmVhdGUgYSBuZXdCZWFuVHlwZSAKLQkgKiBmb3Igc3ViY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIHJlbGVhc2UgLSBCZWFuVHlwZSBpcyBhYm91dCB0byBiZSByZWxlYXNlZC4KLQkgKiBwcmltaXRpdmVzIGRvbid0IG5lZWQgdG8gYmUgcmVsZWFzZWQsIHRoZXkgZG9uJ3QgaG9sZCBvbnRvIGFueSBpZHMgb3IgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCQotCS8qKgotCSAqIEhhdmUgYSBzdHJpbmcgdGhhdCBzaG91bGQgcmVwcmVzZW50IGEgbnVtYmVyLgotCSAqIFNlZSBpZiBpdCBlbmRzIGluIGEgdHlwZSBsZXR0ZXIsIGlmIHNvIHBhcnNlIGFzIHN1Y2guCi0JICogU2VlIGlmIHRoZXJlIGlzIGFuICdFJyBpbiBpdCwgdGhlbiBwYXJzZSBhcyBhIGRvdWJsZS4KLQkgKiBJZiBuZWl0aGVyIGNvbmRpdGlvbiwgdGhlbiB0cnkgcGFyc2UgYXMgbG9uZywgaWYgdGhhdCAKLQkgKiBmYWlscyB0cnkgYXMgZG91YmxlLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTnVtYmVyIHBhcnNlU3RyaW5nKFN0cmluZyB2KSB7Ci0JCWlmICh2Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJY2hhciBsYXN0ID0gdi5jaGFyQXQodi5sZW5ndGgoKS0xKTsKLQkJdHJ5IHsKLQkJCXN3aXRjaCAobGFzdCkgewotCQkJCWNhc2UgJ2QnOgotCQkJCWNhc2UgJ0QnOgotCQkJCQlyZXR1cm4gRG91YmxlLnZhbHVlT2Yodik7Ci0JCQkJY2FzZSAnZic6Ci0JCQkJY2FzZSAnRic6Ci0JCQkJCXJldHVybiBGbG9hdC52YWx1ZU9mKHYpOwotCQkJCWNhc2UgJ2wnOgotCQkJCWNhc2UgJ0wnOgotCQkJCQlyZXR1cm4gTG9uZy5kZWNvZGUodi5zdWJzdHJpbmcoMCwgdi5sZW5ndGgoKS0xKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJldHVybiBMb25nLmRlY29kZSh2KTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIERvdWJsZS52YWx1ZU9mKHYpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByb3h5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByb3h5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OWQ0ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Qcm94eUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpICAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUkVNUHJveHlDb25zdGFudHMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wNS8xOCAyMzoxMToyNiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudDsKLQotCi0KLQotLyoqCi0gKiBNZXRob2RQcm94eUNvbnN0YW50cyBpcyBhIGNhY2hlIG9mIElNZXRob2RQcm94aWVzIHRvIGF2b2lkIHJlcGVhdGVkIGxvb2t1cAotICogYW5kIHRoZXJlYnkgYXZvaWQgdGhlIHJlbGF0aXZlbHkgZXhwZW5zaXZlIGphdmEubGFuZy5yZWZsZWN0IGNhbGxzIHRvIHJlcGVhdGVkbHkKLSAqIGxvb2t1cCBtZXRob2QgYnkgbmFtZQotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIFJFTVByb3h5Q29uc3RhbnRzIHsKLQotCXByaXZhdGUgTWFwIG1ldGhvZHNDYWNoZSA9IG5ldyBIYXNoTWFwKDgwKTsKLQlwcml2YXRlIE1hcCBpbnZva2FibGVzQ2FjaGUgPSBuZXcgSGFzaE1hcCg4MCk7CQotCXByaXZhdGUgTWFwIGZpZWxkc0NhY2hlID0gbmV3IEhhc2hNYXAoODApOwotCQotCXByaXZhdGUgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0JCi0JcHVibGljIFJFTVByb3h5Q29uc3RhbnRzKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQl9Ci0JCi0JLyoKLQkgKiBVc2VkIGFzIHRoZSBrZXkgdG8gdGhlIG1ldGhvZENhY2hlIGFuZCBpbnZva2FibGVzQ2FjaGUgd2hlbiB0aGVyZSBhcmUgcGFybXMuCi0JICogSXQgYWxsb3dzIHRoZSBwYXJtcyB0byBiZSBlaXRoZXIgc3RyaW5ncyBvciBJQmVhblR5cGVQcm94aWVzIHdpdGhvdXQgdGhlCi0JICogb3ZlcmhlYWQgb2YgY3JlYXRpbmcgY29tcGxpY2F0ZWQgc3RyaW5ncy4KLQkgKiAKLQkgKiBJdCB3aWxsIGNvbXBhcmUgbWV0aG9kIG5hbWUgYW5kIGVhY2ggaW5kaXZpZHVhbCBwYXJtIG5hbWUgd2l0aG91dCBmbHVmZmluZwotCSAqIHVwIGEgc3RyaW5nIGFuZCBidWlsZGluZyBpdCB1cC4KLQkgKiAKLQkgKiBGb3Igbm8gcGFybSBtZXRob2RzLCBqdXN0IHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYXMgYSBzdHJpbmcgd2lsbCBiZSB0aGUga2V5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIE1ldGhvZEtleSB7Ci0JCXB1YmxpYyBTdHJpbmcgbWV0aG9kTmFtZTsKLQkJcHVibGljIE1ldGhvZEtleShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQkJdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLQkJfQotCQkJCQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjb21wYXJlUGFybXMoSVByb3h5QmVhblR5cGVbXSBwYXJtcyk7Ci0JCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmVQYXJtcyhTdHJpbmdbXSBwYXJtcyk7Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCQkgKi8KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBtZXRob2ROYW1lLmhhc2hDb2RlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWV0aG9kS2V5U3RyaW5nUGFybXMgZXh0ZW5kcyBNZXRob2RLZXkgewotCQlwdWJsaWMgU3RyaW5nW10gcGFybU5hbWVzOwotCQkKLQkJcHVibGljIE1ldGhvZEtleVN0cmluZ1Bhcm1zKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJtTmFtZXMpIHsKLQkJCXN1cGVyKG1ldGhvZE5hbWUpOwotCQkJdGhpcy5wYXJtTmFtZXMgPSBwYXJtTmFtZXM7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoTWV0aG9kS2V5KSBvYmopLmNvbXBhcmVQYXJtcyhwYXJtTmFtZXMpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUNvbnN0YW50cy5NZXRob2RLZXkjaGFzaENvZGUoKQotCQkgKi8KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWludCBoID0gc3VwZXIuaGFzaENvZGUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaCArPSBwYXJtTmFtZXNbaV0uaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBoOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUNvbnN0YW50cy5NZXRob2RLZXkjY29tcGFyZVBhcm1zKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wYXJlUGFybXMoSVByb3h5QmVhblR5cGVbXSBwYXJtcykgewotCQkJaWYgKHBhcm1zLmxlbmd0aCAhPSBwYXJtTmFtZXMubGVuZ3RoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXBhcm1zW2ldLmdldFR5cGVOYW1lKCkuZXF1YWxzKHBhcm1OYW1lc1tpXSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuUkVNUHJveHlDb25zdGFudHMuTWV0aG9kS2V5I2NvbXBhcmVQYXJtcyhqYXZhLmxhbmcuU3RyaW5nW10pCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wYXJlUGFybXMoU3RyaW5nW10gcGFybXMpIHsKLQkJCXJldHVybiBBcnJheXMuZXF1YWxzKHBhcm1zLCBwYXJtTmFtZXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGhvZEtleVByb3h5UGFybXMgZXh0ZW5kcyBNZXRob2RLZXkgewotCQlwdWJsaWMgSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXM7Ci0JCQotCQlwdWJsaWMgTWV0aG9kS2V5UHJveHlQYXJtcyhTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXMpIHsKLQkJCXN1cGVyKG1ldGhvZE5hbWUpOwotCQkJdGhpcy5wYXJtVHlwZXMgPSBwYXJtVHlwZXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgdG9NZXRob2RLZXlTdHJpbmdQYXJtcygpIHsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1twYXJtVHlwZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFybXNbaV0gPSBwYXJtVHlwZXNbaV0uZ2V0VHlwZU5hbWUoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgTWV0aG9kS2V5U3RyaW5nUGFybXMobWV0aG9kTmFtZSwgcGFybXMpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAodGhpcyA9PSBvYmopCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKE1ldGhvZEtleSkgb2JqKS5jb21wYXJlUGFybXMocGFybVR5cGVzKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUNvbnN0YW50cy5NZXRob2RLZXkjaGFzaENvZGUoKQotCQkgKi8KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWludCBoID0gc3VwZXIuaGFzaENvZGUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaCArPSBwYXJtVHlwZXNbaV0uZ2V0VHlwZU5hbWUoKS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIGg7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5Q29uc3RhbnRzLk1ldGhvZEtleSNjb21wYXJlUGFybXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVQYXJtcyhTdHJpbmdbXSBwYXJtcykgewotCQkJaWYgKHBhcm1zLmxlbmd0aCAhPSBwYXJtVHlwZXMubGVuZ3RoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXBhcm1UeXBlc1tpXS5nZXRUeXBlTmFtZSgpLmVxdWFscyhwYXJtc1tpXSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuUkVNUHJveHlDb25zdGFudHMuTWV0aG9kS2V5I2NvbXBhcmVQYXJtcyhqYXZhLmxhbmcuU3RyaW5nW10pCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wYXJlUGFybXMoSVByb3h5QmVhblR5cGVbXSBwYXJtcykgewotCQkJaWYgKHBhcm1zLmxlbmd0aCAhPSBwYXJtVHlwZXMubGVuZ3RoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXBhcm1UeXBlc1tpXS5nZXRUeXBlTmFtZSgpLmVxdWFscyhwYXJtc1tpXS5nZXRUeXBlTmFtZSgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCX0KLQkJCi0Jc3RhdGljIGludCBSRU1NRVRIT0RDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBVTklRVUVNRVRIT0RDT1VOVCA9IDA7CQotCXN0YXRpYyBpbnQgUkVNSU5WT0tBQkxFQ09VTlQgPSAwOwotCXN0YXRpYyBpbnQgVU5JUVVFSU5WT0tBQkxFQ09VTlQgPSAwOwotCXN0YXRpYyBpbnQgSU5WT0tFSU5WT0tFQ09VTlQgPSAwOwotCXN0YXRpYyBpbnQgTUVUSE9EUFJPWFlJTlZPS0VDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBSRU1GSUVMRENPVU5UID0gMDsKLQlzdGF0aWMgaW50IFVOSVFVRUZJRUxEQ09VTlQgPSAwOwotCXN0YXRpYyBpbnQgUkVNQ09OU1RSVUNUT1JDQUxMRUQgPSAwOwotCXN0YXRpYyBIYXNoTWFwIE1FVEhPRENPVU5UTUFQOwotCXN0YXRpYyBIYXNoTWFwIEZJRUxEQ09VTlRNQVA7CSAKLQlzdGF0aWMgSGFzaE1hcCBGSUVMRFNFVENPVU5UTUFQOwotCXN0YXRpYyBib29sZWFuIEdBVEhFUl9DT1VOVFM7Ci0JCi0JLyoqCi0JICogU2V0IGlmIGNvdW50cyBzaG91bGQgYmUgZ2F0aGVyZWQuCi0JICogCi0JICogQHBhcmFtIGdhdGhlckNvdW50cwotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHYXRoZXJDb3VudHMoYm9vbGVhbiBnYXRoZXJDb3VudHMpIHsKLQkJaWYgKGdhdGhlckNvdW50cyAhPSBHQVRIRVJfQ09VTlRTKSB7Ci0JCQlyZXNldCgpOwotCQkJaWYgKGdhdGhlckNvdW50cykgewotCQkJCWlmIChNRVRIT0RDT1VOVE1BUCA9PSBudWxsKSB7Ci0JCQkJCU1FVEhPRENPVU5UTUFQID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJRklFTERDT1VOVE1BUCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCUZJRUxEU0VUQ09VTlRNQVAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCX0KLQkJCX0KLQkJCUdBVEhFUl9DT1VOVFMgPSBnYXRoZXJDb3VudHM7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCl7Ci0JCVJFTU1FVEhPRENPVU5UID0gVU5JUVVFTUVUSE9EQ09VTlQgPSBSRU1JTlZPS0FCTEVDT1VOVCA9IFVOSVFVRUlOVk9LQUJMRUNPVU5UID0gUkVNQ09OU1RSVUNUT1JDQUxMRUQgPSBNRVRIT0RQUk9YWUlOVk9LRUNPVU5UID0gSU5WT0tFSU5WT0tFQ09VTlQgPSBSRU1GSUVMRENPVU5UID0gVU5JUVVFRklFTERDT1VOVCA9IDA7Ci0JCWlmIChHQVRIRVJfQ09VTlRTKSB7Ci0JCQlNRVRIT0RDT1VOVE1BUC5jbGVhcigpOwotCQkJRklFTERDT1VOVE1BUC5jbGVhcigpOwotCQkJRklFTERTRVRDT1VOVE1BUC5jbGVhcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludGxuKCl7Ci0JCQotCQlpZiAoR0FUSEVSX0NPVU5UUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZCBwcm94aWVzIGludm9rZXMgPSAiICsgTUVUSE9EUFJPWFlJTlZPS0VDT1VOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52b2tlIGludm9rZXMgPSAiICsgSU5WT0tFSU5WT0tFQ09VTlQpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kcyByZXRyaWV2ZWQgPSAiICsgUkVNTUVUSE9EQ09VTlQgKyAiKCIgKyBVTklRVUVNRVRIT0RDT1VOVCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkludm9rZXMgcmV0cmlldmVkID0gIiArIFJFTUlOVk9LQUJMRUNPVU5UICsgIigiICsgVU5JUVVFSU5WT0tBQkxFQ09VTlQgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWVsZHMgcmV0cmlldmVkID0gIiArIFJFTUZJRUxEQ09VTlQgKyAiKCIgKyBVTklRVUVGSUVMRENPVU5UICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3IgY2FsbHMgPSAiICsgUkVNQ09OU1RSVUNUT1JDQUxMRUQpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLUNvdW50IG9mIG1ldGhvZHMgaW52b2tlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIENvbGxhdGUgdGhlIG1ldGhvZHMgY2FsbGVkCi0JCQlJdGVyYXRvciBlbnRyaWVzID0gTUVUSE9EQ09VTlRNQVAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBlbnRyaWVzLm5leHQoKTsKLQkJCQlSRU1NZXRob2RQcm94eSBtZXRob2RQcm94eSA9IChSRU1NZXRob2RQcm94eSkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1ldGhvZFByb3h5LmdldENsYXNzVHlwZSgpLmdldFR5cGVOYW1lKCkgKyAiLCIgKyBtZXRob2RQcm94eS5nZXROYW1lKCkgKyAiLCIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCItQ291bnQgb2YgZmllbGRzIGdldCBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQ29sbGF0ZSB0aGUgZmllbGRzIGFjY2Vzc2VkCi0JCQllbnRyaWVzID0gRklFTERDT1VOVE1BUC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGVudHJpZXMubmV4dCgpOwotCQkJCVJFTUZpZWxkUHJveHkgZmllbGRQcm94eSA9IChSRU1GaWVsZFByb3h5KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZmllbGRQcm94eS50b0JlYW5TdHJpbmcoKSArICIsIiArIGVudHJ5LmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCItQ291bnQgb2YgZmllbGRzIHNldCBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQ29sbGF0ZSB0aGUgZmllbGRzIHNldAotCQkJZW50cmllcyA9IEZJRUxEU0VUQ09VTlRNQVAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBlbnRyaWVzLm5leHQoKTsKLQkJCQlSRU1GaWVsZFByb3h5IGZpZWxkUHJveHkgPSAoUkVNRmllbGRQcm94eSkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGZpZWxkUHJveHkudG9CZWFuU3RyaW5nKCkgKyAiLCIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSAKLQkJfQotCQkKLQl9Ci0JCi0vKioKLSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eSA9IEJlYW5UeXBlUHJveHkgZm9yIHRoZSBtZXRob2QKLSAqIEBwYXJhbSBtZXRob2ROYW1lID0gbWV0aG9kTmFtZSB0byBiZSBsb29rZWQgZm9yCi0gKiBAcGFyYW0gcGFybVR5cGVzID0gYXJyYXkgb2YgcXVhbGlmaWVkIHR5cGUgbmFtZXMgZm9yIHRoZSBtZXRob2QgYXJndW1lbnRzLCBudWxsIGlmIG5vIG1ldGhvZHMKLSAqLyAKLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFybVR5cGVzKXsKLQkJaWYgKCFyZWdpc3RyeS5pc1ZhbGlkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlSRU1NRVRIT0RDT1VOVCsrOwotCQlNYXAgbWV0aG9kczsKLQkJT2JqZWN0IGtleTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBUaGUgY2xhc3NDYWNoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIEJlYW5UeXBlUHJveHkgYW5kIGhvbGRzIGEgZnVydGhlciBtYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0JCQltZXRob2RzID0gZ2V0TWV0aG9kcyhhQmVhblR5cGVQcm94eSk7Ci0KLQkJCS8vIFRoZSBzeW50YXggb2YgdGhlIGtleSBpcyBtZXRob2ROYW1lKHBhcm1UeXBlMSxwYXJtVHlwZTIpCi0JCQlpZiAocGFybVR5cGVzID09IG51bGwgfHwgcGFybVR5cGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJa2V5ID0gbWV0aG9kTmFtZTsKLQkJCX0gZWxzZSB7Ci0JCQkJa2V5ID0gbmV3IE1ldGhvZEtleVN0cmluZ1Bhcm1zKG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JCQl9Ci0KLQkJCUlNZXRob2RQcm94eSByZXN1bHQgPSAoSU1ldGhvZFByb3h5KSBtZXRob2RzLmdldChrZXkpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCVVOSVFVRU1FVEhPRENPVU5UKys7Ci0JCS8vIEdldCB0aGUgbWV0aG9kIHByb3h5IGFuZCBjYWNoZSB0aGlzIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJLy8gR2V0IHRoZSBtZXRob2QgcHJveHkgYW5kIGNhY2hlIHRoaXMgYmVmb3JlIHJldHVybmluZyBpdAotCQlSRU1NZXRob2RQcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5ID0gKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCk7Ci0JCUlNZXRob2RQcm94eSByZXN1bHQgPSBwcm94eUZhY3RvcnkuZ2V0TWV0aG9kUHJveHkoKElSRU1CZWFuVHlwZVByb3h5KWFCZWFuVHlwZVByb3h5LG1ldGhvZE5hbWUscGFybVR5cGVzKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBHZXQgaXQgYWdhaW4gdG8gbWFrZSBzdXJlIGl0IGhhc24ndCBjaGFuZ2VkIGR1ZSB0byBhIHJhY2UgY29uZGl0aW9uLiBXZSBkb24ndCBzeW5jIGZvciB0aGUgZ2V0TWV0aG9kUHJveHkgYmVjYXVzZSB0aGF0IGdvZXMgdG8gdGhlIHJlbW90ZSB2bSBhbmQgY291bGQgZGVhZGxvY2suCi0JCQlJTWV0aG9kUHJveHkgbVZhbHVlID0gKElNZXRob2RQcm94eSkgbWV0aG9kcy5nZXQoa2V5KTsKLQkJCWlmIChtVmFsdWUgIT0gbnVsbCAmJiBtVmFsdWUgIT0gcmVzdWx0KSB7Ci0JCQkJcmVnaXN0cnkucmVsZWFzZVByb3h5KHJlc3VsdCk7IC8vIERvbid0IG5lZWQgdGhlIHJlc3VsdCBub3csIGdvdCBpdCB0aHJvdWdoIGEgcmFjZSBjb25kaXRpb24uCi0JCQkJcmV0dXJuIG1WYWx1ZTsgLy8gV2UgaGF2ZSBhIHJlYWwgdmFsdWUgbm93LgotCQkJfQotCQkJbWV0aG9kcy5wdXQoa2V5LCByZXN1bHQpOwotCQl9CQkKLQkJcmV0dXJuIHJlc3VsdDsJCQkJCi0JfQotLyoqCi0gKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLSAqIEByZXR1cm4gTWFwIG9mIGNhY2hlJ2QgbWV0aG9kcwotICovCi1wcml2YXRlIE1hcCBnZXRNZXRob2RzKElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5KSB7Ci0JTWFwIG1ldGhvZHMgPSAoTWFwKSBtZXRob2RzQ2FjaGUuZ2V0KGFCZWFuVHlwZVByb3h5LmdldFR5cGVOYW1lKCkpOwotCWlmKG1ldGhvZHMgPT0gbnVsbCl7Ci0JCW1ldGhvZHMgPSBuZXcgSGFzaE1hcCgyMCk7Ci0JCW1ldGhvZHNDYWNoZS5wdXQoYUJlYW5UeXBlUHJveHkuZ2V0VHlwZU5hbWUoKSxtZXRob2RzKTsKLQl9Ci0JcmV0dXJuIG1ldGhvZHM7Ci19Ci0vKioKLSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eQotICogQHJldHVybiBNYXAgb2YgY2FjaGUnZCBpbnZva2FibGVzCi0gKi8KLXByaXZhdGUgTWFwIGdldEludm9rYWJsZXMoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpIHsKLQlNYXAgaW52b2thYmxlcyA9IChNYXApIGludm9rYWJsZXNDYWNoZS5nZXQoYUJlYW5UeXBlUHJveHkpOwotCWlmKGludm9rYWJsZXMgPT0gbnVsbCl7Ci0JCWludm9rYWJsZXMgPSBuZXcgSGFzaE1hcCgyMCk7Ci0JCWludm9rYWJsZXNDYWNoZS5wdXQoYUJlYW5UeXBlUHJveHksaW52b2thYmxlcyk7Ci0JfQotCXJldHVybiBpbnZva2FibGVzOwotfQotLyoqCi0gKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLSAqIEByZXR1cm4gTWFwIG9mIGNhY2hlJ2QgZmllbGRzCi0gKi8KLXByaXZhdGUgTWFwIGdldEZpZWxkcyhJUHJveHlCZWFuVHlwZSBhQmVhblR5cGVQcm94eSkgewotCU1hcCBmaWVsZHMgPSAoTWFwKSBmaWVsZHNDYWNoZS5nZXQoYUJlYW5UeXBlUHJveHkuZ2V0VHlwZU5hbWUoKSk7Ci0JaWYoZmllbGRzID09IG51bGwpewotCQlmaWVsZHMgPSBuZXcgSGFzaE1hcCgyMCk7Ci0JCWZpZWxkc0NhY2hlLnB1dChhQmVhblR5cGVQcm94eS5nZXRUeXBlTmFtZSgpLGZpZWxkcyk7Ci0JfQotCXJldHVybiBmaWVsZHM7Ci19Ci0vKioKLSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eSA9IEJlYW5UeXBlUHJveHkgZm9yIHRoZSBtZXRob2QKLSAqIEBwYXJhbSBtZXRob2ROYW1lID0gbWV0aG9kTmFtZSB0byBiZSBsb29rZWQgZm9yCi0gKiBAcGFyYW0gcGFybVR5cGVzID0gYXJyYXkgb2YgcXVhbGlmaWVkIHR5cGUgbmFtZXMgZm9yIHRoZSBtZXRob2QgYXJndW1lbnRzLCBudWxsIGlmIG5vIGFyZ3VtZW50cwotICovIAotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSwgU3RyaW5nIGludm9rYWJsZU5hbWUsIFN0cmluZ1tdIHBhcm1UeXBlTmFtZXMpewotCQkKLQkJUkVNSU5WT0tBQkxFQ09VTlQrKzsKLQkJLy8gVGhlIGNsYXNzQ2FjaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBCZWFuVHlwZVByb3h5IGFuZCBob2xkcyBhIGZ1cnRoZXIgbWFwIG9mIGNhY2hlJ2QgbWV0aG9kcwotCQlNYXAgaW52b2thYmxlcyA9IGdldEludm9rYWJsZXMoYUJlYW5UeXBlUHJveHkpOwkKLQkJCi0JCU9iamVjdCBrZXkgPSBudWxsOyAKLQkJaWYocGFybVR5cGVOYW1lcyA9PSBudWxsIHx8IHBhcm1UeXBlTmFtZXMubGVuZ3RoID09IDApewotCQkJa2V5ID0gaW52b2thYmxlTmFtZTsKLQkJfSBlbHNlIHsKLQkJCWtleSA9IG5ldyBNZXRob2RLZXlTdHJpbmdQYXJtcyhpbnZva2FibGVOYW1lLCBwYXJtVHlwZU5hbWVzKTsKLQkJfQkJCQotCQkKLQkJSUludm9rYWJsZSByZXN1bHQgPSAoSUludm9rYWJsZSkgaW52b2thYmxlcy5nZXQoa2V5KTsKLQkJaWYocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7Ci0JCQotCQlVTklRVUVJTlZPS0FCTEVDT1VOVCsrOwotCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCS8vIEdldCB0aGUgbWV0aG9kIHByb3h5IGFuZCBjYWNoZSB0aGlzIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJUkVNTWV0aG9kUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChSRU1NZXRob2RQcm94eUZhY3RvcnkpIGFCZWFuVHlwZVByb3h5LmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCk7Ci0JCXJlc3VsdCA9IHByb3h5RmFjdG9yeS5nZXRJbnZva2FibGUoKElSRU1CZWFuVHlwZVByb3h5KWFCZWFuVHlwZVByb3h5LGludm9rYWJsZU5hbWUscGFybVR5cGVOYW1lcyk7Ci0JCWludm9rYWJsZXMucHV0KGtleSxyZXN1bHQpOwkJCi0JCXJldHVybiByZXN1bHQ7CQkJCQotCQkJCQotCX0KLQkvKioKLQkgKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkgPSBCZWFuVHlwZVByb3h5IGZvciB0aGUgbWV0aG9kCi0JICogQHBhcmFtIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lIHRvIGJlIGxvb2tlZCBmb3IKLQkgKiBAcGFyYW0gcGFybVR5cGVzID0gYXJyYXkgb2YgSUJlYW5UeXBlUHJveHkgdHlwZXMgZm9yIHRoZSBtZXRob2QgYXJndW1lbnRzLCBudWxsIGlmIG5vIGFyZ3VtZW50cwotCSAqLyAKLQkJcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgaW52b2thYmxlTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBwYXJtVHlwZXMpewotCQkJCi0JCQlSRU1JTlZPS0FCTEVDT1VOVCsrOwotCQkJLy8gVGhlIGNsYXNzQ2FjaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBCZWFuVHlwZVByb3h5IGFuZCBob2xkcyBhIGZ1cnRoZXIgbWFwIG9mIGNhY2hlJ2QgbWV0aG9kcwotCQkJTWFwIGludm9rYWJsZXMgPSBnZXRJbnZva2FibGVzKGFCZWFuVHlwZVByb3h5KTsJCi0JCQkKLQkJCU9iamVjdCBrZXkgPSBudWxsOyAKLQkJCWlmKHBhcm1UeXBlcyA9PSBudWxsIHx8IHBhcm1UeXBlcy5sZW5ndGggPT0gMCl7Ci0JCQkJa2V5ID0gaW52b2thYmxlTmFtZTsKLQkJCX0gZWxzZSB7Ci0JCQkJa2V5ID0gbmV3IE1ldGhvZEtleVByb3h5UGFybXMoaW52b2thYmxlTmFtZSwgcGFybVR5cGVzKTsKLQkJCX0JCQkKLQkJCQotCQkJSUludm9rYWJsZSByZXN1bHQgPSAoSUludm9rYWJsZSkgaW52b2thYmxlcy5nZXQoa2V5KTsKLQkJCWlmKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OwotCQkJCi0JCQlVTklRVUVJTlZPS0FCTEVDT1VOVCsrOwotCQkJLy8gR2V0IHRoZSBtZXRob2QgcHJveHkgYW5kIGNhY2hlIHRoaXMgYmVmb3JlIHJldHVybmluZyBpdAotCQkJLy8gR2V0IHRoZSBtZXRob2QgcHJveHkgYW5kIGNhY2hlIHRoaXMgYmVmb3JlIHJldHVybmluZyBpdAotCQkJUkVNTWV0aG9kUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChSRU1NZXRob2RQcm94eUZhY3RvcnkpIGFCZWFuVHlwZVByb3h5LmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCk7Ci0JCQlyZXN1bHQgPSBwcm94eUZhY3RvcnkuZ2V0SW52b2thYmxlKChJUkVNQmVhblR5cGVQcm94eSlhQmVhblR5cGVQcm94eSxpbnZva2FibGVOYW1lLHBhcm1UeXBlcyk7Ci0JCQlpbnZva2FibGVzLnB1dChrZXkscmVzdWx0KTsJCQotCQkJcmV0dXJuIHJlc3VsdDsJCQkJCi0JCQkJCQotCQl9CQotLyoqCi0gKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkgPSBCZWFuVHlwZVByb3h5IGZvciB0aGUgbWV0aG9kCi0gKiBAcGFyYW0gbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUgdG8gYmUgbG9va2VkIGZvcgotICogQHBhcmFtIHBhcm1UeXBlcyA9IGFycmF5IG9mIHF1YWxpZmllZCB0eXBlIG5hbWVzIGZvciB0aGUgbWV0aG9kIGFyZ3VtZW50cywgbnVsbCBpZiBubyBtZXRob2RzCi0gKi8gCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSwgU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gcGFybVR5cGVzKXsKLQkJaWYgKCFyZWdpc3RyeS5pc1ZhbGlkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVJFTU1FVEhPRENPVU5UKys7CQkKLQkJLy8gVGhlIGNsYXNzQ2FjaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBCZWFuVHlwZVByb3h5IGFuZCBob2xkcyBhIGZ1cnRoZXIgbWFwIG9mIGNhY2hlJ2QgbWV0aG9kcwotCQlNYXAgbWV0aG9kczsKLQkJT2JqZWN0IGtleTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQltZXRob2RzID0gZ2V0TWV0aG9kcyhhQmVhblR5cGVQcm94eSk7Ci0KLQkJCWtleSA9IG51bGw7Ci0JCQlpZiAocGFybVR5cGVzID09IG51bGwgfHwgcGFybVR5cGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJa2V5ID0gbWV0aG9kTmFtZTsKLQkJCX0gZWxzZSB7Ci0JCQkJa2V5ID0gbmV3IE1ldGhvZEtleVByb3h5UGFybXMobWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQkJCX0KLQotCQkJSU1ldGhvZFByb3h5IHJlc3VsdCA9IChJTWV0aG9kUHJveHkpIG1ldGhvZHMuZ2V0KGtleSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJVU5JUVVFTUVUSE9EQ09VTlQrKzsKLQkJLy8gR2V0IHRoZSBtZXRob2QgcHJveHkgYW5kIGNhY2hlIHRoaXMgYmVmb3JlIHJldHVybmluZyBpdAotCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCVJFTU1ldGhvZFByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSAoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKTsKLQkJSU1ldGhvZFByb3h5IHJlc3VsdCA9IHByb3h5RmFjdG9yeS5nZXRNZXRob2RQcm94eSgoSVJFTUJlYW5UeXBlUHJveHkpYUJlYW5UeXBlUHJveHksbWV0aG9kTmFtZSxwYXJtVHlwZXMpOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIEdldCBpdCBhZ2FpbiB0byBtYWtlIHN1cmUgaXQgaGFzbid0IGNoYW5nZWQgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uIFdlIGRvbid0IHN5bmMgZm9yIHRoZSBnZXRNZXRob2RQcm94eSBiZWNhdXNlIHRoYXQgZ29lcyB0byB0aGUgcmVtb3RlIHZtIGFuZCBjb3VsZCBkZWFkbG9jay4KLQkJCUlNZXRob2RQcm94eSBtVmFsdWUgPSAoSU1ldGhvZFByb3h5KSBtZXRob2RzLmdldChrZXkpOwotCQkJaWYgKG1WYWx1ZSAhPSBudWxsICYmIG1WYWx1ZSAhPSByZXN1bHQpIHsKLQkJCQlyZWdpc3RyeS5yZWxlYXNlUHJveHkocmVzdWx0KTsgLy8gRG9uJ3QgbmVlZCByZXN1bHQgbm93LCBnb3QgaXQgYWxyZWFkeSB0aHJvdWdoIGEgcmFjZSBjb25kaXRpb24uCi0JCQkJcmV0dXJuIG1WYWx1ZTsgLy8gV2UgaGF2ZSBhIHJlYWwgdmFsdWUgbm93LgotCQkJfQotCQkJbWV0aG9kcy5wdXQoa2V5LCByZXN1bHQpOwotCQl9CQkKLQotCQlyZXR1cm4gcmVzdWx0OwkJCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3h5IG1ldGhvZCBmb3IgdGhlIG1ldGhvZCB0aHJvdWdoIHRoZSBleHByZXNzaW9uLiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcm1UeXBlcwotCSAqIEByZXR1cm4gZWl0aGVyIHRoZSBJTWV0aG9kUHJveHkgaWYgYWxyZWFkeSByZXNvbHZlZCBvciBhbiBFeHByZXNzaW9uUHJveHkgaWYgbm90IHlldCByZXNvbHZlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXMpewotCQlpZiAoIXJlZ2lzdHJ5LmlzVmFsaWQoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJUkVNTUVUSE9EQ09VTlQrKzsJCi0JCU1hcCBtZXRob2RzOwotCQlNYXAgZXBNZXRob2RzOwotCQlPYmplY3Qga2V5OwotCQlib29sZWFuIGlzS2V5OwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIFRoZSBjbGFzc0NhY2hlIG1hcCBpcyBrZXllZCBieSB0aGUgQmVhblR5cGVQcm94eSBuYW1lIGFuZCBob2xkcyBhIGZ1cnRoZXIgbWFwIG9mIGNhY2hlJ2QgbWV0aG9kcwotCQkJbWV0aG9kcyA9IGdldE1ldGhvZHMoYUJlYW5UeXBlUHJveHkpOwotCi0JCQlpZiAocGFybVR5cGVzID09IG51bGwgfHwgcGFybVR5cGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJa2V5ID0gbWV0aG9kTmFtZTsKLQkJCQlpc0tleSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlrZXkgPSBuZXcgTWV0aG9kS2V5UHJveHlQYXJtcyhtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCQkJCWlzS2V5ID0gdHJ1ZTsKLQkJCX0KLQotCQkJSVByb3h5TWV0aG9kIHJlc3VsdCA9IChJUHJveHlNZXRob2QpIG1ldGhvZHMuZ2V0KGtleSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQotCQkJLy8gU2VlIGlmIHN0b3JlZCBpbiB0aGUgZXhwcmVzc2lvbi4KLQkJCWVwTWV0aG9kcyA9ICgoUkVNRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0TWV0aG9kcyhhQmVhblR5cGVQcm94eSk7Ci0JCQlyZXN1bHQgPSAoSVByb3h5TWV0aG9kKSBlcE1ldGhvZHMuZ2V0KGtleSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJVU5JUVVFTUVUSE9EQ09VTlQrKzsKLQkJLy8gR2V0IHRoZSBtZXRob2QgZXhwcmVzc2lvbiBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCUlQcm94eU1ldGhvZCByZXN1bHQgPSAoKEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmNyZWF0ZU1ldGhvZEV4cHJlc3Npb25Qcm94eShhQmVhblR5cGVQcm94eSxtZXRob2ROYW1lLHBhcm1UeXBlcyk7Ci0JCWVwTWV0aG9kcy5wdXQoa2V5LCByZXN1bHQpOwotCQlmaW5hbCBPYmplY3QgZXBLZXkgPSBrZXk7Ci0JCWZpbmFsIE1hcCByTWV0aG9kcyA9IG1ldGhvZHM7IAotCQlmaW5hbCBNYXAgZmVwTWV0aG9kcyA9IGVwTWV0aG9kczsKLQkJZmluYWwgYm9vbGVhbiBpc0tleVR5cGUgPSBpc0tleTsKLQkJKChFeHByZXNzaW9uUHJveHkpIHJlc3VsdCkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCXN5bmNocm9uaXplZCAoUkVNUHJveHlDb25zdGFudHMudGhpcykgewotCQkJCQlpZiAock1ldGhvZHMuY29udGFpbnNLZXkoZXBLZXkpKQotCQkJCQkJcmV0dXJuOwkvLyBXZSBhbHJlYWR5IGhhdmUgYSB0cnVlIG1ldGhvZCBwcm94eSBpbiB0aGVyZS4gQSByYWNlIGNvbmRpdGlvbiBvY2N1cnJlZC4KLQkJCQkJCi0JCQkJCS8vIE5vdyBwdXQgdGhpcyByZXNvbHZlZCBndXkgaW50byB0aGUgbWV0aG9kcy4KLQkJCQkJLy8gV2UgZG9uJ3Qgd2FudCB0aGUga2V5IHRvIGNvbnRhaW4gZXhwcmVzc2lvbiBwcm94aWVzIGluIHRoZSBmaW5hbCBtYXAsIHNvIGlmIGl0IGlzIGEga2V5IHR5cGUKLQkJCQkJLy8gd2Ugd2lsbCB0dXJuIGl0IGludG8gYSBzdHJpbmcgdHlwZSBrZXkuCi0JCQkJCU9iamVjdCBrZXk7Ci0JCQkJCWlmIChpc0tleVR5cGUpIHsKLQkJCQkJCWtleSA9ICgoTWV0aG9kS2V5UHJveHlQYXJtcykgZXBLZXkpLnRvTWV0aG9kS2V5U3RyaW5nUGFybXMoKTsJLy8gU28gdGhhdCB3ZSBkb24ndCBwdXQgYSBrZXQgdGhhdCBjb250YWlucyBleHByZXNzaW9uIHByb3h5IHBhcm0gdHlwZXMgaW50byB0aGUgbWFpbiBtYXAuCi0JCQkJCX0gZWxzZQotCQkJCQkJa2V5ID0gZXBLZXk7Ci0JCQkJCQotCQkJCQlyTWV0aG9kcy5wdXQoa2V5LCBldmVudC5nZXRQcm94eSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJFTVByb3h5Q29uc3RhbnRzLnRoaXMpIHsKLQkJCQkJZmVwTWV0aG9kcy5yZW1vdmUoZXBLZXkpOwotCQkJCX0KLQkJCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQkJCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm94eQotCSAqLwotCXN0YXRpYyB2b2lkIG1ldGhvZEludm9rZWQoUkVNTWV0aG9kUHJveHkgcHJveHkpIHsKLQkKLQkJaWYgKEdBVEhFUl9DT1VOVFMpIHsKLQkJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgTUVUSE9EQ09VTlRNQVAuZ2V0KHByb3h5KTsKLQkJCWlmIChjb3VudCA9PSBudWxsKSB7Ci0JCQkJTUVUSE9EQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcigxKSk7Ci0JCQl9IGVsc2UgewotCQkJCU1FVEhPRENPVU5UTUFQLnB1dChwcm94eSwgbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpKTsKLQkJCX0KLQkJfQotCX0KLQotCXN0YXRpYyB2b2lkIGZpZWxkR2V0SW52b2tlZChJQmVhblByb3h5IHByb3h5KSB7Ci0KLQkJaWYgKEdBVEhFUl9DT1VOVFMpIHsKLQkJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgRklFTERDT1VOVE1BUC5nZXQocHJveHkpOwotCQkJaWYgKGNvdW50ID09IG51bGwpIHsKLQkJCQlGSUVMRENPVU5UTUFQLnB1dChwcm94eSwgbmV3IEludGVnZXIoMSkpOwotCQkJfSBlbHNlIHsKLQkJCQlGSUVMRENPVU5UTUFQLnB1dChwcm94eSwgbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpKTsKLQkJCX0gCi0JCX0JCQotCX0KLQotCXN0YXRpYyB2b2lkIGZpZWxkU2V0SW52b2tlZChJQmVhblByb3h5IHByb3h5LCBJQmVhblByb3h5IHZhbHVlKSB7Ci0KLQkJaWYgKEdBVEhFUl9DT1VOVFMpIHsKLQkJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgRklFTERTRVRDT1VOVE1BUC5nZXQocHJveHkpOwotCQkJaWYgKGNvdW50ID09IG51bGwpIHsKLQkJCQlGSUVMRFNFVENPVU5UTUFQLnB1dChwcm94eSwgbmV3IEludGVnZXIoMSkpOwotCQkJfSBlbHNlIHsKLQkJCQlGSUVMRFNFVENPVU5UTUFQLnB1dChwcm94eSwgbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpKTsKLQkJCX0gCi0JCX0JCQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3h5IGZvciB0aGUgQmVhblR5cGUgb2YgdGhlIGZpZWxkCi0JICogQHBhcmFtIGZpZWxkTmFtZSBvZiB0aGUgZmllbGQsIGUuZy4gKGphdmEuYXd0LkRpbWVuc2lvbiwgd2lkdGgpIGZvciB0aGUgIndpZHRoIiBmaWVsZCBvbiBEaW1lbnNpb24KLQkgKiBAcmV0dXJuIFRoZSBmaWVsZCBwcm94eSB0aGF0IGlzIGNhY2hlJ2QgZm9yIHBlcmZvcm1hbmNlCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCWlmICghcmVnaXN0cnkuaXNWYWxpZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlSRU1GSUVMRENPVU5UKys7Ci0JCU1hcCBmaWVsZHM7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gVGhlIGZpZWxkIG1hcCBpcyBrZXllZCBieSB0aGUgQmVhblR5cGVQcm94eSBhbmQgaG9sZHMgYSBmdXJ0aGVyIG1hcCBvZiBjYWNoZSdkIGZpZWxkcwotCQkJZmllbGRzID0gZ2V0RmllbGRzKGFCZWFuVHlwZVByb3h5KTsJCi0JCQkJCi0JCQkvLyBMb29rdXAgdGhlIGNhY2hlJ2QgRmllbGQgcHJveHkKLQkJCUlGaWVsZFByb3h5IHJlc3VsdCA9IChJRmllbGRQcm94eSkgZmllbGRzLmdldChmaWVsZE5hbWUpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCVVOSVFVRUZJRUxEQ09VTlQrKzsKLQkJSUZpZWxkUHJveHkgcmVzdWx0ID0gKElGaWVsZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoYUJlYW5UeXBlUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSkuZ2V0Q2xhc3NHZXRGaWVsZCgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygKLQkJCQlhQmVhblR5cGVQcm94eSwKLQkJCQlyZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChmaWVsZE5hbWUpKTsJCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJSUZpZWxkUHJveHkgZlZhbHVlID0gKElGaWVsZFByb3h5KSBmaWVsZHMuZ2V0KGZpZWxkTmFtZSk7Ci0JCQlpZiAoZlZhbHVlICE9IG51bGwpIHsKLQkJCQlyZWdpc3RyeS5yZWxlYXNlUHJveHkocmVzdWx0KTsJLy8gRG9uJ3QgbmVlZCBpdCBub3cuIEEgcmFjZSBoYWQgcHV0IGFub3RoZXIgb25lIGluLgotCQkJCXJldHVybiBmVmFsdWU7Ci0JCQl9Ci0JCQlmaWVsZHMucHV0KGZpZWxkTmFtZSxyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7CQkJCQotCX0KLQkKLQlwdWJsaWMgSVByb3h5RmllbGQgZ2V0RmllbGRQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSBhQmVhblR5cGVQcm94eSwgZmluYWwgU3RyaW5nIGZpZWxkTmFtZSl7Ci0JCWlmICghcmVnaXN0cnkuaXNWYWxpZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlSRU1GSUVMRENPVU5UKys7Ci0JCU1hcCBmaWVsZHM7Ci0JCU1hcCBlcEZpZWxkczsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBUaGUgY2xhc3NDYWNoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIEJlYW5UeXBlUHJveHkgbmFtZSBhbmQgaG9sZHMgYSBmdXJ0aGVyIG1hcCBvZiBjYWNoZSdkIG1ldGhvZHMKLQkJCWZpZWxkcyA9IGdldEZpZWxkcyhhQmVhblR5cGVQcm94eSk7CQotCQkKLQkJCUlQcm94eUZpZWxkIHJlc3VsdCA9IChJUHJveHlGaWVsZCkgZmllbGRzLmdldChmaWVsZE5hbWUpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkKLQkJCS8vIFNlZSBpZiBzdG9yZWQgaW4gdGhlIGV4cHJlc3Npb24uCi0JCQllcEZpZWxkcyA9ICgoUkVNRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0RmllbGRzKGFCZWFuVHlwZVByb3h5KTsKLQkJCXJlc3VsdCA9IChJUHJveHlGaWVsZCkgZXBGaWVsZHMuZ2V0KGZpZWxkTmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsJCQkKLQkJfQotCQkKLQkJVU5JUVVFRklFTERDT1VOVCsrOwotCQkvLyBHZXQgdGhlIGZpZWxkIGV4cHJlc3Npb24gcHJveHkgYW5kIGNhY2hlIHRoaXMgYmVmb3JlIHJldHVybmluZyBpdAotCQlJUHJveHlGaWVsZCByZXN1bHQgPSAoKFJFTUV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmNyZWF0ZUZpZWxkRXhwcmVzc2lvblByb3h5KGFCZWFuVHlwZVByb3h5LCBmaWVsZE5hbWUpOwotCQllcEZpZWxkcy5wdXQoZmllbGROYW1lLCByZXN1bHQpOwotCQlmaW5hbCBNYXAgZnBGaWVsZHMgPSBmaWVsZHM7Ci0JCWZpbmFsIE1hcCBmZXBGaWVsZHMgPSBlcEZpZWxkczsKLQkJKChFeHByZXNzaW9uUHJveHkpIHJlc3VsdCkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3luY2hyb25pemVkIChSRU1Qcm94eUNvbnN0YW50cy50aGlzKSB7Ci0JCQkJCWlmIChmcEZpZWxkcy5jb250YWluc0tleShmaWVsZE5hbWUpKQotCQkJCQkJcmV0dXJuOwkvLyBBbHJlYWR5IHNldCB0byByZXNvbHZlZCB2YWx1ZSBieSBzb21lb25lIGVsc2UuCi0JCQkJCWZwRmllbGRzLnB1dChmaWVsZE5hbWUsIGV2ZW50LmdldFByb3h5KCkpOwotCQkJCX0KLQkJCX0KLQkJCSBwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKEV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJIHN5bmNocm9uaXplZCAoUkVNUHJveHlDb25zdGFudHMudGhpcykgewotCQkJCQkgZmVwRmllbGRzLnJlbW92ZShmaWVsZE5hbWUpOwotCQkJCX0KLQkJCSB9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsJCQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWZhNGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtc1Byb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSByZWdpc3RyeSB0byB1c2UgZm9yIFJlbW90ZSBWTS4KLSAqIEl0IGFkZHMgdG8gdGhlIHN0YW5kYXJkIHJlZ2lzdHJ5LCBjb25uZWN0aW9uIHNwZWNpZmljIGluZm9ybWF0aW9uLgotICoKLSAqIFRoaXMgd2lsbCBhbHdheXMgaG9sZCBvbnRvIG9uZSBjb25uZWN0aW9uIG9wZW4gdW50aWwgdGVybWluYXRpb24gaXMgcmVxdWVzdGVkLgotICogVGhhdCB3YXkgd2hpbGUgdGhlIElERSBpcyB1cCwgdGhlIHJlbW92ZSB2bSB3b24ndCB0aW1lIG91dC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9SRUdJU1RSWV9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLmplbS5SRU1PVEUiOwkvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIGludCBmU2VydmVyUG9ydCA9IDA7CS8vIFRoZSBzZXJ2ZXIgcG9ydCB0byB1c2Ugd2hlbiBtYWtpbmcgY29ubmVjdGlvbnMuCi0JcHJvdGVjdGVkIFJFTUNhbGxiYWNrUmVnaXN0cnkgZkNhbGxiYWNrU2VydmVyOwkvLyBUaGUgY2FsbGJhY2sgc2VydmVyIHRocmVhZCBmb3IgdGhpcyByZW1vdGUgdm0uCi0JcHJvdGVjdGVkIFN0YWNrIGZDb25uZWN0aW9uUG9vbCA9IG5ldyBTdGFjaygpOwkvLyBTdGFjayBvZiBmcmVlIGNvbm5lY3Rpb25zLgotCXByb3RlY3RlZCBzdGF0aWMgaW50IE5VTUJFUl9GUkVFX0NPTk5FQ1RJT05TID0gNTsJLy8gTnVtYmVyIG9mIGZyZWUgY29ubmVjdGlvbnMgdG8ga2VlcCBvcGVuLgotCXByb3RlY3RlZCBJUHJvY2VzcyBmUHJvY2VzczsJLy8gVGhlIHByb2Nlc3MgdGhhdCBpcyB0aGUgc2VydmVyLiBJZiBudWxsIGFuZCBmU2VydmVyUG9ydCBpcyBub3QgemVybywgCi0JCQkJCQkJCQkvLyB0aGVuIHRoaXMgcmVnaXN0cnkgaXMgaW4gdGVzdCBtb2RlCi0JCQkJCQkJCQkvLyBhbmQgdGhlIHNlcnZlciBpcyBpbiBzYW1lIHRoZSBwcm9jZXNzLgotCXByb3RlY3RlZCBTdHJpbmcgZk5hbWU7Ci0JcHJvdGVjdGVkIGludCBmQ2FsbGJhY2tTZXJ2ZXJQb3J0OwotCXByb3RlY3RlZCBJbnRlZ2VyIGZSZWdpc3RyeUtleTsKLQlwcm90ZWN0ZWQgUkVNUmVnaXN0cnlDb250cm9sbGVyIGZSZWdpc3RyeUNvbnRyb2xsZXI7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBPYmplY3QgVEVSTUlOQVRFX0pPQl9GQU1JTFkgPSBuZXcgT2JqZWN0KCk7Ci0JCi0JLy8gUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBvbmx5IHRoZSBQcm94eVZNU3RhcnRlciBzaG91bGQgc2V0IHRoaXMgZmxhZy4gSXQgd291bGQgc2V0IGl0IGlmCi0JLy8gd29ya2luZyB3aXRoIGEgZGVidWdnZXIgYmVjYXVzZSB3ZSBkb24ndCBob3cgbG9uZyBpdCB3aWxsIGJlIHRvIHJlc3BvbmQgdG8gcmVxdWVzdHMgd2hlbiAKLQkvLyBzb21lb25lIGlzIHdvcmtpbmcgd2l0aCBhIGRlYnVnZ2VyLgotCWJvb2xlYW4gZk5vVGltZW91dHMgPSBmYWxzZTsKLQkKLQkvLyBUaGlzIGlzIHNldCB2aWEgdGhlIHN0YXRpYyBzZXRHbG9iYWxOb1RpbWVvdXRzKCkgbWV0aG9kLCBvciB2aWEgZGVidWcgb3B0aW9ucyBmbGFnLiBJdCBpcyBoZXJlIHNvIHRoYXQKLQkvLyB3aGVuIGRlYnVnZ2luZyBjYWxsYmFja3MsIGJ1dCBub3QgZGVidWdnaW5nIHJlbW90ZSB2bSwgdGhhdCBubyB0aW1lb3V0cyBmb3IgYW55IHJlZ2lzdHJ5IHdpbGwgb2NjdXIuCi0JLy8gT3IgaXQgY2FuIGJlIHNldCB0aHJvdWdoIHRoZSBkZWJ1ZyAub3B0aW9ucyBmbGFnLgotCXN0YXRpYyBib29sZWFuIGZHbG9iYWxOb1RpbWVvdXRzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkrUHJveHlSZW1vdGVVdGlsLk5PX1RJTUVPVVRTKSk7IC8vJE5PTi1OTFMtMSQ7Ci0JCi0JLyoqCi0JICogVHlwaWNhbGwgc2V0IHRocm91Z2ggdGhlICJleHByZXNzaW9uIiBldmFsdWF0aW9uIG9mIHRoZSBkZWJ1Z2dlci4KLQkgKiBAcGFyYW0gbm9UaW1lb3V0cwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHbG9iYWxOb1RpbWVvdXRzKGJvb2xlYW4gbm9UaW1lb3V0cykgewotCQlmR2xvYmFsTm9UaW1lb3V0cyA9IG5vVGltZW91dHM7Ci0JfQotCQotCS8vIEFuIGludGVybmFsIHRocmVhZCB0aGF0IGxvY2tzIGFuZCB3YWl0cyBmb3IgdGhlIHJlbW90ZSB2bSB0byByZWdpc3RlciBpdHNlbGYuIAotCXByaXZhdGUgV2FpdEZvclJlZ2lzdHJhdGlvblRocmVhZCB3YWl0UmVnaXN0cmF0aW9uVGhyZWFkOwotCQotCXByaXZhdGUgY2xhc3MgV2FpdEZvclJlZ2lzdHJhdGlvblRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCXB1YmxpYyBXYWl0Rm9yUmVnaXN0cmF0aW9uVGhyZWFkKCkgewotCQkJc3VwZXIoIldhaXQgZm9yIHJlbW90ZSB2bSByZWdpc3RyYXRpb24gdGhyZWFkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlRocmVhZCNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gV2FpdCBmb3IgcmVnaXN0cmF0aW9uLiBQdXQgaXQgaW50byBhIHRocmVhZCBzbyB0aGlzCi0JCQkvLyBjYW4gb2NjdXIgd2hpbGUgb3RoZXIgc3R1ZmYgZ29lcyBvbi4gSXQgbG9ja3MgdGhlIGZDb25uZWN0aW9uUG9vbAotCQkJLy8gdW50aWwgZG9uZSBzbyB0aGF0IHRoZSBmaXJzdCByZXF1ZXN0IGZvciBhIGNvbm5lY3Rpb24gYnkgYW55b25lCi0JCQkvLyBlbHNlIHdpbGwgd2FpdCB1bnRpbCB0aGlzIHRocmVhZCBpcyBmaW5pc2hlZC4gCi0JCQkKLQkJCXN5bmNocm9uaXplZChmQ29ubmVjdGlvblBvb2wpIHsKLQkJCQlzeW5jaHJvbml6ZWQoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkudGhpcykgewotCQkJCQkvLyBOb3RpZnkgdGhlIG1haW4gdGhyZWFkIHRoYXQgd2UgaGF2ZSB0aGUgCi0JCQkJCS8vIGNvbm5lY3Rpb24gcG9vbCBsb2NrZWQuCi0JCQkJCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5LnRoaXMubm90aWZ5QWxsKCk7Ci0JCQkJfQotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkvLyBzeW5jIG9uIHNlbGYgc28gdGhhdCBpdCBjYW4gYmUgbm90aWZpZWQgd2hlbiBmaW5hbGx5IHJlY2VpdmUgdGhlIHJlZ2lzdHJhdGlvbgotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkrNjAwMDA7Ci0JCQkJCXdoaWxlICh3YWl0UmVnaXN0cmF0aW9uVGhyZWFkICE9IG51bGwgJiYgKGZOb1RpbWVvdXRzIHx8IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgc3RvcFRpbWUpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkud2FpdCg2MDAwMCk7Ci0JCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXdhaXRSZWdpc3RyYXRpb25UaHJlYWQgPSBudWxsOwkvLyBObyBsb25nZXIgZXhpc3RzLgkJCQkKLQkJfQotCX0KLQotCQotCXB1YmxpYyBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeShSRU1SZWdpc3RyeUNvbnRyb2xsZXIgcmVnaXN0cnlDb250cm9sbGVyLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihSRU1PVEVfUkVHSVNUUllfVFlQRV9JRCk7Ci0JCWZSZWdpc3RyeUNvbnRyb2xsZXIgPSByZWdpc3RyeUNvbnRyb2xsZXI7CQkKLQkJZlJlZ2lzdHJ5S2V5ID0gZlJlZ2lzdHJ5Q29udHJvbGxlci5yZWdpc3RlclJlZ2lzdHJ5KHRoaXMpOwkvLyBSZWdpc3RlciB0aGUgcmVnaXN0cnkgd2l0aCB0aGUgcGx1Z2luLgkJCi0JCWZOYW1lID0gbmFtZTsJCQotCQkKLQkJLy8gR2V0IHRoZSB3YWl0UmVnaXN0cmF0aW9uVGhyZWFkIHN0YXJ0ZWQgYmVmb3JlIHdlIGFjdHVhbGx5IGxhdW5jaCByZW1vdGUgdm0gc28KLQkJLy8gdGhhdCBpdCBpcyB3YWl0aW5nIHdoZW4gdGhlIGNhbGxiYWNrIGNvbWVzIGluLgotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCXdhaXRSZWdpc3RyYXRpb25UaHJlYWQgPSBuZXcgV2FpdEZvclJlZ2lzdHJhdGlvblRocmVhZCgpOwotCQkJd2FpdFJlZ2lzdHJhdGlvblRocmVhZC5zdGFydCgpOwotCQkJCi0JCQkvLyBOb3cgd2Ugd2lsbCB3YWl0IHVudGlsIHRoZSByZWdpc3RyYXRpb24gY2FsbGJhY2sgaGFzIGJlZW4gZG9uZS4gVGhlIHRocmVhZCB3aWxsCi0JCQkvLyBzaWduYWwgdXMgd2hlbiB0aGF0IGlzIGRvbmUuIFRoaXMgaXMgc28gdGhhdCB3ZSBkb24ndCBjb250aW51ZSBvbiBhbmQgbGV0Ci0JCQkvLyBhIHdvcmsgY29ubmVjdGlvbiBiZSByZXF1ZXN0ZWQgYmVmb3JlIHdlIGV2ZW4gZ290IGEgY2hhbmNlIHRvIHN0YXJ0IHdhaXRpbmcKLQkJCS8vIGZvciB0aGUgcmVnaXN0cmF0aW9uLgotCQkJd2hpbGUodHJ1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCXdhaXQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX07CQkKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFJlZ2lzdHJ5S2V5KCkgewotCQlyZXR1cm4gZlJlZ2lzdHJ5S2V5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUmVnaXN0cnkoSVByb2Nlc3MgcHJvY2VzcykgewotCQlmUHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXByb2Nlc3NMaXN0ZW5lciA9IG5ldyBJRGVidWdFdmVudFNldExpc3RlbmVyKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSURlYnVnRXZlbnRTZXRMaXN0ZW5lciNoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlEZWJ1Z0V2ZW50IGUgPSBldmVudHNbaV07Ci0JCQkJCWlmIChlLmdldFNvdXJjZSgpID09IGZQcm9jZXNzICYmIGUuZ2V0S2luZCgpID09IERlYnVnRXZlbnQuVEVSTUlOQVRFKSB7Ci0JCQkJCQkvLyBXZSB0ZXJtaW5hdGluZyB0b28gc29vbi4gUG9wIHVwIGEgbXNnLgotCQkJCQkJSVN0cmVhbXNQcm94eSBzdFByb3h5ID0gZlByb2Nlc3MuZ2V0U3RyZWFtc1Byb3h5KCk7Ci0JCQkJCQlqYXZhLmlvLlN0cmluZ1dyaXRlciBzID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCQlqYXZhLmlvLlByaW50V3JpdGVyIHcgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihzKTsKLQkJCi0JCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eV9UZXJtaW5hdGVkX3Rvb19zb29uX0VSUk9SXywgbmV3IE9iamVjdFtdIHtmTmFtZX0pOyAKLQkJCQkJCXcucHJpbnRsbihtc2cpOwkJCQkJCQotCQkJCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9JTkZPXyk7IAotCQkJCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9MSU5FMSk7IAotCQkJCQkJdy5wcmludGxuKHN0UHJveHkuZ2V0RXJyb3JTdHJlYW1Nb25pdG9yKCkuZ2V0Q29udGVudHMoKSk7Ci0JCQkJCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9URVJNSU5BVEVEX0xJTkUyKTsgCi0JCQkJCQl3LnByaW50bG4oc3RQcm94eS5nZXRPdXRwdXRTdHJlYW1Nb25pdG9yKCkuZ2V0Q29udGVudHMoKSk7Ci0JCQkJCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9URVJNSU5BVEVEX0xJTkUzKTsgCi0JCQkJCQl3LmNsb3NlKCk7Ci0JCQotCQkJCQkJRGVidWdNb2RlSGVscGVyIGRoID0gbmV3IERlYnVnTW9kZUhlbHBlcigpOwotCQkJCQkJZGguZGlzcGxheUVycm9yTWVzc2FnZShQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5X0Vycm9yX1RpdGxlLCBtc2cpOyAKLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIHMudG9TdHJpbmcoKSwgbnVsbCkpOwotCQkJCQkJcHJvY2Vzc0xpc3RlbmVyID0gbnVsbDsKLQkJCQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVEZWJ1Z0V2ZW50TGlzdGVuZXIodGhpcyk7CQkJCQkJCi0JCQkJCQl0ZXJtaW5hdGVSZWdpc3RyeSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgSURlYnVnRXZlbnRTZXRMaXN0ZW5lciBwcm9jZXNzTGlzdGVuZXIgPSBudWxsOwotCQotCS8qKgotCSAqIEdldCB0aGUgQ2FsbGJhY2tSZWdpc3RyeQotCSAqLwotCXB1YmxpYyBJQ2FsbGJhY2tSZWdpc3RyeSBnZXRDYWxsYmFja1JlZ2lzdHJ5KCkgewotCQlpZiAoZkNhbGxiYWNrU2VydmVyID09IG51bGwpCi0JCQlmQ2FsbGJhY2tTZXJ2ZXIgPSBuZXcgUkVNQ2FsbGJhY2tSZWdpc3RyeShmTmFtZSwgdGhpcyk7Ci0JCXJldHVybiBmQ2FsbGJhY2tTZXJ2ZXI7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSByZWdpc3RyeSBjb250cm9sbGVyIHRvIHRlbGwKLQkgKiB0aGUgcmVnaXN0cnkgdG8gdGVybWluYXRlIHdpdGggcHJlanVkaWNlIGFsbCAKLQkgKiBwZW5kaW5nIFRlcm1pbmF0ZUpvYnMuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhbmNlbEFsbFRlcm1pbmF0ZUpvYnMoKSB7Ci0JCUlKb2JNYW5hZ2VyIGpvYk1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCk7Ci0JCWpvYk1hbmFnZXIuY2FuY2VsKFRFUk1JTkFURV9KT0JfRkFNSUxZKTsKLQkJdHJ5IHsKLQkJCWpvYk1hbmFnZXIuam9pbihURVJNSU5BVEVfSk9CX0ZBTUlMWSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlcm1pbmF0ZVByb2Nlc3MgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIElQcm9jZXNzIHByb2Nlc3M7Ci0JCQotCQlwdWJsaWMgVGVybWluYXRlUHJvY2VzcyhJUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCQlzdXBlcihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0pvYl9UZXJtaW5hdGVQcm9jZXNzX1RpdGxlKTsJIAotCQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCXJldHVybiBmYW1pbHkgPT0gVEVSTUlOQVRFX0pPQl9GQU1JTFkgfHwgc3VwZXIuYmVsb25nc1RvKGZhbWlseSk7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLlRocmVhZCNydW4oKQotCQkgKi8KLQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uKSB7Ci0JCQl0cnkgewotCQkJCS8vIFRoZXJlIGlzIG5vIGpvaW4gb24gYSBwcm9jZXNzIGF2YWlsYWJsZSwgc28gd2Ugd2lsbCBoYXZlIHRvCi0JCQkJLy8gYnVzeSB3YWl0LiBHaXZlIGl0IDEwIHNlY29uZHMgaW4gMS8xMCBzZWNvbmQgaW50ZXJ2YWxzLgotCQkJCWZvciAoaW50IGk9MDsgIXByb2Nlc3MuaXNUZXJtaW5hdGVkKCkgJiYgaTwxMDA7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7CQkJCQkJCQotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFwcm9jZXNzLmlzVGVybWluYXRlZCgpKSB7Ci0JCQkJCXByb2Nlc3MudGVybWluYXRlKCk7Ci0JCQkJfSAKLQkJCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdHJ5VGVybWluYXRlZChib29sZWFuIHdhaXQpIHsKLQkJaWYgKHByb2Nlc3NMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkvLyBSZW1vdmUgbGlzdGVuZXIgY2F1c2Ugd2UgYXJlIG5vdyBnb2luZyB0byB0ZXJtaW5hdGUgcHJvY2VzcyBhbmQgZG9uJ3Qgd2FudCBwcmVtYXR1cmUgdGVybWluYXRlIG5vdGljZS4KLQkJCS8vIFNvbWV0aW1lcyBpbiBzaHV0ZG93biB3ZSBhcmUgY2FsbGVkIGFuZCB0aGUgZGVidWcgcGx1Z2luIG1heSBvZiBhbHJlYWR5IGJlZW4gc2h1dGRvd24uIEluIHRoYXQgY2FzZSB0aGUgZGIKLQkJCS8vIHdpbGwgYmUgbnVsbCBhbmQgdGhlcmUgaXMgbm90aGluZyByZW1vdmUgbGlzdGVuZXIgZnJvbS4KLQkJCURlYnVnUGx1Z2luIGRiID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQkJaWYgKGRiICE9IG51bGwpCi0JCQkJZGIucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JCQlwcm9jZXNzTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCQotCQlKb2IgdGpvYiA9IG51bGw7Ci0JCWlmIChmU2VydmVyUG9ydCAhPSAwKSB7Ci0JCQlpZiAod2FpdFJlZ2lzdHJhdGlvblRocmVhZCAhPSBudWxsKSB7Ci0JCQkJc3luY2hyb25pemVkICh3YWl0UmVnaXN0cmF0aW9uVGhyZWFkKSB7Ci0JCQkJCS8vIFN0aWxsIHdhaXRpbmcuIGNsb3NlIGl0IG91dC4KLQkJCQkJV2FpdEZvclJlZ2lzdHJhdGlvblRocmVhZCB3VGhyZWFkID0gd2FpdFJlZ2lzdHJhdGlvblRocmVhZDsKLQkJCQkJd2FpdFJlZ2lzdHJhdGlvblRocmVhZCA9IG51bGw7Ci0JCQkJCXdUaHJlYWQubm90aWZ5QWxsKCk7Ci0JCQkJfQotCQkJfQotCQkJCQkKLQkJCUlSRU1Db25uZWN0aW9uIGNsb3NlQ29uID0gbnVsbDsJLy8gVGhlIGNvbm5lY3Rpb24gd2Ugd2lsbCB1c2UgdG8gY2xvc2UgdGhlIHJlbW90ZSB2bS4KLQkJCXN5bmNocm9uaXplZChmQ29ubmVjdGlvblBvb2wpIHsKLQkJCQkvLyBOb3cgd2Ugd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgZnJlZSBjb25uZWN0aW9ucyBhbmQgY2xvc2UgdGhlbSBwcm9wZXJseS4KLQkJCQlJdGVyYXRvciBpdHIgPSBmQ29ubmVjdGlvblBvb2wuaXRlcmF0b3IoKTsKLQkJCQlpZiAoaXRyLmhhc05leHQoKSkKLQkJCQkJY2xvc2VDb24gPSAoSVJFTUNvbm5lY3Rpb24pIGl0ci5uZXh0KCk7Ci0JCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJSVJFTUNvbm5lY3Rpb24gY29uID0gKElSRU1Db25uZWN0aW9uKSBpdHIubmV4dCgpOwotCQkJCQljb24uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCi0JCQkvLyBOb3cgd2UgdGVybWluYXRlIHRoZSBzZXJ2ZXIuCi0JCQlpZiAoY2xvc2VDb24gPT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQljbG9zZUNvbiA9IGdldEZyZWVDb25uZWN0aW9uKCk7CS8vIFRoZXJlIHdlcmVuJ3QgYW55IGZyZWUgY29ubmVjdGlvbnMsIHNvIGdldCBhIG5ldyBvbmUgc28gdGhhdCB3ZSBjYW4gY2xvc2UgaXQuCi0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gRG8gbm90aGluZywgZG9uJ3Qgd2FudCB0byBzdG9wIHRlcm1pbmF0aW9uIGp1c3QgYmVjYXVzZSB3ZSBjYW4ndCBnZXQgYSBjb25uZWN0aW9uLgotCQkJCX0KLQkJCWlmIChjbG9zZUNvbiAhPSBudWxsKSB7Ci0JCQkJY2xvc2VDb24udGVybWluYXRlU2VydmVyKCk7CS8vIFdlIGdvdCBhIGNvbm5lY3Rpb24gdG8gdGVybWluYXRlIChwcm9jZXNzIG1heSBvZiB0ZXJtaW5hdGVkIGVhcmx5LCBzbyB3ZSB3b3VsZCBub3QgaGF2ZSBhIGNvbm4gdGhlbikuCi0JCQl9Ci0JCQlmQ29ubmVjdGlvblBvb2wuY2xlYXIoKTsKLQkJCWZTZXJ2ZXJQb3J0ID0gMDsKLQkJCQotCQkJaWYgKGZQcm9jZXNzICE9IG51bGwgJiYgIWZSZWdpc3RyeUNvbnRyb2xsZXIuaW5TaHV0RG93bigpKSB7Ci0JCQkJdGpvYiA9IG5ldyBUZXJtaW5hdGVQcm9jZXNzKGZQcm9jZXNzKTsKLQkJCQl0am9iLnNldFN5c3RlbSh0cnVlKTsKLQkJCQl0am9iLnNjaGVkdWxlKCk7Ci0JCQkJZlByb2Nlc3MgPSBudWxsOwotCQkJfQotCQl9Ci0JCi0JCWlmIChmQ2FsbGJhY2tTZXJ2ZXIgIT0gbnVsbCkgewotCQkJZkNhbGxiYWNrU2VydmVyLnJlcXVlc3RTaHV0ZG93bigpOwotCQkJZkNhbGxiYWNrU2VydmVyID0gbnVsbDsJCQkJCi0JCX0KLQkJCi0JCWZDb25uZWN0aW9uUG9vbC5jbGVhcigpOwotCQlmUmVnaXN0cnlDb250cm9sbGVyLmRlcmVnaXN0ZXJSZWdpc3RyeShmUmVnaXN0cnlLZXkpOwkvLyBEZS1yZWdpc3RlciB0aGlzIHJlZ2lzdHJ5LgotCQkKLQkJaWYgKHdhaXQgJiYgdGpvYiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRqb2Iuam9pbigpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIEl0IHRpbWVkIG91dCwgc28gd2UnbGwganVzdCBnbyBvbi4KLQkJCX0KLQkJfQotCX0KLQkJCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VydmVyIHBvcnQgbnVtYmVyLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKLQkJcmV0dXJuIGZTZXJ2ZXJQb3J0OwotCX0KLQkKLQkvKgotCSAqIHNldCB0aGUgc2VydmVyIHBvcnQuCi0JICovCi0Jdm9pZCBzZXRTZXJ2ZXJQb3J0KGludCBzZXJ2ZXJwb3J0KSB7Ci0JCWZTZXJ2ZXJQb3J0ID0gc2VydmVycG9ydDsKLQkJaWYgKHdhaXRSZWdpc3RyYXRpb25UaHJlYWQgIT0gbnVsbCkgewotCQkJCXN5bmNocm9uaXplZCAod2FpdFJlZ2lzdHJhdGlvblRocmVhZCkgewotCQkJCQkvLyBDbG9zZSBpdCBvdXQsIHdlIGFyZSBub3cgcmVnaXN0ZXJlZAotCQkJCQlXYWl0Rm9yUmVnaXN0cmF0aW9uVGhyZWFkIHdUaHJlYWQgPSB3YWl0UmVnaXN0cmF0aW9uVGhyZWFkOwotCQkJCQl3YWl0UmVnaXN0cmF0aW9uVGhyZWFkID0gbnVsbDsKLQkJCQkJd1RocmVhZC5ub3RpZnlBbGwoKTsKLQkJCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgZnJlZSBjb25uZWN0aW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gVGhyb3duIGlmIGEgY29ubmVjdGlvbiBjYW5ub3QgYmUgY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSVJFTUNvbm5lY3Rpb24gZ2V0RnJlZUNvbm5lY3Rpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJVGhyZWFkIHRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JCWlmICh0aHJlYWQgaW5zdGFuY2VvZiBSRU1DYWxsYmFja1RocmVhZCkgewotCQkJLy8gVGhlIGN1cnJlbnQgdGhyZWFkIGlzIGEgY2FsbCBiYWNrIHRocmVhZCwgc28ganVzdCByZXVzZSB0aGUgY29ubmVjdGlvbi4KLQkJCS8vIEJ1dCB0aGlzIHRocmVhZCBjb3VsZCBhY3R1YWxseSBiZSB0cnlpbmcgdG8gYWNjZXNzIGFub3RoZXIgcmVnaXN0cnkuCi0JCQkvLyBTbyBpZiB0aGlzIHRocmVhZCBpcyBmb3IgdGhpcyByZWdpc3RyeSwgdXNlIGl0LCBpZiBub3QgZm9yIHRoaXMgcmVnaXN0cnksIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uLgotCQkJLy8gQnV0IGlmIGZvciB0aGlzIHJlZ2lzdHJ5IEFORCBpcyBhbHJlYWR5IGluIGEgdHJhbnNhY3Rpb24sIHdlIG5lZWQgYSBmcmVzaCBjb25uZWN0aW9uLgotCQkJUkVNQ2FsbGJhY2tUaHJlYWQgY2FsbGJhY2tUaHJlYWQgPSAoUkVNQ2FsbGJhY2tUaHJlYWQpIHRocmVhZDsKLQkJCWlmIChjYWxsYmFja1RocmVhZC5yZWdpc3RyeSA9PSB0aGlzICYmICFjYWxsYmFja1RocmVhZC5pblRyYW5zYWN0aW9uKCkpIHsKLQkJCQkvLyBUaGlzIHdheSBhbnkgY2FsbHMgb3V0IHRvIHRoZSByZW1vdGUgdm0gd2lsbCBiZSBvbiBzYW1lIHRocmVhZCBhcyBjYWxsYmFjayBjYWxsZXIKLQkJCQkvLyBvbiByZW1vdGUgdm0gYmVjYXVzZSB0aGF0IHRocmVhZCBpcyB3YWl0aW5nIG9uIHRoaXMgY29ubmVjdGlvbiBmb3IgY29tbWFuZHMuCi0JCQkJSVJFTUNvbm5lY3Rpb24gYyA9IChjYWxsYmFja1RocmVhZCkuZ2V0Q29ubmVjdGlvbigpOwotCQkJCWlmIChjLmlzQ29ubmVjdGVkKCkpCi0JCQkJCXJldHVybiBjOwotCQkJCWVsc2UKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0NhbGxiYWNrQ29ubmVjdGlvbk5vdFdvcmtpbmdfRVhDXyk7IAotCQkJfQotCQl9Ci0JCXN5bmNocm9uaXplZChmQ29ubmVjdGlvblBvb2wpIHsKLQkJCWlmICghZkNvbm5lY3Rpb25Qb29sLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gKElSRU1Db25uZWN0aW9uKSBmQ29ubmVjdGlvblBvb2wucG9wKCk7Ci0JCQkvLyBlbHNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgb25lLgkJCQotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb24oKTsKLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIE1ha2UgYSBuZXcgY29ubmVjdGlvbi4KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSBUaHJvd24gaWYgY29ubmVjdGlvbiBjYW5ub3QgYmUgY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSVJFTUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQkvLyBJZiB3ZSBoYXZlIGEgc2VydmVyIHBvcnQsIHRoZW4gdGhlIHNlcnZlciBpcyBwcm9iYWJseSBvcGVuLiBJZiB3ZSBkb24ndCB0aGVuIHRoZXJlIGlzIG5vIHNlcnZlci4KLQkJaWYgKGZTZXJ2ZXJQb3J0ICE9IDApIHsKLQkJCS8vIFdlIGFyZSBwdXR0aW5nIGl0IG9mZiBpbnRvIGEgdGhyZWFkIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHRpbWVvdXQgY2FwYWJpbGl0aWVzIG9uIGdldHRpbmcgYSBzb2NrZXQuCi0JCQkvLyBTbyB3ZSBuZWVkIHRvIGFsbG93IGZvciB0aGF0LgotCQkJZmluYWwgU29ja2V0W10gc2NBcnJheSA9IG5ldyBTb2NrZXRbMV07Ci0JCQlmaW5hbCBib29sZWFuW10gd2FpdGluZyA9IG5ldyBib29sZWFuW10ge3RydWV9OwotCQkJVGhyZWFkIGRvSXQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTb2NrZXQgc2MgPSBuZXcgU29ja2V0KCJsb2NhbGhvc3QiLCBmU2VydmVyUG9ydCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkJCWlmICh3YWl0aW5nWzBdKQotCQkJCQkJCQlzY0FycmF5WzBdID0gc2M7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlzYy5jbG9zZSgpOwkvLyBXZSBhcmUgbm8gbG9uZ2VyIHdhaXRpbmcgb24gdGhpcyB0aHJlYWQgc28gY2xvc2UgdGhlIHNvY2tldCBzaW5jZSBubyBvbmUgd2lsbCB1c2UgaXQuCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlkb0l0LnN0YXJ0KCk7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCWRvSXQuam9pbighZk5vVGltZW91dHMgPyA2MDAwMCA6IDApOwotCQkJCQlzeW5jaHJvbml6ZWQgKGRvSXQpIHsKLQkJCQkJCXdhaXRpbmdbMF0gPSBmYWxzZTsJLy8gVG8gbGV0IGl0IGtub3cgd2UgYXJlIG5vIGxvbmdlciB3YWl0aW5nCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKHNjQXJyYXlbMF0gPT0gbnVsbCkgIHsKLQkJCQkvLyBMb2cgd2hlcmUgd2UgYXJlIGF0IHNvIHdlIGNhbiBrbm93IHdoZXJlIGl0IHdhcyB3ZSBkb3duLgotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ29ubmVjdGlvbkNyZWF0aW9uRmFpbGVkX0lORk9fKSkpOwkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ291bGROb3RDcmVhdGVTb2NrZXRDb25uZWN0aW9uVG9SZW1vdGVWTV9FWENfKTsJLy8gQ291bGRuJ3QgZ2V0IG9uZSwgcHJvYmFibHkgc2VydmVyIGlzIGRvd24uIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJUkVNQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IFJFTUNvbm5lY3Rpb24oc2NBcnJheVswXSwgZk5vVGltZW91dHMpOwotCQkJaWYgKGNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkKLQkJCQlyZXR1cm4gY29ubmVjdGlvbjsKLQkJCQkKLQkJCS8vIEZhaWxlZCwgY2xvc2UgdGhlIHNvY2tldC4gCi0JCQl0cnkgewotCQkJCXNjQXJyYXlbMF0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfSBlbHNlCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiTm8gU2VydmVyIHRvIHJldHJpZXZlIGEgY29ubmVjdGlvbi4iLCBudWxsKSk7CS8vLyROT04tTkxTLTEkCi0JCQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ291bGROb3RDcmVhdGVTb2NrZXRDb25uZWN0aW9uVG9SZW1vdGVWTV9FWENfKTsgCi0JfQotCQkgCi0JLyoqCi0JICogRnJlZSB0aGUgY29ubmVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJldHVybkNvbm5lY3Rpb24oSVJFTUNvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQlpZiAoY29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQlUaHJlYWQgdGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQkJCWlmICghKHRocmVhZCBpbnN0YW5jZW9mIFJFTUNhbGxiYWNrVGhyZWFkKSB8fCAoKFJFTUNhbGxiYWNrVGhyZWFkKSB0aHJlYWQpLmdldENvbm5lY3Rpb24oKSAhPSBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gV2UgYXJlIG5vdCBhIGNhbGxiYWNrIHRocmVhZCwgb3Igd2UgYXJlIGJ1dCB0aGUgY29ubmVjdGlvbiBpcyBub3QgZm9yIHRoZSB0aHJlYWQsIHRoZW4gdGhlIGNvbm5lY3Rpb24KLQkJCQkvLyBjYW4gYmUgcmV0dXJuZWQuCi0JCQkJc3luY2hyb25pemVkIChmQ29ubmVjdGlvblBvb2wpIHsKLQkJCQkJaWYgKGZDb25uZWN0aW9uUG9vbC5zaXplKCkgPCBOVU1CRVJfRlJFRV9DT05ORUNUSU9OUykKLQkJCQkJCWZDb25uZWN0aW9uUG9vbC5wdXNoKGNvbm5lY3Rpb24pOwotCQkJCQllbHNlCi0JCQkJCQljb25uZWN0aW9uLmNsb3NlKCk7CS8vIFdlIGRvbid0IG5lZWQgdG8gbWFpbnRhaW4gbW9yZSB0aGFuIGZpdmUgZnJlZSBjb25uZWN0aW9ucy4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVsZWFzZSB0aGlzIGNvbm5lY3Rpb24uIFRoaXMgbWVhbnMgY2xvc2UgaXQgb3V0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlQ29ubmVjdGlvbihJUkVNQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGludCBjb25uZWN0aW9uQ291bnQoKSB7Ci0JCXN5bmNocm9uaXplZCAoZkNvbm5lY3Rpb25Qb29sKSB7Ci0JCQlyZXR1cm4gZkNvbm5lY3Rpb25Qb29sLnNpemUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUmVnaXN0cnlDb250cm9sbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVJlZ2lzdHJ5Q29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODgwYTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUmVnaXN0cnlDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNUmVnaXN0cnlDb250cm9sbGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgY29udHJvbGxlciBmb3IgYWxsIG9mIHRoZSByZWdpc3RyaWVzLgotICogQGF1dGhvciByaWNoa3VscAotICovCi1wdWJsaWMgY2xhc3MgUkVNUmVnaXN0cnlDb250cm9sbGVyIHsKLQkKLQlwcml2YXRlIE1hcCBmQWN0aXZlUmVnaXN0cmllcyA9IG5ldyBIYXNoTWFwKCk7CS8vIEFjY2VzcyB0byB0aGlzIG11c3QgYmUgc3luYyhSRU1SZWdpc3RyeUNvbnRyb2xsZXIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDTEVBTlVQX0lOVEVSVkFMID0gNjAwMDBsOwkvLyBUaGUgaW50ZXJ2YWwgYmV0d2VlbiBjbGVhbiB1cCBqb2IgZXhlY3V0aW9uLgotCQotCXByb3RlY3RlZCBib29sZWFuIGluU2h1dGRvd247CS8vIEFyZSB3ZSBpbiBzaHV0ZG93biBtb2RlLiBUZXJtaW5hdGUgcmVnaXN0cmllcyBydW5zIGRpZmZlcmVudGx5IGluIHNodXRkb3duIG1vZGUuCi0JCi0JLy8gVGhyZWFkIHRvIGNsZWFuIHVwIEdDJ2QgcHJveGllcy4gUnVucyBhcyBhIGRhZW1vbiBhdCB0aGUgbG93ZXN0IHByaW9yaXR5Ci0JcHJpdmF0ZSBKb2IgcHJvY2Vzc1F1ZXVlSm9iPSBuZXcgSm9iKFByb3h5UmVtb3RlTWVzc2FnZXMuQ2xlYW51cEpvYl90aXRsZSkgeyAKLQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbSkgewotCQkJCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5W10gcmVnaXN0cmllcyA9IG51bGw7Ci0JCQkJc3luY2hyb25pemVkIChSRU1SZWdpc3RyeUNvbnRyb2xsZXIudGhpcykgewotCQkJCQkvLyBUaGlzIGxpc3QgbWF5IGJlIHVwZGF0ZWQgYnkgb3RoZXJzLCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5Ci0JCQkJCS8vIG9yIGVsc2Ugd2UgY291bGQgZ2V0IGEgZmFpbHVyZS4KLQkJCQkJcmVnaXN0cmllcyA9IAotCQkJCQkJKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5W10pIGZBY3RpdmVSZWdpc3RyaWVzLnZhbHVlcygpLnRvQXJyYXkoCi0JCQkJCQkJbmV3IFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5W2ZBY3RpdmVSZWdpc3RyaWVzLnNpemUoKV0pOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lzdHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCSgoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSByZWdpc3RyaWVzW2ldLmdldEJlYW5Qcm94eUZhY3RvcnkoKSkucHJvY2Vzc1F1ZXVlKCk7CQkJCQkKLQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBXaGVuIGRlYnVnZ2luZywgZ2V0QmVhblByb3h5RmFjdG9yeSBjYW4gdGhyb3cgZXhjZXB0aW9uIGJlY2F1c2UgaXQgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQKLQkJCQkJCS8vIHlldCB3aGVuIHRoZSB0aHJlYWQgd2FrZXMgdXAsIHRob3VnaCB0aGUgcmVnaXN0cnkgaGFzIGJlZW4gcmVnaXN0ZXJlZC4gSXQgaGFzIHRvIGRvIHdpdGggaXQgCi0JCQkJCQkvLyBjYW4gdGFrZSBzaWduaWZpY2FudCB0aW1lIGZvciB0aGUgdXNlciB0byBzdGFydCB1cCB0aGUgZGVidWdnZXIsIGFuZCBkdXJpbmcgdGhhdCB0aW1lIHRoaXMKLQkJCQkJCS8vIHRocmVhZCBjb3VsZCBraWNrIGluLgotCQkJCQl9Ci0JCQkJfQotCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQlpZiAoIW0uaXNDYW5jZWxlZCgpKQotCQkJCQl0aGlzLnNjaGVkdWxlKENMRUFOVVBfSU5URVJWQUwpOwkvLyBTY2hlZHVsZSB0byBzdGFydCBhZ2FpbiBpbiBvbmUgbWludXRlLgotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCX07IC8vJE5PTi1OTFMtMSQJCi0JCi0JcHVibGljIFJFTVJlZ2lzdHJ5Q29udHJvbGxlcigpIHsKLQotCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5hZGRQcm94eVNodXRkb3duTGlzdGVuZXIobmV3IFByb3h5UGx1Z2luLklQcm94eVBsdWdpblNodXRkb3duTGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luLklQcm94eVBsdWdpblNodXRkb3duTGlzdGVuZXIjc2h1dGRvd24oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJCQlSRU1SZWdpc3RyeUNvbnRyb2xsZXIudGhpcy5zaHV0ZG93bigpOwotCQkJfQotCQl9KTsKLQotCQltYXN0ZXJUaHJlYWQgPSBuZXcgUkVNTWFzdGVyU2VydmVyVGhyZWFkKHRoaXMpOwotCQltYXN0ZXJUaHJlYWQuc3RhcnQoKTsKLQotCQlwcm9jZXNzUXVldWVKb2Iuc2V0U3lzdGVtKHRydWUpOwkvLyBTbyB0aGF0IGl0IHdvbid0IHNob3cgcHJvY2Vzc2luZyBpbiBwcm9jZXNzIHZpZXcuIE5vdCBvZiBpbnRlcmVzdCB0byBnZW5lcmFsIHVzZXJzLgotCQlwcm9jZXNzUXVldWVKb2Iuc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKLQkJcHJvY2Vzc1F1ZXVlSm9iLnNjaGVkdWxlKENMRUFOVVBfSU5URVJWQUwpOwotCi0JfQotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHdlIGFyZSBzaHV0dGluZyBkb3duIG9yIG5vdC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5TaHV0RG93bigpIHsKLQkJcmV0dXJuIGluU2h1dGRvd247Ci0JfQotCQotCS8qCi0JICogQWRkIHJlZ2lzdHJ5IHRvIGxpc3Qgb2YgYWN0aXZlLiBSZXR1cm4gYSB1bmlxdWUgbnVtYmVyIHRvIGJlIHRoZSBrZXkuCi0JICogUGFja2FnZS1wcm90ZWN0ZWQgc28gdGhhdCBvbmx5IGxvY2FscyBjYW4gYWNjZXNzIGl0LgotCSAqLwotCXN5bmNocm9uaXplZCBJbnRlZ2VyIHJlZ2lzdGVyUmVnaXN0cnkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJCQotCQlJbnRlZ2VyIGhhc2hjb2RlID0gbmV3IEludGVnZXIocmVnaXN0cnkuaGFzaENvZGUoKSk7CQkKLQkJd2hpbGUgKHRydWUpIHsKLQkJCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGV4aXN0aW5nID0gKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSBmQWN0aXZlUmVnaXN0cmllcy5nZXQoaGFzaGNvZGUpOwotCQkJaWYgKGV4aXN0aW5nID09IG51bGwpCi0JCQkJYnJlYWs7CS8vIE5vdCB5ZXQgcmVnaXN0ZXJlZCwgdXNlIHVzZSB0aGUgaGFzaGNvZGUKLQkJCWVsc2UgaWYgKGV4aXN0aW5nICE9IHJlZ2lzdHJ5KQotCQkJCWhhc2hjb2RlID0gbmV3IEludGVnZXIoaGFzaGNvZGUuaW50VmFsdWUoKSsxKTsJCQkJCQkKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaGFzaGNvZGU7CS8vIFNhbWUgZ3V5LCB1c2UgdGhlIGhhc2hjb2RlLgotCQl9Ci0JCQotCQlmQWN0aXZlUmVnaXN0cmllcy5wdXQoaGFzaGNvZGUsIHJlZ2lzdHJ5KTsKLQkJcmV0dXJuIGhhc2hjb2RlOwotCX0KLQkKLQkvKgotCSAqIGRlcmVnaXN0ZXIgdGhlIHJlZ2lzdHJ5LgotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIGRlcmVnaXN0ZXJSZWdpc3RyeShJbnRlZ2VyIGtleSkgewotCQlmQWN0aXZlUmVnaXN0cmllcy5yZW1vdmUoa2V5KTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgZ2l2ZW4ga2V5Ci0JICovCi0Jc3luY2hyb25pemVkIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KEludGVnZXIga2V5KSB7Ci0JCXJldHVybiAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGZBY3RpdmVSZWdpc3RyaWVzLmdldChrZXkpOwotCX0KLQkKLQkvKioKLQkgKiBNYXN0ZXIgc2VydmVyIHRocmVhZC4gSGFuZGxlcyBrZWVwLWFsaXZlIHJlcXVlc3RzIGFuZCByZWdpc3RlciByZW1vdGUgc2VydmVyIHRocmVhZHMuCi0JICogSXQgd2lsbCBiZSBjcmVhdGVkIHdoZW4gbmVlZGVkLgotCSAqLwotCXByb3RlY3RlZCBSRU1NYXN0ZXJTZXJ2ZXJUaHJlYWQgbWFzdGVyVGhyZWFkOwotCi0JLyoKLQkgKiBTaHV0cyBkb3duIHRoaXMgcGx1Zy1pbiBhbmQgZGlzY2FyZHMgYWxsIHBsdWctaW4gc3RhdGUuCi0JICoKLQkgKiBJbiB0aGlzIGNhc2UsIHRlcm1pbmF0ZSBhbGwgb2YgdGhlIGFjdGl2ZSByZWdpc3RyaWVzIHNvIHRoYXQgdGhleSBjYW4gYmUgc2h1dGRvd24uCi0JICogRG9uJ3Qgd2FudCB0aGVtIGhhbmdpbmcgYXJvdW5kIGFmdGVyIHRlcm1pbmF0aW9uIG9mIHRoZSBkZXNrdG9wLgotCSAqLwotCXZvaWQgc2h1dGRvd24oKSB7Ci0JCQotCQlzeW5jaHJvbml6ZWQocHJvY2Vzc1F1ZXVlSm9iKSB7Ci0JCQlwcm9jZXNzUXVldWVKb2IuY2FuY2VsKCk7Ci0JCX0KLQkJCQotCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeVtdIHJlZ2lzdHJpZXMgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIFRoaXMgbGlzdCB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIHRlcm1pbmF0ZVJlZ2lzdHJ5LCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5Ci0JCQkvLyBvciBlbHNlIHdlIGdldCBhIGZhaWx1cmUuCi0JCQlyZWdpc3RyaWVzID0gCi0JCQkJKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5W10pIGZBY3RpdmVSZWdpc3RyaWVzLnZhbHVlcygpLnRvQXJyYXkoCi0JCQkJCW5ldyBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeVtmQWN0aXZlUmVnaXN0cmllcy5zaXplKCldKTsKLQkJfQotCQkKLQkJaW5TaHV0ZG93biA9IHRydWU7CS8vIFdlIGFyZSBub3cgaW4gc2h1dGRvd24gbW9kZS4KLQkJLy8gSW4gc2h1dGRvd24gbW9kZSB0aGUgcmVnaXN0cmllcyB3aWxsIG5vdCBjcmVhdGUgdGhlIGpvYiB0aGF0IHdhaXRzIGZvciB0aGUgcHJvY2VzcwotCQkvLyB0byB0ZXJtaW5hdGUsIGFuZCBpZiBpdCBkb2Vzbid0IGluIDEuNSBzZWNzIGl0IGRvZXMgYSBmb3JjZS4KLQkJLy8gSW5zdGVhZCB3aGF0IHdlIHdpbGwgZG8gaXMgc2h1dGRvd24gYWxsIG9mIHRoZSByZWdpc3RyaWVzLiBJZiB0aGV5IGRvbid0Ci0JCS8vIHNodXRkb3duIG9uIHRoZWlyIG93biB0aGVuIHRoZXkgc3RheSBvdXQgdGhlcmUuIEJ1dCB0aGV5IGRvIGhhdmUgYW4KLQkJLy8gaW50ZXJuYWwgdGltZXIgdGhhdCBjaGVja3MgZXZlcnkgZml2ZSBtaW51dGVzIHRvIHNlZSBpZiB0aGUgaG9zdCBpcyAKLQkJLy8gc3RpbGwgdGhlcmUsIGFuZCBpZiBpdCBpc24ndCB0aGV5IHdpbGwgc2h1dCB0aGVtc2VsdmVzIGRvd24uIFRoZXkKLQkJLy8gd291bGQgaGF2ZSB0byBiZSByZWFsbHkgaG9zZWQgaWYgdGhlIHN1aWNpZGUgdGltZXIgd2Fzbid0IHdvcmtpbmcuCi0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lzdHJpZXMubGVuZ3RoOyBpKyspCi0JCQlyZWdpc3RyaWVzW2ldLnRlcm1pbmF0ZVJlZ2lzdHJ5KCk7Ci0JCQkKLQkJaWYgKG1hc3RlclRocmVhZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1hc3RlclRocmVhZC5yZXF1ZXN0U2h1dGRvd24oKTsKLQkJCQltYXN0ZXJUaHJlYWQuam9pbigyMDAwMCk7CS8vIFdhaXQgMjAgc2Vjb25kcyBmb3IgZXZlcnl0aGluZyB0byBnbyBkb3duLgotCQkJCW1hc3RlclRocmVhZCA9IG51bGw7CQkJCQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJcHJvY2Vzc1F1ZXVlSm9iLmpvaW4oKTsKLQkJfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmNhbmNlbEFsbFRlcm1pbmF0ZUpvYnMoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXN0ZXIgc29ja2V0IHBvcnQgbnVtYmVyLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWFzdGVyU29ja2V0UG9ydCgpIHsKLQkJcmV0dXJuIG1hc3RlclRocmVhZCAhPSBudWxsID8gbWFzdGVyVGhyZWFkLmdldE1hc3RlclNvY2tldCgpLmdldExvY2FsUG9ydCgpIDogLTE7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TaG9ydENsYXNzQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0Q2xhc3NCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5NWZlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0Q2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVNob3J0Q2xhc3NCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBQcm94eSBmb3IgU2hvcnQuY2xhc3MuCi0gKi8KLWNsYXNzIFJFTVNob3J0Q2xhc3NCZWFuUHJveHkgZXh0ZW5kcyBSRU1OdW1iZXJCZWFuUHJveHkgewotCi1SRU1TaG9ydENsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgU2hvcnQgYVNob3J0KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhU2hvcnQpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5zaG9ydENsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldCgoU2hvcnQpIG51bWJlclZhbHVlKCkpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0YTdmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1TaG9ydENsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBTaG9ydC5jbGFzcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdGhyZWVQcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuU0hPUlRfQ0xBU1MpLCBTaG9ydC5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1TaG9ydENsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IFNob3J0KChzaG9ydCkwKSk7CQotCW9uZVByb3h5ID0gbmV3IFJFTVNob3J0Q2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgU2hvcnQoKHNob3J0KTEpKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1TaG9ydENsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IFNob3J0KChzaG9ydCkyKSk7Ci0JdGhyZWVQcm94eSA9IG5ldyBSRU1TaG9ydENsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IFNob3J0KChzaG9ydCkzKSk7CQkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlU2hvcnRCZWFuUHJveHkoU2hvcnQgYVNob3J0KSB7Ci0Jc3dpdGNoKGFTaG9ydC5zaG9ydFZhbHVlKCkpIHsKLQkJY2FzZSAwOiByZXR1cm4gemVyb1Byb3h5OwotCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgUkVNU2hvcnRDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFTaG9ydCk7Ci0JfQotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhIFNob3J0IHByb3h5LCBob3dldmVyLCB0aGUgTnVtYmVyIG11c3QgYmUgYSBTaG9ydC4KLSAqLwotcHJvdGVjdGVkIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlTnVtYmVyQmVhblByb3h5KE51bWJlciBhTnVtYmVyKSB7Ci0JcmV0dXJuIGNyZWF0ZVNob3J0QmVhblByb3h5KChTaG9ydCkgYU51bWJlcik7Ci19CQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlU2hvcnRCZWFuUHJveHkobmV3IFNob3J0KHZhbHVlLmFTaG9ydCkpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRUeXBlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0VHlwZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2MwOWFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRUeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNU2hvcnRUeXBlQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSU51bWJlckJlYW5Qcm94eSBmb3IgdGhlIHByaW1pdGl2ZSAic2hvcnQiLgotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotY2xhc3MgUkVNU2hvcnRUeXBlQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJTnVtYmVyQmVhblByb3h5IHsKLQlwcml2YXRlIGZpbmFsIHNob3J0IGZTaG9ydDsKLQotLyoqCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTVNob3J0VHlwZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIHNob3J0IGFTaG9ydCkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZlNob3J0ID0gYVNob3J0OwotfQotLyoqCi0gKiBlcXVhbHM6IEVxdWFsIGlmOgotICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTVNob3J0VHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZTaG9ydCA9PSAoKFJFTVNob3J0VHlwZUJlYW5Qcm94eSkgYW5PYmplY3QpLnNob3J0VmFsdWUoKTsKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBTaG9ydCkKLQkJcmV0dXJuIGZTaG9ydCA9PSAoKFNob3J0KSBhbk9iamVjdCkuc2hvcnRWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotICovCi1wdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JaWYgKHRoaXMgPT0gYUJlYW5Qcm94eSkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBSRU1TaG9ydFR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmU2hvcnQgPT0gKChSRU1TaG9ydFR5cGVCZWFuUHJveHkpIGFCZWFuUHJveHkpLnNob3J0VmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIChieXRlKSBmU2hvcnQ7Ci19Ci0vKioKLSAqIGRvdWJsZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCXJldHVybiBmU2hvcnQ7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiBmU2hvcnQ7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgaW50IHZhbHVlCi0gKi8KLXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JcmV0dXJuIGZTaG9ydDsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIGZTaG9ydDsKLX0KLS8qKgotICogbnVtYmVyVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JcmV0dXJuIG5ldyBTaG9ydChmU2hvcnQpOwotfQotLyoqCi0gKiBzaG9ydFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQlyZXR1cm4gZlNob3J0OwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBTdHJpbmcudmFsdWVPZihmU2hvcnQpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5zaG9ydFR5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZTaG9ydCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TaG9ydFR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliYTgyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1TaG9ydFR5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSUJlYW5UeXBlUHJveHkgZm9yIFNob3J0LlRZUEUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1TaG9ydFR5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSBvbmVQcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdHdvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1TaG9ydFR5cGVCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuU0hPUlRfVFlQRSksIFNob3J0LlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNU2hvcnRUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgKHNob3J0KSAwKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNU2hvcnRUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgKHNob3J0KSAxKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1TaG9ydFR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoc2hvcnQpIDIpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNU2hvcnRUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgKHNob3J0KSAzKTsJCQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVTaG9ydEJlYW5Qcm94eShzaG9ydCBhU2hvcnQpIHsKLQlzd2l0Y2goYVNob3J0KSB7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJY2FzZSAxOiByZXR1cm4gb25lUHJveHkgOwotCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQlkZWZhdWx0OiByZXR1cm4gbmV3IFJFTVNob3J0VHlwZUJlYW5Qcm94eShmUmVnaXN0cnksIGFTaG9ydCk7Ci0JfQotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gc2hvcnQgaXMgYSBwcmltaXRpdmUsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVyb1Byb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQkKLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVTaG9ydEJlYW5Qcm94eSh2YWx1ZS5hU2hvcnQpOwotfQotCi0vKioKLSAqIFNob3J0IGN1dCBmb3IgbmV3SW5zdGFuY2Ugd2hlcmUgdGhlIHN0cmluZyBmb2xsb3dzIHRoZQotICogc3BlY2lmaWMgcGF0dGVybiB3ZSBleHBlY3QuIFRoYXQgd2F5IGl0IHdvbid0IGJlIG5lY2Vzc2FyeSB0byBzaGlwIG92ZXIgdG8gdGhlIHZtIAotICogdG8gcHJvY2VzcyBpdC4KLSAqCi0gKiBUaGUgcGF0dGVybiBpdCBjYW4gYWNjZXB0IGlzOgotICogCTEpIChzaG9ydCkgdmFsaWROdW1iZXIgLSBudW1iZXIgY2FuIGJlIGFueSBudW1iZXIgYmVjYXVzZSAoYnl0ZSkgZXhwbGljaXRseSBjYXN0cyBpdCBkb3duLgotICoJMikgdmFsaWROdW1iZXIKLSAqIEl0IHdpbGwgdXNlIHRoZSBkZWNvZGUgZnVuY3Rpb24gb2Ygc2hvcnQgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCBudW1iZXIuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCVN0cmluZyB0cmltID0gaW5pdGlhbGl6YXRpb25TdHJpbmcudHJpbSgpOwotCWlmICh0cmltLmxlbmd0aCgpID09IDApCi0JCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CQotCXNob3J0IGFTaG9ydDsKLQlpZiAodHJpbS5zdGFydHNXaXRoKCIoc2hvcnQpIikpIHsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXIgdiA9IHBhcnNlU3RyaW5nKHRyaW0uc3Vic3RyaW5nKCIoc2hvcnQpIi5sZW5ndGgoKSkudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodiAhPSBudWxsKQotCQkJYVNob3J0ID0gdi5zaG9ydFZhbHVlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQl9IGVsc2UgewotCQl0cnkgewotCQkJYVNob3J0ID0gU2hvcnQuZGVjb2RlKHRyaW0pLnNob3J0VmFsdWUoKTsJLy8gU2VlIGlmIHZhbGlkIHNob3J0IGZvcm1hdC4KLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQkJfQotCX0KLQotCXJldHVybiBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGFTaG9ydCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWI5OTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotLyoqCi0gKiBSRU0gU3RhbmRhcmQgUHJveHkgY29uc3RhbnRzLgotICoKLSAqIFVzZSB0aGUgc3RhdGljIGFjY2Vzc29yIG1ldGhvZCAoZ2V0Q29uc3RhbnRzKCkpIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgCi0gKiBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSByZWdpc3RyeS4gVGhpcyBpcyBkb25lIHNvIHRoYXQgdW50aWwgdGhlCi0gKiB0aGUgY29uc3RhbnRzIGFyZSBuZWVkZWQsIHRoZXkgYXJlbid0IHJlZ2lzdGVyZWQuCi0gKgotICogVGhlcmUgYXJlIHNvbWUgc3RhbmRhcmQgdXRpbGl0eSBmdW5jdGlvbnMgdG9vLgotICoKLSAqIFRoaXMgaXMgZmluYWwgYmVjYXVzZSB0aGlzIGNhbid0IGJlIGV4dGVuZGVkLiBUaGlzIHNwZWNpZmljIG9uZQotICogd2lsbCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoaXMga2V5LiBBbnkgZXh0ZW5zaW9ucwotICogbXVzdCBiZSBkb25lIGluIHRoZWlyIG93biBjb25zdGFudHMgYW5kIHJlZ2lzdHJ5IGtleS4KLSAqCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC83LzAwIDQ6NDc6NDggUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHSVNUUllfS0VZID0gbmV3IE9iamVjdCgpOwotCQkKLQlwcml2YXRlIGZpbmFsIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZSZWdpc3RyeTsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NOZXdJbnN0YW5jZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXRGaWVsZDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXREZWNsYXJlZEZpZWxkOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldERlY2xhcmVkRmllbGRzOwkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXRGaWVsZHM7CQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldENvbnN0cnVjdG9yOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldENvbnN0cnVjdG9yczsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3JzOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldE1ldGhvZHM7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0RGVjbGFyZWRNZXRob2RzOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldERlY2xhcmVkTWV0aG9kOwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZNZXRob2RIZWxwZXJGaW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZNZXRob2RIZWxwZXJGaW5kQ29tcGF0aWJsZU1ldGhvZDsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NJc0Fzc2lnbmFibGVGcm9tOwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZPYmplY3RUb1N0cmluZzsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmT2JqZWN0RXF1YWxzOwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZUaHJvd2FibGVNZXNzYWdlOwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZNZXRob2REZWNsYXJpbmdDbGFzc01lc3NhZ2U7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZk1ldGhvZE1ldGhvZE5hbWVNZXNzYWdlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZNZXRob2RQYXJhbWV0ZXJUeXBlc01lc3NhZ2U7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZk1ldGhvZFJldHVyblR5cGVNZXNzYWdlOwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBY2Nlc3NpYmxlSXNBY2Nlc3NpYmxlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBY2Nlc3NpYmxlU2V0QWNjZXNzaWJsZTsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0VHlwZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXRCeXRlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldEJvb2xlYW47Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0Q2hhcjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXREb3VibGU7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0RmxvYXQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0SW50OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldFNob3J0OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldExvbmc7CQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZFNldDsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ29uc3RydWN0b3JOZXdJbnN0YW5jZTsJCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNvbnN0cnVjdG9yUGFyYW1ldGVyVHlwZXNNZXNzYWdlOwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheU5ld0luc3RhbmNlT25lRGltZW5zaW9uOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheU5ld0luc3RhbmNlTXVsdGlEaW1lbnNpb25zOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldExlbmd0aDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0Qnl0ZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXRCb29sZWFuOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldENoYXI7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0RG91YmxlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldEZsb2F0OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldEludDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXRTaG9ydDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXRMb25nOwkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlTZXQ7CQotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlckdldDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJHZXRCeXRlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlckdldEJvb2xlYW47Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyR2V0Q2hhcjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJHZXREb3VibGU7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyR2V0RmxvYXQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyR2V0SW50OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlckdldFNob3J0OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlckdldExvbmc7CQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlclNldDsJCQkKLQkKLS8qKgotICogR2V0IHRoZSBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgZ2V0Q29uc3RhbnRzKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgY29uc3RhbnRzID0gKFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzKSByZWdpc3RyeS5nZXRDb25zdGFudHMoUkVHSVNUUllfS0VZKTsKLQlpZiAoY29uc3RhbnRzID09IG51bGwpCi0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RhbnRzKFJFR0lTVFJZX0tFWSwgY29uc3RhbnRzID0gbmV3IFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzKHJlZ2lzdHJ5KSk7CQotCXJldHVybiBjb25zdGFudHM7Ci19Ci0KLQotcHJpdmF0ZSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyhQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCXN1cGVyKCk7Ci0JZlJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q2xhc3NOZXdJbnN0YW5jZSgpIHsKLQkvLyBXZSBhY3R1YWxseSBuZWVkIGEgc3BlY2lhbCBuZXcgaW5zdGFuY2UgYmVjYXVzZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYWNjZXNzIG91dHNpZGUgb2Ygc2VjdXJpdHkuIEZvciBvdXIgcHVycG9zZXMgc2VjdXJpdHkgZG9lc24ndCBtYXR0ZXIgZm9yIGNvbnN0cnVjdGlvbi4KLQlpZiAoZkNsYXNzTmV3SW5zdGFuY2UgPT0gbnVsbCkKLQkJZkNsYXNzTmV3SW5zdGFuY2UgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQ2xhc3NIZWxwZXIiLCAibmV3SW5zdGFuY2UiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuQ2xhc3MifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZDbGFzc05ld0luc3RhbmNlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzR2V0RmllbGQoKSB7Ci0JaWYgKGZDbGFzc0dldEZpZWxkID09IG51bGwpCi0JCWZDbGFzc0dldEZpZWxkID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0RmllbGQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuU3RyaW5nIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQ2xhc3NHZXRGaWVsZDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0NvbnN0cnVjdG9yKCkgewotCWlmIChmQ2xhc3NHZXRDb25zdHJ1Y3RvciA9PSBudWxsKQotCQlmQ2xhc3NHZXRDb25zdHJ1Y3RvciA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldENvbnN0cnVjdG9yIiwgbmV3IFN0cmluZ1tdIHsiW0xqYXZhLmxhbmcuQ2xhc3M7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQ2xhc3NHZXRDb25zdHJ1Y3RvcjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0NvbnN0cnVjdG9ycygpIHsKLQlpZiAoZkNsYXNzR2V0Q29uc3RydWN0b3JzID09IG51bGwpCi0JCWZDbGFzc0dldENvbnN0cnVjdG9ycyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldENvbnN0cnVjdG9ycyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkNsYXNzR2V0Q29uc3RydWN0b3JzOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkQ2xhc3NDb25zdHJ1Y3RvcigpIHsKLQlpZiAoZkNsYXNzR2V0RGVjbGFyZWRDb25zdHJ1Y3RvciA9PSBudWxsKQotCQlmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvciIsIG5ldyBTdHJpbmdbXSB7IltMamF2YS5sYW5nLkNsYXNzOyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkNsYXNzR2V0RGVjbGFyZWRDb25zdHJ1Y3RvcjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZENsYXNzQ29uc3RydWN0b3JzKCkgewotCWlmIChmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9ycyA9PSBudWxsKQotCQlmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9ycyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldERlY2xhcmVkQ29uc3RydWN0b3JzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yczsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0lzQXNzaWduYWJsZUZyb20oKSB7Ci0JaWYgKGZDbGFzc0lzQXNzaWduYWJsZUZyb20gPT0gbnVsbCkKLQkJZkNsYXNzSXNBc3NpZ25hYmxlRnJvbSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImlzQXNzaWduYWJsZUZyb20iLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuQ2xhc3MifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZDbGFzc0lzQXNzaWduYWJsZUZyb207Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0T2JqZWN0VG9TdHJpbmcoKSB7Ci0JaWYgKGZPYmplY3RUb1N0cmluZyA9PSBudWxsKQotCQlmT2JqZWN0VG9TdHJpbmcgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5PYmplY3QiLCAidG9TdHJpbmciLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZPYmplY3RUb1N0cmluZzsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRPYmplY3RFcXVhbHMoKSB7Ci0JaWYgKGZPYmplY3RFcXVhbHMgPT0gbnVsbCkKLQkJZk9iamVjdEVxdWFscyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLk9iamVjdCIsICJlcXVhbHMiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmT2JqZWN0RXF1YWxzOwotfQotcHVibGljIElNZXRob2RQcm94eSBnZXRUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlKCkgewotCWlmIChmVGhyb3dhYmxlTG9jYWxpemVkTWVzc2FnZSA9PSBudWxsKQotCQlmVGhyb3dhYmxlTG9jYWxpemVkTWVzc2FnZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLlRocm93YWJsZSIsICJnZXRMb2NhbGl6ZWRNZXNzYWdlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmVGhyb3dhYmxlTG9jYWxpemVkTWVzc2FnZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRUaHJvd2FibGVNZXNzYWdlKCkgewotCWlmIChmVGhyb3dhYmxlTWVzc2FnZSA9PSBudWxsKQotCQlmVGhyb3dhYmxlTWVzc2FnZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLlRocm93YWJsZSIsICJnZXRNZXNzYWdlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmVGhyb3dhYmxlTWVzc2FnZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2REZWNsYXJpbmdDbGFzc01lc3NhZ2UoKSB7Ci0JaWYgKGZNZXRob2REZWNsYXJpbmdDbGFzc01lc3NhZ2UgPT0gbnVsbCkKLQkJZk1ldGhvZERlY2xhcmluZ0NsYXNzTWVzc2FnZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIiwgImdldERlY2xhcmluZ0NsYXNzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTWV0aG9kRGVjbGFyaW5nQ2xhc3NNZXNzYWdlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZE1ldGhvZE5hbWVNZXNzYWdlKCkgewotCWlmIChmTWV0aG9kTWV0aG9kTmFtZU1lc3NhZ2UgPT0gbnVsbCkKLQkJZk1ldGhvZE1ldGhvZE5hbWVNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiLCAiZ2V0TmFtZSIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZk1ldGhvZE1ldGhvZE5hbWVNZXNzYWdlOwotfQkKLQotcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQYXJhbWV0ZXJUeXBlc01lc3NhZ2UoKSB7Ci0JaWYgKGZNZXRob2RQYXJhbWV0ZXJUeXBlc01lc3NhZ2UgPT0gbnVsbCkKLQkJZk1ldGhvZFBhcmFtZXRlclR5cGVzTWVzc2FnZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIiwgImdldFBhcmFtZXRlclR5cGVzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTWV0aG9kUGFyYW1ldGVyVHlwZXNNZXNzYWdlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFJldHVyblR5cGVNZXNzYWdlKCkgewotCWlmIChmTWV0aG9kUmV0dXJuVHlwZU1lc3NhZ2UgPT0gbnVsbCkKLQkJZk1ldGhvZFJldHVyblR5cGVNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiLCAiZ2V0UmV0dXJuVHlwZSIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZk1ldGhvZFJldHVyblR5cGVNZXNzYWdlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFjY2Vzc2libGVJc0FjY2Vzc2libGUoKSB7Ci0JaWYgKGZBY2Nlc3NpYmxlSXNBY2Nlc3NpYmxlID09IG51bGwpCi0JCWZBY2Nlc3NpYmxlSXNBY2Nlc3NpYmxlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0IiwgImlzQWNjZXNzaWJsZSIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkFjY2Vzc2libGVJc0FjY2Vzc2libGU7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QWNjZXNzaWJsZVNldEFjY2Vzc2libGUoKSB7Ci0JaWYgKGZBY2Nlc3NpYmxlU2V0QWNjZXNzaWJsZSA9PSBudWxsKQotCQlmQWNjZXNzaWJsZVNldEFjY2Vzc2libGUgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QiLCAic2V0QWNjZXNzaWJsZSIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZBY2Nlc3NpYmxlU2V0QWNjZXNzaWJsZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldFR5cGUoKSB7Ci0JaWYgKGZGaWVsZEdldFR5cGUgPT0gbnVsbCkKLQkJZkZpZWxkR2V0VHlwZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0VHlwZSIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkZpZWxkR2V0VHlwZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldCgpIHsKLQlpZiAoZkZpZWxkR2V0ID09IG51bGwpCi0JCWZGaWVsZEdldCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0Qnl0ZSgpIHsKLQlpZiAoZkZpZWxkR2V0Qnl0ZSA9PSBudWxsKQotCQlmRmllbGRHZXRCeXRlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXRCeXRlIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0Qnl0ZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldEJvb2xlYW4oKSB7Ci0JaWYgKGZGaWVsZEdldEJvb2xlYW4gPT0gbnVsbCkKLQkJZkZpZWxkR2V0Qm9vbGVhbiA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0Qm9vbGVhbiIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZGaWVsZEdldEJvb2xlYW47Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmllbGRHZXRDaGFyKCkgewotCWlmIChmRmllbGRHZXRDaGFyID09IG51bGwpCi0JCWZGaWVsZEdldENoYXIgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIiwgImdldENoYXIiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXRDaGFyOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0RG91YmxlKCkgewotCWlmIChmRmllbGRHZXREb3VibGUgPT0gbnVsbCkKLQkJZkZpZWxkR2V0RG91YmxlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXREb3VibGUiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXREb3VibGU7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmllbGRHZXRGbG9hdCgpIHsKLQlpZiAoZkZpZWxkR2V0RmxvYXQgPT0gbnVsbCkKLQkJZkZpZWxkR2V0RmxvYXQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIiwgImdldEZsb2F0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0RmxvYXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmllbGRHZXRJbnQoKSB7Ci0JaWYgKGZGaWVsZEdldEludCA9PSBudWxsKQotCQlmRmllbGRHZXRJbnQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIiwgImdldEludCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZGaWVsZEdldEludDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldExvbmcoKSB7Ci0JaWYgKGZGaWVsZEdldExvbmcgPT0gbnVsbCkKLQkJZkZpZWxkR2V0TG9uZyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0TG9uZyIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZGaWVsZEdldExvbmc7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmllbGRHZXRTaG9ydCgpIHsKLQlpZiAoZkZpZWxkR2V0U2hvcnQgPT0gbnVsbCkKLQkJZkZpZWxkR2V0U2hvcnQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIiwgImdldFNob3J0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0U2hvcnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmllbGRTZXQoKSB7Ci0JaWYgKGZGaWVsZFNldCA9PSBudWxsKQotCQlmRmllbGRTZXQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIiwgInNldCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmRmllbGRTZXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29uc3RydWN0b3JOZXdJbnN0YW5jZSgpIHsKLQlpZiAoZkNvbnN0cnVjdG9yTmV3SW5zdGFuY2UgPT0gbnVsbCkKLQkJZkNvbnN0cnVjdG9yTmV3SW5zdGFuY2UgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIiwgIm5ld0luc3RhbmNlIiwgbmV3IFN0cmluZ1tdIHsiW0xqYXZhLmxhbmcuT2JqZWN0OyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkNvbnN0cnVjdG9yTmV3SW5zdGFuY2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJUeXBlc01lc3NhZ2UoKSB7Ci0JaWYgKGZDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzTWVzc2FnZSA9PSBudWxsKQotCQlmQ29uc3RydWN0b3JQYXJhbWV0ZXJUeXBlc01lc3NhZ2UgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIiwgImdldFBhcmFtZXRlclR5cGVzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ29uc3RydWN0b3JQYXJhbWV0ZXJUeXBlc01lc3NhZ2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlOZXdJbnN0YW5jZU9uZURpbWVuc2lvbigpIHsKLQlpZiAoZkFycmF5TmV3SW5zdGFuY2VPbmVEaW1lbnNpb24gPT0gbnVsbCkKLQkJZkFycmF5TmV3SW5zdGFuY2VPbmVEaW1lbnNpb24gPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgIm5ld0luc3RhbmNlIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLkNsYXNzIiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlOZXdJbnN0YW5jZU9uZURpbWVuc2lvbjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheU5ld0luc3RhbmNlTXVsdGlEaW1lbnNpb24oKSB7Ci0JaWYgKGZBcnJheU5ld0luc3RhbmNlTXVsdGlEaW1lbnNpb25zID09IG51bGwpCi0JCWZBcnJheU5ld0luc3RhbmNlTXVsdGlEaW1lbnNpb25zID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJuZXdJbnN0YW5jZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5DbGFzcyIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlOZXdJbnN0YW5jZU11bHRpRGltZW5zaW9uczsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUdldExlbmd0aCgpIHsKLQlpZiAoZkFycmF5R2V0TGVuZ3RoID09IG51bGwpCi0JCWZBcnJheUdldExlbmd0aCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAiZ2V0TGVuZ3RoIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkFycmF5R2V0TGVuZ3RoOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0KCkgewotCWlmIChmQXJyYXlHZXQgPT0gbnVsbCkKLQkJZkFycmF5R2V0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlHZXRCeXRlKCkgewotCWlmIChmQXJyYXlHZXRCeXRlID09IG51bGwpCi0JCWZBcnJheUdldEJ5dGUgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgImdldEJ5dGUiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXRCeXRlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0Qm9vbGVhbigpIHsKLQlpZiAoZkFycmF5R2V0Qm9vbGVhbiA9PSBudWxsKQotCQlmQXJyYXlHZXRCb29sZWFuID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRCb29sZWFuIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5R2V0Qm9vbGVhbjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUdldENoYXIoKSB7Ci0JaWYgKGZBcnJheUdldENoYXIgPT0gbnVsbCkKLQkJZkFycmF5R2V0Q2hhciA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAiZ2V0Q2hhciIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldENoYXI7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlHZXREb3VibGUoKSB7Ci0JaWYgKGZBcnJheUdldERvdWJsZSA9PSBudWxsKQotCQlmQXJyYXlHZXREb3VibGUgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgImdldERvdWJsZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldERvdWJsZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUdldEZsb2F0KCkgewotCWlmIChmQXJyYXlHZXRGbG9hdCA9PSBudWxsKQotCQlmQXJyYXlHZXRGbG9hdCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAiZ2V0RmxvYXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXRGbG9hdDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUdldEludCgpIHsKLQlpZiAoZkFycmF5R2V0SW50ID09IG51bGwpCi0JCWZBcnJheUdldEludCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAiZ2V0SW50IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5R2V0SW50OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0TG9uZygpIHsKLQlpZiAoZkFycmF5R2V0TG9uZyA9PSBudWxsKQotCQlmQXJyYXlHZXRMb25nID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRMb25nIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5R2V0TG9uZzsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUdldFNob3J0KCkgewotCWlmIChmQXJyYXlHZXRTaG9ydCA9PSBudWxsKQotCQlmQXJyYXlHZXRTaG9ydCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAiZ2V0U2hvcnQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXRTaG9ydDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheVNldCgpIHsKLQlpZiAoZkFycmF5U2V0ID09IG51bGwpCi0JCWZBcnJheVNldCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAic2V0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQiLCAiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JcmV0dXJuIGZBcnJheVNldDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldCgpIHsKLQlpZiAoZkFycmF5SGVscGVyR2V0ID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgIltJIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUhlbHBlckdldDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldEJ5dGUoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldEJ5dGUgPT0gbnVsbCkKLQkJZkFycmF5SGVscGVyR2V0Qnl0ZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXRCeXRlIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRCeXRlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0Qm9vbGVhbigpIHsKLQlpZiAoZkFycmF5SGVscGVyR2V0Qm9vbGVhbiA9PSBudWxsKQotCQlmQXJyYXlIZWxwZXJHZXRCb29sZWFuID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldEJvb2xlYW4iLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgIltJIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUhlbHBlckdldEJvb2xlYW47Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlIZWxwZXJHZXRDaGFyKCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXRDaGFyID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldENoYXIgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQXJyYXlIZWxwZXIiLCAiZ2V0Q2hhciIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0Q2hhcjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldERvdWJsZSgpIHsKLQlpZiAoZkFycmF5SGVscGVyR2V0RG91YmxlID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldERvdWJsZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXREb3VibGUiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgIltJIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUhlbHBlckdldERvdWJsZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldEZsb2F0KCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXRGbG9hdCA9PSBudWxsKQotCQlmQXJyYXlIZWxwZXJHZXRGbG9hdCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXRGbG9hdCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0RmxvYXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlIZWxwZXJHZXRJbnQoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldEludCA9PSBudWxsKQotCQlmQXJyYXlIZWxwZXJHZXRJbnQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQXJyYXlIZWxwZXIiLCAiZ2V0SW50IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRJbnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlIZWxwZXJHZXRMb25nKCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXRMb25nID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldExvbmcgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQXJyYXlIZWxwZXIiLCAiZ2V0TG9uZyIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0TG9uZzsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldFNob3J0KCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXRTaG9ydCA9PSBudWxsKQotCQlmQXJyYXlIZWxwZXJHZXRTaG9ydCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXRTaG9ydCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0U2hvcnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlIZWxwZXJTZXQoKSB7Ci0JaWYgKGZBcnJheUhlbHBlclNldCA9PSBudWxsKQotCQlmQXJyYXlIZWxwZXJTZXQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQXJyYXlIZWxwZXIiLCAic2V0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSIsICJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQlyZXR1cm4gZkFycmF5SGVscGVyU2V0OwotfQotCi0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q2xhc3NHZXREZWNsYXJlZEZpZWxkKCkgewotCi0JaWYgKGZDbGFzc0dldERlY2xhcmVkRmllbGQgPT0gbnVsbCkKLQkJCWZDbGFzc0dldERlY2xhcmVkRmllbGQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5DbGFzcyIsICJnZXREZWNsYXJlZEZpZWxkIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLlN0cmluZyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkNsYXNzR2V0RGVjbGFyZWRGaWVsZDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0dldERlY2xhcmVkRmllbGRzKCkgewotCi0JaWYgKGZDbGFzc0dldERlY2xhcmVkRmllbGRzID09IG51bGwpCi0JCQlmQ2xhc3NHZXREZWNsYXJlZEZpZWxkcyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldERlY2xhcmVkRmllbGRzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ2xhc3NHZXREZWNsYXJlZEZpZWxkczsKLX0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q2xhc3NHZXRGaWVsZHMoKSB7Ci0KLQlpZiAoZkNsYXNzR2V0RmllbGRzID09IG51bGwpCi0JCQlmQ2xhc3NHZXRGaWVsZHMgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5DbGFzcyIsICJnZXRGaWVsZHMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDbGFzc0dldEZpZWxkczsKLX0KLQotCi0vKioKLSAqIEByZXR1cm4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q2xhc3NNZXRob2RzKCkgewotCWlmIChmQ2xhc3NHZXRNZXRob2RzID09IG51bGwpCi0JCWZDbGFzc0dldE1ldGhvZHMgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5DbGFzcyIsICJnZXRNZXRob2RzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ2xhc3NHZXRNZXRob2RzOwotfQotCi0vKioKLSAqIEByZXR1cm4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q2xhc3NEZWNsYXJlZE1ldGhvZHMoKSB7Ci0JaWYgKGZDbGFzc0dldERlY2xhcmVkTWV0aG9kcyA9PSBudWxsKQotCQlmQ2xhc3NHZXREZWNsYXJlZE1ldGhvZHMgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5DbGFzcyIsICJnZXREZWNsYXJlZE1ldGhvZHMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDbGFzc0dldERlY2xhcmVkTWV0aG9kczsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0RlY2xhcmVkTWV0aG9kKCkgewotCWlmIChmQ2xhc3NHZXREZWNsYXJlZE1ldGhvZCA9PSBudWxsKQotCQlmQ2xhc3NHZXREZWNsYXJlZE1ldGhvZCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldERlY2xhcmVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLlN0cmluZyIsICJbTGphdmEubGFuZy5DbGFzczsifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkNsYXNzR2V0RGVjbGFyZWRNZXRob2Q7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmluZENvbXBhdGlibGVDb25zdHJ1Y3Rvck1ldGhvZCgpIHsKLQlpZiAoZk1ldGhvZEhlbHBlckZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3IgPT0gbnVsbCkKLQkJZk1ldGhvZEhlbHBlckZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3IgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWV0aG9kSGVscGVyIiwgImZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3IiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuQ2xhc3MiLCAiW0xqYXZhLmxhbmcuQ2xhc3M7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZNZXRob2RIZWxwZXJGaW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpbmRDb21wYXRpYmxlTWV0aG9kTWV0aG9kKCkgewotCWlmIChmTWV0aG9kSGVscGVyRmluZENvbXBhdGlibGVNZXRob2QgPT0gbnVsbCkKLQkJZk1ldGhvZEhlbHBlckZpbmRDb21wYXRpYmxlTWV0aG9kID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLk1ldGhvZEhlbHBlciIsICJmaW5kQ29tcGF0aWJsZU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5DbGFzcyIsICJqYXZhLmxhbmcuU3RyaW5nIiwgIltMamF2YS5sYW5nLkNsYXNzOyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JcmV0dXJuIGZNZXRob2RIZWxwZXJGaW5kQ29tcGF0aWJsZU1ldGhvZDsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTJlMzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE2ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRFcnJvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBUaGUgUmVtb3RlIFZNIFN0YW5kYXJkIEJlYW4gUHJveHkgRmFjdG9yeS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDEyOjAxOjQ1IFBNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgewotCXByb3RlY3RlZCBmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmUmVnaXN0cnk7Ci0JcHJvdGVjdGVkIGZpbmFsIFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZkJlYW5UeXBlUHJveHlGYWN0b3J5OwkvLyBDb252ZW5pZW5jZSBmaWVsZC4KLQlwcm90ZWN0ZWQgZmluYWwgSVJFTUJlYW5Qcm94eSB2bVNlcnZlclByb3h5OwotCi0JCi0JLy8gV2UgbmVlZCBhIG1hcCBmb3IgbWFwcGluZyBvYmplY3QgaWQncyB0byB0aGUgcHJveHkuIFRoZSBlbnRyeSB3aWxsIGFjdHVhbGx5IGJlCi0JLy8gYSBSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuV2Vha1Byb3h5UmVmZXJlbmNlLiBUaGlzIGlzIHNvIHRoYXQgdGhlCi0JLy8gcHJveHkgd2lsbCBub3QgYmUgaGVsZCB0aWdodGx5IGJ5IHRoaXMgbWFwIGFuZCBjYW4gYmUgR0MnZCBpZiBub3QgcmVmZXJlbmNlZC4KLQkvLyBQZXJpb2RpY2FsbHksIHRoZSByZWZlcmVuY2UgcXVldWUgd2lsbCBiZSBwcm9jZXNzZWQgdG8gcmVtb3ZlIGFueSBvZiB0aGUKLQkvLyBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIEdDJ2QgYW5kIHRoZSBzZXJ2ZXIgd2lsbCBiZSB0b2xkIHRoYXQgaXQgY2FuIHJlbGVhc2UKLQkvLyB0aGUgSUQgb24gaXRzIHNpZGUuCi0JLy8KLQkvLyBUaGlzIG1hcCB3aWxsIGJlIHVzZWQgYXMgc3luY2hyb25pemUgb2JqZWN0IGFsc28gZm9yIGFjY2VzcyB0byBpdC4KLQkvLwotCS8vIFRoZXJlIHdpbGwgYmUgYSBsb3cgcHJpb3JpdHkgam9iIHRoYXQgd2lsbCBvY2Nhc2lvbmFsbHkgcHJvY2VzcyB0aGUgR0MnZCBvYmplY3RzCi0JLy8gYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIHF1ZXVlIGFuZCB0aGUgcmVtb3RlIHZtLiBJdCB3aWxsIG5vdCByZW1vdmUgZHVyaW5nIGxvY2tlZFRyYW5zYWN0aW9ucy4KLQkvLwotCS8vIE5PVEU6IENlcnRhaW4gcHJveGllcyBuZXZlciBnZXQgYWRkZWQgdG8gdGhlIG1hcC4gVGhleSBhcmUgdGhlCi0JLy8gc3RhbmRhcmQgdHlwZXMvY2xhc3MgKGkuZS4gbnVsbCwgYnl0ZSwgaW50LCBsb25nLCBzaG9ydCwgZG91YmxlLCBmbG9hdCwgYnl0ZSwgc3RyaW5nKS4gVGhlc2UKLQkvLyBhbHdheXMgaGF2ZSB0aGUgdmFsdWUgc2F2ZWQgaW4gdGhlIHByb3h5IHNvIHRoYXQgaXQgY2FuIGJlIHJldHJpZXZlZCB3aXRob3V0IGdvaW5nIGJhY2sKLQkvLyB0byB0aGUgc2VydmVyLiAKLQlwcml2YXRlIGZpbmFsIEhhc2hNYXAgZklEVG9Qcm94aWVzTWFwID0gbmV3IEhhc2hNYXAoMTAwMCk7CS8vIE1hcCBJRCdzIHRvIHByb3hpZXMuIFRoZSBwcm94aWVzIGhhdmUgdGhlaXIgaWQncyBzbyB3ZSBkb24ndCBuZWVkIGEgcmV2ZXJzZSBtYXAKLQlwcml2YXRlIGludCB0cmFuc2FjdGlvbkxvY2tDb3VudCA9IDA7CS8vIENvdW50IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgbG9ja2VkIGFjY2Vzcy4gSXQgaXMgY2hhbmdlZCB1bmRlciBzeW5jIGNvbnRyb2wgb2YgZklEVG9Qcm94aWVzIG1hcC4KLQkKLQkvKioKLQkgKiBUaGUgV2VhayByZWZlcmVuY2UgdXNlZCBmb3IgdGhlIGlkIHRvIHByb3hpZXMgbWFwIGZvciB0aGUgcHJveHkKLQkgKiBzbyB0aGF0IHdlIGNhbiBjbGVhbiBpdCB1cCB3aGVuIHRoZSBwcm94eSBoYXMgYmVlbiBnYXJiYWdlIGNvbGxlY3RlZC4KLQkgKgotCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IGFsbCBjaGFuZ2VzIHRvIHRoZSBQcm94eVJlZiBhcmUgZG9uZSB0aHJvdWdoIHN5bmMgb24gZklEVG9Qcm94aWVzTWFwLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5UmVmIGV4dGVuZHMgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBJbnRlZ2VyIGlkOwkvLyBXZSBuZWVkIHRoZSBpZCBiZWNhdXNlIHRoaXMgcmVmZXJlbmNlIHdpbGwgYmUgb24gdGhlIHZhbHVlIHNpZGUKLQkJCQkJLy8gYW5kIG5vdCB0aGUga2V5IHNpZGUgb2YgdGhlIG1hcCwgc28gd2UgbmVlZCB0byBrbm93IHRoZSBrZXkKLQkJCQkJLy8gc28gdGhhdCB0aGUgb2JqZWN0IGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIG1hcC4KLQkJCQkJLy8KLQkJCQkJLy8gSWYgdGhlIElEIGlzIG51bGwsIHRoZW4gdGhpcyBtZWFucyB0aGlzIGVudHJ5IGhhcyBiZWVuIHByb2Nlc3NlZAotCQkJCQkvLyBpbiBzb21lIHdheSBhbmQgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCBvciByZW1vdmVkIGZyb20gdGhlIHRhYmxlLgotCQlwcml2YXRlIGludCB1c2VDbnQgPSAxOwkvLyBVc2FnZS9SZWYgY291bnQuIE5lZWRlZCBzbyB0aGF0IHdlIGRvbid0IGdldCByaWQgb2YgdG9vIHNvb24uIFNpbmNlIHdlIGRvbid0Ci0JCQkJCS8vIGNyZWF0ZSBhIFByb3h5UmVmIHdpdGhvdXQgYSB1c2FnZSwgd2Ugc3RhcnQgaXQgb2ZmIHdpdGggb25lLiBJdCB3aWxsIGJlIGluY3JlbWVudGVkCi0JCQkJCS8vIHRoZW4gb24gcmV0cmlldmFscyB3aGVuIG5lZWRlZCBieSB1c2VycyBvdXRzaWRlIG9mIHRoZSByZW1vdGUgZmFjdG9yaWVzIHRoZW1zZWx2ZXMuCi0JCQkJCS8vIEl0IHdvbid0IGJlIHBoeXNpY2FsbHkgcmVsZWFzZWQgdW50aWwgZWl0aGVyIEdDIGdvdCByaWQgb2YgaXQsIG9yIGl0IGdvZXMgdG8gMCBvciBsZXNzCi0JCQkJCS8vIG9uIGEgcmVsZWFzZSByZXF1ZXN0LgotCQkJCQkKLQkJcHVibGljIFByb3h5UmVmKEludGVnZXIgYW5JRCwgT2JqZWN0IHByb3h5LCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlIHEpIHsKLQkJCXN1cGVyKHByb3h5LCBxKTsKLQkJCWlkID0gYW5JRDsKLQkJfQotCQkKLQkJcHVibGljIEludGVnZXIgZ2V0SUQoKSB7Ci0JCQlyZXR1cm4gaWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJc3VwZXIuY2xlYXIoKTsKLQkJCWlkID0gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIHN5bmNocm9uaXplZCBpbnQgdXNlQ250KCkgewotCQkJcmV0dXJuIHVzZUNudDsKLQkJfQotCQkKLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluY3JVc2VDbnQoKSB7Ci0JCQl1c2VDbnQrKzsKLQkJfQotCQkKLQkJcHVibGljIHN5bmNocm9uaXplZCBpbnQgZGVjclVzZUNudCgpIHsKLQkJCWlmICgtLXVzZUNudCA8IDApCi0JCQkJdXNlQ250ID0gMDsKLQkJCXJldHVybiB1c2VDbnQ7Ci0JCX0KLQl9Ci0JCi0JLyogUmVmZXJlbmNlIHF1ZXVlIGZvciBjbGVhcmVkIFByb3hpZXMgKi8KLQlwcml2YXRlIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUgcXVldWUgPSBuZXcgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSgpOwkKLQkKLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBlbnRyaWVzIG9uIHRoZSBpZCB0byBwcm94aWVzIG1hcCB0aGF0IGhhdmUgYmVlbiBnYXJiYWdlIGNvbGxlY3RlZC4KLQkgKiBJdCBpcyBwYWNrYWdlLXByb3RlY3RlZCBiZWNhdXNlIG9ubHkgUkVNUmVnaXN0cnlDb250cm9sbGVyIHNob3VsZCBjYWxsIGl0LgotCSAqLwotCXZvaWQgcHJvY2Vzc1F1ZXVlKCkgewotCQlQcm94eVJlZiBwcjsJCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpCi0JCQkJcmV0dXJuOwkvLyBNYXliZSBnb2luZyBkb3duLgkoVGhpcyBhY3R1YWxseSBhIGtsdWRnZSBiZWNhdXNlIHRoZSB0aHJlYWQgaGFwcGVucyB0byBiZSB0aGUgbWFzdGVyIHRocmVhZCBmcm9tIHRoZSByZWdpc3RyeSBjb250cm9sbGVyKS4KLQkJCQkKLQkJCXN5bmNocm9uaXplZCAoZklEVG9Qcm94aWVzTWFwKSB7Ci0JCQkJaWYgKHF1ZXVlID09IG51bGwgfHwgdHJhbnNhY3Rpb25Mb2NrQ291bnQgPiAwKQotCQkJCQlicmVhazsJLy8gRWl0aGVyIG5vIHF1ZXVlICh3ZSBhcmUgY2xlYW5pbmcgdXApIG9yIGluIGEgdHJhbnNhY3Rpb24sIHN0b3AgcHJvY2Vzc2luZyBhbmQgcmV0cnkgb24gbmV4dCB0aW1lIHNsaWNlLgotCQkJCWlmICgocHIgPSAoUHJveHlSZWYpIHF1ZXVlLnBvbGwoKSkgIT0gbnVsbCkgewkJCQkKLQkJCQkJaWYgKHByLmdldElEKCkgIT0gbnVsbCkgewotCQkJCQkJLy8gSXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIGJ5IHNvbWUgb3RoZXIgbWVhbnMuCQkJCQotCQkJCQkJZklEVG9Qcm94aWVzTWFwLnJlbW92ZShwci5nZXRJRCgpKTsJCQkJCQkKLQkJCQkJCXJlbGVhc2VJRChwci5nZXRJRCgpLmludFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCWJyZWFrOwkvLyBUaGVyZSBhcmUgbm8gbW9yZSB3YWl0aW5nLCBzbyBsZWF2ZS4KLQkJCX0KLQkJfQotCX0KLQkKLQkKLS8qKgotICogUkVNQmVhblByb3h5RmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotICoKLSAqIE5vdGU6IEl0IGFzc3VtZXMgdGhlIGJlYW50eXBlIGZhY3RvcnkgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLgotICovCi1SRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JZlJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCWFSZWdpc3RyeS5yZWdpc3RlckJlYW5Qcm94eUZhY3RvcnkodGhpcyk7Ci0JZkJlYW5UeXBlUHJveHlGYWN0b3J5ID0gKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGFSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCWZCZWFuVHlwZVByb3h5RmFjdG9yeS5pbml0aWFsaXplKHRoaXMpOwkvLyBOb3cgd2UncmUgcmVhZHkgZm9yIHRoZSBiZWFudHlwZSBmYWN0b3J5IHRvIGJlIGluaXRpYWxpemVkLgotCQotCUlSRU1CZWFuVHlwZVByb3h5IHNlcnZlclR5cGUgPSBmQmVhblR5cGVQcm94eUZhY3Rvcnkub2JqZWN0Q2xhc3MubmV3QmVhblR5cGVGb3JDbGFzcyhuZXcgSW50ZWdlcihDb21tYW5kcy5SRU1PVEVWTVNFUlZFUl9DTEFTUyksICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLlJlbW90ZVZNU2VydmVyVGhyZWFkIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JZkJlYW5UeXBlUHJveHlGYWN0b3J5LnJlZ2lzdGVyQmVhblR5cGVQcm94eShzZXJ2ZXJUeXBlLCB0cnVlKTsKLQl2bVNlcnZlclByb3h5ID0gc2VydmVyVHlwZS5uZXdCZWFuUHJveHkobmV3IEludGVnZXIoQ29tbWFuZHMuUkVNT1RFU0VSVkVSX0lEKSk7Ci0JcmVnaXN0ZXJQcm94eSh2bVNlcnZlclByb3h5KTsKLX0KLQotCi0vKioKLSAqIFJlZ2lzdGVyIGEgY29sbGVjdGlvbiBvZiBQcm94aWVzCi0gKi8KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyUHJveGllcyhDb2xsZWN0aW9uIHByb3hpZXMpIHsKLQlzeW5jaHJvbml6ZWQoZklEVG9Qcm94aWVzTWFwKSB7Ci0JCUl0ZXJhdG9yIGl0ciA9IHByb3hpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUlSRU1CZWFuUHJveHkgcHJveHkgPSAoSVJFTUJlYW5Qcm94eSkgaXRyLm5leHQoKTsKLQkJCWlmIChwcm94eSBpbnN0YW5jZW9mIElCZWFuVHlwZVByb3h5IHx8ICEocHJveHkuZ2V0VHlwZVByb3h5KCkgaW5zdGFuY2VvZiBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5KSkgewotCQkJCVByb3h5UmVmIG9sZFJlZiA9IChQcm94eVJlZikgZklEVG9Qcm94aWVzTWFwLnB1dChwcm94eS5nZXRJRCgpLCBuZXcgUHJveHlSZWYocHJveHkuZ2V0SUQoKSwgcHJveHksIHF1ZXVlKSk7Ci0JCQkJaWYgKG9sZFJlZiAhPSBudWxsKSB7Ci0JCQkJCS8vIFdlJ3ZlIHJlcGxhY2VkIGl0IHdpdGggYSBuZXcgb25lLCBzbyB3ZSB3aWxsIGNsZWFyIG91dCB0aGUgcmVmIHNvIHRoYXQgaXQgd29uJ3QgbGF0ZXIgdHJ5IHRvIHJlbW92ZSBpdHNlbGYKLQkJCQkJb2xkUmVmLmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci19Ci0KLS8qKgotICogUmVnaXN0ZXIgYSBzaW5nbGUgcHJveHkKLSAqLwotcHVibGljIHZvaWQgcmVnaXN0ZXJQcm94eShJUkVNQmVhblByb3h5IHByb3h5KSB7Ci0JaWYgKHByb3h5IGluc3RhbmNlb2YgSUJlYW5UeXBlUHJveHkgfHwgIShwcm94eS5nZXRUeXBlUHJveHkoKSBpbnN0YW5jZW9mIElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkpKQotCQlzeW5jaHJvbml6ZWQoZklEVG9Qcm94aWVzTWFwKSB7Ci0JCQlQcm94eVJlZiBvbGRSZWYgPSAoUHJveHlSZWYpIGZJRFRvUHJveGllc01hcC5wdXQocHJveHkuZ2V0SUQoKSwgbmV3IFByb3h5UmVmKHByb3h5LmdldElEKCksIHByb3h5LCBxdWV1ZSkpOwotCQkJaWYgKG9sZFJlZiAhPSBudWxsKSB7Ci0JCQkJLy8gV2UndmUgcmVwbGFjZWQgaXQgd2l0aCBhIG5ldyBvbmUsIHNvIHdlIHdpbGwgY2xlYXIgb3V0IHRoZSByZWYgc28gdGhhdCBpdCB3b24ndCBsYXRlciB0cnkgdG8gcmVtb3ZlIGl0c2VsZgotCQkJCW9sZFJlZi5jbGVhcigpOwotCQkJfQkJCQkJCQkKLQkJfQotfQotCi0vKioKLSAqIFJlbGVhc2UgYSBwcm94eSBiZWNhdXNlIG5vIGxvbmdlciBuZWVkZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbGVhc2VQcm94eShJQmVhblByb3h5IHByb3h5KSB7Ci0JaWYgKCFwcm94eS5pc1ZhbGlkKCkpCi0JCXJldHVybjsKLQlpZiAocHJveHkgaW5zdGFuY2VvZiBJQmVhblR5cGVQcm94eSAmJiAhZkJlYW5UeXBlUHJveHlGYWN0b3J5LnJlbGVhc2VQcm94eSgoSUJlYW5UeXBlUHJveHkpIHByb3h5KSkKLQkJcmV0dXJuOwkvLyBCZWFuVHlwZSBhbmQgdHlwZSBmYWN0b3J5IHdvbid0IGFsbG93IHJlbGVhc2Ugb2YgaXQuCi0JSW50ZWdlciBpZCA9ICgoSVJFTUJlYW5Qcm94eSkgcHJveHkpLmdldElEKCk7Ci0Jc3luY2hyb25pemVkKGZJRFRvUHJveGllc01hcCkgewkJCQotCQkvLyBTeW5jZWQgaW4gaGVyZSBzbyB0aGF0IHdlIHdpbGwgcmVtb3ZlIGl0IGJlZm9yZSBzb21lIG9uZSBlbHNlIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIG1heSB0cnkKLQkJLy8gdG8gYWNjZXNzIGl0IGFnYWluLgotCQlpZiAoaWQuaW50VmFsdWUoKSAhPSBDb21tYW5kcy5OT1RfQU5fSUQpIHsKLQkJCVByb3h5UmVmIHJlZiA9IChQcm94eVJlZikgZklEVG9Qcm94aWVzTWFwLmdldChpZCk7Ci0JCQlpZiAocmVmID09IG51bGwgfHwgcmVmLmRlY3JVc2VDbnQoKSA8PSAwKSB7Ci0JCQkJLy8gTm8gdXNhZ2UsIHNvIGRvIGFjdHVhbCByZWxlYXNlLgotCQkJCWZJRFRvUHJveGllc01hcC5yZW1vdmUoaWQpOwotCQkJCSgoSVJFTUJlYW5Qcm94eSkgcHJveHkpLnJlbGVhc2UoKTsKLQkJCQlpZiAocmVmICE9IG51bGwpCi0JCQkJCXJlZi5lbnF1ZXVlKCk7CS8vIFF1ZXVlIGl0IHVwIHNvIHRoYXQgb24gbmV4dCByZWxlYXNlIGN5Y2xlIGl0IHdpbGwgZ28gYXdheS4KLQkJCX0gCi0JCX0gZWxzZSB7Ci0JCQkoKElSRU1CZWFuUHJveHkpIHByb3h5KS5yZWxlYXNlKCk7CQkJCi0JCX0KLQl9Ci19Ci0KLS8qKgotICogUmVsZWFzZSBhIHNwZWNpZmljIElELiBUaGlzIGlzIHVzZWQgaW4gY2FzZSBhbiBJRCBoYXMgYmVlbiBzZW50Ci0gKiBidXQgd2UgY291bGRuJ3QgcHJveHkgaXQuIEluIHRoYXQgY2FzZSB3ZSBvbmx5IGhhdmUgYW4gSUQuIEl0IGlzCi0gKiBhbHNvIHVzZWQgd2hlbiBhIHByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGV4cGxpY2l0bHkgb3IgdGhyb3VnaCBHQy4KLSAqIEluIHRoYXQgY2FzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGRlLXJlZ2lzdGVyZWQuCi0gKi8KLXByaXZhdGUgdm9pZCByZWxlYXNlSUQoaW50IGFuSUQpIHsKLQl0cnkgewotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZlJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQljb25uZWN0LnJlbGVhc2VJRChhbklEKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZSZWdpc3RyeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQl9Ci0JfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJLy8gQ291bGRuJ3QgZ2V0IGNvbm5lY3Rpb24sIGRvbid0IGJvdGhlciB3aXRoIGEgcmVsZWFzZS4KLQl9Ci19Ci0KLS8qKgotICogRm9yIHRoZSBSZW1vdGUgRmFjdG9yeSB3ZSB3aWxsIGNyZWF0ZSBhbiBSRU1CZWFuUHJveHkgdXNpbmcgdGhlIG51bGwgY29uc3RydWN0b3IKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIHNvIG9ubHkgUkVNQmVhblR5cGVQcm94aWVzIGNhbiBjcmVhdGUgaW5zdGFuY2VzLgotICovCi0gCi1JQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eShJUkVNQmVhblR5cGVQcm94eSBhVHlwZVByb3h5KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCXJldHVybiBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRDbGFzc05ld0luc3RhbmNlKCkuaW52b2tlKG51bGwsIGFUeXBlUHJveHkpOwotfQotCi0vKioKLSAqIEZvciB0aGUgUmVtb3RlIEZhY3Rvcnkgd2Ugd2lsbCBjcmVhdGUgYSBSRU1CZWFuUHJveHkgdXNpbmcgdGhlIGluaXRpYWxpemF0aW9uU3RyaW5nLgotICogUGFja2FnZSBwcm90ZWN0ZWQgc28gb25seSBSRU1CZWFuVHlwZVByb3hpZXMgY2FuIGNyZWF0ZSBpbnN0YW5jZXMuIAotICovCi1JQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eShJUkVNQmVhblR5cGVQcm94eSBhVHlwZVByb3h5LCBTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpCi0JdGhyb3dzIFRocm93YWJsZVByb3h5LCBDb21tYW5kRXhjZXB0aW9uLCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JSVJFTUNvbm5lY3Rpb24gY29ubmVjdCA9IGZSZWdpc3RyeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCXN0YXJ0VHJhbnNhY3Rpb24oKTsKLQkvLyBTdGFydGluZyBhIHRyYW5zYWN0aW9uLCB3ZSB3aWxsIGJlIGdldHRpbmcgaWQncyBiYWNrIGFuZCBuZWVkIHRvIGdldCBkYXRhIGluIGEgc2VwYXJhdGUgc3RlcCwgc28gd2UgbmVlZCB0byBncm91cCBpdCBpbiBhIHRyYW5zYWN0aW9uLgotCXRyeSB7Ci0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IG5ld0luc3RhbmNlRGF0YSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQluZXdJbnN0YW5jZURhdGEgPSBnZXROZXdJbnN0YW5jZURhdGEoYVR5cGVQcm94eSwgaW5pdGlhbGl6YXRpb25TdHJpbmcsIGNvbm5lY3QpOwotCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJc3dpdGNoIChlLmdldEVycm9yQ29kZSgpKSB7Ci0JCQkJY2FzZSBDb21tYW5kcy5DTEFTU19DQVNUX0VYQ0VQVElPTjoKLQkJCQkJLy8gVGhlIHJlc3VsdCB3YXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuCi0JCQkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLkNsYXNzY2FzdF9FWENfLCBuZXcgT2JqZWN0W10ge2V4dHJhY3RGaXJzdExpbmUoaW5pdGlhbGl6YXRpb25TdHJpbmcpLCBhVHlwZVByb3h5LmdldFR5cGVOYW1lKCl9KSk7IAotCQkJCWNhc2UgQ29tbWFuZHMuQ0FOTk9UX0VWQUxVQVRFX1NUUklORzoKLQkJCQkJLy8gV2FudCB0byBsb2cgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCBpdCB0byBub3QgZXZhbHVhdGUuCi0JCQkJCS8vIERvbid0IG5lZWQgdG8gbG9nIHRoaXMgc2lkZSwganVzdCBsb2cgdGhlIFJlbW90ZVZNIHNpZGUgb2YgdGhlIHRyYWNlLgotCQkJCQlqYXZhLmlvLlN0cmluZ1dyaXRlciBzID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCWphdmEuaW8uUHJpbnRXcml0ZXIgdyA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKHMpOwotCQkJCQkoKFRocm93YWJsZVByb3h5KSBlLmdldEVycm9yT2JqZWN0KCkpLnByaW50UHJveHlTdGFja1RyYWNlKHcpOwotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBzLnRvU3RyaW5nKCksIG51bGwpKTsKLQkJCQkJdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLkluc3RhbnRpYXRlX0VYQ18sIG5ldyBPYmplY3RbXSB7ZXh0cmFjdEZpcnN0TGluZShpbml0aWFsaXphdGlvblN0cmluZyl9KSk7IAotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IGU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coIAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkwLAotCQkJCQkJIiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSXQgZmFpbGVkIGluIHRoZSBjb21tYW5kLCB0cnkgYWdhaW4uCi0JCQkJZlJlZ2lzdHJ5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQljb25uZWN0ID0gZlJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3SW5zdGFuY2VEYXRhID0gZ2V0TmV3SW5zdGFuY2VEYXRhKGFUeXBlUHJveHksIGluaXRpYWxpemF0aW9uU3RyaW5nLCBjb25uZWN0KTsKLQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGVBZ2FpbikgewotCQkJCQkvLyBJdCBmYWlsZWQgYWdhaW4uIENsb3NlIHRoaXMgY29ubmVjdGlvbiBhbmQgZG9uJ3QgbGV0IGl0IGJlIHJldHVybmVkLgotCQkJCQlmUmVnaXN0cnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQljb25uZWN0ID0gbnVsbDsgLy8gVGhpcyBpcyBzbyB0aGF0IGl0IHdvbid0IGJlIHJldHVybmVkLgotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb25uZWN0ICE9IG51bGwpCi0JCQkJZlJlZ2lzdHJ5LnJldHVybkNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCX0KLQotCQlpZiAobmV3SW5zdGFuY2VEYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0QmVhblByb3h5KG5ld0luc3RhbmNlRGF0YSk7IC8vIFR1cm4gaXQgaW50byBhIHByb3h5Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcFRyYW5zYWN0aW9uKCk7CS8vIE5vdyB3ZSBjYW4gcmVsZWFzZSB0aGUgdHJhbnNhY3Rpb24uCi0JfQotCi1yZXR1cm4gbnVsbDsKLX0KLQotcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdEZpcnN0TGluZShTdHJpbmcgaW5pdFN0cmluZykgewotCS8vIE5lZWQgdG8gZXh0cmFjdCB0aGUgZmlyc3QgbGluZSBmb3IgdGhlIG1lc3NhZ2VGb3JtYXQgbm90IHRvIGJhcmYuCi0JaW50IGNyID0gaW5pdFN0cmluZy5pbmRleE9mKCdccicpOwotCWludCBsZiA9IGluaXRTdHJpbmcuaW5kZXhPZignXG4nKTsJCi0JaWYgKGNyICE9IC0xIHx8IGxmICE9IC0xKSB7Ci0JCWlmIChjciA9PSAtMSB8fCAobGYgIT0gLTEgJiYgbGYgPCBjcikpCi0JCQlyZXR1cm4gaW5pdFN0cmluZy5zdWJzdHJpbmcoMCwgbGYpOwotCQllbHNlCi0JCQlyZXR1cm4gaW5pdFN0cmluZy5zdWJzdHJpbmcoMCwgY3IpOwotCX0gZWxzZQotCQlyZXR1cm4gaW5pdFN0cmluZzsKLX0KLQkKLQkKLS8qKgotICogYWN0dWFsbHkgY3JlYXRlIGl0IHVzaW5nIGEgcGFzc2VkIGluIGNvbm5lY3Rpb24uIFRoaXMgYWxsb3dzIHJldHJ5IGNhcGFiaWxpdHkuCi0gKgotICogVGhpcyB3aWxsIHNlbmQgdGhlIHJlcXVlc3Qgb3ZlciB0byB0aGUgY29ubmVjdGlvbi4KLSAqCi0gKiBJZiB3ZSBnZXQgYW4gT0JKRUNUIGJhY2ssIHRoZW4gdGhlIGJlYW50eXBlcHJveHkgdGhhdCB0aGUgY2xhc3NJRCBpbiB0aGUKLSAqIHZhbHVlIHBvaW50cyB0byBtdXN0IGJlIG9mIHR5cGUgSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSBzbyB0aGF0IHdlIGNhbgotICogc2VuZCB0aGlzIG5ldyBvYmplY3QgdG8gdGhlIGNvcnJlY3QgYmVhbnR5cGUgdG8gY3JlYXRlIHRoZSBjb3JyZWN0IHByb3h5LgotICoKLSAqIElmIHdlIGdldCBhbiBPQkpFQ1RfSUQgYmFjaywgdGhlbiB0aGUgYmVhbnR5cGVwcm94eSB0aGF0IHRoZSBjbGFzc0lEIGluCi0gKiB0aGUgdmFsdWUgcG9pbnRzIHRvIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgY3JlYXRpbmcgYSBwcm94eSBvZiB0aGF0IHR5cGUuIAotICovCi1wcml2YXRlIENvbW1hbmRzLlZhbHVlT2JqZWN0IGdldE5ld0luc3RhbmNlRGF0YShJUkVNQmVhblR5cGVQcm94eSBhVHlwZVByb3h5LCBTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcsIElSRU1Db25uZWN0aW9uIGNvbm5lY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ29tbWFuZEV4Y2VwdGlvbiB7CQotCXRyeSB7Ci0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IG5ld0luc3RhbmNlRGF0YSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQljb25uZWN0LmdldE5ld0luc3RhbmNlKGFUeXBlUHJveHkuZ2V0SUQoKS5pbnRWYWx1ZSgpLCBpbml0aWFsaXphdGlvblN0cmluZywgbmV3SW5zdGFuY2VEYXRhKTsKLQkJcmV0dXJuIG5ld0luc3RhbmNlRGF0YTsKLQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkvLyBUQkQgLSBOZWVkcyB0byBoYW5kbGUgZXJyb3Igb2Ygbm90IGV2YWx1YXRhYmxlIGFuZCBzZW5kIG92ZXIgdG8gdGhlIGNvbXBpbG9yLgotCQlwcm9jZXNzRXJyb3JSZXR1cm4oZSk7CS8vIFByb2Nlc3MgdGhpcwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBhY3R1YWxseSBjcmVhdGUgaXQgdXNpbmcgYSBwYXNzZWQgaW4gY29ubmVjdGlvbi4gVGhpcyBhbGxvd3MgcmV0cnkgY2FwYWJpbGl0eS4KLSAqLwotcHJpdmF0ZSB2b2lkIGdldE9iamVjdEluc3RhbmNlRGF0YShJUkVNQ29ubmVjdGlvbiBjb25uZWN0LCBpbnQgb2JqZWN0SUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlUmV0dXJuKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENvbW1hbmRFeGNlcHRpb24gewkKLQl0cnkgewotCQljb25uZWN0LmdldE9iamVjdERhdGEob2JqZWN0SUQsIHZhbHVlUmV0dXJuKTsKLQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQlwcm9jZXNzRXJyb3JSZXR1cm4oZSk7CS8vIFByb2Nlc3MgdGhpcwotCX0KLX0KLQotLyoqCi0gKiBHZXQgYSBiZWFuIHByb3h5IGZyb20gdGhlIHZhbHVlIG9iamVjdCBwYXNzZWQgaW4uIElmIG5vdCB5ZXQgY3JlYXRlZCwgY3JlYXRlIG9uZS4KLSAqIE5PVEU6IE5VTEwgdHlwZSBhY3R1YWxseSByZXR1cm5zIGEgdHJ1ZSBudWxsLiBUaGlzIGlzIHNvIHRoYXQgaWYgcGVvcGxlIGFyZSBjYXN0aW5nCi0gKiB0aGUgcmV0dXJuZWQgcHJveHkgdG8gYSBzcGVjaWZpYyB0eXBlIChlLmcgSUludGVnZXJCZWFuUHJveHkpLCB0aGVuIHRoZXkgd29uJ3QgZ2V0Ci0gKiBhIENsYXNzQ2FzdEV4Y2VwdGlvbiwgdGhleSB3aWxsIGdldCBhIG51bGwuIFRoaXMgaXMgZWFzaWVyIGZvciB0aGVtIHRvIGhhbmRsZS4KLSAqIAotICogTk9URTogVGhpcyBpcyBwdWJsaWMgT05MWSBzbyB0aGF0IGV4dGVuc2lvbiBmYWN0b3JpZXMgY2FuIGNyZWF0ZSBjb3JyZWN0IHR5cGVzIG9mCi0gKiBwcm94aWVzIGluIGNvbnNpc3RlbnQgbWFubmVyIGZyb20gYSB2YWx1ZSBvYmplY3QuIAotICogCi0gKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGlzIGNhbGxlZAotICogZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbiBvbmx5IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSB2YWx1ZSBjb3VsZCBoYXZlIGludmFsaWQgZGF0YQotICogYnkgdGhlIHRpbWUgd2UgdHJ5IHRvIGdldCB0aGUgZGF0YSBvdXQgb2YgaXQuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IGdldEJlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDb21tYW5kRXhjZXB0aW9uIHsKLQlzd2l0Y2ggKHZhbHVlLnR5cGUpIHsKLQkJLy8gTnVsbCByZXN1bHQuCi0JCWNhc2UgKGJ5dGUpIENvbW1hbmRzLlZPSURfVFlQRToKLQkJCXJldHVybiBudWxsOwotCQkvLyBBIGNvbnN0YW50IG9iamVjdCB3YXMgcmVjZWl2ZWQuCi0JCWNhc2UgQ29tbWFuZHMuT0JKRUNUOgotCQkJSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSBjb25zdGFudEJlYW5UeXBlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY29uc3RhbnRCZWFuVHlwZSA9IChJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5KSBnZXRCZWFuVHlwZSh2YWx1ZS5jbGFzc0lEKTsKLQkJCQlpZiAoY29uc3RhbnRCZWFuVHlwZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsJLy8gQ2Fubm90IGZpbmQgdGhlIHR5cGUgdG8gY3JlYXRlIGl0LgotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJdCB3YXNuJ3QgYSBjb25zdGFudCB0eXBlLCBzbyB3ZSBjYW4ndCBjcmVhdGUgaXQuIFJldHVybiBudWxsLgotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGNvbnN0YW50QmVhblR5cGUubmV3QmVhblByb3h5KHZhbHVlKTsKLQkJCi0JCS8vIEFuIGV4aXN0aW5nIG9iamVjdF9pZCB3YXMgcmV0dXJuZWQsIHRoZSBvYmplY3Qgc2hvdWxkIGV4aXN0LiBJZiBpdCBkb2Vzbid0Ci0JCS8vIHRoZW4gc3VibWl0IHRoZSBpbmZvIGNvbW1hbmQgdG8gdHJ5IHRvIHJlY3JlYXRlIGl0IGNvcnJlY3RseS4KLQkJY2FzZSBDb21tYW5kcy5PQkpFQ1RfSUQ6Ci0JCQlJbnRlZ2VyIG9iamVjdElEID0gbmV3IEludGVnZXIodmFsdWUub2JqZWN0SUQpOwotCQkJSUJlYW5Qcm94eSBwcm94eSA9IHJldHJpZXZlUHJveHkob2JqZWN0SUQsIHRydWUpOwotCQkJaWYgKHByb3h5ICE9IG51bGwpCi0JCQkJcmV0dXJuIHByb3h5OwotCi0JCQkvLyBOb3QgZm91bmQsIG5lZWQgdG8gdHJ5IHRvIHJlY3JlYXRlIGl0LgotCQkJSVJFTUNvbm5lY3Rpb24gY29ubmVjdCA9IGZSZWdpc3RyeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlnZXRPYmplY3RJbnN0YW5jZURhdGEoY29ubmVjdCwgdmFsdWUub2JqZWN0SUQsIHZhbHVlKTsgLy8gR28gYW5kIGdldCB0aGUgZGF0YQotCQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJMCwKLQkJCQkJCQkiIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUpKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gVHJ5IG9uZSBtb3JlIHRpbWUuCi0JCQkJCWZSZWdpc3RyeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCWNvbm5lY3QgPSBudWxsOwotCQkJCQljb25uZWN0ID0gZlJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlnZXRPYmplY3RJbnN0YW5jZURhdGEoY29ubmVjdCwgdmFsdWUub2JqZWN0SUQsIHZhbHVlKTsgLy8gR28gYW5kIGdldCB0aGUgZGF0YQotCQkJCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCQlmUmVnaXN0cnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJCQl0aHJvdyBlQWdhaW47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjb25uZWN0ICE9IG51bGwpCi0JCQkJCWZSZWdpc3RyeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQkJfQotCi0JCQlyZXR1cm4gZ2V0QmVhblByb3h5KHZhbHVlKTsgLy8gTm93IHByb2Nlc3MgaXQgdG8gY3JlYXRlIHRoZSBuZXcgZGF0YS4KLQkJCQotCQkvLyBBbiBuZXcgb2JqZWN0IGlkLiBOZWVkIHRvIGdldCB0aGUgY2xhc3MgdHlwZSBhbmQgbGV0IGl0IGNyZWF0ZSBpdC4KLQkJY2FzZSBDb21tYW5kcy5ORVdfT0JKRUNUX0lEOgotCQkJdHJ5IHsKLQkJCQlJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZSA9IGdldEJlYW5UeXBlKHZhbHVlLmNsYXNzSUQpOwotCQkJCUlSRU1CZWFuUHJveHkgbmV3UHJveHkgPSBuZXdCZWFuVHlwZS5uZXdCZWFuUHJveHkobmV3IEludGVnZXIodmFsdWUub2JqZWN0SUQpKTsKLQkJCQlpZiAobmV3UHJveHkgIT0gbnVsbCkKLQkJCQkJcmVnaXN0ZXJQcm94eShuZXdQcm94eSk7Ci0JCQkJcmV0dXJuIG5ld1Byb3h5OwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVGhlIHNlcnZlciBoYXMgY3JlYXRlZCBhIG5ldyBvYmplY3QsIGJ1dCB3ZSBjb3VsZG4ndCBjcmVhdGUvcmVnaXN0ZXIgYSBwcm94eSBmb3IgaXQuCi0JCQkJLy8gV2UgbmVlZCB0byByZWxlYXNlIGl0IHNvIHRoYXQgdGhlIHNlcnZlciBjYW4gZ2V0IHJpZCBvZiBpdC4gT3RoZXJ3aXNlIGl0IHdvdWxkIGhhbmcKLQkJCQkvLyBhcm91bmQgb3ZlciB0aGVyZSBmb3JldmVyLgotCQkJCXJlbGVhc2VJRCh2YWx1ZS5vYmplY3RJRCk7Ci0JCQkJdGhyb3cgZTsJCQkJCi0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGUgc2VydmVyIGhhcyBjcmVhdGVkIGEgbmV3IG9iamVjdCwgYnV0IHdlIGNvdWxkbid0IGNyZWF0ZS9yZWdpc3RlciBhIHByb3h5IGZvciBpdC4KLQkJCQkvLyBXZSBuZWVkIHRvIHJlbGVhc2UgaXQgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBnZXQgcmlkIG9mIGl0LiBPdGhlcndpc2UgaXQgd291bGQgaGFuZwotCQkJCS8vIGFyb3VuZCBvdmVyIHRoZXJlIGZvcmV2ZXIuCi0JCQkJcmVsZWFzZUlEKHZhbHVlLm9iamVjdElEKTsKLQkJCQl0aHJvdyBlOwotCQkJfQkJCQotCQkJCi0JCS8vIEFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCBjcmVhdGUgdGhlIFRocm93YWJsZVByb3h5IGFuZCB0aGVuIHRocm93IGl0LgotCQljYXNlIENvbW1hbmRzLlRIUk9XOgotCQkJSVJFTUJlYW5Qcm94eSBuZXdUaHJvd1Byb3h5CT0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJSVJFTUJlYW5UeXBlUHJveHkgbmV3VGhyb3dUeXBlID0gbmV3VGhyb3dUeXBlID0gZ2V0QmVhblR5cGUodmFsdWUuY2xhc3NJRCk7Ci0JCQkJbmV3VGhyb3dQcm94eSA9IG5ld1Rocm93VHlwZS5uZXdCZWFuUHJveHkobmV3IEludGVnZXIodmFsdWUub2JqZWN0SUQpKTsKLQkJCQlpZiAobmV3VGhyb3dQcm94eSAhPSBudWxsKQotCQkJCQlyZWdpc3RlclByb3h5KG5ld1Rocm93UHJveHkpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVGhlIHNlcnZlciBoYXMgY3JlYXRlZCBhIG5ldyBvYmplY3QsIGJ1dCB3ZSBjb3VsZG4ndCBjcmVhdGUvcmVnaXN0ZXIgYSBwcm94eSBmb3IgaXQuCi0JCQkJLy8gV2UgbmVlZCB0byByZWxlYXNlIGl0IHNvIHRoYXQgdGhlIHNlcnZlciBjYW4gZ2V0IHJpZCBvZiBpdC4gT3RoZXJ3aXNlIGl0IHdvdWxkIGhhbmcKLQkJCQkvLyBhcm91bmQgb3ZlciB0aGVyZSBmb3JldmVyLgotCQkJCXJlbGVhc2VJRCh2YWx1ZS5vYmplY3RJRCk7Ci0JCQkJdGhyb3cgZTsJCQkJCi0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGUgc2VydmVyIGhhcyBjcmVhdGVkIGEgbmV3IG9iamVjdCwgYnV0IHdlIGNvdWxkbid0IGNyZWF0ZS9yZWdpc3RlciBhIHByb3h5IGZvciBpdC4KLQkJCQkvLyBXZSBuZWVkIHRvIHJlbGVhc2UgaXQgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBnZXQgcmlkIG9mIGl0LiBPdGhlcndpc2UgaXQgd291bGQgaGFuZwotCQkJCS8vIGFyb3VuZCBvdmVyIHRoZXJlIGZvcmV2ZXIuCi0JCQkJcmVsZWFzZUlEKHZhbHVlLm9iamVjdElEKTsKLQkJCQl0aHJvdyBlOwotCQkJfQkJCQkKLQkJCS8vIEl0IHJlYWxseSBzaG91bGQgYmUgYSB0aHJvd2FibGUsIGJ1dCBpZiBub3QsIGp1c3QgcmV0dXJuIGl0LgotCQkJaWYgKG5ld1Rocm93UHJveHkgaW5zdGFuY2VvZiBUaHJvd2FibGVQcm94eSkKLQkJCQl0aHJvdyAoVGhyb3dhYmxlUHJveHkpIG5ld1Rocm93UHJveHk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5ld1Rocm93UHJveHk7CQkKLQkJCi0JCS8vIEl0IGlzIG9uZSBvZiB0aGUgc3RhbmRhcmQga2luZHMsIHdoaWNoIGFyZSBDb25zdGFudCB0eXBlcwotCQlkZWZhdWx0OgotCQkJSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSBzdGFuZGFyZEJlYW5UeXBlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3RhbmRhcmRCZWFuVHlwZSA9IChJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5KSBnZXRCZWFuVHlwZSh2YWx1ZS50eXBlKTsKLQkJCQlpZiAoc3RhbmRhcmRCZWFuVHlwZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsJLy8gQ2Fubm90IGZpbmQgdGhlIHR5cGUgdG8gY3JlYXRlIGl0LgotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJdCB3YXNuJ3QgYSBzdGFuZGFyZCB0eXBlLCBzbyB3ZSBjYW4ndCBjcmVhdGUgaXQuIFJldHVybiBudWxsLgotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBzdGFuZGFyZEJlYW5UeXBlLm5ld0JlYW5Qcm94eSh2YWx1ZSk7Ci0JfQkJCQkJCQotfQotCi0vKioKLSAqIFByb2Nlc3MgdGhlIGVycm9yIGV4Y2VwdGlvbi4gR2V0IHRoZSBkYXRhIGZyb20gaXQgYW5kIHR1cm4gaXQgaW50byBwcm94eSBkYXRhLgotICogSWYgaXQgaXMgYSBUSFJPVywgdGhlbiBpdCB3aWxsIHRocm93IHRoZSBUaHJvd2FibGUgaW5zdGVhZC4gCi0gKgotICogTk9URTogSXQgaXMgcHVibGljIE9OTFkgc28gdGhhdCBleHRlbnNpb24gZmFjdG9yaWVzIGNhbiBwcm9jZXNzIGVycm9ycyBpbgotICogYW4gY29uc2lzdGVudCBtYW5uZXIuIAotICogCi0gKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGJlIGNhbGxlZCBvbmx5IHdpdGhpbiBhIHRyYW5zYWN0aW9uLgotICovCi1wdWJsaWMgdm9pZCBwcm9jZXNzRXJyb3JSZXR1cm4oQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSB7Ci0JaW50IGNvZGUgPSBlLmdldEVycm9yQ29kZSgpOwotCU9iamVjdCBkYXRhID0gbnVsbDsKLQlpZiAoY29kZSA9PSBDb21tYW5kcy5USFJPV0FCTEVfU0VOVCkKLQkJZGF0YSA9IGdldEJlYW5Qcm94eShlLmdldFZhbHVlKCkpOwkvLyBJdCBpcyBUaHJvdyBzZW50LCBzbyBsZXQgdGhlIHRocm93IGZyb20gZ2V0QmVhblByb3h5IGNvbnRpbnVlIG9uIG91dC4gKEJ1dCBhcyBhIHNhZmV0eSwgd2Ugc3RpbGwgdHJ5IHRvIGdldCB0aGUgZGF0YS4KLQllbHNlIHsKLQkJdHJ5IHsKLQkJCWRhdGEgPSBnZXRCZWFuUHJveHkoZS5nZXRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgdCkgewotCQkJLy8gQnV0IHdlIHdhbnQgdG8ga2VlcCB0aHJvd2FibGVzIGluIHRoaXMgY2FzZS4gVGhleSBhcmUganVzdCBkYXRhIGZvciB0aGUgY29tbWFuZCBlcnJvci4KLQkJCWRhdGEgPSB0OwotCQl9Ci0JfQotCXRocm93IG5ldyBDb21tYW5kRXJyb3JFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVNZXNzYWdlcy5SZW1vdGVDbWRfRVhDXywgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihjb2RlKX0pLCBjb2RlLCBlLmdldFZhbHVlKCksIGRhdGEpOwkvLyBDcmVhdGUgYSBuZXcgb25lIGFuZCB0aHJvdyBpdCBjb250YWluaW5nIHRoZSBwcm94aWVkIGRhdGEuIC8vJE5PTi1OTFMtMSQKLX0KLQkgCi0KLS8qKgotICogR2V0IGEgYmVhbnR5cGUgd2hlcmUgdGhlIGlkIHBhc3NlZCBpbiBpcyB0aGUgY2xhc3NJRCBvZiB0aGUgYmVhbnR5cGUuCi0gKiBJZiBub3QgZm91bmQsIHRoZW4gZ28gZ2V0IGl0IGxvYWRlZC4gSWYgaXQgY2FuJ3QgYmUgZm91bmQsIHRoZW4gd2Ugd2lsbAotICogcmVsZWFzZSB0aGUgaWQgYmVjYXVzZSBpdCBtZWFucyB3ZSBoYXZlIGFuIGlkIGZyb20gdGhlIHNlcnZlciwgYnV0IHdlCi0gKiBjYW4ndCBjcmVhdGUgYSBwcm94eSBmb3IgaXQsIHNvIGRvbid0IGtlZXAgdGhlIHNlcnZlciBob2xkaW5nIGl0LgotICogTk9URTogVGhpcyBpcyBwdWJsaWMgT05MWSBzbyB0aGF0IGV4dGVuc2lvbiBmYWN0b3JpZXMgY2FuIGNyZWF0ZSBjb3JyZWN0IHR5cGVzCi0gKiBpbiBhIGNvbnNpc3RlbnQgbWFubmVyIGZyb20gdGhlIGlkLgotICogCi0gKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGJlIGNhbGxlZCBvbmx5IGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24uIAotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGUoaW50IGlkKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGUgPSBudWxsOwotCXRyeSB7Ci0JCUludGVnZXIgY2xhc3NJRCA9IG5ldyBJbnRlZ2VyKGlkKTsKLQkJYmVhblR5cGUgPSAoSVJFTUJlYW5UeXBlUHJveHkpIHJldHJpZXZlUHJveHkoY2xhc3NJRCwgZmFsc2UpOwotCQlpZiAoYmVhblR5cGUgPT0gbnVsbCkKLQkJCWJlYW5UeXBlID0gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5UeXBlUHJveHkoY2xhc3NJRCk7CS8vIFdlIGRvbid0IGhhdmUgaXQsIG5lZWQgdG8gZ28gdG8gdGhlIGZhY3Rvcnkgc28gdGhhdCBpdCBjYW4gZ28gcXVlcnkgd2hhdCBpdCBuZWVkcwotCQlpZiAoYmVhblR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwkvLyBDYW5ub3QgZmluZCB0aGUgdHlwZSB0byBjcmVhdGUgaXQuCi0JfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJLy8gSXQgd2Fzbid0IGEgYmVhbiB0eXBlLCBzbyB3ZSBjYW4ndCBjcmVhdGUgaXQuIFJldHVybiBudWxsLgotCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JfSBmaW5hbGx5IHsKLQkJaWYgKGJlYW5UeXBlID09IG51bGwpCi0JCQlyZWxlYXNlSUQoaWQpOwkvLyBDb3VsZG4ndCBjcmVhdGUgYSBwcm94eSwgc28gcmVsZWFzZSB0aGUgaWQuCi0JfQotCXJldHVybiBiZWFuVHlwZTsKLX0KLQotCi0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgaW50ZWdlcgotICovCi1wdWJsaWMgSUludGVnZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgYVByaW1pdGl2ZUludGVnZXIpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuaW50VHlwZS5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KGFQcmltaXRpdmVJbnRlZ2VyKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gYSBwcm94eSB3cmFwcGluZyB0aGUgcHJpbWl0aXZlIGJ5dGUKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChieXRlIGFQcmltaXRpdmVCeXRlKSB7Ci0KLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJ5dGVUeXBlLmNyZWF0ZUJ5dGVCZWFuUHJveHkoYVByaW1pdGl2ZUJ5dGUpOwotfQotCi0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgY2hhcgotICovCi1wdWJsaWMgSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGNoYXIgYVByaW1pdGl2ZUNoYXIpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhclR5cGUuY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KGFQcmltaXRpdmVDaGFyKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gYSBwcm94eSB3cmFwcGluZyB0aGUgcHJpbWl0aXZlIHNob3J0Ci0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoc2hvcnQgYVByaW1pdGl2ZVNob3J0KSB7Ci0KLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnNob3J0VHlwZS5jcmVhdGVTaG9ydEJlYW5Qcm94eShhUHJpbWl0aXZlU2hvcnQpOwotfQotCi0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgbG9uZwotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGxvbmcgYVByaW1pdGl2ZUxvbmcpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkubG9uZ1R5cGUuY3JlYXRlTG9uZ0JlYW5Qcm94eShhUHJpbWl0aXZlTG9uZyk7Ci19Ci0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgZG91YmxlCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoZG91YmxlIGFQcmltaXRpdmVEb3VibGUpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuZG91YmxlVHlwZS5jcmVhdGVEb3VibGVCZWFuUHJveHkoYVByaW1pdGl2ZURvdWJsZSk7Ci19Ci0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgZmxvYXQKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChmbG9hdCBhUHJpbWl0aXZlRmxvYXQpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuZmxvYXRUeXBlLmNyZWF0ZUZsb2F0QmVhblByb3h5KGFQcmltaXRpdmVGbG9hdCk7Ci19Ci0KLS8qKgotICogY3JlYXRlQmVhblByb3h5V2l0aCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElCb29sZWFuQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoQm9vbGVhbiBhQm9vbGVhbikgewotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYm9vbGVhbkNsYXNzLmNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoYUJvb2xlYW4pOwotfQotLyoqCi0gKiBSZXR1cm4gYSBwcm94eSB0aGF0IHdyYXBzIHRoZSBJbnRlZ2VyIGFyZ3VtZW50Ci0gKi8KLXB1YmxpYyBJSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKEludGVnZXIgYW5JbnRlZ2VyKSB7Ci0KLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmludGVnZXJDbGFzcy5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KGFuSW50ZWdlcik7Ci19Ci0vKioKLSAqIGNyZWF0ZUJlYW5Qcm94eVdpdGggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoTnVtYmVyIGFOdW1iZXIpIHsKLQlSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgdHlwZSA9IChSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFOdW1iZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCXJldHVybiB0eXBlLmNyZWF0ZU51bWJlckJlYW5Qcm94eShhTnVtYmVyKTsKLX0KLS8qKgotICogUmV0dXJuIGEgcHJveHkgZm9yIHRoZSBhcmd1bWVudAotICovCi1wdWJsaWMgSVN0cmluZ0JlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKFN0cmluZyBhU3RyaW5nKSB7Ci0KLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnN0cmluZ0NsYXNzLmNyZWF0ZVN0cmluZ0JlYW5Qcm94eShhU3RyaW5nKTsKLQotfQotLyoqCi0gKiBSZXR1cm4gYSBwcm94eSBmb3IgdGhlIGFyZ3VtZW50Ci0gKi8KLXB1YmxpYyBJQ2hhcmFjdGVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoQ2hhcmFjdGVyIGFDaGFyYWN0ZXIpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhcmFjdGVyQ2xhc3MuY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KGFDaGFyYWN0ZXIpOwotCi19Ci0vKioKLSAqIGNyZWF0ZUJlYW5Qcm94eVdpdGggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGJvb2xlYW4gYVByaW1pdGl2ZUJvb2xlYW4pIHsKLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJvb2xlYW5UeXBlLmNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoYVByaW1pdGl2ZUJvb2xlYW4pOwotfQotCi0vKioKLSAqIENyZWF0ZSBhbiBhcnJheSBiZWFuIHByb3h5LgotICoKLSAqICAgLSAoaW50LCBuZXcgaW50WzJdIHszLCA0fSkgd2lsbCBjcmVhdGU6Ci0gKiAgICAgIGludCBbM10gWzRdCi0gKgotICogICAtIChpbnRbXSwgbmV3IGludFsxXSB7MX0pCi0gKiAgICAgIGludCBbMV0KLSAqCi0gKiAgIC0gKGludFtdLCBuZXcgaW50WzJdIHsyLDN9KQotICogICAgICBpbnQgWzJdIFszXQotICogCi0gKgotICogICAtIChpbnRbXSwgbnVsbCkgb3IgKGludFtdLCBuZXcgaW50WzBdKSBvciAoaW50LCBudWxsKSBvciAoaW50LCBuZXcgaW50WzBdKQotICogICAgICBpbnQgWzBdLi4uCi0gKiAgICAgb3IKLSAqICAgICAoaW50W11bXS4uLiwgbnVsbCkgb3IgKGludFtdW10uLi4sIG5ldyBpbnRbMF0pCi0gKiAgICAgIGludFswXVtdLi4uCi0gKiAgICAgVGhpcyBpcyBiZWNhdXNlIGFuIGFycmF5IGluc3RhbmNlIHdpdGggbm8gc3BlY2lmaWVkIGRpbWVuc2lvbnMgaXMgbm90IHZhbGlkLiAKLSAqCi0gKiAgIC0gKGludFtdW10sIG5ldyBpbnRbMV0gezN9KQotICogICAgICBpbnRbM11bXQotICovCi1wdWJsaWMgSUFycmF5QmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoSUJlYW5UeXBlUHJveHkgdHlwZSwgaW50W10gZGltZW5zaW9ucykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQlpZiAodHlwZS5pc0FycmF5KCkpCi0JCXJldHVybiAoKFJFTUFycmF5QmVhblR5cGVQcm94eSkgdHlwZSkuY3JlYXRlQmVhblByb3h5V2l0aChkaW1lbnNpb25zKTsJLy8gQWxyZWFkeSBhbiBhcnJheSB0eXBlLCBqdXN0IHBhc3MgaXQgb24uCi0JZWxzZSB7Ci0JCS8vIEl0IGlzIG5vdCBhbiBhcnJheSB0eXBlLCBzbyB3ZSBuZWVkIHRvIGdldCBhbiBhcnJheSBvZiB0aGlzIHR5cGUgYW5kIGRpbWVuc2lvbnMuCi0JCVJFTUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoUkVNQXJyYXlCZWFuVHlwZVByb3h5KSBmQmVhblR5cGVQcm94eUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSh0eXBlLmdldFR5cGVOYW1lKCksIGRpbWVuc2lvbnMubGVuZ3RoKTsKLQkJcmV0dXJuIGFycmF5VHlwZS5jcmVhdGVCZWFuUHJveHlXaXRoKGRpbWVuc2lvbnMpOwotCX0KLX0KLS8qKgotICogQ3JlYXRlIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5LiAKLSAqIFRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZSBhcyBjYWxsaW5nIAotICogICBjcmVhdGVCZWFuUHJveHlXaXRoKElCZWFuVHlwZVByb3h5IHR5cGUsIG5ldyBpbnRbMV0ge3h9KQotICogd2hlcmUgJ3gnIGlzIHRoZSB2YWx1ZSBwYXNzZWQgaW4gYXMgdGhlIGRpbWVuc2lvbi4KLSAqLwotcHVibGljIElBcnJheUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKElCZWFuVHlwZVByb3h5IHR5cGUsIGludCBkaW1lbnNpb24pIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JcmV0dXJuIGNyZWF0ZUJlYW5Qcm94eVdpdGgodHlwZSwgbmV3IGludFtdIHtkaW1lbnNpb259KTsKLX0KLQotLyoqCi0gKiBSZXRyaWV2ZSB0aGUgcHJveHkgZnJvbSB0aGUgbWFwcGluZyB0YWJsZS4gSGFuZGxlIGFscmVhZHkgR0MnZC4KLSAqIElmIHRoaXMgcmV0dXJucyBudWxsLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgY2FsbGVyIHRyaWVzIHRvIHJlY3JlYXRlCi0gKiBpdCBzaW5jZSB0aGUgaWQgaXMgc3RpbGwgdmFsaWQgb24gdGhlIHNlcnZlci4KLSAqLwotcHJpdmF0ZSBJQmVhblByb3h5IHJldHJpZXZlUHJveHkoSW50ZWdlciBvYmplY3RJRCwgYm9vbGVhbiBpbmNyZW1lbnRVc2VDbnQpIHsKLQlzeW5jaHJvbml6ZWQgKGZJRFRvUHJveGllc01hcCkgewotCQlQcm94eVJlZiByZWYgPSAoUHJveHlSZWYpIGZJRFRvUHJveGllc01hcC5nZXQob2JqZWN0SUQpOwotCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCU9iamVjdCBicCA9IHJlZi5nZXQoKTsJCQkKLQkJCWlmIChyZWYuaXNFbnF1ZXVlZCgpIHx8IGJwID09IG51bGwpIHsKLQkJCQkvLyBJdCdzIHdhaXRpbmcgdG8gYmUgcmVtb3ZlZCwgb3IgaGFzIGJlZW4gcmVtb3ZlZC4gaS5lLiBHQydkLCBzbyBqdXN0IHJlbW92ZSBpdCBmcm9tIHRoZSBtYXAsIG5leHQgcHJvY2Vzc1F1ZXVlIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIHF1ZXVlLgotCQkJCWZJRFRvUHJveGllc01hcC5yZW1vdmUob2JqZWN0SUQpOwotCQkJCXJlZi5jbGVhcigpOwkJLy8gVGhpcyBpcyBzbyB0aGF0IHdoZW4gdGhlIHByb2Nlc3NRdWV1ZSBzZWUncyBpdCwgCi0JCQkJCQkJLy8gaXQgd29uJ3Qgc2VuZCBhIHJlbGVhc2UgcmVxdWVzdCB0byB0aGUgc2VydmVyIAotCQkJCQkJCS8vIHNpbmNlIGl0IHdpbGwgYmUgcmVjcmVhdGVkIHdoZW4gdGhpcyBtZXRob2QgcmV0dXJucy4KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGluY3JlbWVudFVzZUNudCkKLQkJCQkJcmVmLmluY3JVc2VDbnQoKTsKLQkJCQlyZXR1cm4gKElCZWFuUHJveHkpIGJwOwotCQkJfQkKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLS8qKgotICogU3RhcnQgVHJhbnNhY3Rpb246IER1cmluZyB0aGUgdGltZSBiZXR3ZWVuIHN0YXJ0L3N0b3AgdHJhbnNhY3Rpb24sCi0gKiBwcm94aWVzIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAuIFRoaXMgcHJldmVudHMgdGhlIGNhc2Ugb2YgYSB0d28gc3RlcAotICogdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHJldHVybmVkIElEIGZyb20gdGhlIHJlbW90ZSB2bSBpcyBmb3IgYSBwcm94eQotICogdGhhdCBpcyBhYm91dCB0byBiZSBjbGVhbmVkIHVwLCBhbmQgdGhlbiBoYXZpbmcgdGhhdCBwcm94eSBkaXNhcHBlYXIKLSAqIHdoZW4gZ29pbmcgZm9yIHRoZSBkYXRhIGZvciBpdC4KLSAqIAotICogTm90ZTogSXQgaXMgSU1QRVJJVElWRSB0aGF0IHRoZSBzdGFydC9zdG9wIGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6Ci0gKiAgICAgZmFjdG9yeS5zdGFydFRyYW5zYWN0aW9uKCk7Ci0gKiAgICAgdHJ5IHsKLSAqICAgICAgICAgZG8geW91ciBzdHVmZi4uLgotICogICAgIH0gZmluYWxseSB7Ci0gKiAgICAgICAgIGZhY3Rvcnkuc3RvcFRyYW5zYWN0aW9uKCk7Ci0gKiAgICAgfQotICogCi0gKiBUaGlzIHdheSBpdCBjYW4gbmV2ZXIgYWNjaWRlbnRseSBsZWF2ZSBpdCBpbiBhIGxvY2tlZCBzdGF0ZS4KLSAqLwotcHVibGljCXZvaWQgc3RhcnRUcmFuc2FjdGlvbigpICB7Ci0Jc3luY2hyb25pemVkIChmSURUb1Byb3hpZXNNYXApIHsKLQkJdHJhbnNhY3Rpb25Mb2NrQ291bnQrKzsKLQl9Ci19Ci0KLXB1YmxpYyBib29sZWFuIGluVHJhbnNhY3Rpb24oKSB7Ci0Jc3luY2hyb25pemVkIChmSURUb1Byb3hpZXNNYXApIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uTG9ja0NvdW50ICE9IDA7Ci0JfQotfQotCi0vKioKLSAqIFN0b3AgVHJhbnNhY3Rpb246IER1cmluZyB0aGUgdGltZSBiZXR3ZWVuIHN0YXJ0L3N0b3AgdHJhbnNhY3Rpb24sCi0gKiBwcm94aWVzIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAuIFRoaXMgcHJldmVudHMgdGhlIGNhc2Ugb2YgYSB0d28gc3RlcAotICogdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHJldHVybmVkIElEIGZyb20gdGhlIHJlbW90ZSB2bSBpcyBmb3IgYSBwcm94eQotICogdGhhdCBpcyBhYm91dCB0byBiZSBjbGVhbmVkIHVwLCBhbmQgdGhlbiBoYXZpbmcgdGhhdCBwcm94eSBkaXNhcHBlYXIKLSAqIHdoZW4gZ29pbmcgZm9yIHRoZSBkYXRhIGZvciBpdC4KLSAqIAotICogTm90ZTogSXQgaXMgSU1QRVJJVElWRSB0aGF0IHRoZSBzdGFydC9zdG9wIGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6Ci0gKiAgICAgZmFjdG9yeS5zdGFydFRyYW5zYWN0aW9uKCk7Ci0gKiAgICAgdHJ5IHsKLSAqICAgICAgICAgZG8geW91ciBzdHVmZi4uLgotICogICAgIH0gZmluYWxseSB7Ci0gKiAgICAgICAgIGZhY3Rvcnkuc3RvcFRyYW5zYWN0aW9uKCk7Ci0gKiAgICAgfQotICogCi0gKiBUaGlzIHdheSBpdCBjYW4gbmV2ZXIgYWNjaWRlbnRseSBsZWF2ZSBpdCBpbiBhIGxvY2tlZCBzdGF0ZS4KLSAqLwotcHVibGljCXZvaWQgc3RvcFRyYW5zYWN0aW9uKCkgIHsKLQlzeW5jaHJvbml6ZWQgKGZJRFRvUHJveGllc01hcCkgewotCQlpZiAoLS10cmFuc2FjdGlvbkxvY2tDb3VudCA8IDApCi0JCQl0cmFuc2FjdGlvbkxvY2tDb3VudCA9IDA7CS8vIFNob3VsZG4ndCBvY2N1ciwgYnV0IGp1c3QgaW4gY2FzZS4KLQl9Ci19Ci0KLS8qKgotICogVGVybWluYXRlIHRoZSBmYWN0b3J5LiBJZiB0aGlzIGlzIGJlaW5nIHRlcm1pbmF0ZWQsIHRoZW4gdGhlIHNlcnZlciBpcyBiZWluZyB0ZXJtaW5hdGVkIHRvby4KLSAqIFNvIGp1c3QgZ28gdGhyb3VnaCBhbGwgb2YgdGhlIHByb3hpZXMgYW5kIHJlbGVhc2UgdGhlbSwgYnV0IGRvbid0IHNlbmQgYW55IG5vdGlmaWNhdGlvbiB0bwotICogdGhlIHNlcnZlciBzaW5jZSB0aGUgc2VydmVyIGlzIHN1YnNlcXVlbnRseSBqdXN0IGdvaW5nIHRvIHRocm93IHRoZW0gYXdheSB3aGVuIGl0IHRlcm1pbmF0ZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2FuJ3QgcnVuIGFzeW5jLCBzbyB3YWl0IGlzIGEgc3VnZ2VzdGlvbiBoZXJlLgotICovCi1wdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCXN5bmNocm9uaXplZCAoZklEVG9Qcm94aWVzTWFwKSB7Ci0JCUl0ZXJhdG9yIGl0ciA9IGZJRFRvUHJveGllc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJUHJveHlSZWYgcmVmID0gKFByb3h5UmVmKSBpdHIubmV4dCgpOwotCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGJwID0gcmVmLmdldCgpOwotCQkJCS8vIElmIG5vdCBjbGVhbmVkIHVwIGFuZCBub3QgZW5xdWV1ZWQsIHJlbGVhc2UgaXQuCi0JCQkJaWYgKGJwICE9IG51bGwgJiYgIXJlZi5pc0VucXVldWVkKCkpCi0JCQkJCSgoSVJFTUJlYW5Qcm94eSkgYnApLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJZklEVG9Qcm94aWVzTWFwLmNsZWFyKCk7Ci0JCXF1ZXVlID0gbnVsbDsJLy8gRG9uJ3QgYm90aGVyIHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBkb24ndCBuZWVkIHRvIG5vdy4KLQl9Ci19Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSNjcmVhdGVFeHByZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgSUV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBSRU1FeHByZXNzaW9uKHRoaXMuZlJlZ2lzdHJ5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5I2NyZWF0ZUJlYW5Qcm94eUZyb20oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlGcm9tKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGNyZWF0ZUJlYW5Qcm94eShmQmVhblR5cGVQcm94eUZhY3Rvcnkudm9pZFR5cGUsIGluaXRpYWxpemF0aW9uU3RyaW5nKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSNjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkoSUJlYW5Qcm94eSBub25QcmltaXRpdmVQcm94eSkgewotCQlpZiAobm9uUHJpbWl0aXZlUHJveHkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIW5vblByaW1pdGl2ZVByb3h5LmlzVmFsaWQoKSkKLQkJCXJldHVybiBub25QcmltaXRpdmVQcm94eTsKLQkJSVJFTUJlYW5UeXBlUHJveHkgdHlwZSA9IChJUkVNQmVhblR5cGVQcm94eSkgbm9uUHJpbWl0aXZlUHJveHkuZ2V0VHlwZVByb3h5KCk7Ci0JCS8vIFN0ZXAgaW50byB0aGUgaW50ZXJuYWxzLiBUaGUgSUQgaXMgYSBjb25zdGFudCBpbnQsIHNvIHdlIGNhbiB1c2UgYSBzd2l0Y2ggc3RtdC4KLQkJc3dpdGNoICh0eXBlLmdldElEKCkuaW50VmFsdWUoKSkgewotCQkJY2FzZSBDb21tYW5kcy5CT09MRUFOX0NMQVNTOgotCQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJQm9vbGVhbkJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCWNhc2UgQ29tbWFuZHMuQllURV9DTEFTUzoKLQkJCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmJ5dGVWYWx1ZSgpKTsKLQkJCWNhc2UgQ29tbWFuZHMuQ0hBUkFDVEVSX0NMQVNTOgotCQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJQ2hhcmFjdGVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuY2hhclZhbHVlKCkpOwotCQkJY2FzZSBDb21tYW5kcy5ET1VCTEVfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5kb3VibGVWYWx1ZSgpKTsKLQkJCWNhc2UgQ29tbWFuZHMuRkxPQVRfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5mbG9hdFZhbHVlKCkpOwotCQkJY2FzZSBDb21tYW5kcy5JTlRFR0VSX0NMQVNTOgotCQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuaW50VmFsdWUoKSk7Ci0JCQljYXNlIENvbW1hbmRzLkxPTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5sb25nVmFsdWUoKSk7Ci0JCQljYXNlIENvbW1hbmRzLlNIT1JUX0NMQVNTOgotCQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuc2hvcnRWYWx1ZSgpKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5vblByaW1pdGl2ZVByb3h5OwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXRJVk1TZXJ2ZXJQcm94eSgpIHsKLQkJcmV0dXJuIHZtU2VydmVyUHJveHk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjU4NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi0vKgotICogICRSQ1NmaWxlOiBSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE2ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLk1hcFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRFcnJvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBXZSBhcmUgYSBiZWFuVHlwZVByb3h5RmFjdG9yeSBmb3IgY3JlYXRpbmcgUkVNQmVhblR5cGVQcm94eSBvYmplY3RzIFByaW1pdGl2ZSB0eXBlcyBhcyB3ZWxsIGFzIGNvbW1vbiB0eXBlcyBsaWtlIFN0cmluZyBhcmUgY2FjaGVkIGZvciBzcGVlZCBvZgotICogbG9va3VwLiBXZSBhcmUgdGhlIHN0YW5kYXJkIG9uZSB0aGF0IHRoZSBWQ0UgdXNlcy4gQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjozMjo0OCBQTSkKLSAqIAotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgaW1wbGVtZW50cyBJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZkZhY3RvcnlSZWdpc3RyeTsKLQotCXByb3RlY3RlZCBSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgZkJlYW5GYWN0b3J5OwotCi0JLy8gSGFzaHRhYmxlIHRvIGNhY2hlIHByb3hpZXMgZm9yIGNsYXNzZXMgc28gdGhleSBhcmUgZm91bmQgb24gc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGxvb2t1cHMKLQlwcm90ZWN0ZWQgTWFwIGZCZWFuUHJveGllcyA9IG5ldyBIYXNoTWFwKDEwMDApOwotCi0JLy8gQSBDYWNoZSBvZiBiZWFuIHR5cGUgcHJveGllcyB0aGF0IHNob3VsZCBub3QgZXZlciBiZSByZWxlYXNlZC4gVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBvbmVzCi0JLy8gdGhhdCB3ZSBjcmVhdGUgaGVyZS4gVGhleSBhcmUgbmV2ZXIgcmVsZWFzZWQgYmVjYXVzZSB0aGV5IHdvdWxkbid0IGJlIGNvcnJlY3RseSByZS1jcmVhdGVkCi0JLy8gaWYgdGhleSB3ZXJlLiBBbHNvIHRoZXkgYXJlIHN0YW5kYXJkIG9uZXMgd2l0aCBzdGFuZGFyZCBJRCdzIHRoYXQgZG9uJ3QgY2hhbmdlIHNvIHRoZXkKLQkvLyBkb24ndCBuZWVkIHRvIGJlIHJlLWNyZWF0ZWQgbGF0ZXIuCi0JcHJvdGVjdGVkIFNldCBmUGVybWFuZW50UHJveGllcyA9IG5ldyBIYXNoU2V0KDMwKTsKLQotCS8vIENhY2hlIG9mIHJlcXVlc3RlZCBidXQgbm90IGZvdW5kIGJlYW4gdHlwZXMuIElmIG5vdCBtYWludGFpbmluZyB0aGUgbGlzdCwgdGhpcyB2YXJpYWJsZSB3aWxsIGJlIG51bGwuCi0JLy8gVGhlIHZhbHVlcyBhcmUgc3RyaW5ncyAoY2xhc3NuYW1lcyBpbiBKTkkgZm9ybWF0KS4KLQlwcm90ZWN0ZWQgU2V0IGZOb3RGb3VuZFR5cGVzID0gbnVsbDsKLQotCS8vIENhY2hlZCBjb3B5IG9mIGEgZmV3IHR5cGljYWwgYmVhbiB0eXBlIHByb3hpZXMuCi0JUkVNQmVhblR5cGVQcm94eSBvYmplY3RDbGFzczsKLQotCVJFTUNsYXNzQmVhblR5cGVQcm94eSBjbGFzc0NsYXNzOwotCi0JUkVNVm9pZEJlYW5UeXBlUHJveHkgdm9pZFR5cGU7Ci0KLQlSRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkgYm9vbGVhblR5cGU7Ci0KLQlSRU1Cb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5IGJvb2xlYW5DbGFzczsKLQotCVJFTUludGVnZXJUeXBlQmVhblR5cGVQcm94eSBpbnRUeXBlOwotCi0JUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eSBpbnRlZ2VyQ2xhc3M7Ci0KLQlSRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkgYnl0ZVR5cGU7Ci0KLQlSRU1CeXRlQ2xhc3NCZWFuVHlwZVByb3h5IGJ5dGVDbGFzczsKLQotCVJFTVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5IHNob3J0Q2xhc3M7Ci0KLQlSRU1TaG9ydFR5cGVCZWFuVHlwZVByb3h5IHNob3J0VHlwZTsKLQotCVJFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkgbG9uZ0NsYXNzOwotCi0JUkVNTG9uZ1R5cGVCZWFuVHlwZVByb3h5IGxvbmdUeXBlOwotCi0JUkVNRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5IGRvdWJsZUNsYXNzOwotCi0JUkVNRG91YmxlVHlwZUJlYW5UeXBlUHJveHkgZG91YmxlVHlwZTsKLQotCVJFTUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5IGZsb2F0Q2xhc3M7Ci0KLQlSRU1GbG9hdFR5cGVCZWFuVHlwZVByb3h5IGZsb2F0VHlwZTsKLQotCVJFTUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5IGJpZ0RlY2ltYWxDbGFzczsKLQotCVJFTUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5IGJpZ0ludGVnZXJDbGFzczsKLQotCVJFTUNoYXJhY3RlclR5cGVCZWFuVHlwZVByb3h5IGNoYXJUeXBlOwotCi0JUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5IGNoYXJhY3RlckNsYXNzOwotCi0JUkVNU3RyaW5nQmVhblR5cGVQcm94eSBzdHJpbmdDbGFzczsKLQotCS8qKgotCSAqIEF2YWlsYWJsZSB0byBhbGwgUkVNIGJlYW50eXBlcy4KLQkgKi8KLQlwdWJsaWMgUkVNUHJveHlDb25zdGFudHMgcHJveHlDb25zdGFudHM7Ci0KLQkvKioKLQkgKiBJREVCZWFuVHlwZVByb3h5RmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCVJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWZGYWN0b3J5UmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWFSZWdpc3RyeS5yZWdpc3RlckJlYW5UeXBlUHJveHlGYWN0b3J5KHRoaXMpOwotCi0JCXByb3h5Q29uc3RhbnRzID0gbmV3IFJFTVByb3h5Q29uc3RhbnRzKGFSZWdpc3RyeSk7Ci0KLQkJLy8gTm93IGluaXRpYWxpemUgdGhlIGNhY2hlLgotCQlvYmplY3RDbGFzcyA9IG5ldyBSRU1CZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLk9CSkVDVF9DTEFTUyksIE9iamVjdC5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQljbGFzc0NsYXNzID0gbmV3IFJFTUNsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBvYmplY3RDbGFzcyk7Ci0JCXZvaWRUeXBlID0gbmV3IFJFTVZvaWRCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCQlib29sZWFuVHlwZSA9IG5ldyBSRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JCWJvb2xlYW5DbGFzcyA9IG5ldyBSRU1Cb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG9iamVjdENsYXNzKTsKLQkJSUJlYW5UeXBlUHJveHkgbnVtYmVyQ2xhc3MgPSBvYmplY3RDbGFzcy5uZXdCZWFuVHlwZUZvckNsYXNzKG5ldyBJbnRlZ2VyKENvbW1hbmRzLk5VTUJFUl9DTEFTUyksIE51bWJlci5jbGFzcy5nZXROYW1lKCksIHRydWUpOwotCQlpbnRUeXBlID0gbmV3IFJFTUludGVnZXJUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJaW50ZWdlckNsYXNzID0gbmV3IFJFTUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQlieXRlVHlwZSA9IG5ldyBSRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JCWJ5dGVDbGFzcyA9IG5ldyBSRU1CeXRlQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG51bWJlckNsYXNzKTsKLQkJc2hvcnRUeXBlID0gbmV3IFJFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JCXNob3J0Q2xhc3MgPSBuZXcgUkVNU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQlsb25nVHlwZSA9IG5ldyBSRU1Mb25nVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JCWxvbmdDbGFzcyA9IG5ldyBSRU1Mb25nQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG51bWJlckNsYXNzKTsKLQkJZG91YmxlVHlwZSA9IG5ldyBSRU1Eb3VibGVUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJZG91YmxlQ2xhc3MgPSBuZXcgUkVNRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG51bWJlckNsYXNzKTsKLQkJZmxvYXRUeXBlID0gbmV3IFJFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JCWZsb2F0Q2xhc3MgPSBuZXcgUkVNRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQliaWdEZWNpbWFsQ2xhc3MgPSBuZXcgUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQliaWdJbnRlZ2VyQ2xhc3MgPSBuZXcgUkVNQmlnSW50ZWdlckJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQljaGFyVHlwZSA9IG5ldyBSRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJY2hhcmFjdGVyQ2xhc3MgPSBuZXcgUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG9iamVjdENsYXNzKTsKLQkJc3RyaW5nQ2xhc3MgPSBuZXcgUkVNU3RyaW5nQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBvYmplY3RDbGFzcyk7Ci0JCUlCZWFuVHlwZVByb3h5IHRocm93YWJsZUNsYXNzID0gbmV3IFJFTVRocm93YWJsZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuVEhST1dBQkxFX0NMQVNTKSwgVGhyb3dhYmxlLmNsYXNzCi0JCQkJLmdldE5hbWUoKSwgb2JqZWN0Q2xhc3MpOwotCQlJQmVhblR5cGVQcm94eSB0aHJlYWRDbGFzcyA9IG9iamVjdENsYXNzLm5ld0JlYW5UeXBlRm9yQ2xhc3MobmV3IEludGVnZXIoQ29tbWFuZHMuVEhSRUFEX0NMQVNTKSwgVGhyZWFkLmNsYXNzLmdldE5hbWUoKSwgZmFsc2UpOwotCQlJQmVhblR5cGVQcm94eSBleHByZXNzaW9uUHJvY2Vzc29yQ29udHJvbGxlckNsYXNzID0gb2JqZWN0Q2xhc3MubmV3QmVhblR5cGVGb3JDbGFzcyhuZXcgSW50ZWdlcihDb21tYW5kcy5FWFBSRVNTSU9OUFJPQ0VTU0VSQ09OVFJPTExFUl9DTEFTUyksICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSB0aGUgaGFzaHRhYmxlIHdpdGggdGhlIHByaW1pdGl2ZXMsIHRoZWlyIGxhbmcgZXF1aXZhbGVudHMsIGFuZCBhbHNvIGNvbW1vbiBjbGFzc2VzIGxpa2UgU3RyaW5nCi0KLQkJLy8gUHJpbWl0aXZlcwotCQlmQmVhblByb3hpZXMucHV0KHZvaWRUeXBlLmdldFR5cGVOYW1lKCksIHZvaWRUeXBlKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChpbnRUeXBlLmdldFR5cGVOYW1lKCksIGludFR5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGJvb2xlYW5UeXBlLmdldFR5cGVOYW1lKCksIGJvb2xlYW5UeXBlKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChjaGFyVHlwZS5nZXRUeXBlTmFtZSgpLCBjaGFyVHlwZSk7Ci0JCWZCZWFuUHJveGllcy5wdXQoYnl0ZVR5cGUuZ2V0VHlwZU5hbWUoKSwgYnl0ZVR5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KHNob3J0VHlwZS5nZXRUeXBlTmFtZSgpLCBzaG9ydFR5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGxvbmdUeXBlLmdldFR5cGVOYW1lKCksIGxvbmdUeXBlKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChmbG9hdFR5cGUuZ2V0VHlwZU5hbWUoKSwgZmxvYXRUeXBlKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChkb3VibGVUeXBlLmdldFR5cGVOYW1lKCksIGRvdWJsZVR5cGUpOwotCi0JCS8vIGphdmEubGFuZyBwcmltaXRpdmUgcGVlcnMKLQkJLy8gTm90ZSB0aGF0IHNwZWNpYWwgY2xhc3NlcyBhcmUgdXNlZCBmb3Igc29tZSBvZiB0aGVzZSB3aGljaCBhbGxvdyB0aGUgSURFIHRvIGdldCB0aGUKLQkJLy8gbGFuZyBvYmplY3RzIGZyb20gdGhlIG9iamVjdHMgdGhhdCBhcmUgaG9sZGluZyBwcm94aWVzCi0JCWZCZWFuUHJveGllcy5wdXQoaW50ZWdlckNsYXNzLmdldFR5cGVOYW1lKCksIGludGVnZXJDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoYm9vbGVhbkNsYXNzLmdldFR5cGVOYW1lKCksIGJvb2xlYW5DbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoY2hhcmFjdGVyQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgY2hhcmFjdGVyQ2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KGJ5dGVDbGFzcy5nZXRUeXBlTmFtZSgpLCBieXRlQ2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KHNob3J0Q2xhc3MuZ2V0VHlwZU5hbWUoKSwgc2hvcnRDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQobG9uZ0NsYXNzLmdldFR5cGVOYW1lKCksIGxvbmdDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoZmxvYXRDbGFzcy5nZXRUeXBlTmFtZSgpLCBmbG9hdENsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChkb3VibGVDbGFzcy5nZXRUeXBlTmFtZSgpLCBkb3VibGVDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoYmlnRGVjaW1hbENsYXNzLmdldFR5cGVOYW1lKCksIGJpZ0RlY2ltYWxDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoYmlnSW50ZWdlckNsYXNzLmdldFR5cGVOYW1lKCksIGJpZ0ludGVnZXJDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoc3RyaW5nQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgc3RyaW5nQ2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KHRocm93YWJsZUNsYXNzLmdldFR5cGVOYW1lKCksIHRocm93YWJsZUNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChvYmplY3RDbGFzcy5nZXRUeXBlTmFtZSgpLCBvYmplY3RDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoY2xhc3NDbGFzcy5nZXRUeXBlTmFtZSgpLCBjbGFzc0NsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChudW1iZXJDbGFzcy5nZXRUeXBlTmFtZSgpLCBudW1iZXJDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQodGhyZWFkQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgdGhyZWFkQ2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KGV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgZXhwcmVzc2lvblByb2Nlc3NvckNvbnRyb2xsZXJDbGFzcyk7Ci0KLQkJLy8gTWFyayB0aGVzZSBhcyBwZXJtYW5lbnQuCi0JCWZQZXJtYW5lbnRQcm94aWVzLmFkZEFsbChmQmVhblByb3hpZXMudmFsdWVzKCkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgQUZURVIgQmVhblByb3h5RmFjdG9yeSBoYXMgYmVlbiBjcmVhdGVkLiBUaGlzIGlzIFJFUVVJUkVEISBOT1RFOiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyB0aGF0IG9ubHkgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5Ci0JICogY2FuIGNhbGwgaXQgd2hlbiByZWFkeS4KLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkpIHsKLQkJZkJlYW5GYWN0b3J5ID0gcHJveHlGYWN0b3J5OwotCQlmQmVhbkZhY3RvcnkucmVnaXN0ZXJQcm94aWVzKGZCZWFuUHJveGllcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIGtub3cgd2UgZG9uJ3QgaGF2ZSB0aGUgY2xhc3MgcmVnaXN0ZXJlZCwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlIHByb3h5LiBXZSBoYXZlIGEgY29ubmVjdGlvbiBwYXNzZWQgaW4gYW5kIHdpbGwgcmV1c2UKLQkgKiBpdCBhcyBuZWNlc3NhcnkKLQkgKiAKLQkgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGJlIGNhbGxlZCBvbmx5IGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSVJFTUJlYW5UeXBlUHJveHkgY3JlYXRlQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUsIElSRU1Db25uZWN0aW9uIGNvbm5lY3Rpb24pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQotCQkvLyBXZSBkb24ndCBoYXZlIHRoZSBiZWFudHlwZSBwcm94eSwgc28gY3JlYXRlIGl0LgotCQlJUkVNQmVhblR5cGVQcm94eSBiZWFuVHlwZVByb3h5ID0gbnVsbDsKLQkJQ29tbWFuZHMuR2V0Q2xhc3NSZXR1cm4gcmV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldCA9IGdldENsYXNzUmV0dXJuKGNvbm5lY3Rpb24sIHR5cGVOYW1lKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZXApIHsKLQkJCS8vIFByaW50IG91dCB0aGUgdHJhY2UgYW5kIHJldHVybiBwcm94eSB3aXRoIGluaXQgZXJyb3IuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXApKTsgLy8kTk9OLU5MUy0xJAotCQkJSVJFTUJlYW5UeXBlUHJveHkgcHJveHkgPSBuZXcgUkVNSW5pdEVycm9yQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLkV4Y2VwdGlvbkVycm9yTXNnX0VYQ18sIG5ldyBPYmplY3RbXSB7IGVwLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIGVwLmdldFByb3h5TG9jYWxpemVkTWVzc2FnZSgpfSksIHR5cGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KHByb3h5LCBmYWxzZSk7Ci0JCQlyZXR1cm4gcHJveHk7Ci0JCX0KLQkJaWYgKHJldCA9PSBudWxsKSB7Ci0JCQlpZiAoZk5vdEZvdW5kVHlwZXMgIT0gbnVsbCkKLQkJCQlmTm90Rm91bmRUeXBlcy5hZGQodHlwZU5hbWUpOwotCQkJcmV0dXJuIG51bGw7IC8vIFRoZSBjbGFzcyBkb2Vzbid0IGV2ZW4gZXhpc3Qgb24gdGhlIHNlcnZlci4KLQkJfQotCi0JCWlmICh0eXBlTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkuCi0JCQlJUkVNQmVhblR5cGVQcm94eSBzdXBlclR5cGVQcm94eSA9IG51bGw7Ci0JCQlpZiAoIXJldC5pc0ludGVyZmFjZSAmJiByZXQuc3VwZXJDbGFzc25hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJCS8vIEdldCB0aGUgYmVhbnR5cGUgcHJveHkgb2YgdGhlIHN1cGVyY2xhc3MuCi0JCQkJc3VwZXJUeXBlUHJveHkgPSBnZXRCZWFuVHlwZVByb3h5KHJldC5zdXBlckNsYXNzbmFtZSwgY29ubmVjdGlvbik7Ci0JCQl9Ci0KLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuIFRoaXMgY2hlY2sgaXMgaGVyZSBpbiBjYXNlIHRoZQotCQkJLy8gZXh0ZW5zaW9uIGZhY3RvcnkgY2FuIGhhbmRsZSB0aGlzIGNsYXNzIGJ1dCBuZWVkcyB0aGUgaWQgZnJvbSB0aGUgc2VydmVyIHRvCi0JCQkvLyBjcmVhdGUgaXQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwYWNrYWdlSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgcGFja2FnZUluZGV4KTsKLQkJCQlJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkgcGFja2FnZUZhY3RvcnkgPSAoSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKHBhY2thZ2VOYW1lKTsKLQkJCQlpZiAocGFja2FnZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQliZWFuVHlwZVByb3h5ID0gcGFja2FnZUZhY3RvcnkuZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSwgbmV3IEludGVnZXIocmV0LmNsYXNzSUQpLCBzdXBlclR5cGVQcm94eSk7Ci0JCQkJCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsKLQkJCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCQkJCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJldC5pc0ludGVyZmFjZSkgewotCQkJCS8vIEludGVyZmFjZSBuZXZlciBoYXZlIGEgc3VwZXIgdHlwZSwgc28gd2Ugd2lsbCBjcmVhdGUgYSBzcGVjaWZpYyB0eXBlLgotCQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgUkVNSW50ZXJmYWNlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihyZXQuY2xhc3NJRCksIHR5cGVOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQXNrIHRoZSBzdXBlcnR5cGUKLQkJCQkvLyB0byBjcmVhdGUgYSBiZWFudHlwZSBwcm94eSBvZiB0aGUgc2FtZSBiZWFudHlwZSBwcm94eSBjbGFzcy4KLQkJCQkvLyBUaGlzIGlzIHNvIHRoYXQgYW55IHN1YmNsYXNzZXMgd2lsbCBnZXQgdGhlIHNhbWUgYmVhbnR5cGUgcHJveHkgY2xhc3MKLQkJCQkvLyBmb3IgaXQgaWYgaXQgaXMgc3BlY2lhbC4KLQkJCQlpZiAoc3VwZXJUeXBlUHJveHkgIT0gbnVsbCkKLQkJCQkJYmVhblR5cGVQcm94eSA9IHN1cGVyVHlwZVByb3h5Lm5ld0JlYW5UeXBlRm9yQ2xhc3MobmV3IEludGVnZXIocmV0LmNsYXNzSUQpLCB0eXBlTmFtZSwgcmV0LmlzQWJzdHJhY3QpOwotCQkJfQotCQl9IGVsc2UKLQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgUkVNQXJyYXlCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG5ldyBJbnRlZ2VyKHJldC5jbGFzc0lEKSwgdHlwZU5hbWUsIG9iamVjdENsYXNzKTsKLQotCQkvLyBDYWNoZSB0aGUgaW5zdGFuY2Ugc28gd2UgY2FuIHJlLXVzZSBpdCBhZ2FpbgotCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKQotCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJcmV0dXJuIGJlYW5UeXBlUHJveHk7Ci0JfQotCi0JLyoqCi0JICogVXNpbmcgdGhlIGhlbHBlciBjbGFzcyB0byBmaW5kIGEgY2xhc3MgYnkgbmFtZSwgdGhlbiBjcmVhdGUgdGhlIHByb3h5LgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRCZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEJlYW5UeXBlUHJveHkoTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZSh0eXBlTmFtZSksIChJUkVNQ29ubmVjdGlvbikgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gVHJ5IG9uY2UgbW9yZSAod2Ugd29uJ3QgaGF2ZSByZWNlaXZlZCByZWNvdmVyYWJsZSBleGNlcHRpb25zIGhlcmUsIHRoZXkgd2VyZSBhbHJlYWR5IGNhdWdodCBhbmQgaGFuZGxlZCkKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGdldEJlYW5UeXBlUHJveHkodHlwZU5hbWUsIChJUkVNQ29ubmVjdGlvbikgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGVBZ2FpbikgewotCQkJCS8vIEZhaWxlZCBhZ2Fpbi4KLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlQWdhaW4pKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0QmVhblR5cGVQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZVByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyB0eXBlTmFtZSkgewotCQl0eXBlTmFtZSA9IE1hcFR5cGVzLmdldEpOSUZvcm1hdE5hbWUodHlwZU5hbWUpOwotCQkvLyBTZWUgd2hldGhlciB3ZSBhbHJlYWR5IGhhdmUgdGhlIHByb3h5IGZvciB0aGUgYXJndW1lbnQgbmFtZQotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZVByb3h5ID0gKElQcm94eUJlYW5UeXBlKSBmQmVhblByb3hpZXMuZ2V0KHR5cGVOYW1lKTsKLQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkKLQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwotCQkKLQkJLy8gTm93IHNlZSBpZiBhbiBleHByZXNzaW9uIHByb3h5IGNhY2hlZC4KLQkJYmVhblR5cGVQcm94eSA9ICgoUkVNRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0QmVhblR5cGUodHlwZU5hbWUpOwotCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKQotCQkJcmV0dXJuIGJlYW5UeXBlUHJveHk7CQkKLQotCQkvLyBJZiBub3QgYW4gYXJyYXksIHRoZW4gc2VlIGlmIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiBtZWNoYW5pc20gY2FuIGZpbmQgaXQuCi0JCS8vIERvIHRoaXMgaGVyZSBzbyB0aGF0IGlmIGl0IGlzIGZvdW5kIGluIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiB3ZSB3b24ndCBuZWNlc3NhcmlseSBjcmVhdGUgYW4KLQkJLy8gZXh0cmEgY29ubmVjdGlvbiB3aGVuIG5vdCBuZWVkZWQuCi0JCWlmICh0eXBlTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkKLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwYWNrYWdlSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgcGFja2FnZUluZGV4KTsKLQkJCQlJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkgcGFja2FnZUZhY3RvcnkgPSAoSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKHBhY2thZ2VOYW1lKTsKLQkJCQlpZiAocGFja2FnZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQliZWFuVHlwZVByb3h5ID0gcGFja2FnZUZhY3RvcnkuZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSwgZXhwcmVzc2lvbik7Ci0JCQkJCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsKLQkJCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCQkJCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIE5lZWQgdG8gY3JlYXRlIHRoZSBleHByZXNzaW9uIHByb3h5IGZvciBpdC4KLQkJYmVhblR5cGVQcm94eSA9ICgoRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuY3JlYXRlQmVhblR5cGVFeHByZXNzaW9uUHJveHkodHlwZU5hbWUpOwotCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoYmVhblR5cGVQcm94eSwgZmFsc2UpOwotCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQotCX0KLQotCS8qKgotCSAqIE9uZSB0aGF0IGludGVybmFsbHkgYWxsb3dzIHRoYXQgd2UgYWxyZWFkeSBoYXZlIGEgY29ubmVjdGlvbiB0byB3b3JrIHdpdGguIElmIHRoZSBjb25uZWN0aW9uIGlzIG51bGwsIHRoZW4gb25lIHdpbGwgYmUgY3JlYXRlZC4KLQkgKiAKLQkgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgbnVsbCwgdGhlbiB3ZSBhcmUgaW4gYSB0cmFuc2FjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJUkVNQmVhblR5cGVQcm94eSBnZXRCZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSwgSVJFTUNvbm5lY3Rpb24gaW5Db25uZWN0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0KLQkJLy8gU2VlIHdoZXRoZXIgd2UgYWxyZWFkeSBoYXZlIHRoZSBwcm94eSBmb3IgdGhlIGFyZ3VtZW50IG5hbWUKLQkJSVByb3h5QmVhblR5cGUgYmVhblR5cGVQcm94eSA9IChJUHJveHlCZWFuVHlwZSkgZkJlYW5Qcm94aWVzLmdldCh0eXBlTmFtZSk7Ci0JCS8vIFNlZSBpZiB0aGVyZSBhbmQgcmVzb2x2ZWQsIGlmIHNvLCByZXR1cm4gaXQuIElmIG5vdCByZXNvbHZlZCwgdGhhdCBtZWFucyB3ZSBuZWVkIGl0IE5PVwotCQkvLyBzbyB3ZSBtdXN0IGdvIGZvciBpdC4gV2hlbiBmaW5hbGx5IHJlc29sdmVkIHRoZSBvcmlnaW5hbCBFeHByZXNzaW9uUHJveHkgd2lsbCBiZSBkZXJlZ2lzdGVyZWQgYW5kCi0JCS8vIHRoZSByZXNvbHZlZCBiZWFudHlwZXByb3h5IHdpbGwgYmUgaW4gaXRzIHBsYWNlLgotCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsICYmIGJlYW5UeXBlUHJveHkuaXNCZWFuUHJveHkoKSkgeyByZXR1cm4gKElSRU1CZWFuVHlwZVByb3h5KSBiZWFuVHlwZVByb3h5OyB9Ci0KLQkJLy8gSWYgbm90IGFuIGFycmF5LCB0aGVuIHNlZSBpZiB0aGUgcGFja2FnZSBleHRlbnNpb24gbWVjaGFuaXNtIGNhbiBmaW5kIGl0LgotCQkvLyBEbyB0aGlzIGhlcmUgc28gdGhhdCBpZiBpdCBpcyBmb3VuZCBpbiB0aGUgcGFja2FnZSBleHRlbnNpb24gd2Ugd29uJ3QgbmVjZXNzYXJpbHkgY3JlYXRlIGFuCi0JCS8vIGV4dHJhIGNvbm5lY3Rpb24gd2hlbiBub3QgbmVlZGVkLgotCQlpZiAodHlwZU5hbWUuY2hhckF0KDApICE9ICdbJykgewotCQkJLy8gSXQgaXMgbm90IGFuIGFycmF5Ci0JCQkvLyBGaXJzdCBjaGVjayB3aXRoIHRoZSBmYWN0b3J5IGZvciB0aGUgcGFja2FnZSBvZiB0aGUgY2xhc3MuCi0JCQkvLyBJbm5lciBjbGFzc2VzIGhhdmUgdG8gdXNlIHRoZSBkb2xsYXIgbm90YXRpb24gc2luY2UgaWYgdGhleSBkaWRuJ3Qgd2UgY291bGRuJ3QgdGVsbCB3aGVyZQotCQkJLy8gdGhlIHBhY2thZ2UgZW5kZWQgYW5kIHRoZSBjbGFzcyBzdGFydGVkLgotCQkJaW50IHBhY2thZ2VJbmRleCA9IHR5cGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAocGFja2FnZUluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIHBhY2thZ2VJbmRleCk7Ci0JCQkJSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5IHBhY2thZ2VGYWN0b3J5ID0gKElSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeUV4dGVuc2lvbihwYWNrYWdlTmFtZSk7Ci0JCQkJaWYgKHBhY2thZ2VGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJYmVhblR5cGVQcm94eSA9IHBhY2thZ2VGYWN0b3J5LmdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkodHlwZU5hbWUpOwotCQkJCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKSB7Ci0JCQkJCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoKElSRU1CZWFuVHlwZVByb3h5KSBiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCQkJCQlyZXR1cm4gKElSRU1CZWFuVHlwZVByb3h5KSBiZWFuVHlwZVByb3h5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSVJFTUNvbm5lY3Rpb24gY29ubmVjdCA9IGluQ29ubmVjdCAhPSBudWxsID8gaW5Db25uZWN0IDogZkZhY3RvcnlSZWdpc3RyeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQlpZiAoaW5Db25uZWN0ID09IG51bGwpCi0JCQlmQmVhbkZhY3Rvcnkuc3RhcnRUcmFuc2FjdGlvbigpOyAvLyBTdGFydCBhIHRyYW5zYXRpb24uCi0JCXRyeSB7Ci0JCQlyZXR1cm4gY3JlYXRlQmVhblR5cGVQcm94eSh0eXBlTmFtZSwgY29ubmVjdCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJaWYgKGluQ29ubmVjdCA9PSBudWxsKSB7Ci0JCQkJLy8gTmVlZCB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiwgbm90IHJldHVybiBpdC4KLQkJCQlmRmFjdG9yeVJlZ2lzdHJ5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQljb25uZWN0ID0gbnVsbDsgLy8gU28gdGhhdCBpdCB3b24ndCBiZSByZXR1cm5lZC4KLQkJCX0KLQkJCXRocm93IGU7IC8vIFBhc3MgaXQgb24gdXAKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbkNvbm5lY3QgPT0gbnVsbCkKLQkJCQlmQmVhbkZhY3Rvcnkuc3RvcFRyYW5zYWN0aW9uKCk7Ci0JCQlpZiAoaW5Db25uZWN0ID09IG51bGwgJiYgY29ubmVjdCAhPSBudWxsKQotCQkJCWZGYWN0b3J5UmVnaXN0cnkucmV0dXJuQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJfQotCX0KLQotCS8qCi0JICogSXQgaXMgaW1wb3J0YW50IHRoaXMgYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbW1hbmRzLkdldENsYXNzUmV0dXJuIGdldENsYXNzUmV0dXJuKElSRU1Db25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29ubmVjdGlvbi5nZXRDbGFzcyhjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJZkJlYW5GYWN0b3J5LnByb2Nlc3NFcnJvclJldHVybihlKTsgLy8gTGV0IHByb3h5IGZhY3RvcnkgaGFuZGxlIHRoZSBlcnJvciByZXR1cm4KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gQXJyYXkgdHlwZSBwcm94eSBmb3IgdGhlIGdpdmVuIGNsYXNzIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zLiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZC4gVGhlIHNhbWUgcmVzdWx0IGNhbiBiZSBnb3R0b24gZnJvbQotCSAqIGdldEJlYW5UeXBlUHJveHkuIGUuZy4gZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk9iamVjdCIsIDMpIGlzIHRoZSBzYW1lIGFzOiBnZXRCZWFuVHlwZVByb3h5KCJbW1tMamF2YS5sYW5nLk9iamVjdDsiKQotCSAqIAotCSAqIFRoZXkgYm90aCByZXN1bHQgaW4gYSB0eXBlIG9mOiBPYmplY3QgW11bXVtdCi0JICogCi0JICogb3IgZ2V0QmVhblR5cGVQcm94eSgiW0xqYXZhLmxhbmdPYmplY3Q7IiwgMykgYmVjb21lcyBPYmplY3QgW11bXVtdW10KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcgY29tcG9uZW50Q2xhc3NOYW1lLCBpbnQgZGltZW5zaW9ucykgewotCQlyZXR1cm4gZ2V0QmVhblR5cGVQcm94eShnZXRBcnJheUNsYXNzTmFtZShjb21wb25lbnRDbGFzc05hbWUsIGRpbWVuc2lvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3NOYW1lCi0JICogQHBhcmFtIGRpbWVuc2lvbnMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJyYXlDbGFzc05hbWUoU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpIHsKLQkJU3RyaW5nIGpuaUNvbXBvbmVudENsYXNzTmFtZSA9IE1hcFR5cGVzLmdldEpOSUZvcm1hdE5hbWUoY29tcG9uZW50Q2xhc3NOYW1lKTsKLQkJU3RyaW5nIGNvbXBUeXBlID0gam5pQ29tcG9uZW50Q2xhc3NOYW1lOwotCQlpZiAoam5pQ29tcG9uZW50Q2xhc3NOYW1lLmNoYXJBdCgwKSAhPSAnWycpIHsKLQkJCS8vIFdlJ3JlIG5vdCBhbHJlYWR5IGFuIGFycmF5LCBzbyBjcmVhdGUgY29ycmVjdCB0ZW1wbGF0ZS4KLQkJCWNvbXBUeXBlID0gKFN0cmluZykgTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLmdldChqbmlDb21wb25lbnRDbGFzc05hbWUpOwotCQkJaWYgKGNvbXBUeXBlID09IG51bGwpIHsKLQkJCQkvLyBJdCBpcyBhIGNsYXNzLCBhbmQgbm90IGEgdHlwZS4KLQkJCQljb21wVHlwZSA9ICJMIiArIGpuaUNvbXBvbmVudENsYXNzTmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQkvLyBOb3cgY3JlYXRlIGl0IHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiAnWycgaW4gZnJvbnQuCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGRpbWVuc2lvbnMgKyBjb21wVHlwZS5sZW5ndGgoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKQotCQkJYnVmZmVyLmFwcGVuZCgnWycpOwotCQlidWZmZXIuYXBwZW5kKGNvbXBUeXBlKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0QmVhblR5cGVQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSVByb3h5QmVhblR5cGUgZ2V0QmVhblR5cGVQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgY29tcG9uZW50Q2xhc3NOYW1lLCBpbnQgZGltZW5zaW9ucykgewotCQlyZXR1cm4gZ2V0QmVhblR5cGVQcm94eShleHByZXNzaW9uLCBnZXRBcnJheUNsYXNzTmFtZShjb21wb25lbnRDbGFzc05hbWUsIGRpbWVuc2lvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJlYW4gdHlwZSBwcm94eSBmcm9tIGEgY2xhc3MgaWQuIFRoaXMgbWVhbnMgdGhhdCBhIG5ldyBjbGFzcyBpZCB3YXMgc2VudCBiYWNrIGZyb20gdGhlIHNlcnZlciB0aGF0IHdlIGRvbid0IGhhdmUgeWV0LiBXZSBuZWVkIHRvIGdvIGFzawotCSAqIHRoZSBzZXJ2ZXIgZm9yIGluZm9ybWF0aW9uIG9uIHRoaXMgdHlwZSBzbyB0aGF0IHdlIGNhbiBjcmVhdGUgaXQuCi0JICogCi0JICogTk9URTogVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyB0aGF0IG9ubHkgdGhlIHN0YW5kYXJkIGJlYW4gcHJveHkgZmFjdG9yeSBjYW4gY2FsbCBpdC4KLQkgKiAKLQkgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGhhcyBiZWVuIGNhbGxlZCB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KLQkgKi8KLQlJUkVNQmVhblR5cGVQcm94eSBjcmVhdGVCZWFuVHlwZVByb3h5KEludGVnZXIgY2xhc3NJRCkgewotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJcmV0dXJuIGNyZWF0ZUJlYW5UeXBlUHJveHkoY2xhc3NJRCwgY29ubmVjdCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJLy8gSXQgaXMgcmVjb3ZlcmFibGUsIHByaW50IG1lc3NhZ2UsIGtlZXAgY29ubmVjdGlvbiBsaXZlIGFuZCByZXR1cm4gaXQuCi0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvLyBUcnkgYWdhaW4sIGNsb3NlIGNvbm5lY3Rpb24sIGdldCBhIG5ldyBvbmUuCi0JCQkJZkZhY3RvcnlSZWdpc3RyeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJY29ubmVjdCA9IGZGYWN0b3J5UmVnaXN0cnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gY3JlYXRlQmVhblR5cGVQcm94eShjbGFzc0lELCBjb25uZWN0KTsKLQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGVBZ2FpbikgewotCQkJCQkvLyBGYWlsZWQgYWdhaW4uIENsb3NlIGNvbm5lY3Rpb24sIGRvbid0IHJldHVybiBpdC4KLQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGVBZ2FpbikpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZGYWN0b3J5UmVnaXN0cnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY29ubmVjdCAhPSBudWxsKQotCQkJCWZGYWN0b3J5UmVnaXN0cnkucmV0dXJuQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIE9uZSB0aGF0IGludGVybmFsbHkgYWxsb3dzIHRoYXQgd2UgYWxyZWFkeSBoYXZlIGEgY29ubmVjdGlvbiB0byB3b3JrIHdpdGguIElmIHRoZSBjb25uZWN0aW9uIGlzIG51bGwsIHRoZW4gb25lIHdpbGwgYmUgY3JlYXRlZC4KLQkgKiAKLQkgKiBJdCBpcyBpbXBvcnRhbnQgdGhpcyBiZSBjYWxsZWQgb25seSBmcm9tIHdpdGhpbiBhIHRyYW5zYWN0aW9uLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIElSRU1CZWFuVHlwZVByb3h5IGNyZWF0ZUJlYW5UeXBlUHJveHkoSW50ZWdlciBjbGFzc0lELCBJUkVNQ29ubmVjdGlvbiBjb25uZWN0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCS8vIFdlIGRvbid0IGhhdmUgdGhlIGJlYW50eXBlIHByb3h5LCBzbyBjcmVhdGUgaXQuCi0JCUlSRU1CZWFuVHlwZVByb3h5IGJlYW5UeXBlUHJveHkgPSBudWxsOwotCi0JCUNvbW1hbmRzLkdldENsYXNzSURSZXR1cm4gcmV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldCA9IGdldENsYXNzSURSZXR1cm4oY29ubmVjdCwgY2xhc3NJRCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGVwKSB7Ci0JCQkvLyBKdXN0IHByaW50IG91dCB0aGUgdHJhY2UgYW5kIHJldHVybiBwcm94eSBub3QgZm91bmQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXApKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBJZiB0aGUgc2lnbmF0dXJlIGlzIHRoYXQgb2YgYSBjbGFzcy4KLQkJaWYgKHJldC5jbGFzc05hbWUuY2hhckF0KDApICE9ICdbJykgewotCQkJLy8gSXQgaXMgbm90IGFuIGFycmF5LgotCQkJSVJFTUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlUHJveHkgPSBudWxsOwotCQkJaWYgKCFyZXQuaXNJbnRlcmZhY2UgJiYgcmV0LnN1cGVyQ2xhc3NuYW1lLmxlbmd0aCgpICE9IDApIHsKLQkJCQkvLyBHZXQgdGhlIGJlYW50eXBlIHByb3h5IG9mIHRoZSBzdXBlcmNsYXNzLgotCQkJCXN1cGVyVHlwZVByb3h5ID0gZ2V0QmVhblR5cGVQcm94eShyZXQuc3VwZXJDbGFzc25hbWUsIGNvbm5lY3QpOwotCQkJfQotCi0JCQkvLyBGaXJzdCBjaGVjayB3aXRoIHRoZSBmYWN0b3J5IGZvciB0aGUgcGFja2FnZSBvZiB0aGUgY2xhc3MuCi0JCQkvLyBJbm5lciBjbGFzc2VzIGhhdmUgdG8gdXNlIHRoZSBkb2xsYXIgbm90YXRpb24gc2luY2UgaWYgdGhleSBkaWRuJ3Qgd2UgY291bGRuJ3QgdGVsbCB3aGVyZQotCQkJLy8gdGhlIHBhY2thZ2UgZW5kZWQgYW5kIHRoZSBjbGFzcyBzdGFydGVkLgotCQkJaW50IHBhY2thZ2VJbmRleCA9IHJldC5jbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwYWNrYWdlSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSByZXQuY2xhc3NOYW1lLnN1YnN0cmluZygwLCBwYWNrYWdlSW5kZXgpOwotCQkJCUlSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSBwYWNrYWdlRmFjdG9yeSA9IChJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24ocGFja2FnZU5hbWUpOwotCQkJCWlmIChwYWNrYWdlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCWJlYW5UeXBlUHJveHkgPSBwYWNrYWdlRmFjdG9yeS5nZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KHJldC5jbGFzc05hbWUsIGNsYXNzSUQsIHN1cGVyVHlwZVByb3h5KTsKLQkJCQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkgewotCQkJCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmV0LmlzSW50ZXJmYWNlKSB7Ci0JCQkJLy8gSW50ZXJmYWNlIG5ldmVyIGhhdmUgYSBzdXBlciB0eXBlLCBzbyB3ZSB3aWxsIGxldCB0aGUgb2JqZWN0IGNsYXNzIGRvIGl0IGZvciB1cy4KLQkJCQliZWFuVHlwZVByb3h5ID0gbmV3IFJFTUludGVyZmFjZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgY2xhc3NJRCwgcmV0LmNsYXNzTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEFzayB0aGUgYmVhbnR5cGUgcHJveHkgb2YgdGhlIHN1cGVyY2xhc3MKLQkJCQkvLyB0byBjcmVhdGUgYSBiZWFudHlwZSBwcm94eSBvZiB0aGUgc2FtZSBiZWFudHlwZSBwcm94eSBjbGFzcy4KLQkJCQkvLyBUaGlzIGlzIHNvIHRoYXQgYW55IHN1YmNsYXNzZXMgd2lsbCBnZXQgdGhlIHNhbWUgYmVhbnR5cGUgcHJveHkgY2xhc3MKLQkJCQkvLyBmb3IgaXQgaWYgaXQgaXMgc3BlY2lhbC4KLQkJCQlpZiAoc3VwZXJUeXBlUHJveHkgIT0gbnVsbCkKLQkJCQkJYmVhblR5cGVQcm94eSA9IHN1cGVyVHlwZVByb3h5Lm5ld0JlYW5UeXBlRm9yQ2xhc3MoY2xhc3NJRCwgcmV0LmNsYXNzTmFtZSwgcmV0LmlzQWJzdHJhY3QpOwotCQkJfQotCi0JCQkvLyBDYWNoZSB0aGUgaW5zdGFuY2Ugc28gd2UgY2FuIHJlLXVzZSBpdCBhZ2FpbgotCQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkKLQkJCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoYmVhblR5cGVQcm94eSwgZmFsc2UpOwotCQkJcmV0dXJuIGJlYW5UeXBlUHJveHk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdCBpcyBhbiBhcnJheS4KLQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgUkVNQXJyYXlCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIGNsYXNzSUQsIHJldC5jbGFzc05hbWUsIG9iamVjdENsYXNzKTsKLQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQkJfQotCX0KLQotCS8qCi0JICogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyBiZSBjYWxsZWQgb25seSBmcm9tIHdpdGhpbiBhIHRyYW5zYWN0aW9uLgotCSAqLwotCXByaXZhdGUgQ29tbWFuZHMuR2V0Q2xhc3NJRFJldHVybiBnZXRDbGFzc0lEUmV0dXJuKElSRU1Db25uZWN0aW9uIGNvbm5lY3Rpb24sIEludGVnZXIgY2xhc3NJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5IHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb25uZWN0aW9uLmdldENsYXNzRnJvbUlEKGNsYXNzSUQuaW50VmFsdWUoKSk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQlmQmVhbkZhY3RvcnkucHJvY2Vzc0Vycm9yUmV0dXJuKGUpOyAvLyBMZXQgcHJveHkgZmFjdG9yeSBoYW5kbGUgdGhlIGVycm9yIHJldHVybgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjcmVnaXN0ZXJCZWFuVHlwZVByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5LAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBib29sZWFuIHBlcm1hbmVudCkgewotCQlmQmVhblByb3hpZXMucHV0KGFCZWFuVHlwZVByb3h5LmdldFR5cGVOYW1lKCksIGFCZWFuVHlwZVByb3h5KTsKLQkJZkJlYW5GYWN0b3J5LnJlZ2lzdGVyUHJveHkoKElSRU1CZWFuUHJveHkpIGFCZWFuVHlwZVByb3h5KTsKLQkJaWYgKHBlcm1hbmVudCkKLQkJCWZQZXJtYW5lbnRQcm94aWVzLmFkZChhQmVhblR5cGVQcm94eSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNyZWdpc3RlckJlYW5UeXBlUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQmVhblR5cGVQcm94eShJUHJveHlCZWFuVHlwZSBhUHJveHlCZWFuVHlwZSwgZmluYWwgYm9vbGVhbiBwZXJtYW5lbnQpIHsKLQkJaWYgKGFQcm94eUJlYW5UeXBlLmlzQmVhblByb3h5KCkpCi0JCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoKElCZWFuVHlwZVByb3h5KSBhUHJveHlCZWFuVHlwZSwgcGVybWFuZW50KTsgLy8gQSByZWd1bGFyIGtpbmQsIGRvIHJlZ3VsYXIgcmVnaXN0cmF0aW9uLgotCQllbHNlIHsKLQkJCUV4cHJlc3Npb25Qcm94eSBiZWFuRXhwcmVzc2lvblByb3h5ID0gKChFeHByZXNzaW9uUHJveHkpIGFQcm94eUJlYW5UeXBlKTsKLQkJCWZpbmFsIFN0cmluZyB0eXBlTmFtZSA9IGFQcm94eUJlYW5UeXBlLmdldFR5cGVOYW1lKCk7Ci0JCQkoKFJFTUV4cHJlc3Npb24pIGJlYW5FeHByZXNzaW9uUHJveHkuZ2V0RXhwcmVzc2lvbigpKS5hZGRCZWFuVHlwZSh0eXBlTmFtZSwgYVByb3h5QmVhblR5cGUpOwotCQkJYmVhbkV4cHJlc3Npb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVN0cmluZyB0eXBlTmFtZSA9ICgoSVByb3h5QmVhblR5cGUpIGV2ZW50LmdldFNvdXJjZSgpKS5nZXRUeXBlTmFtZSgpOwotCQkJCQlzeW5jaHJvbml6ZWQgKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkudGhpcykgewotCQkJCQkJaWYgKCFmQmVhblByb3hpZXMuY29udGFpbnNLZXkodHlwZU5hbWUpKSB7Ci0JCQkJCQkJLy8gSXQgaGFzbid0IGJlZW4gcmVzb2x2ZWQgdGhyb3VnaCBzb21lIG90aGVyIG1lYW5zLiBTbyB0aGlzIGlzIGdvb2QuIEFjdHVhbGx5IHRoaXMgc2hvdWxkIG5ldmVyCi0JCQkJCQkJLy8gb2NjdXIgYmVjYXVzZSB1cG9uIHJlc29sdXRpb24gd2UndmUgYWxyZWFkeSByZWdpc3RlcmVkIHRoZSBiZWFuIHR5cGUgcHJveHkgdGhyb3VnaCB0aGUKLQkJCQkJCQkvLyBub3JtYWwgbWVjaGFuaXNtcy4gQnV0IHRvIGJlIHNhZmUsIHdlJ2xsIGRvIGl0IGhlcmUuCi0JCQkJCQkJZkJlYW5Qcm94aWVzLnB1dCh0eXBlTmFtZSwgZXZlbnQuZ2V0UHJveHkoKSk7Ci0JCQkJCQkJaWYgKHBlcm1hbmVudCkKLQkJCQkJCQkJZlBlcm1hbmVudFByb3hpZXMuYWRkKGV2ZW50LmdldFByb3h5KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJKChSRU1FeHByZXNzaW9uKSAoKEV4cHJlc3Npb25Qcm94eSkgZXZlbnQuZ2V0U291cmNlKCkpLmdldEV4cHJlc3Npb24oKSkucmVtb3ZlQmVhblR5cGUodHlwZU5hbWUpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBIGJlYW50eXBlIHByb3h5IGlzIGFza2VkIHRvIGJlIHJlbGVhc2VkLiBXZSBjYW4gb25seSByZWxlYXNlIG9uZXMgdGhhdCB3ZXJlIG5vdCBpbiB0aGUgcGVybWFuZW50IHNldCB0aGF0IHdlIGluaXRpYWxpemVkIHdpdGguIFRob3NlIGluIHRoZQotCSAqIHBlcm1hbmVudCBzZXQgY2FuJ3QgYmUgY2hhbmdlZCBzbyB3ZSBjYW4ndCByZWxlYXNlIHRoZW0uCi0JICogCi0JICogQW5zd2VyIHdoZXRoZXIgaXQgY2FuIGJlIHJlbGVhc2VkIGZyb20gdGhlIHNlcnZlciB0b28uCi0JICogCi0JICogTk9URTogUGFja2FnZSBwcm90ZWN0ZWQgc2luY2Ugb25seSBSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3Rvcnkgc2hvdWxkIGNhbGwgaXQuCi0JICovCi0JYm9vbGVhbiByZWxlYXNlUHJveHkoSUJlYW5UeXBlUHJveHkgcHJveHkpIHsKLQkJLyoqCi0JCSAqIEN1cnJlbnRseSB3ZSB3b24ndCBhbGxvdyBhbnkgYmVhbiB0eXBlIHByb3hpZXMgdG8gYmUgcmVsZWFzZWQuIFdlIGRvbid0IGhhdmUgYSBnb29kIHN0cmF0ZWd5IGZvciBoYW5kbGluZyB0aGF0IHRoZXJlIG1heSBiZSBoYXJkIHJlZnMgZnJvbQotCQkgKiBzdWJ0eXBlcy4gT25lIHRob3VnaHQgaXMgdGhhdCBiZWFucHJveGllcyB0YWJsZSBzaG91bGQgc3RvcmUgU29mdFJlZmVyZW5jZXMgc28gdGhhdCBvbmx5IHdoZW4gc3BhY2UgaXMgbmVlZGVkLCB0aGF0IGFueSBiZWFudHlwZSB0aGF0Ci0JCSAqIGRvZXNuJ3QgaGF2ZSBhIHN1YnR5cGUgKHNpbmNlIHN1YnR5cGVzIGhvbGQgYSBzdHJvbmcgcmVmKSBvciwgaXMgaW4gdGhlIHBlcm1hbmVudCB0YWJsZSAoc2luY2UgdGhhdCBpcyBoYXJkcmVmKSBjb3VsZCBiZSBHQydkLiBUaGVuIHdoYXQKLQkJICogd291bGQgaGFwcGVuIGlzIG9uIHJlbGVhc2VQcm94eSB3ZSBkb24ndCBhY3R1YWxseSByZWxlYXNlLCB3ZSBjaGFuZ2UgaXQgdG8gYSBXZWFrUmVmIHNvIHRoYXQgaXQgd291bGQgZGVmaW5pdGVseSBiZSByZWxlYXNlZCBvbiBhIEdDLiBUaGVzZQotCQkgKiBhcmUgY29tcGxpY2F0ZWQgYXJjaC4gYW5kIHdlJ3JlIG5vdCBzdXJlIGlmIGl0IHNob3VsZCBiZSBhbGxvd2VkIG9yIG5vdC4gU28gZm9yIG5vdywgd2UgZG9uJ3QgYWxsb3cgdGhlbSB0byBiZSByZWxlYXNlZC4gaWYKLQkJICogKCFmUGVybWFuZW50UHJveGllcy5jb250YWlucyhwcm94eSkpIHsgLy8gV2UgY2FuIHJlbGVhc2UgaXQuIEl0IGlzIG5vdCBvbmUgb2YgdGhlIHBlcm1hbmVudCBvbmVzLiBzeW5jaHJvbml6ZWQodGhpcykgewotCQkgKiBmQmVhblByb3hpZXMucmVtb3ZlKHByb3h5LmdldFR5cGVOYW1lKCkpOyByZXR1cm4gdHJ1ZTsgfSB9Ci0JCSAqLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBUZXJtaW5hdGUgdGhpcyBmYWN0b3J5LiBTaW5jZSBhbGwgb2YgdGhlIHByb3hpZXMgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlIHByb3h5IGZhY3RvcnksIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVsZWFzZSB0aGVtIGhlcmUuIFRoZXJlIGlzIG5vIG5lZWQKLQkgKiB0byBjbGVhciBvdXQgYW55IGZpZWxkcyBzaW5jZSB0aGlzIGZhY3Rvcnkgd2lsbCBub3QgYmUgaGVsZCBvbnRvIGJ5IGFueXRoaW5nIGFuZCBzbyBpdCB3aWxsIGJlIEdDJ2QuCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I2lzQmVhblR5cGVSZWdpc3RlcmVkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNCZWFuVHlwZVJlZ2lzdGVyZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gZkJlYW5Qcm94aWVzLmNvbnRhaW5zS2V5KE1hcFR5cGVzLmdldEpOSUZvcm1hdE5hbWUoY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNyZWdpc3RlcmVkVHlwZXMoKQotCSAqLwotCXB1YmxpYyBTZXQgcmVnaXN0ZXJlZFR5cGVzKCkgewotCQlyZXR1cm4gZkJlYW5Qcm94aWVzLmtleVNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjaXNCZWFuVHlwZU5vdEZvdW5kKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNCZWFuVHlwZU5vdEZvdW5kKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGZOb3RGb3VuZFR5cGVzICE9IG51bGwgJiYgZk5vdEZvdW5kVHlwZXMuY29udGFpbnMoTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShjbGFzc05hbWUpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I2lzTWFpbnRhaW5Ob3RGb3VuZFR5cGVzKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNNYWludGFpbk5vdEZvdW5kVHlwZXMoKSB7Ci0JCXJldHVybiBmTm90Rm91bmRUeXBlcyAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3Rvcnkjc2V0TWFpbnRhaW5Ob3RGb3VuZFR5cGVzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE1haW50YWluTm90Rm91bmRUeXBlcyhib29sZWFuIG1haW50YWluKSB7Ci0JCWlmIChtYWludGFpbikgewotCQkJaWYgKGZOb3RGb3VuZFR5cGVzID09IG51bGwpCi0JCQkJZk5vdEZvdW5kVHlwZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9IGVsc2UKLQkJCWZOb3RGb3VuZFR5cGVzID0gbnVsbDsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdHJpbmdCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RyaW5nQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYmE3MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdHJpbmdCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVN0cmluZ0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBSZW1vdGUgVk0gSW1wbGVtZW50YXRpb24gb2YgSVN0cmluZ0JlYW5Qcm94eQotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjQyIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNU3RyaW5nQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJU3RyaW5nQmVhblByb3h5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmU3RyaW5nOwotCi0vKioKLSAqIFN0b3JlIHRoZSBiZWFuIGluIHRoZSBzdHJpbmcgZmllbGQgdG8gc2F2ZSByZS1jYXN0aW5nIGVhY2ggdGltZSBpdCBpcyBhc2tlZCBmb3IuCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqLwotUkVNU3RyaW5nQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgU3RyaW5nIHZhbHVlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmU3RyaW5nID0gdmFsdWU7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgSVN0cmluZ0JlYW5Qcm94eSkKLQkJcmV0dXJuIGZTdHJpbmcuZXF1YWxzKCgoSVN0cmluZ0JlYW5Qcm94eSkgYW5PYmplY3QpLnN0cmluZ1ZhbHVlKCkpOwotCWVsc2UKLQkJcmV0dXJuIGZTdHJpbmcuZXF1YWxzKGFuT2JqZWN0KTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBjYWNoZSdkIHN0cmluZyB0aGF0IGlzIGEgamF2YS5sYW5nLlN0cmluZyB0aGF0IHRoZSBJREUgY2FuIHVzZQotICovCi1wdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgewotCXJldHVybiBmU3RyaW5nOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgdG9TdHJpbmcgdmFsdWUgZnJvbSB0aGUgYmVhbi4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIGZTdHJpbmcudG9TdHJpbmcoKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuc3RyaW5nQ2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZTdHJpbmcpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RyaW5nQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdHJpbmdCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOWYwYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdHJpbmdCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNU3RyaW5nQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgdGhlIEJlYW5UeXBlIHByb3h5IGZvciBqYXZhLmxhbmcuU3RyaW5nCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6MjMgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1TdHJpbmdCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSB7Ci0JLy8gQ2FjaGUgYSBwcm94eSB0byBhbiBlbXB0eSBzdHJpbmcgZm9yIHNwZWVkCi0JcHJvdGVjdGVkIGZpbmFsIElTdHJpbmdCZWFuUHJveHkgZW1wdHlTdHJpbmdQcm94eTsKLS8qKgotICogSURFU3RyaW5nQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNU3RyaW5nQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG9iamVjdFR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuU1RSSU5HX0NMQVNTKSwgU3RyaW5nLmNsYXNzLmdldE5hbWUoKSwgb2JqZWN0VHlwZVByb3h5KTsKLQotCS8vIENhY2hlIGEgcHJveHkgdG8gYW4gZW1wdHkgc3RyaW5nIGZvciBzcGVlZAotCWVtcHR5U3RyaW5nUHJveHkgPSBuZXcgUkVNU3RyaW5nQmVhblByb3h5KGFSZWdpc3RyeSwgIiIpOwkvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgc3RyaW5nIGJlYW5zCi0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIG5vLW9uZSBlbHNlIG91dHNpZGUgdGhlIHBhY2thZ2Ugc2hvdWxkIHVzZSB0aGlzLCB0aGV5Ci0gKiBtdXN0IGdvIHRocm91Z2ggdGhlIEFQSSB3aGVyZSB5b3UgbG9vayB1cCBhIGZhY3RvcnkgZmlyc3QuCi0gKi8KLUlTdHJpbmdCZWFuUHJveHkgY3JlYXRlU3RyaW5nQmVhblByb3h5KFN0cmluZyBhU3RyaW5nKXsKLQlpZiAoIGFTdHJpbmcuZXF1YWxzKCIiKSApIHsvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbXB0eVN0cmluZ1Byb3h5OwotCX0gZWxzZSB7Ci0JCXJldHVybiBuZXcgUkVNU3RyaW5nQmVhblByb3h5KGZSZWdpc3RyeSwgYVN0cmluZyk7Ci0JfQotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gVGhleSBhcmUgY3JlYXRlZAotICogZXhwbGljaXRseSB0aHJvdWdoIHRoZSBhcHByb3ByaWF0ZSBjcmVhdGUgbWV0aG9kLgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciB0eXBlcywgdGhleSBhcmUgZmluYWwgY2xhc3Nlcywgc28geW91IGNhbid0IGNyZWF0ZSBhIG5ld0JlYW5UeXBlIAotICogZm9yIHN1YmNsYXNzZXMuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gU3RyaW5nIGhhcyBhIGRlZmF1bHQgY3RvciwgYnV0IGl0IHJlc3VsdHMgaW4gdGhlIGVtcHR5U3RyaW5nUHJveHksCi0gKiBzbyByZXR1cm4gdGhlIHplcm9Qcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIGVtcHR5U3RyaW5nUHJveHk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kIGNvbW1lbnQuIFB1dCBhIHNob3J0IGN1dCBpbiBmb3Igc3RyaW5ncyBzbyB3ZSBkb24ndCBuZWVkIHRvIGdvIHRvIHRoZSByZW1vdGUKLSAqIHZtIGp1c3QgdG8gY3JlYXRlIGEgc3RyaW5nLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQlpZiAoaW5pdGlhbGl6YXRpb25TdHJpbmcubGVuZ3RoKCkgPD0gMSkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gTm90IGxhcmdlIGVub3VnaCBmb3IgdHdvIHF1b3Rlcywgc28gbGV0IGRlZmF1bHQgaGFuZGxlIGl0LgotCS8vIE5lZWQgYSBxdWljayBjaGVjayB0aGF0IGl0IGlzIG9ubHkgb25lIHF1b3RlZCBzdHJpbmcuIEFueXRoaW5nIGVsc2UgbmVlZHMgdG8gYmUgcGFzc2VkIG9uIHVwLgotCVN0cmluZyBzID0gaW5pdGlhbGl6YXRpb25TdHJpbmcudHJpbSgpOwotCWludCBzbCA9IHMubGVuZ3RoKCktMTsJCi0JaWYgKHMuY2hhckF0KDApICE9ICciJyB8fCBzLmNoYXJBdChzbCkgIT0gJyInKQotCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBObyBsZWFkaW5nIGFuZCB0cmFpbGluZyBxdW90ZS4KLQotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc2wpOwotCWJvb2xlYW4gZXNjYXBlID0gZmFsc2U7CQkKLQlmb3IgKGludCBpPTE7IGk8c2w7IGkrKykgewotCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJaWYgKGMgPT0gJ1xcJykgewotCQkJZXNjYXBlID0gdHJ1ZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghZXNjYXBlICYmIGMgPT0gJyInKQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gSGFkIGEgcXVvdGUgaW4gdGhlIG1pZGRsZSB3aXRob3V0IGFuIGVzY2FwZS4gVGhpcyBtZWFucyBhbiBleHByZXNzaW9uLCBzZW5kIG9uIHVwLgotCQllc2NhcGUgPSBmYWxzZTsKLQkJc2IuYXBwZW5kKGMpOwotCX0KLQkKLQlyZXR1cm4gZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChzYi50b1N0cmluZygpKTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVTdHJpbmdCZWFuUHJveHkoKFN0cmluZykgdmFsdWUuYW5PYmplY3QpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1UaHJvd2FibGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVGhyb3dhYmxlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMjFmZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1UaHJvd2FibGVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1UaHJvd2FibGVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLio7Ci0vKioKLSAqIEV4Y2VwdGlvbiBQcm94eSBmb3IgZXhjZXB0aW9uIG9uIFJlbW90ZS4KLSAqIE5PVEU6IFRoaXMgb25lIGlzIHVudXN1YWwgaW4gdGhhdCBpdCBkb2Vzbid0IGluaGVyaXQgZnJvbQotICogICAgICAgSURFQmVhblByb3h5IGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgYW4gZXhjZXB0aW9uLCBhbmQKLSAqICAgICAgIGV4Y2VwdGlvbnMgYXJlIG5vdCBhbiBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1UaHJvd2FibGVCZWFuUHJveHkgZXh0ZW5kcyBUaHJvd2FibGVQcm94eSBpbXBsZW1lbnRzIElSRU1CZWFuUHJveHkgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMDc2Nzc3MzM2ODEwMjE1MjA2TDsKLQlwcml2YXRlIEludGVnZXIgZklEOwotCXByb3RlY3RlZCBmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeTsKLQlwcml2YXRlIElCZWFuVHlwZVByb3h5IGZUeXBlUHJveHk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGJlYW4gd2UgYXJlIHByb3h5aW5nLiAgV2UgYXJlIGEgcHJveHkgZm9yIGEgYmVhbiBydW5uaW5nIG9uIHRoZSByZW1vdGUgVk0uIAotCSAqLwotCXByb3RlY3RlZCBSRU1UaHJvd2FibGVCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIElCZWFuVHlwZVByb3h5IGFUeXBlKXsKLQkJZkZhY3RvcnkgPSBhUmVnaXN0cnk7Ci0JCWZJRCA9IGFuSUQ7Ci0JCWZUeXBlUHJveHkgPSBhVHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogZXF1YWxzOiBFcXVhbCBpZjoKLQkgKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0JICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotCSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0JICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotCSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKHN1cGVyLmVxdWFscyhhbk9iamVjdCkpCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgSUJlYW5Qcm94eSAmJiAhKGFuT2JqZWN0IGluc3RhbmNlb2YgSVJFTUNvbnN0YW50QmVhblByb3h5KSAmJiBmRmFjdG9yeS5pc1ZhbGlkKCkgJiYgKChJQmVhblByb3h5KSBhbk9iamVjdCkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSA9PSBmRmFjdG9yeSkKLQkJCXRyeSB7Ci0JCQkJLy8gVGhlIG90aGVyIGlzIGEgYmVhbiBwcm94eSBhbmQgaXMgbm90IGEgY29uc3RhbnQgb25lLCBsZXQgdGhlIHNlcnZlciBkbyB0aGUgY2hlY2suCi0JCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0T2JqZWN0RXF1YWxzKCkuaW52b2tlKHRoaXMsIChJQmVhblByb3h5KSBhbk9iamVjdCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCXJldHVybiB0aGlzID09IGFCZWFuUHJveHk7CS8vIFdlIGNhbiBiZSBhc3N1cmVkIGluIFJlbW90ZSBQcm94eSB0aGF0IGlkZW50aXR5IG9mIHByb3h5IGFuZCBpZGVudGl0eSBvZiBvYmplY3QgYXJlIHRoZSBzYW1lLgotCX0KLQkKLQkKLQkvKioKLQkgKiBHZXQgSUQuIEFuIGludGVybmFsIG1ldGhvZCB0byBiZSB1c2VkIG9ubHkgd2l0aGluIHRoZSBQcm94eUZhY3RvcnkgZmFtaWx5LgotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gZklEOwotCX0KLQkKLQkvKioKLQkgKiBpc1ZhbGlkIC0gaGFzIHRoaXMgYmVhbiBiZWVuIHJlbGVhc2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBmSUQgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogcmVsZWFzZSAtIFRoZSBiZWFuIGlzIGJlaW5nIHJlbGVhc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZJRCA9IG51bGw7Ci0JCWZUeXBlUHJveHkgPSBudWxsOwotCX0gCi0JCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaXN0cnkgdGhpcyBwcm94eSB3YXMgY3JlYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZGYWN0b3J5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3hpZWQgY2xhc3Mgb2YgdGhlIGJlYW4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzowMSBBTSkKLQkgKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiBmVHlwZVByb3h5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvU3RyaW5nIG9mIHRoZSBhY3R1YWwgYmVhbiBvbiB0aGUgcmVtb3RlIHNpZGUuCi0JICovCi0JcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JCUlTdHJpbmdCZWFuUHJveHkgc3RyaW5nID0gKElTdHJpbmdCZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0T2JqZWN0VG9TdHJpbmcoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcyk7Ci0JCXJldHVybiAoc3RyaW5nICE9IG51bGwpID8gc3RyaW5nLnN0cmluZ1ZhbHVlKCkgOiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3h5TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJSVN0cmluZ0JlYW5Qcm94eSBtc2cgPSAoSVN0cmluZ0JlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMpOwotCQlyZXR1cm4gbXNnICE9IG51bGwgPyBtc2cuc3RyaW5nVmFsdWUoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHlNZXNzYWdlKCkgewotCQlJU3RyaW5nQmVhblByb3h5IG1zZyA9IChJU3RyaW5nQmVhblByb3h5KSAgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRUaHJvd2FibGVNZXNzYWdlKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMpOwotCQlyZXR1cm4gbXNnICE9IG51bGwgPyBtc2cuc3RyaW5nVmFsdWUoKSA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRlbXBvcmFyeSB3YXkgdG8gZ2V0IHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHN0YWNrdHJhY2UuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJveHlTdGFja1RyYWNlKCkgewotCQlJTWV0aG9kUHJveHkgdGVtcEdldFN0YWNrVHJhY2UgPSBmRmFjdG9yeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5TdGFja1RyYWNlVXRpbGl0eSIsICJwcmludFN0YWNrVHJhY2UiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuVGhyb3dhYmxlIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlJU3RyaW5nQmVhblByb3h5IHRyYWNlID0gKElTdHJpbmdCZWFuUHJveHkpIHRlbXBHZXRTdGFja1RyYWNlLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhudWxsLCB0aGlzKTsKLQkJcmV0dXJuIHRyYWNlICE9IG51bGwgPyB0cmFjZS5zdHJpbmdWYWx1ZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCVN0cmluZyB0cmFjZSA9IGdldFByb3h5U3RhY2tUcmFjZSgpOwotCQlzeW5jaHJvbml6ZWQod3JpdGVyKSB7Ci0JCQl3cml0ZXIucHJpbnQodHJhY2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gc3RyZWFtKSB7Ci0JCVN0cmluZyB0cmFjZSA9IGdldFByb3h5U3RhY2tUcmFjZSgpOwotCQlzeW5jaHJvbml6ZWQoc3RyZWFtKSB7Ci0JCQlzdHJlYW0ucHJpbnQodHJhY2UpOwotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnRQcm94eVN0YWNrVHJhY2UoKSB7Ci0JCVN0cmluZyB0cmFjZSA9IGdldFByb3h5U3RhY2tUcmFjZSgpOwotCQlzeW5jaHJvbml6ZWQoU3lzdGVtLmVycikgewotCQkJU3lzdGVtLmVyci5wcmludCh0cmFjZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEJlbG93IGFyZSB0aGUgYWN0dWFsIHByaW50U3RhY2tUcmFjZS4gVGhleSBhcmUgc2V0IHVwIHRvIGZpcnN0IGNhbGwKLQkgKiB0aGUgcHJveHkgdHJhY2Ugc28gdGhhdCBpdCBjYW4gc2hvdyB3aGVyZSBpdCBvY2N1cnJlZCBvbiB0aGUgc2VydmVyLAotCSAqIGFuZCB0aGVuIGl0IHdpbGwgZG8gYSBzdXBlciB0byBzaG93IHdoZXJlIGl0IG9jY3VycmVkIG9uIHRoaXMgc2lkZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7IAotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5lcnIpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTU9URV9WTV9UUkFDRV9JTkZPXyk7IAotCQkJcHJpbnRQcm94eVN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTU9URV9WTV9MT0NBTF9UUkFDRV9JTkZPXyk7IAotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7IAotCQlzeW5jaHJvbml6ZWQgKHMpIHsKLQkJCXMucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTU9URV9WTV9UUkFDRV9JTkZPXyk7IAotCQkJcHJpbnRQcm94eVN0YWNrVHJhY2Uocyk7Ci0JCQlzLnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1PVEVfVk1fTE9DQUxfVFJBQ0VfSU5GT18pOyAKLQkJCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpIHsgCi0JCXN5bmNocm9uaXplZCAocykgewotCQkJcy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNT1RFX1ZNX1RSQUNFX0lORk9fKTsgCi0JCQlwcmludFByb3h5U3RhY2tUcmFjZShzKTsKLQkJCXMucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTU9URV9WTV9MT0NBTF9UUkFDRV9JTkZPXyk7IAotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQkJdmFsdWUuc2V0T2JqZWN0SUQoZ2V0SUQoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzQmVhblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0V4cHJlc3Npb25Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVRocm93YWJsZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGM5ZjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogVGhlIFJlbW90ZSBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocm93YWJsZSBiZWFuIHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1UaHJvd2FibGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBhU3VwZXJUeXBlKTsKLQl9CQotCQotCS8qKgotCSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0JICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLQkgKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotCSAqLwotCVJFTVRocm93YWJsZUJlYW5Qcm94eSBjcmVhdGVUaHJvd2FibGVCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gbmV3IFJFTVRocm93YWJsZUJlYW5Qcm94eShmUmVnaXN0cnksIG9iamVjdElELCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBOT1RFOiBBbGwgc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHR5cGUgb2YgQmVhblR5cGVQcm94eS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJcmV0dXJuIG5ld0JlYW5UeXBlRm9yQ2xhc3MoYW5JRCwgYUNsYXNzbmFtZSwgYW5BYnN0cmFjdCwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpYWwgbWV0aG9kIHRvIGhhbmRsZSBzdWJjbGFzc2luZyBmcm9tIGFuIGFic3RyYWN0KS4KLQkgKi8JCQotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKSB7Ci0JCS8vIFdlIGNhbiBuZXZlciBoYXZlIGFuIGludGVyZmFjZSBvZiB0eXBlIFRocm93YWJsZSBzaW5jZSB0aGF0IGRvZXNuJ3QgZXhpc3QuCi0JCWlmICghYW5BYnN0cmFjdCkKLQkJCXJldHVybiBuZXcgUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsaXplZCBmcm9tIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB0byBlbnN1cmUgRXhjZXB0aW9uQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBjcmVhdGVUaHJvd2FibGVCZWFuUHJveHkob2JqZWN0SUQpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVm9pZEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVm9pZEJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwZjI3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVZvaWRCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Wb2lkQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogQmVhblR5cGVQcm94eSBmb3IgcmVwcmVzZW50aW5nIHRoZSAidm9pZCIgdHlwZSB2YWx1ZSwgYW5kIGEgdmFsdWUgb2YgdGhpcyB0eXBlIGlzICJudWxsIi4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzExLzAwIDI6MjY6NDcgUE0pCi0gKiBAYXV0aG9yOiBSaWNoYXJkIExlZSBLdWxwCi0gKi8KLWZpbmFsIGNsYXNzIFJFTVZvaWRCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSB7Ci0KLQkKLXByb3RlY3RlZCBSRU1Wb2lkQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLlZPSURfVFlQRSksIFZvaWQuVFlQRS5nZXROYW1lKCksIG51bGwpOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgc3VwZXJ0eXBlIGZvciB1cwotICogbnVsbC92b2lkIGhhcyBubyBzdXBlcmNsYXNzLgotICogVGhpcyBpcyByZXF1aXJlZCBhcyBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFN1cGVyQmVhblR5cGVQcm94eSgpIHsKLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0gKgotICogRm9yIHZvaWQsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uIFRoZXkgYXJlIGNyZWF0ZWQKLSAqIGV4cGxpY2l0bHkgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgY3JlYXRlIG1ldGhvZC4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0gKgotICogRm9yIHZvaWQgaXMgYSBmaW5hbCBjbGFzcywgc28geW91IGNhbid0IGNyZWF0ZSBhIG5ld0JlYW5UeXBlIAotICogZm9yIHN1YmNsYXNzZXMuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gdm9pZCByZXByZXNlbnRzICJudWxsIiwKLSAqIHNvIHJldHVybiB0aGUgbnVsbCBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gbmV3SW5zdGFuY2UoKTsKLX0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTURpbWVuc2lvbkJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNRGltZW5zaW9uQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWZkZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNRGltZW5zaW9uQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogUkVNRGltZW5zaW9uQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5hd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBUaGUgUkVNIEJlYW4gUHJveHkgZm9yIGphdmEuYXd0LkRpbWVuc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIFJFTURpbWVuc2lvbkJlYW5Qcm94eSBleHRlbmRzIFJFTUJlYW5Qcm94eSBpbXBsZW1lbnRzIElEaW1lbnNpb25CZWFuUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1EaW1lbnNpb25CZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIElCZWFuVHlwZVByb3h5IGFUeXBlKSB7CQotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFUeXBlKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RGltZW5zaW9uSGVpZ2h0RmllbGRQcm94eSgpLmdldCh0aGlzKTsKLQkJCXJldHVybiBoLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RGltZW5zaW9uV2lkdGhGaWVsZFByb3h5KCkuZ2V0KHRoaXMpOwotCQkJcmV0dXJuIGguaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKLQkJdHJ5IHsKLQkJCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXREaW1lbnNpb25IZWlnaHRGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGhlaWdodCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RGltZW5zaW9uV2lkdGhGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHdpZHRoKSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RGltZW5zaW9uU2V0U2l6ZUhXUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgbmV3IElCZWFuUHJveHlbXSB7ZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgod2lkdGgpLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChoZWlnaHQpfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNpemUoSURpbWVuc2lvbkJlYW5Qcm94eSBmcm9tRGltZW5zaW9uUHJveHkpIHsKLQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldERpbWVuc2lvblNldFNpemVEUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgZnJvbURpbWVuc2lvblByb3h5KTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDY0NDI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTURpbWVuc2lvbkJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3Q7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1EaW1lbnNpb25CZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotLyoqCi0gKiBCZWFudHlwZSBwcm94eSBmb3IgamF2YS5hd3QuRGltZW5zaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1EaW1lbnNpb25CZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBhU3VwZXJUeXBlKTsKLQl9Ci0JCQotCS8qKgotCSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0JICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLQkgKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotCSAqLwotCVJFTURpbWVuc2lvbkJlYW5Qcm94eSBjcmVhdGVEaW1lbnNpb25CZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gbmV3IFJFTURpbWVuc2lvbkJlYW5Qcm94eShmUmVnaXN0cnksIG9iamVjdElELCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBOT1RFOiBBbGwgc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHR5cGUgb2YgQmVhblR5cGVQcm94eS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJcmV0dXJuIG5ld0JlYW5UeXBlRm9yQ2xhc3MoYW5JRCwgYUNsYXNzbmFtZSwgYW5BYnN0cmFjdCwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpYWwgbWV0aG9kIHRvIGhhbmRsZSBzdWJjbGFzc2luZyBmcm9tIGFuIGFic3RyYWN0KS4KLQkgKi8JCQotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKSB7Ci0JCWlmICghYW5BYnN0cmFjdCkKLQkJCXJldHVybiBuZXcgUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsaXplZCBmcm9tIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB0byBlbnN1cmUgRXhjZXB0aW9uQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBjcmVhdGVEaW1lbnNpb25CZWFuUHJveHkob2JqZWN0SUQpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVBvaW50QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1Qb2ludEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg3N2Y1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVBvaW50QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogUkVNUG9pbnRCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogVGhlIFJFTSBCZWFuIFByb3h5IGZvciBqYXZhLmF3dC5Qb2ludC4KLSAqLwotcHVibGljIGNsYXNzIFJFTVBvaW50QmVhblByb3h5IGV4dGVuZHMgUkVNQmVhblByb3h5IGltcGxlbWVudHMgSVBvaW50QmVhblByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUkVNUG9pbnRCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIElCZWFuVHlwZVByb3h5IGFUeXBlKSB7CQotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFUeXBlKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYKCkgewotCQl0cnkgewotCQkJSUludGVnZXJCZWFuUHJveHkgaCA9IChJSW50ZWdlckJlYW5Qcm94eSkgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFBvaW50WEZpZWxkUHJveHkoKS5nZXQodGhpcyk7Ci0JCQlyZXR1cm4gaC5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IGdldFkoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UG9pbnRZRmllbGRQcm94eSgpLmdldCh0aGlzKTsKLQkJCXJldHVybiBoLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFgoaW50IHgpIHsKLQkJdHJ5IHsKLQkJCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRQb2ludFhGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHgpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFkoaW50IHkpIHsKLQkJdHJ5IHsKLQkJCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRQb2ludFlGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHkpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGludCB4LCBpbnQgeSkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UG9pbnRTZXRMb2NhdGlvblhZUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgbmV3IElCZWFuUHJveHlbXSB7ZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeCksIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHkpfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQb2ludEJlYW5Qcm94eSBmcm9tUG9pbnRQcm94eSkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UG9pbnRTZXRMb2NhdGlvblBQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBmcm9tUG9pbnRQcm94eSk7Ci0JfQkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1Qb2ludEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVBvaW50QmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU0NThlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVBvaW50QmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVBvaW50QmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLS8qKgotICogQmVhbnR5cGUgcHJveHkgZm9yIGphdmEuYXd0LkRpbWVuc2lvbgotICovCi1wdWJsaWMgY2xhc3MgUkVNUG9pbnRCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUkVNUG9pbnRCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotCX0KLQkJCi0JLyoqCi0JICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLQkgKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotCSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0JICovCi0JUkVNUG9pbnRCZWFuUHJveHkgY3JlYXRlUG9pbnRCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gbmV3IFJFTVBvaW50QmVhblByb3h5KGZSZWdpc3RyeSwgb2JqZWN0SUQsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIE5PVEU6IEFsbCBzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdHlwZSBvZiBCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCQlyZXR1cm4gbmV3QmVhblR5cGVGb3JDbGFzcyhhbklELCBhQ2xhc3NuYW1lLCBhbkFic3RyYWN0LCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lhbCBtZXRob2QgdG8gaGFuZGxlIHN1YmNsYXNzaW5nIGZyb20gYW4gYWJzdHJhY3QpLgotCSAqLwkJCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0LCBJQmVhblR5cGVQcm94eSBzdXBlclR5cGUpIHsKLQkJaWYgKCFhbkFic3RyYWN0KQotCQkJcmV0dXJuIG5ldyBSRU1Qb2ludEJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFJFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5KGZSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgc3VwZXJUeXBlLCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogU3BlY2lhbGl6ZWQgZnJvbSBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIEV4Y2VwdGlvbkJlYW5Qcm94aWVzIGFyZSBjcmVhdGVkIGNvcnJlY3RseS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gY3JlYXRlUG9pbnRCZWFuUHJveHkob2JqZWN0SUQpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVjdGFuZ2xlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMzE5NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVjdGFuZ2xlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5hd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBUaGUgUkVNIEJlYW4gUHJveHkgZm9yIGphdmEuYXd0LlJlY3RhbmdsZS4KLSAqLwotcHVibGljIGNsYXNzIFJFTVJlY3RhbmdsZUJlYW5Qcm94eSBleHRlbmRzIFJFTUJlYW5Qcm94eSBpbXBsZW1lbnRzIElSZWN0YW5nbGVCZWFuUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1SZWN0YW5nbGVCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIElCZWFuVHlwZVByb3h5IGFUeXBlKSB7CQotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFUeXBlKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYKCkgewotCQl0cnkgewotCQkJSUludGVnZXJCZWFuUHJveHkgaCA9IChJSW50ZWdlckJlYW5Qcm94eSkgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVhGaWVsZFByb3h5KCkuZ2V0KHRoaXMpOwotCQkJcmV0dXJuIGguaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBnZXRZKCkgewotCQl0cnkgewotCQkJSUludGVnZXJCZWFuUHJveHkgaCA9IChJSW50ZWdlckJlYW5Qcm94eSkgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVlGaWVsZFByb3h5KCkuZ2V0KHRoaXMpOwotCQkJcmV0dXJuIGguaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0WChpbnQgeCkgewotCQl0cnkgewotCQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVhGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHgpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFkoaW50IHkpIHsKLQkJdHJ5IHsKLQkJCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVZRmllbGRQcm94eSgpLnNldCh0aGlzLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh5KSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihpbnQgeCwgaW50IHkpIHsKLQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVNldExvY2F0aW9uWFlQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBuZXcgSUJlYW5Qcm94eVtdIHtmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh4KSwgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeSl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBvaW50QmVhblByb3h5IGZyb21Qb2ludFByb3h5KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVTZXRMb2NhdGlvblBQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBmcm9tUG9pbnRQcm94eSk7Ci0JfQotCQotCQotCXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgewotCQl0cnkgewotCQkJSUludGVnZXJCZWFuUHJveHkgaCA9IChJSW50ZWdlckJlYW5Qcm94eSkgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZUhlaWdodEZpZWxkUHJveHkoKS5nZXQodGhpcyk7Ci0JCQlyZXR1cm4gaC5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IGdldFdpZHRoKCkgewotCQl0cnkgewotCQkJSUludGVnZXJCZWFuUHJveHkgaCA9IChJSW50ZWdlckJlYW5Qcm94eSkgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVdpZHRoRmllbGRQcm94eSgpLmdldCh0aGlzKTsKLQkJCXJldHVybiBoLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KSB7Ci0JCXRyeSB7Ci0JCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlSGVpZ2h0RmllbGRQcm94eSgpLnNldCh0aGlzLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChoZWlnaHQpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKGludCB3aWR0aCkgewotCQl0cnkgewotCQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVdpZHRoRmllbGRQcm94eSgpLnNldCh0aGlzLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh3aWR0aCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVNldFNpemVIV1Byb3h5KCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMsIG5ldyBJQmVhblByb3h5W10ge2ZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHdpZHRoKSwgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaGVpZ2h0KX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaXplKElEaW1lbnNpb25CZWFuUHJveHkgZnJvbURpbWVuc2lvblByb3h5KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVTZXRTaXplRFByb3h5KCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMsIGZyb21EaW1lbnNpb25Qcm94eSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlU2V0Qm91bmRzWFlIV1Byb3h5KCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMsIG5ldyBJQmVhblByb3h5W10ge2ZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHgpLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh5KSwgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgod2lkdGgpLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChoZWlnaHQpfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJvdW5kcyhJUmVjdGFuZ2xlQmVhblByb3h5IGZyb21SZWN0YW5nbGVQcm94eSkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlU2V0Qm91bmRzUlByb3h5KCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMsIGZyb21SZWN0YW5nbGVQcm94eSk7Ci0JfQkJCQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVJlY3RhbmdsZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVJlY3RhbmdsZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmY2M3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1SZWN0YW5nbGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogUkVNUmVjdGFuZ2xlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLS8qKgotICogQmVhbnR5cGUgcHJveHkgZm9yIGphdmEuYXd0LkRpbWVuc2lvbgotICovCi1wdWJsaWMgY2xhc3MgUkVNUmVjdGFuZ2xlQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSBpbXBsZW1lbnRzIElSRU1TcGVjaWFsQmVhblR5cGVQcm94eSB7Ci0JCi0JcHJvdGVjdGVkIFJFTVJlY3RhbmdsZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBJQmVhblR5cGVQcm94eSBhU3VwZXJUeXBlKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgYVN1cGVyVHlwZSk7Ci0JfQotCQkKLQkvKioKLQkgKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotCSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0JICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLQkgKi8KLQlSRU1SZWN0YW5nbGVCZWFuUHJveHkgY3JlYXRlUmVjdGFuZ2xlQmVhblByb3h5KEludGVnZXIgb2JqZWN0SUQpIHsKLQkJcmV0dXJuIG5ldyBSRU1SZWN0YW5nbGVCZWFuUHJveHkoZlJlZ2lzdHJ5LCBvYmplY3RJRCwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotCSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLQkgKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0JICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLQkgKiB0aGF0IGNhbiBiZSBkb25lLgotCSAqCi0JICogTk9URTogQWxsIHN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIHRvIHJldHVybiB0aGUgY29ycmVjdCB0eXBlIG9mIEJlYW5UeXBlUHJveHkuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JCXJldHVybiBuZXdCZWFuVHlwZUZvckNsYXNzKGFuSUQsIGFDbGFzc25hbWUsIGFuQWJzdHJhY3QsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWFsIG1ldGhvZCB0byBoYW5kbGUgc3ViY2xhc3NpbmcgZnJvbSBhbiBhYnN0cmFjdCkuCi0JICovCQkKLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QsIElCZWFuVHlwZVByb3h5IHN1cGVyVHlwZSkgewotCQlpZiAoIWFuQWJzdHJhY3QpCi0JCQlyZXR1cm4gbmV3IFJFTVJlY3RhbmdsZUJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFJFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5KGZSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgc3VwZXJUeXBlLCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogU3BlY2lhbGl6ZWQgZnJvbSBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIEV4Y2VwdGlvbkJlYW5Qcm94aWVzIGFyZSBjcmVhdGVkIGNvcnJlY3RseS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gY3JlYXRlUmVjdGFuZ2xlQmVhblByb3h5KG9iamVjdElEKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1SZWdpc3RlckFXVC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVnaXN0ZXJBV1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxMjFjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1SZWdpc3RlckFXVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVJlZ2lzdGVyQVdULmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWdpc3RlciB0aGUgQVdUIGZhY3Rvcmllcy4gSXQgaXMgbm90Ci0gKiBtZWFudCB0byBiZSBjYWxsZWQgYnkgYW55b25lIG90aGVyIHRoYW4gUHJveHlWTVN0YXJ0ZXIuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSRU1SZWdpc3RlckFXVCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQVdUKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCW5ldyBSRU1TdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJbmV3IFJFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0JCQotCQkvLyBJZiB3ZSBhcmUgZG9pbmcgQVdULCBnZXQgdGhlIEFXVCBldmVudCBxdWV1ZSBnb2luZy4gVGhpcyBpcyB0cnlpbmcgdG8gYmUgYSB0aW1lLXNhdmVyCi0JCS8vIGJ5IGhhdmluZyBpdCB1cCByaWdodCBhd2F5LgotCQlJQmVhblR5cGVQcm94eSBzdGFydGVyQmVhblR5cGUgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQVdUU3RhcnRlciIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzdGFydGVyQmVhblR5cGUgIT0gbnVsbCkgewotCQkJSU1ldGhvZFByb3h5IHN0YXJ0ZXIgPSBzdGFydGVyQmVhblR5cGUuZ2V0TWV0aG9kUHJveHkoInN0YXJ0QVdUIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzdGFydGVyICE9IG51bGwpCi0JCQkJc3RhcnRlci5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMobnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1TdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWFkYmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5hd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLS8qKgotICogU3RhbmRhcmQgQVdUIEJlYW4gUHJveHkgRmFjdG9yeS4KLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCByZWZlcmVuY2VkCi0gKiBvdXRzaWRlIG9mIHRoZSBwYWNrYWdlIG90aGVyIHRoYW4gdGhyb3VnaCB0aGUgaW50ZXJmYWNlLgotICovCi1jbGFzcyBSRU1TdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkgaW1wbGVtZW50cyBJU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5IHsKLQotCWZpbmFsIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGZCZWFuVHlwZUZhY3Rvcnk7Ci0JCi0JcHVibGljIFJFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5KSB7Ci0JCWZhY3RvcnkucmVnaXN0ZXJCZWFuUHJveHlGYWN0b3J5KElTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkuUkVHSVNUUllfS0VZLCB0aGlzKTsKLQkJZkJlYW5UeXBlRmFjdG9yeSA9IGZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIElEaW1lbnNpb25CZWFuUHJveHkgY3JlYXRlRGltZW5zaW9uQmVhblByb3h5V2l0aChpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCQl0cnkgewotCQkJcmV0dXJuIChJRGltZW5zaW9uQmVhblByb3h5KSBmQmVhblR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LkRpbWVuc2lvbiIpLm5ld0luc3RhbmNlKCJuZXcgamF2YS5hd3QuRGltZW5zaW9uKCIrd2lkdGgrIiwiK2hlaWdodCsiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwkvLyBTaG91bGRuJ3Qgb2NjdXIKLQkJfQotCX0KLQkKLQlwdWJsaWMgSVBvaW50QmVhblByb3h5IGNyZWF0ZVBvaW50QmVhblByb3h5V2l0aChpbnQgeCwgaW50IHkpewotCQl0cnkgewotCQkJcmV0dXJuIChJUG9pbnRCZWFuUHJveHkpIGZCZWFuVHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKS5uZXdJbnN0YW5jZSgibmV3IGphdmEuYXd0LlBvaW50KCIreCsiLCIreSsiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwkvLyBTaG91bGRuJ3Qgb2NjdXIKLQkJfQotCi0JfQotCQotCXB1YmxpYyBJUmVjdGFuZ2xlQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCQl0cnkgewotCQkJcmV0dXJuIChJUmVjdGFuZ2xlQmVhblByb3h5KSBmQmVhblR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlJlY3RhbmdsZSIpLm5ld0luc3RhbmNlKCJuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKCIreCsiLCIreSsiLCIrd2lkdGgrIiwiK2hlaWdodCsiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsJLy8gU2hvdWxkbid0IG9jY3VyCi0JCX0KLQotCX0KLQkKLQkvKgotCSAqIFRlcm1pbmF0ZSB0aGlzIGZhY3RvcnkuIFNpbmNlIGl0IGRvZXNuJ3QgaG9sZCBvbnRvIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIGJlYW50eXBlIGZhY3RvcnksCi0JICogYW5kIG5vdGhpbmcgd2lsbCBiZSBob2xkaW5nIG9udG8gdGhpcyBmYWN0b3J5LCBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUuIEl0IHdpbGwgYmUgR0MnZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y2ZTRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuKjsKLQotLyoqCi0gKiBCZWFuVHlwZSBmYWN0b3J5IHN0YW5kYXJkIEFXVCBiZWFuIHR5cGVzLiBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgc2hvdWxkbid0IGJlIHJlZmVyZW5jZWQgb3V0c2lkZSB0aGUgcGFja2FnZS4gSXQgc2hvdWxkIG9ubHkgYmUKLSAqIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGludGVyZmFjZS4KLSAqLwotY2xhc3MgUkVNU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fVFlQRV9GQUNUT1JZX0tFWSA9ICJqYXZhLmF3dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeVJlZ2lzdHJ5OwotCi0JUkVNU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJZkZhY3RvcnlSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQkJZkZhY3RvcnlSZWdpc3RyeS5yZWdpc3RlckJlYW5UeXBlUHJveHlGYWN0b3J5KEJFQU5fVFlQRV9GQUNUT1JZX0tFWSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5I2dldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSkKLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgY2xhc3NOYW1lLCBJbnRlZ2VyIGNsYXNzSUQsIElCZWFuVHlwZVByb3h5IHN1cGVyVHlwZSkgewotCi0JCWlmICgiamF2YS5hd3QuRGltZW5zaW9uIi5lcXVhbHMoY2xhc3NOYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBSRU1EaW1lbnNpb25CZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIGNsYXNzSUQsIGNsYXNzTmFtZSwgc3VwZXJUeXBlKTsKLQkJZWxzZSBpZiAoImphdmEuYXd0LlBvaW50Ii5lcXVhbHMoY2xhc3NOYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBSRU1Qb2ludEJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgY2xhc3NJRCwgY2xhc3NOYW1lLCBzdXBlclR5cGUpOwotCQllbHNlIGlmICgiamF2YS5hd3QuUmVjdGFuZ2xlIi5lcXVhbHMoY2xhc3NOYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBSRU1SZWN0YW5nbGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIGNsYXNzSUQsIGNsYXNzTmFtZSwgc3VwZXJUeXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgSVByb3h5QmVhblR5cGUgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUsIElFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkodHlwZU5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eUZhY3RvcnkjdGVybWluYXRlRmFjdG9yeShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbiB3YWl0KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OGI1M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvbWVzc2FnZXMucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjE1ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQKLSMKLQotCi0KLSMgRXhjZXB0aW9uIG1lc3NhZ2UgLSB7MH0gaXMgdGhlIG5hbWUgb2YgYSBwcm9qZWN0IHdpdGhpbiBFY2xpcHNlLgotTk9fT1VUUFVUX0ZPTERFUl9FWENfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNzFFIE5vIG91dHB1dCBmb2xkZXIgZm9yIHByb2plY3QgInswfS4iCi0KLSMgVGhlc2UgYXJlIGxpbmVzIHRoYXQgYXJlIHBsYWNlZCBpbnRvIGEgbG9nIGZpbGUgbGlzdGluZyB0aGUgb3V0cHV0cyBmcm9tIHRoZSB0d28gZGlmZmVyZW50IHN0cmVhbXMuCi1WTV9URVJNSU5BVEVEX0lORk9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA3MkkgUmVtb3RlIFZNIHRlcm1pbmF0ZWQgYmVmb3JlIGFueSBjb21tYW5kcyBjYW4gYmUgc2VudC4gRm9sbG93aW5nIGFyZSB0aGUgZXJyb3IgYW5kIG91dHB1dCBzdHJlYW1zLgotVk1fVEVSTUlOQVRFRF9MSU5FMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLS0gRXJyb3IgU3RyZWFtIC0tCi1WTV9URVJNSU5BVEVEX0xJTkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtLSBPdXRwdXQgU3RyZWFtIC0tCi1WTV9URVJNSU5BVEVEX0xJTkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtLSBFbmQgb2YgU3RyZWFtIE91dHB1dCAtLQotCi0jIFRoZXNlIGFyZSB0aGUgaGVhZGVycyBmb3IgdHdvIHBhcnRzIG9mIGEgc3RhY2sgdHJhY2Ugb2YgYW4gZXhjZXB0aW9uLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSB0cmFjZSBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLgotIyBUaGUgc2Vjb25kIGlzIHRoZSB0cmFjZSBmcm9tIHRoZSBsb2NhbCBzeXN0ZW0uCi1SRU1PVEVfVk1fVFJBQ0VfSU5GT18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA3M0kgKioqIFJlbW90ZVZNIEV4Y2VwdGlvbiAtIFRyYWNlIGZyb20gUmVtb3RlIFZNOgotUkVNT1RFX1ZNX0xPQ0FMX1RSQUNFX0lORk9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNzRJICoqKiBMb2NhbCBTdGFja1RyYWNlOgotCi0jIEluIHRoZSB0d28gYmVsb3csIHswfSBpcyBhIHN0cmluZyB0aGF0IGlzIGEgamF2YSBjcmVhdGlvbiBzdHJpbmcsIGUuZy4gIm5ldyBJbnRlZ2VyKDMpIiwgc28gdGhleSBkb24ndCBwYXJ0aWNpcGF0ZSBpbiB0cmFuc2xhdGlvbi4KLSMgSW4gQ2xhc3NjYXN0LCB7MX0gaXMgYSBqYXZhIHR5cGUgbmFtZSwgZS5nLiBqYXZhLmxhbmcuSW50ZWdlci4KLUNsYXNzY2FzdF9FWENfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTI0RSAiezB9IiBkb2VzIG5vdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgdHlwZSB7MX0KLUluc3RhbnRpYXRlX0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTI1RSAiezB9IiBpcyB0b28gY29tcGxpY2F0ZWQgdG8gYmUgZXZhbHVhdGVkCi0KLSMgezB9IGlzIGEgbnVtYmVyLCBlLmcuIDEsIDIsIC4uLgotUmVtb3RlQ21kX0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxMjZFIFJlbW90ZSBjb21tYW5kIGVycm9yIHswfQotCi0jIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhjZXB0aW9uIGVycm9yIHdoZXJlIHswfSBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIGV4Y2VwdGlvbiBhbmQgezF9IGlzIHRoZSBtZXNzYWdlIGZyb20gdGhlIGV4Y2VwdGlvbgotIyBUaGUgbWVzc2FnZSB7MX0gaGFzIGFscmVhZHkgYmVlbiBsb2NhbGl6ZWQgKGlmIGl0IHN1cHBsaWVkIGl0IGxvY2FsaXplZCkuIEl0IGNvbWVzIGZyb20gc29tZXdoZXJlIG91dHNpZGUgb2Ygb3VyIHByb2plY3QuCi1FeGNlcHRpb25FcnJvck1zZ19FWENfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDEzNUUgezB9KHsxfSkKLU9LXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE9LCi1Qcm94eV9Ob1J1bm5lcl9FUlJPUl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDEzN0UgQ291bGQgbm90IGZpbmQgYSBSdW4gdHlwZSBydW5uZXIgdG8gbGF1bmNoIGZvciBcInswfVwiLgotUHJveHlfRXJyb3JfVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRXJyb3I6Ci1Qcm94eV9UZXJtaW5hdGVkX3Rvb19zb29uX0VSUk9SXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDEzOEUgUmVtb3RlIFZNIHRlcm1pbmF0ZWQgdG9vIHNvb24uIFNlZSAubG9nIGZpbGUgZm9yIHRyYWNlIG9mIG91dHB1dC4gRm9yIFZNIFwiezB9XCIuCi0jIFRoaXMgaXMgYSBsYXVuY2ggbmFtZSBmb3IgYSBnaXZlbiBwcm9qZWN0IG5hbWUgKHswfSkuCi0jIFdBUk5JTkcgZm9yIHRoZSBQcm94eVJlbW90ZVZNTmFtZSBhbmQgUHJveHlSZW1vdGVWTU5hbWVXaXRoQ29tbWVudCBkbyBub3QgdXNlIGRvdWJsZS1xdW90ZSAoIikuIEl0IHdpbGwgY2F1c2UgcHJvYmxlbXMuCi1Qcm94eVJlbW90ZVZNTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBQcm9qZWN0ICh7MH0pCi0jIFRoaXMgaXMgYSBsYXVuY2ggbmFtZSB0aGF0IGhhcyBhIGNvbW1lbnQgKHswfSBpcyBwcm9qZWN0IG5hbWUsIHsxfSBpcyB0aGUgY29tbWVudCBmb3IgdGhpcyBwcm9qZWN0IGxhdW5jaCkKLVByb3h5UmVtb3RlVk1OYW1lV2l0aENvbW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFByb2plY3QgKHswfSktezF9Ci0KLVByb3h5UmVtb3RlTm9MYXVuY2hLZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IENhbm5vdCBsYXVuY2ggbG9jYWwgcHJveHkgcmVnaXN0cnkuIE5vdCBsYXVuY2hlZCBmcm9tIHZhbGlkIGxhdW5jaGVyLgotCi0jIHswfSBpcyB0aGUgYXBwcm9wcmlhdGUgVk1OYW1lIGZyb20gdGhlIGFib3ZlIHR3byBlbnRyaWVzLgotUHJveHlSZW1vdGVMYXVuY2hWTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTGF1bmNoaW5nIHJlbW90ZSB2bSAiezB9IgotCi1DbGVhbnVwSm9iX3RpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBSZW1vdGUgVk0gQ2xlYW51cCBHQydkIFByb3hpZXMgSm9iCi0KLVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0NhbGxiYWNrQ29ubmVjdGlvbk5vdFdvcmtpbmdfRVhDXyAgICAgICAgICAgICA9IElXQVYwMTY5RSBDYWxsYmFjayBjb25uZWN0aW9uIGlzIG5vdCB3b3JraW5nLgotUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ29ubmVjdGlvbkNyZWF0aW9uRmFpbGVkX0lORk9fICAgICAgICAgICAgICAgID0gSVdBVjAxNzBJIENvbm5lY3Rpb24gY3JlYXRpb24gZmFpbGVkLgotUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfSm9iX1Rlcm1pbmF0ZVByb2Nlc3NfVGl0bGU9VGVybWluYXRlIHRoZSByZW1vdGUgdm0gcHJvY2Vzcy4KLVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0NvdWxkTm90Q3JlYXRlU29ja2V0Q29ubmVjdGlvblRvUmVtb3RlVk1fRVhDXyA9IElXQVYwMTcxRSBDb3VsZCBub3QgY3JlYXRlIGEgc29ja2V0IGNvbm5lY3Rpb24gdG8gcmVtb3RlIHZtLgotUkVNRXhwcmVzc2lvbl9JT0V4Y2VwdGlvblNlZUxvZ19JTkZPXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNzJJIEkvTyBFeGNlcHRpb24gb2NjdXJyZWQuIFNlZSAubG9nIGZpbGUgZm9yIGRldGFpbHMuCi1SRU1FeHByZXNzaW9uX0NvbW1hbmRFeGNlcHRpb25TZWVMb2dfSU5GT18gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE3M0kgQ29tbWFuZCBFeGNlcHRpb24gb2NjdXJyZWQuIFNlZSAubG9nIGZpbGUgZm9yIGRldGFpbHMuCi1Mb2NhbFByb3h5TGF1bmNoRGVsZWdhdGVfTW9uaXRvcl9QcmludFJlbW90ZVRyYWNlX1RleHQ9UHJpbnQgcmVtb3RlIHZtIHRyYWNlIG91dHB1dApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMDk4OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElERUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotIAotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSURFQWNjZXNzaWJsZU9iamVjdFByb3h5IGV4dGVuZHMgSURFQmVhblByb3h5IGltcGxlbWVudHMgSUFjY2Vzc2libGVPYmplY3RQcm94eSB7Ci0KLQlwcm90ZWN0ZWQgSURFQWNjZXNzaWJsZU9iamVjdFByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFQcm94eUZhY3RvcnlSZWdpc3RyeSkgewotCQlzdXBlcihhUHJveHlGYWN0b3J5UmVnaXN0cnkpOwotCX0KLQotCXByb3RlY3RlZCBJREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBPYmplY3QgYW5PYmplY3QpIHsKLQkJc3VwZXIoYVByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhbk9iamVjdCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUFjY2Vzc2libGVPYmplY3RQcm94eSNpc0FjY2Vzc2libGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWNjZXNzaWJsZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoKEFjY2Vzc2libGVPYmplY3QpIGdldEJlYW4oKSkuaXNBY2Nlc3NpYmxlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUFjY2Vzc2libGVPYmplY3RQcm94eSNzZXRBY2Nlc3NpYmxlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzaWJsZShib29sZWFuIGZsYWcpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCSgoQWNjZXNzaWJsZU9iamVjdCkgZ2V0QmVhbigpKS5zZXRBY2Nlc3NpYmxlKGZsYWcpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjZ2V0VHlwZVByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuYWNjZXNzaWJsZVR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUFycmF5QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUFycmF5QmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOGQ1NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVBcnJheUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUFycmF5QmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogSURFIFZNIHZlcnNpb24gb2YgdGhlIEFycmF5IHByb3h5Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIElERUFycmF5QmVhblByb3h5IGV4dGVuZHMgSURFT2JqZWN0QmVhblByb3h5IGltcGxlbWVudHMgSUFycmF5QmVhblByb3h5IHsKLQotCXByaXZhdGUgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBmQmVhblR5cGVQcm94eUZhY3Rvcnk7Ci0JCi1JREVBcnJheUJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIE9iamVjdCBhcnJheSxJQmVhblR5cGVQcm94eSBhVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYXJyYXkgLGFUeXBlKTsKLQlmQmVhblR5cGVQcm94eUZhY3RvcnkgPSAoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSlhUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLX0KLS8qKgotICogR2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgZ2V0KGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCS8vIGlmIHdlIGp1c3QgdXNlZCB0aGUgc3RhbmRhcmQgZ2V0LCBpZiB0aGUgdHlwZSB3YXMgImludCIgdGhlIHZhbHVlIHJldHVybmVkIHdvdWxkIGJlIGFuIGphdmEubGFuZy5JbnRlZ2VyLgotCUlCZWFuVHlwZVByb3h5IGNvbXBUeXBlID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCWlmICghY29tcFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkvLyBVc2Ugc3RhbmRhcmQgZ2V0dGVyLgotCQlPYmplY3QgcmVzdWx0ID0gQXJyYXkuZ2V0KGZCZWFuLGluZGV4KTsKLQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKChJREVCZWFuVHlwZVByb3h5KWZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHJlc3VsdC5nZXRDbGFzcygpKSkubmV3QmVhblByb3h5KHJlc3VsdCk7Ci0JfSBlbHNlIHsKLQkJLy8gVXNlIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSBnZXR0ZXIuCi0JCWludCBpZCA9ICgoSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSljb21wVHlwZSkuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuQllURToKLQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJ5dGVUeXBlLmNyZWF0ZUJ5dGVCZWFuUHJveHkoQXJyYXkuZ2V0Qnl0ZShmQmVhbixpbmRleCkpOwotCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkJPT0xFQU46Ci0JCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ib29sZWFuVHlwZS5jcmVhdGVCb29sZWFuQmVhblByb3h5KEFycmF5LmdldEJvb2xlYW4oZkJlYW4saW5kZXgpKTsKLQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5DSEFSOgotCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhclR5cGUuY3JlYXRlQ2hhckJlYW5Qcm94eShBcnJheS5nZXRDaGFyKGZCZWFuLGluZGV4KSk7Ci0JCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRE9VQkxFOgotCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuZG91YmxlVHlwZS5jcmVhdGVEb3VibGVCZWFuUHJveHkoQXJyYXkuZ2V0RG91YmxlKGZCZWFuLGluZGV4KSk7Ci0JCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRkxPQVQ6Ci0JCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5mbG9hdFR5cGUuY3JlYXRlRmxvYXRCZWFuUHJveHkoQXJyYXkuZ2V0RmxvYXQoZkJlYW4saW5kZXgpKTsKLQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5JTlRFR0VSOgotCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuaW50VHlwZS5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KEFycmF5LmdldEludChmQmVhbixpbmRleCkpOwotCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkxPTkc6Ci0JCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5sb25nVHlwZS5jcmVhdGVMb25nQmVhblByb3h5KEFycmF5LmdldExvbmcoZkJlYW4saW5kZXgpKTsKLQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5TSE9SVDoKLQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnNob3J0VHlwZS5jcmVhdGVTaG9ydEJlYW5Qcm94eShBcnJheS5nZXRTaG9ydChmQmVhbixpbmRleCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7IC8vIFNob3VsZG4ndCBnZXQgaGVyZSwgc2FpZCBpdCB3YXMgcHJpbWl0aXZlLCBidXQgbm90IG9uZSB3ZSB1bmRlcnN0YW5kCQkJCQotCQl9Ci0JfQkJCi19Ci0vKioKLSAqIEdldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbXVsdGktZGltZW5zaW9uYWwgaW5kZXguCi0gKiBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgc3BlY2lmaWVkLAotICogYW5kIGVhY2ggaW5kZXggYWxvbmcgdGhlIHdheSBtdXN0IGV4aXN0LgotICogVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCi0gKiBvZiBkaW1lbnNpb25zIG9mIHRoZSByZWFsIG9iamVjdC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgZ2V0KGludFtdIGluZGV4ZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JaWYgKGluZGV4ZXMubGVuZ3RoID09IDEpCi0JCXJldHVybiBnZXQoaW5kZXhlc1swXSk7Ci0JaW50IGRpbXMgPSAoKElBcnJheUJlYW5UeXBlUHJveHkpIGdldFR5cGVQcm94eSgpKS5nZXREaW1lbnNpb25zKCk7Ci0JaWYgKGRpbXMgPCBpbmRleGVzLmxlbmd0aCkKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBUb28gbWFueSBkaW1lbnNpb25zCi0JLy8gR2V0IHVwIHRvIHRoZSBuZXh0IHRvIGxhc3QgZGltZW5zaW9uIHNvIHRoYXQgd2UgY2FuIGRvIHRoZSBhcHByb3ByaWF0ZSBmaW5hbCBnZXQgZGVwZW5kaW5nIHVwb24gcHJpbWl0aXZlIG9yIG5vdC4KLQlPYmplY3QgYXJyYXkgPSBmQmVhbjsKLQlpbnQgbGFzdEFycmF5RGltID0gaW5kZXhlcy5sZW5ndGggLSAxOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGFzdEFycmF5RGltOyBpKyspCi0JCWFycmF5ID0gQXJyYXkuZ2V0KGFycmF5LCBpbmRleGVzW2ldKTsKLQotCWludCBpbmRleCA9IGluZGV4ZXNbbGFzdEFycmF5RGltXTsJLy8gRmluYWwgYXJyYXkgZGltIHRvIHJldHJpZXZlCi0JCi0JaWYgKGRpbXMgPT0gaW5kZXhlcy5sZW5ndGgpIHsKLQkJSUJlYW5UeXBlUHJveHkgZmluYWxDb21wVHlwZSA9ICgoSUFycmF5QmVhblR5cGVQcm94eSkgZ2V0VHlwZVByb3h5KCkpLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQlpZiAoZmluYWxDb21wVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgYXQgdGhlIHNwZWNpZmllZCBkaW1lbnNpb24gaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCQkJLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JCQlpbnQgaWQgPSAoKElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkpIGZpbmFsQ29tcFR5cGUpLmdldFByaW1pdGl2ZVR5cGUoKTsKLQkJCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuQllURSA6Ci0JCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYnl0ZVR5cGUuY3JlYXRlQnl0ZUJlYW5Qcm94eShBcnJheS5nZXRCeXRlKGFycmF5LCBpbmRleCkpOwotCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5CT09MRUFOIDoKLQkJCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ib29sZWFuVHlwZS5jcmVhdGVCb29sZWFuQmVhblByb3h5KEFycmF5LmdldEJvb2xlYW4oYXJyYXksIGluZGV4KSk7Ci0JCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkNIQVIgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmNoYXJUeXBlLmNyZWF0ZUNoYXJCZWFuUHJveHkoQXJyYXkuZ2V0Q2hhcihhcnJheSwgaW5kZXgpKTsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRE9VQkxFIDoKLQkJCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5kb3VibGVUeXBlLmNyZWF0ZURvdWJsZUJlYW5Qcm94eShBcnJheS5nZXREb3VibGUoYXJyYXksIGluZGV4KSk7Ci0JCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkZMT0FUIDoKLQkJCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5mbG9hdFR5cGUuY3JlYXRlRmxvYXRCZWFuUHJveHkoQXJyYXkuZ2V0RmxvYXQoYXJyYXksIGluZGV4KSk7Ci0JCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LklOVEVHRVIgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmludFR5cGUuY3JlYXRlSW50ZWdlckJlYW5Qcm94eShBcnJheS5nZXRJbnQoYXJyYXksIGluZGV4KSk7Ci0JCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkxPTkcgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmxvbmdUeXBlLmNyZWF0ZUxvbmdCZWFuUHJveHkoQXJyYXkuZ2V0TG9uZyhhcnJheSwgaW5kZXgpKTsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuU0hPUlQgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnNob3J0VHlwZS5jcmVhdGVTaG9ydEJlYW5Qcm94eShBcnJheS5nZXRTaG9ydChhcnJheSwgaW5kZXgpKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIG51bGw7IC8vIFNob3VsZG4ndCBnZXQgaGVyZSwgc2FpZCBpdCB3YXMgcHJpbWl0aXZlLCBidXQgbm90IG9uZSB3ZSB1bmRlcnN0YW5kCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBXb24ndCBiZSByZXR1cm5pbmcgYSBwcmltaXRpdmUsIHNvIHVzZSBzdGFuZGFyZCBhY2Nlc3NvcgotCU9iamVjdCByZXN1bHQgPSBBcnJheS5nZXQoYXJyYXksIGluZGV4KTsKLQlpZiAocmVzdWx0ID09IG51bGwpCi0JCXJldHVybiBudWxsOwotCXJldHVybiAoKElERUJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHJlc3VsdC5nZXRDbGFzcygpKSkubmV3QmVhblByb3h5KAotCQlyZXN1bHQpOwotfQotCi0vKioKLSAqIFNldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gKi8KLXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IHZhbHVlUHJveHksIGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCS8vIGlmIHdlIGp1c3QgdXNlZCB0aGUgc3RhbmRhcmQgZ2V0LCBpZiB0aGUgdHlwZSB3YXMgImludCIgdGhlIHZhbHVlIHJldHVybmVkIHdvdWxkIGJlIGFuIGphdmEubGFuZy5JbnRlZ2VyLgotCU9iamVjdCB2YWx1ZSA9ICgoSUlERUJlYW5Qcm94eSl2YWx1ZVByb3h5KS5nZXRCZWFuKCk7Ci0JQ2xhc3MgdmFsdWVDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7Ci0JaWYgKCF2YWx1ZUNsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJLy8gVXNlIHN0YW5kYXJkIGdldHRlci4KLQkJQXJyYXkuc2V0KGZCZWFuLGluZGV4LHZhbHVlKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gQnl0ZS5UWVBFICkgewotCQlBcnJheS5zZXRCeXRlKGZCZWFuLGluZGV4LCgoQnl0ZSl2YWx1ZSkuYnl0ZVZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBCb29sZWFuLlRZUEUgKXsKLQkJQXJyYXkuc2V0Qm9vbGVhbihmQmVhbixpbmRleCwoKEJvb2xlYW4pdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsJCQkKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gQ2hhcmFjdGVyLlRZUEUpIHsKLQkJQXJyYXkuc2V0Q2hhcihmQmVhbixpbmRleCwoKENoYXJhY3Rlcil2YWx1ZSkuY2hhclZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBEb3VibGUuVFlQRSkgewotCQlBcnJheS5zZXREb3VibGUoZkJlYW4saW5kZXgsKChEb3VibGUpdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBGbG9hdC5UWVBFKSB7Ci0JCUFycmF5LnNldEZsb2F0KGZCZWFuLGluZGV4LCgoRmxvYXQpdmFsdWUpLmZsb2F0VmFsdWUoKSk7CQkKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gSW50ZWdlci5UWVBFKSB7Ci0JCUFycmF5LnNldEludChmQmVhbixpbmRleCwoKEludGVnZXIpdmFsdWUpLmludFZhbHVlKCkpOwkJCi0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IExvbmcuVFlQRSApIHsKLQkJQXJyYXkuc2V0TG9uZyhmQmVhbixpbmRleCwoKExvbmcpdmFsdWUpLmxvbmdWYWx1ZSgpKTsJCQotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBTaG9ydC5UWVBFICkgewotCQlBcnJheS5zZXRTaG9ydChmQmVhbixpbmRleCwoKFNob3J0KXZhbHVlKS5zaG9ydFZhbHVlKCkpOwkJCi0JfQotfQotLyoqCi0gKiBTZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG11bHRpLWRpbWVuc2lvbmFsIGluZGV4LgotICogVGhlIGFycmF5IG11c3QgYmUgYXQgbGVhc3QgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHNwZWNpZmllZCwKLSAqIGFuZCBlYWNoIGluZGV4IGFsb25nIHRoZSB3YXkgbXVzdCBleGlzdC4KLSAqIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBjYW4ndCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgotICogb2YgZGltZW5zaW9ucyBvZiB0aGUgcmVhbCBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IHZhbHVlUHJveHksIGludFtdIGluZGV4ZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0KLQlPYmplY3Qgc3ViQXJyYXkgPSBmQmVhbjsKLQlpbnQgdXBUbyA9IGluZGV4ZXMubGVuZ3RoIC0gMTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHVwVG87IGkrKykKLQkJc3ViQXJyYXkgPSBBcnJheS5nZXQoc3ViQXJyYXksIGluZGV4ZXNbaV0pOwotCWludCBpbmRleCA9IGluZGV4ZXNbdXBUb107Ci0KLQkvLyBOb3cgc2V0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbgotCS8vIElmIHRoZSBjb21wb25lbnQgdHlwZSBpcyBwcmltaXRpdmUsIHdlIG5lZWQgdG8gdXNlIHRoZSBjb3JyZWN0IGdldHRlciBzbyB0aGF0IGEgdmFsaWQgdmFsdWUgaXMgcmV0dXJuZWQsCi0JLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JT2JqZWN0IHZhbHVlID0gKChJSURFQmVhblByb3h5KSB2YWx1ZVByb3h5KS5nZXRCZWFuKCk7Ci0JQ2xhc3MgdmFsdWVDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7Ci0JaWYgKCF2YWx1ZUNsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJLy8gVXNlIHN0YW5kYXJkIGdldHRlci4KLQkJQXJyYXkuc2V0KHN1YkFycmF5LCBpbmRleCwgdmFsdWUpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBCeXRlLlRZUEUpIHsKLQkJQXJyYXkuc2V0Qnl0ZShzdWJBcnJheSwgaW5kZXgsICgoQnl0ZSkgdmFsdWUpLmJ5dGVWYWx1ZSgpKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gQm9vbGVhbi5UWVBFKSB7Ci0JCUFycmF5LnNldEJvb2xlYW4oc3ViQXJyYXksIGluZGV4LCAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IENoYXJhY3Rlci5UWVBFKSB7Ci0JCUFycmF5LnNldENoYXIoc3ViQXJyYXksIGluZGV4LCAoKENoYXJhY3RlcikgdmFsdWUpLmNoYXJWYWx1ZSgpKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gRG91YmxlLlRZUEUpIHsKLQkJQXJyYXkuc2V0RG91YmxlKHN1YkFycmF5LCBpbmRleCwgKChEb3VibGUpIHZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gRmxvYXQuVFlQRSkgewotCQlBcnJheS5zZXRGbG9hdChzdWJBcnJheSwgaW5kZXgsICgoRmxvYXQpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBJbnRlZ2VyLlRZUEUpIHsKLQkJQXJyYXkuc2V0SW50KHN1YkFycmF5LCBpbmRleCwgKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IExvbmcuVFlQRSkgewotCQlBcnJheS5zZXRMb25nKHN1YkFycmF5LCBpbmRleCwgKChMb25nKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBTaG9ydC5UWVBFKSB7Ci0JCUFycmF5LnNldFNob3J0KHN1YkFycmF5LCBpbmRleCwgKChTaG9ydCkgdmFsdWUpLnNob3J0VmFsdWUoKSk7Ci0JfQotCi19Ci0vKioKLSAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhpcyBhcnJheS4KLSAqIElmIHRoZXJlIGFyZSBtdWx0aS1kaW1lbnNpb25zLCB5b3UgbXVzdCBnZXQgdGhlIGFwcHJvcHJpYXRlCi0gKiBkaW1lbnNpb24gZnJvbSB0aGUgZ2V0IG1ldGhvZCB0byBzZWUgdGhlIHNpemUgb2YgdGhhdCBkaW1lbnNpb24uCi0gKgotICogZS5nLgotICogICAgaW50IFszXSByZXR1cm5zIDMKLSAqICAgIGludCBbM11bMl0gcmV0dXJucyAzCi0gKgotICogICAgKChJQXJyYXlCZWFuUHJveHkpIGdldCgxKSkuZ2V0TGVuZ3RoKCkgcmV0dXJucyAyCi0gKiAgICBTaW5jZSBhcnJheXMgZG8gbm90IGhhdmUgdG8gYmUgaG9tb2dlbm91cywgdGhlcmUgY291bGQKLSAqICAgIGJlIGEgZGlmZmVyZW50IGxlbmd0aCBhcnJheSBmb3IgZWFjaCBvZiB0aGUgYXJyYXlzIAotICogICAgcmV0dXJuZWQgZnJvbSB0aGUgZmlyc3QgZGltZW5zaW9uLCB0aGUgcmV0dXJuZWQgbGVuZ3RoCi0gKiAgICBmcm9tIGdldCgyKSBhbmQgZ2V0KDMpIGNvdWxkIHJlc3VsdCBpbiBhIGRpZmZlcmVudCB2YWx1ZQotICogICAgZnJvbSBnZXQoMSkuCi0gKi8KLXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCXJldHVybiBBcnJheS5nZXRMZW5ndGgoZkJlYW4pOwotfQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklBcnJheUJlYW5Qcm94eSNnZXRDYXRjaFRocm93YWJsZUV4Y2VwdGlvbihpbnQpCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0Q2F0Y2hUaHJvd2FibGVFeGNlcHRpb24oaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0KGluZGV4KTsKLQkJfSBjYXRjaCAoIFRocm93YWJsZVByb3h5IGV4YyApIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsJCQkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkKLQlwdWJsaWMgSUJlYW5Qcm94eVtdIGdldFNuYXBzaG90KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gSWYgdGhlIGNvbXBvbmVudCB0eXBlIGlzIHByaW1pdGl2ZSwgd2UgbmVlZCB0byB1c2UgdGhlIGNvcnJlY3QgZ2V0dGVyIHNvIHRoYXQgYSB2YWxpZCB2YWx1ZSBpcyByZXR1cm5lZCwKLQkJLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JCUlCZWFuVHlwZVByb3h5IGNvbXBUeXBlID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlpbnQgaWQgPSBjb21wVHlwZS5pc1ByaW1pdGl2ZSgpID8gKChJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5KWNvbXBUeXBlKS5nZXRQcmltaXRpdmVUeXBlKCkgOiAtMTsKLQkJSUJlYW5Qcm94eVtdIHJlc3VsdCA9IG5ldyBJQmVhblByb3h5W0FycmF5LmdldExlbmd0aChmQmVhbildOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGlkID09IC0xKSB7Ci0JCQkJLy8gVXNlIHN0YW5kYXJkIGdldHRlci4KLQkJCQlPYmplY3QgdmFsID0gQXJyYXkuZ2V0KGZCZWFuLGkpOwotCQkJCWlmICggdmFsICE9IG51bGwgKQotCQkJCQlyZXN1bHRbaV0gPSAoKElERUJlYW5UeXBlUHJveHkpZkJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkodmFsLmdldENsYXNzKCkpKS5uZXdCZWFuUHJveHkodmFsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVXNlIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSBnZXR0ZXIuCi0JCQkJc3dpdGNoIChpZCkgewotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuQllURToKLQkJCQkJCXJlc3VsdFtpXSA9IGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ieXRlVHlwZS5jcmVhdGVCeXRlQmVhblByb3h5KEFycmF5LmdldEJ5dGUoZkJlYW4saSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5CT09MRUFOOgotCQkJCQkJcmVzdWx0W2ldID0gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJvb2xlYW5UeXBlLmNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoQXJyYXkuZ2V0Qm9vbGVhbihmQmVhbixpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkNIQVI6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhclR5cGUuY3JlYXRlQ2hhckJlYW5Qcm94eShBcnJheS5nZXRDaGFyKGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRE9VQkxFOgotCQkJCQkJcmVzdWx0W2ldID0gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmRvdWJsZVR5cGUuY3JlYXRlRG91YmxlQmVhblByb3h5KEFycmF5LmdldERvdWJsZShmQmVhbixpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkZMT0FUOgotCQkJCQkJcmVzdWx0W2ldID0gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmZsb2F0VHlwZS5jcmVhdGVGbG9hdEJlYW5Qcm94eShBcnJheS5nZXRGbG9hdChmQmVhbixpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LklOVEVHRVI6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3RvcnkuaW50VHlwZS5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KEFycmF5LmdldEludChmQmVhbixpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkxPTkc6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3RvcnkubG9uZ1R5cGUuY3JlYXRlTG9uZ0JlYW5Qcm94eShBcnJheS5nZXRMb25nKGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuU0hPUlQ6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3Rvcnkuc2hvcnRUeXBlLmNyZWF0ZVNob3J0QmVhblByb3h5KEFycmF5LmdldFNob3J0KGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWJyZWFrOyAvLyBTaG91bGRuJ3QgZ2V0IGhlcmUsIHNhaWQgaXQgd2FzIHByaW1pdGl2ZSwgYnV0IG5vdCBvbmUgd2UgdW5kZXJzdGFuZAkJCQkKLQkJCQl9Ci0JCQl9CQkKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVBcnJheUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQXJyYXlCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWU4MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVBcnJheUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IElERUFycmF5QmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi0vKioKLSAqIEFycmF5IFR5cGUgUHJveHkgZm9yIHRoZSBJREUgVk0uCi0gKiAKLSAqIFRoZSBjbGFzcyBpcyBmaW5hbCBiZWNhdXNlIGFycmF5J3MgYXJlIHNwZWNpYWwgYW5kIHNob3VsZG4ndCBoYXZlIGFueSBzdWJjbGFzc2VzIHNpbmNlIHRoZSBmYWN0b3J5IHdvdWxkIG5ldmVyIGNhbGwgaXQuCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIElERUFycmF5QmVhblR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJQXJyYXlCZWFuVHlwZVByb3h5IHsKLQotCUlCZWFuVHlwZVByb3h5IGZGaW5hbENvbXBvbmVudFR5cGU7Ci0KLQlJQmVhblR5cGVQcm94eSBmQ29tcG9uZW50VHlwZTsKLQotCVN0cmluZyBmVHlwZU5hbWU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBhIHJlZ2lzdHJ5IGFuZCBhIGNsYXNzLiBJdCBpcyBwYWNrYWdlIHNvIHRoYXQgb25seSB0aGUgZmFjdG9yeSB3aXRoIHRoaXMgSURFIHBhY2thZ2UgY2FuIGNhbGwgaXQuCi0JICovCi0JSURFQXJyYXlCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgU3RyaW5nIGFUeXBlTmFtZSwgQ2xhc3MgYUNsYXNzKSB7Ci0JCS8vIFRoZSBjbGFzcyBvZiBhbiBBcnJheSBpcyBhbHdheXMgT2JqZWN0Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLQkJZlR5cGVOYW1lID0gYVR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYW4gYXJyYXkgdHlwZSEKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gZlR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpIHsKLQkJaWYgKGZGaW5hbENvbXBvbmVudFR5cGUgPT0gbnVsbCkgewotCQkJLy8gQ29tcG9uZW50IHR5cGUgaXMgc3RyaXAgb2ZmIGFsbCAnWycgYW5kIHJldHVybiBjbGFzcyBuYW1lIChpZiB3ZSBldmVyIGFkZCBjbGFzc0xvYWRlciBzdXBwb3J0LCB0aGlzIHdvbid0IHdvcmspLgotCQkJLy8gSG93ZXZlciwgaWYgdGhlIHR5cGUgaXMgYSBwcmltaXRpdmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBjaGFuZ2UgdGFibGUpLgotCQkJaW50IHR5cGVTdGFydCA9IGdldFR5cGVOYW1lKCkubGFzdEluZGV4T2YoJ1snKSArIDE7Ci0JCQlpZiAoZ2V0VHlwZU5hbWUoKS5jaGFyQXQodHlwZVN0YXJ0KSA9PSAnTCcpIHsKLQkJCQkvLyBJdCBpcyBhIGNsYXNzLgotCQkJCS8vIFN0cmlwIG9mZiB1cCB0byB0aGUgJ0wnLCBhbmQgdGhlIHRyYWlsaW5nICc7Jy4gVGhhdCBpcyB0aGUgY2xhc3MgbmFtZS4KLQkJCQlmRmluYWxDb21wb25lbnRUeXBlID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgKLQkJCQkJCWdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKHR5cGVTdGFydCArIDEsIGdldFR5cGVOYW1lKCkubGVuZ3RoKCkgLSAxKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEl0IGlzIGEgdHlwZS4gTmVlZCB0byBtYXAgaXQuCi0JCQkJQ2xhc3MgYVR5cGUgPSAoQ2xhc3MpIElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuTUFQX1NIT1JUU0lHX1RPX1RZUEUuZ2V0KGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKHR5cGVTdGFydCwgdHlwZVN0YXJ0ICsgMSkpOwotCQkJCWZGaW5hbENvbXBvbmVudFR5cGUgPSBhVHlwZSAhPSBudWxsID8gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShhVHlwZS5nZXROYW1lKCkpIDogbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkZpbmFsQ29tcG9uZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRDb21wb25lbnRUeXBlKCkgewotCQlpZiAoZkNvbXBvbmVudFR5cGUgPT0gbnVsbCkgewotCQkJLy8gQ29tcG9uZW50IHR5cGUgaXMgc3RyaXAgb2ZmIGZpcnN0ICdbJyBhbmQgcmV0dXJuIGNsYXNzIG5hbWUgKGlmIHdlIGV2ZXIgYWRkIGNsYXNzTG9hZGVyIHN1cHBvcnQsIHRoaXMgd29uJ3Qgd29yaykuCi0JCQkvLyBIb3dldmVyLCBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGNoYW5nZSB0YWJsZSkuCi0JCQlpZiAoZ2V0VHlwZU5hbWUoKS5jaGFyQXQoMSkgIT0gJ1snKSB7Ci0JCQkJLy8gSXQgaXMgYSBvbmUgZGltZW5zaW9uYWwgYXJyYXksIGp1c3Qgc2VuZCB0byBnZXRGaW5hbENvbXBvbmVudFR5cGUgdG8gZmlndXJlIG91dCB0aGUgdHlwZS4KLQkJCQlmQ29tcG9uZW50VHlwZSA9IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LiBKdXN0IHN0cmlwIG9mZiBvbmUgJ1snIGFuZCBzZW5kIHRoYXQgdG8gdGhlIGJlYW4gdHlwZSBmYWN0b3J5LgotCQkJCWZDb21wb25lbnRUeXBlID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShnZXRUeXBlTmFtZSgpLnN1YnN0cmluZygxKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDb21wb25lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuCi0JICovCi0JcHVibGljIGludCBnZXREaW1lbnNpb25zKCkgewotCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKS5sYXN0SW5kZXhPZignWycpICsgMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bGwgY3RvciBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29tcGF0aWJsZU1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkgRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBmaWVsZCBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXJndW1lbnRRdWFsaWZpZWRUeXBlTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFycmF5IGJlYW4gcHJveHkuCi0JICogIC0gKGludCwgbmV3IGludFsyXSB7MywgNH0pIHdpbGwgY3JlYXRlOiBpbnQgWzNdIFs0XQotCSAqICAtIChpbnRbXSwgbmV3IGludFsxXSB7MX0pIGludCBbMV0KLQkgKiAgLSAoaW50W10sIG5ldyBpbnRbMl0gezIsM30pIGludCBbMl0gWzNdCi0JICogCi0JICogIC0gKGludFtdLCBudWxsKSBvciAoaW50W10sIG5ldyBpbnRbMF0pIG9yIChpbnQsIG51bGwpIG9yIChpbnQsIG5ldyBpbnRbMF0pIGludCBbMF0gKGludFtdW10sIG51bGwpIG9yIChpbnRbXVtdLCBuZXcgaW50WzBdKSBpbnRbMF1bXSBUaGlzIGlzCi0JICogYmVjYXVzZSBhbiBhcnJheSBpbnN0YW5jZSB3aXRoIG5vIGRpbWVuc2lvbnMgc3BlY2lmaWVkIGlzIG5vdCB2YWxpZC4KLQkgKiAgLSAoaW50W11bXSwgbmV3IGludFsxXSB7M30pIGludFszXVtdCi0JICogCi0JICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gdGhhdCBvbmx5IHRoZSBSRU0gRmFjdG9yeSBjYW4gY2FsbCBpdC4KLQkgKi8KLQlJREVBcnJheUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGludFtdIGRpbWVuc2lvbnMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIElmIHRoZSBkaW1lbnNpb25zIGlzIG51bGwgb3IgemVybyBsZW5ndGgsIHRoZW4gY3JlYXRlIHRoZQotCQkvLyBhcnJheSBhcyBhIDAgc2l6ZWQgYXJyYXkgb25lIGRpbWVuc2lvbmFsIGFycmF5LgotCQlpZiAoZGltZW5zaW9ucyA9PSBudWxsIHx8IGRpbWVuc2lvbnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gY3JlYXRlQmVhblByb3h5V2l0aChuZXcgaW50W10geyAwfSk7Ci0KLQkJLy8gUmVtb3ZlIGZyb20gdGhpcyB0eXBlIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBzcGVjaWZpZWQKLQkJLy8gY29taW5nIGluLCB1cCB0byBidXQgbm8gZnVydGhlciB0aGFuIHRoZSBmaW5hbCBjb21wb25lbnQuCi0JCS8vIEZyb20gaGVyZSB3ZSBjYW4gdGhlbiB1c2UgdGhlIGFwcHJvcHJpYXRlIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Ci0JCS8vIG1ldGhvZCB0byBjcmVhdGUgdGhlIGFycmF5LgotCQlJQmVhblR5cGVQcm94eSBjb21wVHlwZSA9IG51bGw7IC8vIFRoZSB0eXBlIG9mIGFycmF5IHRvIGNyZWF0ZSAoaXQgbWF5IGJlIGRpZmZlcmVudCBudW1iZXIgb2YgZGltZW5zaW9ucykuCi0JCWludCBudW1EaW1zID0gZ2V0RGltZW5zaW9ucygpOwotCQlpZiAobnVtRGltcyA8PSBkaW1lbnNpb25zLmxlbmd0aCkKLQkJCWNvbXBUeXBlID0gZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7IC8vIFRoZXJlIGFyZSB0aGUgc2FtZSBvciBtb3JlIHJlcXVlc3RlZCBkaW1lbnNpb25zLCBzbyB1c2UgZmluYWwgY29tcG9uZW50IHR5cGUKLQkJZWxzZSB7Ci0JCQkvLyBUaGVyZSBhcmUgZmV3ZXIgcmVxdWVzdGVkIGRpbWVuc2lvbnMsIHNvIHN0cmlwIG9mZiB0aGF0IG1hbnkKLQkJCVN0cmluZyBjb21wQ2xhc3MgPSBnZXRUeXBlTmFtZSgpLnN1YnN0cmluZyhkaW1lbnNpb25zLmxlbmd0aCk7Ci0JCQljb21wVHlwZSA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoY29tcENsYXNzKTsKLQkJfQotCi0JCWlmIChkaW1lbnNpb25zLmxlbmd0aCA9PSAxKSB7Ci0JCQkvLyBVc2UgdGhlIG9uZSBkaW1lbnNpb24gY2FsbAotCQkJT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoKChJREVCZWFuVHlwZVByb3h5KSBjb21wVHlwZSkuZkNsYXNzLCBkaW1lbnNpb25zWzBdKTsKLQkJCXJldHVybiBuZXcgSURFQXJyYXlCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhcnJheSwgbnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBVc2UgdGhlIG11bHRpIGRpbWVuc2lvbiBjYWxsCi0JCQlPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZSgoKElERUJlYW5UeXBlUHJveHkpIGNvbXBUeXBlKS5mQ2xhc3MsIGRpbWVuc2lvbnMpOwotCQkJcmV0dXJuIG5ldyBJREVBcnJheUJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIGFycmF5LCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KSB7Ci0KLQkJcmV0dXJuIG5ldyBJREVBcnJheUJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIGFuT2JqZWN0LCB0aGlzKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgSUJlYW5UeXBlUHJveHkjZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWFsVHlwZU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0VHlwZU5hbWUoKTsKLQkJaW50IGRpbXMgPSBuYW1lLmxhc3RJbmRleE9mKCdbJykgKyAxOwotCQlTdHJpbmcgdHlwZSA9IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpLmdldFR5cGVOYW1lKCk7Ci0JCVN0cmluZ0J1ZmZlciBmb3JtYWxUeXBlID0gbmV3IFN0cmluZ0J1ZmZlcih0eXBlLmxlbmd0aCgpICsgKCJbXSIubGVuZ3RoKCkgKiBkaW1zKSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9ybWFsVHlwZS5hcHBlbmQodHlwZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGltczsgaSsrKQotCQkJZm9ybWFsVHlwZS5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZvcm1hbFR5cGUudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTUzYTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIElERUJlYW5Qcm94eSBpbXBsZW1lbnRzIElCZWFuUHJveHksIElJREVCZWFuUHJveHkgewotCi0JcHJvdGVjdGVkIE9iamVjdCBmQmVhbjsKLQlwcm90ZWN0ZWQgZmluYWwgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCi0JcHJvdGVjdGVkIElERUJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUHJveHlGYWN0b3J5UmVnaXN0cnkpIHsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5ID0gYVByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQlwcm90ZWN0ZWQgSURFQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFQcm94eUZhY3RvcnlSZWdpc3RyeSwgT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWZQcm94eUZhY3RvcnlSZWdpc3RyeSA9IGFQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQkJZkJlYW4gPSBhbk9iamVjdDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQl9Ci0JLyoqCi0JICogVVNFIHdpdGggZXh0cmVtZSBjYXJlCi0JICovCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRCZWFuKCkgewotCQlyZXR1cm4gZkJlYW47Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgdG9TdHJpbmcoKSBvZiB0aGUgYmVhbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gKGZCZWFuICE9IG51bGwgPyBmQmVhbi50b1N0cmluZygpIDogIm51bGwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgQXBwZW5kIHRoZSBiZWFuJ3MgdG8gc3RyaW5nIHRvIG91ciBvd24gbmFtZSBpZiB3ZSBoYXZlIG9uZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJaWYgKGZCZWFuID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiKCIgKyBmQmVhbi50b1N0cmluZygpICsgIikiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JfQotCS8qKgotCSAqIGVxdWFsczogSWYgdGhlcmUgYXJlIGlkZW50aWNhbCBvciBpZiB0aGV5IHdyYXBwZXIgdGhlIHNhbWUgYmVhbi4gSW4gdGhlIElERSBWTSB0aGlzCi0JICogY2FuIGhhcHBlbiBpZiBiZWFuIHByb3hpZXMgYXJlIGNyZWF0ZWQgZnJvbSBhIEJlYW4sIHNpbmNlIHByb3hpZXMgYXJlbid0IGNhY2hlZCBpbgotCSAqIHRoZSBiZWFucHJveHkgZmFjdG9yeSwgbW9yZSB0aGFuIG9uZSBwcm94eSBjYW4gYmUgY3JlYXRlZCBmb3IgdGhlIHNhbWUgYmVhbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuZXF1YWxzKG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElJREVCZWFuUHJveHkpIHsKLQkJCXJldHVybiBmQmVhbi5lcXVhbHMoKChJSURFQmVhblByb3h5KSBvYmopLmdldEJlYW4oKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gMTIzNDUgKyAoZ2V0QmVhbigpICE9IG51bGwgPyBnZXRCZWFuKCkuaGFzaENvZGUoKSA6IDApOyAKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBJSURFQmVhblByb3h5KQotCQkJcmV0dXJuIGdldEJlYW4oKSA9PSAoKElJREVCZWFuUHJveHkpIGFCZWFuUHJveHkpLmdldEJlYW4oKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0JlYW5Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCZWFuUHJveHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNFeHByZXNzaW9uUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXhwcmVzc2lvblByb3h5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwYzliOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogJFJDU2ZpbGU6IElERUJlYW5UeXBlUHJveHkuamF2YSx2ICQgJFJldmlzaW9uOiAxLjE0ICQgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBJREVCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblByb3h5IGltcGxlbWVudHMgSUJlYW5UeXBlUHJveHkgewotCi0JcHJvdGVjdGVkIElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQotCUNsYXNzIGZDbGFzczsKLQotCXByb3RlY3RlZCBJREVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCQlmQ2xhc3MgPSBhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogR2V0IFR5cGUgUHJveHkuIFRoZSB0eXBlIHByb3h5IG9mIGEgQmVhblR5cGUgaXMgQ2xhc3MuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuICgoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmNsYXNzQ2xhc3M7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHsKLQkJcmV0dXJuIGZDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJcmV0dXJuIGZDbGFzcy50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gZkNsYXNzLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0tpbmRPZihJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCQlyZXR1cm4gKChJREVCZWFuVHlwZVByb3h5KSBhQmVhblR5cGVQcm94eSkuZkNsYXNzLmlzQXNzaWduYWJsZUZyb20oZkNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGZDbGFzcy5pc0ludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZkNsYXNzLmlzUHJpbWl0aXZlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGZDbGFzcy5pc0FycmF5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXRNZXRob2RzKCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kcyhmQ2xhc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RGVjbGFyZWRNZXRob2RzKGZDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogV2UgY2FuIHVzZSByZWZsZWN0aW9uIG9uIG91ciBjbGFzcyB0byBmaW5kIHRoZSBqYXZhLnJlZmxlY3QuTWV0aG9kIGluc3RhbmNlIGFuZCBjcmVhdGUgdGhlIElERU1ldGhvZFByb3h5IGRpcmVjdGx5Ci0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSkgewotCi0JCXRyeSB7Ci0JCQlNZXRob2QgYU1ldGhvZCA9IGZDbGFzcy5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IENsYXNzWzBdKTsKLQkJCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eShhTWV0aG9kKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZFByb3h5KHRoaXMsIG1ldGhvZE5hbWUsIGFyZ3VtZW50Q2xhc3NOYW1lcyk7Ci0JfQotCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGZpcnN0QXJnQ2xhc3MpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KG1ldGhvZE5hbWUsIG5ldyBTdHJpbmdbXSB7IGZpcnN0QXJnQ2xhc3N9KTsKLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3MpIHsKLQkJQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzW2FyZ3MubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhcmdDbGFzc2VzW2ldID0gKChJREVCZWFuVHlwZVByb3h5KSBhcmdzW2ldKS5mQ2xhc3M7Ci0JCX0KLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZFByb3h5KGZDbGFzcywgbWV0aG9kTmFtZSwgYXJnQ2xhc3Nlcyk7Ci0JfQotCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldERlY2xhcmVkTWV0aG9kUHJveHkoZkNsYXNzLCBtZXRob2ROYW1lLCBhcmd1bWVudENsYXNzTmFtZXMpOwotCX0KLQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmdzKSB7Ci0JCUNsYXNzW10gYXJnQ2xhc3NlcyA9IG51bGw7Ci0JCWlmIChhcmdzICE9IG51bGwpIHsKLQkJCWFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbYXJncy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXJnQ2xhc3Nlc1tpXSA9ICgoSURFQmVhblR5cGVQcm94eSkgYXJnc1tpXSkuZkNsYXNzOwotCQkJfQotCQl9Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXREZWNsYXJlZE1ldGhvZFByb3h5KGZDbGFzcywgbWV0aG9kTmFtZSwgYXJnQ2xhc3Nlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkobWV0aG9kTmFtZSwgYXJndW1lbnRUeXBlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudENsYXNzTmFtZSkgewotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkobWV0aG9kTmFtZSwgYXJndW1lbnRDbGFzc05hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkobWV0aG9kTmFtZSwgYXJndW1lbnRDbGFzc05hbWVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkobWV0aG9kTmFtZSk7Ci0JfQotCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJnVHlwZU5hbWVzKSB7Ci0JCUlCZWFuVHlwZVByb3h5W10gYXJnQ2xhc3NlcyA9IG5ldyBJQmVhblR5cGVQcm94eVthcmdUeXBlTmFtZXMubGVuZ3RoXTsKLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYnRGYWN0b3J5ID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhcmdDbGFzc2VzW2ldID0gYnRGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoYXJnVHlwZU5hbWVzW2ldKTsKLQkJCWlmIChhcmdDbGFzc2VzW2ldID09IG51bGwpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJDb25zdHJ1Y3RvciBub3QgZm91bmQgLSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyBmQ2xhc3MuZ2V0TmFtZSgpICsgIiBhcmdzPSIgKyBhcmdUeXBlTmFtZXMsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3RvclByb3h5KGFyZ0NsYXNzZXMpOwotCX0KLQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJncykgewotCQlDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbYXJncy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWFyZ0NsYXNzZXNbaV0gPSAoKElERUJlYW5UeXBlUHJveHkpIGFyZ3NbaV0pLmZDbGFzczsKLQkJfQotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0Q29uc3RydWN0b3JQcm94eShmQ2xhc3MsIGFyZ0NsYXNzZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRDb25zdHJ1Y3RvcnMoZkNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ1R5cGVOYW1lcykgewotCQlJQmVhblR5cGVQcm94eVtdIGFyZ0NsYXNzZXMgPSBuZXcgSUJlYW5UeXBlUHJveHlbYXJnVHlwZU5hbWVzLmxlbmd0aF07Ci0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJ0RmFjdG9yeSA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJYXJnQ2xhc3Nlc1tpXSA9IGJ0RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFyZ1R5cGVOYW1lc1tpXSk7Ci0JCQlpZiAoYXJnQ2xhc3Nlc1tpXSA9PSBudWxsKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiQ29uc3RydWN0b3Igbm90IGZvdW5kIC0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgZkNsYXNzLmdldE5hbWUoKSArICIgYXJncz0iICsgYXJnVHlwZU5hbWVzLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KGFyZ0NsYXNzZXMpOwotCX0KLQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmdzKSB7Ci0JCUNsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1thcmdzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJYXJnQ2xhc3Nlc1tpXSA9ICgoSURFQmVhblR5cGVQcm94eSkgYXJnc1tpXSkuZkNsYXNzOwotCQl9Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoZkNsYXNzLCBhcmdDbGFzc2VzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXREZWNsYXJlZENvbnN0cnVjdG9ycyhmQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3VwZXJ0eXBlIGZvciB1cyBVc2UgdGhlIGZhY3RvcnkgdG8gZ2V0IGl0IHJhdGhlciB0aGFuIGNyZWF0ZSBpdCBkaXJlY3RseSBzbyB0aGF0IHRoZSBmYWN0b3J5IGhhcyB0aGUgY2hhbmNlIHRvIGNhY2hlIGNsYXNzZXMgaWYKLQkgKiByZXF1aXJlZCBUaGlzIGlzIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIGludGVyZmFjZQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRTdXBlckJlYW5UeXBlUHJveHkoKSB7Ci0KLQkJaWYgKGZDbGFzcy5pc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UKLQkJCXJldHVybiBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGZDbGFzcy5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRGaWVsZHMoZkNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXREZWNsYXJlZEZpZWxkcyhmQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCUZpZWxkIGZpZWxkID0gZkNsYXNzLmdldEZpZWxkKGZpZWxkTmFtZSk7Ci0JCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RmllbGRQcm94eShmaWVsZCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4YykgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJGaWVsZCBub3QgZm91bmQgIiArIGZDbGFzcy5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgIiAtICIgKyBmaWVsZE5hbWUsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJRmllbGRQcm94eSBnZXREZWNsYXJlZEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJRmllbGQgZmllbGQgPSBmQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZChmaWVsZE5hbWUpOwotCQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldEZpZWxkUHJveHkoZmllbGQpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiRmllbGQgbm90IGZvdW5kICIgKyBmQ2xhc3MuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICIgLSAiICsgZmllbGROYW1lLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIElERSBXZSBjYW4gdXNlIHRoZSBwYWNrYWdlIHByb3RlY3RlZCBjb250c3RydWN0b3Igb24KLQkgKiBJREVDb25zdHJ1Y3RvclByb3h5Ci0JICovCi0JSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShDbGFzc1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0KLQkJQ29uc3RydWN0b3IgYUNvbnN0cnVjdG9yID0gbnVsbDsKLQotCQkvLyBVc2UgcmVmbGVjdGlvbiB0byB0cnkgYW5kIGZpbmQgYSBjb25zdHJ1Y3Rvci4gVGhlIGFyZ3VtZW50Q2xhc3NOYW1lcyBtdXN0IGJlIGNvbnZlcnRlZCB0byBjbGFzc2VzCi0JCXRyeSB7Ci0JCQlhQ29uc3RydWN0b3IgPSBmQ2xhc3MuZ2V0Q29uc3RydWN0b3IocGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIElmIHdlIGhhdmUgYSBjb25zdHJ1Y3RvciByZXR1cm4gaXQKLQkJaWYgKGFDb25zdHJ1Y3RvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TmV3Q29uc3RydWN0b3JQcm94eShhQ29uc3RydWN0b3IpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEZhY3RvcmVkIGludG8gaXRzIG93biBtZXRob2Qgc28gc3ViY2xhc3MgY2FuIG92ZXJyaWRlCi0JICovCi0JcHJvdGVjdGVkIElDb25zdHJ1Y3RvclByb3h5IGdldE5ld0NvbnN0cnVjdG9yUHJveHkoQ29uc3RydWN0b3IgYUNvbnN0cnVjdG9yKSB7Ci0KLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldENvbnN0cnVjdG9yUHJveHkoYUNvbnN0cnVjdG9yKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBudWxsIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBJREUgV2UgY2FuIHVzZSB0aGUgcGFja2FnZSBwcm90ZWN0ZWQgY29udHN0cnVjdG9yIG9uCi0JICogSURFQ29uc3RydWN0b3JQcm94eQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpIHsKLQotCQlDb25zdHJ1Y3RvciBhQ29uc3RydWN0b3IgPSBudWxsOwotCi0JCS8vIFVzZSByZWZsZWN0aW9uIHRvIHRyeSBhbmQgZmluZCBhIGNvbnN0cnVjdG9yLiBUaGUgYXJndW1lbnRDbGFzc05hbWVzIG11c3QgYmUgY29udmVydGVkIHRvIGNsYXNzZXMKLQkJdHJ5IHsKLQkJCWFDb25zdHJ1Y3RvciA9IGZDbGFzcy5nZXRDb25zdHJ1Y3RvcihudWxsKTsKLQkJCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRDb25zdHJ1Y3RvclByb3h5KGFDb25zdHJ1Y3Rvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB7Ci0JCXJldHVybiAoKElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSkuY3JlYXRlQmVhblByb3h5KHRoaXMsIGluaXRpYWxpemF0aW9uU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuICgoSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpKS5jcmVhdGVCZWFuUHJveHkodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBVc2UgdGhlIGNvbnN0cnVjdG9yIHRoYXQgYWxsb3dzIHRoZSB0eXBlIHByb3h5IHRvIGJlIHNldCBhcyB3ZWxsIGFzIHRoZSBiZWFuIGJlY2F1c2Ugd2UgYXJlCi0JICogdGhlIHR5cGUgYW5kIGJ5IHNldHRpbmcgaXQgbm93IHdlIG1pZ2h0IGF2b2lkIGl0IGJlaW5nIGxvb2t1cCBmb3IgaW4gdGhlIGZhY3RvcnkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQgZm9yCi0JICogCi0JICogTk9URTogQWxsIHN1YmNsYXNzZXMgbmVlZCB0byBvdmVycmlkZSB0aGlzIHRvIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgSURFQmVhblByb3h5LgotCSAqLwotCXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpIHsKLQotCQlyZXR1cm4gbmV3IElERU9iamVjdEJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIGFuT2JqZWN0LCB0aGlzKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN1YmNsYXNzIGJlYW50eXBlIHByb3h5LgotCSAqLwotCXB1YmxpYyBJREVCZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoQ2xhc3MgdHlwZSkgewotCQkvLyBEZWZhdWx0IGlzIGp1c3QgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGlzIHNhbWUgY2xhc3MuCi0JCXJldHVybiBuZXcgSURFQmVhblR5cGVQcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUJlYW5UeXBlUHJveHkjZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWFsVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gQnkgZGVmYXVsdCBub25lIGhhdmUgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3IuIFRoZXJlIGlzIGEgc3BlY2lhbCBpbnN0YW5jZSBmb3IgaW5pdCBlcnJvcnMuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlQ29uc3RydWN0b3Iob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgdGhyb3dzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQotCQlDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbYXJndW1lbnRUeXBlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFyZ0NsYXNzZXNbaV0gPSAoKElERUJlYW5UeXBlUHJveHkpIGFyZ3VtZW50VHlwZXNbaV0pLmZDbGFzczsKLQkJfQotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKGZDbGFzcywgYXJnQ2xhc3Nlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29tcGF0aWJsZU1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gewotCQlDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbYXJndW1lbnRUeXBlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFyZ0NsYXNzZXNbaV0gPSAoKElERUJlYW5UeXBlUHJveHkpIGFyZ3VtZW50VHlwZXNbaV0pLmZDbGFzczsKLQkJfQotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0Q29tcGF0aWJsZU1ldGhvZChmQ2xhc3MsIG1ldGhvZE5hbWUsIGFyZ0NsYXNzZXMpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZVtdKQotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJSVByb3h5TWV0aG9kIG1ldGhvZCA9ICgoSURFRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0TWV0aG9kRXhwcmVzc2lvblByb3h5KHRoaXMsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBOZWVkIHRvIGdvIHRvIHRoZSBleHByZXNzaW9uIGFuZCBjcmVhdGUgaXQuCi0JCQltZXRob2QgPSAoKEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmNyZWF0ZU1ldGhvZEV4cHJlc3Npb25Qcm94eSh0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgdGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShleHByZXNzaW9uLCBtZXRob2ROYW1lLCAoSVByb3h5QmVhblR5cGVbXSkgbnVsbCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0RmllbGRQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVByb3h5RmllbGQgZ2V0RmllbGRQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCUlQcm94eUZpZWxkIGZpZWxkID0gKChJREVFeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRGaWVsZEV4cHJlc3Npb25Qcm94eSh0aGlzLCBmaWVsZE5hbWUpOwotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJLy8gTmVlZCB0byBnbyB0byB0aGUgZXhwcmVzc2lvbiBhbmQgY3JlYXRlIGl0LgotCQkJZmllbGQgPSAoKEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmNyZWF0ZUZpZWxkRXhwcmVzc2lvblByb3h5KHRoaXMsIGZpZWxkTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2YjVlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVCaWdEZWNpbWFsQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgamF2YS5tYXRoLio7Ci0KLWZpbmFsIGNsYXNzIElERUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFTnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLUlERUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsbmV3IEJpZ0RlY2ltYWwoMCkpOwotfQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJpZ0RlY2ltYWxCZWFuUHJveHkoQmlnRGVjaW1hbCBhQmlnRGVjaW1hbCkgewotCWlmICggYUJpZ0RlY2ltYWwgPT0gbnVsbCB8fCBhQmlnRGVjaW1hbC5pbnRWYWx1ZSgpID09IDAgKSB7Ci0JCXJldHVybiB6ZXJvUHJveHk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFCaWdEZWNpbWFsLHRoaXMpOwotCX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCaWdJbnRlZ2VyQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCaWdJbnRlZ2VyQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjkxMDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmlnSW50ZWdlckJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBqYXZhLm1hdGguKjsKLS8qKgotICogSURFIEltcGxlbWVudGF0aW9uIG9mIElJbnRlZ2VyQmVhblR5cGVQcm94eQotICovCi1maW5hbCBjbGFzcyBJREVCaWdJbnRlZ2VyQmVhblR5cGVQcm94eSBleHRlbmRzIElERU51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi1JREVCaWdJbnRlZ2VyQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzLCBuZXcgQmlnSW50ZWdlcigiMCIpKTsgLy8kTk9OLU5MUy0xJAotfQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJpZ0ludGVnZXJCZWFuUHJveHkoQmlnSW50ZWdlciBhQmlnSW50ZWdlcikgewotCWlmICggYUJpZ0ludGVnZXIgPT0gbnVsbCB8fCBhQmlnSW50ZWdlci5pbnRWYWx1ZSgpID09IDAgKSB7Ci0JCXJldHVybiB6ZXJvUHJveHk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFCaWdJbnRlZ2VyLHRoaXMpOwotCX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5CZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzZTBhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5CZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUJvb2xlYW5CZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSUJvb2xlYW5CZWFuUHJveHkuLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotY2xhc3MgSURFQm9vbGVhbkJlYW5Qcm94eSBleHRlbmRzIElERU9iamVjdEJlYW5Qcm94eSBpbXBsZW1lbnRzIElCb29sZWFuQmVhblByb3h5IHsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBmQm9vbGVhblZhbHVlOwotLyoqCi0gKiBBcyB3ZWxsIGFzIHN0b3JpbmcgdGhlIGJlYW4gc3RvcmUgdGhlIGJvb2xlYW4gdmFsdWUgc28gdGhhdCB3ZSBjYW4gcmV0dXJuIHRoZSBib29sZWFuVmFsdWUgZmFzdGVyCi0gKiB3aXRob3V0IHRoZSBuZWVkIGZvciByZXBlYXRlZCByZS1jYXN0aW5nLiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGl0IGlzIGNyZWF0ZWQgaW4KLSAqIHNwZWNpYWwgd2F5LCBzbyBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZXNlLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotSURFQm9vbGVhbkJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIE9iamVjdCBhQmVhbiwgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFCZWFuLGFCZWFuVHlwZVByb3h5KTsKLQlmQm9vbGVhblZhbHVlID0gKEJvb2xlYW4pYUJlYW47Ci19Ci1wdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JcmV0dXJuIGZCb29sZWFuVmFsdWUuYm9vbGVhblZhbHVlKCk7Ci19Ci1wdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKSB7Ci0JcmV0dXJuIGZCb29sZWFuVmFsdWU7Ci19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2Zjk0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5CZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMTUsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIElERUJvb2xlYW5CZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQm9vbGVhbkJlYW5Qcm94eSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlZ2lzdHJ5Ci0JICogQHBhcmFtIGFCZWFuCi0JICogQHBhcmFtIGFCZWFuVHlwZVByb3h5Ci0JICovCi0JcHVibGljIElERUJvb2xlYW5CZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFCZWFuLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFCZWFuLCBhQmVhblR5cGVQcm94eSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCXJldHVybiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIElERUJvb2xlYW5CZWFuVHlwZVByb3h5KSA/IGdldEJvb2xlYW5WYWx1ZSgpID09ICgoSURFQm9vbGVhbkJlYW5UeXBlUHJveHkpIGFCZWFuUHJveHkpLmdldEJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWIzMWI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLWZpbmFsIHB1YmxpYyBjbGFzcyBJREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0KLQkvLyBDYWNoZSB0aGVzZSBpbnN0YW5jZXMuIFNpbmNlIHRoZSBCZWFuVHlwZSBwcm94aWVzIGFyZSBjYWNoZWQgYWxzbywgb25seSBvbmUgaW5zdGFuY2UKLQkvLyBvZiB0cnVlL2ZhbHNlIHdpbGwgYmUgaW4gc3lzdGVtLgotCXByb3RlY3RlZCBmaW5hbCBJREVCb29sZWFuQmVhblByb3h5IHRydWVQcm94eTsKLQlwcm90ZWN0ZWQgZmluYWwgSURFQm9vbGVhbkJlYW5Qcm94eSBmYWxzZVByb3h5OwotCi1JREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0KLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci0JdHJ1ZVByb3h5ID0gbmV3IElERUJvb2xlYW5CZWFuUHJveHkoIGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgQm9vbGVhbi5UUlVFLCB0aGlzICk7Ci0JZmFsc2VQcm94eSA9IG5ldyBJREVCb29sZWFuQmVhblByb3h5KCBmUHJveHlGYWN0b3J5UmVnaXN0cnksIEJvb2xlYW4uRkFMU0UsIHRoaXMpOwkKLX0KLUlCb29sZWFuQmVhblByb3h5IGNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoQm9vbGVhbiBhQm9vbGVhbikgewotCWlmICggYUJvb2xlYW4uYm9vbGVhblZhbHVlKCkgKXsKLQkJcmV0dXJuIHRydWVQcm94eTsKLQl9IGVsc2UgewotCQlyZXR1cm4gZmFsc2VQcm94eTsKLQl9Ci19Ci0vKiBTcGVjaWFsaXplZCBmcm9tIElERUJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIElCb29sZWFuQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5Ci0gKi8KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCi0JaWYgKCBhbk9iamVjdCA9PSBudWxsIHx8IGFuT2JqZWN0ID09IEJvb2xlYW4uRkFMU0UgKSB7Ci0JCXJldHVybiBmYWxzZVByb3h5OwotCX0gZWxzZSB7Ci0JCXJldHVybiB0cnVlUHJveHk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZjBmZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLWZpbmFsIHB1YmxpYyBjbGFzcyBJREVCb29sZWFuVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLQotCS8vIENhY2hlIHRoZXNlIGluc3RhbmNlcy4gU2luY2UgdGhlIEJlYW5UeXBlIHByb3hpZXMgYXJlIGNhY2hlZCBhbHNvLCBvbmx5IG9uZSBpbnN0YW5jZQotCS8vIG9mIHRydWUvZmFsc2Ugd2lsbCBiZSBpbiBzeXN0ZW0uCi0JcHJvdGVjdGVkIGZpbmFsIElERUJvb2xlYW5CZWFuUHJveHkgdHJ1ZVByb3h5OwotCXByb3RlY3RlZCBmaW5hbCBJREVCb29sZWFuQmVhblByb3h5IGZhbHNlUHJveHk7Ci0KLUlERUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCi0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCXRydWVQcm94eSA9IG5ldyBJREVCb29sZWFuQmVhblR5cGVQcm94eSggZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBCb29sZWFuLlRSVUUsIHRoaXMgKTsKLQlmYWxzZVByb3h5ID0gbmV3IElERUJvb2xlYW5CZWFuVHlwZVByb3h5KCBmUHJveHlGYWN0b3J5UmVnaXN0cnksIEJvb2xlYW4uRkFMU0UsIHRoaXMgKTsKLQkKLQkvLyBUT0RPIE5lZWQgdG8gZ28gdGhyb3VnaCBhbGwgb2YgdGhlIHByaW1pdGl2ZXMsIHNlcGFyYXRlIHRoZW0gb3V0IGludG8gYSBzZXBhcmF0ZSBjbGFzc2VzIHNvCi0JLy8gdGhhdCBzYW1lQXMgY2FuIHdvcmsgd2l0aCB0aGVtIGNvcnJlY3RseS4gQ3VycmVudGx5IG9ubHkgYm9vbGVhbiB0eXBlIHdpbGwgZG8gc2FtZUFzIGNvcnJlY3RseS4KLQkvLyBTaG91bGQgYWxzbyBsb29rIGludG8gc3RvcmluZyB0aGUgcHJpbWl0aXZlIGluIHRoZSBwcm94eSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IHdyYXBwZXIgb2JqZWN0Ci0JLy8gZm9yIGVhY2ggZm9yIHRoZSBub24tYm9vbGVhbiBwcmltaXRpdmVzLgkKLX0KLS8qKgotICogU3RhdGljIGhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShib29sZWFuIGFCb29sZWFuKSB7Ci0JaWYgKCBhQm9vbGVhbiApewotCQlyZXR1cm4gdHJ1ZVByb3h5OwotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZVByb3h5OwotCX0KLX0KLS8qIFNwZWNpYWxpemVkIGZyb20gSURFQmVhblR5cGVQcm94eSB0byBlbnN1cmUgSUJvb2xlYW5CZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkKLSAqLwotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0KLQlyZXR1cm4gKElJREVCZWFuUHJveHkpY3JlYXRlQm9vbGVhbkJlYW5Qcm94eSggYW5PYmplY3QgIT0gbnVsbCA/ICgoQm9vbGVhbilhbk9iamVjdCkuYm9vbGVhblZhbHVlKCkgOiBmYWxzZSApOwotCi19Ci1pbnQgZ2V0UHJpbWl0aXZlVHlwZSgpewotCXJldHVybiBCT09MRUFOOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCeXRlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkNjgyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIEJ5dGUgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVOdW1iZXJCZWFuVHlwZVByb3h5IHsKLQkJCi1wcm90ZWN0ZWQgSURFQnl0ZUNsYXNzQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzLCBuZXcgQnl0ZSgoYnl0ZSkwKSk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJ5dGVCZWFuUHJveHkoQnl0ZSBhQnl0ZSl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFCeXRlLHRoaXMpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQnl0ZVR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJ5dGVUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhjODhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQnl0ZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVCeXRlVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBCeXRlIEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVCeXRlVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLXByb3RlY3RlZCBJREVCeXRlVHlwZUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJ5dGVCZWFuUHJveHkoYnl0ZSBhQnl0ZSl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBCeXRlKGFCeXRlKSx0aGlzKTsKLX0KLWludCBnZXRQcmltaXRpdmVUeXBlKCl7Ci0JcmV0dXJuIEJZVEU7Ci19Ci1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQlOdW1iZXIgbiA9IGFuT2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyID8gbmV3IEJ5dGUoKGJ5dGUpKChDaGFyYWN0ZXIpIGFuT2JqZWN0KS5jaGFyVmFsdWUoKSkgOiAoTnVtYmVyKSBhbk9iamVjdDsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIG4sIHRoaXMpOwotfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNhbGxiYWNrUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2FsbGJhY2tSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDdkNzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2FsbGJhY2tSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUNhbGxiYWNrUmVnaXN0cnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBJREVDYWxsYmFja1JlZ2lzdHJ5IGltcGxlbWVudHMgSUNhbGxiYWNrUmVnaXN0cnkgewotCQotCUlERVZNU2VydmVyIGZWTVNlcnZlcjsKLQlpbnQgZk5leHRDYWxsYmFja0lEOwotCUlERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQlNYXAgZkNhbGxiYWNrSURUb0NhbGxiYWNrID0gbmV3IEhhc2hNYXAoMjUpOwotCU1hcCBmQmVhblByb3h5VG9DYWxsYmFja0lEID0gbmV3IEhhc2hNYXAoMjUpOwotCU1hcCBmQ2FsbGJhY2tJRFRvU3RyZWFtID0gbmV3IEhhc2hNYXAoMjUpOwotCXByaXZhdGUgSVByb3h5TWV0aG9kIGluaXRpYWxpemVDYWxsYmFja01ldGhvZFByb3h5OwotCXByaXZhdGUgSUJlYW5Qcm94eSB2bVNlcnZlclByb3h5OwotCQotSURFQ2FsbGJhY2tSZWdpc3RyeShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpewotCWZQcm94eUZhY3RvcnlSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQlmVk1TZXJ2ZXIgPSBuZXcgSURFVk1TZXJ2ZXIodGhpcyk7Ci0JCi0Jdm1TZXJ2ZXJQcm94eSA9IGFSZWdpc3RyeS5nZXRCZWFuUHJveHkoZlZNU2VydmVyLmdldENsYXNzKCksIGZWTVNlcnZlcik7Ci0JCi0JdHJ5IHsKLQkJTWV0aG9kIGluaXRpYWxpemVDYWxsYmFja01ldGhvZCA9IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUNhbGxiYWNrLmNsYXNzLmdldE1ldGhvZCgiaW5pdGlhbGl6ZUNhbGxiYWNrIiwgbmV3IENsYXNzW10ge29yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSVZNQ2FsbGJhY2tTZXJ2ZXIuY2xhc3MsIEludGVnZXIuVFlQRX0pOyAvLyROT04tTkxTLTEkCi0JCWluaXRpYWxpemVDYWxsYmFja01ldGhvZFByb3h5ID0gKElQcm94eU1ldGhvZCkgYVJlZ2lzdHJ5LmdldEJlYW5Qcm94eShNZXRob2QuY2xhc3MsIGluaXRpYWxpemVDYWxsYmFja01ldGhvZCk7Ci0JfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCQotfQotCi0KLS8qKgotICogQWRkIGEgY2FsbGJhY2suICBhQmVhblByb3h5IGlzIHJ1bm5pbmcgb24gdGhlIHRhcmdldCBWTSBhbmQgSUNhbGxiYWNrIHJ1bnMgb24gb3VyIFZNCi0gKiBhQmVhblByb3h5IHdpbGwgaW1wbGVtZW50IElDYWxsYmFjayBvbiB0aGUgdGFyZ2V0IHNpZGUKLSAqLwkKLXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soSUJlYW5Qcm94eSBhQmVhblByb3h5LCBJQ2FsbGJhY2sgYUNhbGxiYWNrKXsKLQotCS8vIEdldCBhIGhhbmRsZSB0byB0aGUgcmVtb3RlIFZNIGNhbGxiYWNrCQotCW9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUNhbGxiYWNrIHZtQ2FsbGJhY2sgPSAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JQ2FsbGJhY2spICgoSUlERUJlYW5Qcm94eSlhQmVhblByb3h5KS5nZXRCZWFuKCk7IAotCWZOZXh0Q2FsbGJhY2tJRCA9IGZOZXh0Q2FsbGJhY2tJRCArIDE7Ci0JaW50IGNhbGxiYWNrSUQgPSBmTmV4dENhbGxiYWNrSUQ7Ci0Jdm1DYWxsYmFjay5pbml0aWFsaXplQ2FsbGJhY2soCi0JCWZWTVNlcnZlciwKLQkJY2FsbGJhY2tJRCk7Ci0JSW50ZWdlciBjYWxsYmFja0ludGVnZXJJRCA9IG5ldyBJbnRlZ2VyKGNhbGxiYWNrSUQpOwotCWZDYWxsYmFja0lEVG9DYWxsYmFjay5wdXQoY2FsbGJhY2tJbnRlZ2VySUQsYUNhbGxiYWNrKTsKLQlmQmVhblByb3h5VG9DYWxsYmFja0lELnB1dChhQmVhblByb3h5LGNhbGxiYWNrSW50ZWdlcklEKTsKLQotfQotCi0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrUmVnaXN0cnkjcmVnaXN0ZXJDYWxsYmFjayhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHksIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjaywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24pCi0gKi8KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soSVByb3h5IGNhbGxiYWNrUHJveHksIGZpbmFsIElDYWxsYmFjayBjYiwgSUV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCWZpbmFsIEludGVnZXIgY2FsbGJhY2tJRCA9IG5ldyBJbnRlZ2VyKCsrZk5leHRDYWxsYmFja0lEKTsKLQlmQ2FsbGJhY2tJRFRvQ2FsbGJhY2sucHV0KGNhbGxiYWNrSUQsIGNiKTsKLQlpZiAoY2FsbGJhY2tQcm94eS5pc0JlYW5Qcm94eSgpKSB7Ci0JCWZCZWFuUHJveHlUb0NhbGxiYWNrSUQucHV0KGNhbGxiYWNrUHJveHksIGNhbGxiYWNrSUQpOwkJCi0JfSBlbHNlIHsKLQkJKChFeHByZXNzaW9uUHJveHkpIGNhbGxiYWNrUHJveHkpLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlmQmVhblByb3h5VG9DYWxsYmFja0lELnB1dChldmVudC5nZXRQcm94eSgpLCBjYWxsYmFja0lEKTsJCQotCQkJfQotCQl9KTsKLQl9Ci0JZXhwcmVzc2lvbi5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UoaW5pdGlhbGl6ZUNhbGxiYWNrTWV0aG9kUHJveHksIGNhbGxiYWNrUHJveHksIG5ldyBJUHJveHlbXSB7dm1TZXJ2ZXJQcm94eSwgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGNhbGxiYWNrSUQuaW50VmFsdWUoKSl9LCBmYWxzZSk7Ci0JCi19Ci0KLU91dHB1dFN0cmVhbSByZXF1ZXN0U3RyZWFtKGZpbmFsIGludCBhQ2FsbGJhY2tJRCwgZmluYWwgaW50IGFNc2dJRCl7Ci0JZmluYWwgUGlwZWRPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7Ci0JUGlwZWRJbnB1dFN0cmVhbSB0ZW1wU3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQl0ZW1wU3RyZWFtID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0ocmVzdWx0KTsJCi0JfSBjYXRjaCAoIElPRXhjZXB0aW9uIGV4YyApIHsKLQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBudWxsOwotCX0KLQlmaW5hbCBQaXBlZElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gdGVtcFN0cmVhbTsKLQlUaHJlYWQgc3RyZWFtUHJvY2Vzc29yID0gbmV3IFRocmVhZCgpewotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCUlDYWxsYmFjayBpZGVDYWxsYmFjayA9IChJQ2FsbGJhY2spZkNhbGxiYWNrSURUb0NhbGxiYWNrLmdldChuZXcgSW50ZWdlcihhQ2FsbGJhY2tJRCkpOwotCQkJaWYgKGlkZUNhbGxiYWNrICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZGVDYWxsYmFjay5jYWxsZWRCYWNrU3RyZWFtKGFNc2dJRCwgaW5wdXRTdHJlYW0pOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwkvLyBNYWtlIHN1cmUgaXQncyBjbG9zZWQuCi0JCQkJCX0gY2F0Y2ggKCBJT0V4Y2VwdGlvbiAgZXhjICl7Ci0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0JCQkKLQkJCX0KLQkJfQotCX07Ci0Jc3RyZWFtUHJvY2Vzc29yLnN0YXJ0KCk7Ci0JcmV0dXJuIHJlc3VsdDsJCi19Ci0KLU9iamVjdCB2bUNhbGxiYWNrKGludCBhQ2FsbGJhY2tJRCAsaW50IGFNc2dJRCwgT2JqZWN0W10gcGFybXMpewotCS8vIEZpbmQgdGhlIGJlYW4gcHJveHkgdGhhdCByZWdpc3RlcmVkIHdpdGggdGhlIElECi0JSUNhbGxiYWNrIGlkZUNhbGxiYWNrID0gKElDYWxsYmFjaykgZkNhbGxiYWNrSURUb0NhbGxiYWNrLmdldChuZXcgSW50ZWdlcihhQ2FsbGJhY2tJRCkpOwotCU9iamVjdCBjYWxsYmFja1Jlc3VsdCA9IG51bGw7Ci0JaWYgKCBwYXJtcy5sZW5ndGggPT0gMSApIHsKLQkJY2FsbGJhY2tSZXN1bHQgPSBpZGVDYWxsYmFjay5jYWxsZWRCYWNrKGFNc2dJRCwoSUJlYW5Qcm94eSlwYXJtc1swXSk7Ci0JfSBlbHNlIHsKLQkJY2FsbGJhY2tSZXN1bHQgPSBpZGVDYWxsYmFjay5jYWxsZWRCYWNrKGFNc2dJRCxwYXJtcyk7Ci0JfQotCXJldHVybiBjYWxsYmFja1Jlc3VsdDsKLX0KLQotT2JqZWN0IHZtQ2FsbGJhY2soaW50IGFDYWxsYmFja0lEICxpbnQgYU1zZ0lELCBPYmplY3QgcGFybSl7Ci0JLy8gRmluZCB0aGUgYmVhbiBwcm94eSB0aGF0IHJlZ2lzdGVyZWQgd2l0aCB0aGUgSUQKLQlJQ2FsbGJhY2sgaWRlQ2FsbGJhY2sgPSAoSUNhbGxiYWNrKSBmQ2FsbGJhY2tJRFRvQ2FsbGJhY2suZ2V0KG5ldyBJbnRlZ2VyKGFDYWxsYmFja0lEKSk7Ci0JcmV0dXJuIGlkZUNhbGxiYWNrLmNhbGxlZEJhY2soYU1zZ0lELHBhcm0pOwotfQotCi1wdWJsaWMgdm9pZCBkZXJlZ2lzdGVyQ2FsbGJhY2soSUJlYW5Qcm94eSBhQmVhblByb3h5KXsKLQkvLyBSZW1vdmUgdGhlIGNhbGxiYWNrIGZyb20gYm90aCBtYXBzLiAgVGhlIGFjdHVhbCB1bnJlZ2lzdGVyaW5nIG9mIHRoZSBjYWxsYmFjawotCS8vIG9uIHRoZSB0YXJnZXQgVk0gaXMgZG9uZSBzZXBhcmF0ZWx5IGJ5IHRoZSBvYmplY3QgdGhhdCBhZGRlZCB0aGUgZXZlbnQgaGFuZGxlciBvbiB0aGUgdGFyZ2V0IFZNCi0JSW50ZWdlciBjYWxsYmFja0lEID0gKEludGVnZXIpIGZCZWFuUHJveHlUb0NhbGxiYWNrSUQucmVtb3ZlKGFCZWFuUHJveHkpOwotCWZDYWxsYmFja0lEVG9DYWxsYmFjay5yZW1vdmUoY2FsbGJhY2tJRCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDaGFyVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4NmNmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQ2hhclR5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBjaGFyIEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVDaGFyVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLXByb3RlY3RlZCBJREVDaGFyVHlwZUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci19Ci1JQ2hhcmFjdGVyQmVhblByb3h5IGNyZWF0ZUNoYXJCZWFuUHJveHkoY2hhciBhQ2hhcil7Ci0JcmV0dXJuIG5ldyBJREVDaGFyYWN0ZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBDaGFyYWN0ZXIoYUNoYXIpLHRoaXMpOwotfQotaW50IGdldFByaW1pdGl2ZVR5cGUoKXsKLQlyZXR1cm4gQ0hBUjsKLX0KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCUNoYXJhY3RlciBjID0gYW5PYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIgPyAoQ2hhcmFjdGVyKSBhbk9iamVjdCA6IG5ldyBDaGFyYWN0ZXIoKGNoYXIpKChOdW1iZXIpIGFuT2JqZWN0KS5pbnRWYWx1ZSgpKTsKLQlyZXR1cm4gbmV3IElERUNoYXJhY3RlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIGMsIHRoaXMpOwotCQotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2hhcmFjdGVyQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJhY3RlckJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjViNjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2hhcmFjdGVyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogJFJDU2ZpbGU6IElERUNoYXJhY3RlckJlYW5Qcm94eS5qYXZhLHYgJCAkUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogSURFIEltcGxlbWVudGF0aW9uIG9mIElDaGFyYWN0ZXJCZWFuQmVhblByb3h5Li4KLSAqLwotY2xhc3MgSURFQ2hhcmFjdGVyQmVhblByb3h5IGV4dGVuZHMgSURFT2JqZWN0QmVhblByb3h5IGltcGxlbWVudHMgSUNoYXJhY3RlckJlYW5Qcm94eSB7Ci0JcHJvdGVjdGVkIENoYXJhY3RlciBmQ2hhcmFjdGVyVmFsdWU7Ci0JSURFQ2hhcmFjdGVyQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFCZWFuLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFCZWFuLCBhQmVhblR5cGVQcm94eSk7Ci0JCWZDaGFyYWN0ZXJWYWx1ZSA9IChDaGFyYWN0ZXIpIGFCZWFuOwotCX0KLQlwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhcmFjdGVyVmFsdWUuY2hhclZhbHVlKCk7Ci0JfQotCXB1YmxpYyBDaGFyYWN0ZXIgY2hhcmFjdGVyVmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhcmFjdGVyVmFsdWU7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUludGVnZXJCZWFuUHJveHkjaW50VmFsdWUoKQotCSAqLwotCXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JCXJldHVybiBjaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2J5dGVWYWx1ZSgpCi0JICovCi0JcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewotCQlyZXR1cm4gKGJ5dGUpIGNoYXJWYWx1ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjZG91YmxlVmFsdWUoKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JCXJldHVybiBjaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2Zsb2F0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCQlyZXR1cm4gY2hhclZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNsb25nVmFsdWUoKQotCSAqLwotCXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQkJcmV0dXJuIGNoYXJWYWx1ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjbnVtYmVyVmFsdWUoKQotCSAqLwotCXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JCS8vIFRoaXMgaXMgYSBrbHVkZ2UuIE5lZWQgdG8gbmV3IG9uZSB1cC4KLQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGNoYXJWYWx1ZSgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I3Nob3J0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCQlyZXR1cm4gKHNob3J0KSBjaGFyVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWFkZGUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVDaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIENoYXIgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgewotCQotcHJvdGVjdGVkIElERUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLX0KLUlDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KENoYXJhY3RlciBhQ2hhcil7Ci0JcmV0dXJuIG5ldyBJREVDaGFyYWN0ZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFDaGFyLHRoaXMpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmU2MmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElERUNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHk7Ci0gCi0vKioKLSAqIEZvciBqYXZhLmxhbmcuQ2xhc3MgdHlwZS4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSURFQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlZ2lzdHJ5Ci0JICogQHBhcmFtIGFDbGFzcwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJREVDbGFzc0JlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFQmVhblR5cGVQcm94eSNuZXdCZWFuUHJveHkoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXJldHVybiAoSUlERUJlYW5Qcm94eSkgKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eSgoQ2xhc3MpIGFuT2JqZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERUJlYW5UeXBlUHJveHkjbmV3QmVhblR5cGVGb3JDbGFzcyhqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIElERUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhDbGFzcyB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjbmV3SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNvbnN0cnVjdG9yUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ29uc3RydWN0b3JQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjU5NGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ29uc3RydWN0b3JQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUNvbnN0cnVjdG9yUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIElDb25zdHJ1Y3RvclByb3h5IHdoZXJlIHRoZSB0YXJnZXQgVk0gaXMgdGhlIHNhbWUgYXMKLSAqIHRoZSBJREUuICBUaGUgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgaW5zdGFuY2UgaXMgaGVsZCBpbiBhIGZpZWxkCi0gKi8KLWNsYXNzIElERUNvbnN0cnVjdG9yUHJveHkgZXh0ZW5kcyBJREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkgaW1wbGVtZW50cyBJQ29uc3RydWN0b3JQcm94eSB7Ci0KLQkvKioKLQkgKiBwYWNrYWdlIHByb3RlY3RlZCBjb25zdHJ1Y3RvciB3aGVyZSB0aGUgaW5zdGFuY2Ugb2YgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IKLQkgKiBjYW4gYmUgcGFzc2VkIGluIGRpcmVjdGx5Ci0JICovCi0JSURFQ29uc3RydWN0b3JQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENvbnN0cnVjdG9yIGFDb25zdHJ1Y3RvcikgewotCQlzdXBlcihhUmVnaXN0cnksIGFDb25zdHJ1Y3Rvcik7Ci0JfQotCS8qKgotCSAqIFRoZSB0eXBlIHByb3h5IGlzIGNvbnN0YW50IHByb3h5IG91dCBvZiB0aGUgbWV0aG9kIGZhY3RvcnkuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmNvbnN0cnVjdG9yVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGZhY3RvcmVkIGludG8gYSBzcGVjaWFsIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCi0JICogaWYgdGhleSB3aXNoLgotCSAqLwotCXByb3RlY3RlZCBJQmVhblByb3h5IGdldE5ld0lERUJlYW5Qcm94eShPYmplY3QgYUJlYW4pIHsKLQotCQlyZXR1cm4gSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIGFCZWFuKTsgLy8gVXNlIGxvY2FsIGhlbHBlciBtZXRob2QgdG8gZG8gdGhpcy4KLQl9Ci0JLyoqCi0JICogSW52b2tlIHRoZSBjb25zdHJ1Y3RvciBhbmQgcmV0dXJuIGFuIElERUJlYW5Qcm94eSB3aXRoIHRoZSByZXN1bHQKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQotCQkvLyBJbnZva2UgdGhlIGNvbnN0cnVjdG9yCi0JCXRyeSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gKChDb25zdHJ1Y3RvcikgZ2V0QmVhbigpKS5uZXdJbnN0YW5jZShudWxsKTsKLQkJCXJldHVybiBnZXROZXdJREVCZWFuUHJveHkocmVzdWx0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZSgpOwotCX0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5W10gYXJncykgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoYXJncyk7Ci0JfQotCS8qKgotCSAqIEludm9rZSB0aGUgY29uc3RydWN0b3IgYW5kIHJldHVybiBhbiBJREVCZWFuUHJveHkgd2l0aCB0aGUgcmVzdWx0Ci0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoSUJlYW5Qcm94eVtdIGNyZWF0aW9uQXJndW1lbnRzKSB7Ci0KLQkJLy8gR2V0IGFuIGFycmF5IG9mIGJlYW4gb2JqZWN0cyBmcm9tIHRoZSBiZWFuIHByb3h5IGFyZ3VtZW50cwotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJT2JqZWN0W10gY3JlYXRpb25PYmplY3RzID0gbmV3IE9iamVjdFtjcmVhdGlvbkFyZ3VtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNyZWF0aW9uQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGUgYXJndW1lbnRzIGFyZSBudWxsIHdoaWNoIGlzIHBlcmZlY3RseSB2YWxpZAotCQkJaWYgKGNyZWF0aW9uQXJndW1lbnRzW2ldICE9IG51bGwpCi0JCQkJY3JlYXRpb25PYmplY3RzW2ldID0gKChJSURFQmVhblByb3h5KSBjcmVhdGlvbkFyZ3VtZW50c1tpXSkuZ2V0QmVhbigpOwotCQl9Ci0KLQkJLy8gSW52b2tlIHRoZSBjb25zdHJ1Y3RvcgotCQl0cnkgewotCQkJcmVzdWx0ID0gKChDb25zdHJ1Y3RvcikgZ2V0QmVhbigpKS5uZXdJbnN0YW5jZShjcmVhdGlvbk9iamVjdHMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gSWYgd2UgaGF2ZSBhIG5vbi1udWxsIHJlc3VsdCBjcmVhdGUgYW4gSURFQmVhblByb3h5IGFuZCByZXR1cm4gaXQKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TmV3SURFQmVhblByb3h5KHJlc3VsdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25zdHJ1Y3RvclByb3h5I2dldFBhcmFtZXRlclR5cGVzKCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHlbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLQkJQ2xhc3NbXSBwYXJtQ2xhc3NlcyA9ICgoQ29uc3RydWN0b3IpIGdldEJlYW4oKSkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJSUJlYW5UeXBlUHJveHlbXSBwYXJtVHlwZXMgPSBuZXcgSUJlYW5UeXBlUHJveHlbcGFybUNsYXNzZXMubGVuZ3RoXTsKLQkJSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBmYWN0b3J5ID0gKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1DbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXJtVHlwZXNbaV0gPSBmYWN0b3J5LmdldEJlYW5UeXBlUHJveHkocGFybUNsYXNzZXNbaV0pOwotCQl9Ci0JCXJldHVybiBwYXJtVHlwZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNvbnN0cnVjdG9yVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNvbnN0cnVjdG9yVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWM5OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDb25zdHJ1Y3RvclR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQ29uc3RydWN0b3JUeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVDb25zdHJ1Y3RvclR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgewotCQotCUlERUNvbnN0cnVjdG9yVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXN1cGVyKHJlZ2lzdHJ5LCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElERUJlYW5UeXBlUHJveHkjbmV3QmVhblByb3h5KE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXJldHVybiBuZXcgSURFQ29uc3RydWN0b3JQcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikgYW5PYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVEb3VibGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTcxMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVEb3VibGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERURvdWJsZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogRG91YmxlIEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVEb3VibGVDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVOdW1iZXJCZWFuVHlwZVByb3h5IHsKLQotcHJvdGVjdGVkIElERURvdWJsZUNsYXNzQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzLCBuZXcgRG91YmxlKDApKTsKLX0KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlRG91YmxlQmVhblByb3h5KERvdWJsZSBhRG91YmxlKXsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYURvdWJsZSx0aGlzKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERURvdWJsZVR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERURvdWJsZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmFkNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVEb3VibGVUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFRG91YmxlVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIGRvdWJsZSBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFRG91YmxlVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLXByb3RlY3RlZCBJREVEb3VibGVUeXBlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLX0KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlRG91YmxlQmVhblByb3h5KGRvdWJsZSBhRG91YmxlKXsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksbmV3IERvdWJsZShhRG91YmxlKSx0aGlzKTsKLX0KLWludCBnZXRQcmltaXRpdmVUeXBlKCl7Ci0JcmV0dXJuIERPVUJMRTsKLX0KLQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0JTnVtYmVyIG4gPSBhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlciA/IG5ldyBEb3VibGUoKChDaGFyYWN0ZXIpIGFuT2JqZWN0KS5jaGFyVmFsdWUoKSkgOiAoTnVtYmVyKSBhbk9iamVjdDsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIG4sIHRoaXMpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM4ODc2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICRSQ1NmaWxlOiBJREVFeHByZXNzaW9uLmphdmEsdiAkICRSZXZpc2lvbjogMS4xMiAkICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLk1ldGhvZEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLQotLyoqCi0gKiBJREUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIElERUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQotCXByaXZhdGUgZmluYWwgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBiZWFudHlwZWZhY3Rvcnk7Ci0JcHJvdGVjdGVkIGZpbmFsIEV4cHJlc3Npb25Qcm9jZXNzZXIgZXByb2M7Ci0JewotCQlib29sZWFuIHVzZVRyYWNpbmcgPSAhaXNUcmFjZVNldCgpID8gCi0JCQkidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIFByb3h5TGF1bmNoU3VwcG9ydC5FWFBSRVNTSU9OX1RSQUNJTkcpKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWlzVHJhY2UoKTsKLQkJbG9uZyB0aHJlc2hvbGQgPSBMb25nLmdldExvbmcoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBQcm94eUxhdW5jaFN1cHBvcnQuRVhQUkVTU0lPTl9UUkFDRUlOR19USU1FUl9USFJFU0hPTEQpLCAtMUwpLmxvbmdWYWx1ZSgpOwotCQllcHJvYyA9IG5ldyBFeHByZXNzaW9uUHJvY2Vzc2VyKHVzZVRyYWNpbmcsIHRocmVzaG9sZCk7Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHByZXNzaW9uRXJyb3IoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJaWYgKCFlcHJvYy5ub0Vycm9ycygpKQotCQkJaWYgKGVwcm9jLmlzTm9FeHByZXNzaW9uVmFsdWUoKSkKLQkJCQl0aHJvdyAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24pIGVwcm9jLmdldEVycm9yVGhyb3dhYmxlKCk7Ci0JCQllbHNlIHsKLQkJCQlUaHJvd2FibGUgdCA9IGVwcm9jLmdldEVycm9yVGhyb3dhYmxlKCk7Ci0JCQkJaWYgKHQgaW5zdGFuY2VvZiBUaHJvd2FibGVQcm94eSkKLQkJCQkJdGhyb3cgKFRocm93YWJsZVByb3h5KSB0OwotCQkJCWVsc2UKLQkJCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KGVwcm9jLmdldEVycm9yVGhyb3dhYmxlKCksIGJlYW50eXBlZmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHQuZ2V0Q2xhc3MoKSkpOwotCQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIElERUV4cHJlc3Npb24KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSURFRXhwcmVzc2lvbihQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlzdXBlcihyZWdpc3RyeSk7Ci0JCWJlYW50eXBlZmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRJREVSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIChJREVQcm94eUZhY3RvcnlSZWdpc3RyeSkgcmVnaXN0cnk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZ2V0SURFQmVhblR5cGVGYWN0b3J5KCkgewotCQlyZXR1cm4gYmVhbnR5cGVmYWN0b3J5OwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUb1Byb3h5KElQcm94eSBwcm94eSkgewotCQlpZiAocHJveHkgPT0gbnVsbCkKLQkJCWVwcm9jLnB1c2hFeHByZXNzaW9uKG51bGwsIE1ldGhvZEhlbHBlci5OVUxMX1RZUEUpOwotCQllbHNlIGlmIChwcm94eS5pc0JlYW5Qcm94eSgpKQotCQkJZXByb2MucHVzaEV4cHJlc3Npb24oKChJREVCZWFuUHJveHkpIHByb3h5KS5nZXRCZWFuKCksICgoSURFQmVhblR5cGVQcm94eSkgKChJQmVhblByb3h5KSBwcm94eSkuZ2V0VHlwZVByb3h5KCkpLmdldFR5cGVDbGFzcygpKTsKLQkJZWxzZQotCQkJZXByb2MucHVzaEV4cHJlc3Npb25Qcm94eSgoKEV4cHJlc3Npb25Qcm94eSkgcHJveHkpLmdldFByb3h5SUQoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI2Nsb3NlUHJveHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb3NlUHJveHkoKSB7Ci0JCW1ldGhvZEV4cHJlc3Npb25Qcm94aWVzID0gZmllbGRFeHByZXNzaW9uUHJveGllcyA9IG51bGw7Ci0JCWVwcm9jLmNsb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdWxsUHJveHlWYWx1ZShpbnQsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCBJQmVhblByb3h5IHB1bGxQcm94eVZhbHVlKGludCBwcm94eWNvdW50LCBMaXN0IGV4cHJlc3Npb25Qcm94aWVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJcHJvY2Vzc0V4dGVuc2lvblByb3hpZXMocHJveHljb3VudCwgZXhwcmVzc2lvblByb3hpZXMpOwotCQlwcm9jZXNzRXhwcmVzc2lvbkVycm9yKCk7Ci0JCU9iamVjdCByZXN1bHRbXSA9IG5ldyBPYmplY3RbMl07Ci0JCWVwcm9jLnB1bGxWYWx1ZShyZXN1bHQpOwotCQlJQmVhblByb3h5IHJlc3VsdFByb3h5ID0gZ2V0SURFUmVnaXN0cnkoKS5nZXRCZWFuUHJveHkoKENsYXNzKSByZXN1bHRbMV0sIHJlc3VsdFswXSk7Ci0JCXJldHVybiByZXN1bHRQcm94eTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHRlbnNpb25Qcm94aWVzKGludCBwcm94eWNvdW50LCBMaXN0IGV4cHJlc3Npb25Qcm94aWVzKSB7Ci0JCWlmIChwcm94eWNvdW50ID4gMCkgewotCQkJaW50IGxlbiA9IGV4cHJlc3Npb25Qcm94aWVzLnNpemUoKTsKLQkJCU9iamVjdFtdIHByb3h5UmVzb2x1dGlvbiA9IG5ldyBPYmplY3RbMl07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJRXhwcmVzc2lvblByb3h5IGVwID0gKEV4cHJlc3Npb25Qcm94eSkgZXhwcmVzc2lvblByb3hpZXMuZ2V0KGkpOwotCQkJCWlmIChlcCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQllcHJvYy5wdWxsRXhwcmVzc2lvblByb3h5VmFsdWUoZXAuZ2V0UHJveHlJRCgpLCBwcm94eVJlc29sdXRpb24pOwotCQkJCQkJaWYgKHByb3h5UmVzb2x1dGlvblsxXSAhPSBWb2lkLlRZUEUpCi0JCQkJCQkJZmlyZVByb3h5UmVzb2x2ZWQoZXAsIGdldElERVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5KChDbGFzcykgcHJveHlSZXNvbHV0aW9uWzFdLCBwcm94eVJlc29sdXRpb25bMF0pKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlmaXJlUHJveHlWb2lkKGVwKTsKLQkJCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCQkJZmlyZVByb3h5Tm90UmVzb2x2ZWQoZXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQ2FzdFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENhc3RUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCWVwcm9jLnB1c2hDYXN0KGdldElERUJlYW5UeXBlUHJveHkodHlwZSkuZ2V0VHlwZUNsYXNzKCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSW5zdGFuY2VvZlRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEluc3RhbmNlb2ZUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCWVwcm9jLnB1c2hJbnN0YW5jZW9mKGdldElERUJlYW5UeXBlUHJveHkodHlwZSkuZ2V0VHlwZUNsYXNzKCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgQmVhblR5cGUgcHJveHkgYW5kIHRlc3QgaWYgdmFsaWQuIFRocm93IFRocm93YWJsZVByb3h5IGlmIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSAKLQkgKiBAcmV0dXJuIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSURFQmVhblR5cGVQcm94eSBnZXRJREVCZWFuVHlwZVByb3h5KElQcm94eUJlYW5UeXBlIHR5cGUpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlERUJlYW5UeXBlUHJveHkgdHlwZVByb3h5OwotCQlpZiAodHlwZS5pc0V4cHJlc3Npb25Qcm94eSgpKSB7Ci0JCQkvLyBJdCBzaG91bGQgYWxyZWFkeSBiZSByZXNvbHZlZCBhdCB0aGlzIHBvaW50LgotCQkJdHlwZVByb3h5ID0gKChJREVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSkgdHlwZSkuZ2V0QmVhblR5cGVQcm94eSgpOwotCQl9IGVsc2UKLQkJCXR5cGVQcm94eSA9IChJREVCZWFuVHlwZVByb3h5KSB0eXBlOwotCQlpZiAoIXR5cGVQcm94eS5pc1ZhbGlkKCkpIHsKLQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eSgKLQkJCQkJbmV3IEV4Y2VwdGlvbih0eXBlUHJveHkuZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpKSwKLQkJCQkJZ2V0SURFQmVhblR5cGVGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShFeGNlcHRpb24uY2xhc3MpKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gdHlwZVByb3h5OwotCX0KLQotCQotCS8qKgotCSAqIEdldCB0aGUgQmVhblR5cGUgcHJveHkgYW5kIHRlc3QgaWYgdmFsaWQuIFRocm93IFRocm93YWJsZVByb3h5IGlmIG5vdCB2YWxpZC4KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIElERUJlYW5UeXBlUHJveHkgZ2V0SURFQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZSkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIChJREVCZWFuVHlwZVByb3h5KSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkodHlwZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoUHJlZml4VG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLlByZWZpeE9wZXJhdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hQcmVmaXhUb1Byb3h5KFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCWVwcm9jLnB1c2hQcmVmaXgob3BlcmF0b3IpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEluZml4VG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkluZml4T3BlcmF0b3IsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJbmZpeFRvUHJveHkoSW5maXhPcGVyYXRvciBvcGVyYXRvciwgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIG9wZXJhbmRUeXBlKSB7Ci0JCWVwcm9jLnB1c2hJbmZpeChvcGVyYXRvciwgb3BlcmFuZFR5cGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEFycmF5QWNjZXNzVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFycmF5QWNjZXNzVG9Qcm94eShpbnQgaW5kZXhDb3VudCkgewotCQllcHJvYy5wdXNoQXJyYXlBY2Nlc3MoaW5kZXhDb3VudCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQXJyYXlDcmVhdGlvblRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXJyYXlDcmVhdGlvblRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IGRpbWVuc2lvbkNvdW50KSB7Ci0JCXRyeSB7Ci0JCQllcHJvYy5wdXNoQXJyYXlDcmVhdGlvbihnZXRJREVCZWFuVHlwZVByb3h5KHR5cGUpLmdldFR5cGVDbGFzcygpLCBkaW1lbnNpb25Db3VudCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXJyYXlJbml0aWFsaXplclRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IHN0cmlwQ291bnQsIGludCBleHByZXNzaW9uQ291bnQpIHsKLQkJdHJ5IHsKLQkJCWVwcm9jLnB1c2hBcnJheUluaXRpYWxpemVyKGdldElERUJlYW5UeXBlUHJveHkodHlwZSkuZ2V0VHlwZUNsYXNzKCksIHN0cmlwQ291bnQsIGV4cHJlc3Npb25Db3VudCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb25Ub1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvblRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IGFyZ3VtZW50Q291bnQpIHsKLQkJdHJ5IHsKLQkJCWVwcm9jLnB1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb24oZ2V0SURFQmVhblR5cGVQcm94eSh0eXBlKS5nZXRUeXBlQ2xhc3MoKSwgYXJndW1lbnRDb3VudCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUeXBlUmVjZWl2ZXJUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUeXBlUmVjZWl2ZXJUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCUNsYXNzIGMgPSBnZXRJREVCZWFuVHlwZVByb3h5KHR5cGUpLmdldFR5cGVDbGFzcygpOwotCQkJZXByb2MucHVzaEV4cHJlc3Npb24oYywgYyk7CS8vIFdoZW4gYXMgYSByZWNlaXZlciwgdGhlIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIHJlY2VpdmVyLiAKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoRmllbGRBY2Nlc3NUb1Byb3h5KGphdmEubGFuZy5PYmplY3QsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEZpZWxkQWNjZXNzVG9Qcm94eShPYmplY3QgZmllbGQsIGJvb2xlYW4gaGFzUmVjZWl2ZXIpIHsKLQkJYm9vbGVhbiBpc1N0cmluZyA9IGZpZWxkIGluc3RhbmNlb2YgU3RyaW5nOwotCQl0cnkgewotCQkJZXByb2MucHVzaEZpZWxkQWNjZXNzKGlzU3RyaW5nID8gZmllbGQgOiBnZXRJREVGaWVsZFByb3h5KChJUHJveHlGaWVsZCkgZmllbGQpLmdldEJlYW4oKSwgaXNTdHJpbmcsIGhhc1JlY2VpdmVyKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoTWV0aG9kSW52b2NhdGlvblRvUHJveHkoamF2YS5sYW5nLk9iamVjdCwgYm9vbGVhbiwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hNZXRob2RJbnZvY2F0aW9uVG9Qcm94eShPYmplY3QgbWV0aG9kLCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJnQ291bnQpIHsKLQkJYm9vbGVhbiBpc1N0cmluZyA9IG1ldGhvZCBpbnN0YW5jZW9mIFN0cmluZzsKLQkJdHJ5IHsKLQkJCWVwcm9jLnB1c2hNZXRob2RJbnZvY2F0aW9uKGlzU3RyaW5nID8gbWV0aG9kIDogZ2V0SURFTWV0aG9kUHJveHkoKElQcm94eU1ldGhvZCkgbWV0aG9kKS5nZXRCZWFuKCksIGlzU3RyaW5nLCBoYXNSZWNlaXZlciwgYXJnQ291bnQpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQ29uZGl0aW9uYWxUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hDb25kaXRpb25hbFRvUHJveHkoSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIGV4cHJlc3Npb25UeXBlKSB7Ci0JCWVwcm9jLnB1c2hDb25kaXRpb25hbChleHByZXNzaW9uVHlwZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSW52b2tlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSW52b2tlKGludCBwcm94eWNvdW50LCBMaXN0IGV4cHJlc3Npb25Qcm94aWVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gSW4gdGhlIElERSBjYXNlIGRvIG5vdGhpbmcuIE5vdGhpbmcgaXMgcGVuZGluZy4gQnV0IHN0aWxsIG5lZWQgdG8gaGFuZGxlIHByb3h5IHJlc29sdXRpb24uCi0JCXByb2Nlc3NFeHRlbnNpb25Qcm94aWVzKHByb3h5Y291bnQsIGV4cHJlc3Npb25Qcm94aWVzKTsKLQkJcHJvY2Vzc0V4cHJlc3Npb25FcnJvcigpOyAKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIGFzIGJvdGggYW4gRXhwcmVzc2lvblByb3h5IChpLmUuIElERSBzaWRlKSBhbmQgdGhlIEV4cHJlc3Npb25zIGV4cHJlc3Npb24gcHJveHkgcmVzdWx0IG9uIHRoZSBvdGhlciBzaWRlLgotCSAqIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGp1c3QgdXNlIHNhbWUgaW5zdGFuY2Ugb24gYm90aCBzaWRlcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIElERUV4cHJlc3Npb25Qcm94eSBleHRlbmRzIEV4cHJlc3Npb25Qcm94eSBpbXBsZW1lbnRzIEludGVybmFsRXhwcmVzc2lvblByb3h5IHsKLQkJCi0JCXByb3RlY3RlZCBJREVFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQsIGludCBwcm94eVR5cGUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJc3VwZXIocHJveHlpZCwgcHJveHlUeXBlLCBleHByZXNzaW9uKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0JCXByaXZhdGUgQ2xhc3MgdHlwZTsKLQkJcHJpdmF0ZSBib29sZWFuIHNldDsKLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5I2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCXZhbHVlID0gbnVsbDsKLQkJCXR5cGUgPSBudWxsOwotCQkJc2V0ID0gZmFsc2U7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I2dldFR5cGUoKQotCQkgKi8KLQkJcHVibGljIENsYXNzIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjZ2V0VmFsdWUoKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEV4cHJlc3Npb25Qcm94eSNzZXRQcm94eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRQcm94eShPYmplY3QgdmFsdWUsIENsYXNzIHR5cGUpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQlzZXQgPSB0cnVlOwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I2lzU2V0KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU2V0KCkgewotCQkJcmV0dXJuIHNldDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGUgRXhwcmVzc2lvbiBwcm94eSBmb3IgSURFIEJlYW5UeXBlcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIElERUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IGV4dGVuZHMgSURFRXhwcmVzc2lvblByb3h5IGltcGxlbWVudHMgSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IHsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotCQlwcml2YXRlIElERUJlYW5UeXBlUHJveHkgcmVzb2x2ZWRQcm94eTsKLQotCQkvKioKLQkJICogQHBhcmFtIHByb3h5aWQKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIElERUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJCXN1cGVyKHByb3h5aWQsIEJFQU5UWVBFX0VYUFJFU1NJT05fUFJPWFksIGV4cHJlc3Npb24pOwotCQl9Ci0JCQotCQkvKgotCQkgKiAgKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSNzZXRUeXBlTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCQl0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqICAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0VHlwZU5hbWUoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJCXJldHVybiB0eXBlTmFtZTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkrIiAtICIrZ2V0VHlwZU5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIENhbGxlZCBieSBJREVFeHByZXNzaW9uIHRvIHJlc29sdmUgdGhlIGJlYW50eXBlLgotCQkgKiBAcGFyYW0gYmVhbnR5cGVQcm94eQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldFByb3h5KElERUJlYW5UeXBlUHJveHkgYmVhbnR5cGVQcm94eSkgewotCQkJdGhpcy5yZXNvbHZlZFByb3h5ID0gYmVhbnR5cGVQcm94eTsKLQkJCXNldFByb3h5KHJlc29sdmVkUHJveHkuZ2V0VHlwZUNsYXNzKCksIENsYXNzLmNsYXNzKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENhbGxlZCBieSBJREVFeHByZXNzaW9uIHRvIGdldCB0aGUgcmVzb2x2ZWQgYmVhbnR5cGUgcHJveHkuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJSURFQmVhblR5cGVQcm94eSBnZXRCZWFuVHlwZVByb3h5KCkgewotCQkJcmV0dXJuIHJlc29sdmVkUHJveHk7Ci0JCX0KLQotCQkvKgotCQkgKiAgKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZVtdKQotCQkgKi8KLQkJcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkJSVByb3h5TWV0aG9kIG1ldGhvZCA9ICgoSURFRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0TWV0aG9kRXhwcmVzc2lvblByb3h5KHRoaXMsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJCS8vIE5lZWQgdG8gZ28gdG8gdGhlIGV4cHJlc3Npb24gYW5kIGNyZWF0ZSBpdC4KLQkJCQltZXRob2QgPSAoKEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmNyZWF0ZU1ldGhvZEV4cHJlc3Npb25Qcm94eSh0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbWV0aG9kOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkJICovCi0JCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGV4cHJlc3Npb24uZ2V0UmVnaXN0cnkoKS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgdGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgbWV0aG9kTmFtZSwgKElQcm94eUJlYW5UeXBlW10pIG51bGwpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldEZpZWxkUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgSVByb3h5RmllbGQgZ2V0RmllbGRQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCQlJUHJveHlGaWVsZCBmaWVsZCA9ICgoSURFRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0RmllbGRFeHByZXNzaW9uUHJveHkodGhpcywgZmllbGROYW1lKTsKLQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJLy8gTmVlZCB0byBnbyB0byB0aGUgZXhwcmVzc2lvbiBhbmQgY3JlYXRlIGl0LgotCQkJCWZpZWxkID0gKChFeHByZXNzaW9uKSBleHByZXNzaW9uKS5jcmVhdGVGaWVsZEV4cHJlc3Npb25Qcm94eSh0aGlzLCBmaWVsZE5hbWUpOwotCQkJfQotCQkJcmV0dXJuIGZpZWxkOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBFeHByZXNzaW9uIHByb3h5IGZvciBJREUgQmVhblR5cGVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSURFTWV0aG9kRXhwcmVzc2lvblByb3h5IGV4dGVuZHMgSURFRXhwcmVzc2lvblByb3h5IGltcGxlbWVudHMgSVByb3h5TWV0aG9kIHsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIG1ldGhvZE5hbWU7Ci0JCXByaXZhdGUgSURFTWV0aG9kUHJveHkgcmVzb2x2ZWRQcm94eTsKLQkJcHJpdmF0ZSBUaHJvd2FibGVQcm94eSBlcnJvclRocm93YWJsZTsKLQotCQkvKioKLQkJICogQHBhcmFtIHByb3h5aWQKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIElERU1ldGhvZEV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlpZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQlzdXBlcihwcm94eWlkLCBNRVRIT0RfRVhQUkVTU0lPTl9QUk9YWSwgZXhwcmVzc2lvbik7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTZXQgYnkgSURFRXhwcmVzc2lvbiB3aXRoIHRoZSBtZXRob2QgbmFtZS4KLQkJICogQHBhcmFtIG1ldGhvZE5hbWUKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCQl0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCQl9Ci0JCQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpKyIgLSAiK21ldGhvZE5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBDYWxsZWQgYnkgSURFRXhwcmVzc2lvbiB0byByZXNvbHZlIHRoZSBiZWFudHlwZS4KLQkJICogQHBhcmFtIG1ldGhvZFByb3h5Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0UHJveHkoSURFTWV0aG9kUHJveHkgbWV0aG9kUHJveHkpIHsKLQkJCXRoaXMucmVzb2x2ZWRQcm94eSA9IG1ldGhvZFByb3h5OwotCQkJc2V0UHJveHkocmVzb2x2ZWRQcm94eS5nZXRCZWFuKCksIENsYXNzLmNsYXNzKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENhbGxlZCBieSBJREVFeHByZXNzaW9uIHRvIHNheSB0aGVyZSB3YXMgZXJyb3IgaW4gY3JlYXRpbmcgdGhlIHByb3h5LgotCQkgKiBAcGFyYW0gZXJyb3JUaHJvd2FibGUKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRUaHJvd2FibGUoVGhyb3dhYmxlUHJveHkgZXJyb3JUaHJvd2FibGUpIHsKLQkJCXRoaXMuZXJyb3JUaHJvd2FibGUgPSBlcnJvclRocm93YWJsZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENhbGxlZCBieSBJREVFeHByZXNzaW9uIHRvIGdldCB0aGUgcmVzb2x2ZWQgbWV0aG9kIHByb3h5LgotCQkgKiBAcmV0dXJuCi0JCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJSURFTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkJaWYgKGVycm9yVGhyb3dhYmxlICE9IG51bGwpCi0JCQkJdGhyb3cgZXJyb3JUaHJvd2FibGU7Ci0JCQlyZXR1cm4gcmVzb2x2ZWRQcm94eTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIElERUZpZWxkRXhwcmVzc2lvblByb3h5IGV4dGVuZHMgSURFRXhwcmVzc2lvblByb3h5IGltcGxlbWVudHMgSVByb3h5RmllbGQgewotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgZmllbGROYW1lOwotCQlwcml2YXRlIElERUZpZWxkUHJveHkgcmVzb2x2ZWRQcm94eTsKLQkJcHJpdmF0ZSBUaHJvd2FibGVQcm94eSBlcnJvclRocm93YWJsZTsKLQotCQkvKioKLQkJICogQHBhcmFtIHByb3h5aWQKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIElERUZpZWxkRXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJCXN1cGVyKHByb3h5aWQsIEZJRUxEX0VYUFJFU1NJT05fUFJPWFksIGV4cHJlc3Npb24pOwotCQl9Ci0JCQotCQkvKioKLQkJICogU2V0IGJ5IElERUV4cHJlc3Npb24gd2l0aCB0aGUgbWV0aG9kIG5hbWUuCi0JCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRGaWVsZChTdHJpbmcgZmllbGROYW1lKSB7Ci0JCQl0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJfQotCQkJCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiIC0gIitmaWVsZE5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBDYWxsZWQgYnkgSURFRXhwcmVzc2lvbiB0byByZXNvbHZlIHRoZSBiZWFudHlwZS4KLQkJICogQHBhcmFtIGZpZWxkUHJveHkKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRQcm94eShJREVGaWVsZFByb3h5IGZpZWxkUHJveHkpIHsKLQkJCXRoaXMucmVzb2x2ZWRQcm94eSA9IGZpZWxkUHJveHk7Ci0JCQlzZXRQcm94eShyZXNvbHZlZFByb3h5LmdldEJlYW4oKSwgQ2xhc3MuY2xhc3MpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ2FsbGVkIGJ5IElERUV4cHJlc3Npb24gdG8gc2F5IHRoZXJlIHdhcyBlcnJvciBpbiBjcmVhdGluZyB0aGUgcHJveHkuCi0JCSAqIEBwYXJhbSBlcnJvclRocm93YWJsZQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldFRocm93YWJsZShUaHJvd2FibGVQcm94eSBlcnJvclRocm93YWJsZSkgewotCQkJdGhpcy5lcnJvclRocm93YWJsZSA9IGVycm9yVGhyb3dhYmxlOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ2FsbGVkIGJ5IElERUV4cHJlc3Npb24gdG8gZ2V0IHRoZSByZXNvbHZlZCBmaWVsZCBwcm94eS4KLQkJICogQHJldHVybgotCQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCUlERUZpZWxkUHJveHkgZ2V0RmllbGRQcm94eSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCQlpZiAoZXJyb3JUaHJvd2FibGUgIT0gbnVsbCkKLQkJCQl0aHJvdyBlcnJvclRocm93YWJsZTsKLQkJCXJldHVybiByZXNvbHZlZFByb3h5OwotCQl9Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jY3JlYXRlRXhwcmVzc2lvblByb3h5KGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uUHJveHkgY3JlYXRlRXhwcmVzc2lvblByb3h5KGludCBwcm94eVR5cGUsIGludCBwcm94eUlEKSB7Ci0JCXN3aXRjaCAocHJveHlUeXBlKSB7Ci0JCQljYXNlIE5PUk1BTF9FWFBSRVNTSU9OX1BST1hZOgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbmV3IElERUV4cHJlc3Npb25Qcm94eShwcm94eUlELCBOT1JNQUxfRVhQUkVTU0lPTl9QUk9YWSwgdGhpcyk7Ci0JCQkKLQkJCWNhc2UgQkVBTlRZUEVfRVhQUkVTU0lPTl9QUk9YWToKLQkJCQlyZXR1cm4gbmV3IElERUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KHByb3h5SUQsIHRoaXMpOwotCQkJCQotCQkJY2FzZSBNRVRIT0RfRVhQUkVTU0lPTl9QUk9YWToKLQkJCQlyZXR1cm4gbmV3IElERU1ldGhvZEV4cHJlc3Npb25Qcm94eShwcm94eUlELCB0aGlzKTsKLQkJCQkKLQkJCWNhc2UgRklFTERfRVhQUkVTU0lPTl9QUk9YWToKLQkJCQlyZXR1cm4gbmV3IElERUZpZWxkRXhwcmVzc2lvblByb3h5KHByb3h5SUQsIHRoaXMpOwotCQl9Ci0JCQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hBc3NpZ25tZW50VG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFzc2lnbm1lbnRUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSBwcm94eSkgewotCQllcHJvYy5wdXNoQXNzaWdubWVudCgoSW50ZXJuYWxFeHByZXNzaW9uUHJveHkpIHByb3h5KTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQXNzaWdubWVudFRvUHJveHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hBc3NpZ25tZW50VG9Qcm94eSgpIHsKLQkJZXByb2MucHVzaEFzc2lnbm1lbnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hCbG9ja0JlZ2luVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJsb2NrQmVnaW5Ub1Byb3h5KGludCBibG9ja051bWJlcikgewotCQllcHJvYy5wdXNoQmxvY2tCZWdpbihibG9ja051bWJlcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEJsb2NrRW5kVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJsb2NrRW5kVG9Qcm94eShpbnQgYmxvY2tOdW1iZXIpIHsKLQkJZXByb2MucHVzaEJsb2NrRW5kKGJsb2NrTnVtYmVyKTsKLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQmxvY2tCcmVha1RvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCbG9ja0JyZWFrVG9Qcm94eShpbnQgYmxvY2tOdW1iZXIpIHsKLQkJZXByb2MucHVzaEJsb2NrQnJlYWsoYmxvY2tOdW1iZXIpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUcnlCZWdpblRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUcnlCZWdpblRvUHJveHkoaW50IHRyeU51bWJlcikgewotCQllcHJvYy5wdXNoVHJ5QmVnaW4odHJ5TnVtYmVyKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUcnlDYXRjaENsYXVzZVRvUHJveHkoaW50LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUcnlDYXRjaENsYXVzZVRvUHJveHkoaW50IHRyeU51bWJlciwgSVByb3h5QmVhblR5cGUgZXhjZXB0aW9uVHlwZSwgRXhwcmVzc2lvblByb3h5IGVwKSB7Ci0JCXRyeSB7Ci0JCQllcHJvYy5wdXNoVHJ5Q2F0Y2hDbGF1c2UodHJ5TnVtYmVyLCBnZXRJREVCZWFuVHlwZVByb3h5KGV4Y2VwdGlvblR5cGUpLmdldFR5cGVDbGFzcygpLCAoSW50ZXJuYWxFeHByZXNzaW9uUHJveHkpIGVwKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUcnlGaW5hbGx5Q2xhdXNlVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyeUZpbmFsbHlDbGF1c2VUb1Byb3h5KGludCB0cnlOdW1iZXIpIHsKLQkJZXByb2MucHVzaFRyeUZpbmFsbHlDbGF1c2UodHJ5TnVtYmVyKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHJ5RW5kVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyeUVuZFRvUHJveHkoaW50IHRyeU51bWJlcikgewotCQllcHJvYy5wdXNoVHJ5RW5kKHRyeU51bWJlcik7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRocm93VG9Qcm94eSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRocm93VG9Qcm94eSgpIHsKLQkJZXByb2MucHVzaFRocm93RXhjZXB0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoUmV0aHJvd1RvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hSZXRocm93VG9Qcm94eShpbnQgdHJ5TnVtYmVyKSB7Ci0JCWVwcm9jLnB1c2hUcnlSZXRocm93KHRyeU51bWJlcik7Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEJlYW5UeXBlVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVFeHByZXNzaW9uUHJveHkpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJlYW5UeXBlVG9Qcm94eShJQmVhblR5cGVFeHByZXNzaW9uUHJveHkgcHJveHkpIHsKLQkJdHJ5IHsKLQkJCUlERUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IGVwID0gKElERUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KSBwcm94eTsKLQkJCUlERUJlYW5UeXBlUHJveHkgdHlwZVByb3h5ID0gZ2V0SURFQmVhblR5cGVQcm94eShwcm94eS5nZXRUeXBlTmFtZSgpKTsKLQkJCWVwLnNldFByb3h5KHR5cGVQcm94eSk7Ci0JCQllcHJvYy5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShlcCk7Ci0JCQlpZiAoIXR5cGVQcm94eS5pc1ZhbGlkKCkpIHsKLQkJCQlUaHJvd2FibGUgY2F1c2UgPSAoKElERUluaXRFcnJvckJlYW5UeXBlUHJveHkpIHR5cGVQcm94eSkuZ2V0Q2F1c2UoKTsKLQkJCQlpZiAoY2F1c2UgPT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KAotCQkJCQkJCW5ldyBFeGNlcHRpb24odHlwZVByb3h5LmdldEluaXRpYWxpemF0aW9uRXJyb3IoKSksCi0JCQkJCQkJZ2V0SURFQmVhblR5cGVGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShFeGNlcHRpb24uY2xhc3MpKTsKLQkJCQllbHNlCi0JCQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eSgKLQkJCQkJCQljYXVzZSwKLQkJCQkJCQlnZXRJREVCZWFuVHlwZUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGNhdXNlLmdldENsYXNzKCkpKTsKLQotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWFwIG9mIElQcm94eUJlYW5UeXBlcyBmb3IgYSBiZWFudHlwZSBuYW1lLiBNZWFudCB0byBiZSB1c2VkIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCBJREVTdGFuZGFyZEJlYW5UeXBlRmFjdG9yeS4KLQkgKiBJdCBpcyBoZXJlIHNvIHRoZSBJRERFU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkgY2FuIHN0b3JlIHBlbmRpbmcgcHJveGllcyBwZXIgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhblR5cGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlKFN0cmluZyBiZWFuVHlwZU5hbWUpIHsKLQkJaWYgKGJlYW5UeXBlQ2FjaGUgPT0gbnVsbCkKLQkJCWJlYW5UeXBlQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gKElQcm94eUJlYW5UeXBlKSBiZWFuVHlwZUNhY2hlLmdldChiZWFuVHlwZU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIGJlYW50eXBlIGV4cHJlc3Npb24gcHJveHkgdG8gdGhlIG1hcCBvZiBiZWFuIHR5cGUgZXhwcmVzc2lvbiBwcm94aWVzLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggSURFU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkuCi0JICogSXQgaXMgaGVyZSBzbyB0aGUgSURFU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkgY2FuIHN0b3JlIHBlbmRpbmcgcHJveGllcyBwZXIgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gYmVhblR5cGVOYW1lCi0JICogQHBhcmFtIGJlYW50eXBlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkQmVhblR5cGUoU3RyaW5nIGJlYW5UeXBlTmFtZSwgSVByb3h5QmVhblR5cGUgYmVhbnR5cGUpIHsKLQkJYmVhblR5cGVDYWNoZS5wdXQoYmVhblR5cGVOYW1lLCBiZWFudHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYmVhbnR5cGUgZXhwcmVzc2lvbiBwcm94eSBmcm9tIHRoZSBtYXAuIFRoaXMgaXMgY2FsbGVkIGJlY2F1c2UgdGhlcmUgd2FzIGEgcm9sbGJhY2sgZHVlIHRvIGFuIGVuZG1hcmsuCi0JICogQHBhcmFtIGJlYW5UeXBlTmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUJlYW5UeXBlKFN0cmluZyBiZWFuVHlwZU5hbWUpIHsKLQkJYmVhblR5cGVDYWNoZS5yZW1vdmUoYmVhblR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBLZWVwaW5nIGEgbG9jYWwgbWFwIG9mIE1ldGhvZCBFeHByZXNzaW9uIFByb3hpZXMgc28gdGhhdCB3ZSBkb24ndCBrZWVwIHJlY3JlYXRpbmcgdGhlbSBmb3IgZWFjaCByZXF1ZXN0IGZyb20gd2l0aGluIHRoaXMgZXhwcmVzc2lvbi4KLQkgKiBUaGUgbWFwIHdpbGwgYmU6ICBkZWNsYXJpbmdUeXBlTmFtZS0+KE1hcCkgbWV0aG9kTmFtZSBvciBJREVNZXRob2RLZXkgLT4gbWV0aG9kIGV4cHJlc3Npb24gcHJveHkuIAotCSAqIEBzZWUgSURFRXhwcmVzc2lvbiNwdXNoTWV0aG9kVG9Qcm94eShFeHByZXNzaW9uUHJveHksIElQcm94eUJlYW5UeXBlLCBTdHJpbmcsIElQcm94eUJlYW5UeXBlW10pIGZvciB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLiAKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIG1ldGhvZEV4cHJlc3Npb25Qcm94aWVzOwotCQotCS8qKgotCSAqIEtlZXBpbmcgYSBsb2NhbCBtYXAgb2YgRmllbGQgRXhwcmVzc2lvbiBQcm94aWVzIHNvIHRoYXQgd2UgZG9uJ3Qga2VlcCByZWNyZWF0aW5nIHRoZW0gZm9yIGVhY2ggcmVxdWVzdCBmcm9tIHdpdGhpbiB0aGlzIGV4cHJlc3Npb24uCi0JICogVGhlIG1hcCB3aWxsIGJlOiAgZGVjbGFyaW5nVHlwZU5hbWUtPihNYXApIGZpZWxkbmFtZSAtPiBmaWVsZCBleHByZXNzaW9uIHByb3h5LiAKLQkgKiBAc2VlIElERUV4cHJlc3Npb24jcHVzaEZpZWxkVG9Qcm94eShFeHByZXNzaW9uUHJveHksIElQcm94eUJlYW5UeXBlLCBTdHJpbmcpIAotCSAqLwotCXByb3RlY3RlZCBNYXAgZmllbGRFeHByZXNzaW9uUHJveGllczsKLQkKLQkvKioKLQkgKiBLZWVwaW5nIGEgbG9jYWwgbWFwIG9mIEJlYW5UeXBlIGV4cHJlc3Npb24gcHJveGllcyBzbyB0aGF0IHdlIGRvbid0IGtlZXAgcmVjcmVhdGluZyB0aGVtIGZvciBlYWNoIHJlcXVlc3QgZnJvbSB3aXRoaW4gdGhpcyBleHByZXNzaW9uLgotCSAqIFRoZSBtYXAgd2lsbCBiZTogdHlwZW5hbWUtPmJlYW5UeXBlRXhwcmVzc2lvblByb3h5Ci0JICovCi0JcHJvdGVjdGVkIE1hcCBiZWFuVHlwZUNhY2hlOwkvLyBVc2UgdG8gY2FjaGUgcGVuZGluZyBCZWFuVHlwZXMuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBJREVTdGFuZGFyZEJlYW5UeXBlRmFjdG9yeS4KLQotCS8qCi0JICogVXNlZCBhcyB0aGUga2V5IHRvIHRoZSBtZXRob2RDYWNoZSB3aGVuIHRoZXJlIGFyZSBwYXJtcy4KLQkgKiBJdCBhbGxvd3MgdGhlIHBhcm1zIHRvIGJlIGVpdGhlciBJUHJveHlCZWFuVHlwZSB3aXRob3V0IHRoZQotCSAqIG92ZXJoZWFkIG9mIGNyZWF0aW5nIGNvbXBsaWNhdGVkIHN0cmluZ3MuCi0JICogCi0JICogSXQgd2lsbCBjb21wYXJlIG1ldGhvZCBuYW1lIGFuZCBlYWNoIGluZGl2aWR1YWwgcGFybSBuYW1lIHdpdGhvdXQgZmx1ZmZpbmcKLQkgKiB1cCBhIHN0cmluZyBhbmQgYnVpbGRpbmcgaXQgdXAuCi0JICogCi0JICogRm9yIG5vIHBhcm0gbWV0aG9kcywganVzdCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGFzIGEgc3RyaW5nIHdpbGwgYmUgdGhlIGtleS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXRob2RLZXkgewotCQlwdWJsaWMgU3RyaW5nIG1ldGhvZE5hbWU7Ci0JCXB1YmxpYyBJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlczsKLQkJcHVibGljIE1ldGhvZEtleShTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXMpIHsKLQkJCXRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0JCQl0aGlzLnBhcm1UeXBlcyA9IHBhcm1UeXBlczsKLQkJfQotCQkJCQotCQkJCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAodGhpcyA9PSBvYmopCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKE1ldGhvZEtleSkgb2JqKS5jb21wYXJlUGFybXMocGFybVR5cGVzKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUNvbnN0YW50cy5NZXRob2RLZXkjaGFzaENvZGUoKQotCQkgKi8KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWludCBoID0gbWV0aG9kTmFtZS5oYXNoQ29kZSgpOzsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaCArPSBwYXJtVHlwZXNbaV0uZ2V0VHlwZU5hbWUoKS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIGg7Ci0JCX0KLQkJCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuUkVNUHJveHlDb25zdGFudHMuTWV0aG9kS2V5I2NvbXBhcmVQYXJtcyhqYXZhLmxhbmcuU3RyaW5nW10pCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wYXJlUGFybXMoSVByb3h5QmVhblR5cGVbXSBwYXJtcykgewotCQkJaWYgKHBhcm1zLmxlbmd0aCAhPSBwYXJtVHlwZXMubGVuZ3RoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXBhcm1UeXBlc1tpXS5nZXRUeXBlTmFtZSgpLmVxdWFscyhwYXJtc1tpXS5nZXRUeXBlTmFtZSgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaE1ldGhvZFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGVbXSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoTWV0aG9kVG9Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHksIElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBNYXAgbWV0aG9kcyA9IGdldE1ldGhvZHMoZGVjbGFyaW5nVHlwZSk7Ci0JCQlmaW5hbCBPYmplY3Qga2V5ID0gZ2V0TWV0aG9kS2V5KG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsgCi0JCQltZXRob2RzLnB1dChrZXksIHByb3h5KTsKLQkJCXByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIoKSB7Ci0JCQkKLQkJCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJbWV0aG9kcy5yZW1vdmUoa2V5KTsJLy8gQmFjayBpdCBvdXQuIHRpcyBjb3VsZCBoYXBwZW4gZHVlIHRvIGVuZG1hcmsgcm9sbGJhY2suCi0JCQkJfQotCQkJCi0JCQl9KTsKLQkJCQotCQkJSURFTWV0aG9kRXhwcmVzc2lvblByb3h5IGVwID0gKElERU1ldGhvZEV4cHJlc3Npb25Qcm94eSkgcHJveHk7Ci0JCQllcC5zZXRNZXRob2ROYW1lKG1ldGhvZE5hbWUpOwotCQkJLy8gV2UgcmVzb2x2ZSBpbW1lZGlhdGVseS4gQW55IGV4cHJlc3Npb24gcHJveGllcyBzaG91bGQgYWxzbyBiZSByZXNvbHZlZCBhdCB0aGlzIHBvaW50IHRvby4KLQkJCUNsYXNzIGRlY2xhcmluZ0NsYXNzID0gZ2V0SURFQmVhblR5cGVQcm94eShkZWNsYXJpbmdUeXBlKS5nZXRUeXBlQ2xhc3MoKTsKLQkJCUNsYXNzW10gcGFyYW1ldGVyQ2xhc3NlczsKLQkJCWlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsIHx8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAwKQotCQkJCXBhcmFtZXRlckNsYXNzZXMgPSBudWxsOwotCQkJZWxzZSB7Ci0JCQkJcGFyYW1ldGVyQ2xhc3NlcyA9IG5ldyBDbGFzc1twYXJhbWV0ZXJUeXBlcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCQlwYXJhbWV0ZXJDbGFzc2VzW2ldID0gZ2V0SURFQmVhblR5cGVQcm94eShwYXJhbWV0ZXJUeXBlc1tpXSkuZ2V0VHlwZUNsYXNzKCk7Ci0JCQkJfQotCQkJfQotCQkJSURFTWV0aG9kUHJveHkgbWV0aG9kUHJveHkgPSAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZFByb3h5KGRlY2xhcmluZ0NsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJDbGFzc2VzKTsKLQkJCWlmIChtZXRob2RQcm94eSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIHBhcm1zID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBzdCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaSA+IDApCi0JCQkJCQkJc3QuYXBwZW5kKCcsJyk7Ci0JCQkJCQlzdC5hcHBlbmQocGFyYW1ldGVyVHlwZXNbaV0uZ2V0VHlwZU5hbWUoKSk7Ci0JCQkJCX0KLQkJCQkJcGFybXMgPSBzdC50b1N0cmluZygpOwotCQkJCX0KLQkJCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkobmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigiTm8gbWV0aG9kOiAiK2RlY2xhcmluZ1R5cGUrJy4nK21ldGhvZE5hbWUrIigiK3Bhcm1zKycpJyksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlnZXRJREVCZWFuVHlwZUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykpOwotCQkJfQotCQkJCi0JCQllcC5zZXRQcm94eShtZXRob2RQcm94eSk7Ci0JCQllcHJvYy5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShlcCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCSgoSURFTWV0aG9kRXhwcmVzc2lvblByb3h5KSBwcm94eSkuc2V0VGhyb3dhYmxlKGUpOwkvLyBTbyB3ZSBkb24ndCByZWNyZWF0ZSB0aHJvd2FibGUgYWxsIG9mIHRoZSB0aW1lLgotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgTWFwIGdldE1ldGhvZHMoSVByb3h5QmVhblR5cGUgY2xhc3N0eXBlKSB7Ci0JCWlmIChtZXRob2RFeHByZXNzaW9uUHJveGllcyA9PSBudWxsKQotCQkJbWV0aG9kRXhwcmVzc2lvblByb3hpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgbWV0aG9kcyA9IChNYXApIG1ldGhvZEV4cHJlc3Npb25Qcm94aWVzLmdldChjbGFzc3R5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0JCWlmIChtZXRob2RzID09IG51bGwpCi0JCQltZXRob2RFeHByZXNzaW9uUHJveGllcy5wdXQoY2xhc3N0eXBlLmdldFR5cGVOYW1lKCksIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpKTsKLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGdldE1ldGhvZEtleShTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCB8fCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBtZXRob2ROYW1lOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IE1ldGhvZEtleShtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCXByaXZhdGUgTWFwIGdldEZpZWxkcyhJUHJveHlCZWFuVHlwZSBjbGFzc3R5cGUpIHsKLQkJaWYgKGZpZWxkRXhwcmVzc2lvblByb3hpZXMgPT0gbnVsbCkKLQkJCWZpZWxkRXhwcmVzc2lvblByb3hpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgZmllbGRzID0gKE1hcCkgZmllbGRFeHByZXNzaW9uUHJveGllcy5nZXQoY2xhc3N0eXBlLmdldFR5cGVOYW1lKCkpOwotCQlpZiAoZmllbGRzID09IG51bGwpCi0JCQlmaWVsZEV4cHJlc3Npb25Qcm94aWVzLnB1dChjbGFzc3R5cGUuZ2V0VHlwZU5hbWUoKSwgZmllbGRzID0gbmV3IEhhc2hNYXAoKSk7Ci0JCXJldHVybiBmaWVsZHM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCBieSBJREVCZWFuVHlwZXMgYW5kIElERUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IHRvIGFjY2VzcyBhbnkgYWxyZWFkeSBjcmVhdGVkIE1ldGhvZCBFeHByZXNzaW9uIFByb3hpZXMuCi0JICogCi0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcwotCSAqIEByZXR1cm4gSVByb3h5TWV0aG9kIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCB5ZXQgY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlJUHJveHlNZXRob2QgZ2V0TWV0aG9kRXhwcmVzc2lvblByb3h5KElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCU1hcCBtZXRob2RzID0gZ2V0TWV0aG9kcyhkZWNsYXJpbmdUeXBlKTsKLQkJT2JqZWN0IGtleSA9IGdldE1ldGhvZEtleShtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7IAotCQlyZXR1cm4gKElQcm94eU1ldGhvZCkgbWV0aG9kcy5nZXQoa2V5KTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIGJ5IElERUJlYW5UeXBlcyBhbmQgSURFQmVhblR5cGVFeHByZXNzaW9uUHJveHkgdG8gYWNjZXNzIGFueSBhbHJlYWR5IGNyZWF0ZWQgRmllbGQgRXhwcmVzc2lvbiBQcm94aWVzLgotCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlCi0JICogQHBhcmFtIGZpZWxkTmFtZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlJUHJveHlGaWVsZCBnZXRGaWVsZEV4cHJlc3Npb25Qcm94eShJUHJveHlCZWFuVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCU1hcCBmaWVsZHMgPSBnZXRGaWVsZHMoZGVjbGFyaW5nVHlwZSk7Ci0JCXJldHVybiAoSVByb3h5RmllbGQpIGZpZWxkcy5nZXQoZmllbGROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJREVNZXRob2RQcm94eSBvdXQgb2YgdGhlIGFscmVhZHkgcmVzb2x2ZWQgRXhwcmVzc2lvbiBQcm94eSBvciBJREVNZXRob2RQcm94eSBpdHNlbGYuCi0JICogQHBhcmFtIG1ldGhvZAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIElERU1ldGhvZFByb3h5IGdldElERU1ldGhvZFByb3h5KElQcm94eU1ldGhvZCBtZXRob2QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlERU1ldGhvZFByb3h5IG1ldGhvZFByb3h5OwotCQlpZiAobWV0aG9kLmlzRXhwcmVzc2lvblByb3h5KCkpIHsKLQkJCS8vIEl0IHNob3VsZCBhbHJlYWR5IGJlIHJlc29sdmVkIGF0IHRoaXMgcG9pbnQuCi0JCQltZXRob2RQcm94eSA9ICgoSURFTWV0aG9kRXhwcmVzc2lvblByb3h5KSBtZXRob2QpLmdldE1ldGhvZFByb3h5KCk7Ci0JCX0gZWxzZQotCQkJbWV0aG9kUHJveHkgPSAoSURFTWV0aG9kUHJveHkpIG1ldGhvZDsKLQkJcmV0dXJuIG1ldGhvZFByb3h5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEZpZWxkVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHksIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hGaWVsZFRvUHJveHkoRXhwcmVzc2lvblByb3h5IHByb3h5LCBJUHJveHlCZWFuVHlwZSBkZWNsYXJpbmdUeXBlLCBmaW5hbCBTdHJpbmcgZmllbGROYW1lKSB7Ci0KLQkJdHJ5IHsKLQkJCWZpbmFsIE1hcCBmaWVsZHMgPSBnZXRGaWVsZHMoZGVjbGFyaW5nVHlwZSk7Ci0JCQlmaWVsZHMucHV0KGZpZWxkTmFtZSwgcHJveHkpOwotCQkJcHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlcigpewotCQkJCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJZmllbGRzLnJlbW92ZShmaWVsZE5hbWUpOwkvLyB0aGlzIGNhbiBoYXBwZW4gZHVlIHRvIGFuIGVuZG1hcmsuIEl0IGNvdWxkIGJlIG9uZSBvZiB0aGUgb25lcyB0aGF0IGFyZSByb2xsZWQgYmFjay4KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJCi0JCQlJREVGaWVsZEV4cHJlc3Npb25Qcm94eSBlcCA9IChJREVGaWVsZEV4cHJlc3Npb25Qcm94eSkgcHJveHk7Ci0JCQkvLyBXZSByZXNvbHZlIGltbWVkaWF0ZWx5LiBBbnkgZXhwcmVzc2lvbiBwcm94aWVzIHNob3VsZCBhbHNvIGJlIHJlc29sdmVkIGF0IHRoaXMgcG9pbnQgdG9vLgotCQkJSURFRmllbGRQcm94eSBmaWVsZFByb3h5ID0gKElERUZpZWxkUHJveHkpIGdldElERUJlYW5UeXBlUHJveHkoZGVjbGFyaW5nVHlwZSkuZ2V0RmllbGRQcm94eShmaWVsZE5hbWUpOwotCQkJaWYgKGZpZWxkUHJveHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KG5ldyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbigiTm8gZmllbGQ6ICIrZGVjbGFyaW5nVHlwZSsnLicrZmllbGROYW1lKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRJREVCZWFuVHlwZUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KE5vU3VjaEZpZWxkRXhjZXB0aW9uLmNsYXNzKSk7Ci0JCQl9Ci0JCQkKLQkJCWVwLnNldFByb3h5KGZpZWxkUHJveHkpOwotCQkJZXByb2MuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoZXApOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkoKElERUZpZWxkRXhwcmVzc2lvblByb3h5KSBwcm94eSkuc2V0VGhyb3dhYmxlKGUpOwkvLyBTbyB3ZSBkb24ndCByZWNyZWF0ZSB0aHJvd2FibGUgYWxsIG9mIHRoZSB0aW1lLgotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQkJCi0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJREVGaWVsZFByb3h5IG91dCBvZiB0aGUgYWxyZWFkeSByZXNvbHZlZCBFeHByZXNzaW9uIFByb3h5IG9yIElERUZpZWxkUHJveHkgaXRzZWxmLgotCSAqIEBwYXJhbSBmaWVsZAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIElERUZpZWxkUHJveHkgZ2V0SURFRmllbGRQcm94eShJUHJveHlGaWVsZCBmaWVsZCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSURFRmllbGRQcm94eSBmaWVsZFByb3h5OwotCQlpZiAoZmllbGQuaXNFeHByZXNzaW9uUHJveHkoKSkgewotCQkJLy8gSXQgc2hvdWxkIGFscmVhZHkgYmUgcmVzb2x2ZWQgYXQgdGhpcyBwb2ludC4KLQkJCWZpZWxkUHJveHkgPSAoKElERUZpZWxkRXhwcmVzc2lvblByb3h5KSBmaWVsZCkuZ2V0RmllbGRQcm94eSgpOwotCQl9IGVsc2UKLQkJCWZpZWxkUHJveHkgPSAoSURFRmllbGRQcm94eSkgZmllbGQ7Ci0JCXJldHVybiBmaWVsZFByb3h5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaElmVGVzdFRvUHJveHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJZlRlc3RUb1Byb3h5KCkgewotCQllcHJvYy5wdXNoSWZFbHNlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSWZFbHNlVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaElmRWxzZVRvUHJveHkoSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZSBjbGF1c2VUeXBlKSB7Ci0JCWVwcm9jLnB1c2hJZkVsc2UoY2xhdXNlVHlwZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoTmV3SW5zdGFuY2VUb1Byb3h5KGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hOZXdJbnN0YW5jZVRvUHJveHkoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nLCBJUHJveHlCZWFuVHlwZSByZXN1bHRUeXBlKSB7Ci0JCXRyeSB7Ci0JCQllcHJvYy5wdXNoTmV3SW5zdGFuY2VGcm9tU3RyaW5nKGluaXRpYWxpemF0aW9uU3RyaW5nLCBnZXRJREVCZWFuVHlwZVByb3h5KHJlc3VsdFR5cGUpLmdldFR5cGVDbGFzcygpLCBnZXRJREVSZWdpc3RyeSgpLmZDbGFzc0xvYWRlcik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoTWFya1RvUHJveHkoaW50IG1hcmtJRCkgewotCQllcHJvYy5wdXNoTWFyayhtYXJrSUQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hFbmRtYXJrVG9Qcm94eShpbnQgbWFya0lELCBib29sZWFuIHJlc3RvcmUpIHsKLQkJZXByb2MucHVzaEVuZG1hcmsobWFya0lELCByZXN0b3JlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmVnaW5UcmFuc2ZlclRocmVhZFRvUHJveHkoKSB7Ci0JCS8vIEZvciBJREUgaXQgZG9lc24ndCBtYXR0ZXIuIEp1c3QgZ28gYWhlYWQgYW5kIGNvbnRpbnVlIHByb2Nlc3NpbmcuCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyYW5zZmVyVGhyZWFkVG9Qcm94eSgpIHsKLQkJLy8gRm9yIElERSBpdCBkb2Vzbid0IG1hdHRlci4gSnVzdCBnbyBhaGVhZCBhbmQgY29udGludWUgcHJvY2Vzc2luZy4KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoU3ViZXhwcmVzc2lvbkJlZ2luVG9Qcm94eShpbnQgc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQllcHJvYy5wdXNoU3ViZXhwcmVzc2lvbkJlZ2luKHN1YmV4cHJlc3Npb25OdW1iZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hTdWJleHByZXNzaW9uRW5kVG9Qcm94eShpbnQgc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQllcHJvYy5wdXNoU3ViZXhwcmVzc2lvbkVuZChzdWJleHByZXNzaW9uTnVtYmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MWIyNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgaW50ZXJmYWNlIElERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5IGV4dGVuZHMgSUJlYW5UeXBlUHJveHlGYWN0b3J5IHsKLQotcHVibGljIElERUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgY2xhc3NOYW1lKTsKLQotcHVibGljIElERUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUsIElCZWFuVHlwZVByb3h5IHN1cGVyVHlwZSk7CQotCi1wdWJsaWMgSVByb3h5QmVhblR5cGUgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUsIElFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmllbGRQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGaWVsZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTQxODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGaWVsZFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVGaWVsZFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBJRmllbGRQcm94eSB3aGVyZSB0aGUgYmVhbiB2bSBpcyB0aGUgc2FtZSBhcyB0aGUgSURFCi0gKiBUaGVyZWZvcmUgd2UgaG9sZCB0aGUgaW5zdGFuY2Ugb2YgYSBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBpbiBhIGZpZWxkCi0gKiBkaXJlY3RseSBhbmQgaGF2ZSBhIHBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHRvIHNldCB0aGlzCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxMjozMjoyNCBQTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVGaWVsZFByb3h5IGV4dGVuZHMgSURFQWNjZXNzaWJsZU9iamVjdFByb3h5IGltcGxlbWVudHMgSUZpZWxkUHJveHkgewotCXByb3RlY3RlZCBJQmVhblR5cGVQcm94eSBmRmllbGRUeXBlOwotCS8qKgotCSAqIFBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgdGhlIGZpZWxkIGRpcmVjdGx5Ci0JICogVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIG9ubHkgY2xhc3NlcyBpbiB0aGUgSURFIHBhY2thZ2UgY2FuIGNvbnN0cnVjdAotCSAqIHRoaXMuICBFdmVyeW9uZSBlbHNlIG11c3QgZ28gdmlhIHRoZSB0eXBlUHJveHkKLQkgKi8KLQlJREVGaWVsZFByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgRmllbGQgYUZpZWxkKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYUZpZWxkKTsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgYW5kIHJldHVybiBpdCB3cmFwcGVkIGluIGEgYmVhbiBwcm94eQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldChJQmVhblByb3h5IGFTdWJqZWN0KSB7Ci0KLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCS8vIEdldCB0aGUgZmllbGQgdmFsdWUgYW5kIGNhdGNoIGFueSBlcnJvcnMJCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoKEZpZWxkKSBnZXRCZWFuKCkpLmdldChhU3ViamVjdCAhPSBudWxsID8gKChJSURFQmVhblByb3h5KSBhU3ViamVjdCkuZ2V0QmVhbigpIDogbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBJZiB3ZSBoYXZlIGEgbm9uIG51bGwgcmVzdWx0IHdyYXAgaXQgaW4gYW4gSUJlYW5Qcm94eSBhbmQgcmV0dXJuIGl0Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuUHJveHkoKChGaWVsZCkgZ2V0QmVhbigpKS5nZXRUeXBlKCksIHJlc3VsdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCS8qKgotCSAqIEdldCB0aGUgYmVhbnMgZnJvbSBib3RoIG9mIHRoZSBwcm94aWVzIGFuZCBpbnZva2UgdGhlIGZpZWxkIHNldCBtZXRob2QKLQkgKiBDYXN0IHRvIElERUJlYW5Qcm94eSBhbmQgdXNlIHBhY2thZ2UgcHJvdGVjdGVkIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IGFTdWJqZWN0LCBJQmVhblByb3h5IGFyZ3VtZW50KSB7Ci0KLQkJLy8gU2V0IHRoZSBmaWVsZCB2YWx1ZSBhbmQgY2F0Y2ggYW55IGVycm9ycwkKLQkJdHJ5IHsKLQkJCSgoRmllbGQpIGdldEJlYW4oKSkuc2V0KAotCQkJCWFTdWJqZWN0ICE9IG51bGwgPyAoKElJREVCZWFuUHJveHkpIGFTdWJqZWN0KS5nZXRCZWFuKCkgOiBudWxsLAotCQkJCWFyZ3VtZW50ICE9IG51bGwgPyAoKElJREVCZWFuUHJveHkpIGFyZ3VtZW50KS5nZXRCZWFuKCkgOiBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKioKLQkgKiBUaGUgdHlwZSBwcm94eSBpcyBjb25zdGFudCBwcm94eSBvdXQgb2YgdGhlIG1ldGhvZCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5maWVsZFR5cGU7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldEZpZWxkVHlwZSgpIHsKLQkJaWYgKGZGaWVsZFR5cGUgPT0gbnVsbCkgewotCQkJZkZpZWxkVHlwZSA9Ci0JCQkJKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eSgKLQkJCQkJKChGaWVsZCkgZ2V0QmVhbigpKS5nZXRUeXBlKCkpOwotCQl9Ci0JCXJldHVybiBmRmllbGRUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmllbGRUeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmllbGRUeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU4YzllZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUZpZWxkVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVGaWVsZFR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVGaWVsZFR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgewotCQotCUlERUZpZWxkVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXN1cGVyKHJlZ2lzdHJ5LCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElERUJlYW5UeXBlUHJveHkjbmV3QmVhblByb3h5KE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXJldHVybiBuZXcgSURFRmllbGRQcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkgYW5PYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkOTEyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVGbG9hdENsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIEZsb2F0IEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVGbG9hdENsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIElERU51bWJlckJlYW5UeXBlUHJveHkgewotCi1wcm90ZWN0ZWQgSURFRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcywgbmV3IEZsb2F0KDApKTsKLX0KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlRmxvYXRCZWFuUHJveHkoRmxvYXQgYUZsb2F0KXsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYUZsb2F0LHRoaXMpOwotfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUZsb2F0VHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmxvYXRUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFjNjk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmxvYXRUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFRmxvYXRUeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogRmxvYXQgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERUZsb2F0VHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLXByb3RlY3RlZCBJREVGbG9hdFR5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVGbG9hdEJlYW5Qcm94eShmbG9hdCBhRmxvYXQpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxuZXcgRmxvYXQoYUZsb2F0KSx0aGlzKTsKLX0KLWludCBnZXRQcmltaXRpdmVUeXBlKCl7Ci0JcmV0dXJuIEZMT0FUOwotfQotCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQlOdW1iZXIgbiA9IGFuT2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyID8gbmV3IEZsb2F0KCgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCkpIDogKE51bWJlcikgYW5PYmplY3Q7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBuLCB0aGlzKTsKLQotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW5pdEVycm9yQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbml0RXJyb3JCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjMzNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbml0RXJyb3JCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotCi0vKgotICogICRSQ1NmaWxlOiBJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6IFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZgotICogdHlwZSBjb21tZW50cyBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzbmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgaW5pdGlhbGl6YXRpb25FcnJvcjsKLQkKLQlwcm90ZWN0ZWQgVGhyb3dhYmxlIGNhdXNlOwotCi0JcHJvdGVjdGVkIElERUluaXRFcnJvckJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBjbGFzc25hbWUsIFN0cmluZyBpbml0aWFsaXphdGlvbkVycm9yLCBUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIocmVnaXN0cnksIG51bGwpOwotCQl0aGlzLmNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKLQkJdGhpcy5pbml0aWFsaXphdGlvbkVycm9yID0gaW5pdGlhbGl6YXRpb25FcnJvcjsKLQkJdGhpcy5jYXVzZSA9IGNhdXNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGhyb3dhYmxlIChjYXVzZSkgdGhhdCBtYWRlIHRoaXMgYmVhbiB0eXBlIGJhZC4gCi0JICogQHJldHVybiB0aGUgVGhyb3dhYmxlIHRoYXQgd2FzIHRoZSBjYXVzZSwgb3IgbnVsbCBpZiBub3QgY2F1c2VkIGJ5IGFuIHRocm93YWJsZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewotCQlyZXR1cm4gY2F1c2U7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldERlY2xhcmVkRmllbGRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEZpZWxkUHJveHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldE1ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXREZWNsYXJlZE1ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShTdHJpbmcsIFN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudENsYXNzTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KFN0cmluZywgSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShTdHJpbmcsIFN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoU3RyaW5nLCBJQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TnVsbENvbnN0cnVjdG9yUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRTdXBlckJlYW5UeXBlUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRTdXBlckJlYW5UeXBlUHJveHkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0VHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBjbGFzc25hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRGb3JtYWxUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb3JtYWxUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc0ludGVyZmFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzUHJpbWl0aXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNLaW5kT2YoSUJlYW5UeXBlUHJveHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNLaW5kT2YoSUJlYW5UeXBlUHJveHkgYUJlYW5Qcm94eVR5cGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbml0aWFsaXphdGlvbkVycm9yKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxpemF0aW9uRXJyb3IoKSB7Ci0JCXJldHVybiBpbml0aWFsaXphdGlvbkVycm9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSN0b0JlYW5TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gY2xhc3NuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNpc1ZhbGlkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlQ29uc3RydWN0b3Iob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVNZXRob2QoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRDb21wYXRpYmxlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbnRlZ2VyQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUludGVnZXJCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlZTZhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUludGVnZXJCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUludGVnZXJCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIElERSBQcm94eSBmb3IgSW50ZWdlcnMuIFNpbmNlIEludGVnZXJzIHdlcmUgZmlyc3QgaW1wbGVtZW50ZWQKLSAqIGluIHRoZSBWQ0UsIGFuZCBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIHJlZmVyZW5jZWQsIHdlJ3ZlIGNyZWF0ZWQKLSAqIGEgc3ViY2xhc3MgdG8gaGFuZGxlIHRoZW0uIFRoYXQgd2F5IHdlIHdvdWxkbid0IG5lZWQgdG8gY2hhbmdlCi0gKiBldmVyeW9uZSB0aGF0IHdhcyB1c2luZyB0aGUgSUludGVnZXJQcm94eSBpbnRlcmZhY2UgYW5kIHdlCi0gKiBjYW4gc3RvcmUgdGhlIGludCB2YWx1ZSB0byBzcGVlZCB1cCBhY2Nlc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVJbnRlZ2VyQmVhblByb3h5IGV4dGVuZHMgSURFTnVtYmVyQmVhblByb3h5IGltcGxlbWVudHMgSUludGVnZXJCZWFuUHJveHkgewotCXByb3RlY3RlZCBpbnQgZkludFZhbHVlOwotSURFSW50ZWdlckJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIE51bWJlciBhbkludGVnZXIsIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhbkludGVnZXIgLCBhQmVhblR5cGVQcm94eSk7Ci0JZkludFZhbHVlID0gYW5JbnRlZ2VyLmludFZhbHVlKCk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgaW50IHZhbHVlCi0gKi8KLXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JcmV0dXJuIGZJbnRWYWx1ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZWE5ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVJbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUludGVnZXJCZWFuUHJveHk7Ci0KLS8qKgotICogSURFIEltcGxlbWVudGF0aW9uIG9mIElJbnRlZ2VyQmVhblR5cGVQcm94eQotICovCi1maW5hbCBjbGFzcyBJREVJbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFTnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElERUludGVnZXJCZWFuUHJveHkgemVyb0ludFByb3h5OwotCXByaXZhdGUgZmluYWwgSURFSW50ZWdlckJlYW5Qcm94eSBvbmVJbnRQcm94eTsKLQlwcml2YXRlIGZpbmFsIElERUludGVnZXJCZWFuUHJveHkgdHdvSW50UHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJREVJbnRlZ2VyQmVhblByb3h5IHRocmVlSW50UHJveHk7Ci1JREVJbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsIG5ldyBJbnRlZ2VyKDApKTsKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvSW50UHJveHkgPSBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDApLCB0aGlzICk7CQotCW9uZUludFByb3h5ID0gbmV3IElERUludGVnZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcigxKSwgdGhpcyApOwotCXR3b0ludFByb3h5ID0gbmV3IElERUludGVnZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcigyKSwgdGhpcyApOwotCXRocmVlSW50UHJveHkgPSBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDMpLCB0aGlzICk7Ci0JCQotfQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVJbnRlZ2VyQmVhblByb3h5KEludGVnZXIgYW5JbnRlZ2VyKSB7Ci0Jc3dpdGNoKGFuSW50ZWdlci5pbnRWYWx1ZSgpKXsKLQkJY2FzZSAwOiByZXR1cm4gemVyb0ludFByb3h5IDsKLQkJY2FzZSAxOiByZXR1cm4gb25lSW50UHJveHkgOwotCQljYXNlIDI6IHJldHVybiB0d29JbnRQcm94eSA7Ci0JCWNhc2UgMzogcmV0dXJuIHRocmVlSW50UHJveHkgOwotCQlkZWZhdWx0OiByZXR1cm4gbmV3IElERUludGVnZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFuSW50ZWdlcix0aGlzKTsKLQl9Ci19Ci1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQotCXJldHVybiAoSUlERUJlYW5Qcm94eSljcmVhdGVJbnRlZ2VyQmVhblByb3h5KChJbnRlZ2VyKWFuT2JqZWN0KTsKLQotfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUludGVnZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmM2VkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUludGVnZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUludGVnZXJCZWFuUHJveHk7Ci0KLS8qKgotICogSURFIEltcGxlbWVudGF0aW9uIG9mIElJbnRlZ2VyQmVhblR5cGVQcm94eQotICovCi1maW5hbCBjbGFzcyBJREVJbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSURFSW50ZWdlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJREVJbnRlZ2VyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSURFSW50ZWdlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElERUludGVnZXJCZWFuUHJveHkgdGhyZWVQcm94eTsKLUlERUludGVnZXJUeXBlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDApLCB0aGlzICk7Ci0Jb25lUHJveHkgPSBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDEpLCB0aGlzICk7Ci0JdHdvUHJveHkgPSBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDIpLCB0aGlzICk7Ci0JdGhyZWVQcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMyksIHRoaXMgKTsKLQkJCi19Ci0vKioKLSAqIFN0YXRpYyBoZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlJbnRlZ2VyQmVhblByb3h5IGNyZWF0ZUludGVnZXJCZWFuUHJveHkoaW50IGFuSW50KSB7Ci0Jc3dpdGNoKGFuSW50KXsKLQkJY2FzZSAwOiByZXR1cm4gemVyb1Byb3h5IDsKLQkJY2FzZSAxOiByZXR1cm4gb25lUHJveHkgOwotCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQlkZWZhdWx0OiByZXR1cm4gbmV3IElERUludGVnZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBJbnRlZ2VyKGFuSW50KSx0aGlzKTsKLQl9Ci19Ci0vKiBTcGVjaWFsaXplZCBmcm9tIElERUJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIElJbnRlZ2VyQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5Ci0gKi8KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCU51bWJlciBuID0gYW5PYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIgPyBuZXcgSW50ZWdlcigoKENoYXJhY3RlcikgYW5PYmplY3QpLmNoYXJWYWx1ZSgpKSA6IChOdW1iZXIpIGFuT2JqZWN0OwotCXN3aXRjaChuLmludFZhbHVlKCkpewotCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHkgOwotCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIG4sIHRoaXMpOwotCX0KLQkKLQkKLX0KLWludCBnZXRQcmltaXRpdmVUeXBlKCl7Ci0JcmV0dXJuIElOVEVHRVI7Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTG9uZ0NsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVMb25nQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDZiNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVMb25nQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVMb25nQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBMb25nIEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVMb25nQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFTnVtYmVyQmVhblR5cGVQcm94eSB7Ci0JCQotcHJvdGVjdGVkIElERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcywgbmV3IExvbmcoMCkpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVMb25nQmVhblByb3h5KExvbmcgYUxvbmcpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxhTG9uZyx0aGlzKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUxvbmdUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVMb25nVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExM2VhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUxvbmdUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogTG9uZyBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci0JCi1wcm90ZWN0ZWQgSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVMb25nQmVhblByb3h5KGxvbmcgYUxvbmcpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxuZXcgTG9uZyhhTG9uZyksdGhpcyk7Ci19Ci1pbnQgZ2V0UHJpbWl0aXZlVHlwZSgpewotCXJldHVybiBMT05HOwotfQotCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQlOdW1iZXIgbiA9IGFuT2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyID8gbmV3IExvbmcoKChDaGFyYWN0ZXIpIGFuT2JqZWN0KS5jaGFyVmFsdWUoKSkgOiAoTnVtYmVyKSBhbk9iamVjdDsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIG4sIHRoaXMpOwotfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OGY3MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVNZXRob2RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERU1ldGhvZFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotcHVibGljIGNsYXNzIElERU1ldGhvZFByb3h5IGV4dGVuZHMgSURFQWNjZXNzaWJsZU9iamVjdFByb3h5IGltcGxlbWVudHMgSU1ldGhvZFByb3h5IHsKLQotCXByb3RlY3RlZCBJREVNZXRob2RQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIE1ldGhvZCBhTWV0aG9kKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYU1ldGhvZCk7Ci0JfQotCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldENsYXNzVHlwZSgpIHsKLQkJcmV0dXJuICgoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmdldEJlYW5UeXBlUHJveHkoCi0JCQkoKE1ldGhvZCkgZ2V0QmVhbigpKS5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQl9Ci0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFJldHVyblR5cGUoKSB7Ci0JCXJldHVybiAoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KAotCQkJKChNZXRob2QpIGdldEJlYW4oKSkuZ2V0UmV0dXJuVHlwZSgpKTsKLQl9Ci0JcHVibGljIElCZWFuVHlwZVByb3h5W10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7Ci0JCUNsYXNzW10gcGFybUNsYXNzZXMgPSAoKE1ldGhvZCkgZ2V0QmVhbigpKS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlJQmVhblR5cGVQcm94eVtdIHBhcm1UeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVtwYXJtQ2xhc3Nlcy5sZW5ndGhdOwotCQlJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGZhY3RvcnkgPSAoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybUNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBhcm1UeXBlc1tpXSA9IGZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShwYXJtQ2xhc3Nlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHBhcm1UeXBlczsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gKChNZXRob2QpIGdldEJlYW4oKSkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIHByb3h5IGlzIGNvbnN0YW50IHByb3h5IG91dCBvZiB0aGUgbWV0aG9kIGZhY3RvcnkuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLm1ldGhvZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlIHRoZSBtZXRob2QgZGlyZWN0bHkuICBCZWNhdXNlIHdlIGFyZSBhbiBJREVNZXRob2RQcm94eSB3ZSBjYW4gYXNzdW1lIHRoYXQgSUJlYW5Qcm94eQotCSAqIGlzIGFuIElERUJlYW5Qcm94eSBhbmQgd2UgY2FuIGdldCBpdHMgYmVhbiBkaXJlY3RseQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gKChNZXRob2QpIGdldEJlYW4oKSkuaW52b2tlKHN1YmplY3QgIT0gbnVsbCA/ICgoSUlERUJlYW5Qcm94eSkgc3ViamVjdCkuZ2V0QmVhbigpIDogbnVsbCwgbmV3IE9iamVjdFswXSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVGhlIHJlc3VsdCBtYXkgYmUgYSBqYXZhLmxhbmcuSW50ZWdlciB3aGVuIHdlIHJlYWxseSB3YW50IHRvIGNyZWF0ZSBhbiBpbnQKLQkJCQkvLyBSZWZsZWN0aW9uIGFsd2F5cyBnaXZlIHlvdSB0aGUgYmlnIG9iamVjdAotCQkJCUNsYXNzIHJldHVyblR5cGUgPSAoKE1ldGhvZCkgZ2V0QmVhbigpKS5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJcmV0dXJuIGdldEJlYW5Qcm94eShyZXR1cm5UeXBlLCByZXN1bHQpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgaXMgYSB3cmFwcGVyZWQgZXhjZXB0aW9uLiBSZXR1cm4gdGhlIHdyYXBwZXJlZCBvbmUgc28gaXQgbG9va3MgbGlrZQotCQkJLy8gaXQgd2FzIHRoZSByZWFsIG9uZS4KLQkJCUlCZWFuVHlwZVByb3h5IGV4Y2VwdGlvblR5cGVQcm94eSA9Ci0JCQkJKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eSgKLQkJCQkJZS5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRDbGFzcygpKTsKLQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eShlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBleGNlcHRpb25UeXBlUHJveHkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlJQmVhblR5cGVQcm94eSBleGNlcHRpb25UeXBlUHJveHkgPQotCQkJCSgoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmdldEJlYW5UeXBlUHJveHkoZXhjLmdldENsYXNzKCkpOwotCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KGV4YywgZXhjZXB0aW9uVHlwZVByb3h5KTsKLQkJfQotCX0KLQkvKioKLQkgKiBEbyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIGludm9rZShzdWJqZWN0KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogSW52b2tlIHRoZSBtZXRob2Qgd2l0aCBhcmd1bWVudC4gIFRoZSBhcmd1bWVudCB3aWxsIGJlIGFuIElERUJlYW5Qcm94eSAKLQkgKiAoIGJlY2F1c2Ugd2UgYXJlIGFuIElERU1ldGhvZFByb3h5ICkgc28gd2UgY2FuIGNhc3QgdG8gaXQgYW5kIGdldCB0aGUgYWN0dWFsIGJlYW4KLQkgKiBpdHNlbGYgYW5kIHVzZSB0aGlzIHRvIGludm9rZSBhZ2FpbnN0IG1ldGhvZCB3aGljaCBpcyB0aGUgYWN0dWFsCi0JICogamF2YS5sYW5nLlJlZmxlY3QgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2UoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IGFyZ3VtZW50KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQl0cnkgewotCQkJT2JqZWN0IHJlc3VsdCA9Ci0JCQkJKChNZXRob2QpIGdldEJlYW4oKSkuaW52b2tlKAotCQkJCQlzdWJqZWN0ICE9IG51bGwgPyAoKElJREVCZWFuUHJveHkpIHN1YmplY3QpLmdldEJlYW4oKSA6IG51bGwsCi0JCQkJCW5ldyBPYmplY3RbXSB7IGFyZ3VtZW50ICE9IG51bGwgPyAoKElJREVCZWFuUHJveHkpIGFyZ3VtZW50KS5nZXRCZWFuKCkgOiBudWxsIH0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCUNsYXNzIHJldHVyblR5cGUgPSAoKE1ldGhvZCkgZ2V0QmVhbigpKS5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJcmV0dXJuIGdldEJlYW5Qcm94eShyZXR1cm5UeXBlLCByZXN1bHQpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgaXMgYSB3cmFwcGVyZWQgZXhjZXB0aW9uLiBSZXR1cm4gdGhlIHdyYXBwZXJlZCBvbmUgc28gaXQgbG9va3MgbGlrZQotCQkJLy8gaXQgd2FzIHRoZSByZWFsIG9uZS4KLQkJCUlCZWFuVHlwZVByb3h5IGV4Y2VwdGlvblR5cGVQcm94eSA9Ci0JCQkJKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eSgKLQkJCQkJZS5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRDbGFzcygpKTsKLQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eShlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBleGNlcHRpb25UeXBlUHJveHkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlJQmVhblR5cGVQcm94eSBleGNlcHRpb25UeXBlUHJveHkgPQotCQkJCSgoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmdldEJlYW5UeXBlUHJveHkoZXhjLmdldENsYXNzKCkpOwotCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KGV4YywgZXhjZXB0aW9uVHlwZVByb3h5KTsKLQkJfQotCX0KLQkvKioKLQkgKiBJbnZva2Ugd2l0aG91dCB0aHJvd2luZyBhbiBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IGFyZ3VtZW50KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKHN1YmplY3QsIGFyZ3VtZW50KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogSW52b2tlIHRoZSBtZXRob2Qgd2l0aCBhcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIHdpbGwgYmUgSURFQmVhblByb3h5IG9iamVjdHMKLQkgKiAoIGJlY2F1c2Ugd2UgYXJlIGFuIElERU1ldGhvZFByb3h5ICkgc28gd2UgY2FuIGNhc3QgdG8gdGhlbSBhbmQgZ2V0IHRoZSBhY3R1YWwgYmVhbgotCSAqIG9iamVjdHMgdGhlbXNlbHZlcyBhbmQgdXNlIHRoZXNlIHRvIGludm9rZSBhZ2FpbnN0IG1ldGhvZCB3aGljaCBpcyB0aGUgYWN0dWFsCi0JICogamF2YS5sYW5nLlJlZmxlY3QgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2UoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5W10gYXJndW1lbnRzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlPYmplY3RbXSBiZWFuQXJndW1lbnRzID0gbmV3IE9iamVjdFthcmd1bWVudHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcmd1bWVudHNbaV0gIT0gbnVsbCkgewotCQkJCWJlYW5Bcmd1bWVudHNbaV0gPSAoKElJREVCZWFuUHJveHkpIGFyZ3VtZW50c1tpXSkuZ2V0QmVhbigpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gKChNZXRob2QpIGdldEJlYW4oKSkuaW52b2tlKHN1YmplY3QgIT0gbnVsbCA/ICgoSUlERUJlYW5Qcm94eSkgc3ViamVjdCkuZ2V0QmVhbigpIDogbnVsbCwgYmVhbkFyZ3VtZW50cyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJQ2xhc3MgcmV0dXJuVHlwZSA9ICgoTWV0aG9kKSBnZXRCZWFuKCkpLmdldFJldHVyblR5cGUoKTsKLQkJCQlyZXR1cm4gZ2V0QmVhblByb3h5KHJldHVyblR5cGUsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBhIHdyYXBwZXJlZCBleGNlcHRpb24uIFJldHVybiB0aGUgd3JhcHBlcmVkIG9uZSBzbyBpdCBsb29rcyBsaWtlCi0JCQkvLyBpdCB3YXMgdGhlIHJlYWwgb25lLgotCQkJSUJlYW5UeXBlUHJveHkgZXhjZXB0aW9uVHlwZVByb3h5ID0KLQkJCQkoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KAotCQkJCQllLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldENsYXNzKCkpOwotCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4Y2VwdGlvblR5cGVQcm94eSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlCZWFuVHlwZVByb3h5IGV4Y2VwdGlvblR5cGVQcm94eSA9Ci0JCQkJKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eShleGMuZ2V0Q2xhc3MoKSk7Ci0JCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoZXhjLCBleGNlcHRpb25UeXBlUHJveHkpOwotCQl9Ci0JfQotCS8qKgotCSAqIEludm9rZSB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBhcmd1bWVudHMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbnZva2Uoc3ViamVjdCwgYXJndW1lbnRzKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JSUJlYW5Qcm94eSBnZXRCZWFuUHJveHkoQ2xhc3MgcmV0dXJuVHlwZSwgT2JqZWN0IGJlYW4pIHsKLQkJcmV0dXJuIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuUHJveHkocmV0dXJuVHlwZSwgYmVhbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVNZXRob2RQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTWV0aG9kUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjRmMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVNZXRob2RQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogJFJDU2ZpbGU6IElERU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhLHYgJCAkUmV2aXNpb246IDEuMTIgJCAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLk1ldGhvZEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgY2xhc3MgSURFTWV0aG9kUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSU1ldGhvZFByb3h5RmFjdG9yeSB7Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCi0JZmluYWwgcHJvdGVjdGVkIHN0YXRpYyBNYXAgcHJpbUxvb2t1cCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlJREVCZWFuVHlwZVByb3h5IGFjY2Vzc2libGVUeXBlLCBmaWVsZFR5cGUsIG1ldGhvZFR5cGUsIGNvbnN0cnVjdG9yVHlwZTsKLQkvLyBDYWNoZWQgY29weSBvZiBhIGZldyB0eXBpY2FsIG1ldGhvZCB0eXBlIHByb3hpZXMuCi0Jc3RhdGljIHsKLQkJcHJpbUxvb2t1cC5wdXQoImludCIsIEludGVnZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbUxvb2t1cC5wdXQoImNoYXIiLCBDaGFyYWN0ZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbUxvb2t1cC5wdXQoImxvbmciLCBMb25nLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXByaW1Mb29rdXAucHV0KCJzaG9ydCIsIFNob3J0LlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXByaW1Mb29rdXAucHV0KCJkb3VibGUiLCBEb3VibGUuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbUxvb2t1cC5wdXQoImJvb2xlYW4iLCBCb29sZWFuLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXByaW1Mb29rdXAucHV0KCJieXRlIiwgQnl0ZS5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlwcmltTG9va3VwLnB1dCgiZmxvYXQiLCBGbG9hdC5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUlERU1ldGhvZFByb3h5RmFjdG9yeShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCQlmUHJveHlGYWN0b3J5UmVnaXN0cnkucmVnaXN0ZXJNZXRob2RQcm94eUZhY3RvcnkodGhpcyk7Ci0JCWFjY2Vzc2libGVUeXBlID0gbmV3IElERUJlYW5UeXBlUHJveHkoYVJlZ2lzdHJ5LCBBY2Nlc3NpYmxlT2JqZWN0LmNsYXNzKTsKLQkJZmllbGRUeXBlID0gbmV3IElERUZpZWxkVHlwZVByb3h5KGFSZWdpc3RyeSk7Ci0JCW1ldGhvZFR5cGUgPSBuZXcgSURFTWV0aG9kVHlwZVByb3h5KGFSZWdpc3RyeSk7Ci0JCWNvbnN0cnVjdG9yVHlwZSA9IG5ldyBJREVDb25zdHJ1Y3RvclR5cGVQcm94eShhUmVnaXN0cnkpOwotCQlmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5yZWdpc3RlckJlYW5UeXBlUHJveHkoYWNjZXNzaWJsZVR5cGUsIHRydWUpOwotCQlmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5yZWdpc3RlckJlYW5UeXBlUHJveHkoZmllbGRUeXBlLCB0cnVlKTsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KG1ldGhvZFR5cGUsIHRydWUpOwotCQlmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5yZWdpc3RlckJlYW5UeXBlUHJveHkoY29uc3RydWN0b3JUeXBlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYW4gSURFQ29uc3RydWN0b3JQcm94eSBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhlIG9ubHkgcGVvcGxlIHdobyBjYW4gdXNlIHRoaXMgYXJlIHByaXZlbGVkZ2Ugb2JqZWN0cyB0aGF0Ci0JICogaGF2ZSB0aGUgYU1ldGhvZCBpbnN0YW5jZS4gVGhlc2UgYXJlIHBhcnQgb2YgdGhlIGlkZXZtIHBhY2thZ2Ugb25seS4gSWYgeW91IGhhdmUgdG8gbWFrZSB0aGlzIG1ldGhvZCBwdWJsaWMgeW91IGFyZSBkb2luZyB0aGluZ3MgaW5jb3JyZWN0bHkuCi0JICogVG8gZ2V0IGEgbWV0aG9kIHByb3h5IHlvdSBtdXN0IHVzZSB0aGUgaW50ZXJmYWNlIG1ldGhvZHMgb24gSU1ldGhvZFByb3h5RmFjdG9yeSB0byBkbyBsb29rdXAgYnkgc3RyaW5nIG9yIGVsc2Ugb24gSUJlYW5UeXBlUHJveHkgdGhhdCBoYXMKLQkgKiBnZXRNZXRob2QoU3RyaW5nKSBhcyB3ZWxsCi0JICovCi0JSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShDb25zdHJ1Y3RvciBhQ29uc3RydWN0b3IpIHsKLQotCQlyZXR1cm4gKElDb25zdHJ1Y3RvclByb3h5KSBjb25zdHJ1Y3RvclR5cGUubmV3QmVhblByb3h5KGFDb25zdHJ1Y3Rvcik7Ci0KLQl9Ci0JCi0JSUNvbnN0cnVjdG9yUHJveHlbXSBnZXRDb25zdHJ1Y3RvcnMoQ2xhc3MgYUNsYXNzKSB7Ci0JCUNvbnN0cnVjdG9yW10gY3RvcnMgPSBhQ2xhc3MuZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCUlDb25zdHJ1Y3RvclByb3h5W10gY3RvclByb3hpZXMgPSBuZXcgSUNvbnN0cnVjdG9yUHJveHlbY3RvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY3RvclByb3hpZXNbaV0gPSBnZXRDb25zdHJ1Y3RvclByb3h5KGN0b3JzW2ldKTsKLQkJfQotCQlyZXR1cm4gY3RvclByb3hpZXM7Ci0JfQotCi0JSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycyhDbGFzcyBhQ2xhc3MpIHsKLQkJQ29uc3RydWN0b3JbXSBjdG9ycyA9IGFDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOwotCQlJQ29uc3RydWN0b3JQcm94eVtdIGN0b3JQcm94aWVzID0gbmV3IElDb25zdHJ1Y3RvclByb3h5W2N0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWN0b3JQcm94aWVzW2ldID0gZ2V0Q29uc3RydWN0b3JQcm94eShjdG9yc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGN0b3JQcm94aWVzOwotCX0KLQotCUlDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoQ2xhc3MgYUNsYXNzLCBDbGFzc1tdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJQ29uc3RydWN0b3IgY3RvciA9IGFDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdzKTsKLQkJCXJldHVybiBnZXRDb25zdHJ1Y3RvclByb3h5KGN0b3IpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCUlDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShDbGFzcyBhQ2xhc3MsIENsYXNzW10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlDb25zdHJ1Y3RvciBjdG9yID0gYUNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoYXJncyk7Ci0JCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JQcm94eShjdG9yKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlJRmllbGRQcm94eVtdIGdldEZpZWxkcyhDbGFzcyBhQ2xhc3MpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBhQ2xhc3MuZ2V0RmllbGRzKCk7Ci0JCUlGaWVsZFByb3h5W10gZmllbGRQcm94aWVzID0gbmV3IElGaWVsZFByb3h5W2ZpZWxkcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJZmllbGRQcm94aWVzW2ldID0gZ2V0RmllbGRQcm94eShmaWVsZHNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWVsZFByb3hpZXM7Ci0JfQotCi0JSUZpZWxkUHJveHlbXSBnZXREZWNsYXJlZEZpZWxkcyhDbGFzcyBhQ2xhc3MpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBhQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJSUZpZWxkUHJveHlbXSBmaWVsZFByb3hpZXMgPSBuZXcgSUZpZWxkUHJveHlbZmllbGRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWVsZFByb3hpZXNbaV0gPSBnZXRGaWVsZFByb3h5KGZpZWxkc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkUHJveGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYW4gSURFRmllbGRQcm94eSBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhlIG9ubHkgcGVvcGxlIHdobyBjYW4gdXNlIHRoaXMgYXJlIHByaXZlbGVkZ2Ugb2JqZWN0cyB0aGF0IGhhdmUgdGhlCi0JICogYUZpZWxkIGluc3RhbmNlLiBUaGVzZSBhcmUgcGFydCBvZiB0aGUgaWRldm0gcGFja2FnZSBvbmx5LiBJZiB5b3UgaGF2ZSB0byBtYWtlIHRoaXMgbWV0aG9kIHB1YmxpYyB5b3UgYXJlIGRvaW5nIHRoaW5ncyBpbmNvcnJlY3RseS4gVG8gZ2V0IGEKLQkgKiBmaWVsZCBwcm94eSB5b3UgbXVzdCB1c2UgdGhlIGludGVyZmFjZSBtZXRob2RzIG9uIElCZWFuVHlwZVByb3h5IHRoYXQgaGFzIGdldEZpZWxkKFN0cmluZykgYXMgd2VsbAotCSAqLwotCUlGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoRmllbGQgYUZpZWxkKSB7Ci0KLQkJcmV0dXJuIChJRmllbGRQcm94eSkgZmllbGRUeXBlLm5ld0JlYW5Qcm94eShhRmllbGQpOwotCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklNZXRob2RQcm94eUZhY3RvcnkjZ2V0RmllbGRQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVByb3h5RmllbGQgZ2V0RmllbGRQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCS8vIFdlIGFyZSBnZXR0aW5nIHRoZSBjbGFzcyByZXNvbHZlZCB0aHJvdWdoIHRoZSBleHByZXNzaW9uLiBNaWdodCBhcyB3ZWxsIGJlY2F1c2UgaXQgcHJvYmFibHkgd2lsbAotCQkvLyBiZSBuZWVkZWQgYWdhaW4gYW5kIHRoaXMgd2F5IHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgZmluaXNoZWQgdGhleSB3aWxsIGJlIHJlc29sdmVkIGZvciBsYXRlciB1c2FnZS4KLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYmVhblR5cGVQcm94eUZhY3RvcnkgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJSVByb3h5QmVhblR5cGUgYmVhblR5cGUgPSBiZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGV4cHJlc3Npb24sIGNsYXNzTmFtZSk7Ci0JCXJldHVybiBiZWFuVHlwZS5nZXRGaWVsZFByb3h5KGV4cHJlc3Npb24sIGZpZWxkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIGFuIElERU1ldGhvZFByb3h5IFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGUgb25seSBwZW9wbGUgd2hvIGNhbiB1c2UgdGhpcyBhcmUgcHJpdmVsZWRnZSBvYmplY3RzIHRoYXQgaGF2ZSB0aGUKLQkgKiBhTWV0aG9kIGluc3RhbmNlLiBUaGVzZSBhcmUgcGFydCBvZiB0aGUgaWRldm0gcGFja2FnZSBvbmx5LiBJZiB5b3UgaGF2ZSB0byBtYWtlIHRoaXMgbWV0aG9kIHB1YmxpYyB5b3UgYXJlIGRvaW5nIHRoaW5ncyBpbmNvcnJlY3RseS4gVG8gZ2V0IGEKLQkgKiBtZXRob2QgcHJveHkgeW91IG11c3QgdXNlIHRoZSBpbnRlcmZhY2UgbWV0aG9kcyBvbiBJTWV0aG9kUHJveHlGYWN0b3J5IHRvIGRvIGxvb2t1cCBieSBzdHJpbmcgb3IgZWxzZSBvbiBJQmVhblR5cGVQcm94eSB0aGF0IGhhcwotCSAqIGdldE1ldGhvZChTdHJpbmcpIGFzIHdlbGwKLQkgKi8KLQlJREVNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShNZXRob2QgYU1ldGhvZCkgewotCi0JCXJldHVybiAoSURFTWV0aG9kUHJveHkpIG1ldGhvZFR5cGUubmV3QmVhblByb3h5KGFNZXRob2QpOwotCi0JfQotCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJdHJ5IHsKLQkJCUNsYXNzIGFDbGFzcyA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCXJldHVybiBnZXRNZXRob2RQcm94eShhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5RmFjdG9yeSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCS8vIFdlIGFyZSBnZXR0aW5nIHRoZSBjbGFzcyBhbmQgcGFybXR5cGVzIHJlc29sdmVkIHRocm91Z2ggdGhlIGV4cHJlc3Npb24uIE1pZ2h0IGFzIHdlbGwgYmVjYXVzZSB0aGV5IHByb2JhYmx5IHdpbGwKLQkJLy8gYmUgbmVlZGVkIGFnYWluIGFuZCB0aGlzIHdheSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZpbmlzaGVkIHRoZXkgd2lsbCBiZSByZXNvbHZlZCBmb3IgbGF0ZXIgdXNhZ2UuCi0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJlYW5UeXBlUHJveHlGYWN0b3J5ID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlID0gYmVhblR5cGVQcm94eUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShleHByZXNzaW9uLCBjbGFzc05hbWUpOwotCQlJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcyA9IGdldFBhcmFtZXRlclR5cGVzKGV4cHJlc3Npb24sIHBhcmFtZXRlclR5cGVzLCBiZWFuVHlwZVByb3h5RmFjdG9yeSk7Ci0JCXJldHVybiBiZWFuVHlwZS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCBtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCX0JCi0JCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCBmb3IgQmVhbnR5cGVzIGFuZCBQcm94eSBiZWFuIHR5cGVzIHRvIGdldCB0aGUgcHJveHkuCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gY2xhc3NUeXBlCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSBjbGFzc1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkvLyBXZSBhcmUgZ2V0dGluZyB0aGUgcGFybXR5cGVzIHJlc29sdmVkIHRocm91Z2ggdGhlIGV4cHJlc3Npb24uIE1pZ2h0IGFzIHdlbGwgYmVjYXVzZSB0aGV5IHByb2JhYmx5IHdpbGwKLQkJLy8gYmUgbmVlZGVkIGFnYWluIGFuZCB0aGlzIHdheSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZpbmlzaGVkIHRoZXkgd2lsbCBiZSByZXNvbHZlZCBmb3IgbGF0ZXIgdXNhZ2UuCi0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJlYW5UeXBlUHJveHlGYWN0b3J5ID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCUlQcm94eUJlYW5UeXBlW10gcGFybVR5cGVzID0gZ2V0UGFyYW1ldGVyVHlwZXMoZXhwcmVzc2lvbiwgcGFyYW1ldGVyVHlwZXMsIGJlYW5UeXBlUHJveHlGYWN0b3J5KTsKLQkJcmV0dXJuIGNsYXNzVHlwZS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCBtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogQHBhcmFtIGJlYW5UeXBlUHJveHlGYWN0b3J5Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBJUHJveHlCZWFuVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzLCBJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBiZWFuVHlwZVByb3h5RmFjdG9yeSkgewotCQlJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlczsKLQkJaWYgKHBhcmFtZXRlclR5cGVzID09IG51bGwgfHwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IDApCi0JCQlwYXJtVHlwZXMgPSBudWxsOwotCQllbHNlIHsKLQkJCXBhcm1UeXBlcyA9IG5ldyBJUHJveHlCZWFuVHlwZVtwYXJhbWV0ZXJUeXBlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCXBhcm1UeXBlc1tpXSA9IGJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwcmVzc2lvbiwgcGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJtVHlwZXM7Ci0JfQotCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShDbGFzcyBjbHMsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQl0cnkgewotCQkJQ2xhc3NbXSBwYXJtQ2xhc3NlcyA9IG51bGw7Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkgewotCQkJCXBhcm1DbGFzc2VzID0gbmV3IENsYXNzW3BhcmFtZXRlclR5cGVzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCQlDbGFzcyB0ZW1wID0gKENsYXNzKSBwcmltTG9va3VwLmdldChwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQkJCWlmICh0ZW1wID09IG51bGwpCi0JCQkJCQl0ZW1wID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmxvYWRDbGFzcyhwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQkJCXBhcm1DbGFzc2VzW2ldID0gdGVtcDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkoY2xzLmdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJtQ2xhc3NlcykpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoQ2xhc3MgY2xzLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJdHJ5IHsKLQkJCUNsYXNzW10gcGFybUNsYXNzZXMgPSBudWxsOwotCQkJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwpIHsKLQkJCQlwYXJtQ2xhc3NlcyA9IG5ldyBDbGFzc1twYXJhbWV0ZXJUeXBlcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybUNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ2xhc3MgdGVtcCA9IChDbGFzcykgcHJpbUxvb2t1cC5nZXQocGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJCQlpZiAodGVtcCA9PSBudWxsKQotCQkJCQkJdGVtcCA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5sb2FkQ2xhc3MocGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJCQlwYXJtQ2xhc3Nlc1tpXSA9IHRlbXA7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGNscy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJtQ2xhc3NlcykpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCi0JSURFTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoQ2xhc3MgYUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gYUNsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsKLQkJCXJldHVybiBnZXRNZXRob2RQcm94eShtZXRob2QpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIlVuYWJsZSB0byBmaW5kIG1ldGhvZCAiICsgYUNsYXNzLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyAiOiIgKyBtZXRob2ROYW1lICsgIiBhcmdzPSIgKyBhcmdzLCBleGMpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShDbGFzcyBhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZCBtZXRob2QgPSBhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkobWV0aG9kKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4YykgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJVbmFibGUgdG8gZmluZCBtZXRob2QgIiArIGFDbGFzcy5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgIjoiICsgbWV0aG9kTmFtZSArICIgYXJncz0iICsgYXJncywgZXhjKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9CQotCi0JSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KElERUJlYW5UeXBlUHJveHkgYVR5cGVQcm94eSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShhVHlwZVByb3h5LmZDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQlJTWV0aG9kUHJveHlbXSBnZXRNZXRob2RzKENsYXNzIGFDbGFzcykgewotCQlNZXRob2RbXSBtZXRob2RzID0gYUNsYXNzLmdldE1ldGhvZHMoKTsKLQkJSU1ldGhvZFByb3h5W10gbWV0aG9kUHJveGllcyA9IG5ldyBJTWV0aG9kUHJveHlbbWV0aG9kcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCW1ldGhvZFByb3hpZXNbaV0gPSBnZXRNZXRob2RQcm94eShtZXRob2RzW2ldKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUHJveGllczsKLQl9Ci0JCi0JSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoQ2xhc3MgYUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJtVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCBtZXRob2QgPSBNZXRob2RIZWxwZXIuZmluZENvbXBhdGlibGVNZXRob2QoYUNsYXNzLCBtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkobWV0aG9kKTsKLQl9Ci0JCi0JSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKENsYXNzIGFDbGFzcywgQ2xhc3NbXSBwYXJtVHlwZXMpIHRocm93cyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCUNvbnN0cnVjdG9yIG1ldGhvZCA9IE1ldGhvZEhlbHBlci5maW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yKGFDbGFzcywgcGFybVR5cGVzKTsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yUHJveHkobWV0aG9kKTsKLQl9Ci0JCi0KLQlJTWV0aG9kUHJveHlbXSBnZXREZWNsYXJlZE1ldGhvZHMoQ2xhc3MgYUNsYXNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCUlNZXRob2RQcm94eVtdIG1ldGhvZFByb3hpZXMgPSBuZXcgSU1ldGhvZFByb3h5W21ldGhvZHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQltZXRob2RQcm94aWVzW2ldID0gZ2V0TWV0aG9kUHJveHkobWV0aG9kc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFByb3hpZXM7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5RmFjdG9yeSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGNsYXNzTmFtZSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHlGYWN0b3J5I3Rlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVNZXRob2RUeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTWV0aG9kVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNmEzNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVNZXRob2RUeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERU1ldGhvZFR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIElERU1ldGhvZFR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgewotCQotCUlERU1ldGhvZFR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlzdXBlcihyZWdpc3RyeSwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSURFQmVhblR5cGVQcm94eSNuZXdCZWFuUHJveHkoT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpIHsKLQkJcmV0dXJuIG5ldyBJREVNZXRob2RQcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIGFuT2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTnVtYmVyQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU51bWJlckJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzhjYzMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTnVtYmVyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFTnVtYmVyQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogSURFIEltcGxlbWVudGF0aW9uIG9mIElOdW1iZXJCZWFuUHJveHkgZm9yIGFueSBOdW1iZXIgKGkuZS4gdGhlIG5vbi1wcmltaXRpdmVzKQotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGNsYXNzIElERU51bWJlckJlYW5Qcm94eSBleHRlbmRzIElERUJlYW5Qcm94eSBpbXBsZW1lbnRzIElOdW1iZXJCZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgTnVtYmVyIGZOdW1iZXJWYWx1ZTsKLQlwcm90ZWN0ZWQgSUJlYW5UeXBlUHJveHkgZkJlYW5UeXBlUHJveHk7Ci0JCi0vKioKLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotSURFTnVtYmVyQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgTnVtYmVyIGFOdW1iZXIgLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSxhTnVtYmVyKTsKLQlmTnVtYmVyVmFsdWUgPSBhTnVtYmVyOwotCWZCZWFuVHlwZVByb3h5ID0gYUJlYW5UeXBlUHJveHk7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgSURFTnVtYmVyQmVhblByb3h5KQotCQlyZXR1cm4gZk51bWJlclZhbHVlLmVxdWFscygoKElERU51bWJlckJlYW5Qcm94eSkgYW5PYmplY3QpLm51bWJlclZhbHVlKCkpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikKLQkJcmV0dXJuIGZOdW1iZXJWYWx1ZS5lcXVhbHMoYW5PYmplY3QpOwotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5ieXRlVmFsdWUoKTsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5kb3VibGVWYWx1ZSgpOwotfQotLyoqCi0gKiBmbG9hdFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmZsb2F0VmFsdWUoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmludFZhbHVlKCk7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUubG9uZ1ZhbHVlKCk7Ci19Ci0vKioKLSAqIG51bWJlclZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWU7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUuc2hvcnRWYWx1ZSgpOwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKXsKLQlyZXR1cm4gZkJlYW5UeXBlUHJveHk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU51bWJlckJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTnVtYmVyQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjFjMWRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTnVtYmVyQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFTnVtYmVyQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIE51bWJlciBCZWFuVHlwZSBQcm94eS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIElERU51bWJlckJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQlwcm90ZWN0ZWQgZmluYWwgSURFTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLS8qKgotICogSURFTnVtYmVyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFSZWdpc3RyeSBjb20uaWJtLmV0b29scy52Y2UucHJveHkuUHJveHlGYWN0b3J5UmVnaXN0cnkKLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLXByb3RlY3RlZCBJREVOdW1iZXJCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzLCBOdW1iZXIgemVyb051bWJlcikgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLQkvLyBDYWNoZSBhIHplcm8gcHJveHkgb2YgdGhpcyB0eXBlICh0aG91Z2ggdGhlIG51bWJlciB3aWxsIGJlIExvbmcpLgotCXplcm9Qcm94eSA9IG5ldyBJREVOdW1iZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCB6ZXJvTnVtYmVyICwgdGhpcyk7Ci19Ci0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlpZiAoYU51bWJlciA9PSBudWxsIHx8IHplcm9Qcm94eS5mQmVhbi5lcXVhbHMoYU51bWJlcikpCi0JCXJldHVybiB6ZXJvUHJveHk7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhTnVtYmVyLCB0aGlzKTsKLX0KLS8qKgotICogU3BlY2lhbGl6ZWQgZnJvbSBJREVCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBJTnVtYmVyQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotICovCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQotCXJldHVybiAoSUlERUJlYW5Qcm94eSljcmVhdGVOdW1iZXJCZWFuUHJveHkoKE51bWJlcikgYW5PYmplY3QpOwotCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU9iamVjdEJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVPYmplY3RCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmODFjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU9iamVjdEJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFT2JqZWN0QmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotcHVibGljIGNsYXNzIElERU9iamVjdEJlYW5Qcm94eSBleHRlbmRzIElERUJlYW5Qcm94eSB7Ci0KLQlwcm90ZWN0ZWQgSUJlYW5UeXBlUHJveHkgZkJlYW5UeXBlUHJveHk7IC8vIENhY2hlIHRoZSB0eXBlIHByb3h5IGZvciBzcGVlZAotCQotcHJvdGVjdGVkIElERU9iamVjdEJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpewotCXN1cGVyKGFSZWdpc3RyeSk7Ci19Ci0vKioKLSAqIENvbnN0cnVjdG9yIHRoYXQgbGV0cyB0aGUgYmVhbiB0eXBlIGJlIHNldCBvbiBjcmVhdGlvbi4KLSAqIFRoaXMgc2F2ZXMgdGhlIG92ZXJoZWFkIG9mIGl0IGJlaW5nIGxvb2tlZCB1cCB0aGUgZmlyc3QgdGltZSBpdCBpcyBhc2tlZCBmb3IuCi0gKgotICogVGhpcyBpcyBwcm90ZWN0ZWQgYmVjYXVzZSB0aGUgb25seSBwZXJzb24KLSAqIHdobyBzaG91bGQgdXNlIGl0IGlzIHRoZSBJREVCZWFuVHlwZVByb3h5IG9yIGEgc3ViY2xhc3MuICBNYWtpbmcgaXQgcGFja2FnZSBwcm90ZWN0ZWQgc3RvcHMgcGVvcGxlIGZyb20KLSAqIHdyaXRpbmcgYm9ndXMgY29kZSBhbmQgZG9pbmcgY2FzdHMgYW5kIHNsYW1taW5nIG5ldyBiZWFucyBpbiB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIHByb3BlciBBUEkKLSAqIHRoYXQgaXMgYmFzZWQgYXJvdW5kIGFueSBraW5kIG9mIFZNIGFydGlmYWN0IGJlaW5nIHByb3hpZWQgdG8gc3VwcG9ydCB0YXJnZXQgVk1zIGFuZCBwbHVnZ2FibGUgSkRLCi0gKiBsZXZlbHMgCi0gKi8KLXByb3RlY3RlZCBJREVPYmplY3RCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBPYmplY3QgYUJlYW4sIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KXsKLQkKLQl0aGlzKGFSZWdpc3RyeSwgYUJlYW4pOwotCWZCZWFuVHlwZVByb3h5ID0gYUJlYW5UeXBlUHJveHk7Ci0JCi19Ci0vKioKLSAqIFNldCB0aGUgYmVhbiB3ZSBhcmUgcHJveHlpbmcuICBXZSBhcmUgYSBwcm94eSBmb3IgYSBiZWFuIHJ1bm5pbmcgb24gdGhlIHNhbWUgSURFCi0gKiBzbyB3ZSBob2xkIHRoZSBiZWFuIGRpcmVjdGx5IGFuZCBjYW4gcmV0dXJuIGl0LiAKLSAqLwotcHJvdGVjdGVkIElERU9iamVjdEJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIE9iamVjdCBhQmVhbil7Ci0JdGhpcyhhUmVnaXN0cnkpOwotCQotCWZCZWFuID0gYUJlYW47Ci0JCi19Ci0vKioKLSAqIFRoZSB0eXBlIHByb3h5IGlzIGdvdCBmcm9tIG91ciBjbGFzcyBuYW1lCi0gKiBJZiB3ZSBoYXZlIHRoZSB0eXBlIHJldHVybiBpdCwgb3RoZXJ3aXNlIGdvIHRoZSBmYWN0b3J5IGZvciBpdAotICogRG9uJ3QgbmV3IGl0IHVwIGJlY2F1c2UgdGhlIGZhY3RvcnkgbXVzdCBiZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdHlwZSBwcm94aWVzIGFzIGl0Ci0gKiBoYXMgdG8gcGVyZm9ybSBpbnN0YW5jZSBtYW5hZ2VtZW50IG9uIHRoZW0KLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQotCWlmICggZkJlYW5UeXBlUHJveHkgPT0gbnVsbCApIHsJCi0JCWZCZWFuVHlwZVByb3h5ID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSggZkJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLQl9Ci0JcmV0dXJuIGZCZWFuVHlwZVByb3h5OwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlYTUwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQkKLQlzdGF0aWMgZmluYWwgaW50IEJPT0xFQU4gPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgQllURSA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBDSEFSID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IERPVUJMRSA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBGTE9BVCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlRFR0VSID0gNjsKLQlzdGF0aWMgZmluYWwgaW50IExPTkcgPSA3OwotCXN0YXRpYyBmaW5hbCBpbnQgU0hPUlQgPSA4OwotCQotcHVibGljIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LENsYXNzIGFDbGFzcyl7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LGFDbGFzcyk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLWFic3RyYWN0IGludCBnZXRQcmltaXRpdmVUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDkzZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVQcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLklWTVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHJ1bnMgdGhlIEJlYW5zIGluc2lkZSB0aGUgRWNsaXBzZSBJREUKLSAqIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcGx1Z2lucyB0aGF0IGNhbiBndWFyYW50ZWUgdGhlaXIgdGhlaXIgYmVhbnMgZG8KLSAqIG5vdCBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgSURFIGFuZCBjYW4gcnVuIGF0IHRoZSBzYW1lIEpESyBsZXZlbAotICogdGhhdCB0aGUgRWNsaXBzZSBJREUgaXMgcnVubmluZwotICovCi0KLXB1YmxpYyBjbGFzcyBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIEJhc2VQcm94eUZhY3RvcnlSZWdpc3RyeSBpbXBsZW1lbnRzIElWTVNlcnZlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVfUkVHSVNUUllfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS5qZW0uSURFIjsJLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgZk5hbWU7Ci0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGZDbGFzc0xvYWRlcjsKLQlwcm90ZWN0ZWQgSURFQ2FsbGJhY2tSZWdpc3RyeSBmQ2FsbGJhY2tSZWdpc3RyeTsKLQkKLQkvKgotCSAqIFNwZWNpYWwgY2xhc3Nsb2FkZXIgdGhhdCBmaXJzdHMgdHJpZXMgdG8gbG9hZCBmcm9tIGJ1bmRsZSB0aGVuIHRyaWVzIGZyb20gdXJsIHBhdGhzIHNvCi0JICogdGhhdCBidW5kbGUgaXMgdHJlYXRlZCBhcyBiZWluZyBhdCB0aGUgaGVhZCBvZiB0aGUgdXJsIHBhdGhzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIElERVNwZWNpYWxDbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKLQkJCi0JCXByaXZhdGUgQnVuZGxlIGJ1bmRsZTsKLQkJLy8gVGhpcyBpcyB0aGUgYnVuZGxlIHRoYXQgY29udGFpbnMgdGhlIElERSBFY2xpcHNlIGNvZGUuCi0JCS8vIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZpcnN0IGJlY2F1c2UgdGhlcmUgYXJlIElERSBzcGVjaWZpYyBzdHVmZiB0aGF0IGlzIHVzZWQgb24gdGhlICJyZW1vdGUgdm0iIHRvbyBhbmQKLQkJLy8gc28gbXVzdCBiZSBjb21tb24uCi0JCXByaXZhdGUgQnVuZGxlIGlkZUJ1bmRsZTsJIAotCi0JCXB1YmxpYyBJREVTcGVjaWFsQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQnVuZGxlIGJ1bmRsZSkgewotCQkJc3VwZXIodXJscywgbnVsbCk7Ci0JCQlpZGVCdW5kbGUgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKTsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQl9Ci0JCQotCQlwdWJsaWMgSURFU3BlY2lhbENsYXNzTG9hZGVyKFVSTFtdIHVybHMpIHsKLQkJCXRoaXModXJscywgbnVsbCk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIjZmluZENsYXNzKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBpZGVCdW5kbGUubG9hZENsYXNzKG5hbWUpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gYnVuZGxlLmxvYWRDbGFzcyhuYW1lKTsKLQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5maW5kQ2xhc3MobmFtZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzTG9hZGVyI2ZpbmRSZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLQkJCVVSTCByID0gaWRlQnVuZGxlLmdldFJlc291cmNlKG5hbWUpOwotCQkJaWYgKHIgPT0gbnVsbCAmJiBidW5kbGUgIT0gbnVsbCkKLQkJCQlyID0gYnVuZGxlLmdldFJlc291cmNlKG5hbWUpOwotCQkJcmV0dXJuIHIgIT0gbnVsbCA/IHIgOiBzdXBlci5maW5kUmVzb3VyY2UobmFtZSk7Ci0JCX0KLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBzcGVjaWFsIGxvYWRlciB0aGF0IGhhcyB0aGUgcGx1Z2luIGNsYXNzbG9hZGVyIG9mIHRoZSBwYXNzZWQgaW4gcGx1Z2luCi0gKiBhcyB0aGUgcGFyZW50IGxvYWRlciwgcGx1cyBhbGwgb2YgdGhlIHVybHMsIHBsdXMgdGhlIHJlbW90ZXZtLmphciBmaWxlIHRoYXQgaXMKLSAqIG5lZWRlZCBieSBJREUgUHJveHkgdG8gd29yay4KLSAqLwkKLXB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgY3JlYXRlU3BlY2lhbExvYWRlcihTdHJpbmcgcGx1Z2luTmFtZSwgVVJMW10gb3RoZXJVUkxzKSB7Ci0JQnVuZGxlIGJ1bmRsZSA9IHBsdWdpbk5hbWUgIT0gbnVsbCA/IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5OYW1lKSA6IG51bGw7Ci0JCi0JVVJMW10gbXVzdEhhdmVVcmxzID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkudXJsTG9jYWxpemVBbGxGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAidm0vcmVtb3Rldm0uamFyIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlVUkxbXSB1cmxzID0gbnVsbDsKLQlpZiAob3RoZXJVUkxzICE9IG51bGwpIHsKLQkJdXJscyA9IG5ldyBVUkxbb3RoZXJVUkxzLmxlbmd0aCttdXN0SGF2ZVVybHMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShtdXN0SGF2ZVVybHMsIDAsIHVybHMsIDAsIG11c3RIYXZlVXJscy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVyVVJMcywgMCwgdXJscywgbXVzdEhhdmVVcmxzLmxlbmd0aCwgb3RoZXJVUkxzLmxlbmd0aCk7Ci0JfSBlbHNlIAotCQl1cmxzID0gbXVzdEhhdmVVcmxzOwotCQkKLQlyZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgSURFU3BlY2lhbENsYXNzTG9hZGVyKHVybHMsIGJ1bmRsZSkgOiBuZXcgSURFU3BlY2lhbENsYXNzTG9hZGVyKHVybHMpOwotfQotCi1wdWJsaWMgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkoU3RyaW5nIGFOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQlzdXBlcihJREVfUkVHSVNUUllfVFlQRV9JRCk7Ci0JZk5hbWUgPSBhTmFtZTsKLQlmQ2xhc3NMb2FkZXIgPSBsb2FkZXI7Ci19Ci0KLUNsYXNzTG9hZGVyIGdldFBsdWdpbkNsYXNzTG9hZGVyKCl7Ci0JcmV0dXJuIGZDbGFzc0xvYWRlcjsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcmVnaXN0cnlUZXJtaW5hdGVkKGJvb2xlYW4gd2FpdCl7Ci0JTGlzdCBydW5uYWJsZXMgPSBudWxsOwotCXN5bmNocm9uaXplZCAodGhpcykgewotCQlydW5uYWJsZXMgPSBzaHV0ZG93blJ1bm5hYmxlczsKLQkJc2h1dGRvd25SdW5uYWJsZXMgPSBudWxsOwotCX0KLQlpZiAocnVubmFibGVzICE9IG51bGwpIHsKLQkJZm9yIChJdGVyYXRvciBpdHIgPSBydW5uYWJsZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCXRyeSB7Ci0JCQkJKChSdW5uYWJsZSkgaXRyLm5leHQoKSkucnVuKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotfQotCi1DbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGFDbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IsIExpbmthZ2VFcnJvciB7Ci0JcmV0dXJuIGZDbGFzc0xvYWRlci5sb2FkQ2xhc3MoYUNsYXNzTmFtZSk7Ci19Ci0KLXB1YmxpYyBJQ2FsbGJhY2tSZWdpc3RyeSBnZXRDYWxsYmFja1JlZ2lzdHJ5KCl7Ci0JaWYgKCBmQ2FsbGJhY2tSZWdpc3RyeSA9PSBudWxsICl7Ci0JCWZDYWxsYmFja1JlZ2lzdHJ5ID0gbmV3IElERUNhbGxiYWNrUmVnaXN0cnkodGhpcyk7Ci0JfQotCXJldHVybiBmQ2FsbGJhY2tSZWdpc3RyeTsKLX0KLQotCi0vKioKLSAqIEdldCBhIGJlYW4gcHJveHkgZnJvbSB0aGUgYmVhbiBvZiB0aGUgY29ycmVjdCB0eXBlLgotICogCi0gKiBAcGFyYW0gcmV0dXJuVHlwZQotICogQHBhcmFtIGJlYW4KLSAqIEByZXR1cm4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLUlCZWFuUHJveHkgZ2V0QmVhblByb3h5KENsYXNzIHJldHVyblR5cGUsIE9iamVjdCBiZWFuKSB7Ci0JSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSAoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgdGhpcy5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCWlmICghcmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCXJldHVybiBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5KHRoaXMsIGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBJbnRlZ2VyLlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5pbnRUeXBlLm5ld0JlYW5Qcm94eShiZWFuKTsKLQl9IGVsc2UgaWYgKHJldHVyblR5cGUgPT0gQm9vbGVhbi5UWVBFKSB7Ci0JCXJldHVybiBwcm94eUZhY3RvcnkuYm9vbGVhblR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCXJldHVybiBwcm94eUZhY3RvcnkuZmxvYXRUeXBlLm5ld0JlYW5Qcm94eShiZWFuKTsKLQl9IGVsc2UgaWYgKHJldHVyblR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCXJldHVybiBwcm94eUZhY3RvcnkubG9uZ1R5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBTaG9ydC5UWVBFKSB7Ci0JCXJldHVybiBwcm94eUZhY3Rvcnkuc2hvcnRUeXBlLm5ld0JlYW5Qcm94eShiZWFuKTsKLQl9IGVsc2UgaWYgKHJldHVyblR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5kb3VibGVUeXBlLm5ld0JlYW5Qcm94eShiZWFuKTsKLQl9IGVsc2UgaWYgKHJldHVyblR5cGUgPT0gQnl0ZS5UWVBFKSB7Ci0JCXJldHVybiBwcm94eUZhY3RvcnkuYnl0ZVR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBDaGFyYWN0ZXIuVFlQRSkgewotCQlyZXR1cm4gcHJveHlGYWN0b3J5LmNoYXJUeXBlLm5ld0JlYW5Qcm94eShiZWFuKTsKLQl9IGVsc2UgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBwcmltaXRpdmUgdHlwZSAiICsgcmV0dXJuVHlwZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotfQotCi1MaXN0IHNodXRkb3duUnVubmFibGVzOwotCi1wdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU2h1dGRvd25MaXN0ZW5lcihSdW5uYWJsZSBydW5uYWJsZSkgewotCWlmIChzaHV0ZG93blJ1bm5hYmxlcyA9PSBudWxsKSB7Ci0JCXNodXRkb3duUnVubmFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0gZWxzZSBpZiAoc2h1dGRvd25SdW5uYWJsZXMuY29udGFpbnMocnVubmFibGUpKQotCQlyZXR1cm47Ci0Jc2h1dGRvd25SdW5uYWJsZXMuYWRkKHJ1bm5hYmxlKTsKLX0KLQotcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVNodXRkb3duTGlzdGVuZXIoUnVubmFibGUgcnVubmFibGUpIHsKLQlpZiAoc2h1dGRvd25SdW5uYWJsZXMgIT0gbnVsbCkKLQkJc2h1dGRvd25SdW5uYWJsZXMucmVtb3ZlKHJ1bm5hYmxlKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVSZWdpc3RyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFUmVnaXN0cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2M2NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVSZWdpc3RyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVSZWdpc3RyYXRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTEgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0LklERVJlZ2lzdGVyQVdUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlcjsKLS8qKgotICogVGhpcyBpcyB0aGUgcmVnaXN0cmF0aW9uIGNsYXNzIGZvciBzdGFydGluZyBhbiBJREVSZW1vdGUgVk0uCi0gKi8KLQotcHVibGljIGNsYXNzIElERVJlZ2lzdHJhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBzdGFydEFuSW1wbGVtZW50YXRpb24oCi0JCUlDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBjb250cmlidXRvcnMsCi0JCWJvb2xlYW4gYXR0YWNoQVdULAotCQlJUHJvamVjdCBwcm9qZWN0LAotCQlTdHJpbmcgdm1OYW1lLAotCQlTdHJpbmcgcGx1Z2luTmFtZSwKLQkJSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSURFUmVnaXN0cmF0aW9uIGlkZXJlZyA9IG5ldyBJREVSZWdpc3RyYXRpb24ocGx1Z2luTmFtZSk7Ci0JCQlyZXR1cm4gaWRlcmVnLnN0YXJ0SW1wbGVtZW50YXRpb24oY29udHJpYnV0b3JzLCBhdHRhY2hBV1QsIHByb2plY3QsIHZtTmFtZSwgcG0pOyAKLQkJfQotCQotCXB1YmxpYyBJREVSZWdpc3RyYXRpb24oKSB7Ci0JfQotCQotCXByaXZhdGUgSURFUmVnaXN0cmF0aW9uKFN0cmluZyBwbHVnaW5OYW1lKSB7Ci0JCXRoaXMucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7Ci0JfQotCXByaXZhdGUgU3RyaW5nIHBsdWdpbk5hbWU7CQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGNyZWF0ZSBhIHJlbW90ZSBWTSBhbmQgcmV0dXJuIGFuIGluaXRpYWxpemVkIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5LgotCSAqIFBhc3NlZCBpbiBhcmU6Ci0JICogICAgICBwcm9qZWN0OiBUaGUgcHJvamVjdCB0aGlzIGlzIGJlaW5nIHN0YXJ0ZWQgb24uIE11c3Qgbm90IGJlIG51bGwgYW5kIG11c3QgYmUgYSBKYXZhUHJvamVjdC4gKEN1cnJlbnRseSBpZ25vcmVkIGZvciBJREUpLgotCSAqICAgICAgYXR0YWNoQVdUOiBTaG91bGQgQVdUIGJlIGF0dGFjaGVkIHRvIHRoaXMgaW1wbGVtZW50YXRpb24uCi0JICogICAgICBjb250cmlidXRvcnM6IENvbnRyaWJ1dG9ycyB0byB0aGUgY29uZmlndXJhdGlvbi4gQ2FuIGJlIG51bGwuCi0JICogICAgICBwbTogUHJvZ3Jlc3NNb25pdG9yIHRvIHVzZS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiAgICAgIHZtTmFtZTogTmFtZSBmb3IgdGhlIHZtLiBDYW4gYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgc3RhcnRJbXBsZW1lbnRhdGlvbigKLQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGNvbnRyaWJ1dG9ycywKLQkJYm9vbGVhbiBhdHRhY2hBV1QsCi0JCUlQcm9qZWN0IHByb2plY3QsCi0JCVN0cmluZyB2bU5hbWUsCi0JCUlQcm9ncmVzc01vbml0b3IgcG0pCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlVUkxbXSBjbGFzc1BhdGhzID0gbnVsbDsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkvLyBBZGQgaW4gdGhlIHBhdGhzIGZvciB0aGUgcHJvamVjdAkgCQotCQkJY2xhc3NQYXRocyA9IFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0U3RyaW5nUGF0aHNUb1VSTChKYXZhUnVudGltZS5jb21wdXRlRGVmYXVsdFJ1bnRpbWVDbGFzc1BhdGgoamF2YVByb2plY3QpKTsKLQkJfSBlbHNlCi0JCQljbGFzc1BhdGhzID0gbmV3IFVSTFswXTsKLQotCQlmaW5hbCBJSmF2YVByb2plY3QganAgPSBqYXZhUHJvamVjdDsKLQotCQlmaW5hbCBQcm94eUxhdW5jaFN1cHBvcnQuTGF1bmNoSW5mbyBsYXVuY2hJbmZvID0gbmV3IFByb3h5TGF1bmNoU3VwcG9ydC5MYXVuY2hJbmZvKCk7Ci0JCWNvbnRyaWJ1dG9ycyA9IFByb3h5TGF1bmNoU3VwcG9ydC5maWxsSW5MYXVuY2hJbmZvKGNvbnRyaWJ1dG9ycyA9PSBudWxsID8gUHJveHlMYXVuY2hTdXBwb3J0LkVNUFRZX0NPTkZJR19DT05UUklCVVRPUlMgOiBjb250cmlidXRvcnMsIGxhdW5jaEluZm8sIGpwICE9IG51bGwgPyBqcC5nZXRFbGVtZW50TmFtZSgpIDogbnVsbCk7Ci0JCWZpbmFsIExvY2FsRmlsZUNvbmZpZ3VyYXRpb25Db250cmlidXRvckNvbnRyb2xsZXIgY29udHJvbGxlciA9IG5ldyBMb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyKGNsYXNzUGF0aHMsIG5ldyBVUkxbM11bXSwgbGF1bmNoSW5mbyk7Ci0JCWZpbmFsIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBjb250cmlicyA9IGNvbnRyaWJ1dG9yczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIGludCBpaSA9IGk7Ci0JCQkvLyBSdW4gaW4gc2FmZSBtb2RlIHNvIHRoYXQgYW55dGhpbmcgaGFwcGVucyB3ZSBkb24ndCBnbyBhd2F5LgotCQkJUGxhdGZvcm0ucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuIFBsYXRmb3JtLnJ1biBsb2dzIGl0IGZvciBtZS4KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJY29udHJpYnNbaWldLmluaXRpYWxpemUobGF1bmNoSW5mby5nZXRDb25maWdJbmZvKCkpOwotCQkJCX0KLQkJCX0pOwkJCQkKLQkJfQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCS8vIFJ1biBpbiBzYWZlIG1vZGUgc28gdGhhdCBhbnl0aGluZyBoYXBwZW5zIHdlIGRvbid0IGdvIGF3YXkuCi0JCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gUGxhdGZvcm0ucnVuIGxvZ3MgaXQgZm9yIG1lLgotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQljb250cmlic1tpaV0uY29udHJpYnV0ZUNsYXNzcGF0aHMoY29udHJvbGxlcik7Ci0JCQkJfQotCQkJfSk7CQkJCQotCQl9Ci0JCWNsYXNzUGF0aHMgPSBjb250cm9sbGVyLmdldEZpbmFsQ2xhc3NwYXRoKCk7Ci0KLQkJZmluYWwgQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKEJhc2VQcm94eUZhY3RvcnlSZWdpc3RyeSkgY3JlYXRlSURFUHJveHlGYWN0b3J5UmVnaXN0cnkodm1OYW1lLCBwbHVnaW5OYW1lLCBjbGFzc1BhdGhzKTsKLQkJUHJveHlMYXVuY2hTdXBwb3J0LnBlcmZvcm1FeHRlbnNpb25SZWdpc3RyYXRpb25zKHJlZ2lzdHJ5LCBsYXVuY2hJbmZvKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlicy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCS8vIFJ1biBpbiBzYWZlIG1vZGUgc28gdGhhdCBhbnl0aGluZyBoYXBwZW5zIHdlIGRvbid0IGdvIGF3YXkuCi0JCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gUGxhdGZvcm0ucnVuIGxvZ3MgaXQgZm9yIG1lLgotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQljb250cmlic1tpaV0uY29udHJpYnV0ZVRvUmVnaXN0cnkocmVnaXN0cnkpOwotCQkJCX0KLQkJCX0pOwkKLQkJfQotCi0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGNyZWF0ZUlERVByb3h5RmFjdG9yeVJlZ2lzdHJ5KFN0cmluZyBhTmFtZSwgU3RyaW5nIGFQbHVnaW5OYW1lLCBVUkxbXSBvdGhlclVSTHMpIHsKLQkJLy8gQ3JlYXRlIHRoZSByZWdpc3RyeS4KLQkJSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPQotCQkJbmV3IElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5KGFOYW1lLCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeS5jcmVhdGVTcGVjaWFsTG9hZGVyKGFQbHVnaW5OYW1lLCBvdGhlclVSTHMpKTsKLQkJaW5pdFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgY3JlYXRlSURFUHJveHlGYWN0b3J5UmVnaXN0cnkoU3RyaW5nIGFOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQkJLy8gQ3JlYXRlIHRoZSByZWdpc3RyeS4KLQkJSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkoYU5hbWUsIGxvYWRlcik7Ci0JCWluaXRSZWdpc3RyeShyZWdpc3RyeSk7Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRSZWdpc3RyeShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQluZXcgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0JCW5ldyBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkocmVnaXN0cnkpOwotCQluZXcgSURFTWV0aG9kUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJLy8gQWx3YXlzIHN1cHBvcnQgQVdUIGZvciBub3cKLQkJSURFUmVnaXN0ZXJBV1QucmVnaXN0ZXJBV1QocmVnaXN0cnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwNDJjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVTaG9ydENsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFNob3J0IEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVTaG9ydENsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIElERU51bWJlckJlYW5UeXBlUHJveHkgewotcHJvdGVjdGVkIElERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsIG5ldyBTaG9ydCgoc2hvcnQpMCkpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVTaG9ydEJlYW5Qcm94eShTaG9ydCBhU2hvcnQpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxhU2hvcnQsdGhpcyk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVNob3J0VHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmY0MmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogU2hvcnQgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERVNob3J0VHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLXByb3RlY3RlZCBJREVTaG9ydFR5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVTaG9ydEJlYW5Qcm94eShzaG9ydCBhU2hvcnQpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxuZXcgU2hvcnQoYVNob3J0KSx0aGlzKTsKLX0KLWludCBnZXRQcmltaXRpdmVUeXBlKCl7Ci0JcmV0dXJuIFNIT1JUOwotfQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0JTnVtYmVyIG4gPSBhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlciA/IG5ldyBTaG9ydCgoc2hvcnQpICgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCkpIDogKE51bWJlcikgYW5PYmplY3Q7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBuLCB0aGlzKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE4NTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICRSQ1NmaWxlOiBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YSx2ICQgJFJldmlzaW9uOiAxLjExICQgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JVk1TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci5Jbml0aWFsaXphdGlvblN0cmluZ1BhcnNlcjsKLQotcHVibGljIGNsYXNzIElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgewotCi0KLQlwcm90ZWN0ZWQgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgZlJlZ2lzdHJ5OwotCXByb3RlY3RlZCBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGZCZWFuVHlwZVByb3h5RmFjdG9yeTsKLQlwcml2YXRlIElCZWFuUHJveHkgaXZtU2VydmVyUHJveHk7Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBiZWFuIHByb3h5IGZvciB0aGUgYXJndW1lbnQuIFRvIGRvIHRoaXMgY3JlYXRlIHRocm91Z2ggdGhlIGNvcnJlY3QgQmVhblR5cGVQcm94eQotCSAqIFdoaWNoIGVuc3VyZXMgdGhhdCBzcGVjaWFsIHN1YmNsYXNzZXMgb2YgSURFQmVhblByb3h5IGFyZSBjcmVhdGVkLiBUaGlzIGlzIGp1c3QgYSBsb2NhbAotCSAqIGhlbHBlciBtZXRob2QuCi0JICovCi0Jc3RhdGljIElJREVCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5KFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFuT2JqZWN0KSB7Ci0KLQkJcmV0dXJuICgoSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBhUmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpKS5jcmVhdGVJREVCZWFuUHJveHlXaXRoKGFuT2JqZWN0KTsKLQl9Ci0JCi0JSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlmUmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWZSZWdpc3RyeS5yZWdpc3RlckJlYW5Qcm94eUZhY3RvcnkodGhpcyk7Ci0JCWZCZWFuVHlwZVByb3h5RmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBhUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJaXZtU2VydmVyUHJveHkgPSBmUmVnaXN0cnkuZ2V0QmVhblByb3h5KElWTVNlcnZlci5jbGFzcywgZlJlZ2lzdHJ5KTsKLQl9Ci0JCi0JcHVibGljIElTdHJpbmdCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnN0cmluZ0NsYXNzLmNyZWF0ZVN0cmluZ0JlYW5Qcm94eShhU3RyaW5nKTsKLQl9Ci0JCi0JcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChmbG9hdCBhRmxvYXQpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5mbG9hdFR5cGUuY3JlYXRlRmxvYXRCZWFuUHJveHkoYUZsb2F0KTsKLQl9Ci0JCi0JcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChzaG9ydCBhU2hvcnQpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5zaG9ydFR5cGUuY3JlYXRlU2hvcnRCZWFuUHJveHkoYVNob3J0KTsKLQl9Ci0JCi0JcHVibGljIElDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChjaGFyIGFDaGFyKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhclR5cGUuY3JlYXRlQ2hhckJlYW5Qcm94eShhQ2hhcik7Ci0JfQotCQotCXB1YmxpYyBJQ2hhcmFjdGVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoQ2hhcmFjdGVyIGFDaGFyYWN0ZXIpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5jaGFyQ2xhc3MuY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KGFDaGFyYWN0ZXIpOwotCX0KLQkKLQlwdWJsaWMgSUludGVnZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgYW5JbnQpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5pbnRUeXBlLmNyZWF0ZUludGVnZXJCZWFuUHJveHkoYW5JbnQpOwotCX0KLQkKLQlwdWJsaWMgSUludGVnZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChJbnRlZ2VyIGFuSW50ZWdlcikgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmludGVnZXJDbGFzcy5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KGFuSW50ZWdlcik7Ci0JfQotCQotCXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgobG9uZyBhTG9uZykgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmxvbmdUeXBlLmNyZWF0ZUxvbmdCZWFuUHJveHkoYUxvbmcpOwotCX0KLQkKLQlwdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKE51bWJlciBhTnVtYmVyKSB7Ci0JCUlERU51bWJlckJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZVByb3h5ID0gKElERU51bWJlckJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFOdW1iZXIuZ2V0Q2xhc3MoKSk7Ci0JCXJldHVybiBudW1iZXJUeXBlUHJveHkuY3JlYXRlTnVtYmVyQmVhblByb3h5KGFOdW1iZXIpOwotCX0KLQkKLQlwdWJsaWMgSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChib29sZWFuIGFCb29sZWFuKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYm9vbGVhblR5cGUuY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShhQm9vbGVhbik7Ci0JfQotCQotCXB1YmxpYyBJQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKEJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ib29sZWFuQ2xhc3MuY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShhQm9vbGVhbik7Ci0JfQotCQotCXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoYnl0ZSBhQnl0ZSkgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJ5dGVUeXBlLmNyZWF0ZUJ5dGVCZWFuUHJveHkoYUJ5dGUpOwotCX0KLQkKLQlwdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGRvdWJsZSBhRG91YmxlKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuZG91YmxlVHlwZS5jcmVhdGVEb3VibGVCZWFuUHJveHkoYURvdWJsZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSNjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkoSUJlYW5Qcm94eSBub25QcmltaXRpdmVQcm94eSkgewotCQlpZiAobm9uUHJpbWl0aXZlUHJveHkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIW5vblByaW1pdGl2ZVByb3h5LmlzVmFsaWQoKSkKLQkJCXJldHVybiBub25QcmltaXRpdmVQcm94eTsKLQkJSURFQmVhblR5cGVQcm94eSB0eXBlID0gKElERUJlYW5UeXBlUHJveHkpIG5vblByaW1pdGl2ZVByb3h5LmdldFR5cGVQcm94eSgpOwotCQlpZiAodHlwZS5nZXRDbGFzcygpID09IEJvb2xlYW4uY2xhc3MpCi0JCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSUJvb2xlYW5CZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5ib29sZWFuVmFsdWUoKSk7Ci0JCWVsc2UgaWYgKHR5cGUuZ2V0Q2xhc3MoKSA9PSBCeXRlLmNsYXNzKQotCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5ieXRlVmFsdWUoKSk7Ci0JCWVsc2UgaWYgKHR5cGUuZ2V0Q2xhc3MoKSA9PSBDaGFyYWN0ZXIuY2xhc3MpCi0JCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSUNoYXJhY3RlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmNoYXJWYWx1ZSgpKTsKLQkJZWxzZSBpZiAodHlwZS5nZXRDbGFzcygpID09IERvdWJsZS5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuZG91YmxlVmFsdWUoKSk7Ci0JCWVsc2UgaWYgKHR5cGUuZ2V0Q2xhc3MoKSA9PSBGbG9hdC5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuZmxvYXRWYWx1ZSgpKTsKLQkJZWxzZSBpZiAodHlwZS5nZXRDbGFzcygpID09IEludGVnZXIuY2xhc3MpCi0JCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmludFZhbHVlKCkpOwotCQllbHNlIGlmICh0eXBlLmdldENsYXNzKCkgPT0gTG9uZy5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkubG9uZ1ZhbHVlKCkpOwotCQllbHNlIGlmICh0eXBlLmdldENsYXNzKCkgPT0gU2hvcnQuY2xhc3MpCi0JCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLnNob3J0VmFsdWUoKSk7Ci0JCWVsc2UKLQkJCXJldHVybiBub25QcmltaXRpdmVQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBvbmUtZGltZW5zaW9uYWwgYXJyYXkuIFRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZSBhcyBjYWxsaW5nCi0JICogY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBuZXcgaW50WzFdIHt4fSkgd2hlcmUgJ3gnIGlzIHRoZSB2YWx1ZSBwYXNzZWQgaW4gYXMKLQkgKiB0aGUgZGltZW5zaW9uLgotCSAqLwotCXB1YmxpYyBJQXJyYXlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBpbnQgZGltZW5zaW9uKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gY3JlYXRlQmVhblByb3h5V2l0aCh0eXBlLCBuZXcgaW50W10geyBkaW1lbnNpb24gfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBhcnJheSBiZWFuIHByb3h5LgotCSAqICAtIChpbnQsIG5ldyBpbnRbMl0gezMsIDR9KSB3aWxsIGNyZWF0ZTogaW50IFszXSBbNF0KLQkgKiAgLSAoaW50W10sIG5ldyBpbnRbMV0gezF9KSBpbnQgWzFdCi0JICogIC0gKGludFtdLCBuZXcgaW50WzJdIHsyLDN9KSBpbnQgWzJdIFszXQotCSAqIAotCSAqICAtIChpbnRbXSwgbnVsbCkgb3IgKGludFtdLCBuZXcgaW50WzBdKSBvciAoaW50LCBudWxsKSBvciAoaW50LCBuZXcgaW50WzBdKSBpbnQgWzBdLi4uIG9yCi0JICogKGludFtdW10uLi4sIG51bGwpIG9yIChpbnRbXVtdLi4uLCBuZXcgaW50WzBdKSBpbnRbMF1bXS4uLiBUaGlzIGlzIGJlY2F1c2UgYW4gYXJyYXkgaW5zdGFuY2UKLQkgKiB3aXRoIG5vIHNwZWNpZmllZCBkaW1lbnNpb25zIGlzIG5vdCB2YWxpZC4KLQkgKiAgLSAoaW50W11bXSwgbmV3IGludFsxXSB7M30pIGludFszXVtdCi0JICovCi0JcHVibGljIElBcnJheUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKElCZWFuVHlwZVByb3h5IHR5cGUsIGludFtdIGRpbWVuc2lvbnMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWlmICh0eXBlLmlzQXJyYXkoKSkKLQkJCXJldHVybiAoKElERUFycmF5QmVhblR5cGVQcm94eSkgdHlwZSkuY3JlYXRlQmVhblByb3h5V2l0aChkaW1lbnNpb25zKTsgLy8gQWxyZWFkeSBhbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBhcnJheSB0eXBlLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBqdXN0IHBhc3MgaXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gb24uCi0JCWVsc2UgewotCQkJLy8gSXQgaXMgbm90IGFuIGFycmF5IHR5cGUsIHNvIHdlIG5lZWQgdG8gZ2V0IGFuIGFycmF5IG9mIHRoaXMgdHlwZSBhbmQgZGltZW5zaW9ucy4KLQkJCUlERUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPQotCQkJCShJREVBcnJheUJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHR5cGUuZ2V0VHlwZU5hbWUoKSwgZGltZW5zaW9ucy5sZW5ndGgpOwotCQkJcmV0dXJuIGFycmF5VHlwZS5jcmVhdGVCZWFuUHJveHlXaXRoKGRpbWVuc2lvbnMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2VQcm94eShJQmVhblByb3h5IGFQcm94eSkgewotCQkvLyBEbyBub3RoaW5nLiBUaGlzIGlzIG1vcmUgZm9yIHJlbW90ZSBwcm94aWVzCi0JfQotCQotCS8qKgotCSAqIGNyZWF0ZUlERUJlYW5Qcm94eVdpdGggbWV0aG9kIGNvbW1lbnQuIFRoaXMgaXMgbm90IHBhcnQgb2YgdGhlIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkKLQkgKiBpbnRlcmZhY2UuIEl0IGlzIGF2YWlsYWJsZSBvbmx5IGZyb20gSURFQmVhblByb3h5RmFjdG9yeSBzbyB0aGF0IElERSByZWdpc3RlcmVkIGV4dGVuc2lvbnMKLQkgKiBjYW4gd3JhcHBlciBhIGJlYW4uIFRoZXkgd2lsbCBuZWVkIHRvIGdldCBjdXJyZW50IGFuZCBleHBsaWNpdGx5IGNhc3QgdG8KLQkgKiBJREVCZWFuUHJveHlGYWN0b3J5LCBzbyB0aGV5IHNob3VsZCBvbmx5IGJlIElERSB0eXBlcyB0aGVtc2VsdmVzLgotCSAqLwotCXB1YmxpYyBJSURFQmVhblByb3h5IGNyZWF0ZUlERUJlYW5Qcm94eVdpdGgoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWlmIChhbk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElERUJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFuT2JqZWN0LmdldENsYXNzKCkpKS5uZXdCZWFuUHJveHkoYW5PYmplY3QpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgdGhlIElERSBGYWN0b3J5IHdlIHdpbGwgY3JlYXRlIGFuIElERUJlYW5Qcm94eSB1c2luZyB0aGUgaW5pdGlhbGl6YXRpb25TdHJpbmcuIElmIHRoZQotCSAqIGZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzIG5vdCBvbmUgd2UgdW5kZXJzdGFuZCwgcGFzcyBpdCBvbnRvIHRoZSBldmFsdWF0b3IuIFRoZQotCSAqIGluaXRTdHJpbmdQYXJzZXIgaXMgcGFzc2VkIHRvIGFsbG93IHNob3J0Y3V0IGV2YWx1YXRpb24uIFBhY2thZ2UgcHJvdGVjdGVkIHNvIG9ubHkKLQkgKiBJREVCZWFuVHlwZVByb3hpZXMgY2FuIGNyZWF0ZSBpbnN0YW5jZXMuCi0JICovCi0JSUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHkoSURFQmVhblR5cGVQcm94eSBhVHlwZVByb3h5LCBTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHsKLQkJaWYgKGluaXRpYWxpemF0aW9uU3RyaW5nLmVxdWFscygibnVsbCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsgLy8gVmFsdWUgaXMgaW5pdGlhbGl6ZWQgYXMgbnVsbC4KLQkJLy8gV2UgaGF2ZSB0byBldmFsdWF0ZSB0aGUgcmVzdWx0IG9mIHRoZSBpbml0aWFsaXphdGlvblN0cmluZwotCQl0cnkgewotCQkJQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NMb2FkZXIgPSBmUmVnaXN0cnkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLQkJCU9iamVjdCBuZXdWYWx1ZSA9IEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmV2YWx1YXRlKGluaXRpYWxpemF0aW9uU3RyaW5nLCBwbHVnaW5DbGFzc0xvYWRlcik7Ci0JCQlyZXR1cm4gbmV3VmFsdWUgIT0gbnVsbCA/IGFUeXBlUHJveHkubmV3QmVhblByb3h5KG5ld1ZhbHVlKSA6IG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRm9yIHRoZSBJREUgRmFjdG9yeSB3ZSB3aWxsIGNyZWF0ZSBhbiBJREVCZWFuUHJveHkgdXNpbmcgdGhlIG51bGwgY29uc3RydWN0b3IgUGFja2FnZQotCSAqIHByb3RlY3RlZCBzbyBvbmx5IElERUJlYW5UeXBlUHJveGllcyBjYW4gY3JlYXRlIGluc3RhbmNlcy4KLQkgKi8KLQlJQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eShJREVCZWFuVHlwZVByb3h5IGFUeXBlUHJveHkpIHsKLQotCQlDbGFzcyBiZWFuVHlwZSA9IGFUeXBlUHJveHkuZkNsYXNzOwotCi0JCS8vIElmIHRoZSBiZWFuVHlwZSBpcyBhIHByaW1pdGl2ZSwgdGhlIGNyZWF0aW9uIHdpbGwgZmFpbCBiZWNhdXNlIHlvdSBjYW4ndAotCQkvLyBjcmVhdGUgYSBwcmltaXRpdmUgd2l0aG91dCBhIHZhbHVlLgotCQl0cnkgewotCQkJcmV0dXJuIGFUeXBlUHJveHkubmV3QmVhblByb3h5KCEoYVR5cGVQcm94eS5pc1ByaW1pdGl2ZSgpKSA/IGJlYW5UeXBlLm5ld0luc3RhbmNlKCkgOiBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5RmFjdG9yeSN0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLQkJLy8gTm90aGluZyByZWFsbHkgdG8gZG8gaGVyZSAtIG1vcmUgYXBwbGljYWJsZSB0byByZW1vdGUgcHJveHkgZmFjdG9yaWVzCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSNjcmVhdGVFeHByZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgSUV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBJREVFeHByZXNzaW9uKHRoaXMuZlJlZ2lzdHJ5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5I2NyZWF0ZUJlYW5Qcm94eUZyb20oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlGcm9tKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJaWYgKGluaXRpYWxpemF0aW9uU3RyaW5nLmVxdWFscygibnVsbCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsgLy8gVmFsdWUgaXMgaW5pdGlhbGl6ZWQgYXMgbnVsbC4KLQkJLy8gV2UgaGF2ZSB0byBldmFsdWF0ZSB0aGUgcmVzdWx0IG9mIHRoZSBpbml0aWFsaXphdGlvblN0cmluZwotCQl0cnkgewotCQkJQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NMb2FkZXIgPSBmUmVnaXN0cnkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLQkJCUluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIHBhcnNlciA9IEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmNyZWF0ZVBhcnNlcihpbml0aWFsaXphdGlvblN0cmluZywgcGx1Z2luQ2xhc3NMb2FkZXIpOwotCQkJT2JqZWN0IG5ld1ZhbHVlID0gcGFyc2VyLmV2YWx1YXRlKCk7Ci0JCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBmUmVnaXN0cnkuZ2V0QmVhblByb3h5KHBhcnNlci5nZXRFeHBlY3RlZFR5cGUoKSwgbmV3VmFsdWUpOwotCQkJfSBlbHNlIAotCQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGdldElWTVNlcnZlclByb3h5KCkgewotCQlyZXR1cm4gaXZtU2VydmVyUHJveHk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGZkN2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotLyoKLSAqICRSQ1NmaWxlOiBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEsdiAkICRSZXZpc2lvbjogMS4xMiAkICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NYXBUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBmaW5hbCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeVJlZ2lzdHJ5OwotCi0JLy8gSGFzaHRhYmxlIHRvIGNhY2hlIHByb3hpZXMgZm9yIGNsYXNzZXMgc28gdGhleSBhcmUgZm91bmQgb24gc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGxvb2t1cHMKLQlwcm90ZWN0ZWQgTWFwIGJlYW5Qcm94aWVzOwotCi0JcHVibGljIHN0YXRpYyBNYXAgTUFQX1NIT1JUU0lHX1RPX1RZUEUgPSBuZXcgSGFzaE1hcCg4KTsKLQotCXB1YmxpYyBzdGF0aWMgTWFwIE1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRyA9IG5ldyBIYXNoTWFwKDgpOwotCi0Jc3RhdGljIHsKLQkJTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJCIiwgQnl0ZS5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkMiLCBDaGFyYWN0ZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJEIiwgRG91YmxlLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiRiIsIEZsb2F0LlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiSSIsIEludGVnZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJKIiwgTG9uZy5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIlMiLCBTaG9ydC5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIloiLCBCb29sZWFuLlRZUEUpOyAvLyROT04tTkxTLTEkCi0KLQkJTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgiYnl0ZSIsICJCIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJjaGFyIiwgIkMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImRvdWJsZSIsICJEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJmbG9hdCIsICJGIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJpbnQiLCAiSSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgibG9uZyIsICJKIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJzaG9ydCIsICJTIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJib29sZWFuIiwgIloiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLy8gQ2FjaGVkIGNvcHkgb2YgYSBmZXcgdHlwaWNhbCBiZWFuIHR5cGUgcHJveGllcy4KLQlJREVCZWFuVHlwZVByb3h5IG9iamVjdENsYXNzOwotCi0JSURFQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5IGJvb2xlYW5UeXBlOwotCi0JSURFQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eSBib29sZWFuQ2xhc3M7Ci0KLQlJREVJbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkgaW50VHlwZTsKLQotCUlERUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkgaW50ZWdlckNsYXNzOwotCi0JSURFRmxvYXRUeXBlQmVhblR5cGVQcm94eSBmbG9hdFR5cGU7Ci0KLQlJREVGbG9hdENsYXNzQmVhblR5cGVQcm94eSBmbG9hdENsYXNzOwotCi0JSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5IGxvbmdUeXBlOwotCi0JSURFTG9uZ0NsYXNzQmVhblR5cGVQcm94eSBsb25nQ2xhc3M7Ci0KLQlJREVTaG9ydFR5cGVCZWFuVHlwZVByb3h5IHNob3J0VHlwZTsKLQotCUlERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5IHNob3J0Q2xhc3M7Ci0KLQlJREVCeXRlVHlwZUJlYW5UeXBlUHJveHkgYnl0ZVR5cGU7Ci0KLQlJREVCeXRlQ2xhc3NCZWFuVHlwZVByb3h5IGJ5dGVDbGFzczsKLQotCUlERUNoYXJUeXBlQmVhblR5cGVQcm94eSBjaGFyVHlwZTsKLQotCUlERUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eSBjaGFyQ2xhc3M7Ci0KLQlJREVEb3VibGVUeXBlQmVhblR5cGVQcm94eSBkb3VibGVUeXBlOwotCi0JSURFRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5IGRvdWJsZUNsYXNzOwotCi0JSURFU3RyaW5nQmVhblR5cGVQcm94eSBzdHJpbmdDbGFzczsKLQotCUlERUNsYXNzQmVhblR5cGVQcm94eSBjbGFzc0NsYXNzOwotCi0JSURFQmVhblR5cGVQcm94eSB2b2lkVHlwZTsKLQotCXB1YmxpYyBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlmRmFjdG9yeVJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCQlhUmVnaXN0cnkucmVnaXN0ZXJCZWFuVHlwZVByb3h5RmFjdG9yeSh0aGlzKTsKLQotCQkvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgY2FjaGUuCi0JCW9iamVjdENsYXNzID0gbmV3IElERUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgT2JqZWN0LmNsYXNzKTsKLQkJYm9vbGVhblR5cGUgPSBuZXcgSURFQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJvb2xlYW4uVFlQRSk7Ci0JCWJvb2xlYW5DbGFzcyA9IG5ldyBJREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJvb2xlYW4uY2xhc3MpOwotCQlpbnRUeXBlID0gbmV3IElERUludGVnZXJUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBJbnRlZ2VyLlRZUEUpOwotCQlpbnRlZ2VyQ2xhc3MgPSBuZXcgSURFSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBJbnRlZ2VyLmNsYXNzKTsKLQkJZmxvYXRUeXBlID0gbmV3IElERUZsb2F0VHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgRmxvYXQuVFlQRSk7Ci0JCWZsb2F0Q2xhc3MgPSBuZXcgSURFRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgRmxvYXQuY2xhc3MpOwotCQlsb25nVHlwZSA9IG5ldyBJREVMb25nVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgTG9uZy5UWVBFKTsKLQkJbG9uZ0NsYXNzID0gbmV3IElERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgTG9uZy5jbGFzcyk7Ci0JCXNob3J0VHlwZSA9IG5ldyBJREVTaG9ydFR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIFNob3J0LlRZUEUpOwotCQlzaG9ydENsYXNzID0gbmV3IElERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIFNob3J0LmNsYXNzKTsKLQkJYnl0ZVR5cGUgPSBuZXcgSURFQnl0ZVR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJ5dGUuVFlQRSk7Ci0JCWJ5dGVDbGFzcyA9IG5ldyBJREVCeXRlQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJ5dGUuY2xhc3MpOwotCQljaGFyVHlwZSA9IG5ldyBJREVDaGFyVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgQ2hhcmFjdGVyLlRZUEUpOwotCQljaGFyQ2xhc3MgPSBuZXcgSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIENoYXJhY3Rlci5jbGFzcyk7Ci0JCWRvdWJsZVR5cGUgPSBuZXcgSURFRG91YmxlVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgRG91YmxlLlRZUEUpOwotCQlkb3VibGVDbGFzcyA9IG5ldyBJREVEb3VibGVDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgRG91YmxlLmNsYXNzKTsKLQkJc3RyaW5nQ2xhc3MgPSBuZXcgSURFU3RyaW5nQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBTdHJpbmcuY2xhc3MpOwotCQljbGFzc0NsYXNzID0gbmV3IElERUNsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBqYXZhLmxhbmcuQ2xhc3MuY2xhc3MpOwotCQl2b2lkVHlwZSA9IG5ldyBJREVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIFZvaWQuVFlQRSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSB0aGUgaGFzaHRhYmxlIHdpdGggdGhlIHByaW1pdGl2ZXMsIHRoZWlyIGxhbmcgZXF1aXZhbGVudHMsIGFuZCBhbHNvIGNvbW1vbiBjbGFzc2VzIGxpa2UgU3RyaW5nCi0JCWJlYW5Qcm94aWVzID0gbmV3IEhhc2hNYXAoMjApOwotCi0JCS8vIFByaW1pdGl2ZXMKLQkJYmVhblByb3hpZXMucHV0KGludFR5cGUuZ2V0VHlwZU5hbWUoKSwgaW50VHlwZSk7Ci0JCWJlYW5Qcm94aWVzLnB1dChib29sZWFuVHlwZS5nZXRUeXBlTmFtZSgpLCBib29sZWFuVHlwZSk7Ci0JCWJlYW5Qcm94aWVzLnB1dChjaGFyVHlwZS5nZXRUeXBlTmFtZSgpLCBjaGFyVHlwZSk7Ci0JCWJlYW5Qcm94aWVzLnB1dChieXRlVHlwZS5nZXRUeXBlTmFtZSgpLCBieXRlVHlwZSk7Ci0JCWJlYW5Qcm94aWVzLnB1dChzaG9ydFR5cGUuZ2V0VHlwZU5hbWUoKSwgc2hvcnRUeXBlKTsKLQkJYmVhblByb3hpZXMucHV0KGxvbmdUeXBlLmdldFR5cGVOYW1lKCksIGxvbmdUeXBlKTsKLQkJYmVhblByb3hpZXMucHV0KGZsb2F0VHlwZS5nZXRUeXBlTmFtZSgpLCBmbG9hdFR5cGUpOwotCQliZWFuUHJveGllcy5wdXQoZG91YmxlVHlwZS5nZXRUeXBlTmFtZSgpLCBkb3VibGVUeXBlKTsKLQotCQkvLyBqYXZhLmxhbmcgcHJpbWl0aXZlIHBlZXJzCi0JCS8vIE5vdGUgdGhhdCBzcGVjaWFsIGNsYXNzZXMgYXJlIHVzZWQgZm9yIHNvbWUgb2YgdGhlc2Ugd2hpY2ggYWxsb3cgdGhlIElERSB0byBnZXQgdGhlCi0JCS8vIGxhbmcgb2JqZWN0cyBmcm9tIHRoZSBvYmplY3RzIHRoYXQgYXJlIGhvbGRpbmcgcHJveGllcwotCQliZWFuUHJveGllcy5wdXQoaW50ZWdlckNsYXNzLmdldFR5cGVOYW1lKCksIGludGVnZXJDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChib29sZWFuQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgYm9vbGVhbkNsYXNzKTsKLQkJYmVhblByb3hpZXMucHV0KGNoYXJDbGFzcy5nZXRUeXBlTmFtZSgpLCBjaGFyQ2xhc3MpOwotCQliZWFuUHJveGllcy5wdXQoYnl0ZUNsYXNzLmdldFR5cGVOYW1lKCksIGJ5dGVDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChzaG9ydENsYXNzLmdldFR5cGVOYW1lKCksIHNob3J0Q2xhc3MpOwotCQliZWFuUHJveGllcy5wdXQobG9uZ0NsYXNzLmdldFR5cGVOYW1lKCksIGxvbmdDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChmbG9hdENsYXNzLmdldFR5cGVOYW1lKCksIGZsb2F0Q2xhc3MpOwotCQliZWFuUHJveGllcy5wdXQoZG91YmxlQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgZG91YmxlQ2xhc3MpOwotCQliZWFuUHJveGllcy5wdXQoQmlnRGVjaW1hbC5jbGFzcy5nZXROYW1lKCksIG5ldyBJREVCaWdEZWNpbWFsQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBCaWdEZWNpbWFsLmNsYXNzKSk7Ly8kTk9OLU5MUy0xJAotCQliZWFuUHJveGllcy5wdXQoQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCksIG5ldyBJREVCaWdJbnRlZ2VyQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBCaWdJbnRlZ2VyLmNsYXNzKSk7Ly8kTk9OLU5MUy0xJAkJCi0JCWJlYW5Qcm94aWVzLnB1dChzdHJpbmdDbGFzcy5nZXRUeXBlTmFtZSgpLCBzdHJpbmdDbGFzcyk7Ci0KLQkJYmVhblByb3hpZXMucHV0KGNsYXNzQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgY2xhc3NDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dCh2b2lkVHlwZS5nZXRUeXBlTmFtZSgpLCB2b2lkVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogV2UgYXJlIGFuIElERSBwcm94eSBhbmQga25vdyB0aGF0IHRoZSB0eXBlIGlzIGluIHRoZSBzYW1lIFZNIGFzIHRoZSBJREUuIHRoZSBJREVCZWFuVHlwZVByb3h5IG9iamVjdCBOT1RFIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGUKLQkgKiBvbmx5IHBlcnNvbiB3aG8gY2FuIGNhbGwgaXQgYXJlIHByaXZlbGVkZ2VkIGNsYXNzZXMgdGhhdCBhcmUgYWxzbyBjcmVhdGluZyB0aGluZ3MgaW4gYW4gSURFUHJveHkgZW52aXJvbm1lbnQuIElmIGFueW9uZSBuZWVkcyB0byBtYWtlIHRoaXMKLQkgKiBtZXRob2QgcHVibGljIHRoZXkgYXJlIGRvaW5nIHRoZSB3cm9uZyB0aGluZyBhcyB0aGV5IHNob3VsZCB1c2UgdGhlIHB1YmxpYyBtZXRob2QgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcpIHRoYXQgaXMgb24gdGhlIGludGVyZmFjZS4gVGhlIG9ubHkKLQkgKiBvdGhlciBvYmplY3QgdGhhdCBjYW4gZ3VhcmFudGVlIHRoYXQgdGhleSBoYXZlIHRoZSBjbGFzcyBmb3IgdGhlIGFyZ3VtZW50IGFyZSB0aG9zZSB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBpZGV2bSBwYWNrYWdlCi0JICovCi0JSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShDbGFzcyBhbklERUNsYXNzKSB7Ci0JCXJldHVybiBnZXRCZWFuVHlwZVByb3h5KGFuSURFQ2xhc3MuZ2V0TmFtZSgpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0QmVhblR5cGVQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdHlwZU5hbWUgPSBNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKHR5cGVOYW1lKTsKLQotCQkvLyBTZWUgd2hldGhlciB3ZSBhbHJlYWR5IGhhdmUgdGhlIHByb3h5IGZvciB0aGUgYXJndW1lbnQgbmFtZQotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZVByb3h5ID0gKElQcm94eUJlYW5UeXBlKSBiZWFuUHJveGllcy5nZXQodHlwZU5hbWUpOwotCQkvLyBTZWUgaWYgdGhlcmUgYW5kIHJlc29sdmVkLCBpZiBzbywgcmV0dXJuIGl0LiBJZiBub3QgcmVzb2x2ZWQsIHRoYXQgbWVhbnMgd2UgbmVlZCBpdCBOT1cKLQkJLy8gc28gd2UgbXVzdCBnbyBmb3IgaXQuIFdoZW4gZmluYWxseSByZXNvbHZlZCB0aGUgb3JpZ2luYWwgRXhwcmVzc2lvblByb3h5IHdpbGwgYmUgZGVyZWdpc3RlcmVkIGFuZAotCQkvLyB0aGUgcmVzb2x2ZWQgYmVhbnR5cGVwcm94eSB3aWxsIGJlIGluIGl0cyBwbGFjZS4KLQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCAmJiBiZWFuVHlwZVByb3h5LmlzQmVhblByb3h5KCkpIHsKLQkJCXJldHVybiAoSUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHk7Ci0JCX0KLQotCQkvLyBJZiBub3QgYW4gYXJyYXksIHRoZW4gc2VlIGlmIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiBtZWNoYW5pc20gY2FuIGZpbmQgaXQuCi0JCS8vIERvIHRoaXMgaGVyZSBzbyB0aGF0IGlmIGl0IGlzIGZvdW5kIGluIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiB3ZSB3b24ndCBuZWNlc3NhcmlseSBjcmVhdGUgYW4KLQkJLy8gZXh0cmEgY29ubmVjdGlvbiB3aGVuIG5vdCBuZWVkZWQuCi0JCWlmICh0eXBlTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkKLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwYWNrYWdlSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgcGFja2FnZUluZGV4KTsKLQkJCQlJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSBwYWNrYWdlRmFjdG9yeSA9IChJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnlSZWdpc3RyeQotCQkJCQkJLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKHBhY2thZ2VOYW1lKTsKLQkJCQlpZiAocGFja2FnZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQliZWFuVHlwZVByb3h5ID0gcGFja2FnZUZhY3RvcnkuZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSk7Ci0JCQkJCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsKLQkJCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eSgoSUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiAoSUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUaGVyZSB3YXMgbm90IGEgcmVnaXN0ZXJlZCBmYWN0b3J5IHRoYXQgZGVhbHQgd2l0aCB0aGUgY2xhc3MuIExvYWQgaXQgdXNpbmcgdGhlIGZhY3RvcnkKLQkJCS8vIHJlZ2lzdHJ5IHdoaWNoIGhhcyB0aGUgcGx1Z2luJ3MgY2xhc3MgbG9hZGVyCi0JCQl0cnkgewotCQkJCUNsYXNzIGlkZUNsYXNzID0gZkZhY3RvcnlSZWdpc3RyeS5sb2FkQ2xhc3ModHlwZU5hbWUpOwotCQkJCUlERUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlUHJveHkgPSBudWxsOwotCQkJCWlmIChpZGVDbGFzcy5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbCkgewotCQkJCQkvLyBHZXQgdGhlIGJlYW50eXBlIHByb3h5IG9mIHRoZSBzdXBlcmNsYXNzLgotCQkJCQlzdXBlclR5cGVQcm94eSA9IChJREVCZWFuVHlwZVByb3h5KSBnZXRCZWFuVHlwZVByb3h5KGlkZUNsYXNzLmdldFN1cGVyY2xhc3MoKSk7Ci0JCQkJfQotCi0JCQkJLy8gQXNrIHRoZSBzdXBlcnR5cGUKLQkJCQkvLyB0byBjcmVhdGUgYSBiZWFudHlwZSBwcm94eSBvZiB0aGUgc2FtZSBiZWFudHlwZSBwcm94eSBjbGFzcy4KLQkJCQkvLyBUaGlzIGlzIHNvIHRoYXQgYW55IHN1YmNsYXNzZXMgd2lsbCBnZXQgdGhlIHNhbWUgYmVhbnR5cGUgcHJveHkgY2xhc3MKLQkJCQkvLyBmb3IgaXQgaWYgaXQgaXMgc3BlY2lhbC4KLQkJCQlpZiAoc3VwZXJUeXBlUHJveHkgIT0gbnVsbCkKLQkJCQkJYmVhblR5cGVQcm94eSA9IHN1cGVyVHlwZVByb3h5Lm5ld0JlYW5UeXBlRm9yQ2xhc3MoaWRlQ2xhc3MpOwotCi0JCQkJaWYgKGJlYW5UeXBlUHJveHkgPT0gbnVsbCkKLQkJCQkJYmVhblR5cGVQcm94eSA9IG5ldyBJREVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIGlkZUNsYXNzKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoInswfSh7MX0pIiwgbmV3IE9iamVjdFtdIHsgZS5nZXRDbGFzcygpLCBlLmdldE1lc3NhZ2UoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJYmVhblR5cGVQcm94eSA9IG5ldyBJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIHR5cGVOYW1lLCBtc2csIGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJ7MH0oezF9KSIsIG5ldyBPYmplY3RbXSB7IGUuZ2V0Q2xhc3MoKSwgZS5nZXRNZXNzYWdlKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgSURFSW5pdEVycm9yQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCB0eXBlTmFtZSwgbXNnLCBlLmdldENhdXNlKCkpOwotCQkJfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJ7MH0oezF9KSIsIG5ldyBPYmplY3RbXSB7IGUuZ2V0Q2xhc3MoKSwgZS5nZXRNZXNzYWdlKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgSURFSW5pdEVycm9yQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCB0eXBlTmFtZSwgbXNnLCBlKTsKLQkJCX0KLQotCQkJLy8gQ2FjaGUgdGhlIGluc3RhbmNlIHNvIHdlIGNhbiByZS11c2UgaXQgYWdhaW4KLQkJCWJlYW5Qcm94aWVzLnB1dCh0eXBlTmFtZSwgYmVhblR5cGVQcm94eSk7Ci0JCQlyZXR1cm4gKElCZWFuVHlwZVByb3h5KSBiZWFuVHlwZVByb3h5OwotCQl9IGVsc2UgewotCQkJLy8gbmVlZCB0byBjcmVhdGUgYSBhcnJheSBvZiB0aGlzIG1hbnkgZGltZW5zaW9ucyBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciBpdC4KLQkJCWludCBkaW1zID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJ1snKSArIDE7Ci0JCQlDbGFzcyBmaW5hbENvbXBvbmVudFR5cGUgPSBudWxsOwotCQkJaWYgKHR5cGVOYW1lLmNoYXJBdChkaW1zKSA9PSAnTCcpIHsKLQkJCQkvLyBJdCBpcyBhIGNsYXNzLgotCQkJCS8vIFN0cmlwIG9mZiB1cCB0byB0aGUgJ0wnLCBhbmQgdGhlIHRyYWlsaW5nICc7Jy4gVGhhdCBpcyB0aGUgY2xhc3MgbmFtZS4KLQkJCQlJREVCZWFuVHlwZVByb3h5IGZpbmFsVHlwZSA9IChJREVCZWFuVHlwZVByb3h5KSBnZXRCZWFuVHlwZVByb3h5KHR5cGVOYW1lLnN1YnN0cmluZyhkaW1zICsgMSwgdHlwZU5hbWUubGVuZ3RoKCkgLSAxKSk7Ci0JCQkJaWYgKGZpbmFsVHlwZSAhPSBudWxsKQotCQkJCQlmaW5hbENvbXBvbmVudFR5cGUgPSBmaW5hbFR5cGUuZkNsYXNzOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBpcyBhIHR5cGUuIE5lZWQgdG8gbWFwIGl0LgotCQkJCWZpbmFsQ29tcG9uZW50VHlwZSA9IChDbGFzcykgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5NQVBfU0hPUlRTSUdfVE9fVFlQRS5nZXQodHlwZU5hbWUuc3Vic3RyaW5nKGRpbXMsIGRpbXMgKyAxKSk7Ci0JCQl9Ci0KLQkJCWlmIChmaW5hbENvbXBvbmVudFR5cGUgIT0gbnVsbCkgewotCQkJCU9iamVjdCBkdW1teUFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoZmluYWxDb21wb25lbnRUeXBlLCBuZXcgaW50W2RpbXNdKTsKLQkJCQliZWFuVHlwZVByb3h5ID0gbmV3IElERUFycmF5QmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCB0eXBlTmFtZSwgZHVtbXlBcnJheS5nZXRDbGFzcygpKTsKLQkJCQliZWFuUHJveGllcy5wdXQodHlwZU5hbWUsIGJlYW5UeXBlUHJveHkpOwotCQkJfQotCQkJcmV0dXJuIChJQmVhblR5cGVQcm94eSkgYmVhblR5cGVQcm94eTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0QmVhblR5cGVQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZVByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyB0eXBlTmFtZSkgewotCQl0eXBlTmFtZSA9IE1hcFR5cGVzLmdldEpOSUZvcm1hdE5hbWUodHlwZU5hbWUpOwotCi0JCS8vIFNlZSB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSB0aGUgcHJveHkgZm9yIHRoZSBhcmd1bWVudCBuYW1lCi0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSAoSVByb3h5QmVhblR5cGUpIGJlYW5Qcm94aWVzLmdldCh0eXBlTmFtZSk7Ci0JCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsgcmV0dXJuIGJlYW5UeXBlUHJveHk7IH0KLQkJCi0JCS8vIE5vdyBzZWUgaWYgYW4gZXhwcmVzc2lvbiBwcm94eSBjYWNoZWQuCi0JCWJlYW5UeXBlUHJveHkgPSAoKElERUV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldEJlYW5UeXBlKHR5cGVOYW1lKTsKLQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkKLQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwkJCi0KLQotCQkvLyBJZiBub3QgYW4gYXJyYXksIHRoZW4gc2VlIGlmIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiBtZWNoYW5pc20gY2FuIGZpbmQgaXQuCi0JCS8vIERvIHRoaXMgaGVyZSBzbyB0aGF0IGlmIGl0IGlzIGZvdW5kIGluIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiB3ZSB3b24ndCBuZWNlc3NhcmlseSBjcmVhdGUgYW4KLQkJLy8gZXh0cmEgY29ubmVjdGlvbiB3aGVuIG5vdCBuZWVkZWQuCi0JCWlmICh0eXBlTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkKLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwYWNrYWdlSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgcGFja2FnZUluZGV4KTsKLQkJCQlJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSBwYWNrYWdlRmFjdG9yeSA9IChJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnlSZWdpc3RyeQotCQkJCQkJLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKHBhY2thZ2VOYW1lKTsKLQkJCQlpZiAocGFja2FnZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQliZWFuVHlwZVByb3h5ID0gcGFja2FnZUZhY3RvcnkuZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSwgZXhwcmVzc2lvbik7Ci0JCQkJCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsKLQkJCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCQkJCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFRoZXJlIHdhcyBub3QgYSByZWdpc3RlcmVkIGZhY3RvcnkgdGhhdCBkZWFsdCB3aXRoIHRoZSBjbGFzcy4gU28gY3JlYXRlIHRoZSBleHByZXNzaW9uIHByb3h5LgotCQliZWFuVHlwZVByb3h5ID0gKChFeHByZXNzaW9uKSBleHByZXNzaW9uKS5jcmVhdGVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSh0eXBlTmFtZSk7Ci0JCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCXJldHVybiBiZWFuVHlwZVByb3h5OwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRCZWFuVHlwZVByb3h5KGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcgY29tcG9uZW50Q2xhc3NOYW1lLCBpbnQgZGltZW5zaW9ucykgewotCQlyZXR1cm4gZ2V0QmVhblR5cGVQcm94eShnZXRBcnJheUNsYXNzbmFtZShjb21wb25lbnRDbGFzc05hbWUsIGRpbWVuc2lvbnMpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I2dldEJlYW5UeXBlUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIElQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpIHsKLQkJcmV0dXJuIGdldEJlYW5UeXBlUHJveHkoZXhwcmVzc2lvbiwgZ2V0QXJyYXlDbGFzc25hbWUoY29tcG9uZW50Q2xhc3NOYW1lLCBkaW1lbnNpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudENsYXNzTmFtZQotCSAqIEBwYXJhbSBkaW1lbnNpb25zCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJyYXlDbGFzc25hbWUoU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpIHsKLQkJU3RyaW5nIGpuaUNvbXBvbmVudFR5cGVOYW1lID0gTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShjb21wb25lbnRDbGFzc05hbWUpOwotCQlTdHJpbmcgY29tcFR5cGUgPSBqbmlDb21wb25lbnRUeXBlTmFtZTsKLQkJaWYgKGpuaUNvbXBvbmVudFR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnWycpIHsKLQkJCS8vIFdlJ3JlIG5vdCBhbHJlYWR5IGFuIGFycmF5LCBzbyBjcmVhdGUgY29ycmVjdCB0ZW1wbGF0ZS4KLQkJCWNvbXBUeXBlID0gKFN0cmluZykgTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLmdldChjb21wb25lbnRDbGFzc05hbWUpOwotCQkJaWYgKGNvbXBUeXBlID09IG51bGwpIHsKLQkJCQkvLyBJdCBpcyBhIGNsYXNzLCBhbmQgbm90IGEgdHlwZS4KLQkJCQljb21wVHlwZSA9ICJMIiArIGpuaUNvbXBvbmVudFR5cGVOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQkvLyBOb3cgY3JlYXRlIGl0IHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiAnWycgaW4gZnJvbnQuCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGRpbWVuc2lvbnMgKyBjb21wVHlwZS5sZW5ndGgoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKQotCQkJYnVmZmVyLmFwcGVuZCgnWycpOwotCQlidWZmZXIuYXBwZW5kKGNvbXBUeXBlKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eUZhY3RvcnkjdGVybWluYXRlRmFjdG9yeShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbiB3YWl0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNyZWdpc3RlckJlYW5UeXBlUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHksCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlckJlYW5UeXBlUHJveHkoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIGJvb2xlYW4gcGVybWFuZW50KSB7Ci0JCWJlYW5Qcm94aWVzLnB1dChhQmVhblR5cGVQcm94eS5nZXRUeXBlTmFtZSgpLCBhQmVhblR5cGVQcm94eSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNyZWdpc3RlckJlYW5UeXBlUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQmVhblR5cGVQcm94eShJUHJveHlCZWFuVHlwZSBhUHJveHlCZWFuVHlwZSwgYm9vbGVhbiBwZXJtYW5lbnQpIHsKLQkJaWYgKGFQcm94eUJlYW5UeXBlLmlzQmVhblByb3h5KCkpCi0JCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoKElCZWFuVHlwZVByb3h5KSBhUHJveHlCZWFuVHlwZSwgcGVybWFuZW50KTsgLy8gQSByZWd1bGFyIGtpbmQsIGRvIHJlZ3VsYXIgcmVnaXN0cmF0aW9uLgotCQllbHNlIHsKLQkJCUV4cHJlc3Npb25Qcm94eSBiZWFuRXhwcmVzc2lvblByb3h5ID0gKChFeHByZXNzaW9uUHJveHkpIGFQcm94eUJlYW5UeXBlKTsKLQkJCWZpbmFsIFN0cmluZyB0eXBlTmFtZSA9IGFQcm94eUJlYW5UeXBlLmdldFR5cGVOYW1lKCk7Ci0JCQkoKElERUV4cHJlc3Npb24pIGJlYW5FeHByZXNzaW9uUHJveHkuZ2V0RXhwcmVzc2lvbigpKS5hZGRCZWFuVHlwZSh0eXBlTmFtZSwgYVByb3h5QmVhblR5cGUpOwotCQkJYmVhbkV4cHJlc3Npb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVN0cmluZyB0eXBlTmFtZSA9ICgoSVByb3h5QmVhblR5cGUpIGV2ZW50LmdldFNvdXJjZSgpKS5nZXRUeXBlTmFtZSgpOwotCQkJCQlzeW5jaHJvbml6ZWQgKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkudGhpcykgewotCQkJCQkJaWYgKCFiZWFuUHJveGllcy5jb250YWluc0tleSh0eXBlTmFtZSkpIHsKLQkJCQkJCQkvLyBJdCBoYXNuJ3QgYmVlbiByZXNvbHZlZCB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMuIFNvIHRoaXMgaXMgZ29vZC4gQWN0dWFsbHkgdGhpcyBzaG91bGQgbmV2ZXIKLQkJCQkJCQkvLyBvY2N1ciBiZWNhdXNlIHVwb24gcmVzb2x1dGlvbiB3ZSd2ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgdGhlIGJlYW4gdHlwZSBwcm94eSB0aHJvdWdoIHRoZQotCQkJCQkJCS8vIG5vcm1hbCBtZWNoYW5pc21zLiBCdXQgdG8gYmUgc2FmZSwgd2UnbGwgZG8gaXQgaGVyZS4KLQkJCQkJCQliZWFuUHJveGllcy5wdXQodHlwZU5hbWUsIGV2ZW50LmdldFByb3h5KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJKChJREVFeHByZXNzaW9uKSAoKEV4cHJlc3Npb25Qcm94eSkgZXZlbnQuZ2V0U291cmNlKCkpLmdldEV4cHJlc3Npb24oKSkucmVtb3ZlQmVhblR5cGUodHlwZU5hbWUpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I2lzQmVhblR5cGVSZWdpc3RlcmVkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNCZWFuVHlwZVJlZ2lzdGVyZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gYmVhblByb3hpZXMuY29udGFpbnNLZXkoTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShjbGFzc05hbWUpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I3JlZ2lzdGVyZWRUeXBlcygpCi0JICovCi0JcHVibGljIFNldCByZWdpc3RlcmVkVHlwZXMoKSB7Ci0JCXJldHVybiBiZWFuUHJveGllcy5rZXlTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I2lzQmVhblR5cGVOb3RGb3VuZChTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCZWFuVHlwZU5vdEZvdW5kKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJLy8gRG8gbm90aGluZy4gTm8gbmVlZCBmb3IgaXQgaW4gSURFIHN5c3RlbSBiZWNhdXNlIHRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgcHJveHksIGV2ZW4gd2hlbiBub3QgZm91bmQuCi0JCS8vIEluIHRoYXQgY2FzZSBhbiBJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5IHdpbGwgYmUgY3JlYXRlZC4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjaXNNYWludGFpbk5vdEZvdW5kVHlwZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFpbnRhaW5Ob3RGb3VuZFR5cGVzKCkgewotCQkvLyBEbyBub3RoaW5nLiBObyBuZWVkIGZvciBpdCBpbiBJREUgc3lzdGVtIGJlY2F1c2UgdGhlcmUgd2lsbCBhbHdheXMgYmUgYSBwcm94eSwgZXZlbiB3aGVuIG5vdCBmb3VuZC4KLQkJLy8gSW4gdGhhdCBjYXNlIGFuIElERUluaXRFcnJvckJlYW5UeXBlUHJveHkgd2lsbCBiZSBjcmVhdGVkLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNzZXRNYWludGFpbk5vdEZvdW5kVHlwZXMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWludGFpbk5vdEZvdW5kVHlwZXMoYm9vbGVhbiBtYWludGFpbikgewotCQkvLyBEbyBub3RoaW5nLiBObyBuZWVkIGZvciBpdCBpbiBJREUgc3lzdGVtIGJlY2F1c2UgdGhlcmUgd2lsbCBhbHdheXMgYmUgYSBwcm94eSwgZXZlbiB3aGVuIG5vdCBmb3VuZC4KLQkJLy8gSW4gdGhhdCBjYXNlIGFuIElERUluaXRFcnJvckJlYW5UeXBlUHJveHkgd2lsbCBiZSBjcmVhdGVkLgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RyaW5nQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVN0cmluZ0JlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQzZmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RyaW5nQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVTdHJpbmdCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSVN0cmluZ0JlYW5Qcm94eQotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjQyIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgSURFU3RyaW5nQmVhblByb3h5IGV4dGVuZHMgSURFT2JqZWN0QmVhblByb3h5IGltcGxlbWVudHMgSVN0cmluZ0JlYW5Qcm94eSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU3RyaW5nOwotLyoqCi0gKiBTdG9yZSB0aGUgYmVhbiBpbiB0aGUgc3RyaW5nIGZpZWxkIHRvIHNhdmUgcmUtY2FzdGluZyBlYWNoIHRpbWUgaXQgaXMgYXNrZWQgZm9yLgotICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkCi0gKiBpbiBhIHNwZWNpYWwgd2F5IGFuZCBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZW0uCi0gKi8KLUlERVN0cmluZ0JlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIE9iamVjdCBhQmVhbiwgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFCZWFuLGFCZWFuVHlwZVByb3h5KTsKLQlmU3RyaW5nID0gKFN0cmluZylhQmVhbjsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBjYWNoZSdkIHN0cmluZyB0aGF0IGlzIGEgamF2YS5sYW5nLlN0cmluZyB0aGF0IHRoZSBJREUgY2FuIHVzZQotICovCi1wdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgewotCXJldHVybiBmU3RyaW5nOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTdHJpbmdCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVN0cmluZ0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkMTYzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVN0cmluZ0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVN0cmluZ0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RyaW5nQmVhblByb3h5OwotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgdGhlIEJlYW5UeXBlIHByb3h5IGZvciBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLWZpbmFsIGNsYXNzIElERVN0cmluZ0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQkvLyBDYWNoZSBhIHByb3h5IHRvIGFuIGVtcHR5IHN0cmluZyBmb3Igc3BlZWQKLQlwcm90ZWN0ZWQgZmluYWwgSURFU3RyaW5nQmVhblByb3h5IGVtcHR5U3RyaW5nUHJveHk7Ci0KLUlERVN0cmluZ0JlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci0JLy8gQ2FjaGUgYSBwcm94eSB0byBhbiBlbXB0eSBzdHJpbmcgZm9yIHNwZWVkCi0JZW1wdHlTdHJpbmdQcm94eSA9IG5ldyBJREVTdHJpbmdCZWFuUHJveHkoYVJlZ2lzdHJ5LCAiIix0aGlzKTsJLy8kTk9OLU5MUy0xJAotfQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIHN0cmluZyBiZWFucwotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBuby1vbmUgZWxzZSBvdXRzaWRlIHRoZSBwYWNrYWdlIHNob3VsZCB1c2UgdGhpcywgdGhleQotICogbXVzdCBnbyB0aHJvdWdoIHRoZSBBUEkgd2hlcmUgeW91IGxvb2sgdXAgYSBmYWN0b3J5IGZpcnN0LgotICovCi1JU3RyaW5nQmVhblByb3h5IGNyZWF0ZVN0cmluZ0JlYW5Qcm94eShTdHJpbmcgYVN0cmluZyl7Ci0JaWYgKCBhU3RyaW5nLmVxdWFscygiIikgKSB7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW1wdHlTdHJpbmdQcm94eTsKLQl9IGVsc2UgewotCQlyZXR1cm4gbmV3IElERVN0cmluZ0JlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYVN0cmluZyx0aGlzKTsKLQl9Ci19Ci0vKiBTcGVjaWFsaXplZCBmcm9tIElERUJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIElTdHJpbmdCZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkKLSAqLwotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0KLQlyZXR1cm4gKElJREVCZWFuUHJveHkpY3JlYXRlU3RyaW5nQmVhblByb3h5KCAoU3RyaW5nKWFuT2JqZWN0ICk7Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFVGhyb3dhYmxlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFVGhyb3dhYmxlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMGQxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVRocm93YWJsZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFVGhyb3dhYmxlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgY2xhc3MgSURFVGhyb3dhYmxlUHJveHkgZXh0ZW5kcyBUaHJvd2FibGVQcm94eSBpbXBsZW1lbnRzIElJREVCZWFuUHJveHkgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MTYyNzU3OTYxMTc1OTc4MzM4TDsKLQlwcm90ZWN0ZWQgSUJlYW5UeXBlUHJveHkgZkJlYW5UeXBlUHJveHk7Ci0KLQlwcm90ZWN0ZWQgSURFVGhyb3dhYmxlUHJveHkoVGhyb3dhYmxlIGV4YywgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpIHsKLQkJc3VwZXIoZXhjKTsKLQkJZkJlYW5UeXBlUHJveHkgPSBhQmVhblR5cGVQcm94eTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuZXF1YWxzKG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElJREVCZWFuUHJveHkpIHsKLQkJCXJldHVybiBnZXRDYXVzZSgpLmVxdWFscygoKElJREVCZWFuUHJveHkpIG9iaikuZ2V0QmVhbigpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBJSURFQmVhblByb3h5KQotCQkJcmV0dXJuIGdldENhdXNlKCkgPT0gKChJSURFQmVhblByb3h5KSBhQmVhblByb3h5KS5nZXRCZWFuKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3h5TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGdldENhdXNlKCkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3h5TWVzc2FnZSgpIHsKLQkJcmV0dXJuIGdldENhdXNlKCkuZ2V0TWVzc2FnZSgpOwotCX0KLQlwdWJsaWMgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHdyaXRlcikgewotCQlnZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotCX0KLQlwdWJsaWMgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHN0cmVhbSkgewotCQlnZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZShzdHJlYW0pOwotCX0KLQlwdWJsaWMgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZSgpIHsKLQkJZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5OwotCX0KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJcmV0dXJuIGdldENhdXNlKCkudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhjZXB0aW9uIHdoaWNoIGlzIHRoZSBsaXZlIGJlYW4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEJlYW4oKSB7Ci0JCXJldHVybiBnZXRDYXVzZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0JlYW5Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCZWFuUHJveHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNFeHByZXNzaW9uUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXhwcmVzc2lvblByb3h5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVWTVNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVWTVNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmMyOWE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFVk1TZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVZNU2VydmVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci0KLXB1YmxpYyBjbGFzcyBJREVWTVNlcnZlciBpbXBsZW1lbnRzIElWTUNhbGxiYWNrU2VydmVyIHsKLQkKLQlJREVDYWxsYmFja1JlZ2lzdHJ5IGZDYWxsYmFja1JlZ2lzdHJ5OwotCUlERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmQmVhblByb3h5RmFjdG9yeTsKLQkKLUlERVZNU2VydmVyKElERUNhbGxiYWNrUmVnaXN0cnkgYUNhbGxiYWNrUmVnaXN0cnkpewotCWZDYWxsYmFja1JlZ2lzdHJ5ID0gYUNhbGxiYWNrUmVnaXN0cnk7Ci0JZkJlYW5Qcm94eUZhY3RvcnkgPSAoSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KWZDYWxsYmFja1JlZ2lzdHJ5LmZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JCi19CQotcHVibGljIE9iamVjdCBkb0NhbGxiYWNrKElDYWxsYmFja1J1bm5hYmxlIGFSdW5uYWJsZSl7Ci0JdHJ5IHsKLQkJcmV0dXJuIGFSdW5uYWJsZS5ydW4obmV3IElDYWxsYmFja0hhbmRsZXIoKXsKLQkJCXB1YmxpYyBPYmplY3QgY2FsbGJhY2tXaXRoUGFybXMoaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCwgT2JqZWN0W10gcGFybXMpewotCQkJCS8vIFdlIGFyZSBydW5uaW5nIGluIHRoZSBzYW1lIElERSBzbyBqdXN0IGNhbGwgdGhlIHJlZ2lzdHJ5IGRpcmVjdGx5Ci0JCQkJLy8gYWx0aG91Z2ggd2UgbXVzdCBjb252ZXJ0IHRoZSBwYXJtcyB0byBiZWFuIHByb3hpZXMKLQkJCQlPYmplY3RbXSBwcm94eVBhcm1zID0gbnVsbDsKLQkJCQkvLyBJZiB3ZSBoYXZlIGFueSBwYXJtcyB0aGVuIGNvbnZlcnQgdGhlbSB0byBiZWFuIHByb3hpZXMKLQkJCQlpZiAoIHBhcm1zICE9IG51bGwgKSB7Ci0JCQkJCXByb3h5UGFybXMgPSBuZXcgT2JqZWN0W3Bhcm1zLmxlbmd0aF07Ci0JCQkJCWZvciAoIGludCBpPTA7aTxwYXJtcy5sZW5ndGg7aSsrKXsKLQkJCQkJCU9iamVjdCBwID0gcGFybXNbaV07Ci0JCQkJCQlwcm94eVBhcm1zW2ldID0gY3JlYXRlTmV4dFBhcm0ocCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZDYWxsYmFja1JlZ2lzdHJ5LnZtQ2FsbGJhY2soY2FsbGJhY2tJRCxtc2dJRCxwcm94eVBhcm1zKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBPYmplY3QgY3JlYXRlTmV4dFBhcm0oT2JqZWN0IHApIHsKLQkJCQlpZiAoIShwIGluc3RhbmNlb2YgSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheSkpIHsKLQkJCQkJcmV0dXJuIGZCZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUlERUJlYW5Qcm94eVdpdGgocCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJT2JqZWN0W10gYXJyYXkgPSAoKElDYWxsYmFja0hhbmRsZXIuVHJhbnNtaXRhYmxlQXJyYXkpIHApLmdldEFycmF5KCk7Ci0JCQkJCU9iamVjdFtdIHBhcm0gPSBuZXcgT2JqZWN0W2FycmF5Lmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXBhcm1baV0gPSBjcmVhdGVOZXh0UGFybShhcnJheVtpXSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHBhcm07Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUNhbGxiYWNrSGFuZGxlciNjYWxsYmFja0FzQ29uc3RhbnRzKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgT2JqZWN0IGNhbGxiYWNrQXNDb25zdGFudHMoaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCwgT2JqZWN0IHBhcm0pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJCQlyZXR1cm4gZkNhbGxiYWNrUmVnaXN0cnkudm1DYWxsYmFjayhjYWxsYmFja0lELG1zZ0lELHBhcm0pOwotCQkJfQotCQl9KTsKLQkJCi0JfSBjYXRjaCAoIENvbW1hbmRFeGNlcHRpb24gZXhjICkgewotCQlyZXR1cm4gbnVsbDsJCi0JfQotfQotCi1wdWJsaWMgT3V0cHV0U3RyZWFtIHJlcXVlc3RTdHJlYW0oaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCXJldHVybiBmQ2FsbGJhY2tSZWdpc3RyeS5yZXF1ZXN0U3RyZWFtKGNhbGxiYWNrSUQsbXNnSUQpOwotfQotcHVibGljIElWTVNlcnZlciBnZXRJVk1TZXJ2ZXIoKSB7Ci0JcmV0dXJuIGZDYWxsYmFja1JlZ2lzdHJ5LmZQcm94eUZhY3RvcnlSZWdpc3RyeTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lJREVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSUlERUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJiYWU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSUlERUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSUlERUJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHk7Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBhbGxvd3MgdGhlIElERSBWTSB0byBnZXQgdGhlIGFjdHVhbCBiZWFuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJREVCZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLS8qKgotICogR2V0IHRoZSBhY3R1YWwgbGl2ZSBiZWFuLiAKLSAqIFVTRSB3aXRoIGV4dHJlbWUgY2FyZS4KLSAqLwotcHVibGljIE9iamVjdCBnZXRCZWFuKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVEaW1lbnNpb25CZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERURpbWVuc2lvbkJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ViMDY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERURpbWVuc2lvbkJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERURpbWVuc2lvbkJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklEaW1lbnNpb25CZWFuUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVPYmplY3RCZWFuUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIElERURpbWVuc2lvbkJlYW5Qcm94eSBleHRlbmRzIElERU9iamVjdEJlYW5Qcm94eSBpbXBsZW1lbnRzIElEaW1lbnNpb25CZWFuUHJveHkgewotCQotCXByb3RlY3RlZCBEaW1lbnNpb24gZkRpbWVuc2lvbjsKLQotSURFRGltZW5zaW9uQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSxPYmplY3QgYURpbWVuc2lvbiwgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpewotCXN1cGVyKGFSZWdpc3RyeSxhRGltZW5zaW9uLGFCZWFuVHlwZVByb3h5KTsKLQlmRGltZW5zaW9uID0gKERpbWVuc2lvbilhRGltZW5zaW9uOwotfQotcHVibGljIGludCBnZXRXaWR0aCgpewotCXJldHVybiBmRGltZW5zaW9uLndpZHRoOwotfQotcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IGFXaWR0aCl7Ci0JZkRpbWVuc2lvbi53aWR0aCA9IGFXaWR0aDsKLX0KLXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCl7Ci0JcmV0dXJuIGZEaW1lbnNpb24uaGVpZ2h0OwotfQotcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBhSGVpZ2h0KXsKLQlmRGltZW5zaW9uLmhlaWdodCA9IGFIZWlnaHQ7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTaXplKElEaW1lbnNpb25CZWFuUHJveHkgYUJlYW5Qcm94eSl7Ci0JZkRpbWVuc2lvbi5zZXRTaXplKG5ldyBEaW1lbnNpb24oYUJlYW5Qcm94eS5nZXRXaWR0aCgpLGFCZWFuUHJveHkuZ2V0SGVpZ2h0KCkpKTsKLX0KLXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQlmRGltZW5zaW9uLndpZHRoID0gd2lkdGg7Ci0JZkRpbWVuc2lvbi5oZWlnaHQgPSBoZWlnaHQ7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVEaW1lbnNpb25CZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVEaW1lbnNpb25CZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzhhODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFRGltZW5zaW9uQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERURpbWVuc2lvbkJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLio7Ci0KLXB1YmxpYyBjbGFzcyBJREVEaW1lbnNpb25CZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0KLUlERURpbWVuc2lvbkJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KXsKLQl0aGlzKGFSZWdpc3RyeSxEaW1lbnNpb24uY2xhc3MpOwotfQotCi1wcml2YXRlIElERURpbWVuc2lvbkJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyB0eXBlKXsKLQlzdXBlcihhUmVnaXN0cnksIHR5cGUpOwotfQotCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQotCXJldHVybiBuZXcgSURFRGltZW5zaW9uQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYW5PYmplY3QsIHRoaXMpOwotCi19Ci1JREVEaW1lbnNpb25CZWFuUHJveHkgY3JlYXRlRGltZW5zaW9uQmVhblByb3h5KGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JcmV0dXJuIG5ldyBJREVEaW1lbnNpb25CZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBEaW1lbnNpb24od2lkdGgsaGVpZ2h0KSx0aGlzKTsKLX0KLQkvKgotCSAqIEBzZWUgSURFQmVhblR5cGVQcm94eSNuZXdCZWFuVHlwZUZvckNsYXNzKENsYXNzKQotCSAqLwotCXB1YmxpYyBJREVCZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoQ2xhc3MgdHlwZSkgewotCQlyZXR1cm4gbmV3IElERURpbWVuc2lvbkJlYW5UeXBlUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCB0eXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVBvaW50QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVQb2ludEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA3NGNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVBvaW50QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogSURFUG9pbnRCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBqYXZhLmF3dC5Qb2ludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQb2ludEJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERU9iamVjdEJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERVByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgSURFUG9pbnRCZWFuUHJveHkgZXh0ZW5kcyBJREVPYmplY3RCZWFuUHJveHkgaW1wbGVtZW50cyBJUG9pbnRCZWFuUHJveHkgewotCQotCXByb3RlY3RlZCBQb2ludCBmUG9pbnQ7Ci0KLUlERVBvaW50QmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSxPYmplY3QgYVBvaW50LCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSl7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LGFQb2ludCxhQmVhblR5cGVQcm94eSk7Ci0JZlBvaW50ID0gKFBvaW50KWFQb2ludDsKLX0KLXB1YmxpYyBpbnQgZ2V0WCgpewotCXJldHVybiBmUG9pbnQueDsKLX0KLXB1YmxpYyB2b2lkIHNldFgoaW50IGFuWCl7Ci0JZlBvaW50LnggPSBhblg7Ci19Ci1wdWJsaWMgaW50IGdldFkoKXsKLQlyZXR1cm4gZlBvaW50Lnk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRZKGludCBhWSl7Ci0JZlBvaW50LnkgPSBhWTsKLX0KLXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQb2ludEJlYW5Qcm94eSBhQmVhblByb3h5KXsKLQlmUG9pbnQuc2V0TG9jYXRpb24obmV3IFBvaW50KGFCZWFuUHJveHkuZ2V0WCgpLGFCZWFuUHJveHkuZ2V0WSgpKSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihpbnQgYW5YLCBpbnQgYVkpewotCWZQb2ludC54ID0gYW5YOwotCWZQb2ludC55ID0gYVk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVQb2ludEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVBvaW50QmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDI0MjZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVBvaW50QmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVBvaW50QmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS4qOwotCi1wdWJsaWMgY2xhc3MgSURFUG9pbnRCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0KLUlERVBvaW50QmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpewotCXRoaXMoYVJlZ2lzdHJ5LFBvaW50LmNsYXNzKTsKLX0KLXByaXZhdGUgSURFUG9pbnRCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgdHlwZSl7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LHR5cGUpOwotfQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0KLQlyZXR1cm4gbmV3IElERVBvaW50QmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYW5PYmplY3QsIHRoaXMpOwotCi19Ci1JREVQb2ludEJlYW5Qcm94eSBjcmVhdGVQb2ludEJlYW5Qcm94eShpbnQgeCwgaW50IHkpewotCXJldHVybiBuZXcgSURFUG9pbnRCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBQb2ludCh4LHkpLHRoaXMpOwotfQotCS8qCi0JICogQHNlZSBJREVCZWFuVHlwZVByb3h5I25ld0JlYW5UeXBlRm9yQ2xhc3MoQ2xhc3MpCi0JICovCi0JcHVibGljIElERUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhDbGFzcyB0eXBlKSB7Ci0JCXJldHVybiBuZXcgSURFUG9pbnRCZWFuVHlwZVByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgdHlwZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVSZWN0YW5nbGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2FkNWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVPYmplY3RCZWFuUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIElERVJlY3RhbmdsZUJlYW5Qcm94eSBleHRlbmRzIElERU9iamVjdEJlYW5Qcm94eSBpbXBsZW1lbnRzIElSZWN0YW5nbGVCZWFuUHJveHkgewotCQotCXByb3RlY3RlZCBSZWN0YW5nbGUgZlJlY3RhbmdsZTsKLQotSURFUmVjdGFuZ2xlQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSxPYmplY3QgYVJlY3RhbmdsZSwgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpewotCXN1cGVyKGFSZWdpc3RyeSxhUmVjdGFuZ2xlLGFCZWFuVHlwZVByb3h5KTsKLQlmUmVjdGFuZ2xlID0gKFJlY3RhbmdsZSlhUmVjdGFuZ2xlOwotfQotcHVibGljIGludCBnZXRYKCl7Ci0JcmV0dXJuIGZSZWN0YW5nbGUueDsKLX0KLXB1YmxpYyB2b2lkIHNldFgoaW50IGFuWCl7Ci0JZlJlY3RhbmdsZS54ID0gYW5YOwotfQotcHVibGljIGludCBnZXRZKCl7Ci0JcmV0dXJuIGZSZWN0YW5nbGUueTsKLX0KLXB1YmxpYyB2b2lkIHNldFkoaW50IGFZKXsKLQlmUmVjdGFuZ2xlLnkgPSBhWTsKLX0KLXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCl7Ci0JcmV0dXJuIGZSZWN0YW5nbGUuaGVpZ2h0OwotfQotcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBhSGVpZ2h0KXsKLQlmUmVjdGFuZ2xlLmhlaWdodCA9IGFIZWlnaHQ7Ci19Ci1wdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgYVdpZHRoKXsKLQlmUmVjdGFuZ2xlLndpZHRoID0gYVdpZHRoOwotfQotcHVibGljIGludCBnZXRXaWR0aCgpewotCXJldHVybiBmUmVjdGFuZ2xlLndpZHRoOwotfQotcHVibGljIHZvaWQgc2V0Qm91bmRzKElSZWN0YW5nbGVCZWFuUHJveHkgYUJlYW5Qcm94eSl7Ci0JZlJlY3RhbmdsZS5zZXRCb3VuZHMoYUJlYW5Qcm94eS5nZXRYKCksYUJlYW5Qcm94eS5nZXRZKCksYUJlYW5Qcm94eS5nZXRXaWR0aCgpLGFCZWFuUHJveHkuZ2V0SGVpZ2h0KCkpOwotfQotcHVibGljIHZvaWQgc2V0Qm91bmRzKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQlmUmVjdGFuZ2xlLnNldEJvdW5kcyh4LHksd2lkdGgsaGVpZ2h0KTsKLX0KLXB1YmxpYyB2b2lkIHNldFNpemUoSURpbWVuc2lvbkJlYW5Qcm94eSBhQmVhblByb3h5KXsKLQlmUmVjdGFuZ2xlLnNldFNpemUoYUJlYW5Qcm94eS5nZXRXaWR0aCgpLGFCZWFuUHJveHkuZ2V0V2lkdGgoKSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihJUG9pbnRCZWFuUHJveHkgYUJlYW5Qcm94eSl7Ci0JZlJlY3RhbmdsZS5zZXRMb2NhdGlvbihhQmVhblByb3h5LmdldFgoKSxhQmVhblByb3h5LmdldFkoKSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihpbnQgeCwgaW50IHkpewotCWZSZWN0YW5nbGUuc2V0TG9jYXRpb24oeCx5KTsKLX0KLXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQlmUmVjdGFuZ2xlLnNldFNpemUod2lkdGgsaGVpZ2h0KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlY3RhbmdsZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlY3RhbmdsZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3Njg3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuKjsKLQotcHVibGljIGNsYXNzIElERVJlY3RhbmdsZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQotSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpewotCXRoaXMoYVJlZ2lzdHJ5LFJlY3RhbmdsZS5jbGFzcyk7Ci19Ci0KLXByaXZhdGUgSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIHR5cGUpewotCXN1cGVyKGFSZWdpc3RyeSx0eXBlKTsKLX0KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCi0JcmV0dXJuIG5ldyBJREVSZWN0YW5nbGVCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhbk9iamVjdCwgdGhpcyk7Ci0KLX0KLUlERVJlY3RhbmdsZUJlYW5Qcm94eSBjcmVhdGVSZWN0YW5nbGVCZWFuUHJveHkoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCXJldHVybiBuZXcgSURFUmVjdGFuZ2xlQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxuZXcgUmVjdGFuZ2xlKHgseSx3aWR0aCxoZWlnaHQpLHRoaXMpOwotfQotCS8qCi0JICogQHNlZSBJREVCZWFuVHlwZVByb3h5I25ld0JlYW5UeXBlRm9yQ2xhc3MoQ2xhc3MpCi0JICovCi0JcHVibGljIElERUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhDbGFzcyB0eXBlKSB7Ci0JCXJldHVybiBuZXcgSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIHR5cGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUmVnaXN0ZXJBV1QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlZ2lzdGVyQVdULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZmIwZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUmVnaXN0ZXJBV1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5hd3Q7Ci0vKgotICogICRSQ1NmaWxlOiBJREVSZWdpc3RlckFXVC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVQcm94eUZhY3RvcnlSZWdpc3RyeTsKLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBBV1QgZmFjdG9yaWVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSURFUmVnaXN0ZXJBV1QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckFXVChJREVQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQluZXcgSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0JCW5ldyBJREVTdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkocmVnaXN0cnkpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVTdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQ4YzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVQcm94eUZhY3RvcnlSZWdpc3RyeTsKLS8qKgotICogU3RhbmRhcmQgQVdUIEJlYW4gUHJveHkgRmFjdG9yeS4KLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCByZWZlcmVuY2VkCi0gKiBvdXRzaWRlIG9mIHRoZSBwYWNrYWdlIG90aGVyIHRoYW4gdGhyb3VnaCB0aGUgaW50ZXJmYWNlLgotICovCi1jbGFzcyBJREVTdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkgaW1wbGVtZW50cyBJU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5IHsKLQotCWZpbmFsIElERVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkgZkFXVEJlYW5UeXBlRmFjdG9yeTsKLQkKLXB1YmxpYyBJREVTdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeSkgewotCWZhY3RvcnkucmVnaXN0ZXJCZWFuUHJveHlGYWN0b3J5KElTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkuUkVHSVNUUllfS0VZLCB0aGlzKTsKLQlmQVdUQmVhblR5cGVGYWN0b3J5ID0gKElERVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkpZmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeUV4dGVuc2lvbihJREVTdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5LkJFQU5fVFlQRV9GQUNUT1JZX0tFWSk7Ci19Ci1wdWJsaWMgSURpbWVuc2lvbkJlYW5Qcm94eSBjcmVhdGVEaW1lbnNpb25CZWFuUHJveHlXaXRoKGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JcmV0dXJuIGZBV1RCZWFuVHlwZUZhY3RvcnkuZGltZW5zaW9uVHlwZS5jcmVhdGVEaW1lbnNpb25CZWFuUHJveHkod2lkdGgsaGVpZ2h0KTsKLX0KLQotcHVibGljIElQb2ludEJlYW5Qcm94eSBjcmVhdGVQb2ludEJlYW5Qcm94eVdpdGgoaW50IHgsIGludCB5KXsKLQlyZXR1cm4gZkFXVEJlYW5UeXBlRmFjdG9yeS5wb2ludFR5cGUuY3JlYXRlUG9pbnRCZWFuUHJveHkoeCx5KTsKLX0KLXB1YmxpYyBJUmVjdGFuZ2xlQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCXJldHVybiBmQVdUQmVhblR5cGVGYWN0b3J5LnJlY3RhbmdsZVR5cGUuY3JlYXRlUmVjdGFuZ2xlQmVhblByb3h5KHgseSx3aWR0aCxoZWlnaHQpOwotfQotcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODY3MDlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElERVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLio7Ci0KLS8qKgotICogQmVhblR5cGUgZmFjdG9yeSBzdGFuZGFyZCBBV1QgYmVhbiB0eXBlcy4gVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGl0IHNob3VsZG4ndCBiZSByZWZlcmVuY2VkIG91dHNpZGUgdGhlIHBhY2thZ2UuIEl0IHNob3VsZCBvbmx5IGJlCi0gKiBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCi0gKi8KLWNsYXNzIElERVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkgaW1wbGVtZW50cyBJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fVFlQRV9GQUNUT1JZX0tFWSA9ICJqYXZhLmF3dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeVJlZ2lzdHJ5OwotCi0JcHJvdGVjdGVkIGZpbmFsIElERURpbWVuc2lvbkJlYW5UeXBlUHJveHkgZGltZW5zaW9uVHlwZTsKLQotCXByb3RlY3RlZCBmaW5hbCBJREVQb2ludEJlYW5UeXBlUHJveHkgcG9pbnRUeXBlOwotCi0JcHJvdGVjdGVkIGZpbmFsIElERVJlY3RhbmdsZUJlYW5UeXBlUHJveHkgcmVjdGFuZ2xlVHlwZTsKLQotCUlERVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWZGYWN0b3J5UmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWZGYWN0b3J5UmVnaXN0cnkucmVnaXN0ZXJCZWFuVHlwZVByb3h5RmFjdG9yeShCRUFOX1RZUEVfRkFDVE9SWV9LRVksIHRoaXMpOwotCQlkaW1lbnNpb25UeXBlID0gbmV3IElERURpbWVuc2lvbkJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JCXBvaW50VHlwZSA9IG5ldyBJREVQb2ludEJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JCXJlY3RhbmdsZVR5cGUgPSBuZXcgSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5I2dldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSURFQmVhblR5cGVQcm94eSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyBjbGFzc05hbWUpIHsKLQotCQlpZiAoImphdmEuYXd0LkRpbWVuc2lvbiIuZXF1YWxzKGNsYXNzTmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBkaW1lbnNpb25UeXBlOwotCQllbHNlIGlmICgiamF2YS5hd3QuUG9pbnQiLmVxdWFscyhjbGFzc05hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcG9pbnRUeXBlOwotCQllbHNlIGlmICgiamF2YS5hd3QuUmVjdGFuZ2xlIi5lcXVhbHMoY2xhc3NOYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlY3RhbmdsZVR5cGU7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSkKLQkgKi8KLQlwdWJsaWMgSURFQmVhblR5cGVQcm94eSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyBjbGFzc05hbWUsIElCZWFuVHlwZVByb3h5IGJlYW5UeXBlUHJveHkpIHsKLQotCQlyZXR1cm4gZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShjbGFzc05hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgSVByb3h5QmVhblR5cGUgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUsIElFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkodHlwZU5hbWUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHlGYWN0b3J5I3Rlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9Db21tYW5kRXJyb3JFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9Db21tYW5kRXJyb3JFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyYjE0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvQ29tbWFuZEVycm9yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogQ29tbWFuZEVycm9yRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotLyoqCi0gKiBBbiBlcnJvciByZXR1cm4gZnJvbSBhIGNvbW1hbmQuIFRoaXMgaXMgY2xlYW4gcmV0dXJuIGluIHRoYXQKLSAqIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIHZhbGlkIGFuZCBhbGl2ZS4KLSAqIEFmdGVyIGl0IGhhcyBiZWVuIHByb2Nlc3NlZCB0aGUgZGF0YSB3aWxsIGJlIHRoZSB2YWx1ZSByZXRyaWV2ZWQKLSAqIG91dCBvZiB0aGUgdmFsdWVvYmplY3QgYW5kIG1hZGUgaW50byBhIHByb3h5LgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEVycm9yRXhjZXB0aW9uIGV4dGVuZHMgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNzAxNzUyMDM1NjA2NTkzMzA1TDsKLQlwcml2YXRlIGZpbmFsIE9iamVjdCBmRXJyb3JPYmplY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgZkVycm9yQ29kZTsKLQkKLQlwdWJsaWMgQ29tbWFuZEVycm9yRXhjZXB0aW9uKGludCBlcnJvckNvZGUsIENvbW1hbmRzLlZhbHVlT2JqZWN0IGVycm9yRGF0YSkgewotCQlzdXBlcihlcnJvckRhdGEuY2xvbmUoKSk7CS8vIENsb25lIGl0IGJlY2F1c2UgdHlwaWNhbGx5IHRoZXNlIGdldCByZXVzZWQgYW5kIGNsZWFyZWQgb3V0LiBUaGlzIHdheSB3ZSBoYXZlIG91ciBvd24uCi0JCWZFcnJvck9iamVjdCA9IG51bGw7Ci0JCWZFcnJvckNvZGUgPSBlcnJvckNvZGU7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1zZywgaW50IGVycm9yQ29kZSwgQ29tbWFuZHMuVmFsdWVPYmplY3QgZXJyb3JEYXRhLCBPYmplY3QgZXJyb3JPYmplY3QpIHsKLQkJc3VwZXIobXNnLCBlcnJvckRhdGEuY2xvbmUoKSk7Ci0JCWZFcnJvck9iamVjdCA9IGVycm9yT2JqZWN0OwotCQlmRXJyb3JDb2RlID0gZXJyb3JDb2RlOwkJCi0JfQotCQotCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIChDb21tYW5kcy5WYWx1ZU9iamVjdCkgZ2V0RXhjZXB0aW9uRGF0YSgpOwotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNSZWNvdmVyYWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7CS8vIENvbW1hbmQgZXJyb3JzIGFyZSByZWNvdmVyYWJsZS4KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlcnJvciBjb2RlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb2RlKCkgewotCQlyZXR1cm4gZkVycm9yQ29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlcnJvciBvYmplY3QgYWZ0ZXIgY29udmVyc2lvbiB0byBwcm94eSBmb3JtYXQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFcnJvck9iamVjdCgpIHsKLQkJcmV0dXJuIGZFcnJvck9iamVjdDsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiLS0gRXJyb3IgY29kZToiK2dldEVycm9yQ29kZSgpICsgKGdldFZhbHVlKCkgIT0gbnVsbCA/ICIgVmFsdWUgZGF0YTpcIiIgKyBnZXRWYWx1ZSgpLmdldEFzT2JqZWN0KCkgKyAiXCIiIDogIiAiKSArIChmRXJyb3JPYmplY3QgIT0gbnVsbCA/ICIgRXJyb3Igb2JqZWN0OlwiIitmRXJyb3JPYmplY3QudG9TdHJpbmcoKSsiXCIiIDogIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL0NvbW1hbmRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvQ29tbWFuZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MGYzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvQ29tbWFuZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IENvbW1hbmRzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE1ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLS8qKgotICogVGhlIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHBhc3NlZCBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuCi0gKiBjbGllbnQgYW5kIHNlcnZlci4gQW5kIG90aGVyIGNvbnN0YW50cy4KLSAqCi0gKiAtIENvbnRhaW5zIGhlbHBlciBtZXRob2RzIGZvciByZWFkaW5nL3dyaXRpbmcgY29tbWFuZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kcyB7Ci0JLy8gVGhlIGNvbW1hbmRzIHdpbGwgYmUgd3JpdHRlbiBpbiB3cml0ZUJ5dGUgZm9ybWF0IC4KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJ5dGUKLQkJR0VUX0NMQVNTID0gMSwJCS8vIEdldCB0aGUgY2xhc3Mgb2JqZWN0LAotCQlWQUxVRSA9IDIsCQkvLyBSZXR1cm5pbmcgYSB2YWx1ZQotCQlRVUlUX0NPTk5FQ1RJT04gPSA0LAkvLyBDbG9zZSB0aGlzIGNvbm5lY3Rpb24KLQkJVEVSTUlOQVRFX1NFUlZFUiA9IDUsCS8vIFRlcm1pbmF0ZSB0aGUgZW50aXJlIHNlcnZlci4KLQkJRVJST1IgPSA2LAkJLy8gUmV0dXJuaW5nIGFuIGVycm9yCi0JCVJFTEVBU0VfT0JKRUNUID0gNywJLy8gQW4gb2JqZWN0IGlzIG5vIGxvbmdlciBuZWVkZWQgb24gdGhlIGNsaWVudCBzaWRlLCBzbwotCQkJCQkvLyBpdCBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2ZXIgaWQgdGFibGUgYW5kIHJlbGVhc2VkLgotCQlHRVRfQ0xBU1NfUkVUVVJOID0gOCwJLy8gVGhlIHJldHVybiBjb21tYW5kIGZyb20gR0VUX0NMQVNTCi0JCS8vIE9ic29sZXRlLCBub3QgdXNlZCBhbnltb3JlIEdFVF9NRVRIT0QgPSA5LAkvLyBSZXR1cm4gdGhlIGlkIGZvciBhIG1ldGhvZAotCQkvLyBPYnNvbGV0ZSwgbm90IHVzZWQgYW55bW9yZSBHRVRfQ1RPUiA9IDEwLAkJLy8gUmV0dXJuIHRoZSBpZCBmb3IgYSBjb25zdHJ1Y3RvcgkJCi0JCU5FV19JTklUX1NUUklORyA9IDExLAkvLyBDcmVhdGUgYSBuZXcgYmVhbiB1c2luZyB0aGUgaW5pdCBzdHJpbmcKLQkJR0VUX0NMQVNTX0ZST01fSUQgPSAxMiwJLy8gV2UgaGF2ZSBhbiBJRCwgcmV0dXJuIHRoZSBjbGFzcyBpbmZvIGZvciB0aGlzIGlkLgotCQlHRVRfQ0xBU1NfSURfUkVUVVJOID0gMTMsCS8vIFRoZSByZXR1cm4gY29tbWFuZCBmcm9tIEdFVF9DTEFTU19GUk9NX0lECi0JCUdFVF9PQkpFQ1RfREFUQSA9IDE0LAkvLyBXZSBoYXZlIGFuIElELCBidXQgd2UgZG9uJ3QgaGF2ZSB0aGUgaW5mbywgcmV0dXJuIGl0LiBUaGlzIGlzIGEgCi0JCQkJCS8vIGNvcnJlY3RpdmUgY29tbWFuZCBvbmx5LiBUaGlzIHdvdWxkIGhhcHBlbiBpZiBmb3Igc29tZSBzdHJhbmdlCi0JCQkJCS8vIHJlYXNvbiB0aGUgcHJveHkgaGFzIGJlZW4gcmVtb3ZlZCBidXQgaGFzIG5vdCBiZWVuIHJlbGVhc2VkLiBUaGlzCi0JCQkJCS8vIHJlYWxseSBzaG91bGRuJ3QgaGFwcGVuIGV4Y2VwdCBhcyBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4KLQkJCQkJLy8gR0MgYW5kIHJldHVybmluZyBpZCBmcm9tIHRoZSBzZXJ2ZXIuCi0JCUlOVk9LRSA9IDE1LAkJLy8gSW52b2tlIGEgbWV0aG9kLgotCQotCQotCQkvLyBUaGVzZSBjb21tYW5kcyBhcmUgdG8gdGhlIE1hc3RlciBTZXJ2ZXIgdGhyZWFkIGluIHRoZSBJREUuCi0JCUFMSVZFID0gMTYsCS8vIEFyZSB5b3UgYWxpdmU/Ci0JCVJFTU9URV9TVEFSVEVEID0gMTcsCS8vIFJlbW90ZSBWTSBoYXMgc3RhcnRlZC4KLQkJQVRUQUNIX0NBTExCQUNLID0gMTgsCS8vIEF0dGFjaCB0byBhIGNhbGxiYWNrIHRocmVhZCBvbiB0aGUgSURFIHNpZGUuIFRoZSByZW1vdGUgdm0gd2lsbCB1c2UgaXRzIHNvY2tldCBhcyB0aGUgY2FsbGJhY2sgc29ja2V0LgotCQkJCQkJCQkvLyBpdCB3aWxsIHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0dGFjaCB3b3JrZWQgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGZhaWxlZC4KLQotCQkvLyBUaGVzZSBhcmUgbW9yZSByZWd1bGFyIGNvbW1hbmRzLiBUaGV5IHdlcmUgaGlzdG9yaWNhbGx5IGFkZGVkIGFmdGVyIHRoZSBtYXN0ZXIgc2VydmVyIHRocmVhZCBjb21tYW5kcywgc28KLQkJLy8gdGhleSBhcmUgc2hvd24gaGVyZSBhZnRlciB0aGVtIGFuZCB3aXRoIG51bWJlcnMgZ3JlYXRlciB0aGFuIHRoZW0uCi0JCUVYUFJFU1NJT05fVFJFRV9DT01NQU5EID0gMTksCS8vIEFuIGV4cHJlc3Npb24gdHJlZSBzdWJjb21tYW5kIGhhcyBjb21lIGluLgotCQlJTlZPS0VfV0lUSF9NRVRIT0RfUEFTU0VEID0gMjAsCS8vIEludm9rZSB3aGVyZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZCBpcyBwYXNzZWQgaW4gd2l0aCB0aGUgY29tbWFuZC4KLQkJR0VUX0FSUkFZX0NPTlRFTlRTID0gMjE7CS8vIEdldCB0aGUgZmlyc3QgZGltZW5zaW9uIGNvbnRlbnRzIGFzIGFuIGFycmF5IG9mIGlkcyBhbmQgc2VuZCB0aGVtIGJhY2suCi0JCi0JCQotCS8vIENhbGxiYWNrIGNvbW1hbmRzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBieXRlCi0JCUNBTExCQUNLID0gKGJ5dGUpIDI1NSwJLy8gQSBjYWxsYmFjayBoYXMgY29tZSBpbi4KLQkJQ0FMTEJBQ0tfRE9ORSA9IChieXRlKSAyNTQsCS8vIEEgY2FsbGJhY2sgZG9uZSBjb21tYW5kLCBzZW50IHRvIHRoZSByZW1vdGUgdm0gdXBvbiBjYWxsYmFjayBjb21wbGV0aW9uLgotCQlDQUxMQkFDS19TVFJFQU0gPSAoYnl0ZSkgMjUzLAkvLyBBIGNhbGxiYWNrIGZvciBhIGJ5dGUgc3RyZWFtIGhhcyBjb21lIGluLgotCQkJCQkJCQkvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYWxsYmFjay4gV2hlbiB0aGlzIGNvbWVzIGluIGEgc3BlY2lhbAotCQkJCQkJCQkvLyBpbnB1dCBzdHJlYW0gd2lsbCBiZSBjcmVhdGVkIHRoYXQgd2lsbCB0YWtlIG92ZXIgY29udHJvbCBvZgotCQkJCQkJCQkvLyB0aGUgY29ubmVjdGlvbiB1bnRpbCB0aGUgc3RyZWFtIGlzIHRlcm1pbmF0ZWQgb24gdGhlIHJlbW90ZQotCQkJCQkJCQkvLyBzaWRlLiBBdCB0aGlzIHRpbWUgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSByZXR1cm5lZC4KLQkJQ0FMTEJBQ0tfU1RSRUFNX1RFUk1JTkFURSA9IChieXRlKSAyNTI7CS8vIEEgY2FsbGJhY2sgc3RyZWFtIGlzIGFza2VkIHRvIHRlcm1pbmF0ZSBlYXJseS4KLQkJCi0JLy8gVGhlIGVycm9yIHZhbHVlcyBmcm9tIHRoZSBjb21tYW5kIG9uIHRoZSBzZXJ2ZXIuCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQKLQkJTk9fRVJST1IgPSAwLAkJCQkvLyBObyBlcnJvciBzdGF0dXMuCi0JCVVOS05PV05fQ09NTUFORF9TRU5UID0gMSwJLy8gQW4gdW5rbm93biBjb21tYW5kIHdhcyBzZW50IHRvIHRoZSBzZXJ2ZXIuIFZhbHVlIGlzIHZvaWQuCi0JCUdFVF9DTEFTU19OT1RfRk9VTkQgPSAyLAkvLyBUaGUgY2xhc3Mgd2FzIG5vdCBmb3VuZCBpbiBHZXRDbGFzcy4gVmFsdWUgaXMgdm9pZC4KLQkJQ0FOTk9UX0VWQUxVQVRFX1NUUklORyA9IDMsCS8vIEV2YWx1YXRvciBjb3VsZG4ndCBldmFsdWF0ZSB0aGUgaW5pdCBzdHJpbmcuIFRvbyBjb21wbGljYXRlZC4gVmFsdWUgaXMgYSB0aHJvd2FibGUgb2YgdGhlIHdyYXBwZXJlZCBJbml0IHN0cmluZyBlcnJvci4KLQkJQ0xBU1NfQ0FTVF9FWENFUFRJT04gPSA0LAkvLyBUaGUgcmVzdWx0IGlzIG5vdCBhc3NpZ25hYmxlIHRvIHRoZSBleHBlY3RlZCB0eXBlLiBWYWx1ZSBpcyB2b2lkLgotCQlHRVRfTUVUSE9EX05PVF9GT1VORCA9IDUsCS8vIE1ldGhvZCByZXF1ZXN0ZWQgd2Fzbid0IGZvdW5kLiBWYWx1ZSBpcyB2b2lkLgotCQlUSFJPV0FCTEVfU0VOVCA9IDYsCQkJLy8gQSBUaHJvd2FibGUgaXMgYmVpbmcgc2VudCBiYWNrIGFzIHRoZSBlcnJvciwgbm90IGFzIGp1c3QgZGF0YSBmb3IgdGhlIGVycm9yLiBWYWx1ZSBpcyB0aGUgVGhyb3dhYmxlLgotCQlDQUxMQkFDS19SVU5USU1FX0VYQ0VQVElPTiA9IDcsCS8vIEEgcnVudGltZSBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGEgY2FsbGJhY2suIFRoZSBkYXRhIGlzIHRoZSBtZXNzYWdlLgotCQlDQUxMQkFDS19OT1RfUkVHSVNURVJFRCA9IDgsCi0JCU1BWF9FUlJPUl9DT0RFID0gQ0FMTEJBQ0tfTk9UX1JFR0lTVEVSRUQ7CS8vIFRoaXMgaXMganVzdCB0aGUgbWF4IGNvZGUuIE5vdCBhY3R1YWxseSBzZW50LiBVc2VkIGFzIGEgZmxhZy4KLQkJCi0JLy8gUHJlZGVmaW5lZCBzdGFuZGFyZCBpZCdzIGZvciBzdGFuZGFyZCBjbGFzc2VzL29iamVjdHMuIEJvdGggc2lkZXMgd2lsbCBhc3N1bWUgdGhlc2UgaWQncyBoYXZlIGJlZW4gYXNzaWduZWQKLQkvLyB0byB0aGVzZSBjbGFzc2VzL3R5cGVzL29iamVjdHMKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludAotCQlOT1RfQU5fSUQgPSAtMSwJLy8gVGhpcyB2YWx1ZSBtZWFucyBpdCBpcyBub3QgYW4gaWQuIEl0IGlzIG5ldmVyIGEgdmFsaWQgaWQuCi0JCVZPSURfVFlQRSA9IDAsCi0JCUJPT0xFQU5fVFlQRSA9IDEsCi0JCUJPT0xFQU5fQ0xBU1MgPSAyLAotCQlJTlRFR0VSX1RZUEUgPSAzLAotCQlJTlRFR0VSX0NMQVNTID0gNCwKLQkJQllURV9UWVBFID0gNSwKLQkJQllURV9DTEFTUyA9IDYsCi0JCUNIQVJBQ1RFUl9UWVBFID0gNywKLQkJQ0hBUkFDVEVSX0NMQVNTID0gOCwKLQkJRE9VQkxFX1RZUEUgPSA5LAotCQlET1VCTEVfQ0xBU1MgPSAxMCwKLQkJRkxPQVRfVFlQRSA9IDExLAotCQlGTE9BVF9DTEFTUyA9IDEyLAotCQlTSE9SVF9UWVBFID0gMTMsCi0JCVNIT1JUX0NMQVNTID0gMTQsCi0JCUxPTkdfVFlQRSA9IDE1LAotCQlMT05HX0NMQVNTID0gMTYsCi0JCVNUUklOR19DTEFTUyA9IDE3LAotCQlCSUdfREVDSU1BTF9DTEFTUyA9IDE4LAotCQlCSUdfSU5URUdFUl9DTEFTUyA9IDE5LAotCQlOVU1CRVJfQ0xBU1MgPSAyMCwKLQkJVEhST1dBQkxFX0NMQVNTID0gMjEsCi0JCUNMQVNTX0NMQVNTID0gMjIsCi0JCU9CSkVDVF9DTEFTUyA9IDIzLAotCQlBQ0NFU1NJQkxFT0JKRUNUX0NMQVNTID0gMjQsCi0JCU1FVEhPRF9DTEFTUyA9IDI1LAotCQlGSUVMRF9DTEFTUyA9IDI2LAotCQlDT05TVFJVQ1RPUl9DTEFTUyA9IDI3LAotCQlHRVRfTUVUSE9EX0lEID0gMjgsCS8vIENsYXNzLmdldE1ldGhvZCguLi4pIHByZWRlZmluZWQgaWQuCi0JCUlWTVNFUlZFUl9DTEFTUyA9IDI5LAkvLyBJVk1TZXJ2ZXIuY2xhc3MKLQkJSUNBTExCQUNLX0NMQVNTID0gMzAsCS8vIElDYWxsYmFjay5jbGFzcwotCQlSRU1PVEVTRVJWRVJfSUQgPSAzMSwJLy8gaWQgb2YgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgaW5zdGFuY2UuCi0JCVJFTU9URVZNU0VSVkVSX0NMQVNTID0gMzIsCS8vIFJlbW90ZVZNU2VydmVyLmNsYXNzCi0JCUlOSVRJQUxJWkVDQUxMQkFDS19NRVRIT0RfSUQgPSAzMywJLy8gSUNhbGxiYWNrLmluaXRpYWxpemVDYWxsYmFjayBtZXRob2QuCi0JCVRIUkVBRF9DTEFTUyA9IDM0LAotCQlFWFBSRVNTSU9OUFJPQ0VTU0VSQ09OVFJPTExFUl9DTEFTUyA9IDM1LAotCQlGSVJTVF9GUkVFX0lEID0gMzY7Ci0JCQkJCi0JLy8gVGhlIHR5cGUgZmxhZ3Mgd3JpdHRlbiBpbiB3cml0ZUJ5dGUgZm9ybWF0Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBieXRlCi0JCVZPSUQgPSBWT0lEX1RZUEUsCS8vIG51bGwgLSBub3RoaW5nIGZvbGxvd3MKLQkJQllURSA9IEJZVEVfVFlQRSwJLy8gYnl0ZSAtIHdyaXRlQnl0ZQotCQlMX0JZVEUgPSBCWVRFX0NMQVNTLAkvLyBqYXZhLmxhbmcuQnl0ZSAtIHdyaXRlQnl0ZQotCQlDSEFSID0gQ0hBUkFDVEVSX1RZUEUsCS8vIGNoYXIgLSB3cml0ZUNoYXIKLQkJTF9DSEFSID0gQ0hBUkFDVEVSX0NMQVNTLAkvLyBqYXZhLmxhbmcuQ2hhcmFjdGVyIC0gd3JpdGVDaGFyCi0JCURPVUJMRSA9IERPVUJMRV9UWVBFLAkvLyBkb3VibGUgLSB3cml0ZURvdWJsZQotCQlMX0RPVUJMRSA9IERPVUJMRV9DTEFTUywJLy8gamF2YS5sYW5nLkRvdWJsZSAtIHdyaXRlRG91YmxlCi0JCUZMT0FUID0gRkxPQVRfVFlQRSwJLy8gZmxvYXQgLSB3cml0ZUZsb2F0Ci0JCUxfRkxPQVQgPSBGTE9BVF9DTEFTUywJLy8gamF2YS5sYW5nLkZsb2F0IC0gd3JpdGVGbG9hdAotCQlJTlQgPSBJTlRFR0VSX1RZUEUsCS8vIGludCAtIHdyaXRlSW50Ci0JCUxfSU5UID0gSU5URUdFUl9DTEFTUywJLy8gamF2YS5sYW5nLkludGVnZXIgLSB3cml0ZUludAotCQlMT05HID0gTE9OR19UWVBFLAkvLyBsb25nIC0gd3JpdGVMb25nCi0JCUxfTE9ORyA9IExPTkdfQ0xBU1MsCS8vIGphdmEubGFuZy5Mb25nIC0gd3JpdGVMb25nCi0JCVNIT1JUID0gU0hPUlRfVFlQRSwJLy8gc2hvcnQgLSB3cml0ZVNob3J0Ci0JCUxfU0hPUlQgPSBTSE9SVF9DTEFTUywJLy8gamF2YS5sYW5nLlNob3J0IC0gd3JpdGVTaG9ydAotCQlCT09MID0gQk9PTEVBTl9UWVBFLAkvLyBib29sZWFuIC0gd3JpdGVCb29sZWFuCi0JCUxfQk9PTCA9IEJPT0xFQU5fQ0xBU1MsCS8vIGphdmEubGFuZy5Cb29sZWFuIC0gd3JpdGVCb29sZWFuCi0JCVNUUklORyA9IFNUUklOR19DTEFTUywJLy8gamF2YS5sYW5nLlN0cmluZyAtIHdyaXRlVVRGCi0JCU9CSkVDVCA9IE9CSkVDVF9DTEFTUywJLy8gT2JqZWN0IC0gc3BlY2lhbCwgc2VlIGJlbG93IChPYmplY3QgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGFuIGFycmF5IChleGNlcHQgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGFueSBvYmplY3RfaWRzLCB0aGF0IGhhcyBhIHNwZWNpYWwgdHlwZSkKLQkJT0JKRUNUX0lEID0gNTAsCS8vIE9iamVjdCBpZGVudGl0eSBrZXkgLSB3cml0ZUludAotCQlORVdfT0JKRUNUX0lEID0gNTEsCS8vIE5ldyBPYmplY3QgaWRlbnRpdHkgKHRoaXMgaXMgYSBuZXcgb2JqZWN0IHRoYXQgZGlkbid0IGV4aXN0IGJlZm9yZSkKLQkJVEhST1cgPSA1MiwJLy8gQW4gZXhjZXB0aW9uIG9jY3VyZWQuIFRoZSB2YWx1ZSBpcyBhIHRocm93YWJsZSwgaXQgaXMgb2YgdGhlIHNhbWUgZm9ybWF0IGFzIE5FV19PQkpFQ1RfSUQuCi0JCUFSUkFZX0lEUyA9IDUzLAkvLyBBbiBhcnJheSBvZiB2YWx1ZXMsIHdoZXJlIHRoZXJlIGFyZSBhdCBsZWFzdCBvbmUgSUQgaW4gdGhlIGFycmF5LiBJZiB0aGVyZSB3ZXJlIG5vCi0JCQkJCQkvLyBJRCdzIChpLmUuIGFsbCBqdXN0IHZhbHVlcyksIHRoZW4gdXNlIE9CSkVDVCB0eXBlIGludGVhZCBhbmQgaGF2ZSBpdCB3cml0dGVuIGFzCi0JCQkJCQkvLyB3cml0ZU9iamVjdC4KLQkJRkxBRyA9IDU0OwkvLyBUaGUgdmFsdWUgaXMgYSBmbGFnIGludC4gSWYgdGhpcyBpcyBhbGxvd2VkIG9uIGEgcmVhZCwgdGhlIGFuSW50IGZpZWxkIHdpbGwgY29udGFpbiB0aGUgZmxhZyB2YWx1ZS4KLQkJCQkKLQkJCi0JCQotCS8vIFVubGVzcyBzcGVjaWZpZWQgYmVsb3csIHRoZSBjb21tYW5kcyBhcmUgb25lIGJ5dGUgbG9uZy4KLQkvLyBBbHNvLCB1bmxlc3Mgc3BlY2lmaWVkIGJlbG93LCB0aGUgY29tbWFuZHMgZG8gbm90IHJldHVybiBhIGNvbmZpcm1hdGlvbiByZXNwb25zZS4KLQkvLwotCS8vIE5PVEU6IFZFUlkgSU1QT1JUQU5ULCBhZnRlciBldmVyeSBjb21tYW5kLCBmbHVzaCgpIHNob3VsZCBiZSB1c2VkIHNvIHRoYXQgdGhlCi0JLy8gdGhlIGRhdGEgaXMgaW1tZWRpYXRlbHkgc2VudCB0byB0aGUgc2VydmVyLiAJCi0JLy8KLQkvLyBuIG1lYW5zIGludCAoZS5nLiAxKQotCS8vIG5iIG1lYW5zIGJ5dGUgKGUuZy4gMWIpCi0JLy8gJ3gnIG1lYW5zIFVuaWNvZGUgY2hhciAoaS5lLiB3cml0ZUNoYXIoKSkKLQkvLyAieHh4IiBtZWFucyBVVEY4IHN0cmluZyAoaS5lLiB3cml0ZVVURikKLQkvLyBib29sIG1lYW5zIGEgb25lIGJ5dGUgYm9vbGVhbiB2YWx1ZQotCS8vCi0JLy8gVGhlIGNvbW1hcyBhcmVuJ3QgYWN0dWFsbHkgd3JpdHRlbiwgdGhleSBhcmUgdXNlZCBhcyBzZXBhcmF0ZXJzIGluIHRoZSBjb21tZW50cyBiZWxvdwotCS8vCi0JLy8gR0VUX0NMQVNTOiAxYiwgImNsYXNzbmFtZSIKLQkvLwkJV2lsbCByZXR1cm4gb24gdGhlIG91dHB1dCBzdHJlYW0gR0VUX0NMQVNTX1JFVFVSTiBjb21tYW5kOgotCS8vCQk4YiwgbjEsIGJvb2wxLCBib29sMiwgInN1cGVyY2xhc3NuYW1lIgotCS8vCQlUaGUgIm4xIiBpcyB0aGUgY2xhc3MgaWQuCi0JLy8JCVRoZSBib29sMSBpcyB3aGV0aGVyIHRoaXMgY2xhc3MgaXMgYW4gaW50ZXJmYWNlICh0cnVlIGlmIGl0IGlzKS4KLQkvLwkJVGhlIGJvb2wyIGlzIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBhYnN0cmFjdCAodHJ1ZSBpZiBpdCBpcykuCQotCS8vCQlUaGUgInN1cGVyY2xhc3NuYW1lIiBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MgKDAgbGVuZ3RoIGlmIG5vIHN1cGVyY2xhc3MpCi0JLy8JCUlmIHRoZSBjbGFzcyBpcyBub3QgZm91bmQsIHRoZW4gaXQgd2lsbCByZXR1cm4gYW4gZXJyb3Igd2l0aCBhIHZhbHVlIGZvciB0aGUgZXJyb3IuCi0JLy8KLQkvLyBHRVRfQ0xBU1NfRlJPTV9JRDogMTJiLCBuCi0JLy8JCVdoZXJlICJuIiBpcyB0aGUgY2xhc3MgaWQuCi0JLy8JCVdpbGwgcmV0dXJuIG9uIHRoZSBvdXRwdXQgc3RyZWFtIEdFVF9DTEFTU19JRF9SRVRVUk4gY29tbWFuZDoJCi0JLy8JCTEzYiwgImNsYXNzbmFtZSIsIGJvb2wxLCBib29sMiwgInN1cGVyY2xhc3NuYW1lIgotCS8vCQlUaGUgYm9vbDEgaXMgd2hldGhlciB0aGlzIGNsYXNzIGlzIGFuIGludGVyZmFjZSAodHJ1ZSBpZiBpdCBpcykuCi0JLy8JCVRoZSBib29sMiBpcyB3aGV0aGVyIHRoaXMgY2xhc3MgaXMgYWJzdHJhY3QgKHRydWUgaWYgaXQgaXMpLgkKLQkvLwotCS8vIFZBTFVFOiAyYiwgdGIsIHZhbHVlCi0JLy8JCVdoZXJlIHRiIGlzIHRoZSB0eXBlIGluIGJ5dGUsIGFuZCB2YWx1ZSBpcyB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgc2hvd24gaW4KLQkvLwkJdGFibGUgYWJvdmUuCi0JLy8JCU9CSkVDVF9JRDogNTBiLCBuCi0JLy8JCQlXaGVyZSAibiIgaXMgdGhlIG9iamVjdCBpZC4KLQkvLwkJTkVXX09CSkVDVF9JRDogNTFiLCBuMSwgbjIKLQkvLwkJCVdoZXJlICJuMSIgaXMgY2xhc3MgT2JqZWN0SUQgb2YgdGhlIG9iamVjdCB0aGF0IHRoZSBvYmplY3RfaWQgKCJuMiIpIGlzIG1hZGUgb2YuCi0JLy8JCU9CSkVDVDogMTliLCBuLCB3cml0ZU9iamVjdAotCS8vCQkJV2hlcmUgIm4iIGlzIHRoZSBjbGFzc09iamVjdElEIG9mIHRoZSBjbGFzcyBvZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCS8vCQkJTk9URTogT2JqZWN0IHNob3VsZCBiZSB1c2VkIG9ubHkgdmVyeSByYXJlbHkuIElkZW50aXR5IGlzIGxvc3QsIGkuZS4KLQkvLwkJCWEgY29weSBpcyBtYWRlIGVhY2ggdGltZSBhbmQgaXQgY2FuJ3QgYmUgcmVmZXJlbmNlZCBiYWNrIG9uIHRoZSByZW1vdGUKLQkvLwkJCVZNLgotCS8vCQlBUlJBWV9JRFM6IDUyYiwgaWQsIG4sIFt0YiwgdmFsdWUsIC4uLl0KLQkvLwkJCVRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgYXJyYXkuIEl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBJRC4gVGhlcmVmb3IgYWxsIG9mIHRoZSAKLQkvLwkJCUZpcnN0IGxldmVsIGVudHJpZXMgYXJlIHZhbHVlIG9iamVjdHMuIAotCS8vCQkJImlkIiBpcyB0aGUgaWQgb2YgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheShlLmcuIGlkIGZvciBPYmplY3QsIG9yIGlmIG11bHRpLWRpbWVuc2lvbmFsIFN0cmluZ1tdICh0aGlzIHdpbGwgcHJvZHVjZSBTdHJpbmdbXVtdKS4KLQkvLwkJCSJuIiBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGFycmF5LiBGb2xsb3dlZCBieSB0aGUgdmFsdWVzLCBvbmUgb2YgdGhlCi0JLy8JCQl2YWx1ZXMgY291bGQgYmUgYW4gQVJSQVlfSURTIHRvby4gVGhlIHJlYWRpbmcvd3JpdGluZyBvZiB0aGVzZSBhcmUgc3BlY2lhbCBiZWNhdXNlCi0JLy8JCQl0aGVyZSBpcyBhIGNhbGxiYWNrIG1lY2hhbmlzbSB0byBwcm9jZXNzIHRoZSBpbmRpdmlkdWFsIGVudHJpZXMuIFRoaXMgaXMgc28gdGhhdAotCS8vCQkJdGVtcCBhcnJheXMgb2YgVmFsdWVPYmplY3RzIHdvbid0IG5lZWQgdG8gYmUgY3JlYXRlZCB0byBoYW5kbGUgdGhpcywgc28gaXQgY2FuCi0JLy8JCQlnbyBkaXJlY3RseSBmcm9tIHRoZSBhcnJheSB0by9mcm9tIHRoZSBzdHJlYW0uCi0JLy8JCQotCS8vIFJFTEVBU0VfT0JKRUNUOiA3YiwgbgotCS8vCQlXaGVyZSB0aGUgbiBpcyB0aGUgb2JqZWN0IGlkIHRvIHJlbGVhc2UuIFRoZXJlIGlzIG5vIGNvbmZpcm1hdGlvbiB0byByZWFkIGJhY2suCi0JLy8KLQkvLyBFUlJPUjogNmIsIG4sIHRiLCAuLi4KLQkvLyAgICAgIG4gaXMgdGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgZXJyb3IuCi0JLy8JCXRiIGlzIGEgdHlwZSBmbGFnLCBmb2xsb3dlZCBieSB0aGUgdmFsdWUuIFRoZSB2YWx1ZSBpcyBkZXBlbmRlbnQgdXBvbgotCS8vCQl0aGUgY29tbWFuZCB0aGF0IHRoaXMgaXMgZXJyb3IgaXMgZnJvbS4gSWYgYSBUSFJPVywgdGhlbiB0aGUgVEhST1cgaXMgQUxXQVlTIGEgbmV3Ci0JLy8JCUlELCBpdCBjYW4gbmV2ZXIgYmUgYW4gZXhpc3RpbmcgaWQuCi0JLy8gICAgICAKLQkvLwotCS8vIFRPX0JFQU5fU1RSSU5HOiA5YiwgbgotCS8vCQlXaGVyZSBuIGlzIHRoZSBvYmplY3QgaWQgdG8gcHJvZHVjZSB0aGUgYmVhbiBzdHJpbmcgZm9yLgotCS8vCQlJdCB3aWxsIHJldHVybiBhIFZBTFVFIGNvbW1hbmQgd2hlcmUgdGhlIHR5cGUgaXMgU3RyaW5nLgotCS8vCi0JLy8gTkVXX0lOU1RBTkNFOiAxMGIsIG4KLQkvLwkJV2hlcmUgbiBpcyB0aGUgY2xhc3Mgb2JqZWN0IGlkIG9mIHRoZSBjbGFzcyB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdXNpbmcgdGhlIGRlZmF1bHQgY3Rvci4KLQkvLwkJSXQgd2lsbCByZXR1cm4gZWl0aGVyIGEgVkFMVUUgY29tbWFuZCBjb250YWluaW5nIHRoZSBuZXcgdmFsdWUgKG9mIHR5cGUgT0JKRUNUX0lEL05FV19PQkpFQ1RfSUQgaWYgbm90Ci0JLy8JCW9uZSBvZiB0aGUgY29uc3RhbnQgdHlwZXMgd2l0aCB0aGUgdHJ1ZSBjbGFzc0lEIGluIGl0KSBvciBhbiBFUlJPUiBjb21tYW5kLiAoVGhlIEVSUk9SIGNvdWxkCi0JLy8JCWJlIGEgVEhST1cgdHlwZSkuIElmIHRoZSBvYmplY3QgY3JlYXRlZCBpcyBub3QgYXNzaWduYWJsZSB0byB0aGUgdHlwZSBwYXNzZWQgaW4sIHRoZW4KLQkvLwkJYW4gRVJST1IgaXMgcmV0dXJuZWQgd2l0aCBDTEFTU19DQVNUX0VYQ0VQVElPTiBmbGFnLgotCS8vCi0JLy8gTkVXX0lOSVRfU1RSSU5HOiAxMWIsIG4sICJpbml0c3RyaW5nIgotCS8vCQlXaGVyZSBuIGlzIHRoZSBjbGFzcyBvYmplY3QgaWQgb2YgdGhlIGNsYXNzIHRoaXMgaW5pdHN0cmluZyBpcyBzdXBwb3NlZCB0byBjcmVhdGUgZm9yLgotCS8vCQlJdCB3aWxsIHJldHVybiBlaXRoZXIgYSBWQUxVRSBjb21tYW5kIGNvbnRhaW5pbmcgdGhlIG5ldyB2YWx1ZSAob2YgdHlwZSBPQkpFQ1RfSUQvTkVXX09CSkVDVF9JRCBpZiBub3QKLQkvLwkJb25lIG9mIHRoZSBjb25zdGFudCB0eXBlcyB3aXRoIHRoZSB0cnVlIGNsYXNzSUQgaW4gaXQpIG9yIGFuIEVSUk9SIGNvbW1hbmQuIChUaGUgRVJST1IgY291bGQKLQkvLwkJYmUgYSBUSFJPVyB0eXBlKS4gVGhlIGVycm9yIGNvdWxkIGFsc28gYmUgQ0FOTk9UX0VWQUxVQVRFX1NUUklORy4gVGhpcyBtZWFucyB0aGF0IHRoZSBzdHJpbmcgd2FzIHRvbwotCS8vCQljb21wbGljYXRlZCBmb3IgdGhlIGV2YWx1YXRvciBhbmQgbmVlZHMgdG8gYmUgY29tcGlsZWQgYW5kIHRyaWVkIGFnYWluLiAoVEJEKQotIAkvLwkJSWYgdGhlIG9iamVjdCBjcmVhdGVkIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHRoZSB0eXBlIHBhc3NlZCBpbiwgdGhlbgotCS8vCQlhbiBFUlJPUiBpcyByZXR1cm5lZCB3aXRoIENMQVNTX0NBU1RfRVhDRVBUSU9OIGZsYWcuCi0JLy8KLQkvLyBHRVRfT0JKRUNUX0RBVEE6IDE0YiwgbgotCS8vCQlXaGVyZSBuIGlzIHRoZSBpZCBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlcXVlc3RlZC4gSXQgd2lsbCByZXR1cm4gYSBORVdfT0JKRUNUX0lEIHZhbHVlIHdpdGggdGhlIGluZm8uCi0JLy8KLQkvLyBHRVRfTUVUSE9EOiA5YiwgY2xhc3NJZCwgIm1ldGhvZE5hbWUiLCBuMSwgW24yXS4uLgotCS8vCQlXaGVyZSBjbGFzc0lEIGlzIHRoZSBpZCBvZiB0aGUgY2xhc3MgdGhlIG1ldGhvZCBzaG91bGQgYmUgZm91bmQgaW4uCi0JLy8JCVdoZXJlIG4xIGlzIHRoZSBudW1iZXIgb2YgcGFybSB0eXBlcyBmb2xsb3dpbmcsIGFuZCBuMiBpcyByZXBsaWNhdGVkIHRoYXQgbWFueSB0aW1lcywKLQkvLwkJZWFjaCBlbnRyeSBpcyB0aGUgaWQgb2YgY2xhc3MgZm9yIHRoZSBwYXJtIHR5cGUuICgwIGlzIHZhbGlkIHdoaWNoIG1lYW5zIHRoZXJlIGFyZSBubyBwYXJtcykuCi0JLy8JCVRoZSByZXR1cm4gd2lsbCBiZSBhIFZBTFVFIGNvbW1hbmQgY29udGFpbmluZyB0aGUgT0JKRUNUX0lEIG9mIHRoZSBtZXRob2QuCi0JLy8KLQkvLyBHRVRfQ1RPUjogMTBiLCBjbGFzc0lkLCBuMSwgW24yXS4uLgotCS8vCQlXaGVyZSBjbGFzc0lEIGlzIHRoZSBpZCBvZiB0aGUgY2xhc3MgdGhlIG1ldGhvZCBzaG91bGQgYmUgZm91bmQgaW4uCi0JLy8JCVdoZXJlIG4xIGlzIHRoZSBudW1iZXIgb2YgcGFybSB0eXBlcyBmb2xsb3dpbmcsIGFuZCBuMiBpcyByZXBsaWNhdGVkIHRoYXQgbWFueSB0aW1lcywKLQkvLwkJZWFjaCBlbnRyeSBpcyB0aGUgaWQgb2YgY2xhc3MgZm9yIHRoZSBwYXJtIHR5cGUuICgwIGlzIHZhbGlkIHdoaWNoIG1lYW5zIHRoZXJlIGFyZSBubyBwYXJtcykuCi0JLy8JCVRoZSByZXR1cm4gd2lsbCBiZSBhIFZBTFVFIGNvbW1hbmQgY29udGFpbmluZyB0aGUgT0JKRUNUX0lEIG9mIHRoZSBtZXRob2QuCi0JLy8JCi0JLy8gR0VUX0ZJRUxEOgotCS8vCi0JLy8gR0VUX0NUT1I6Ci0JLy8KLQkvLyBJTlZPS0U6IDE1YiwgbjEsIHRiLCB2YWx1ZTEsIHZhbHVlMgotCS8vCQlXaGVyZSAibjEiIGlzIHRoZSBpZCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4KLQkvLwkJdGIsIHZhbHVlMSBpcyB0aGUgdmFsdWUgb2Ygd2hvIHRvIGludm9rZSBhZ2FpbnN0IChpdCBpcyB1c3VhbGx5IGFuIE9CSkVDVF9JRCBmb3IgdGIpCi0JLy8gICAgICB2YWx1ZTIgaXMgYW4gQVJSQVlfSURTIHR5cGUgb3IgYW4gT0JKRUNUIGFycmF5IG9mIHZhbHVlcyBpZiBhbGwgY29uc3RhbnRzLgotCS8vCQlXaGF0IGlzIHJldHVybmVkIGlzIGEgVkFMVUUgY29tbWFuZCBjb250YWluaW5nIHRoZSByZXR1cm4gdmFsdWUsICh0aGUgdmFsdWUgd2lsbCBiZSBudWxsIChWT0lEKSBpZgotCS8vCQl0aGVyZSBpcyBubyByZXR1cm4gdHlwZSAoaS5lLiB0aGUgbWV0aG9kIHdhcyB2b2lkKS4gU28gbnVsbCBjYW4gYmUgcmV0dXJuZWQgZWl0aGVyIGlmIHRoZSB2YWx1ZQotCS8vCQl3YXMgbnVsbCBvciBpZiB0aGUgcmV0dXJuIHR5cGUgd2FzIHZvaWQuCi0JLy8KLQkvLyBFWFBSRVNTSU9OX1RSRUVfQ09NTUFORDogMjBiLCBuLCBiCi0JLy8JCVJlY2VpdmluZyBhbiBleHByZXNzaW9uIHRyZWUgc3ViY29tbWFuZC4gV2hlcmUgIm4iIGlzIGEgdW5pcXVlIGlkIG51bWJlciBvZiB0aGUKLQkvLwkJZXhwcmVzc2lvbiBiZWluZyBwcm9jZXNzZWQuIFdoZXJlICJiIiBpcyBieXRlIGNvZGUsIGRlZmluZWQgaW4gRXhwcmVzc2lvbkNvbW1hbmRzLCB0aGF0Ci0JLy8JCWRldGVybWluZXMgdGhlIHR5cGUgb2YgZXhwcmVzc2lvbiB0cmVlIGNvbW1hbmRzLgotCS8vCQlUaGVyZSBjYW4gYmUgbW9yZSBkYXRhIGZvbGxvd2luZywgYnV0IGl0IGlzIHJlYWQgYnkgdGhlIAotCS8vCQlFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciwgbm90IGJ5IHRoZSBjb25uZWN0aW9uLiBTZWUgdGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBzdWJjb21tYW5kcy4KLQkvLwotCS8vCQlUaGUgaWQgbnVtYmVyIGlzIHRoZSBpZCBvZiB0aGUgZXhwcmVzc2lvbiBiZWluZyBwcm9jZXNzZWQuIFRoaXMgYWxsb3dzIG1vcmUgdGhhbiBvbmUgZXhwcmVzc2lvbgotCS8vCQl0byBiZSBwcm9jZXNzZWQgYXQgYSB0aW1lIGZyb20gdGhpcyBjb25uZWN0aW9uLgotCS8vCi0JLy8JCUBzZWUgRXhwcmVzc2lvbkNvbW1hbmRzCi0JLy8JCUBzZWUgRXhwcmVzc2lvblByb2Nlc3NDb250cm9sbGVyCi0JLy8KLQkvLyBJTlZPS0VfV0lUSF9NRVRIT0RfUEFTU0VEOiAyMGIsICBjbGFzc0lkLCAibWV0aG9kTmFtZSIsIHZhbHVlMCwgdGIsIHZhbHVlMSwgdmFsdWUyCi0JLy8JCVdoZXJlIGNsYXNzSUQgaXMgdGhlIGlkIG9mIHRoZSBjbGFzcyB0aGUgbWV0aG9kIHNob3VsZCBiZSBmb3VuZCBpbi4KLQkvLwkJdmFsdWUwIGlzIGFuIEFSUkFZX0lEUyB0eXBlIGZvciB0aGUgdHlwZSBvZiB0aGUgcGFybXMsIG9yIG51bGwgdHlwZSBmb3Igbm8gcGFybXMuICAKLQkvLwkJdGIsIHZhbHVlMSBpcyB0aGUgdmFsdWUgb2Ygd2hvIHRvIGludm9rZSBhZ2FpbnN0IChpdCBpcyB1c3VhbGx5IGFuIE9CSkVDVF9JRCBmb3IgdGIpCi0JLy8gICAgICB2YWx1ZTIgaXMgYW4gQVJSQVlfSURTIHR5cGUgb3IgYW4gT0JKRUNUIGFycmF5IG9mIHZhbHVlcyBpZiBhbGwgY29uc3RhbnRzLgotCS8vCQlXaGF0IGlzIHJldHVybmVkIGlzIGEgVkFMVUUgY29tbWFuZCBjb250YWluaW5nIHRoZSByZXR1cm4gdmFsdWUsICh0aGUgdmFsdWUgd2lsbCBiZSBudWxsIChWT0lEKSBpZgotCS8vCQl0aGVyZSBpcyBubyByZXR1cm4gdHlwZSAoaS5lLiB0aGUgbWV0aG9kIHdhcyB2b2lkKS4gU28gbnVsbCBjYW4gYmUgcmV0dXJuZWQgZWl0aGVyIGlmIHRoZSB2YWx1ZQotCS8vCQl3YXMgbnVsbCBvciBpZiB0aGUgcmV0dXJuIHR5cGUgd2FzIHZvaWQuCi0JLy8KLQkvLyBHRVRfQVJSQVlfQ09OVEVOVFM6IDIxYiwgYXJyYXlJZAotCS8vCQlXaGVyZSBhcnJheUlEIGlzIHRoZSBpZCBvZiB0aGUgYXJyYXkgdG8gZ2V0IHRoZSBjb250ZW50cyBvZi4gV2hhdCBpcyByZXR1cm5lZCBpcyBhIHZhbHVlIGNvbW1hbmQKLQkvLwkJY29udGFpbmluZyBhbiBhcnJheSBvZiBpZHMgb2YgdGhlIGZpcnN0IGRpbWVuc2lvbiBjb250ZW50cy4KLQkvLwotCS8vIENhbGxiYWNrIGNvbW1hbmRzOgotCS8vCi0JLy8gQ0FMTEJBQ0s6IDI1NWIsIG4xLCBuMiwgdmFsdWUxCi0JLy8gICAgICBXaGVyZQotCS8vICAgICAgICAibjEiIGlzIHRoZSBpZCBvZiBjYWxsYmFjayB0eXBlICh0aGVzZSBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBjYWxsYmFjayBzZXJ2ZXIpCi0JLy8gICAgICAgICJuMiIgaXMgdGhlIG1zZ0lkIGZvciB0aGUgY2FsbGJhY2sgKFRoZXNlIGFyZSBlbnRpcmVseSBjYWxsYmFjayBkZXBlbmRlbnQgYW5kIGFyZSBtYWludGFpbmVkIGJ5IHRoZSBjYWxsYmFjayBkZXZlbG9wZXIpCi0JLy8gICAgICAgIHZhbHVlMSBpcyBhbiBBUlJBWV9JRFMgdHlwZSBvciBhbiBPQkpFQ1QgYXJyYXkgb2YgdmFsdWVzIGlmIGFsbCBjb25zdGFudHMuIFRoZXNlIGFyZQotCS8vICAgICAgICAgIHBhcm1zIHRvIHNlbmQgdG8gdGhlIGNhbGxiYWNrIG1zZy4KLQkvLyAgICAgIEl0IHdpbGwgcmV0dXJuIGEgQ0FMTEJBQ0tfRE9ORS4KLQkvLwotCS8vIENBTExCQUNLX0RPTkU6IDI1NGIsIHZhbHVlIGNvbW1hbmQuCi0JLy8JCVdoYXQgY29tZXMgYmFjayBpcyBhIHZhbHVlIGNvbW1hbmQgKGkuZS4gQ29tbWFuZHMuVkFMVUUgZm9sbG93ZWQgYnkgdmFsdWUpLiBUaGlzIGFsbG93cwotCS8vCQlFUlJPUlMgdG8gYmUgc2VudCBiYWNrIHRvby4KLQkvLwotCS8vIENBTExCQUNLX1NUUkVBTTogMjUzYiwgbjEsIG4yCi0JLy8gICAgICBXaGVyZQotCS8vICAgICAgICAibjEiIGlzIHRoZSBpZCBvZiBjYWxsYmFjayB0eXBlICh0aGVzZSBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBjYWxsYmFjayBzZXJ2ZXIpCi0JLy8gICAgICAgICJuMiIgaXMgdGhlIG1zZ0lkIGZvciB0aGUgY2FsbGJhY2sgKFRoZXNlIGFyZSBlbnRpcmVseSBjYWxsYmFjayBkZXBlbmRlbnQgYW5kIGFyZSBtYWludGFpbmVkIGJ5IHRoZSBjYWxsYmFjayBkZXZlbG9wZXIpCi0JLy8JCUl0IHdpbGwgY3JlYXRlIGEgQ2FsbGJhY2tJbnB1dFN0cmVhbSBhbmQgbm90aWZ5IHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIHRoYXQgdGhlCi0JLy8JCXN0cmVhbSBpcyBhdmFpbGFibGUuIEl0IHdpbGwgc2VuZCBhIGNhbGxiYWNrX2RvbmUgd2hlbiBpdCBoYXMgYWNjZXB0ZWQgdGhlIHJlcXVlc3QKLQkvLwkJYnV0IGJlZm9yZSBpdCBub3RpZmllcyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aXRoIHRoZSBzdHJlYW0uIFRoaXMgbGV0cyB0aGUgcmVtb3RlCi0JLy8JCXZtIGtub3cgdGhhdCBpdCBjYW4gc3RhcnQgc2VuZGluZyBkYXRhLgotCQotCi0JLy8gVG8gdGhlIE1hc3RlclNlcnZlciBzb2NrZXQ6Ci0JLy8gVGhlIE1hc3RlclNlcnZlciBzb2NrZXQgd2lsbCBleHBlY3QgaW5wdXQgaW4gRGF0YUlucHV0U3RyZWFtIGZvcm1hdCwgYW5kIERhdGFPdXRwdXRTdHJlYW0gZm9yIHJldHVybi4KLQkvLyBUaGUgc29ja2V0IHdpbGwgYmUgc2hvcnQtbGl2ZWQuIEl0IHdpbGwgYmUgZm9yIG9uZSB0cmFuc2FjdGlvbiBvbmx5LiBFYWNoIHJlcXVlc3Qgd2lsbCByZXR1cm4gYSBuZXcgc29ja2V0LgotCS8vCi0JLy8gQUxJVkU6IDE2YiwgbjEKLQkvLyAgICAgIFdoZXJlCi0JLy8gICAgICAgICJuMSIgaXMgdGhlIGlkIG9mIHRoZSByZWdpc3RyeSB0aGlzIGlzIGFza2luZyB0byB0ZXN0IGZvciBhbGl2ZW5lc3MKLQkvLyAgICAgIFdpbGwgcmV0dXJuIGJvb2wsIHdoZXJlIGZhbHNlIGlmIHJlZ2lzdHJ5IGlzIG5vdCBhbGl2ZSwgdHJ1ZSBpZiBpdCBpcyBhbGl2ZS4KLQkvLyBSRU1PVEVfU1RBUlRFRDogMTdiLCBuMSwgbjIKLQkvLyAgICAgIFdoZXJlCi0JLy8gICAgICAgICJuMSIgaXMgdGhlIGlkIG9mIHRoZSByZWdpc3RyeSB0aGlzIGlzIHRlbGxpbmcgdGhhdCBpdCBpcyBzdGFydGVkCi0JLy8gICAgICAgICJuMiIgaXMgdGhlIHNlcnZlcnNvY2tldCBwb3J0IG51bWJlciBvZiB0aGUgc2VydmVyIHNvY2tldCBpbiB0aGlzIHJlbW90ZSB2bS4KLQkvLyAgICAgIFdpbGwgcmV0dXJuIGJvb2wsIHdoZXJlIGZhbHNlIGlmIHJlZ2lzdHJ5IGlzIG5vdCBhbGl2ZSwgdHJ1ZSBpZiBpdCBpcyBhbGl2ZS4gSWYgZmFsc2UsIHRoZW4gdGVybWluYXRlIHRoZSBzZXJ2ZXIgYmVjYXVzZSBub3RoaW5nIHRvIHRhbGsgdG8uCi0JLy8gR0VUX0NBTExCQUNLX1BPUlQ6IDE4YiwgbjEKLQkvLyAgICAgIFdoZXJlCi0JLy8gICAgICAgICJuMSIgaXMgdGhlIGlkIG9mIHRoZSByZWdpc3RyeSB0aGlzIGlzIGFza2luZyBmb3IgdGhlIGNhbGxiYWNrIHNlcnZlciBwb3J0LgotCS8vICAgICAgV2lsbCByZXR1cm4gaW50LCB3aGVyZSB0aGUgdmFsdWUgaXMgdGhlIGNhbGxiYWNrIHNlcnZlciBwb3J0IG51bWJlci4gLTEgaWYgdGhlcmUgaXMgbm8gY2FsbGJhY2sgc2VydmVyIHBvcnQuCQkKLQkKLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHRoZSByZXR1cm4gZnJvbSBhIHJlYWQgdmFsdWUuIEl0IGNvbnRhaW5zIHRoZQotCSAqIHR5cGUgb2YgdGhlIHZhbHVlIGFuZCB0aGUgdmFsdWUgaXRzZWxmLiBTaW5jZSBwcmltaXRpdmVzIGNhbiBiZQotCSAqIHJldHVybmVkIGFsc28sIHRoZXJlIGlzIGEgc2xvdCBmb3IgZWFjaCBvbmUgYW5kIHRoZSB0eXBlIHNob3VsZAotCSAqIGJlIGNoZWNrZWQgdG8gc2VlIHdoaWNoIG9uZSBpcyBzZXQuCi0JICoKLQkgKiBBbHNvLCBpZiB0aGUgdHlwZSBpcyBPQkpFQ1QsIHRoZW4gdGhlIGFuT2JqZWN0IGhhcyB0aGUgb2JqZWN0IGluIGl0LCBBTkQKLQkgKiB0aGUgY2xhc3NJRCBmaWVsZCBoYXMgdGhlIG9iamVjdF9pZCBvZiB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCBzbyB0aGF0IHRoZQotCSAqIGFwcHJvcHJpYXRlIGJlYW50eXBlcHJveHkgY2FuIGJlIGZvdW5kIHRvIHVzZSB0aGF0IG9iamVjdC4gQWxzbywgb25seQotCSAqIElSRU1Db25zdGFudEJlYW5UeXBlUHJveGllcyBjYW4gYmUgb2YgdHlwZSBPQkpFQ1QuIFRoYXQgaXMgYmVjYXVzZSB0aG9zZQotCSAqIGFyZSB0aGUgb25seSBvbmVzIHRoYXQga25vdyBob3cgdG8gdGFrZSB0aGUgdmFsdWUgb2JqZWN0IGFuZCBpbnRlcnByZXQgaXQuCi0JICoKLQkgKiBJZiB0aGUgdHlwZSBpcyBPQkpFQ1RfSUQgb3IgTkVXX09CSkVDVF9JRCwgdGhlbiB0aGUgb2JqZWN0SUQgZmllbGQgd2lsbCBiZSBzZXQgd2l0aAotCSAqIHRoZSBpZC4KLQkgKiBJZiB0aGUgdHlwZSBpcyBORVdfT0JKRUNUX0lELCB0aGVuIHRoZSBjbGFzc0lEIGZpZWxkIHdpbGwKLQkgKiBoYXZlIHRoZSBjbGFzcyBvYmplY3RJRCBvZiB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCBmb3Igd2hpY2ggb2JqZWN0X2lkIHByb3hpZXMuCi0JICoKLQkgKiBUSFJPVyBpcyB0cmVhdGVkIGxpa2UgTkVXX09CSkVDVF9JRCBpbiB3aGF0IGZpZWxkcyBhcmUgc2V0IHNpbmNlIGl0IGlzIGEgbmV3IG9iamVjdC4KLQkgKgotCSAqIE5vdGU6IHNvIGFzIG5vdCB0byBjcmVhdGUgdW5uZWNlc3Nhcnkgb2JqZWN0cywgaWYgdGhlIE9iamVjdCB0eXBlIG9mIHRoZSBwcmltaXRpdmUgaXMgYmVpbmcKLQkgKiBzZW50LCB0aGVuIHRoZSBwcmltaXRpdmUgZmllbGQgd2lsbCBiZSBzZXQgaW5zdGVhZCwgdGhvdWdoIHRoZSB0eXBlCi0JICogd2lsbCBzdGlsbCBiZSB0aGUgT2JqZWN0IHR5cGUgKGkuZS4gaWYgdHlwZSA9IExfQllURSwgdGhlIGFCeXRlIHdpbGwKLQkgKiBoYXZlIHRoZSB2YWx1ZSBpbiBpdCkuCi0JICogCi0JICogTm90ZTogQWxzbyBmbGFncyBjYW4gYmUgc2VuZCBiYWNrLiBUaGUgdHlwZSB3aWxsIGJlIEZMQUcgYW5kIHRoZSBhbkludCBmaWVsZCB3aWxsIGJlIHRoZQotCSAqIGZsYWcgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZSBzcGVjaWFsIHRoaW5ncyB0aGF0IGFyZW4ndCB2YWx1ZXMuIE1vc3QgdXNlZnVsIGluCi0JICogYXJyYXlzIHdoZXJlIG9uZSBvZiB0aGUgZW50cmllcyBpcyBub3QgYSB2YWx1ZS4gVGhpcyBjYW4gb25seSBiZSB1c2VkIGlmIHJlYWRWYWx1ZQotCSAqIGlzIHBhc3NlZCBhIGZsYWcgaW5kaWNhdGluZyBmbGFncyBhcmUgdmFsaWQsIG90aGVyd2lzZSBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgbm90IHZhbGllLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsdWVPYmplY3QgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCQlwdWJsaWMgYnl0ZSB0eXBlOwkvLyBTYW1lIGFzIHRoZSB0eXBlcyBhYm92ZQotCQlwdWJsaWMgYnl0ZSBhQnl0ZTsKLQkJcHVibGljIGNoYXIgYUNoYXI7Ci0JCXB1YmxpYyBkb3VibGUgYURvdWJsZTsKLQkJcHVibGljIGZsb2F0IGFGbG9hdDsKLQkJcHVibGljIGludCBhbkludDsKLQkJcHVibGljIHNob3J0IGFTaG9ydDsKLQkJcHVibGljIGxvbmcgYUxvbmc7Ci0JCXB1YmxpYyBib29sZWFuIGFCb29sOwotCQlwdWJsaWMgaW50IG9iamVjdElEOwkvLyBUaGUgb2JqZWN0IGlkIGZvciBlaXRoZXIgT0JKRUNUX0lEIG9yIE5FV19PQkpFQ1RfSUQuCi0JCXB1YmxpYyBpbnQgY2xhc3NJRDsJCS8vIFRoZSBjbGFzcyBvYmplY3QgaWQgb2YgdGhlIHZhbHVlIGluIE9iamVjdCBpZiB0aGUgdHlwZSBpcyBPYmplY3QKLQkJcHVibGljIE9iamVjdCBhbk9iamVjdDsJLy8gU3RyaW5nIGFsc28gd2lsbCBiZSBpbiBoZXJlCi0JCQotCQlwdWJsaWMgVmFsdWVPYmplY3QoKSB7Ci0JCQl0eXBlID0gVk9JRDsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChWYWx1ZU9iamVjdCkgc3VwZXIuY2xvbmUoKTsKLQkJCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBzdG9yZWQgaGVyZSBpcyBhIHByaW1pdGl2ZS4KLQkJICogCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdmFsdWUgaXMgYSBwcmltaXRpdmUgdHlwZS4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCQlyZXR1cm4gZ2V0UHJpbWl0aXZlVHlwZSgpLmlzUHJpbWl0aXZlKCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIHByaW1pdGl2ZSB0eXBlIG9mIHRoZSB2YWx1ZS4gCi0JCSAqIEByZXR1cm4gVGhlIHByaW1pdGl2ZSB0eXBlLCBvciBpZiBub3QgcHJpbWl0aXZlLCBpdCByZXR1cm5zIHNpbXBseSA8Y29kZT5PYmplY3QuY2xhc3M8L2NvZGU+LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgQ2xhc3MgZ2V0UHJpbWl0aXZlVHlwZSgpIHsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgQllURToKLQkJCQkJcmV0dXJuIEJ5dGUuVFlQRTsKLQkJCQljYXNlIENIQVI6Ci0JCQkJCXJldHVybiBDaGFyYWN0ZXIuVFlQRTsKLQkJCQljYXNlIERPVUJMRToKLQkJCQkJcmV0dXJuIERvdWJsZS5UWVBFOwotCQkJCWNhc2UgRkxPQVQ6Ci0JCQkJCXJldHVybiBGbG9hdC5UWVBFOwotCQkJCWNhc2UgSU5UOgotCQkJCQlyZXR1cm4gSW50ZWdlci5UWVBFOwotCQkJCWNhc2UgU0hPUlQ6Ci0JCQkJCXJldHVybiBTaG9ydC5UWVBFOwotCQkJCWNhc2UgTE9ORzoKLQkJCQkJcmV0dXJuIExvbmcuVFlQRTsKLQkJCQljYXNlIEJPT0w6Ci0JCQkJCXJldHVybiBCb29sZWFuLlRZUEU7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQkJCX0JCi0JCQkKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEdldCB0aGUgdHlwZSBhcyBvbmUgb2YgdGhlIHZhbGlkIENvbW1hbmRzLlR5cGVzLiBWT0lELCBCWVRFLCBMX0JZVEUsIGV0Yy4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNwZWNpYWwgZ2V0dGVyIHRvIGdldCB0aGUgdHlwZSBhcyBhbiBPYmplY3QsIHRoaXMgaXMgdXNlZCBieSBpbnZva2UgZm9yIGV4YW1wbGUuCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldEFzT2JqZWN0KCkgewotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBWT0lEOgotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQljYXNlIEJZVEU6Ci0JCQkJY2FzZSBMX0JZVEU6Ci0JCQkJCXJldHVybiBuZXcgQnl0ZShhQnl0ZSk7Ci0JCQkJY2FzZSBDSEFSOgotCQkJCWNhc2UgTF9DSEFSOgotCQkJCQlyZXR1cm4gbmV3IENoYXJhY3RlcihhQ2hhcik7Ci0JCQkJY2FzZSBET1VCTEU6Ci0JCQkJY2FzZSBMX0RPVUJMRToKLQkJCQkJcmV0dXJuIG5ldyBEb3VibGUoYURvdWJsZSk7Ci0JCQkJY2FzZSBGTE9BVDoKLQkJCQljYXNlIExfRkxPQVQ6Ci0JCQkJCXJldHVybiBuZXcgRmxvYXQoYUZsb2F0KTsKLQkJCQljYXNlIElOVDoKLQkJCQljYXNlIExfSU5UOgotCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoYW5JbnQpOwotCQkJCWNhc2UgU0hPUlQ6Ci0JCQkJY2FzZSBMX1NIT1JUOgotCQkJCQlyZXR1cm4gbmV3IFNob3J0KGFTaG9ydCk7Ci0JCQkJY2FzZSBMT05HOgotCQkJCWNhc2UgTF9MT05HOgotCQkJCQlyZXR1cm4gbmV3IExvbmcoYUxvbmcpOwotCQkJCWNhc2UgQk9PTDoKLQkJCQljYXNlIExfQk9PTDoKLQkJCQkJcmV0dXJuIGFCb29sID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQljYXNlIFNUUklORzoKLQkJCQkJcmV0dXJuIChTdHJpbmcpIGFuT2JqZWN0OwotCQkJCWNhc2UgT0JKRUNUOgotCQkJCQlyZXR1cm4gYW5PYmplY3Q7Ci0JCQkJCi0JCQkJZGVmYXVsdDogCi0JCQkJCXJldHVybiBudWxsOwkvLyBDYW4ndCBoYW5kbGUgb3RoZXJzLiBUaG9zZSBuZWVkIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGNhbGxpbmcuCi0JCQl9Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTcGVjaWFsIHNldHRlciB0byBzZXQgdGhlIHZhbHVlIGRlcGVuZGluZyB1cG9uIHRoZSB0eXBlLgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0QXNPYmplY3QoT2JqZWN0IHZhbHVlLCBpbnQgdmFsdWVDbGFzc0lEKSB7Ci0JCQlzd2l0Y2ggKHZhbHVlQ2xhc3NJRCkgewotCQkJCWNhc2UgVk9JRDoKLQkJCQkJc2V0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQllURV9DTEFTUzoKLQkJCQkJc2V0KChCeXRlKSB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ0hBUkFDVEVSX0NMQVNTOgotCQkJCQlzZXQoKENoYXJhY3RlcikgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIERPVUJMRV9DTEFTUzoKLQkJCQkJc2V0KChEb3VibGUpIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBGTE9BVF9DTEFTUzoKLQkJCQkJc2V0KChGbG9hdCkgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElOVEVHRVJfQ0xBU1M6Ci0JCQkJCXNldCgoSW50ZWdlcikgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNIT1JUX0NMQVNTOgotCQkJCQlzZXQoKFNob3J0KSB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTE9OR19DTEFTUzoKLQkJCQkJc2V0KChMb25nKSB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQk9PTEVBTl9DTEFTUzoKLQkJCQkJc2V0KChCb29sZWFuKSB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1RSSU5HX0NMQVNTOgotCQkJCQlzZXQoKFN0cmluZykgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlzZXQodmFsdWUsIHZhbHVlQ2xhc3NJRCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQkKLQkJcHVibGljIHZvaWQgc2V0KCkgewotCQkJdHlwZSA9IFZPSUQ7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEZsYWcoaW50IGZsYWcpIHsKLQkJCXR5cGUgPSBGTEFHOwotCQkJYW5JbnQgPSBmbGFnOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoYnl0ZSB2YWx1ZSkgewotCQkJdHlwZSA9IEJZVEU7Ci0JCQlhQnl0ZSA9IHZhbHVlOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChCeXRlIHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBMX0JZVEU7Ci0JCQkJYUJ5dGUgPSB2YWx1ZS5ieXRlVmFsdWUoKTsKLQkJCQlhbk9iamVjdCA9IG51bGw7Ci0JCQl9IGVsc2UKLQkJCQlzZXQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoY2hhciB2YWx1ZSkgewotCQkJdHlwZSA9IENIQVI7Ci0JCQlhQ2hhciA9IHZhbHVlOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChDaGFyYWN0ZXIgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IExfQ0hBUjsKLQkJCQlhQ2hhciA9IHZhbHVlLmNoYXJWYWx1ZSgpOwotCQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJCX0gZWxzZQotCQkJCXNldCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChkb3VibGUgdmFsdWUpIHsKLQkJCXR5cGUgPSBET1VCTEU7Ci0JCQlhRG91YmxlID0gdmFsdWU7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KERvdWJsZSB2YWx1ZSkgewotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQl0eXBlID0gTF9ET1VCTEU7Ci0JCQkJYURvdWJsZSA9IHZhbHVlLmRvdWJsZVZhbHVlKCk7Ci0JCQkJYW5PYmplY3QgPSBudWxsOwotCQkJfSBlbHNlCi0JCQkJc2V0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KGZsb2F0IHZhbHVlKSB7Ci0JCQl0eXBlID0gRkxPQVQ7Ci0JCQlhRmxvYXQgPSB2YWx1ZTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoRmxvYXQgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IExfRkxPQVQ7Ci0JCQkJYUZsb2F0ID0gdmFsdWUuZmxvYXRWYWx1ZSgpOwotCQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJCX0gZWxzZQotCQkJCXNldCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChpbnQgdmFsdWUpIHsKLQkJCXR5cGUgPSBJTlQ7Ci0JCQlhbkludCA9IHZhbHVlOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChJbnRlZ2VyIHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBMX0lOVDsKLQkJCQlhbkludCA9IHZhbHVlLmludFZhbHVlKCk7Ci0JCQkJYW5PYmplY3QgPSBudWxsOwotCQkJfSBlbHNlCi0JCQkJc2V0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KHNob3J0IHZhbHVlKSB7Ci0JCQl0eXBlID0gU0hPUlQ7Ci0JCQlhU2hvcnQgPSB2YWx1ZTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoU2hvcnQgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IExfU0hPUlQ7Ci0JCQkJYVNob3J0ID0gdmFsdWUuc2hvcnRWYWx1ZSgpOwotCQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJCX0gZWxzZQotCQkJCXNldCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChsb25nIHZhbHVlKSB7Ci0JCQl0eXBlID0gTE9ORzsKLQkJCWFMb25nID0gdmFsdWU7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KExvbmcgdmFsdWUpIHsKLQkJCXR5cGUgPSBMX0xPTkc7Ci0JCQlhTG9uZyA9IHZhbHVlLmxvbmdWYWx1ZSgpOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChib29sZWFuIHZhbHVlKSB7Ci0JCQl0eXBlID0gQk9PTDsKLQkJCWFCb29sID0gdmFsdWU7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KEJvb2xlYW4gdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IExfQk9PTDsKLQkJCQlhQm9vbCA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJCX0gZWxzZQotCQkJCXNldCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IFNUUklORzsKLQkJCQlhbk9iamVjdCA9IHZhbHVlOwotCQkJfSBlbHNlCi0JCQkJc2V0KCk7Ci0JCX0JCQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgdmFsdWUsIGludCBjbGFzc09iamVjdElEKSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBPQkpFQ1Q7Ci0JCQkJY2xhc3NJRCA9IGNsYXNzT2JqZWN0SUQ7Ci0JCQkJYW5PYmplY3QgPSB2YWx1ZTsKLQkJCX0gZWxzZQotCQkJCXNldCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE9iamVjdElEKGludCB2YWx1ZSkgewotCQkJdHlwZSA9IE9CSkVDVF9JRDsKLQkJCW9iamVjdElEID0gdmFsdWU7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJCi0JCS8vIFVzZSB0aGlzIGlmIHRoZSBvYmplY3QgaXMgYW4gYXJyYXkgY29udGFpbmluZyBJRHMuIFRoZSByZXRyaWV2ZXIKLQkJLy8gd2lsbCBiZSB1c2VkIHRvIGdldCB0aGUgbmV4dCB2YWx1ZSB0byB3cml0ZSB0byB0aGUgc3RyZWFtLgotCQlwdWJsaWMgdm9pZCBzZXRBcnJheUlEUyhWYWx1ZVJldHJpZXZlIHJldHJpZXZlciwgaW50IGFycmF5U2l6ZSwgaW50IGNvbXBvbmVudFR5cGUpIHsKLQkJCXR5cGUgPSBBUlJBWV9JRFM7Ci0JCQljbGFzc0lEID0gY29tcG9uZW50VHlwZTsKLQkJCWFuSW50ID0gYXJyYXlTaXplOwotCQkJYW5PYmplY3QgPSByZXRyaWV2ZXI7Ci0JCX0KLQkJCi0JCQotCQkvLyBVc2UgdGhpcyBpZiB0aGlzIGlzIGEgbmV3IG9iamVjdCBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGNvcnJlY3QgY2xhc3MgdHlwZS4KLQkJcHVibGljIHZvaWQgc2V0T2JqZWN0SUQoaW50IHZhbHVlLCBpbnQgY2xhc3NPYmplY3RJRCkgewotCQkJdHlwZSA9IE5FV19PQkpFQ1RfSUQ7Ci0JCQlvYmplY3RJRCA9IHZhbHVlOwotCQkJY2xhc3NJRCA9IGNsYXNzT2JqZWN0SUQ7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0JCQkJCQkJCQkKLQkJCi0JCS8vIFVzZSB0aGlzIHRvIGluZGljYXRlIGFuIGV4Y2VwdGlvbiBvY2N1cmVkLgotCQlwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oaW50IHRocm93SUQsIGludCB0aHJvd0NsYXNzSUQpIHsKLQkJCXR5cGUgPSBUSFJPVzsKLQkJCW9iamVjdElEID0gdGhyb3dJRDsKLQkJCWNsYXNzSUQgPSB0aHJvd0NsYXNzSUQ7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIEhlbHBmdWwgY29tbWFuZHMuCi0JICogLSBJZiBhIGNvbW1hbmQgdGhyb3dzIGFueSBleGNlcHRpb24gZXhjZXB0IENvbW1hbmRFcnJvckV4Y2VwdGlvbiwgb3IKLQkgKiAgIFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uIHdpdGggcmVjb3ZlcmFibGUgdHJ1ZSwgdGhlbiB0aGUgY29ubmVjdGlvbiBpcyBpbiBhIGJhZCBzdGF0ZQotCSAqICAgYW5kIG5lZWRzIHRvIGJlIGNsb3NlZC4KLQkgKioqKioqKioqKioqKioqKioqKioqKioqLwotCQotCS8qKgotCSAqIFVzZSB0aGlzIHRvIHJlYWQgYSB2YWx1ZSAoaW5wdXRzdHJlYW0gc2hvdWxkIGJlIHBvaW50aW5nIHRvIHRoZSB0eXBlIGJ5dGUgYXMgdGhlIG5leHQgYnl0ZSB0byByZWFkKS4KLQkgKiBUaGUgcHJpbWl0aXZlIGZpZWxkcyBvZiAidmFsdWUiIHdpbGwgbm90IGJlIGNoYW5nZWQgaWYgdGhleSBhcmUgbm90IHRoZQotCSAqIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIHJlYWQuIEhvd2V2ZXIsIGFuT2JqZWN0IHdpbGwgYmUgc2V0IHRvIG51bGwuCi0JICovCi0JIAotCS8qKgotCSAqIEVycm9yIGZsYWdzIGZvciBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgdGhyb3duLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVOS05PV05fUkVBRF9UWVBFID0gIlVOS05PV05fUkVBRF9UWVBFIjsJCS8vIFRoZSByZWFkIHR5cGUgYnl0ZSB3YXMgbm90IGEgdmFsaWQgdHlwZSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVU5LTk9XTl9XUklURV9UWVBFID0gIlVOS05PV05fV1JJVEVfVFlQRSI7CQkvLyBUaGUgd3JpdGUgdHlwZSBieXRlIHdhcyBub3QgYSB2YWxpZCB0eXBlCSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVFlQRV9JTlZBTElEX0ZPUl9DT01NQU5EID0gIlRZUEVfSU5WQUxJRF9GT1JfQ09NTUFORCI7CQkvLyBUaGUgZGF0YSB0eXBlIHJlYWQgaXMgbm90IHZhbGlkIGZvciB0aGlzIGNvbW1hbmQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVOS05PV05fQ09NTUFORCA9ICJVTktOT1dOX0NPTU1BTkQiOwkJCS8vIFRoZSBjb21tYW5kIGZsYWcgaXMgdW5rbm93biAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU09NRV9VTkVYUEVDVEVEX0VYQ0VQVElPTiA9ICJTT01FX1VORVhQRUNURURfRVhDRVBUSU9OIjsJLy8gVGhlcmUgd2FzIHNvbWUga2luZCBvZiBleGNlcHRpb24gdGhhdCB3YXNuJ3QgZXhwZWN0ZWQuIFRoZSBkYXRhIHdpbGwgYmUgdGhlIGV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPT19NQU5ZX0JZVEVTID0gIlRPT19NQU5ZX0JZVEVTIjsJCQkvLyBUb28gbWFueSBieXRlcyB3ZXJlIHNlbnQgb24gYSB3cml0ZUJ5dGVzLiBJdCB3YXMgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbW9yZSB0aGFuIGNvdWxkIGJlIHJlYWQgaW50byB0aGUgYnVmZmVyLiBUaGUgZGF0YSB3aWxsIGJlIHRoZSBzaXplIHNlbnQuCi0KLQkvKioKLQkgKiBSZWFkIGEgdmFsdWUgZnJvbSB0aGUgc3RyZWFtIGludG8gdGhlIHZhbHVlIG9iamVjdC4gSXQgd2lsbCBub3QgYWxsb3cgdmFsdWVzIG9mIHR5cGUgRkxBRy4KLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gYWxsb3dGbGFnCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2JqZWN0IHNlbnQgaW4uIFRoaXMgYWxsb3dzIDxjb2RlPnZhbHVlID0gQ29tbWFuZHMucmVhZFZhbHVlKGlzLCBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKSk7PC9jb2RlPiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbHVlT2JqZWN0IHJlYWRWYWx1ZShEYXRhSW5wdXRTdHJlYW0gaXMsIFZhbHVlT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXJlYWRWYWx1ZShpcywgdmFsdWUsIGZhbHNlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJlYWQgYSB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0gaW50byB0aGUgdmFsdWUgb2JqZWN0LiBJdCB3aWxsIGFsbG93IHZhbHVlcyBvZiB0eXBlIEZMQUcgaWYgYWxsb3dGbGFnIGlzIHRydWUuCi0JICogQHBhcmFtIGlzCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIGFsbG93RmxhZyA8Y29kZT50cnVlPC9jb2RlPiBpZiB2YWx1ZXMgb2YgdHlwZSBmbGFnIGFyZSBhbGxvdy4KLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVhZFZhbHVlKERhdGFJbnB1dFN0cmVhbSBpcywgVmFsdWVPYmplY3QgdmFsdWUsIGJvb2xlYW4gYWxsb3dGbGFnKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl2YWx1ZS5hbk9iamVjdCA9IG51bGw7Ci0JCQl2YWx1ZS50eXBlID0gaXMucmVhZEJ5dGUoKTsKLQkJCXN3aXRjaCAodmFsdWUudHlwZSkgewotCQkJCWNhc2UgQllURToKLQkJCQljYXNlIExfQllURToKLQkJCQkJdmFsdWUuYUJ5dGUgPSBpcy5yZWFkQnl0ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENIQVI6Ci0JCQkJY2FzZSBMX0NIQVI6Ci0JCQkJCXZhbHVlLmFDaGFyID0gaXMucmVhZENoYXIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBET1VCTEU6Ci0JCQkJY2FzZSBMX0RPVUJMRToKLQkJCQkJdmFsdWUuYURvdWJsZSA9IGlzLnJlYWREb3VibGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBGTE9BVDoKLQkJCQljYXNlIExfRkxPQVQ6Ci0JCQkJCXZhbHVlLmFGbG9hdCA9IGlzLnJlYWRGbG9hdCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElOVDoKLQkJCQljYXNlIExfSU5UOgotCQkJCQl2YWx1ZS5hbkludCA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBPQkpFQ1RfSUQ6Ci0JCQkJCXZhbHVlLm9iamVjdElEID0gaXMucmVhZEludCgpOwotCQkJCQlicmVhazsJCQkJCQotCQkJCWNhc2UgTkVXX09CSkVDVF9JRDoKLQkJCQkJdmFsdWUuY2xhc3NJRCA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJdmFsdWUub2JqZWN0SUQgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVEhST1c6Ci0JCQkJCXZhbHVlLmNsYXNzSUQgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCXZhbHVlLm9iamVjdElEID0gaXMucmVhZEludCgpOwotCQkJCQlicmVhazsJCQkJCi0JCQkJY2FzZSBTSE9SVDoKLQkJCQljYXNlIExfU0hPUlQ6Ci0JCQkJCXZhbHVlLmFTaG9ydCA9IGlzLnJlYWRTaG9ydCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExPTkc6Ci0JCQkJY2FzZSBMX0xPTkc6Ci0JCQkJCXZhbHVlLmFMb25nID0gaXMucmVhZExvbmcoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCT09MOgotCQkJCWNhc2UgTF9CT09MOgotCQkJCQl2YWx1ZS5hQm9vbCA9IGlzLnJlYWRCb29sZWFuKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1RSSU5HOgotCQkJCQl2YWx1ZS5hbk9iamVjdCA9IHJlYWRTdHJpbmdEYXRhKGlzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBPQkpFQ1Q6Ci0JCQkJCXZhbHVlLmNsYXNzSUQgPSBpcy5yZWFkSW50KCk7CS8vIFJlYWQgdGhlIGNsYXNzIGlkCi0JCQkJCU9iamVjdElucHV0U3RyZWFtIG9pID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGlzKTsKLQkJCQkJdmFsdWUuYW5PYmplY3QgPSBvaS5yZWFkT2JqZWN0KCk7CS8vIFJlYWQgdGhlIG9iamVjdCBpdHNlbGYKLQkJCQkJb2kgPSBudWxsOwkvLyBEb24ndCBjbG9zZSBpdCwgdGhhdCB3b3VsZCBjbG9zZSB0aGUgc3RyZWFtIGl0c2VsZi4KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBUlJBWV9JRFM6Ci0JCQkJCS8vIFRoZSBoZWFkZXIgZm9yIGFuIGFycmF5IG9mIGlkcy4KLQkJCQkJdmFsdWUuY2xhc3NJRCA9IGlzLnJlYWRJbnQoKTsJLy8gVGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheQotCQkJCQl2YWx1ZS5hbkludCA9IGlzLnJlYWRJbnQoKTsJLy8gVGhlIHNpemUgb2YgdGhlIGFycmF5LgotCQkJCQkvLyBBdCB0aGlzIHBvaW50LCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byB1c2UgcmVhZEFycmF5IHRvIHJlYWQgaW4gdGhlIGFycmF5LgotCQkJCQlicmVhazsKLQkJCQljYXNlIFZPSUQ6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRkxBRzoKLQkJCQkJaWYgKGFsbG93RmxhZykgewotCQkJCQkJdmFsdWUuYW5JbnQgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkvLyBGbGFncyBub3QgYWxsb3dlZCwgc28gZHJvcCBpbnRvIGRlZmF1bHQuCi0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKFVOS05PV05fUkVBRF9UWVBFLCBmYWxzZSwgbmV3IEJ5dGUodmFsdWUudHlwZSkpOwotCQkJfQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU3BlY2lhbCBpbnRlcmZhY2UgdXNlZCB0byByZWFkIGJhY2sgYXJyYXlzLiBJdCB3aWxsIGJlIGNhbGxlZCB3aGVuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbHVlU2VuZGVyIHsKLQkJLyoqCi0JCSAqIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIGVudHJ5IGZyb20gdGhlIGFycmF5LiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIFZhbHVlU2VuZGVyIGhhcwotCQkgKiB0aGUgYXJyYXkgdGhhdCBpcyBiZWluZyBidWlsdC4KLQkJICogQHBhcmFtIHZhbHVlCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlbmRWYWx1ZShWYWx1ZU9iamVjdCB2YWx1ZSk7Ci0KLQkJLyoqCi0JCSAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gQVJSQVlfSURTIGlzIGZvdW5kIHdpdGhpbiB0aGUgcmVhZGluZyBvZiB0aGUgYXJyYXkgKGkuZS4gbmVzdGVkIGFycmF5cykKLQkJICogSXQgaXMgYXNraW5nIGZvciBhIG5ldyBWYWx1ZVNlbmRlciB0byB1c2Ugd2hpbGUgdGhpcyBuZXN0ZWQgYXJyYXkuIFRoZSBhcnJheVZhbHVlIGNvbnRhaW5zCi0JCSAqIHRoZSB2YWx1ZW9iamVjdCBmb3IgdGhlIGFycmF5IGhlYWRlciAoaS5lLiB0aGUgY2xhc3MgaWQgb2YgdGhlIGFycmF5IGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzKS4KLQkJICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBWYWx1ZVNlbmRlciB0byBzdG9yZSB0aGlzIGFycmF5IGluIHRoZSBhcnJheSB0aGF0IGlzIGJlaW5nIGJ1aWx0LgotCQkgKiBAcGFyYW0gYXJyYXlWYWx1ZQotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBWYWx1ZVNlbmRlciBuZXN0ZWRBcnJheShWYWx1ZU9iamVjdCBhcnJheVZhbHVlKTsKLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc2VuZGVyIHdpdGggdGhlIGdpdmVuIGFycmF5IGhlYWRlci4gVGhpcyBpcyBub3QgYWx3YXlzIGNhbGxlZCwgZWFjaCB1c2FnZQotCQkgKiBrbm93cyB3aGV0aGVyIGl0IGNhbiBiZSBjYWxsZWQgb3Igbm90LiBGb3IgZXhhbXBsZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgbmVzdGVkQXJyYXkgbWF5IG5vdCBuZWVkIHRvIGNhbGwgaW5pdGlhbGl6ZS4KLQkJICogQHBhcmFtIGFycmF5SGVhZGVyCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVmFsdWVPYmplY3QgYXJyYXlIZWFkZXIpOwotCQkKLQl9CQotCQotCS8qCi0JICogTk9URTogSXQgaXMgaW1wb3J0YW50IHRoYXQgb24gdGhlIElERSBzaWRlIHRoYXQgdGhpcyBpcyBjYWxsZWQgd2l0aGluIGEgdHJhbnNhY3Rpb24uIAotCSAqIElmIG5vdCwgdGhlcmUgY291bGQgYmUgc29tZSBjb3JydXB0aW9uIGlmIHByb3h5IGNsZWFudXAgb2NjdXJzIGluIHRoZSBtaWRkbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlYWRBcnJheShEYXRhSW5wdXRTdHJlYW0gaXMsIGludCBhcnJheVNpemUsIFZhbHVlU2VuZGVyIHZhbHVlU2VuZGVyLCBWYWx1ZU9iamVjdCB2YWx1ZSwgYm9vbGVhbiBhbGxvd0ZsYWcpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJLy8gQW55dGhpbmcgZXhjZXB0aW9uIG90aGVyIHRoYW4gYSBDb21tYW5kRXhjZXB0aW9uLCB3ZSB3aWxsIHRyeSB0byBmbHVzaCB0aGUgaW5wdXQgc28gdGhhdAotCQkvLyBpdCBjYW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBjb21tYW5kIGFuZCBub3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0JCVJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLQkJZm9yIChpbnQgaT0wOyBpPGFycmF5U2l6ZTsgaSsrKSB7Ci0JCQlyZWFkVmFsdWUoaXMsIHZhbHVlLCBhbGxvd0ZsYWcpOwotCQkJaWYgKGV4Y2VwdGlvbiA9PSBudWxsKSAKLQkJCQl0cnkgewotCQkJCQlpZiAodmFsdWUudHlwZSAhPSBBUlJBWV9JRFMpCi0JCQkJCQl2YWx1ZVNlbmRlci5zZW5kVmFsdWUodmFsdWUpOwotCQkJCQllbHNlIHsKLQkJCQkJCS8vIFdlIGhhdmUgYSBuZXN0ZWQgYXJyYXkuCi0JCQkJCQlWYWx1ZVNlbmRlciBuZXN0ZWRTZW5kZXIgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQluZXN0ZWRTZW5kZXIgPSB2YWx1ZVNlbmRlci5uZXN0ZWRBcnJheSh2YWx1ZSk7Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBXZSBzdGlsbCBuZWVkIHRvIHJlYWQgaW4gdGhlIGFycmF5IHRvIGZsdXNoLiBDcmVhdGUKLQkJCQkJCQkvLyBhIGR1bW15IHNlbmRlciB0aGF0IGFjY2VwdHMgZXZlcnl0aGluZyBzZW50IHRvIGl0LgotCQkJCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQkJCQkJbmVzdGVkU2VuZGVyID0gbmV3IFZhbHVlU2VuZGVyKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBzZW5kVmFsdWUoVmFsdWVPYmplY3QgdmFsdWUpIHsKLQkJCQkJCQkJfQotCQkJCQkJCQlwdWJsaWMgVmFsdWVTZW5kZXIgbmVzdGVkQXJyYXkoVmFsdWVPYmplY3QgYXJyYXlWYWx1ZSkgewotCQkJCQkJCQkJcmV0dXJuIHRoaXM7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShWYWx1ZU9iamVjdCBhcnJheUhlYWRlcikgewotCQkJCQkJCQl9Ci0JCQkJCQkJfTsKLQkJCQkJCX0KLQkJCQkJCXJlYWRBcnJheShpcywgdmFsdWUuYW5JbnQsIG5lc3RlZFNlbmRlciwgdmFsdWUsIGFsbG93RmxhZyk7Ci0JCQkJCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpCi0JCQkJCQkJdGhyb3cgZXhjZXB0aW9uOwkvLyBBbiBleGNlcHRpb24gb2N1cnJlZCBpbiBuZXcgc2VuZGVyIHJlcXVlc3QuCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gV2Ugd2FudCB0byBmbHVzaCB0aGUgcXVldWUsIHNvIHNhdmUgdGhlIGV4Y2VwdGlvbiBmb3IgbGF0ZXIuCi0JCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQkJfQotCQl9Ci0JCWlmIChleGNlcHRpb24gIT0gbnVsbCkKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQl9Ci0JCQkJCi0KLQkvKioKLQkgKiBTcGVjaWFsIGludGVyZmFjZSB0byBoYW5kbGUgd3JpdGluZyB0aGUgQVJSQVlfSURTIHR5cGUuCi0JICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBvYmplY3Qgd2lsbCBiZSBpbiB0aGUgdmFsdWVPYmplY3Qgc2VudCB0byB3cml0ZVZhbHVlIHdoZW4gdGhlIHR5cGUgb2YgdGhlIHZhbHVlCi0JICogaXMgQVJSQVlfSURTLiBUaGVuIHdyaXRlIHZhbHVlIHdpbGwga25vdyB0byBjYWxsIHRoaXMgaW50ZXJmYWNlIHRvIHdyaXRlIG91dCB0aGUgdmFsdWVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbHVlUmV0cmlldmUgewotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbmV4dCB2YWx1ZSBvYmplY3QgdG8gc2VuZC4gSXQgd2lsbCBiZSBjYWxsZWQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBzaXplIG9mIAotCQkgKiB0aGUgYXJyYXkgd2FzIHNldCB0byBiZSBzZW5kLiAKLQkJICogQHJldHVybiBUaGUgdmFsdWUgb2JqZWN0IHRvIHNlbmQuCi0JCSAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBWYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB0aHJvd3MgRU9GRXhjZXB0aW9uOwotCX0JCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVWYWx1ZShEYXRhT3V0cHV0U3RyZWFtIG9zLCBWYWx1ZU9iamVjdCB2YWx1ZSwgYm9vbGVhbiBhc1ZhbHVlQ29tbWFuZCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gIHsKLQkJd3JpdGVWYWx1ZShvcywgdmFsdWUsIGFzVmFsdWVDb21tYW5kLCBhc1ZhbHVlQ29tbWFuZCA/IHRydWUgOiBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVZhbHVlKERhdGFPdXRwdXRTdHJlYW0gb3MsIFZhbHVlT2JqZWN0IHZhbHVlLCBib29sZWFuIGFzVmFsdWVDb21tYW5kLCBib29sZWFuIGZsdXNoKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiAgewotCQl0cnkgewotCQkJaWYgKGFzVmFsdWVDb21tYW5kKQotCQkJCW9zLndyaXRlQnl0ZShWQUxVRSk7Ci0JCQlzd2l0Y2ggKHZhbHVlLnR5cGUpIHsKLQkJCQljYXNlIEJZVEU6Ci0JCQkJY2FzZSBMX0JZVEU6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLmFCeXRlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDSEFSOgotCQkJCWNhc2UgTF9DSEFSOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7CQkJCi0JCQkJCW9zLndyaXRlQ2hhcih2YWx1ZS5hQ2hhcik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRE9VQkxFOgotCQkJCWNhc2UgTF9ET1VCTEU6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsJCQkKLQkJCQkJb3Mud3JpdGVEb3VibGUodmFsdWUuYURvdWJsZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRkxPQVQ6Ci0JCQkJY2FzZSBMX0ZMT0FUOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7CQkJCi0JCQkJCW9zLndyaXRlRmxvYXQodmFsdWUuYUZsb2F0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTlQ6Ci0JCQkJY2FzZSBMX0lOVDoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwkJCQotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5hbkludCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgT0JKRUNUX0lEOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7Ci0JCQkJCW9zLndyaXRlSW50KHZhbHVlLm9iamVjdElEKTsKLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQljYXNlIE5FV19PQkpFQ1RfSUQ6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUuY2xhc3NJRCk7Ci0JCQkJCW9zLndyaXRlSW50KHZhbHVlLm9iamVjdElEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUSFJPVzoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5jbGFzc0lEKTsKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUub2JqZWN0SUQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNIT1JUOgotCQkJCWNhc2UgTF9TSE9SVDoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwkJCQotCQkJCQlvcy53cml0ZVNob3J0KHZhbHVlLmFTaG9ydCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTE9ORzoKLQkJCQljYXNlIExfTE9ORzoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwkJCQotCQkJCQlvcy53cml0ZUxvbmcodmFsdWUuYUxvbmcpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJPT0w6Ci0JCQkJY2FzZSBMX0JPT0w6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsJCQkKLQkJCQkJb3Mud3JpdGVCb29sZWFuKHZhbHVlLmFCb29sKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTVFJJTkc6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsJCQkKLQkJCQkJc2VuZFN0cmluZ0RhdGEob3MsIChTdHJpbmcpIHZhbHVlLmFuT2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBPQkpFQ1Q6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUuY2xhc3NJRCk7CS8vIFdyaXRlIHRoZSBjbGFzcyBJRC4KLQkJCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3MpOwotCQkJCQlvb3Mud3JpdGVPYmplY3QodmFsdWUuYW5PYmplY3QpOwotCQkJCQlvb3MuZmx1c2goKTsKLQkJCQkJb29zID0gbnVsbDsJLy8gRG9uJ3QgY2xvc2UgaXQsIHRoYXQgd291bGQgY2xvc2UgdGhlIHN0cmVhbSBpdHNlbGYuCi0JCQkJCWJyZWFrOwkJCQkJCi0JCQkJY2FzZSBBUlJBWV9JRFM6Ci0JCQkJCS8vIFdlIGFyZSB3cml0aW5nIG91dCBhbiBhcnJheSB3aXRoIElEJ3MgaW4gaXQuIFRoZSBmaWVsZHMgb2YgdGhlIHZhbGUgb2JqZWN0IHdpbGwgYmU6Ci0JCQkJCS8vIAljbGFzc0lEOiBUaGUgY2xhc3MgaWQgb2YgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheS4KLQkJCQkJLy8gIGFuT2JqZWN0OiBDb250YWlucyB0aGUgVmFsdWVSZXRyaWV2ZXIgdG8gZ2V0IHRoZSBuZXh0IHZhbHVlLgotCQkJCQlvcy53cml0ZUJ5dGUoQVJSQVlfSURTKTsJCi0JCQkJCW9zLndyaXRlSW50KHZhbHVlLmNsYXNzSUQpOwotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5hbkludCk7CS8vIFRoZSBzaXplIG9mIHRoZSBhcnJheS4KLQkJCQkJLy8gTm93IGNvbWVzIHRoZSBrbHVkZ3kgcGFydCwgd3JpdGluZyB0aGUgdmFsdWVzLgotCQkJCQlWYWx1ZVJldHJpZXZlIHJldHJpZXZlciA9IChWYWx1ZVJldHJpZXZlKSB2YWx1ZS5hbk9iamVjdDsKLQkJCQkJaW50IGxlbiA9IHZhbHVlLmFuSW50OwotCQkJCQl3aGlsZSAobGVuLS0gPiAwKQotCQkJCQkJd3JpdGVWYWx1ZShvcywgcmV0cmlldmVyLm5leHRWYWx1ZSgpLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVk9JRDoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwkJCQotCQkJCQlicmVhazsKLQkJCQljYXNlIEZMQUc6Ci0JCQkJCW9zLndyaXRlQnl0ZShGTEFHKTsKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUuYW5JbnQpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlvcy53cml0ZUJ5dGUoVk9JRCk7Ci0JCQkJCXRocm93IG5ldyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihVTktOT1dOX1dSSVRFX1RZUEUsIHRydWUsIHZhbHVlKTsJCQkJCQotCQkJfQotCQkJaWYgKGZsdXNoKQotCQkJCW9zLmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQkKLQkKLQkvKioKLQkgKiBGb3IgcmVhZGluZyBhIGxhcmdlIG51bWJlciBvZiBieXRlcy4gVGhpcyBpcyBhIHZhbHVlIHR5cGUsIG5vdCBhIGNvbW1hbmQuIFRoZSBjb21tYW5kIAotCSAqIG5lZWRzIHRvIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuIC0xIGlmIHRoZXJlCi0JICogaXMgbm8gbW9yZSBkYXRhIHRvIHNlbmQgYW5kIHRoZSBzdHJlYW0gc2hvdWxkIGNsb3NlZC4gSWYgcmVhZCBzb21ldGhpbmcgYnV0IG5vdCBhbGwsCi0JICogdGhlbiBqdXN0IHdoYXQgaXQgY291bGQgcmVhZCB3aWxsIGJlIHJldHVybmVkLiBUaGUgbmV4dCByZWFkIHdpbGwgcmV0dXJuIC0xIGZvciBFT0YuCi0JICoKLQkgKiBJdCB3aWxsIHJlYWQgZnJvbSB0aGUgZm9ybWF0OgotCSAqICAgaW50IC0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgKHJldHJpZXZlZCBmcm9tIHRoZSBzdHJlYW0pLgotCSAqICAgYnl0ZXMgLSB0aGUgYWN0dWFsIGJ5dGVzLgotCSAqCi0JICogTm90ZTogQSBjb21tYW5kIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLQkgKiAgICAgICBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYnl0ZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCByZWFkQnl0ZXMoRGF0YUlucHV0U3RyZWFtIGlzLCBieXRlW10gYnl0ZXMpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uICB7Ci0JCXRyeSB7Ci0JCQlpbnQgYnl0ZXNUb1JlYWQgPSAtMTsKLQkJCXRyeSB7Ci0JCQkJYnl0ZXNUb1JlYWQgPSBpcy5yZWFkSW50KCk7Ci0JCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewotCQkJfQotCQkJaWYgKGJ5dGVzVG9SZWFkID09IC0xKQotCQkJCXJldHVybiAtMTsKLQkJCWlmIChieXRlc1RvUmVhZCA+IGJ5dGVzLmxlbmd0aCkKLQkJCQl0aHJvdyBuZXcgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oVE9PX01BTllfQllURVMsIGZhbHNlLCBuZXcgSW50ZWdlcihieXRlc1RvUmVhZCkpOwotCQkJaW50IHN0YXJ0ID0gMDsKLQkJCWludCB0b1JlYWQgPSBieXRlc1RvUmVhZDsKLQkJCXdoaWxlICh0b1JlYWQgPiAwKSB7Ci0JCQkJaW50IGJ5dGVzUmVhZCA9IGlzLnJlYWQoYnl0ZXMsIHN0YXJ0LCB0b1JlYWQpOwotCQkJCWlmIChieXRlc1JlYWQgPT0gLTEpCi0JCQkJCXJldHVybiBieXRlc1RvUmVhZCAhPSB0b1JlYWQgPyBieXRlc1RvUmVhZC10b1JlYWQgOiAtMTsJLy8gQWN0dWFsIG51bWJlciByZWFkLCBvciBpZiBub25lIHJlYWQsIHRoZW4gRU9GCi0JCQkJc3RhcnQrPWJ5dGVzUmVhZDsKLQkJCQl0b1JlYWQtPWJ5dGVzUmVhZDsKLQkJCX0KLQkJCXJldHVybiBieXRlc1RvUmVhZDsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0JCQotCS8qKgotCSAqIEZvciB3cml0aW5nIGEgbGFyZ2UgbnVtYmVyIG9mIGJ5dGVzLiBUaGlzIGlzIGEgdmFsdWUgdHlwZSwgbm90IGEgY29tbWFuZC4gVGhlIGNvbW1hbmQgCi0JICogbmVlZHMgdG8gYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqCi0JICogSXQgd2lsbCB3cml0ZSBpdCBpbiB0aGUgZm9ybWF0OgotCSAqICAgaW50IC0gbnVtYmVyIG9mIGJ5dGVzCi0JICogICBieXRlcyAtIHRoZSBhY3R1YWwgYnl0ZXMuCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVCeXRlcyhEYXRhT3V0cHV0U3RyZWFtIG9zLCBieXRlW10gYnl0ZXMsIGludCBieXRlc1RvV3JpdGUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uICB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUludChieXRlc1RvV3JpdGUpOwotCQkJb3Mud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzVG9Xcml0ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQkKLQkJCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFNlbmQgY29tbWFuZCBoZWxwZXJzCi0JICoqKioqKioqKioqKioqKioqKioqKioqKi8KLQkgCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRRdWl0Q29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvcy53cml0ZUJ5dGUoUVVJVF9DT05ORUNUSU9OKTsKLQkJb3MuZmx1c2goKTsKLQkJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFRlcm1pbmF0ZUNvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3Mud3JpdGVCeXRlKFRFUk1JTkFURV9TRVJWRVIpOwotCQlvcy5mbHVzaCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZU9iamVjdENvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgaW50IGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuUkVMRUFTRV9PQkpFQ1QpOwotCQlvcy53cml0ZUludChpZCk7Ci0JCW9zLmZsdXNoKCk7Ci0JfQotCi0JLyoqCi0JICogU2VuZCBhIGNhbGxiYWNrIHJlcXVlc3QuIFRoZSB2YWx1ZSBpcyB0byBiZSBzZW5kIHNlcGFyYXRlbHkuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRDYWxsYmFja0NvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKENBTExCQUNLKTsKLQkJCW9zLndyaXRlSW50KGNhbGxiYWNrSUQpOwotCQkJb3Mud3JpdGVJbnQobXNnSUQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkJCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRDYWxsYmFja0RvbmVDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIFZhbHVlT2JqZWN0IHZhbHVlLCBpbnQgZXJyb3JDb2RlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ0FMTEJBQ0tfRE9ORSk7Ci0JCQlpZiAoZXJyb3JDb2RlID09IE5PX0VSUk9SKSB7Ci0JCQkJd3JpdGVWYWx1ZShvcywgdmFsdWUsIHRydWUpOwotCQkJCW9zLmZsdXNoKCk7Ci0JCQl9IGVsc2UKLQkJCQlzZW5kRXJyb3JDb21tYW5kKG9zLCBlcnJvckNvZGUsIHZhbHVlKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBhIHN0YXJ0IGNhbGxiYWNrIHN0cmVhbSByZXF1ZXN0LiBUaGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gc2VwYXJhdGVseS4KLQkgKiBUaGVyZSB3aWxsIG5vdCBiZSBhIGNhbGxiYWNrIGRvbmUgY29tbWFuZC4gSXQgd2lsbCByZXR1cm4gYXMgc29vbiBhcyB0aGUgY29tbWFuZAotCSAqIGlzIHNlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRDYWxsYmFja1N0cmVhbUNvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKENBTExCQUNLX1NUUkVBTSk7Ci0JCQlvcy53cml0ZUludChjYWxsYmFja0lEKTsKLQkJCW9zLndyaXRlSW50KG1zZ0lEKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIFNUUklOR19OT1RfQ0hVTktFRCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIFNUUklOR19DSFVOS0VEID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTU9SRV9DSFVOS1MgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBMQVNUX0NIVU5LID0gMzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDSFVOS19TSVpFID0gNjUwMDAvMzsgCi0JCi0JLyoqCi0JICogU2VuZCBzdHJpbmcgZGF0YS4gVGhpcyBpcyBmb3IgZ2VuZXJhbCBzdHJpbmcgZGF0YS4gSXQgbWFrZXMgc3VyZSB0aGF0IGlmIHRoZSBzdHJpbmcgaXMgdG9vIGJpZyAodGhlcmUgaXMgYSBVVEYtOCBsaW1pdCkKLQkgKiB0aGF0IGl0IHdpbGwgc2VuZCBpdCBpbiBjaHVua3MuIFVzZSB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5yZWFkU3RyaW5nRGF0YTwvY29kZT4gdG8gcmVhZCBzdWNoIGRhdGEgaW4uCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFN0cmluZ0RhdGEoRGF0YU91dHB1dFN0cmVhbSBvcywgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVVRGLTggY2FuIHRha2UgdXAgdG8gdGhyZWUgYnl0ZXMgZm9yIGVhY2ggY2hhci4gVG8gYmUgb24gc2FmZSBzaWRlIHdlIHdpbGwKLQkJLy8gbm90IHNlbmQgYSBzdHJpbmcgbGFyZ2VyIHRoYW4gNjVLLzMgYXMgb25lIGNodW5rLgotCQlpZiAoc3RyaW5nLmxlbmd0aCgpIDw9IENIVU5LX1NJWkUpIHsKLQkJCS8vIExlc3MgdGhhbiB0aGUgbGltaXQsIHNlbmQgYnl0ZSB0byBpbmRpY2F0ZSBub3QgY2h1bmtlZC4KLQkJCW9zLndyaXRlQnl0ZShTVFJJTkdfTk9UX0NIVU5LRUQpOwotCQkJb3Mud3JpdGVVVEYoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCS8vIE92ZXIgbGltaXQsIG5lZWQgdG8gY2h1bmsgaXQuCi0JCQkvLyBzZW5kIGJ5dGUgdG8gaW5kaWNhdGUgY2h1bmtlZCwgdGhlbiBzZW5kIHRydWUgbGVuZ3RoIHNvIHRoYXQgb3RoZXIgc2lkZSBrbm93cyBob3cgYmlnIHRvIGNyZWF0ZS4KLQkJCW9zLndyaXRlQnl0ZShTVFJJTkdfQ0hVTktFRCk7Ci0JCQlvcy53cml0ZUludChzdHJpbmcubGVuZ3RoKCkpOwotCQkJLy8gTm93IHNlbmQgZmlyc3QgY2h1bmsKLQkJCWZvcihpbnQgaT0wOyBpPHN0cmluZy5sZW5ndGgoKTsgaSs9Q0hVTktfU0laRSkgewotCQkJCWludCBlbmRJbmRleCA9IGkrQ0hVTktfU0laRTsKLQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCS8vIFRoZSBmaXJzdCBjaHVuayBpcyBqdXN0IHdyaXR0ZW4gYXMgaXMuIFdlIGtub3cgZW5kSW5kZXggd2lsbCBiZSBvayBiZWNhdXNlIHdlIHdvdWxkbid0IGdldCBoZXJlIHVubGVzcyBMQVJHRVIgdGhhbiBjaHVua3NpemUuCi0JCQkJCW9zLndyaXRlVVRGKHN0cmluZy5zdWJzdHJpbmcoaSwgZW5kSW5kZXgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBGb2xsb3dpbmcgY2h1bmtzIGhhdmUgZWl0aGVyIGJ5dGUgTU9SRV9DSFVOS1Mgb3IgTEFTVF9DSFVOSwotCQkJCQlpZiAoZW5kSW5kZXggPj0gc3RyaW5nLmxlbmd0aCgpKSB7Ci0JCQkJCQkvLyBUaGlzIGlzIGxhc3QgY2h1bmsuCi0JCQkJCQlvcy53cml0ZUJ5dGUoTEFTVF9DSFVOSyk7Ci0JCQkJCQlvcy53cml0ZVVURihzdHJpbmcuc3Vic3RyaW5nKGkpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFRoaXMgaXMgYW4gaW50ZXJtZWRpYXRlIGNodW5rLgotCQkJCQkJb3Mud3JpdGVCeXRlKE1PUkVfQ0hVTktTKTsKLQkJCQkJCW9zLndyaXRlVVRGKHN0cmluZy5zdWJzdHJpbmcoaSwgZW5kSW5kZXgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZWFkIGEgc3RyaW5nIHRoYXQgd2FzIHNlbnQgdXNpbmcgdGhlIHNlbmRTdHJpbmdEYXRhIGNvbW1hbmQuCi0JICogQHBhcmFtIGluCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkU3RyaW5nRGF0YShEYXRhSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGUgY2h1bmtlZCA9IGlzLnJlYWRCeXRlKCk7Ci0JCWlmIChjaHVua2VkID09IFNUUklOR19OT1RfQ0hVTktFRCkKLQkJCXJldHVybiBpcy5yZWFkVVRGKCk7CS8vIE5vdCBjaHVuaywganVzdCByZWFkIGl0LgotCQllbHNlIHsKLQkJCS8vIEl0IGlzIGNodW5rZWQuCi0JCQlpbnQgdG90YWxMZW5ndGggPSBpcy5yZWFkSW50KCk7CS8vIEdldCB0aGUgdG90YWwgbGVuZ3RoLgotCQkJU3RyaW5nQnVmZmVyIHNiciA9IG5ldyBTdHJpbmdCdWZmZXIodG90YWxMZW5ndGgpOwotCQkJd2hpbGUodHJ1ZSkgewotCQkJCXNici5hcHBlbmQoaXMucmVhZFVURigpKTsKLQkJCQlpZiAoY2h1bmtlZCAhPSBMQVNUX0NIVU5LKQotCQkJCQljaHVua2VkID0gaXMucmVhZEJ5dGUoKTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHNici50b1N0cmluZygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlYWQgYmFjayBjb21tYW5kLCBleHBlY3RpbmcgZWl0aGVyIGEgVkFMVUUgb3IgYW4gRVJST1IuIFlvdSBjYW4gcmVxdWVzdCB0aGF0Ci0JICogaXQgYmUgb2YgYSBzcGVjaWZpYyB0eXBlIChpZiBhbnkgdHlwZSBjYW4gYmUgYWNjZXB0ZWQgdGhlbiBlbnRlciAtMSBmb3IgdGhlIHR5cGUpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBOT19UWVBFX0NIRUNLID0gLTE7Ci0JcHVibGljIHN0YXRpYyB2b2lkIHJlYWRCYWNrVmFsdWUoRGF0YUlucHV0U3RyZWFtIGlzLCBWYWx1ZU9iamVjdCB2YWx1ZSwgYnl0ZSBleHBlY3RlZFR5cGUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsJCQotCQkJYnl0ZSB2ID0gaXMucmVhZEJ5dGUoKTsKLQkJCXN3aXRjaCAodikgewotCQkJCWNhc2UgVkFMVUU6Ci0JCQkJCXJlYWRWYWx1ZShpcywgdmFsdWUpOwotCQkJCQlpZiAoZXhwZWN0ZWRUeXBlICE9IE5PX1RZUEVfQ0hFQ0sgJiYgCi0JCQkJCQkJIShleHBlY3RlZFR5cGUgPT0gdmFsdWUudHlwZSB8fCAoZXhwZWN0ZWRUeXBlID09IENvbW1hbmRzLk9CSkVDVF9JRCAmJiB2YWx1ZS50eXBlID09IE5FV19PQkpFQ1RfSUQpKSkKLQkJCQkJCXRocm93IG5ldyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihUWVBFX0lOVkFMSURfRk9SX0NPTU1BTkQsIHRydWUsIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBFUlJPUjoKLQkJCQkJaW50IGNvZGUgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCXJlYWRWYWx1ZShpcywgdmFsdWUpOwotCQkJCQl0aHJvdyBuZXcgQ29tbWFuZEVycm9yRXhjZXB0aW9uKGNvZGUsIHZhbHVlKTsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oVU5LTk9XTl9DT01NQU5ELCBmYWxzZSwgbmV3IEJ5dGUodikpOwotCQkJfQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQkJCi0JfQotCQkKLQkKLQkvKioKLQkgKiBHZXRDbGFzcyBjb21tYW5kIHJldHVybnMgYSBHZXRDbGFzc1JldHVybiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBHZXRDbGFzc1JldHVybiB7Ci0JCXB1YmxpYyBpbnQgY2xhc3NJRDsKLQkJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2U7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3Q7Ci0JCXB1YmxpYyBTdHJpbmcgc3VwZXJDbGFzc25hbWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgR2V0Q2xhc3NSZXR1cm4gc2VuZEdldENsYXNzQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShHRVRfQ0xBU1MpOwotCQkJb3Mud3JpdGVVVEYoY2xhc3NOYW1lKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQkKLQkJCUdldENsYXNzUmV0dXJuIHJldCA9IG5ldyBHZXRDbGFzc1JldHVybigpOwotCQkJYnl0ZSB2ID0gaXMucmVhZEJ5dGUoKTsKLQkJCXN3aXRjaCAodikgewotCQkJCWNhc2UgR0VUX0NMQVNTX1JFVFVSTjoKLQkJCQkJcmV0LmNsYXNzSUQgPSBpcy5yZWFkSW50KCk7CS8vIEdldCB0aGUgbmV3IGNsYXNzIGlkLgotCQkJCQlyZXQuaXNJbnRlcmZhY2UgPSBpcy5yZWFkQm9vbGVhbigpOwkvLyBHZXQgdGhlIGlzSW50ZXJmYWNlIGZsYWcKLQkJCQkJcmV0LmlzQWJzdHJhY3QgPSBpcy5yZWFkQm9vbGVhbigpOwkvLyBHZXQgdGhlIGlzQWJzdHJhY3QgZmxhZy4JCQkJCQotCQkJCQlyZXQuc3VwZXJDbGFzc25hbWUgPSBpcy5yZWFkVVRGKCk7CS8vIEdldCB0aGUgc3VwZXIgY2xhc3MgbmFtZS4KLQkJCQkJcmV0dXJuIHJldDsKLQkJCQljYXNlIEVSUk9SOgotCQkJCQlpbnQgY29kZSA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJVmFsdWVPYmplY3QgdmFsdWUgPSBuZXcgVmFsdWVPYmplY3QoKTsKLQkJCQkJcmVhZFZhbHVlKGlzLCB2YWx1ZSk7Ci0JCQkJCXRocm93IG5ldyBDb21tYW5kRXJyb3JFeGNlcHRpb24oY29kZSwgdmFsdWUpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihVTktOT1dOX0NPTU1BTkQsIGZhbHNlLCBuZXcgQnl0ZSh2KSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIEdldENsYXNzRnJvbUlEIGNvbW1hbmQgcmV0dXJucyBhIEdldENsYXNzSURSZXR1cm4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0Q2xhc3NJRFJldHVybiB7Ci0JCXB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lOwotCQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZTsKLQkJcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdDsKLQkJcHVibGljIFN0cmluZyBzdXBlckNsYXNzbmFtZTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgR2V0Q2xhc3NJRFJldHVybiBzZW5kR2V0Q2xhc3NGcm9tSURDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIERhdGFJbnB1dFN0cmVhbSBpcywgaW50IGNsYXNzSUQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShHRVRfQ0xBU1NfRlJPTV9JRCk7Ci0JCQlvcy53cml0ZUludChjbGFzc0lEKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQkKLQkJCUdldENsYXNzSURSZXR1cm4gcmV0ID0gbmV3IEdldENsYXNzSURSZXR1cm4oKTsKLQkJCWJ5dGUgdiA9IGlzLnJlYWRCeXRlKCk7Ci0JCQlzd2l0Y2ggKHYpIHsKLQkJCQljYXNlIEdFVF9DTEFTU19JRF9SRVRVUk46Ci0JCQkJCXJldC5jbGFzc05hbWUgPSBpcy5yZWFkVVRGKCk7CS8vIEdldCB0aGUgbmV3IGNsYXNzIG5hbWUuCi0JCQkJCXJldC5pc0ludGVyZmFjZSA9IGlzLnJlYWRCb29sZWFuKCk7CS8vIEdldCB0aGUgaXNJbnRlcmZhY2UgZmxhZwotCQkJCQlyZXQuaXNBYnN0cmFjdCA9IGlzLnJlYWRCb29sZWFuKCk7CS8vIEdldCB0aGUgaXNBYnN0cmFjdCBmbGFnLgotCQkJCQlyZXQuc3VwZXJDbGFzc25hbWUgPSBpcy5yZWFkVVRGKCk7CS8vIEdldCB0aGUgc3VwZXIgY2xhc3MgbmFtZS4KLQkJCQkJcmV0dXJuIHJldDsKLQkJCQljYXNlIEVSUk9SOgotCQkJCQlpbnQgY29kZSA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJVmFsdWVPYmplY3QgdmFsdWUgPSBuZXcgVmFsdWVPYmplY3QoKTsKLQkJCQkJcmVhZFZhbHVlKGlzLCB2YWx1ZSk7Ci0JCQkJCXRocm93IG5ldyBDb21tYW5kRXJyb3JFeGNlcHRpb24oY29kZSwgdmFsdWUpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihVTktOT1dOX0NPTU1BTkQsIGZhbHNlLCBuZXcgQnl0ZSh2KSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQotCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEdldE9iamVjdERhdGEoRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBpbnQgb2JqZWN0SUQsIFZhbHVlT2JqZWN0IHZhbHVlUmV0dXJuKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoR0VUX09CSkVDVF9EQVRBKTsKLQkJCW9zLndyaXRlSW50KG9iamVjdElEKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlyZWFkQmFja1ZhbHVlKGlzLCB2YWx1ZVJldHVybiwgTkVXX09CSkVDVF9JRCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQkJCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRFcnJvckNvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgaW50IGNvZGUsIFZhbHVlT2JqZWN0IGVycm9yVmFsdWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShFUlJPUik7Ci0JCQlvcy53cml0ZUludChjb2RlKTsKLQkJCXdyaXRlVmFsdWUob3MsIGVycm9yVmFsdWUsIGZhbHNlKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQkJCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmROZXdJbnN0YW5jZShEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIGludCBjbGFzc0lkLCBTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcsIFZhbHVlT2JqZWN0IG5ld1ZhbHVlUmV0dXJuKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoTkVXX0lOSVRfU1RSSU5HKTsKLQkJCW9zLndyaXRlSW50KGNsYXNzSWQpOwotCQkJb3Mud3JpdGVVVEYoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwotCQkJb3MuZmx1c2goKTsKLQkJCXJlYWRCYWNrVmFsdWUoaXMsIG5ld1ZhbHVlUmV0dXJuLCBOT19UWVBFX0NIRUNLKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9CQotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kSW52b2tlTWV0aG9kQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIGludCBtZXRob2RJRCwgVmFsdWVPYmplY3QgaW52b2tlT24sIFZhbHVlT2JqZWN0IHBhcm1zLCBWYWx1ZU9iamVjdCB2YWx1ZVJldHVybikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKElOVk9LRSk7Ci0JCQlvcy53cml0ZUludChtZXRob2RJRCk7Ci0JCQl3cml0ZVZhbHVlKG9zLCBpbnZva2VPbiwgZmFsc2UpOwotCQkJd3JpdGVWYWx1ZShvcywgcGFybXMsIGZhbHNlKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlyZWFkQmFja1ZhbHVlKGlzLCB2YWx1ZVJldHVybiwgTk9fVFlQRV9DSEVDSyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRJbnZva2VNZXRob2RDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIERhdGFJbnB1dFN0cmVhbSBpcywgVmFsdWVPYmplY3QgY2xhc3NUeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgVmFsdWVPYmplY3QgcGFybVR5cGVzLCBWYWx1ZU9iamVjdCBpbnZva2VPbiwgVmFsdWVPYmplY3QgcGFybXMsIFZhbHVlT2JqZWN0IHZhbHVlUmV0dXJuKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoSU5WT0tFX1dJVEhfTUVUSE9EX1BBU1NFRCk7Ci0JCQl3cml0ZVZhbHVlKG9zLCBjbGFzc1R5cGUsIGZhbHNlKTsKLQkJCW9zLndyaXRlVVRGKG1ldGhvZE5hbWUpOwotCQkJd3JpdGVWYWx1ZShvcywgcGFybVR5cGVzLCBmYWxzZSk7Ci0JCQl3cml0ZVZhbHVlKG9zLCBpbnZva2VPbiwgZmFsc2UpOwotCQkJd3JpdGVWYWx1ZShvcywgcGFybXMsIGZhbHNlKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlyZWFkQmFja1ZhbHVlKGlzLCB2YWx1ZVJldHVybiwgTk9fVFlQRV9DSEVDSyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kR2V0QXJyYXlDb250ZW50c0NvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBpbnQgYXJyYXlJRCwgVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShHRVRfQVJSQVlfQ09OVEVOVFMpOwotCQkJb3Mud3JpdGVJbnQoYXJyYXlJRCk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJcmVhZEJhY2tWYWx1ZShpcywgdmFsdWVSZXR1cm4sIE5PX1RZUEVfQ0hFQ0spOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIENvbW1hbmRzKCkgewotCQkvLyBOZXZlciBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQuCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL0V4cHJlc3Npb25Db21tYW5kcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL0V4cHJlc3Npb25Db21tYW5kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODc5ZDI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9FeHByZXNzaW9uQ29tbWFuZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBFeHByZXNzaW9uQ29tbWFuZHMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotCi0gCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHByZXNzaW9uQ29tbWFuZHMgewotCi0JLy8gVGhlc2UgYXJlIHRoZSBzdWItY29tbWFuZHMgdW5kZXIgRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkRTIHRoYXQgY2FuIGJlIHNlbmQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlCi0JCVNUQVJUX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HID0gMCwKLQkJUFVTSF9FWFBSRVNTSU9OID0gMSwKLQkJRU5EX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HID0gMiwKLQkJU1lOQ19SRVFVRVNUID0gMywKLQkJUFVMTF9WQUxVRV9SRVFVRVNUID0gNCwKLQkJVFJBTlNGRVJfRVhQUkVTU0lPTl9SRVFVRVNUID0gNSwKLQkJUkVTVU1FX0VYUFJFU1NJT05fUkVRVUVTVCA9IDY7Ci0JCQotCS8vIFRoZXNlIGFyZSB0aGUgZXhwcmVzc2lvbiBzcGVjaWZpYyBlcnJvciBjb2RlcyAoaXQgY2FuIGFsc28gc2VuZCBiYWNrIGdlbmVyYWwgb25lcy4gU2VlIFNZTkNfUkVRVUVTVCBkb2NzIGxvd2VyIGRvd24pLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50Ci0JCUVYUFJFU1NJT05fTk9FWFBSRVNTSU9OVkFMVUVfRVhDRVBUSU9OID0gQ29tbWFuZHMuTUFYX0VSUk9SX0NPREUrMTsJLy8gTm8gZXhwcmVzc2lvbiB2YWx1ZSBvY2N1cnJlZC4KLQkKLQkvLyBUaGVzZSBhcmUgdGhlIGZsYWcgdmFsdWVzIHNlbnQgaW4gcHJveHkgcmVzb2x1dGlvbiB3aGVuIGRvZXNuJ3QgcmVzb2x2ZSB0byBwcm94eS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludAotCQlFWFBSRVNTSU9OUFJPWFlfVk9JRFRZUEUgPSAwLAkvLyBFeHByZXNzaW9uIHByb3h5IHJlc29sdmVzIHRvIHZvaWQgdHlwZS4KLQkJRVhQUkVTU0lPTlBST1hZX05PVFJFU09MVkVEID0gMTsJLy8gRXhwcmVzc2lvbiBwcm94eSBub3QgcmVzb2x2ZWQuCi0JCi0JLy8gVGhlc2UgYXJlIHRoZSB0cmFjZSB2YWx1ZXMgc2VudCBpbiBTVEFSVF9FWFBSRVNTSU9OX1RSRUVfUFJPQ0VTU0lORwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZQotCQlUUkFDRV9ERUZBVUxUID0gLTEsCi0JCVRSQUNFX09GRiA9IDAsCi0JCVRSQUNFX09OID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05UUkFDRSA9ICJwcm94eXZtLmV4cHJlc3Npb25UcmFjZSI7CS8vIFRoZSBzeXN0ZW0gcHJvcGVydHkgZm9yIHR1cm5pbmcgb24gZXhwcmVzc2lvbiB0cmFjaW5nLiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTlRSQUNFX1RJTUVSX1RIUkVTSE9MRCA9ICJwcm94eXZtLmV4cHJlc3Npb25UcmFjZVRpbWVyVGhyZXNob2xkIjsJLy8gVGhlIHN5c3RlbSBwcm9wZXJ0eSBmb3IgdGltZXIgdGhyZXNob2xkLiAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBUaGUgZm9ybWF0IG9mIHRoZSBjb21tYW5kcyBhcmU6Ci0JICogCQlOb3RlOiBNb3N0IG9mIHRoZSBjb21tYW5kcyB3aWxsIG5vdCBiZWluZyBkb2luZyBhIG9zLmZsdXNoKCkgYXQgdGhlIGVuZC4gV2UgYXJlIGp1c3QgZ29pbmcgdG8KLQkgKiAJCWJlIHN0cmVhbWluZyB0aGUgZGF0YSBvdmVyIHRoZSBsaW5lLiBBdCB0aGUgZW5kIHdlIHdpbGwgZmx1c2ggYW5kIHRoZW4gY2F0Y2ggdXAuIFRoYXQgd2F5Ci0JICogCQl3ZSBhcmVuJ3Qgd2FpdGluZyBmb3IgdGhlIG90aGVyIHNpZGUgYXMgd2Ugc2VuZCB0aGUgZGF0YS4KLQkgKiAKLQkgKiBTVEFSVF9FWFBSRVNTSU9OX1RSRUVfUFJPQ0VTU0lORzogMGIsIHRyYWNlCi0JICogCVN0YXJ0IHByb2Nlc3NpbmcuCi0JICogIGJ5dGUodHJhY2UpOiAtMSA6IGRvIGRlZmF1bHQKLQkgKiAgICAgICAgICAgICAgICAwIDogbm8gdHJhY2UKLQkgKiAgICAgICAgICAgICAgICAxIDogZG8gdHJhY2UKLQkgKiAKLQkgKiBQVVNIX0VYUFJFU1NJT046IDFiLCBiCi0JICogCVB1c2ggYW4gZXhwcmVzc2lvbi4gV2hlcmUgImIiIGlzIHRoZSBleHByZXNzaW9uIHR5cGUgZnJvbSBJSW50ZXJuYWxFeHByZXNzaW9uQ29uc3RhbnRzLiAKLQkgKiAJVGhlIGFjdHVhbCBkYXRhIHRoYXQgZm9sbG93cyBpcyBleHByZXNzaW9uIHR5cGUgZGVwZW5kZW50IGFuZCB3aWxsIGJlCi0JICogCXNlbnQgaW4gYSBmb2xsb3dpbmcgY2FsbCB0byBFeHByZXNzaW9uQ29tbWFuZHMgYXMgaXQgYnVpbGRzIHVwIHRoZSBhY3R1YWwgY29tbWFuZC4KLQkgKiAJU2VlIFJFTUV4cHJlc3Npb24gYW5kIGVhY2ggdHlwZSBvZiBwdXNoIGNhbGwgbWV0aG9kIHdpdGhpbiBpdCB0byBzZWUgdGhlIGFjdHVhbAotCSAqIAlzZW50IGRhdGEuCi0JICogCi0JICogRU5EX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HOiAyYgotCSAqIAlFbmQgdGhlIHByb2Nlc3NpbmcgYW5kIGNsZWFuIHVwLgotCSAqIAotCSAqIFNZTkNfUkVRVUVTVDogM2IKLQkgKiAJVGhpcyB3aWxsIHJldHVybiB0aGUgY3VycmVudCBzdGF0dXMuIFRoZSByZWFzb24gaXQgaXMgY2FsbGVkIHN5bmMgaXMgYmVjYXVzZSB0aGUKLQkgKiAJSURFIHdpbGwgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUgYW5kIHJlYWQgYmFjayB0aGUgdmFsdWUuIEl0IHdpbGwgc2VuZCBiYWNrOgotCSAqIAkJMTogVkFMVUUgY29tbWFuZCB3aXRoIGJvb2xlYW4gdHJ1ZSBhcyB0aGUgdmFsdWUuCi0JICogCQkyOiBFUlJPUiBjb21tYW5kIHdpdGggY29kZSBvZiBFeHByZXNzaW9uQ2xhc3NOb3RGb3VuZCwgd2l0aCB2YWx1ZSBvZiBTdHJpbmcgd2l0aCBtZXNzYWdlIGZyb20gZXhjZXB0aW9uLgotCSAqIAkJMzogRVJST1IgY29tbWFuZCB3aXRoIGNvZGUgb2YgRVhQUkVTU0lPTl9OT0VYUFJFU1NJT05WQUxVRV9FWENFUFRJT04sIHdpdGggdmFsdWUgb2YgU3RyaW5nIHdpdGggbWVzc2FnZSBmcm9tIGV4Y2VwdGlvbi4KLQkgKiAJCTQ6IFRIUk9XQUJMRSBjb21tYW5kIHdpdGggdGhlIGFjdHVhbCBleGNlcHRpb24gdGhhdCBvY2N1cnJlZC4KLQkgKiAKLQkgKgotCSAqIFBVTExfVkFMVUVfUkVRVUVTVDogNGIKLQkgKiAJVGhpcyB3aWxsIGRvIGEgc3luYyB1cCBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBmcm9tIHRoZSBleHByZXNzaW9uLgotCSAqIAlJREUgd2lsbCB3YWl0IGZvciBpdCB0byBjb21wbGVhdGUgYW5kIHJlYWQgYmFjayB0aGUgdmFsdWUuIEl0IHdpbGwgc2VuZCBiYWNrOgotCSAqIAkJMTogVkFMVUUgY29tbWFuZCB3aXRoIHRoZSByZXN1bHQgYXMgdGhlIHZhbHVlLgotCSAqIAkJMjogRVJST1Igb3IgRVhDRVBUSU9OIGlmIHRoZXJlIHdlcmUgZXJyb3JzLCBzZWUgU1lOQ19SRVFVRVNUIHdpdGggdGhlIGZvcm1hdCB0aGV5IGFyZSBzZW50IGJhY2suCi0JICogCi0JICogVFJBTlNGRVJfRVhQUkVTU0lPTl9SRVFVRVNUOiA1YgotCSAqICBUaGlzIHdpbGwgZG8gYSBzeW5jIHVwLCBhbmQgcmV0dXJuIHRoZSBFeHByZXNzaW9uUHJvY2Vzc29yQ29udHJvbGxlciB0aGF0IHRoZSByZXF1ZXN0IGlzIGZvci4gQW5kIHJlbW92ZQotCSAqICB0aGUgY29udHJvbGxlciBmcm9tIGl0cyBsaXN0IG9mIGFjdGl2ZSBleHByZXNzaW9uIGNvbnRyb2xsZXJzLiAKLQkgKiAgCi0JICogUkVTVU1FX0VYUFJFU1NJT05fUkVRVUVTVDogNmIsIGFuRXhwcmVzc2lvblByb2Nlc3NvckNvbnRyb2xsZXIKLQkgKiAgVGhpcyB3aWxsIHRha2UgdGhlIGdpdmVuIGNvbnRyb2xsZXIgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBjb250cm9sbGVycyB0aGlzIGNvbm5lY3Rpb24gaXMgaGFuZGxpbmcuIEl0IHJldHVybnMgbm90aGluZy4gIAotCSAqICAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSUludGVybmFsRXhwcmVzc2lvbkNvbnN0YW50cwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1FeHByZXNzaW9uCi0JICogCi0JICovCi0JCi0JLyoqCi0JICogU2VuZCB0aGUgc3RhcnQgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGNvbW1hbmQuCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRAotCSAqIEBwYXJhbSB0cmFjZSAKLQkgKiBAcGFyYW0gb3MKLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRTdGFydEV4cHJlc3Npb25Qcm9jZXNzaW5nQ29tbWFuZChpbnQgZXhwcmVzc2lvbklELCBieXRlIHRyYWNlLCBEYXRhT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQlvcy53cml0ZUludChleHByZXNzaW9uSUQpOwotCQlvcy53cml0ZUJ5dGUoU1RBUlRfRVhQUkVTU0lPTl9UUkVFX1BST0NFU1NJTkcpOwotCQlvcy53cml0ZUJ5dGUodHJhY2UpOwotCX0KLQkKLQkvKioKLQkgKiBTZW5kIHRoZSBlbmQgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGNvbW1hbmQuCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRCAKLQkgKiBAcGFyYW0gb3MKLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRFbmRFeHByZXNzaW9uUHJvY2Vzc2luZ0NvbW1hbmQoaW50IGV4cHJlc3Npb25JRCwgRGF0YU91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3Mud3JpdGVCeXRlKENvbW1hbmRzLkVYUFJFU1NJT05fVFJFRV9DT01NQU5EKTsKLQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJb3Mud3JpdGVCeXRlKEVORF9FWFBSRVNTSU9OX1RSRUVfUFJPQ0VTU0lORyk7Ci0JCW9zLmZsdXNoKCk7CS8vIEZsdXNoaW5nIGJlY2F1c2Ugd2UgYXJlIGRvbmUgYW5kIHdhbnQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgZ29lcyBvdXQuCi0JfQotCQotCS8qKgotCSAqIFNlbmQgYW4gZXhwcmVzc2lvbiBzdWJjb21tYW5kLgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQgCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIHN1YmNvbW1hbmQKLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRFeHByZXNzaW9uQ29tbWFuZChpbnQgZXhwcmVzc2lvbklELCBEYXRhT3V0cHV0U3RyZWFtIG9zLCBieXRlIHN1YmNvbW1hbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQnl0ZShDb21tYW5kcy5FWFBSRVNTSU9OX1RSRUVfQ09NTUFORCk7Ci0JCW9zLndyaXRlSW50KGV4cHJlc3Npb25JRCk7Ci0JCW9zLndyaXRlQnl0ZShQVVNIX0VYUFJFU1NJT04pOwotCQlvcy53cml0ZUJ5dGUoc3ViY29tbWFuZCk7Ci0JfQotCQotCS8qKgotCSAqIFNlbmQganVzdCBhIGJ5dGUuCi0JICogCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGFCeXRlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kQnl0ZShEYXRhT3V0cHV0U3RyZWFtIG9zLCBieXRlIGFCeXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvcy53cml0ZUJ5dGUoYUJ5dGUpOwotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGp1c3QgYW4gaW50LgotCSAqIAotCSAqIEBwYXJhbSBvcwotCSAqIEBwYXJhbSBhbkludAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEludChEYXRhT3V0cHV0U3RyZWFtIG9zLCBpbnQgYW5JbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlSW50KGFuSW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBqdXN0IGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvcwotCSAqIEBwYXJhbSBhU3RyaW5nCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kU3RyaW5nKERhdGFPdXRwdXRTdHJlYW0gb3MsIFN0cmluZyBhU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDb21tYW5kcy5zZW5kU3RyaW5nRGF0YShvcywgYVN0cmluZyk7Ci0JfQotCQotCS8qKgotCSAqIFNlbmQganVzdCBhIGJvb2xlYW4uCi0JICogCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGFCb29sCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kQm9vbGVhbihEYXRhT3V0cHV0U3RyZWFtIG9zLCBib29sZWFuIGFCb29sKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvcy53cml0ZUJvb2xlYW4oYUJvb2wpOwotCX0KLQkKLQkvKioKLQkgKiBTZW5kIHRoZSBwdWxsIHZhbHVlIGNvbW1hbmQuIEFmdGVyIHByb2Nlc3NpbmcgdGhlIHByb3hpZXMsIGNhbGxlciBzaG91bGQgY2FsbCBnZXRGaW5hbFZhbHVlKCkgdG8gZ2V0IHRoZSB2YWx1ZS4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklEIAotCSAqIEBwYXJhbSBvcwotCSAqIEBwYXJhbSBpcwotCSAqIEBwYXJhbSBwcm94eWlkcyBpZiBub3QgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhpcyBpcyB0aGUgbGlzdCBvZiBleHByZXNzaW9uIHByb3h5IGlkcyB0aGF0IG5lZWQgdG8gYmUgcmV0dXJuZWQgYXMgcmVuZGVyZWQuCi0JICogQHBhcmFtIHNlbmRlciBzZW5kZXIgdXNlZCB0byBwcm9jZXNzIHRoZSByZXNvbHZlZCBwcm94eSBpZHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb3h5IGlkcy4KLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFB1bGxWYWx1ZUNvbW1hbmQoaW50IGV4cHJlc3Npb25JRCwgRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcywgQ29tbWFuZHMuVmFsdWVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJCW9zLndyaXRlQnl0ZShQVUxMX1ZBTFVFX1JFUVVFU1QpOwotCQkJc2VuZFByb3h5SURzKG9zLCBwcm94eWlkcyk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJaWYgKHByb3h5aWRzICE9IG51bGwpIHsKLQkJCQlDb21tYW5kcy5yZWFkQmFja1ZhbHVlKGlzLCBwcm94eWlkcywgQ29tbWFuZHMuQVJSQVlfSURTKTsJLy8gUmVhZCB0aGUgYXJyYXkgaGVhZGVyLgotCQkJCXNlbmRlci5pbml0aWFsaXplKHByb3h5aWRzKTsKLQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaXMsIHByb3h5aWRzLmFuSW50LCBzZW5kZXIsIHByb3h5aWRzLCB0cnVlKTsJLy8gUmVhZCB0aGUgYXJyYXkuCi0JCQl9Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBhIHN5bmMgY29tbWFuZC4gVGhpcyBkb2VzIGEgc3luY2hyb25pemUgd2l0aCB0aGUgcmVtb3RlIGV4cHJlc3Npb24gcHJvY2Vzc29yLiBJdCBtYWtlcyBzdXJlIHRoYXQgdGhlCi0JICogc3RyZWFtIGlzIGNhdWdodCBhbmQgZG9lc24ndCByZXR1cm4gdW50aWwgZXZlcnl0aGluZyBvbiB0aGUgc3RyZWFtIGhhcyBiZWVuIHByb2Nlc3NlZC4gU2hvdWxkIHRoZW4gY2FsbAotCSAqIGdldEZpbmFsVmFsdWUoKSB0byB2ZXJpZnkgdGhlIGV4cHJlc3Npb24gaXMgdmFsaWQuCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRCAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gaXMKLQkgKiBAcGFyYW0gcHJveHlpZHMgaWYgbm90IDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoaXMgaXMgdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbiBwcm94eSBpZHMgdGhhdCBuZWVkIHRvIGJlIHJldHVybmVkIGFzIHJlbmRlcmVkLgotCSAqIEBwYXJhbSBzZW5kZXIgdGhlIHNlbmRlciB1c2VkIGZvciByZWFkaW5nIGJhY2sgdGhlIHByb3h5aWQgcmVzb2x1dGlvbnMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb3h5IGlkcy4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFN5bmNDb21tYW5kKGludCBleHByZXNzaW9uSUQsIERhdGFPdXRwdXRTdHJlYW0gb3MsIERhdGFJbnB1dFN0cmVhbSBpcywgQ29tbWFuZHMuVmFsdWVPYmplY3QgcHJveHlpZHMsIENvbW1hbmRzLlZhbHVlU2VuZGVyIHNlbmRlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKENvbW1hbmRzLkVYUFJFU1NJT05fVFJFRV9DT01NQU5EKTsKLQkJCW9zLndyaXRlSW50KGV4cHJlc3Npb25JRCk7Ci0JCQlvcy53cml0ZUJ5dGUoU1lOQ19SRVFVRVNUKTsKLQkJCXNlbmRQcm94eUlEcyhvcywgcHJveHlpZHMpOwotCQkJb3MuZmx1c2goKTsKLQkJCWlmIChwcm94eWlkcyAhPSBudWxsKSB7Ci0JCQkJQ29tbWFuZHMucmVhZEJhY2tWYWx1ZShpcywgcHJveHlpZHMsIENvbW1hbmRzLkFSUkFZX0lEUyk7CS8vIFJlYWQgdGhlIGFycmF5IGhlYWRlci4KLQkJCQlzZW5kZXIuaW5pdGlhbGl6ZShwcm94eWlkcyk7Ci0JCQkJQ29tbWFuZHMucmVhZEFycmF5KGlzLCBwcm94eWlkcy5hbkludCwgc2VuZGVyLCBwcm94eWlkcywgdHJ1ZSk7CS8vIFJlYWQgdGhlIGFycmF5LgotCQkJfQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0JCi0JCi0JLyoqCi0JICogU2VuZCB0aGUgcHJveHlpZHMgKGlmIG5vdCBudWxsKSBhcyBwYXJ0IG9mIGEgY29tbWFuZC4gVXNlZCBieSBzeW5jIGFuZCBwdWxsVmFsdWUuCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIHByb3h5aWRzIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCByZXF1ZXN0aW5nIHByb3h5IGlkcy4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kUHJveHlJRHMoRGF0YU91dHB1dFN0cmVhbSBvcywgQ29tbWFuZHMuVmFsdWVPYmplY3QgcHJveHlpZHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm94eWlkcyAhPSBudWxsKSB7Ci0JCQlvcy53cml0ZUJvb2xlYW4odHJ1ZSk7CS8vIEluZGljYXRlcyBwcm94eSBpZHMgYmVpbmcgc2VudC4KLQkJCUNvbW1hbmRzLndyaXRlVmFsdWUob3MsIHByb3h5aWRzLCBmYWxzZSwgZmFsc2UpOwotCQl9IGVsc2UKLQkJCW9zLndyaXRlQm9vbGVhbihmYWxzZSk7CS8vIE5vIHByb3h5aWRzIGJlaW5nIHNlbnQuCi0JfQotCQotCS8qKgotCSAqIFNlbmQgdGhlIHRyYW5zZmVyIGV4cHJlc3Npb24gY29tbWFuZCBhbmQgcmVjZWl2ZSBiYWNrIHRoZSBleHByZXNzaW9uIHByb2Nlc3NvciBjb250cm9sbGVyLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gaXMKLQkgKiBAcGFyYW0gZXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFRyYW5zZmVyRXhwcmVzc2lvbkNvbW1hbmQoaW50IGV4cHJlc3Npb25JRCwgRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKENvbW1hbmRzLkVYUFJFU1NJT05fVFJFRV9DT01NQU5EKTsKLQkJCW9zLndyaXRlSW50KGV4cHJlc3Npb25JRCk7Ci0JCQlvcy53cml0ZUJ5dGUoVFJBTlNGRVJfRVhQUkVTU0lPTl9SRVFVRVNUKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlDb21tYW5kcy5yZWFkQmFja1ZhbHVlKGlzLCBleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciwgQ29tbWFuZHMuTk9fVFlQRV9DSEVDSyk7IC8vIFJlYWQgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yIGNvbnRyb2xsZXIKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZW5kIHRoZSByZXN1bWUgZXhwcmVzc2lvbiBjb21tYW5kIHdpdGggZ2l2ZW4gZXhwcmVzc2lvbiBwcm9jZXNzb3IgY29udHJvbGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklECi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRSZXN1bWVFeHByZXNzaW9uQ29tbWFuZChpbnQgZXhwcmVzc2lvbklELCBEYXRhT3V0cHV0U3RyZWFtIG9zLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBleHByZXNzaW9uUHJvY2Vzc29yQ29udHJvbGxlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKENvbW1hbmRzLkVYUFJFU1NJT05fVFJFRV9DT01NQU5EKTsKLQkJCW9zLndyaXRlSW50KGV4cHJlc3Npb25JRCk7Ci0JCQlvcy53cml0ZUJ5dGUoUkVTVU1FX0VYUFJFU1NJT05fUkVRVUVTVCk7Ci0JCQlDb21tYW5kcy53cml0ZVZhbHVlKG9zLCBleHByZXNzaW9uUHJvY2Vzc29yQ29udHJvbGxlciwgZmFsc2UsIGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQkKLQl9Ci0JCi0JcHJpdmF0ZSBFeHByZXNzaW9uQ29tbWFuZHMoKSB7Ci0JCS8vIE5ldmVyIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvSU9Db21tYW5kRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvSU9Db21tYW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0N2RjZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL0lPQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElPQ29tbWFuZEV4Y2VwdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY29tbWFuZCBleGNlcHRpb24gb2NjdXJlZCB3aGlsZSBwcm9jZXNzaW5nIGFuIGlvIHJlcXVlc3QKLSAqIGluIGEgY2FsbGJhY2sgc3RyZWFtLiBUaGlzIGV4Y2VwdGlvbiB3cmFwcGVycyB0aGUgY29tbWFuZCBleGNlcHRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIElPQ29tbWFuZEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMzA4OTQ3MTk1MTY0MzgyNzc5TDsKLQlwcm90ZWN0ZWQgQ29tbWFuZEV4Y2VwdGlvbiBmRXhjZXB0aW9uOwotCQotCXB1YmxpYyBJT0NvbW1hbmRFeGNlcHRpb24oQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCWZFeGNlcHRpb24gPSBlOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBmRXhjZXB0aW9uOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmRXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotCQlmRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBwKSB7Ci0JCWZFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHApOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHApIHsKLQkJZkV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UocCk7Ci0JfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL1RyYW5zbWl0YWJsZUFycmF5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVHJhbnNtaXRhYmxlQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiMDc4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVHJhbnNtaXRhYmxlQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBUcmFuc21pdGFibGVBcnJheS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotCi0vKioKLSAqIEEgdmFsdWUgY2FuIGJlIGEgVHJhbnNtaXRhYmxlQXJyYXkuIFRoaXMgbWVhbnMgdGhpcyB2YWx1ZSBpcyBhbiBhcnJheSB0aGF0Ci0gKiBuZWVkcyB0byBoYXZlIGEgVmFsdWVSZXRyaWV2ZXIgY3JlYXRlZCBmb3IgaXQuIFRoaXMgaXMgdXNlZCBpZiB0aGUgYXJyYXkgaGFzIElEJ3MgaW4KLSAqIGl0IGFuZCBpcyBub3QgYW4gZXhpc3RpbmcgYXJyYXkgb24gdGhlIHNlcnZlciBvciBhbGwgY29uc3RhbnQgdmFsdWVzLgotICoKLSAqIE5PVEU6IEl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgSUJlYW5UeXBlUHJveGllcyBvZiB0aGUgcGFybXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotICogICAgICAgSXQgc2hvdWxkIHN0aWxsIHdvcmssIGJ1dCBpdCBjb3VsZCBiZSBhc2tpbmcgZm9yIHRoZW0gaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmVxdWVzdAotICogICAgICAgaWYgdGhleSBhcmUgbm90IGZpcnN0IGdvdHRvbi4gQW5kIHRoaXMgY291bGQgdGhyb3cgYSBub24tcmVjb3ZlcmFibGUgZXhjZXB0aW9uIGlmIG5vdCBmb3VuZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zbWl0YWJsZUFycmF5IHsKLQlwdWJsaWMgaW50IGNvbXBvbmVudFR5cGVJRDsJLy8gVGhlIGlkIG9mIHRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGUgYXJyYXkuCi0JcHVibGljIE9iamVjdFtdIGFycmF5OwkvLyBUaGUgYXJyYXkgaXQgc2VsZi4KLQlwdWJsaWMgVHJhbnNtaXRhYmxlQXJyYXkoaW50IHR5cGVJRCwgT2JqZWN0W10gYW5BcnJheSkgewotCQljb21wb25lbnRUeXBlSUQgPSB0eXBlSUQ7Ci0JCWFycmF5ID0gYW5BcnJheTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL1VuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllMTM3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLS8qKgotICogVGhpcyBpcyBhbiBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiB0aGUgcHJvY2Vzc2luZwotICogb2YgZGF0YSB3YXMgaW52YWxpZCBmb3IgdGhlIGNvbW1hbmQuIAotICogVGhlcmUgd2lsbCBiZSBhIGZsYWcgaW5kaWN0aW5nIGVycm9yIHR5cGUsIGFuZCBhIGZsYWcKLSAqIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyByZWNvdmVyYWJsZSBvciBub3QuCi0gKiBJZiBub3QgcmVjb3ZlcmFibGUsIHRoZW4gdGhlIGNvbm5lY3Rpb24gbmVlZHMgdG8gYmUgY2xvc2VkLgotICoKLSAqLwotcHVibGljIGNsYXNzIFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uIGV4dGVuZHMgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MDk3NjkzMzg0NDUzMjQzMTEzTDsKLQlwcml2YXRlIGZpbmFsIE9iamVjdCBmRXJyb3JUeXBlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmUmVjb3ZlcmFibGU7Ci0JCi0JcHVibGljIFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKE9iamVjdCBlcnJvclR5cGUsIGJvb2xlYW4gcmVjb3ZlcmFibGUpIHsKLQkJZkVycm9yVHlwZSA9IGVycm9yVHlwZTsKLQkJZlJlY292ZXJhYmxlID0gcmVjb3ZlcmFibGU7Ci0JfQkJCi0JCi0JcHVibGljIFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKE9iamVjdCBlcnJvclR5cGUsIGJvb2xlYW4gcmVjb3ZlcmFibGUsIE9iamVjdCBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCQlmRXJyb3JUeXBlID0gZXJyb3JUeXBlOwotCQlmUmVjb3ZlcmFibGUgPSByZWNvdmVyYWJsZTsKLQl9Ci0JCi0JcHVibGljIFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKE9iamVjdCBlcnJvclR5cGUsIGJvb2xlYW4gcmVjb3ZlcmFibGUsIFN0cmluZyBtc2csIE9iamVjdCBkYXRhKSB7Ci0JCXN1cGVyKG1zZywgZGF0YSk7Ci0JCWZFcnJvclR5cGUgPSBlcnJvclR5cGU7Ci0JCWZSZWNvdmVyYWJsZSA9IHJlY292ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RXJyb3JUeXBlKCkgewotCQlyZXR1cm4gZkVycm9yVHlwZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWNvdmVyYWJsZSgpIHsKLQkJcmV0dXJuIGZSZWNvdmVyYWJsZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlTdHJpbmcgbSA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLQkJaWYgKGZFcnJvclR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGRhdGFNc2cgPSBnZXRFeGNlcHRpb25EYXRhKCkgIT0gbnVsbCA/ICIgRXJyb3JkYXRhPSIrZ2V0RXhjZXB0aW9uRGF0YSgpLnRvU3RyaW5nKCkgOiAiIjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAobSA9PSBudWxsKQotCQkJCXJldHVybiAiRXJyb3J0eXBlPSIrZkVycm9yVHlwZS50b1N0cmluZygpICsgZGF0YU1zZzsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCXJldHVybiBtICsgJzonICsgIkVycm9ydHlwZT0iK2ZFcnJvclR5cGUudG9TdHJpbmcoKSArIGRhdGFNc2c7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9VbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDY3ZmVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9VbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi0vKioKLSAqIFdyYXBwZXIgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gaW4gYSBDb21tYW5kIEV4Y2VwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uIGV4dGVuZHMgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTY1NDEzNDM3MDExNTY1MDk2OUw7Ci0KLQlwdWJsaWMgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oYm9vbGVhbiByZWNvdmVyYWJsZSwgVGhyb3dhYmxlIGRhdGEpIHsKLQkJc3VwZXIoQ29tbWFuZHMuU09NRV9VTkVYUEVDVEVEX0VYQ0VQVElPTiwgcmVjb3ZlcmFibGUsIGRhdGEpOwotCX0KLQkKLQlwdWJsaWMgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oYm9vbGVhbiByZWNvdmVyYWJsZSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGRhdGEpIHsKLQkJc3VwZXIoQ29tbWFuZHMuU09NRV9VTkVYUEVDVEVEX0VYQ0VQVElPTiwgcmVjb3ZlcmFibGUsIG1zZywgZGF0YSk7Ci0JfQotCQotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotCQlyZXR1cm4gKFRocm93YWJsZSkgZ2V0RXhjZXB0aW9uRGF0YSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBsb2NhbE1zZyA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLQkJaWYgKGdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQlpZiAobG9jYWxNc2cgPT0gbnVsbCB8fCBsb2NhbE1zZy5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiBnZXRFeGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGxvY2FsTXNnICsgIjogIiArIGdldEV4Y2VwdGlvbigpLmdldExvY2FsaXplZE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4KLQkJCWxvY2FsTXNnOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludEV4Y2VwdGlvblN0YWNrVHJhY2UoKSB7Ci0JCWdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JCXByaW50RXhjZXB0aW9uU3RhY2tUcmFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBwKSB7Ci0JCWdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBwKSB7Ci0JCWdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShwKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvc2NoZW1hL2NvbnRyaWJ1dG9ycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvc2NoZW1hL2NvbnRyaWJ1dG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDAxNGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3NjaGVtYS9jb250cmlidXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS5wcm94eSIgaWQ9ImNvbnRyaWJ1dG9ycyIgbmFtZT0iUHJveHkgQ29uZmlndXJhdGlvbiBDb250cmlidXRvcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBzdXBwbHkgY29uZmlndXJhdGlvbiBjb250cmlidXRvcnMgZm9yIHByb3h5IHN1cHBvcnQuIFlvdSBjYW4gc3VwcGx5IGEgY29udHJpYnV0b3IgZm9yIGEgc3BlY2lmaWMgY2xhc3NwYXRoIGNvbnRhaW5lciBvciBmb3IgYSBwbHVnaW4uCi0mbHQ7cCZndDsKLVRoZSB3YXkgY29uZmlndXJhdGlvbiBjb250cmlidXRvcnMgd29yayBpcyB0aGF0IHdoZW4gYSBwcm94eSB2bSBpcyBzdGFydGVkLCBpdCBmaXJzdCBydW5zIHRocm91Z2ggYWxsIG9mIHRoZSBleHBsaWNpdCBjb250cmlidXRvcnMgdGhhdCB3ZXJlIGdpdmVuIHRvIGl0LiBJdCB0aGVuIGdvZXMgdGhyb3VnaCB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcm9qZWN0IGFuZCBmaW5kcyB0aGUgY29udGFpbmVycy4gSWYgdGhlIGNvbnRhaW5lciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IsIGl0IHdpbGwgYmUgY2FsbGVkIGFzIGEgY29udHJpYnV0b3IuIFRoZW4gYWxsIG9mIHRoZSBleHRlbnNpb25zIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHdpbGwgYmUgc2VhcmNoZWQgZm9yIHRob3NlIGhhdmUgdGhlIHNhbWUgY29udGFpbmVyIGlkLCBhbmQgaWYgc28gdGhleSB3aWxsIGJlIGNhbGxlZCBhcyBhIGNvbnRyaWJ1dG9yLgotJmx0O3AmZ3Q7Ci1UaGUgZXh0ZW5zaW9ucyB3aWxsIGJlIGNhbGxlZCBpbiBwbHVnaW4gb3JkZXIuIEluIG90aGVyIHdvcmRzIGlmIHBsdWdpbiBBIGRlcGVuZHMgb24gcGx1Z2luIEIsIHRoZSBjb250cmlidXRpb24gaW4gcGx1Z2luIEEgd2lsbCBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29udHJpYnV0aW9uIGluIHBsdWdpbiBCLgotJmx0O3AmZ3Q7Ci1JZiBhIHBsdWdpbiBpcyBpbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcm9qZWN0IChpbiBvdGhlciB3b3JkcyB0aGUgcHJvamVjdCBpcyBQREUgcGx1Z2luIGRldmVsb3BtZW50IHByb2plY3QgYW5kIHJlcXVpcmVzIGEgcGx1Z2luKSB0aGVuIHRoZSBjb250cmlidXRvciB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaWQgd2lsbCBiZSBjYWxsZWQuCi0mbHQ7cCZndDsKLUJvdGggY29udGFpbmVyIGFuZCBwbHVnaW4gY2FuIGJlIHNwZWNpZmllZCwgYnV0IGF0IGxlYXN0IG9uZSBvZiB0aGVtIG11c3QgYmUgc3BlY2lmaWVkLiBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhpcyBlbnRyeSB3aWxsIGJlIHVzZWQgaWYgZWl0aGVyIHRoZSBjb250YWluZXIgb3IgdGhlIHBsdWdpbiBpcyBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250cmlidXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRyaWJ1dG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIGNvbnRyaWJ1dG9yLiBFaXRoZXIgdGhlIGNvbnRhaW5lciBhbmQvb3IgdGhlIHBsdWdpbiBhdHRyaWJ1dGVzIG11c3QgYmUgc2V0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgY29udHJpYnV0b3IgaXMgZm9yIGEgY29udGFpbmVyLiBUaGUgdmFsdWUgaXMgdGhlIGNvbnRhaW5lciBpZCAoZS5nLiAmbHQ7YiZndDsmcXVvdDtKUkVfQ09OVEFJTkVSJnF1b3Q7Jmx0Oy9iJmd0OykuIFRoaXMgd2lsbCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUiZxdW90OyBvciAmcXVvdDsvSlJFX0NPTlRBSU5FUi8uLi4mcXVvdDsuIE9yICZsdDtiJmd0OyZxdW90O0pSRV9DT05UQUlORVIvWFlaJnF1b3Q7Jmx0Oy9iJmd0OyB3b3VsZCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUi9YWVovLi4uJnF1b3Q7LgotJmx0O3AmZ3Q7Ci1Zb3UgY2FuIGFsc28gdXNlIGEgcmVndWxhciBleHByZXNzaW9uLiBBbiBleHByZXNzaW9uIHN1Y2ggYXMgJmx0O2ImZ3Q7JnF1b3Q7U1dUX0NPTlRBSU5FUi8uKi9KRkFDRSZxdW90OyZsdDsvYiZndDsgd2lsbCBtYXRjaCAmcXVvdDsvU1dUX0NPTlRBSU5FUi9QREUvSkZBQ0UmcXVvdDsgYnV0IHdpbGwgbm90IG1hdGNoICZxdW90Oy9TV1RfQ09OVEFJTkVSJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb250cmlidXRvciBpcyBmb3IgYSBwbHVnaW4uIFRoZSB2YWx1ZSBpcyB0aGUgcGx1Z2luIGlkIChlLmcuICZxdW90O29yZy5lY2xpcHNlLnN3dCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRyaWJ1dG9yLiBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgY29udHJpYnV0b3I6IAotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0ucHJveHkuY29udHJpYnV0b3JzJnF1b3Q7Jmd0OwotICAmbHQ7Y29udHJpYnV0b3IKLSAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkNvbnRyaWJ1dG9ySW1wbGVtZW50YXRpb24mcXVvdDsKLSAgIGNvbnRhaW5lcj0mcXVvdDtNWV9DT05UQUlORVImcXVvdDsmZ3Q7Ci0gICZsdDsvY29udHJpYnV0b3ImZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciZsdDsvc2FtcCZndDsgaW50ZXJmYWNlIGZvciBjb250cmlidXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlcmUgaXMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQWRhcHRlciZsdDsvc2FtcCZndDsgYXZhaWxhYmxlIHRvIHN1YmNsYXNzIHRvIHByb3ZpZGUgc3BlY2lmaWMgb3ZlcnJpZGVzLiBUaGUgZGVmYXVsdCBmb3IgdGhlIGFkYXB0ZXIgaXMgdGhhdCBpdCBkb2VzbiZhcG9zO3QgZG8gYW55dGhpbmcuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9zY2hlbWEvZXh0ZW5zaW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvc2NoZW1hL2V4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkYzhkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9zY2hlbWEvZXh0ZW5zaW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmplbS5wcm94eSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnByb3h5IiBpZD0iZXh0ZW5zaW9ucyIgbmFtZT0iUHJveHkgRXh0ZW5zaW9uIFJlZ2lzdHJhdGlvbiBDb250cmlidXRvcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBzdXBwbHkgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgZm9yIHByb3h5IHN1cHBvcnQuIFlvdSBjYW4gc3VwcGx5IGFuIGV4dGVuc2lvbiByZWdpc3RyYXRpb24gZm9yIGEgc3BlY2lmaWMgY2xhc3NwYXRoIGNvbnRhaW5lciBvciBmb3IgYSBwbHVnaW4uCi0mbHQ7cCZndDsKLUp1c3QgYWZ0ZXIgdGhlIHJlZ2lzdHJ5IGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGJlZm9yZSBhbnkgY29udHJpYnV0aW9ucyB0byB0aGUgcmVnaXN0cnkgY2FuIGJlIG1hZGUsIHRoZSBleHRlbnNpb24gcmVnaXN0cmF0aW9ucyBmb3IgdGhlIGdpdmVuIHJlZ2lzdHJ5IHR5cGUgKHN1Y2ggYXMgJnF1b3Q7b3JnLmVjbGlwc2UuamVtLlJFTU9URSZxdW90OykgZm9yIGFueSBwYXRocy9wbHVnaW5zL2NvbnRhaW5lcnMgdGhhdCBoYXZlIHRoYXQgbWF0Y2ggd2lsbCBiZSBleGVjdXRlZC4gVGhlc2UgYXJlIHVzZWQgdG8gZG8gZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgKHN1Y2ggYXMgQmFzZVByb3h5RmFjdHJveVJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblR5cGVQcm94eUZhY3RvcnkoU3RyaW5nIHBhY2thZ2VOYW1lLCBJQmVhblR5cGVQcm94eUZhY3RvcnkgYUZhY3RvcnkpKS4gVGhlc2UgcmVnaXN0cmF0aW9ucyBzaG91bGRuJmFwb3M7dCBkbyBhbnkgYWN0dWFsIHByb3h5IGNhbGxzIGJlY2F1c2UgYXQgdGhpcyB0aW1lIG5vdCBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgaGFkIGJlZW4gcnVuIHlldCBhbmQgaXQgbWF5IGFjY2lkZW50bHkgcmVmZXJlbmNlIGEgcGFja2FnZSB0aGF0IHNob3VsZCBoYXZlIGFuIGV4dGVuc2lvbiBmYWN0b3J5IG9uIGl0LCBidXQgdGhhdCBmYWN0b3J5IGhhcyBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZC4gSW5zdGVhZCB0aGUgY29udHJpYnV0b3IgZXh0ZW5zaW9uIHBvaW50IHNob3VsZCBiZSB1c2VkIGZvciB0aGF0IGJlY2F1c2UgYXQgdGhhdCB0aW1lIGFsbCBvZiB0aGUgZXh0ZW5zaW9ucyB3aWxsIGJlIHJlZ2lzdGVyZWQuCi0mbHQ7cCZndDsKLVRoZSB3YXkgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgd29yayBpcyB0aGF0IHdoZW4gYSBwcm94eSB2bSBpcyBzdGFydGVkLCBpdCBmaW5kcyBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBzZWFyY2hlZCBmb3IgdGhvc2UgaGF2ZSB0aGUgc2FtZSBjb250YWluZXIgaWQgYW5kIHJlZ2lzdHJ5IHR5cGUgaWQsIGFuZCBpZiBzbyB0aGV5IHdpbGwgYmUgY2FsbGVkIGFzIGFuIGV4dGVuc2lvbiByZWdpc3RyYXRpb24uCi0mbHQ7cCZndDsKLUlmIGEgcGx1Z2luIGlzIGluIHRoZSBjbGFzc3BhdGggb2YgdGhlIHByb2plY3QgKGluIG90aGVyIHdvcmRzIHRoZSBwcm9qZWN0IGlzIFBERSBwbHVnaW4gZGV2ZWxvcG1lbnQgcHJvamVjdCBhbmQgcmVxdWlyZXMgYSBwbHVnaW4pIHRoZW4gdGhlIGV4dGVuc2lvbiByZWdpc3RyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGlkIHdpbGwgYmUgY2FsbGVkLgotJmx0O3AmZ3Q7Ci1Cb3RoIGNvbnRhaW5lciBhbmQgcGx1Z2luIGNhbiBiZSBzcGVjaWZpZWQsIGJ1dCBhdCBsZWFzdCBvbmUgb2YgdGhlbSBtdXN0IGJlIHNwZWNpZmllZC4gSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoaXMgZW50cnkgd2lsbCBiZSB1c2VkIGlmIGVpdGhlciB0aGUgY29udGFpbmVyIG9yIHRoZSBwbHVnaW4gaXMgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVnaXN0cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVnaXN0cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBQcm94eSBFeHRlbnNpb24gZmFjdG9yaWVzIHJlZ2lzdHJhdGlvbiBjb250cmlidXRvci4gVXNlZCB0byBjb250cmlidXRlIHRoZSBmYWN0b3J5IGV4dGVuc2lvbnMgYmFzZWQgdXBvbiB0aGUgcmVnaXN0cnkgdHlwZSAoZS5nLiAmcXVvdDtvcmcuZWNsaXBzZS5qZW0uUkVNT1RFJnF1b3Q7IGZvciByZW1vdGUgdm0gcmVnaXN0cmllcykgZGVwZW5kaW5nIHVwb24gdGhlIGNvbnRhaW5lciBvciBwbHVnaW4gcGF0aC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVnaXN0cnlUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSByZWdpc3RyeSB0aGlzIGV4dGVuc2lvblJlZ2lzdHJhdGlvbiBpcyBmb3IsIHN1Y2ggYXMgJnF1b3Q7b3JnLmVjbGlwc2UuamVtLlJFTU9URSZxdW90OyBmb3IgdGhlIHJlbW90ZSB2bSByZWdpc3RyeSB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBleHRlbnNpb24gcmVnaXN0cmF0aW9uIGlzIGZvciBhIGNvbnRhaW5lci4gVGhlIHZhbHVlIGlzIHRoZSBjb250YWluZXIgaWQgKGUuZy4gJmx0O2ImZ3Q7JnF1b3Q7SlJFX0NPTlRBSU5FUiZxdW90OyZsdDsvYiZndDspLiBUaGlzIHdpbGwgbWF0Y2ggJnF1b3Q7L0pSRV9DT05UQUlORVImcXVvdDsgb3IgJnF1b3Q7L0pSRV9DT05UQUlORVIvLi4uJnF1b3Q7LiBPciAmbHQ7YiZndDsmcXVvdDtKUkVfQ09OVEFJTkVSL1hZWiZxdW90OyZsdDsvYiZndDsgd291bGQgbWF0Y2ggJnF1b3Q7L0pSRV9DT05UQUlORVIvWFlaLy4uLiZxdW90Oy4KLSZsdDtwJmd0OwotWW91IGNhbiBhbHNvIHVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gQW4gZXhwcmVzc2lvbiBzdWNoIGFzICZsdDtiJmd0OyZxdW90O1NXVF9DT05UQUlORVIvLiovSkZBQ0UmcXVvdDsmbHQ7L2ImZ3Q7IHdpbGwgbWF0Y2ggJnF1b3Q7L1NXVF9DT05UQUlORVIvUERFL0pGQUNFJnF1b3Q7IGJ1dCB3aWxsIG5vdCBtYXRjaCAmcXVvdDsvU1dUX0NPTlRBSU5FUiZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwbHVnaW4iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbiBpcyBmb3IgYSBwbHVnaW4uIFRoZSB2YWx1ZSBpcyB0aGUgcGx1Z2luIGlkIChlLmcuICZxdW90O29yZy5lY2xpcHNlLnN3dCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGV4dGVuc2lvbiByZWdpc3RyYXRpb24uIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBJRXh0ZW5zaW9uUmVnaXN0cmF0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4dGVuc2lvblJlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250cmlidXRvcjogCi0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmplbS5wcm94eS5leHRlbnNpb25zJnF1b3Q7Jmd0OwotICAmbHQ7Y29udHJpYnV0b3IKLSAgIHJlZ2lzdHJ5VHlwZT0mcXVvdDtvcmcuZWNsaXBzZS5qZW0uUkVNT1RFJnF1b3Q7Ci0gICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeHRlbnNpb25SZWdpc3RyYXRpb25JbXBsZW1lbnRhdGlvbiZxdW90OwotICAgY29udGFpbmVyPSZxdW90O01ZX0NPTlRBSU5FUiZxdW90OyZndDsKLSAgJmx0Oy9jb250cmlidXRvciZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsgYXR0cmlidXRlIG11c3QgYmUgYSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXh0ZW5zaW9uUmVnaXN0cmF0aW9uJmx0Oy9zYW1wJmd0OyBpbnRlcmZhY2UgZm9yIGV4dGVuc2lvbiByZWdpc3RyYXRpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9BV1RTdGFydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0FXVFN0YXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxZjQ4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0FXVFN0YXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBV1RTdGFydGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotCi1pbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKLSAKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZG8gc3RhcnQgdGhlIEFXVCBldmVudHF1ZXVlIGFoZWFkIG9mIHRpbWUgdG8gdHJ5IHRvIHBhcmFsbGVsIHByb2Nlc3MgaXQuCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEFXVFN0YXJ0ZXIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0QVdUKCkgewotCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGhyZWFkLnlpZWxkKCk7CS8vIFNvIGFzIG5vdCB0byBwb3NzaWJseSBob2xkIHVwIHRoZSBndXkgZG9pbmcgdGhlIHN0YXJ0aW5nLgotCQkJCVRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKTsKLQkJCX0KLQkJfTsKLQkJdC5zdGFydCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQXJyYXlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQXJyYXlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0MjIyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0FycmF5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBBcnJheUhlbHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc2ltaWxpYXIgZnVuY3Rpb24gYXMgdGhlIGphdmEubGFuZy5yZWZsZWN0LkFycmF5IGNsYXNzIGJ1dAotICogaXQgaGFuZGxlcyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuIFdpdGhvdXQgdGhpcyBoZWxwZXIsIHRoZSBjbGllbnQgd291bGQgaGF2ZQotICogdG8gd2FsayBkb3duIHRocm91Z2ggZWFjaCBkaW1lbnNpb24gZXhlY3V0aW5nIGEgZ2V0IGNvbW1hbmQuIFRoaXMgd291bGQgbWVhbgotICogbWFueSB0cmFuc2FjdGlvbnMgaW5zdGVhZCBvZiBvbmUgcHJvdmlkZWQgYnkgdGhpcyBoZWxwZXIuCi0gKgotICogSXQgYWxzbyBwcm92aWRlcyBzb21lIG90aGVyIGhlbHBlciBmdW5jdGlvbnMgZm9yIGFycmF5cyB0aGF0IEFycmF5IGRvZXNuJ3QgcHJvdmlkZS4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlIZWxwZXIgewotCS8vIEl0IGNhbiBuZXZlciBiZSBpbnN0YW50aWF0ZWQuCi0JcHJpdmF0ZSBBcnJheUhlbHBlcigpIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KE9iamVjdCBhcnJheSwgaW50W10gaW5kZXhlcykgewotCQlPYmplY3QgYW5zd2VyID0gYXJyYXk7Ci0JCWZvciAoaW50IGk9MDsgaTxpbmRleGVzLmxlbmd0aDsgaSsrKQotCQkJYW5zd2VyID0gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0KGFuc3dlciwgaW5kZXhlc1tpXSk7Ci0JCXJldHVybiBhbnN3ZXI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYnl0ZSBnZXRCeXRlKE9iamVjdCBhcnJheSwgaW50W10gaW5kZXhlcykgewotCQlyZXR1cm4gKChCeXRlKSBnZXQoYXJyYXksIGluZGV4ZXMpKS5ieXRlVmFsdWUoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW4oT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGdldChhcnJheSwgaW5kZXhlcykpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQlwdWJsaWMgc3RhdGljIGNoYXIgZ2V0Q2hhcihPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJcmV0dXJuICgoQ2hhcmFjdGVyKSBnZXQoYXJyYXksIGluZGV4ZXMpKS5jaGFyVmFsdWUoKTsKLQl9CQotCXB1YmxpYyBzdGF0aWMgZG91YmxlIGdldERvdWJsZShPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJcmV0dXJuICgoRG91YmxlKSBnZXQoYXJyYXksIGluZGV4ZXMpKS5kb3VibGVWYWx1ZSgpOwotCX0KLQlwdWJsaWMgc3RhdGljIGZsb2F0IGdldEZsb2F0KE9iamVjdCBhcnJheSwgaW50W10gaW5kZXhlcykgewotCQlyZXR1cm4gKChGbG9hdCkgZ2V0KGFycmF5LCBpbmRleGVzKSkuZmxvYXRWYWx1ZSgpOwotCX0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnQoT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzKSB7Ci0JCXJldHVybiAoKEludGVnZXIpIGdldChhcnJheSwgaW5kZXhlcykpLmludFZhbHVlKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMb25nKE9iamVjdCBhcnJheSwgaW50W10gaW5kZXhlcykgewotCQlyZXR1cm4gKChMb25nKSBnZXQoYXJyYXksIGluZGV4ZXMpKS5sb25nVmFsdWUoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBzaG9ydCBnZXRTaG9ydChPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJcmV0dXJuICgoU2hvcnQpIGdldChhcnJheSwgaW5kZXhlcykpLnNob3J0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldChPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMsIE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3Qgc3ViQXJyYXkgPSBhcnJheTsKLQkJaW50IHVwVG8gPSBpbmRleGVzLmxlbmd0aC0xOwotCQlmb3IgKGludCBpPTA7IGk8dXBUbzsgaSsrKQotCQkJc3ViQXJyYXkgPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXQoc3ViQXJyYXksIGluZGV4ZXNbaV0pOwotCQlqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5zZXQoc3ViQXJyYXksIGluZGV4ZXNbdXBUb10sIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NhbGxiYWNrSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9DYWxsYmFja0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5NjY1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NhbGxiYWNrSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IENhbGxiYWNrSGFuZGxlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi4qOwotLyoqCi0gKiBUaGlzIGlzIGEgaGFuZGxlciBmb3IgZG9pbmcgY2FsbGJhY2tzIHRvIHRoZQotICogY2xpZW50LgotICoKLSAqIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBubyBvbmUgc2hvdWxkCi0gKiB1c2UgaXQgZnJvbSB0aGUgb3V0c2lkZS4gSXQgaXMgdG9vIGNyaXRpY2FsIHRoYXQKLSAqIGNhbGxiYWNrJ3Mgd29yayBvbmx5IGluIHRoaXMgc3BlY2lmaWVkIHdheS4KLSAqLwotY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIGV4dGVuZHMgQ29ubmVjdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJQ2FsbGJhY2tIYW5kbGVyIHsKLQlwdWJsaWMgQ2FsbGJhY2tIYW5kbGVyKFNvY2tldCBzYywgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgc3ZyKSB7Ci0JCXN1cGVyKHNjLCBzdnIsIG51bGwpOwotCX0JCQotCQotCS8qKgotCSAqIEluaXRpYXRlIGEgc3RyZWFtIGNhbGxiYWNrIHJlcXVlc3QuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhdGVDYWxsYmFja1N0cmVhbShpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tTdHJlYW1Db21tYW5kKG91dCwgY2FsbGJhY2tJRCwgbXNnSUQpOwotCQkJb3V0LmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0KLQkJcnVuKCk7CS8vIE5vdyBydW4gYW5kIHdhaXQgZm9yIHJldHVybi4gSWYgbm8gY29tbWFuZCBleGVjZXB0aW9uIHRocm93biwgdGhlbiBpdCBzaWduYWxzIHRvIGNvbnRpbnVlLgotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSBieXRlcyB0byB0aGUgY2xpZW50LiBJZiBieXRlc1RvV3JpdGUgaXMgLTEsIHRoZW4gdGhpcyBpcyBlbmQgYW5kCi0JICogbm8gYnl0ZXMgYXJlIGJlaW5nIHdyaXR0ZW4uIEp1c3Qgd3JpdGUgdGhlIC0xIHRoZW4uCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGVCeXRlcyhieXRlW10gYnl0ZXMsIGludCBieXRlc1RvV3JpdGUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChieXRlc1RvV3JpdGUgIT0gLTEpCi0JCQkJQ29tbWFuZHMud3JpdGVCeXRlcyhvdXQsIGJ5dGVzLCBieXRlc1RvV3JpdGUpOwotCQkJZWxzZQotCQkJCW91dC53cml0ZUludCgtMSk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0KLQl9Ci0KLQkJCi0JLyoqCi0JICogQ2FsbGJhY2ssIGJ1dCBzZW5kIHRoZSBwYXJtIGFzIGFuIG9iamVjdCwgaWUuIGl0IG11c3QKLQkgKiBiZSBub3RoaW5nIGJ1dCBjb25zdGFudHMsIGUuZy4gU3RyaW5nLCBJbnRlZ2VyLCBvciBhbgotCSAqIGFycmF5IG9mIGNvbnN0YW50cy4gQ29uc3RhbnRzIHNob3VsZCBub3QgYmUgdGhpbmdzIGxpa2UKLQkgKiByZWd1bGFyIG9iamVjdHMuIFRoaXMgaXMgYmVjYXVzZSBvbmx5IHN0YW5kYXJkIGphdmEubGFuZwotCSAqIHR5cGUgY29uc3RhbnRzIGNhbiBiZSBhc3N1cmVkIHRvIGJlIGF2YWlsYWJsZSBvbiB0aGUgb3RoZXIKLQkgKiBjbGllbnQuIEFsc28geW91IGRvbid0IHdhbnQgdG8gc2VuZCBiaWcgb2JqZWN0cywgZXhjZXB0Ci0JICogbWF5YmUgc29tZXRoaW5nIGxpa2UgYW4gYXJyYXkgb2YgYnl0ZXMgb3Igc3RyaW5ncy4gSXQgbXVzdAotCSAqIGJlIGNvbnN0YW50cyB0aGF0IGRvbid0IG5lZWQgdG8gYmUgc2VudCBiYWNrIGZvciBhbnkgcmVhc29uCi0JICogc2luY2UgdGhlaXIgaWRlbnRpdHkgd2lsbCBiZSBsb3N0IGluIHRoZSB0cmFuc2Zlci4KLQkgKgotCSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgaWYgdGhlcmUgYXJlIG5vIHBhcm1zIChpLmUuIGl0IGlzIG51bGwpLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FsbGJhY2tBc0NvbnN0YW50cyhpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lELCBPYmplY3QgcGFybSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tDb21tYW5kKG91dCwgY2FsbGJhY2tJRCwgbXNnSUQpOwotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgdiA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJc2VuZE9iamVjdChwYXJtLCBTRU5EX0FTX0lTLCB2LCBvdXQsIGZhbHNlKTsKLQkJCW91dC5mbHVzaCgpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9Ci0JCXJldHVybiBydW4oKTsJLy8gTm93IHJ1biBhbmQgd2FpdCBmb3IgcmV0dXJuLgotCX0KLQkKLQkKLQkvLyBBIHJldHJpZXZlciBpcyB3aGF0IGhhbmRsZXMgdGhlIGFycmF5IHBhcnQuCi0JcHJpdmF0ZSBjbGFzcyBSZXRyaWV2ZXIgaW1wbGVtZW50cyBDb21tYW5kcy5WYWx1ZVJldHJpZXZlIHsKLQkJaW50IGluZGV4PTA7Ci0JCU9iamVjdFtdIGFycmF5OwotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCi0JCQotCQlwdWJsaWMgUmV0cmlldmVyKE9iamVjdFtdIGFuQXJyYXkpIHsKLQkJCWFycmF5ID0gYW5BcnJheTsKLQkJfQotCQkKLQkJcHVibGljIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5leHRWYWx1ZSgpIHsKLQkJCU9iamVjdCBwYXJtID0gYXJyYXlbaW5kZXgrK107Ci0JCQlpZiAocGFybSAhPSBudWxsKSB7Ci0JCQkJaWYgKHBhcm0gaW5zdGFuY2VvZiBJQ2FsbGJhY2tIYW5kbGVyLlRyYW5zbWl0YWJsZUFycmF5KSB7Ci0JCQkJCS8vIEl0IGlzIGFub3RoZXIgYXJyYXksIGNyZWF0ZSBhIG5ldyByZXRyaWV2ZXIuCi0JCQkJCXdvcmtlci5zZXRBcnJheUlEUyhuZXcgUmV0cmlldmVyKCgoSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheSkgcGFybSkuZ2V0QXJyYXkoKSksICgoSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheSkgcGFybSkuZ2V0QXJyYXkoKS5sZW5ndGgsIENvbW1hbmRzLk9CSkVDVF9DTEFTUyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gVGhleSBtYXkgYWRkIHNvbWUgbmV3IElEJ3MgYW5kIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGV5Ci0JCQkJCS8vIHdvbid0IGdldCByZWxlYXNlZCwgYnV0IHRoYXQgaXMgYSBzbGlnaHQgY2hhbmNlIHdlIHdpbGwgaGF2ZQotCQkJCQkvLyB0byB0YWtlIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGljaCBvbmVzIHdlcmUgbmV3IGFuZCB3aGljaAotCQkJCQkvLyBvbmVzIHdlcmVuJ3QuCi0JCQkJCWZpbGxJblZhbHVlKHBhcm0sIE5PVF9BX1BSSU1JVElWRSwgd29ya2VyKTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQl3b3JrZXIuc2V0KCk7Ci0JCQlyZXR1cm4gd29ya2VyOwotCQl9Ci0JfTsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gTlVMTF9TRU5UID0gbmV3IE9iamVjdFsxXTsKLQkvKioKLQkgKiBDYWxsYmFjaywgYnV0IHNlbmQgdGhlIHBhcm0gYXMgSURzIHNvIHRoYXQgcHJveGllcwotCSAqIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhlIG9iamVjdHMgYW5kIGNhbiBiZSByZWZlcmVuY2VkLgotCSAqCi0JICogVGhpcyBzaG91bGQgYmUgdXNlZCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lIHBhcm0uCi0JICovCi0JcHVibGljIE9iamVjdCBjYWxsYmFja1dpdGhQYXJtcyhpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcykgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKHBhcm1zID09IG51bGwpCi0JCQkJcGFybXMgPSBOVUxMX1NFTlQ7Ci0JCQkJCi0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB2ID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQkJCQkJCi0JCQl2LnNldEFycmF5SURTKG5ldyBSZXRyaWV2ZXIocGFybXMpLCBwYXJtcy5sZW5ndGgsIENvbW1hbmRzLk9CSkVDVF9DTEFTUyk7Ci0JCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tDb21tYW5kKG91dCwgY2FsbGJhY2tJRCwgbXNnSUQpOwotCQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvdXQsIHYsIGZhbHNlKTsKLQkJCW91dC5mbHVzaCgpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9Ci0JCXJldHVybiBydW4oKTsJLy8gTm93IHJ1biBhbmQgd2FpdCBmb3IgcmV0dXJuLgotCX0JCi0JCi0JLyoqCi0JICogQSBjbG9zZUhhbmRsZXIgaGFzIGJlZW4gcmVxdWVzdGVkLiBUaGlzIGlzIGNhbGxlZCB3aGVuCi0JICogbm90IHdhaXRpbmcgd2l0aGluIGEgbG9vcCwgc28gd2UgbmVlZCB0byBkbyB0aGUgY2xlYW51cCBvdXJzZWx2ZXMuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VIYW5kbGVyKCkgewotCQlpZiAoaXNDb25uZWN0ZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlDb21tYW5kcy5zZW5kUXVpdENvbW1hbmQob3V0KTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlpbi5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQljbG9zZSgpOwotCQkJCWluID0gbnVsbDsKLQkJCQlvdXQgPSBudWxsOwotCQkJCXNvY2tldCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ2FsbGJhY2tPdXRwdXRTdHJlYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ2FsbGJhY2tPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4ZDJjMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9DYWxsYmFja091dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IENhbGxiYWNrT3V0cHV0U3RyZWFtLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLklPQ29tbWFuZEV4Y2VwdGlvbjsKLS8qKgotICogVGhpcyBpcyB0aGUgc3BlY2lhbCBzdHJlYW0gdXNlZCB0byBidWZmZXIgYW5kIHdyaXRlIGEgbG90Ci0gKiBvZiBieXRlcyB0byBjYWxsYmFjayBpbnRvIHRoZSBjbGllbnQuCi0gKgotICogQmVmb3JlIHdyaXRpbmcgYW55IGJ5dGVzIHRvIHRoZSBjbGllbnQsIGl0IHdpbGwgc2VlIGlmIHRoZQotICogY2xpZW50IGhhcyBzZW50IGFueXRoaW5nIGJhY2suIElmIGl0IGhhcywgdGhpcyBpcyBhbiBpbmRpY2F0aW9uCi0gKiB0aGF0IHRoYXQgY2xpZW50IGhhcyByZXF1ZXN0ZWQgdGhhdCB0aGUgc3RyZWFtIGJlIGNsb3NlZC4gSW4gdGhhdAotICogY2FzZSBhbiBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGlzIHJhaXNlZCB0byBpbmRpY2F0ZSB0aGF0Ci0gKiB0aGUgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGFuZCBubyBtb3JlIGRhdGEgd2lsbCBiZSBzZW50LgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotCQotCXByb3RlY3RlZCBDYWxsYmFja0hhbmRsZXIgZkhhbmRsZXI7Ci0JcHJvdGVjdGVkIFJlbW90ZVZNU2VydmVyVGhyZWFkIGZTdnI7Ci0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCXByb3RlY3RlZCBpbnQgZk5leHRCeXRlID0gMDsKLQkKLQlwdWJsaWMgQ2FsbGJhY2tPdXRwdXRTdHJlYW0oQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIsIFJlbW90ZVZNU2VydmVyVGhyZWFkIHN2cikgewotCQlmSGFuZGxlciA9IGhhbmRsZXI7Ci0JCWZTdnIgPSBzdnI7Ci0JCQotCQlJbnRlZ2VyIGJ1ZlNpemUgPSBJbnRlZ2VyLmdldEludGVnZXIoInByb3h5dm0uYnVmc2l6ZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChidWZTaXplID09IG51bGwpCi0JCQlidWZTaXplID0gbmV3IEludGVnZXIoNTAwMCk7Ci0JCWZCdWZmZXIgPSBuZXcgYnl0ZVtidWZTaXplLmludFZhbHVlKCldOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclN0cmVhbSgpIHsKLQkJZlN2ci5yZXR1cm5DYWxsYmFja0hhbmRsZXIoZkhhbmRsZXIpOwotCQlmU3ZyID0gbnVsbDsKLQkJZkhhbmRsZXIgPSBudWxsOwotCQlmQnVmZmVyID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V4Y2VwdGlvbihDb21tYW5kRXhjZXB0aW9uIGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNsZWFyU3RyZWFtKCk7Ci0JCXRocm93IG5ldyBJT0NvbW1hbmRFeGNlcHRpb24oZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmx1c2hCdWZmZXIoKTsKLQkJZkhhbmRsZXIub3V0LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZkhhbmRsZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZC4gTm8gbW9yZSBvcGVyYXRpb25zIHBlcm1pdHRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZk5leHRCeXRlID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZkhhbmRsZXIuaW4uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQkJCS8vIFRoZXJlIHdhcyBzb21ldGhpbmcgd2FpdGluZy4gVGhpcyBtZWFucyBhIGNhbmNlbCBoYXMgYmVlbiByZXF1ZXN0ZWQuCi0JCQkJCWZIYW5kbGVyLmluLnNraXAoZkhhbmRsZXIuaW4uYXZhaWxhYmxlKCkpOwotCQkJCQljbG9zZShmYWxzZSk7CS8vIE5vdyBjbG9zZSB0aGUgc3RyZWFtLiBXZSBuZWVkIHRvIGhhdmUgdGhlIGNsb3NlIGluZGljYXRvciBzZW50IHNvIHRoYXQgdGhlIHJlbW90ZSBzaWRlLCBidXQgd2UgZG9uJ3QgbmVlZCB0byB3YWl0IGJlY2F1c2UgdGhlIHRlcm1pbmF0ZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIHNlbnQuCi0JCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWZIYW5kbGVyLndyaXRlQnl0ZXMoZkJ1ZmZlciwgZk5leHRCeXRlKTsKLQkJCQlmTmV4dEJ5dGUgPSAwOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDbG9zZXMgdGhpcyBvdXRwdXQgc3RyZWFtIGFuZCByZWxlYXNlcyBhbnkgc3lzdGVtIHJlc291cmNlcyAKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHJlYW0uIFRoZSBnZW5lcmFsIGNvbnRyYWN0IG9mIDxjb2RlPmNsb3NlPC9jb2RlPiAKLQkgKiBpcyB0aGF0IGl0IGNsb3NlcyB0aGUgb3V0cHV0IHN0cmVhbS4gQSBjbG9zZWQgc3RyZWFtIGNhbm5vdCBwZXJmb3JtIAotCSAqIG91dHB1dCBvcGVyYXRpb25zIGFuZCBjYW5ub3QgYmUgcmVvcGVuZWQuCi0JICogPHA+Ci0JICogQ2xvc2Ugd2lsbCBzZW5kIGEgLTEgdG8gdGhlIGNsaWVudCBhbmQgc2V0IHRvIGluZGljYXRlIGl0IGlzIGNsb3NlZC4KLQkgKgotCSAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2xvc2UodHJ1ZSk7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2UoYm9vbGVhbiB3YWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZkhhbmRsZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmbHVzaEJ1ZmZlcigpOwotCQkJCXRyeSB7CQkJCQotCQkJCQlmSGFuZGxlci53cml0ZUJ5dGVzKG51bGwsIC0xKTsKLQkJCQkJZkhhbmRsZXIub3V0LmZsdXNoKCk7Ci0JCQkJCWlmICh3YWl0KSB7Ci0JCQkJCQkvLyBXYWl0IG1lYW5zIHdhaXQgZm9yIHRoZSByZW1vdGUgc2lkZSB0byBzZW5kIHRoZSB0ZXJtaW5hdGVkIHJlc3BvbnNlLgotCQkJCQkJLy8gQSBub3JtYWwgY2xvc2Ugd2lsbCBkbyB0aGlzLiBJZiB0aGUgcmVtb3RlIHNpZGUgc2VudCBhIGNhbmNlbCByZXF1ZXN0LCB0aGVuIGl0IGhhcyBhbHJlYWR5Ci0JCQkJCQkvLyBzZW50IHRoZSB0ZXJtaW5hdGVkIHJlc3BvbnNlIGFuZCBpdCBpcyB3YWl0aW5nIGZvciB1cyB0byBzZW5kIHRoZSBlbmQtb2YtZmlsZSBjb21tYW5kLgotCQkJCQkJCi0JCQkJCQlmSGFuZGxlci5pbi5yZWFkQnl0ZSgpOwkvLyBCbG9jayBhbmQgd2FpdCB1bnRpbCB0aGUgdGVybWluYXRlIHJlcXVlc3QuIFRoZXJlIHNob3VsZG4ndCBiZSBhbnl0aGluZyBlbHNlIGluIHRoZSBwaXBlbGluZS4KLQkJCQkJCWlmIChmSGFuZGxlci5pbi5hdmFpbGFibGUoKSA+IDApCi0JCQkJCQkJLy8gVGhlcmUgd2FzIHNvbWV0aGluZyBlbHNlIHdhaXRpbmcuIExldCdzIGp1c3QgY2xlYXIgaXQgb3V0IHRvIGJlIHNhZmUuCi0JCQkJCQkJZkhhbmRsZXIuaW4uc2tpcChmSGFuZGxlci5pbi5hdmFpbGFibGUoKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWNsZWFyU3RyZWFtKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZCdWZmZXJbZk5leHRCeXRlKytdID0gKGJ5dGUpIGI7Ci0JCWlmIChmTmV4dEJ5dGUgPj0gZkJ1ZmZlci5sZW5ndGgpCi0JCQlmbHVzaEJ1ZmZlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGIgPT0gbnVsbCkgewotCQkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBiLmxlbmd0aCkgfHwgKGxlbiA8IDApIHx8Ci0JCQkgICAoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKLQkJICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAobGVuID09IDApIHsKLQkJICAgIHJldHVybjsKLQkJfQotCQkKLQkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCWludCBtb3ZlID0gZkJ1ZmZlci5sZW5ndGgtZk5leHRCeXRlOwotCQkJaWYgKGxlbiA8IG1vdmUpCi0JCQkJbW92ZSA9IGxlbjsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgb2ZmLCBmQnVmZmVyLCBmTmV4dEJ5dGUsIG1vdmUpOwotCQkJbGVuIC09IG1vdmU7Ci0JCQlvZmYgKz0gbW92ZTsKLQkJCWZOZXh0Qnl0ZSArPSBtb3ZlOwotCQkJaWYgKGZOZXh0Qnl0ZSA+PSBmQnVmZmVyLmxlbmd0aCkKLQkJCQlmbHVzaEJ1ZmZlcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NsYXNzSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NsYXNzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZWY0ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9DbGFzc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogQ2xhc3NIZWxwZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBoZWxwZXIgZm9yIENsYXNzIGFjY2Vzc2luZyBmdW5jdGlvbnMuCi0gKiBJdHMgbWFpbiBmdW5jdGlvbiBpcyB0byBieXBhc3Mgc2VjdXJpdHkuIFRoaXMgaXMgYmVjYXVzZQotICogd2UgZG9uJ3QgY2FyZSBhYm91dCBzZWN1cml0eSBmb3IgcmVtb3RlIHZtLiBTZWN1cml0eSBpcwotICogaGFuZGxlZCBieSB0aGUgSURFIGFuZCBjb21waWxvciBvdmVyIHRoZXJlLiBXZSBkbyB3aGF0Ci0gKiB3ZSdyZSB0b2xkLgotICogCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0hlbHBlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2xhc3NIZWxwZXIuCi0JICovCi0JcHJpdmF0ZSBDbGFzc0hlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBFTVBUWV9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1swXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyB0YXJnZXRDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFdlIHdhbnQgdG8gZ2V0IHRoZSBkZWZhdWx0IGN0b3IsIHdoaWNoIGlzIGluIHRoZSBkZWNsYXJlZCBsaXN0LiBObyBuZWVkCi0JCS8vIHRvIHdvcnJ5IGFib3V0IGluaGVyaXRhbmNlIGJlY2F1c2UgY3RvcnMgYXJlIG5ldmVyIHZpcnR1YWwuCi0JCUNvbnN0cnVjdG9yIGN0b3IgPSB0YXJnZXRDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKEVNUFRZX0NMQVNTX0FSUkFZKTsKLQkJY3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gY3Rvci5uZXdJbnN0YW5jZShFTVBUWV9PQkpFQ1RfQVJSQVkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9Db25uZWN0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9Db25uZWN0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTNkOTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ29ubmVjdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBDb25uZWN0aW9uSGFuZGxlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLk5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaGFuZGxlcyBvbmUgY29ubmVjdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkhhbmRsZXIgewkKLQkJCi0JcHJvdGVjdGVkIFNvY2tldCBzb2NrZXQ7Ci0JZmluYWwgcHJvdGVjdGVkIFJlbW90ZVZNU2VydmVyVGhyZWFkIHNlcnZlcjsKLQlmaW5hbCBwcm90ZWN0ZWQgVGhyZWFkIGNvbm5lY3Rpb25UaHJlYWQ7Ci0JcHJvdGVjdGVkIERhdGFJbnB1dFN0cmVhbSBpbjsKLQlwcm90ZWN0ZWQgRGF0YU91dHB1dFN0cmVhbSBvdXQ7Ci0JCi0JLy8gS2x1ZGdlOiBCdWcgaW4gTGludXggMS4zLnh4eCBvZiBKVk0uIENsb3NpbmcgYSBzb2NrZXQgd2hpbGUgdGhlIHNvY2tldCBpcyBiZWluZyByZWFkL2FjY2VwdCB3aWxsIG5vdCBpbnRlcnJ1cHQgdGhlCi0JLy8gd2FpdC4gTmVlZCB0byB0aW1lb3V0IHRvIHRoZSBzb2NrZXQgcmVhZC9hY2NlcHQgYmVmb3JlIHRoZSBzb2NrZXQgY2xvc2Ugd2lsbCBiZSBub3RpY2VkLiBUaGlzIGhhcyBiZWVuIGZpeGVkCi0JLy8gaW4gTGludXggMS40LiBTbyBvbiBMaW51eCAxLjMgbmVlZCB0byBwdXQgdGltZW91dHMgaW4gb24gdGhvc2Ugc29ja2V0cyB0aGF0IGNhbiBiZSBzZXBhcmF0ZWx5IGNsb3NlZCB3aGlsZSByZWFkaW5nL2FjY2VwdGluZy4KLQlzdGF0aWMgYm9vbGVhbiBMSU5VWF8xXzMgPSAibGludXgiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpICYmIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiwiIikuc3RhcnRzV2l0aCgiMS4zIik7CSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkKLQkvKioKLQkgKiBUaGlzIG1heSBiZSBydW5uaW5nIGFzIGEgY2FsbGJhY2ssIGluIHRoYXQgY2FzZSB0aGVyZSBpcyBubyBjb25uZWN0aW9uVGhyZWFkLgotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uSGFuZGxlcihTb2NrZXQgc2MsIFJlbW90ZVZNU2VydmVyVGhyZWFkIHN2ciwgVGhyZWFkIGNvbm5lY3Rpb25UaHJlYWQpIHsKLQkJc29ja2V0ID0gc2M7Ci0JCXNlcnZlciA9IHN2cjsKLQkJdGhpcy5jb25uZWN0aW9uVGhyZWFkID0gY29ubmVjdGlvblRocmVhZDsKLQkJCi0JCUludGVnZXIgYnVmU2l6ZSA9IEludGVnZXIuZ2V0SW50ZWdlcigicHJveHl2bS5idWZzaXplIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJ1ZlNpemUgPT0gbnVsbCkKLQkJCWJ1ZlNpemUgPSBuZXcgSW50ZWdlcig1MDAwKTsKLQkJCQotCQl0cnkgewotCQkJb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgYnVmU2l6ZS5pbnRWYWx1ZSgpKSk7Ci0JCQlpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0LmdldElucHV0U3RyZWFtKCksIGJ1ZlNpemUuaW50VmFsdWUoKSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCQotCX0KLQkKLQkvKioKLQkgKiBEaWQgdGhpcyBjb25zdHJ1Y3QgY29ycmVjdGx5LgotCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgYW4gZXhjZXB0aW9uIGNvdWxkIGJlIHRocm93biBpbiB0aGUgY3RvciBhbmQKLQkgKiB0aGF0J3Mgbm90IGEgZ29vZCB0aGluZyB0byBkby4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIHNvY2tldCAhPSBudWxsOwotCX0JCi0JCi0JLyoqCi0JICogUmVxdWVzdCB0aGUgdGhyZWFkIHRvIGNsb3NlIGRvd24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWlmIChzb2NrZXQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTb2NrZXQgcyA9IHNvY2tldDsKLQkJCQlzb2NrZXQgPSBudWxsOwotCQkJCXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gTWFwIG9mIElEIHRvIGV4cHJlc3Npb24gcHJvY2Vzc2VycyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLgotCXByaXZhdGUgTWFwIGV4cHJlc3Npb25Qcm9jZXNzb3JzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBQcm9jZXNzIGFuZCBsb29wIHVudGlsIHRvbGQgdG8gc3RvcC4gQSBjYWxsYmFja19kb25lIHdpbGwgc3RvcAotCSAqIHRoZSBsb29wIGFuZCB3aWxsIHJldHVybiBhIHJlc3VsdC4gT3RoZXJ3aXNlIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwkJCi0JCWJvb2xlYW4gc2h1dGRvd24gPSBmYWxzZTsKLQkJYm9vbGVhbiBjbG9zZVdoZW5Eb25lID0gdHJ1ZTsKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsJLy8gV29ya2luZyB2YWx1ZSBvYmplY3Qgc28gbm90IGNvbnRpbnVhbGx5IHJlY3JlYXRlZC4KLQkJSW52b2thYmxlVmFsdWVTZW5kZXIgdmFsdWVTZW5kZXIgPSBuZXcgSW52b2thYmxlVmFsdWVTZW5kZXIoKTsJLy8gV29ya2luZyB2YWx1ZXNlbmRlciBzbyBub3QgY29udGludWFsbHkgcmVjcmVhdGVkLiAKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gZG9Mb29wID0gdHJ1ZTsKLQotCQkJLyoqCi0JCQkgKiBOb3RlOiBJbiB0aGUgY2FzZXMgYmVsb3cgeW91IHdpbGwgc2VlIGEgbG90IG9mIGZpbmFsbHkgY2xhdXNlcyB0aGF0IG51bGwgdmFyaWFibGVzIG91dC4KLQkJCSAqIFRoaXMgaXMgYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGxvb3AsIGFuZCB2YXJpYWJsZXMgZGVjbGFyZWQgd2l0aGluIGJsb2NrcyBhcmUgbm90Ci0JCQkgKiBnYXJiYWdlIGNvbGxlY3RlZCB1bnRpbCB0aGUgbWV0aG9kIGlzIHRlcm1pbmF0ZWQsIHNvIHRoZXNlIHZhcmlhYmxlcyBvbmNlIHNldCB3b3VsZCBuZXZlcgotCQkJICogYmUgR0MnZC4gVGhlIG51bGxpbmcgYXQgdGhlIGVuZCBvZiB0aGUgY2FzZSBtYWtlcyBzdXJlIHRoYXQgYW55IG9mIHRob3NlIG9iamVjdHMgc2V0IGFyZQotCQkJICogbm93IGF2YWlsYWJsZSBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gbmVjZXNzYXJ5LgotCQkJICovCQkKLQkJCXdoaWxlKGRvTG9vcCAmJiBpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkJYnl0ZSBjbWQgPSAwOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChMSU5VWF8xXzMpCi0JCQkJCQlzb2NrZXQuc2V0U29UaW1lb3V0KDEwMDApOwkvLyBMaW51eCAxLjMgYnVnLCBzZWUgY29tbWVudCBvbiBMSU5VWF8xXzMKLQkJCQkJY21kID0gaW4ucmVhZEJ5dGUoKTsKLQkJCQkJaWYgKExJTlVYXzFfMyAmJiBpc0Nvbm5lY3RlZCgpKQotCQkJCQkJc29ja2V0LnNldFNvVGltZW91dCgwKTsJLy8gTGludXggMS4zIGJ1Zywgc2VlIGNvbW1lbnQgb24gTElOVVhfMV8zCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNvbnRpbnVlOwkvLyBUaW1lb3V0LCB0cnkgYWdhaW4KLQkJCQl9Ci0JCQkJc3dpdGNoIChjbWQpIHsKLQkJCQkJY2FzZSBDb21tYW5kcy5RVUlUX0NPTk5FQ1RJT046CQkJCQotCQkJCQkJZG9Mb29wID0gZmFsc2U7CQotCQkJCQkJYnJlYWs7CS8vIENsb3NlIHRoaXMgY29ubmVjdGlvbgotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuVEVSTUlOQVRFX1NFUlZFUjoKLQkJCQkJCWRvTG9vcCA9IGZhbHNlOwkJCi0JCQkJCQlzaHV0ZG93biA9IHRydWU7CS8vIFNodXRkb3duIGV2ZXJ5dGhpbmcKLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuR0VUX0NMQVNTOgotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGluLnJlYWRVVEYoKTsKLQkJCQkJCUNsYXNzIGFDbGFzcyA9IG51bGw7Ci0JCQkJCQlDbGFzcyBzdXBlckNsYXNzID0gbnVsbDsKLQkJCQkJCVN0cmluZyBzdXBlckNsYXNzTmFtZSA9IG51bGw7Ci0JCQkJCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWFDbGFzcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsJLy8gVHVybnMgb3V0IHVzaW5nIEpOSSBmb3JtYXQgZm9yIGFycmF5IHR5cGUgd2lsbCB3b3JrIGZpbmUuCi0JCQkJCQkJCQotCQkJCQkJCWFkZGVkID0gc2VydmVyLmdldElkZW50aXR5SUQoYUNsYXNzLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJYm9vbGVhbiBpc0ludGVyZmFjZSA9IGFDbGFzcy5pc0ludGVyZmFjZSgpOwotCQkJCQkJCWJvb2xlYW4gaXNBYnN0cmFjdCA9IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzQWJzdHJhY3QoYUNsYXNzLmdldE1vZGlmaWVycygpKTsKLQkJCQkJCQlzdXBlckNsYXNzID0gYUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCQkJCQlzdXBlckNsYXNzTmFtZSA9IChzdXBlckNsYXNzICE9IG51bGwpID8gc3VwZXJDbGFzcy5nZXROYW1lKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW91dC53cml0ZUJ5dGUoQ29tbWFuZHMuR0VUX0NMQVNTX1JFVFVSTik7Ci0JCQkJCQkJb3V0LndyaXRlSW50KHZhbHVlT2JqZWN0Lm9iamVjdElEKTsKLQkJCQkJCQlvdXQud3JpdGVCb29sZWFuKGlzSW50ZXJmYWNlKTsKLQkJCQkJCQlvdXQud3JpdGVCb29sZWFuKGlzQWJzdHJhY3QpOwotCQkJCQkJCW91dC53cml0ZVVURihzdXBlckNsYXNzTmFtZSk7Ci0JCQkJCQkJb3V0LmZsdXNoKCk7Ci0JCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgQ29tbWFuZHMuR0VUX0NMQVNTX05PVF9GT1VORCwgdmFsdWVPYmplY3QpOwkJCQkJCQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGUpIHsKLQkJCQkJCQlzZW5kRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCksIHZhbHVlT2JqZWN0LCBvdXQpOwkJCQkJCQkJCi0JCQkJCQl9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgewotCQkJCQkJCXNlbmRFeGNlcHRpb24oZSwgdmFsdWVPYmplY3QsIG91dCk7CQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQkJLy8gU29tZXRoaW5nIGJhZCwgZGlkIHdlIGFkZCBhIGNsYXNzPyBJZiB3ZSBkaWQgcmVtb3ZlIGl0IGZyb20gdGhlIHRhYmxlLgotCQkJCQkJCWlmIChhZGRlZCkKLQkJCQkJCQkJc2VydmVyLnJlbW92ZU9iamVjdChzZXJ2ZXIuZ2V0T2JqZWN0KHZhbHVlT2JqZWN0Lm9iamVjdElEKSk7Ci0JCQkJCQkJdGhyb3cgZTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJLy8gY2xlYXIgb3V0IGZvciBHQyB0byB3b3JrLgotCQkJCQkJCWNsYXNzTmFtZSA9IG51bGw7Ci0JCQkJCQkJYUNsYXNzID0gbnVsbDsKLQkJCQkJCQlzdXBlckNsYXNzID0gbnVsbDsKLQkJCQkJCQlzdXBlckNsYXNzTmFtZSA9IG51bGw7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLkdFVF9DTEFTU19GUk9NX0lEOgotCQkJCQkJaW50IGNsYXNzSUQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWFDbGFzcyA9IChDbGFzcykgc2VydmVyLmdldE9iamVjdChjbGFzc0lEKTsKLQkJCQkJCQlib29sZWFuIGlzSW50ZXJmYWNlID0gYUNsYXNzLmlzSW50ZXJmYWNlKCk7Ci0JCQkJCQkJYm9vbGVhbiBpc0Fic3RyYWN0ID0gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNBYnN0cmFjdChhQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpOwkJCQkJCQkKLQkJCQkJCQlzdXBlckNsYXNzID0gYUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCQkJCQlzdXBlckNsYXNzTmFtZSA9IChzdXBlckNsYXNzICE9IG51bGwpID8gc3VwZXJDbGFzcy5nZXROYW1lKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW91dC53cml0ZUJ5dGUoQ29tbWFuZHMuR0VUX0NMQVNTX0lEX1JFVFVSTik7Ci0JCQkJCQkJb3V0LndyaXRlVVRGKGFDbGFzcy5nZXROYW1lKCkpOwotCQkJCQkJCW91dC53cml0ZUJvb2xlYW4oaXNJbnRlcmZhY2UpOwotCQkJCQkJCW91dC53cml0ZUJvb2xlYW4oaXNBYnN0cmFjdCk7Ci0JCQkJCQkJb3V0LndyaXRlVVRGKHN1cGVyQ2xhc3NOYW1lKTsKLQkJCQkJCQlvdXQuZmx1c2goKTsKLQkJCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJQ29tbWFuZHMuc2VuZEVycm9yQ29tbWFuZChvdXQsIENvbW1hbmRzLkNMQVNTX0NBU1RfRVhDRVBUSU9OLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQl9IGZpbmFsbHkgewkKLQkJCQkJCQkvLyBjbGVhciBvdXQgZm9yIEdDIHRvIHdvcmsuCi0JCQkJCQkJYUNsYXNzID0gbnVsbDsKLQkJCQkJCQlzdXBlckNsYXNzID0gbnVsbDsKLQkJCQkJCQlzdXBlckNsYXNzTmFtZSA9IG51bGw7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBDb21tYW5kcy5HRVRfT0JKRUNUX0RBVEE6Ci0JCQkJCQlpbnQgb2JqZWN0SUQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCQlPYmplY3QgYW5PYmplY3QgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlhbk9iamVjdCA9IHNlcnZlci5nZXRPYmplY3Qob2JqZWN0SUQpOwotCQkJCQkJCXZhbHVlT2JqZWN0LnNldE9iamVjdElEKG9iamVjdElELCBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChhbk9iamVjdC5nZXRDbGFzcygpKSk7Ci0JCQkJCQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvdXQsIHZhbHVlT2JqZWN0LCB0cnVlKTsKLQkJCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJQ29tbWFuZHMuc2VuZEVycm9yQ29tbWFuZChvdXQsIENvbW1hbmRzLkNMQVNTX0NBU1RfRVhDRVBUSU9OLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWFuT2JqZWN0ID0gbnVsbDsJLy8gQ2xlYXIgb3V0IGZvciBHQyB0byB3b3JrCi0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCi0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5SRUxFQVNFX09CSkVDVDoKLQkJCQkJCWludCBpZCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJCXNlcnZlci5yZW1vdmVPYmplY3Qoc2VydmVyLmdldE9iamVjdChpZCkpOwotCQkJCQkJYnJlYWs7CQkJCQkJCi0KLQkJCQkJY2FzZSBDb21tYW5kcy5ORVdfSU5JVF9TVFJJTkc6Ci0JCQkJCQljbGFzc0lEID0gaW4ucmVhZEludCgpOwkvLyBJRCBPZiBjbGFzcyB0byBkbyBuZXcgdXBvbi4KLQkJCQkJCVN0cmluZyBpbml0U3RyaW5nID0gaW4ucmVhZFVURigpOwkvLyBUaGUgaW5pdCBzdHJpbmcuCi0JCQkJCQlPYmplY3QgbmV3VmFsdWUgPSBudWxsOwotCQkJCQkJQ2xhc3MgdGhlQ2xhc3MgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQl0aGVDbGFzcyA9IChDbGFzcykgc2VydmVyLmdldE9iamVjdChjbGFzc0lEKTsKLQkJCQkJCQlpZiAodGhlQ2xhc3MgPT0gbnVsbCkgewotCQkJCQkJCQkvLyBUaGUgY2xhc3Mgd2Fzbid0IGZvdW5kLiBTbyBpbXBseSBDbGFzc05vdEZvdW5kIGV4Y2VwdGlvbi4KLQkJCQkJCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgcGFyc2VyID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwYXJzZXIgPSBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlci5jcmVhdGVQYXJzZXIoaW5pdFN0cmluZyk7Ci0JCQkJCQkJCW5ld1ZhbHVlID0gcGFyc2VyLmV2YWx1YXRlKCk7CQkJCQkJCQkKLQkJCQkJCQkJYm9vbGVhbiBwcmltaXRpdmUgPSBwYXJzZXIuaXNQcmltaXRpdmUoKTsKLQkJCQkJCQkJLy8gSWYgZXhwZWN0ZWQgY2xhc3MgaXMgVm9pZC5UWVBFLCB0aGF0IG1lYW5zIGRvbid0IHRlc3QgdGhlIHR5cGUgb2YgdGhlIHJlc3VsdAotCQkJCQkJCQkvLyB0byB2ZXJpZnkgaWYgY29ycmVjdCB0eXBlLCBqdXN0IHJldHVybiB3aGF0IGl0IHJlYWxseSBpcy4KLQkJCQkJCQkJaWYgKHRoZUNsYXNzICE9IFZvaWQuVFlQRSAmJiBwcmltaXRpdmUgIT0gdGhlQ2xhc3MuaXNQcmltaXRpdmUoKSkgewotCQkJCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgQ29tbWFuZHMuQ0xBU1NfQ0FTVF9FWENFUFRJT04sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJCWNvbnRpbnVlOwkvLyBHb3RvIG5leHQgY29tbWFuZC4KLQkJCQkJCQkJfSAKLQkJCQkJCQkJaWYgKHByaW1pdGl2ZSkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkvLyBOZWVkIHRvIGRvIHNwZWNpYWwgdGVzdHMgZm9yIGNvbXBhdGliaWxpdHkgYW5kIGFzc2lnbm1lbnQuCi0JCQkJCQkJCQkJc2VuZE9iamVjdChuZXdWYWx1ZSwgY2xhc3NJRCAhPSBDb21tYW5kcy5WT0lEX1RZUEUgPyBjbGFzc0lEIDogc2VydmVyLmdldElkZW50aXR5SUQocGFyc2VyLmdldEV4cGVjdGVkVHlwZSgpKSwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSk7CS8vIFRoaXMgd2lsbCBtYWtlIHN1cmUgaXQgZ29lcyBvdXQgYXMgdGhlIGNvcnJlY3QgcHJpbWl0aXZlIHR5cGUKLQkJCQkJCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gVGhlIHJldHVybmVkIHR5cGUgaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHdoYXQgaXMgZXhwZWN0ZWQuCi0JCQkJCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJCQkJQ29tbWFuZHMuc2VuZEVycm9yQ29tbWFuZChvdXQsIENvbW1hbmRzLkNMQVNTX0NBU1RfRVhDRVBUSU9OLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQkJY29udGludWU7CS8vIEdvdG8gbmV4dCBjb21tYW5kCi0JCQkJCQkJCQl9CQkJCQkJCQkJCi0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkJCS8vIFRlc3QgdG8gc2VlIGlmIHRoZXkgYXJlIGNvbXBhdGlibGUuIChOdWxsIGNhbiBiZSBhc3NpZ25lZCB0byBhbnkgb2JqZWN0LAotCQkJCQkJCQkJCS8vIHNvIHRoYXQgaXMgd2h5IGl0IHdhcyB0ZXN0ZWQgb3V0IGFib3ZlKS4KLQkJCQkJCQkJCQkvLyBJZiBleHBlY3RlZCBjbGFzcyBpcyBWb2lkLlRZUEUsIHRoYXQgbWVhbnMgZG9uJ3QgdGVzdCB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0Ci0JCQkJCQkJCQkJLy8gdG8gdmVyaWZ5IGlmIGNvcnJlY3QgdHlwZSwganVzdCByZXR1cm4gd2hhdCBpdCByZWFsbHkgaXMuCi0JCQkJCQkJCQkJaWYgKHRoZUNsYXNzICE9IFZvaWQuVFlQRSAmJiAhdGhlQ2xhc3MuaXNJbnN0YW5jZShuZXdWYWx1ZSkpIHsKLQkJCQkJCQkJCQkJLy8gVGhlIHJldHVybmVkIHR5cGUgaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHdoYXQgaXMgZXhwZWN0ZWQuCi0JCQkJCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCQkJCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgQ29tbWFuZHMuQ0xBU1NfQ0FTVF9FWENFUFRJT04sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJCQkJY29udGludWU7CS8vIEdvdG8gbmV4dCBjb21tYW5kCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJc2VuZE9iamVjdChuZXdWYWx1ZSwgTk9UX0FfUFJJTUlUSVZFLCB2YWx1ZU9iamVjdCwgb3V0LCB0cnVlKTsJLy8gU2VuZCBvdXQgYXMgYW4gb2JqZWN0LgotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBFdmFsdWF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCQkJCQkvLyBXYW50IHRvIHJldHVybiB0aGUgcmVhbCBleGNlcHRpb24uCi0JCQkJCQkJCQlzZW5kRXhjZXB0aW9uKGUuZ2V0T3JpZ2luYWxFeGNlcHRpb24oKSwgdmFsdWVPYmplY3QsIG91dCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBDb3VsZG4ndCBiZSBldmFsdWF0ZWQsIHJldHVybiBhbiBlcnJvciBmb3IgdGhpcy4KLQkJCQkJCQkJCXNldEV4Y2VwdGlvbkludG9WYWx1ZShlLmdldE9yaWdpbmFsRXhjZXB0aW9uKCksIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5DQU5OT1RfRVZBTFVBVEVfU1RSSU5HLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlwYXJzZXIgPSBudWxsOwkvLyBDbGVhciBvdXQgZm9yIEdDIHRvIHdvcmsKLQkJCQkJCQl9CQkJCQkJCQkJCi0JCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCXNlbmRFeGNlcHRpb24oZSwgdmFsdWVPYmplY3QsIG91dCk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCS8vIENsZWFyIG91dCBmb3IgR0MgdG8gd29yawotCQkJCQkJCWluaXRTdHJpbmcgPSBudWxsOwotCQkJCQkJCXRoZUNsYXNzID0gbnVsbDsKLQkJCQkJCQluZXdWYWx1ZSA9IG51bGw7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7CQkJCQkJCQotCQkJCQkJfQkKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQkJCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuSU5WT0tFOgotCQkJCQkJT2JqZWN0IHRhcmdldCA9IG51bGw7Ci0JCQkJCQlPYmplY3RbXSBwYXJtcyA9IG51bGw7CQkJCQkJCi0JCQkJCQlDbGFzcyByZXR1cm5UeXBlID0gbnVsbDsKLQkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBhTWV0aG9kID0gbnVsbDsJCQkJCQkKLQkJCQkJCXRyeSB7CQkJCQkKLQkJCQkJCQlpbnQgbWV0aG9kSUQgPSBpbi5yZWFkSW50KCk7CS8vIElEIG9mIG1ldGhvZCB0byBpbnZva2UKLQkJCQkJCQlhTWV0aG9kID0gKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkgc2VydmVyLmdldE9iamVjdChtZXRob2RJRCk7CS8vIE1ldGhvZCB0byBpbnZva2UKLQkJCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQl0YXJnZXQgPSBnZXRJbnZva2FibGVPYmplY3QodmFsdWVPYmplY3QpOwkKLQkJCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQlpZiAodmFsdWVPYmplY3QudHlwZSA9PSBDb21tYW5kcy5BUlJBWV9JRFMpIHsKLQkJCQkJCQkJLy8gSXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBJRHMsIGFzIGl0IG5vcm1hbGx5IHdvdWxkIGJlLgotCQkJCQkJCQl2YWx1ZVNlbmRlci5pbml0aWFsaXplKHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJQ29tbWFuZHMucmVhZEFycmF5KGluLCB2YWx1ZU9iamVjdC5hbkludCwgdmFsdWVTZW5kZXIsIHZhbHVlT2JqZWN0LCBmYWxzZSk7Ci0JCQkJCQkJCXBhcm1zID0gKE9iamVjdFtdKSB2YWx1ZVNlbmRlci5nZXRBcnJheSgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIEl0IGlzIGFsbCBvYmplY3RzIG9yIG51bGwsIHNvIGl0IHNob3VsZCBiZSBhbiBPYmplY3RbXSBvciBudWxsLiBJZiBub3QsIHRoZW4gdGhpcyBpcyBhbiBlcnJvci4KLQkJCQkJCQkJcGFybXMgPSAoT2JqZWN0W10pIHZhbHVlT2JqZWN0LmFuT2JqZWN0OwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlpZiAoIWFNZXRob2QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJCQkJCWFNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsJLy8gV2Ugd2lsbCBhbGxvdyBhbGwgdG8gb2NjdXIuIExldCBhY2Nlc3MgY29udHJvbCBiZSBoYW5kbGVkIGJ5IElERSBhbmQgY29tcGlsZXIuCi0JCQkJCQkJbmV3VmFsdWUgPSBhTWV0aG9kLmludm9rZSh0YXJnZXQsIHBhcm1zKTsKLQkJCQkJCQlyZXR1cm5UeXBlID0gYU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJCQkJaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCQkJCQlpbnQgcmV0dXJuVHlwZUlEID0gc2VydmVyLmdldElkZW50aXR5SUQocmV0dXJuVHlwZSk7Ci0JCQkJCQkJCS8vIE5lZWQgdG8gdGVsbCBzZW5kT2JqZWN0IHRoZSBjb3JyZWN0IHByaW1pdGl2ZSB0eXBlLgotCQkJCQkJCQlzZW5kT2JqZWN0KG5ld1ZhbHVlLCByZXR1cm5UeXBlSUQsIHZhbHVlT2JqZWN0LCBvdXQsIHRydWUpOwotCQkJCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNlbmRPYmplY3QobmV3VmFsdWUsIE5PVF9BX1BSSU1JVElWRSwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSk7CS8vIEp1c3Qgc2VuZCB0aGUgb2JqZWN0IGJhY2suIHNlbmRPYmplY3Qga25vd3MgaG93IHRvIGl0ZXJwcmV0IHRoZSB0eXBlCi0JCQkJCQkJfQkJCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdGhyb3cgZTsJLy8gVGhyb3cgaXQgYWdhaW4uIFRoZXNlIHdlIGRvbid0IHdhbnQgdG8gY29tZSB1cCBhcyBhbiBleGNlcHRpb24gcHJveHkuIFRoZXNlIHNob3VsZCBlbmQgdGhlIHRocmVhZC4KLQkJCQkJCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIFRoaXMgaXMgYSB3cmFwcGVyZWQgZXhjZXB0aW9uLiBSZXR1cm4gdGhlIHdyYXBwZXJlZCBvbmUgc28gaXQgbG9va3MgbGlrZQotCQkJCQkJCS8vIGl0IHdhcyB0aGUgcmVhbCBvbmUuIChTb21ldGltZXMgdGhlIG1ldGhvZCBiZWluZyBpbnZva2VkIGlzIG9uIGEgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IubmV3SW5zdGFuY2UsCi0JCQkJCQkJLy8gd2hpY2ggaW4gdHVybiBpcyBhbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBzbyB3ZSB3aWxsIGdvIHVudGlsIHdlIGRvbid0IGhhdmUgYW4gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbi4KLQkJCQkJCQlUaHJvd2FibGUgdCA9IGU7Ci0JCQkJCQkJZG8gewotCQkJCQkJCQl0ID0gKChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB0KS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCQkJCQl9IHdoaWxlICh0IGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbik7Ci0JCQkJCQkJc2VuZEV4Y2VwdGlvbih0LCB2YWx1ZU9iamVjdCwgb3V0KTsKLQkJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQkJc2VuZEV4Y2VwdGlvbihlLCB2YWx1ZU9iamVjdCwgb3V0KTsJLy8gVHVybiBpdCBpbnRvIGEgZXhjZXB0aW9uIHByb3h5IG9uIHRoZSBjbGllbnQuCi0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCS8vIENsZWFyIG91dCBmb3IgR0MgdG8gd29yawotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCXBhcm1zID0gbnVsbDsKLQkJCQkJCQl0YXJnZXQgPSBudWxsOwotCQkJCQkJCWFNZXRob2QgPSBudWxsOwotCQkJCQkJCXJldHVyblR5cGUgPSBudWxsOwotCQkJCQkJCW5ld1ZhbHVlID0gbnVsbDsKLQkJCQkJCQl2YWx1ZVNlbmRlci5jbGVhcigpOwotCQkJCQkJfQkJCQkJCi0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLklOVk9LRV9XSVRIX01FVEhPRF9QQVNTRUQ6Ci0JCQkJCQlhQ2xhc3MgPSBudWxsOwotCQkJCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBudWxsOwotCQkJCQkJQ2xhc3NbXSBwYXJtVHlwZXMgPSBudWxsOwotCQkJCQkJdGFyZ2V0ID0gbnVsbDsKLQkJCQkJCXBhcm1zID0gbnVsbDsJCQkJCQkKLQkJCQkJCXJldHVyblR5cGUgPSBudWxsOwotCQkJCQkJYU1ldGhvZCA9IG51bGw7CQkJCQkJCi0JCQkJCQkKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJYUNsYXNzID0gKENsYXNzKSBnZXRJbnZva2FibGVPYmplY3QodmFsdWVPYmplY3QpOyAvLyBUaGUgY2xhc3MgdGhhdCBoYXMgdGhlIG1ldGhvZC4KLQkJCQkJCQltZXRob2ROYW1lID0gaW4ucmVhZFVURigpOwotCQkJCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCWlmICh2YWx1ZU9iamVjdC50eXBlID09IENvbW1hbmRzLkFSUkFZX0lEUykgewotCQkJCQkJCQkvLyBJdCBpcyBhbiBhcnJheSBjb250YWluaW5nIElEcywgYXMgaXQgbm9ybWFsbHkgd291bGQgYmUuCi0JCQkJCQkJCXZhbHVlU2VuZGVyLmluaXRpYWxpemUodmFsdWVPYmplY3QpOwotCQkJCQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaW4sIHZhbHVlT2JqZWN0LmFuSW50LCB2YWx1ZVNlbmRlciwgdmFsdWVPYmplY3QsIGZhbHNlKTsKLQkJCQkJCQkJcGFybVR5cGVzID0gKENsYXNzW10pIHZhbHVlU2VuZGVyLmdldEFycmF5KCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gSXQgbnVsbCwgc28gaXQgc2hvdWxkIGJlIGFuIG51bGwuIElmIG5vdCwgdGhlbiB0aGlzIGlzIGFuIGVycm9yLgotCQkJCQkJCQlwYXJtVHlwZXMgPSBudWxsOwotCQkJCQkJCX0KLQkJCQkJCQlhTWV0aG9kID0gYUNsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCi0JCQkJCQkJLy8gTm93IHdlIGdldCB0aGUgaW5mbyBmb3IgdGhlIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZCBhbmQgZXhlY3V0ZSBpdC4KLQkJCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQl0YXJnZXQgPSBnZXRJbnZva2FibGVPYmplY3QodmFsdWVPYmplY3QpOwkKLQkJCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQlpZiAodmFsdWVPYmplY3QudHlwZSA9PSBDb21tYW5kcy5BUlJBWV9JRFMpIHsKLQkJCQkJCQkJLy8gSXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBJRHMsIGFzIGl0IG5vcm1hbGx5IHdvdWxkIGJlLgotCQkJCQkJCQl2YWx1ZVNlbmRlci5pbml0aWFsaXplKHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJQ29tbWFuZHMucmVhZEFycmF5KGluLCB2YWx1ZU9iamVjdC5hbkludCwgdmFsdWVTZW5kZXIsIHZhbHVlT2JqZWN0LCBmYWxzZSk7Ci0JCQkJCQkJCXBhcm1zID0gKE9iamVjdFtdKSB2YWx1ZVNlbmRlci5nZXRBcnJheSgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIEl0IGlzIGFsbCBvYmplY3RzIG9yIG51bGwsIHNvIGl0IHNob3VsZCBiZSBhbiBPYmplY3RbXSBvciBudWxsLiBJZiBub3QsIHRoZW4gdGhpcyBpcyBhbiBlcnJvci4KLQkJCQkJCQkJcGFybXMgPSAoT2JqZWN0W10pIHZhbHVlT2JqZWN0LmFuT2JqZWN0OwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlpZiAoIWFNZXRob2QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJCQkJCWFNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsJLy8gV2Ugd2lsbCBhbGxvdyBhbGwgdG8gb2NjdXIuIExldCBhY2Nlc3MgY29udHJvbCBiZSBoYW5kbGVkIGJ5IElERSBhbmQgY29tcGlsZXIuCi0JCQkJCQkJbmV3VmFsdWUgPSBhTWV0aG9kLmludm9rZSh0YXJnZXQsIHBhcm1zKTsKLQkJCQkJCQlyZXR1cm5UeXBlID0gYU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJCQkJaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCQkJCQlpbnQgcmV0dXJuVHlwZUlEID0gc2VydmVyLmdldElkZW50aXR5SUQocmV0dXJuVHlwZSk7Ci0JCQkJCQkJCS8vIE5lZWQgdG8gdGVsbCBzZW5kT2JqZWN0IHRoZSBjb3JyZWN0IHByaW1pdGl2ZSB0eXBlLgotCQkJCQkJCQlzZW5kT2JqZWN0KG5ld1ZhbHVlLCByZXR1cm5UeXBlSUQsIHZhbHVlT2JqZWN0LCBvdXQsIHRydWUpOwotCQkJCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNlbmRPYmplY3QobmV3VmFsdWUsIE5PVF9BX1BSSU1JVElWRSwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSk7CS8vIEp1c3Qgc2VuZCB0aGUgb2JqZWN0IGJhY2suIHNlbmRPYmplY3Qga25vd3MgaG93IHRvIGl0ZXJwcmV0IHRoZSB0eXBlCi0JCQkJCQkJfQkJCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdGhyb3cgZTsJLy8gVGhyb3cgaXQgYWdhaW4uIFRoZXNlIHdlIGRvbid0IHdhbnQgdG8gY29tZSB1cCBhcyBhbiBleGNlcHRpb24gcHJveHkuIFRoZXNlIHNob3VsZCBlbmQgdGhlIHRocmVhZC4KLQkJCQkJCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIFRoaXMgaXMgYSB3cmFwcGVyZWQgZXhjZXB0aW9uLiBSZXR1cm4gdGhlIHdyYXBwZXJlZCBvbmUgc28gaXQgbG9va3MgbGlrZQotCQkJCQkJCS8vIGl0IHdhcyB0aGUgcmVhbCBvbmUuIChTb21ldGltZXMgdGhlIG1ldGhvZCBiZWluZyBpbnZva2VkIGlzIG9uIGEgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IubmV3SW5zdGFuY2UsCi0JCQkJCQkJLy8gd2hpY2ggaW4gdHVybiBpcyBhbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBzbyB3ZSB3aWxsIGdvIHVudGlsIHdlIGRvbid0IGhhdmUgYW4gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbi4KLQkJCQkJCQlUaHJvd2FibGUgdCA9IGU7Ci0JCQkJCQkJZG8gewotCQkJCQkJCQl0ID0gKChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB0KS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCQkJCQl9IHdoaWxlICh0IGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbik7Ci0JCQkJCQkJc2VuZEV4Y2VwdGlvbih0LCB2YWx1ZU9iamVjdCwgb3V0KTsKLQotCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJCQkJc2VuZEV4Y2VwdGlvbihlLCB2YWx1ZU9iamVjdCwgb3V0KTsJLy8gVHVybiBpdCBpbnRvIGEgZXhjZXB0aW9uIHByb3h5IG9uIHRoZSBjbGllbnQuCi0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWFDbGFzcyA9IG51bGw7Ci0JCQkJCQkJbWV0aG9kTmFtZSA9IG51bGw7Ci0JCQkJCQkJcGFybVR5cGVzID0gbnVsbDsKLQkJCQkJCQkvLyBDbGVhciBvdXQgZm9yIEdDIHRvIHdvcmsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQlwYXJtcyA9IG51bGw7Ci0JCQkJCQkJdGFyZ2V0ID0gbnVsbDsKLQkJCQkJCQlhTWV0aG9kID0gbnVsbDsKLQkJCQkJCQlyZXR1cm5UeXBlID0gbnVsbDsKLQkJCQkJCQluZXdWYWx1ZSA9IG51bGw7Ci0JCQkJCQkJdmFsdWVTZW5kZXIuY2xlYXIoKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLkdFVF9BUlJBWV9DT05URU5UUzoKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdGFyZ2V0ID0gc2VydmVyLmdldE9iamVjdChpbi5yZWFkSW50KCkpOwkvLyBBcnJheSB0byBnZXQgdGhlIGlkcyBmb3IuCi0JCQkJCQkJdmFsdWVPYmplY3Quc2V0QXJyYXlJRFMobmV3IEFycmF5Q29udGVudHNSZXRyaWV2ZXIodGFyZ2V0KSwgQXJyYXkuZ2V0TGVuZ3RoKHRhcmdldCksIENvbW1hbmRzLk9CSkVDVF9DTEFTUyk7Ci0JCQkJCQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvdXQsIHZhbHVlT2JqZWN0LCB0cnVlKTsJLy8gV3JpdGUgaXQgYmFjayBhcyBhIHZhbHVlIGNvbW1hbmQuCi0JCQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBlOwkvLyBUaHJvdyBpdCBhZ2Fpbi4gVGhlc2Ugd2UgZG9uJ3Qgd2FudCB0byBjb21lIHVwIGFzIGFuIGV4Y2VwdGlvbiBwcm94eS4gVGhlc2Ugc2hvdWxkIGVuZCB0aGUgdGhyZWFkLgotCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJCQlzZW5kRXhjZXB0aW9uKGUsIHZhbHVlT2JqZWN0LCBvdXQpOwkvLyBUdXJuIGl0IGludG8gYSBleGNlcHRpb24gcHJveHkgb24gdGhlIGNsaWVudC4KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJdGFyZ2V0ID0gbnVsbDsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuQ0FMTEJBQ0tfRE9ORToKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKGNvbm5lY3Rpb25UaHJlYWQgIT0gbnVsbCkgewotCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQkJQ29tbWFuZHMuc2VuZEVycm9yQ29tbWFuZChvdXQsIENvbW1hbmRzLlVOS05PV05fQ09NTUFORF9TRU5ULCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCUNvbW1hbmRzLnJlYWRCYWNrVmFsdWUoaW4sIHZhbHVlT2JqZWN0LCBDb21tYW5kcy5OT19UWVBFX0NIRUNLKTsKLQkJCQkJCQkJCWlmICh2YWx1ZU9iamVjdC50eXBlID09IENvbW1hbmRzLkFSUkFZX0lEUykgewotCQkJCQkJCQkJCS8vIEl0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgSURzLCBhcyBpdCBub3JtYWxseSB3b3VsZCBiZS4KLQkJCQkJCQkJCQl2YWx1ZVNlbmRlci5pbml0aWFsaXplKHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaW4sIHZhbHVlT2JqZWN0LmFuSW50LCB2YWx1ZVNlbmRlciwgdmFsdWVPYmplY3QsIGZhbHNlKTsKLQkJCQkJCQkJCQlyZXN1bHQgPSAoT2JqZWN0W10pIHZhbHVlU2VuZGVyLmdldEFycmF5KCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXJlc3VsdCA9IGdldEludm9rYWJsZU9iamVjdCh2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlkb0xvb3AgPSBmYWxzZTsgLy8gV2UgbmVlZCB0byB0ZXJtaW5hdGUgYW5kIHJldHVybiByZXN1bHQKLQkJCQkJCQkJCWNsb3NlV2hlbkRvbmUgPSBmYWxzZTsgLy8gRG9uJ3QgY2xvc2UsIHdlIHdpbGwgY29udGludWUuCi0JCQkJCQkJCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkvLyBUaGVyZSB3YXMgYW4gY29tbWFuZCBlcnJvciBvbiB0aGUgb3RoZXIgc2lkZS4gVGhpcyBtZWFucyAKLQkJCQkJCQkJCS8vIGNvbm5lY3Rpb24gc3RpbGwgZ29vZCwgYnV0IGRvbid0IGNvbnRpbnVlIHRoZSBjYWxsYmFjayBwcm9jZXNzaW5nLgotCQkJCQkJCQkJZG9Mb29wID0gZmFsc2U7IC8vIFdlIG5lZWQgdG8gdGVybWluYXRlIGFuZCByZXR1cm4gcmVzdWx0Ci0JCQkJCQkJCQljbG9zZVdoZW5Eb25lID0gZmFsc2U7IC8vIERvbid0IGNsb3NlLCB3ZSB3aWxsIGNvbnRpbnVlLgotCQkJCQkJCQkJdGhyb3cgZTsJLy8gTGV0IGl0IGdvIG9uIG91dC4KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJdmFsdWVTZW5kZXIuY2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuRVJST1I6Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIEdvdCBhbiBlcnJvciBjb21tYW5kLiBEb24ndCBrbm93IHdoYXQgdG8gZG8gYnV0IHJlYWQgdGhlCi0JCQkJCQkJLy8gdmFsdWUgYW5kIHNpbXBseSBwcmludCBpdCBvdXQuCi0JCQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJcmVzdWx0ID0gZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlT2JqZWN0KTsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHNlbnQgdG8gc2VydmVyOiBSZXN1bHQ9IiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQ6Ci0JCQkJCQl0cnkgewotCQkJCQkJCXByb2Nlc3NFeHByZXNzaW9uQ29tbWFuZCh2YWx1ZU9iamVjdCwgdmFsdWVTZW5kZXIpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQl2YWx1ZVNlbmRlci5jbGVhcigpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCS8vIFVua25vd24gY29tbWFuZC4gV2UgZG9uJ3Qga25vdyBob3cgbG9uZyBpdCBpcywgc28gd2UgbmVlZCB0byBzaHV0IHRoZSBjb25uZWN0aW9uIGRvd24uCi0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiBJbnZhbGlkIGNtZCBzZW5kIHRvIHNlcnZlcjogQ21kPSIgKyBjbWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkb0xvb3AgPSBmYWxzZTsKLQkJCQkJCWNsb3NlV2hlbkRvbmUgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBvay4gSXQgbWVhbnMgdGhhdCB0aGUgY29ubmVjdGlvbiBvbiB0aGUgb3RoZXIgc2lkZSB3YXMgdGVybWluYXRlZC4KLQkJCS8vIFNvIGp1c3QgYWNjZXB0IHRoaXMgYW5kIGdvIGRvd24uCi0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChzb2NrZXQgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwkvLyBzb2NrZXQgbnVsbCBtZWFucyBhIHZhbGlkIGNsb3NlIHJlcXVlc3QKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY2xvc2VXaGVuRG9uZSkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRyID0gZXhwcmVzc2lvblByb2Nlc3NvcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQkJCUV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyIGV4cCA9IChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgaXRyLm5leHQoKTsKLQkJCQkJCWV4cC5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZXhwcmVzc2lvblByb2Nlc3NvcnMuY2xlYXIoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQlpbiA9IG51bGw7Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQlvdXQgPSBudWxsOwotCQkJCWNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChjbG9zZVdoZW5Eb25lICYmIGNvbm5lY3Rpb25UaHJlYWQgIT0gbnVsbCkKLQkJCXNlcnZlci5yZW1vdmVDb25uZWN0aW9uVGhyZWFkKGNvbm5lY3Rpb25UaHJlYWQpOwotCQlpZiAoc2h1dGRvd24pCi0JCQlzZXJ2ZXIucmVxdWVzdFNodXRkb3duKCk7Ci0JCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLy8gQSByZXRyaWV2ZXIgaXMgd2hhdCBoYW5kbGVzIHRoZSBhcnJheSBnZXQgY29udGVudHMuCi0JcHJpdmF0ZSBjbGFzcyBBcnJheUNvbnRlbnRzUmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCWludCBpbmRleD0wOwotCQlPYmplY3QgYXJyYXk7Ci0JCWludCBsZW5ndGg7Ci0JCWludCBjb21wb25lbnRUeXBlOwotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCi0JCQotCQlwdWJsaWMgQXJyYXlDb250ZW50c1JldHJpZXZlcihPYmplY3QgYW5BcnJheSkgewotCQkJYXJyYXkgPSBhbkFycmF5OwotCQkJbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFuQXJyYXkpOwotCQkJaWYgKGFuQXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSkgewotCQkJCWNvbXBvbmVudFR5cGUgPSBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChhbkFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLQkJCX0gZWxzZQotCQkJCWNvbXBvbmVudFR5cGUgPSBOT1RfQV9QUklNSVRJVkU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQlmaWxsSW5WYWx1ZShBcnJheS5nZXQoYXJyYXksIGluZGV4KyspLCBjb21wb25lbnRUeXBlLCB3b3JrZXIpOwotCQkJcmV0dXJuIHdvcmtlcjsKLQkJfQotCX07Ci0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0V4cHJlc3Npb25Db21tYW5kKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0LCBJbnZva2FibGVWYWx1ZVNlbmRlciB2YWx1ZVNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJSW50ZWdlciBleHByZXNzaW9uSUQgPSBuZXcgSW50ZWdlcihpbi5yZWFkSW50KCkpOwotCQlieXRlIGNtZFR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotCQlFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciBleHAgPSBudWxsOwotCQlzd2l0Y2ggKGNtZFR5cGUpIHsKLQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLlNUQVJUX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HOgotCQkJCWJ5dGUgdHJhY2UgPSBpbi5yZWFkQnl0ZSgpOwotCQkJCWlmICh0cmFjZSA9PSBFeHByZXNzaW9uQ29tbWFuZHMuVFJBQ0VfREVGQVVMVCkKLQkJCQkJZXhwID0gbmV3IEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKHNlcnZlciwgdGhpcyk7Ci0JCQkJZWxzZQotCQkJCQlleHAgPSBuZXcgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIoc2VydmVyLCB0aGlzLCB0cmFjZSA9PSBFeHByZXNzaW9uQ29tbWFuZHMuVFJBQ0VfT04pOwotCQkJCWV4cHJlc3Npb25Qcm9jZXNzb3JzLnB1dChleHByZXNzaW9uSUQsIGV4cCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEV4cHJlc3Npb25Db21tYW5kcy5UUkFOU0ZFUl9FWFBSRVNTSU9OX1JFUVVFU1Q6Ci0JCQkJZXhwID0gKEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKSBleHByZXNzaW9uUHJvY2Vzc29ycy5yZW1vdmUoZXhwcmVzc2lvbklEKTsgCi0JCQkJc2VuZE9iamVjdChleHAsIE5PVF9BX1BSSU1JVElWRSwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEV4cHJlc3Npb25Db21tYW5kcy5SRVNVTUVfRVhQUkVTU0lPTl9SRVFVRVNUOgotCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCWV4cCA9IChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlT2JqZWN0KTsgCi0JCQkJZXhwcmVzc2lvblByb2Nlc3NvcnMucHV0KGV4cHJlc3Npb25JRCwgZXhwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLlBVU0hfRVhQUkVTU0lPTjoKLQkJCQlleHAgPSAoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIpIGV4cHJlc3Npb25Qcm9jZXNzb3JzLmdldChleHByZXNzaW9uSUQpOwotCQkJCWV4cC5wcm9jZXNzKGluKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLlNZTkNfUkVRVUVTVDoKLQkJCQlib29sZWFuIGhhdmVQcm94aWVzID0gaW4ucmVhZEJvb2xlYW4oKTsJLy8gU2VlIGlmIHdlIGV4cHJlc3Npb24gcHJveHkgaWRzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZCAKLQkJCQlpZiAoaGF2ZVByb3hpZXMpIHsKLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCXZhbHVlU2VuZGVyLmluaXRpYWxpemUodmFsdWVPYmplY3QpOwotCQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaW4sIHZhbHVlT2JqZWN0LmFuSW50LCB2YWx1ZVNlbmRlciwgdmFsdWVPYmplY3QsIGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlleHAgPSAoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIpIGV4cHJlc3Npb25Qcm9jZXNzb3JzLmdldChleHByZXNzaW9uSUQpOwotCQkJCWlmIChoYXZlUHJveGllcykKLQkJCQkJc2VuZEV4cHJlc3Npb25Qcm94eVJlc29sdXRpb25zKHZhbHVlT2JqZWN0LCAoaW50W10pIHZhbHVlU2VuZGVyLmdldEFycmF5KCksIGV4cCk7Ci0JCQkJaWYgKGV4cC5ub0Vycm9ycygpKSB7Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCh0cnVlKTsgLy8gTWFyayB0aGF0IGFsbCBpcyBnb29kLgotCQkJCQlDb21tYW5kcy53cml0ZVZhbHVlKG91dCwgdmFsdWVPYmplY3QsIHRydWUsIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NFeHByZXNzaW9uRXJyb3IoZXhwLCB2YWx1ZU9iamVjdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFeHByZXNzaW9uQ29tbWFuZHMuUFVMTF9WQUxVRV9SRVFVRVNUOgotCQkJCWhhdmVQcm94aWVzID0gaW4ucmVhZEJvb2xlYW4oKTsJLy8gU2VlIGlmIHdlIGV4cHJlc3Npb24gcHJveHkgaWRzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZAotCQkJCWlmIChoYXZlUHJveGllcykgewotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQkJdmFsdWVTZW5kZXIuaW5pdGlhbGl6ZSh2YWx1ZU9iamVjdCk7Ci0JCQkJCUNvbW1hbmRzLnJlYWRBcnJheShpbiwgdmFsdWVPYmplY3QuYW5JbnQsIHZhbHVlU2VuZGVyLCB2YWx1ZU9iamVjdCwgZmFsc2UpOwotCQkJCX0KLQotCQkJCWV4cCA9IChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgZXhwcmVzc2lvblByb2Nlc3NvcnMuZ2V0KGV4cHJlc3Npb25JRCk7Ci0JCQkJaWYgKGhhdmVQcm94aWVzKQotCQkJCQlzZW5kRXhwcmVzc2lvblByb3h5UmVzb2x1dGlvbnModmFsdWVPYmplY3QsIChpbnRbXSkgdmFsdWVTZW5kZXIuZ2V0QXJyYXkoKSwgZXhwKTsKLQkJCQlpZiAoZXhwLm5vRXJyb3JzKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdFtdIHB1bGxlZFZhbHVlID0gZXhwLnB1bGxWYWx1ZSgpOwotCQkJCQkJLy8gU2VuZCBiYWNrIHRoZSBjb21tYW5kIGNvZGUgZm9yIHB1bGwgdmFsdWUuIERvbid0IGZsdXNoLiBXZSB3aWxsIGZsdXNoIHdoZW4gYWxsIGRvbmUuCi0JCQkJCQlpZiAoKChDbGFzcykgcHVsbGVkVmFsdWVbMV0pLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQlpbnQgcmV0dXJuVHlwZUlEID0gc2VydmVyLmdldElkZW50aXR5SUQocHVsbGVkVmFsdWVbMV0pOwotCQkJCQkJCS8vIE5lZWQgdG8gdGVsbCBzZW5kT2JqZWN0IHRoZSBjb3JyZWN0IHByaW1pdGl2ZSB0eXBlLgotCQkJCQkJCXNlbmRPYmplY3QocHVsbGVkVmFsdWVbMF0sIHJldHVyblR5cGVJRCwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCQkJCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXNlbmRPYmplY3QocHVsbGVkVmFsdWVbMF0sIE5PVF9BX1BSSU1JVElWRSwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSwgdHJ1ZSk7CS8vIEp1c3Qgc2VuZCB0aGUgb2JqZWN0IGJhY2suIHNlbmRPYmplY3Qga25vd3MgaG93IHRvIGl0ZXJwcmV0IHRoZSB0eXBlCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXNlbmROb1ZhbHVlRXJyb3JDb21tYW5kKGV4cCwgdmFsdWVPYmplY3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIAotCQkJCQlwcm9jZXNzRXhwcmVzc2lvbkVycm9yKGV4cCwgdmFsdWVPYmplY3QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFeHByZXNzaW9uQ29tbWFuZHMuRU5EX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HOgotCQkJCWV4cCA9IChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgZXhwcmVzc2lvblByb2Nlc3NvcnMucmVtb3ZlKGV4cHJlc3Npb25JRCk7Ci0JCQkJZXhwLmNsb3NlKCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSBpcwotCSAqIEBwYXJhbSBleHAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VuZEV4cHJlc3Npb25Qcm94eVJlc29sdXRpb25zKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0LCBmaW5hbCBpbnRbXSBwcm94eUlEcywgZmluYWwgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgZXhwKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWNsYXNzIEV4cHJlc3Npb25Qcm94eVJldHJpZXZlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlUmV0cmlldmUgewotCQkJaW50IGluZGV4ID0gMDsKLQkJCU9iamVjdFtdIHByb3h5UmVzb2x1dGlvbiA9IG5ldyBPYmplY3RbMl07Ci0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQotCQkJcHVibGljIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5leHRWYWx1ZSgpIHsKLQkJCQlpbnQgcHJveHlJRCA9IHByb3h5SURzW2luZGV4KytdOwotCQkJCWlmIChleHAucHVsbEV4cHJlc3Npb25Qcm94eVZhbHVlKHByb3h5SUQsIHByb3h5UmVzb2x1dGlvbikpIHsKLQkJCQkJaWYgKHByb3h5UmVzb2x1dGlvblsxXSAhPSBWb2lkLlRZUEUpIHsKLQkJCQkJCWlmICgoKENsYXNzKSBwcm94eVJlc29sdXRpb25bMV0pLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQlpbnQgcmV0dXJuVHlwZUlEID0gc2VydmVyLmdldElkZW50aXR5SUQocHJveHlSZXNvbHV0aW9uWzFdKTsKLQkJCQkJCQkvLyBOZWVkIHRvIHRlbGwgd29ya2VyIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSB0eXBlLgotCQkJCQkJCWZpbGxJblZhbHVlKHByb3h5UmVzb2x1dGlvblswXSwgcmV0dXJuVHlwZUlELCB3b3JrZXIpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmaWxsSW5WYWx1ZShwcm94eVJlc29sdXRpb25bMF0sIE5PVF9BX1BSSU1JVElWRSwgd29ya2VyKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlCi0JCQkJCQl3b3JrZXIuc2V0RmxhZyhFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTlBST1hZX1ZPSURUWVBFKTsJLy8gSXQgd2FzIHJlc29sdmVkLCBidXQgdG8gbm90IHNldCBkdWUgdG8gdm9pZCB0eXBlIG9mIGV4cHJlc3Npb24uCi0JCQkJfSBlbHNlCi0JCQkJCXdvcmtlci5zZXRGbGFnKEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OUFJPWFlfTk9UUkVTT0xWRUQpOwkvLyBJdCB3YXNuJ3QgcmVzb2x2ZWQuCi0JCQkJCi0JCQkJcmV0dXJuIHdvcmtlcjsKLQkJCX0KLQkJfTsKLQotCQl2YWx1ZU9iamVjdC5zZXRBcnJheUlEUyhuZXcgRXhwcmVzc2lvblByb3h5UmV0cmlldmVyKCksIHByb3h5SURzLmxlbmd0aCwgQ29tbWFuZHMuT0JKRUNUX0NMQVNTKTsKLQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvdXQsIHZhbHVlT2JqZWN0LCB0cnVlLCBmYWxzZSk7CS8vIFdyaXRlIGl0IGJhY2sgYXMgYSB2YWx1ZSBjb21tYW5kLgotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHByZXNzaW9uRXJyb3IoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgZXhwLCBDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZU9iamVjdCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoZXhwLmlzTm9FeHByZXNzaW9uVmFsdWUoKSkgewotCQkJc2VuZE5vVmFsdWVFcnJvckNvbW1hbmQoZXhwLCB2YWx1ZU9iamVjdCk7Ci0JCX0gZWxzZQotCQkJc2VuZEV4Y2VwdGlvbihleHAuZ2V0RXJyb3JUaHJvd2FibGUoKSwgdmFsdWVPYmplY3QsIG91dCk7Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gZXhwCi0JICogQHBhcmFtIHZhbHVlT2JqZWN0Ci0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbmROb1ZhbHVlRXJyb3JDb21tYW5kKEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyIGV4cCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJc2V0RXhjZXB0aW9uSW50b1ZhbHVlKGV4cC5nZXRFcnJvclRocm93YWJsZSgpLCB2YWx1ZU9iamVjdCk7Ci0JCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTl9OT0VYUFJFU1NJT05WQUxVRV9FWENFUFRJT04sIHZhbHVlT2JqZWN0KTsKLQl9Ci0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5PVF9BX1BSSU1JVElWRSA9IENvbW1hbmRzLk5PVF9BTl9JRDsKLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNFTkRfQVNfSVMgPSAtMjsJLy8gVGhpcyBtZWFucyBzZW5kcyBhcyBhbiBvYmplY3Qgbm90IGFzIGFuIGlkLgotCQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfQURERUQgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FEREVEID0gMjsKLXB1YmxpYyBpbnQgZmlsbEluVmFsdWUoT2JqZWN0IG9iamVjdCwgaW50IHByaW1pdGl2ZVR5cGVJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QpIHsKLQlpbnQgYWRkZWQgPSAwOwotCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQl9IGVsc2UgewotCQlpbnQgY2xhc3NJRCA9IDA7Ci0JCWlmIChwcmltaXRpdmVUeXBlSUQgIT0gTk9UX0FfUFJJTUlUSVZFICYmIHByaW1pdGl2ZVR5cGVJRCAhPSBTRU5EX0FTX0lTKSB7Ci0JCQljbGFzc0lEID0gcHJpbWl0aXZlVHlwZUlEOwkvLyBUaGUgb2JqZWN0IGlzIHJlYWxseSBzdXBwb3NlZCB0byBiZSBhIHByaW1pdGl2ZSBvZiB0aGlzIHR5cGUKLQkJCXN3aXRjaCAoY2xhc3NJRCkgewotCQkJCWNhc2UgQ29tbWFuZHMuQk9PTEVBTl9UWVBFOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKChCb29sZWFuKSBvYmplY3QpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5JTlRFR0VSX1RZUEU6Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKGludCkgKChDaGFyYWN0ZXIpIG9iamVjdCkuY2hhclZhbHVlKCkpOwkvLyBCZWNhdXNlIGNoYXIgY2FuIGJlIHdpZGVuZWQgdG8gYW4gaW50Ci0JCQkJCWVsc2UKLQkJCQkJCXZhbHVlT2JqZWN0LnNldCgoKE51bWJlcikgb2JqZWN0KS5pbnRWYWx1ZSgpKTsJCQkJCQotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkJZVEVfVFlQRToKLQkJCQkJdmFsdWVPYmplY3Quc2V0KCgoTnVtYmVyKSBvYmplY3QpLmJ5dGVWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5DSEFSQUNURVJfVFlQRToKLQkJCQkJdmFsdWVPYmplY3Quc2V0KCgoQ2hhcmFjdGVyKSBvYmplY3QpLmNoYXJWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5ET1VCTEVfVFlQRToKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCQkJCXZhbHVlT2JqZWN0LnNldCgoZG91YmxlKSAoKENoYXJhY3Rlcikgb2JqZWN0KS5jaGFyVmFsdWUoKSk7CS8vIEJlY2F1c2UgY2hhciBjYW4gYmUgd2lkZW5lZCB0byBhIGRvdWJsZQotCQkJCQllbHNlCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKChOdW1iZXIpIG9iamVjdCkuZG91YmxlVmFsdWUoKSk7CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5GTE9BVF9UWVBFOgotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJCQkJdmFsdWVPYmplY3Quc2V0KChmbG9hdCkgKChDaGFyYWN0ZXIpIG9iamVjdCkuY2hhclZhbHVlKCkpOwkvLyBCZWNhdXNlIGNoYXIgY2FuIGJlIHdpZGVuZWQgdG8gYSBmbG9hdAotCQkJCQllbHNlCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKChOdW1iZXIpIG9iamVjdCkuZmxvYXRWYWx1ZSgpKTsJCQkJCQotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLlNIT1JUX1RZUEU6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoKE51bWJlcikgb2JqZWN0KS5zaG9ydFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkxPTkdfVFlQRToKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCQkJCXZhbHVlT2JqZWN0LnNldCgobG9uZykgKChDaGFyYWN0ZXIpIG9iamVjdCkuY2hhclZhbHVlKCkpOwkvLyBCZWNhdXNlIGNoYXIgY2FuIGJlIHdpZGVuZWQgdG8gYSBsb25nCi0JCQkJCWVsc2UKLQkJCQkJCXZhbHVlT2JqZWN0LnNldCgoKE51bWJlcikgb2JqZWN0KS5sb25nVmFsdWUoKSk7CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdCdzIG5vdCBhIHByaW1pdGl2ZS4KLQkJCWJvb2xlYW4gYWRkT2JqZWN0ID0gZmFsc2UsIGFkZENsYXNzID0gZmFsc2U7CQkJCi0JCQlDbGFzcyBvYmpDbGFzcyA9IG9iamVjdC5nZXRDbGFzcygpOwotCQkJY2xhc3NJRCA9IHNlcnZlci5nZXRJZGVudGl0eUlEKG9iakNsYXNzKTsKLQkJCWlmIChjbGFzc0lEID09IFJlbW90ZVZNU2VydmVyVGhyZWFkLklEX05PVF9GT1VORCkgewotCQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IGNsYXNzVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCQlhZGRDbGFzcyA9IHNlcnZlci5nZXRJZGVudGl0eUlEKG9iakNsYXNzLCBjbGFzc1ZhbHVlKTsKLQkJCQlpZiAoYWRkQ2xhc3MpCi0JCQkJCWFkZGVkIHw9IENMQVNTX0FEREVEOwotCQkJCWNsYXNzSUQgPSBjbGFzc1ZhbHVlLm9iamVjdElEOwotCQkJfQotCQkKLQkJCXN3aXRjaCAoY2xhc3NJRCkgewotCQkJCWNhc2UgQ29tbWFuZHMuQllURV9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChCeXRlKSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkNIQVJBQ1RFUl9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChDaGFyYWN0ZXIpIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuRE9VQkxFX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKERvdWJsZSkgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5GTE9BVF9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChGbG9hdCkgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5JTlRFR0VSX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKEludGVnZXIpIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuTE9OR19DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChMb25nKSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLlNIT1JUX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKFNob3J0KSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkJPT0xFQU5fQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoQm9vbGVhbikgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5TVFJJTkdfQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoU3RyaW5nKSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkJJR19ERUNJTUFMX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQob2JqZWN0LCBDb21tYW5kcy5CSUdfREVDSU1BTF9DTEFTUyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuQklHX0lOVEVHRVJfQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldChvYmplY3QsIENvbW1hbmRzLkJJR19JTlRFR0VSX0NMQVNTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJaWYgKHByaW1pdGl2ZVR5cGVJRCAhPSBTRU5EX0FTX0lTKSB7Ci0JCQkJCQlhZGRPYmplY3QgPSBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChvYmplY3QsIHZhbHVlT2JqZWN0KTsKLQkJCQkJCWlmIChhZGRPYmplY3QpIHsKLQkJCQkJCQlhZGRlZCB8PSBPQkpFQ1RfQURERUQ7CQkJCi0JCQkJCQkJdmFsdWVPYmplY3Quc2V0T2JqZWN0SUQodmFsdWVPYmplY3Qub2JqZWN0SUQsIGNsYXNzSUQpOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJdmFsdWVPYmplY3Quc2V0T2JqZWN0SUQodmFsdWVPYmplY3Qub2JqZWN0SUQpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXZhbHVlT2JqZWN0LnNldChvYmplY3QsIGNsYXNzSUQpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkKLQlyZXR1cm4gYWRkZWQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNlbmRPYmplY3QoT2JqZWN0IG9iamVjdCwgaW50IHByaW1pdGl2ZVR5cGVJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QsIERhdGFPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIHdyaXRlQXNDb21tYW5kKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0Jc2VuZE9iamVjdChvYmplY3QsIHByaW1pdGl2ZVR5cGVJRCwgdmFsdWVPYmplY3QsIG91dCwgd3JpdGVBc0NvbW1hbmQsIHdyaXRlQXNDb21tYW5kKTsKLX0KLXB1YmxpYyB2b2lkIHNlbmRPYmplY3QoT2JqZWN0IG9iamVjdCwgaW50IHByaW1pdGl2ZVR5cGVJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QsIERhdGFPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIHdyaXRlQXNDb21tYW5kLCBib29sZWFuIGZsdXNoKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7CQkJCi0JaW50IGFkZGVkID0gZmlsbEluVmFsdWUob2JqZWN0LCBwcmltaXRpdmVUeXBlSUQsIHZhbHVlT2JqZWN0KTsKLQlib29sZWFuIHNlbnQgPSBmYWxzZTsKLQl0cnkgewotCQlDb21tYW5kcy53cml0ZVZhbHVlKG91dCwgdmFsdWVPYmplY3QsIHdyaXRlQXNDb21tYW5kLCBmbHVzaCk7CS8vIFdyaXRlIGl0IGJhY2sgYXMgYSB2YWx1ZSBjb21tYW5kLgotCQlzZW50ID0gdHJ1ZTsKLQl9IGZpbmFsbHkgewotCQlpZiAoIXNlbnQpIHsKLQkJCS8vIEVuZGluZyBkdWUgdG8gc29tZSBwcm9ibGVtLCBzbyBjbGVhbiB1cCBhbnkgYWRkZWQgb2JqZWN0cyBmcm9tIHRoZSBpZCB0YWJsZS4KLQkJCWlmICgoYWRkZWQgJiBPQkpFQ1RfQURERUQpICE9IDApCi0JCQkJc2VydmVyLnJlbW92ZU9iamVjdCh2YWx1ZU9iamVjdC5vYmplY3RJRCk7Ci0JCQlpZiAoKGFkZGVkICYgQ0xBU1NfQURERUQpICE9IDApCi0JCQkJc2VydmVyLnJlbW92ZU9iamVjdCh2YWx1ZU9iamVjdC5jbGFzc0lEKTsKLQkJfQotCX0KLX0KLQkJCi0JCi0JcHVibGljIHZvaWQgc2VuZEV4Y2VwdGlvbihUaHJvd2FibGUgZSwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUsIERhdGFPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCS8vIEV4Y2VwdGlvbiBvY3VycmVkLCByZXR1cm4gYSB2YWx1ZSBjb21tYW5kIHdpdGggdGhlIGV4Y2VwdGlvbiB3aXRoaW4gaXQuCi0JCXNldEV4Y2VwdGlvbkludG9WYWx1ZShlLCB2YWx1ZSk7Ci0JCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5USFJPV0FCTEVfU0VOVCwgdmFsdWUpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uSW50b1ZhbHVlKFRocm93YWJsZSBlLCBDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewkJCi0JCXNlcnZlci5nZXRJZGVudGl0eUlEKGUsIHZhbHVlKTsJLy8gSXQgc2hvdWxkIGFsd2F5cyBjcmVhdGUgaXQgc28gd2UgZG9uJ3QgbmVlZCB0byBrbm93LgotCQlpbnQgZUlEID0gdmFsdWUub2JqZWN0SUQ7Ci0JCUNsYXNzIGVDbGFzcyA9IGUuZ2V0Q2xhc3MoKTsJCQkJCQkJCi0JCXNlcnZlci5nZXRJZGVudGl0eUlEKGVDbGFzcywgdmFsdWUpOwotCQlpbnQgZUNsYXNzSUQgPSB2YWx1ZS5vYmplY3RJRDsKLQkJdmFsdWUuc2V0RXhjZXB0aW9uKGVJRCwgZUNsYXNzSUQpOwotCX0KLQkKLQkvKioKLQkgKiBGcm9tIHRoZSB2YWx1ZU9iamVjdCwgZ2V0IGFuIE9iamVjdCB0aGF0IGlzIGludm9rYWJsZSAoaS5lLiBjYW4gYmUgdGhlIHRhcmdldCBvZiBhbiBpbnZva2UsIG9yIG9uZSBvZiBpdHMgcGFybXMpLgotCSAqIElmIGl0IGlzIGFuIGFycmF5IHR5cGUsIHRoZSBhIFZhbHVlU2VuZGVyIGlzIHJldHVybmVkLiBUaGUgaW52b2tlciBuZWVkcyB0byB0aGVuIGNhc3QgdGhpcwotCSAqIHRvIGEgVmFsdWVTZW5kZXIgYW5kIGNhbGwgdGhlIHJlYWRBcnJheSByb3V0aW5lLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW52b2thYmxlT2JqZWN0KGZpbmFsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUudHlwZSkgewotCQkJY2FzZSBDb21tYW5kcy5ORVdfT0JKRUNUX0lEOgotCQkJY2FzZSBDb21tYW5kcy5PQkpFQ1RfSUQ6Ci0JCQkJLy8gVGhlc2UgbmVlZCB0byBoYXZlIGFjY2VzcyB0byB0aGUgc2VydmVyIHRvIGdldCB0aGUgcmVhbCBvYmplY3QKLQkJCQlyZXR1cm4gc2VydmVyLmdldE9iamVjdCh2YWx1ZS5vYmplY3RJRCk7CQkJCQkJCi0JCQlkZWZhdWx0OgotCQkJCS8vIFRoZXNlIGhhdmUgYWxsIHRoZSBpbmZvIG5lZWRlZCB3aXRoaW4gdGhlIHZhbHVlIG9iamVjdCBpdHNlbGYsIHNvIGFzayBpdC4KLQkJCQlyZXR1cm4gdmFsdWUuZ2V0QXNPYmplY3QoKTsKLQkJfQotCX0KLQkKLQkvLyBIZWxwZXIgY2xhc3MgZm9yIGdldHRpbmcgYW4gYXJyYXkuCi0JcHJpdmF0ZSBjbGFzcyBJbnZva2FibGVWYWx1ZVNlbmRlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlU2VuZGVyIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJT2JqZWN0IGFycmF5OwotCi0JCXB1YmxpYyBJbnZva2FibGVWYWx1ZVNlbmRlcigpIHsKLQkJfQotCQkJCQotCQlwdWJsaWMgSW52b2thYmxlVmFsdWVTZW5kZXIoQ29tbWFuZHMuVmFsdWVPYmplY3QgYXJyYXlIZWFkZXIpIHsKLQkJCWluaXRpYWxpemUoYXJyYXlIZWFkZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbW1hbmRzLlZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKSB7Ci0JCQlpbmRleCA9IDA7Ci0JCQlDbGFzcyBhcnJheVR5cGUgPSAoQ2xhc3MpIHNlcnZlci5nZXRPYmplY3QoYXJyYXlIZWFkZXIuY2xhc3NJRCk7Ci0JCQlhcnJheSA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGFycmF5VHlwZSwgYXJyYXlIZWFkZXIuYW5JbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCWFycmF5ID0gbnVsbDsKLQkJCWluZGV4ID0gMDsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXRBcnJheSgpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQkJCQkKLQkJLy8gQSBuZXcgdmFsdWUgaXMgYmVpbmcgc2VudCB0byB0aGUgYXJyYXkKLQkJcHVibGljIHZvaWQgc2VuZFZhbHVlKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5zZXQoYXJyYXksIGluZGV4KyssIGdldEludm9rYWJsZU9iamVjdCh2YWx1ZSkpOwkvLyBhZGQgaXQgdG8gdGhlIGFycmF5Ci0JCX0KLQkJCQkJCi0JCS8vIFRoZSBuZXh0IGVudHJ5IGlzIGFuIGFycmF5IHRvbyEKLQkJcHVibGljIENvbW1hbmRzLlZhbHVlU2VuZGVyIG5lc3RlZEFycmF5KENvbW1hbmRzLlZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKSB7Ci0JCQlJbnZva2FibGVWYWx1ZVNlbmRlciBzZW5kZXIgPSBuZXcgSW52b2thYmxlVmFsdWVTZW5kZXIoYXJyYXlIZWFkZXIpOwotCQkJLy8gVGFrZSB0aGUgbmV3bHkgY3JlYXRlZCBhcnJheSBhbmQgcHV0IGl0IGludG8gdGhlIGN1cnJlbnQgYXJyYXkuCi0JCQlqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5zZXQoYXJyYXksIGluZGV4KyssIHNlbmRlci5nZXRBcnJheSgpKTsKLQkJCXJldHVybiBzZW5kZXI7Ci0JCX0KLQl9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0Nvbm5lY3Rpb25UaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ29ubmVjdGlvblRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDcyMTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ29ubmVjdGlvblRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogQ29ubmVjdGlvblRocmVhZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotLyoqCi0gKiBUaGlzIGlzIGEgdGhyZWFkIHRvIGhhbmRsZSBvbmUgY29ubmVjdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvblRocmVhZCBleHRlbmRzIFRocmVhZCB7CQotCQkKLQlmaW5hbCBwcm90ZWN0ZWQgQ29ubmVjdGlvbkhhbmRsZXIgY29ubmVjdGlvbkhhbmRsZXI7Ci0JCi0JcHVibGljIENvbm5lY3Rpb25UaHJlYWQoU29ja2V0IHNjLCBSZW1vdGVWTVNlcnZlclRocmVhZCBzdnIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCi0JCWNvbm5lY3Rpb25IYW5kbGVyID0gbmV3IENvbm5lY3Rpb25IYW5kbGVyKHNjLCBzdnIsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXF1ZXN0IHRoZSB0aHJlYWQgdG8gY2xvc2UgZG93bi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWNvbm5lY3Rpb25IYW5kbGVyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJY29ubmVjdGlvbkhhbmRsZXIucnVuKCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3OTdkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0V4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotCi1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5FeHByZXNzaW9uQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS4qOwotCi0gCi0vKioKLSAqIFRoaXMgcHJvY2Vzc2VzIHRoZSBjb21tYW5kcyBmb3IgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGFuZCBzZW5kcyB0aGVtIG92ZXIKLSAqIHRvIHRoZSBjb21tb24gZXhwcmVzc2lvbiBwcm9jZXNzZXIuCi0gKiAKLSAqIFRoaXMgd2lsbCBiZSBpbnN0YW50aWF0ZWQgb24gdGhlIHN0YXJ0IG9mIGFuIGV4cHJlc3Npb24uIEFuZCB0aGVuCi0gKiBlYWNoIGV4cHJlc3Npb24gcmVxdWVzdCBmcm9tIHRoZSBJREUgd2lsbCBiZSBzZW50IGludG8gaGVyZS4gVGhlCi0gKiByZWFzb24gdGhpcyBndXkgZG9lc24ndCBob2xkIG9udG8gdGhlIGNvbm5lY3Rpb24gYW5kIHByb2Nlc3MgdGhlCi0gKiBlbnRpcmUgZXhwcmVzc2lvbiBpcyBiZWNhdXNlIHdlIG5lZWQgdG8gcmV0dXJuIHRvIHRoZSBjb25uZWN0aW9uCi0gKiBoYW5kbGVyIHRvIGtlZXAgdGhlIGNvbm5lY3Rpb24gbGl2ZSAodGhlcmUgaXMgdGltZW91dHMgYW5kIHN0dWZmCi0gKiBpbiB0aGVyZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gZHVwbGljYXRlIGhlcmUpLgotICogPHA+Ci0gKiBJZiB0aGVyZSBhcmUgYW55IGV4cHJlc3Npb24gcHJvY2Vzc2luZyBlcnJvcnMgKHZlcnN1cyBoYXJkIGlvIGVycm9ycykgd2UKLSAqIHdpbGwgc2F2ZSB1cCB0aGUgZXJyb3IgYnV0IGRvbid0IGRvIGFueSBtb3JlIHByb2Nlc3Npbmcgb3RoZXIgdGhhbiB0byBtYWtlCi0gKiBzdXJlIHdlIHJlYWQgdGhlIGNvbXBsZXRlIHN1YmNvbW1hbmQuIFRoaXMgaXMgc28gdGhhdCB0aGUgaW5wdXRzdHJlYW0gaXMgbGVmdAotICogaW4gYSB2YWxpZCBzdGF0ZSB3aXRob3V0IHN0YW5kZWQgZGF0YS4KLSAqIDxwPgotICogVGhlIGF0IHRoZSBzeW5jIHBvaW50IChlaXRoZXIgZ2V0IHZhbHVlIG9yIHN5bmMgc3ViY29tbWFuZCkgd2Ugd2lsbCBzZW5kIGJhY2sKLSAqIHRoZSBlcnJvci4KLSAqICAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgewotCi0JCi0JcHJvdGVjdGVkIGZpbmFsIFJlbW90ZVZNU2VydmVyVGhyZWFkIHNlcnZlcjsKLQlwcm90ZWN0ZWQgZmluYWwgQ29ubmVjdGlvbkhhbmRsZXIgY29ubkhhbmRsZXI7CQotCXByb3RlY3RlZCBmaW5hbCBFeHByZXNzaW9uUHJvY2Vzc2VyIGV4cDsKLQlwcm90ZWN0ZWQgQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsJLy8gQSB3b3JrZXIgdmFsdWUgb2JqZWN0IHNvIHdlIGRvbid0IG5lZWQgdG8ga2VlcCBjcmVhdGluZyB0aGVtIGFuZCByZWxlYXNpbmcgdGhlbS4KLQlwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCQotCS8qKgotCSAqIENyZWF0ZSB3aXRoIGEgZGVmYXVsdCBleHByZXNzaW9uIHByb2Nlc3NlciBhbmQgdXNlIGRlZmF1bHQgZmxhZyBmb3IgdHJhY2UuCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcihSZW1vdGVWTVNlcnZlclRocmVhZCBzZXJ2ZXIsIENvbm5lY3Rpb25IYW5kbGVyIGNvbm5IYW5kbGVyKSB7Ci0JCXRoaXMoc2VydmVyLCBjb25uSGFuZGxlciwgbmV3IEV4cHJlc3Npb25Qcm9jZXNzZXIoQm9vbGVhbi5nZXRCb29sZWFuKEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OVFJBQ0UpLCBMb25nLmdldExvbmcoRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05UUkFDRV9USU1FUl9USFJFU0hPTEQsIC0xTCkubG9uZ1ZhbHVlKCkpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBkZWZhdWx0IGV4cHJlc3Npb24gcHJvY2Vzc2VyLgotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gY29ubkhhbmRsZXIKLQkgKiBAcGFyYW0gdHJhY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIoUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgc2VydmVyLCBDb25uZWN0aW9uSGFuZGxlciBjb25uSGFuZGxlciwgYm9vbGVhbiB0cmFjZSkgewotCQl0aGlzKHNlcnZlciwgY29ubkhhbmRsZXIsIG5ldyBFeHByZXNzaW9uUHJvY2Vzc2VyKHRyYWNlLCBMb25nLmdldExvbmcoRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05UUkFDRV9USU1FUl9USFJFU0hPTEQsIC0xTCkubG9uZ1ZhbHVlKCkpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGZyb20gYSBzdWJjbGFzcyB3aXRoIGEgZ2l2ZW4gZXhwcmVzc2lvbiBwcm9jZXNzZXIuCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSBleHAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIoUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgc2VydmVyLCBDb25uZWN0aW9uSGFuZGxlciBjb25uSGFuZGxlciwgRXhwcmVzc2lvblByb2Nlc3NlciBleHApIHsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMuY29ubkhhbmRsZXIgPSBjb25uSGFuZGxlcjsKLQkJdGhpcy5leHAgPSBleHA7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgY2xhc3MgbG9hZGVyIHRvIHVzZSBmb3IgZmluZGluZyBjbGFzc2VzLiBJZiBuZXZlciBzZXQsIG9yIGlmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuCi0JICogPGNvZGU+Q2xhc3MuZm9yTmFtZTwvY29kZT4gd2lsbCBiZSB1c2VkLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc0xvYWRlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLQl9Ci0JCi0JLyoKLQkgKiBBcnJheSBvZiBwcmltaXRpdmUgdHlwZSBuYW1lcy4gVXNlZCB0byBsb29rIHVwIHByaW10aXZlIHR5cGVzIGluIHByaW1pdGl2ZSB0eXBlcyBhcnJheS4gCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUklNSVRJVkVfTkFNRVMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImJ5dGUiLCAiY2hhciIsICJzaG9ydCIsICJpbnQiLCAibG9uZyIsICJmbG9hdCIsICJkb3VibGUifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIFBSSU1JVElWRV9UWVBFUyA9IG5ldyBDbGFzc1tdIHtCeXRlLlRZUEUsIENoYXJhY3Rlci5UWVBFLCBTaG9ydC5UWVBFLCBJbnRlZ2VyLlRZUEUsIExvbmcuVFlQRSwgRmxvYXQuVFlQRSwgRG91YmxlLlRZUEV9OwotCS8qKgotCSAqIExvYWQgdGhlIGNsYXNzIGdpdmVuIHRoZSBuYW1lLiBJZiBub3QgZm91bmQsIHJldHVybiBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChjbGFzc05hbWUuZW5kc1dpdGgoIltdIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gV2UgaGF2ZSBhbiBhcnJheSByZXF1ZXN0IGluc3RlYWQuIFRoaXMgaXMgdHJpY2tpZXIuCi0JCQlyZXR1cm4gbG9hZENsYXNzKE1hcFR5cGVzLmdldEpOSUZvcm1hdE5hbWUoY2xhc3NOYW1lKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgcHJpbUluZGV4ID0gUFJJTUlUSVZFX05BTUVTLmluZGV4T2YoY2xhc3NOYW1lKTsKLQkJCWlmIChwcmltSW5kZXggPj0gMCkKLQkJCQlyZXR1cm4gUFJJTUlUSVZFX1RZUEVTW3ByaW1JbmRleF07Ci0JCQllbHNlIGlmIChjbGFzc0xvYWRlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm93IHByb2Nlc3MgdGhlIGlucHV0IHN0cmVhbS4gSWYgZWl0aGVyIHRocm93cyBvY2N1cnMsIHRoaXMgaXMgYSBoYXJkIGVycm9yIGFuZCB3ZSBtdXN0IHRlcm1pbmF0ZQotCSAqIHRoZSBlbnRpcmUgY29ubmVjdGlvbi4gVGhlIGlucHV0IHN0cmVhbSBpcyBpbiBhbiB1bmtub3duIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBpbiBUaGUgaW5wdXQgc3RyZWFtIHRvIGdldCB0aGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgc3ViLWNvbW1hbmQuCi0JICogCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3MoRGF0YUlucHV0U3RyZWFtIGluKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyBJbiB0aGUgZm9sbG93aW5nIHN1YmNvbW1hbmQgcHJvY2Vzc2luZywgd2UgYWx3YXlzIHJlYWQgdGhlIGVudGlyZSBzdWJjb21tYW5kIGZyb20gdGhlIHN0cmVhbS4KLQkJLy8gVGhpcyBpcyBzbyB0aGF0IGFueSBlcnJvcnMgZHVyaW5nIHByb2Nlc3Npbmcgd2lsbCBub3QgbWVzcyB1cCB0aGUgc3RyZWFtIHdpdGggdW5yZWFkIGRhdGEuCi0JCS8vCi0JCS8vIFRoZW4gd2UgY2hlY2sgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkIGluIHRoZSBwYXN0LiBJZiBpdCBoYXMsIHdlIHNpbXBseSBicmVhay4gVGhpcyBpcyBiZWNhdXNlCi0JCS8vIG9uY2UgYW4gZXJyb3Igb2NjdXJyZWQgd2UgZG9uJ3Qgd2FudCB0byBjb250aW51ZSB3YXN0aW5nIHRpbWUgZXZhbHVhdGluZywgaG93ZXZlciB3ZSBuZWVkIHRvIG1ha2UKLQkJLy8gc3VyZSB0aGF0IHRoZSBzdHJlYW0gaXMgcmVhZCBjb21wbGV0ZWx5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGNvcnJ1cHRlZCBpbnB1dCBzdHJlYW0uIFRoYXQgd2F5Ci0JCS8vIHdoZW4gYWxsIGlzIGRvbmUgd2UgY2FuIHJldHVybiB0aGUgZXJyb3IgYW5kIHN0aWxsIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uIHNvY2tldC4KLQkJYnl0ZSBzdWJjb21tYW5kID0gaW4ucmVhZEJ5dGUoKTsKLQkJdHJ5IHsKLQkJCXN3aXRjaCAoc3ViY29tbWFuZCkgewotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9UT19QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXR0aW5nIGEgcHJveHkgcHVzaC4gVGhlIHZhbHVlIGlzIHNlbnQgYXMgdmFsdWVPYmplY3QsIHNvIHVzZSB0aGF0IHRvIHJlYWQgaXQgaW4uCi0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgd29ya2VyVmFsdWUpOwotCQkJCQlPYmplY3QgdmFsdWUgPSBjb25uSGFuZGxlci5nZXRJbnZva2FibGVPYmplY3Qod29ya2VyVmFsdWUpOwotCQkJCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQkJCWV4cC5wdXNoRXhwcmVzc2lvbihudWxsLCBNZXRob2RIZWxwZXIuTlVMTF9UWVBFKTsKLQkJCQkJZWxzZSBpZiAod29ya2VyVmFsdWUuaXNQcmltaXRpdmUoKSkKLQkJCQkJCWV4cC5wdXNoRXhwcmVzc2lvbih2YWx1ZSwgd29ya2VyVmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpKTsKLQkJCQkJZWxzZQotCQkJCQkJZXhwLnB1c2hFeHByZXNzaW9uKHZhbHVlLCB2YWx1ZS5nZXRDbGFzcygpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkNBU1RfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgY2FzdCByZXF1ZXN0LiBUaGUgdHlwZSBpcyBzZW50IGFzIHZhbHVlT2JqZWN0LgotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoQ2FzdChjbGFzc1ZhbHVlKTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLklOU1RBTkNFT0ZfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgaW5zdGFuY2VvZiByZXF1ZXN0LiBUaGUgdHlwZSBpcyBzZW50IGFzIHZhbHVlT2JqZWN0LgotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoSW5zdGFuY2VvZihjbGFzc1ZhbHVlKTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLklORklYX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhbiBpbmZpeCByZXF1ZXN0LiBUaGUgb3BlcmF0b3IgYW5kIG9wZXJhbmQgdHlwZSBhcmUgc2VudCBhcyBieXRlcy4KLQkJCQkJYnl0ZSBpbmZpeF9vcGVyYXRvciA9IGluLnJlYWRCeXRlKCk7Ci0JCQkJCWJ5dGUgaW5maXhfb3BlcmFuZFR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotCQkJCQlleHAucHVzaEluZml4KEluZml4T3BlcmF0b3IuZ2V0KGluZml4X29wZXJhdG9yKSwgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLmdldChpbmZpeF9vcGVyYW5kVHlwZSkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFJFRklYX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIHByZWZpeCByZXF1ZXN0LiBUaGUgb3BlcmF0b3IgaXMgc2VudCBhcyBieXRlLgotCQkJCQlieXRlIHByZWZpeF9vcGVyYW5kVHlwZSA9IGluLnJlYWRCeXRlKCk7Ci0JCQkJCWV4cC5wdXNoUHJlZml4KFByZWZpeE9wZXJhdG9yLmdldChwcmVmaXhfb3BlcmFuZFR5cGUpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYW4gYXJyYXkgYWNjZXNzIHJlcXVlc3QuIFRoZSBpbmRleCBjb3VuZCBpcyBzZW50IGFzIGludC4KLQkJCQkJaW50IGFycmF5QWNjZXNzX0luZGV4Y291bnQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCWV4cC5wdXNoQXJyYXlBY2Nlc3MoYXJyYXlBY2Nlc3NfSW5kZXhjb3VudCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYW4gYXJyYXkgY3JlYXRpb24gcmVxdWVzdC4gVGhlIHR5cGUgaXMgc2VudCBhcyB2YWx1ZU9iamVjdCwgZm9sbG93ZWQgYnkgaW50IGRpbWVuc2lvbiBjb3VudC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCWludCBhcnJheUNyZWF0aW9uX2RpbUNvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgY2xhc3NWYWx1ZSA9IGdldEJlYW5UeXBlVmFsdWUod29ya2VyVmFsdWUpOwotCQkJCQkJZXhwLnB1c2hBcnJheUNyZWF0aW9uKGNsYXNzVmFsdWUsIGFycmF5Q3JlYXRpb25fZGltQ291bnQpOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlLmdldENhdXNlKCkpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfSU5JVElBTElaRVJfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGFuIGFycmF5IGluaXRpYWxpemVyIHJlcXVlc3QuIFRoZSB0eXBlIGlzIHNlbnQgYXMgdmFsdWVPYmplY3QsIGZvbGxvd2VkIGJ5IGludCBleHByZXNzaW9uIGNvdW50LgotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJaW50IHN0cmlwQ291bnQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCWludCBhcnJheUluaXRpYWxpemVyX2V4cHJlc3Npb25Db3VudCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoQXJyYXlJbml0aWFsaXplcihjbGFzc1ZhbHVlLCBzdHJpcENvdW50LCBhcnJheUluaXRpYWxpemVyX2V4cHJlc3Npb25Db3VudCk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiByZXF1ZXN0LiBUaGUgdHlwZSBpcyBzZW50IGFzIHZhbHVlT2JqZWN0LCBmb2xsb3dlZCBieSBpbnQgYXJndW1lbnQgY291bnQuCi0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgd29ya2VyVmFsdWUpOwotCQkJCQlpbnQgbmV3SW5zdGFuY2VfYXJnQ291bnQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gZ2V0QmVhblR5cGVWYWx1ZSh3b3JrZXJWYWx1ZSk7Ci0JCQkJCQlleHAucHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvbihjbGFzc1ZhbHVlLCBuZXdJbnN0YW5jZV9hcmdDb3VudCk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UWVBFUkVDRUlWRVJfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgdHlwZSByZWNlaXZlciByZXF1ZXN0LiBUaGUgdHlwZSBpcyBzZW50IGFzIHZhbHVlT2JqZWN0LgotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoRXhwcmVzc2lvbihjbGFzc1ZhbHVlLCBjbGFzc1ZhbHVlKTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkZJRUxEX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBmaWVsZCBhY2Nlc3MgcmVxdWVzdC4gQ29tbWFuZC5WYWx1ZU9iamVjdCwgZm9sbG93ZWQgYnkgaGFzUmVjZWl2ZXIgYXMgYm9vbGVhbi4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCWJvb2xlYW4gaGFzX2ZpZWxkQWNjZXNzX3JlY2VpdmVyID0gaW4ucmVhZEJvb2xlYW4oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdCBmaWVsZEFjY2VzcyA9IGdldEZpZWxkVmFsdWUod29ya2VyVmFsdWUpOwotCQkJCQkJZXhwLnB1c2hGaWVsZEFjY2VzcyhmaWVsZEFjY2Vzcywgd29ya2VyVmFsdWUuZ2V0VHlwZSgpID09IENvbW1hbmRzLlNUUklORywgaGFzX2ZpZWxkQWNjZXNzX3JlY2VpdmVyKTsKLQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4JCQkJCQkKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLk1FVEhPRF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBtZXRob2QgaW52b2NhdGlvbiByZXF1ZXN0LiBTZW50IGFzIENvbW1hbmRzLlZhbHVlT2JqZWN0LCBmb2xsb3dlZCBieSBoYXNSZWNlaXZlciBhcyBib29sZWFuLiwgYW5kIGFyZ0NvdW50IGFzIGludC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCWJvb2xlYW4gaGFzX21ldGhvZF9yZWNlaXZlciA9IGluLnJlYWRCb29sZWFuKCk7Ci0JCQkJCWludCBtZXRob2RfYXJnQ291bnQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3QgbWV0aG9kID0gZ2V0TWV0aG9kVmFsdWUod29ya2VyVmFsdWUpOwkJCQkJCi0JCQkJCQlleHAucHVzaE1ldGhvZEludm9jYXRpb24obWV0aG9kLCB3b3JrZXJWYWx1ZS5nZXRUeXBlKCkgPT0gQ29tbWFuZHMuU1RSSU5HLCBoYXNfbWV0aG9kX3JlY2VpdmVyLCBtZXRob2RfYXJnQ291bnQpOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlLmdldENhdXNlKCkpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiByZXF1ZXN0LiBUaGUgZXhwcmVzc2lvbiB0eXBlIChpZS4gY29uZGl0aW9uL3RydWUvZmFsc2UpIGlzIHNlbnQgYXMgYSBieXRlCi0JCQkJCWV4cC5wdXNoQ29uZGl0aW9uYWwoSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLmdldChpbi5yZWFkQnl0ZSgpKSk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFTU0lHTk1FTlRfUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiByZXF1ZXN0LiBUaGUgcHJveHkgaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWludCBwcm94eWlkID0gaW4ucmVhZEludCgpOwotCQkJCQlleHAucHVzaEFzc2lnbm1lbnQobmV3IFJlbW90ZUV4cHJlc3Npb25Qcm94eShwcm94eWlkKSk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFTU0lHTk1FTlRfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiByZXF1ZXN0LiBOb3RoaW5nIGVsc2UgdG8gcmVhZCBmcm9tIHN0cmVhbS4KLQkJCQkJZXhwLnB1c2hBc3NpZ25tZW50KCk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlBVU0hfVE9fRVhQUkVTU0lPTl9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBwdXNoIGV4cHJlc3Npb24gcHJveHkgZXhwcmVzc2lvbi4gVGhlIHByb3h5IGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQkvLyBGaXJzdCB0ZXN0IGlmIGEgcG9zc2libGUgRmFpbGVkRXhwcmVzc2lvblByb3h5IGJlY2F1c2Ugd2UgY291bGQgb2YgYmVlbiBwdXNoaW5nCi0JCQkJCS8vIGEgZmFpbGVkIHJlZmxlY3Rpb24gcHJveHkuCi0JCQkJCXByb3h5aWQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlleHAuZ2V0RXhwcmVzc2lvblByb3h5KHByb3h5aWQsIG5ldyBPYmplY3RbXSB7bnVsbCwgbnVsbH0pOwotCQkJCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlMSkgewkJCQkJCQotCQkJCQkJaWYgKGUxLmdldFByb3h5KCkgIT0gbnVsbCkgewotCQkJCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSBmYWlsdXJlID0gKEZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSkgZTEuZ2V0UHJveHkoKTsKLQkJCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbigoVGhyb3dhYmxlKSBmYWlsdXJlLmdldFZhbHVlKCkpOwotCQkJCQkJCWJyZWFrOwkvLyBEb24ndCBnbyBvbiwgd2UgcHJvY2Vzc2VkIGl0LiBBIHN0YW5kYXJkIG5vIGV4cHJlc3Npb24gdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCBvbiBhbmQgbGV0IGZvbGxvd2luZyBjb2RlIGhhbmRsZSBpdC4KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlleHAucHVzaEV4cHJlc3Npb25Qcm94eShwcm94eWlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5CTE9DS19CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBiZWdpbiBibG9jayBwcm94eSBleHByZXNzaW9uLiBUaGUgYmxvY2sgaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWV4cC5wdXNoQmxvY2tCZWdpbihpbi5yZWFkSW50KCkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5CTE9DS19CUkVBS19FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBicmVhayBibG9jayBwcm94eSBleHByZXNzaW9uLiBUaGUgYmxvY2sgaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWV4cC5wdXNoQmxvY2tCcmVhayhpbi5yZWFkSW50KCkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5CTE9DS19FTkRfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgZW5kIGJsb2NrIHByb3h5IGV4cHJlc3Npb24uIFRoZSBibG9jayBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJZXhwLnB1c2hCbG9ja0VuZChpbi5yZWFkSW50KCkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfQkVHSU5fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgdHJ5IGJlZ2luIHByb3h5IGV4cHJlc3Npb24uIFRoZSB0cnkgaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWV4cC5wdXNoVHJ5QmVnaW4oaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0NBVENIX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCWludCB0cnlOdW1iZXIgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgd29ya2VyVmFsdWUpOwotCQkJCQlwcm94eWlkID0gaW4ucmVhZEludCgpOwotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgY2xhc3NWYWx1ZSA9IGdldEJlYW5UeXBlVmFsdWUod29ya2VyVmFsdWUpOwotCQkJCQkJZXhwLnB1c2hUcnlDYXRjaENsYXVzZSh0cnlOdW1iZXIsIGNsYXNzVmFsdWUsIHByb3h5aWQgIT0gLTEgPyBuZXcgUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpIDogbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfRklOQUxMWV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSB0cnkgZmluYWxseSBwcm94eSBleHByZXNzaW9uLiBUaGUgdHJ5IGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlleHAucHVzaFRyeUZpbmFsbHlDbGF1c2UoaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlRSWV9FTkRfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgdHJ5IGVuZCBwcm94eSBleHByZXNzaW9uLiBUaGUgdHJ5IGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlleHAucHVzaFRyeUVuZChpbi5yZWFkSW50KCkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5USFJPV19FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQlleHAucHVzaFRocm93RXhjZXB0aW9uKCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5SRVRIUk9XX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIHJldGhyb3cgcHJveHkgZXhwcmVzc2lvbi4gVGhlIHRyeSBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJZXhwLnB1c2hUcnlSZXRocm93KGluLnJlYWRJbnQoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX0JFQU5UWVBFX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgdGhlIGJlYW50eXBlIGV4cHJlc3Npb24gcHJveHkgYW5kIHJlc29sdmUgaXQuCi0JCQkJCXByb3h5aWQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCVN0cmluZyB0eXBlTmFtZSA9IENvbW1hbmRzLnJlYWRTdHJpbmdEYXRhKGluKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBsb2FkQ2xhc3ModHlwZU5hbWUpOwotCQkJCQkJUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkoY2xhc3NWYWx1ZSwgQ2xhc3MuY2xhc3MpOwotCQkJCQkJZXhwLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KHJlcCk7Ci0JCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkoZSwgZS5nZXRDbGFzcygpKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgewotCQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkoZSwgZS5nZXRDbGFzcygpKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlBVU0hfTUVUSE9EX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgdGhlIE1ldGhvZCBleHByZXNzaW9uIHByb3h5IGFuZCByZXNvbHZlIGl0LgotCQkJCQkvLyBDb21lcyBvdmVyIGFzOgotCQkJCQkvLyAgIGludCBmb3IgcHJveHkgaWQgZm9yIHRoZSBtZXRob2QKLQkJCQkJLy8gICBiZWFuVHlwZVZhbHVlIGZvciBkZWNsYXJpbmcgY2xhc3MgKGVpdGhlciBiZWFudHlwZSBvciBleHByZXNzaW9uIHByb3h5KQotCQkJCQkvLyAgIHN0cmluZyBmb3IgbWV0aG9kIG5hbWUKLQkJCQkJLy8gICBpbnQgZm9yIGFyZyBjb3VudAotCQkJCQkvLyAgIGJlYW5UeXBlVmFsdWUocykgZm9yIGFyZyB0eXBlcyAoYXMgbWFueSBhcyBhcmcgY291bnQpLgotCQkJCQlwcm94eWlkID0gaW4ucmVhZEludCgpOwotCQkJCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBkZWNDbGFzc1ZhbHVlID0gIENvbW1hbmRzLnJlYWRWYWx1ZShpbiwgbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCkpOwotCQkJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IENvbW1hbmRzLnJlYWRTdHJpbmdEYXRhKGluKTsKLQkJCQkJaW50IGFyZ0NvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQlDb21tYW5kcy5WYWx1ZU9iamVjdFtdIGFyZ3MgPSBudWxsOwotCQkJCQlpZiAoYXJnQ291bnQgPiAwKSB7Ci0JCQkJCQlhcmdzID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0W2FyZ0NvdW50XTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgewotCQkJCQkJCWFyZ3NbaV0gPSBDb21tYW5kcy5yZWFkVmFsdWUoaW4sIG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlDbGFzcyBkZWNDbGFzcyA9IG51bGw7Ci0JCQkJCUNsYXNzW10gYXJnQ2xhc3NlcyA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlkZWNDbGFzcyA9IGdldEJlYW5UeXBlVmFsdWUoZGVjQ2xhc3NWYWx1ZSk7Ci0JCQkJCQlhcmdDbGFzc2VzID0gbnVsbDsKLQkJCQkJCWlmIChhcmdDb3VudD4wKSB7Ci0JCQkJCQkJYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1thcmdDb3VudF07Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7Ci0JCQkJCQkJCWFyZ0NsYXNzZXNbaV0gPSBnZXRCZWFuVHlwZVZhbHVlKGFyZ3NbaV0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIE5vdyBnZXQgdGhlIG1ldGhvZCBpdHNlbGYuCi0JCQkJCQlNZXRob2QgbSA9IGRlY0NsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsKLQkJCQkJCVJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KG0sIE1ldGhvZC5jbGFzcyk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkoZS5nZXRDYXVzZSgpLCBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRoZSBkZWZhdWx0IHRyYWNlIGRvZXNuJ3Qgc2hvdyB3aGF0IG1ldGhvZCB3YXMgYmVpbmcgc2VhcmNoZWQgZm9yLCBzbyByZWNyZWF0ZSB3aXRoIHRoYXQuCi0JCQkJCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCXMuYXBwZW5kKGRlY0NsYXNzLmdldE5hbWUoKSk7Ci0JCQkJCQlzLmFwcGVuZCgnLicpOwotCQkJCQkJcy5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCQkJCQlzLmFwcGVuZCgnKCcpOwotCQkJCQkJaWYgKGFyZ0NsYXNzZXMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlpZiAoaSA+IDApCi0JCQkJCQkJCQlzLmFwcGVuZCgnLCcpOwotCQkJCQkJCQlzLmFwcGVuZChhcmdDbGFzc2VzW2ldLmdldE5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcy5hcHBlbmQoJyknKTsKLQkJCQkJCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuZSA9IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24ocy50b1N0cmluZygpKTsKLQkJCQkJCW5lLnNldFN0YWNrVHJhY2UoZS5nZXRTdGFja1RyYWNlKCkpOwotCQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkobmUsIG5lLmdldENsYXNzKCkpOwotCQkJCQkJZXhwLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KHJlcCk7Ci0JCQkJCX0JCQkJCQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX0ZJRUxEX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgdGhlIEZpbGVkIGV4cHJlc3Npb24gcHJveHkgYW5kIHJlc29sdmUgaXQuCi0JCQkJCS8vIENvbWVzIG92ZXIgYXM6Ci0JCQkJCS8vICAgaW50IGZvciBwcm94eSBpZCBmb3IgdGhlIGZpZWxkCi0JCQkJCS8vICAgYmVhblR5cGVWYWx1ZSBmb3IgZGVjbGFyaW5nIGNsYXNzIChlaXRoZXIgYmVhbnR5cGUgb3IgZXhwcmVzc2lvbiBwcm94eSkKLQkJCQkJLy8gICBzdHJpbmcgZm9yIGZpZWxkIG5hbWUKLQkJCQkJcHJveHlpZCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJZGVjQ2xhc3NWYWx1ZSA9ICBDb21tYW5kcy5yZWFkVmFsdWUoaW4sIG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpKTsKLQkJCQkJU3RyaW5nIGZpZWxkTmFtZSA9IENvbW1hbmRzLnJlYWRTdHJpbmdEYXRhKGluKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWRlY0NsYXNzID0gZ2V0QmVhblR5cGVWYWx1ZShkZWNDbGFzc1ZhbHVlKTsKLQkJCQkJCS8vIE5vdyBnZXQgdGhlIGZpZWxkIGl0c2VsZi4KLQkJCQkJCUZpZWxkIGYgPSBkZWNDbGFzcy5nZXRGaWVsZChmaWVsZE5hbWUpOwotCQkJCQkJUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkoZiwgTWV0aG9kLmNsYXNzKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkgcmVwID0gbmV3IEZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eShwcm94eWlkKTsKLQkJCQkJCXJlcC5zZXRQcm94eShlLmdldENhdXNlKCksIGUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkgcmVwID0gbmV3IEZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eShwcm94eWlkKTsKLQkJCQkJCXJlcC5zZXRQcm94eShlLCBlLmdldENsYXNzKCkpOwotCQkJCQkJZXhwLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KHJlcCk7Ci0JCQkJCX0JCQkJCQotCQkJCQlicmVhazsJCQkJCQotCQkJCQkKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLklGX1RFU1RfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgaWYgdGVzdCBleHByZXNzaW9uIHJlcXVlc3QuIAotCQkJCQlleHAucHVzaElmRWxzZSgpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JRl9FTFNFX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGlmL2Vsc2UgZXhwcmVzc2lvbiBjbGF1c2UgcmVxdWVzdC4gVGhlIGNsYXVzZSB0eXBlIChpZS4gdHJ1ZS9mYWxzZSkgaXMgc2VudCBhcyBhIGJ5dGUKLQkJCQkJZXhwLnB1c2hJZkVsc2UoSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5nZXQoaW4ucmVhZEJ5dGUoKSkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5ORVdfSU5TVEFOQ0VfVkFMVUU6Ci0JCQkJCS8vIEdldCBhIG5ldyBpbnN0YW5jZSBmcm9tIHN0cmluZy4KLQkJCQkJU3RyaW5nIGluaXRTdHJpbmcgPSBDb21tYW5kcy5yZWFkU3RyaW5nRGF0YShpbik7Ci0JCQkJCXdvcmtlclZhbHVlID0gIENvbW1hbmRzLnJlYWRWYWx1ZShpbiwgbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCkpOwotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgY2xhc3NWYWx1ZSA9IGdldEJlYW5UeXBlVmFsdWUod29ya2VyVmFsdWUpOwotCQkJCQkJZXhwLnB1c2hOZXdJbnN0YW5jZUZyb21TdHJpbmcoaW5pdFN0cmluZywgY2xhc3NWYWx1ZSwgY2xhc3NMb2FkZXIpOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlLmdldENhdXNlKCkpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5NQVJLX1ZBTFVFOgotCQkJCQkvLyBEbyBhIG1hcmsuCi0JCQkJCWludCBtYXJrSUQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCWV4cC5wdXNoTWFyayhtYXJrSUQpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5FTkRNQVJLX1ZBTFVFOgotCQkJCQkvLyBEbyBhbiBlbmQgbWFyay4KLQkJCQkJbWFya0lEID0gaW4ucmVhZEludCgpOwotCQkJCQlib29sZWFuIHJlc3RvcmUgPSBpbi5yZWFkQm9vbGVhbigpOwotCQkJCQlleHAucHVzaEVuZG1hcmsobWFya0lELCByZXN0b3JlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuU1VCRVhQUkVTU0lPTl9CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBiZWdpbiBzdWJleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uIFRoZSBzdWJleHByZXNzaW9uIGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlleHAucHVzaFN1YmV4cHJlc3Npb25CZWdpbihpbi5yZWFkSW50KCkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5TVUJFWFBSRVNTSU9OX0VORF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBlbmQgc3ViZXhwcmVzc2lvbiBwcm94eSBleHByZXNzaW9uLiBUaGUgc3ViZXhwcmVzc2lvbiBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJZXhwLnB1c2hTdWJleHByZXNzaW9uRW5kKGluLnJlYWRJbnQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JCQotCQl3b3JrZXJWYWx1ZS5zZXQoKTsJLy8gQ2xlYXIgaXQgb3V0IHNvIG5vdGhpbmcgYmVpbmcgaGVsZCBvbnRvLgotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIGFuIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biBmcm9tIHRoZSBnZXRCZWFuVHlwZSwgZmllbGQsIG1ldGhvZCAocmVmbGVjdCB0eXBlIHN0dWZmKQotCSAqIHRoYXQgd3JhcHBlcnMgdGhlIHJlYWwgdGhyb3dhYmxlIHRoYXQgb2NjdXJyZWQgZHVyaW5nIHRoZSBwcmV2aW91cyByZWZsZWN0aW9uLiBUaGlzIGlzCi0JICogYmVjYXVzZSByZWZsZWN0aW9uIGlzIGRvbmUgb3V0IG9mIHNlcXVlbmNlIHdpdGggdGhlIHVzZSBvZiB0aGUgcmVmbGVjdCB2YWx1ZS4gU28gd2UgbmVlZAotCSAqIHRvIHN0b3JlIHRoZSByZWZsZWN0aW9uIGV4Y2VwdGlvbiBpbiB0aGlzIGV4Y2VwdGlvbiBhbmQgdGhlbiBzdG9yZSB0aGlzIGV4Y2VwdGlvbiBpbgotCSAqIGEge0BsaW5rIEZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eX0uIFRoaXMgd2lsbCB0aGVuIGJlIHBpY2tlZCB1cCB3aGVuIHRyeWluZyB0byBiZQotCSAqIHVzZWQgYW5kIGl0IHdpbGwgZ2V0IHRoZSB0cnVlIGV4Y2VwdGlvbiBvdXQgb2YgdGhlIHtAbGluayBUaHJvd2FibGUjZ2V0Q2F1c2UoKX0uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFpbGVkUHJveHlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjg3MjMyNTY3MjE2NjM0ODkyM0w7Ci0KLQkJcHVibGljIEZhaWxlZFByb3h5RXhjZXB0aW9uKFRocm93YWJsZSByZWFsVGhyb3dhYmxlKSB7Ci0JCQlzdXBlcihyZWFsVGhyb3dhYmxlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGJlYW50eXBlIChjbGFzcykgb3V0IG9mIHRoZSB2YWx1ZSBvYmplY3Qgc2VudCBpbi4gSXQgY2FuIGhhbmRsZSB0aGUgYmVhbnR5cGUgc2VudCBvcgotCSAqIGFzIGFuIGV4cHJlc3Npb24gcHJveHkgdG8gYSBiZWFudHlwZSBleHByZXNzaW9uIHByb3h5LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEZhaWxlZFByb3h5RXhjZXB0aW9uIFdyYXBwZXJzIHRoZSByZWFsIHRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGUgYmVhbiB0eXBlIHRvIG5vdCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0QmVhblR5cGVWYWx1ZShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgdGhyb3dzIEZhaWxlZFByb3h5RXhjZXB0aW9uIHsKLQkJT2JqZWN0IGJlYW50eXBlID0gY29ubkhhbmRsZXIuZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlKTsKLQkJLy8gSXQgaXMgZWl0aGVyIGEgdHlwZSBkaXJlY3RseSBvciBpcyBhbiBleHByZXNzaW9uIHByb3h5LgotCQlpZiAodmFsdWUudHlwZSA9PSBDb21tYW5kcy5JTlQpIHsKLQkJCS8vIEl0IGlzIGFuIGV4cHJlc3Npb24gcHJveHkgcmVxdWVzdC4KLQkJCU9iamVjdFtdIGV4cHZhbHVlID0gbmV3IE9iamVjdFsyXTsKLQkJCXRyeSB7Ci0JCQkJZXhwLmdldEV4cHJlc3Npb25Qcm94eSgoKEludGVnZXIpIGJlYW50eXBlKS5pbnRWYWx1ZSgpLCBleHB2YWx1ZSk7Ci0JCQkJYmVhbnR5cGUgPSBleHB2YWx1ZVswXTsgCi0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU2VlIGlmIHRoZXJlIGlzIGEgZmFpbGVkIHByb3h5LgotCQkJCWlmIChlLmdldFByb3h5KCkgIT0gbnVsbCkgewotCQkJCQlGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkgZmFpbHVyZSA9IChGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkpIGUuZ2V0UHJveHkoKTsKLQkJCQkJdGhyb3cgbmV3IEZhaWxlZFByb3h5RXhjZXB0aW9uKChUaHJvd2FibGUpIGZhaWx1cmUuZ2V0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXRocm93IG5ldyBGYWlsZWRQcm94eUV4Y2VwdGlvbihuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpKTsJLy8gVGhpcyBzaG91bGRuJ3Qgb2Ygb2NjdXJyZWQuCi0JCQl9IAotCQl9Ci0JCXJldHVybiAoQ2xhc3MpIGJlYW50eXBlOwotCX0KLQkJCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb3V0IG9mIHRoZSB2YWx1ZSBvYmplY3Qgc2VudCBpbi4gSXQgY2FuIGhhbmRsZSB0aGUgbWV0aG9kIHNlbnQgb3IKLQkgKiBhcyBhbiBleHByZXNzaW9uIHByb3h5IHRvIGEgbWV0aG9kIGV4cHJlc3Npb24gcHJveHkuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBtZXRob2QgaWYgYSBtZXRob2Qgb3Igc3RyaW5nIGlmIGEgc3RyaW5nIG9yIGdldCB0aGUgbWV0aG9kIGlmIGFuIGV4cHJlc3Npb24gcHJveHkuCi0JICogQHRocm93cyBGYWlsZWRQcm94eUV4Y2VwdGlvbiBXcmFwcGVycyB0aGUgcmVhbCBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIG1ldGhvZCB0byBub3QgYmUgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRNZXRob2RWYWx1ZShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgdGhyb3dzIEZhaWxlZFByb3h5RXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1ldGhvZCA9IGNvbm5IYW5kbGVyLmdldEludm9rYWJsZU9iamVjdCh2YWx1ZSk7Ci0JCS8vIEl0IGlzIGVpdGhlciBhIG1ldGhvZCBkaXJlY3RseSBvciBpcyBhbiBleHByZXNzaW9uIHByb3h5LgotCQlpZiAodmFsdWUudHlwZSA9PSBDb21tYW5kcy5JTlQpIHsKLQkJCS8vIEl0IGlzIGFuIGV4cHJlc3Npb24gcHJveHkgcmVxdWVzdC4KLQkJCU9iamVjdFtdIGV4cHZhbHVlID0gbmV3IE9iamVjdFsyXTsKLQkJCXRyeSB7Ci0JCQkJZXhwLmdldEV4cHJlc3Npb25Qcm94eSgoKEludGVnZXIpIG1ldGhvZCkuaW50VmFsdWUoKSwgZXhwdmFsdWUpOwotCQkJCW1ldGhvZCA9IGV4cHZhbHVlWzBdOyAKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTZWUgaWYgdGhlcmUgaXMgYSBmYWlsZWQgcHJveHkuCi0JCQkJaWYgKGUuZ2V0UHJveHkoKSAhPSBudWxsKSB7Ci0JCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSBmYWlsdXJlID0gKEZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSkgZS5nZXRQcm94eSgpOwotCQkJCQl0aHJvdyBuZXcgRmFpbGVkUHJveHlFeGNlcHRpb24oKFRocm93YWJsZSkgZmFpbHVyZS5nZXRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UKLQkJCQkJdGhyb3cgbmV3IEZhaWxlZFByb3h5RXhjZXB0aW9uKG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oKSk7CS8vIFRoaXMgc2hvdWxkbid0IG9mIG9jY3VycmVkLgotCQkJfQotCQl9Ci0JCXJldHVybiBtZXRob2Q7Ci0JfQkKLQotCS8qKgotCSAqIEdldCB0aGUgZmllbGQgb3V0IG9mIHRoZSB2YWx1ZSBvYmplY3Qgc2VudCBpbi4gSXQgY2FuIGhhbmRsZSB0aGUgZmllbGQgc2VudCBvcgotCSAqIGFzIGFuIGV4cHJlc3Npb24gcHJveHkgdG8gYSBmaWVsZCBleHByZXNzaW9uIHByb3h5LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmllbGQgaWYgYSBmaWVsZCBvciBzdHJpbmcgaWYgYSBzdHJpbmcgb3IgZ2V0IHRoZSBmaWVsZCBpZiBhbiBleHByZXNzaW9uIHByb3h5LgotCSAqIEB0aHJvd3MgRmFpbGVkUHJveHlFeGNlcHRpb24gV3JhcHBlcnMgdGhlIHJlYWwgdGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoZSBmaWVsZCB0byBub3QgYmUgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRGaWVsZFZhbHVlKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB0aHJvd3MgRmFpbGVkUHJveHlFeGNlcHRpb24gewotCQlPYmplY3QgZmllbGQgPSBjb25uSGFuZGxlci5nZXRJbnZva2FibGVPYmplY3QodmFsdWUpOwotCQkvLyBJdCBpcyBlaXRoZXIgYSBmaWVsZCBkaXJlY3RseSBvciBpcyBhbiBleHByZXNzaW9uIHByb3h5LgotCQlpZiAodmFsdWUudHlwZSA9PSBDb21tYW5kcy5JTlQpIHsKLQkJCS8vIEl0IGlzIGFuIGV4cHJlc3Npb24gcHJveHkgcmVxdWVzdC4KLQkJCU9iamVjdFtdIGV4cHZhbHVlID0gbmV3IE9iamVjdFsyXTsKLQkJCXRyeSB7Ci0JCQkJZXhwLmdldEV4cHJlc3Npb25Qcm94eSgoKEludGVnZXIpIGZpZWxkKS5pbnRWYWx1ZSgpLCBleHB2YWx1ZSk7Ci0JCQkJZmllbGQgPSBleHB2YWx1ZVswXTsgCi0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU2VlIGlmIHRoZXJlIGlzIGEgZmFpbGVkIHByb3h5LgotCQkJCWlmIChlLmdldFByb3h5KCkgIT0gbnVsbCkgewotCQkJCQlGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkgZmFpbHVyZSA9IChGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkpIGUuZ2V0UHJveHkoKTsKLQkJCQkJdGhyb3cgbmV3IEZhaWxlZFByb3h5RXhjZXB0aW9uKChUaHJvd2FibGUpIGZhaWx1cmUuZ2V0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXRocm93IG5ldyBGYWlsZWRQcm94eUV4Y2VwdGlvbihuZXcgTm9TdWNoRmllbGRFeGNlcHRpb24oKSk7CS8vIFRoaXMgc2hvdWxkbid0IG9mIG9jY3VycmVkLgotCi0JCQl9IAotCQl9Ci0JCXJldHVybiBmaWVsZDsKLQl9CQotCQotCS8qKgotCSAqIFB1bGwgdGhlIEV4cHJlc3Npb24gUHJveHkgdmFsdWUgaW50byB0aGUgcmVzdWx0IG9iamVjdC4KLQkgKiBAcGFyYW0gcHJveHlJRAotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHZhbHVlIGNvdWxkIGJlIHJldHVybmVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd2FzIG5vIGV4cHJlc3Npb24gdmFsdWUgYXNzaWduZWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHVsbEV4cHJlc3Npb25Qcm94eVZhbHVlKGludCBwcm94eUlELCBPYmplY3RbXSByZXN1bHQpIHsKLQkJdHJ5IHsKLQkJCWV4cC5wdWxsRXhwcmVzc2lvblByb3h5VmFsdWUocHJveHlJRCwgcmVzdWx0KTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW1vdGVFeHByZXNzaW9uUHJveHkgaW1wbGVtZW50cyBJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSB7Ci0KLQkJCi0JCXByaXZhdGUgZmluYWwgaW50IHByb3h5SUQ7Ci0JCXByaXZhdGUgT2JqZWN0IHZhbHVlOwotCQlwcml2YXRlIENsYXNzIHR5cGU7Ci0JCXByaXZhdGUgYm9vbGVhbiBzZXQ7Ci0JCQotCQlwdWJsaWMgUmVtb3RlRXhwcmVzc2lvblByb3h5KGludCBwcm94eUlEKSB7Ci0JCQl0aGlzLnByb3h5SUQgPSBwcm94eUlEOwotCQkJCi0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I2dldFByb3h5SUQoKQotCQkgKi8KLQkJcHVibGljIGludCBnZXRQcm94eUlEKCkgewotCQkJcmV0dXJuIHByb3h5SUQ7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I2dldFR5cGUoKQotCQkgKi8KLQkJcHVibGljIENsYXNzIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjZ2V0VmFsdWUoKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjaXNTZXQoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNTZXQoKSB7Ci0JCQlyZXR1cm4gc2V0OwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEV4cHJlc3Npb25Qcm94eSNzZXRQcm94eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRQcm94eShPYmplY3QgdmFsdWUsIENsYXNzIHR5cGUpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQlzZXQgPSB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZhaWxlZEV4cHJlc3Npb24oKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXNlZCBmb3IgdGhlIGphdmEubGFuZy5yZWZsZWN0IHRoaW5ncyAoY2xhc3MsIGZpZWxkLCBtZXRob2QpIHRvIGluZGljYXRlCi0JICogd2h5IHRoZXkgYXJlbid0IGZvdW5kLgotCSAqIDxwPgotCSAqIFRoZSBleGNlcHRpb24gd2lsbCBiZSBwbGFjZWQgaW50byB2YWx1ZSwgQlVUIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHNlbnQKLQkgKiBiYWNrIHRvIHRoZSBjYWxsZXIuIEl0IGlzIGludGVuZGVkIG9ubHkgYXMgYSBwbGFjZS1ob2xkZXIgZm9yIHN1YnNlcXVlbnQKLQkgKiB1c2FnZS4gVXNlIHRoZSB7QGxpbmsgUmVtb3RlRXhwcmVzc2lvblByb3h5I2lzRmFpbGVkRXhwcmVzc2lvbigpfSBtZXRob2QKLQkgKiB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSBmYWlsZWQgb25lLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCBiZWNhdXNlIHRoZSByZWZsZWN0IGNhbGxzIGFyZSBkb25lIG91dCBvZiBzZXF1ZW5jZSBmcm9tIHdoZXJlCi0JICogdGhleSBhcmUgdXNlZCBhbmQgc28gaWYgdGhlcmUgd2FzIGFuIGVycm9yLCB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgaW4gdGhlCi0JICogd3JvbmcgcGxhY2UuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IGV4dGVuZHMgUmVtb3RlRXhwcmVzc2lvblByb3h5IHsKLQotCQlwdWJsaWMgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KGludCBwcm94eUlEKSB7Ci0JCQlzdXBlcihwcm94eUlEKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNGYWlsZWRFeHByZXNzaW9uKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzU2V0KCkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBjb25zaWRlcmVkIHRvIGJlIHNldC4gSXQgaXMgaG9sZGVyIG9mIGluZm8gb25seS4KLQkJfQotCQkKLQl9Ci0JCi0KLQkvKioKLQkgKiBQdWxsIHRoZSB2YWx1ZS4gCi0JICogCi0JICogQHJldHVybiByWzBdIGlzIHRoZSB2YWx1ZSwgclsxXSBpcyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBwdWxsVmFsdWUoKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzJdOwotCQlleHAucHVsbFZhbHVlKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQkJCQotCS8qKgotCSAqIENsb3NlIG91dCB0aGluZ3MuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWV4cC5jbG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHRocm93YWJsZSBlcnJvci4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRFcnJvclRocm93YWJsZSgpIHsKLQkJcmV0dXJuIGV4cC5nZXRFcnJvclRocm93YWJsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSB3ZXJlIG5vIGVycm9ycyBvciBub3QuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIG5vRXJyb3JzKCkgewotCQlyZXR1cm4gZXhwLm5vRXJyb3JzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGEgbm8gZXhwcmVzc2lvbiB2YWx1ZSBleGNlcHRpb24gb3Igbm90LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vRXhwcmVzc2lvblZhbHVlKCkgewotCQlyZXR1cm4gZXhwLmlzTm9FeHByZXNzaW9uVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvSWRlbnRpdHlNYXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvSWRlbnRpdHlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1ODNlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0lkZW50aXR5TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBJZGVudGl0eU1hcC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0vKioKLSAqIEEgSGFzaE1hcCB3aGVyZSB0aGUga2V5IGlzCi0gKiBkb25lIGFzIGFuIGlkZW50aXR5IChpLmUuIGZvdW5kIGJ5ICc9PScgbm90IGVxdWFscygpKS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlNYXAgZXh0ZW5kcyBIYXNoTWFwewotCQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY4MTcyNzQ4MzMyMjEzODM2ODNMOwotCi0JLyoqCi0JICogS2V5IHRoYXQgcmV0dXJucyB0cnVlIG9uIGVxdWFscygpIG9ubHkKLQkgKiBpZiB0aGUgaXRlbSBpdCBpcyB3cmFwcGVyaW5nIGlzICc9PScKLQkgKiBub3QgZXF1YWxzKCkKLQkgKi8KLQlzdGF0aWMgY2xhc3MgSWRlbnRpdHlLZXkgewotCQkKLQkJcHVibGljIHN0YXRpYyBJZGVudGl0eUtleSBjcmVhdGVLZXkoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiAhPSBudWxsID8gbmV3IElkZW50aXR5S2V5KG9iaikgOiBudWxsOwotCQl9Ci0JCQotCQlmaW5hbCBPYmplY3QgbzsKLQkJCi0JCXB1YmxpYyBJZGVudGl0eUtleShPYmplY3Qgb2JqKSB7Ci0JCQlvID0gb2JqOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIElkZW50aXR5S2V5KSkgcmV0dXJuIGZhbHNlOwotCQkJaWYgKHRoaXMubyA9PSAoKChJZGVudGl0eUtleSkgb2JqKS5vKSkgcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gby5oYXNoQ29kZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJZGVudGl0eU1hcCgpIHsKLQl9Ci0JCi0JcHVibGljIElkZW50aXR5TWFwKGludCBjYXBhY2l0eSkgewotCQlzdXBlcihjYXBhY2l0eSk7Ci0JfQotCQotCXB1YmxpYyBJZGVudGl0eU1hcChpbnQgY2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLQkJc3VwZXIoY2FwYWNpdHksIGxvYWRGYWN0b3IpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBzdXBlci5jb250YWluc0tleShJZGVudGl0eUtleS5jcmVhdGVLZXkoa2V5KSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIHN1cGVyLmdldChJZGVudGl0eUtleS5jcmVhdGVLZXkoa2V5KSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gc3VwZXIucHV0KElkZW50aXR5S2V5LmNyZWF0ZUtleShrZXkpLCB2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIHN1cGVyLnJlbW92ZShJZGVudGl0eUtleS5jcmVhdGVLZXkoa2V5KSk7Ci0JfQotCQotCS8qKgotCSAqIE5PVEU6IERpZG4ndCBib3RoZXIgaW1wbGVtZW50aW5nIGVudHJ5U2V0KCkuIElmIHRoYXQgYmVjb21lcwotCSAqIG5lZWRlZCwgdGhlbiBpdCB3aWxsIGJlIGltcGxlbWVudGVkLgotCSAqLwotCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0JCXRocm93ICBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1JlbW90ZVZNQXBwbGljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvUmVtb3RlVk1BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzBkNjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvUmVtb3RlVk1BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUmVtb3RlVk1BcHBsaWNhdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotCi0vKioKLSAqIFRoZSBhcHBsaWNhdGlvbiB0byBydW4gdG8ga2ljayBvZmYgdGhlIHJlbW90ZSBWTSBzZXJ2ZXIgc2lkZS4KLSAqCi0gKgotICogQWxsIHRoaXMgZG9lcyBpcyBzdGFydCB0aGUgU2VydmVyIFRocmVhZCBhbmQgd2FpdHMgZm9yIGl0IHRvIGZpbmlzaC4KLSAqIFRoaXMgYWxsb3dzIG90aGVyIG1haW5zIHRvIGhhdmUgYSBzZXJ2ZXIgdGhyZWFkLCBhbmQgc29tZSBvdGhlcgotICogdGhyZWFkcyBpZiB0aGV5IHdpc2hlZC4gVGhleSBjb3VsZCBzdGFydCB0aGUgc2VydmVyIHRocmVhZCB0b28KLSAqIGFuZCBzb21lIG90aGVyIHRocmVhZCwgYW5kIHRoZW4gd2FpdCBmb3IgYm90aCB0byBmaW5pc2guCi0gKi8KLQotcHVibGljIGNsYXNzIFJlbW90ZVZNQXBwbGljYXRpb24gewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCVN0cmluZyBzZXJ2ZXJOYW1lID0gIlNlcnZlciBUaHJlYWQiOyAvLyROT04tTkxTLTEkCi0JaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgicHJveHl2bS5zZXJ2ZXJuYW1lIikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJOYW1lID0gc2VydmVyTmFtZSArICItIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgicHJveHl2bS5zZXJ2ZXJuYW1lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCVRocmVhZCB0ID0gbmV3IFJlbW90ZVZNU2VydmVyVGhyZWFkKHNlcnZlck5hbWUpOwotCXQuc3RhcnQoKTsKLQl0cnkgewotCQl0LmpvaW4oKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQlTeXN0ZW0uZXhpdCgwKTsKLX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvUmVtb3RlVk1TZXJ2ZXJUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvUmVtb3RlVk1TZXJ2ZXJUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4MWZjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1JlbW90ZVZNU2VydmVyVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUmVtb3RlVk1TZXJ2ZXJUaHJlYWQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi4qOwotLyoqCi0gKiBSZW1vdGVWTSBTZXJ2ZXIgVGhyZWFkLiBUaGlzIHRocmVhZCBpcyB0aGUgb25lCi0gKiB0aGF0IHdhaXRzIGZvciBjb25uZWN0aW9ucyBhbmQgc3BpbnMgb2ZmIAotICogc2VydmVyIGNvbm5lY3Rpb24gdGhyZWFkcy4gSXQgbWFuYWdlcyB0aGUKLSAqIGNvbm5lY3Rpb24gdGhyZWFkcyBhbmQgaGFuZGxlcyBzaHV0dGluZyB0aGVtCi0gKiBkb3duLgotICoKLSAqIFN5c3RlbSBQcm9wZXJ0aWVzOgotICogICBwcm94eXZtLnBvcnQgLSBQb3J0IG51bWJlciB0byB1c2UgZm9yIHRoZSBTZXJ2ZXJTb2NrZXQgKGRlZmF1bHQgaXMgODg4OCkKLSAqICAgcHJveHl2bS5idWZzaXplIC0gQnVmZmVyIHNpemUgdG8gdXNlIGZvciBUQ1AvSVAgYnVmZmVycyAoZGVmYXVsdCBpcyBzeXN0ZW0gZGVmYXVsdCkKLSAqLwotCi1wdWJsaWMgY2xhc3MgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgaW1wbGVtZW50cyBJVk1TZXJ2ZXIsIElWTUNhbGxiYWNrU2VydmVyIHsKLQlwcm90ZWN0ZWQgTGlzdCB0aHJlYWRzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgTGlua2VkTGlzdCgpKTsJLy8gTGlzdCBvZiBhY3RpdmUgdGhyZWFkcy4KLQlwcm90ZWN0ZWQgU2VydmVyU29ja2V0IHNlcnZlcjsJLy8gU2VydmVyIFNvY2tldCBmb3IgdGhpcyBhcHBsaWNhdGlvbgotCXByaXZhdGUgaW50IGhpZ2hlc3RJZGVudGl0eUlEID0gMDsJLy8gSWRlbnRpdHkgY29kZXMgdG8gaWRlbnRpZnkgb2JqZWN0cyBiZXR3ZWVuIHNlcnZlciBhbmQgY2xpZW50LgotCXByaXZhdGUgTWFwIG9iamVjdFRvSURNYXA7Ci0JcHJpdmF0ZSBIYXNoTWFwIGlkVG9PYmplY3RNYXAgPSBuZXcgSGFzaE1hcCgxMDApOwkvLyBNYXAgZnJvbSBpZGVudGl0eSBpZCB0byBvYmplY3QKLQkKLQlwcm90ZWN0ZWQgU3RhY2sgZkNhbGxiYWNrSGFuZGxlclBvb2wgPSBuZXcgU3RhY2soKTsJLy8gU3RhY2sgb2YgZnJlZSBjYWxsYmFjayBoYW5kbGVycwotCXByb3RlY3RlZCBzdGF0aWMgaW50IE5VTUJFUl9GUkVFX0NBTExCQUNLUyA9IDU7CS8vIE51bWJlciBvZiBmcmVlIGNhbGxiYWNrIGhhbmRsZXJzIHRvIGtlZXAgb3Blbi4KLQkKLQlwdWJsaWMgc3RhdGljIGludCBJRF9OT1RfRk9VTkQgPSBDb21tYW5kcy5OT1RfQU5fSUQ7CS8vIFRoZSBpZCB3YXMgbm90IGZvdW5kIGluIHRoZSB0YWJsZS4KLQkKLQlwcm90ZWN0ZWQgaW50IG1hc3RlcklERVNvY2tldFBvcnQgPSAtMTsJLy8gUG9ydCBvZiBtYXN0ZXIgc2VydmVyIHNvY2tldCBvbiBJREUuIFVzZWQgZm9yIHNwZWNpYWwgZ2xvYmFsIHJlcXVlc3RzLgotCXByb3RlY3RlZCBpbnQgcmVnaXN0cnlLZXkgPSAtMTsJLy8gS2V5IG9mIHJlZ2lzdHJ5IG9uIHRoZSBJREUuCi0JCi0JLy8gS2x1ZGdlOiBCdWcgaW4gTGludXggMS4zLnh4eCBvZiBKVk0uIENsb3NpbmcgYSBzb2NrZXQgd2hpbGUgdGhlIHNvY2tldCBpcyBiZWluZyByZWFkL2FjY2VwdCB3aWxsIG5vdCBpbnRlcnJ1cHQgdGhlCi0JLy8gd2FpdC4gTmVlZCB0byB0aW1lb3V0IHRvIHRoZSBzb2NrZXQgcmVhZC9hY2NlcHQgYmVmb3JlIHRoZSBzb2NrZXQgY2xvc2Ugd2lsbCBiZSBub3RpY2VkLiBUaGlzIGhhcyBiZWVuIGZpeGVkCi0JLy8gaW4gTGludXggMS40LiBTbyBvbiBMaW51eCAxLjMgbmVlZCB0byBwdXQgdGltZW91dHMgaW4gb24gdGhvc2Ugc29ja2V0cyB0aGF0IGNhbiBiZSBzZXBhcmF0ZWx5IGNsb3NlZCB3aGlsZSByZWFkaW5nL2FjY2VwdGluZy4KLQlzdGF0aWMgYm9vbGVhbiBMSU5VWF8xXzMgPSAibGludXgiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpICYmIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiwiIikuc3RhcnRzV2l0aCgiMS4zIik7CSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkKLQkvLyBJZiB2ZXJzaW9uIDEuMy54LCB3ZSBuZWVkIHRvIHVzZSBvdXIgSWRlbnRpZHlNYXAsIGlmIDEuNCBvciBncmVhdGVyIHRoZW4gd2UgY2FuIHVzZSBKYXZhJ3MgSWRlbnRpZHlIYXNoTWFwLCB3aGljaCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIG91cnMuCi0Jc3RhdGljIENvbnN0cnVjdG9yIElERU5USURZTUFQX0NMQVNTX0NUT1I7Ci0Jc3RhdGljIHsKLQkJQ2xhc3MgaWRDbGFzczsKLQkJdHJ5IHsKLQkJCWlkQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwIik7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJaWRDbGFzcyA9IElkZW50aXR5TWFwLmNsYXNzOwotCQl9Ci0JCXRyeSB7Ci0JCQlJREVOVElEWU1BUF9DTEFTU19DVE9SID0gaWRDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7SW50ZWdlci5UWVBFfSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBSZW1vdGVWTVNlcnZlclRocmVhZChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJdHJ5IHsKLQkJCW9iamVjdFRvSURNYXAgPSAoTWFwKSBJREVOVElEWU1BUF9DTEFTU19DVE9SLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoMTAwKX0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvLyBUaGUgcHVycG9zZSBvZiB0aGlzIHRocmVhZCBpcyB0byB3YWl0IDUgbWludXRlcywgdGhlbiBzZWUgaWYgdGhlIElERSBpcyBzdGlsbAotCS8vIHVwLiBJZiBpdCBpc24ndCBpdCB3aWxsIGdvIGRvd24uIFRoaXMgaXMgc2FmZXR5IG1lY2hhbmlzbQotCS8vIGluIGNhc2UgdGhlIGNsaWVudCB3ZW50IGRvd24gd2l0aG91dCBjbGVhbmluZyB1cCBhbmQgdGVsbGluZyB0aGUgc2VydmVyIHRvIGdvIGRvd24uCi0JLy8gVGhhdCB3YXkgaXQgd29uJ3QgaGFuZyBhcm91bmQgZm9yZXZlci4KLQlwcml2YXRlIGJvb2xlYW4gZ29pbmdEb3duID0gZmFsc2U7Ci0JcHJpdmF0ZSBUaHJlYWQgc2FmZUNsZWFuID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXdoaWxlICghZ29pbmdEb3duKSB7Ci0JCQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKQotCQkJCQljb250aW51ZTsJLy8gR2V0IHRvIGNsZWFuIHVuaW50ZXJydXB0ZWQgc3RhdGUuCi0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDUgKiA2MCAqIDEwMDApOwkvLyBTbGVlcCBmaXZlIG1pbnV0ZXMKLQkJCQkJLy8gVGVzdCBpZiBJREUgc3RpbGwgdXAuCi0JCQkJCWlmICghaXNBbGl2ZSgpKSB7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHJlZ2lzdHJ5IGF2YWlsYWJsZSB0byBjb25uZWN0IHdpdGggYWZ0ZXIgZml2ZSBtaW51dGVzLiBTaHV0dGluZyBkb3duLiIpOwkvLyROT04tTkxTLTEkCi0JCQkJCQlyZXF1ZXN0U2h1dGRvd24oKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFNlZSBpZiBzdGlsbCBhbGl2ZQotCQkgKi8JCQotCQlwcml2YXRlIGJvb2xlYW4gaXNBbGl2ZSgpIHsKLQkJCVNvY2tldCBzb2NrZXQgPSBnZXRTb2NrZXQoKTsKLQkJCWlmIChzb2NrZXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCQkJRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJb3V0LndyaXRlQnl0ZShDb21tYW5kcy5BTElWRSk7Ci0JCQkJCQlvdXQud3JpdGVJbnQocmVnaXN0cnlLZXkpOwotCQkJCQkJb3V0LmZsdXNoKCk7Ci0JCQkJCQlyZXR1cm4gaW4ucmVhZEJvb2xlYW4oKTsKLQkJCQkJCS8vIE5vdyBnZXQgdGhlIHJlc3VsdC4KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNvY2tldC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkvLyBUaGV5IHNob3VsZCBiZSBjbG9zaW5nLiBJZiB0aGV5IGFyZW4ndCwgdGhlbiB0aGV5IGFjY3VtdWxhdGUgYW5kIG1hc3RlciBzZXJ2ZXIgd2lsbCBzdGFydCByZWplY3RpbmcgbmV3IG9uZXMuCi0JCQkJCX0KLQkJCQl9CQkJCQkKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQotCQkKLQl9LCAiVGltZW91dCBUZXJtaW5hdGlvbiBUaHJlYWQiKTsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCi0JCS8vIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgdGFibGUgd2l0aCBjZXJ0YWluIHByZS1kZWZpbmVkIGlkcy4KLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCW9iamVjdFRvSURNYXAucHV0KFZvaWQuVFlQRSwgbmV3IEludGVnZXIoQ29tbWFuZHMuVk9JRF9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5WT0lEX1RZUEUpLCBWb2lkLlRZUEUpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChCb29sZWFuLlRZUEUsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJPT0xFQU5fVFlQRSkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQk9PTEVBTl9UWVBFKSwgQm9vbGVhbi5UWVBFKTsKLQkJCW9iamVjdFRvSURNYXAucHV0KEJvb2xlYW4uY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJPT0xFQU5fQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJPT0xFQU5fQ0xBU1MpLCBCb29sZWFuLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoSW50ZWdlci5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5JTlRFR0VSX1RZUEUpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLklOVEVHRVJfVFlQRSksIEludGVnZXIuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChJbnRlZ2VyLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5JTlRFR0VSX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5JTlRFR0VSX0NMQVNTKSwgSW50ZWdlci5jbGFzcyk7Ci0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KEJ5dGUuVFlQRSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQllURV9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5CWVRFX1RZUEUpLCBCeXRlLlRZUEUpOwotCQkJb2JqZWN0VG9JRE1hcC5wdXQoQnl0ZS5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuQllURV9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQllURV9DTEFTUyksIEJ5dGUuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChTaG9ydC5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5TSE9SVF9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5TSE9SVF9UWVBFKSwgU2hvcnQuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChTaG9ydC5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuU0hPUlRfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLlNIT1JUX0NMQVNTKSwgU2hvcnQuY2xhc3MpOwkKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoTG9uZy5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX1RZUEUpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkxPTkdfVFlQRSksIExvbmcuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChMb25nLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX0NMQVNTKSwgTG9uZy5jbGFzcyk7Ci0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KENoYXJhY3Rlci5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5DSEFSQUNURVJfVFlQRSkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQ0hBUkFDVEVSX1RZUEUpLCBDaGFyYWN0ZXIuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChDaGFyYWN0ZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNIQVJBQ1RFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQ0hBUkFDVEVSX0NMQVNTKSwgQ2hhcmFjdGVyLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoRG91YmxlLlRZUEUsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkRPVUJMRV9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5ET1VCTEVfVFlQRSksIERvdWJsZS5UWVBFKTsKLQkJCW9iamVjdFRvSURNYXAucHV0KERvdWJsZS5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuRE9VQkxFX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5ET1VCTEVfQ0xBU1MpLCBEb3VibGUuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChGbG9hdC5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5GTE9BVF9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5GTE9BVF9UWVBFKSwgRmxvYXQuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChGbG9hdC5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuRkxPQVRfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkZMT0FUX0NMQVNTKSwgRmxvYXQuY2xhc3MpOwkJCQkJCQkJCQkJCQkJCi0JCQkJCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KFN0cmluZy5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuU1RSSU5HX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5TVFJJTkdfQ0xBU1MpLCBTdHJpbmcuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuQklHX0RFQ0lNQUxfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJJR19ERUNJTUFMX0NMQVNTKSwgamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuQklHX0lOVEVHRVJfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJJR19JTlRFR0VSX0NMQVNTKSwgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChOdW1iZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLk5VTUJFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuTlVNQkVSX0NMQVNTKSwgTnVtYmVyLmNsYXNzKTsJCQkJCi0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KFRocm93YWJsZS5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuVEhST1dBQkxFX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5USFJPV0FCTEVfQ0xBU1MpLCBUaHJvd2FibGUuY2xhc3MpOwkKLQkJCQotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChPYmplY3QuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLk9CSkVDVF9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuT0JKRUNUX0NMQVNTKSwgT2JqZWN0LmNsYXNzKTsJCi0JCQkJCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KENsYXNzLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5DTEFTU19DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MpLCBDbGFzcy5jbGFzcyk7Ci0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkFDQ0VTU0lCTEVPQkpFQ1RfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkFDQ0VTU0lCTEVPQkpFQ1RfQ0xBU1MpLCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0LmNsYXNzKTsJCQkJCQkJCQotCi0JCQlvYmplY3RUb0lETWFwLnB1dChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLk1FVEhPRF9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuTUVUSE9EX0NMQVNTKSwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNPTlNUUlVDVE9SX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5DT05TVFJVQ1RPUl9DTEFTUyksIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmNsYXNzKTsJCQkJCi0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5GSUVMRF9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuRklFTERfQ0xBU1MpLCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5jbGFzcyk7CQotCi0JCQlvYmplY3RUb0lETWFwLnB1dChJVk1TZXJ2ZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLklWTVNFUlZFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuSVZNU0VSVkVSX0NMQVNTKSwgSVZNU2VydmVyLmNsYXNzKTsJCi0KLQkJCW9iamVjdFRvSURNYXAucHV0KElDYWxsYmFjay5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuSUNBTExCQUNLX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5JQ0FMTEJBQ0tfQ0xBU1MpLCBJQ2FsbGJhY2suY2xhc3MpOwkKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQodGhpcywgbmV3IEludGVnZXIoQ29tbWFuZHMuUkVNT1RFU0VSVkVSX0lEKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5SRU1PVEVTRVJWRVJfSUQpLCB0aGlzKTsJCi0KLQkJCW9iamVjdFRvSURNYXAucHV0KFJlbW90ZVZNU2VydmVyVGhyZWFkLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5SRU1PVEVWTVNFUlZFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuUkVNT1RFVk1TRVJWRVJfQ0xBU1MpLCBSZW1vdGVWTVNlcnZlclRocmVhZC5jbGFzcyk7CQotCi0JCQlvYmplY3RUb0lETWFwLnB1dChUaHJlYWQuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLlRIUkVBRF9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuVEhSRUFEX0NMQVNTKSwgVGhyZWFkLmNsYXNzKTsJCi0KLQkJCW9iamVjdFRvSURNYXAucHV0KEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5FWFBSRVNTSU9OUFJPQ0VTU0VSQ09OVFJPTExFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuRVhQUkVTU0lPTlBST0NFU1NFUkNPTlRST0xMRVJfQ0xBU1MpLCBFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlci5jbGFzcyk7CQotCi0JCQl0cnkgewotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBnZXRNZXRob2QgPSBDbGFzcy5jbGFzcy5nZXRNZXRob2QoImdldE1ldGhvZCIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3MsIChuZXcgQ2xhc3NbMF0pLmdldENsYXNzKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCW9iamVjdFRvSURNYXAucHV0KGdldE1ldGhvZCwgbmV3IEludGVnZXIoQ29tbWFuZHMuR0VUX01FVEhPRF9JRCkpOwotCQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkdFVF9NRVRIT0RfSUQpLCBnZXRNZXRob2QpOwkKLQkJCQkKLQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgaW5pdE1ldGhvZCA9IElDYWxsYmFjay5jbGFzcy5nZXRNZXRob2QoImluaXRpYWxpemVDYWxsYmFjayIsIG5ldyBDbGFzc1tdIHtJVk1DYWxsYmFja1NlcnZlci5jbGFzcywgSW50ZWdlci5UWVBFfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlvYmplY3RUb0lETWFwLnB1dChpbml0TWV0aG9kLCBuZXcgSW50ZWdlcihDb21tYW5kcy5JTklUSUFMSVpFQ0FMTEJBQ0tfTUVUSE9EX0lEKSk7Ci0JCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuSU5JVElBTElaRUNBTExCQUNLX01FVEhPRF9JRCksIGluaXRNZXRob2QpOwkKLQkJCQkKLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU2hvdWxkbid0IHJlYWxseSBldmVyIG9jY3VyLgotCQkJfQkJCQkKLQotCQkJaGlnaGVzdElkZW50aXR5SUQgPSBDb21tYW5kcy5GSVJTVF9GUkVFX0lEOwkJCi0JCX0KLQotCQltYXN0ZXJJREVTb2NrZXRQb3J0ID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJwcm94eXZtLm1hc3RlclBvcnQiLCAtMSkuaW50VmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWFzdGVySURFU29ja2V0UG9ydCA9PSAtMSkgewotCQkJLy8gTm8gcG9ydHMgc3BlY2lmaWVkLCBuZWVkIHRvIGp1c3Qgc2h1dGRvd24uCi0JCQlzaHV0ZG93bigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlyZWdpc3RyeUtleSA9IEludGVnZXIuZ2V0SW50ZWdlcigicHJveHl2bS5yZWdpc3RyeUtleSIsIC0xKS5pbnRWYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZWdpc3RyeUtleSA9PSAtMSkgewotCQkJLy8gTm8gcmVnaXN0cnkgc3BlY2lmaWVkLCBuZWVkIHRvIGp1c3Qgc2h1dGRvd24uCi0JCQlzaHV0ZG93bigpOwotCQkJcmV0dXJuOwotCQl9CQkKLQkJCi0JCXNhZmVDbGVhbi5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZKTsKLQkJc2FmZUNsZWFuLnN0YXJ0KCk7CQotCQlib29sZWFuIHRyeWluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlzZXJ2ZXIgPSBuZXcgU2VydmVyU29ja2V0KDAsIDUwICwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJsb2NhbGhvc3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeWluZyA9IGZhbHNlOwotCQkJaWYgKExJTlVYXzFfMykKLQkJCQlzZXJ2ZXIuc2V0U29UaW1lb3V0KDEwMDApOwkvLyBMaW51eCAxLjMgYnVnLCBzZWUgY29tbWVudCBvbiBMSU5VWF8xXzMKLQkJCWlmIChyZWdpc3RlclNlcnZlcihzZXJ2ZXIuZ2V0TG9jYWxQb3J0KCkpKSB7Ci0JCQkJd2hpbGUoc2VydmVyICE9IG51bGwpIHsKLQkJCQkJU29ja2V0IGluY29taW5nID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluY29taW5nID0gc2VydmVyLmFjY2VwdCgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWNvbnRpbnVlOwkvLyBUaW1lb3V0LCB0cnkgYWdhaW4KLQkJCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQkJY29udGludWU7CS8vIFNlcnZlciBjb3VsZCBvZiBnb25lIG51bGwgYWZ0ZXIgdGVzdCBpbiB3aGlsZSwgbWVhbnMgc2h1dHRpbmcgZG93bi4gVGhpcyBwcm9iYWJseSB3b3VsZCBvbmx5IGhhcHBlbiBMaW51eCAxLjMuCi0JCQkJCX0KLQkJCQkJVGhyZWFkIHN0ID0gbmV3IENvbm5lY3Rpb25UaHJlYWQoaW5jb21pbmcsIHRoaXMsICJDb25uZWN0aW9uIFRocmVhZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXRocmVhZHMuYWRkKHN0KTsKLQkJCQkJc2FmZUNsZWFuLmludGVycnVwdCgpOwkvLyBMZXQgc2FmZUNsZWFuIGtub3cgdGhlcmUgaXMgYSBjaGFuZ2UKLQkJCQkJc3Quc3RhcnQoKTsKLQkJCQkJLy8gTnVsbCBvdXQgbG9jYWxzIHNvIHRoZXkgY2FuIGJlIEdDJ2Qgc2luY2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBsb29wLgotCQkJCQlzdCA9IG51bGw7Ci0JCQkJCWluY29taW5nID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAodHJ5aW5nIHx8IHNlcnZlciAhPSBudWxsKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CS8vIEV4Y2VwdGlvbiBhbmQgbm90IHNodXRkb3duIHJlcXVlc3QsIHNvIHByaW50IHN0YWNrIHRyYWNlLgotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJLy8gV2UndmUgaGFkIGFuIGV4Y2VwdGlvbiwgZWl0aGVyIHNvbWV0aGluZyByZWFsbHkgYmFkLCBvciB3ZSB3ZXJlIGNsb3NlZCwKLQkJLy8gc28gZ28gdGhyb3VnaCBzaHV0ZG93bnMuCi0JCXNodXRkb3duKCk7CQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IGFuIGlkZW50aXR5SUQsIHJldHVybiAtMSBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIGludCBnZXRJZGVudGl0eUlEKE9iamVjdCBhbk9iamVjdCkgewotCQlzeW5jaHJvbml6ZWQob2JqZWN0VG9JRE1hcCkgewotCQkJSW50ZWdlciBpZCA9IChJbnRlZ2VyKSBvYmplY3RUb0lETWFwLmdldChhbk9iamVjdCk7Ci0JCQlyZXR1cm4gaWQgIT0gbnVsbCA/IGlkLmludFZhbHVlKCkgOiBJRF9OT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IGFuIGlkZW50aXR5SUQgYW5kIGFkZCBpdCBpZiBub3QgZm91bmQuIFBsYWNlIHRoZSBpZCBpbiB0aGUKLQkgKiBWYWx1ZU9iamVjdCBwYXNzZWQgaW4gYW5kIHJldHVybiB3aGV0aGVyIGl0IHdhcyBhZGRlZCAodHJ1ZSkgb3Igd2FzIGFscmVhZHkgaW4gdGFibGUgKGZhbHNlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldElkZW50aXR5SUQoT2JqZWN0IGFuT2JqZWN0LCBDb21tYW5kcy5WYWx1ZU9iamVjdCBpbnRvVmFsdWUgKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCUludGVnZXIgaWQgPSAoSW50ZWdlcikgb2JqZWN0VG9JRE1hcC5nZXQoYW5PYmplY3QpOwotCQkJaWYgKGlkID09IG51bGwpIHsKLQkJCQlkbyB7Ci0JCQkJCWlmICgrK2hpZ2hlc3RJZGVudGl0eUlEID09IENvbW1hbmRzLk5PVF9BTl9JRCkKLQkJCQkJCSsraGlnaGVzdElkZW50aXR5SUQ7CS8vIERvbid0IGxldCAtMSBiZSBhIHZhbGlkIGlkLgotCQkJCQlpZCA9IG5ldyBJbnRlZ2VyKGhpZ2hlc3RJZGVudGl0eUlEKTsKLQkJCQl9IHdoaWxlIChpZFRvT2JqZWN0TWFwLmNvbnRhaW5zS2V5KGlkKSk7IC8vIE1ha2Ugc3VyZSBub3QgaW4gdXNlLCByZWFsbHkgc2hvdWxkbid0IGV2ZXIgaGFwcGVuIGJlY2F1c2Ugd2UgaGF2ZSBvdmVyIDQgYmlsbGlvbiBiZWZvcmUgaXQgd3JhcHMgYmFjawotCQkJCW9iamVjdFRvSURNYXAucHV0KGFuT2JqZWN0LCBpZCk7Ci0JCQkJaWRUb09iamVjdE1hcC5wdXQoaWQsIGFuT2JqZWN0KTsKLQkJCQlhZGRlZCA9IHRydWU7Ci0JCQl9IAotCQkJaW50b1ZhbHVlLnNldE9iamVjdElEKGlkLmludFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBhZGRlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGFuIGlkZW50aXR5IG9iamVjdCBmcm9tIHRoZSBtYXBwaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU9iamVjdChPYmplY3QgYW5PYmplY3QpIHsKLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCUludGVnZXIgaWQgPSAoSW50ZWdlcikgb2JqZWN0VG9JRE1hcC5yZW1vdmUoYW5PYmplY3QpOwotCQkJaWRUb09iamVjdE1hcC5yZW1vdmUoaWQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbiBpZGVudGl0eSBvYmplY3QgZnJvbSB0aGUgbWFwcGluZywgZ2l2ZW4gdGhlIGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU9iamVjdChpbnQgaWQpIHsKLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCU9iamVjdCBvID0gaWRUb09iamVjdE1hcC5yZW1vdmUobmV3IEludGVnZXIoaWQpKTsKLQkJCW9iamVjdFRvSURNYXAucmVtb3ZlKG8pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgb2JqZWN0IGZvciBhbiBpZGVudGl0eSBpZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KGludCBpZCkgewotCQlzeW5jaHJvbml6ZWQob2JqZWN0VG9JRE1hcCkgewotCQkJcmV0dXJuIGlkVG9PYmplY3RNYXAuZ2V0KG5ldyBJbnRlZ2VyKGlkKSk7Ci0JCX0KLQl9IAotCQotCS8qKgotCSAqIFJlbW92ZSBhIHRocmVhZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25UaHJlYWQoVGhyZWFkIHRocmVhZCkgewotCQl0aHJlYWRzLnJlbW92ZSh0aHJlYWQpOwotCQlzYWZlQ2xlYW4uaW50ZXJydXB0KCk7CS8vIExldCBzYWZlIGNsZWFuIGtub3cgdGhlcmUgaXMgYSBjaGFuZ2UuCi0JfQotCQotCS8qKgotCSAqIFVzZSB0aGlzIHRvIHJlcXVlc3QgYSBzaHV0ZG93bi4gSWYgdGhlIHNlcnZlciBoYXNuJ3QgZXZlbiBiZWVuCi0JICogY3JlYXRlZCB5ZXQsIHRoaXMgd2lsbCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVxdWVzdFNodXRkb3duKCkgewkJCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gQ2xvc2luZyB0aGUgc2VydmVyIHNvY2tldCBzaG91bGQgY2F1c2UgYSBicmVhay4KLQkJdHJ5IHsKLQkJCVNlcnZlclNvY2tldCBzcnYgPSBzZXJ2ZXI7Ci0JCQlzZXJ2ZXIgPSBudWxsOwkvLyBTbyB0aGF0IHNlcnZlciBrbm93cyBpdCBpcyBiZWluZyBzaHV0ZG93biBhbmQgbm90IHByaW50IGV4Y2VwdGlvbiBtc2cuCi0JCQlzcnYuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVxdWVzdCBhIGNhbGxiYWNrIHN0cmVhbSB0byB3cml0ZSB0by4KLQkgKiBXaGVuIGRvbmUsIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGNsb3NlZCB0byByZWxlYXNlIHRoZSBjb25uZWN0aW9uLgotCSAqLwotCXB1YmxpYyBPdXRwdXRTdHJlYW0gcmVxdWVzdFN0cmVhbShpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lEKSAgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlDYWxsYmFja0hhbmRsZXIgaCA9IChDYWxsYmFja0hhbmRsZXIpIGdldEZyZWVDYWxsYmFja0hhbmRsZXIoKTsKLQkJaWYgKGggPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb21tYW5kRXhjZXB0aW9uKCJObyBjYWxsYmFjayBoYW5kbGVyIHJldHJpZXZlZC4iLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQloLmluaXRpYXRlQ2FsbGJhY2tTdHJlYW0oY2FsbGJhY2tJRCwgbXNnSUQpOwotCQlyZXR1cm4gbmV3IENhbGxiYWNrT3V0cHV0U3RyZWFtKGgsIHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bigpIHsKLQkJZ29pbmdEb3duID0gdHJ1ZTsKLQkJc2FmZUNsZWFuLmludGVycnVwdCgpOwkvLyBMZXQgc2FmZUNsZWFuIGtub3cgdG8gY29tZSBkb3duLgotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlzZXJ2ZXIuY2xvc2UoKTsJLy8gQ2xvc2UgaXQgc28gdGhhdCBubyBtb3JlIHJlcXVlc3RzIGNhbiBiZSBtYWRlLgotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCi0JCS8vIEdvIHRocm91Z2ggZWFjaCB0aHJlYWQgYW5kIGFzayBpdCB0byBjbG9zZS4gTWFrZSBhIGNvcHkgb2YgdGhlIGxpc3Qgc28gdGhhdCB3ZQotCQkvLyB3b24ndCBnZXQgaW50byBkZWFkbG9ja3MuCi0JCUNvbm5lY3Rpb25UaHJlYWRbXSB0aHJlYWRzQXJyYXkgPSAoQ29ubmVjdGlvblRocmVhZFtdKSB0aHJlYWRzLnRvQXJyYXkobmV3IENvbm5lY3Rpb25UaHJlYWRbMF0pOwotCQlmb3IgKGludCBpPTA7IGk8dGhyZWFkc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBUaGlzIGlzIGEgaGFyc2ggd2F5IHRvIHNodXQgYSBjb25uZWN0aW9uIGRvd24sIGJ1dCB0aGVyZSdzIG5vCi0JCQkvLyBvdGhlciB3YXkgSSBrbm93IG9mIHRvIGludGVycnVwdCB0aGUgcmVhZCBvbiBhIHNvY2tldC4KLQkJCXRocmVhZHNBcnJheVtpXS5jbG9zZSgpOwotCQl9Ci0JCQkKLQkJLy8gTm93IHRoYXQgdGhleSd2ZSBiZWVuIHRvbGQgdG8gY2xvc2UsIHdhaXQgb24gZWFjaCBvbmUgdG8gZmluaXNoLgotCQlmb3IgKGludCBpPTA7IGk8dGhyZWFkc0FycmF5Lmxlbmd0aDsgaSsrKQotCQkJdHJ5IHsKLQkJCQl0aHJlYWRzQXJyYXlbaV0uam9pbigxMDAwMCk7CS8vIFdhaXQgdGVuIHNlY29uZHMsIGlmIGxvbmdlciwganVzdCBnbyBvbiB0byBuZXh0IG9uZS4KLQkJCQlpZiAodGhyZWFkc0FycmF5W2ldLmlzQWxpdmUoKSkKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogQ29ubmVjdGlvbiAiK2krIiBkaWQgbm90IGRpZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCi0JCWlmIChzYWZlQ2xlYW4uaXNBbGl2ZSgpKSB7Ci0JCQl0cnkgewkKLQkJCQlzYWZlQ2xlYW4uam9pbigxMDAwMCk7Ci0JCQkJaWYgKHNhZmVDbGVhbi5pc0FsaXZlKCkpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIENsZWFudXAgdGhyZWFkIGRpZCBub3QgZGllLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIE5vdyBjbG9zZSB0aGUgY2FsbGJhY2tzLgotCQlzeW5jaHJvbml6ZWQoZkNhbGxiYWNrSGFuZGxlclBvb2wpIHsKLQkJCS8vIE5vdyB3ZSB3YWxrIHRocm91Z2ggYWxsIG9mIHRoZSBmcmVlIGhhbmRsZXJzIGFuZCBjbG9zZSB0aGVtIHByb3Blcmx5LgotCQkJSXRlcmF0b3IgaXRyID0gZkNhbGxiYWNrSGFuZGxlclBvb2wuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJKChDYWxsYmFja0hhbmRsZXIpIGl0ci5uZXh0KCkpLmNsb3NlSGFuZGxlcigpOwotCQkJfQotCQkJCi0JCQlmQ2FsbGJhY2tIYW5kbGVyUG9vbC5jbGVhcigpOwotCQl9CQotCQkKLQkJTGlzdCBydW5uYWJsZXMgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCXJ1bm5hYmxlcyA9IHNodXRkb3duUnVubmFibGVzOwotCQkJc2h1dGRvd25SdW5uYWJsZXMgPSBudWxsOwotCQl9Ci0JCWlmIChydW5uYWJsZXMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdHIgPSBydW5uYWJsZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQl0cnkgewotCQkJCQkoKFJ1bm5hYmxlKSBpdHIubmV4dCgpKS5ydW4oKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZnJlZSBjYWxsYmFjayBoYW5kbGVyCi0JICovCi0JcHVibGljIElDYWxsYmFja0hhbmRsZXIgZ2V0RnJlZUNhbGxiYWNrSGFuZGxlcigpIHsKLQkJc3luY2hyb25pemVkKGZDYWxsYmFja0hhbmRsZXJQb29sKSB7Ci0JCQlpZiAoIWZDYWxsYmFja0hhbmRsZXJQb29sLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gKElDYWxsYmFja0hhbmRsZXIpIGZDYWxsYmFja0hhbmRsZXJQb29sLnBvcCgpOwotCQkJLy8gZWxzZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIG9uZS4JCQkKLQkJCXJldHVybiBjcmVhdGVDYWxsYmFja0hhbmRsZXIoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNYWtlIGEgbmV3IGNhbGxiYWNrIGhhbmRsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUNhbGxiYWNrSGFuZGxlciBjcmVhdGVDYWxsYmFja0hhbmRsZXIoKSB7Ci0JCVNvY2tldCBjYWxsYmFja1NvY2tldCA9IHJlcXVlc3RDYWxsYmFja1NvY2tldCgpOwotCQlpZiAoY2FsbGJhY2tTb2NrZXQgIT0gbnVsbCkgewotCQkJQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKGNhbGxiYWNrU29ja2V0LCB0aGlzKTsKLQkJCWlmIChoYW5kbGVyLmlzQ29ubmVjdGVkKCkpCi0JCQkJcmV0dXJuIGhhbmRsZXI7Ci0JCQkJCi0JCQkvLyBGYWlsZWQsIGNsb3NlIHRoZSBzb2NrZXQuCi0JCQl0cnkgewotCQkJCWNhbGxiYWNrU29ja2V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQkvKioKLQkgKiBGcmVlIHRoZSBoYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgcmV0dXJuQ2FsbGJhY2tIYW5kbGVyKElDYWxsYmFja0hhbmRsZXIgYUhhbmRsZXIpIHsKLQkJQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSAoQ2FsbGJhY2tIYW5kbGVyKSBhSGFuZGxlcjsKLQkJaWYgKGhhbmRsZXIuaXNDb25uZWN0ZWQoKSkKLQkJCXN5bmNocm9uaXplZCAoZkNhbGxiYWNrSGFuZGxlclBvb2wpIHsKLQkJCQlpZiAoZkNhbGxiYWNrSGFuZGxlclBvb2wuc2l6ZSgpIDwgTlVNQkVSX0ZSRUVfQ0FMTEJBQ0tTKQotCQkJCQlmQ2FsbGJhY2tIYW5kbGVyUG9vbC5wdXNoKGhhbmRsZXIpOwotCQkJCWVsc2UKLQkJCQkJaGFuZGxlci5jbG9zZUhhbmRsZXIoKTsJLy8gV2UgZG9uJ3QgbmVlZCB0byBtYWludGFpbiBtb3JlIHRoYW4gZml2ZSBmcmVlIGNvbm5lY3Rpb25zLgotCQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcm9jZXNzIGEgY2FsbGJhY2suCi0JICovCi0JcHVibGljIE9iamVjdCBkb0NhbGxiYWNrKElDYWxsYmFja1J1bm5hYmxlIHJ1bikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlDYWxsYmFja0hhbmRsZXIgaGFuZGxlciA9IChDYWxsYmFja0hhbmRsZXIpIGdldEZyZWVDYWxsYmFja0hhbmRsZXIoKTsKLQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gcnVuLnJ1bihoYW5kbGVyKTsKLQkJCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUaGlzIGlzIGNvbW1hbmQgZXJyb3IsIGNvbm5lY3Rpb24gc3RpbGwgZ29vZCwgZG9uJ3QgcmV0cnksIGp1c3QgcGFzcyBpdCBvbi4KLQkJCQkJLy8gSXQgbWVhbnMgdGhlIG90aGVyIHNpZGUgc2FpZCBJIHByb2Nlc3NlZCBpdCwgYnV0IHRoZXJlIGlzIGFuIGVycm9yLgotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCQkvLyBDbG9zZSB0aGlzIGhhbmRsZXIgYW5kIHRyeSBhIG5ldyBvbmUsIG9uZSBtb3JlIHRpbWUuCi0JCQkJCQloYW5kbGVyLmNsb3NlSGFuZGxlcigpOwotCQkJCQkJaGFuZGxlciA9IChDYWxsYmFja0hhbmRsZXIpIGdldEZyZWVDYWxsYmFja0hhbmRsZXIoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmV0dXJuIHJ1bi5ydW4oaGFuZGxlcik7CQkJCQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCQkJLy8gSXQgZmFpbGVkIGFnYWluLCBqdXN0IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCByZXRocm93IHRoZSBleGNlcHRpb24uCi0JCQkJCQkJaGFuZGxlci5jbG9zZUhhbmRsZXIoKTsKLQkJCQkJCQl0aHJvdyBlQWdhaW47Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZQotCQkJCQkJdGhyb3cgZTsJLy8gUmVjb3ZlcmFibGUsIHJldGhyb3cgZXhjZXB0aW9uLgotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJcmV0dXJuQ2FsbGJhY2tIYW5kbGVyKGhhbmRsZXIpOwotCQkJfQotCQl9IGVsc2UKLQkJCXRocm93IG5ldyBDb21tYW5kRXhjZXB0aW9uKCJObyBjYWxsYmFjayBoYW5kbGVyIHJldHJpZXZlZC4iLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQkKLQl9Ci0JCi0JLyoKLQkgKiBSZWdpc3RlciB0aGUgc2VydmVyLiBSZXR1cm4gaWYgaWRlIHN0aWxsIGFjdGl2ZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWdpc3RlclNlcnZlcihpbnQgdm1zZXJ2ZXJQb3J0KSB7Ci0JCVNvY2tldCBzb2NrZXQgPSBnZXRTb2NrZXQoKTsKLQkJaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQlvdXQud3JpdGVCeXRlKENvbW1hbmRzLlJFTU9URV9TVEFSVEVEKTsKLQkJCQkJb3V0LndyaXRlSW50KHJlZ2lzdHJ5S2V5KTsKLQkJCQkJb3V0LndyaXRlSW50KHZtc2VydmVyUG9ydCk7Ci0JCQkJCW91dC5mbHVzaCgpOwotCQkJCQlyZXR1cm4gaW4ucmVhZEJvb2xlYW4oKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCXNvY2tldC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9CQkJCQkKLQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogUmVxdWVzdCB0aGUgY2FsbGJhY2sgc29ja2V0LiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpc24ndCBvbmUuCi0JICovCi0JcHJpdmF0ZSBTb2NrZXQgcmVxdWVzdENhbGxiYWNrU29ja2V0KCkgewotCQlTb2NrZXQgc29ja2V0ID0gZ2V0U29ja2V0KCk7Ci0JCWlmIChzb2NrZXQgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBjbG9zZVNvY2tldCA9IHRydWU7Ci0JCQl0cnkgewotCQkJCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQlvdXQud3JpdGVCeXRlKENvbW1hbmRzLkFUVEFDSF9DQUxMQkFDSyk7Ci0JCQkJCW91dC53cml0ZUludChyZWdpc3RyeUtleSk7Ci0JCQkJCW91dC5mbHVzaCgpOwotCQkJCQljbG9zZVNvY2tldCA9ICFpbi5yZWFkQm9vbGVhbigpOwotCQkJCQlyZXR1cm4gIWNsb3NlU29ja2V0ID8gc29ja2V0IDogbnVsbDsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoY2xvc2VTb2NrZXQpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGNsb3NlU29ja2V0KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzb2NrZXQuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkJCQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCi0KLQlwcm90ZWN0ZWQgU29ja2V0IGdldFNvY2tldCgpIHsKLQkJLy8gV2UgYXJlIHB1dHRpbmcgaXQgb2ZmIGludG8gYSB0aHJlYWQgYmVjYXVzZSB0aGVyZSBhcmUgbm8gdGltZW91dCBjYXBhYmlsaXRpZXMgb24gZ2V0dGluZyBhIHNvY2tldC4KLQkJLy8gU28gd2UgbmVlZCB0byBhbGxvdyBmb3IgdGhhdC4JCQotCQlmaW5hbCBTb2NrZXRbXSBzY0FycmF5ID0gbmV3IFNvY2tldFsxXTsKLQkJZmluYWwgYm9vbGVhbltdIHdhaXRpbmcgPSBuZXcgYm9vbGVhbltdIHt0cnVlfTsJCQotCQlUaHJlYWQgZG9JdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVNvY2tldCBzYyA9IG5ldyBTb2NrZXQoImxvY2FsaG9zdCIsIG1hc3RlcklERVNvY2tldFBvcnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkJaWYgKHdhaXRpbmdbMF0pCi0JCQkJCQkJc2NBcnJheVswXSA9IHNjOwotCQkJCQkJZWxzZQotCQkJCQkJCXNjLmNsb3NlKCk7CS8vIFdlIGFyZSBubyBsb25nZXIgd2FpdGluZyBvbiB0aGlzIHRocmVhZCBzbyBjbG9zZSB0aGUgc29ja2V0IHNpbmNlIG5vIG9uZSB3aWxsIHVzZSBpdC4KLQkJCQkJfQkJCQkJCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlkb0l0LnN0YXJ0KCk7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQl0cnkgewotCQkJCWRvSXQuam9pbig2MDAwMCk7Ci0JCQkJc3luY2hyb25pemVkIChkb0l0KSB7Ci0JCQkJCXdhaXRpbmdbMF0gPSBmYWxzZTsJLy8gVG8gbGV0IGl0IGtub3cgd2UgYXJlIG5vIGxvbmdlciB3YWl0aW5nCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2NBcnJheVswXSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkbid0IHJldHJpZXZlIGEgc29ja2V0IGZyb20gbWFzdGVyIHNlcnZlciBpbiA2MCBzZWNvbmRzLiIpOwkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsJLy8gQ291bGRuJ3QgZ2V0IG9uZSwgcHJvYmFibHkgc2VydmVyIGlzIGRvd24uCi0JCX0KLQkJCQotCQlyZXR1cm4gc2NBcnJheVswXTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IHNodXRkb3duUnVubmFibGVzOwotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWlmIChzaHV0ZG93blJ1bm5hYmxlcyA9PSBudWxsKSB7Ci0JCQlzaHV0ZG93blJ1bm5hYmxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIGlmIChzaHV0ZG93blJ1bm5hYmxlcy5jb250YWlucyhydW5uYWJsZSkpCi0JCQlyZXR1cm47Ci0JCXNodXRkb3duUnVubmFibGVzLmFkZChydW5uYWJsZSk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWlmIChzaHV0ZG93blJ1bm5hYmxlcyAhPSBudWxsKQotCQkJc2h1dGRvd25SdW5uYWJsZXMucmVtb3ZlKHJ1bm5hYmxlKTsKLQl9Ci0KLQotCXB1YmxpYyBJVk1TZXJ2ZXIgZ2V0SVZNU2VydmVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1N0YWNrVHJhY2VVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1N0YWNrVHJhY2VVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZWI2YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9TdGFja1RyYWNlVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogU3RhY2tUcmFjZVV0aWxpdHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLQotaW1wb3J0IGphdmEuaW8uKjsKLS8qKgotICogQSB1dGlsaXR5IHRvIGdldCB0aGUgc3RhY2sgdHJhY2UgZnJvbSBhbiBleGNlcHRpb24KLSAqIGJhY2sgdG8gdGhlIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFN0YWNrVHJhY2VVdGlsaXR5IHsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludFN0YWNrVHJhY2UoVGhyb3dhYmxlIHQpIHsKLQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdC5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHdyaXRlcikpOwotCQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci0JfQotCQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjM0OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idWkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJiZWFuaW5mb3VpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ2M2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2UwNzQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9ndHJhY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlZmlsZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9nbGV2ZWw9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlNDljMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmRlYnVnLmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmRlYnVnLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZHQuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZHQudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbzwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamVtLnByb3h5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkuaWRlPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmFiYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLSNUaHUgSnVuIDE2IDEzOjIyOjA2IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2ZmNjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNXZWQgTWF5IDExIDE2OjIwOjE1IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDhlYzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5jb3JlLkpFTVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWksCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5LAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5wcm94eS5yZW1vdGUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5qZHQudWksCi0gb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS5wcm94eSwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLAotIG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CSUxpc3RFbGVtZW50U29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CSUxpc3RFbGVtZW50U29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNGYyZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQklMaXN0RWxlbWVudFNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0vKgotICogICRSQ1NmaWxlOiBCSUxpc3RFbGVtZW50U29ydGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbmluZm9FbnRyeTsKLQotLyoqCi0gKiBTb3J0ZXIgZm9yIHNvcnRpbmcgQlBCZWFuaW5mb0xpc3RFbGVtZW50cyB3aXRoaW4gdGhlIG1haW4gbGlzdC4KLSAqIAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgQklMaXN0RWxlbWVudFNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCi0JLyoKLQkgKiBAc2VlIFZpZXdlclNvcnRlciNjYXRlZ29yeShPYmplY3QpCi0JICovCi0JcHVibGljIGludCBjYXRlZ29yeShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBCUEJlYW5pbmZvTGlzdEVsZW1lbnQpIHsKLQkJCUJQQmVhbmluZm9MaXN0RWxlbWVudCBlbGVtZW50ID0gKEJQQmVhbmluZm9MaXN0RWxlbWVudCkgb2JqOwotCQkJCi0JCQlzd2l0Y2ggKCgoQmVhbmluZm9FbnRyeSkgZWxlbWVudC5nZXRFbnRyeSgpKS5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgotCQkJCXJldHVybiA0OwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIDE7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOgotCQkJCXJldHVybiAwOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotCQkJCXJldHVybiAzOwotCQkJY2FzZSBCZWFuaW5mb0VudHJ5LkJJRV9QTFVHSU46Ci0JCQkJcmV0dXJuIDU7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCXJldHVybiAyOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jYXRlZ29yeShvYmopOwotCX0KLQotCS8qCi0JICogQHNlZSBWaWV3ZXJTb3J0ZXIjY29tcGFyZSgpCi0JICovCQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0JCi0JCWlmIChjYXQxICE9IGNhdDIpCi0JCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0JCQkKLQkJaWYgKChlMSBpbnN0YW5jZW9mIEJQQmVhbmluZm9MaXN0RWxlbWVudCkgJiYgKGUyIGluc3RhbmNlb2YgQlBCZWFuaW5mb0xpc3RFbGVtZW50KSkgewotCQkJQmVhbmluZm9FbnRyeSBwMSA9IChCZWFuaW5mb0VudHJ5KSAoKEJQQmVhbmluZm9MaXN0RWxlbWVudCkgZTEpLmdldEVudHJ5KCk7Ci0JCQlCZWFuaW5mb0VudHJ5IHAyID0gKEJlYW5pbmZvRW50cnkpICgoQlBCZWFuaW5mb0xpc3RFbGVtZW50KSBlMikuZ2V0RW50cnkoKTsKLQkJCQotCQkJLy8gQ29tcGFyZSBwYXRocwotCQkJcmV0dXJuIHAxLmdldFBhdGgoKS50b1N0cmluZygpLmNvbXBhcmVUbyhwMi5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCX0JCi0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CUEJlYW5pbmZvTGlzdEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JQQmVhbmluZm9MaXN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODJkNWFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JQQmVhbmluZm9MaXN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0vKgotICogICRSQ1NmaWxlOiBCUEJlYW5pbmZvTGlzdEVsZW1lbnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLlNlYXJjaHBhdGhFbnRyeTsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCUEJlYW5pbmZvTGlzdEVsZW1lbnQgZXh0ZW5kcyBCUExpc3RFbGVtZW50IHsKLQotCUJQU2VhcmNoTGlzdEVsZW1lbnRbXSBzZWFyY2hwYXRoczsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQlBCZWFuaW5mb0xpc3RFbGVtZW50LgotCSAqIFRoZSBzZWFyY2hQYXRocyBpcyB0aGUgaW5pdGlhbCBsaXN0LCBpdCBpcyBhc3N1bWVkIHRoYXQKLQkgKiB0aGUgYmVhbmluZm9FbnRyeSBoYXMgdGhlc2Ugc2VhcmNocGF0aHMgaW4gdGhlbSB0b28uCi0JICovCi0JcHVibGljIEJQQmVhbmluZm9MaXN0RWxlbWVudChCZWFuaW5mb0VudHJ5IGVudHJ5LCBCUFNlYXJjaExpc3RFbGVtZW50W10gc2VhcmNocGF0aHMsIGJvb2xlYW4gbWlzc2luZykgewotCQlzdXBlcihlbnRyeSwgbWlzc2luZyk7Ci0JCXRoaXMuc2VhcmNocGF0aHMgPSBzZWFyY2hwYXRocyAhPSBudWxsID8gc2VhcmNocGF0aHMgOiBuZXcgQlBTZWFyY2hMaXN0RWxlbWVudFswXTsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrIHRoZSBlbnRyeSBhcyBleHBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnRlZChib29sZWFuIGV4cG9ydGVkKSB7Ci0JCSgoQmVhbmluZm9FbnRyeSkgZW50cnkpLnNldElzRXhwb3J0ZWQoZXhwb3J0ZWQpOwotCX0KLQotCS8qCi0JICogQHNlZSBCUExpc3RFbGVtZW50I2NhbkV4cG9ydEJlQ2hhbmdlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhwb3J0QmVDaGFuZ2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQlBMaXN0RWxlbWVudCNpc0V4cG9ydGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydGVkKCkgewotCQlyZXR1cm4gKChCZWFuaW5mb0VudHJ5KSBlbnRyeSkuaXNFeHBvcnRlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbGlzdCBvZiBTZWFyY2hwYXRocyBmb3IgdGhpcyBCZWFuaW5mbyBFbGVtZW50LgotCSAqLwotCXB1YmxpYyBCUFNlYXJjaExpc3RFbGVtZW50W10gZ2V0U2VhcmNocGF0aHMoKSB7Ci0JCXJldHVybiBzZWFyY2hwYXRoczsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBuZXcgbGlzdC4gVGhpcyB3aWxsIHVwZGF0ZSB0aGUgYmVhbmluZm8gZW50cnkgdG9vLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlYXJjaHBhdGhzKEJQU2VhcmNoTGlzdEVsZW1lbnRbXSBzZWFyY2hwYXRocykgewotCQl0aGlzLnNlYXJjaHBhdGhzID0gc2VhcmNocGF0aHM7Ci0JCQotCQlTZWFyY2hwYXRoRW50cnlbXSBzcEVudHJpZXMgPSBuZXcgU2VhcmNocGF0aEVudHJ5W3NlYXJjaHBhdGhzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNocGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCUJQU2VhcmNoTGlzdEVsZW1lbnQgYnBzID0gc2VhcmNocGF0aHNbaV07Ci0JCQlzcEVudHJpZXNbaV0gPSAoU2VhcmNocGF0aEVudHJ5KSBicHMuZ2V0RW50cnkoKTsKLQkJfQotCQkKLQkJKChCZWFuaW5mb0VudHJ5KSBlbnRyeSkuc2V0U2VhcmNoUGF0aHMoc3BFbnRyaWVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CUExpc3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CUExpc3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNTYyNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQlBMaXN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0vKgotICogICRSQ1NmaWxlOiBCUExpc3RFbGVtZW50LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9zRG9jRW50cnk7Ci0vKioKLSAqIEEgQmFzZSBMaXN0RWxlbWVudCAoaS5lLiBlbGVtZW50IGluIGEgbGlzdCB2aWV3ZXIpIGZvcgotICogYSBCZWFuSW5mbyBTZWFyY2ggUGF0aCBFbnRyeS4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQlBMaXN0RWxlbWVudCBleHRlbmRzIE9iamVjdCB7Ci0JcHJvdGVjdGVkIElCZWFuaW5mb3NEb2NFbnRyeSBlbnRyeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaXNzaW5nOyAvLyBMaWJyYXJ5L2ZvbGRlci9jbGFzc3BhdGggZW50cnkgZm9yIHRoaXMgZW50cnkgY291bGQgbm90IGJlIGZvdW5kLgotCi0JcHVibGljIEJQTGlzdEVsZW1lbnQoSUJlYW5pbmZvc0RvY0VudHJ5IGVudHJ5LCBib29sZWFuIG1pc3NpbmcpIHsKLQkJdGhpcy5lbnRyeSA9IGVudHJ5OwotCQl0aGlzLm1pc3NpbmcgPSBtaXNzaW5nOwotCX0KLQotCXB1YmxpYyBJQmVhbmluZm9zRG9jRW50cnkgZ2V0RW50cnkoKSB7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01pc3NpbmcoKSB7Ci0JCXJldHVybiBtaXNzaW5nOwotCX0KLQotCS8qKgotCSAqIENlcnRhaW4gZW50cmllcyBjYW5ub3QgaGF2ZSB0aGVpciBleHBvcnQgc3RhdHVzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2FuRXhwb3J0QmVDaGFuZ2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIGVudHJ5IGlzIGV4cG9ydGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRXhwb3J0ZWQoKTsKLQotCS8qKgotCSAqIElmIGV4cG9ydCBjYW4gYmUgY2hhbmdlZCwgY2hhbmdlIGl0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEV4cG9ydGVkKGJvb2xlYW4gZXhwb3J0ZWQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CUFNlYXJjaExpc3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CUFNlYXJjaExpc3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNDMzMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQlBTZWFyY2hMaXN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0vKgotICogICRSQ1NmaWxlOiBCUFNlYXJjaExpc3RFbGVtZW50LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuU2VhcmNocGF0aEVudHJ5OwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEJQU2VhcmNoTGlzdEVsZW1lbnQgZXh0ZW5kcyBCUExpc3RFbGVtZW50IHsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cG9ydGVkOwotCXByb3RlY3RlZCBib29sZWFuIHBhY2thZ2VNaXNzaW5nOwotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCUFNlYXJjaExpc3RFbGVtZW50LgotCSAqIEBwYXJhbSBlbnRyeQotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGluTWlzc2luZwotCSAqLwotCXB1YmxpYyBCUFNlYXJjaExpc3RFbGVtZW50KAotCQlTZWFyY2hwYXRoRW50cnkgZW50cnksCi0JCWJvb2xlYW4gbWlzc2luZywKLQkJYm9vbGVhbiBwYWNrYWdlTWlzc2luZywKLQkJYm9vbGVhbiBleHBvcnRlZCkgewotCQlzdXBlcihlbnRyeSwgbWlzc2luZyk7Ci0KLQkJdGhpcy5wYWNrYWdlTWlzc2luZyA9IHBhY2thZ2VNaXNzaW5nOwotCQl0aGlzLmV4cG9ydGVkID0gZXhwb3J0ZWQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEJQTGlzdEVsZW1lbnQjY2FuRXhwb3J0QmVDaGFuZ2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeHBvcnRCZUNoYW5nZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQlBMaXN0RWxlbWVudCNpc0V4cG9ydGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydGVkKCkgewotCQlyZXR1cm4gZXhwb3J0ZWQ7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlIHBhY2thZ2UgbWlzc2luZy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2VNaXNzaW5nKCkgewotCQlyZXR1cm4gcGFja2FnZU1pc3Npbmc7Ci0JfQotCQotCS8qCi0JICogQHNlZSBCUExpc3RFbGVtZW50I3NldEV4cG9ydGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0ZWQoYm9vbGVhbiBleHBvcnRlZCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQmVhbkluZm9VSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuSW5mb1VJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZTUxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuSW5mb1VJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQmVhbkluZm9VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWkubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQmVhbkluZm9VSU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hQYXRoRGlhbG9nX0Nob29zZVBhY2thZ2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhdGhEaWFsb2dfUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhdGhEaWFsb2dfRGVzY19MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hQYXRoRGlhbG9nX01vZGlmeVNlYXJjaFBhdGhzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhdGhEaWFsb2dfTm90RWRpdGFibGVfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGF0aERpYWxvZ19QYWNrYWdlUHJlc2VudF9JTkZPXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hQYXRoRGlhbG9nX0lucHV0RGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhdGhEaWFsb2dfSW5wdXREaWFsb2dfTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb1BhdGhzQmxvY2tfRXhwb3J0QWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvUGF0aHNCbG9ja19VbmV4cG9ydEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb1BhdGhzQmxvY2tfUGFnZV9UYWJfUGFja2FnZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9QYXRoc0Jsb2NrX1BhZ2VfVGFiX0NsYXNzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX0FkZEZvbGRlcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX0FkZEpBUnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX0FkZEV4dGVybmFsSkFSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvc1dvcmtib29rUGFnZV9BZGRWYXJpYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkUHJvamVjdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX01vZGlmeVBhdGhzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvc1dvcmtib29rUGFnZV9SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX0xpc3RfVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX0NsYXNzZXNfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19KQVJzX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfSkFSc19NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfRXh0SkFSc19UZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfUHJvamVjdHNfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19DbGFzc2VzX1Byb21wdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX1Byb2plY3RzX1Byb21wdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYWNrYWdlc1dvcmtib29rX0Nob29zZVBhY2thZ2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VzV29ya2Jvb2tfQ2hvb3NlRGVmaW5lZFBhdGhzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VzV29ya2Jvb2tfUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VzV29ya2Jvb2tfTGFiZWxUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VzV29ya2Jvb2tfU2VsZWN0aW9uRGlhbG9nX0RlZmluZWRQYXRoc19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYWNrYWdlc1dvcmtib29rX1NlbGVjdGlvbkRpYWxvZ19EZWZpbmVkUGF0aHNfTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbFByb3ZpZGVyX0xpYnJhcnlfRm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsUHJvdmlkZXJfTGlicmFyeV9fUGF0aExhc3RTZWdtZW50X1BhdGhSZWxhdGl2ZV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGFiZWxQcm92aWRlcl9MaWJyYXJ5X19QYXRoTGFzdFNlZ21lbnRfUGF0aEV4Y2VwdExhc3RfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsUHJvdmlkZXJfVmFyaWFibGVfX25hbWVfUGF0aE9TU3RyaW5nXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbFByb3ZpZGVyX19wYWNrYWdlTmFtZV9QYXRoXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrX3ZhcmlhYmxlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfdmFyaWFibGVfYnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXh0ZW5zaW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXh0ZW5zaW9uX2J1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2Z1bGxwYXRoX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXJyb3JfZW50ZXJuYW1lX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2Vycm9yX25hbWVub3RleGlzdHNfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXJyb3JfcGF0aGV4aXN0c19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9pbnZhbGlkZXh0ZW5zaW9uX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrX3dhcm5pbmdfcGF0aG5vdGV4aXN0c19XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrX0V4dEphckRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb19VSV9fZXJyb3J0aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb19VSV9fZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbmluZm9Qcm9wZXJ0aWVzUGFnZV9JTkZPX19ub2phdmFwcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUHJvcGVydGllc1BhZ2VfSU5GT19fY2xvc2VkcHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb1BhdGhzQmxvY2tfVUlfX2VuYWJsZWJlYW5pbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfdXBfYnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9kb3duX2J1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfcmVtb3ZlX2J1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlcmFjaHBhdGhfdGFiX29yZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19XQVJOX19zZWFyY2hwYXRoX21pc3NpbmdfcGF0aF9mb3JtYXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX29wZXJhdGlvbmRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19VSV9fYWRkc2VhcmNocGF0aF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb1BhdGhzQmxvY2tfVUlfX2FkZHNlYXJjaHBhdGhfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbmluZm9QYXRoc0Jsb2NrX1VJX193YXJuaW5nX0VudHJ5TWlzc2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfYWRkX2J1dHRvbjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJlYW5JbmZvVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5pbmZvRW50cnlTZWFyY2hwYXRoRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuaW5mb0VudHJ5U2VhcmNocGF0aERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NmMDBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5pbmZvRW50cnlTZWFyY2hwYXRoRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0vKgotICogICRSQ1NmaWxlOiBCZWFuaW5mb0VudHJ5U2VhcmNocGF0aERpYWxvZy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA1LzEwLzA0IDE3OjU5OjE3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbmluZm9FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5TZWFyY2hwYXRoRW50cnk7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgaXMgdXNlZCB0byBkaXNwbGF5IGFuZCBtb2RpZnkgdGhlIHNlYXJjaCBwYXRoCi0gKiB3aXRoaW4gYSBCZWFuaW5mb0VudHJ5LgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9FbnRyeVNlYXJjaHBhdGhEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBCUEJlYW5pbmZvTGlzdEVsZW1lbnQgaW5mb0VsZW1lbnQ7Ci0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBqUHJvamVjdDsKLQkvL3Byb3RlY3RlZCBMaXN0RGlhbG9nRmllbGQgbGlzdEZpZWxkOwotCQotCXByaXZhdGUgQ29tcG9zaXRlIHRvcDsKLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQlwcml2YXRlIENvbXBvc2l0ZSBidXR0b25zQmFyOwotCXByaXZhdGUgQnV0dG9uIHVwYnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGRvd25CdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gY2hvb3NlUGFja2FnZXNCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgTGlzdCB0YWJsZUVsZW1lbnRzOwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQotCXB1YmxpYyBCZWFuaW5mb0VudHJ5U2VhcmNocGF0aERpYWxvZygKLQkJU2hlbGwgcGFyZW50U2hlbGwsCi0JCUJQQmVhbmluZm9MaXN0RWxlbWVudCBpbmZvRWxlbWVudCwKLQkJSUphdmFQcm9qZWN0IGpQcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQotCQl0aGlzLmluZm9FbGVtZW50ID0gaW5mb0VsZW1lbnQ7Ci0JCXRoaXMualByb2plY3QgPSBqUHJvamVjdDsKLQkJdGhpcy50YWJsZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dCgKLQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUJlYW5JbmZvVUlNZXNzYWdlcy5TZWFyY2hQYXRoRGlhbG9nX01vZGlmeVNlYXJjaFBhdGhzLCAKLQkJCQluZXcgT2JqZWN0W10geyBpbmZvRWxlbWVudC5nZXRFbnRyeSgpLmdldFBhdGgoKS50b1N0cmluZygpfSkpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQl0b3Auc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRvcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKHRvcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5TZWFyY2hQYXRoRGlhbG9nX0Rlc2NfTGFiZWwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJY3JlYXRlVGFibGUoKTsKLQkJY3JlYXRlQnV0dG9uc0JhcigpOwotCi0JCXVwZGF0ZVBhY2thZ2VzTGlzdCgpOwotCQkKLQkJdXBkYXRlQnV0dG9ucygpOwotCi0JCXJldHVybiB0b3A7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGFibGUJCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGUoKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhMSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhKCk7Ci0JCWdyaWREYXRhMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YTEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMS52ZXJ0aWNhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuRklMTDsKLQkJdGFibGUgPSBuZXcgVGFibGUodG9wLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YTEpOwotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQkvL3RhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgQklMaXN0RWxlbWVudFNvcnRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgU2VhcmNoUGF0aExpc3RMYWJlbFByb3ZpZGVyKGpQcm9qZWN0KSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KHRhYmxlRWxlbWVudHMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGJ1dHRvbnNCYXIJCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnV0dG9uc0JhcigpIHsKLQkJUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLQkJcm93TGF5b3V0LnR5cGUgPSBvcmcuZWNsaXBzZS5zd3QuU1dULlZFUlRJQ0FMOwotCQlyb3dMYXlvdXQubWFyZ2luTGVmdCA9IDM7Ci0JCXJvd0xheW91dC5maWxsID0gdHJ1ZTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEyLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEyLnZlcnRpY2FsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YTIuaG9yaXpvbnRhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuQkVHSU5OSU5HOwotCQlidXR0b25zQmFyID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLQkJYnV0dG9uc0Jhci5zZXRMYXlvdXREYXRhKGdyaWREYXRhMik7Ci0JCWJ1dHRvbnNCYXIuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0JCXVwYnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCXVwYnV0dG9uLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF91cF9idXR0b24pOwotCQl1cGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3Qgc2VsZWN0ZWQgPSBCZWFuaW5mb1BhdGhzQmxvY2suZ2V0U2VsZWN0ZWRMaXN0KHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCQlJdGVyYXRvciBzZWxJdHIgPSBzZWxlY3RlZC5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChzZWxJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gc2VsSXRyLm5leHQoKTsKLQkJCQkJaW50IG9sZEluZGV4ID0gdGFibGVFbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpOwotCQkJCQlpZihvbGRJbmRleD4wKXsKLQkJCQkJCXRhYmxlRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQkJdGFibGVFbGVtZW50cy5hZGQoLS1vbGRJbmRleCwgZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlkb3duQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCWRvd25CdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX2Rvd25fYnV0dG9uKTsKLQkJZG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBzZWxlY3RlZCA9IEJlYW5pbmZvUGF0aHNCbG9jay5nZXRTZWxlY3RlZExpc3QodGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCUl0ZXJhdG9yIHNlbEl0ciA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHNlbEl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxJdHIubmV4dCgpOwotCQkJCQlpbnQgb2xkSW5kZXggPSB0YWJsZUVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7Ci0JCQkJCWlmKG9sZEluZGV4PCh0YWJsZUVsZW1lbnRzLnNpemUoKS0xKSl7Ci0JCQkJCQl0YWJsZUVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJCXRhYmxlRWxlbWVudHMuYWRkKCsrb2xkSW5kZXgsIGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJbmV3IExhYmVsKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJY2hvb3NlUGFja2FnZXNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJY2hvb3NlUGFja2FnZXNCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuU2VhcmNoUGF0aERpYWxvZ19DaG9vc2VQYWNrYWdlcyk7Ci0JCWNob29zZVBhY2thZ2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBMaXN0IGVsZW1lbnRzVG9BZGQgPSBjaG9vc2VQYWNrYWdlcygpOwotCQkJCWlmIChlbGVtZW50c1RvQWRkICE9IG51bGwgJiYgIWVsZW1lbnRzVG9BZGQuaXNFbXB0eSgpKSB7Ci0JCQkJCXRhYmxlRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzVG9BZGQpOwotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCXRhYmxlLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnRzVG9BZGQpKTsKLQkJCQkJCX07Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCW5ldyBMYWJlbChidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0JhciwgU1dULk5PTkUpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuU2VhcmNoUGF0aERpYWxvZ19SZW1vdmUpOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3Qgc2VsZWN0ZWQgPSBCZWFuaW5mb1BhdGhzQmxvY2suZ2V0U2VsZWN0ZWRMaXN0KHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCQl0YWJsZUVsZW1lbnRzLnJlbW92ZUFsbChzZWxlY3RlZCk7Ci0JCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2VkKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCWlmKHRvcCE9bnVsbCAmJiAhdG9wLmlzRGlzcG9zZWQoKSl7Ci0JCQl1cGJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQgJiYgY2FuTW92ZVVwKCkpOwotCQkJZG93bkJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQgJiYgY2FuTW92ZURvd24oKSk7Ci0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkICYmICF0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpOwotCQkJY2hvb3NlUGFja2FnZXNCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuTW92ZURvd24oKSB7Ci0JCWludFtdIGluZGM9IHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQkJaW50IGs9IHRhYmxlRWxlbWVudHMuc2l6ZSgpIC0gMTsKLQkJZm9yIChpbnQgaT0gaW5kYy5sZW5ndGggLSAxOyBpID49IDAgOyBpLS0sIGstLSkgewotCQkJaWYgKGluZGNbaV0gIT0gaykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuTW92ZVVwKCkgewotCQlpbnRbXSBpbmRjPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBpbmRjLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaW5kY1tpXSAhPSBpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVQYWNrYWdlc0xpc3QoKSB7Ci0JCWlmIChpbmZvRWxlbWVudC5nZXRFbnRyeSgpLmdldEtpbmQoKSA9PSBCZWFuaW5mb0VudHJ5LkJJRV9QTFVHSU4pIHsKLQkJCS8vIFdlIGRvbid0IGFsbG93IHRoZXNlIHRvIGJlIHVwZGF0ZWQuIFRoZXkgc2hvdWxkIG9ubHkgYmUgdXNlZCB0aHJvdWdoCi0JCQkvLyByZWdpc3RlcmVkIG1lY2hhbmlzbXMgYW5kIHdlIHdvbid0IGJlIHNob3dpbmcgdGhlbSBoZXJlIG5vcm1hbGx5LgotCQkJbGFiZWwuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuU2VhcmNoUGF0aERpYWxvZ19Ob3RFZGl0YWJsZV9JTkZPXyk7IAotCQkJdXBkYXRlRW5hYmxlZFN0YXRlKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQl0YWJsZUVsZW1lbnRzLmNsZWFyKCk7Ci0JCXRhYmxlRWxlbWVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW5mb0VsZW1lbnQuZ2V0U2VhcmNocGF0aHMoKSkpOwotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZShib29sZWFuIGIpIHsKLQkJZW5hYmxlZCA9IGI7Ci0JCWlmKHRvcCE9bnVsbCAmJiAhdG9wLmlzRGlzcG9zZWQoKSl7Ci0JCQlsYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJdGFibGUuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJaWYgKHRhYmxlLmlzRW5hYmxlZCgpKSB7Ci0JCQkvLyBJZiB0aGUgZmllbGQgaXMgbm90IGVuYWJsZWQsIHRoZW4gdGhlcmUgaXMgbm8gdXBkYXRlIHRvIHBlcmZvcm0uIFdlIGRvbid0Ci0JCQkvLyB3YW50IHRvIGFjY2lkZW50aWFsbHkgd2lwZSBvdXQgdGhlIHNlYXJjaCBwYXRocyBpbiB0aGlzIGNhc2UuCi0KLQkJCS8vIE92ZXJyaWRlIHRvIHB1dCB0aGUgbGlzdCBvZiBlbGVtZW50cyBiYWNrIGludG8gdGhlIEJQQmVhbmluZm9MaXN0RWxlbWVudAotCQkJLy8gVW50aWwgdGhlbiB0aGV5IGFyZW4ndCBhY3R1YWxseSB1cGRhdGVkLgotCQkJaW5mb0VsZW1lbnQuc2V0U2VhcmNocGF0aHMoCi0JCQkJKEJQU2VhcmNoTGlzdEVsZW1lbnRbXSkgdGFibGVFbGVtZW50cy50b0FycmF5KG5ldyBCUFNlYXJjaExpc3RFbGVtZW50W3RhYmxlRWxlbWVudHMuc2l6ZSgpXSkpOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIENob29zZSB0aGUgcGFja2FnZXMgdGhhdCBzaG91bGQgYmUgaW4gdGhlIHNlYXJjaCBwYXRoLgotCSAqLwotCXByaXZhdGUgTGlzdCBjaG9vc2VQYWNrYWdlcygpIHsKLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gZ2V0QmVhbmluZm9Sb290cygpOwotCQlMaXN0IG5ld1BhY2thZ2VOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJvb3RzICE9IG51bGwpIHsKLQkJCS8vIEl0J3Mgd2l0aGluIHRoZSB3b3Jrc3BhY2UsIHNvIHdlIGNhbiBnZXQgdGhlIHJvb3RzIGFuZCBwYWNrYWdlcy4KLQkJCUlTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFBhY2thZ2VzV29ya2Jvb2tQYWdlLkNob29zZVBhY2thZ2VzU2VsZWN0aW9uVmFsaWRhdG9yKCk7Ci0KLQkJCS8vIFNob3cgdXAgdG8gdGhlIHBhY2thZ2UgZnJhZ21lbnQsIGRvbid0IHNob3cgYW55IGNvbnRlbnRzIG9mIGl0LgotCQkJQ2xhc3NbXSBhY2NlcHRlZENsYXNzZXMgPSBuZXcgQ2xhc3NbXSB7IElQYWNrYWdlRnJhZ21lbnRSb290LmNsYXNzLCBJUGFja2FnZUZyYWdtZW50LmNsYXNzIH07Ci0JCQlPYmplY3RbXSByZWplY3RlZEZyYWdtZW50cyA9IGdldEZpbHRlcmVkRXhpc3RpbmdFbnRyaWVzKHJvb3RzKTsKLQotCQkJLy8gT25seSBzaG93IHBhY2thZ2UgZnJhZ21lbnRzIHRoYXQgaGF2ZSBjaGlsZHJlbiAoaS5lLiB0aGVyZSBjbGFzc2VzIGluIGl0LCBub3QgaW50ZXJlc3RlZAotCQkJLy8gaW4gaW50ZXJtZWRpYXRlIG9uZXMgdGhhdCBoYXZlIG5vIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGVtLiBUaG9zZSBhcmUgZmlsdGVyZWQgb3V0LgotCQkJVHlwZWRWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFR5cGVkVmlld2VyRmlsdGVyKGFjY2VwdGVkQ2xhc3NlcywgcmVqZWN0ZWRGcmFnbWVudHMpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChzdXBlci5zZWxlY3Qodmlld2VyLCBwYXJlbnRFbGVtZW50LCBlbGVtZW50KSkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQkJCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZXR1cm4gcGtnLmhhc0NoaWxkcmVuKCk7Ci0JCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX07Ci0KLQkJCUlUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFBhY2thZ2VPbmx5Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX0RFRkFVTFQpOwotCQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0KLQkJCQluZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbGFiZWxQcm92aWRlciwgcHJvdmlkZXIpOwotCQkJZGlhbG9nLnNldFRpdGxlKEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX2FkZHNlYXJjaHBhdGhfdGl0bGUpOyAKLQotCQkJZGlhbG9nLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fYWRkc2VhcmNocGF0aF9kZXNjcmlwdGlvbik7IAotCQkJZGlhbG9nLmFkZEZpbHRlcihmaWx0ZXIpOwotCQkJZGlhbG9nLnNldElucHV0KEFycmF5cy5hc0xpc3QoZ2V0QmVhbmluZm9Sb290cygpKSk7Ci0KLQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCU9iamVjdFtdIGVsZW1lbnRzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJbmV3UGFja2FnZU5hbWVzLmFkZCgoKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnRzW2ldKS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdCdzIG5vdCB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCQkJZmluYWwgTGlzdCBleGlzdGluZ1BhY2thZ2VuYW1lcyA9IGdldEZpbHRlcmVkRXhpc3RpbmdFbnRyaWVzKCk7Ci0JCQlJSW5wdXRWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJaWYgKGV4aXN0aW5nUGFja2FnZW5hbWVzLmNvbnRhaW5zKG5ld1RleHQpKQotCQkJCQkJcmV0dXJuIEJlYW5JbmZvVUlNZXNzYWdlcy5TZWFyY2hQYXRoRGlhbG9nX1BhY2thZ2VQcmVzZW50X0lORk9fOyAKLQkJCQkJCQotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKG5ld1RleHQpOwotCQkJCQlyZXR1cm4gc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyA/IG51bGwgOiBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCX0KLQkJCX07Ci0JCQlJbnB1dERpYWxvZyBkaWFsb2cgPSBuZXcgSW5wdXREaWFsb2coZ2V0U2hlbGwoKSwgQmVhbkluZm9VSU1lc3NhZ2VzLlNlYXJjaFBhdGhEaWFsb2dfSW5wdXREaWFsb2dfVGl0bGUsIEJlYW5JbmZvVUlNZXNzYWdlcy5TZWFyY2hQYXRoRGlhbG9nX0lucHV0RGlhbG9nX01lc3NhZ2UsIG51bGwsIHZhbGlkYXRvcik7IAotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQkJCW5ld1BhY2thZ2VOYW1lcy5hZGQoZGlhbG9nLmdldFZhbHVlKCkpOwotCQl9Ci0KLQkJaWYgKG5ld1BhY2thZ2VOYW1lcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUxpc3QgbmV3RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KG5ld1BhY2thZ2VOYW1lcy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1BhY2thZ2VOYW1lcy5zaXplKCk7IGkrKykKLQkJCW5ld0VsZW1lbnRzLmFkZCgKLQkJCQluZXcgQlBTZWFyY2hMaXN0RWxlbWVudChuZXcgU2VhcmNocGF0aEVudHJ5KChTdHJpbmcpIG5ld1BhY2thZ2VOYW1lcy5nZXQoaSkpLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7Ci0JCXJldHVybiBuZXdFbGVtZW50czsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlZnJhZ21lbnQgcm9vdHMgZm9yIHRoZSBnaXZlbiBiZWFuaW5mbyBlbnRyeS4KLQkgKiBSZXR1cm4gbnVsbCBpZiBpdCBjYW4gYmUgaGFuZGxlZCAoaS5lLiBub3QgaW4gYSBwcm9qZWN0IHNvbWUgd2hlcmUpLgotCSAqLwotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGdldEJlYW5pbmZvUm9vdHMoKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBudWxsOwotCQlpZiAoaW5mb0VsZW1lbnQuZ2V0RW50cnkoKS5nZXRLaW5kKCkgIT0gQmVhbmluZm9FbnRyeS5CSUVfUExVR0lOKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWQgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KCgoQmVhbmluZm9FbnRyeSkgaW5mb0VsZW1lbnQuZ2V0RW50cnkoKSkuZ2V0Q2xhc3NwYXRoRW50cnkoKSk7Ci0JCQlJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHJlc29sdmVkLmdldFBhdGgoKSk7Ci0JCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCS8vIEl0IGlzIGEgcHJvamVjdCBpdHNlbGYuCi0JCQkJCUlKYXZhUHJvamVjdCBqcCA9IChJSmF2YVByb2plY3QpIEphdmFDb3JlLmNyZWF0ZShyZXMpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKGpwICE9IG51bGwpCi0JCQkJCQkJcm9vdHMgPSBqcC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOyAvLyBBbGwgb2YgdGhlIHJvb3RzIGluIHRoZSBwcm9qZWN0IGFyZSBhcHBsaWNhYmxlLgotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gSXQgaXMgd2l0aGluIGFub3RoZXIgcHJvamVjdAotCQkJCQlJUHJvamVjdCBjb250YWluaW5nUHJvamVjdCA9IHJlcy5nZXRQcm9qZWN0KCk7Ci0JCQkJCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShjb250YWluaW5nUHJvamVjdCk7Ci0JCQkJCWlmIChqcCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBUaGUgcm9vdHMgaWYgdGhpcyBpcyBpbiB0aGUgY2xhc3NwYXRoIG9mIHRoaXMgcHJvamVjdAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0ganAuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QocmVzb2x2ZWQuZ2V0UGF0aCgpKTsKLQkJCQkJCQlpZiAocm9vdCAhPSBudWxsKQotCQkJCQkJCQlyb290cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHsgcm9vdCB9OwotCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGVudHJpZXMgdGhhdCBhbHJlYWR5IGFyZSBpbiB0aGUgc2VhcmNoIHBhdGgKLQkgKiBzbyB0aGF0IHRoZXkgZG9uJ3Qgc2hvdyB1cCBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RmlsdGVyZWRFeGlzdGluZ0VudHJpZXMoSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cykgewotCQlMaXN0IGVudHJpZXMgPSB0YWJsZUVsZW1lbnRzOwotCQlMaXN0IGZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3QoZW50cmllcy5zaXplKCkpOwotCQlJdGVyYXRvciBpdHIgPSBlbnRyaWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlCUFNlYXJjaExpc3RFbGVtZW50IGVsZW0gPSAoQlBTZWFyY2hMaXN0RWxlbWVudCkgaXRyLm5leHQoKTsKLQkJCWZyYWdtZW50cy5hZGRBbGwoZ2V0UGFja2FnZXMoZWxlbSwgcm9vdHMpKTsKLQkJfQotCQlyZXR1cm4gZnJhZ21lbnRzLnRvQXJyYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGVudHJpZXMgdGhhdCBhbHJlYWR5IGFyZSBpbiB0aGUgc2VhcmNoIHBhdGgKLQkgKiBzbyB0aGF0IHRoZXkgZG9uJ3Qgc2hvdyB1cCBpbiB0aGUgbGlzdC4gVGhpcyBvbmUgaXMganVzdCB0aGUgcGFja2FnZSBuYW1lcy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRGaWx0ZXJlZEV4aXN0aW5nRW50cmllcygpIHsKLQkJTGlzdCBlbnRyaWVzID0gdGFibGVFbGVtZW50czsKLQkJTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoZW50cmllcy5zaXplKCkpOwotCQlJdGVyYXRvciBpdHIgPSBlbnRyaWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlCUFNlYXJjaExpc3RFbGVtZW50IGVsZW0gPSAoQlBTZWFyY2hMaXN0RWxlbWVudCkgaXRyLm5leHQoKTsKLQkJCW5hbWVzLmFkZCgoKFNlYXJjaHBhdGhFbnRyeSkgZWxlbS5nZXRFbnRyeSgpKS5nZXRQYWNrYWdlKCkpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQYWNrYWdlcyhCUFNlYXJjaExpc3RFbGVtZW50IGVsZW1lbnQsIElQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gKChTZWFyY2hwYXRoRW50cnkpIGVsZW1lbnQuZ2V0RW50cnkoKSkuZ2V0UGFja2FnZSgpOwotCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCXRyeSB7Ci0JCQlMaXN0IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgxMCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUphdmFFbGVtZW50W10gcGZzID0gcm9vdHNbaV0uZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBmcy5sZW5ndGg7IGorKykKLQkJCQkJaWYgKHBmc1tqXS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UCi0JCQkJCQkmJiBwZnNbal0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpKSB7Ci0JCQkJCQlwYWNrYWdlcy5hZGQocGZzW2pdKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcGFja2FnZXM7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQmVhbmluZm9QYXRoc0Jsb2NrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuaW5mb1BhdGhzQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3OWE1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuaW5mb1BhdGhzQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBCZWFuaW5mb1BhdGhzQmxvY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTYgJCAgJERhdGU6IDIwMDUvMTAvMDMgMjM6MDY6NDIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLmNvcmUuSkVNVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBCZWFuaW5mb1BhdGhzQmxvY2sgewotCi0JLy9wcml2YXRlIFNoZWxsIHNTaGVsbDEgPSBudWxsOyAgLy8gIEBqdmU6ZGVjbC1pbmRleD0wOnZpc3VhbC1jb25zdHJhaW50PSI0MCwxOSIKLQlwcml2YXRlIENvbXBvc2l0ZSB0b3AgPSBudWxsOwotCXByaXZhdGUgVGFiRm9sZGVyIHRhYkZvbGRlciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZW5hYmxlQmVhbmluZm9DaGVja2JveCA9IG51bGw7Ci0JcHJpdmF0ZSBQYWNrYWdlc1dvcmtib29rUGFnZSBwYWNrYWdlc1dvcmtib29rUGFnZTIgPSBudWxsOwotCXByaXZhdGUgU2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlIHNlYXJjaHBhdGhPcmRlcmluZ1dvcmtib29rUGFnZTIgPSBudWxsOwotCXByaXZhdGUgQmVhbmluZm9zV29ya2Jvb2tQYWdlIGJlYW5pbmZvc1Byb3BlcnR5UGFnZTIgPSBudWxsOwotCXByaXZhdGUgQ29udHJvbCBwYWNrYWdlc1BhZ2VDb250cm9sID0gbnVsbDsKLQlwcml2YXRlIENvbnRyb2wgc2VhcmNocGF0aFBhZ2VDb250cm9sID0gbnVsbDsKLQlwcml2YXRlIENvbnRyb2wgYmVhbmluZm9zUGFnZUNvbnRyb2wgPSBudWxsOwotCXByaXZhdGUgSW1hZ2UgcGFja2FnZXNUYWJJbWFnZTsKLQlwcml2YXRlIEltYWdlIGJlYW5pbmZvc1RhYkltYWdlOwotCXByaXZhdGUgSW1hZ2Ugc2VhcmNoUGF0aFRhYkltYWdlOwotCS8vIC4uLnVpCi0JCi0JcHJpdmF0ZSBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290OwotCXByaXZhdGUgSVN0YXR1c0NoYW5nZUxpc3RlbmVyIHN0YXR1c0NoYW5nZUxpc3RlbmVyOwotCXByaXZhdGUgSUJ1aWxkU2VhcmNoUGFnZSBjdXJyZW50UGFnZTsKLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlQmVhbmluZm8gPSB0cnVlOwotCQotCXB1YmxpYyBCZWFuaW5mb1BhdGhzQmxvY2soSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCwgSVN0YXR1c0NoYW5nZUxpc3RlbmVyIHN0YXR1c0NoYW5nZUxpc3RlbmVyKXsKLQkJdGhpcy53b3Jrc3BhY2VSb290ID0gd29ya3NwYWNlUm9vdDsKLQkJdGhpcy5zdGF0dXNDaGFuZ2VMaXN0ZW5lciA9IHN0YXR1c0NoYW5nZUxpc3RlbmVyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RW5hYmxlQmVhbmluZm8oYm9vbGVhbiBlbmFibGUpewotCQllbmFibGVCZWFuaW5mbyA9IGVuYWJsZTsKLQkJaWYoZW5hYmxlQmVhbmluZm9DaGVja2JveCE9bnVsbCAmJiAhZW5hYmxlQmVhbmluZm9DaGVja2JveC5pc0Rpc3Bvc2VkKCkpCi0JCQllbmFibGVCZWFuaW5mb0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGUpOwotCX0KLQkKLS8vCS8qKgotLy8JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgc1NoZWxsMQkKLS8vCSAqCi0vLwkgKi8KLS8vCXByaXZhdGUgdm9pZCBjcmVhdGVTU2hlbGwxKCkgewotLy8JCXNTaGVsbDEgPSBuZXcgU2hlbGwoKTsKLS8vCQlzU2hlbGwxLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLS8vCQljcmVhdGVUb3AoKTsKLS8vCQlzU2hlbGwxLnNldFNpemUobmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCg0MDMsMjg5KSk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0b3AJCi0JICoKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdG9wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJdG9wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY3JlYXRlVGFiRm9sZGVyKCk7Ci0JCWVuYWJsZUJlYW5pbmZvQ2hlY2tib3ggPSBuZXcgQnV0dG9uKHRvcCwgU1dULkNIRUNLKTsKLQkJZW5hYmxlQmVhbmluZm9DaGVja2JveC5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX2VuYWJsZWJlYW5pbmZvKTsKLQkJZW5hYmxlQmVhbmluZm9DaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZUJlYW5pbmZvID0gZW5hYmxlQmVhbmluZm9DaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlwYWNrYWdlc1dvcmtib29rUGFnZTIuc2V0QmVhbmluZm9FbmFibGVkKGVuYWJsZUJlYW5pbmZvKTsKLQkJCQliZWFuaW5mb3NQcm9wZXJ0eVBhZ2UyLnNldEJlYW5pbmZvRW5hYmxlZChlbmFibGVCZWFuaW5mbyk7Ci0JCQkJc2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlMi5zZXRCZWFuaW5mb0VuYWJsZWQoZW5hYmxlQmVhbmluZm8pOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJZW5hYmxlQmVhbmluZm9DaGVja2JveC5zZXRTZWxlY3Rpb24oZW5hYmxlQmVhbmluZm8pOwotCQlpZihqYXZhUHJvamVjdCE9bnVsbCl7Ci0JCQlnZXRQYWNrYWdlc1BhZ2UoKS5pbml0KGphdmFQcm9qZWN0KTsKLQkJCWdldEJlYW5pbmZvc1BhZ2UoKS5pbml0KGphdmFQcm9qZWN0KTsKLQkJCWdldFNlYXJjaHBhdGhPcmRlcmluZ1BhZ2UoKS5pbml0KGphdmFQcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gdG9wOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRhYkZvbGRlcgkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJGb2xkZXIoKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIodG9wLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY3JlYXRlUGFja2FnZXNXb3JrYm9va1BhZ2UyKCk7Ci0JCWNyZWF0ZUJlYW5pbmZvc1Byb3BlcnR5UGFnZTIoKTsKLQkJY3JlYXRlU2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlMigpOwotCQl0YWJGb2xkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRhYkNoYW5nZWQoZS5pdGVtKTsKLQkJCX0KLQkJfSk7Ci0JCQkJCi0JCVRhYkl0ZW0gdGFiSXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQl0YWJJdGVtLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5JbmZvUGF0aHNCbG9ja19QYWdlX1RhYl9QYWNrYWdlcyk7Ci0JCXRhYkl0ZW0uc2V0SW1hZ2UoZ2V0UGFja2FnZXNUYWJJbWFnZSgpKTsKLQkJdGFiSXRlbS5zZXRDb250cm9sKHBhY2thZ2VzUGFnZUNvbnRyb2wpOwotCQlUYWJJdGVtIHRhYkl0ZW0xID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCXRhYkl0ZW0xLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5JbmZvUGF0aHNCbG9ja19QYWdlX1RhYl9DbGFzc2VzKTsKLQkJdGFiSXRlbTEuc2V0SW1hZ2UoZ2V0QmVhbmluZm9zVGFiSW1hZ2UoKSk7Ci0JCXRhYkl0ZW0xLnNldENvbnRyb2woYmVhbmluZm9zUGFnZUNvbnRyb2wpOwotCQlUYWJJdGVtIHRhYkl0ZW0yID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCXRhYkl0ZW0yLnNldEltYWdlKGdldFNlYXJjaFBhdGhUYWJJbWFnZSgpKTsKLQkJdGFiSXRlbTIuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZXJhY2hwYXRoX3RhYl9vcmRlcik7Ci0JCXRhYkl0ZW0yLnNldENvbnRyb2woc2VhcmNocGF0aFBhZ2VDb250cm9sKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigyKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldFNlYXJjaFBhdGhUYWJJbWFnZSgpIHsKLQkJaWYoc2VhcmNoUGF0aFRhYkltYWdlPT1udWxsKQotCQkJc2VhcmNoUGF0aFRhYkltYWdlID0gSkVNVUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgImljb25zL2NwX29yZGVyX29iai5naWYiKS5jcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gc2VhcmNoUGF0aFRhYkltYWdlOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgZ2V0UGFja2FnZXNUYWJJbWFnZSgpIHsKLQkJaWYocGFja2FnZXNUYWJJbWFnZT09bnVsbCkKLQkJCXBhY2thZ2VzVGFiSW1hZ2UgPSBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19QQUNLQUdFKTsKLQkJcmV0dXJuIHBhY2thZ2VzVGFiSW1hZ2U7Ci0JfQotCQotCXByaXZhdGUgSW1hZ2UgZ2V0QmVhbmluZm9zVGFiSW1hZ2UoKXsKLQkJaWYoYmVhbmluZm9zVGFiSW1hZ2U9PW51bGwpewotCQkJVVJMIGltYWdlVVJMID0gUGxhdGZvcm0uZmluZChKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKSwgbmV3IFBhdGgoImljb25zL2phdmFiZWFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGltYWdlVVJMICE9IG51bGwpIAotCQkJCWJlYW5pbmZvc1RhYkltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpLmNyZWF0ZUltYWdlKCk7Ci0JCQllbHNlCi0JCQkJYmVhbmluZm9zVGFiSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIGJlYW5pbmZvc1RhYkltYWdlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHBhY2thZ2VzV29ya2Jvb2tQYWdlMgkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQYWNrYWdlc1dvcmtib29rUGFnZTIoKSB7Ci0JCXBhY2thZ2VzUGFnZUNvbnRyb2wgPSBnZXRQYWNrYWdlc1BhZ2UoKS5jcmVhdGVDb250cm9sKHRhYkZvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgc2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlMgkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UyKCkgewotCQlzZWFyY2hwYXRoUGFnZUNvbnRyb2wgPSBnZXRTZWFyY2hwYXRoT3JkZXJpbmdQYWdlKCkuY3JlYXRlQ29udHJvbCh0YWJGb2xkZXIpOwotCQlzZWFyY2hwYXRoUGFnZUNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlpZihzZWFyY2hQYXRoVGFiSW1hZ2UhPW51bGwpewotCQkJCQlpZighc2VhcmNoUGF0aFRhYkltYWdlLmlzRGlzcG9zZWQoKSkKLQkJCQkJCXNlYXJjaFBhdGhUYWJJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCXNlYXJjaFBhdGhUYWJJbWFnZT1udWxsOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgYmVhbmluZm9zUHJvcGVydHlQYWdlMgkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCZWFuaW5mb3NQcm9wZXJ0eVBhZ2UyKCkgewotCQliZWFuaW5mb3NQYWdlQ29udHJvbCA9IGdldEJlYW5pbmZvc1BhZ2UoKS5jcmVhdGVDb250cm9sKHRhYkZvbGRlcik7Ci0JCWJlYW5pbmZvc1BhZ2VDb250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJaWYoYmVhbmluZm9zVGFiSW1hZ2UhPW51bGwpewotCQkJCQlpZighYmVhbmluZm9zVGFiSW1hZ2UuaXNEaXNwb3NlZCgpKQotCQkJCQkJYmVhbmluZm9zVGFiSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQliZWFuaW5mb3NUYWJJbWFnZT1udWxsOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JUGFja2FnZXNXb3JrYm9va1BhZ2UgZ2V0UGFja2FnZXNQYWdlKCl7Ci0JCWlmKHBhY2thZ2VzV29ya2Jvb2tQYWdlMj09bnVsbCkKLQkJCXBhY2thZ2VzV29ya2Jvb2tQYWdlMiA9IG5ldyBQYWNrYWdlc1dvcmtib29rUGFnZSh3b3Jrc3BhY2VSb290LCB0aGlzKTsKLQkJcmV0dXJuIHBhY2thZ2VzV29ya2Jvb2tQYWdlMjsKLQl9Ci0JCi0JQmVhbmluZm9zV29ya2Jvb2tQYWdlIGdldEJlYW5pbmZvc1BhZ2UoKXsKLQkJaWYoYmVhbmluZm9zUHJvcGVydHlQYWdlMj09bnVsbCkKLQkJCWJlYW5pbmZvc1Byb3BlcnR5UGFnZTIgPSBuZXcgQmVhbmluZm9zV29ya2Jvb2tQYWdlKHdvcmtzcGFjZVJvb3QsIHRoaXMpOwotCQlyZXR1cm4gYmVhbmluZm9zUHJvcGVydHlQYWdlMjsKLQl9Ci0JCi0JU2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlIGdldFNlYXJjaHBhdGhPcmRlcmluZ1BhZ2UoKXsKLQkJaWYoc2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlMj09bnVsbCkKLQkJCXNlYXJjaHBhdGhPcmRlcmluZ1dvcmtib29rUGFnZTIgPSBuZXcgU2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlKHRoaXMpOwotCQlyZXR1cm4gc2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlMjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRhYkNoYW5nZWQoV2lkZ2V0IHdpZGdldCkgewotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGFiSXRlbSkgewotCQkJSUJ1aWxkU2VhcmNoUGFnZSBuZXdQYWdlID0gKElCdWlsZFNlYXJjaFBhZ2UpICgoVGFiSXRlbSkgd2lkZ2V0KS5nZXREYXRhKCk7Ci0JCQlpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkgewotCQkJCUxpc3Qgc2VsZWN0aW9uID0gY3VycmVudFBhZ2UuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCW5ld1BhZ2Uuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJY3VycmVudFBhZ2UgPSBuZXdQYWdlOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgcnVubmFibGUgdGhhdCBzZXRzIHRoZSBjb25maWd1cmVkIGJ1aWxkIHBhdGhzLgotCSAqLwotCXB1YmxpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0UnVubmFibGUoKSB7Ci0JCWZpbmFsIGJvb2xlYW4gd2FudE5hdHVyZSA9IGVuYWJsZUJlYW5pbmZvOwotCQlmaW5hbCBMaXN0IHNlYXJjaFBhdGhFbnRyaWVzID0gd2FudE5hdHVyZSA/IGdldFNlYXJjaHBhdGhPcmRlcmluZ1BhZ2UoKS5nZXRFbGVtZW50cygpIDogbnVsbDsKLQotCQlyZXR1cm4gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJCX0KLQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9vcGVyYXRpb25kZXNjcmlwdGlvbiwgCi0JCQkJCTEwKTsKLQkJCQl0cnkgewotCQkJCQlzZXRCZWFuaW5mb1NlYXJjaHBhdGgod2FudE5hdHVyZSwgc2VhcmNoUGF0aEVudHJpZXMsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEJlYW5pbmZvU2VhcmNocGF0aCgKLQkJCWJvb2xlYW4gd2FudE5hdHVyZSwKLQkJCUxpc3Qgc2VhcmNoUGF0aEVudHJpZXMsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHdhbnROYXR1cmUpIHsKLQkJCS8vIGNyZWF0ZSBiZWFuaW5mbyBuYXR1cmUKLQkJCWlmICghamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmhhc05hdHVyZShCZWFuaW5mb05hdHVyZS5OQVRVUkVfSUQpKSB7Ci0JCQkJYWRkTmF0dXJlSURUb1Byb2plY3QoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLCBCZWFuaW5mb05hdHVyZS5OQVRVUkVfSUQsIG1vbml0b3IpOwotCQkJfQotCi0JCQlCZWFuaW5mb05hdHVyZSBuYXR1cmUgPSBCZWFuaW5mb05hdHVyZS5nZXRSdW50aW1lKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQkvLyBOb3cgYnVpbGQvc2V0IHRoZSBzZWFyY2ggcGF0aC4KLQkJCWlmIChzZWFyY2hQYXRoRW50cmllcy5zaXplKCkgPiAwKSB7Ci0JCQkJSUJlYW5pbmZvc0RvY0VudHJ5W10gc3BhcnJheSA9IG5ldyBJQmVhbmluZm9zRG9jRW50cnlbc2VhcmNoUGF0aEVudHJpZXMuc2l6ZSgpXTsKLQkJCQlJdGVyYXRvciBpdHIgPSBzZWFyY2hQYXRoRW50cmllcy5pdGVyYXRvcigpOwotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQlCUExpc3RFbGVtZW50IGVsZW0gPSAoQlBMaXN0RWxlbWVudCkgaXRyLm5leHQoKTsKLQkJCQkJc3BhcnJheVtpKytdID0gZWxlbS5nZXRFbnRyeSgpOwotCQkJCX0KLQkJCQluYXR1cmUuc2V0U2VhcmNoUGF0aChuZXcgQmVhbmluZm9zRG9jKHNwYXJyYXkpLCBtb25pdG9yKTsKLQkJCX0gZWxzZQotCQkJCW5hdHVyZS5zZXRTZWFyY2hQYXRoKG51bGwsIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJLy8gUmVtb3ZlIHRoZSBuYXR1cmUsIG5vIGxvbmdlciB3YW50ZWQuCi0JCQlyZW1vdmVOYXR1cmVJREZyb21Qcm9qZWN0KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgQmVhbmluZm9OYXR1cmUuTkFUVVJFX0lELCBtb25pdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjbGFzc3BhdGggZm9yIHRoZSBnaXZlbiBwcm9qZWN0LiBNdWx0aXBsZSBjYWxscyB0byBpbml0IGFyZSBhbGxvd2VkLAotCSAqIGJ1dCBhbGwgZXhpc3Rpbmcgc2V0dGluZ3Mgd2lsbCBiZSBjbGVhcmVkIGFuZCByZXBsYWNlIGJ5IHRoZSBnaXZlbiBvciBkZWZhdWx0IHBhdGhzLgotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBqYXZhIHByb2plY3QgdG8gY29uZmlndXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUphdmFQcm9qZWN0IGpwcm9qZWN0KSB7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBqcHJvamVjdDsKLQkJLy9UT0RPOiBsYWJlbFByb3ZpZGVyLnNldEphdmFQcm9qZWN0KGpwcm9qZWN0KTsKLQotCQl0cnkgewotCQkJLy8gSWYgd2UgaGF2ZSBhIGNvbmZpZyBmaWxlLCB3ZSB3aWxsIGFzc3VtZSB3ZSBoYXZlIGEgbmF0dXJlLiBJdCB3aWxsIGFkZCBpdCBhdXRvbWF0aWNhbGx5Ci0JCQkvLyB3aGVuIHdlIGFzayBmb3IgdGhlIGluZm9ybWF0aW9uLiBFdmVuIGlmIHdlIGRpZG4ndCBoYXZlIHRoZSBuYXR1cmUsIGFzIHNvb24gYXMgc29tZW9uZQotCQkJLy8gYXNrcyBmb3IgaXQsIHdlIHdvdWxkIGNyZWF0ZSBpdCBhbnlob3csIGFuZCBpdCB3b3VsZCB1c2UgdGhlIGV4aXN0aW5nIGNvbmZpZyBmaWxlLgotCQkJLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNvbmZpZyBmaWxlLCB3ZSBjb3VsZCBoYXZlIHRoZSBuYXR1cmUsIHNvIHdlIHdpbGwgY2hlY2sgZm9yIHRoYXQgdG9vLgotCQkJYm9vbGVhbiBoYXZlQ29uZmlnRmlsZSA9IGpwcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKEJlYW5pbmZvTmF0dXJlLlBfQkVBTklORk9fU0VBUkNIX1BBVEgpLmV4aXN0cygpOwotCQkJYm9vbGVhbiBoYXZlTmF0dXJlID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmhhc05hdHVyZShCZWFuaW5mb05hdHVyZS5OQVRVUkVfSUQpOwotCQkJZW5hYmxlQmVhbmluZm8gPSBoYXZlQ29uZmlnRmlsZSB8fCBoYXZlTmF0dXJlOwotCQkJaWYgKGhhdmVOYXR1cmUgfHwgaGF2ZUNvbmZpZ0ZpbGUpIHsKLQkJCQlCZWFuaW5mb3NEb2MgZG9jID0gQmVhbmluZm9OYXR1cmUuZ2V0UnVudGltZShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpLmdldFNlYXJjaFBhdGgoKTsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSByYXcgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQotCQkJCUxpc3QgbmV3U2VhcmNocGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQkJSUJlYW5pbmZvc0RvY0VudHJ5W10gc3AgPSBkb2MuZ2V0U2VhcmNocGF0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNwLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJQmVhbmluZm9zRG9jRW50cnkgY3VyciA9IHNwW2ldOwotCQkJCQkJYm9vbGVhbiBpc01pc3NpbmcgPSBmYWxzZTsKLQkJCQkJCUJQTGlzdEVsZW1lbnQgZWxlbSA9IG51bGw7Ci0JCQkJCQlpZiAoY3VyciBpbnN0YW5jZW9mIEJlYW5pbmZvRW50cnkpIHsKLQkJCQkJCQlCZWFuaW5mb0VudHJ5IGJlID0gKEJlYW5pbmZvRW50cnkpIGN1cnI7Ci0KLQkJCQkJCQkvLyBnZXQgdGhlIHJlc291cmNlLCB0aGlzIHRlbGxzIGlmIHRoZSBiZWFuaW5mb3MgZXhpc3Qgb3Igbm90LgotCQkJCQkJCU9iamVjdFtdIHBhdGhzID0gYmUuZ2V0Q2xhc3NwYXRoKGphdmFQcm9qZWN0KTsKLQkJCQkJCQlpZiAocGF0aHMgIT0gbnVsbCAmJiBwYXRocy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCWZvciAoaW50IGogPSAwOyAhaXNNaXNzaW5nICYmIGogPCBwYXRocy5sZW5ndGg7IGorKykgewotCQkJCQkJCQkJT2JqZWN0IHBhdGggPSBwYXRoc1tqXTsKLQkJCQkJCQkJCWlmIChwYXRoIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJCQkJCQkJaXNNaXNzaW5nID0gISgoSVByb2plY3QpIHBhdGgpLmV4aXN0cygpOwotCQkJCQkJCQkJZWxzZSBpZiAocGF0aCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQkJCQkJCUZpbGUgZiA9IG5ldyBGaWxlKChTdHJpbmcpIHBhdGgpOwotCQkJCQkJCQkJCWlzTWlzc2luZyA9ICFmLmV4aXN0cygpOwotCQkJCQkJCQkJfSBlbHNlIGlmIChwYXRoIGluc3RhbmNlb2YgSVBhdGgpIHsKLQkJCQkJCQkJCQlpc01pc3NpbmcgPSB0cnVlOwkvLyBQbHVnaW5zIGFyZSBpbnZhbGlkIGluIEJlYW5pbmZvQ29uZmlnLiBUaGV5IG9ubHkgYXBwbHkgd2l0aGluIGNvbnRyaWJ1dGlvbnMuCi0JCQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJCQlpc01pc3NpbmcgPSB0cnVlOyAvLyBJbnZhbGlkLCBzbyBpc01pc3NpbmcuCi0JCQkJCQkJCX0JCQkJCQkJCQotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQlpc01pc3NpbmcgPSB0cnVlOwotCi0JCQkJCQkJZWxlbSA9IG5ldyBCUEJlYW5pbmZvTGlzdEVsZW1lbnQoYmUsIGdldEluaXRpYWxTZWFyY2hwYXRocyhiZSksIGlzTWlzc2luZyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIFNlYXJjaHBhdGggZW50cnksIHNlZSBpZiB3ZSBjYW4gZmluZCB0aGUgcmF3IGNsYXNzcGF0aCBlbnRyeSB0aGF0IGl0IGlzIGZvci4KLQkJCQkJCQlib29sZWFuIGlzRXhwb3J0ZWQgPSBmYWxzZTsKLQkJCQkJCQlib29sZWFuIGlzUGFja2FnZU1pc3NpbmcgPSB0cnVlOwotCQkJCQkJCWlzTWlzc2luZyA9IHRydWU7CS8vIEluaXRpYWxseSBtaXNzaW5nIHVudGlsIHdlIGZpbmQgaXQuCi0JCQkJCQkJU2VhcmNocGF0aEVudHJ5IGNlID0gKFNlYXJjaHBhdGhFbnRyeSkgY3VycjsKLQkJCQkJCQlpbnQga2luZCA9IGNlLmdldEtpbmQoKTsKLQkJCQkJCQlJUGF0aCBwYXRoID0gY2UuZ2V0UGF0aCgpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmF3Lmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCWlmIChyYXdbal0uZ2V0RW50cnlLaW5kKCkgPT0ga2luZCAmJiByYXdbal0uZ2V0UGF0aCgpLmVxdWFscyhwYXRoKSkgewotCQkJCQkJCQkJaXNNaXNzaW5nID0gZmFsc2U7Ci0JCQkJCQkJCQlpc0V4cG9ydGVkID0gcmF3W2pdLmlzRXhwb3J0ZWQoKSB8fCByYXdbal0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U7Ci0JCQkJCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBjZS5nZXRQYWNrYWdlKCk7Ci0JCQkJCQkJCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqYXZhUHJvamVjdC5maW5kUGFja2FnZUZyYWdtZW50Um9vdHMocmF3W2pdKTsKLQkJCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHJvb3RzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IGlyb290ID0gcm9vdHNba107Ci0JCQkJCQkJCQkJCWlmIChpcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQkJCQlpc1BhY2thZ2VNaXNzaW5nID0gZmFsc2U7Ci0JCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gZWxzZQotCQkJCQkJCQkJCWlzUGFja2FnZU1pc3NpbmcgPSBmYWxzZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsZW0gPSBuZXcgQlBTZWFyY2hMaXN0RWxlbWVudChjZSwgaXNNaXNzaW5nLCBpc1BhY2thZ2VNaXNzaW5nLCBpc0V4cG9ydGVkKTsKLQkJCQkJCX0KLQotCQkJCQkJbmV3U2VhcmNocGF0aC5hZGQoZWxlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBpbml0cyB0aGUgZGlhbG9nIGZpZWxkCi0JCQkJc2V0U2VhcmNoT3JkZXJFbGVtZW50cyhuZXdTZWFyY2hwYXRoKTsKLQotCQkJCWlmIChnZXRQYWNrYWdlc1BhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJCWdldFBhY2thZ2VzUGFnZSgpLmluaXQoamF2YVByb2plY3QpOwotCQkJCQlnZXRCZWFuaW5mb3NQYWdlKCkuaW5pdChqYXZhUHJvamVjdCk7Ci0JCQkJCWdldFNlYXJjaHBhdGhPcmRlcmluZ1BhZ2UoKS5pbml0KGphdmFQcm9qZWN0KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIE5vIG5hdHVyZSwgZGlzYWJsZSwKLQkJCQlzZXRFbmFibGVCZWFuaW5mbyhmYWxzZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRFbmFibGVCZWFuaW5mbyhmYWxzZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc2V0RW5hYmxlQmVhbmluZm8oZmFsc2UpOwotCQl9Ci0KLS8vCQlsaXN0ZW5Gb3JDbGFzc3BhdGhDaGFuZ2UoKTsKLQkJZG9TdGF0dXNMaW5lVXBkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5hdHVyZSB0byBhIHByb2plY3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTmF0dXJlSURUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXSA9IG5hdHVyZUlkOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVOYXR1cmVJREZyb21Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCWludCBpbmR4ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJldk5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwcmV2TmF0dXJlc1tpXS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJaW5keCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZHggPT0gLTEpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoIC0gMV07Ci0JCWlmIChuZXdOYXR1cmVzLmxlbmd0aCAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBpbmR4KTsKLQkJCWlmIChpbmR4IDwgbmV3TmF0dXJlcy5sZW5ndGgpCi0JCQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgaW5keCArIDEsIG5ld05hdHVyZXMsIGluZHgsIG5ld05hdHVyZXMubGVuZ3RoIC0gaW5keCk7Ci0JCX0KLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKLQl9Ci0JCi0Jdm9pZCBkb1N0YXR1c0xpbmVVcGRhdGUoKSB7Ci0JCXN0YXR1c0NoYW5nZUxpc3RlbmVyLnN0YXR1c0NoYW5nZWQoZ2V0U2VhcmNocGF0aE9yZGVyaW5nUGFnZSgpLmdldFN0YXR1cygpKTsKLQl9Ci0JCi0JLyoKLQkgKiBzZWFyY2hPcmRlciBkaWFsb2cgbXVzdCBuZXZlciBoYXZlIGFsbCBvZiBlbGVtZW50cyBzZXQKLQkgKiBkaXJlY3RseS4gTXVzdCBjb21lIHRocm91Z2ggaGVyZSBmaXJzdCBzbyB0aGF0IHdlIGNhbgotCSAqIG1ha2Ugc3VyZSB1cGRhdGVzIG9jY3VyIGluIGNvcnJlY3Qgc2VxdWVuY2UsIGVsc2UKLQkgKiB3ZSB3aWxsIHdpbmQgdXAgd2l0aCBlbnRyaWVzIGJlaW5nIG1hcmtlZCBhcyB1bmV4cG9ydGVkCi0JICogd2hlbiB0aGV5IHJlYWxseSBhcmUgZXhwb3J0ZWQuIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlYXJjaE9yZGVyRWxlbWVudHMoTGlzdCBuZXdFbGVtZW50cykgewotCQlBcnJheUxpc3QgZXhwb3J0ZWRFbnRyaWVzID0gbmV3IEFycmF5TGlzdChuZXdFbGVtZW50cy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUJQTGlzdEVsZW1lbnQgZWxlbWVudCA9IChCUExpc3RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmlzRXhwb3J0ZWQoKSkKLQkJCQlleHBvcnRlZEVudHJpZXMuYWRkKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlnZXRTZWFyY2hwYXRoT3JkZXJpbmdQYWdlKCkuc2V0RWxlbWVudHMobmV3RWxlbWVudHMpOwotCQlnZXRTZWFyY2hwYXRoT3JkZXJpbmdQYWdlKCkuc2V0Q2hlY2tlZEVsZW1lbnRzKGV4cG9ydGVkRW50cmllcyk7Ci0JfQotCQotCS8qCi0JICogQ3JlYXRlIHRoZSBTZWFyY2hwYXRoIGVsZW1lbnRzIGZvciBhIEJlYW5pbmZvRWxlbWVudC4KLQkgKiBSZXR1cm4gbnVsbCBpZiBub3QgdG8gdXBkYXRlLgotCSAqLwotCXByaXZhdGUgQlBTZWFyY2hMaXN0RWxlbWVudFtdIGdldEluaXRpYWxTZWFyY2hwYXRocyhCZWFuaW5mb0VudHJ5IGluZm9FbnRyeSkgewotCi0JCS8vIFdlIGNhbiBvbmx5IHZlcmlmeSB0aGUgZXhpc3RlbmNlIG9mIHBhY2thZ2VzIHdpdGhpbiBiZWFuaW5mb3MgdGhhdCBhcmUgCi0JCS8vIGxvY2F0ZWQgd2l0aGluIGEgcHJvamVjdCBvbiB0aGUgZGVza3RvcC4gT3RoZXJ3aXNlIHdlIGNhbid0IGZpbmQgb3V0IHdoYXQKLQkJLy8gcGFja2FnZXMgYXJlIGluIHRoZW0uCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBudWxsOwotCi0JCWlmIChpbmZvRW50cnkuZ2V0S2luZCgpICE9IEJlYW5pbmZvRW50cnkuQklFX1BMVUdJTikgewotCQkJSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShpbmZvRW50cnkuZ2V0Q2xhc3NwYXRoRW50cnkoKSk7Ci0JCQlJUmVzb3VyY2UgcmVzID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKHJlc29sdmVkLmdldFBhdGgoKSk7Ci0JCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCS8vIEl0IGlzIGEgcHJvamVjdCBpdHNlbGYuCi0JCQkJCUlKYXZhUHJvamVjdCBqcCA9IChJSmF2YVByb2plY3QpIEphdmFDb3JlLmNyZWF0ZShyZXMpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKGpwICE9IG51bGwpCi0JCQkJCQkJcm9vdHMgPSBqcC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOyAvLyBBbGwgb2YgdGhlIHJvb3RzIGluIHRoZSBwcm9qZWN0IGFyZSBhcHBsaWNhYmxlLgotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gSXQgaXMgd2l0aGluIGFub3RoZXIgcHJvamVjdAotCQkJCQlJUHJvamVjdCBjb250YWluaW5nUHJvamVjdCA9IHJlcy5nZXRQcm9qZWN0KCk7Ci0JCQkJCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShjb250YWluaW5nUHJvamVjdCk7Ci0JCQkJCWlmIChqcCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBUaGUgcm9vdHMgaWYgdGhpcyBpcyBpbiB0aGUgY2xhc3NwYXRoIG9mIHRoaXMgcHJvamVjdAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0ganAuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QocmVzb2x2ZWQuZ2V0UGF0aCgpKTsKLQkJCQkJCQlpZiAocm9vdCAhPSBudWxsKQotCQkJCQkJCQlyb290cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHsgcm9vdCB9OwotCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVNlYXJjaHBhdGhFbnRyeVtdIGVudHJpZXMgPSBpbmZvRW50cnkuZ2V0U2VhcmNoUGF0aHMoKTsKLQkJQlBTZWFyY2hMaXN0RWxlbWVudFtdIHBhY2thZ2VFbGVtZW50cyA9IG5ldyBCUFNlYXJjaExpc3RFbGVtZW50W2VudHJpZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7Ci0JCQlpIDwgZW50cmllcy5sZW5ndGg7Ci0JCQlpKyspIHsgLy8gU2VhcmNocGF0aCBlbnRyeSwgc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSByYXcgY2xhc3NwYXRoIGVudHJ5IHRoYXQgaXQgaXMgZm9yLgotCQkJYm9vbGVhbiBpc1BhY2thZ2VNaXNzaW5nID0gcm9vdHMgIT0gbnVsbDsKLQkJCS8vIElmIHJvb3RzIGlzIG51bGwsIHRoZW4gdGhlIHBhY2thZ2UgaXNuJ3QgbWlzc2luZyBiZWNhdXNlIHdlIGNhbid0IHRlc3QgZm9yIGl0LgotCQkJU2VhcmNocGF0aEVudHJ5IGNlID0gZW50cmllc1tpXTsKLQkJCWlmIChyb290cyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gY2UuZ2V0UGFja2FnZSgpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcm9vdHMubGVuZ3RoOyBrKyspIHsKLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgaXJvb3QgPSByb290c1trXTsKLQkJCQkJaWYgKGlyb290LmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSkuZXhpc3RzKCkpIHsKLQkJCQkJCWlzUGFja2FnZU1pc3NpbmcgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcGFja2FnZUVsZW1lbnRzW2ldID0gbmV3IEJQU2VhcmNoTGlzdEVsZW1lbnQoY2UsIGZhbHNlLCBpc1BhY2thZ2VNaXNzaW5nLCBmYWxzZSk7Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZUVsZW1lbnRzOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VsZWN0ZWRMaXN0KElTZWxlY3Rpb24gc2VsZWN0aW9uKXsKLQkJTGlzdCBzZWxlY3RlZExpc3QgPSBudWxsOwotCQlpZihzZWxlY3Rpb24hPW51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJc2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHN0cnVjdHVyZWRTZWxlY3Rpb24udG9BcnJheSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkTGlzdDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNCZWFuaW5mb0VuYWJsZWQoKXsKLQkJcmV0dXJuIGVuYWJsZUJlYW5pbmZvOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5pbmZvc1Byb3BlcnR5UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQmVhbmluZm9zUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWRlOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQmVhbmluZm9zUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0vKgotICogICRSQ1NmaWxlOiBCZWFuaW5mb3NQcm9wZXJ0eVBhZ2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDUvMDkvMjYgMjA6MjY6NTkgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlEZWxlZ2F0aW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLmNvcmUuSkVNVUlQbHVnaW47Ci0KLS8qKgotICogUHJvcGVydHkgcGFnZSBmb3IgY29uZmlndXJpbmcgQmVhbmluZm8gcGF0aAotICovCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9zUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSVN0YXR1c0NoYW5nZUxpc3RlbmVyIHsKLQkJCi0JLyoqCi0JICogQXBwbGllcyB0aGUgc3RhdHVzIHRvIHRoZSBzdGF0dXMgbGluZSBvZiBhIGRpYWxvZyBwYWdlLgotCSAqCi0JICogQHBhcmFtIHBhZ2UgdGhlIGRpYWxvZyBwYWdlCi0JICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5VG9TdGF0dXNMaW5lKERpYWxvZ1BhZ2UgcGFnZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1lc3NhZ2U9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5PSzoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJCQlwYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HOgotCQkJCXBhZ2Uuc2V0TWVzc2FnZShtZXNzYWdlLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJCXBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJU3RhdHVzLklORk86Ci0JCQkJcGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCXBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAobWVzc2FnZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCW1lc3NhZ2U9IG51bGw7Ci0JCQkJfQotCQkJCXBhZ2Uuc2V0TWVzc2FnZShudWxsKTsKLQkJCQlwYWdlLnNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgQmVhbmluZm9QYXRoc0Jsb2NrIGZCdWlsZFBhdGhzQmxvY2s7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLS8vIHdoZW4gd2UgZ2V0IGhlbHAgd29ya2luZy4KLS8vCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAocGFyZW50LCBuZXcgRGlhbG9nUGFnZUNvbnRleHRDb21wdXRlcih0aGlzLCBJSmF2YUhlbHBDb250ZXh0SWRzLkJVSUxEX1BBVEhfUFJPUEVSVFlfUEFHRSkpOwotCi0JCS8vIGVuc3VyZSB0aGUgcGFnZSBoYXMgbm8gc3BlY2lhbCBidXR0b25zCi0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7CQkKLQkJCi0JCXByb2plY3Q9IGdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhaXNKYXZhUHJvamVjdChwcm9qZWN0KSkgewotCQkJcmV0dXJuIGNyZWF0ZVdpdGhvdXRKYXZhKHBhcmVudCk7Ci0JCX0gZWxzZSBpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCXJldHVybiBjcmVhdGVGb3JDbG9zZWRQcm9qZWN0KHBhcmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2l0aEphdmEocGFyZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb250ZW50IGZvciB2YWxpZCBwcm9qZWN0cy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlV2l0aEphdmEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJV29ya3NwYWNlUm9vdCByb290PSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlmQnVpbGRQYXRoc0Jsb2NrPSBuZXcgQmVhbmluZm9QYXRoc0Jsb2NrKHJvb3QsIHRoaXMpOwotCQlmaW5hbCBJSmF2YVByb2plY3QganByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWZCdWlsZFBhdGhzQmxvY2suaW5pdChqcHJvamVjdCk7Ci0JCWZpbmFsIElQYXRoIGNsYXNzcGF0aGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoIi5jbGFzc3BhdGgiKS5nZXRGdWxsUGF0aCgpOyAvLyROT04tTkxTLTEkCi0JCWxpc3RlbmVyID0gbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGZCdWlsZFBhdGhzQmxvY2sgIT0gbnVsbCkgewotCQkJCQlpZiAoZXZlbnQuZ2V0RGVsdGEoKS5maW5kTWVtYmVyKGNsYXNzcGF0aGZpbGUpICE9IG51bGwpCi0JCQkJCQlnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CS8vIENhbiBiZSBjYWxsZWQgb3V0c2lkZSBvZiBkaXNwbGF5IGxvb3AKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWZCdWlsZFBhdGhzQmxvY2suaW5pdChqcHJvamVjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotCQlyZXR1cm4gZkJ1aWxkUGF0aHNCbG9jay5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCBmb3Igbm9uLUphdmEgcHJvamVjdHMuCi0JICovCQotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVXaXRob3V0SmF2YShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUHJvcGVydGllc1BhZ2VfSU5GT19fbm9qYXZhcHJvamVjdCk7IAotCQkKLQkJZkJ1aWxkUGF0aHNCbG9jaz0gbnVsbDsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IGZvciBjbG9zZWQgcHJvamVjdHMuCi0JICovCQkKLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlRm9yQ2xvc2VkUHJvamVjdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUHJvcGVydGllc1BhZ2VfSU5GT19fY2xvc2VkcHJvamVjdCk7IAotCQkKLQkJZkJ1aWxkUGF0aHNCbG9jaz0gbnVsbDsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlJQWRhcHRhYmxlIGFkYXB0YWJsZT0gZ2V0RWxlbWVudCgpOwotCQlpZiAoYWRhcHRhYmxlICE9IG51bGwpIHsKLQkJCUlKYXZhRWxlbWVudCBlbGVtPSAoSUphdmFFbGVtZW50KSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpOwotCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKChJSmF2YVByb2plY3QpIGVsZW0pLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzSmF2YVByb2plY3QoSVByb2plY3QgcHJvaikgewotCQl0cnkgewotCQkJcmV0dXJuIHByb2ouaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSkVNVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlpZiAoZkJ1aWxkUGF0aHNCbG9jayAhPSBudWxsKSB7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGU9IGZCdWlsZFBhdGhzQmxvY2suZ2V0UnVubmFibGUoKTsKLQotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wPSBuZXcgV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbihydW5uYWJsZSk7Ci0JCQlTaGVsbCBzaGVsbD0gZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0JCQl0cnkgewotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuKGZhbHNlLCBmYWxzZSwgb3ApOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIHRpdGxlPSBCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9fVUlfX2Vycm9ydGl0bGU7IAotCQkJCVN0cmluZyBtZXNzYWdlPSBCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9fVUlfX2Vycm9yOyAKLQkJCQlFeGNlcHRpb25IYW5kbGVyLmhhbmRsZShlLCBzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYW5jZWxsZWQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVN0YXR1c0NoYW5nZUxpc3RlbmVyI3N0YXR1c0NoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGF0dXNDaGFuZ2VkKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXNldFZhbGlkKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSk7Ci0JCWFwcGx5VG9TdGF0dXNMaW5lKHRoaXMsIHN0YXR1cyk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbGlzdGVuZXIgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQmVhbmluZm9zV29ya2Jvb2tQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuaW5mb3NXb3JrYm9va1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhNDUyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuaW5mb3NXb3JrYm9va1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBCZWFuaW5mb3NXb3JrYm9va1BhZ2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTEgJCAgJERhdGU6IDIwMDUvMTAvMDQgMTc6NTk6MTcgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5CdWlsZFBhdGhEaWFsb2dBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbmluZm9FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkuY29yZS5KRU1VSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEJlYW5pbmZvc1dvcmtib29rUGFnZSBpbXBsZW1lbnRzIElCdWlsZFNlYXJjaFBhZ2V7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HU1RPUkVfTEFTVFZBUklBQkxFID0gSkVNVUlQbHVnaW4uUElfQkVBTklORk9fVUkgKyAiLmxhc3R2YXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gYSBkaWFsb2cgdG8gY2hvb3NlIGEgdmFyaWFibGUKLQlwcml2YXRlIGNsYXNzIFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nIGltcGxlbWVudHMgSVN0YXR1c0NoYW5nZUxpc3RlbmVyIHsJCi0JCXByaXZhdGUgVmFyaWFibGVTZWxlY3Rpb25CbG9jayBmVmFyaWFibGVTZWxlY3Rpb25CbG9jazsKLQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzPSBKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQkJCQotCQlwdWJsaWMgVmFyaWFibGVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBMaXN0IGV4aXN0aW5nUGF0aHMpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCQlzZXRUaXRsZSgiTmV3IFZhcmlhYmxlIENsYXNzcGF0aCBFbnRyeSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaW5pdFZhcj0gZGlhbG9nU2V0dGluZ3MuZ2V0KERJQUxPR1NUT1JFX0xBU1RWQVJJQUJMRSk7Ci0JCQlmVmFyaWFibGVTZWxlY3Rpb25CbG9jaz0gbmV3IFZhcmlhYmxlU2VsZWN0aW9uQmxvY2sodGhpcywgZXhpc3RpbmdQYXRocywgbnVsbCwgaW5pdFZhciwgZmFsc2UpOwotCQl9Ci0JCQotCQkvKgotCQkgKiBAc2VlIFdpbmRvd3MjY29uZmlndXJlU2hlbGwKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0vLwkJCVdvcmtiZW5jaEhlbHAuc2V0SGVscChuZXdTaGVsbCwgSUphdmFIZWxwQ29udGV4dElkcy5WQVJJQUJMRV9TRUxFQ1RJT05fRElBTE9HKTsKLQkJfQkJCi0KLQkJLyoKLQkJICogQHNlZSBTdGF0dXNEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYSgpCi0JCSAqLwkJCQkKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQkJCi0JCQlMYWJlbCBtZXNzYWdlPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQltZXNzYWdlLnNldFRleHQoIk5ldyBWYXJpYWJsZSBDbGFzc3BhdGggRW50cnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVzc2FnZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsJCi0JCQkJCQkKLQkJCUNvbnRyb2wgaW5uZXI9IGZWYXJpYWJsZVNlbGVjdGlvbkJsb2NrLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJCWlubmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCQkKLQkJLyoKLQkJICogQHNlZSBEaWFsb2cjb2tQcmVzc2VkKCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJCWRpYWxvZ1NldHRpbmdzLnB1dChESUFMT0dTVE9SRV9MQVNUVkFSSUFCTEUsIGdldFZhcmlhYmxlKCkuc2VnbWVudCgwKSk7Ci0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQkKLQotCQkvKgotCQkgKiBAc2VlIElTdGF0dXNDaGFuZ2VMaXN0ZW5lciNzdGF0dXNDaGFuZ2VkKCkKLQkJICovCQkJCi0JCXB1YmxpYyB2b2lkIHN0YXR1c0NoYW5nZWQoSVN0YXR1cyBzdGF0dXMpIHsKLQkJCXVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgSVBhdGggZ2V0VmFyaWFibGUoKSB7Ci0JCQlyZXR1cm4gZlZhcmlhYmxlU2VsZWN0aW9uQmxvY2suZ2V0VmFyaWFibGVQYXRoKCk7Ci0JCX0JCQotCX0KLQotCQotCS8vY29udHJvbHMKLQlwcml2YXRlIENvbXBvc2l0ZSBqYXZhUHJvamVjdHNDb21wb3NpdGUgPSBudWxsOwotCXByaXZhdGUgTGFiZWwgbGFiZWwgPSBudWxsOwotCXByaXZhdGUgVGFibGUgdGFibGUgPSBudWxsOwotCXByaXZhdGUgQ29tcG9zaXRlIGJ1dHRvbnNCYXIgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGFkZEZvbGRlcnNidXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGFkZEphcnNCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGFkZEV4dEphcnNCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGFkZFZhcmlhYmxlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBhZGRQcm9qZWN0QnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBtb2RpZnlQYXRoc0J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIExhYmVsIHNwYWNlcjIgPSBudWxsOwotCXByaXZhdGUgTGFiZWwgc3BhY2VyMSA9IG51bGw7Ci0JLy8gLi4gY29udHJvbHMKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCQotCXByaXZhdGUgQmVhbmluZm9QYXRoc0Jsb2NrIGJlYW5pbmZvUGF0aHNCbG9jazsKLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQlwcml2YXRlIExpc3QgYmVhbmluZm9zTGlzdDsKLQlwcml2YXRlIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3Q7Ci0JcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZExpc3Q7Ci0JcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSByYXdMaXN0OwotCXByaXZhdGUgU2VhcmNoUGF0aExpc3RMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlwdWJsaWMgQmVhbmluZm9zV29ya2Jvb2tQYWdlKElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QsIEJlYW5pbmZvUGF0aHNCbG9jayBiZWFuaW5mb1BhdGhzQmxvY2spIHsKLQkJdGhpcy53b3Jrc3BhY2VSb290ID0gd29ya3NwYWNlUm9vdDsKLQkJdGhpcy5iZWFuaW5mb1BhdGhzQmxvY2sgPSBiZWFuaW5mb1BhdGhzQmxvY2s7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IG5ldyBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIoKTsKLQkJdGhpcy5iZWFuaW5mb3NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZihzcGFjZXIxPT1udWxsIHx8IHNwYWNlcjI9PW51bGwpewotCQkJLy8ganVzdCBoYXZlIFNPTUUgcmVhZCBhY2Nlc3MKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGphdmFQcm9qZWN0c0NvbXBvc2l0ZQkKLQkgKgotCSAqLwotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJamF2YVByb2plY3RzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJamF2YVByb2plY3RzQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwoamF2YVByb2plY3RzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5JbmZvc1dvcmtib29rUGFnZV9MaXN0X1RleHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY3JlYXRlVGFibGUoKTsKLQkJY3JlYXRlQnV0dG9uc0JhcigpOwotCQl1cGRhdGVFbmFibGVkU3RhdGVzKCk7Ci0JCXJldHVybiBqYXZhUHJvamVjdHNDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGFibGUJCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGUoKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhMSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhKCk7Ci0JCWdyaWREYXRhMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YTEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMS52ZXJ0aWNhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuRklMTDsKLQkJdGFibGUgPSBuZXcgVGFibGUoamF2YVByb2plY3RzQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YTEpOwotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IEJJTGlzdEVsZW1lbnRTb3J0ZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KGJlYW5pbmZvc0xpc3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGJ1dHRvbnNCYXIJCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnV0dG9uc0JhcigpIHsKLQkJUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLQkJcm93TGF5b3V0LnR5cGUgPSBvcmcuZWNsaXBzZS5zd3QuU1dULlZFUlRJQ0FMOwotCQlyb3dMYXlvdXQubWFyZ2luTGVmdCA9IDM7Ci0JCXJvd0xheW91dC5maWxsID0gdHJ1ZTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEyLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEyLnZlcnRpY2FsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YTIuaG9yaXpvbnRhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuQkVHSU5OSU5HOwotCQlidXR0b25zQmFyID0gbmV3IENvbXBvc2l0ZShqYXZhUHJvamVjdHNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9uc0Jhci5zZXRMYXlvdXREYXRhKGdyaWREYXRhMik7Ci0JCWJ1dHRvbnNCYXIuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0JCWFkZEZvbGRlcnNidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJYWRkRm9sZGVyc2J1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkRm9sZGVycyk7Ci0JCWFkZEZvbGRlcnNidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgYmVhbmluZm9FbnRyaWVzID0gY2hvb3NlQ2xhc3NDb250YWluZXJzKCk7Ci0JCQkJYWRkVG9CZWFuaW5mb3NMaXN0KGJlYW5pbmZvRW50cmllcyk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRKYXJzQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCWFkZEphcnNCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX0FkZEpBUnMpOwotCQlhZGRKYXJzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IGJlYW5pbmZvRW50cmllcyA9IGNob29zZUphckZpbGVzKCk7Ci0JCQkJYWRkVG9CZWFuaW5mb3NMaXN0KGJlYW5pbmZvRW50cmllcyk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRFeHRKYXJzQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCWFkZEV4dEphcnNCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX0FkZEV4dGVybmFsSkFSKTsKLQkJYWRkRXh0SmFyc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBiZWFuaW5mb0VudHJpZXMgPSBjaG9vc2VFeHRKYXJGaWxlcygpOwotCQkJCWFkZFRvQmVhbmluZm9zTGlzdChiZWFuaW5mb0VudHJpZXMpOwotCQkJfQotCQl9KTsKLQkJYWRkVmFyaWFibGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJYWRkVmFyaWFibGVCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX0FkZFZhcmlhYmxlKTsKLQkJYWRkVmFyaWFibGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgYmVhbmluZm9FbnRyaWVzID0gY2hvb3NlVmFyaWFibGVFbnRyaWVzKCk7Ci0JCQkJYWRkVG9CZWFuaW5mb3NMaXN0KGJlYW5pbmZvRW50cmllcyk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRQcm9qZWN0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCWFkZFByb2plY3RCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX0FkZFByb2plY3RzKTsKLQkJYWRkUHJvamVjdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBiZWFuaW5mb0VudHJpZXMgPSBjaG9vc2VQcm9qZWN0cygpOwotCQkJCWFkZFRvQmVhbmluZm9zTGlzdChiZWFuaW5mb0VudHJpZXMpOwotCQkJfQotCQl9KTsKLQkJc3BhY2VyMSA9IG5ldyBMYWJlbChidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCW1vZGlmeVBhdGhzQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCW1vZGlmeVBhdGhzQnV0dG9uLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5JbmZvc1dvcmtib29rUGFnZV9Nb2RpZnlQYXRocyk7Ci0JCW1vZGlmeVBhdGhzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltb2RpZnlTZWFyY2hQYXRocygpOwotCQkJfQotCQl9KTsKLQkJc3BhY2VyMiA9IG5ldyBMYWJlbChidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0JhciwgU1dULk5PTkUpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX1JlbW92ZSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBzZWxlY3RlZCA9IEJlYW5pbmZvUGF0aHNCbG9jay5nZXRTZWxlY3RlZExpc3QodGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWJlYW5pbmZvc0xpc3QucmVtb3ZlQWxsKHNlbGVjdGVkKTsKLQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBjaG9vc2VWYXJpYWJsZUVudHJpZXMoKSB7Ci0JCS8vIFJlbW92ZSBleGlzdGluZyB2YXJpYWJsZSBlbnRyaWVzIGluIGJvdGggdGhlIGNsYXNzcGF0aCBhbmQgdGhlIGJlYW5pbmZvcGF0aHMuCi0JCS8vIERvbid0IHdhbnQgY2xhc3NwYXRoIG9uZXMgYmVjYXVzZSB0aGV5IHNob3VsZCBiZSBvZiBiZWVuIHNlbGVjdGVkIGluIHRoZSBzZWFyY2ggcGF0aHMgcGFnZS4KLQkJQXJyYXlMaXN0IGV4aXN0aW5nUGF0aHM9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHJhd0xpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyYXdMaXN0W2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUpIHsKLQkJCQlleGlzdGluZ1BhdGhzLmFkZChyYXdMaXN0W2ldLmdldFBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUxpc3Qgb3VycyA9IGJlYW5pbmZvc0xpc3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3Vycy5zaXplKCk7IGkrKykgewotCQkJQlBCZWFuaW5mb0xpc3RFbGVtZW50IGJwYiA9IChCUEJlYW5pbmZvTGlzdEVsZW1lbnQpIG91cnMuZ2V0KGkpOwotCQkJaWYgKGJwYi5nZXRFbnRyeSgpLmdldEtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKQotCQkJCWV4aXN0aW5nUGF0aHMuYWRkKGJwYi5nZXRFbnRyeSgpLmdldFBhdGgoKSk7Ci0JCX0KLQkJCi0JCVZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZz0gbmV3IFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nKGFkZFZhcmlhYmxlQnV0dG9uLmdldFNoZWxsKCksIGV4aXN0aW5nUGF0aHMpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCUlQYXRoIHBhdGg9IGRpYWxvZy5nZXRWYXJpYWJsZSgpOwotCQkJSUNsYXNzcGF0aEVudHJ5IGNwZSA9IEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkocGF0aCwgbnVsbCwgbnVsbCk7Ci0JCQlJUGF0aCByZXNvbHZlZFBhdGg9IEphdmFDb3JlLmdldFJlc29sdmVkVmFyaWFibGVQYXRoKHBhdGgpOwotCQkJYm9vbGVhbiBpc01pc3NpbmcgPSByZXNvbHZlZFBhdGggPT0gbnVsbCB8fCAhcmVzb2x2ZWRQYXRoLnRvRmlsZSgpLmlzRmlsZSgpOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IEJQQmVhbmluZm9MaXN0RWxlbWVudChuZXcgQmVhbmluZm9FbnRyeShjcGUsIG51bGwsIHRydWUpLCBudWxsLCBpc01pc3NpbmcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXByaXZhdGUgTGlzdCBjaG9vc2VKYXJGaWxlcygpIHsKLQkJSVBhdGhbXSBqYXJQYXRocyA9IEJ1aWxkUGF0aERpYWxvZ0FjY2Vzcy5jaG9vc2VKQVJFbnRyaWVzKGFkZEphcnNCdXR0b24uZ2V0U2hlbGwoKSwgamF2YVByb2plY3QuZ2V0UGF0aCgpLCBnZXRVc2VkSkFSRmlsZXMoKSk7Ci0JCWlmIChqYXJQYXRocyE9bnVsbCkgewotCQkJTGlzdCByZXM9IG5ldyBBcnJheUxpc3QoamFyUGF0aHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBqYXJQYXRocy5sZW5ndGg7IGkrKykgewotCQkJCUJQQmVhbmluZm9MaXN0RWxlbWVudCBuZXdHdXkgPSBuZXdCUEJlYW5pbmZvTGlzdEVsZW1lbnRGcm9tRnVsbHBhdGgoamFyUGF0aHNbaV0pOwotCQkJCWlmIChuZXdHdXkgIT0gbnVsbCkKLQkJCQkJcmVzLmFkZChuZXdHdXkpOwotCQkJfQotCQkJcmV0dXJuIHJlczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgY2hvb3NlRXh0SmFyRmlsZXMoKSB7Ci0JCUlQYXRoW10gZXh0SkFSUGF0aHMgPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlRXh0ZXJuYWxKQVJFbnRyaWVzKGFkZEV4dEphcnNCdXR0b24uZ2V0U2hlbGwoKSk7Ci0JCUxpc3QgZWxlbXMgPSBudWxsOwotCQlpZihleHRKQVJQYXRocyE9bnVsbCl7Ci0JCQllbGVtcyA9IG5ldyBBcnJheUxpc3QoZXh0SkFSUGF0aHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBleHRKQVJQYXRocy5sZW5ndGg7IGkrKykgewotCQkJCUJQQmVhbmluZm9MaXN0RWxlbWVudCBuZXdHdXkgPSBuZXdCUEJlYW5pbmZvTGlzdEVsZW1lbnQoZXh0SkFSUGF0aHNbaV0pOwotCQkJCWlmIChuZXdHdXkgIT0gbnVsbCkKLQkJCQkJZWxlbXMuYWRkKG5ld0d1eSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1zOwotCX0KLQotCXByaXZhdGUgQlBCZWFuaW5mb0xpc3RFbGVtZW50IG5ld0JQQmVhbmluZm9MaXN0RWxlbWVudChJUGF0aCBwYXRoKSB7Ci0JCS8vIENyZWF0ZSBmb3IgYW4gZXh0ZXJuYWwsIGlmIG5vdCBhbHJlYWR5IHVzZWQgaW4gZWl0aGVyIGNsYXNzcGF0aCBvciBiZWFuaW5mbyBwYXRoLgotCQkvLyBUaGVzZSBjYW4ndCBiZSBwcmUtc2VsZWN0ZWQgb3V0IGxpa2UgZm9yIHRoZSBvdGhlciBjaG9vc2UgZGlhbG9ncy4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvbHZlZExpc3QubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBjcGUgPSByZXNvbHZlZExpc3RbaV07Ci0JCQlpZiAoY3BlICE9IG51bGwgJiYgY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSAmJiBjcGUuZ2V0UGF0aCgpLmVxdWFscyhwYXRoKSkKLQkJCQlyZXR1cm4gbnVsbDsJLy8gQWxyZWFkeSBleGlzdHMuCi0JCX0KLQkJCi0JCS8vIE5vdyBzZWUgaWYgb25lIG9mIG91cnMuCi0JCUxpc3Qgb3VycyA9IGJlYW5pbmZvc0xpc3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3Vycy5zaXplKCk7IGkrKykgewotCQkJQlBCZWFuaW5mb0xpc3RFbGVtZW50IGJwYiA9IChCUEJlYW5pbmZvTGlzdEVsZW1lbnQpIG91cnMuZ2V0KGkpOwotCQkJaWYgKGJwYi5nZXRFbnRyeSgpLmdldEtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgJiYgYnBiLmdldEVudHJ5KCkuZ2V0UGF0aCgpLmVxdWFscyhwYXRoKSkKLQkJCQlyZXR1cm4gbnVsbDsJLy8gQWxyZWFkeSBleGlzdHMKLQkJfQotCQkKLQkJSUNsYXNzcGF0aEVudHJ5IGNwZSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwYXRoLCBudWxsLCBudWxsKTsKLQkJQmVhbmluZm9FbnRyeSBiaWUgPSBuZXcgQmVhbmluZm9FbnRyeShjcGUsIG51bGwsIHRydWUpOwotCQlyZXR1cm4gbmV3IEJQQmVhbmluZm9MaXN0RWxlbWVudChiaWUsIG51bGwsIGZhbHNlKTsKLQl9Ci0JCi0KLQlwcml2YXRlIElQYXRoW10gZ2V0VXNlZEpBUkZpbGVzKCkgewotCQkvLyBKYXJzIHVzZWQgYnkgYm90aCB0aGUgY2xhc3NwYXRoIGFuZCB0aGUgYmVhbmluZm8gc2VhcmNoIHBhdGguCi0JCS8vIERvbid0IHdhbnQgamFycyB1c2VkIGJ5IGNsYXNzcGF0aCBiZWNhdXNlIHRob3NlIHdvdWxkIHRoZW4gYmUKLQkJLy8gaW4gdGhlIGJ1aWxkcGF0aCBhbmQgdXNlciB3b3VsZCBzZWxlY3QgcGF0aHMgdGhyb3VnaCB0aGUgc2VhcmNoIHBhdGggcGFnZS4KLQkJQXJyYXlMaXN0IHJlcz0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgcmVzb2x2ZWRMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVzb2x2ZWRMaXN0W2ldICE9IG51bGwgJiYgcmVzb2x2ZWRMaXN0W2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCUlQYXRoIHBhdGggPSByZXNvbHZlZExpc3RbaV0uZ2V0UGF0aCgpOwotCQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKHBhdGgpOwotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotCQkJCQlyZXMuYWRkKHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJTGlzdCBiaWxpc3Q9IGJlYW5pbmZvc0xpc3Q7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBiaWxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUJQTGlzdEVsZW1lbnQgZWxlbT0gKEJQTGlzdEVsZW1lbnQpYmlsaXN0LmdldChpKTsKLQkJCWlmIChlbGVtLmdldEVudHJ5KCkuZ2V0S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCUlQYXRoIHBhdGggPSBlbGVtLmdldEVudHJ5KCkuZ2V0UGF0aCgpOwotCQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKHBhdGgpOwotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotCQkJCQlyZXMuYWRkKHBhdGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSVBhdGhbXSkgcmVzLnRvQXJyYXkobmV3IElQYXRoW3Jlcy5zaXplKCldKTsKLQl9CQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEJQTGlzdEVsZW1lbnQgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBCUEJlYW5pbmZvTGlzdEVsZW1lbnQgbmV3QlBCZWFuaW5mb0xpc3RFbGVtZW50KElSZXNvdXJjZSBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lciB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXJldHVybiBuZXdCUEJlYW5pbmZvTGlzdEVsZW1lbnRGcm9tRnVsbHBhdGgoZWxlbWVudC5nZXRGdWxsUGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEJQTGlzdEVsZW1lbnQgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJpdmF0ZSBCUEJlYW5pbmZvTGlzdEVsZW1lbnQgbmV3QlBCZWFuaW5mb0xpc3RFbGVtZW50RnJvbUZ1bGxwYXRoKElQYXRoIGZ1bGxQYXRoKSB7Ci0JCWlmKGZ1bGxQYXRoIT1udWxsKXsKLQkJCUlDbGFzc3BhdGhFbnRyeSBjcGUgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoZnVsbFBhdGgsIG51bGwsIG51bGwpOwotCQkJQmVhbmluZm9FbnRyeSBiaWUgPSBuZXcgQmVhbmluZm9FbnRyeShjcGUsIG51bGwsIHRydWUpOwotCQkJcmV0dXJuIG5ldyBCUEJlYW5pbmZvTGlzdEVsZW1lbnQoYmllLCBudWxsLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGNob29zZUNsYXNzQ29udGFpbmVycygpIHsJCi0JCUNsYXNzW10gYWNjZXB0ZWRDbGFzc2VzPSBuZXcgQ2xhc3NbXSB7IElGb2xkZXIuY2xhc3MgfTsKLQkJSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB2YWxpZGF0b3I9IG5ldyBUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IoYWNjZXB0ZWRDbGFzc2VzLCB0cnVlKTsKLQkJCQotCQlhY2NlcHRlZENsYXNzZXM9IG5ldyBDbGFzc1tdIHsgSVByb2plY3QuY2xhc3MsIElGb2xkZXIuY2xhc3MgfTsKLQotCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyPSBuZXcgVHlwZWRWaWV3ZXJGaWx0ZXIoYWNjZXB0ZWRDbGFzc2VzLCBnZXRVc2VkQ29udGFpbmVycygpKTsJCi0JCQkKLQkJSUxhYmVsUHJvdmlkZXIgbHA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwPSBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCk7Ci0KLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coYWRkRm9sZGVyc2J1dHRvbi5nZXRTaGVsbCgpLCBscCwgY3ApOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRUaXRsZShCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19DbGFzc2VzX1RpdGxlKTsgCi0JCWRpYWxvZy5zZXRNZXNzYWdlKEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX0NsYXNzZXNfUHJvbXB0KTsgIAotCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCWRpYWxvZy5zZXRJbnB1dCh3b3Jrc3BhY2VSb290KTsKLQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24oamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJT2JqZWN0W10gZWxlbWVudHM9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCUxpc3QgcmVzPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlCUEJlYW5pbmZvTGlzdEVsZW1lbnQgbmV3R3V5ID0gbmV3QlBCZWFuaW5mb0xpc3RFbGVtZW50KChJUmVzb3VyY2UpIGVsZW1lbnRzW2ldKTsKLQkJCQlpZiAobmV3R3V5ICE9IG51bGwpCi0JCQkJCXJlcy5hZGQobmV3R3V5KTsKLQkJCX0KLQkJCXJldHVybiByZXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGFpbmVyW10gZ2V0VXNlZENvbnRhaW5lcnMoKSB7Ci0JCS8vIENvbnRhaW5lcnMgdXNlZCBieSBib3RoIHRoZSBjbGFzc3BhdGggYW5kIHRoZSBiZWFuaW5mbyBzZWFyY2ggcGF0aC4KLQkJLy8gRG9uJ3Qgd2FudCBjb250YWluZXJzIHVzZWQgYnkgY2xhc3NwYXRoIGJlY2F1c2UgdGhvc2Ugd291bGQgdGhlbiBiZQotCQkvLyBpbiB0aGUgYnVpbGRwYXRoIGFuZCB1c2VyIHdvdWxkIHNlbGVjdCBwYXRocyB0aHJvdWdoIHRoZSBzZWFyY2ggcGF0aCBwYWdlLgotCQlBcnJheUxpc3QgcmVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBvdXRwdXRMb2NhdGlvbj0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCWlmIChvdXRwdXRMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIob3V0cHV0TG9jYXRpb24pOwotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJcmVzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlIGl0IGhlcmUsIGp1c3QgbG9nCi0JCQlKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkJCQotCQlmb3IgKGludCBpPSAwOyBpIDwgcmVzb2x2ZWRMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVzb2x2ZWRMaXN0W2ldICE9IG51bGwgJiYgcmVzb2x2ZWRMaXN0W2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIocmVzb2x2ZWRMaXN0W2ldLmdldFBhdGgoKSk7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQlyZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IGJpbGlzdD0gYmVhbmluZm9zTGlzdDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGJpbGlzdC5zaXplKCk7IGkrKykgewotCQkJQlBMaXN0RWxlbWVudCBlbGVtPSAoQlBMaXN0RWxlbWVudCliaWxpc3QuZ2V0KGkpOwotCQkJaWYgKGVsZW0uZ2V0RW50cnkoKS5nZXRLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2U9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihlbGVtLmdldEVudHJ5KCkuZ2V0UGF0aCgpKTsKLQkJCQlyZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb250YWluZXJbXSkgcmVzLnRvQXJyYXkobmV3IElDb250YWluZXJbcmVzLnNpemUoKV0pOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvQmVhbmluZm9zTGlzdChmaW5hbCBMaXN0IHRvQWRkKXsKLQkJaWYgKGJlYW5pbmZvc0xpc3QgIT0gbnVsbCAmJiB0b0FkZCE9bnVsbCkgewotCQkJYmVhbmluZm9zTGlzdC5hZGRBbGwodG9BZGQpOwotCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJdGFibGUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0b0FkZCkpOwotCQkJCX0KLQkJCX0pOwotCQkJcGFnZUNoYW5nZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGFnZUNoYW5nZWQoKSB7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkvLyBhbHJlYWR5IGluaXRpYWxpemVkCi0JCQl1cGRhdGVTZWFyY2hwYXRoTGlzdCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlYXJjaHBhdGhMaXN0KCkgewotCQlMaXN0IHNlYXJjaGVsZW1lbnRzID0gYmVhbmluZm9QYXRoc0Jsb2NrLmdldFNlYXJjaHBhdGhPcmRlcmluZ1BhZ2UoKS5nZXRFbGVtZW50cygpOwotCi0JCUxpc3QgYmVhbmluZm9lbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYmVhbmluZm9zTGlzdCk7Ci0KLQkJYm9vbGVhbiBjaGFuZ2VEb25lID0gZmFsc2U7Ci0JCS8vIEZpcnN0IGdvIHRocm91Z2ggdGhlIHNlYXJjaCBwYXRoIGFuZCByZW1vdmUgYW55IEJlYW5pbmZvIGxpc3QgZWxlbWVudHMgdGhhdAotCQkvLyBhcmUgbm90IGluIHRoaXMgcGFnZXMgYmVhbmluZm9zIGxpc3QuCi0JCWZvciAoTGlzdEl0ZXJhdG9yIHNwaXRyID0gc2VhcmNoZWxlbWVudHMubGlzdEl0ZXJhdG9yKHNlYXJjaGVsZW1lbnRzLnNpemUoKSk7Ci0JCQlzcGl0ci5oYXNQcmV2aW91cygpOwotCQkJKSB7Ci0JCQlCUExpc3RFbGVtZW50IGVsZW1lbnQgPSAoQlBMaXN0RWxlbWVudCkgc3BpdHIucHJldmlvdXMoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQlBCZWFuaW5mb0xpc3RFbGVtZW50ICYmICFiZWFuaW5mb2VsZW1lbnRzLnJlbW92ZShlbGVtZW50KSkgewotCQkJCS8vIFNlYXJjaCBlbGVtZW50IGFuZCBub3QgZm91bmQgaW4gcGFja2FnZXMgbGlzdCBzbyByZW1vdmUgaXQgZnJvbSBzZWFyY2hwYXRoIGxpc3QuCi0JCQkJc3BpdHIucmVtb3ZlKCk7Ci0JCQkJY2hhbmdlRG9uZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gQW55IGxlZnQgb3ZlciBpbiBiZWFuaW5mb3MgbGlzdCBhcmUgbmV3IGFuZCBuZWVkIHRvIGJlIGFkZGVkLgotCQlzZWFyY2hlbGVtZW50cy5hZGRBbGwoYmVhbmluZm9lbGVtZW50cyk7Ci0JCWNoYW5nZURvbmUgPSBjaGFuZ2VEb25lIHx8ICFiZWFuaW5mb2VsZW1lbnRzLmlzRW1wdHkoKTsKLQotCQlpZiAoY2hhbmdlRG9uZSkKLQkJCWJlYW5pbmZvUGF0aHNCbG9jay5zZXRTZWFyY2hPcmRlckVsZW1lbnRzKHNlYXJjaGVsZW1lbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCl7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJbGFiZWxQcm92aWRlci5zZXRKYXZhUHJvamVjdCh0aGlzLmphdmFQcm9qZWN0KTsKLQkJdHJ5IHsKLQkJCXJhd0xpc3QgPSB0aGlzLmphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJcmVzb2x2ZWRMaXN0ID0gbmV3IElDbGFzc3BhdGhFbnRyeVtyYXdMaXN0Lmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJhd0xpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQlyZXNvbHZlZExpc3RbaV0gPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KHJhd0xpc3RbaV0pOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJcmF3TGlzdCA9IHJlc29sdmVkTGlzdCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JCX0KLQkJdXBkYXRlQmVhbmluZm9zTGlzdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVCZWFuaW5mb3NMaXN0KCkgewotCQlMaXN0IHNwZWxlbWVudHMgPSBiZWFuaW5mb1BhdGhzQmxvY2suZ2V0U2VhcmNocGF0aE9yZGVyaW5nUGFnZSgpLmdldEVsZW1lbnRzKCk7Ci0KLQkJTGlzdCBiaUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChzcGVsZW1lbnRzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3BlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJQlBMaXN0RWxlbWVudCBzcGUgPSAoQlBMaXN0RWxlbWVudCkgc3BlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAoc3BlIGluc3RhbmNlb2YgQlBCZWFuaW5mb0xpc3RFbGVtZW50KSB7Ci0JCQkJYmlFbGVtZW50cy5hZGQoc3BlKTsKLQkJCX0KLQkJfQotCQliZWFuaW5mb3NMaXN0LmNsZWFyKCk7Ci0JCWJlYW5pbmZvc0xpc3QuYWRkQWxsKGJpRWxlbWVudHMpOwotCQlpZih0YWJsZVZpZXdlciE9bnVsbCAmJiAhdGFibGUuaXNEaXNwb3NlZCgpKQotCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGlvbigpIHsKLQkJaWYodGFibGVWaWV3ZXIhPW51bGwpCi0JCQlyZXR1cm4gQmVhbmluZm9QYXRoc0Jsb2NrLmdldFNlbGVjdGVkTGlzdCh0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihMaXN0IHNlbGVjdGlvbikgewotCQlpZih0YWJsZVZpZXdlciE9bnVsbCkKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCl7Ci0JCUxpc3Qgc2VsZWN0ZWQgPSBCZWFuaW5mb1BhdGhzQmxvY2suZ2V0U2VsZWN0ZWRMaXN0KHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJYWRkRXh0SmFyc0J1dHRvbi5zZXRFbmFibGVkKGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJYWRkRm9sZGVyc2J1dHRvbi5zZXRFbmFibGVkKGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJYWRkSmFyc0J1dHRvbi5zZXRFbmFibGVkKGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJYWRkUHJvamVjdEJ1dHRvbi5zZXRFbmFibGVkKGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJYWRkVmFyaWFibGVCdXR0b24uc2V0RW5hYmxlZChiZWFuaW5mb1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JCQotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChzZWxlY3RlZCE9bnVsbCAmJiBzZWxlY3RlZC5zaXplKCk+MCAmJiBiZWFuaW5mb1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JCW1vZGlmeVBhdGhzQnV0dG9uLnNldEVuYWJsZWQoc2VsZWN0ZWQhPW51bGwgJiYgc2VsZWN0ZWQuc2l6ZSgpPT0xICYmIGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGNob29zZVByb2plY3RzKCkgewkKLQkJQ2xhc3NbXSBhY2NlcHRlZENsYXNzZXM9IG5ldyBDbGFzc1tdIHsgSUphdmFQcm9qZWN0LmNsYXNzIH07Ci0JCUlTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgdmFsaWRhdG9yPSBuZXcgVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKGFjY2VwdGVkQ2xhc3NlcywgdHJ1ZSk7Ci0KLQkJTGlzdCBhbGxQcm9qZWN0cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhbGxQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRKYXZhTW9kZWwoKS5nZXRDaGlsZHJlbigpKSk7Ci0JCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWFsbFByb2plY3RzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlhbGxQcm9qZWN0cy5yZW1vdmVBbGwoZ2V0VXNlZFByb2plY3RzKCkpOwotCQkJCi0JCUlMYWJlbFByb3ZpZGVyIGxwPSBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX0RFRkFVTFQpOwotCi0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZz0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKGFkZFByb2plY3RCdXR0b24uZ2V0U2hlbGwoKSwgbHApOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRUaXRsZShCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19Qcm9qZWN0c19UaXRsZSk7IAotCQlkaWFsb2cuc2V0TWVzc2FnZShCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19Qcm9qZWN0c19Qcm9tcHQpOyAKLQkJZGlhbG9nLnNldEVsZW1lbnRzKGFsbFByb2plY3RzLnRvQXJyYXkoKSk7Ci0JCQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlMaXN0IHJlcz0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IGNwZSA9IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeSgoKElKYXZhUHJvamVjdCkgZWxlbWVudHNbaV0pLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkpOwotCQkJCQlCZWFuaW5mb0VudHJ5IGJpZSA9IG5ldyBCZWFuaW5mb0VudHJ5KGNwZSwgbnVsbCwgdHJ1ZSk7Ci0JCQkJCXJlcy5hZGQobmV3IEJQQmVhbmluZm9MaXN0RWxlbWVudChiaWUsIG51bGwsIGZhbHNlKSk7Ci0JCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldFVzZWRQcm9qZWN0cygpIHsKLQkJLy8gUHJvamVjdHMgdXNlZCBieSBib3RoIHRoZSBjbGFzc3BhdGggYW5kIHRoZSBiZWFuaW5mbyBzZWFyY2ggcGF0aC4KLQkJLy8gRG9uJ3Qgd2FudCBwcm9qZWN0cyB1c2VkIGJ5IGNsYXNzcGF0aCBiZWNhdXNlIHRob3NlIHdvdWxkIHRoZW4gYmUKLQkJLy8gaW4gdGhlIGJ1aWxkcGF0aCBhbmQgdXNlciB3b3VsZCBzZWxlY3QgcGF0aHMgdGhyb3VnaCB0aGUgc2VhcmNoIHBhdGggcGFnZS4KLQkJQXJyYXlMaXN0IHJlcz0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXMuYWRkKGphdmFQcm9qZWN0KTsJLy8gUGx1cyBvdXIgb3duIHByb2plY3QgaXMgdXNlZC4KLQkJSUphdmFNb2RlbCBqbW9kZWwgPSBqYXZhUHJvamVjdC5nZXRKYXZhTW9kZWwoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHJlc29sdmVkTGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJlc29sdmVkTGlzdFtpXSAhPSBudWxsICYmIHJlc29sdmVkTGlzdFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpIHsKLQkJCQlyZXMuYWRkKGptb2RlbC5nZXRKYXZhUHJvamVjdChyZXNvbHZlZExpc3RbaV0uZ2V0UGF0aCgpLnNlZ21lbnQoMCkpKTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgYmlsaXN0PSBiZWFuaW5mb3NMaXN0OwotCQlmb3IgKGludCBpPSAwOyBpIDwgYmlsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlCUExpc3RFbGVtZW50IGVsZW09IChCUExpc3RFbGVtZW50KWJpbGlzdC5nZXQoaSk7Ci0JCQlpZiAoZWxlbS5nZXRFbnRyeSgpLmdldEtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpIAotCQkJCXJlcy5hZGQoam1vZGVsLmdldEphdmFQcm9qZWN0KGVsZW0uZ2V0RW50cnkoKS5nZXRQYXRoKCkuc2VnbWVudCgwKSkpOwkJCQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1vZGlmeVNlYXJjaFBhdGhzKCkgewotCQkvLyBCcmluZyB1cCB0aGUgZGlhbG9nIGZvciBtb2RpZnlpbmcgc2VhcmNoIHBhdGhzIG9mIGEgcGFydGljdWxhciBiZWFuaW5mbyBlbnRyeS4KLQkJQlBCZWFuaW5mb0xpc3RFbGVtZW50IGVsZW0gPSAoQlBCZWFuaW5mb0xpc3RFbGVtZW50KSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsJLy8gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lLCBidXR0b24gbm90IGVuYWJsZWQgaWYgbm9uZSBvciBtb3JlIHRoYW4gb25lIHNlbGVjdGVkLgotCQlCZWFuaW5mb0VudHJ5U2VhcmNocGF0aERpYWxvZyBkaWFsb2cgPSBuZXcgQmVhbmluZm9FbnRyeVNlYXJjaHBhdGhEaWFsb2cobW9kaWZ5UGF0aHNCdXR0b24uZ2V0U2hlbGwoKSwgZWxlbSwgamF2YVByb2plY3QpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmFibGVkU3RhdGVzKCl7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJdGFibGUuc2V0RW5hYmxlZChiZWFuaW5mb1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JCWxhYmVsLnNldEVuYWJsZWQoYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCZWFuaW5mb0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYoamF2YVByb2plY3RzQ29tcG9zaXRlIT1udWxsICYmICFqYXZhUHJvamVjdHNDb21wb3NpdGUuaXNEaXNwb3NlZCgpKXsgCi0JCQkvLyB1aSBwb3B1bGF0ZWQKLQkJCXVwZGF0ZUVuYWJsZWRTdGF0ZXMoKTsKLQkJfQotCX0KLQotfSAgLy8gIEBqdmU6ZGVjbC1pbmRleD0wOnZpc3VhbC1jb25zdHJhaW50PSIxMCwxMCIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0V4Y2VwdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3NWVjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9FeGNlcHRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBFeGNlcHRpb25IYW5kbGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMjYgMjA6MjY6NTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkuY29yZS5KRU1VSVBsdWdpbjsKLSAKLS8qKgotICogCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGFuZGxlciB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZShJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUsIFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVRocm93YWJsZSB0YXJnZXQ9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQloYW5kbGUoKENvcmVFeGNlcHRpb24pdGFyZ2V0LCBzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCQl9IGVsc2UgewotCQkJSkVNVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZS5nZXRNZXNzYWdlKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGlzcGxheU1lc3NhZ2VEaWFsb2coZSwgZS5nZXRNZXNzYWdlKCksIHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQl9IGVsc2UgewotCQkJCWRpc3BsYXlNZXNzYWdlRGlhbG9nKGUsIHRhcmdldC5nZXRNZXNzYWdlKCksIHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZShDb3JlRXhjZXB0aW9uIGUsIFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCUpFTVVJUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJSVN0YXR1cyBzdGF0dXM9IGUuZ2V0U3RhdHVzKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCWRpc3BsYXlNZXNzYWdlRGlhbG9nKGUsIGUuZ2V0TWVzc2FnZSgpLCBzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZGlzcGxheU1lc3NhZ2VEaWFsb2coVGhyb3dhYmxlIHQsIFN0cmluZyBleGNlcHRpb25NZXNzYWdlLCBTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmdXcml0ZXIgbXNnPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCW1zZy53cml0ZShtZXNzYWdlKTsKLQkJCW1zZy53cml0ZSgiXG5cbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGV4Y2VwdGlvbk1lc3NhZ2UgPT0gbnVsbCB8fCBleGNlcHRpb25NZXNzYWdlLmxlbmd0aCgpID09IDApCi0JCQltc2cud3JpdGUoIlNlZSBlcnJvciBsb2cgZm9yIG1vcmUgZGV0YWlscy4iKTsgCi0JCWVsc2UKLQkJCW1zZy53cml0ZShleGNlcHRpb25NZXNzYWdlKTsKLQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtc2cudG9TdHJpbmcoKSk7CQkJCi0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvSUJ1aWxkU2VhcmNoUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvSUJ1aWxkU2VhcmNoUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGY5OGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0lCdWlsZFNlYXJjaFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElCdWlsZFNlYXJjaFBhZ2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8xMC8wMyAyMzowNjo0MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElCdWlsZFNlYXJjaFBhZ2UgewotCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0aW9uKCk7Ci0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKExpc3Qgc2VsZWN0aW9uKTsKLQlwdWJsaWMgdm9pZCBzZXRCZWFuaW5mb0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvSVN0YXR1c0NoYW5nZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9JU3RhdHVzQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjMjk1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9JU3RhdHVzQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElTdGF0dXNDaGFuZ2VMaXN0ZW5lci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA5LzI2IDIwOjI2OjU5ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0gCi0vKioKLSAqIFN0YXR1cyBjaGFuZ2UgbGlzdGVuZXIKLSAqIAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXR1c0NoYW5nZUxpc3RlbmVyIHsKLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIGdpdmVuIHN0YXR1cyBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0Jc3RhdHVzCXRoZSBuZXcgc3RhdHVzCi0JICovCi0Jdm9pZCBzdGF0dXNDaGFuZ2VkKElTdGF0dXMgc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0ltYWdlRGlzcG9zZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0ltYWdlRGlzcG9zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxYjgyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9JbWFnZURpc3Bvc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJbWFnZURpc3Bvc2VyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMjYgMjA6MjY6NTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0gCi0vKioKLSAqIAotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIEltYWdlRGlzcG9zZXIgaW1wbGVtZW50cyBEaXNwb3NlTGlzdGVuZXIgewotCQotCXByaXZhdGUgSW1hZ2VbXSBmSW1hZ2VzOwotCQkKLQlwdWJsaWMgSW1hZ2VEaXNwb3NlcihJbWFnZSBpbWFnZSkgewotCQl0aGlzKG5ldyBJbWFnZVtdIHsgaW1hZ2UgfSk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZURpc3Bvc2VyKEltYWdlW10gaW1hZ2VzKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaW1hZ2VzKTsKLQkJZkltYWdlcz0gaW1hZ2VzOwkJCi0JfQotCQotCS8qCi0JICogQHNlZSBXaWRnZXRMaXN0ZW5lciN3aWRnZXREaXNwb3NlZAotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCWlmIChmSW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmSW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZkltYWdlc1tpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvT3ZlcmxheUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvT3ZlcmxheUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg4ZDEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL092ZXJsYXlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogIENyZWF0ZWQgQXByIDI3LCAyMDA1IGJ5IEdpbGkgTWVuZGVsCi0gKiAKLSAqICAkUkNTZmlsZTogT3ZlcmxheUNvbXBvc2l0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0gCi0vL1RPRE86ICBUaGlzIGNsYXNzIHdhcyBkcm9wcGVkIGluIDMuMSBNNyBmcm9tIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm1pc2MKLS8vICAgICAgIFdlIG1hZGUgIGxvY2FsIGNvcHkgZm9yIHRoZSB0aW1lIGJlaW5nLiAgTmVlZCB0byBpbnZlc3RpZ2F0ZSBpZiB0aGlzIGlzIGZpbGUKLS8vICAgICAgIGZvciB1cyBnaXZlbiB0aGF0IHRoZSBPdmVybGF5SWNvbiAocmVwbGFjZW1lbnQpIGlzIGludGVybmFsCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0KLSAgICBwcml2YXRlIEltYWdlRGF0YSBiYWNrZ3JvdW5kSW1hZ2U7Ci0KLSAgICBwcml2YXRlIEltYWdlRGF0YSBsZWZ0SW1hZ2U7Ci0KLSAgICBwcml2YXRlIEltYWdlRGF0YSByaWdodEltYWdlOwotCi0gICAgcHJpdmF0ZSBJbWFnZURhdGEgdG9wSW1hZ2U7Ci0KLSAgICBwcml2YXRlIEltYWdlRGF0YSBib3R0b21JbWFnZTsKLQotICAgIHByaXZhdGUgTGlzdCBmb3JlZ3JvdW5kSW1hZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICoJQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIE92ZXJsYXlDb21wb3NpdGUoSW1hZ2VEYXRhIGJhY2tncm91bmQpIHsKLSAgICAgICAgYmFja2dyb3VuZEltYWdlID0gYmFja2dyb3VuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBZGQgdGhlIHBhc3NlZCBpbWFnZSB0byB0aGlzIGRlc2NyaXB0b3IncyBjb2xsZWN0aW9uIG9mIGltYWdlcyB0byAKLSAgICAgKiBiZSBjb21wb3NlZCB0b2dldGhlciB0byBjcmVhdGUgYW4gaW1hZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRm9yZWdyb3VuZEltYWdlKEltYWdlRGF0YSBpbWFnZSkgewotICAgICAgICBmb3JlZ3JvdW5kSW1hZ2VzLmFkZChpbWFnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICpTdXBlcmltcG9zZSBzZWxmJ3MgaW1hZ2VzIHdpdGhpbiB0aGUgZ2l2ZW4gYm91bmRzIGJ5IG1lYW5zIG9mICNkcmF3SW1hZ2UKLSAgICAgKgotICAgICAqQHNlZSBDb21wb3NpdGVJbWFnZSNkcmF3SW1hZ2UoSW1hZ2VEYXRhIHNyYyxpbnQgb3gsaW50IG95KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy9kcmF3IGJhY2tncm91bmQKLSAgICAgICAgZHJhd0ltYWdlKGJhY2tncm91bmRJbWFnZSwgZ2V0TGVmdEJvdW5kKCksIGdldFRvcEJvdW5kKCkpOwotCi0gICAgICAgIC8vZHJhdyBmb3JlZ3JvdW5kIGltYWdlcwotICAgICAgICBJdGVyYXRvciBlID0gZm9yZWdyb3VuZEltYWdlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZS5oYXNOZXh0KCkpCi0gICAgICAgICAgICBkcmF3SW1hZ2UoKChJbWFnZURhdGEpIGUubmV4dCgpKSwgZ2V0TGVmdEJvdW5kKCksIGdldFRvcEJvdW5kKCkpOwotCi0gICAgICAgIC8vZHJhdyBleHRlbnNpb25zCi0gICAgICAgIGlmICh0b3BJbWFnZSAhPSBudWxsKQotICAgICAgICAgICAgZHJhd0ltYWdlKHRvcEltYWdlLCBnZXRMZWZ0Qm91bmQoKSwgMCk7Ci0gICAgICAgIGlmIChib3R0b21JbWFnZSAhPSBudWxsKQotICAgICAgICAgICAgZHJhd0ltYWdlKGJvdHRvbUltYWdlLCBnZXRMZWZ0Qm91bmQoKSwgaGVpZ2h0IC0gYm90dG9tSW1hZ2UuaGVpZ2h0KTsKLSAgICAgICAgaWYgKGxlZnRJbWFnZSAhPSBudWxsKQotICAgICAgICAgICAgZHJhd0ltYWdlKGxlZnRJbWFnZSwgMCwgZ2V0VG9wQm91bmQoKSk7Ci0gICAgICAgIGlmIChyaWdodEltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBkcmF3SW1hZ2UocmlnaHRJbWFnZSwgd2lkdGggLSByaWdodEltYWdlLndpZHRoLCBnZXRUb3BCb3VuZCgpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgT2JqZWN0I2VxdWFscwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgT3ZlcmxheUNvbXBvc2l0ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBPdmVybGF5Q29tcG9zaXRlIG90aGVyID0gKE92ZXJsYXlDb21wb3NpdGUpIG87Ci0KLSAgICAgICAgcmV0dXJuIGVxdWFscyhiYWNrZ3JvdW5kSW1hZ2UsIG90aGVyLmJhY2tncm91bmRJbWFnZSkKLSAgICAgICAgICAgICAgICAmJiBlcXVhbHMobGVmdEltYWdlLCBvdGhlci5sZWZ0SW1hZ2UpCi0gICAgICAgICAgICAgICAgJiYgZXF1YWxzKHJpZ2h0SW1hZ2UsIG90aGVyLnJpZ2h0SW1hZ2UpCi0gICAgICAgICAgICAgICAgJiYgZXF1YWxzKHRvcEltYWdlLCBvdGhlci50b3BJbWFnZSkKLSAgICAgICAgICAgICAgICAmJiBlcXVhbHMoYm90dG9tSW1hZ2UsIG90aGVyLmJvdHRvbUltYWdlKQotICAgICAgICAgICAgICAgICYmIGVxdWFscyhmb3JlZ3JvdW5kSW1hZ2VzLCBvdGhlci5mb3JlZ3JvdW5kSW1hZ2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcml2YXRlIHV0aWxpdHkgZm9yIGNvbXBhcmluZyB0d28gcG9zc2libHktbnVsbCBvYmplY3RzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAgICAgcmV0dXJuIG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIGxlZnQtbW9zdCBjb29yZGluYXRlIHRoYXQgdGhlIG1haW4gaW1hZ2UgY2FuIGRyYXcgdG8KLSAgICAgKgotICAgICAqCUByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRMZWZ0Qm91bmQoKSB7Ci0gICAgICAgIGlmIChsZWZ0SW1hZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHJldHVybiBsZWZ0SW1hZ2Uud2lkdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIHNlbGYncyBzaXplLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBzaXplIG9mIHRoZSBpbml0aWFsbHktCi0gICAgICoJcHJvdmlkZWQgYmFzZS1sZXZlbCBpbWFnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotICAgICAgICAvL3N0YXJ0IHdpdGggYmFzaWMgc2l6ZQotICAgICAgICBQb2ludCBzaXplID0gbmV3IFBvaW50KGJhY2tncm91bmRJbWFnZS53aWR0aCwgYmFja2dyb3VuZEltYWdlLmhlaWdodCk7Ci0KLSAgICAgICAgLy9vdmVybGF5cyBtYXkgaW5jcmVhc2Ugc2l6ZS4KLSAgICAgICAgaWYgKHRvcEltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBzaXplLnkgKz0gdG9wSW1hZ2UuaGVpZ2h0OwotCi0gICAgICAgIGlmIChib3R0b21JbWFnZSAhPSBudWxsKQotICAgICAgICAgICAgc2l6ZS55ICs9IGJvdHRvbUltYWdlLmhlaWdodDsKLQotICAgICAgICBpZiAobGVmdEltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBzaXplLnggKz0gbGVmdEltYWdlLndpZHRoOwotCi0gICAgICAgIGlmIChyaWdodEltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBzaXplLnggKz0gcmlnaHRJbWFnZS53aWR0aDsKLQotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIHRvcC1tb3N0IGNvb3JkaW5hdGUgdGhhdCB0aGUgbWFpbiBpbWFnZSBjYW4gZHJhdyB0bwotICAgICAqCi0gICAgICoJQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldFRvcEJvdW5kKCkgewotICAgICAgICBpZiAodG9wSW1hZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHJldHVybiB0b3BJbWFnZS5oZWlnaHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBPYmplY3QjaGFzaENvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gaGFzaENvZGUoYmFja2dyb3VuZEltYWdlKSArIGhhc2hDb2RlKGxlZnRJbWFnZSkKLSAgICAgICAgICAgICAgICArIGhhc2hDb2RlKHJpZ2h0SW1hZ2UpICsgaGFzaENvZGUodG9wSW1hZ2UpCi0gICAgICAgICAgICAgICAgKyBoYXNoQ29kZShib3R0b21JbWFnZSkgKyBoYXNoQ29kZShmb3JlZ3JvdW5kSW1hZ2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcml2YXRlIHV0aWxpdHkgZm9yIGdldHRpbmcgdGhlIGhhc2hDb2RlIGZvciBhbgotICAgICAqIG9iamVjdCB0aGF0IG1heSBiZSBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGhhc2hDb2RlKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBvID09IG51bGwgPyAwIDogby5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXQgdGhlIGltYWdlIHRvIGJlIGRyYXduIGJlbG93IHRoZSBwcmltYXJ5IG92ZXJsYXkgcmVnaW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvdHRvbUV4dGVuc2lvbihJbWFnZURhdGEgdmFsdWUpIHsKLSAgICAgICAgYm90dG9tSW1hZ2UgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0IHRoZSBpbWFnZSB0byBiZSBkcmF3biB0byB0aGUgbGVmdCBvZiB0aGUgcHJpbWFyeSBvdmVybGF5IHJlZ2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMZWZ0RXh0ZW5zaW9uKEltYWdlRGF0YSB2YWx1ZSkgewotICAgICAgICBsZWZ0SW1hZ2UgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0IHRoZSBpbWFnZSB0byBiZSBkcmF3biB0byB0aGUgcmlnaHQgb2YgdGhlIHByaW1hcnkgb3ZlcmxheSByZWdpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmlnaHRFeHRlbnNpb24oSW1hZ2VEYXRhIHZhbHVlKSB7Ci0gICAgICAgIHJpZ2h0SW1hZ2UgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0IHRoZSBpbWFnZSB0byBiZSBkcmF3biBhYm92ZSB0aGUgcHJpbWFyeSBvdmVybGF5IHJlZ2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb3BFeHRlbnNpb24oSW1hZ2VEYXRhIHZhbHVlKSB7Ci0gICAgICAgIHRvcEltYWdlID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9QYWNrYWdlT25seUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvUGFja2FnZU9ubHlDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhZDE4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9QYWNrYWdlT25seUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0vKgotICogICRSQ1NmaWxlOiBQYWNrYWdlT25seUNvbnRlbnRQcm92aWRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IGphdmEudXRpbC4qOwotLyoqCi0gKiBBIGNvbnRlbnQgcHJvdmlkZXIgd2hpY2ggd2lsbCBvbmx5IGdvIGRvd24gdG8gdGhlIHBhY2thZ2UgbGV2ZWwsCi0gKiBpdCB3b24ndCBleHBsb3JlIGZ1cnRoZXIuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBpcyBzbyB0aGF0IHBsdXMgc2lnbnMgKCcrJykKLSAqIHdvbid0IHNob3cgdXAgb24gcGFja2FnZXMuIFRoZSBGaWx0ZXIgdGVjaG5pcXVlIGNvdWxkIGJlIHVzZWQgdG8gbm90Ci0gKiBzaG93IHRoZSBjaGlsZHJlbiwgYnV0IHRoaXMgc3RpbGwgc2hvd3MgdGhlIHBsdXMgc2lnbi4KLSAqCi0gKiBBbHNvLCBpZiB0aGUgZWxlbWVudCBpcyBhIGphdmEudXRpbC5MaXN0LCB0aGVuIHRoYXQgbGlzdCB3aWxsIGJlIHJldHVybmVkCi0gKiBhcyB0aGUgY2hpbGRyZW4uIFRoaXMgYWxsb3dzIGZvciBhIHJvb3QgdG8gYmUgY29tcG9zZWQgaW5zdGVhZCBvZiBiZWluZwotICogb25lIG9mIHRoZSBzdGFuZGFyZCBKYXZhIEVsZW1lbnRzLgotICovCi0KLXB1YmxpYyBjbGFzcyBQYWNrYWdlT25seUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIgewotCQotCS8qKgotCSAqIElmIHRoZSBlbGVtZW50IGlzIGEgbGlzdCwgcmV0dXJuIHRoZSBpdGVyYXRvciBvbiBpdC4KLQkgKiBFbHNlIHNlbmQgaXQgdXAgdGhlIGNoYWluLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3QpCi0JCQlyZXR1cm4gKChMaXN0KSBlbGVtZW50KS50b0FycmF5KCk7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIGVsZW1lbnQgaXMgYSBsaXN0IGFuZCBpdCBpcyBub3QgZW1wdHksIGl0IGhhcyBjaGlsZHJlbiwKLQkgKiBpZiBpdCBpcyBhIElQYWNrYWdlRnJhZ21lbnQgaXQgZG9lcyBub3QsCi0JICogZWxzZSBzZW5kIGl0IHVwIHRoZSBjaGFpbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3QpCi0JCQlyZXR1cm4gISgoTGlzdCkgZWxlbWVudCkuaXNFbXB0eSgpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9QYWNrYWdlc1dvcmtib29rUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvUGFja2FnZXNXb3JrYm9va1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0MjNjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9QYWNrYWdlc1dvcmtib29rUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBhY2thZ2VzV29ya2Jvb2tQYWdlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMTAvMDMgMjM6MDY6NDIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5TZWFyY2hwYXRoRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBQYWNrYWdlc1dvcmtib29rUGFnZSBpbXBsZW1lbnRzIElCdWlsZFNlYXJjaFBhZ2UgewotCQotCS8qKgotCSAqIFZhbGlkYXRvciBmb3IgdGhpcyB3b3JrYm9vayBwYWdlIHRvIHZlcmlmeSB0aGUgc2VsZWN0aW9ucyBvbiBDaG9vc2UgcGFnZS4KLQkgKiBAdmVyc2lvbiAJMS4wCi0JICogQGF1dGhvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hvb3NlUGFja2FnZXNTZWxlY3Rpb25WYWxpZGF0b3IgaW1wbGVtZW50cyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHsKLQotCQlwcml2YXRlIElTdGF0dXMgZmdFcnJvclN0YXR1cyA9IFN0YXR1c0hlbHBlci5FUlJPUl9TVEFUVVM7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBJU3RhdHVzIGZnT0tTdGF0dXMgPSBTdGF0dXNIZWxwZXIuT0tfU1RBVFVTOwotCi0JCXB1YmxpYyBDaG9vc2VQYWNrYWdlc1NlbGVjdGlvblZhbGlkYXRvcigpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVNlbGVjdGlvblZhbGlkYXRvciN2YWxpZGF0ZShPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQkJCWlmIChpc1ZhbGlkKHNlbGVjdGlvbikpIHsKLQkJCQlyZXR1cm4gZmdPS1N0YXR1czsKLQkJCX0KLQkJCXJldHVybiBmZ0Vycm9yU3RhdHVzOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2VsZWN0aW9uW2ldIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkKLQkJCQkJY29udGludWU7IC8vIEZyYWdtZW50cyBhcmUgYWx3YXlzIHZhbGlkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfQotCi0JCi0JcHJpdmF0ZSBMYWJlbCBsYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgYnV0dG9uQmFyID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBjaG9vc2VQYWNrYWdlc0J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gY2hvb3NlRGVmUGF0aHNCdXR0b24gPSBudWxsOwotCXByaXZhdGUgTGFiZWwgc3BhY2VyMSA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uID0gbnVsbDsKLQkvLyAuLi4gdWkKLQkKLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBCZWFuaW5mb1BhdGhzQmxvY2sgYmVhbmluZm9zUGF0aHNCbG9jayA9IG51bGw7Ci0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdFtdW10gcm9vdHNQZXJSYXdFbnRyeTsKLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIHJhd0xpc3Q7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcml2YXRlIExpc3QgcGFja2FnZXNMaXN0ID0gbnVsbDsKLQlwcml2YXRlIENvbXBvc2l0ZSB0b3A7Ci0KLQlwdWJsaWMgUGFja2FnZXNXb3JrYm9va1BhZ2UoSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCwgQmVhbmluZm9QYXRoc0Jsb2NrIGJlYW5pbmZvc1BhdGhzQmxvY2spIHsKLQkJdGhpcy5iZWFuaW5mb3NQYXRoc0Jsb2NrID0gYmVhbmluZm9zUGF0aHNCbG9jazsKLQkJdGhpcy5wYWNrYWdlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IG5ldyBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpewotCQl0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJdG9wLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwodG9wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLlBhY2thZ2VzV29ya2Jvb2tfTGFiZWxUZXh0KTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNyZWF0ZVRhYmxlKCk7Ci0JCWNyZWF0ZUJ1dHRvbkJhcigpOwotCQl0b3Auc2V0U2l6ZShuZXcgUG9pbnQoMzAwLCAyMDApKTsKLQkJdXBkYXRlRW5hYmxlZFN0YXRlcygpOwotCQlpZihzcGFjZXIxPT1udWxsKXsKLQkJCS8vVE9ETzogCi0JCX0KLQkJcmV0dXJuIHRvcDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0YWJsZQkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZSgpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGExID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGExLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGExLnZlcnRpY2FsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YTEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQl0YWJsZSA9IG5ldyBUYWJsZSh0b3AsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhMSk7Ci0JCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFNQTGlzdEVsZW1lbnRTb3J0ZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KHBhY2thZ2VzTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgYnV0dG9uQmFyCQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvbkJhcigpIHsKLQkJUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLQkJcm93TGF5b3V0LnR5cGUgPSBvcmcuZWNsaXBzZS5zd3QuU1dULlZFUlRJQ0FMOwotCQlyb3dMYXlvdXQuZmlsbCA9IHRydWU7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhKCk7Ci0JCWdyaWREYXRhMi5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMi52ZXJ0aWNhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkJFR0lOTklORzsKLQkJYnV0dG9uQmFyID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLQkJYnV0dG9uQmFyLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJYnV0dG9uQmFyLnNldExheW91dChyb3dMYXlvdXQpOwotCQljaG9vc2VQYWNrYWdlc0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQmFyLCBTV1QuTk9ORSk7Ci0JCWNob29zZVBhY2thZ2VzQnV0dG9uLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLlBhY2thZ2VzV29ya2Jvb2tfQ2hvb3NlUGFja2FnZXMpOwotCQljaG9vc2VQYWNrYWdlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZmluYWwgTGlzdCBlbGVtZW50c1RvQWRkID0gY2hvb3NlUGFja2FnZXMoKTsKLQkJCQlhZGRUb1BhY2thZ2VzTGlzdChlbGVtZW50c1RvQWRkKTsKLQkJCX0KLQkJfSk7Ci0JCWNob29zZURlZlBhdGhzQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5OT05FKTsKLQkJY2hvb3NlRGVmUGF0aHNCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuUGFja2FnZXNXb3JrYm9va19DaG9vc2VEZWZpbmVkUGF0aHMpOwotCQljaG9vc2VEZWZQYXRoc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBlbGVtZW50c1RvQWRkID0gY2hvb3NlRGVmaW5lZCgpOwotCQkJCWFkZFRvUGFja2FnZXNMaXN0KGVsZW1lbnRzVG9BZGQpOwotCQkJfQotCQl9KTsKLQkJc3BhY2VyMSA9IG5ldyBMYWJlbChidXR0b25CYXIsIFNXVC5OT05FKTsKLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5OT05FKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLlBhY2thZ2VzV29ya2Jvb2tfUmVtb3ZlKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IHNlbGVjdGVkID0gQmVhbmluZm9QYXRoc0Jsb2NrLmdldFNlbGVjdGVkTGlzdCh0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJcGFja2FnZXNMaXN0LnJlbW92ZUFsbChzZWxlY3RlZCk7Ci0JCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkVG9QYWNrYWdlc0xpc3QoZmluYWwgTGlzdCB0b0FkZCl7Ci0JCWlmICh0b0FkZCAhPSBudWxsICYmICF0b0FkZC5pc0VtcHR5KCkpIHsKLQkJCXBhY2thZ2VzTGlzdC5hZGRBbGwodG9BZGQpOwotCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJdGFibGUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0b0FkZCkpOwotCQkJCX0KLQkJCX0pOwotCQkJcGFnZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUphdmFQcm9qZWN0IGpwcm9qZWN0KSB7Ci0JCWphdmFQcm9qZWN0ID0ganByb2plY3Q7Ci0JCWxhYmVsUHJvdmlkZXIuc2V0SmF2YVByb2plY3QoanByb2plY3QpOwotCQl0cnkgewotCQkJcmF3TGlzdCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJcm9vdHNQZXJSYXdFbnRyeSA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtyYXdMaXN0Lmxlbmd0aF1bXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmF3TGlzdC5sZW5ndGg7IGkrKykgewotCQkJCXJvb3RzUGVyUmF3RW50cnlbaV0gPSBqYXZhUHJvamVjdC5maW5kUGFja2FnZUZyYWdtZW50Um9vdHMocmF3TGlzdFtpXSk7Ci0JCQl9CQkKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJhd0xpc3QgPSBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOwotCQkJcm9vdHNQZXJSYXdFbnRyeSA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFswXVtdOwotCQl9Ci0JCXVwZGF0ZVBhY2thZ2VzTGlzdCgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGF0aHNCbG9jay5nZXRTZWxlY3RlZExpc3QodGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihMaXN0IHNlbGVjdGlvbikgewotCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVQYWNrYWdlc0xpc3QoKSB7Ci0JCUxpc3Qgc3BlbGVtZW50cyA9IGJlYW5pbmZvc1BhdGhzQmxvY2suZ2V0U2VhcmNocGF0aE9yZGVyaW5nUGFnZSgpLmdldEVsZW1lbnRzKCk7Ci0KLQkJTGlzdCBwYWNrYWdlRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KHNwZWxlbWVudHMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlCUExpc3RFbGVtZW50IHNwZSA9IChCUExpc3RFbGVtZW50KSBzcGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChzcGUgaW5zdGFuY2VvZiBCUFNlYXJjaExpc3RFbGVtZW50KSB7Ci0JCQkJcGFja2FnZUVsZW1lbnRzLmFkZChzcGUpOwotCQkJfQotCQl9Ci0JCXBhY2thZ2VzTGlzdC5jbGVhcigpOwotCQlwYWNrYWdlc0xpc3QuYWRkQWxsKHBhY2thZ2VFbGVtZW50cyk7Ci0JCWlmKHRhYmxlVmlld2VyIT1udWxsICYmICF0YWJsZS5pc0Rpc3Bvc2VkKCkpCi0JCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hvb3NlIHRoZSBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgc2VhcmNoIHBhdGguCi0JICovCi0JcHJpdmF0ZSBMaXN0IGNob29zZVBhY2thZ2VzKCkgewotCi0JCUlTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IENob29zZVBhY2thZ2VzU2VsZWN0aW9uVmFsaWRhdG9yKCk7Ci0KLQkJLy8gU2hvdyB1cCB0byB0aGUgcGFja2FnZSBmcmFnbWVudCwgZG9uJ3Qgc2hvdyBhbnkgY29udGVudHMgb2YgaXQuCi0JCUNsYXNzW10gYWNjZXB0ZWRDbGFzc2VzID0KLQkJCW5ldyBDbGFzc1tdIHsgSUphdmFQcm9qZWN0LmNsYXNzLCBJUGFja2FnZUZyYWdtZW50Um9vdC5jbGFzcywgSVBhY2thZ2VGcmFnbWVudC5jbGFzcyB9OwotCQlPYmplY3RbXSByZWplY3RlZEZyYWdtZW50cyA9IGdldEZpbHRlcmVkRXhpc3RpbmdFbnRyaWVzKCk7Ci0KLQkJLy8gT25seSBzaG93IHBhY2thZ2UgZnJhZ21lbnRzIHRoYXQgaGF2ZSBjaGlsZHJlbiAoaS5lLiB0aGVyZSBjbGFzc2VzIGluIGl0LCBub3QgaW50ZXJlc3RlZAotCQkvLyBpbiBpbnRlcm1lZGlhdGUgb25lcyB0aGF0IGhhdmUgbm8gY2xhc3NlcyBkZWZpbmVkIGluIHRoZW0uIFRob3NlIGFyZSBmaWx0ZXJlZCBvdXQuCi0JCVR5cGVkVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBUeXBlZFZpZXdlckZpbHRlcihhY2NlcHRlZENsYXNzZXMsIHJlamVjdGVkRnJhZ21lbnRzKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKHN1cGVyLnNlbGVjdCh2aWV3ZXIsIHBhcmVudEVsZW1lbnQsIGVsZW1lbnQpKSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmV0dXJuIHBrZy5oYXNDaGlsZHJlbigpOwotCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCi0JCUlUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFBhY2thZ2VPbmx5Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfREVGQVVMVCk7Ci0JCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2codG9wLmdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIsIHByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldFRpdGxlKEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX2FkZHNlYXJjaHBhdGhfdGl0bGUpOwotCi0JCWRpYWxvZy5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fYWRkc2VhcmNocGF0aF9kZXNjcmlwdGlvbik7Ci0JCWRpYWxvZy5hZGRGaWx0ZXIoZmlsdGVyKTsKLQkJZGlhbG9nLnNldElucHV0KGphdmFQcm9qZWN0KTsKLQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkJTGlzdCBuZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlCUExpc3RFbGVtZW50IG5ld0d1eSA9IG5ld0JQTGlzdEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCWlmIChuZXdHdXkgIT0gbnVsbCkKLQkJCQkJbmV3RWxlbWVudHMuYWRkKG5ld0d1eSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3RWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEJQTGlzdEVsZW1lbnQgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEJQTGlzdEVsZW1lbnQgbmV3QlBMaXN0RWxlbWVudChPYmplY3QgZWxlbWVudCkgewotCQlTZWFyY2hwYXRoRW50cnkgc2UgPSBudWxsOwotCQlib29sZWFuIGlzRXhwb3J0ZWQgPSBmYWxzZTsKLQkJSVBhY2thZ2VGcmFnbWVudCBmcmFnID0gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7Ci0JCS8vIE5lZWQgdG8gZmluZCBjb3JyZXNwb25kaW5nIHJhdyBjbGFzcyBwYXRoIGVudHJ5LgotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBmcmFnLmdldFBhcmVudCgpOyAvLyBHZXQgZnJhZyByb290LgotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzUGVyUmF3RW50cnkubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcm9vdHNQZXJSYXdFbnRyeVtpXS5sZW5ndGg7IGorKykgewotCQkJCWlmIChyb290c1BlclJhd0VudHJ5W2ldW2pdLmVxdWFscyhyb290KSkgewotCQkJCQlpc0V4cG9ydGVkID0gcmF3TGlzdFtpXS5pc0V4cG9ydGVkKCkgfHwgcmF3TGlzdFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRTsKLQkJCQkJc2UgPSBuZXcgU2VhcmNocGF0aEVudHJ5KHJhd0xpc3RbaV0uZ2V0RW50cnlLaW5kKCksIHJhd0xpc3RbaV0uZ2V0UGF0aCgpLCBmcmFnLmdldEVsZW1lbnROYW1lKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEJQU2VhcmNoTGlzdEVsZW1lbnQoc2UsIGZhbHNlLCBmYWxzZSwgaXNFeHBvcnRlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGVudHJpZXMgdGhhdCBhbHJlYWR5IGFyZSBpbiB0aGUgc2VhcmNoIHBhdGgKLQkgKiBzbyB0aGF0IHRoZXkgZG9uJ3Qgc2hvdyB1cCBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RmlsdGVyZWRFeGlzdGluZ0VudHJpZXMoKSB7Ci0JCXRyeSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJCUxpc3QgZW50cmllcyA9IHBhY2thZ2VzTGlzdDsKLQkJCUxpc3QgZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdChlbnRyaWVzLnNpemUoKSk7Ci0JCQlJdGVyYXRvciBpdHIgPSBlbnRyaWVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCUJQTGlzdEVsZW1lbnQgZWxlbSA9IChCUExpc3RFbGVtZW50KSBpdHIubmV4dCgpOwotCQkJCWlmIChlbGVtIGluc3RhbmNlb2YgQlBTZWFyY2hMaXN0RWxlbWVudCkgewotCQkJCQlCUFNlYXJjaExpc3RFbGVtZW50IGJzZSA9IChCUFNlYXJjaExpc3RFbGVtZW50KSBlbGVtOwotCQkJCQlmcmFnbWVudHMuYWRkQWxsKGdldFBhY2thZ2VzKGJzZSwgcm9vdHMpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZnJhZ21lbnRzLnRvQXJyYXkoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0JCi0JLyoqCi0JICogRmluZCB0aGUgcGFja2FnZSBmcmFnbWVudHMgZm9yIHRoaXMgcGFja2FnZSBlbnRyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQYWNrYWdlcyhCUFNlYXJjaExpc3RFbGVtZW50IGVsZW1lbnQsIElQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gKChTZWFyY2hwYXRoRW50cnkpIGVsZW1lbnQuZ2V0RW50cnkoKSkuZ2V0UGFja2FnZSgpOwotCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCXRyeSB7Ci0JCQlMaXN0IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgxMCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUphdmFFbGVtZW50W10gcGZzID0gcm9vdHNbaV0uZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBmcy5sZW5ndGg7IGorKykKLQkJCQkJaWYgKHBmc1tqXS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UCi0JCQkJCQkmJiBwZnNbal0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpKSB7Ci0JCQkJCQlwYWNrYWdlcy5hZGQocGZzW2pdKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcGFja2FnZXM7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCS8qKgotCSAqIENob29zZSB0aGUgcHJlLWRlZmluZWQgc2VhcmNoIHBhdGhzIHRoYXQgc2hvdWxkIGJlIGluIHRoZSBzZWFyY2ggcGF0aC4KLQkgKi8KLQlwcml2YXRlIExpc3QgY2hvb3NlRGVmaW5lZCgpIHsKLQotCQkvLyBDdXJyZW50IHByZS1kZWZpbmVkIG9uZXMgYXJlIG9ubHkgcHJlLXJlcWVkIHByb2plY3RzLgotCQkvLyBUaGUgbGlzdCBvZiBpbnB1dHMgd2lsbCBub3QgY29udGFpbiBhbnkgYWxyZWFkeSBpbiB0aGUgcGF0aC4KLQkJLy8gV2Ugd2lsbCBjcmVhdGUgdGhlbSBoZXJlIGFuZCBpZiBub3Qgc2VsZWN0ZWQgdGhleSB3aWxsIHRocm93biBhd2F5LgotCQkvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZXJlIGFyZSBub3QgdmVyeSBtYW55IGFuZCBvdXIgU2VhcmNoUGF0aExpc3RMYWJlbFByb3ZpZGVyIGRvZXMKLQkJLy8gYSBnb29kIGpvYiBvZiBzaG93aW5nIHRoZW0uIE90aGVyd2lzZSB3ZSB3b3VsZCBuZWVkIHRvIGNvbWUgdXAgd2l0aCBvbmUgdGhhdCBjYW4gc2hvdwotCQkvLyBJSmF2YVByb2plY3RzIHdoZW4gd2UgZ2V0IHRoZW0uCi0JCUxpc3QgaW5wdXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGN1cnJlbnRMaXN0ID0gcGFja2FnZXNMaXN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJhd0xpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyYXdMaXN0W2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewotCQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50TGlzdC5zaXplKCk7IGorKykgewotCQkJCQlCUFNlYXJjaExpc3RFbGVtZW50IGJzZSA9IChCUFNlYXJjaExpc3RFbGVtZW50KSBjdXJyZW50TGlzdC5nZXQoaik7Ci0JCQkJCWlmIChic2UuZ2V0RW50cnkoKS5nZXRLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUICYmIHJhd0xpc3RbaV0uZ2V0UGF0aCgpLmVxdWFscyhic2UuZ2V0RW50cnkoKS5nZXRQYXRoKCkpKSB7Ci0JCQkJCQlleGlzdHMgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCFleGlzdHMpCi0JCQkJCWlucHV0cy5hZGQobmV3IEJQU2VhcmNoTGlzdEVsZW1lbnQobmV3IFNlYXJjaHBhdGhFbnRyeShJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QsIHJhd0xpc3RbaV0uZ2V0UGF0aCgpLCBudWxsKSwgZmFsc2UsIGZhbHNlLCByYXdMaXN0W2ldLmlzRXhwb3J0ZWQoKSkpOwotCQkJfQotCQl9Ci0JCQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyMSA9IG5ldyBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIoamF2YVByb2plY3QpOwotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPQotCQkJbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKHRvcC5nZXRTaGVsbCgpLCBsYWJlbFByb3ZpZGVyMSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShCZWFuSW5mb1VJTWVzc2FnZXMuUGFja2FnZXNXb3JrYm9va19TZWxlY3Rpb25EaWFsb2dfRGVmaW5lZFBhdGhzX1RpdGxlKTsgCi0KLQkJZGlhbG9nLnNldE1lc3NhZ2UoQmVhbkluZm9VSU1lc3NhZ2VzLlBhY2thZ2VzV29ya2Jvb2tfU2VsZWN0aW9uRGlhbG9nX0RlZmluZWRQYXRoc19NZXNzYWdlKTsgCi0JCWRpYWxvZy5zZXRFbGVtZW50cyhpbnB1dHMudG9BcnJheSgpKTsKLQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0JCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChkaWFsb2cuZ2V0UmVzdWx0KCkpOwotCQllbHNlCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCl7Ci0JCWNob29zZURlZlBhdGhzQnV0dG9uLnNldEVuYWJsZWQoYmVhbmluZm9zUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJY2hvb3NlUGFja2FnZXNCdXR0b24uc2V0RW5hYmxlZChiZWFuaW5mb3NQYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQkKLQkJTGlzdCBzZWxlY3RlZCA9IEJlYW5pbmZvUGF0aHNCbG9jay5nZXRTZWxlY3RlZExpc3QodGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChzZWxlY3RlZCE9bnVsbCAmJiBzZWxlY3RlZC5zaXplKCk+MCAmJiBiZWFuaW5mb3NQYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTb21ldGhpbmcgaW1wb3J0YW50IGFib3V0IHRoZSBwYWdlIGNoYW5nZWQgLSBwZXJmb3JtIHVwZGF0ZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlZCgpewotCQl1cGRhdGVTZWFyY2hwYXRoTGlzdCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VhcmNocGF0aExpc3QoKSB7Ci0JCUxpc3Qgc2VhcmNoZWxlbWVudHMgPSBiZWFuaW5mb3NQYXRoc0Jsb2NrLmdldFNlYXJjaHBhdGhPcmRlcmluZ1BhZ2UoKS5nZXRFbGVtZW50cygpOwotCi0JCUxpc3QgcGFja2FnZWVsZW1lbnRzID0gcGFja2FnZXNMaXN0OwotCi0JCWJvb2xlYW4gY2hhbmdlRG9uZSA9IGZhbHNlOwotCQkvLyBGaXJzdCBnbyB0aHJvdWdoIHRoZSBzZWFyY2ggcGF0aCBhbmQgcmVtb3ZlIGFueSBTZWFyY2hMaXN0RWxlbWVudHMgdGhhdCBhcmUKLQkJLy8gbm90IGluIHRoZSBzZWFyY2ggcGFja2FnZXMgbGlzdCBmcm9tIHRoaXMgcGFnZS4KLQkJZm9yIChMaXN0SXRlcmF0b3Igc3BpdHIgPSBzZWFyY2hlbGVtZW50cy5saXN0SXRlcmF0b3Ioc2VhcmNoZWxlbWVudHMuc2l6ZSgpKTsKLQkJCXNwaXRyLmhhc1ByZXZpb3VzKCk7Ci0JCQkpIHsKLQkJCUJQTGlzdEVsZW1lbnQgZWxlbWVudCA9IChCUExpc3RFbGVtZW50KSBzcGl0ci5wcmV2aW91cygpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCUFNlYXJjaExpc3RFbGVtZW50ICYmICFwYWNrYWdlZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpKSB7Ci0JCQkJLy8gU2VhcmNoIGVsZW1lbnQgYW5kIG5vdCBmb3VuZCBpbiBwYWNrYWdlcyBsaXN0IHNvIHJlbW92ZSBpdCBmcm9tIHNlYXJjaHBhdGggbGlzdC4KLQkJCQlzcGl0ci5yZW1vdmUoKTsKLQkJCQljaGFuZ2VEb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBBbnkgbGVmdCBvdmVyIGluIHBhY2thZ2VzIGxpc3QgYXJlIG5ldyBhbmQgbmVlZCB0byBiZSBhZGRlZC4KLQkJc2VhcmNoZWxlbWVudHMuYWRkQWxsKHBhY2thZ2VlbGVtZW50cyk7Ci0JCWNoYW5nZURvbmUgPSBjaGFuZ2VEb25lIHx8ICFwYWNrYWdlZWxlbWVudHMuaXNFbXB0eSgpOwotCi0JCWlmIChjaGFuZ2VEb25lKQotCQkJYmVhbmluZm9zUGF0aHNCbG9jay5zZXRTZWFyY2hPcmRlckVsZW1lbnRzKHNlYXJjaGVsZW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmFibGVkU3RhdGVzKCl7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJdGFibGUuc2V0RW5hYmxlZChiZWFuaW5mb3NQYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQlsYWJlbC5zZXRFbmFibGVkKGJlYW5pbmZvc1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJlYW5pbmZvRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotCQlpZih0b3AhPW51bGwgJiYgIXRvcC5pc0Rpc3Bvc2VkKCkpCi0JCQl1cGRhdGVFbmFibGVkU3RhdGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvU1BMaXN0RWxlbWVudFNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvU1BMaXN0RWxlbWVudFNvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjI4ODVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1NQTGlzdEVsZW1lbnRTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpOwotLyoKLSAqICAkUkNTZmlsZTogU1BMaXN0RWxlbWVudFNvcnRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLlNlYXJjaHBhdGhFbnRyeTsKLQotLyoqCi0gKiBTb3J0ZXIgZm9yIHNvcnRpbmcgQlBTZWFyY2hMaXN0RWxlbWVudHMgd2l0aGluIHRoZSBtYWluIGxpc3QuCi0gKiBJdCBpcyBub3QgdG8gYmUgdXNlZCBvbiBlbGVtZW50cyB3aXRoaW4gYSBzcGVjaWZpYyBiZWFuaW5mbyBlbnRyeS4KLSAqIAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgU1BMaXN0RWxlbWVudFNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCi0JLyoKLQkgKiBAc2VlIFZpZXdlclNvcnRlciNjYXRlZ29yeShPYmplY3QpCi0JICovCi0JcHVibGljIGludCBjYXRlZ29yeShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBCUFNlYXJjaExpc3RFbGVtZW50KSB7Ci0JCQlCUFNlYXJjaExpc3RFbGVtZW50IGVsZW1lbnQgPSAoQlBTZWFyY2hMaXN0RWxlbWVudCkgb2JqOwotCQkJCi0JCQlzd2l0Y2ggKCgoU2VhcmNocGF0aEVudHJ5KSBlbGVtZW50LmdldEVudHJ5KCkpLmdldEtpbmQoKSkgewotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIDQ7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDoKLQkJCQlyZXR1cm4gMTsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U6Ci0JCQkJcmV0dXJuIDA7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6Ci0JCQkJcmV0dXJuIDM7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCXJldHVybiAyOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jYXRlZ29yeShvYmopOwotCX0KLQotCS8qCi0JICogQHNlZSBWaWV3ZXJTb3J0ZXIjY29tcGFyZSgpCi0JICovCQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0JCi0JCWlmIChjYXQxICE9IGNhdDIpCi0JCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0JCQkKLQkJaWYgKChlMSBpbnN0YW5jZW9mIEJQU2VhcmNoTGlzdEVsZW1lbnQpICYmIChlMiBpbnN0YW5jZW9mIEJQU2VhcmNoTGlzdEVsZW1lbnQpKSB7Ci0JCQlTZWFyY2hwYXRoRW50cnkgcDEgPSAoU2VhcmNocGF0aEVudHJ5KSAoKEJQU2VhcmNoTGlzdEVsZW1lbnQpIGUxKS5nZXRFbnRyeSgpOwotCQkJU2VhcmNocGF0aEVudHJ5IHAyID0gKFNlYXJjaHBhdGhFbnRyeSkgKChCUFNlYXJjaExpc3RFbGVtZW50KSBlMikuZ2V0RW50cnkoKTsKLQkJCQotCQkJLy8gQ29tcGFyZSBmaXJzdCB3aXRoaW4gcGF0aCwgdGhlbiBwYWNrYWdlcyB3aXRoaW4gZWFjaCBwYXRoLgotCQkJaW50IGMgPSBwMS5nZXRQYXRoKCkudG9TdHJpbmcoKS5jb21wYXJlVG8ocDIuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJaWYgKGMgPT0gMCkgewotCQkJCS8vIFdpdGhpbiBzYW1lIHBhdGgsIHNvIG5vdyBzb3J0IGJ5IHBhY2thZ2UsIGlmIHRoZXJlIGFyZSBhbnkuCi0JCQkJU3RyaW5nIHBrZzEgPSBwMS5nZXRQYWNrYWdlKCk7Ci0JCQkJU3RyaW5nIHBrZzIgPSBwMi5nZXRQYWNrYWdlKCk7Ci0JCQkJaWYgKHBrZzEgPT0gbnVsbCkKLQkJCQkJcGtnMSA9ICIiOwkvLyBGb3IgbnVsbCwgdXNlIGFuIGVtcHR5IHN0cmluZyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBrZzIgPT0gbnVsbCkKLQkJCQkJcGtnMiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHBrZzEuY29tcGFyZVRvKHBrZzIpOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIGM7CS8vIFBhdGhzIGFyZSBub3QgZXF1YWwsIHNvIHNvcnQgdmlhIHBhdGguCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCX0JCi0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9TZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1NlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQyYTcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1NlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpOwotLyoKLSAqICAkUkNTZmlsZTogU2VhcmNoUGF0aExpc3RMYWJlbFByb3ZpZGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE0ICQgICREYXRlOiAyMDA1LzEwLzAzIDIzOjA2OjQyICQgCi0gKi8KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5jb3JlLkpFTVVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUGF0aExpc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQlJV29ya3NwYWNlUm9vdCBmUm9vdDsKLQlJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0KLQkvLyBTaGFyZWQgaW1hZ2VzCi0JcHJpdmF0ZSBJbWFnZSBmSmFySWNvbiwgZkV4dEphckljb247Ci0JcHJpdmF0ZSBJbWFnZSBmRm9sZGVySW1hZ2UsIGZQcm9qZWN0SW1hZ2UsIGZWYXJpYWJsZUltYWdlLCBmTGlicmFyeUltYWdlOwotCXByaXZhdGUgSW1hZ2UgZk1pc3NpbmdKYXJJbWFnZSwgZk1pc3NpbmdWYXJpYWJsZUltYWdlOwotCXByaXZhdGUgSW1hZ2UgZk1pc3NpbmdGb2xkZXJJbWFnZSwgZk1pc3NpbmdQcm9qZWN0SW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBmUGFja2FnZUltYWdlOwotCi0JLy8gTG9jYWwgaW1hZ2VzLCB3aWxsIGJlIGRpc3Bvc2VkLgotCXByaXZhdGUgSW1hZ2UgZlBsdWdpbkltYWdlOwotCXByaXZhdGUgSW1hZ2UgZkJlYW5JbWFnZTsKLQlwcml2YXRlIEltYWdlIGZNaXNzaW5nUGFja2FnZUltYWdlOwotCXByaXZhdGUgSW1hZ2UgZkJsYW5rSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBmTWlzc2luZ0xpYnJhcnlJbWFnZTsKLQlwcml2YXRlIEhhc2hNYXAgZkJlYW5lZEltYWdlcyA9IG5ldyBIYXNoTWFwKCk7IC8vIEtleSBvZiBpbWFnZSB0byBhIGNvbXBvc2l0ZSB3aXRoIGEgYmVhbiBhdHRhY2hlZAotCXByaXZhdGUgSGFzaE1hcCBmUGFja2FnZWRJbWFnZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSGFzaE1hcCBmTWlzc2luZ1BhY2thZ2VkSW1hZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEhhc2hNYXAgZk5vcm1hbEltYWdlcyA9IG5ldyBIYXNoTWFwKCk7CS8vIE5lZWQgdG8gY29tcG9zaXRlIG5vcm1hbCBpbWFnZXMgdy9ibGFuayBzbyB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGNvbXBvc2l0ZWQgb25lcy4KLQkvLyBLZXkgb2YgaW1hZ2UgdG8gYSBjb21wb3NpdGUgd2l0aCBhIHBhY2thZ2UgYXR0YWNoZWQKLQotCXB1YmxpYyBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCQotCXB1YmxpYyBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJCi0JCWZSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSW1hZ2VSZWdpc3RyeSByZWcgPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUlTaGFyZWRJbWFnZXMgamR0U2hhcmVkSW1hZ2VzID0gSmF2YVVJLmdldFNoYXJlZEltYWdlcygpOwotCi0JCWZKYXJJY29uID0gamR0U2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfSkFSKTsKLQkJZkV4dEphckljb24gPSBqZHRTaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FWFRFUk5BTF9BUkNISVZFKTsKLQkJZkZvbGRlckltYWdlID0gamR0U2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfUEFDS0ZSQUdfUk9PVCk7Ci0KLQkJZlZhcmlhYmxlSW1hZ2UgPSByZWcuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfRU5WX1ZBUik7Ci0JCQotCQlmTGlicmFyeUltYWdlID0gamR0U2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfTElCUkFSWSk7Ci0KLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlmUHJvamVjdEltYWdlID0gd29ya2JlbmNoLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElERS5TaGFyZWRJbWFnZXMuSU1HX09CSl9QUk9KRUNUKTsKLQotCQlmTWlzc2luZ0phckltYWdlID0gcmVnLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19PQkpTX01JU1NJTkdfSkFSKTsKLQkJZk1pc3NpbmdWYXJpYWJsZUltYWdlID0gcmVnLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19PQkpTX01JU1NJTkdfRU5WX1ZBUik7Ci0JCWZNaXNzaW5nRm9sZGVySW1hZ2UgPSByZWcuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfTUlTU0lOR19QQUNLRlJBR19ST09UKTsKLQkJZk1pc3NpbmdQcm9qZWN0SW1hZ2UgPSB3b3JrYmVuY2guZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKX1BST0pFQ1RfQ0xPU0VEKTsKLQotCQlmUGFja2FnZUltYWdlID0gamR0U2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfUEFDS0FHRSk7Ci0KLQkJUmVjdGFuZ2xlIHIgPSBmTGlicmFyeUltYWdlLmdldEJvdW5kcygpOwotCQlQb2ludCBzID0gbmV3IFBvaW50KHIud2lkdGgsIHIuaGVpZ2h0KTsKLQkJSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IgamVkID0gbmV3IEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yKGpkdFNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19MSUJSQVJZKSwgIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLldBUk5JTkcsIHMpOwotCQlmTWlzc2luZ0xpYnJhcnlJbWFnZSA9IGplZC5jcmVhdGVJbWFnZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gSkVNVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCk7Ci0JCVVSTCB1cmwgPSBQbGF0Zm9ybS5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoImljb25zL3BsdWdpbl9vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCWZQbHVnaW5JbWFnZSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLQkJZWxzZQotCQkJZlBsdWdpbkltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKS5jcmVhdGVJbWFnZSgpOwotCi0JCXVybCA9IFBsYXRmb3JtLmZpbmQoYnVuZGxlLCBuZXcgUGF0aCgiaWNvbnMvamF2YWJlYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCWZCZWFuSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0JCWVsc2UKLQkJCWZCZWFuSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpLmNyZWF0ZUltYWdlKCk7Ci0KLQkJdXJsID0gUGxhdGZvcm0uZmluZChidW5kbGUsIG5ldyBQYXRoKCJpY29ucy9wYWNrYWdlX29ial9taXNzaW5nLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsICE9IG51bGwpCi0JCQlmTWlzc2luZ1BhY2thZ2VJbWFnZSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLQkJZWxzZQotCQkJZk1pc3NpbmdQYWNrYWdlSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpLmNyZWF0ZUltYWdlKCk7Ci0KLQkJdXJsID0gUGxhdGZvcm0uZmluZChidW5kbGUsIG5ldyBQYXRoKCJpY29ucy9ibGFuay5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJZkJsYW5rSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0JCWVsc2UKLQkJCWZCbGFua0ltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKS5jcmVhdGVJbWFnZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFQcm9qZWN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQl0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJQTGlzdEVsZW1lbnQpIHsKLQkJCUJQTGlzdEVsZW1lbnQgYnBlbnRyeSA9IChCUExpc3RFbGVtZW50KSBlbGVtZW50OwotCQkJSUJlYW5pbmZvc0RvY0VudHJ5IGRvY0VudHJ5ID0gYnBlbnRyeS5nZXRFbnRyeSgpOwotCQkJSVBhdGggcGF0aCA9IGRvY0VudHJ5LmdldFBhdGgoKTsKLQkJCVN0cmluZyBwYXRoU3RyaW5nID0gbnVsbDsKLQkJCXN3aXRjaCAoZG9jRW50cnkuZ2V0S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmUm9vdC5maW5kTWVtYmVyKHBhdGgpOwotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCQlwYXRoU3RyaW5nID0KLQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChCZWFuSW5mb1VJTWVzc2FnZXMuTGFiZWxQcm92aWRlcl9MaWJyYXJ5X0ZvbGRlciwgbmV3IE9iamVjdFtdIHsgcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpfSk7IAotCQkJCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWlmIChWYXJpYWJsZVNlbGVjdGlvbkJsb2NrLmlzQXJjaGl2ZVBhdGgocGF0aCkpIHsKLQkJCQkJCQkvLyBJbnRlcm5hbCBsaWJyYXJ5Ci0JCQkJCQkJU3RyaW5nW10gYXJncyA9Ci0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHBhdGgubGFzdFNlZ21lbnQoKSwgcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKX07Ci0JCQkJCQkJcGF0aFN0cmluZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEJlYW5JbmZvVUlNZXNzYWdlcy5MYWJlbFByb3ZpZGVyX0xpYnJhcnlfX1BhdGhMYXN0U2VnbWVudF9QYXRoUmVsYXRpdmVfLCBhcmdzKTsgCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoVmFyaWFibGVTZWxlY3Rpb25CbG9jay5pc0FyY2hpdmVQYXRoKHBhdGgpKSB7Ci0JCQkJCQkJLy8gRXh0ZXJuYWwgbGlicmFyeQotCQkJCQkJCVN0cmluZ1tdIGFyZ3MgPQotCQkJCQkJCQluZXcgU3RyaW5nW10geyBwYXRoLmxhc3RTZWdtZW50KCksIHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCl9OwotCQkJCQkJCXBhdGhTdHJpbmcgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChCZWFuSW5mb1VJTWVzc2FnZXMuTGFiZWxQcm92aWRlcl9MaWJyYXJ5X19QYXRoTGFzdFNlZ21lbnRfUGF0aEV4Y2VwdExhc3RfLCBhcmdzKTsgCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHNob3VsZCBub3QgY29tZSBoZXJlCi0JCQkJCQkJcGF0aFN0cmluZyA9IHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6Ci0JCQkJCVN0cmluZyBuYW1lID0gcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCQlJUGF0aCBlbnRyeVBhdGggPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZShwYXRoLnNlZ21lbnQoMCkpOwotCQkJCQlpZiAoZW50cnlQYXRoICE9IG51bGwpCi0JCQkJCQlwYXRoU3RyaW5nID0KLQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkJQmVhbkluZm9VSU1lc3NhZ2VzLkxhYmVsUHJvdmlkZXJfVmFyaWFibGVfX25hbWVfUGF0aE9TU3RyaW5nXywgCi0JCQkJCQkJCW5ldyBPYmplY3RbXSB7IG5hbWUsIGVudHJ5UGF0aC5hcHBlbmQocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKS50b09TU3RyaW5nKCl9KTsKLQkJCQkJZWxzZQotCQkJCQkJcGF0aFN0cmluZyA9IG5hbWU7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoKLQkJCQkJdHJ5IHsKLQkJCQkJCUlDbGFzc3BhdGhDb250YWluZXIgYyA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihwYXRoLCBqYXZhUHJvamVjdCk7Ci0JCQkJCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJCQkJcGF0aFN0cmluZyA9IGMuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlwYXRoU3RyaW5nID0gcGF0aC50b1N0cmluZygpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCQlwYXRoU3RyaW5nID0gcGF0aC50b1N0cmluZygpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgotCQkJCQlwYXRoU3RyaW5nID0gcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQmVhbmluZm9FbnRyeS5CSUVfUExVR0lOIDoKLQkJCQkJcGF0aFN0cmluZyA9IHBhdGgudG9TdHJpbmcoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCS8vIG5vIHBhdGgsIHNvIHByb2JhYmx5IGEgc2VhcmNoIGVudHJ5IHdpdGhpbiBhIGJlYW5pbmZvIGVudHJ5LgotCQkJfQotCi0JCQlpZiAoZG9jRW50cnkgaW5zdGFuY2VvZiBTZWFyY2hwYXRoRW50cnkpIHsKLQkJCQkvLyBUaGVyZSBjb3VsZCBiZSBhIHBhY2thZ2UgaW52b2x2ZWQgdG9vIGlmIHRoaXMgaXMgbm90IGEgcHJvamVjdCBvciByZWdpc3RlcmVkIHZhciBlbnRyeQotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9ICgoU2VhcmNocGF0aEVudHJ5KSBkb2NFbnRyeSkuZ2V0UGFja2FnZSgpOwotCQkJCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkKLQkJCQkJaWYgKHBhdGhTdHJpbmcgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChCZWFuSW5mb1VJTWVzc2FnZXMuTGFiZWxQcm92aWRlcl9fcGFja2FnZU5hbWVfUGF0aF8sIG5ldyBPYmplY3RbXSB7IHBhY2thZ2VOYW1lLCBwYXRoU3RyaW5nIH0pOyAKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIHBhY2thZ2VOYW1lOwotCQkJfQotCi0JCQlpZiAocGF0aFN0cmluZyAhPSBudWxsKQotCQkJCXJldHVybiBwYXRoU3RyaW5nOwotCQkJZWxzZQotCQkJCXJldHVybiAiPyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgcmV0dXJuZWRJbWFnZSA9IG51bGw7Ci0JCWJvb2xlYW4gaW1hZ2VJc05vcm1hbCA9IHRydWU7CS8vIFdoZXRoZXIgdGhpcyBpcyBhIG5vcm1hbCBzaXplZCBpbWFnZSAod2hpY2ggd2lsbCBuZWVkIGNvbXBvc2l0aW5nIHdpdGggYmxhbmspCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQlBMaXN0RWxlbWVudCkgewotCQkJQlBMaXN0RWxlbWVudCBicGVudHJ5ID0gKEJQTGlzdEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlJQmVhbmluZm9zRG9jRW50cnkgZG9jRW50cnkgPSBicGVudHJ5LmdldEVudHJ5KCk7Ci0JCQlJUGF0aCBwYXRoID0gZG9jRW50cnkuZ2V0UGF0aCgpOwotCQkJSW1hZ2UgcGF0aEltYWdlID0gbnVsbDsKLQkJCXN3aXRjaCAoZG9jRW50cnkuZ2V0S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJCWlmICghYnBlbnRyeS5pc01pc3NpbmcoKSkKLQkJCQkJCXBhdGhJbWFnZSA9IGZGb2xkZXJJbWFnZTsKLQkJCQkJZWxzZQotCQkJCQkJcGF0aEltYWdlID0gZk1pc3NpbmdGb2xkZXJJbWFnZTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJCWlmICghYnBlbnRyeS5pc01pc3NpbmcoKSkgewotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gZlJvb3QuZmluZE1lbWJlcihwYXRoKTsKLQkJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpCi0JCQkJCQkJcGF0aEltYWdlID0gZkZvbGRlckltYWdlOwotCQkJCQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCQkJCQlwYXRoSW1hZ2UgPSBmSmFySWNvbjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwYXRoSW1hZ2UgPSBmRXh0SmFySWNvbjsKLQkJCQkJfSBlbHNlCi0JCQkJCQlwYXRoSW1hZ2UgPSBmTWlzc2luZ0phckltYWdlOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKLQkJCQkJaWYgKCFicGVudHJ5LmlzTWlzc2luZygpKQotCQkJCQkJcGF0aEltYWdlID0gZlByb2plY3RJbWFnZTsKLQkJCQkJZWxzZQotCQkJCQkJcGF0aEltYWdlID0gZk1pc3NpbmdQcm9qZWN0SW1hZ2U7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQkJaWYgKCFicGVudHJ5LmlzTWlzc2luZygpKQotCQkJCQkJcGF0aEltYWdlID0gZlZhcmlhYmxlSW1hZ2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXBhdGhJbWFnZSA9IGZNaXNzaW5nVmFyaWFibGVJbWFnZTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCQlpZiAoIWJwZW50cnkuaXNNaXNzaW5nKCkpCi0JCQkJCQlwYXRoSW1hZ2UgPSBmTGlicmFyeUltYWdlOwotCQkJCQllbHNlCi0JCQkJCQlwYXRoSW1hZ2UgPSBmTWlzc2luZ0xpYnJhcnlJbWFnZTsKLQkJCQkJYnJlYWs7CQkJCQotCQkJCQkKLQkJCQljYXNlIEJlYW5pbmZvRW50cnkuQklFX1BMVUdJTjoKLQkJCQkJcGF0aEltYWdlID0gZlBsdWdpbkltYWdlOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCS8vIHByb2JhYmx5IGEgc2VhcmNoZW50cnkgdW5kZXIgYmVhbmluZm8gZW50cnksIG5vIHBhdGggaWNvbiB0byBkZWNvcmF0ZS4KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChicGVudHJ5IGluc3RhbmNlb2YgQlBTZWFyY2hMaXN0RWxlbWVudCkgewotCQkJCVNlYXJjaHBhdGhFbnRyeSBzZSA9IChTZWFyY2hwYXRoRW50cnkpIGRvY0VudHJ5OwotCQkJCUJQU2VhcmNoTGlzdEVsZW1lbnQgYnBzZSA9IChCUFNlYXJjaExpc3RFbGVtZW50KSBicGVudHJ5OwotCQkJCWlmIChzZS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkgewotCQkJCQlpZiAocGF0aEltYWdlICE9IG51bGwpIHsKLQkJCQkJCWlmICghYnBzZS5pc1BhY2thZ2VNaXNzaW5nKCkpIHsKLQkJCQkJCQkvLyBOZWVkIHRvIGRlY29yYXRlIHdpdGggYSBwYWNrYWdlIHN5bWJvbC4KLQkJCQkJCQlpbWFnZUlzTm9ybWFsID0gZmFsc2U7Ci0JCQkJCQkJcmV0dXJuZWRJbWFnZSA9IChJbWFnZSkgZlBhY2thZ2VkSW1hZ2VzLmdldChwYXRoSW1hZ2UpOyAvLyBTZWUgaWYgd2UndmUgYWxyZWFkeSBjcmVhdGVkIHRoZSBpbWFnZQotCQkJCQkJCWlmIChyZXR1cm5lZEltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJT3ZlcmxheUNvbXBvc2l0ZSBvYyA9IG5ldyBPdmVybGF5Q29tcG9zaXRlKHBhdGhJbWFnZS5nZXRJbWFnZURhdGEoKSk7Ci0JCQkJCQkJCW9jLnNldFJpZ2h0RXh0ZW5zaW9uKGZQYWNrYWdlSW1hZ2UuZ2V0SW1hZ2VEYXRhKCkpOwotCQkJCQkJCQlyZXR1cm5lZEltYWdlID0gb2MuY3JlYXRlSW1hZ2UoKTsKLQkJCQkJCQkJZlBhY2thZ2VkSW1hZ2VzLnB1dChwYXRoSW1hZ2UsIHJldHVybmVkSW1hZ2UpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gTmVlZCB0byBkZWNvcmF0ZSB3aXRoIGEgbWlzc2luZyBwYWNrYWdlIHN5bWJvbC4KLQkJCQkJCQlpbWFnZUlzTm9ybWFsID0gZmFsc2U7Ci0JCQkJCQkJcmV0dXJuZWRJbWFnZSA9IChJbWFnZSkgZk1pc3NpbmdQYWNrYWdlZEltYWdlcy5nZXQocGF0aEltYWdlKTsgLy8gU2VlIGlmIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZCB0aGUgaW1hZ2UKLQkJCQkJCQlpZiAocmV0dXJuZWRJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJCU92ZXJsYXlDb21wb3NpdGUgb2MgPSBuZXcgT3ZlcmxheUNvbXBvc2l0ZShwYXRoSW1hZ2UuZ2V0SW1hZ2VEYXRhKCkpOwotCQkJCQkJCQlvYy5zZXRSaWdodEV4dGVuc2lvbihmTWlzc2luZ1BhY2thZ2VJbWFnZS5nZXRJbWFnZURhdGEoKSk7Ci0JCQkJCQkJCXJldHVybmVkSW1hZ2UgPSBvYy5jcmVhdGVJbWFnZSgpOwotCQkJCQkJCQlmTWlzc2luZ1BhY2thZ2VkSW1hZ2VzLnB1dChwYXRoSW1hZ2UsIHJldHVybmVkSW1hZ2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkJCi0JCQkJaWYgKHBhdGhJbWFnZSA9PSBudWxsICYmIHJldHVybmVkSW1hZ2UgPT0gbnVsbCkKLQkJCQkJaWYgKCFicHNlLmlzUGFja2FnZU1pc3NpbmcoKSkKLQkJCQkJCXJldHVybmVkSW1hZ2UgPSBmUGFja2FnZUltYWdlOyAvLyBKdXN0IGEgcGFja2FnZSBpbWFnZQotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm5lZEltYWdlID0gZk1pc3NpbmdQYWNrYWdlSW1hZ2U7CS8vIEp1c3QgdGhlIG1pc3NpbmcgcGFja2FnZSBpbWFnZS4KLQkJCQllbHNlIGlmIChyZXR1cm5lZEltYWdlID09IG51bGwpCi0JCQkJCXJldHVybmVkSW1hZ2UgPSBwYXRoSW1hZ2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwYXRoSW1hZ2UgIT0gbnVsbCkgewotCQkJCQkvLyBJdCBpcyBhIGJlYW5pbmZvIGVudHJ5LCBuZWVkIHRvIGRlY29yYXRlIHdpdGggdGhlIGJlYW4uCi0JCQkJCWltYWdlSXNOb3JtYWwgPSBmYWxzZTsKLQkJCQkJcmV0dXJuZWRJbWFnZSA9IChJbWFnZSkgZkJlYW5lZEltYWdlcy5nZXQocGF0aEltYWdlKTsgLy8gU2VlIGlmIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZCB0aGUgaW1hZ2UKLQkJCQkJaWYgKHJldHVybmVkSW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJT3ZlcmxheUNvbXBvc2l0ZSBvYyA9IG5ldyBPdmVybGF5Q29tcG9zaXRlKHBhdGhJbWFnZS5nZXRJbWFnZURhdGEoKSk7Ci0JCQkJCQlvYy5zZXRSaWdodEV4dGVuc2lvbihmQmVhbkltYWdlLmdldEltYWdlRGF0YSgpKTsKLQkJCQkJCXJldHVybmVkSW1hZ2UgPSBvYy5jcmVhdGVJbWFnZSgpOwotCQkJCQkJZkJlYW5lZEltYWdlcy5wdXQocGF0aEltYWdlLCByZXR1cm5lZEltYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmV0dXJuZWRJbWFnZSA9PSBudWxsKQotCQkJCQlyZXR1cm5lZEltYWdlID0gZkJlYW5JbWFnZTsgLy8gU2hvdWxkbid0IG9jY3VyLgotCQkJfQotCQl9Ci0JCQotCQlpZiAoaW1hZ2VJc05vcm1hbCAmJiByZXR1cm5lZEltYWdlICE9IG51bGwpIHsKLQkJCS8vIFdlIG5lZWQgdG8gY29tcG9zaXRlIGl0IHdpdGggYmxhbmsgc28gdGhhdCB0aGUgcmVzdWx0IHdpbGwgYmUgdGhlIHNhbWUgc2l6ZQotCQkJLy8gYXMgY29tcG9zaXRlZCBpbWFnZXMuIElmIHRoaXMgaXNuJ3QgZG9uZSwgdGhlIHZpZXdlciB3aWxsIHN0cmV0Y2ggdGhlIGltYWdlCi0JCQkvLyB0byBtYXRjaCB0aGUgc2FtZSBzaXplIGFzIHRoZSBjb21wb3NpdGVkIGltYWdlcyBhbmQgdGhpbmdzIHdpbGwgbG9vayBhd2VmdWwuCi0JCQlJbWFnZSBuZXdSZXR1cm5lZCA9IChJbWFnZSkgZk5vcm1hbEltYWdlcy5nZXQocmV0dXJuZWRJbWFnZSk7Ci0JCQlpZiAobmV3UmV0dXJuZWQgPT0gbnVsbCkgewotCQkJCU92ZXJsYXlDb21wb3NpdGUgb2MgPSBuZXcgT3ZlcmxheUNvbXBvc2l0ZShyZXR1cm5lZEltYWdlLmdldEltYWdlRGF0YSgpKTsKLQkJCQlvYy5zZXRSaWdodEV4dGVuc2lvbihmQmxhbmtJbWFnZS5nZXRJbWFnZURhdGEoKSk7Ci0JCQkJbmV3UmV0dXJuZWQgPSBvYy5jcmVhdGVJbWFnZSgpOwotCQkJCWZOb3JtYWxJbWFnZXMucHV0KHJldHVybmVkSW1hZ2UsIG5ld1JldHVybmVkKTsKLQkJCX0KLQkJCXJldHVybmVkSW1hZ2UgPSBuZXdSZXR1cm5lZDsKLQkJfQotCQlyZXR1cm4gcmV0dXJuZWRJbWFnZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlmUGx1Z2luSW1hZ2UuZGlzcG9zZSgpOwotCQlmQmVhbkltYWdlLmRpc3Bvc2UoKTsKLQkJZk1pc3NpbmdQYWNrYWdlSW1hZ2UuZGlzcG9zZSgpOwotCQlmQmxhbmtJbWFnZS5kaXNwb3NlKCk7Ci0JCWZNaXNzaW5nTGlicmFyeUltYWdlLmRpc3Bvc2UoKTsKLQkJZm9yIChJdGVyYXRvciBpdHIgPSBmQmVhbmVkSW1hZ2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkoKEltYWdlKSBpdHIubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdHIgPSBmUGFja2FnZWRJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCSgoSW1hZ2UpIGl0ci5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGZNaXNzaW5nUGFja2FnZWRJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCSgoSW1hZ2UpIGl0ci5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGZOb3JtYWxJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCSgoSW1hZ2UpIGl0ci5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJfQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9TZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1NlYXJjaHBhdGhPcmRlcmluZ1dvcmtib29rUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjlmZTQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1NlYXJjaHBhdGhPcmRlcmluZ1dvcmtib29rUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFNlYXJjaHBhdGhPcmRlcmluZ1dvcmtib29rUGFnZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzEwLzAzIDIzOjA2OjQyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLmNvcmUuSkVNVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UgaW1wbGVtZW50cyBJQnVpbGRTZWFyY2hQYWdlewotCi0JcHJpdmF0ZSBMYWJlbCBsYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgYnV0dG9uQmFyID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiB1cEJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZG93bkJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBzcGFjZXIxID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBleHBvcnRBbGxCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHVuRXhwb3J0QWxsQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCXByaXZhdGUgYm9vbGVhbiBpblVwZGF0ZTsKLQlwcml2YXRlIEJlYW5pbmZvUGF0aHNCbG9jayBiZWFuaW5mb1BhdGhzQmxvY2s7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgdG9wOwotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVZpZXdlcj1udWxsOwotCXByaXZhdGUgU2VhcmNoUGF0aExpc3RMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHM7Ci0JcHJpdmF0ZSBMaXN0IHNlbGVjdGVkOwotCXByaXZhdGUgTGlzdCBjaGVja2VkOwotCi0JcHVibGljIFNlYXJjaHBhdGhPcmRlcmluZ1dvcmtib29rUGFnZShCZWFuaW5mb1BhdGhzQmxvY2sgYmVhbmluZm9QYXRoc0Jsb2NrKSB7Ci0JCXRoaXMuYmVhbmluZm9QYXRoc0Jsb2NrID0gYmVhbmluZm9QYXRoc0Jsb2NrOwotCQl0aGlzLnN0YXR1cyA9IFN0YXR1c0hlbHBlci5PS19TVEFUVVM7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IG5ldyBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpewotCQl0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGFiZWwgPSBuZXcgTGFiZWwodG9wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9sYWJlbCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljcmVhdGVUYWJsZSgpOwotCQl0b3Auc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQljcmVhdGVCdXR0b25CYXIoKTsKLQkJdG9wLnNldFNpemUobmV3IFBvaW50KDMwMCwgMjAwKSk7Ci0JCXVwZGF0ZUVuYWJsZWRTdGF0ZXMoKTsKLQkJaWYoc3BhY2VyMT09bnVsbCl7Ci0JCQkvL1RPRE8KLQkJfQotCQlyZXR1cm4gdG9wOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRhYmxlCQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlKCkgewotCQlHcmlkRGF0YSBncmlkRGF0YTEgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YSgpOwotCQlncmlkRGF0YTEuaG9yaXpvbnRhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGExLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YTEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YTEudmVydGljYWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCXRhYmxlID0gbmV3IFRhYmxlKHRvcCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5DSEVDSyB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGExKTsKLQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0U2VsZWN0aW9uKEJlYW5pbmZvUGF0aHNCbG9jay5nZXRTZWxlY3RlZExpc3QodGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KGVsZW1lbnRzKTsKLQkJaWYoZ2V0U2VsZWN0aW9uKCkhPW51bGwpCi0JCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpKTsKLQkJaWYoY2hlY2tlZCE9bnVsbCkKLQkJCXRhYmxlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhjaGVja2VkLnRvQXJyYXkoKSk7Ci0JCXRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGNvbXBvc2l0ZQkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25CYXIoKSB7Ci0JCVJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0JCXJvd0xheW91dC50eXBlID0gb3JnLmVjbGlwc2Uuc3d0LlNXVC5WRVJUSUNBTDsKLQkJcm93TGF5b3V0LmZpbGwgPSB0cnVlOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YSgpOwotCQlncmlkRGF0YTIuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YTIudmVydGljYWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWJ1dHRvbkJhciA9IG5ldyBDb21wb3NpdGUodG9wLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkJhci5zZXRMYXlvdXREYXRhKGdyaWREYXRhMik7Ci0JCWJ1dHRvbkJhci5zZXRMYXlvdXQocm93TGF5b3V0KTsKLQkJdXBCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkJhciwgU1dULk5PTkUpOwotCQl1cEJ1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfdXBfYnV0dG9uKTsKLQkJdXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJdGVyYXRvciBzZWxJdHIgPSBnZXRTZWxlY3Rpb24oKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChzZWxJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gc2VsSXRyLm5leHQoKTsKLQkJCQkJaW50IG9sZEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTsKLQkJCQkJaWYob2xkSW5kZXg+MCl7Ci0JCQkJCQllbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQllbGVtZW50cy5hZGQoLS1vbGRJbmRleCwgZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlkb3duQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5OT05FKTsKLQkJZG93bkJ1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfZG93bl9idXR0b24pOwotCQlkb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSXRlcmF0b3Igc2VsSXRyID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoc2VsSXRyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IHNlbEl0ci5uZXh0KCk7Ci0JCQkJCWludCBvbGRJbmRleCA9IGVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7Ci0JCQkJCWlmKG9sZEluZGV4PChlbGVtZW50cy5zaXplKCktMSkpewotCQkJCQkJZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQkJZWxlbWVudHMuYWRkKCsrb2xkSW5kZXgsIGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJc3BhY2VyMSA9IG5ldyBMYWJlbChidXR0b25CYXIsIFNXVC5OT05FKTsKLQkJZXhwb3J0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5OT05FKTsKLQkJZXhwb3J0QWxsQnV0dG9uLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5JbmZvUGF0aHNCbG9ja19FeHBvcnRBbGwpOwotCQlleHBvcnRBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRDaGVja2VkRWxlbWVudHMoZ2V0RWxlbWVudHMoKSk7Ci0JCQl9Ci0JCX0pOwotCQl1bkV4cG9ydEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQmFyLCBTV1QuTk9ORSk7Ci0JCXVuRXhwb3J0QWxsQnV0dG9uLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5JbmZvUGF0aHNCbG9ja19VbmV4cG9ydEFsbCk7Ci0JCXVuRXhwb3J0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0Q2hlY2tlZEVsZW1lbnRzKG51bGwpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoZWxlbWVudHMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhMaXN0IGVsZW1lbnRzKXsKLQkJdGhpcy5lbGVtZW50cy5jbGVhcigpOwotCQl0aGlzLmVsZW1lbnRzLmFkZEFsbChlbGVtZW50cyk7Ci0JCWlmKHRhYmxlVmlld2VyIT1udWxsKXsKLQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWxhYmVsUHJvdmlkZXIuc2V0SmF2YVByb2plY3QoamF2YVByb2plY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoZWNrZWRFbGVtZW50cyhMaXN0IGV4cG9ydGVkRW50cmllcykgewotCQl0aGlzLmNoZWNrZWQgPSBleHBvcnRlZEVudHJpZXM7Ci0JCWlmKHRhYmxlVmlld2VyIT1udWxsICYmICF0YWJsZS5pc0Rpc3Bvc2VkKCkpewotCQkJdGFibGVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGNoZWNrZWQhPW51bGwgPyBjaGVja2VkLnRvQXJyYXkoKSA6IG5ldyBPYmplY3RbMF0pOwotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JCXBhZ2VDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKEJQTGlzdEVsZW1lbnQgY3VyckVsZW1lbnQpIHsKLQkJaWYodGFibGVWaWV3ZXIhPW51bGwpewotCQkJcmV0dXJuIHRhYmxlVmlld2VyLmdldENoZWNrZWQoY3VyckVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBjaGVja2VkIT1udWxsICYmIGNoZWNrZWQuY29udGFpbnMoY3VyckVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihMaXN0IHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGVkID0gc2VsZWN0aW9uOwotCQlpZih0YWJsZVZpZXdlciE9bnVsbCAmJiAhdGFibGUuaXNEaXNwb3NlZCgpKXsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24hPW51bGw/c2VsZWN0aW9uIDogbmV3IEFycmF5TGlzdCgpKSk7Ci0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcGFnZUNoYW5nZWQoKXsKLQkJdXBkYXRlU2VhcmNoUGF0aFN0YXR1cygpOwotCQliZWFuaW5mb1BhdGhzQmxvY2suZG9TdGF0dXNMaW5lVXBkYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKXsKLQkJdXBCdXR0b24uc2V0RW5hYmxlZChjYW5Nb3ZlVXAoKSAmJiBiZWFuaW5mb1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JCWRvd25CdXR0b24uc2V0RW5hYmxlZChjYW5Nb3ZlRG93bigpICYmIGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJZXhwb3J0QWxsQnV0dG9uLnNldEVuYWJsZWQoZWxlbWVudHMhPW51bGwgJiYgYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQl1bkV4cG9ydEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVsZW1lbnRzIT1udWxsICYmIGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNhbk1vdmVEb3duKCkgewotCQlpbnRbXSBpbmRjPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JCWludCBrPSBlbGVtZW50cy5zaXplKCkgLSAxOwotCQlmb3IgKGludCBpPSBpbmRjLmxlbmd0aCAtIDE7IGkgPj0gMCA7IGktLSwgay0tKSB7Ci0JCQlpZiAoaW5kY1tpXSAhPSBrKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5Nb3ZlVXAoKSB7Ci0JCWludFtdIGluZGM9IHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGluZGMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpbmRjW2ldICE9IGkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBzZWFyY2ggcGF0aC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VhcmNoUGF0aFN0YXR1cygpIHsKLQkJaWYgKGluVXBkYXRlKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJaW5VcGRhdGUgPSB0cnVlOwotCi0JCQlzdGF0dXMgPSBTdGF0dXNIZWxwZXIuT0tfU1RBVFVTOwotCi0JCQlMaXN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoKTsKLQotCQkJYm9vbGVhbiBlbnRyeU1pc3NpbmcgPSBmYWxzZTsKLQotCQkJLy8gQmVjYXVzZSBvZiBidWcgaW4gc2V0Y2hlY2tlZFdpdGhvdXRVcGRhdGUsIHdoaWNoIHNldHMgdG8gdHJ1ZSBubyBtYXR0ZXIgd2hhdCB0aGUgc3RhdGUgaXMsIHdlIG5lZWQKLQkJCS8vIHRvIGFjY3VtdWxhdGUgdGhlIGNoZWNrZWQgZWxlbWVudHMgYW5kIHJlLXNldCB0aGVtIGFnYWluIGFmdGVyIHRoaXMgc28gdGhhdCB0aGV5IHdpbGwgYmUgY29ycmVjdC4JCi0JCQlBcnJheUxpc3QgZXhwb3J0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgZW50cmllcyA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGVudHJpZXMuaGFzTmV4dCgpOykgewotCQkJCUJQTGlzdEVsZW1lbnQgY3VyckVsZW1lbnQgPSAoQlBMaXN0RWxlbWVudCkgZW50cmllcy5uZXh0KCk7Ci0KLQkJCQlib29sZWFuIGlzQ2hlY2tlZCA9IGlzQ2hlY2tlZChjdXJyRWxlbWVudCk7Ci0JCQkJaWYgKGN1cnJFbGVtZW50LmNhbkV4cG9ydEJlQ2hhbmdlZCgpKSB7Ci0JCQkJCWlmIChpc0NoZWNrZWQpCi0JCQkJCQlleHBvcnRlZC5hZGQoY3VyckVsZW1lbnQpOwotCQkJCQljdXJyRWxlbWVudC5zZXRFeHBvcnRlZChpc0NoZWNrZWQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vCQkJCWZTZWFyY2hPcmRlci5zZXRDaGVja2VkV2l0aG91dFVwZGF0ZShjdXJyRWxlbWVudCwgY3VyckVsZW1lbnQuaXNFeHBvcnRlZCgpKTsKLQkJCQkJaWYgKGN1cnJFbGVtZW50LmlzRXhwb3J0ZWQoKSkKLQkJCQkJCWV4cG9ydGVkLmFkZChjdXJyRWxlbWVudCk7Ci0JCQkJfQotCi0JCQkJZW50cnlNaXNzaW5nID0gZW50cnlNaXNzaW5nIHx8IGN1cnJFbGVtZW50LmlzTWlzc2luZygpOwotCQkJfQotCi0JCQkvLyBOb3cgcmVzZXQgdGhlIGNoZWNrZWQgc3RhdGVzLCBkdWUgdG8gYnVnCi0JCQlzZXRDaGVja2VkRWxlbWVudHMoZXhwb3J0ZWQpOwotCi0JCQlpZiAoZW50cnlNaXNzaW5nKSB7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIAotCQkJCQkJSkVNVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQlCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9QYXRoc0Jsb2NrX1VJX193YXJuaW5nX0VudHJ5TWlzc2luZywKLQkJCQkJCW51bGwpOyAKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWluVXBkYXRlID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmVhbmluZm9FbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWlmKHRvcCE9bnVsbCAmJiAhdG9wLmlzRGlzcG9zZWQoKSkKLQkJCXVwZGF0ZUVuYWJsZWRTdGF0ZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlcygpIHsKLQkJdXBkYXRlQnV0dG9ucygpOwotCQl0YWJsZS5zZXRFbmFibGVkKGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJbGFiZWwuc2V0RW5hYmxlZChiZWFuaW5mb1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9TdGF0dXNIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1N0YXR1c0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjgwYzIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1N0YXR1c0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogU3RhdHVzSGVscGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMTAvMDMgMjM6MDY6NDIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLmNvcmUuSkVNVUlQbHVnaW47Ci0gCi0KLXB1YmxpYyBjbGFzcyBTdGF0dXNIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIE9LX1NUQVRVUyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCAiIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgRVJST1JfU1RBVFVTID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsICIiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdGF0dXMgd2l0aCB0aGUgcHJvdmlkZWQgc2V2ZXJpdHkgYW5kIG1lc3NhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgCi0JCQkJSkVNVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIAotCQkJCXNldmVyaXR5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbW9zdCBzZXZlcmUgc3RhdHVzIGZyb20gYSBhcnJheSBvZiBzdGF0aS4KLQkgKiBBbiBlcnJvciBpcyBtb3JlIHNldmVyZSB0aGFuIGEgd2FybmluZywgYW5kIGEgd2FybmluZyBpcyBtb3JlIHNldmVyZQotCSAqIHRoYW4gb2suCi0JICogCi0JICogQHBhcmFtIHN0YXR1cwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgZ2V0TW9zdFNldmVyZShJU3RhdHVzW10gc3RhdHVzKSB7Ci0JCUlTdGF0dXMgbWF4PSBudWxsOwotCQlmb3IgKGludCBpPSAwOyBpIDwgc3RhdHVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU3RhdHVzIGN1cnI9IHN0YXR1c1tpXTsKLQkJCWlmIChjdXJyLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCQlyZXR1cm4gY3VycjsKLQkJCX0KLQkJCWlmIChtYXggPT0gbnVsbCB8fCBjdXJyLmdldFNldmVyaXR5KCkgPiBtYXguZ2V0U2V2ZXJpdHkoKSkgewotCQkJCW1heD0gY3VycjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9UeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkZTJmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9UeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzEwLzAzIDIzOjA2OjQyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci0gCi0KLXB1YmxpYyBjbGFzcyBUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IgaW1wbGVtZW50cyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgSVN0YXR1cyBmZ0Vycm9yU3RhdHVzPSBTdGF0dXNIZWxwZXIuRVJST1JfU1RBVFVTOyAKLQlwcml2YXRlIElTdGF0dXMgZmdPS1N0YXR1cz0gU3RhdHVzSGVscGVyLk9LX1NUQVRVUzsKLQotCXByaXZhdGUgQ2xhc3NbXSBmQWNjZXB0ZWRUeXBlczsKLQlwcml2YXRlIGJvb2xlYW4gZkFsbG93TXVsdGlwbGVTZWxlY3Rpb247Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZSZWplY3RlZEVsZW1lbnRzOwotCQotCS8qKgotCSAqIEBwYXJhbSBhY2NlcHRlZFR5cGVzIFRoZSB0eXBlcyBhY2NlcHRlZCBieSB0aGUgdmFsaWRhdG9yCi0JICogQHBhcmFtIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24gSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgdmFsaWRhdG9yCi0JICogYWxsb3dzIG11bHRpcGxlIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKENsYXNzW10gYWNjZXB0ZWRUeXBlcywgYm9vbGVhbiBhbGxvd011bHRpcGxlU2VsZWN0aW9uKSB7Ci0JCXRoaXMoYWNjZXB0ZWRUeXBlcywgYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhY2NlcHRlZFR5cGVzIFRoZSB0eXBlcyBhY2NlcHRlZCBieSB0aGUgdmFsaWRhdG9yCi0JICogQHBhcmFtIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24gSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgdmFsaWRhdG9yCi0JICogYWxsb3dzIG11bHRpcGxlIHNlbGVjdGlvbi4KLQkgKiBAcGFyYW0gcmVqZWN0ZWRFbGVtZW50cyBBIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFjY2VwdGVkCi0JICovCi0JcHVibGljIFR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcihDbGFzc1tdIGFjY2VwdGVkVHlwZXMsIGJvb2xlYW4gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiwgQ29sbGVjdGlvbiByZWplY3RlZEVsZW1lbnRzKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoYWNjZXB0ZWRUeXBlcyk7Ci0JCWZBY2NlcHRlZFR5cGVzPSBhY2NlcHRlZFR5cGVzOwotCQlmQWxsb3dNdWx0aXBsZVNlbGVjdGlvbj0gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbjsKLQkJZlJlamVjdGVkRWxlbWVudHM9IHJlamVjdGVkRWxlbWVudHM7Ci0JfQkKLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBlbGVtZW50cykgewotCQlpZiAoaXNWYWxpZChlbGVtZW50cykpIHsKLQkJCXJldHVybiBmZ09LU3RhdHVzOwotCQl9Ci0JCXJldHVybiBmZ0Vycm9yU3RhdHVzOwotCX0JCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNPZkFjY2VwdGVkVHlwZShPYmplY3QgbykgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZkFjY2VwdGVkVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmQWNjZXB0ZWRUeXBlc1tpXS5pc0luc3RhbmNlKG8pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNSZWplY3RlZEVsZW1lbnQoT2JqZWN0IGVsZW0pIHsKLQkJcmV0dXJuIChmUmVqZWN0ZWRFbGVtZW50cyAhPSBudWxsKSAmJiBmUmVqZWN0ZWRFbGVtZW50cy5jb250YWlucyhlbGVtKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3RlZFZhbGlkKE9iamVjdCBlbGVtKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoIWZBbGxvd011bHRpcGxlU2VsZWN0aW9uICYmIHNlbGVjdGlvbi5sZW5ndGggIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlmb3IgKGludCBpPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qgbz0gc2VsZWN0aW9uW2ldOwkKLQkJCWlmICghaXNPZkFjY2VwdGVkVHlwZShvKSB8fCBpc1JlamVjdGVkRWxlbWVudChvKSB8fCAhaXNTZWxlY3RlZFZhbGlkKG8pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1R5cGVkVmlld2VyRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9UeXBlZFZpZXdlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTRmNmQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1R5cGVkVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUeXBlZFZpZXdlckZpbHRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzEwLzAzIDIzOjA2OjQyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0gCi0KLXB1YmxpYyBjbGFzcyBUeXBlZFZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JcHJpdmF0ZSBDbGFzc1tdIGFjY2VwdGVkQ2xhc3NlczsKLQlwcml2YXRlIE9iamVjdFtdIHJlamVjdGVkRnJhZ21lbnRzOwotCQotCXB1YmxpYyBUeXBlZFZpZXdlckZpbHRlcihDbGFzc1tdIGFjY2VwdGVkQ2xhc3NlcywgT2JqZWN0W10gcmVqZWN0ZWRGcmFnbWVudHMpIHsKLQkJdGhpcy5hY2NlcHRlZENsYXNzZXMgPSBhY2NlcHRlZENsYXNzZXM7Ci0JCXRoaXMucmVqZWN0ZWRGcmFnbWVudHMgPSByZWplY3RlZEZyYWdtZW50czsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChyZWplY3RlZEZyYWdtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgcmVqZWN0ZWRGcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudC5lcXVhbHMocmVqZWN0ZWRGcmFnbWVudHNbaV0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGFjY2VwdGVkQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFjY2VwdGVkQ2xhc3Nlc1tpXS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1ZhcmlhYmxlU2VsZWN0aW9uQmxvY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1ZhcmlhYmxlU2VsZWN0aW9uQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxYWM1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9WYXJpYWJsZVNlbGVjdGlvbkJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkJ1aWxkUGF0aERpYWxvZ0FjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKgotICogICRSQ1NmaWxlOiBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMTAvMDMgMjM6MDY6NDIgJCAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVmFyaWFibGVTZWxlY3Rpb25CbG9jayB7Ci0JCi0JCi0JcHJpdmF0ZSBMaXN0IGZFeGlzdGluZ1BhdGhzOwotCQotCXByaXZhdGUgTGFiZWwgdmFyaWFibGVGaWVsZExhYmVsOwotCXByaXZhdGUgVGV4dCB2YXJpYWJsZUZpZWxkVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiB2YXJpYWJsZUZpZWxkQnV0dG9uOwotCXByaXZhdGUgU3RyaW5nIHZhcmlhYmxlRmllbGRUZXh0Q29udGVudDsKLQkKLQlwcml2YXRlIExhYmVsIGV4dGVuc2lvbkZpZWxkTGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IGV4dGVuc2lvbkZpZWxkVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBleHRlbnNpb25GaWVsZEJ1dHRvbjsKLQlwcml2YXRlIFN0cmluZyBleHRlbnNpb25GaWVsZFRleHRDb250ZW50OwotCQotCXByaXZhdGUgQ0xhYmVsIGZGdWxsUGF0aDsKLQkKLQlwcml2YXRlIElTdGF0dXMgZlZhcmlhYmxlU3RhdHVzOwotCXByaXZhdGUgSVN0YXR1cyBmRXhpc3RzU3RhdHVzOwotCXByaXZhdGUgSVN0YXR1cyBmRXh0ZW5zaW9uU3RhdHVzOwotCQotCXByaXZhdGUgU3RyaW5nIGZWYXJpYWJsZTsKLQlwcml2YXRlIElTdGF0dXNDaGFuZ2VMaXN0ZW5lciBmQ29udGV4dDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZklzRW1wdHlBbGxvd2VkOwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrCi0JICovCi0JcHVibGljIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2soSVN0YXR1c0NoYW5nZUxpc3RlbmVyIGNvbnRleHQsIExpc3QgZXhpc3RpbmdQYXRocywgSVBhdGggdmFyUGF0aCwgU3RyaW5nIGxhc3RWYXJTZWxlY3Rpb24sIGJvb2xlYW4gZW1wdHlBbGxvd2VkKSB7CQotCQlmQ29udGV4dD0gY29udGV4dDsKLQkJZkV4aXN0aW5nUGF0aHM9IGV4aXN0aW5nUGF0aHM7Ci0JCWZJc0VtcHR5QWxsb3dlZD0gZW1wdHlBbGxvd2VkOwotCQlmRXhpc3RzU3RhdHVzPSBTdGF0dXNIZWxwZXIuT0tfU1RBVFVTOwotCQkKLQkJLy9WYXJpYWJsZVNlbGVjdGlvbkFkYXB0ZXIgYWRhcHRlcj0gbmV3IFZhcmlhYmxlU2VsZWN0aW9uQWRhcHRlcigpOwotCi0JCWlmICh2YXJQYXRoICE9IG51bGwpIHsKLQkJCXZhcmlhYmxlRmllbGRUZXh0Q29udGVudCA9IHZhclBhdGguc2VnbWVudCgwKTsKLQkJCWV4dGVuc2lvbkZpZWxkVGV4dENvbnRlbnQgPSB2YXJQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCXZhcmlhYmxlRmllbGRUZXh0Q29udGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlleHRlbnNpb25GaWVsZFRleHRDb250ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl1cGRhdGVGdWxsVGV4dEZpZWxkKCk7Ci0JCWZWYXJpYWJsZVN0YXR1cz0gdmFyaWFibGVVcGRhdGVkKCk7Ci0JCWZFeHRlbnNpb25TdGF0dXM9ZXh0ZW5zaW9uVXBkYXRlZCgpOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0VmFyaWFibGVQYXRoKCkgewotCQlpZiAoZlZhcmlhYmxlICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmVmFyaWFibGUpLmFwcGVuZChleHRlbnNpb25GaWVsZFRleHRDb250ZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElQYXRoIGdldFJlc29sdmVkUGF0aCgpIHsKLQkJaWYgKGZWYXJpYWJsZSAhPSBudWxsKSB7Ci0JCQlJUGF0aCBlbnRyeVBhdGg9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKGZWYXJpYWJsZSk7Ci0JCQlpZiAoZW50cnlQYXRoICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZW50cnlQYXRoLmFwcGVuZChleHRlbnNpb25GaWVsZFRleHRDb250ZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQkJCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXZhcmlhYmxlRmllbGRUZXh0LnNldEZvY3VzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgaW5uZXI9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpbm5lci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCXZhcmlhYmxlRmllbGRMYWJlbCA9IG5ldyBMYWJlbChpbm5lciwgU1dULk5PTkUpOwotCQl2YXJpYWJsZUZpZWxkTGFiZWwuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja192YXJpYWJsZV9sYWJlbCk7Ci0JCXZhcmlhYmxlRmllbGRMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJdmFyaWFibGVGaWVsZFRleHQgPSBuZXcgVGV4dChpbm5lciwgU1dULkJPUkRFUnxTV1QuU0lOR0xFKTsKLQkJdmFyaWFibGVGaWVsZFRleHQuc2V0VGV4dCh2YXJpYWJsZUZpZWxkVGV4dENvbnRlbnQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCXZhcmlhYmxlRmllbGRUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQl2YXJpYWJsZUZpZWxkVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZhcmlhYmxlRmllbGRUZXh0Q29udGVudCA9IHZhcmlhYmxlRmllbGRUZXh0LmdldFRleHQoKTsKLQkJCQlmVmFyaWFibGVTdGF0dXMgPSB2YXJpYWJsZVVwZGF0ZWQoKTsKLQkJCQlmRXhpc3RzU3RhdHVzPSBnZXRFeGlzdHNTdGF0dXMoKTsKLQkJCQl1cGRhdGVGdWxsVGV4dEZpZWxkKCk7Ci0JCQkJZkNvbnRleHQuc3RhdHVzQ2hhbmdlZChTdGF0dXNIZWxwZXIuZ2V0TW9zdFNldmVyZShuZXcgSVN0YXR1c1tdIHsgZlZhcmlhYmxlU3RhdHVzLCBmRXh0ZW5zaW9uU3RhdHVzLCBmRXhpc3RzU3RhdHVzIH0pKTsKLQkJCX0KLQkJfSk7Ci0JCXZhcmlhYmxlRmllbGRCdXR0b24gPSBuZXcgQnV0dG9uKGlubmVyLCBTV1QuUFVTSCk7Ci0JCXZhcmlhYmxlRmllbGRCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja192YXJpYWJsZV9idXR0b24pOwotCQl2YXJpYWJsZUZpZWxkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQl2YXJpYWJsZUZpZWxkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHZhcmlhYmxlPSBjaG9vc2VWYXJpYWJsZSgpOwotCQkJCWlmICh2YXJpYWJsZSAhPSBudWxsKSB7Ci0JCQkJCXZhcmlhYmxlRmllbGRUZXh0LnNldFRleHQodmFyaWFibGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlleHRlbnNpb25GaWVsZExhYmVsID0gbmV3IExhYmVsKGlubmVyLCBTV1QuTk9ORSk7Ci0JCWV4dGVuc2lvbkZpZWxkTGFiZWwuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja19leHRlbnNpb25fbGFiZWwpOwotCQlleHRlbnNpb25GaWVsZExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlleHRlbnNpb25GaWVsZFRleHQgPSBuZXcgVGV4dChpbm5lciwgU1dULkJPUkRFUnxTV1QuU0lOR0xFKTsKLQkJZXh0ZW5zaW9uRmllbGRUZXh0LnNldFRleHQodmFyaWFibGVGaWVsZFRleHRDb250ZW50KTsKLQkJZXh0ZW5zaW9uRmllbGRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlleHRlbnNpb25GaWVsZFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlleHRlbnNpb25GaWVsZFRleHRDb250ZW50ID0gZXh0ZW5zaW9uRmllbGRUZXh0LmdldFRleHQoKTsKLQkJCQlmRXh0ZW5zaW9uU3RhdHVzPSBleHRlbnNpb25VcGRhdGVkKCk7Ci0JCQkJZkV4aXN0c1N0YXR1cz0gZ2V0RXhpc3RzU3RhdHVzKCk7Ci0JCQkJdXBkYXRlRnVsbFRleHRGaWVsZCgpOwotCQkJCWZDb250ZXh0LnN0YXR1c0NoYW5nZWQoU3RhdHVzSGVscGVyLmdldE1vc3RTZXZlcmUobmV3IElTdGF0dXNbXSB7IGZWYXJpYWJsZVN0YXR1cywgZkV4dGVuc2lvblN0YXR1cywgZkV4aXN0c1N0YXR1cyB9KSk7Ci0JCQl9Ci0JCX0pOwotCQlleHRlbnNpb25GaWVsZEJ1dHRvbiA9IG5ldyBCdXR0b24oaW5uZXIsIFNXVC5QVVNIKTsKLQkJZXh0ZW5zaW9uRmllbGRCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja19leHRlbnNpb25fYnV0dG9uKTsKLQkJZXh0ZW5zaW9uRmllbGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWV4dGVuc2lvbkZpZWxkQnV0dG9uLnNldEVuYWJsZWQoZlZhcmlhYmxlIT1udWxsKTsKLQkJZXh0ZW5zaW9uRmllbGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJUGF0aCBmaWxlUGF0aD0gY2hvb3NlRXh0SmFyKCk7Ci0JCQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCQkJZXh0ZW5zaW9uRmllbGRUZXh0LnNldFRleHQoZmlsZVBhdGgudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCUxhYmVsIGxhYmVsPSBuZXcgTGFiZWwoaW5uZXIsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWxhYmVsLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLlZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZnVsbHBhdGhfbGFiZWwpOyAKLQkJCi0JCWZGdWxsUGF0aD0gbmV3IENMYWJlbChpbm5lciwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3Bhbj0yOwotCQlmRnVsbFBhdGguc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQl1cGRhdGVGdWxsVGV4dEZpZWxkKCk7Ci0JCQotCQlzZXRGb2N1cyhwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJCi0JCXJldHVybiBpbm5lcjsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFyaWFibGVVcGRhdGVkKCkgewotCQlmVmFyaWFibGU9IG51bGw7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cz0gU3RhdHVzSGVscGVyLk9LX1NUQVRVUzsKLQkJCi0JCVN0cmluZyBuYW1lID0gdmFyaWFibGVGaWVsZFRleHRDb250ZW50OwotCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoIWZJc0VtcHR5QWxsb3dlZCkgewotCQkJCXN0YXR1cyA9IFN0YXR1c0hlbHBlci5jcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQmVhbkluZm9VSU1lc3NhZ2VzLlZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXJyb3JfZW50ZXJuYW1lX0VSUk9SXyk7IAotCQkJfSBlbHNlIHsKLQkJCQlmVmFyaWFibGU9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSBpZiAoSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUobmFtZSkgPT0gbnVsbCkgewotCQkJc3RhdHVzID0gU3RhdHVzSGVscGVyLmNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9uYW1lbm90ZXhpc3RzX0VSUk9SXyk7IAotCQl9IGVsc2UgewotCQkJZlZhcmlhYmxlPSBuYW1lOwotCQl9Ci0JCWlmKGV4dGVuc2lvbkZpZWxkQnV0dG9uIT1udWxsKQotCQkJZXh0ZW5zaW9uRmllbGRCdXR0b24uc2V0RW5hYmxlZChmVmFyaWFibGUgIT0gbnVsbCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyBleHRlbnNpb25VcGRhdGVkKCkgewotCQlJU3RhdHVzIHN0YXR1cz0gU3RhdHVzSGVscGVyLk9LX1NUQVRVUzsKLQkJU3RyaW5nIGV4dGVuc2lvbiA9IGV4dGVuc2lvbkZpZWxkVGV4dENvbnRlbnQ7Ci0JCWlmIChleHRlbnNpb24ubGVuZ3RoKCkgPiAwICYmICFQYXRoLlJPT1QuaXNWYWxpZFBhdGgoZXh0ZW5zaW9uKSkgewotCQkJc3RhdHVzID0gU3RhdHVzSGVscGVyLmNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9pbnZhbGlkZXh0ZW5zaW9uX0VSUk9SXyk7IAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQkKLQlwcml2YXRlIElTdGF0dXMgZ2V0RXhpc3RzU3RhdHVzKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c0hlbHBlci5PS19TVEFUVVM7Ci0JCUlQYXRoIHBhdGg9IGdldFJlc29sdmVkUGF0aCgpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAoZmluZFBhdGgocGF0aCkpIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXNIZWxwZXIuY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsICBCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9wYXRoZXhpc3RzX0VSUk9SXyk7IAotCQkJfSBlbHNlIGlmICghcGF0aC50b0ZpbGUoKS5pc0ZpbGUoKSkgewotCQkJCXN0YXR1cyA9IFN0YXR1c0hlbHBlci5jcmVhdGVTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCAgQmVhbkluZm9VSU1lc3NhZ2VzLlZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfd2FybmluZ19wYXRobm90ZXhpc3RzX1dBUk5fKTsgCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNIZWxwZXIuY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgIEJlYW5JbmZvVUlNZXNzYWdlcy5WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX3dhcm5pbmdfcGF0aG5vdGV4aXN0c19XQVJOXyk7IAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBmaW5kUGF0aChJUGF0aCBwYXRoKSB7Ci0JCWZvciAoaW50IGk9IGZFeGlzdGluZ1BhdGhzLnNpemUoKSAtMTsgaSA+PTA7IGktLSkgewotCQkJSVBhdGggY3Vycj0gKElQYXRoKSBmRXhpc3RpbmdQYXRocy5nZXQoaSk7Ci0JCQlpZiAoY3Vyci5lcXVhbHMocGF0aCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQotCXByaXZhdGUgdm9pZCB1cGRhdGVGdWxsVGV4dEZpZWxkKCkgewotCQlpZiAoZkZ1bGxQYXRoICE9IG51bGwgJiYgIWZGdWxsUGF0aC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCUlQYXRoIHJlc29sdmVkUGF0aD0gZ2V0UmVzb2x2ZWRQYXRoKCk7Ci0JCQlpZiAocmVzb2x2ZWRQYXRoICE9IG51bGwpIHsKLQkJCQlmRnVsbFBhdGguc2V0VGV4dChyZXNvbHZlZFBhdGgudG9PU1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZkZ1bGxQYXRoLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJaWYgKGZGdWxsUGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZkZ1bGxQYXRoLmdldFNoZWxsKCk7Ci0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FyY2hpdmVQYXRoKElQYXRoIHBhdGgpewotCQlmaW5hbCBTdHJpbmdbXSBhcmNoaXZlRXh0ZW5zaW9ucyA9IHsiamFyIiwgInppcCJ9OwotCQlTdHJpbmcgZXh0PSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJaWYgKGV4dCAhPSBudWxsICYmIGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgYXJjaGl2ZUV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZXh0LmVxdWFsc0lnbm9yZUNhc2UoYXJjaGl2ZUV4dGVuc2lvbnNbaV0pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgSVBhdGggY2hvb3NlRXh0SmFyKCkgewotCQlTdHJpbmcgbGFzdFVzZWRQYXRoPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBlbnRyeVBhdGg9IGdldFJlc29sdmVkUGF0aCgpOwotCQlpZiAoZW50cnlQYXRoICE9IG51bGwpIHsKLQkJCWlmIChpc0FyY2hpdmVQYXRoKGVudHJ5UGF0aCkpIHsKLQkJCQlsYXN0VXNlZFBhdGg9IGVudHJ5UGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9PU1N0cmluZygpOwotCQkJfSBlbHNlIHsKLQkJCQlsYXN0VXNlZFBhdGg9IGVudHJ5UGF0aC50b09TU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUZpbGVEaWFsb2cgZGlhbG9nPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuU0lOR0xFKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiKi5qYXI7Ki56aXAifSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgobGFzdFVzZWRQYXRoKTsKLQkJZGlhbG9nLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLlZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfRXh0SmFyRGlhbG9nX3RpdGxlKTsgCi0JCVN0cmluZyByZXM9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVBhdGggcmVzUGF0aD0gbmV3IFBhdGgocmVzKS5tYWtlQWJzb2x1dGUoKTsKLQkJSVBhdGggdmFyUGF0aD0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUoZlZhcmlhYmxlKTsKLQkJCi0JCWlmICghdmFyUGF0aC5pc1ByZWZpeE9mKHJlc1BhdGgpKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgocmVzUGF0aC5sYXN0U2VnbWVudCgpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiByZXNQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHModmFyUGF0aC5zZWdtZW50Q291bnQoKSkuc2V0RGV2aWNlKG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY2hvb3NlVmFyaWFibGUoKSB7Ci0JCUlQYXRoW10gdmFyUGF0aHMgPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlVmFyaWFibGVFbnRyaWVzKHZhcmlhYmxlRmllbGRCdXR0b24uZ2V0U2hlbGwoKSwgbmV3IElQYXRoWzBdKTsKLQkJU3RyaW5nIHZhcmlhYmxlID0gbnVsbDsKLQkJaWYodmFyUGF0aHMhPW51bGwgJiYgdmFyUGF0aHMubGVuZ3RoPjApewotCQkJdmFyaWFibGUgPSB2YXJQYXRoc1swXS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiB2YXJpYWJsZTsKLQl9Ci0JCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NzNlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9BdHRpYy9tZXNzYWdlcy5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkCi0jCi0KLQotU2VhcmNoUGF0aERpYWxvZ19DaG9vc2VQYWNrYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICA9ICZDaG9vc2UgUGFja2FnZXMKLVNlYXJjaFBhdGhEaWFsb2dfUmVtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAmUmVtb3ZlCi1TZWFyY2hQYXRoRGlhbG9nX0Rlc2NfTGFiZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJk1vZGlmeSBzZWFyY2ggcGF0aCBvZiBwYWNrYWdlcyB3aXRoaW4gdGhpcyBCZWFuSW5mbyBjbGFzc2VzIEpBUi9mb2xkZXIKLVNlYXJjaFBhdGhEaWFsb2dfTW9kaWZ5U2VhcmNoUGF0aHMgICAgICAgICAgICAgICAgICAgICAgPSBNb2RpZnkgU2VhcmNoIFBhdGhzIC0gezB9Ci1TZWFyY2hQYXRoRGlhbG9nX05vdEVkaXRhYmxlX0lORk9fICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNzVJIFBsdWdpbiB0eXBlIEJlYW5JbmZvIGNsYXNzZXMgbG9jYXRpb25zIGFyZSBub3QgZWRpdGFibGUKLVNlYXJjaFBhdGhEaWFsb2dfUGFja2FnZVByZXNlbnRfSU5GT18gICAgICAgICAgICAgICAgICAgPSBJV0FWMDA3NkkgUGFja2FnZSBhbHJlYWR5IGluIHRoZSBzZWFyY2ggcGF0aAotU2VhcmNoUGF0aERpYWxvZ19JbnB1dERpYWxvZ19UaXRsZSAgICAgICAgICAgICAgICAgICAgICA9IFBhY2thZ2UKLVNlYXJjaFBhdGhEaWFsb2dfSW5wdXREaWFsb2dfTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgPSAmRW50ZXIgYSBwYWNrYWdlOgotQmVhbkluZm9QYXRoc0Jsb2NrX0V4cG9ydEFsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEUmeHBvcnQgYWxsCi1CZWFuSW5mb1BhdGhzQmxvY2tfVW5leHBvcnRBbGwgICAgICAgICAgICAgICAgICAgICAgICAgID0gVSZuZXhwb3J0IGFsbAotQmVhbkluZm9QYXRoc0Jsb2NrX1BhZ2VfVGFiX1BhY2thZ2VzICAgICAgICAgICAgICAgICAgICA9ICZQYWNrYWdlcwotQmVhbkluZm9QYXRoc0Jsb2NrX1BhZ2VfVGFiX0NsYXNzZXMgICAgICAgICAgICAgICAgICAgICA9ICZCZWFuSW5mbyBjbGFzc2VzCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkRm9sZGVycyAgICAgICAgICAgICAgICAgICAgICAgID0gJkFkZCBGb2xkZXJzCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkSkFScyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQWRkICZKQVJzCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkRXh0ZXJuYWxKQVIgICAgICAgICAgICAgICAgICAgID0gQWRkIEUmeHRlcm5hbCBKQVJzCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkVmFyaWFibGUgICAgICAgICAgICAgICAgICAgICAgID0gQWRkICZWYXJpYWJsZQotQmVhbkluZm9zV29ya2Jvb2tQYWdlX0FkZFByb2plY3RzICAgICAgICAgICAgICAgICAgICAgICA9IEFkZCBQcm9qZWMmdHMKLUJlYW5JbmZvc1dvcmtib29rUGFnZV9Nb2RpZnlQYXRocyAgICAgICAgICAgICAgICAgICAgICAgPSAmTW9kaWZ5IFBhdGhzCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfUmVtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJlJlbW92ZQotQmVhbkluZm9zV29ya2Jvb2tQYWdlX0xpc3RfVGV4dCAgICAgICAgICAgICAgICAgICAgICAgICA9ICZDaG9vc2UgbG9jYXRpb25zIG9mIEJlYW5JbmZvIGNsYXNzZXMgKEJlYW5JbmZvIGNsYXNzZXMgbG9jYXRpb25zIG5vdCBpbiBjdXJyZW50IHByb2plY3QpCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX0NsYXNzZXNfVGl0bGUgICAgID0gQmVhbkluZm8gQ2xhc3MgRm9sZGVycyBTZWxlY3Rpb24KLUJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfSkFSc19UaXRsZSAgICAgICAgPSBKQVIgU2VsZWN0aW9uCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX0pBUnNfTWVzc2FnZSAgICAgID0gJkNob29zZSBKQVJzIHRvIGJlIGFkZGVkIGFzIEJlYW5JbmZvIGNsYXNzZXMgSkFScwotQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19FeHRKQVJzX1RleHQgICAgICA9IEpBUiBTZWxlY3Rpb24KLUJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfUHJvamVjdHNfVGl0bGUgICAgPSBCZWFuSW5mbyBQcm9qZWN0cyBTZWxlY3Rpb24KLUJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfQ2xhc3Nlc19Qcm9tcHQgICAgPSAmQ2hvb3NlIGZvbGRlcnMgdG8gYmUgYWRkZWQgYXMgQmVhbkluZm8gY2xhc3NlcyBmb2xkZXJzLgotQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19Qcm9qZWN0c19Qcm9tcHQgICA9ICZDaG9vc2UgcHJvamVjdHMgdG8gYmUgYWRkZWQgYXMgQmVhbkluZm8gcHJvamVjdHMuCi1QYWNrYWdlc1dvcmtib29rX0Nob29zZVBhY2thZ2VzICAgICAgICAgICAgICAgICAgICAgICAgID0gJkNob29zZSBwYWNrYWdlcwotUGFja2FnZXNXb3JrYm9va19DaG9vc2VEZWZpbmVkUGF0aHMgICAgICAgICAgICAgICAgICAgICA9IENob29zZSAmZGVmaW5lZCBwYXRocwotUGFja2FnZXNXb3JrYm9va19SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICZSZW1vdmUKLVBhY2thZ2VzV29ya2Jvb2tfTGFiZWxUZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDaG9vc2UgQmVhbkluZm8gJnBhY2thZ2VzIGZyb20gdGhlIGNsYXNzIHBhdGgKLVBhY2thZ2VzV29ya2Jvb2tfU2VsZWN0aW9uRGlhbG9nX0RlZmluZWRQYXRoc19UaXRsZSAgICAgPSBDaG9vc2UgRGVmaW5lZCBQYXRocwotUGFja2FnZXNXb3JrYm9va19TZWxlY3Rpb25EaWFsb2dfRGVmaW5lZFBhdGhzX01lc3NhZ2UgICA9IENob29zZSB0aGUgcHJlLWRlZmluZWQgcGF0aHMgdG8gYWRkIHRvIHRoZSBzZWFyY2ggcGF0aAotTGFiZWxQcm92aWRlcl9MaWJyYXJ5X0ZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHswfSAoY2xhc3MgZm9sZGVyKQotTGFiZWxQcm92aWRlcl9MaWJyYXJ5X19QYXRoTGFzdFNlZ21lbnRfUGF0aFJlbGF0aXZlXyAgICA9IHswfSAtIHsxfQotTGFiZWxQcm92aWRlcl9MaWJyYXJ5X19QYXRoTGFzdFNlZ21lbnRfUGF0aEV4Y2VwdExhc3RfICA9IHswfSAtIHsxfQotTGFiZWxQcm92aWRlcl9WYXJpYWJsZV9fbmFtZV9QYXRoT1NTdHJpbmdfICAgICAgICAgICAgICA9IHswfSAtIHsxfQotTGFiZWxQcm92aWRlcl9fcGFja2FnZU5hbWVfUGF0aF8gICAgICAgICAgICAgICAgICAgICAgICA9IHswfTogezF9Ci0KLVZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfdmFyaWFibGVfbGFiZWwgICAgICAgICAgICAgICAgICAgPSAmVmFyaWFibGUgTmFtZToKLVZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfdmFyaWFibGVfYnV0dG9uICAgICAgICAgICAgICAgICAgPSAmQnJvd3NlLi4uCi1WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2V4dGVuc2lvbl9sYWJlbCAgICAgICAgICAgICAgICAgID0gUGF0aCBFJnh0ZW5zaW9uOgotVmFyaWFibGVTZWxlY3Rpb25CbG9ja19leHRlbnNpb25fYnV0dG9uICAgICAgICAgICAgICAgICA9IEJybyZ3c2UuLi4KLVZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZnVsbHBhdGhfbGFiZWwgICAgICAgICAgICAgICAgICAgPSBSZXNvbHZlZCBQYXRoOgotCi1WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2Vycm9yX2VudGVybmFtZV9FUlJPUl8gICAgICAgICAgID0gSVdBVjAwNzdFIFZhcmlhYmxlIG5hbWUgbXVzdCBiZSBlbnRlcmVkLgotVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9uYW1lbm90ZXhpc3RzX0VSUk9SXyAgICAgICA9IElXQVYwMDc4RSBWYXJpYWJsZSBkb2VzIG5vdCBleGlzdC4KLVZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXJyb3JfcGF0aGV4aXN0c19FUlJPUl8gICAgICAgICAgPSBJV0FWMDA3OUUgQ2xhc3MgcGF0aCBlbnRyeSBhbHJlYWR5IGV4aXN0cy4KLVZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXJyb3JfaW52YWxpZGV4dGVuc2lvbl9FUlJPUl8gICAgPSBJV0FWMDA4MEUgRXh0ZW5zaW9uIGlzIG5vdCBhIHZhbGlkIHBhdGguCi0KLVZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfd2FybmluZ19wYXRobm90ZXhpc3RzX1dBUk5fICAgICAgPSBJV0FWMDA4MVcgUmVzb2x2ZWQgcGF0aCBpcyBub3QgYW4gZXhpc3RpbmcgSkFSIGZpbGUuCi0KLVZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfRXh0SmFyRGlhbG9nX3RpdGxlICAgICAgICAgICAgICAgPSBKQVIgU2VsZWN0aW9uCi0KLQotCi0KLSMKLSMgUHJvcGVydGllcyBmb3IgdGhlIGNvbS5pYm0uZXRvb2xzLmJlYW5pbmZvLnVpIHBsdWdpbgotIwotCi0jIFRoaXMgc2hvd3MgdXAgYXMgdGhlIHRpdGxlIG9mIGEgbWVzc2FnZSBkaWFsb2cKLUJlYW5pbmZvX1VJX19lcnJvcnRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFcnJvcgotCi1CZWFuaW5mb19VSV9fZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRXJyb3Igd2hpbGUgc2V0dGluZyBCZWFuSW5mbyBjb25maWd1cmF0aW9uLgotCi1CZWFuaW5mb1Byb3BlcnRpZXNQYWdlX0lORk9fX25vamF2YXByb2plY3QgICAgICAgICAgICAgID0gSVdBVjAwMTlJIEJlYW5JbmZvIGlzIG9ubHkgYXBwbGljYWJsZSB0byBKYXZhIHByb2plY3RzLgotQmVhbmluZm9Qcm9wZXJ0aWVzUGFnZV9JTkZPX19jbG9zZWRwcm9qZWN0ICAgICAgICAgICAgICA9IElXQVYwMDIwSSBCZWFuSW5mbyBpcyBub3QgYXZhaWxhYmxlIGZvciBhIGNsb3NlZCBwcm9qZWN0LgotCi0jIFRoaXMgaXMgYSBjaGVja2JveCBvbiBhIHByZWZlcmVuY2UgcGFnZS4gVGhlIGxhYmVsIGlzIHRvIGluZGljYXRlIHdoZXRoZXIgaW50cm9zcGVjdGlvbiBpcyBlbmFibGVkIHRvIHJ1biBvciBub3QuCi1CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX2VuYWJsZWJlYW5pbmZvICAgICAgICAgICAgICAgICAgID0gJkVuYWJsZSBCZWFuSW5mbyBJbnRyb3NwZWN0aW9uIG9uIHRoaXMgUHJvamVjdAotCi0jIFRoaXMgaXMgYSBoZWFkZXIgbGluZSBmb3IgYSBwYWdlIG9mIHByZWZlcmVuY2VzLgotQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX2xhYmVsICAgICAgICAgICAgICAgICA9IEJ1aWxkIEJlYW5JbmZvICZzZWFyY2ggcGF0aCBvcmRlciBhbmQgZXhwb3J0ZWQgZW50cmllczpcbihFeHBvcnRlZCBlbnRyaWVzIGFyZSBjb250cmlidXRlZCB0byBkZXBlbmRlbnQgcHJvamVjdHMpCi1CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfdXBfYnV0dG9uICAgICAgICAgICAgID0gJlVwCi1CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfZG93bl9idXR0b24gICAgICAgICAgID0gJkRvd24KLUJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9yZW1vdmVfYnV0dG9uICAgICAgICAgPSAmUmVtb3ZlCi1CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlcmFjaHBhdGhfdGFiX29yZGVyICAgICAgICAgICAgID0gJk9yZGVyIGFuZCBFeHBvcnQKLQotQmVhbmluZm9QYXRoc0Jsb2NrX1VJX193YXJuaW5nX0VudHJ5TWlzc2luZyAgICAgICAgICAgICA9IFByb2plY3QgY2xhc3MgcGF0aCBlbnRyaWVzLCBvciBCZWFuSW5mbyBjbGFzcyBmaWxlcyBhcmUgbWlzc2luZy4KLQotIyB7MH0gd2lsbCBiZSB0aGUgcGFja2FnZSBuYW1lLCBlLmcuIGphdmEubGFuZwotQmVhbmluZm9QYXRoc0Jsb2NrX1dBUk5fX3NlYXJjaHBhdGhfbWlzc2luZ19wYXRoX2Zvcm1hdCA9IElXQVYwMDIxVyB7MH0gLSBQYWNrYWdlIHBhdGggbm90IGZvdW5kLgotCi0jIFRoaXMgaXMgYSBtZXNzYWdlIG9uIGEgcHJvZ3Jlc3MgZGlhbG9nLgotQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX29wZXJhdGlvbmRlc2NyaXB0aW9uICA9IFNldHRpbmcgQmVhbkluZm8gc2VhcmNoIHBhdGhzLi4uCi0KLUJlYW5pbmZvUGF0aHNCbG9ja19VSV9fYWRkc2VhcmNocGF0aF90aXRsZSAgICAgICAgICAgICAgPSBTZWxlY3QgUGFja2FnZXMKLUJlYW5pbmZvUGF0aHNCbG9ja19VSV9fYWRkc2VhcmNocGF0aF9kZXNjcmlwdGlvbiAgICAgICAgPSAmU2VsZWN0IHBhY2thZ2VzIHRvIGFkZCB0byBzZWFyY2ggcGF0aDoKLQotQmVhbmluZm9QYXRoc0Jsb2NrX1VJX193YXJuaW5nX0VudHJ5TWlzc2luZyAgICAgICAgICAgICA9IFByb2plY3QgY2xhc3MgcGF0aCBlbnRyaWVzLCBvciBCZWFuSW5mbyBjbGFzcyBmaWxlcyBhcmUgbWlzc2luZy4KLUJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9hZGRfYnV0dG9uICAgICAgICAgICAgPSBBZGQgUGFja2FnZS4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmJhMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS4uID0gdWkvLFwKLSAgICAgICAgICAgYmVhbmluZm91aS8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2JsYW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2JsYW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmOWQwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9ibGFuay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9jcF9vcmRlcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvY3Bfb3JkZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmYTRjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9jcF9vcmRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvZnVsbC9jdG9vbDE2L3J1bl9leGMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvZnVsbC9jdG9vbDE2L3J1bl9leGMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y0MTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9ydW5fZXhjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmlsZV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTE2MWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9maWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9mdWxsL3dpemJhbi9ydW5fd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3J1bl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2JkNDYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3J1bl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvamF2YWJlYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvamF2YWJlYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODg1MjYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2phdmFiZWFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL3BhY2thZ2Vfb2JqX21pc3NpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvcGFja2FnZV9vYmpfbWlzc2luZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDdlMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvcGFja2FnZV9vYmpfbWlzc2luZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9wbHVnaW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL3BsdWdpbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDkzZGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL3BsdWdpbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1ZmI1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9BdHRpYy9wbHVnaW4ucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJAotIwotCi0KLXBsdWdpbk5hbWU9SmF2YSBFTUYgTW9kZWwgVUkKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KLXByb3h5TGF1bmNoR3JvdXAubGFiZWw9UHJveHkKLQotQWN0aW9uU2V0LnByb3h5VG9vbHM9UHJveHkgVG9vbHMKLUFjdGlvblNldC5wcm94eVRvb2xzLkRlc2NyaXB0aW9uPUFjdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBQcm94eSBhbmQgUHJveHkgTGF1bmNoZXJzLgotQWN0aW9uLnByb3h5TGF1bmNoPVByb3h5Li4uCi1BY3Rpb24ucHJveHlMYXVuY2hUaXA9UHJveHkgTGF1bmNoIE1hbmFnZXIKLUFjdGlvbi5zZWxlY3REZWZhdWx0PVNlbGVjdCBEZWZhdWx0IFByb3h5IENvbmZpZ3VyYXRpb24uLi4KLUFjdGlvbi5zZWxlY3REZWZhdWx0VGlwPVNlbGVjdCBkZWZhdWx0IGZvciB7MH0uCi1NZW51LnJ1bj0mUnVuCi0KLUVkaXRvcnMuT3ZlcnJpZGVFZGl0b3IgPSBPdmVycmlkZSBFZGl0b3IKLQotIyBUaGlzIGlzIHRoZSB0aXRsZSBvZiB0aGUgUHJvcGVydGllcyBwYWdlIGZvciBzZXR0aW5nIHByb3BlcnRpZXMgb2YgQmVhbkluZm8gcGF0aHMuCi1CZWFuaW5mb1BhdGhfVGl0bGVfVUlfID0gQmVhbkluZm8gUGF0aApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTQ4MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoR3JvdXBzIj4KLSAgICAgIDxsYXVuY2hHcm91cAotICAgICAgICAgICAgbGFiZWw9IiVwcm94eUxhdW5jaEdyb3VwLmxhYmVsIgotICAgICAgICAgICAgYmFubmVySW1hZ2U9Imljb25zL2Z1bGwvd2l6YmFuL3J1bl93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIKLSAgICAgICAgICAgIGltYWdlPSJpY29ucy9mdWxsL2N0b29sMTYvcnVuX2V4Yy5naWYiCi0gICAgICAgICAgICBtb2RlPSJydW4iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnByb3h5Ij4KLSAgICAgIDwvbGF1bmNoR3JvdXA+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlcyI+Ci0gICAgICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L3J1bl9leGMuZ2lmIgotICAgICAgICAgICAgY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkuTG9jYWxQcm94eUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS5wcm94eS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlLmxvY2FsUHJveHkiPgotICAgICAgPC9sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwcyI+Ci0gICAgICA8bGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkuTG9jYWxQcm94eUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5wcm94eS5yZW1vdGUuTG9jYWxMYXVuY2hUYWJHcm91cCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udWkucmVtb3RlLkxvY2FsTGF1bmNoVGFiR3JvdXAxIj4KLSAgICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBsYWJlbD0iJUFjdGlvblNldC5wcm94eVRvb2xzIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVBY3Rpb25TZXQucHJveHlUb29scy5EZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udWkuUHJveHlUb29sc1NldCI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVNZW51LnJ1biIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5ydW4iPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5wcm94eS5Qcm94eUxhdW5jaFRvb2xiYXJEZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9ydW5fZXhjLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udWkucHJveHkuUHJveHlMYXVuY2hUb29sYmFyRGVsZWdhdGVBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFjdGlvbi5wcm94eUxhdW5jaCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hBY3Rpb25TZXQvcHJveHlMYXVuY2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlQWN0aW9uLnByb3h5TGF1bmNoVGlwIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBY3Rpb24uc2VsZWN0RGVmYXVsdCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHkuU2VsZWN0RGVmYXVsdENvbmZpZ3VyYXRpb25BY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS5ydW4vIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udWkucHJveHkuU2VsZWN0RGVmYXVsdE1lbnVEZWxlZ2F0ZUFjdGlvbiI+Ci0gICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFjdGlvbi5wcm94eUxhdW5jaCIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9ydW5fZXhjLmdpZiIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVBY3Rpb24ucHJveHlMYXVuY2hUaXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5LlByb3h5TGF1bmNoTWVudURlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnJ1bi8iCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnVpLnByb3h5LlByb3h5TGF1bmNoTWVudURlbGVnYXRlQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udWkuc2VsZWN0LmRlZmF1bHQub2JqZWN0Y29udGlidXRpb24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBY3Rpb24uc2VsZWN0RGVmYXVsdCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHkuU2VsZWN0RGVmYXVsdENvbmZpZ3VyYXRpb25BY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnVpLnNlbGVjdC5vYmplY3QuYWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgIG5hbWU9InBlcnNpc3RlbnRQcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkucHJveHlMYXVuY2hDb25maWd1cmF0aW9uIj4KLSAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIG5hbWU9IiVCZWFuaW5mb1BhdGhfVGl0bGVfVUlfIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aS5CZWFuaW5mb3NQcm9wZXJ0eVBhZ2UiCi0gICAgICAgICAgICBpZD0iQmVhbmluZm9Qcm9wZXJ0aWVzUGFnZSI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0IgotICAgICAgICAgICAgbmFtZT0iJUJlYW5pbmZvUGF0aF9UaXRsZV9VSV8iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpLkJlYW5pbmZvc1Byb3BlcnR5UGFnZSIKLSAgICAgICAgICAgIGlkPSJCZWFuaW5mb1Byb3BlcnRpZXNQYWdlIj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBuYW1lPSIlRWRpdG9ycy5PdmVycmlkZUVkaXRvciIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Im92ZXJyaWRlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9maWxlX29iai5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy9vcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMvb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3JBY3Rpb25Db250cmlidXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8uT3ZlcnJpZGVFZGl0b3IiPgotICAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvY29yZS9KRU1VSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL2NvcmUvSkVNVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmY2NhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvY29yZS9KRU1VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSkVNVUlQbHVnaW4uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5jb3JlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkVjbGlwc2VMb2dnZXI7Ci0KLSAKLS8qKgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEpFTVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBKRU1VSVBsdWdpbiBQTFVHSU47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQkVBTklORk9fVUkgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpIjsJLy8gS2V5IGZvciBkaWFsb2cgc2V0dGluZ3MuCSAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSkVNVUlQbHVnaW4oKSB7Ci0JCVBMVUdJTiA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpFTVVJUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIFBMVUdJTjsKLQl9Ci0JCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlpZiAobG9nZ2VyID09IG51bGwpCi0JCQlsb2dnZXIgPSBFY2xpcHNlTG9nZ2VyLmdldEVjbGlwc2VMb2dnZXIodGhpcyk7Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1Byb3h5TGF1bmNoTWVudURlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvUHJveHlMYXVuY2hNZW51RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2YWY5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvUHJveHlMYXVuY2hNZW51RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFByb3h5TGF1bmNoTWVudURlbGVnYXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLk9wZW5MYXVuY2hEaWFsb2dBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlDb25zdGFudHM7Ci0gCi0vKioKLSAqIE1lbnUgZGVsZWdhdGUgdG8gbGF1bmNoIHRoZSBQcm94eSBMYXVuY2ggTWFuYWdlci4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUHJveHlMYXVuY2hNZW51RGVsZWdhdGUgZXh0ZW5kcyBPcGVuTGF1bmNoRGlhbG9nQWN0aW9uIHsKLQkKLQlwdWJsaWMgUHJveHlMYXVuY2hNZW51RGVsZWdhdGUoKSB7Ci0JCXN1cGVyKElQcm94eUNvbnN0YW50cy5JRF9QUk9YWV9MQVVOQ0hfR1JPVVApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1Byb3h5TGF1bmNoVG9vbGJhckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvUHJveHlMYXVuY2hUb29sYmFyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmYzcxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvUHJveHlMYXVuY2hUb29sYmFyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQcm94eUxhdW5jaFRvb2xiYXJEZWxlZ2F0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkuY29yZS5KRU1VSVBsdWdpbjsKLSAKLS8qKgotICogVGhlIHRvb2xiYXIgZGVsZWdhdGUgZm9yIHByb3h5IGxhdW5jaC4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUHJveHlMYXVuY2hUb29sYmFyRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTIgewotCi0JcHJpdmF0ZSBNZW51IG1lbnU7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudSkKLQkgKi8KLQlwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0JCXNldE1lbnUobmV3IE1lbnUocGFyZW50KSk7Ci0JCWZpbGxNZW51KG1lbnUpOwotCQlyZXR1cm4gbWVudTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7Ci0JCWlmICh0aGlzLm1lbnUgIT0gbnVsbCkgewotCQkJdGhpcy5tZW51LmRpc3Bvc2UoKTsKLQkJfQotCQl0aGlzLm1lbnUgPSBtZW51OwotCX0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZSNnZXRNZW51KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0JICovCi0JcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotCQlzZXRNZW51KG5ldyBNZW51KHBhcmVudCkpOwotCQlmaWxsTWVudShtZW51KTsKLQkJcmV0dXJuIG1lbnU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpIHsKLQkJYWRkVG9NZW51KG1lbnUsIHByb3h5TGF1bmNoRGVsZWdhdGUsIC0xKTsJCi0JCWFkZFRvTWVudShtZW51LCBzZWxlY3REZWxlZ2F0ZSwgLTEpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBhY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBtZW51IHdpdGggYW4gYWNjZWxlcmF0b3Igc3BlY2lmaWVkCi0JICogYnkgdGhlIGdpdmVuIG51bWJlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudSB0aGUgbWVudSB0byBhZGQgdGhlIGFjdGlvbiB0bwotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiB0byBhZGQKLQkgKiBAcGFyYW0gYWNjZWxlcmF0b3IgdGhlIG51bWJlciB0aGF0IHNob3VsZCBhcHBlYXIgYXMgYW4gYWNjZWxlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoTWVudSBtZW51LCBJQWN0aW9uIGFjdGlvbiwgaW50IGFjY2VsZXJhdG9yKSB7Ci0JCVN0cmluZ0J1ZmZlciBsYWJlbD0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoYWNjZWxlcmF0b3IgPj0gMCAmJiBhY2NlbGVyYXRvciA8IDEwKSB7Ci0JCQkvL2FkZCB0aGUgbnVtZXJpY2FsIGFjY2VsZXJhdG9yCi0JCQlsYWJlbC5hcHBlbmQoJyYnKTsKLQkJCWxhYmVsLmFwcGVuZChhY2NlbGVyYXRvcik7Ci0JCQlsYWJlbC5hcHBlbmQoJyAnKTsKLQkJfQotCQlsYWJlbC5hcHBlbmQoYWN0aW9uLmdldFRleHQoKSk7Ci0JCWFjdGlvbi5zZXRUZXh0KGxhYmVsLnRvU3RyaW5nKCkpOwotCQlBY3Rpb25Db250cmlidXRpb25JdGVtIGl0ZW09IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JCWl0ZW0uZmlsbChtZW51LCAtMSk7Ci0JfQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzZXRNZW51KG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlzZWxlY3REZWxlZ2F0ZS5pbml0KHdpbmRvdyk7Ci0JfQotCi0JcHJvdGVjdGVkIFNlbGVjdERlZmF1bHRDb25maWd1cmF0aW9uQWN0aW9uRGVsZWdhdGUgc2VsZWN0RGVsZWdhdGUgPSBuZXcgU2VsZWN0RGVmYXVsdENvbmZpZ3VyYXRpb25BY3Rpb25EZWxlZ2F0ZSgpOwotCXByb3RlY3RlZCBQcm94eUxhdW5jaE1lbnVEZWxlZ2F0ZSBwcm94eUxhdW5jaERlbGVnYXRlID0gbmV3IFByb3h5TGF1bmNoTWVudURlbGVnYXRlKCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHNlbGVjdERlbGVnYXRlLmlzRW5hYmxlZCgpKQotCQkJc2VsZWN0RGVsZWdhdGUucnVuKGFjdGlvbik7Ci0JCWVsc2UKLQkJCXByb3h5TGF1bmNoRGVsZWdhdGUucnVuKGFjdGlvbik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0RGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZChudWxsLCBzZWxlY3Rpb24pOwotCQlpZiAoc2VsZWN0RGVsZWdhdGUuaXNFbmFibGVkKCkpCi0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoc2VsZWN0RGVsZWdhdGUuZ2V0VG9vbFRpcFRleHQoKSk7Ci0JCWVsc2UKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKSwgIiVBY3Rpb24ucHJveHlMYXVuY2hUaXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1Byb3h5VUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1Byb3h5VUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVkODFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9Qcm94eVVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJveHlVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHkubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUHJveHlVSU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0X21lc3NhZ2U7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQcm94eVVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvU2VsZWN0RGVmYXVsdENvbmZpZ3VyYXRpb25BY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1NlbGVjdERlZmF1bHRDb25maWd1cmF0aW9uQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI0OThlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvU2VsZWN0RGVmYXVsdENvbmZpZ3VyYXRpb25BY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFNlbGVjdERlZmF1bHRDb25maWd1cmF0aW9uQWN0aW9uRGVsZWdhdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5wcm94eTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5DaGVja2VkVHJlZVNlbGVjdGlvbkRpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLmNvcmUuSkVNVUlQbHVnaW47Ci0gCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3REZWZhdWx0Q29uZmlndXJhdGlvbkFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlLCBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCQotCi0JLyoqCi0JICogSGVscGVyIHRvIGdldCBzaW5nbGUgc2VsZWN0ZWQgamF2YSBwcm9qZWN0IG91dCBvZiBzZWxlY3Rpb24uCi0JICogVXNlZCBieSBQcm94eUxhdW5jaFRvb2xiYXJEZWxlZ2F0ZSB0b28uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElKYXZhUHJvamVjdCBnZXRTZWxlY3RlZEphdmFQcm9qZWN0KElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHx8ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID4gMSkKLQkJCXJldHVybiBudWxsOwkvLyBDYW4ndCBoYW5kbGUgaXQuCi0JCWVsc2UgewotCQkJT2JqZWN0IHNlbCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsIGluc3RhbmNlb2YgSVByb2plY3QgJiYgKChJUHJvamVjdCkgc2VsKS5pc09wZW4oKSkgewotCQkJCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoKElQcm9qZWN0KSBzZWwpOwkvLyBXaWxsIHJldHVybiBudWxsIGlmIG5vdCBleGlzdC4KLQkJCX0gZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0ICYmICgoSUphdmFQcm9qZWN0KSBzZWwpLmlzT3BlbigpKQotCQkJCXJldHVybiAoSUphdmFQcm9qZWN0KSBzZWw7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFNlbGVjdERlZmF1bHRDb25maWd1cmF0aW9uQWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKEpFTVVJUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAiJUFjdGlvbi5zZWxlY3REZWZhdWx0IikpOyAvLyROT04tTkxTLTEkCi0JCXNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJc2VsZWN0RGlhbG9nKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0JCi0KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGphdmFwcm9qZWN0OwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJamF2YXByb2plY3QgPSBnZXRTZWxlY3RlZEphdmFQcm9qZWN0KHNlbGVjdGlvbik7Ci0JCXRyeSB7Ci0JCQlzZXRFbmFibGVkKAotCQkJCWphdmFwcm9qZWN0ICE9IG51bGwKLQkJCQkJJiYgamF2YXByb2plY3QuZ2V0UHJvamVjdCgpLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShQcm94eVBsdWdpbi5QUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTikgIT0gbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsJLy8gU29tZSBlcnJvciwgc28gbm90IGVuYWJsZWQuCi0JCX0KLQkJaWYgKGFjdGlvbiAhPSBudWxsKQkJCQotCQkJYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCQlpZiAoamF2YXByb2plY3QgIT0gbnVsbCkKLQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKEpFTVVJUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAiJUFjdGlvbi5zZWxlY3REZWZhdWx0VGlwIiksIG5ldyBPYmplY3RbXSB7amF2YXByb2plY3QuZ2V0RWxlbWVudE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0RGlhbG9nKCkgewotCQl0cnkgewotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IERlYnVnVUlUb29scy5uZXdEZWJ1Z01vZGVsUHJlc2VudGF0aW9uKCk7Ci0JCQkKLQkJCUNoZWNrZWRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDaGVja2VkVHJlZVNlbGVjdGlvbkRpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSwgbGFiZWxQcm92aWRlciwgbmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCQlyZXR1cm4gRU1QVFk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJCWlmIChpbnB1dEVsZW1lbnQgIT0gbnVsbCAmJiBpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3RbXSkKLQkJCQkJCXJldHVybiAoT2JqZWN0W10pIGlucHV0RWxlbWVudDsKLQkJCQkJZWxzZSAKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJfSkgewotCQkJCXByb3RlY3RlZCBDaGVja2JveFRyZWVWaWV3ZXIgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCWZpbmFsIENoZWNrYm94VHJlZVZpZXdlciB0cmVlVmlld2VyID0gc3VwZXIuY3JlYXRlVHJlZVZpZXdlcihwYXJlbnQpOwotCQkJCQl0cmVlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCQkJCWJvb2xlYW4gcHJvY2Vzc2luZ0NoZWNrID0gZmFsc2U7Ci0JCQkJCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJaWYgKCFwcm9jZXNzaW5nQ2hlY2spIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXByb2Nlc3NpbmdDaGVjayA9IHRydWU7Ci0JCQkJCQkJCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQkJCQkJCQkJLy8gV2UgYXJlIGNoZWNraW5nIHNvbWV0aGluZywgbWFrZSBzdXJlIG9sZCBvbmUgdW5jaGVja2VkLgotCQkJCQkJCQkJCU9iamVjdFtdIGNoZWNrZWQgPSB0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZC5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCQlpZiAoY2hlY2tlZFtpXSAhPSBldmVudC5nZXRFbGVtZW50KCkpCi0JCQkJCQkJCQkJCQl0cmVlVmlld2VyLnNldENoZWNrZWQoY2hlY2tlZFtpXSwgZmFsc2UpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCXByb2Nlc3NpbmdDaGVjayA9IGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQkJCQl9Ci0JCQkJCi0JCQkJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTZWxlY3Rpb25CdXR0b25zKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7CS8vIFdlIGRvbid0IHdhbnQgc2VsZWN0aW9uIGJ1dHRvbnMgc2luY2Ugb25seSBvbmUgY2FuIGJlIHNlbGVjdGVkIGF0IGEgdGltZS4KLQkJCQl9Ci0JCQl9OwotCQkJZGlhbG9nLnNldFRpdGxlKFByb3h5VUlNZXNzYWdlcy5TZWxlY3RfdGl0bGUpOyAKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5VUlNZXNzYWdlcy5TZWxlY3RfbWVzc2FnZSwgbmV3IE9iamVjdFtdIHsgamF2YXByb2plY3QuZ2V0RWxlbWVudE5hbWUoKX0pKTsgCi0KLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uW10gY29uZmlncyA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoKTsKLQkJCUxpc3QgY29uZmlnc0xpc3QgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZ3MubGVuZ3RoKzEpOwotCQkJU3RyaW5nIGpwTmFtZSA9IGphdmFwcm9qZWN0LmdldEVsZW1lbnROYW1lKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoSVByb3h5Q29uc3RhbnRzLklEX1BST1hZX0xBVU5DSF9HUk9VUC5lcXVhbHMoY29uZmlnc1tpXS5nZXRDYXRlZ29yeSgpKSAmJiAhY29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9QUklWQVRFLCBmYWxzZSkgJiYganBOYW1lLmVxdWFscyhjb25maWdzW2ldLmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsICIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29uZmlnc0xpc3QuYWRkKGNvbmZpZ3NbaV0pOwotCQkJfQotCQkJY29uZmlncyA9IChJTGF1bmNoQ29uZmlndXJhdGlvbltdKSBjb25maWdzTGlzdC50b0FycmF5KG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvbltjb25maWdzTGlzdC5zaXplKCldKTsKLQkJCWRpYWxvZy5zZXRJbnB1dChjb25maWdzKTsKLQotCQkJU3RyaW5nIGxhdW5jaE5hbWUgPSBqYXZhcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KFByb3h5UGx1Z2luLlBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OKTsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCQlpZiAobGF1bmNoTmFtZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjb25maWdzW2ldLmdldE5hbWUoKS5lcXVhbHMobGF1bmNoTmFtZSkpIHsKLQkJCQkJCWNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKG5ldyBPYmplY3RbXSB7IGNvbmZpZyB9KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQljb25maWcgPSAoSUxhdW5jaENvbmZpZ3VyYXRpb24pIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJCWlmIChjb25maWcgIT0gbnVsbCkKLQkJCQkJamF2YXByb2plY3QuZ2V0UHJvamVjdCgpLnNldFBlcnNpc3RlbnRQcm9wZXJ0eShQcm94eVBsdWdpbi5QUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTiwgY29uZmlnLmdldE5hbWUoKSk7Ci0JCQkJZWxzZQotCQkJCQlqYXZhcHJvamVjdC5nZXRQcm9qZWN0KCkuc2V0UGVyc2lzdGVudFByb3BlcnR5KFByb3h5UGx1Z2luLlBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OLCBQcm94eUxhdW5jaFN1cHBvcnQuTk9UX1NFVCk7Ci0JCQl9IAotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHdpbmRvdy5nZXRTaGVsbCgpLCBudWxsLCBudWxsLCBlLmdldFN0YXR1cygpKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJfQkJCQkJCi0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvLyBUaGlzIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIGluaXQoV29ya2JlbmNoV2luZG93KSB3aGVuIHRoaXMgaXMgb24gcG9wdXAgbWVudS4KLQkJd2luZG93ID0gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODgyOGUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9BdHRpYy9tZXNzYWdlcy5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkCi0jCi0KLVNlbGVjdF90aXRsZT1TZWxlY3QgRGVmYXVsdAotU2VsZWN0X21lc3NhZ2U9U2VsZWN0IGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgcHJvamVjdCAiezB9IjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9yZW1vdGUvTG9jYWxMYXVuY2hQcm9qZWN0VGFiLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL0xvY2FsTGF1bmNoUHJvamVjdFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg0NmEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9yZW1vdGUvTG9jYWxMYXVuY2hQcm9qZWN0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogTG9jYWxMYXVuY2hQcm9qZWN0VGFiLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHkucmVtb3RlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLkphdmFMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW47Ci0gCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbExhdW5jaFByb2plY3RUYWIgZXh0ZW5kcyBKYXZhTGF1bmNoQ29uZmlndXJhdGlvblRhYiB7Ci0JCQotCS8vIFByb2plY3QgVUkgd2lkZ2V0cwotCXByb3RlY3RlZCBMYWJlbCBmUHJvakxhYmVsOwotCXByb3RlY3RlZCBUZXh0IGZQcm9qVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9qQnV0dG9uOwotCQkJCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2V0Q29udHJvbChjb21wKTsKLQkJR3JpZExheW91dCB0b3BMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wLnNldExheW91dCh0b3BMYXlvdXQpOwkJCi0JCUdyaWREYXRhIGdkOwotCQkKLQkJY3JlYXRlVmVydGljYWxTcGFjZXIoY29tcCwgMSk7Ci0JCQotCQlDb21wb3NpdGUgcHJvakNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBwcm9qTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJcHJvakxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcHJvakxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlwcm9qTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcHJvakNvbXAuc2V0TGF5b3V0KHByb2pMYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlwcm9qQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcHJvakNvbXAuc2V0Rm9udChmb250KTsKLQkJCi0JCWZQcm9qTGFiZWwgPSBuZXcgTGFiZWwocHJvakNvbXAsIFNXVC5OT05FKTsKLQkJZlByb2pMYWJlbC5zZXRUZXh0KFByb3h5UmVtb3RlVUlNZXNzYWdlcy5Mb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdCk7IAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZQcm9qTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZQcm9qTGFiZWwuc2V0Rm9udChmb250KTsKLQkJCi0JCWZQcm9qVGV4dCA9IG5ldyBUZXh0KHByb2pDb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWZQcm9qVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZlByb2pUZXh0LnNldEZvbnQoZm9udCk7Ci0JCWZQcm9qVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2dCkgewotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlmUHJvakJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24ocHJvakNvbXAsIFByb3h5UmVtb3RlVUlNZXNzYWdlcy5Mb2NhbExhdW5jaFByb2plY3RUYWJfQnJvd3NlLCBudWxsKTsgCi0JCWZQcm9qQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlUHJvamVjdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCX0pOwotCQkJCQotCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdXBkYXRlUHJvamVjdEZyb21Db25maWcoY29uZmlnKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvamVjdEZyb21Db25maWcoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlwcm9qZWN0TmFtZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAiIik7CSAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhjZSk7Ci0JCX0KLQkJZlByb2pUZXh0LnNldFRleHQocHJvamVjdE5hbWUpOwotCX0KLQkJCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCBmUHJvalRleHQuZ2V0VGV4dCgpKTsJCQotCX0KLQkJCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0JCQkKLQkJCi0JLyoqCi0JICogU2hvdyBhIGRpYWxvZyB0aGF0IGxldHMgdGhlIHVzZXIgc2VsZWN0IGEgcHJvamVjdC4gIFRoaXMgaW4gdHVybiBwcm92aWRlcwotCSAqIGNvbnRleHQgZm9yIHRoZSBtYWluIHR5cGUsIGFsbG93aW5nIHRoZSB1c2VyIHRvIGtleSBhIG1haW4gdHlwZSBuYW1lLCBvcgotCSAqIGNvbnN0cmFpbmluZyB0aGUgc2VhcmNoIGZvciBtYWluIHR5cGVzIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9qZWN0QnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gY2hvb3NlSmF2YVByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldEVsZW1lbnROYW1lKCk7Ci0JCWZQcm9qVGV4dC5zZXRUZXh0KHByb2plY3ROYW1lKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZWFsaXplIGEgSmF2YSBQcm9qZWN0IHNlbGVjdGlvbiBkaWFsb2cgYW5kIHJldHVybiB0aGUgZmlyc3Qgc2VsZWN0ZWQgcHJvamVjdCwKLQkgKiBvciBudWxsIGlmIHRoZXJlIHdhcyBub25lLgotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgY2hvb3NlSmF2YVByb2plY3QoKSB7Ci0JCUlKYXZhUHJvamVjdFtdIHByb2plY3RzOwotCQl0cnkgewotCQkJcHJvamVjdHM9IEphdmFDb3JlLmNyZWF0ZShnZXRXb3Jrc3BhY2VSb290KCkpLmdldEphdmFQcm9qZWN0cygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJcHJvamVjdHM9IG5ldyBJSmF2YVByb2plY3RbMF07Ci0JCX0KLQkJCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI9IG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfREVGQVVMVCk7Ci0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZz0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VGl0bGUoUHJveHlSZW1vdGVVSU1lc3NhZ2VzLkxvY2FsTGF1bmNoUHJvamVjdFRhYl9Qcm9qZWN0X1NlbGVjdGlvbik7IAotCQlkaWFsb2cuc2V0TWVzc2FnZShQcm94eVJlbW90ZVVJTWVzc2FnZXMuTG9jYWxMYXVuY2hQcm9qZWN0VGFiX0Nob29zZVByb2plY3QpOyAKLQkJZGlhbG9nLnNldEVsZW1lbnRzKHByb2plY3RzKTsKLQkJCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCk7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbnMobmV3IE9iamVjdFtdIHsgamF2YVByb2plY3QgfSk7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CQkJCi0JCQlyZXR1cm4gKElKYXZhUHJvamVjdCkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCX0JCQkKLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJSmF2YVByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvamVjdCBuYW1lIGluIHRoZSBwcm9qZWN0IG5hbWUKLQkgKiB0ZXh0IGZpZWxkLCBvciBudWxsIGlmIHRoZSB0ZXh0IGRvZXMgbm90IG1hdGNoIGEgcHJvamVjdCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGZQcm9qVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAocHJvamVjdE5hbWUubGVuZ3RoKCkgPCAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwkJCi0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgdGhlIHdvcmtzcGFjZSByb290LgotCSAqLwotCXByaXZhdGUgSVdvcmtzcGFjZVJvb3QgZ2V0V29ya3NwYWNlUm9vdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgYWNjZXNzIHRvIHRoZSBqYXZhIG1vZGVsLgotCSAqLwotCXByaXZhdGUgSUphdmFNb2RlbCBnZXRKYXZhTW9kZWwoKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoZ2V0V29ya3NwYWNlUm9vdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2lzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJCi0JCVN0cmluZyBuYW1lID0gZlByb2pUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID4gMCkgewotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUobmFtZSwgSVJlc291cmNlLlBST0pFQ1QpOwotCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0PSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZVVJTWVzc2FnZXMuTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3ROb3RFeGlzdF9FUlJPUl8sIG5ldyBTdHJpbmdbXSB7bmFtZX0pKTsgCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZVVJTWVzc2FnZXMuTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3ROb3RPcGVuX0VSUk9SXywgbmV3IFN0cmluZ1tdIHtuYW1lfSkpOyAKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlVUlNZXNzYWdlcy5Mb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdFZhbGlkYXRlRXJyb3JfRVJST1JfLCBuZXcgU3RyaW5nW117c3RhdHVzLmdldE1lc3NhZ2UoKX0pKTsgCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7CS8vIEtsdWRnZS4gV2UgYWx3YXlzIHJldHVybiBmYWxzZSBzbyB0aGF0ICJSdW4iIGJ1dHRvbiBpcyBuZXZlciBlbmFibGVkLiBXZSBjYW4ndCBsYXVuY2ggdGhlc2UgY29uZmlndXJhdGlvbnMgdXNpbmcgdGhlIHN0YW5kYXJkIHdheS4gT25seSB0aHJvdWdoIFByb3h5TGF1bmNoU3VwcG9ydC4KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcpIHsKLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gZ2V0Q29udGV4dCgpOwotCQlpZiAoamF2YUVsZW1lbnQgIT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZUphdmFQcm9qZWN0KGphdmFFbGVtZW50LCBjb25maWcpOwotCQl9IGVsc2UgewotCQkJLy8gV2Ugc2V0IGVtcHR5IGF0dHJpYnV0ZXMgZm9yIHByb2plY3Qgc28gdGhhdCB3aGVuIG9uZSBjb25maWcgaXMKLQkJCS8vIGNvbXBhcmVkIHRvIGFub3RoZXIsIHRoZSBleGlzdGVuY2Ugb2YgZW1wdHkgYXR0cmlidXRlcyBkb2Vzbid0IGNhdXNlIGFuCi0JCQkvLyBpbmNvcnJlY3QgcmVzdWx0ICh0aGUgcGVyZm9ybUFwcGx5KCkgbWV0aG9kIGNhbiByZXN1bHQgaW4gZW1wdHkgdmFsdWVzCi0JCQkvLyBmb3IgdGhlc2UgYXR0cmlidXRlcyBiZWluZyBzZXQgb24gYSBjb25maWcgaWYgdGhlcmUgaXMgbm90aGluZyBpbiB0aGUKLQkJCS8vIGNvcnJlc3BvbmRpbmcgdGV4dCBib3hlcykKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gUHJveHlSZW1vdGVVSU1lc3NhZ2VzLkxvY2FsTGF1bmNoUHJvamVjdFRhYl9uYW1lOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElERS5TaGFyZWRJbWFnZXMuSU1HX09CSl9QUk9KRUNUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL0xvY2FsTGF1bmNoVGFiR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9yZW1vdGUvTG9jYWxMYXVuY2hUYWJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYyZjJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9yZW1vdGUvTG9jYWxMYXVuY2hUYWJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICRSQ1NmaWxlOiBMb2NhbExhdW5jaFRhYkdyb3VwLmphdmEsdiAkICRSZXZpc2lvbjogMS41ICQgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5Tb3VyY2VMb29rdXBUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLio7Ci0KLS8qKgotICogTGF1bmNoIFRhYiBHcm91cCBmb3IgdGhlIExvY2FsIExhdW5jaCBvZiBhIFJlbW90ZSBQcm94eSBDb25maWd1cmF0aW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIExvY2FsTGF1bmNoVGFiR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEphdmEgYXBwbGV0IHRhYiBncm91cC4KLQkgKi8KLQlwdWJsaWMgTG9jYWxMYXVuY2hUYWJHcm91cCgpIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCNjcmVhdGVUYWJzKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2csIFN0cmluZyBtb2RlKSB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gdGFicyA9Ci0JCQluZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSB7Ci0JCQkJbmV3IExvY2FsTGF1bmNoUHJvamVjdFRhYigpLAotCQkJCW5ldyBKYXZhQXJndW1lbnRzVGFiKCksCi0JCQkJbmV3IEphdmFKUkVUYWIoKSwKLQkJCQluZXcgSmF2YUNsYXNzcGF0aFRhYigpLAotCQkJCW5ldyBTb3VyY2VMb29rdXBUYWIoKSwJLy8gVE9ETyBOZWVkIHRvIHNlZSB3aHkgU291cmNlTG9va3VwVGFiIGRpZG4ndCB3b3JrLiBVbnRpbCB0aGVuIHVzZSB0aGlzLgotCQkJCW5ldyBFbnZpcm9ubWVudFRhYigpLAotCQkJCW5ldyBDb21tb25UYWIoKX07Ci0JCXNldFRhYnModGFicyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL1Byb3h5UmVtb3RlVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L3JlbW90ZS9Qcm94eVJlbW90ZVVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyMTI2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL1Byb3h5UmVtb3RlVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJveHlSZW1vdGVVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHkucmVtb3RlLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByb3h5UmVtb3RlVUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxMYXVuY2hQcm9qZWN0VGFiX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxMYXVuY2hQcm9qZWN0VGFiX0Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdF9TZWxlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxMYXVuY2hQcm9qZWN0VGFiX0Nob29zZVByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3ROb3RFeGlzdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3ROb3RPcGVuX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdFZhbGlkYXRlRXJyb3JfRVJST1JfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHJveHlSZW1vdGVVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L3JlbW90ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L3JlbW90ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2NhMDEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9yZW1vdGUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL0F0dGljL21lc3NhZ2VzLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQKLSMKLQotTG9jYWxMYXVuY2hQcm9qZWN0VGFiX25hbWUgICAgICAgICAgICAgICAgICAgICAgICA9ICZQcm9qZWN0Ci1Mb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdCAgICAgICAgICAgICAgICAgICAgID0gJlByb2plY3QKLUxvY2FsTGF1bmNoUHJvamVjdFRhYl9Ccm93c2UgICAgICAgICAgICAgICAgICAgICAgPSAmQnJvd3NlLi4uCi1Mb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdF9TZWxlY3Rpb24gICAgICAgICAgID0gUHJvamVjdCBTZWxlY3Rpb24KLUxvY2FsTGF1bmNoUHJvamVjdFRhYl9DaG9vc2VQcm9qZWN0ICAgICAgICAgICAgICAgPSBDaG9vc2UgYSAmcHJvamVjdCB0byBmb3IgdGhlIGxhdW5jaDoKLUxvY2FsTGF1bmNoUHJvamVjdFRhYl9Qcm9qZWN0Tm90RXhpc3RfRVJST1JfICAgICAgPSBJV0FWMDE3NEUgUHJvamVjdCAiezB9IiBkb2VzbicndCBleGlzdC4KLUxvY2FsTGF1bmNoUHJvamVjdFRhYl9Qcm9qZWN0Tm90T3Blbl9FUlJPUl8gICAgICAgPSBJV0FWMDE3NUUgUHJvamVjdCAiezB9IiBpcyBub3Qgb3Blbi4KLUxvY2FsTGF1bmNoUHJvamVjdFRhYl9Qcm9qZWN0VmFsaWRhdGVFcnJvcl9FUlJPUl8gPSBJV0FWMDE3NkUgUHJvamVjdCB2YWxpZGF0aW9uIGVycm9yLiBNc2cgaXMgInswfS4iCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjgyZGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3b3JrYmVuY2gvIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDYzYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODYyYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZW08L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmplbS5wcm94eTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjM4MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0jVGh1IEp1biAxNiAxMzoyMzozMiBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2ZmNjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jV2VkIE1heSAxMSAxNjoyMDoxNSBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9amF2YTtqYXZheDtvcmc7b3JnLmVjbGlwc2Uud3RwO29yZy5lY2xpcHNlLmplbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZG07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RlO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmpjbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qYXZhO29yZy5lY2xpcHNlLnZlO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk2NGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8sb3JnLmVjbGlwc2UuamVtLnRlc3RzIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamVtLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmplbS51dGlsCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlNDgyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQotc291cmNlLi4gPSB3b3JrYmVuY2gvCi1vdXRwdXQuLiA9IGJpbi8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzMjIzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkCi0jCi0KLQotcGx1Z2luTmFtZT1KYXZhIEVNRiBNb2RlbCBXb3JrYmVuY2ggU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQotSmF2YUVNRk5hdHVyZU5hbWU9SmF2YUVNRk5hdHVyZSBQcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTA4OTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkphdmFFTUZOYXR1cmUiCi0gICAgICAgICBuYW1lPSIlSmF2YUVNRk5hdHVyZU5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyI+Ci0gICAgICA8cnVudGltZT4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmUiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3J1bnRpbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLm5hdHVyZV9yZWdpc3RyYXRpb24iPgotICAgICAgPG5hdHVyZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2guSmF2YUVNRk5hdHVyZSI+Ci0gICAgICA8L25hdHVyZT4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyYjgzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEpET01BZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMTAvMTggMTQ6NTg6MTggJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZGYWN0b3J5SW1wbDsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSkRPTUFkYXB0b3IgZXh0ZW5kcyBKYXZhUmVmbGVjdGlvbkFkYXB0b3IgewotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBKYXZhUmVmUGFja2FnZSBKQVZBX1BBQ0sgPSBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCXByb3RlY3RlZCBJSmF2YVByb2plY3Qgc291cmNlUHJvamVjdDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBJTlZBTElEX0xJTkVOTyA9IC0xOwotCWZpbmFsIHByb3RlY3RlZCBJbnRlZ2VyIGZMSU5FTk9Mb2NrID0gbmV3IEludGVnZXIoSU5WQUxJRF9MSU5FTk8pOwotCS8vIFRoaXMgb2JqZWN0IGlzIG5vdCBzdGF0aWMsIGFzIGl0IGlzIHVzZWQgYXMgc3luY2hyb25pemF0aW9uIGVsZW1lbnQuCi0JcHJpdmF0ZSBpbnQgZlJlc29sdmVkTGluZU5vID0gSU5WQUxJRF9MSU5FTk87IC8vIExpbmUgb2Zmc2V0IGluIHNvdXJjZSBmaWxlCi0JcHJpdmF0ZSBpbnQgZlJlc29sdmVkQ29sTm8gPSBJTlZBTElEX0xJTkVOTzsgLy8gQ29sdW1uIG9mZnNldCBpbiBzb3VyY2UgZmlsZQotCXB1YmxpYyBKRE9NQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIElKYXZhUHJvamVjdCB3b3JraW5nUHJvamVjdCkgewotCQlzdXBlcih0YXJnZXQpOwotCQlzZXRTb3VyY2VQcm9qZWN0KHdvcmtpbmdQcm9qZWN0KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTb3VyY2UoKSB7Ci0JCS8vIFRvIGJlIG92ZXJpZGRlbiBpZiBuZWVkZWQuCi0JfQotCQotCS8qKgotCSAqIENhbGxlZCBieSBzdWJjbGFzc2VzIGluIGNhblJlZmxlY3QoKS4gSWYgdGhlIHRhcmdldCBpcyBub3QgaW4gYSByZXNvdXJjZSwgb3IgdGhlCi0JICogcmVzb3VyY2UgaXMgbm90IGxvYWRlZCwgdGhlbiBpdCBjYW4ndCByZWZsZWN0LiBNdXN0bid0IHJlZmxlY3QgaWYgdGhlIHRhcmdldAotCSAqIGhhcyBiZWVuIHVubG9hZGVkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jlc291cmNlTG9hZGVkKCkgewotCQlSZXNvdXJjZSByZXMgPSAoKEVPYmplY3QpIGdldFRhcmdldCgpKS5lUmVzb3VyY2UoKTsKLQkJcmV0dXJuIHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBTY2FuIGZvciBDUnMgYW5kIExGcyB3aXRoaW4gYSBjaGFyYWN0ZXIgYnVmZmVyCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAyOjE0OjEzIFBNKQotCSAqIEByZXR1cm4gaW50ICBMaW5lTm8gYXQgY2hhck9mZnNldAotCSAqIEBwYXJhbSBjaGFyT2Zmc2V0IGludAotCSAqIEBwYXJhbSBidWZmZXIgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wdXRlTGluZU9mZnNldChpbnQgY2hhck9mZnNldCwgSUJ1ZmZlciBidWZmZXIpIHsKLQotCQlmUmVzb2x2ZWRDb2xObyA9IGZSZXNvbHZlZExpbmVObyA9IElOVkFMSURfTElORU5POwotCi0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljaGFyW10gY2hhckJ1ZmYgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOwotCi0JCWlmIChjaGFyQnVmZiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBMaW5lQ291bnQgPSAwOwotCQlpbnQgQ29sTm8gPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8PSBjaGFyT2Zmc2V0OyBpKyspIHsKLQkJCUNvbE5vKys7Ci0JCQlpZiAoY2hhckJ1ZmZbaV0gPT0gJ1xyJykgewotCQkJCUxpbmVDb3VudCsrOwotCQkJCUNvbE5vID0gMDsKLQkJCQlpZiAoY2hhckJ1ZmZbaSArIDFdID09ICdcbicpCi0JCQkJCWkrKzsgLy8gc2tpcCBMaW5lRmVlZCBmb2xsb3dlZCAgYSBDUgotCQkJfSBlbHNlIGlmIChjaGFyQnVmZltpXSA9PSAnXG4nKSB7Ci0JCQkJTGluZUNvdW50Kys7Ci0JCQkJQ29sTm8gPSAwOwotCQkJfQotCi0JCX0KLQkJZlJlc29sdmVkQ29sTm8gPSBDb2xObzsKLQkJZlJlc29sdmVkTGluZU5vID0gTGluZUNvdW50OwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kSUQgLSBnZW5lcmF0ZSB0aGUgdW5pcXVlIElEIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogU2ltaWxhciB0byBhIFNpZ25hdHVyZSwgYnV0IGhvcGVmdWxseSBtb3JlIHJlYWRhYmxlLgotCSAqIFRoZSBuYW1lIGZvcm1hdCB3aWxsIGJlOgotCSAqIAlzaW1wbGVUeXBlTmFtZS5tZXRob2ROYW1lKG15LnBhY2thZ2UuUGFybV9UeXBlMSxwYXJtVHlwZTIKLQkgKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIFJlZmxlY3Rpb25BZGFwdGVyLmdldFR5cGVOYW1lc0Zyb21NZXRob2RJRCgpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2RJRChJTWV0aG9kIGpkb21NZXRob2QpIHsKLQkJcmV0dXJuIGNvbXB1dGVNZXRob2RJRChqZG9tTWV0aG9kLCBqZG9tTWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSwgbnVsbCk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2RJRCAtIGdlbmVyYXRlIHRoZSB1bmlxdWUgSUQgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZC4KLQkgKiBTaW1pbGFyIHRvIGEgU2lnbmF0dXJlLCBidXQgaG9wZWZ1bGx5IG1vcmUgcmVhZGFibGUuCi0JICogVGhlIG5hbWUgZm9ybWF0IHdpbGwgYmU6Ci0JICogCXNpbXBsZVR5cGVOYW1lLm1ldGhvZE5hbWUobXkucGFja2FnZS5QYXJtX1R5cGUxLHBhcm1UeXBlMgotCSAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggUmVmbGVjdGlvbkFkYXB0ZXIuZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZElEKElNZXRob2QgamRvbU1ldGhvZCwgSVR5cGUgdHlwZSwgTWFwIHR5cGVDYWNoZSkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlvdXQuYXBwZW5kKHR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSk7Ci0JCW91dC5hcHBlbmQoQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQkJb3V0LmFwcGVuZChqZG9tTWV0aG9kLmdldEVsZW1lbnROYW1lKCkpOwotCQlvdXQuYXBwZW5kKENfTUVUSE9EX1BBUk1fREVMSU1JVEVSKTsKLQkJU3RyaW5nW10gcGFybVR5cGVOYW1lcyA9IGpkb21NZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJU3RyaW5nIHBhcm1OYW1lOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBhcm1OYW1lID0gY29udmVydEpET010eXBlTmFtZShwYXJtVHlwZU5hbWVzW2ldKTsKLQkJCXBhcm1OYW1lID0gSkRPTVNlYXJjaEhlbHBlci5nZXRSZXNvbHZlZFR5cGVOYW1lKHBhcm1OYW1lLCB0eXBlLCB0eXBlQ2FjaGUpOwotCQkJb3V0LmFwcGVuZChwYXJtTmFtZSk7Ci0JCQlpZiAoaSA8IChwYXJtVHlwZU5hbWVzLmxlbmd0aCAtIDEpKQotCQkJCW91dC5hcHBlbmQoQ19QQVJNX1BBUk1fREVMSU1JVEVSKTsKLQkJfQotCQl0cnkgewotCQkJaWYgKGpkb21NZXRob2QuaXNDb25zdHJ1Y3RvcigpKQotCQkJCW91dC5hcHBlbmQoU19DT05TVFJVQ1RPUl9UT0tFTik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kTmFtZSAtIGdlbmVyYXRlIHRoZSBuYW1lIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogRm9yIHRoZSBtb21lbnQsIG5hbWVzIGFyZSBzaW1wbGUsIGFuZCBVVUlEJ3MgYXJlIGNvbXBsZXguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZE5hbWUoSU1ldGhvZCBqZG9tTWV0aG9kKSB7Ci0JCXJldHVybiBqZG9tTWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCS8qKgotCSAqIEphdmEgY29udGVudCBoYXMgY2hhbmdlZCwgYnV0IG5vIHN0cnVjdHVyYWwgY2hhbmdlcyB0aGF0IHJlcXVpcmUKLQkgKiB0byByZWZsZWN0VmFsdWVzKCk7ICBlLmcuLCB0aGUgYm9keSBvZiBhIG1ldGhvZCBoYXMgY2hhbmdlZC4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDEwOjQ3OjU4IEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRlbnRDaGFuZ2VkKCkgewotCQlzeW5jaHJvbml6ZWQgKGZMSU5FTk9Mb2NrKSB7Ci0JCQlmUmVzb2x2ZWRMaW5lTm8gPSBJTlZBTElEX0xJTkVOTzsKLQkJCWZSZXNvbHZlZENvbE5vID0gSU5WQUxJRF9MSU5FTk87Ci0JCX0KLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZElEIC0gZ2VuZXJhdGUgdGhlIHVuaXF1ZSBJRCB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIFNpbWlsYXIgdG8gYSBTaWduYXR1cmUsIGJ1dCBob3BlZnVsbHkgbW9yZSByZWFkYWJsZS4KLQkgKiBUaGUgbmFtZSBmb3JtYXQgd2lsbCBiZToKLQkgKiAJbWV0aG9kTmFtZV9wYXJtVHlwZTFfcGFybVR5cGUyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEpET010eXBlTmFtZShTdHJpbmcgamRvbVR5cGVOYW1lKSB7Ci0JCXJldHVybiBzaWduYXR1cmVUb1N0cmluZyhqZG9tVHlwZU5hbWUpOwotCX0KLQkvKioKLQkgKiBjcmVhdGVKYXZhRmllbGQgLSBpbnN0YW50aWF0ZSBhIEphdmEgRmllbGQgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIE1vZGVsIElGaWVsZAotCSAqIFdlIGFyZSBkZWZlcnJpbmcgZmllbGQgY29udGVudHMgYXNzdW1pbmcgdGhhdCBpdHMgYWRhcHRvciB3aWxsIHJlZmxlY3QgaXRzIGRldGFpbHMuCi0JICovCi0JcHVibGljIEZpZWxkIGNyZWF0ZUphdmFGaWVsZChJRmllbGQgamRvbUZpZWxkLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlTdHJpbmcgbmFtZSA9IGpkb21GaWVsZC5nZXRFbGVtZW50TmFtZSgpOwotCQlGaWVsZCBuZXdGaWVsZCA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLQkJbmV3RmllbGQuc2V0TmFtZShuYW1lKTsKLQkJcmVzb3VyY2Uuc2V0SUQobmV3RmllbGQsICgoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpICsgQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSICsgbmFtZSk7Ci0JCXJldHVybiBuZXdGaWVsZDsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YU1ldGhvZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBNZXRob2QgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIE1vZGVsIElNZXRob2QKLQkgKiBXZSBhcmUgZGVmZXJyaW5nIG1ldGhvZCBjb250ZW50cyBhc3N1bWluZyB0aGF0IGl0cyBhZGFwdG9yIHdpbGwgcmVmbGVjdCBpdHMgZGV0YWlscy4KLQkgKiBXZSBuZWVkIHRvIHN0b3JlIGVub3VnaCBpbmZvIGluIHRoZSBlbXB0eSBNZXRob2QgdG8gZmluZCBpdHMgSmF2YSBzb3VyY2UuCi0JICogVGhlIFVVSUQgd2lsbCBldmVudHVhbGx5IGhvbGQgZW5vdWdoIGluZm8gdG8gaWRlbnRpZnkgdGhlIHNvdXJjZSwgc28gd2UgdXNlIGl0LgotCSAqLwotCXB1YmxpYyBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZChJTWV0aG9kIGpkb21NZXRob2QsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZCBuZXdNZXRob2QgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotCQkvLyBXZSB1c2UgYSBzaW1wbGUgbmFtZSwgYnV0IGEgY29tcGxleCBJRCAKLQkJbmV3TWV0aG9kLnNldE5hbWUoY29tcHV0ZU1ldGhvZE5hbWUoamRvbU1ldGhvZCkpOwotCQlyZXNvdXJjZS5zZXRJRChuZXdNZXRob2QsIGNvbXB1dGVNZXRob2RJRChqZG9tTWV0aG9kLCBnZXRUeXBlKCksIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSkpOwotCQlyZXR1cm4gbmV3TWV0aG9kOwotCX0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0QmluYXJ5UGF0aEZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBJVHlwZSBnZXRCaW5hcnlUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwpIHsKLQkJCQlJSmF2YUVsZW1lbnQgZm91bmQgPSBnZXRTb3VyY2VQcm9qZWN0KCkuZmluZEVsZW1lbnQoZ2V0QmluYXJ5UGF0aEZyb21RdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUpKTsKLQkJCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCQkJcmV0dXJuICgoSUNsYXNzRmlsZSkgZm91bmQpLmdldFR5cGUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIENvbXB1dGUgYSBjb2x1bW4gbnVtYmVyIGZyb20gdGhlIElTb3VyY2VSYW5nZSBvZmZzZXQKLQkgKiBDYWNoZSB0aGUgbGluZSBudW1iZXIgdGhlcmVhZnRlci4gIFNvdXJjZSBjaGFuZ2Ugd2lsbAotCSAqIEludm9rZSB0aGUgY29udGVudENoYW5nZWQoKSBtZXRob2QuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAxMToxNjo1MSBBTSkKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sTm8oKSB7Ci0KLQkJc3luY2hyb25pemVkIChmTElORU5PTG9jaykgewotCQkJaWYgKGZSZXNvbHZlZENvbE5vID09IElOVkFMSURfTElORU5PKQotCQkJCXJlc29sdmVMaW5lQ29sTm8oKTsKLQkJfQotCQlyZXR1cm4gZlJlc29sdmVkQ29sTm87Ci0JfQotCS8qKgotCSAqIENvbXB1dGUgYSBsaW5lIG51bWJlciBmcm9tIHRoZSBJU291cmNlUmFuZ2Ugb2Zmc2V0Ci0JICogQ2FjaGUgdGhlIGxpbmUgbnVtYmVyIHRoZXJlYWZ0ZXIuICBTb3VyY2UgY2hhbmdlIHdpbGwKLQkgKiBJbnZva2UgdGhlIGNvbnRlbnRDaGFuZ2VkKCkgbWV0aG9kLgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzE3LzIwMDEgMTE6MTY6NTEgQU0pCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVObygpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMSU5FTk9Mb2NrKSB7Ci0JCQlpZiAoZlJlc29sdmVkTGluZU5vID09IElOVkFMSURfTElORU5PKQotCQkJCXJlc29sdmVMaW5lQ29sTm8oKTsKLQkJfQotCQlyZXR1cm4gZlJlc29sdmVkTGluZU5vOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAxOjE4OjI5IFBNKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpOwotCS8qIAotCSAqIFJlc29sdmUgYSB0eXBlIG5hbWUgaW4gdGhlIGNvbnRleHQgb2YgYSBUeXBlLgotCSAqIChCb3Jyb3dlZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5jb2RlbWFuaXB1bGF0aW9uLlN0dWJVdGlsaXR5LmdldFJlc29sdmVkVHlwZU5hbWUoKSkKLQkgKiBUaGUgaW5wdXQgaXMgYSBzaW1wbGUgb3IgcXVhbGlmaWVkIG5hbWUsIE5PVCBhIHNpZ25hdHVyZQotCSAqIFRoZSBvdXRwdXQgd2lsbCBiZSBhIHF1YWxpZmllZCBuYW1lLCBOT1QgYSBzaWduYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgZGVjbGFyaW5nVHlwZSkgewotCQlTdHJpbmcgbmFtZSA9IHR5cGVOYW1lOwotCQl0cnkgewotCQkJbmFtZSA9IEpET01TZWFyY2hIZWxwZXIucmVzb2x2ZVNpbXBsZVR5cGVOYW1lKGRlY2xhcmluZ1R5cGUsIHR5cGVOYW1lKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0U291cmNlUHJvamVjdCgpIHsKLQkJcmV0dXJuIHNvdXJjZVByb2plY3Q7Ci0JfQotCXByb3RlY3RlZCBhYnN0cmFjdCBJVHlwZSBnZXRUeXBlKCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IE1hcCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCk7Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlU291cmNlVHlwZSgpIHsKLQkJZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSh0cnVlKTsgLy8gaW5kdWNlIGNsaWVudHMgdG8gZ2V0IE5vdGlmaWVkLgotCX0KLQotCXB1YmxpYyBOb3RpZmljYXRpb24gcmVsZWFzZVNvdXJjZVR5cGVOb05vdGlmaWNhdGlvbigpIHsKLQkJcmV0dXJuIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbih0cnVlKTsgLy8gaW5kdWNlIGNsaWVudHMgdG8gZ2V0IE5vdGlmaWVkLgotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMjEvMjAwMSA4OjA5OjM0IEFNKQotCSAqLwotCXByaXZhdGUgdm9pZCByZXNvbHZlTGluZUNvbE5vKCkgewotCi0JCUlNZW1iZXIgcnMgPSAoSU1lbWJlcikgZ2V0UmVmbGVjdGlvblNvdXJjZSgpOwotCQlpZiAocnMgIT0gbnVsbCkgewotCQkJaW50IG9mZnNldCA9IElOVkFMSURfTElORU5POwotCQkJdHJ5IHsKLQkJCQlJU291cmNlUmFuZ2Ugc3IgPSBycy5nZXROYW1lUmFuZ2UoKTsKLQkJCQlpZiAoc3IuZ2V0TGVuZ3RoKCkgPD0gMCkKLQkJCQkJcmV0dXJuOwotCQkJCW9mZnNldCA9IHNyLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGplKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHJzLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlJQnVmZmVyIGJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOwotCQkJCQljb21wdXRlTGluZU9mZnNldChvZmZzZXQsIGJ1ZmZlcik7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGplKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVByb2plY3QoSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0KSB7Ci0JCXNvdXJjZVByb2plY3QgPSB3b3JraW5nUHJvamVjdDsKLQl9Ci0JLyoqCi0JICogQ29udmVydHMgYSB0eXBlIHNpZ25hdHVyZSB0byBhIHJlYWRhYmxlIHN0cmluZy4KLQkgKgotCSAqIFVzZXMgU2lnbmF0dXJlLnRvU3RyaW5nKCksIHRoZW4gdHJpZXMgdG8gdW5kbyBiYWQgcmVwbGFjZW1lbnQgZm9yIGlubmVyIGNsYXNzZXMuCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaWduYXR1cmVUb1N0cmluZyhTdHJpbmcgc2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNEb2xsYXIgPSAoc2lnbmF0dXJlLmluZGV4T2YoU2lnbmF0dXJlLkNfRE9MTEFSKSAhPSAtMSk7Ci0JCVN0cmluZyByZXN1bHQgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnbmF0dXJlKTsKLQkJaWYgKGhhc0RvbGxhcikgewotCQkJaW50IG5ld1BvcyA9IHJlc3VsdC5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobmV3UG9zICE9IC0xKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZygwLCBuZXdQb3MpICsgIiQiICsgcmVzdWx0LnN1YnN0cmluZyhuZXdQb3MgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKFN0cmluZyBzaWcpIHsKLQkJcmV0dXJuIHR5cGVOYW1lRnJvbVNpZ25hdHVyZShzaWcsIGdldFR5cGUoKSk7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKFN0cmluZyBzaWcsIElUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gdHlwZU5hbWVGcm9tU2lnbmF0dXJlKHNpZywgcGFyZW50LCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkpOwotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciB0eXBlIGhlcmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlTmFtZUZyb21TaWduYXR1cmUoU3RyaW5nIHNpZywgSVR5cGUgcGFyZW50LCBNYXAgdHlwZUNhY2hlKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0JCVN0cmluZyBjb21wb25lbnRTaWduYXR1cmUgPSBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoc2lnKTsKLQkJaW50IGFycmF5RGltZW5zaW9ucyA9IFNpZ25hdHVyZS5nZXRBcnJheUNvdW50KHNpZyk7Ci0JCXJlc3VsdCA9IEpET01TZWFyY2hIZWxwZXIuZ2V0UmVzb2x2ZWRUeXBlTmFtZShzaWduYXR1cmVUb1N0cmluZyhjb21wb25lbnRTaWduYXR1cmUpLCBwYXJlbnQsIHR5cGVDYWNoZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlEaW1lbnNpb25zOyBpKyspIHsKLQkJCXJlc3VsdCA9IHJlc3VsdCArICJbXSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSkRPTVNlYXJjaEhlbHBlciNmaW5kVHlwZShTdHJpbmcsIGJvb2xlYW4sIElKYXZhUHJvamVjdCwgSkRPTUFkYXB0b3IpCi0JICovCi0JcHVibGljIElUeXBlIGdldFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJcmV0dXJuIEpET01TZWFyY2hIZWxwZXIuZmluZFR5cGUocXVhbGlmaWVkTmFtZSwgZmFsc2UsIGdldFNvdXJjZVByb2plY3QoKSwgdGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQ2xhc3NGaW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUNsYXNzRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmY2OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQ2xhc3NGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotICogICRSQ1NmaWxlOiBKRE9NQ2xhc3NGaW5kZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMTYvMjAwMCAxMTowNjo0NiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEpET01DbGFzc0ZpbmRlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSkRPTUNsYXNzRmluZGVyIGluc3RhbmNlOwotLyoqCi0gKiBKRE9NQ2xhc3NGaW5kZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEpET01DbGFzc0ZpbmRlcigpIHsKLQlzdXBlcigpOwotfQotcHJvdGVjdGVkIElQYXRoIGdldEJpbmFyeVBhdGhGcm9tUXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyIpOy8vJE5PTi1OTFMtMSQKLX0KLXB1YmxpYyBJVHlwZSBnZXRCaW5hcnlUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JdHJ5IHsKLQkJSUphdmFFbGVtZW50IGZvdW5kID0gZ2V0SmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSk7Ci0JCXJldHVybiAoKElDbGFzc0ZpbGUpIGZvdW5kKS5nZXRUeXBlKCk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyIsIChuZXcgT2JqZWN0W10ge3F1YWxpZmllZE5hbWUsIGptZS5nZXRNZXNzYWdlKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIkVycm9yIGxvb2tpbmcgdXAgdHlwZTogIgotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQl0cnkgewotCQlpZiAoZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0U291cmNlUHJvamVjdCgpLmZpbmRFbGVtZW50KGdldFBhdGhGcm9tUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lKSk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyIsIChuZXcgT2JqZWN0W10ge3F1YWxpZmllZE5hbWUsIGptZS5nZXRNZXNzYWdlKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIkVycm9yIGxvb2tpbmcgdXAgdHlwZTogIgotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXByb3RlY3RlZCBJUGF0aCBnZXRQYXRoRnJvbVF1YWxpZmllZE5hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQlyZXR1cm4gbmV3IFBhdGgocXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuamF2YSIpOy8vJE5PTi1OTFMtMSQKLX0KLXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0U291cmNlUHJvamVjdCgpIHsKLQkvL3JldHVybiAoSUphdmFQcm9qZWN0KSAoKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpKS5nZXRKYXZhUmVmRmFjdG9yeSgpLmdldEphdmFDb250ZXh0KCk7Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCXRyeSB7Ci0JCUlKYXZhRWxlbWVudCBmb3VuZCA9IGdldEphdmFFbGVtZW50KHF1YWxpZmllZE5hbWUpOwotCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCWlmIChmb3VuZCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCi0JCQkJcmV0dXJuICgoSUNsYXNzRmlsZSkgZm91bmQpLmdldFR5cGUoKTsKLQkJCWVsc2UKLQkJCQlpZiAoZm91bmQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJCUlDb21waWxhdGlvblVuaXQgZm91bmRDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBmb3VuZDsKLQkJCQkJLy8gc3RyaXAgdGhlICIuamF2YSIsIGxpZnRlZCBmcm9tIENvbXBpbGF0aW9uVW5pdC5nZXRNYWluVHlwZU5hbWUoKQotCQkJCQlTdHJpbmcgY3VNYWluVHlwZU5hbWUgPSBmb3VuZENVLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJCWN1TWFpblR5cGVOYW1lID0gY3VNYWluVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGN1TWFpblR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQkJCXJldHVybiBmb3VuZENVLmdldFR5cGUoY3VNYWluVHlwZU5hbWUpOwotCQkJCX0KLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9Mb29raW5nX1VwX1R5cGVfRVJST1JfIiwgKG5ldyBPYmplY3RbXSB7cXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8xNi8yMDAwIDExOjE5OjQ4IFBNKQotICogQHJldHVybiBjb20uaWJtLmV0b29scy5qYXZhLmFkYXB0ZXJzLkpET01DbGFzc0ZpbmRlcgotICovCi1wdWJsaWMgc3RhdGljIEpET01DbGFzc0ZpbmRlciBpbnN0YW5jZSgpIHsKLQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJaW5zdGFuY2UgPSBuZXcgSkRPTUNsYXNzRmluZGVyKCk7Ci0JcmV0dXJuIGluc3RhbmNlOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NU2VhcmNoSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01TZWFyY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4NjFhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01TZWFyY2hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLSAqICAkUkNTZmlsZTogSkRPTVNlYXJjaEhlbHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjEzOjUzICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOS8yNi8yMDAxIDExOjA5OjMwIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSkRPTVNlYXJjaEhlbHBlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVkVEX05BTUUgPSAiIDo6IFJFU09MVkVEX05BTUUgOjogIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJJT0QgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTiA9ICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCWVRFID0gImJ5dGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVIgPSAiY2hhciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlQgPSAic2hvcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVCA9ICJpbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPTkcgPSAibG9uZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSUQgPSAidm9pZCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBKRE9NU2VhcmNoSGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpET01TZWFyY2hIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIElmIHRoZSBAc2ltcGxlTmFtZSBpcyBhbiBpbm5lciBjbGFzcywgd2UgbmVlZCB0byByZXNvbHZlIG9ubHkgdGhlIGRlY2xhcmluZyBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGdldFR5cGVOYW1lSW5mbyhJVHlwZSB0eXBlLCBTdHJpbmcgc2ltcGxlTmFtZSwgYm9vbGVhbiBpc0ZvclJlZmxlY3Rpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmdbXVtdIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBkZWNsYXJpbmdOYW1lLCB0eXBlTmFtZTsKLQkJdHlwZU5hbWUgPSBzaW1wbGVOYW1lOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNGb3JSZWZsZWN0aW9uKQotCQkJCXR5cGVOYW1lID0gdHlwZU5hbWUucmVwbGFjZSgnLicsICckJyk7Ci0JCQlpbnQgaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCIkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQlkZWNsYXJpbmdOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQlyZXN1bHQgPSB0eXBlLnJlc29sdmVUeXBlKGRlY2xhcmluZ05hbWUpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQlpZiAoaXNGb3JSZWZsZWN0aW9uKQotCQkJCQkJcmVzdWx0WzBdWzFdID0gcmVzdWx0WzBdWzFdLnJlcGxhY2UoJy4nLCAnJCcpOwotCQkJCQlyZXN1bHRbMF1bMV0gKz0gdHlwZU5hbWUuc3Vic3RyaW5nKGluZGV4LCB0eXBlTmFtZS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoIlsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJZGVjbGFyaW5nTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCXJlc3VsdCA9IHR5cGUucmVzb2x2ZVR5cGUoZGVjbGFyaW5nTmFtZSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCXJlc3VsdFswXVsxXSA9IHJlc3VsdFswXVsxXSArIHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0JCQkJfSBlbHNlCi0JCQkJCXJlc3VsdCA9IHR5cGUucmVzb2x2ZVR5cGUodHlwZU5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIChCT09MRUFOLmVxdWFscyh0eXBlKSB8fCBJTlQuZXF1YWxzKHR5cGUpIHx8IENIQVIuZXF1YWxzKHR5cGUpIHx8IFNIT1JULmVxdWFscyh0eXBlKSB8fCBMT05HLmVxdWFscyh0eXBlKSB8fCBGTE9BVC5lcXVhbHModHlwZSkgfHwgRE9VQkxFLmVxdWFscyh0eXBlKSB8fCBCWVRFLmVxdWFscyh0eXBlKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmVPclZvaWQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIGlzUHJpbWl0aXZlKHR5cGUpIHx8IGlzVm9pZCh0eXBlKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgcHJpbWl0aXZlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1ZvaWQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIFZPSUQuZXF1YWxzKHR5cGUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBzaWduYXR1cmVzIG1hdGNoIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFR5cGVTaWduYXR1cmVzKElUeXBlIHR5cGUsIFN0cmluZyBzaWduYXR1cmUxLCBTdHJpbmcgc2lnbmF0dXJlMikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtYXRjaFR5cGVTaWduYXR1cmVzKHR5cGUsIHNpZ25hdHVyZTEsIHNpZ25hdHVyZTIsIG51bGwpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBzaWduYXR1cmVzIG1hdGNoIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFR5cGVTaWduYXR1cmVzKElUeXBlIHR5cGUsIFN0cmluZyBzaWduYXR1cmUxLCBTdHJpbmcgc2lnbmF0dXJlMiwgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHNpZzEgPSBzaWduYXR1cmUxOwotCQlTdHJpbmcgc2lnMiA9IHNpZ25hdHVyZTI7Ci0JCS8vIEZpcnN0IGNoZWNrIGFycmF5IGNvdW50LgotCQlpZiAoU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnMSkgPT0gU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnMikpIHsKLQkJCS8vIFdlIGhhdmUgdGhlIHNhbWUgYXJyYXkgY291bnQsIGdldCB0aGUgZWxlbWVudCB0eXBlcyBmb3IgY29uc2lkZXJhdGlvbi4KLQkJCXNpZzEgPSBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoc2lnMSk7Ci0JCQlzaWcyID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHNpZzIpOwotCi0JCQkvLyBUaGVyZSBhcmUgdGhyZWUgY2FzZXM6Ci0JCQkvLwkJMSkgQm90aCBhcmUgdW5xdWFsaWZpZWQgKGJvdGggYmVpbmcgcHJpbWl0aXZlIHdpbGwgZmFsbCBpbnRvIHRoaXMpLAotCQkJLy8JCTIpIEJvdGggYXJlIHF1YWxpZmllZCwgYW5kCi0JCQkvLwkJMykgT25lIGlzIHF1YWxpZmllZCBhbmQgdGhlIG90aGVyIGlzIG5vdCAob25lIGNvdWxkIGJlIHByaW1pdGl2ZSkuCi0KLQkJCS8vIEZvciB0aGUgZmlyc3QgdHdvIGNhc2VzIGEgY29tcGFyZSBvZiB0aGUgcmVhZGFibGUgbmFtZXMgd2lsbCBhbHdheXMgZG8uCi0JCQlpZiAoISgoc2lnMS5pbmRleE9mKCcuJykgPT0gLTEpIF4gKHNpZzIuaW5kZXhPZignLicpID09IC0xKSkpIHsKLQkJCQlyZXN1bHQgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMSkuZXF1YWxzKFNpZ25hdHVyZS50b1N0cmluZyhzaWcyKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoaXMgaXMgY2FzZSAzLgotCQkJCS8vIEZpcnN0IHJvb3Qgb3V0IG9uZSBiZWluZyBwcmltaXRpdmUuCi0JCQkJaWYgKCgoc2lnMS5jaGFyQXQoMCkgPT0gJ1EnKSB8fCAoc2lnMS5jaGFyQXQoMCkgPT0gJ0wnKSkgJiYgKChzaWcyLmNoYXJBdCgwKSA9PSAnUScpIHx8IChzaWcyLmNoYXJBdCgwKSA9PSAnTCcpKSkgewotCQkJCQkvLyBHZXQgdGhlIHJlYWRhYmxlIG5hbWUgb2YgdGhlIHF1YWxpZmllZCBzaWduYXR1cmUKLQkJCQkJLy8gYW5kIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgb3RoZXIuCi0JCQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gbnVsbDsKLQkJCQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBudWxsOwotCQkJCQlpZiAoc2lnMS5pbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCQkJCXF1YWxpZmllZE5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMik7Ci0JCQkJCQlzaW1wbGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHNpZzEpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcXVhbGlmaWVkTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhzaWcxKTsKLQkJCQkJCXNpbXBsZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMik7Ci0JCQkJCX0KLQotCQkJCQkvLyBJZiB0aGUgc2ltcGxlIG5hbWUgcmVzb2x2ZXMgdG8gdGhlIHF1YWxpZmllZCBuYW1lLCB3ZSBoYXZlIGEgbWF0Y2guCi0JCQkJCXJlc3VsdCA9IHF1YWxpZmllZE5hbWUuZXF1YWxzKHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCByZXNvbHZlZE5hbWVDYWNoZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbmVlZHNUb1Jlc29sdmVOYW1lKElUeXBlIHR5cGUsIFN0cmluZyBzaW1wbGVOYW1lLCBib29sZWFuIGlzRm9yUmVmbGVjdGlvbikgewotCQlyZXR1cm4gISh0eXBlLmlzQmluYXJ5KCkgfHwgKCFpc0ZvclJlZmxlY3Rpb24gJiYgc2ltcGxlTmFtZS5pbmRleE9mKFBFUklPRCkgPiAtMSkgfHwgaXNQcmltaXRpdmVPclZvaWQoc2ltcGxlTmFtZSkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNpbXBsZSBuYW1lIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHR5cGUuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lIGNhbiBub3QgYmUgcmVzb2x2ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVNpbXBsZVR5cGVOYW1lKElUeXBlIHR5cGUsIFN0cmluZyBzaW1wbGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzaW1wbGUgbmFtZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSB0eXBlLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSBjYW4gbm90IGJlIHJlc29sdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVTaW1wbGVUeXBlTmFtZShJVHlwZSB0eXBlLCBTdHJpbmcgc2ltcGxlTmFtZSwgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCByZXNvbHZlZE5hbWVDYWNoZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2ltcGxlIG5hbWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgdHlwZS4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgY2FuIG5vdCBiZSByZXNvbHZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlU2ltcGxlVHlwZU5hbWUoSVR5cGUgdHlwZSwgU3RyaW5nIHNpbXBsZU5hbWUsIE1hcCByZXNvbHZlZE5hbWVDYWNoZSwgYm9vbGVhbiBpc0ZvclJlZmxlY3Rpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoIW5lZWRzVG9SZXNvbHZlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCBpc0ZvclJlZmxlY3Rpb24pKQotCQkJcmV0dXJuIHNpbXBsZU5hbWU7Ci0JCVN0cmluZyBrZXkgPSBudWxsLCBxdWFsaWZpZWROYW1lID0gbnVsbDsKLQkJaWYgKHJlc29sdmVkTmFtZUNhY2hlICE9IG51bGwpIHsKLQkJCWtleSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgKyBSRVNPTFZFRF9OQU1FICsgc2ltcGxlTmFtZTsKLQkJCXF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKSByZXNvbHZlZE5hbWVDYWNoZS5nZXQoa2V5KTsKLQkJfQotCQlpZiAocXVhbGlmaWVkTmFtZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmdbXVtdIHJlc3VsdCA9IGdldFR5cGVOYW1lSW5mbyh0eXBlLCBzaW1wbGVOYW1lLCBpc0ZvclJlZmxlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHBhY2tOYW1lID0gcmVzdWx0WzBdWzBdOwotCQkJCWlmIChwYWNrTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXF1YWxpZmllZE5hbWUgPSByZXN1bHRbMF1bMV07Ci0JCQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJCQlxdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgJyQnKTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQliLmFwcGVuZChyZXN1bHRbMF1bMF0pLmFwcGVuZChQRVJJT0QpOwotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSByZXN1bHRbMF1bMV07Ci0JCQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnJlcGxhY2UoJy4nLCAnJCcpOwotCQkJCQliLmFwcGVuZCh0eXBlTmFtZSk7Ci0JCQkJCXF1YWxpZmllZE5hbWUgPSBiLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlxdWFsaWZpZWROYW1lID0gc2ltcGxlTmFtZTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlZE5hbWVDYWNoZSAhPSBudWxsKQotCQkJCXJlc29sdmVkTmFtZUNhY2hlLnB1dChrZXksIHF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCXJldHVybiBxdWFsaWZpZWROYW1lOwotCX0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgYSBtYXRjaGluZyBtZXRob2QgYW5kIHNldHMgaXQgaW4gdGhlCi0JICogZGVzY3JpcHRvciBpZiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRob2Qgc2VhcmNoRm9yTWF0Y2hpbmdNZXRob2QoSVR5cGUgdHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcm1TaWdzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNlYXJjaEZvck1hdGNoaW5nTWV0aG9kKHR5cGUsIG1ldGhvZE5hbWUsIHBhcm1TaWdzLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogU2VhcmNoZXMgZm9yIGEgbWF0Y2hpbmcgbWV0aG9kIGFuZCBzZXRzIGl0IGluIHRoZQotCSAqIGRlc2NyaXB0b3IgaWYgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kIHNlYXJjaEZvck1hdGNoaW5nTWV0aG9kKElUeXBlIHR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJtU2lncywgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQkvLyBGaXJzdCBnZXQgYWxsIHRoZSBtZXRob2RzIGJ5IHRoaXMgbmFtZSBhbmQgd2l0aCB0aGlzIG1hbnkgcGFybXMuCi0JCUlNZXRob2RbXSBhbGxNZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKCk7Ci0JCUxpc3QgY2FuZGlkYXRlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgcGFybVNpZ3NMZW5ndGggPSAocGFybVNpZ3MgIT0gbnVsbCA/IHBhcm1TaWdzLmxlbmd0aCA6IDApOwotCQkJaWYgKChhbGxNZXRob2RzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSAmJiAoYWxsTWV0aG9kc1tpXS5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSA9PSBwYXJtU2lnc0xlbmd0aCkpCi0JCQkJY2FuZGlkYXRlTWV0aG9kcy5hZGQoYWxsTWV0aG9kc1tpXSk7Ci0JCX0KLQotCQkvLyBGb3IgZWFjaCBjYW5kaWRhdGUgY29uc2lkZXIgZWFjaCBwYXJtIGZvciBhIG1hdGNoLgotCQkvLyBUYWtlIHRoZSBmaXJzdCBvbmUgdGhhdCBtYXRjaGVzIG9uIGFsbCBwYXJtcy4KLQkJSU1ldGhvZCBuZXh0ID0gbnVsbDsKLQkJU3RyaW5nW10gbmV4dFBhcm1TaWdzID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJdGVyYXRvciBjYW5kaWRhdGVJdGVyID0gY2FuZGlkYXRlTWV0aG9kcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoIWZvdW5kICYmIChjYW5kaWRhdGVJdGVyLmhhc05leHQoKSkpIHsKLQkJCW5leHQgPSAoSU1ldGhvZCkgY2FuZGlkYXRlSXRlci5uZXh0KCk7Ci0JCQluZXh0UGFybVNpZ3MgPSBuZXh0LmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQlmb3VuZCA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsoZm91bmQgJiYgKGkgPCBuZXh0UGFybVNpZ3MubGVuZ3RoKSk7IGkrKykKLQkJCQlmb3VuZCAmPSBtYXRjaFR5cGVTaWduYXR1cmVzKHR5cGUsIHBhcm1TaWdzW2ldLCBuZXh0UGFybVNpZ3NbaV0sIHJlc29sdmVkTmFtZUNhY2hlKTsKLQkJfQotCQlyZXR1cm4gZm91bmQgPyBuZXh0IDogbnVsbDsKLQl9Ci0KLQkvKioKLQkqIFRoZSByZXR1cm5lZCBPYmplY3RbXSB3aWxsIGNvbnRhaW4gdHdvIGVudHJpZXMuICBUaGUKLQkqIGZpcnN0IHdpbGwgYmUgdGhlIElKYXZhRWxlbWVudCB0aGF0IHdhcyBmb3VuZCBhbmQgdGhlCi0JKiBzZWNvbmQgd2lsbCBiZSB0aGUgcXVhbGlmaWVkTmFtZSB1c2VkIHRvIGZpbmQgaXQuCi0JKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdFtdIGZpbmRBY3R1YWxKYXZhRWxlbWVudChTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMl07Ci0JCWlmIChhZGFwdG9yID09IG51bGwpCi0JCQlyZXN1bHRbMV0gPSBxdWFsaWZpZWROYW1lOwotCQllbHNlIAotCQkJLy9FbnN1cmUgdGhlIG5hbWUgaXMgcXVhbGlmaWVkCi0JCQlyZXN1bHRbMV0gPSBnZXRSZXNvbHZlZFR5cGVOYW1lKHF1YWxpZmllZE5hbWUsIGFkYXB0b3IuZ2V0VHlwZSgpLCBhZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSk7Ci0JCQotCQlyZXN1bHRbMF0gPSBmaW5kSmF2YUVsZW1lbnQoKFN0cmluZykgcmVzdWx0WzFdLCBqYXZhUHJvamVjdCwgYWRhcHRvcik7Ci0JCWlmIChyZXN1bHRbMF0gPT0gbnVsbCkKLQkJCWZpbmRJbm5lckphdmFFbGVtZW50KHJlc3VsdCwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSByZXR1cm5lZCBPYmplY3RbXSB3aWxsIGNvbnRhaW4gdHdvIGVudHJpZXMuICBUaGUKLQkgKiBmaXJzdCB3aWxsIGJlIHRoZSBJSmF2YUVsZW1lbnQgdGhhdCB3YXMgZm91bmQgYW5kIHRoZQotCSAqIHNlY29uZCB3aWxsIGJlIHRoZSBxdWFsaWZpZWROYW1lIHVzZWQgdG8gZmluZCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmluZElubmVySmF2YUVsZW1lbnQoT2JqZWN0W10gaW5mbywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCVN0cmluZyBxdWFsaWZpZWROYW1lLCBpbm5lck5hbWU7Ci0JCXF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKSBpbmZvWzFdOwotCQlpbnQgaW5kZXggPSBxdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJaW5uZXJOYW1lID0gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJaW5uZXJOYW1lICs9ICIkIjsgLy8kTk9OLU5MUy0xJAotCQkJaW5uZXJOYW1lICs9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgcXVhbGlmaWVkTmFtZS5sZW5ndGgoKSk7Ci0JCQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCQkJLy9FbnN1cmUgdGhlIG5hbWUgaXMgcXVhbGlmaWVkIHdoaWNoIGl0IG1heSBub3QgYmUgaWYgYW4gaW5uZXIgY2xhc3MKLQkJCQlpbm5lck5hbWUgPSBnZXRSZXNvbHZlZFR5cGVOYW1lKGlubmVyTmFtZSwgYWRhcHRvci5nZXRUeXBlKCksIGFkYXB0b3IuZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpKTsKLQkJCX0KLQkJCWluZm9bMV0gPSBpbm5lck5hbWU7Ci0JCQlpbmZvWzBdID0gZmluZEphdmFFbGVtZW50KGlubmVyTmFtZSwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQkJaWYgKGluZm9bMF0gPT0gbnVsbCkKLQkJCQlmaW5kSW5uZXJKYXZhRWxlbWVudChpbmZvLCBqYXZhUHJvamVjdCwgYWRhcHRvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElKYXZhRWxlbWVudCBmaW5kSmF2YUVsZW1lbnQoU3RyaW5nIHF1YWxpZmllZE5hbWUsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSkRPTUFkYXB0b3IgYWRhcHRvcikgewotCQl0cnkgewotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YVByb2plY3QuZmluZEVsZW1lbnQoZ2V0UGF0aEZyb21RdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSVBhdGggZ2V0UGF0aEZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogCi0JKiBSZXNvbHZlIGEgdHlwZSBuYW1lIGluIHRoZSBjb250ZXh0IG9mIGEgVHlwZS4KLQkqIChCb3Jyb3dlZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5jb2RlbWFuaXB1bGF0aW9uLlN0dWJVdGlsaXR5LmdldFJlc29sdmVkVHlwZU5hbWUoKSkKLQkqIFRoZSBpbnB1dCBpcyBhIHNpbXBsZSBvciBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JKiBUaGUgb3V0cHV0IHdpbGwgYmUgYSBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgTWFwIHR5cGVDYWNoZSkgewotCQlTdHJpbmcgbmFtZSA9IHR5cGVOYW1lOwotCQl0cnkgewotCQkJbmFtZSA9IEpET01TZWFyY2hIZWxwZXIucmVzb2x2ZVNpbXBsZVR5cGVOYW1lKGRlY2xhcmluZ1R5cGUsIHR5cGVOYW1lLCB0eXBlQ2FjaGUsIHRydWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgYm9vbGVhbiB1c2VBZHZhbmNlZEZvcklubmVycywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YUVsZW1lbnQgZm91bmQgPSBudWxsOwotCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IHF1YWxpZmllZE5hbWU7Ci0JCQlpZiAodXNlQWR2YW5jZWRGb3JJbm5lcnMpIHsKLQkJCQlPYmplY3RbXSByZXN1bHQgPSBmaW5kQWN0dWFsSmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQkJCWZvdW5kID0gKElKYXZhRWxlbWVudCkgcmVzdWx0WzBdOwotCQkJCXJlc29sdmVkTmFtZSA9IChTdHJpbmcpIHJlc3VsdFsxXTsKLQkJCX0gZWxzZQotCQkJCWZvdW5kID0gZmluZEphdmFFbGVtZW50KHF1YWxpZmllZE5hbWUsIGphdmFQcm9qZWN0LCBhZGFwdG9yKTsKLQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCWlmIChmb3VuZCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCi0JCQkJCXJldHVybiAoKElDbGFzc0ZpbGUpIGZvdW5kKS5nZXRUeXBlKCk7Ci0JCQkJZWxzZSBpZiAoZm91bmQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJCUlDb21waWxhdGlvblVuaXQgZm91bmRDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBmb3VuZDsKLQkJCQkJLy8gc3RyaXAgdGhlICIuamF2YSIsIGxpZnRlZCBmcm9tIENvbXBpbGF0aW9uVW5pdC5nZXRNYWluVHlwZU5hbWUoKQotCQkJCQlTdHJpbmcgY3VNYWluVHlwZU5hbWUgPSBmb3VuZENVLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJCWN1TWFpblR5cGVOYW1lID0gY3VNYWluVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGN1TWFpblR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQkJCXJldHVybiBmb3VuZENVLmdldFR5cGUoY3VNYWluVHlwZU5hbWUpOwotCQkJCX0gZWxzZSBpZiAoZm91bmQgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJCQlpbnQgaW5kZXggPSByZXNvbHZlZE5hbWUubGFzdEluZGV4T2YoJyQnKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaW5kZXggPiAtMSkKLQkJCQkJCXJldHVybiAoKElUeXBlKSBmb3VuZCkuZ2V0VHlwZShyZXNvbHZlZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgcmVzb2x2ZWROYW1lLmxlbmd0aCgpKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiAoSVR5cGUpIGZvdW5kOwotCQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQl0cnkgewotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUocGFja2FnZU5hbWUsIHF1YWxpZmllZFR5cGVOYW1lLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcGFja2FnZU5hbWUgKyAiLiIgKyBxdWFsaWZpZWRUeXBlTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCA9ICJFcnJvciBsb29raW5nIHVwIHR5cGU6ICIKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUNsYXNzSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUNsYXNzSkRPTUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5MzAxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFDbGFzc0pET01BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFDbGFzc0pET01BZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIyICQgICREYXRlOiAyMDA1LzEwLzE4IDE0OjU4OjE4ICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIEphdmFDbGFzc0pET01BZGFwdG9yIGV4dGVuZHMgSkRPTUFkYXB0b3IgaW1wbGVtZW50cyBJSmF2YUNsYXNzQWRhcHRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9UWVBFX05BTUUgPSAiamF2YS5sYW5nLk9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogU3RlcCBpZHMgdXNlZCBmb3IgVGltZXJUZXN0cyBvZiBwZXJmb3JtYW5jZSB0ZXN0aW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkxFQ1RfQ0xBU1MgPSAiUmVmbGVjdCBKRE9NIENsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkxFQ1RfTUVUSE9EUyA9ICJSZWZsZWN0IGFsbCBKRE9NIG1ldGhvZHMgZm9yIGEgY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9GSUVMRFMgPSAiUmVmbGVjdCBhbGwgSkRPTSBmaWVsZHMgZm9yIGEgY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJvdGVjdGVkIElUeXBlIHNvdXJjZVR5cGUgPSBudWxsOwotCXByb3RlY3RlZCBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgTWFwIHR5cGVSZXNvbHV0aW9uQ2FjaGUgPSBuZXcgSGFzaE1hcCgyNSk7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc1JlZmxlY3RlZEZpZWxkcywgaXNSZWZsZWN0aW5nRmllbGRzOwotCXByaXZhdGUgYm9vbGVhbiBoYXNSZWZsZWN0ZWRNZXRob2RzLCBpc1JlZmxlY3RpbmdNZXRob2RzOwotCQotCXB1YmxpYyBKYXZhQ2xhc3NKRE9NQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIElKYXZhUHJvamVjdCB3b3JraW5nUHJvamVjdCwgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBpbkZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCB3b3JraW5nUHJvamVjdCk7Ci0JCXNldEFkYXB0ZXJGYWN0b3J5KGluRmFjdG9yeSk7Ci0JfQotCQotCXByaXZhdGUgTWFwIGV4aXN0aW5nRmllbGRzID0gbmV3IEhhc2hNYXAoKTsgCi0JLyoKLQkgKiBhZGRGaWVsZHMgLSByZWZsZWN0IG91ciBmaWVsZHMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaWVsZHMoKSB7Ci0KLQkJLy8gVGhlIGFsZ29yaXRobSB3ZSB3aWxsIHVzZSBpczoKLQkJLy8gMSkgUGFzcyB0aHJvdWdoIHRoZSBJRmllbGQncyBvZiB0aGlzIGNsYXNzCi0JCS8vICAgIGEpIElmIGl0IGlzIGluIGV4aXN0aW5nRmllbGRzLCB0aGVuIGFkZCB0byBuZXdFeGlzdGluZyB0aGUgZW50cnkgZnJvbQotCQkvLyAgICAgICBvbGRFeGlzdGluZyAoZGVsZXRpbmcgZnJvbSBvbGRFeGlzdGluZyBhdCB0aGUgc2FtZSB0aW1lKSwgYW5kIGZsdXNoIHRoZSBmaWVsZC4gVGhpcyBpcyBzbyBuZXh0IHdlIHJlLWdldCBhbnkgY2hhbmdlZCBwYXJ0cyBvZiBpdC4KLQkJLy8gICAgYikgZWxzZSBub3QgZXhpc3RpbmcsIHRoZW4gY3JlYXRlIG5ldyBmaWVsZCBhbmQgYWRkIHRvIHRoZSBuZXcgZmllbGRzIGxpc3QuCi0JCS8vIDIpIFJlbW92ZSBmcm9tIHRoZSBmaWVsZHMgbGlzdCBhbnkgc3RpbGwgbGVmdCBpbiBvbGRFeGlzdGluZy4gVGhlc2UgYXJlIG9uZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCi0JCS8vIDMpIEFkZCBhbGwgb2YgdGhlIG5ld3Mgb25lcyB0byB0aGUgZmllbGRzLgotCQkvLyAgICAgICAKLQkJSUZpZWxkW10gZmllbGRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpZWxkcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRGaWVsZHMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQlyZXR1cm4gZmFsc2U7CQotCQl9Ci0JCVhNSVJlc291cmNlIHJlc291cmNlID0gKFhNSVJlc291cmNlKSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5lUmVzb3VyY2UoKTsJCQotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCUphdmFGaWVsZEpET01BZGFwdG9yIGFkYXB0ZXIgPSBudWxsOwotCQlNYXAgbmV3RXhpc3RpbmcgPSBuZXcgSGFzaE1hcChmaWVsZHMubGVuZ3RoKTsKLQkJTGlzdCBuZXdGaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmllbGQgaWZpZWxkID0gZmllbGRzW2ldOwotCQkJZmllbGQgPSAoRmllbGQpIGV4aXN0aW5nRmllbGRzLnJlbW92ZShpZmllbGQpOwkvLyBHZXQgdGhlIGV4aXN0aW5nIGZpZWxkICh3aGljaCBpcyB0aGUgdmFsdWUpIGZyb20gdGhlIGNvbGxlY3Rpb24ga2V5ZWQgYnkgSUZpZWxkLgotCQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCQkvLyBJdCBpcyBhbiBleGlzdGluZyBtZXRob2QuIFNvIGp1c3QgcHV0IG92ZXIgdG8gbmV3RXhpc3RpbmcuIFRoZW4gZmx1c2ggaXQuCi0JCQkJbmV3RXhpc3RpbmcucHV0KGlmaWVsZCwgZmllbGQpOwotCQkJCS8vIFNpbmNlIHRoaXMgaXMgYSBuZXcgbWV0aG9kLCBpdCBpcyBub3QgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgc28gd2UgbmVlZCB0byBleHBsaWNpdGx5IGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJCQlhZGFwdGVyID0gKEphdmFGaWVsZEpET01BZGFwdG9yKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGZpZWxkLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQkJYWRhcHRlciA9IChKYXZhRmllbGRKRE9NQWRhcHRvcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdE5ldyhmaWVsZCwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJCWVsc2UKLQkJCQkJYWRhcHRlci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24odHJ1ZSk7Ci0JCQkJYWRhcHRlci5zZXRTb3VyY2VGaWVsZChpZmllbGQpOwkvLyBHaXZlIGl0IHRoaXMgbmV3IElGaWVsZAotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBpcyBhIG5ldyBtZXRob2QuIENyZWF0ZSB0aGUgbmV3IG1ldGhvZCwgYWRkIHRvIG5ld0V4aXN0aW5nLCBhbmQgYWRkIHRvIG5ld01ldGhvZHMgbGlzdC4KLQkJCQlmaWVsZCA9IGNyZWF0ZUphdmFGaWVsZChpZmllbGQsIHJlc291cmNlKTsKLQkJCQluZXdFeGlzdGluZy5wdXQoaWZpZWxkLCBmaWVsZCk7CQkJCQotCQkJCW5ld0ZpZWxkcy5hZGQoZmllbGQpOwotCQkJCWFkYXB0ZXIgPSAoSmF2YUZpZWxkSkRPTUFkYXB0b3IpIGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHROZXcoZmllbGQsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLnNldFNvdXJjZUZpZWxkKGlmaWVsZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUJhc2ljRUxpc3QgZmllbGRzTGlzdCA9IChCYXNpY0VMaXN0KSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRGaWVsZHNHZW4oKTsKLQkJaWYgKCFleGlzdGluZ0ZpZWxkcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhbnkgc3RpbGwgbGVmdCBpbiBvbGQgZXhpc3RpbmcgYXJlIGRlbGV0ZWQuIFNvIHdlIG1ha2UgdGhlbSBwcm94aWVzIGFuZCB0aGVuIHJlbW92ZSB0aGVtIGZyb20gZmllbGRzIGxpc3QuCQkJCi0JCQlVUkkgYmFzZVVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJQ29sbGVjdGlvbiB0b0RlbGV0ZSA9IGV4aXN0aW5nRmllbGRzLnZhbHVlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSB0b0RlbGV0ZS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCUludGVybmFsRU9iamVjdCBtID0gKEludGVybmFsRU9iamVjdCkgaXRyLm5leHQoKTsKLQkJCQlTdHJpbmcgaWQgPSByZXNvdXJjZS5nZXRJRChtKTsKLQkJCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQkJbS5lU2V0UHJveHlVUkkoYmFzZVVSSS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQkJfQotCQkJZmllbGRzTGlzdC5yZW1vdmVBbGwodG9EZWxldGUpOwotCQl9Ci0JCQotCQlpZiAoIW5ld0ZpZWxkcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhZGQgaW4gdGhlIG5ld3Mgb25lcwotCQkJZmllbGRzTGlzdC5hZGRBbGxVbmlxdWUobmV3RmllbGRzKTsKLQkJfQotCQkKLQkJLy8gRmluYWxseSBzZXQgY3VycmVudCBleGlzdGluZyB0byB0aGUgbmV3IG1hcCB3ZSBjcmVhdGVkLgotCQlleGlzdGluZ0ZpZWxkcyA9IG5ld0V4aXN0aW5nOwotCQlyZXR1cm4gdHJ1ZTsJCQkKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZXhpc3RpbmdNZXRob2RzID0gbmV3IEhhc2hNYXAoKTsgCi0JLyoKLQkgKiBhZGRNZXRob2RzIC0gcmVmbGVjdCBvdXIgbWV0aG9kcy4gTWVyZ2UgaW4gd2l0aCB0aGUgcHJldmlvdXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkTWV0aG9kcygpIHsKLQkJLy8gVGhlIGFsZ29yaXRobSB3ZSB3aWxsIHVzZSBpczoKLQkJLy8gMSkgUGFzcyB0aHJvdWdoIHRoZSBJTWV0aG9kJ3Mgb2YgdGhpcyBjbGFzcwotCQkvLyAgICBhKSBJZiBpdCBpcyBpbiBleGlzdGluZ01ldGhvZHMsIHRoZW4gYWRkIHRvIG5ld0V4aXN0aW5nIHRoZSBlbnRyeSBmcm9tCi0JCS8vICAgICAgIG9sZEV4aXN0aW5nIChkZWxldGluZyBmcm9tIG9sZEV4aXN0aW5nIGF0IHRoZSBzYW1lIHRpbWUpLCBhbmQgZmx1c2ggdGhlIG1ldGhvZC4gVGhpcyBpcyBzbyBuZXh0IHdlIHJlLWdldCBhbnkgY2hhbmdlZCBwYXJ0cyBvZiBpdC4KLQkJLy8gICAgYikgZWxzZSBub3QgZXhpc3RpbmcsIHRoZW4gY3JlYXRlIG5ldyBtZXRob2QgYW5kIGFkZCB0byB0aGUgbmV3IG1ldGhvZHMgbGlzdC4KLQkJLy8gMikgUmVtb3ZlIGZyb20gdGhlIG1ldGhvZHMgbGlzdCBhbnkgc3RpbGwgbGVmdCBpbiBvbGRFeGlzdGluZy4gVGhlc2UgYXJlIG9uZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCi0JCS8vIDMpIEFkZCBhbGwgb2YgdGhlIG5ld3Mgb25lcyB0byB0aGUgbWV0aG9kcy4KLQkJLy8gICAgICAgCi0JCUlNZXRob2RbXSBtZXRob2RzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1ldGhvZHMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0TWV0aG9kcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCXJldHVybiBmYWxzZTsJCi0JCX0KLQkJWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlKYXZhTWV0aG9kSkRPTUFkYXB0b3IgYWRhcHRlciA9IG51bGw7Ci0JCU1hcCBuZXdFeGlzdGluZyA9IG5ldyBIYXNoTWFwKG1ldGhvZHMubGVuZ3RoKTsKLQkJTGlzdCBuZXdNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCUlNZXRob2QgaW0gPSBtZXRob2RzW2ldOwotCQkJbWV0aG9kID0gKE1ldGhvZCkgZXhpc3RpbmdNZXRob2RzLnJlbW92ZShpbSk7CS8vIEdldCB0aGUgZXhpc3RpbmcgbWV0aG9kICh3aGljaCBpcyB0aGUgdmFsdWUpIGZyb20gdGhlIGNvbGxlY3Rpb24ga2V5ZWQgYnkgSU1ldGhvZC4KLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCS8vIEl0IGlzIGFuIGV4aXN0aW5nIG1ldGhvZC4gU28ganVzdCBwdXQgb3ZlciB0byBuZXdFeGlzdGluZy4gVGhlbiBmbHVzaCBpdC4KLQkJCQluZXdFeGlzdGluZy5wdXQoaW0sIG1ldGhvZCk7Ci0JCQkJYWRhcHRlciA9IChKYXZhTWV0aG9kSkRPTUFkYXB0b3IpIHJldHJpZXZlQWRhcHRvckZyb20obWV0aG9kKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKHRydWUpOwotCQkJCQlhZGFwdGVyLnNldFNvdXJjZU1ldGhvZChpbSk7CS8vIEdpdmUgaXQgdGhpcyBuZXcgSU1ldGhvZAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSXQgaXMgYSBuZXcgbWV0aG9kLiBDcmVhdGUgdGhlIG5ldyBtZXRob2QsIGFkZCB0byBuZXdFeGlzdGluZywgYW5kIGFkZCB0byBuZXdNZXRob2RzIGxpc3QuCi0JCQkJbWV0aG9kID0gY3JlYXRlSmF2YU1ldGhvZChpbSwgcmVzb3VyY2UpOwotCQkJCW5ld0V4aXN0aW5nLnB1dChpbSwgbWV0aG9kKTsJCQkJCi0JCQkJbmV3TWV0aG9kcy5hZGQobWV0aG9kKTsKLQkJCQkvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IG1ldGhvZCwgaXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHNvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBjcmVhdGUgdGhlIGFkYXB0ZXIuCi0JCQkJYWRhcHRlciA9IChKYXZhTWV0aG9kSkRPTUFkYXB0b3IpIGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHROZXcobWV0aG9kLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJYWRhcHRlci5zZXRTb3VyY2VNZXRob2QobWV0aG9kc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUJhc2ljRUxpc3QgbWV0aG9kc0xpc3QgPSAoQmFzaWNFTGlzdCkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0TWV0aG9kc0dlbigpOwotCQlpZiAoIWV4aXN0aW5nTWV0aG9kcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhbnkgc3RpbGwgbGVmdCBpbiBvbGQgZXhpc3RpbmcgYXJlIGRlbGV0ZWQuIFNvIHdlIG1ha2UgdGhlbSBwcm94aWVzIGFuZCB0aGVuIHJlbW92ZSB0aGVtIGZyb20gbWV0aG9kcyBsaXN0LgotCQkJVVJJIGJhc2VVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCUNvbGxlY3Rpb24gdG9EZWxldGUgPSBleGlzdGluZ01ldGhvZHMudmFsdWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHRvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG0gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdHIubmV4dCgpOwotCQkJCVN0cmluZyBpZCA9IHJlc291cmNlLmdldElEKG0pOwotCQkJCWlmIChpZCAhPSBudWxsKQotCQkJCQltLmVTZXRQcm94eVVSSShiYXNlVVJJLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCQl9Ci0JCQltZXRob2RzTGlzdC5yZW1vdmVBbGwodG9EZWxldGUpOwotCQl9Ci0JCQotCQlpZiAoIW5ld01ldGhvZHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBOb3cgYWRkIGluIHRoZSBuZXdzIG9uZXMKLQkJCW1ldGhvZHNMaXN0LmFkZEFsbFVuaXF1ZShuZXdNZXRob2RzKTsKLQkJfQotCQkKLQkJLy8gRmluYWxseSBzZXQgY3VycmVudCBleGlzdGluZyB0byB0aGUgbmV3IG1hcCB3ZSBjcmVhdGVkLgotCQlleGlzdGluZ01ldGhvZHMgPSBuZXdFeGlzdGluZzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIENsZWFyIHNvdXJjZSBUeXBlIDsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclNvdXJjZSgpIHsKLQkJc291cmNlVHlwZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlZmxlY3RlZCBmaWVsZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaEZpZWxkcygpIHsKLQkJLy8gRmlyc3QgdHVybiB0aGVtIGFsbCBpbnRvIHByb3hpZXMgc28gdGhhdCBhbnkgaG9sZGVycyB3aWxsIHJlLXJlc29sdmUgdG8gbWF5YmUgdGhlIG5ldyBvbmUgaWYgY2xhc3MgY29tZXMgYmFjay4KLQkJZXhpc3RpbmdGaWVsZHMuY2xlYXIoKTsKLQkJWE1JUmVzb3VyY2UgcmVzID0gKFhNSVJlc291cmNlKSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5lUmVzb3VyY2UoKTsKLQkJVVJJIGJhc2VVUkkgPSByZXMuZ2V0VVJJKCk7Ci0JCUxpc3QgZmllbGRzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RmllbGRzR2VuKCk7Ci0JCWludCBtc2l6ZSA9IGZpZWxkcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbXNpemU7IGkrKykgewotCQkJSW50ZXJuYWxFT2JqZWN0IGYgPSAoSW50ZXJuYWxFT2JqZWN0KSBmaWVsZHMuZ2V0KGkpOwotCQkJU3RyaW5nIGlkID0gcmVzLmdldElEKGYpOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJZi5lU2V0UHJveHlVUkkoYmFzZVVSSS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQl9Ci0JCWZpZWxkcy5jbGVhcigpOwkvLyBOb3cgd2UgY2FuIGNsZWFyIGl0LgotCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCS8qKgotCSAqIENsZWFyIHRoZSBpbXBsZW1lbnRzIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hJbXBsZW1lbnRzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIG1ldGhvZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaE1ldGhvZHMoKSB7Ci0JCS8vIEZpcnN0IHR1cm4gdGhlbSBhbGwgaW50byBwcm94aWVzIHNvIHRoYXQgYW55IGhvbGRlcnMgd2lsbCByZS1yZXNvbHZlIHRvIG1heWJlIHRoZSBuZXcgb25lIGlmIGNsYXNzIGNvbWVzIGJhY2suCi0JCWV4aXN0aW5nTWV0aG9kcy5jbGVhcigpOwotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwotCQlVUkkgYmFzZVVSSSA9IHJlcy5nZXRVUkkoKTsKLQkJTGlzdCBtZXRob2RzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0TWV0aG9kc0dlbigpOwotCQlpbnQgbXNpemUgPSBtZXRob2RzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtc2l6ZTsgaSsrKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgbSA9IChJbnRlcm5hbEVPYmplY3QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJU3RyaW5nIGlkID0gcmVzLmdldElEKG0pOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJbS5lU2V0UHJveHlVUkkoYmFzZVVSSS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQl9Ci0JCW1ldGhvZHMuY2xlYXIoKTsJLy8gTm93IHdlIGNhbiBjbGVhciBpdC4KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoTW9kaWZpZXJzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRBYnN0cmFjdChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRGaW5hbChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRQdWJsaWMoZmFsc2UpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5VTkRFRklORURfTElURVJBTCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaElubmVyQ2xhc3NlcygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIENsZWFyIHRoZSByZWZsZWN0ZWQgdmFsdWVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlpZiAoY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkKLQkJCXNldFNvdXJjZVR5cGUobnVsbCk7Ci0JCXR5cGVSZXNvbHV0aW9uQ2FjaGUuY2xlYXIoKTsKLQkJZmx1c2hNb2RpZmllcnMoKTsKLQkJZmx1c2hTdXBlcigpOwotCQlmbHVzaEltcGxlbWVudHMoKTsKLQkJaWYgKGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJCS8vIERvbid0IGZsdXNoIHRoZXNlIHlldC4gV2Ugd2lsbCB0cnkgdG8gcmV1c2UgdGhlbSBvbiB0aGUgbmV4dCByZWZsdXNoLiBJZiBjbGVhciBtb2RlbCB0b28sIHRoZW4gZmx1c2ggdGhlbS4gVGhpcyB1c3VhbGx5IG1lYW5zIGNsYXNzIGhhcyBiZWVuIGRlbGV0ZWQsIHNvIHdoeSBrZWVwIHRoZW0gYXJvdW5kLgotCQkJZmx1c2hNZXRob2RzKCk7Ci0JCQlmbHVzaEZpZWxkcygpOwotCQl9Ci0JCS8vIEV2ZW4gaWYgd2UgZGlkbid0IGZsdXNoIHRoZSBmaWVsZHMvbWV0aG9kcywgd2UgZG8gbmVlZCB0byBtYXJrIGFzIG5vdCByZWZsZWN0ZWQgc28gb24gbmV4dCB1c2FnZSB3ZSB3aWxsIG1lcmdlIGluIHRoZSBjaGFuZ2VzLgotCQloYXNSZWZsZWN0ZWRNZXRob2RzID0gZmFsc2U7Ci0JCWhhc1JlZmxlY3RlZEZpZWxkcyA9IGZhbHNlOwotCQkKLQkJZmx1c2hJbm5lckNsYXNzZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLnNldFJlZmxlY3RlZChmYWxzZSk7Ci0JCXN1cGVyLnBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3VwZXJ0eXBlIHRvIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hTdXBlcigpIHsKLQkJTGlzdCB0YXJnZXRTdXBlcnMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5wcmltR2V0RVN1cGVyVHlwZXMoKTsKLQkJdGFyZ2V0U3VwZXJzLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcm90ZWN0ZWQgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkvKioKLQkgKiBnZXRCaW5hcnlUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3MgZmlsZQotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRCaW5hcnlUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRCaW5hcnlUeXBlKCgoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0YXJnZXQgdHlwZWQgdG8gYSBKYXZhQ2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzc0ltcGwgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkgewotCQlyZXR1cm4gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlVHlwZSAhPSBudWxsOwotICAgIH0KLQkvKioKLQkgKiBnZXRTb3VyY2VUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3Mgb3Igc291cmNlIGZpbGUKLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0U291cmNlVHlwZSgpIHsKLQkJaWYgKHNvdXJjZVR5cGUgPT0gbnVsbCkgewotCQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JCQlzb3VyY2VUeXBlID0gSkRPTVNlYXJjaEhlbHBlci5maW5kVHlwZShqYXZhQ2xhc3MuZ2V0SmF2YVBhY2thZ2UoKS5nZXROYW1lKCksIGphdmFDbGFzcy5wcmltR2V0TmFtZSgpLCBnZXRTb3VyY2VQcm9qZWN0KCkpOwotCQl9Ci0JCXJldHVybiBzb3VyY2VUeXBlOwotCX0KLQkvKioKLQkgKiBnZXRTb3VyY2VUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3Mgb3Igc291cmNlIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKTsKLQl9Ci0JcHJvdGVjdGVkIE1hcCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkgewotCQlyZXR1cm4gdHlwZVJlc29sdXRpb25DYWNoZTsKLQl9Ci0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2VUeXBlIGlzIG51bGwgb3IgaWYKLQkgKiBpdCBpcyBhIGJpbmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU291cmNlVHlwZUZyb21CaW5hcnkoKSB7Ci0JCWlmIChnZXRTb3VyY2VUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy9tdXN0IGJlIG5ldz8KLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKS5pc0JpbmFyeSgpOwotCX0KLQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyByZWZsZWN0SmF2YUNsYXNzKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCUlUeXBlIHR5cGUgPSBKRE9NU2VhcmNoSGVscGVyLmZpbmRUeXBlKHF1YWxpZmllZE5hbWUsIHRydWUsIGdldFNvdXJjZVByb2plY3QoKSwgdGhpcyk7Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlyZXR1cm4gcmVmbGVjdEphdmFDbGFzcyh0eXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGFzc1JlZihxdWFsaWZpZWROYW1lKTsKLQl9Ci0JcHJvdGVjdGVkIEphdmFDbGFzcyByZWZsZWN0SmF2YUNsYXNzKElUeXBlIGFUeXBlKSB7Ci0JCWlmIChhVHlwZSAhPSBudWxsKSB7Ci0JCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGFUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCAoRU9iamVjdCkgZ2V0VGFyZ2V0KCkpOwotCQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJSmF2YUNsYXNzSkRPTUFkYXB0b3IgYWRhcHRvciA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIoamF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKGFkYXB0b3IgIT0gbnVsbCkKLQkJCQkJYWRhcHRvci5zZXRTb3VyY2VUeXBlKGFUeXBlKTsKLQkJCX0KLQkJCXJldHVybiBqYXZhQ2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuCi0JICogb24gZW50cnk6IG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LgotCSAqIFJldHVybiB0cnVlIGFsd2F5cyBhbmQgdGhlIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIHdpbGwgZmx1c2ggd2l0aCB0aGUgdHlwZSBjYW4KLQkgKiBiZSBmb3VuZCBhZ2Fpbi4gIEluIGhlYWRsZXNzIG1vZGUsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIHR5cGUgaXMgZm91bmQuICBUaGlzIGlzCi0JICogbmVlZGVkIGJlY2F1Y2UgbW9zdCBoZWFkbGVzcyB0YXNrcyBhcmUgZG9uZSB1bmRlciBvbmUgb3BlcmF0aW9uIGFuZCB0aGUgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIKLQkgKiBtYXkgbm90IGhhdmUgYSBjaGFuY2UgdG8gZmx1c2ggYSBiYWQgcmVmbGVjdGlvbiBiZWZvcmUgdGhlIHJlYWwgdHlwZSBuZWVkcyB0byBiZSBmb3VuZCBhbmQgY2FuIGJlIGZvdW5kLgotCSAqIEphdmFDbGFzcyBhZGFwdG9yOgotCSAqIC0gc2V0IG1vZGlmaWVycwotCSAqIC0gc2V0IG5hbWUKLQkgKiAtIHNldCByZWZlcmVuY2UgdG8gc3VwZXIKLQkgKiAtIGNyZWF0ZSBtZXRob2RzCi0JICogLSBjcmVhdGUgZmllbGRzCi0JICogLSBhZGQgaW1wb3J0cwotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCXN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQkJYm9vbGVhbiBpc0hlYWRsZXNzID0gVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5nZXRDdXJyZW50Q29udGV4dCgpID09IFVJQ29udGV4dERldGVybWluYXRpb24uSEVBRExFU1NfQ09OVEVYVDsKLQkJaWYgKGNhblJlZmxlY3QoKSkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChSRUZMRUNUX0NMQVNTKTsKLQkJCXRyeSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldFNvdXJjZVR5cGUoKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQlib29sZWFuIGlzV0MgPSBjdSAhPSBudWxsID8gY3UuaXNXb3JraW5nQ29weSgpIDogZmFsc2U7Ci0JCQkJSVJlc291cmNlIHJlcyA9IGlzV0MgPyBnZXRTb3VyY2VUeXBlKCkuZ2V0UmVzb3VyY2UoKSA6IG51bGw7Ci0JCQkJLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBwaHlzaWNhbCBjbGFzc2VzLiBJZiBzdGlsbCBqdXN0IGluIHdvcmtpbmcgY29weSBhbmQgbm90IHlldCBwdXQgb3V0IHRvCi0JCQkJLy8gZGlzaywgd2UgZG9uJ3Qgc2hvdWxkIHRyZWF0IGFzIG5vdCBleGlzdC4gQW55dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIGV4aXN0aW5nIGJlY2F1c2Ugd2UgZ290IHBhc3QKLQkJCQkvLyBnZXRTb3VyY2VUeXBlLmV4aXN0cy4gVGhpcyB3aWxsIHJldHVybiB0aGUgdHJ1dGggZm9yIG5vbi13Yy4gQnV0IGZvciB3YyB0eXBlcyBpdCB3aWxsIHJldHVybiB0cnVlLAotCQkJCS8vIGV2ZW4gdGhvdWdoIG5vdCBwaHlzaWNhbGx5IG9uIGRpc2sgKHN1Y2ggYXMganVzdCBjcmVhdGluZyBpdCBhbmQgaGFkbid0IHNhdmVkIGl0IHlldCkuIFNvIGZvciB3YyB0eXBlcwotCQkJCS8vIHdlIG5lZWQgdG8gdGVzdCB0aGUgYWN0dWFsIHJlc291cmNlLgotCQkJCS8vIFRlc3QgaXMgT0sgaWYgbm90IHdjLCBvciBpZiB3YywgdGhlbiB0aGVyZSBpcyBhIHJlcy4gYW5kIGl0IGlzIGFjY2Vzc2libGUuCi0JCQkJaWYgKCFpc1dDIHx8IChyZXMgIT0gbnVsbCAmJiByZXMuaXNBY2Nlc3NpYmxlKCkpKSB7Ci0JCQkJCXNldE1vZGlmaWVycygpOwotCQkJCQlzZXROYW1pbmcoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNldFN1cGVyKCk7Ci0JCQkJCX0gY2F0Y2ggKEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gZSkgewotCQkJCQkJSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXNldEltcGxlbWVudHMoKTsKLQkJCQkJcmVmbGVjdElubmVyQ2xhc3NlcygpOwotCQkJCQkvL2FkZEltcG9ydHMoKTsKLQkJCQkJaWYgKGlzSGVhZGxlc3MpIHsKLQkJCQkJCXJlZ2lzdGVyV2l0aEZhY3RvcnkoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9DTEFTUyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzSGVhZGxlc3MpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgewotCQkJcmVnaXN0ZXJXaXRoRmFjdG9yeSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5SZWZsZWN0KCkgewotCQlyZXR1cm4gaXNSZXNvdXJjZUxvYWRlZCgpICYmIGdldFNvdXJjZVByb2plY3QoKSAhPSBudWxsICYmIGdldFNvdXJjZVR5cGUoKSAhPSBudWxsICYmIGdldFNvdXJjZVR5cGUoKS5leGlzdHMoKTsKLQl9Ci0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlZmxlY3RGaWVsZHNJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpICYmIGNhblJlZmxlY3QoKSkgewotCQkJaWYgKCFoYXNSZWZsZWN0ZWRGaWVsZHMgJiYgIWlzUmVmbGVjdGluZ0ZpZWxkcykgewotCQkJCWlzUmVmbGVjdGluZ0ZpZWxkcyA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChSRUZMRUNUX0ZJRUxEUyk7Ci0JCQkJCWFkZEZpZWxkcygpOwotCQkJCQloYXNSZWZsZWN0ZWRGaWVsZHMgPSB0cnVlOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWhhc1JlZmxlY3RlZEZpZWxkcyA9IGZhbHNlOwotCQkJCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJCQlsb2dnZXIubG9nKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZhaWxlZF9yZWZsZWN0aW5nX3ZhbHVlc19FUlJPUl8iKSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQgPSAiRmFpbGVkIHJlZmxlY3RpbmcgdmFsdWVzISEhIgotCQkJCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoZSk7IAotCQkJCQl9CQkJCQkKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpc1JlZmxlY3RpbmdGaWVsZHMgPSBmYWxzZTsKLQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfRklFTERTKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaGFzUmVmbGVjdGVkRmllbGRzOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsJLy8gQ291bGRuJ3QgcmVmbGVjdCB0aGUgYmFzZSB2YWx1ZXMsIHNvIGNvdWxkbid0IGRvIGZpZWxkcyBlaXRoZXIKLQl9Ci0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlZmxlY3RNZXRob2RzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChyZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSAmJiBjYW5SZWZsZWN0KCkpIHsKLQkJCWlmICghaGFzUmVmbGVjdGVkTWV0aG9kcyAmJiAhaXNSZWZsZWN0aW5nTWV0aG9kcykgewotCQkJCWlzUmVmbGVjdGluZ01ldGhvZHMgPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9NRVRIT0RTKTsKLQkJCQkJaGFzUmVmbGVjdGVkTWV0aG9kcyA9IGFkZE1ldGhvZHMoKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQloYXNSZWZsZWN0ZWRNZXRob2RzID0gZmFsc2U7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQkJCWxvZ2dlci5sb2coUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmFpbGVkX3JlZmxlY3RpbmdfdmFsdWVzX0VSUk9SXyIpLCBMZXZlbC5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJCA9ICJGYWlsZWQgcmVmbGVjdGluZyB2YWx1ZXMhISEiCi0JCQkJCQlsb2dnZXIubG9nV2FybmluZyhlKTsgCi0JCQkJCX0JCQkJCQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlzUmVmbGVjdGluZ01ldGhvZHMgPSBmYWxzZTsKLQkJCQkJaWYgKCFoYXNSZWZsZWN0ZWQpCi0JCQkJCQlmbHVzaE1ldGhvZHMoKTsJLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZCwgc28gd2Ugd2lsbCBkbyBhIGNvbXBsZXRlIGZsdXNoIHRvIGJlIG9uIHNhZmUgc2lkZS4KLQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfTUVUSE9EUyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGhhc1JlZmxlY3RlZE1ldGhvZHM7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwkvLyBDb3VsZG4ndCByZWZsZWN0IHRoZSBiYXNlIHZhbHVlcywgc28gY291bGRuJ3QgZG8gZmllbGRzIGVpdGhlcgotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJXaXRoRmFjdG9yeSgpIHsKLQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5yZWdpc3RlclJlZmxlY3Rpb24oZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yI25vdGlmeUNoYW5nZWQobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpTm90aWZpZXIsIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBFT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUgotCQkJJiYgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkgPT0gdGhpcwotCQkJJiYgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgPT0gZ2V0VGFyZ2V0KCkpCi0JCQlnZXRBZGFwdGVyRmFjdG9yeSgpLnVucmVnaXN0ZXJSZWZsZWN0aW9uKGdldEphdmFDbGFzc1RhcmdldCgpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBpbkZhY3RvcnkpIHsKLQkJYWRhcHRlckZhY3RvcnkgPSBpbkZhY3Rvcnk7Ci0JfQotCS8qKgotCSAqIHNldEltcGxlbWVudHMgLSBzZXQgb3VyIGltcGxlbWVudGVkL3N1cGVyIGludGVyZmFjZXMgaGVyZQotCSAqIEZvciBhbiBpbnRlcmZhY2UsIHRoZXNlIGFyZSBzdXBlcmNsYXNzZXMuCi0JICogRm9yIGEgY2xhc3MsIHRoZXNlIGFyZSBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEltcGxlbWVudHMoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdbXSBpbnRlcmZhY2VOYW1lcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRTdXBlckludGVyZmFjZU5hbWVzKCk7Ci0JCQlKYXZhQ2xhc3MgcmVmOwotCQkJLy8gbmVlZHMgd29yaywgdGhlIG5hbWVzIGFib3ZlIHdpbGwgYmUgc2ltcGxlIG5hbWVzIGlmIHdlIGFyZSByZWxmZWN0aW5nIGZyb20gYSBzb3VyY2UgZmlsZQotCQkJTGlzdCBsaXN0ID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXNHZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWYgPSByZWZsZWN0SmF2YUNsYXNzKGludGVyZmFjZU5hbWVzW2ldKTsKLQkJCQlsaXN0LmFkZChyZWYpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvLyBuYW1lIHN0YXlzIG51bGwgYW5kIHdlIGNhcnJ5IG9uCi0JCX0KLQl9Ci0JLyoqCi0JICogc2V0TW9kaWZpZXJzIC0gc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHJlbGF0ZWQgdG8gbW9kaWZpZXJzIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoKSB7Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJdHJ5IHsKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRBYnN0cmFjdChGbGFncy5pc0Fic3RyYWN0KGdldFNvdXJjZVR5cGUoKS5nZXRGbGFncygpKSk7Ci0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0RmluYWwoRmxhZ3MuaXNGaW5hbChnZXRTb3VyY2VUeXBlKCkuZ2V0RmxhZ3MoKSkpOwotCQkJamF2YUNsYXNzVGFyZ2V0LnNldFB1YmxpYyhGbGFncy5pc1B1YmxpYyhnZXRTb3VyY2VUeXBlKCkuZ2V0RmxhZ3MoKSkpOwotCQkJLy8gU2V0IHR5cGUgdG8gY2xhc3Mgb3IgaW50ZXJmYWNlLCBub3QgeWV0IGhhbmRsaW5nIEVYQ0VQVElPTgotCQkJaWYgKGdldFNvdXJjZVR5cGUoKS5pc0NsYXNzKCkpCi0JCQkJamF2YUNsYXNzVGFyZ2V0LnNldEtpbmQoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCk7Ci0JCQllbHNlCi0JCQkJamF2YUNsYXNzVGFyZ2V0LnNldEtpbmQoVHlwZUtpbmQuSU5URVJGQUNFX0xJVEVSQUwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKQotCQkJCWxvZ2dlci5sb2coUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfSW50cm9zcGVjdGluZ19GbGFnc19FUlJPUl8iLCBuZXcgT2JqZWN0W10geyBqYXZhQ2xhc3NUYXJnZXQuZ2V0UXVhbGlmaWVkTmFtZSgpLCBucGUuZ2V0TWVzc2FnZSgpfSksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkID0gImVycm9yIGludHJvc3BlY3RpbmcgZmxhZ3Mgb24gezB9IgotCQl9Ci0JfQotCS8qKgotCSAqIHNldE5hbWluZyAtIHNldCB0aGUgbmFtaW5nIHZhbHVlcyBoZXJlCi0JICogCS0gcXVhbGlmaWVkIG5hbWUgKHBhY2thZ2UgbmFtZSArIG5hbWUpIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MKLQkgKgktIElEIC0gc2ltcGxlIG5hbWUsIGlkZW50aXR5IHdpdGhpbiBhIHBhY2thZ2UgZG9jdW1lbnQKLQkgKiAJLSBudWxsIFVVSUQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1pbmcoKSB7Ci0JCS8qIE5hbWluZyBoYXMgYmVlbiBwcm92aWRlZCBieSB0aGUgSmF2YVJlZmxlY3Rpb25LZXkgCi0JCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0U291cmNlVHlwZSgpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCWphdmFDbGFzc1RhcmdldC5yZWZTZXRVVUlEKChTdHJpbmcpbnVsbCk7Ci0JCSgoWE1JUmVzb3VyY2UpamF2YUNsYXNzVGFyZ2V0LmVSZXNvdXJjZSgpKS5zZXRJRChqYXZhQ2xhc3NUYXJnZXQsZ2V0U291cmNlVHlwZSgpLmdldEVsZW1lbnROYW1lKCkpOwotCQkqLwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VUeXBlKElUeXBlIGFUeXBlKSB7Ci0JCXNvdXJjZVR5cGUgPSBhVHlwZTsKLQl9Ci0JLyoqCi0JICogc2V0U3VwZXIgLSBzZXQgb3VyIHN1cGVydHlwZSBoZXJlLCBpbXBsZW1lbnRlZCBpbnRlcmZhY2UgYXJlIGhhbmRsZWQgc2VwYXJhdGVseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN1cGVyKCkgdGhyb3dzIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gewotCQlTdHJpbmcgc3VwZXJOYW1lID0gbnVsbDsKLQkJSVR5cGUgc3VwZXJUeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICghZ2V0U291cmNlVHlwZSgpLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQlzdXBlck5hbWUgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLQkJCQkvLyBiaW5hcnkgdHlwZXMgd2lsbCBhbHdheXMgaGF2ZSBmdWxseS1xdWFsaWZpZWQgc3VwZXIgbmFtZXMsIHNvIG5vIG5lZWQgdG8gZG8gYW55IHNlYXJjaGluZy4KLQkJCQlpZiAoIWdldFNvdXJjZVR5cGUoKS5pc0JpbmFyeSgpICYmIHN1cGVyTmFtZSAhPSBudWxsICYmIGlzVGFyZ2V0SW5uZXIoKSkgewotCQkJCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gZ2V0U291cmNlVHlwZSgpLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJCQkJaWYgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCkgewotCQkJCQkJLy9HZXQgYWxsIHBhcmVudCBJbm5lclR5cGVzCi0JCQkJCQlJVHlwZVtdIGlubmVycyA9IGRlY2xhcmluZ1R5cGUuZ2V0VHlwZXMoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5uZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJSVR5cGUgdHlwZSA9IGlubmVyc1tpXTsKLQkJCQkJCQlpZiAoc3VwZXJOYW1lLmVxdWFscyh0eXBlLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQkJCQkJCXN1cGVyTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKSArICcuJyArIHN1cGVyTmFtZTsKLQkJCQkJCQkJcmVmbGVjdElubmVyQ2xhc3NlcyhkZWNsYXJpbmdUeXBlKTsKLQkJCQkJCQkJc3VwZXJUeXBlID0gdHlwZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vU291cmNlIGZpbGVzIHJldHVybiBudWxsIGlmIGV4dGVuZHMgZG9lcyBub3QgZXhpc3QuCi0JCQkJaWYgKHN1cGVyTmFtZSA9PSBudWxsICYmICFnZXRTb3VyY2VUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKE9CSkVDVF9UWVBFX05BTUUpKQotCQkJCQlzdXBlck5hbWUgPSBPQkpFQ1RfVFlQRV9OQU1FOwotCQkJCWlmIChzdXBlck5hbWUgIT0gbnVsbCkgewotCQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCQkJCWlmIChzdXBlclR5cGUgIT0gbnVsbCkKLQkJCQkJCWphdmFDbGFzc1RhcmdldC5zZXRTdXBlcnR5cGUocmVmbGVjdEphdmFDbGFzcyhzdXBlclR5cGUpKTsKLQkJCQkJZWxzZQotCQkJCQkJamF2YUNsYXNzVGFyZ2V0LnNldFN1cGVydHlwZShyZWZsZWN0SmF2YUNsYXNzKHN1cGVyTmFtZSkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQl9Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1RhcmdldElubmVyKCkgewotCQlKYXZhQ2xhc3NJbXBsIGphdmFDbGFzcyA9IChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQkJcmV0dXJuIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmluZGV4T2YoJyQnKSAhPSAtMSk7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2VUeXBlIGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzb3VyY2VUeXBlRXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U291cmNlVHlwZSgpICE9IG51bGw7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RJbm5lckNsYXNzZXMoKSB7Ci0JCUlUeXBlW10gaW5uZXJDbGFzc2VzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlubmVyQ2xhc3NlcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRUeXBlcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChpbm5lckNsYXNzZXMgIT0gbnVsbCAmJiBpbm5lckNsYXNzZXMubGVuZ3RoICE9IDApIHsKLQkJCUxpc3QgZGVjbGFyZWRDbGFzc2VzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCk7Ci0JCQlKYXZhQ2xhc3MgaW5uZXI7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRUYXJnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5uZXJDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5uZXIgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocGFja2FnZU5hbWUsIGlubmVyQ2xhc3Nlc1tpXS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpLCBzZXQpOwotCQkJCWRlY2xhcmVkQ2xhc3Nlcy5hZGQoaW5uZXIpOwotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RJbm5lckNsYXNzZXMoSVR5cGUgYVR5cGUpIHsKLQkJSVR5cGVbXSBpbm5lckNsYXNzZXMgPSBudWxsOwotCQl0cnkgewotCQkJaW5uZXJDbGFzc2VzID0gYVR5cGUuZ2V0VHlwZXMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlpZiAoaW5uZXJDbGFzc2VzICE9IG51bGwgJiYgaW5uZXJDbGFzc2VzLmxlbmd0aCAhPSAwKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRUYXJnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBhVHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJSmF2YUNsYXNzSW1wbCBwYXJlbnRUeXBlID0gKEphdmFDbGFzc0ltcGwpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShwYWNrYWdlTmFtZSwgYVR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSwgc2V0KTsKLQkJCUxpc3QgZGVjbGFyZWRDbGFzc2VzID0gcGFyZW50VHlwZS5nZXREZWNsYXJlZENsYXNzZXNHZW4oKTsKLQkJCUphdmFDbGFzcyBpbm5lcjsKLQkJCQotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlubmVyQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCWlubmVyID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHBhY2thZ2VOYW1lLCBpbm5lckNsYXNzZXNbaV0uZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSwgc2V0KTsKLQkJCQlkZWNsYXJlZENsYXNzZXMuYWRkKGlubmVyKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUZpZWxkSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUZpZWxkSkRPTUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwMDVkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFGaWVsZEpET01BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFGaWVsZEpET01BZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEzICQgICREYXRlOiAyMDA1LzEwLzE4IDE0OjU4OjE4ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkZpZWxkSW1wbDsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUZpZWxkSkRPTUFkYXB0b3IgZXh0ZW5kcyBKRE9NQWRhcHRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFR0lOX0NPTU1FTlQgPSAiLyoiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9DT01NRU5UID0gIiovIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJRmllbGQgc291cmNlRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBJVHlwZSBwYXJlbnRUeXBlID0gbnVsbDsKLQlwdWJsaWMgSmF2YUZpZWxkSkRPTUFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBJSmF2YVByb2plY3Qgd29ya2luZ1Byb2plY3QpIHsKLQkJc3VwZXIodGFyZ2V0LCB3b3JraW5nUHJvamVjdCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGNsZWFyU291cmNlKCkgewotCQlzb3VyY2VGaWVsZCA9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlpZiAoY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkKLQkJCWNsZWFyU291cmNlKCk7Ci0JCUZpZWxkSW1wbCBmaWVsZCA9IGdldFRhcmdldEZpZWxkKCk7Ci0JCWZpZWxkLnNldEluaXRpYWxpemVyKG51bGwpOwotCQlmaWVsZC5zZXRGaW5hbChmYWxzZSk7Ci0JCWZpZWxkLnNldFN0YXRpYyhmYWxzZSk7Ci0JCWZpZWxkLnNldFRyYW5zaWVudChmYWxzZSk7Ci0JCWZpZWxkLnNldFZvbGF0aWxlKGZhbHNlKTsKLQkJZmllbGQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJZmllbGQuc2V0RVR5cGUobnVsbCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGlzRXhpc3RpbmcpIHsKLQkJZ2V0VGFyZ2V0RmllbGQoKS5zZXRSZWZsZWN0ZWQoZmFsc2UpOwotCQlzdXBlci5wb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShpc0V4aXN0aW5nKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIGEgU3RyaW5nIGZvciB0aGUgc291cmNlIHN0YXJ0aW5nIGFmdGVyIHRoZSBmaWVsZCdzIG5hbWUgdG8gdGhlIGVuZCBvZgotCSAqIHRoZSBzb3VyY2UgcmFuZ2UuICBUaGlzIHdpbGwgYmUgdGhlIHNvdXJjZSBhZnRlciB0aGUgbmFtZSB3aGljaCBjb3VsZCBpbmNsdWRlIGNvbW1lbnRzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRJbml0aWFsaXplclNvdXJjZSgpIHsKLQkJSU9wZW5hYmxlIG9wZW5hYmxlID0gZ2V0U291cmNlRmllbGQoKS5nZXRPcGVuYWJsZSgpOwotCQl0cnkgewotCQkJSVNvdXJjZVJhbmdlIG5hbWVSYW5nZSwgc291cmNlUmFuZ2U7Ci0JCQlpbnQgc3RhcnQgPSAtMSwgbGVuZ3RoID0gMDsKLQkJCUlCdWZmZXIgYnVmZmVyID0gb3BlbmFibGUuZ2V0QnVmZmVyKCk7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW5hbWVSYW5nZSA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQlzdGFydCA9IG5hbWVSYW5nZS5nZXRPZmZzZXQoKSArIG5hbWVSYW5nZS5nZXRMZW5ndGgoKTsKLQkJCWlmIChzdGFydCAhPSAtMSkgewotCQkJCXNvdXJjZVJhbmdlID0gZ2V0U291cmNlRmllbGQoKS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCWlmIChzb3VyY2VSYW5nZS5nZXRPZmZzZXQoKSAhPSAtMSkKLQkJCQkJbGVuZ3RoID0gc291cmNlUmFuZ2UuZ2V0T2Zmc2V0KCkgKyBzb3VyY2VSYW5nZS5nZXRMZW5ndGgoKSAtIHN0YXJ0OwotCQkJCXJldHVybiBidWZmZXIuZ2V0VGV4dChzdGFydCwgbGVuZ3RoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWVsZCBzb3VyY2Ugc3RyaW5nIHdpdGhvdXQgY29tbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpZWxkSW5pdGlhbGl6ZXJTb3VyY2VXaXRob3V0Q29tbWVudHMoKSB7Ci0JCVN0cmluZyBzID0gZ2V0RmllbGRJbml0aWFsaXplclNvdXJjZSgpOwotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgc3RhcnRDb21tZW50ID0gLTE7Ci0JCWludCBlbmRDb21tZW50ID0gLTE7Ci0JCXdoaWxlIChzdGFydCA8IHMubGVuZ3RoKCkpIHsKLQkJCXN0YXJ0Q29tbWVudCA9IHMuaW5kZXhPZihCRUdJTl9DT01NRU5ULCBzdGFydCk7Ci0JCQlpZiAoc3RhcnRDb21tZW50ID4gMCkgewotCQkJCVN0cmluZyBuZXdTdHJpbmc7Ci0JCQkJZW5kQ29tbWVudCA9IHMuaW5kZXhPZihFTkRfQ09NTUVOVCwgc3RhcnQpOwotCQkJCW5ld1N0cmluZyA9IHMuc3Vic3RyaW5nKHN0YXJ0LCBzdGFydENvbW1lbnQpOwotCQkJCXMgPSBuZXdTdHJpbmcgKyBzLnN1YnN0cmluZyhlbmRDb21tZW50ICsgRU5EX0NPTU1FTlQubGVuZ3RoKCksIHMubGVuZ3RoKCkpOwotCQkJCXN0YXJ0ID0gMDsKLQkJCQlzdGFydENvbW1lbnQgPSAtMTsKLQkJCQllbmRDb21tZW50ID0gLTE7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXJ0ID0gcy5sZW5ndGgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0JLyoqCi0JICogZ2V0RmllbGRJbml0aWFsaXplclN0cmluZyAtIHBhcnNlIHRoZSBzb3VyY2UgZm9yIG91ciBzb3VyY2UgZmllbGQgCi0JICogCWFuZCByZXR1cm4gdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZy4KLQkgKiAgUmV0dXJuIG51bGwgaWYgbm8gaW5pdGlhbGl6YXRpb24gc3RyaW5nIG9yIGNvbnN0YW50IHZhbHVlIGlzIHByZXNlbnQuCi0JICogaS5lLiAtIHB1YmxpYyBTdHJpbmcgZm9vID0gImZvbyBkZWZhdWx0Ijsgc2hvdWxkIHJldHVybiAiZm9vIGRlZmF1bHQiIChpbmNsdWRpbmcgcXVvdGVzKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRJbml0aWFsaXplclN0cmluZygpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoIWdldFBhcmVudFR5cGUoKS5pc0JpbmFyeSgpKSB7Ci0JCQkJU3RyaW5nIHNvdXJjZSA9IGdldEZpZWxkSW5pdGlhbGl6ZXJTb3VyY2VXaXRob3V0Q29tbWVudHMoKTsKLQkJCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJaW50IGVxdWFsc1BvcyA9IHNvdXJjZS5pbmRleE9mKCc9Jyk7Ly8kTk9OLU5MUy0xJAotCQkJCQlpbnQgZW5kUG9zID0gc291cmNlLmluZGV4T2YoJywnKTsvLyROT04tTkxTLTEkCi0JCQkJCWlmIChlbmRQb3MgPT0gLTEpCi0JCQkJCQllbmRQb3MgPSBzb3VyY2UubGVuZ3RoKCkgLSAxOwotCQkJCQlpZiAoZXF1YWxzUG9zICE9IC0xKSB7Ci0JCQkJCQkvLyBDb3B5IGZyb20gYWZ0ZXIgIj0iIHRvIGJlZm9yZSAiOyIgb3IgIiwiCi0JCQkJCQlyZXN1bHQgPSBzb3VyY2Uuc3Vic3RyaW5nKGVxdWFsc1BvcyArIDEsIGVuZFBvcyk7Ci0JCQkJCQlyZXN1bHQgPSByZXN1bHQudHJpbSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBCaW5hcnkgdHlwZSwgc2VlIGlmIHdlIGNhbiB1c2UgdGhlIGNvbnN0YW50Ci0JCQkJLy8gaXQncyBub3QgY2xlYXIgZnJvbSB0aGUgQVBJJ3MsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IG9ubHkKLQkJCQkvLyBhdmFpbGFibGUgZm9yIHN0YXRpY3MuCi0JCQkJT2JqZWN0IGNvbnN0YW50VmFsdWUgPSBnZXRTb3VyY2VGaWVsZCgpLmdldENvbnN0YW50KCk7Ci0JCQkJLy8gTmVlZCB0byBjb252ZXJ0IHRoZSBjb25zdGFudCB0byBhIFN0cmluZwotCQkJCWlmIChjb25zdGFudFZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gY29uc3RhbnRWYWx1ZS50b1N0cmluZygpOwotCQkJCQlpZiAoY29uc3RhbnRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQkJcmVzdWx0ID0gIlwiIiArIHJlc3VsdCArICJcIiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwdW50Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogZ2V0UGFyZW50VHlwZSAtIHJldHVybiB0aGUgSVR5cGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gb3VyIHBhcmVudCBKYXZhQ2xhc3MKLQkgKiB3ZSdyZSBnb2luZyB0byBkbyB0aGlzIGEgbG90LCBzbyBjYWNoZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0UGFyZW50VHlwZSgpIHsKLQkJaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotCQkJRmllbGQgdGFyZ2V0RmllbGQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQkJSmF2YUNsYXNzIHBhcmVudEphdmFDbGFzcyA9IHRhcmdldEZpZWxkLmdldEphdmFDbGFzcygpOwotCQkJaWYgKHBhcmVudEphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJSmF2YUNsYXNzSkRPTUFkYXB0b3IgcGEgPSAoSmF2YUNsYXNzSkRPTUFkYXB0b3IpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHBhcmVudEphdmFDbGFzcy5lQWRhcHRlcnMoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJCWlmIChwYSAhPSBudWxsKQotCQkJCQlwYXJlbnRUeXBlID0gcGEuZ2V0U291cmNlVHlwZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJlbnRUeXBlOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VGaWVsZCgpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZUZpZWxkICE9IG51bGw7Ci0gICAgfQotCQotCS8qCi0JICogVXNlZCBieSBKYXZhIENsYXNzIEpET00gYWRhcHRlciB0byBjcmVhdGUgYW5kIHNldCB3aXRoIGEgc291cmNlIGZpZWxkCi0JICovCQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUZpZWxkKElGaWVsZCBmaWVsZCkgewotCQlzb3VyY2VGaWVsZCA9IGZpZWxkOwotCX0JCi0JLyoqCi0JICogZ2V0U291cmNlRmllbGQgLSByZXR1cm4gdGhlIElGaWVsZCB3aGljaCBkZXNjcmliZXMgb3VyIGltcGxlbWVudGluZyBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBJRmllbGQgZ2V0U291cmNlRmllbGQoKSB7Ci0JCWlmIChzb3VyY2VGaWVsZCA9PSBudWxsIHx8ICFzb3VyY2VGaWVsZC5leGlzdHMoKSkgewotCQkJSVR5cGUgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnRUeXBlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJc291cmNlRmllbGQgPSBwYXJlbnQuZ2V0RmllbGQoKChGaWVsZCkgZ2V0VGFyZ2V0KCkpLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZUZpZWxkOwotCX0KLQlwdWJsaWMgRmllbGRJbXBsIGdldFRhcmdldEZpZWxkKCkgewotCQlyZXR1cm4gKEZpZWxkSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JfQotCXByb3RlY3RlZCBJVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50VHlwZSgpOwotCX0KLQlwcm90ZWN0ZWQgTWFwIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSB7Ci0JCUZpZWxkIGZpZWxkID0gZ2V0VGFyZ2V0RmllbGQoKTsKLQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBmaWVsZC5nZXRKYXZhQ2xhc3MoKTsKLQkJCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJCUpET01BZGFwdG9yIGNsYXNzQWRhcHRvciA9IChKRE9NQWRhcHRvcikgcmV0cmlldmVBZGFwdG9yRnJvbShqYXZhQ2xhc3MpOwotCQkJCWlmIChjbGFzc0FkYXB0b3IgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGNsYXNzQWRhcHRvci5nZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotCQkvLyBBdCB0aGlzIHBvaW50LCB0aGlzIGFkYXB0ZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgY29tcHV0ZSBhbnkgdmFsdWVzLAotCQkvLyBhbGwgdmFsdWVzIGFyZSBwdXNoZWQgYmFjayBpbnRvIHRoZSB0YXJnZXQgb24gdGhlIGluaXRpYWwgY2FsbC4KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotCX0KLQkvKioKLQkgKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0LgotCSAqIG9uIGVudHJ5OiBuYW1lLCBjb250YWluaW5nIHBhY2thZ2UgKGFuZCBxdWFsaWZpZWQgbmFtZSksIGFuZCBkb2N1bWVudCBtdXN0IGJlIHNldC4KLQkgKiBKYXZhQ2xhc3MgYWRhcHRvcjoKLQkgKgktIHNldCBtb2RpZmllcnMKLQkgKgktIHNldCBuYW1lCi0JICogCS0gc2V0IHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlzdXBlci5yZWZsZWN0VmFsdWVzKCk7Ci0JCWlmIChpc1Jlc291cmNlTG9hZGVkKCkgJiYgZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwgJiYgZ2V0U291cmNlRmllbGQoKSAhPSBudWxsKSB7Ci0JCQlzZXRNb2RpZmllcnMoKTsKLQkJCS8vCXNldE5hbWluZygpOwotCQkJc2V0VHlwZSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJRmllbGQgamF2YUZpZWxkVGFyZ2V0ID0gKEZpZWxkKSBnZXRUYXJnZXQoKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpbml0aWFsaXplciA9IGdldEZpZWxkSW5pdGlhbGl6ZXJTdHJpbmcoKTsKLQkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKQotCQkJCWphdmFGaWVsZFRhcmdldC5zZXRJbml0aWFsaXplcihjcmVhdGVCbG9jayhqYXZhRmllbGRUYXJnZXQuZ2V0TmFtZSgpLCBpbml0aWFsaXplcikpOwotCQkJaW50IGZsYWdzID0gZ2V0U291cmNlRmllbGQoKS5nZXRGbGFncygpOwotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEZpbmFsKEZsYWdzLmlzRmluYWwoZmxhZ3MpKTsKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRTdGF0aWMoRmxhZ3MuaXNTdGF0aWMoZmxhZ3MpKTsKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRUcmFuc2llbnQoRmxhZ3MuaXNUcmFuc2llbnQoZmxhZ3MpKTsKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRWb2xhdGlsZShGbGFncy5pc1ZvbGF0aWxlKGZsYWdzKSk7Ci0JCQkvLyBTZXQgdmlzaWJpbGl0eQotCQkJaWYgKEZsYWdzLmlzUHVibGljKGZsYWdzKSkKLQkJCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJCWVsc2UgaWYgKEZsYWdzLmlzUHJpdmF0ZShmbGFncykpCi0JCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQkJZWxzZSBpZiAoRmxhZ3MuaXNQcm90ZWN0ZWQoZmxhZ3MpKQotCQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFJPVEVDVEVEX0xJVEVSQUwpOwotCQkJZWxzZQotCQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUEFDS0FHRV9MSVRFUkFMKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0ludHJvc3BlY3RpbmdfRmxhZ3NfRVJST1JfIiwgbmV3IE9iamVjdFtdIHsoKFhNSVJlc291cmNlKSBqYXZhRmllbGRUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKGphdmFGaWVsZFRhcmdldCksIG5wZS5nZXRNZXNzYWdlKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiZXJyb3IgaW50cm9zcGVjdGluZyBmbGFncyBvbiB7MH0iCi0JCX0KLQl9Ci0JLyoqCi0JICogc2V0TmFtaW5nIC0gc2V0IHRoZSBuYW1pbmcgdmFsdWVzIGhlcmUKLQkgKiAJLSBxdWFsaWZpZWQgbmFtZSBtdXN0IGJlIHNldCBmaXJzdCwgdGhhdCBpcyB0aGUgcGF0aCB0byB0aGUgcmVhbCBKYXZhIGNsYXNzCi0JICoJLSBJRAotCSAqIAktIG51bGwgVVVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJRmllbGQgamF2YUZpZWxkVGFyZ2V0ID0gKEZpZWxkKSBnZXRUYXJnZXQoKTsKLQkJSmF2YUNsYXNzIHBhcmVudCA9IGphdmFGaWVsZFRhcmdldC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCSgoWE1JUmVzb3VyY2UpIGphdmFGaWVsZFRhcmdldC5lUmVzb3VyY2UoKSkuc2V0SUQoamF2YUZpZWxkVGFyZ2V0LCBwYXJlbnQuZ2V0TmFtZSgpICsgIl8iICsgamF2YUZpZWxkVGFyZ2V0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgdHlwZSBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHlwZSgpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXR5cGVOYW1lID0gdHlwZU5hbWVGcm9tU2lnbmF0dXJlKGdldFNvdXJjZUZpZWxkKCkuZ2V0VHlwZVNpZ25hdHVyZSgpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy8gbmFtZSBzdGF5cyBudWxsIGFuZCB3ZSBjYXJyeSBvbgotCQl9Ci0JCXNldEZpZWxkVHlwZShnZXRUYXJnZXRGaWVsZCgpLCB0eXBlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyZDJiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YUpET01BZGFwdGVyRmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjEzOjUzICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvMTMvMjAwMCAxOjIwOjMxIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUpET01BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgewotCQotCXByb3RlY3RlZCBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7Ci0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLS8qKgotICogSmF2YUpET01BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YUpET01BZGFwdGVyRmFjdG9yeSgpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KElKYXZhUHJvamVjdCBhSmF2YVByb2plY3QpIHsKLQl0aGlzKCk7Ci0Jc2V0SmF2YVByb2plY3QoYUphdmFQcm9qZWN0KTsKLX0KLXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhQ2xhc3NBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXJldHVybiBuZXcgSmF2YUNsYXNzSkRPTUFkYXB0b3IodGFyZ2V0LCBnZXRKYXZhUHJvamVjdCgpLCB0aGlzKTsKLX0KLXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhRmllbGRBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXJldHVybiBuZXcgSmF2YUZpZWxkSkRPTUFkYXB0b3IodGFyZ2V0LCBnZXRKYXZhUHJvamVjdCgpKTsKLX0KLXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhTWV0aG9kQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQlyZXR1cm4gbmV3IEphdmFNZXRob2RKRE9NQWRhcHRvcih0YXJnZXQsIGdldEphdmFQcm9qZWN0KCkpOwotfQotLyoqCi0gKiAgRmx1c2ggQUxMIGFkYXB0ZXJzLCB3b3JzdCBjYXNlCi0gKiBXZSBhbHNvIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIHNvdXJjZSB0eXBlcyBhcmUgYWxzbyBjbGVhcmVkCi0gKiBpbiB0aGlzIHdvcnN0IGNhc2Ugc2NlbmFyaW8uCi0gKi8KLXB1YmxpYyB2b2lkIGZsdXNoQWxsKCkgewotCWRvRmx1c2gocmVmbGVjdGVkLnZhbHVlcygpLHRydWUsIHRydWUpOwotfQotCi1wdWJsaWMgTGlzdCBmbHVzaEFsbE5vTm90aWZpY2F0aW9uKCkgewotCXJldHVybiBkb0ZsdXNoKHJlZmxlY3RlZC52YWx1ZXMoKSx0cnVlLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGZsdXNoUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gbm9GbHVzaElmU291cmNlRm91bmQpIHsKLQlMaXN0IGFkYXB0b3JzID0gZ2V0UmVmbGVjdGVkRm9yUGFja2FnZShwYWNrYWdlTmFtZSwgbm9GbHVzaElmU291cmNlRm91bmQpOwotCWRvRmx1c2goYWRhcHRvcnMsIHRydWUsIHRydWUpOwotfQotcHVibGljIExpc3QgZmx1c2hQYWNrYWdlTm9Ob3RpZmljYXRpb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JTGlzdCBhZGFwdG9ycyA9IGdldFJlZmxlY3RlZEZvclBhY2thZ2UocGFja2FnZU5hbWUsIG5vRmx1c2hJZlNvdXJjZUZvdW5kKTsKLQlyZXR1cm4gZG9GbHVzaChhZGFwdG9ycywgdHJ1ZSwgZmFsc2UpOwotfQotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIHJlZmxlY3Rpb24gYWRhcHRvcnMgdGhhdCBiZWxvbmcgdG8gCi0gKiB0aGUgcGFja2FnZU5hbWUuCi0gKiBAcGFyYW0gcGFja2FnZU5hbWUKLSAqIEByZXR1cm4KLSAqLwotcHJpdmF0ZSBMaXN0IGdldFJlZmxlY3RlZEZvclBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGZpbHRlckZvdW5kVHlwZXMpIHsKLQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiAhcmVmbGVjdGVkLmlzRW1wdHkoKSkgewotCQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvciBpdCA9IHJlZmxlY3RlZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlNYXAuRW50cnkgZW50cnk7Ci0JCQlTdHJpbmcga2V5OwotCQkJSmF2YUNsYXNzSkRPTUFkYXB0b3IgYWRhcHRvcjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlhZGFwdG9yID0gKEphdmFDbGFzc0pET01BZGFwdG9yKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChmaWx0ZXJGb3VuZFR5cGVzICYmIGFkYXB0b3Iuc291cmNlVHlwZSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlpZiAoa2V5LnN0YXJ0c1dpdGgocGFja2FnZU5hbWUpICYmIGtleS5pbmRleE9mKCcuJywgcGFja2FnZU5hbWUubGVuZ3RoKCkgKyAxKSA8IDApIHsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlyZXN1bHQuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0JCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotfQotcHJpdmF0ZSBMaXN0IGRvRmx1c2goQ29sbGVjdGlvbiBhZGFwdG9ycywgYm9vbGVhbiBjbGVhclNvdXJjZVR5cGUsIGJvb2xlYW4gZG9Ob3RpZnkpIHsKLQlpZiAoIWFkYXB0b3JzLmlzRW1wdHkoKSkgewotCQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCQlMaXN0IG5vdGlmaWNhdGlvbnMgPSBkb05vdGlmeSA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KGFkYXB0b3JzLnNpemUoKSk7Ci0JCXRyeSB7Ci0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uOwotCQkJSXRlcmF0b3IgaSA9IGFkYXB0b3JzLml0ZXJhdG9yKCk7Ci0JCQlKRE9NQWRhcHRvciBhZGFwdG9yOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJYWRhcHRvciA9IChKRE9NQWRhcHRvcikgaS5uZXh0KCk7Ci0JCQkJaWYgKGRvTm90aWZ5KQotCQkJCQlhZGFwdG9yLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoY2xlYXJTb3VyY2VUeXBlKTsKLQkJCQllbHNlIHsKLQkJCQkJbm90aWZpY2F0aW9uID0gYWRhcHRvci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oY2xlYXJTb3VyY2VUeXBlKTsKLQkJCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKQotCQkJCQkJbm90aWZpY2F0aW9ucy5hZGQobm90aWZpY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCQl9Ci0JCXJldHVybiBub3RpZmljYXRpb25zOwotCX0KLQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLX0KLS8vIEZsdXNoIHRoZSBhZGFwdGVyIGZvciBhIHNvdXJjZSBvYmplY3QKLXB1YmxpYyB2b2lkIGZsdXNoUmVmbGVjdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JSkRPTUFkYXB0b3IgYSA9IChKRE9NQWRhcHRvcikgcmVmbGVjdGVkLmdldChzb3VyY2UpOwotCWlmIChhICE9IG51bGwpCi0JCWEuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotfQotcHVibGljIE5vdGlmaWNhdGlvbiBmbHVzaFJlZmxlY3Rpb25Ob05vdGlmaWNhdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JSkRPTUFkYXB0b3IgYSA9IChKRE9NQWRhcHRvcikgcmVmbGVjdGVkLmdldChzb3VyY2UpOwotCWlmIChhICE9IG51bGwpCi0JCXJldHVybiBhLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbihmYWxzZSk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXB1YmxpYyBOb3RpZmljYXRpb24gZmx1c2hSZWZsZWN0aW9uUGx1c0lubmVyTm9Ob3RpZmljYXRpb24oU3RyaW5nIHNvdXJjZSkgewotCWlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IHRydWU7Ci0JTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG51bGw7Ci0JdHJ5IHsKLQkJU3RyaW5nIGlubmVyTmFtZSA9IHNvdXJjZSArICckJzsKLQkJSXRlcmF0b3IgaXQgPSByZWZsZWN0ZWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCVN0cmluZyBrZXk7Ci0JCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGtleS5lcXVhbHMoc291cmNlKSB8fCBrZXkuc3RhcnRzV2l0aChpbm5lck5hbWUpKSB7Ci0JCQkJYWRhcHRvciA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoa2V5KTsKLQkJCQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChub3RpZmljYXRpb24gPT0gbnVsbCkKLQkJCQkJCW5vdGlmaWNhdGlvbiA9IGFkYXB0b3IuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGZhbHNlKTsKLQkJCQkJZWxzZQotCQkJCQkJKChOb3RpZmljYXRpb25DaGFpbikgbm90aWZpY2F0aW9uKS5hZGQoYWRhcHRvci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCX0KLQlyZXR1cm4gbm90aWZpY2F0aW9uOwotCi19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yLzIwMDAgMzowMjozMSBQTSkKLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmNvcmUuYXBpLklKYXZhUHJvamVjdAotICovCi1wdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCXJldHVybiBqYXZhUHJvamVjdDsKLX0KLS8qKgotICogQ3JlYXRlIGEgSmF2YSBNb2RlbCBsaXN0ZW5lciB3aGljaCB3aWxsIGZsdXNoIGludmFsaWRhdGVkIGFkYXB0b3JzLgotICogVGhpcyB3aWxsIGNhdXNlIHRob3NlIGFkYXB0ZXJzIHRvIHJlLXJlZmxlY3QgdGhlaXIgdGFyZ2V0IG9iamVjdCdzIGNvbnRlbnRzLgotICovCi1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3luY2hyb25pemVyKCkgewotCXN5bmNocm9uaXplciA9IG5ldyBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplcih0aGlzKTsKLX0KLS8qKgotICogTm90aWZ5IGFsbCBKRE9NQWRhcHRlcnMgd2hpY2ggdXNlIHRoZSBzYW1lIHRhcmdldCBJQ29tcGlsYXRpb25Vbml0Ci0gKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDQ6NDU6NDMgUE0pCi0gKi8KLXB1YmxpYyB2b2lkIG5vdGlmeUNvbnRlbnRDaGFuZ2VkKElDb21waWxhdGlvblVuaXQgdGFyZ2V0Q1UpIHsKLQotCWlmICh0YXJnZXRDVSA9PSBudWxsIHx8IHJlZmxlY3RlZC52YWx1ZXMoKT09bnVsbCkgcmV0dXJuIDsKLQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCXRyeSB7Ci0JCUl0ZXJhdG9yIGkgPSByZWZsZWN0ZWQudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgYSA9IChSZWZsZWN0aW9uQWRhcHRvcikgaS5uZXh0KCkgOwotCQkJaWYgKGEgaW5zdGFuY2VvZiBKRE9NQWRhcHRvcikgewotCQkJCUpET01BZGFwdG9yIGFkYXB0b3IgPSAoSkRPTUFkYXB0b3IpIGE7Ci0JCQkJSU1lbWJlciByZWZsZWN0aW9uU291cmNlID0gKElNZW1iZXIpIGFkYXB0b3IuZ2V0UmVmbGVjdGlvblNvdXJjZSgpOwotCQkJCUlDb21waWxhdGlvblVuaXQgYWRhcHRlckNVID0gbnVsbCA7Ci0JCQkJaWYgKHJlZmxlY3Rpb25Tb3VyY2UgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkgICBhZGFwdGVyQ1UgPSByZWZsZWN0aW9uU291cmNlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkge30gCi0JCQkJfQotCQkJCWlmIChhZGFwdGVyQ1UgIT0gbnVsbCAmJiB0YXJnZXRDVS5lcXVhbHMoYWRhcHRlckNVKSkgewotCQkJICAgICAgIGFkYXB0b3IuY29udGVudENoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOyAgCQotCX0KLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzIvMjAwMCAzOjAyOjMxIFBNKQotICogQHBhcmFtIG5ld0phdmFQcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdAotICovCi1wdWJsaWMgdm9pZCBzZXRKYXZhUHJvamVjdChJSmF2YVByb2plY3QgbmV3SmF2YVByb2plY3QpIHsKLQlqYXZhUHJvamVjdCA9IG5ld0phdmFQcm9qZWN0OwotCWlmIChuZXdKYXZhUHJvamVjdCAhPSBudWxsICYmIHN5bmNocm9uaXplciA9PSBudWxsKQotCQlpbml0aWFsaXplU3luY2hyb25pemVyKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFNZXRob2RKRE9NQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTWV0aG9kSkRPTUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5Nzg3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFNZXRob2RKRE9NQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFNZXRob2RKRE9NQWRhcHRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNCAkICAkRGF0ZTogMjAwNS8xMC8xOCAxNDo1ODoxOCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YU1ldGhvZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuTWV0aG9kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5UaW1lclRlc3RzOwotCi0vKioKLSAqIEphdmEgTWV0aG9kIFJlZmxlY3Rpb24gQWRhcHRlciBmb3IgSkRPTSAoaS5lLiBKRFQgbW9kZWwpCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFNZXRob2RKRE9NQWRhcHRvciBleHRlbmRzIEpET01BZGFwdG9yIGltcGxlbWVudHMgSUphdmFNZXRob2RBZGFwdGVyICB7Ci0KLQkvKgotCSAqIFN0ZXAgaWRzIHVzZWQgZm9yIFRpbWVyVGVzdHMgb2YgcGVyZm9ybWFuY2UgdGVzdGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZMRUNUX01FVEhPRCA9ICJSZWZsZWN0IEpET00gTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElNZXRob2Qgc291cmNlTWV0aG9kID0gbnVsbDsKLQotCXByb3RlY3RlZCBJVHlwZSBwYXJlbnRUeXBlID0gbnVsbDsKLQotCXB1YmxpYyBKYXZhTWV0aG9kSkRPTUFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBJSmF2YVByb2plY3Qgd29ya2luZ1Byb2plY3QpIHsKLQkJc3VwZXIodGFyZ2V0LCB3b3JraW5nUHJvamVjdCk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCWlmIChjbGVhckNhY2hlZE1vZGVsT2JqZWN0KQotCQkJY2xlYXJTb3VyY2UoKTsKLQkJTWV0aG9kSW1wbCBtZXRob2QgPSAoTWV0aG9kSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JCW1ldGhvZC5zZXRJc0dlbmVyYXRlZChmYWxzZSk7Ci0JCW1ldGhvZC5zZXRGaW5hbChmYWxzZSk7Ci0JCW1ldGhvZC5zZXROYXRpdmUoZmFsc2UpOwotCQltZXRob2Quc2V0U3RhdGljKGZhbHNlKTsKLQkJbWV0aG9kLnNldFN5bmNocm9uaXplZChmYWxzZSk7Ci0JCW1ldGhvZC5zZXRDb25zdHJ1Y3RvcihmYWxzZSk7Ci0JCW1ldGhvZC5zZXRBYnN0cmFjdChmYWxzZSk7Ci0JCW1ldGhvZC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQltZXRob2Quc2V0RVR5cGUobnVsbCk7Ci0JCW1ldGhvZC5nZXRQYXJhbWV0ZXJzR2VuKCkuY2xlYXIoKTsKLQkJbWV0aG9kLmdldEphdmFFeGNlcHRpb25zR2VuKCkuY2xlYXIoKTsJCQotCQlwYXJlbnRUeXBlID0gbnVsbDsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGJvb2xlYW4gaXNFeGlzdGluZykgewotCQkoKE1ldGhvZEltcGwpIGdldFRhcmdldCgpKS5zZXRSZWZsZWN0ZWQoZmFsc2UpOwotCQlzdXBlci5wb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShpc0V4aXN0aW5nKTsKLQl9CQotCS8qKgotCSAqIGFkZEV4Y2VwdGlvbnMgLSByZWZsZWN0IG91ciBleGNlcHRpb24gbGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4Y2VwdGlvbnMoKSB7Ci0JCXRyeSB7Ci0JCQlJTWV0aG9kIHNvdXJjZU1ldGhvZCA9IGdldFNvdXJjZU1ldGhvZCgpOwotCQkJU3RyaW5nW10gZXhjZXB0aW9uTmFtZXMgPSBzb3VyY2VNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLQkJCUxpc3QgZXhjZXB0aW9ucyA9ICgoTWV0aG9kSW1wbCkgZ2V0VGFyZ2V0KCkpLmdldEphdmFFeGNlcHRpb25zR2VuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZXhjZXB0aW9ucy5hZGQoY3JlYXRlSmF2YUNsYXNzUmVmKHR5cGVOYW1lRnJvbVNpZ25hdHVyZShleGNlcHRpb25OYW1lc1tpXSkpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy8gbmFtZSBzdGF5cyBudWxsIGFuZCB3ZSBjYXJyeSBvbgotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKLQkJU3RyaW5nW10gcGFybU5hbWVzID0gbmV3IFN0cmluZ1swXSwgcGFybVR5cGVOYW1lcyA9IGdldFNvdXJjZU1ldGhvZCgpLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCXRyeSB7Ci0JCQlwYXJtTmFtZXMgPSBnZXRTb3VyY2VNZXRob2QoKS5nZXRQYXJhbWV0ZXJOYW1lcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvLyBuYW1lIHN0YXlzIG51bGwgYW5kIHdlIGNhcnJ5IG9uCi0JCX0KLQkJLy8gVGVtcCBoYWNrIHRvIHdvcmsgYXJvdW5kIGEgSmF2YU1vZGVsIGJ1ZywgYWJvdmUgY2FsbCBvbiBhIEJpbmFyeSBtZXRob2QgbWF5IHJldHVybiBudWxsCi0JCWlmIChwYXJtTmFtZXMgPT0gbnVsbCB8fCBwYXJtTmFtZXMubGVuZ3RoID09IDApIHsKLQkJCXBhcm1OYW1lcyA9IG5ldyBTdHJpbmdbcGFybVR5cGVOYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFybU5hbWVzW2ldID0gImFyZyIgKyBpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQkKLQkJcmV0dXJuIHBhcm1OYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBhZGRQYXJhbWV0ZXJzIC0gcmVmbGVjdCBvdXIgcGFybXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbWV0ZXJzKCkgewotCQlTdHJpbmdbXSBwYXJtVHlwZU5hbWVzID0gZ2V0U291cmNlTWV0aG9kKCkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJTWV0aG9kSW1wbCBqYXZhTWV0aG9kVGFyZ2V0ID0gKE1ldGhvZEltcGwpIGdldFRhcmdldCgpOwotCQlMaXN0IHBhcmFtcyA9IGphdmFNZXRob2RUYXJnZXQuZ2V0UGFyYW1ldGVyc0dlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBhcmFtcy5hZGQoY3JlYXRlSmF2YVBhcmFtZXRlcihqYXZhTWV0aG9kVGFyZ2V0LCBudWxsLCB0eXBlTmFtZUZyb21TaWduYXR1cmUocGFybVR5cGVOYW1lc1tpXSkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyU291cmNlKCkgewotCQlzb3VyY2VNZXRob2QgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpIHsKLQkJcmV0dXJuICgoTWV0aG9kKSBnZXRUYXJnZXQoKSkuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCX0KLQotCS8qKgotCSAqIGdldFBhcmVudFR5cGUgLSByZXR1cm4gdGhlIElUeXBlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIG91ciBwYXJlbnQgSmF2YUNsYXNzIHdlJ3JlIGdvaW5nIHRvIGRvIHRoaXMgYSBsb3QsIHNvIGNhY2hlIGl0LgotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRQYXJlbnRUeXBlKCkgewotCQlpZiAocGFyZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlNZXRob2QgdGFyZ2V0TWV0aG9kID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlKYXZhQ2xhc3MgcGFyZW50SmF2YUNsYXNzID0gdGFyZ2V0TWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJCUphdmFDbGFzc0pET01BZGFwdG9yIHBhID0gKEphdmFDbGFzc0pET01BZGFwdG9yKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihwYXJlbnRKYXZhQ2xhc3MuZUFkYXB0ZXJzKCksIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCWlmIChwYSAhPSBudWxsKQotCQkJCXBhcmVudFR5cGUgPSBwYS5nZXRTb3VyY2VUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UGFybVR5cGVTaWduYXR1cmVzIC0gcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZ3MgKGluIFNpZ25hdHVyZSBmb3JtYXQpIGZvciBvdXIgcGFyYW1ldGVyIHR5cGVzIEZvciByZWZsZWN0aW9uIHB1cnBvc2VzLCB3ZSBjYW4gb25seSByZWx5IG9uCi0JICogb3VyIFVVSUQsIHNpbmNlIG91ciBwYXJtcyBtYXkgbm90IHlldCBiZSBrbm93bi4gc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNvdXJjZU1hcHBlci5jb252ZXJ0VHlwZU5hbWVzVG9TaWdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFybVR5cGVTaWduYXR1cmVzKCkgewotCQlNZXRob2QgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQlTdHJpbmdbXSB0eXBlTmFtZXMgPSBnZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoKChYTUlSZXNvdXJjZSkgamF2YU1ldGhvZFRhcmdldC5lUmVzb3VyY2UoKSkuZ2V0SUQoamF2YU1ldGhvZFRhcmdldCkpOwotCQlpZiAodHlwZU5hbWVzID09IG51bGwpCi0JCQlyZXR1cm4gZW1wdHlTdHJpbmdBcnJheTsKLQkJaW50IG4gPSB0eXBlTmFtZXMubGVuZ3RoOwotCQlpZiAobiA9PSAwKQotCQkJcmV0dXJuIGVtcHR5U3RyaW5nQXJyYXk7Ci0JCVN0cmluZ1tdIHR5cGVTaWdzID0gbmV3IFN0cmluZ1tuXTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCQkJdHlwZVNpZ3NbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShuZXcgU3RyaW5nKHR5cGVOYW1lc1tpXSksIGdldFBhcmVudFR5cGUoKS5pc0JpbmFyeSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVTaWdzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZU1ldGhvZCgpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZU1ldGhvZCAhPSBudWxsOwotICAgIH0KLQotCS8qCi0JICogVXNlZCBieSBKYXZhIENsYXNzIEpET00gYWRhcHRlciB0byBjcmVhdGUgYW5kIHNldCB3aXRoIGEgc291cmNlIG1ldGhvZC8KLQkgKi8JCi0JcHVibGljIHZvaWQgcHJpbVNldE1ldGhvZChJTWV0aG9kIG1ldGhvZCkgewotCQlzb3VyY2VNZXRob2QgPSBtZXRob2Q7Ci0JfQotCS8qKgotCSAqIGdldHNvdXJjZU1ldGhvZCAtIHJldHVybiB0aGUgSU1ldGhvZCB3aGljaCBkZXNjcmliZXMgb3VyIGltcGxlbWVudGluZyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZCBnZXRTb3VyY2VNZXRob2QoKSB7Ci0JCWlmICgoc291cmNlTWV0aG9kID09IG51bGwpIHx8ICghc291cmNlTWV0aG9kLmV4aXN0cygpKSkgewotCQkJdHJ5IHsKLQkJCQlJVHlwZSBwYXJlbnQgPSB0aGlzLmdldFBhcmVudFR5cGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nW10gcGFybU5hbWVzID0gdGhpcy5nZXRQYXJtVHlwZVNpZ25hdHVyZXMoKTsKLQkJCQkJc291cmNlTWV0aG9kID0gSkRPTVNlYXJjaEhlbHBlci5zZWFyY2hGb3JNYXRjaGluZ01ldGhvZChwYXJlbnQsICgoTWV0aG9kKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpLCBwYXJtTmFtZXMpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9kbyBub3RoaW5nCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZU1ldGhvZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gbWV0aG9kLmdldEphdmFDbGFzcygpOwotCQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJSkRPTUFkYXB0b3IgY2xhc3NBZGFwdG9yID0gKEpET01BZGFwdG9yKSByZXRyaWV2ZUFkYXB0b3JGcm9tKGphdmFDbGFzcyk7Ci0JCQkJaWYgKGNsYXNzQWRhcHRvciAhPSBudWxsKQotCQkJCQlyZXR1cm4gY2xhc3NBZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZUluIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLQkJLy8gQXQgdGhpcyBwb2ludCwgdGhpcyBhZGFwdGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGNvbXB1dGUgYW55IHZhbHVlcywKLQkJLy8gYWxsIHZhbHVlcyBhcmUgcHVzaGVkIGJhY2sgaW50byB0aGUgdGFyZ2V0IG9uIHRoZSBpbml0aWFsIGNhbGwuCi0JCXJldHVybiBzdXBlci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLQl9Ci0KLQkvKioKLQkgKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0LiBvbiBlbnRyeTogVVVJRCwgbmFtZSwgY29udGFpbmluZyBwYWNrYWdlIChhbmQgcXVhbGlmaWVkIG5hbWUpLAotCSAqIGFuZCBkb2N1bWVudCBtdXN0IGJlIHNldC4gTWV0aG9kIGFkYXB0b3I6IC0gc2V0IG1vZGlmaWVycyAtIHNldCBuYW1lIC0gc2V0IHJldHVybiB0eXBlIC0gYWRkIHBhcmFtZXRlcnMgLSBhZGQgZXhjZXB0aW9ucwotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCXN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQkJdHJ5IHsKLQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9NRVRIT0QpOwotCQkJaWYgKGlzUmVzb3VyY2VMb2FkZWQoKSAmJiBnZXRTb3VyY2VQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VNZXRob2QoKSAhPSBudWxsICYmIHNvdXJjZU1ldGhvZC5leGlzdHMoKSkgewotCQkJCXNldE1vZGlmaWVycygpOwotCQkJCXNldE5hbWluZygpOwotCQkJCXNldFJldHVyblR5cGUoKTsKLQkJCQlhZGRQYXJhbWV0ZXJzKCk7Ci0JCQkJYWRkRXhjZXB0aW9ucygpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfTUVUSE9EKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBnZW5lcmF0ZWQgZmxhZyBpZiBAZ2VuZXJhdGVkIGlzIGZvdW5kIGluIHRoZSBzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0R2VuZXJhdGVkRmxhZygpIHsKLQkJTWV0aG9kIG1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZU1ldGhvZCgpLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaW50IGluZGV4ID0gc291cmNlLmluZGV4T2YoTWV0aG9kLkdFTkVSQVRFRF9DT01NRU5UX1RBRyk7Ci0JCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJbWV0aG9kVGFyZ2V0LnNldElzR2VuZXJhdGVkKHRydWUpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9TZXR0aW5nX0dlbkZsYWdfRVJST1JfIiwgbmV3IE9iamVjdFtdCi0JCQkvLyB7KChYTUlSZXNvdXJjZSltZXRob2RUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKG1ldGhvZFRhcmdldCksIG5wZS5nZXRNZXNzYWdlKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiZXJyb3Igc2V0dGluZyB0aGUgZ2VuZXJhdGVkIGZsYWcgb24KLQkJCS8vIHswfSwgZXhjZXB0aW9uOiB7MX0iCi0JCX0KLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YU1ldGhvZEFkYXB0ZXIjcmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChyZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSkgewotCQkJc2V0R2VuZXJhdGVkRmxhZygpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0UGFyYW1OYW1lc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkpIHsKLQkJCVN0cmluZyBbXSBwYXJhbU5hbWVzID0gZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJCUxpc3QgcGFyYW0gPSAoKE1ldGhvZEltcGwpZ2V0VGFyZ2V0KCkpLmdldFBhcmFtZXRlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCSgoSmF2YVBhcmFtZXRlcilwYXJhbS5nZXQoaSkpLnNldE5hbWUocGFyYW1OYW1lc1tpXSk7CQkJCQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJTWV0aG9kIG1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJbWV0aG9kVGFyZ2V0LnNldEZpbmFsKEZsYWdzLmlzRmluYWwoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpOwotCQkJbWV0aG9kVGFyZ2V0LnNldE5hdGl2ZShGbGFncy5pc05hdGl2ZShnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSk7Ci0JCQltZXRob2RUYXJnZXQuc2V0U3RhdGljKEZsYWdzLmlzU3RhdGljKGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKTsKLQkJCW1ldGhvZFRhcmdldC5zZXRTeW5jaHJvbml6ZWQoRmxhZ3MuaXNTeW5jaHJvbml6ZWQoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpOwotCQkJbWV0aG9kVGFyZ2V0LnNldENvbnN0cnVjdG9yKGdldFNvdXJjZU1ldGhvZCgpLmlzQ29uc3RydWN0b3IoKSk7Ci0KLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCQkvL1NldCBhYnN0cmFjdAotCQkJaWYgKGphdmFDbGFzcy5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBUeXBlS2luZC5JTlRFUkZBQ0UpCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEFic3RyYWN0KHRydWUpOwotCQkJZWxzZQotCQkJCW1ldGhvZFRhcmdldC5zZXRBYnN0cmFjdChGbGFncy5pc0Fic3RyYWN0KGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKTsKLQkJCS8vIFNldCB2aXNpYmlsaXR5Ci0JCQlpZiAoamF2YUNsYXNzLmdldEtpbmQoKS5nZXRWYWx1ZSgpID09IFR5cGVLaW5kLklOVEVSRkFDRSB8fCBGbGFncy5pc1B1YmxpYyhnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSkKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJCWVsc2UgaWYgKEZsYWdzLmlzUHJpdmF0ZShnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSkKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEVfTElURVJBTCk7Ci0JCQllbHNlIGlmIChGbGFncy5pc1Byb3RlY3RlZChnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSkKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRF9MSVRFUkFMKTsKLQkJCWVsc2UKLQkJCQkvL1Zpc2liaWxpdHkgbXVzdCBiZSBwYWNrYWdlCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKFJlc291cmNlSGFuZGxlcgotCQkJCQkJCS5nZXRTdHJpbmcoCi0JCQkJCQkJCQkiRXJyb3JfSW50cm9zcGVjdGluZ19GbGFnc19FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgKChYTUlSZXNvdXJjZSkgbWV0aG9kVGFyZ2V0LmVSZXNvdXJjZSgpKS5nZXRJRChtZXRob2RUYXJnZXQpLCBucGUuZ2V0TWVzc2FnZSgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJlcnJvciBpbnRyb3NwZWN0aW5nIGZsYWdzIG9uIHswfSwgZXhjZXB0aW9uOiB7MX0iCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZSAtIHF1YWxpZmllZCBuYW1lIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MgLSBJRCAtIG5hbWUtYmFzZWQgVVVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJLy8KLQkJLy8JbmFtaW5nIGlzIGN1cnJlbnRseSBhIG5vLW9wIHNpbmNlIHRoZSBuYW1lIGFuZCBVVUlEIG11c3QgYmUgc2V0IHByaW9yIHRvIHJlZmxlY3Rpb24KLQkJLy8JLi4uYW5kIElEIGlzIHJlZHVuZGFudCB3aXRoIFVVSUQuCi0JCS8vCWphdmFGaWVsZFRhcmdldC5zZXRJRChwYXJlbnQuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIl8iICsgamF2YUZpZWxkVGFyZ2V0LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgcmV0dXJuIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJldHVyblR5cGUoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0eXBlTmFtZSA9IHR5cGVOYW1lRnJvbVNpZ25hdHVyZShnZXRTb3VyY2VNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvLyBuYW1lIHN0YXlzIG51bGwgYW5kIHdlIGNhcnJ5IG9uCi0JCX0KLQkJaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLQkJCU1ldGhvZCBqYXZhTWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlqYXZhTWV0aG9kVGFyZ2V0LnNldEVUeXBlKGNyZWF0ZUphdmFDbGFzc1JlZih0eXBlTmFtZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMy8yMDAxIDEwOjA4OjM0IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTb3VyY2VNZXRob2QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VNZXRob2Qob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCBuZXdTb3VyY2VNZXRob2QpIHsKLQkJc291cmNlTWV0aG9kID0gbmV3U291cmNlTWV0aG9kOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1vZGVsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjZjJiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFNb2RlbExpc3RlbmVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MTM6NTMgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvMzEvMjAwMCAxOjEzOjEyIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0JCi0vKioKLSAqIEphdmFNb2RlbExpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhTW9kZWxMaXN0ZW5lcigpIHsKLQl0aGlzKEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9DSEFOR0UpOwotfQotCi1wdWJsaWMgSmF2YU1vZGVsTGlzdGVuZXIoaW50IGV2ZW50c1RvTGlzdGVuKSB7Ci0JSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLCBldmVudHNUb0xpc3Rlbik7Ci19Ci0vKioKLSAqIE9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2Ygb25lIG9yIG1vcmUgZWxlbWVudHMgbWFpbnRhaW5lZCBieQotICogdGhlIEphdmEgbW9kZWwgaGF2ZSBjaGFuZ2VkLiBUaGUgc3BlY2lmaWMgZGV0YWlscyBvZiB0aGUgY2hhbmdlCi0gKiBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiA8Y29kZT5FbGVtZW50Q2hhbmdlZEV2ZW50PC9jb2RlPi4KLSAqCi0gKiBAc2VlIEVsZW1lbnRDaGFuZ2VkRXZlbnQKLSAqLwotcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCXByb2Nlc3NEZWx0YSgoSUphdmFFbGVtZW50RGVsdGEpIGV2ZW50LmdldFNvdXJjZSgpKTsKLX0KLS8qKgotICogR2VuZXJpY2FsbHkgZGlzcGF0Y2ggdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWx0YS4KLSAqCi0gKi8KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGlsZHJlbihJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJcHJvY2Vzc0RlbHRhKGNoaWxkcmVuW2ldKTsKLQl9Ci19Ci0vKioKLSAqIFNvdXJjZSBjb250ZXh0IGhhcyBiZWVuIGNoYW5nZWQuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDM6NTg6MzEgUE0pCi0gKiBAcGFyYW0gcGFyYW0gb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGEKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbnRlbnRDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JICAvLyBvdmVycmlkZSB0byBpbXBsZW1lbnQgc3BlY2lmaWMgYmVoYXZpb3IKLX0KLS8qKgotICogRGlzcGF0Y2ggdGhlIGRldGFpbGVkIGhhbmRsaW5nIG9mIGFuIGVsZW1lbnQgY2hhbmdlZCBldmVudC4KLSAqCi0gKiBAc2VlIEVsZW1lbnRDaGFuZ2VkRXZlbnQKLSAqLwotcHVibGljIHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCi0Jc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCA6Ci0JCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJSmF2YU1vZGVsKSBlbGVtZW50LCBkZWx0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKLQkJCXByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoKElKYXZhUHJvamVjdCkgZWxlbWVudCwgZGVsdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6Ci0JCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCwgZGVsdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCwgZGVsdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgotCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudCwgZGVsdGEpOwotCQkJcHJvY2Vzc0NvbnRlbnRDaGFuZ2VkKGRlbHRhKSA7ICAgCi0JCQlicmVhazsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRSA6Ci0JCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJQ2xhc3NGaWxlKSBlbGVtZW50LCBkZWx0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6Ci0JCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJVHlwZSkgZWxlbWVudCwgZGVsdGEpOwotCQkJYnJlYWs7Ci0JCS8vIE5vdGU6IGlmIHdlIGFyZSB0byB1cGRhdGUgdGhlIE1ldGhvZC9GaWVsZCBhZGFwdGVycywgd2Ugc2hvdWxkIHByb2Nlc3MgdGhlCi0JCS8vICAgICAgIElKYXZhRWxlbWVudC5NRVRIT0QgYW5kIElKYXZhRWxlbWVudC5GSUVMRCAKLQl9CQotfQotLyoqCi0gKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0gKgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDbGFzc0ZpbGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkvLyBvdmVycmlkZSB0byBpbXBsZW1lbnQgc3BlY2lmaWMgYmVoYXZpb3IKLX0KLS8qKgotICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICoKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLX0KLS8qKgotICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICoKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJSmF2YU1vZGVsIGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLX0KLS8qKgotICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICoKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJSmF2YVByb2plY3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotfQotLyoqCi0gKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0gKgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotfQotLyoqCi0gKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0gKgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnRSb290IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLX0KLS8qKgotICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICoKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJVHlwZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCS8vIG92ZXJyaWRlIHRvIGltcGxlbWVudCBzcGVjaWZpYyBiZWhhdmlvcgotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0NsYXNzUGF0aENoYW5nZShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JcmV0dXJuIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCAmJiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpICE9IDApIHx8ICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpICE9IDApIHx8ICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFT1JERVIpICE9IDApKTsKLX0KLQotLyoqCi0gKiBNZXRob2QgaXNDbGFzc3BhdGhSZXNvdXJjZUNoYW5nZS4KLSAqIEBwYXJhbSBkZWx0YQotICogQHJldHVybiBib29sZWFuCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGlzQ2xhc3NwYXRoUmVzb3VyY2VDaGFuZ2UoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKQotCQlyZXR1cm4gdHJ1ZTsKLQlJUmVzb3VyY2VEZWx0YVtdIHJlc291cmNlcyA9IGRlbHRhLmdldFJlc291cmNlRGVsdGFzKCk7Ci0JaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JSVBhdGggcGF0aCA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHJlc291cmNlc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJcGF0aCA9IHJlc291cmNlc1tpXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQlpZiAoaXNBbHNvQ2xhc3NwYXRoQ2hhbmdlKHBhdGgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBJcyB0aGlzIHBhdGggYWxzbyBhIGNsYXNzcGF0aCBjaGFuZ2UgdHlwZSBvZiByZXNvdXJjZS4gSWYgc28sIHJldHVybiB0cnVlLgotICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuIERlZmF1bHQgaXMgZmFsc2UuCi0gKiBAcGFyYW0gcGF0aAotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNBbHNvQ2xhc3NwYXRoQ2hhbmdlKElQYXRoIHBhdGgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCBjaGVjayB0byBzZWUgaWYgYSA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4gaXMgYSBwcm9qZWN0IGluIHRoZQotICogY2xhc3NwYXRoIG9mIHRoZSBhZGFwdGVyRmFjdG9yeSBqYXZhIHByb2plY3QuCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGlzSW5DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JSUphdmFQcm9qZWN0IGFkYXB0ZXJKYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCk7Ci0JaWYgKGphdmFQcm9qZWN0LmVxdWFscyhhZGFwdGVySmF2YVByb2plY3QpKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gaXNJbkNsYXNzcGF0aChqYXZhUHJvamVjdCwgYWRhcHRlckphdmFQcm9qZWN0LCB0cnVlLCBuZXcgSGFzaFNldCgpKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGphdmEgcHJvamVjdCB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLgotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHJvdGVjdGVkIGFic3RyYWN0IElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCi0vKgotICogdGVzdCB0byBzZWUgaWYgdGhlIHRlc3RQcm9qZWN0IGlzIGluIHRoZSBjbGFzc3BhdGggKGluY2x1ZGluZyBmcm9tIGFueSByZWZlcmVuY2VkIHByb2plY3RzKSBvZiB0aGUgdGFyZ2V0IHByb2plY3QuCi0gKiBLZWVwIHRyYWNrIG9mIHRob3NlIGFscmVhZHkgdmlzaXRlZCBzbyBhcyBub3QgdG8gdmlzaXQgYWdhaW4uCi0gKiBUT0RPIFRoaXMgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZS4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNJbkNsYXNzcGF0aChJSmF2YVByb2plY3QgdGVzdFByb2plY3QsIElKYXZhUHJvamVjdCB0YXJnZXRQcm9qZWN0LCBib29sZWFuIGlzRmlyc3RMZXZlbCwgU2V0IHZpc2l0ZWQpIHsKLQlpZiAodmlzaXRlZC5jb250YWlucyh0YXJnZXRQcm9qZWN0KSkKLQkJcmV0dXJuIGZhbHNlOwotCXZpc2l0ZWQuYWRkKHRhcmdldFByb2plY3QpOwotCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBudWxsOwotCXRyeSB7Ci0JCWVudHJpZXMgPSB0YXJnZXRQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCByZXNFbnRyeTsKLQlJSmF2YVByb2plY3QgcHJvaiA9IG51bGw7Ci0JTGlzdCBwcm9qZWN0cyA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWVudHJ5ID0gZW50cmllc1tpXTsKLQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewotCQkJcmVzRW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJ5KTsKLQkJCXByb2ogPSBnZXRKYXZhUHJvamVjdChlbnRyeSk7Ci0JCQlpZiAoaXNGaXJzdExldmVsIHx8IHJlc0VudHJ5LmlzRXhwb3J0ZWQoKSkgewotCQkJCWlmIChwcm9qLmVxdWFscyh0ZXN0UHJvamVjdCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgewotCQkJCQlpZiAocHJvamVjdHMgPT0gbnVsbCkKLQkJCQkJCXByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlwcm9qZWN0cy5hZGQocHJvaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBpc0luQ2xhc3NwYXRoKHRlc3RQcm9qZWN0LCBwcm9qZWN0cywgZmFsc2UsIHZpc2l0ZWQpOwotfQotCi0vKgotICogU2VlIGlmIHRoZSB0ZXN0UHJvamVjdCBpcyBpbiB0aGUgY2xhc3NwYXRoIG9mIGFueSBvZiB0aGUgbGlzdCBvZiBwcm9qZWN0cyBvciBpbiBhbnkgcHJvamVjdCB0aGF0IGFuIGVudHJ5Ci0gKiBpbiB0aGUgbGlzdCBtYXkgb2YgdmlzaXRlZC4KLSAqIFRPRE8gVGhpcyBzaG91bGQgYmUgbWFkZSBwcml2YXRlLgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0luQ2xhc3NwYXRoKElKYXZhUHJvamVjdCB0ZXN0UHJvamVjdCwgTGlzdCBzb21lSmF2YVByb2plY3RzLCBib29sZWFuIGlzRmlyc3RMZXZlbCwgU2V0IHZpc2l0ZWQpIHsKLQlpZiAoc29tZUphdmFQcm9qZWN0cyA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JaW50IHNpemUgPSBzb21lSmF2YVByb2plY3RzLnNpemUoKTsKLQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBudWxsOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCWphdmFQcm9qID0gKElKYXZhUHJvamVjdCkgc29tZUphdmFQcm9qZWN0cy5nZXQoaSk7Ci0JCXJldHVybiBpc0luQ2xhc3NwYXRoKHRlc3RQcm9qZWN0LCBqYXZhUHJvaiwgaXNGaXJzdExldmVsLCB2aXNpdGVkKTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCUlQcm9qZWN0IHByb2ogPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7Ci0JaWYgKHByb2ogIT0gbnVsbCkKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qKTsKLQlyZXR1cm4gbnVsbDsKLX0KLQotcHJvdGVjdGVkIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0JcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFSZWZsZWN0aW9uU3luY2hyb25pemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFSZWZsZWN0aW9uU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjllYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhUmVmbGVjdGlvblN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzEvMjAwMCAxMTo0MjowNSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIGV4dGVuZHMgSmF2YU1vZGVsTGlzdGVuZXIgewotCQotCXByb3RlY3RlZCBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGZBZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoZWRBbGwgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCBmbHVzaFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGZsdXNoVHlwZVBsdXNJbm5lciA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBub3RpZmljYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCS8qKgotCSAqIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyKEphdmFKRE9NQWRhcHRlckZhY3Rvcnkgc3luY2hyb25pemVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZBZGFwdGVyRmFjdG9yeSA9IHN5bmNocm9uaXplZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjZ2V0SmF2YVByb2plY3QoKQotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyRmFjdG9yeSgpLmdldEphdmFQcm9qZWN0KCk7Ci0JfQkKLQkvKioKLQkgKiBUZWxsIHRoZSByZWZsZWN0aW9uIGZhY3RvcnkgdG8gZmx1c2ggdGhlIHBhc3NlZCBJVHlwZQotCSAqLwotCXByb3RlY3RlZCBOb3RpZmljYXRpb24gZG9GbHVzaChJVHlwZSBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyRmFjdG9yeSgpLmZsdXNoUmVmbGVjdGlvbk5vTm90aWZpY2F0aW9uKGVsZW1lbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCX0KLQkKLQkvKgotCSAqIEZsdXNoIHRoZSBjb21waWxhdGlvbiB1bml0IGFuZCBhbnkgaW5uZXIgY2xhc3NlcyBzaW5jZSB3ZSBkb24ndCBpZiB0aGV5IG1heSBvciBtYXkgbm90IG9mIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIE5vdGlmaWNhdGlvbiBkb0ZsdXNoKElDb21waWxhdGlvblVuaXQgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlckZhY3RvcnkoKS5mbHVzaFJlZmxlY3Rpb25QbHVzSW5uZXJOb05vdGlmaWNhdGlvbihnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2goSVR5cGUgZWxlbWVudCkgewotCQlpZiAoIWZsdXNoVHlwZXMuY29udGFpbnMoZWxlbWVudCkpCi0JCQlmbHVzaFR5cGVzLmFkZChlbGVtZW50KTsKLQl9Ci0JLyoKLQkgKiBmbHVzaCB0aGUgY29tcGlsYXRpb24gdW5pdC4gU2luY2Ugd2UgZG9uJ3Qga25vdyBpZiBpbm5lciBjbGFzc2VzIG1heSBhbHNvCi0JICogb2YgYmVlbiBhZmZlY3RlZCwgdGhleSB0byB3aWxsIGJlIGZsdXNoZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2goSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50KSB7Ci0JCWlmICghZmx1c2hUeXBlUGx1c0lubmVyLmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJZmx1c2hUeXBlUGx1c0lubmVyLmFkZChlbGVtZW50KTsJCQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JCW5vdGlmaWNhdGlvbnMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3J5KCkuZmx1c2hQYWNrYWdlTm9Ob3RpZmljYXRpb24ocGFja2FnZU5hbWUsIHRydWUpKTsKLQl9Ci0JcHJvdGVjdGVkIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmQWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEIDogewotCQkJCS8vIEEgZmlsZSBzYXZlIGhhZCBvY2N1cnJlZC4gSXQgZG9lc24ndCBtYXR0ZXIgaWYgY3VycmVudGx5IHdvcmtpbmcgY29weSBvciBub3QuCi0JCQkJLy8gSXQgbWVhbnMgc29tZXRoaW5nIGhhcyBjaGFuZ2VkIHRvIHRoZSBmaWxlIG9uIGRpc2ssIGJ1dCBkb24ndCBrbm93IHdoYXQuCi0JCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSAhPSAwKSB7Ci0JCQkJCWZsdXNoKGVsZW1lbnQpOwkvLyBGbHVzaCBldmVyeXRoaW5nLCBpbmNsdWRpbmcgaW5uZXIgY2xhc3Nlcy4JCQkJCQotCQkJCX0gZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpID09IDAgJiYgCi0JCQkJCQkoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pICE9IDApICAvL0EgdHlwZSBtYXkgaGF2ZSBiZWVuIGFkZGVkIG9yIHJlbW92ZWQuCi0JCQkJCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgOgotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCA6Ci0JCQkJaWYgKCFlbGVtZW50LmlzV29ya2luZ0NvcHkoKSkKLQkJCQkJZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFQcm9qZWN0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChpc0luQ2xhc3NwYXRoKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpIHsKLQkJCQlpZiAoZWxlbWVudC5lcXVhbHMoZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRKYXZhUHJvamVjdCgpKSkKLQkJCQkJc3RvcFN5bmNocm9uaXplcigpOwotCQkJCWVsc2UKLQkJCQkJZmx1c2hBbGwoKTsgLy9hbm90aGVyIGRlcGVuZGVudCBwcm9qZWN0IGhhcyBjaGFuZ2VkIHNvIGZsdXNoIGFsbCB0byBiZSBzYWZlCi0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQgfHwgaXNDbGFzc3BhdGhSZXNvdXJjZUNoYW5nZShkZWx0YSkpIHsKLQkJCQlmbHVzaEFsbCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNsYXNzRmlsZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCB8fCBraW5kID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQkvLyBJdCBkb2Vzbid0IG1hdHRlciBpZiB0b3RhbGx5IHJlbW92ZWQgb3IganVzdCBtb3ZlZCBzb21ld2hlcmUgZWxzZSwgd2Ugd2lsbCBjbGVhciBvdXQgYW5kIHJlbW92ZSB0aGUKLQkJCS8vIGFkYXB0ZXIgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhIHJlbmFtZSB3aGljaCB3b3VsZCBiZSBhIGRpZmZlcmVudCBjbGFzcy4KLQkJCS8vIEN1cnJlbnRseSB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGRlbGV0ZWQgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBmaW5kIHRoZSB0eXBlcyBpbiB0aGUgdW5pdCB0byByZW1vdmUuCi0JCQkvLyBTbyBpbnN0ZWFkIHdlIGFzayBmYWN0b3J5IHRvIHJlbW92ZSBhbGwgaXQgYW55IHRoYXQgc3RhcnQgd2l0aCBpdCBwbHVzIGZvciBpbm5lciBjbGFzc2VzLgotCQkJZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCkpOwotCQkJcmV0dXJuOyAvLyBTaW5jZSB0aGUgY2xhc3NmaWxlIHdhcyByZW1vdmVkIHdlIGRvbid0IG5lZWQgdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW4gKGFjdHVhbGx5IHRoZSBjaGlsZHJlbiBsaXN0IHdpbGwgYmUgZW1wdHkKLQkJfQotCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7Ci0JCQlwcm9jZXNzRGVsdGEoY2hpbGRyZW5baWldKTsKLQkJfQotCX0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnRSb290IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChmbHVzaGVkQWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGFzc1BhdGhDaGFuZ2UoZGVsdGEpKQotCQkJZmx1c2hBbGwoKTsKLQkJZWxzZQotCQkJc3VwZXIucHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChlbGVtZW50LCBkZWx0YSk7Ci0JfQotCQotCS8qIAotCSAqIFdlIHdpbGwgZm9yY2UgdGhlIGZsdXNoaW5nIG9mIGFsbCBhZGFwdG9ycyBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZS4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBpZiBhIHR5cGUgd2FzIHJlZmxlY3RlZCBwcmlvciB0byB0aGUgcGFja2FnZSBleGlzdGluZyBvcgotCSAqIGlmIHRoZSBwYWNrYWdlIGlzIGRlbGV0ZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhTW9kZWxMaXN0ZW5lciNwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCA6IHsKLQkJCQlpZiAoZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA9PSAwKQotCQkJCQlmbHVzaFBhY2thZ2UoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCksIHRydWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIDp7Ci0JCQkJaWYgKGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCkKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5mbHVzaFBhY2thZ2UoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCksIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOgotCQkJCXN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoZWxlbWVudCwgZGVsdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJVHlwZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCB8fCBraW5kID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQlkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoZWxlbWVudC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmbHVzaChlbGVtZW50KTsKLQkJCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JCQkvLyBOb3RlLCBpZiBhIG1ldGhvZCBlbGVtZW50IG9yIGEgZmllbGQgd2FzIGNoYW5nZWQsIHRoZXJlIG1heSBiZSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkKLQkJCS8vICAgICAgIHRoYXQgd2lsbCBoYXZlIHRvIGJlIHByb2Nlc3NlZCBpZiB3ZSBhcmUgdG8gdXBkYXRlIHRoZSBKYXZhTWV0aG9kL0phdmFGaWVsZCBKRE9NQWRhcHRvciBzLgkKLQkJfQotCX0KLQkvKioKLQkgKiBHaXZlbiB0aGF0IGFuIElUeXBlIGRvZXMgbm90IGV4aXN0cyBhbnltb3JlLCBhc3N1bWUKLQkgKiB0aGF0IHRoZSB0eXBlJ3MgbmFtZSBpcyBwYWNrYWdlLmZpbGVuYW1lICh3aXRob3V0IHRoZSAuamF2YSkKLQkgKiBJZiB3ZSBhcmUgd3JvbmcgKGlmLCB0aGVuIGEgcmFyZSBjYXNlKSwgIHdlIHdpbGwgZmx1c2guCi0JICogTmV4dCBhY2Nlc3Mgd2lsbCBpbmR1Y2UgYSByZWZsZWN0aW9uIGF0dGVtcHQuCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBpdCBpcyBldmVyIGNhbGxlZC4gSXQgc29tZW9uZSBlbHNlIGNhbGxzIGl0LCBwbGVhc2UgY29udGFjdCBkZXZlbG9wbWVudCB0byBzZWUgaWYgcmlnaHQgbWV0aG9kIHRvIGJlIGNhbGxlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVtb3ZlT3JBZGQoSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50KSB7Ci0JCWRpc0Fzc29jaWF0ZVNvdXJjZShnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpKTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxsTmFtZUZyb21FbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPD0gNSB8fCAhbmFtZS5zdWJzdHJpbmcobmFtZS5sZW5ndGgoKSAtIDUpLmVxdWFscygiLmphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBTaG91bGQgbm90IGJlIGhlcmUsIAotCQkJTG9nZ2VyIGxvZ2dlciA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkKLQkJCQlsb2dnZXIubG9nKCJJbnZhbGlkIC5qYXZhIGZpbGU6ICIgKyBuYW1lLCBMZXZlbC5GSU5FKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gTWFrZSBhIGd1ZXNzLCBhdCB3b3JzdCBjYXNlLCBub3RoaW5nIHdpbGwgY29tZSBvdXQgb2YgdGhpcy4KLQkJCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ID49IDApCi0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSArICIuamF2YSI7IC8vIHJlbmFtZSB0aGUgZXh0ZW5zaW9uIHRvIC5qYXZhIC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQluYW1lID0gbmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpID09IG51bGwgfHwgZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDUpOwotCQllbHNlCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpICsgIi4iICsgbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDUpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIFN0b3AgdGhlIHN5bmNocm9uaXplciBmcm9tIGxpc3RlbmluZyB0byBhbnkgbW9yZSBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BTeW5jaHJvbml6ZXIoKSB7Ci0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXRyeSB7Ci0JCQlmbHVzaFR5cGVzLmNsZWFyKCk7Ci0JCQlmbHVzaFR5cGVQbHVzSW5uZXIuY2xlYXIoKTsKLQkJCW5vdGlmaWNhdGlvbnMuY2xlYXIoKTsKLQkJCXN1cGVyLmVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJCWZsdXNoVHlwZXMoKTsKLQkJCXByb2Nlc3NOb3RpZmljYXRpb25zKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmbHVzaGVkQWxsID0gZmFsc2U7Ci0JCQlmbHVzaFR5cGVzLmNsZWFyKCk7Ci0JCQlmbHVzaFR5cGVQbHVzSW5uZXIuY2xlYXIoKTsKLQkJCW5vdGlmaWNhdGlvbnMuY2xlYXIoKTsKLQkJfQotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmx1c2hUeXBlcygpIHsKLQkJaWYgKCFmbHVzaFR5cGVzLmlzRW1wdHkoKSkgewotCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQlOb3RpZmljYXRpb24gbm90OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbHVzaFR5cGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJdHlwZSA9IChJVHlwZSkgZmx1c2hUeXBlcy5nZXQoaSk7Ci0JCQkJbm90ID0gZG9GbHVzaCh0eXBlKTsKLQkJCQlpZiAobm90ICE9IG51bGwpCi0JCQkJCW5vdGlmaWNhdGlvbnMuYWRkKG5vdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmbHVzaFR5cGVQbHVzSW5uZXIuaXNFbXB0eSgpKSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBudWxsOwotCQkJTm90aWZpY2F0aW9uIG5vdDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmx1c2hUeXBlUGx1c0lubmVyLnNpemUoKTsgaSsrKSB7Ci0JCQkJdW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBmbHVzaFR5cGVQbHVzSW5uZXIuZ2V0KGkpOwotCQkJCW5vdCA9IGRvRmx1c2godW5pdCk7Ci0JCQkJaWYgKG5vdCAhPSBudWxsKQotCQkJCQlub3RpZmljYXRpb25zLmFkZChub3QpOwotCQkJfQotCQl9CQkKLQl9Ci0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc05vdGlmaWNhdGlvbnMoKSB7Ci0JCU5vdGlmaWVyIG5vdGlmaWVyOwotCQlOb3RpZmljYXRpb24gbm90OwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdGlmaWNhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCW5vdCA9IChOb3RpZmljYXRpb24pIG5vdGlmaWNhdGlvbnMuZ2V0KGkpOwotCQkJbm90aWZpZXIgPSAoTm90aWZpZXIpIG5vdC5nZXROb3RpZmllcigpOwotCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJbm90aWZpZXIuZU5vdGlmeShub3QpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZyhlKTsgLy9jYXRjaCBleGNlcHRpb25zIHNvIGFsbCBub3RpZmljYXRpb25zIGFyZSBwcm9jZXNzZWQKLQkJCQl9IAotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlOb3RpZmljYXRpb24gbm90ID0gZ2V0QWRhcHRlckZhY3RvcnkoKS5kaXNBc3NvY2lhdGVTb3VyY2UocXVhbGlmaWVkTmFtZSwgZmFsc2UpOwotCQlpZiAobm90ICE9IG51bGwpCi0JCQlub3RpZmljYXRpb25zLmFkZChub3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJTm90aWZpY2F0aW9uIG5vdCA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKHF1YWxpZmllZE5hbWUsIGZhbHNlKTsKLQkJaWYgKG5vdCAhPSBudWxsKQotCQkJbm90aWZpY2F0aW9ucy5hZGQobm90KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZmx1c2hBbGwoKSB7Ci0JCW5vdGlmaWNhdGlvbnMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3J5KCkuZmx1c2hBbGxOb05vdGlmaWNhdGlvbigpKTsKLQkJZmx1c2hlZEFsbCA9IHRydWU7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjcHJvY2Vzc0NoaWxkcmVuKElKYXZhRWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoaWxkcmVuKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoIWZsdXNoZWRBbGwpCi0JCQlzdXBlci5wcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFNb2RlbExpc3RlbmVyI3Byb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKCFmbHVzaGVkQWxsKQotCQkJc3VwZXIucHJvY2Vzc0RlbHRhKGRlbHRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSUphdmFQcm9qZWN0SW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0lKYXZhUHJvamVjdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMzEwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSUphdmFQcm9qZWN0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDUvMDcvMDEgMTA6MDY6MjggUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFQcm9qZWN0SW5mbyB7Ci1wdWJsaWMgU3RyaW5nIGdldFNvdXJjZVBhdGgoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhRU1GTmF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YUVNRk5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmY5YzMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhRU1GTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luOwotLyoKLSAqICRSQ1NmaWxlOiBKYXZhRU1GTmF0dXJlLmphdmEsdiAkICRSZXZpc2lvbjogMS4xNSAkICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjI3ICQKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFYTUlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5JSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIEphdmFFTUZOYXR1cmUgZXh0ZW5kcyBFTUZOYXR1cmUgaW1wbGVtZW50cyBJSmF2YUVNRk5hdHVyZSB7Ci0vKioKLSAqIEphdmFNT0ZOYXR1cmVSdW50aW1lIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhRU1GTmF0dXJlKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEdldCBhIElKYXZhTU9GTmF0dXJlUnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdXBwbGllZCBwcm9qZWN0LgotICogQHJldHVybiBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUKLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIEphdmFFTUZOYXR1cmUgY3JlYXRlUnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JaWYoIWhhc1J1bnRpbWUocHJvamVjdCkpCi0JCWlmIChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkuZXhpc3RzKCkpCi0JCQlhZGROYXR1cmVUb1Byb2plY3QocHJvamVjdCwgSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0KLQlyZXR1cm4gZ2V0UnVudGltZShwcm9qZWN0KTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIG5hdHVyZSdzIElELgotICovCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYXR1cmVJRCgpIHsKLQlyZXR1cm4gSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGlzIG5hdHVyZSBpcyBjb250YWluZWQgd2l0aGluLgotICovCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQlyZXR1cm4gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci19Ci0vKioKLSAqIEdldCBhIElKYXZhTU9GTmF0dXJlUnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdXBwbGllZCBwcm9qZWN0LgotICogRmlyc3QgY2hlY2sgZm9yIHJlZ2lzdGVyZWQgbmF0dXJlcy4KLSAqIEByZXR1cm4gSUphdmFNT0ZOYXR1cmVSdW50aW1lCi0gKiBAcGFyYW0gcHJvamVjdCBjb20uaWJtLml0cC5jb3JlLmFwaS5yZXNvdXJjZXMuSVByb2plY3QKLSAqLwotcHVibGljIHN0YXRpYyBKYXZhRU1GTmF0dXJlIGdldFJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCUphdmFFTUZOYXR1cmUgbmF0dXJlID0gbnVsbDsKLQlMaXN0IHJ1bnRpbWVzID0gRU1GTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lcyhwcm9qZWN0KTsKLQlmb3IgKGludCBpPTA7IGk8cnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJaWYgKHJ1bnRpbWVzLmdldChpKSBpbnN0YW5jZW9mIEphdmFFTUZOYXR1cmUpCi0JCQluYXR1cmUgPSAoSmF2YUVNRk5hdHVyZSkgcnVudGltZXMuZ2V0KGkpOwotCX0KLQlpZiAobmF0dXJlID09IG51bGwpCi0JCW5hdHVyZSA9IHByaW1HZXRSdW50aW1lKHByb2plY3QpOwotCXJldHVybiBuYXR1cmU7Ci19Ci0vKioKLSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvamVjdCBoYXMgYSBydW50aW1lIGNyZWF0ZWQgb24gaXQuCi0gKiBDaGVjayBmb3IgcmVnaXN0ZXJlZCBuYXR1cmVzIGZpcnN0LgotICogQHJldHVybiBib29sZWFuCi0gKiBAcGFyYW0gcHJvamVjdCBjb20uaWJtLml0cC5jb3JlLmFwaS5yZXNvdXJjZXMuSVByb2plY3QKLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCUphdmFFTUZOYXR1cmUgbmF0dXJlID0gbnVsbDsKLQlMaXN0IHJ1bnRpbWVzID0gRU1GTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lcyhwcm9qZWN0KTsKLQlmb3IgKGludCBpPTA7IGk8cnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJaWYgKHJ1bnRpbWVzLmdldChpKSBpbnN0YW5jZW9mIEphdmFFTUZOYXR1cmUpCi0JCQluYXR1cmUgPSAoSmF2YUVNRk5hdHVyZSkgcnVudGltZXMuZ2V0KGkpOwotCX0KLQlpZiAobmF0dXJlID09IG51bGwpCi0JCXJldHVybiBwcmltSGFzUnVudGltZShwcm9qZWN0KTsKLQllbHNlCi0JCXJldHVybiB0cnVlOwotCi19Ci0vKioKLSAqIEdldCBhIElKYXZhTU9GTmF0dXJlUnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdXBwbGllZCBwcm9qZWN0LgotICogRG8gbm90IGNoZWNrIGZvciBvdGhlciByZWdpc3RlcmVkIHR5cGVzLgotICogQHJldHVybiBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUKLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIEphdmFFTUZOYXR1cmUgcHJpbUdldFJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCXRyeSB7Ci0JCXJldHVybiAoSmF2YUVNRk5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUoSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEKTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHByb2plY3QgaGFzIGEgcnVudGltZSBjcmVhdGVkIG9uIGl0LgotICogRG8gbm90IGNoZWNrIGZvciByZWdpc3RlcmVkIG5hdHVyZSBpZHMuCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJpbUhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCXRyeSB7Ci0JCXJldHVybiBwcm9qZWN0Lmhhc05hdHVyZShJSmF2YUVNRk5hdHVyZS5OQVRVUkVfSUQpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi0vKioKLSAqIHByaW1hcnkgY29udHJpYnV0ZSB0byBjb250ZXh0Ci0gKi8KLXB1YmxpYyB2b2lkIHByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGFOYXR1cmUpIHsKLQlpZiAoZW1mQ29udGV4dCA9PSBhTmF0dXJlKSByZXR1cm47Ci0JZW1mQ29udGV4dCA9IGFOYXR1cmU7Ci0JUmVzb3VyY2VTZXQgc2V0ID0gYU5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCXNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkucHV0KEphdmFYTUlGYWN0b3J5LlNDSEVNRSwgSmF2YVhNSUZhY3RvcnkuSU5TVEFOQ0UpOwkKLQlXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQljb25maWd1cmVVUklDb252ZXJ0ZXIoY29udik7Ci0JYWRkQWRhcHRlckZhY3RvcmllcyhzZXQpOwkKLX0KLQotLyoqCi0gKiBzZWNvbmRhcnkgY29udHJpYnV0ZSB0byBjb250ZXh0Ci0gKi8KLXB1YmxpYyB2b2lkIHNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSkgewotCXByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KGFOYXR1cmUpOwotfQotCi0vKioKLSAqIFJlbW92ZSB0aGUgcHJvamVjdCBhcyBhIGNvbnRhaW5lciBmcm9tIHRoZSBjb252ZXJ0ZXIgYW5kIGFkZAotICogdGhlIHNvdXJjZSBmb2xkZXIuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVVSSUNvbnZlcnRlcihXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY29udikgewotCWNvbnYucmVtb3ZlSW5wdXRDb250YWluZXIoZ2V0UHJvamVjdCgpKTsKLQljb252LmFkZElucHV0Q29udGFpbmVyKGdldEVNRlJvb3QoKSk7Ci19Ci0KLS8qKgotICogQWRkIEFkYXB0b3IgZmFjdG9yaWVzIHRvIGFDb250ZXh0IHdoaWNoIGlzIG5vdwotICogYmVpbmcgdXNlZCBmb3IgdGhpcyBuYXR1cmUuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGFkZEFkYXB0ZXJGYWN0b3JpZXMoUmVzb3VyY2VTZXQgYVNldCkgewotCWFkZEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcmllcyhhU2V0KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yaWVzKFJlc291cmNlU2V0IGFTZXQpIHsKLQlMaXN0IGZhY3RvcmllcyA9IGFTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCS8vIFRoZSBjb250ZXh0IG1heSBhbHJlYWR5IGhhdmUgYSBKYXZhUmVmbGVjdGlvbiBhZGFwdG9yIGZhY3RvcnksIHNvIHJlbW92ZSBpdAotCWlmICghZmFjdG9yaWVzLmlzRW1wdHkoKSkgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KGZhY3RvcmllcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJZmFjdG9yaWVzLnJlbW92ZShmYWN0b3J5KTsKLQl9Ci0JLy8gVGhpcyBzaG91bGQgbWF5YmUgYmUgY29uc2lkZXJlZCBhIGxvZ2ljIGVycm9yLCBidXQgd2UgY2FuIHJlY292ZXIgZWFzaWx5Ci0JZmFjdG9yaWVzLmFkZChuZXcgSmF2YUpET01BZGFwdGVyRmFjdG9yeShKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpKSk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDYwZjJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW47Ci0vKgotICogJFJDU2ZpbGU6IEphdmFQbHVnaW4uamF2YSx2ICQgJFJldmlzaW9uOiAxLjEwICQgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MjcgJAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGsuSmF2YUpES0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkVjbGlwc2VMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyBhIHRvcC1sZXZlbCBjbGFzcyBvZiB0aGUgamF2YSBwbHVnaW4gdG9vbC4KLSAqIAotICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIFVJIHBsdWdpbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgSmF2YVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhUGx1Z2luIElOU1RBTkNFOwotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSmF2YSBwbHVnaW4gYW5kIGNhY2hlIGl0cyBkZWZhdWx0IGluc3RhbmNlCi0JICovCi0JcHVibGljIEphdmFQbHVnaW4oKSB7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKQotCQkJbG9nZ2VyID0gRWNsaXBzZUxvZ2dlci5nZXRFY2xpcHNlTG9nZ2VyKHRoaXMpOwotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGx1Z2luIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIEphdmFQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlKYXZhUmVmRmFjdG9yeUltcGwuc2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoSmF2YUpET01BZGFwdGVyRmFjdG9yeS5jbGFzcyk7Ci0JCUpFTVV0aWxQbHVnaW4uZ2V0UGx1Z2luUmVzb3VyY2VTZXQoKS5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBKYXZhSkRLQWRhcHRlckZhY3RvcnkoKSk7CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUHJvamVjdEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUHJvamVjdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmM2M0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVByb2plY3RJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW47Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUHJvamVjdEluZm8uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkIAotICovCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDUvMDcvMDEgMTA6MDk6MjYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdEluZm8gaW1wbGVtZW50cyBJSmF2YVByb2plY3RJbmZvIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0pBVkFfT1VUUFVUX1BBVEggPSAiYmluIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9TT1VSQ0VfUEFUSCA9ICJzb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZVBhdGg7Ci0vKioKLSAqIEphdmFQcm9qZWN0SW5mbyBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YVByb2plY3RJbmZvKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQotICovCi1wcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTb3VyY2VQYXRoKCkgewotCXJldHVybiBERUZBVUxUX1NPVVJDRV9QQVRIOwotfQotLyoqCi0gKiBHZXQgdGhlIGNsYXNzIHBhdGggZm9yIHRoZSByZWNpZXZlci4gQnkgZGVmYXVsdCBhc2sgdGhlIHRlbXBsYXRlCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIFN0cmluZyBnZXRTb3VyY2VQYXRoKCkgewotCWlmIChzb3VyY2VQYXRoID09IG51bGwpCi0JCXNvdXJjZVBhdGggPSBnZXREZWZhdWx0U291cmNlUGF0aCgpOwotCXJldHVybiBzb3VyY2VQYXRoOwotfQotcHVibGljIHZvaWQgc2V0U291cmNlUGF0aChTdHJpbmcgcGF0aCkgewotCXNvdXJjZVBhdGggPSBwYXRoOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvQVNUQm91bmRSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvQVNUQm91bmRSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2FmZWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0FTVEJvdW5kUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBU1RCb3VuZFJlc29sdmVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MTM6NTMgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULkludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotIAotLyoqCi0gKiBUaGlzIHdvcmtzIG9uIHJlc29sdmVkIEFTVCBub2Rlcy4gSWYgdGhlIG5vZGVzIGhhZCBub3QgYmVlbiByZXNvbHZlZCwgdGhpcyB3aWxsIHJldHVybiBub3RpbmcuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNUQm91bmRSZXNvbHZlciBleHRlbmRzIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULklSZXNvbHZlciNyZXNvbHZlTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIHJlc29sdmVOYW1lKE5hbWUgbmFtZSkgewotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlpZiAoYmluZGluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlzd2l0Y2ggKGJpbmRpbmcuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElCaW5kaW5nLlRZUEU6Ci0JCQkJU3RyaW5nIHR5cGVuYW1lID0gZ2V0VHlwZU5hbWUoKElUeXBlQmluZGluZykgYmluZGluZyk7Ci0JCQkJUFROYW1lIHB0bmFtZSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE5hbWUoKTsKLQkJCQlwdG5hbWUuc2V0TmFtZSh0eXBlbmFtZSk7Ci0JCQkJcmV0dXJuIHB0bmFtZTsKLQkJCWNhc2UgSUJpbmRpbmcuVkFSSUFCTEU6Ci0JCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoSVZhcmlhYmxlQmluZGluZykgYmluZGluZzsKLQkJCQlpZiAodmFyaWFibGVCaW5kaW5nLmlzRmllbGQoKSkgewotCQkJCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWModmFyaWFibGVCaW5kaW5nLmdldE1vZGlmaWVycygpKSkgewotCQkJCQkJUFRGaWVsZEFjY2VzcyBmYSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEZpZWxkQWNjZXNzKCk7Ci0JCQkJCQkvLyBJZiBqdXN0IGEgc2ltcGxlIG5hbWUsIHRoZW4gaXQgaXMgbGlrZSB0aGlzLmZpZWxkLCBzbyBubyByZWNlaXZlci4gTm90IHN1cmUgaG93IHRvIGhhbmRsZSB0aGlzIHlldC4KLQkJCQkJCWlmIChuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKSB7Ci0JCQkJCQkJLy8gVGhlcmUgYXJlIHBhcnRzIGJlZm9yZSB0aGlzIG9uZS4gR2V0IHRoZW0gYXMgYW4gZXhwcmVzc2lvbiAoZWl0aGVyIGEgbmFtZSwgb3IgYW5vdGhlciBmaWVsZCBhY2Nlc3MpCi0JCQkJCQkJZmEuc2V0UmVjZWl2ZXIocmVzb2x2ZU5hbWUoKChRdWFsaWZpZWROYW1lKSBuYW1lKS5nZXRRdWFsaWZpZXIoKSkpOwotCQkJCQkJfQotCQkJCQkJZmEuc2V0RmllbGQodmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKSk7Ci0JCQkJCQlyZXR1cm4gZmE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvd0ludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5BU1RCb3VuZFJlc29sdmVyX0Nhbm5vdEhhbmRsZUxvY2FsRmllbGRfRVhDXywgbmV3IE9iamVjdFtde3ZhcmlhYmxlQmluZGluZy5nZXROYW1lKCl9KSk7IAotLy8JCQkJCQlwdXNoKG5ldyBQdXNoRmllbGRWYXJpYWJsZSh2YXJpYWJsZUlkLCBnZXRUeXBlU2lnbmF0dXJlKGRlY2xhcmluZ1R5cGVCaW5kaW5nKSwgZkNvdW50ZXIpKTsKLS8vCQkJCQkJcHVzaChuZXcgUHVzaFRoaXMoZ2V0RW5jbG9zaW5nTGV2ZWwobm9kZSwgZGVjbGFyaW5nVHlwZUJpbmRpbmcpKSk7Ci0vLwkJCQkJCXN0b3JlSW5zdHJ1Y3Rpb24oKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93SW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLkFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxWYXJpYWJsZV9FWENfLCBuZXcgT2JqZWN0W117dmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKX0pKTsgCi0vLwkJCQkJcHVzaChuZXcgUHVzaExvY2FsVmFyaWFibGUodmFyaWFibGVJZCkpOwotCQkJCX0JCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LklSZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKFR5cGUgdHlwZSkgewotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJcmV0dXJuIChiaW5kaW5nICE9IG51bGwpID8gZ2V0VHlwZU5hbWUoYmluZGluZykgOiBudWxsOyAKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlyZXR1cm4gKGJpbmRpbmcgIT0gbnVsbCkgPyBnZXRUeXBlTmFtZShiaW5kaW5nKSA6IG51bGw7IAotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVOYW1lKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlTdHJpbmdCdWZmZXIgbmFtZTsKLQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgewotCQkJbmFtZT0gbmV3IFN0cmluZ0J1ZmZlcihnZXRUeXBlTmFtZSh0eXBlQmluZGluZy5nZXRFbGVtZW50VHlwZSgpKSk7Ci0JCQlpbnQgZGltZW5zaW9ucz0gdHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGRpbWVuc2lvbnM7IGkrKykgewotCQkJCW5hbWUuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbmFtZS50b1N0cmluZygpOwotCQl9Ci0JCW5hbWU9IG5ldyBTdHJpbmdCdWZmZXIodHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsKLQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nPSB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCk7Ci0JCXR5cGVCaW5kaW5nPSB0eXBlQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpOwotCQl3aGlsZSh0eXBlQmluZGluZyAhPSBudWxsKSB7Ci0JCQluYW1lLmluc2VydCgwLCAnJCcpLmluc2VydCgwLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOwotCQkJdHlwZUJpbmRpbmc9IHR5cGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0JCX0KLQkJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwgJiYgIXBhY2thZ2VCaW5kaW5nLmlzVW5uYW1lZCgpKSB7Ci0JCQluYW1lLmluc2VydCgwLCAnLicpLmluc2VydCgwLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIjcmVzb2x2ZVRoaXMoKQotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gcmVzb2x2ZVRoaXMoKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gewotCQlyZXR1cm4gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUVGhpc0xpdGVyYWwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9JSmF2YUVNRk5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSUphdmFFTUZOYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyNzgzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9JSmF2YUVNRk5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUphdmFFTUZOYXR1cmUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDoyNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLSAKLS8qKgotICogSW50ZXJmYWNlIGZvciBKYXZhIEVNRiBOYXR1cmUgY29uc3RhbnRzLgotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YUVNRk5hdHVyZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkVfSUQgPSAib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZGI1OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSmVtUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotLyoKLSAqICRSQ1NmaWxlOiBKZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEsdiAkICRSZXZpc2lvbjogMS4xMCAkICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjI3ICQKLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0vKioKLSAqIFByb2plY3QgVXRpbGl0aWVzIGZvciBKRU0gYW5kIEphdmEuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSmVtUHJvamVjdFV0aWxpdGllcyBleHRlbmRzIFByb2plY3RVdGlsaXRpZXMgewotCQotCXByaXZhdGUgSmVtUHJvamVjdFV0aWxpdGllcygpewotCX0KLQkKLQkvKioKLQkgKiBUaGUgbmF0dXJlIGlkIGZvciBKRU0gTmF0dXJlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpFTV9FTUZfTmF0dXJlSUQgPSBJSmF2YUVNRk5hdHVyZS5OQVRVUkVfSUQ7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBFTUYgbmF0dXJlIGZvciBKRU0gZm9yIHRoZSBwcm9qZWN0LiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBhZGROYXR1cmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWRkIHRoZSBuYXR1cmUgdG8gdGhlIHByb2plY3QgaWYgbm90IHNldC4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGRvbid0IGFkZCBuYXR1cmUgaWYgbm90IGFscmVhZHkgb24gcHJvamVjdC4KLQkgKiBAcmV0dXJuIHRoZSBFTUZOYXR1cmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kIGFuZCBhZGROYXR1cmUgd2FzIDxjb2RlPmZhbHNlPC9jb2RlPiBvciBpdCB3YXMgbm90IGEgamF2YSBwcm9qZWN0LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRk5hdHVyZSBnZXRKRU1fRU1GX05hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGFkZE5hdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gYWRkTmF0dXJlID8gSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKHByb2plY3QpIDogSmF2YUVNRk5hdHVyZS5nZXRSdW50aW1lKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSmF2YUNsYXNzIGZyb20gYW4gSUZpbGUuCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcyhJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gYUZpbGUuZ2V0UHJvamVjdCgpOwotCQlMaXN0IGZvbGRlcnMgPSBnZXRTb3VyY2VDb250YWluZXJzKHByb2plY3QpOwotCQlmb2xkZXJzLmFkZEFsbChnZXRMaWJyYXJ5Q29udGFpbmVycyhwcm9qZWN0KSk7Ci0JCUlDb250YWluZXIgZm9sZGVyID0gbnVsbDsKLQkJSVBhdGggZm9sZGVyUGF0aCwgZmlsZVBhdGgsIGphdmFQYXRoOwotCQlmaWxlUGF0aCA9IGFGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJaWYgKGZvbGRlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJZm9sZGVyID0gKElDb250YWluZXIpIGZvbGRlcnMuZ2V0KGkpOwotCQkJCWZvbGRlclBhdGggPSBmb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJCWludCBzZWdtZW50cyA9IGZpbGVQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhmb2xkZXJQYXRoKTsKLQkJCQlpZiAoc2VnbWVudHMgPiAwKSB7Ci0JCQkJCWphdmFQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50cyk7Ci0JCQkJCWphdmFQYXRoID0gamF2YVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCQkJCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IGphdmFQYXRoLnRvU3RyaW5nKCkucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocXVhbGlmaWVkTmFtZSwgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldCBzb3VyY2UgY29udGFpbmVycyBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIGxpc3Qgb2Ygc291cmNlIGNvbnRhaW5lcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QgcCkgewotCQl0cnkgewotCQkJTGlzdCBzb3VyY2VDb250YWluZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCBzb3VyY2VQYXRocyA9IGdldFNvdXJjZVBhdGhzKHApOwotCQkJaWYgKHNvdXJjZVBhdGhzICE9IG51bGwgJiYgIXNvdXJjZVBhdGhzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUGF0aHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgc291cmNlUGF0aHMuZ2V0KGkpOwotCQkJCQlpZiAocGF0aC5pc0VtcHR5KCkpCi0JCQkJCQlzb3VyY2VDb250YWluZXJzLmFkZChwKTsKLQkJCQkJZWxzZQotCQkJCQkJc291cmNlQ29udGFpbmVycy5hZGQocC5nZXRGb2xkZXIocGF0aCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzb3VyY2VDb250YWluZXJzOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRTb3VyY2VQYXRocyhJUHJvamVjdCBwKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHApOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljcCA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBzb3VyY2VQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNwW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJc291cmNlUGF0aHMuYWRkKGNwW2ldLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlUGF0aHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBsaXN0IG9mIElDb250YWluZXJzIHRoYXQgYXJlIExpYnJhcmllcyBpbiB0aGUgY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBsaXN0IG9mIGxpYnJhcnkgSUNvbnRhaW5lcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExpYnJhcnlDb250YWluZXJzKElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCUxpc3QgbGlicmFyeUNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IGxpYnJhcnlQYXRocyA9IGdldGxpYnJhcnlQYXRocyhwKTsKLQkJCWlmIChsaWJyYXJ5UGF0aHMgIT0gbnVsbCAmJiAhbGlicmFyeVBhdGhzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyeVBhdGhzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIGxpYnJhcnlQYXRocy5nZXQoaSk7Ci0JCQkJCWlmIChwYXRoLmlzRW1wdHkoKSkKLQkJCQkJCWxpYnJhcnlDb250YWluZXJzLmFkZChwKTsKLQkJCQkJZWxzZQotCQkJCQkJbGlicmFyeUNvbnRhaW5lcnMuYWRkKHAuZ2V0Rm9sZGVyKHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlicmFyeUNvbnRhaW5lcnM7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldGxpYnJhcnlQYXRocyhJUHJvamVjdCBwKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHApOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljcCA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBsaWJyYXJ5UGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjcFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQlsaWJyYXJ5UGF0aHMuYWRkKGNwW2ldLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlicmFyeVBhdGhzOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGphdmEgcHJvamVjdCBuYXR1cmUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0IG5hdHVyZSBmb3IgdGhlIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGEgamF2YSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb3VjaCBjbGFzc3BhdGguIEl0IHNpbXBseSB0YWtlcyB0aGUgY2xhc3NwYXRoIGFuZCBzZXRzIGl0IGJhY2sgaW4uCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKQotCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBiaW5hcnkgb3V0cHV0IGZpbGVzIGZvciB0aGUgSmF2YVByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIHBhdGggdG8gYmluYXJ5IG91dHB1dCBmb2xkZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBvdGhlciBwcm9ibGVtLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RPdXRwdXRMb2NhdGlvbihJUHJvamVjdCBwKSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChwKTsKLQkJCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCFqYXZhUHJvai5pc09wZW4oKSkKLQkJCQlqYXZhUHJvai5vcGVuKG51bGwpOwotCQkJcmV0dXJuIGphdmFQcm9qLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCdzIGJpbmFyeSBvdXRwdXQgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBwcm9qZWN0J3Mgb3V0cHV0IGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgamF2YSBwcm9qZWN0IG9yIHNvbWUgb3RoZXIgZXJyb3IuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldEphdmFQcm9qZWN0T3V0cHV0Q29udGFpbmVyKElQcm9qZWN0IHApIHsKLQkJSVBhdGggcGF0aCA9IGdldEphdmFQcm9qZWN0T3V0cHV0TG9jYXRpb24ocCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gMSkKLQkJCXJldHVybiBwOwotCQlyZXR1cm4gcC5nZXRGb2xkZXIocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJpbmFyeSBvdXRwdXQgYWJzb2x1dGUgKGxvY2FsIGZpbGUgc3lzdGVtKSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBwcm9qZWN0J3Mgb3V0cHV0IHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIGVycm9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RPdXRwdXRBYnNvbHV0ZUxvY2F0aW9uKElQcm9qZWN0IHApIHsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBnZXRKYXZhUHJvamVjdE91dHB1dENvbnRhaW5lcihwKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRhaW5lci5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIEpEVCBKYXZhTW9kZWwuCi0JICogCi0JICogQHJldHVybiBKRFQncyBKYXZhTW9kZWwKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMuCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qCi0JICogQHJldHVybiBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290cwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3RzKElKYXZhUHJvamVjdCBqYXZhUHJvaikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gamF2YVByb2ouZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHJvb3RzW2ldOwotCQkJaWYgKHJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKQotCQkJCXJlc3VsdC5hZGQocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgY2xhc3NwYXRoCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gcmVzCi0JICogICAgICAgICAgICByZXNvdXJjZQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKElQcm9qZWN0IHAsIElSZXNvdXJjZSByZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocmVzLmdldEZ1bGxQYXRoKCksIG51bGwsIG51bGwpOwotCQlyZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChwLCBlbnRyeSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwYXRoIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gcmVtb3ZlCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgSVBhdGggcGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIGYgPSBwLmdldEZpbGUocGF0aCk7Ci0JCXJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKHAsIGYpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgY2xhc3NwYXRoIGVudHJ5IGZyb20gdGhlIHByb2plY3QncyBjbGFzc3BhdGguCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiBAcGFyYW0gZW50cnkKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoY2xhc3NwYXRoLCBlbnRyeSksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBsaXN0IG9mIGVudHJpZXMgZnJvbSB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIGVudHJpZXMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2YgSUNsYXNzUGF0aEVudHJ5J3MKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBMaXN0IGVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoY2xhc3NwYXRoLCBlbnRyaWVzKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElDbGFzc3BhdGhFbnRyeVtdIHByaW1SZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlib29sZWFuIGRpZFJlbW92ZSA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQlpZiAoIWVudHJ5LmdldFBhdGgoKS5lcXVhbHMoY2xhc3NwYXRoW2ldLmdldFBhdGgoKSkpCi0JCQkJcmVzdWx0LmFkZChjcEVudHJ5KTsKLQkJCWVsc2UKLQkJCQlkaWRSZW1vdmUgPSB0cnVlOwotCQl9Ci0JCWlmICghZGlkUmVtb3ZlKQotCQkJcmV0dXJuIGNsYXNzcGF0aDsKLQkJcmV0dXJuIChJQ2xhc3NwYXRoRW50cnlbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBMaXN0IGVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlMaXN0IGFycmF5TGlzdCA9IEFycmF5cy5hc0xpc3QoY2xhc3NwYXRoKTsKLQkJTGlzdCByZW1vdmVhYmxlID0gbmV3IEFycmF5TGlzdChhcnJheUxpc3QpOwotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCWJvb2xlYW4gZGlkUmVtb3ZlID0gZmFsc2U7Ci0JCWludCBzaXplID0gZW50cmllcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQllbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGVudHJpZXMuZ2V0KGkpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc3BhdGgubGVuZ3RoOyBqKyspIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA9IGNsYXNzcGF0aFtqXTsKLQkJCQlpZiAoZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhjbGFzc3BhdGhbal0uZ2V0UGF0aCgpKSkgewotCQkJCQlpZiAocmVtb3ZlYWJsZS5yZW1vdmUoY3BFbnRyeSkpCi0JCQkJCQlkaWRSZW1vdmUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWRpZFJlbW92ZSkKLQkJCXJldHVybiBjbGFzc3BhdGg7Ci0JCXJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pIHJlbW92ZWFibGUudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3JlbW92ZWFibGUuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzc3BhdGggYXMgYW4gYXJyYXkgb3IgVVJMJ3MuCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHJldHVybiBhcnJheSBvZiBVUkwncyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBqYXZhUHJvamVjdCB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkxbXSBnZXRDbGFzc3BhdGhBc1VSTEFycmF5KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTZXQgdmlzaXRlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoMjApOwotCQljb2xsZWN0Q2xhc3NwYXRoVVJMcyhqYXZhUHJvamVjdCwgdXJscywgdmlzaXRlZCwgdHJ1ZSk7Ci0JCVVSTFtdIHJlc3VsdCA9IG5ldyBVUkxbdXJscy5zaXplKCldOwotCQl1cmxzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RDbGFzc3BhdGhVUkxzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgTGlzdCB1cmxzLCBTZXQgdmlzaXRlZCwgYm9vbGVhbiBpc0ZpcnN0UHJvamVjdCkgewotCQlpZiAodmlzaXRlZC5jb250YWlucyhqYXZhUHJvamVjdCkpCi0JCQlyZXR1cm47Ci0JCXZpc2l0ZWQuYWRkKGphdmFQcm9qZWN0KTsKLQkJSVBhdGggb3V0UGF0aCA9IGdldEphdmFQcm9qZWN0T3V0cHV0QWJzb2x1dGVMb2NhdGlvbihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlvdXRQYXRoID0gb3V0UGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQlVUkwgb3V0ID0gUHJvamVjdFV0aWxpdGllcy5jcmVhdGVGaWxlVVJMKG91dFBhdGgpOwotCQl1cmxzLmFkZChvdXQpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotCQkJCQljb2xsZWN0Q2xhc3NwYXRoRW50cnlVUkwoZW50cnksIHVybHMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDogewotCQkJCQlpZiAoaXNGaXJzdFByb2plY3QgfHwgZW50cnkuaXNFeHBvcnRlZCgpKQotCQkJCQkJY29sbGVjdENsYXNzcGF0aFVSTHMoZ2V0SmF2YVByb2plY3QoZW50cnkpLCB1cmxzLCB2aXNpdGVkLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdENsYXNzcGF0aEVudHJ5VVJMKElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgTGlzdCB1cmxzKSB7Ci0JCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCWlmIChudWxsID09IHBhdGguZ2V0RGV2aWNlKCkpIHsKLQkJCUlGaWxlIGphckZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQlpZiAoamFyRmlsZS5leGlzdHMoKSkgewotCQkJCXBhdGggPSBqYXJGaWxlLmdldExvY2F0aW9uKCk7Ci0JCQl9Ci0JCX0KLQotCQlVUkwgdXJsID0gUHJvamVjdFV0aWxpdGllcy5jcmVhdGVGaWxlVVJMKHBhdGgpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQl1cmxzLmFkZCh1cmwpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlJUHJvamVjdCBwcm9qID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKTsKLQkJaWYgKHByb2ogIT0gbnVsbCkKLQkJCXJldHVybiBnZXRKYXZhUHJvamVjdChwcm9qKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBwcm9qZWN0IGEgYmluYXJ5IHByb2plY3QuCi0JICogPHA+Ci0JICogVHlwaWNhbGx5IGEgSmF2YSBwcm9qZWN0IGlzIGNvbnNpZGVyZWQgYmluYXJ5IGlmIGl0IGRvZXMgbm90IGhhdmUgYSBzb3VyY2UgZW50cnkgaW4gdGhlIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgUHJvamVjdCB0byB0ZXN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwcm9qZWN0IGlzIGEgYmluYXJ5IHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5UHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChhUHJvamVjdCk7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVudHJpZXMgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRvIGphdmEgY2xhc3MgcGF0aC4KLQkgKiA8cD4KLQkgKiBBcHBlbmQgYSBsaXN0IG9mIElDbGFzc3BhdGhFbnRyeSdzIHRvIHRoZSBidWlsZCBwYXRoIG9mIHRoZSBwYXNzZWQgcHJvamVjdC4gVXBkYXRlZCB0byByZW1vdmUgZXhpc3Rpbmcgb2NjdXJyZW5jZXMgb2YgdGhlIHBhc3NlZCBlbnRyaWVzIGJlZm9yZQotCSAqIGFwcGVuZGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gYXBwZW5kQ2xhc3NwYXRoRW50cmllcwotCSAqICAgICAgICAgICAgbGlzdCBvZiBlbnRyaWVzCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBMaXN0IGFwcGVuZENsYXNzcGF0aEVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUxpc3QgbmV3UGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0KGNsYXNzcGF0aC5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQkJLy8gU2tpcCBlbnRyaWVzIHdoaWNoIGFyZSBpbiB0aGUgYXBwZW5kIGxpc3QKLQkJCQlpZiAoYXBwZW5kQ2xhc3NwYXRoRW50cmllcy5pbmRleE9mKGVudHJ5KSA8IDApCi0JCQkJCW5ld1BhdGhMaXN0LmFkZChlbnRyeSk7Ci0JCQl9Ci0JCQluZXdQYXRoTGlzdC5hZGRBbGwoYXBwZW5kQ2xhc3NwYXRoRW50cmllcyk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSAoSUNsYXNzcGF0aEVudHJ5W10pIG5ld1BhdGhMaXN0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtuZXdQYXRoTGlzdC5zaXplKCldKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGNsYXNzcGF0aCBlbnRyeS4KLQkgKiA8cD4KLQkgKiBBcHBlbmQgb25lIElDbGFzc3BhdGhFbnRyeSB0byB0aGUgYnVpbGQgcGF0aCBvZiB0aGUgcGFzc2VkIHByb2plY3QuIElmIGEgY2xhc3NwYXRoIGVudHJ5IGhhdmluZyB0aGUgc2FtZSBwYXRoIGFzIHRoZSBwYXJhbWV0ZXIgYWxyZWFkeSBleGlzdHMsCi0JICogdGhlbiBkb2VzIG5vdGhpbmcuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBQcm9qZWN0Ci0JICogQHBhcmFtIG5ld0VudHJ5Ci0JICogICAgICAgICAgICBFbnRyeQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZEphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocCk7Ci0JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJTGlzdCBuZXdQYXRoTGlzdCA9IG5ldyBBcnJheUxpc3QoY2xhc3NwYXRoLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQkvLyBmaXggZHVwIGNsYXNzIHBhdGggZW50cnkgZm9yIC5KRVRFbWl0dGVyIHByb2plY3QKLQkJCS8vIFNraXAgdGhlIGVudHJ5IHRvIGJlIGFkZGVkIGlmIGl0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoUGxhdGZvcm0uT1NfV0lOMzIpKSB7Ci0JCQkJaWYgKCFlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKG5ld0VudHJ5LmdldFBhdGgoKS50b1N0cmluZygpKSkKLQkJCQkJbmV3UGF0aExpc3QuYWRkKGVudHJ5KTsKLQkJCQllbHNlCi0JCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG5ld0VudHJ5LmdldFBhdGgoKSkpCi0JCQkJCW5ld1BhdGhMaXN0LmFkZChlbnRyeSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJbmV3UGF0aExpc3QuYWRkKG5ld0VudHJ5KTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gKElDbGFzc3BhdGhFbnRyeVtdKSBuZXdQYXRoTGlzdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3UGF0aExpc3Quc2l6ZSgpXSk7Ci0JCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIHBhdGggbWF0Y2hpbmcgdGhlIHBhcmFtZXRlcjsgaWYgdGhlIHBhcmFtZXRlciBpcyBudWxsLCBvciBpZiB0aGUgc291cmNlIGZvbGRlciBpcyBub3Qgb24gdGhlIGNsYXNzcGF0aCwgcmV0dXJuIHRoZSBmaXJzdAotCSAqIHNvdXJjZSBwYXRoIG9uIHRoZSBjbGFzc3BhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEBwYXJhbSBkZWZhdWx0U291cmNlTmFtZQotCSAqICAgICAgICAgICAgc291cmNlIGZvbGRlciB0byBmaW5kIGlmIG9uIGNsYXNzcGF0aCwgb3IgaWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlIGZpcnN0IGZvbGRlcgotCSAqIEByZXR1cm4gcGF0aCBzZWFyY2hlZCBmb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIHByb2JsZW0uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRTb3VyY2VQYXRoT3JGaXJzdChJUHJvamVjdCBwLCBTdHJpbmcgZGVmYXVsdFNvdXJjZU5hbWUpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocCk7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNwID0gamF2YVByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJQ2xhc3NwYXRoRW50cnkgZmlyc3RTb3VyY2UgPSBudWxsOwotCQlJUGF0aCBkZWZhdWx0U291cmNlUGF0aCA9IG51bGw7Ci0JCWlmIChkZWZhdWx0U291cmNlTmFtZSAhPSBudWxsKQotCQkJZGVmYXVsdFNvdXJjZVBhdGggPSBQcm9qZWN0VXRpbGl0aWVzLmNyZWF0ZVBhdGgocCwgZGVmYXVsdFNvdXJjZU5hbWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY3BbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlpZiAoZmlyc3RTb3VyY2UgPT0gbnVsbCkgewotCQkJCQlmaXJzdFNvdXJjZSA9IGNwW2ldOwotCQkJCQlpZiAoZGVmYXVsdFNvdXJjZVBhdGggPT0gbnVsbCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY3BbaV0uZ2V0UGF0aCgpLmVxdWFscyhkZWZhdWx0U291cmNlUGF0aCkpCi0JCQkJCXJldHVybiBkZWZhdWx0U291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJfQotCQl9Ci0JCWlmIChmaXJzdFNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmaXJzdFNvdXJjZS5nZXRQYXRoKCkuc2VnbWVudCgwKS5lcXVhbHMocC5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZpcnN0U291cmNlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBIYWNrIHRvIGZvcmNlIGEgcmVsb2FkIG9mIHRoZSAuY2xhc3NwYXRoIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgcHJvamVjdCB0byByZWxvYWQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZm9yY2VDbGFzc3BhdGhSZWxvYWQoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoamF2YVByb2ogIT0gbnVsbCkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qLnJlYWRSYXdDbGFzc3BhdGgoKTsKLQkJCWlmIChlbnRyaWVzICE9IG51bGwpIHsKLQkJCQlJUGF0aCBvdXRwdXQgPSBqYXZhUHJvai5yZWFkT3V0cHV0TG9jYXRpb24oKTsKLQkJCQlpZiAob3V0cHV0ICE9IG51bGwpCi0JCQkJCWphdmFQcm9qLnNldFJhd0NsYXNzcGF0aChlbnRyaWVzLCBvdXRwdXQsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwYXRocyBvZiBhbGwgb2YgdGhlIGxvY2FsIGphcnMgaW4gdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QuIEl0IGRvZXMgbm90IHJlY3Vyc2UgaW50byByZWZlcmVuY2VkIHByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qCi0JICogICAgICAgICAgICBwcm9qZWN0IHRvIHNlYXJjaCAoc2hvdWxkIGJlIGEgamF2YSBwcm9qZWN0KS4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBJUGF0aCwgd2hlcmUgZWFjaCBlbnRyeSBpcyBhIHByb2plY3QgcmVsYXRpdmUgcGF0aCB0byBhIEpBUiBjb250YWluZWQgaW4gdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExvY2FsSkFSUGF0aHNGcm9tQ2xhc3NwYXRoKElQcm9qZWN0IHByb2opIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocHJvaik7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gcHJvai5nZXRGdWxsUGF0aCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCQlpbnQgc2VnbWVudHMgPSBwYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhwcm9qZWN0UGF0aCk7Ci0JCQkJCWlmIChzZWdtZW50cyA+IDApCi0JCQkJCQlyZXN1bHQuYWRkKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50cykpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIGZvbGRlciBtYXRjaGluZyB0aGUgcGFyYW1ldGVyOyBpZiB0aGUgcGFyYW1ldGVyIGlzIG51bGwsIG9yIGlmIHRoZSBzb3VyY2UgZm9sZGVyIGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoLCByZXR1cm4gdGhlIGZpcnN0Ci0JICogc291cmNlIGZvbGRlciBvbiB0aGUgY2xhc3NwYXRoCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gZGVmYXVsdFNvdXJjZU5hbWUKLQkgKiAgICAgICAgICAgIHNvdXJjZSBmb2xkZXIgdG8gZmluZCBpZiBvbiBjbGFzc3BhdGgsIG9yIGlmIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBmaXJzdCBmb2xkZXIKLQkgKiBAcmV0dXJuIGNvbnRhaW5lciBzZWFyY2hlZCBmb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIHByb2JsZW0uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldFNvdXJjZUZvbGRlck9yRmlyc3QoSVByb2plY3QgcCwgU3RyaW5nIGRlZmF1bHRTb3VyY2VOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBzb3VyY2VQYXRoID0gZ2V0U291cmNlUGF0aE9yRmlyc3QocCwgZGVmYXVsdFNvdXJjZU5hbWUpOwotCQkJaWYgKHNvdXJjZVBhdGggPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWVsc2UgaWYgKHNvdXJjZVBhdGguaXNFbXB0eSgpKQotCQkJCXJldHVybiBwOwotCQkJZWxzZQotCQkJCXJldHVybiBwLmdldEZvbGRlcihzb3VyY2VQYXRoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIElGb2xkZXIgdGhhdCByZXByZXNlbnRzIGVhY2ggc291cmNlIGZvbGRlciBpbiBhIGphdmEgcHJvamVjdAotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QpfWJlY2F1c2UgdGhlIHByb2plY3QgaXRzZWxmIG1pZ2h0IGJlIGEgc291cmNlIGNvbnRhaW5lcgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTb3VyY2VGb2xkZXJzKElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCUxpc3Qgc291cmNlRm9sZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3Qgc291cmNlUGF0aHMgPSBnZXRTb3VyY2VQYXRocyhwKTsKLQkJCWlmIChzb3VyY2VQYXRocyAhPSBudWxsICYmICFzb3VyY2VQYXRocy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVBhdGhzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIHNvdXJjZVBhdGhzLmdldChpKTsKLQkJCQkJaWYgKCFwYXRoLmlzRW1wdHkoKSkKLQkJCQkJCXNvdXJjZUZvbGRlcnMuYWRkKHAuZ2V0Rm9sZGVyKHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc291cmNlRm9sZGVyczsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Ob0FTVFJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Ob0FTVFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOWUxZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvTm9BU1RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogTm9BU1RSZXNvbHZlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjEzOjUzICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5JbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHVzZWQgZm9yIEFTVCBSZXNvbHV0aW9uLCBidXQgaXQgc2ltcGx5IHR1cm5zIE5hbWUgaW50byBQVE5hbWUuIFVzZWZ1bCB3aGVuCi0gKiBqdXN0IGNyZWF0aW5nIGEgcGFyc2UgdHJlZSB3aGVyZSB3ZSBrbm93IHRoZSBuYW1lcyBhcmUgb2sgYW5kIGp1c3QgdHlwZXMuIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb0FTVFJlc29sdmVyIGV4dGVuZHMgQVNUQm91bmRSZXNvbHZlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULlJlc29sdmVyI3Jlc29sdmVOYW1lKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lKQotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gcmVzb2x2ZU5hbWUoTmFtZSBuYW1lKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gewotCQlyZXR1cm4gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTmFtZShuYW1lLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIjcmVzb2x2ZVR5cGUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUpCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlVHlwZShUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUudG9TdHJpbmcoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5hbWUudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1BhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjczNjBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1BhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNyAkICAkRGF0ZTogMjAwNS8xMC8yOCAyMjo1Njo0NCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotIAotLyoqCi0gKiBDcmVhdGUgYSBwYXJzZSB0cmVlIGZyb20gYW4gQVNUIG5vZGUuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVCBleHRlbmRzIEFTVFZpc2l0b3IgewotCXByb3RlY3RlZCBmaW5hbCBSZXNvbHZlciByZXNvbHZlcjsKLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb247CS8vIEVhY2ggdmlzaXQgKG9yIGVuZHZpc2l0KSB3aWxsIHB1dCBpbnRvIGV4cHJlc3Npb24gdGhlIHJlc3VsdCBvZiB0aGUgdmlzaXQgaWYgaXQgcHJvZHVjZWQgYW4gZXhwcmVzc2lvbi4KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIHVzZWQgYnkgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUIHRvIHJlc29sdmUgdGhlIHR5cGVzIHRvIHRoZSBhcHByb3ByaWF0ZQotCSAqIHR5cGVzIChlLmcuICJTdHJpbmciIHRvICJqYXZhLmxhbmcuU3RyaW5nIikuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVzb2x2ZXIgewotCQkKLQkJLyoqCi0JCSAqIFJlc29sdmUgdGhlIE5hbWUuIEl0IGNhbiByZXR1cm4gZWl0aGVyIGEgUFROYW1lIGlmIGl0IGlzIGp1c3QgYSBjbGFzc25hbWUsCi0JCSAqIG9yIGEgUFRGaWVsZEFjY2VzcyBpZiBpdCByZXNvbHZlcyB0byBhIFBURmllbGRBY2Nlc3MuIFRoZSBQVEZpZWxkQWNjZXNzIHNob3VsZAotCQkgKiBiZSBjb21wbGV0ZS4gZS5nIHdlIGhhdmUgY2xhc3MgbGlrZToKLQkJICogPGNvZGU+Ci0JCSAqIAlwYWNrYWdlIHh5ejsgCi0JCSAqIAlwdWJsaWMgY2xhc3MgQUNsYXNzIHsKLQkJICogCQlwdWJsaWMgamF2YS5hd3QuUmVjdGFuZ2xlIHJlY3Q7Ci0JCSAqIAl9IAotCQkgKiA8L2NvZGU+Ci0JCSAqIFRoZW4gYSBOYW1lIGxpa2UgPGNvZGU+QUNsYXNzLnJlY3QueDwvY29kZT4gc2hvdWxkIHJlc29sdmUgdG86Ci0JCSAqIAotCQkgKiBQVEZpZWxkQWNjZXNzOgotCQkgKiAJcmVjZWl2ZXI6IAotCQkgKiAJCVBURmllbGRBY2Nlc3MKLQkJICogCQkJcmVjZWl2ZXI6IHh5ei5BQ2xhc3MKLQkJICogCQkJZmllbGQ6ICJyZWN0IgotCQkgKiAJZmllbGQ6ICJ4IgotCQkgKgotCQkgKiBBY3R1YWxseSBpdCBjYW4gcmV0dXJuIGFueSB2YWxpZCBleHByZXNzaW9uIHRoYXQgaGFzIGEgdmFsdWUgKGkuZS4gaXQgY2Fubm90IGJlIGEgbWV0aG9kIGludm9jYXRpb24gd2l0aCBhIDxjb2RlPnZvaWQ8L2NvZGU+IHJldHVybiB0eXBlKS4gCi0JCSAqIAotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcmV0dXJuIEVpdGhlciBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIChhcyBhIFBUTmFtZSkgb3IgYSBQVEZpZWxkQWNjZXNzLCBhbnkgb3RoZXIgdHlwZSBvZiBleHByZXNzaW9uLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgUFRFeHByZXNzaW9uIHJlc29sdmVOYW1lKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotCQkKLQkJLyoqCi0JCSAqIFJlc29sdmUgdGhlIHR5cGUuIElmIGl0IGlzIGFuIGFycmF5IHR5cGUgcmV0dXJuIGl0IGluIGZvcm1hdCAidHlwZVtdW10iLgotCQkgKiAKLQkJICogQHBhcmFtIHR5cGUKLQkJICogQHJldHVybiBUaGUgdHlwZSBuYW1lLCBpbmNsdWRpbmcgYnJhY2tldHMgaWYgYXJyYXkgdHlwZS4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IFN0cmluZyByZXNvbHZlVHlwZShUeXBlIHR5cGUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBUaGlzIGlzIGZvciByZXNvbHZpbmcgInRoaXMiIGxpdGVyYWwuIEl0IHNob3VsZCBlaXRoZXIgcmV0dXJuIGEgUFRUaGlzTGl0ZXJhbCwgaWYgaXQKLQkJICogY2FuJ3QgZG8gcmVzb2x2ZSwgb3Igc29tZSBQVEV4cHJlc3Npb24gdGhhdCBjYW4gcmVzb2x2ZSB0byAidGhpcyIgZm9yIGV2YWx1YXRpb24uCi0JCSAqIAotCQkgKiBAcmV0dXJuIElmIHJlc29sdmFibGUsIGEgUFRFeHByZXNzaW9uLCBlbHNlIGEgUFRUaGlzTGl0ZXJhbCBpZiBub3QgcmVzb2x2YWJsZS4KLQkJICogQHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgUFRFeHByZXNzaW9uIHJlc29sdmVUaGlzKCkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotCQkKLQkJLyoqCi0JCSAqIFJlc29sdmUgdGhlIHR5cGUgc3BlY2lmaWVkIGFzIGEgTmFtZS4gSXQgbWF5IGJlIGEgc2ltcGxlIG5hbWUgb3IgaXQgbWF5IGJlCi0JCSAqIGEgcXVhbGlmaWVkIG5hbWUuIFRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgTmFtZSB0aGF0IHdlIGtub3cgbXVzdCBiZSBhCi0JCSAqIHR5cGUuIFRoaXMgaXMgc28gdGhhdCB0aGVyZSBpcyBubyBjb25mdXNpb24gd2l0aCBpdCBwb3NzaWJseSBiZWluZyBhIGZpZWxkIG9yIHZhcmlhYmxlCi0JCSAqIHRoYXQgaGFzIHRoZSBzYW1lIGNhc2UgYW5kIHNwZWxsaW5nIGFzIGEgdHlwZSBuYW1lLgotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcmV0dXJuIHRoZSB0eXBlIG5hbWUuCi0JCSAqIEB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IFN0cmluZyByZXNvbHZlVHlwZShOYW1lIG5hbWUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlc29sdmVyIGlmIGl0IGNhbid0IHJlc29sdmUgZm9yIHNvbWUgcmVhc29uLiBUaGlzIHdpbGwgdGhyb3cKLQkJICogYW4gaW52YWxpZCBleHByZXNzaW9uIGV4Y2VwdGlvbiB3aGljaCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC4KLQkJICogCi0JCSAqIEBwYXJhbSBtc2cgTWVzc2FnZSB0byBiZSBwdXQgaW50byB0aGUgZXhjZXB0aW9uLgotCQkgKiBAdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXByb3RlY3RlZCBmaW5hbCB2b2lkIHRocm93SW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oU3RyaW5nIG1zZykgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbihtc2cpOwotCQl9Ci0JfQotCQotCS8qCi0JICogV2hlbiBhbiBpbnZhbGlkIGV4cHJlc3Npb24gaGFzIGJlZW4gZm91bmQgdGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93bi4gSXQgd2lsbAotCSAqIGJlIGNhdWdodCBhdCB0aGUgdG9wIGFuZCBjb252ZXJ0ZWQgaW50byBhbiBJbnZhbGlkRXhwcmVzc2lvbiBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhcnNlIHRyZWUgd2lsbCBiZQotCSAqIHRocm93biBhd2F5LiAKLQkgKiAKLQkgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIGEgbWVzc2FnZSBhcyB0byB3aHkgaXQgaXMgaW52YWxpZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNDI5ODQ1NjMxOTE1MjA2Njc4TDsKLQotCQkvKioKLQkJICogQHBhcmFtIHMgVGhlIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiB0aGUgZmluYWwgaW52YWxpZCBleHByZXNzaW9uLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIGdpdmVuIHJlc29sdmVyLgotCSAqIAotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QoUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIEFTVCBFeHByZXNzaW9uIGFuZCByZXR1cm4gYSBQVEV4cHJlc3Npb24uIElmIGFueSBwYXJ0IHdhcyBpbnZhbGlkLCB0aGVuCi0JICogb25seSBhbiBQVEludmFsaWRFeHByZXNzaW9uIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGFzdEV4cHJlc3Npb24KLQkgKiBAcmV0dXJuIFRoZSBQVEV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIFBURXhwcmVzc2lvbiBjcmVhdGVFeHByZXNzaW9uKEV4cHJlc3Npb24gYXN0RXhwcmVzc2lvbikgewotCQl0cnkgewotCQkJcmV0dXJuIHBlcmZvcm0oYXN0RXhwcmVzc2lvbik7Ci0JCX0gY2F0Y2ggKEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENyZWF0ZSBhIG1zZyB0aGF0IGlzIGZvcm1lZCBvZiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYW5kIHRoZSBmdWxsIGluaXQgc3RyaW5nLgotCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfMCwgbmV3IE9iamVjdFtdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgYXN0RXhwcmVzc2lvbi50b1N0cmluZygpfSk7IAotCQkJUFRJbnZhbGlkRXhwcmVzc2lvbiBleHAgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCQkJZXhwLnNldE1lc3NhZ2UobXNnKTsKLQkJCXJldHVybiBleHA7Ci0JCX0JCi0JfQotCQotCS8qCi0JICogVmlzaXQgdGhlIEFTVCBleHByZXNzaW9uIGFuZCBnZXQgdGhlIFBhcnNlVHJlZSBFeHByZXNzaW9uLgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgaW5kaXZpZHVhbCB2aXNpdHMgd2hlbiBwYXJzaW5nIGEgdHJlZS4KLQkgKiBJdCBwYXNzZXMgdG8gdGhlIHRvcCBtZXRob2QgKGNyZWF0ZUV4cHJlc3Npb24pLCB3aGljaCBjYW4KLQkgKiBoYW5kbGUgdGhlIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uLgotCSAqIAotCSAqIElmIGFueSB2aXNpdCBkb2Vzbid0IHJldHVybiBhbiBleHByZXNzaW9uLCB0aGVuIGFuIGludmFsaWQKLQkgKiBleHByZXNzaW9uIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biB0byBpbmRpY2F0ZSB0aGlzLiBJZiB0aGUKLQkgKiBpbmNvbWluZyBleHByZXNzaW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHJldHVybiBvZiA8Y29kZT5udWxsPC9jb2RlPiBpcyBvayBiZWNhdXNlCi0JICogdGhpcyB3b3VsZCBiZSBmb3IgYW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3aGljaCBkaWRuJ3QgZXhpc3QuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IFBhcnNlVHJlZSBFeHByZXNzaW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGluY29taW5nIGV4cHJlc3Npb24gd2FzIG51bGwuIAotCSAqIAotCSAqIEBzZWUgY3JlYXRlRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbikKLQkgKiBAZXhjZXB0aW9uIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFBURXhwcmVzc2lvbiBwZXJmb3JtKEV4cHJlc3Npb24gYXN0RXhwcmVzc2lvbikgewotCQlpZiAoYXN0RXhwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQlleHByZXNzaW9uID0gbnVsbDsKLQkJCWFzdEV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwotCQkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9FeHByZXNzaW9uVG9vQ29tcGxpY2F0ZWRfRVhDXywgbmV3IE9iamVjdFtdIHthc3RFeHByZXNzaW9uLnRvU3RyaW5nKCl9KSk7IAotCQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7CS8vIFRoaXMgaXMgb2suIEl0IG1lYW5zIGFuIG9wdGlvbmFsIGV4cHJlc3Npb24gd2FzIGJlaW5nIHByb2Nlc3NlZCBhbmQgdGhlIGV4cHJlc3Npb24gZGlkbid0IGV4aXN0LgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUFjY2VzcyBub2RlKSB7Ci0JCVBUQXJyYXlBY2Nlc3MgYWEgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRBcnJheUFjY2VzcygpOwotCQlMaXN0IGluZGV4ZXMgPSBhYS5nZXRJbmRleGVzKCk7Ci0JCUV4cHJlc3Npb24gYXJyYXlFeHAgPSBub2RlOwotCQl3aGlsZSAoYXJyYXlFeHAuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0FDQ0VTUykgewotCQkJLy8gVmlzaXQgdGhlIGluZGV4IHRvIGdldCB0aGUgaW5kZXggZXhwcmVzc2lvbi4KLQkJCUFycmF5QWNjZXNzIGFycmF5ID0gKEFycmF5QWNjZXNzKSBhcnJheUV4cDsgCi0JCQlpbmRleGVzLmFkZCgwLCBwZXJmb3JtKGFycmF5LmdldEluZGV4KCkpKTsJLy8gV2UncmUgdHJ5aW5nIHRvIGNyZWF0ZSB0aGUgZmluYWwgZXhwcmVzc2lvbiBmcm9tIGluc2lkZSBvdXQsIHRoZSBpbmRleGVzIGFyZSBjcmVhdGVkIGluIHJldmVyc2Ugb3JkZXIuCi0JCQlhcnJheUV4cCA9IGFycmF5LmdldEFycmF5KCk7Ci0JCX0KLQkJYWEuc2V0QXJyYXkocGVyZm9ybShhcnJheUV4cCkpOwkvLyBGaW5hbCBhcnJheUV4cCBpcyB0aGUgdHJ1ZSBleHByZXNzaW9uLgotCQlleHByZXNzaW9uID0gYWE7CS8vIFNldCB0aGUgcmV0dXJuIGV4cHJlc3Npb24gZm9yIHRoaXMgdmlzaXQuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5Q3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCVBUQXJyYXlDcmVhdGlvbiBhYyA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEFycmF5Q3JlYXRpb24oKTsKLQkJYWMuc2V0VHlwZShyZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFR5cGUoKSkpOwotCQlMaXN0IGFjRGltcyA9IGFjLmdldERpbWVuc2lvbnMoKTsKLQkJTGlzdCBuRGltcyA9IG5vZGUuZGltZW5zaW9ucygpOwotCQlpbnQgbnNpemUgPSBuRGltcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnNpemU7IGkrKykgewotCQkJYWNEaW1zLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBuRGltcy5nZXQoaSkpKTsKLQkJfQotCQlhYy5zZXRJbml0aWFsaXplcigoUFRBcnJheUluaXRpYWxpemVyKSBwZXJmb3JtKG5vZGUuZ2V0SW5pdGlhbGl6ZXIoKSkpOwotCQlleHByZXNzaW9uID0gYWM7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJUFRBcnJheUluaXRpYWxpemVyIGFpID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCQlMaXN0IGV4cHMgPSBub2RlLmV4cHJlc3Npb25zKCk7Ci0JCUxpc3QgYWlleHBzID0gYWkuZ2V0RXhwcmVzc2lvbnMoKTsKLQkJaW50IG5leHAgPSBleHBzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXhwOyBpKyspIHsKLQkJCWFpZXhwcy5hZGQocGVyZm9ybSgoRXhwcmVzc2lvbikgZXhwcy5nZXQoaSkpKTsKLQkJfQotCQlleHByZXNzaW9uID0gYWk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXNzaWdubWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NpZ25tZW50IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBjYW4ndCBoYW5kbGUgYXNzaWdubWVudC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQlQVEJvb2xlYW5MaXRlcmFsIGJsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoKTsKLQkJYmwuc2V0Qm9vbGVhblZhbHVlKG5vZGUuYm9vbGVhblZhbHVlKCkpOwotCQlleHByZXNzaW9uID0gYmw7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlQVENhc3RFeHByZXNzaW9uIGN0CT0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQkJY3Quc2V0VHlwZShyZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFR5cGUoKSkpOwotCQljdC5zZXRFeHByZXNzaW9uKHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpKTsKLQkJZXhwcmVzc2lvbiA9IGN0OwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCVBUQ2hhcmFjdGVyTGl0ZXJhbCBjbCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJY2wuc2V0RXNjYXBlZFZhbHVlKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQljbC5zZXRDaGFyVmFsdWUobm9kZS5jaGFyVmFsdWUoKSk7Ci0JCWV4cHJlc3Npb24gPSBjbDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpICE9IG51bGwpIHsgCi0JCQlQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYWRlY2wgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQlhZGVjbC5zZXREZWNsYXJhdGlvbihub2RlLnRvU3RyaW5nKCkpOwotCQkJZXhwcmVzc2lvbiA9IGFkZWNsOwotCQl9IGVsc2UgewotCQkJUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2ljID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkvLyBJZiBhc3QgbGV2ZWwgPSAyLCB0aGVuIHlvdSBtdXN0IHVzZSBnZXROYW1lLCBidXQgdGhlIG5hbWUgbmVlZHMgdG8gYmUgdHVybmVkIGludG8gYSB0eXBlCi0JCQkvLyBzbyB0aGF0IGl0IGNhbiBiZSByZXNvbHZlZC4gSWYgYXN0IGxldmVsID4gMiwgdGhlbiBpdCB3aWxsIHJldHVybiBhIHR5cGUgdG8gYmUgcmVzb2x2ZWQuCi0JCQkvLyBOb3RlOiBjYW4ndCBqdXN0IHVzZSByZXNvbHZlIG5hbWUgb24gdGhlIG5hbWUgYmVjYXVzZSBpZiBhIGZpZWxkIGFuZCBhIGNsYXNzIHdlcmUgc3BlbGxlZAotCQkJLy8gdGhlIHNhbWUgdGhlbiB0aGUgY29kZWdlbiByZXNvbHZlciB3b3VsZCByZXR1cm4gYW4gaW5zdGFuY2UgcmVmIHRvIHRoZSBmaWVsZCBpbnN0ZWFkLgotCQkJU3RyaW5nIHR5cGUgPSBub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gQVNULkpMUzIgPyByZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldE5hbWUoKSkgOiByZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFR5cGUoKSk7Ci0JCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJdHlwZSA9IG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMiA/IG5vZGUuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIDogbm9kZS5nZXRUeXBlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWNpYy5zZXRUeXBlKHR5cGUpOwotCQkJTGlzdCBhcmdzID0gY2ljLmdldEFyZ3VtZW50cygpOwotCQkJTGlzdCBuYXJncyA9IG5vZGUuYXJndW1lbnRzKCk7Ci0JCQlpbnQgbnNpemUgPSBuYXJncy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5zaXplOyBpKyspIHsKLQkJCQlhcmdzLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBuYXJncy5nZXQoaSkpKTsKLQkJCX0KLQkJCWV4cHJlc3Npb24gPSBjaWM7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29uZGl0aW9uYWxFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNlID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0JCWNlLnNldENvbmRpdGlvbihwZXJmb3JtKG5vZGUuZ2V0RXhwcmVzc2lvbigpKSk7Ci0JCWNlLnNldFRydWUocGVyZm9ybShub2RlLmdldFRoZW5FeHByZXNzaW9uKCkpKTsKLQkJY2Uuc2V0RmFsc2UocGVyZm9ybShub2RlLmdldEVsc2VFeHByZXNzaW9uKCkpKTsKLQkJZXhwcmVzc2lvbiA9IGNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJUFRGaWVsZEFjY2VzcyBmYSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEZpZWxkQWNjZXNzKCk7Ci0JCWZhLnNldFJlY2VpdmVyKHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpKTsKLQkJZmEuc2V0RmllbGQobm9kZS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJZXhwcmVzc2lvbiA9IGZhOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBpbmZpeE9wZXJUb1BhcnNlT3BlcjsKLQlwcml2YXRlIGZpbmFsIFBUSW5maXhPcGVyYXRvciBnZXRQYXJzZUluZml4KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvcikgewotCQlpZiAocHJlZml4T3BlclRvUGFyc2VPcGVyID09IG51bGwpIHsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyID0gbmV3IEhhc2hNYXAoNSk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkFORCwgUFRJbmZpeE9wZXJhdG9yLkFORF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09ORElUSU9OQUxfQU5ELCBQVEluZml4T3BlcmF0b3IuQ09ORElUSU9OQUxfQU5EX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT05ESVRJT05BTF9PUiwgUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX09SX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5ESVZJREUsIFBUSW5maXhPcGVyYXRvci5ESVZJREVfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkVRVUFMUywgUFRJbmZpeE9wZXJhdG9yLkVRVUFMU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuR1JFQVRFUl9FUVVBTFMsIFBUSW5maXhPcGVyYXRvci5HUkVBVEVSX0VRVUFMU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuR1JFQVRFUiwgUFRJbmZpeE9wZXJhdG9yLkdSRUFURVJfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFRlRfU0hJRlQsIFBUSW5maXhPcGVyYXRvci5MRUZUX1NISUZUX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRVNTX0VRVUFMUywgUFRJbmZpeE9wZXJhdG9yLkxFU1NfRVFVQUxTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRVNTLCBQVEluZml4T3BlcmF0b3IuTEVTU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMsIFBUSW5maXhPcGVyYXRvci5NSU5VU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTk9UX0VRVUFMUywgUFRJbmZpeE9wZXJhdG9yLk5PVF9FUVVBTFNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk9SLCBQVEluZml4T3BlcmF0b3IuT1JfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMsIFBUSW5maXhPcGVyYXRvci5QTFVTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SRU1BSU5ERVIsIFBUSW5maXhPcGVyYXRvci5SRU1BSU5ERVJfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRCwgUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORUQsIFBUSW5maXhPcGVyYXRvci5SSUdIVF9TSElGVF9VTlNJR05FRF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuVElNRVMsIFBUSW5maXhPcGVyYXRvci5USU1FU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuWE9SLCBQVEluZml4T3BlcmF0b3IuWE9SX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiAoUFRJbmZpeE9wZXJhdG9yKSBpbmZpeE9wZXJUb1BhcnNlT3Blci5nZXQob3BlcmF0b3IpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5maXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCVBUSW5maXhFeHByZXNzaW9uIGluZiA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEluZml4RXhwcmVzc2lvbigpOwotCQlpbmYuc2V0TGVmdE9wZXJhbmQocGVyZm9ybShub2RlLmdldExlZnRPcGVyYW5kKCkpKTsKLQkJUFRJbmZpeE9wZXJhdG9yIGlub3BlciA9IGdldFBhcnNlSW5maXgobm9kZS5nZXRPcGVyYXRvcigpKTsKLQkJaWYgKGlub3BlciA9PSBudWxsKSB7Ci0JCQkvLyBJdCBpcyBub3Qgb25lIHdlIGNhbiBoYW5kbGUuCi0JCQl0aHJvdyBuZXcgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oCi0JCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfT3BlcmF0b3JUb29Db21wbGljYXRlZFRvSGFuZGxlX0VYQ18sIG5ldyBPYmplY3RbXSB7IG5vZGUuZ2V0T3BlcmF0b3IoKS50b1N0cmluZygpIH0pKTsgCi0JCX0KLQkJaW5mLnNldE9wZXJhdG9yKGlub3Blcik7Ci0JCWluZi5zZXRSaWdodE9wZXJhbmQocGVyZm9ybShub2RlLmdldFJpZ2h0T3BlcmFuZCgpKSk7Ci0JCUxpc3QgZW9wcyA9IGluZi5nZXRFeHRlbmRlZE9wZXJhbmRzKCk7Ci0JCUxpc3QgbmVvcHMgPSBub2RlLmV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJaW50IG5zaXplID0gbmVvcHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5zaXplOyBpKyspIHsKLQkJCWVvcHMuYWRkKHBlcmZvcm0oKEV4cHJlc3Npb24pIG5lb3BzLmdldChpKSkpOwotCQl9Ci0JCWV4cHJlc3Npb24gPSBpbmY7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5zdGFuY2VvZkV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgewotCQlQVEluc3RhbmNlb2YgaW5vZiA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEluc3RhbmNlb2YoKTsKLQkJaW5vZi5zZXRPcGVyYW5kKHBlcmZvcm0obm9kZS5nZXRMZWZ0T3BlcmFuZCgpKSk7Ci0JCWlub2Yuc2V0VHlwZShyZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFJpZ2h0T3BlcmFuZCgpKSk7Ci0JCWV4cHJlc3Npb24gPSBpbm9mOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBvc3RmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBjYW4ndCBoYW5kbGUgcG9zdCBmaXguCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCVBUTWV0aG9kSW52b2NhdGlvbiBtaSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE1ldGhvZEludm9jYXRpb24oKTsKLQkJbWkuc2V0UmVjZWl2ZXIocGVyZm9ybShub2RlLmdldEV4cHJlc3Npb24oKSkpOwotCQltaS5zZXROYW1lKG5vZGUuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSk7Ci0JCUxpc3QgYXJncyA9IG1pLmdldEFyZ3VtZW50cygpOwotCQlMaXN0IG5hcmdzID0gbm9kZS5hcmd1bWVudHMoKTsKLQkJaW50IG5zaXplID0gbmFyZ3Muc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5zaXplOyBpKyspIHsKLQkJCWFyZ3MuYWRkKHBlcmZvcm0oKEV4cHJlc3Npb24pIG5hcmdzLmdldChpKSkpOwotCQl9Ci0JCWV4cHJlc3Npb24gPSBtaTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdWxsTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFROdWxsTGl0ZXJhbCgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCVBUTnVtYmVyTGl0ZXJhbCBubCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE51bWJlckxpdGVyYWwoKTsKLQkJbmwuc2V0VG9rZW4obm9kZS5nZXRUb2tlbigpKTsKLQkJZXhwcmVzc2lvbiA9IG5sOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBwZSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCXBlLnNldEV4cHJlc3Npb24ocGVyZm9ybShub2RlLmdldEV4cHJlc3Npb24oKSkpOwotCQlleHByZXNzaW9uID0gcGU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIHByZWZpeE9wZXJUb1BhcnNlT3BlcjsKLQlwcml2YXRlIGZpbmFsIFBUUHJlZml4T3BlcmF0b3IgZ2V0UGFyc2VQcmVmaXgoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvcikgewotCQlpZiAocHJlZml4T3BlclRvUGFyc2VPcGVyID09IG51bGwpIHsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3BlciA9IG5ldyBIYXNoTWFwKDUpOwotCQkJcHJlZml4T3BlclRvUGFyc2VPcGVyLnB1dChQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTVBMRU1FTlQsIFBUUHJlZml4T3BlcmF0b3IuQ09NUExFTUVOVF9MSVRFUkFMKTsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3Blci5wdXQoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5NSU5VUywgUFRQcmVmaXhPcGVyYXRvci5NSU5VU19MSVRFUkFMKTsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3Blci5wdXQoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5OT1QsIFBUUHJlZml4T3BlcmF0b3IuTk9UX0xJVEVSQUwpOwotCQkJcHJlZml4T3BlclRvUGFyc2VPcGVyLnB1dChQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMsIFBUUHJlZml4T3BlcmF0b3IuUExVU19MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gKFBUUHJlZml4T3BlcmF0b3IpIHByZWZpeE9wZXJUb1BhcnNlT3Blci5nZXQob3BlcmF0b3IpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJlZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0T3BlcmFuZCgpLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5OVU1CRVJfTElURVJBTCkgewotCQkJLy8gRm9yIG51bWJlciBsaXRlcmFscyB3ZSBzZWUgaWYgaXQgaXMgYSAiKyIgb3IgIi0iIHByZWZpeCwgYW5kIGlmIGl0IGlzLCB3ZSBzaW1wbHkKLQkJCS8vIGNyZWF0ZSBhIFBUTnVtYmVyTGl0ZXJhbCB3aXRoIHRoZSBvcGVyYXRvciBhbHJlYWR5IGluIGl0LiBJdCBpcyBhIHNpbXBsaWZpY2F0aW9uLgotCQkJLy8gQW55IG90aGVyIG9wZXJhdG9yIHdlJ3ZlIGxlZnQgYWxvbmUgc2luY2UgdGhvc2Ugd29uJ3QgYmUgZGVjb2RlZCBzaW1wbHkgYnkgdGhlCi0JCQkvLyBOdW1iZXIgZGVjb2Rlci4KLQkJCS8vIElmIG5vdCBhIG51bWJlciBsaXRlcmFsLCB0aGVuIGxlYXZlIGFsb25lIHNpbmNlIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYSBwcmVmaXgKLQkJCS8vIG9wZXJhdGlvbi4KLQkJCVByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3Igb3BlcmF0b3IgPSBub2RlLmdldE9wZXJhdG9yKCk7Ci0JCQlpZiAob3BlcmF0b3IgPT0gUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTIHx8IG9wZXJhdG9yID09IFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMpIHsKLQkJCQlQVE51bWJlckxpdGVyYWwgbm0gPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFROdW1iZXJMaXRlcmFsKCk7Ci0JCQkJbm0uc2V0VG9rZW4ob3BlcmF0b3IudG9TdHJpbmcoKSArICgoTnVtYmVyTGl0ZXJhbCkgbm9kZS5nZXRPcGVyYW5kKCkpLmdldFRva2VuKCkpOwotCQkJCWV4cHJlc3Npb24gPSBubTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlQVFByZWZpeEV4cHJlc3Npb24gcGUgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCVBUUHJlZml4T3BlcmF0b3IgcHRvcGVyID0gZ2V0UGFyc2VQcmVmaXgobm9kZS5nZXRPcGVyYXRvcigpKTsKLQkJaWYgKHB0b3BlciA9PSBudWxsKSB7Ci0JCQkvLyBJdCBpcyBub3Qgb25lIHdlIGNhbiBoYW5kbGUuCi0JCQl0aHJvdyBuZXcgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9PcGVyYXRvclRvb0NvbXBsaWNhdGVkVG9IYW5kbGVfRVhDXywgbmV3IE9iamVjdFtdIHsgbm9kZS5nZXRPcGVyYXRvcigpLnRvU3RyaW5nKCkgfSkpOyAKLQkJfQotCQlwZS5zZXRPcGVyYXRvcihwdG9wZXIpOwotCQlwZS5zZXRFeHByZXNzaW9uKHBlcmZvcm0obm9kZS5nZXRPcGVyYW5kKCkpKTsKLQkJZXhwcmVzc2lvbiA9IHBlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSByZXNvbHZlci5yZXNvbHZlTmFtZShub2RlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVOYW1lIG5vZGUpIHsKLQkJZXhwcmVzc2lvbiA9IHJlc29sdmVyLnJlc29sdmVOYW1lKG5vZGUpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCVBUU3RyaW5nTGl0ZXJhbCBzbCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVFN0cmluZ0xpdGVyYWwoKTsKLQkJc2wuc2V0RXNjYXBlZFZhbHVlKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQlzbC5zZXRMaXRlcmFsVmFsdWUobm9kZS5nZXRMaXRlcmFsVmFsdWUoKSk7Ci0JCWV4cHJlc3Npb24gPSBzbDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdXBlckZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyRmllbGRBY2Nlc3Mgbm9kZSkgewotCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGNhbid0IGhhbmRsZSBwb3N0IGZpeC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJNZXRob2RJbnZvY2F0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsJLy8gV2UgY2FuJ3QgaGFuZGxlIHBvc3QgZml4LgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UaGlzRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSByZXNvbHZlci5yZXNvbHZlVGhpcygpOwotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCVBUVHlwZUxpdGVyYWwgcHRsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUVHlwZUxpdGVyYWwoKTsKLQkJcHRsLnNldFR5cGUocmVzb2x2ZXIucmVzb2x2ZVR5cGUobm9kZS5nZXRUeXBlKCkpKTsKLQkJZXhwcmVzc2lvbiA9IHB0bDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Xb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmMDllMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Xb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfRXhwcmVzc2lvblRvb0NvbXBsaWNhdGVkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX09wZXJhdG9yVG9vQ29tcGxpY2F0ZWRUb0hhbmRsZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxGaWVsZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxWYXJpYWJsZV9FWENfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTdmMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gezB9IC0gezF9Ci1QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfRXhwcmVzc2lvblRvb0NvbXBsaWNhdGVkX0VYQ18gICAgICAgICAgID0gSVdBVjAxNzdFIEV4cHJlc3Npb24gInswfSIgaXMgdG9vIGNvbXBsaWNhdGVkLgotUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX09wZXJhdG9yVG9vQ29tcGxpY2F0ZWRUb0hhbmRsZV9FWENfICAgICA9IElXQVYwMTc5RSBPcGVyYXRvciAiezB9IiBpcyB0b28gY29tcGxpY2F0ZWQgdG8gaGFuZGxlLgotQVNUQm91bmRSZXNvbHZlcl9DYW5ub3RIYW5kbGVMb2NhbEZpZWxkX0VYQ189Q2Fubm90IGhhbmRsZSBsb2NhbCBmaWVsZCBhY2Nlc3Mgb2YgInswfSIKLUFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxWYXJpYWJsZV9FWENfPUNhbm5vdCBoYW5kbGUgbG9jYWwgdmFyaWFibGUgYWNjZXNzIG9mICJ7MH0iCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRjZDdhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzg2ZGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5jb3JlLkpFTVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLG9yZy5lY2xpcHNlLmplbS5wcm94eSxvcmcuZWNsaXBzZS5qZW0udGVzdHMsb3JnLmVjbGlwc2UuamVtLnVpLG9yZy5lY2xpcHNlLmplbS51dGlsLG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbCwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8sb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5sczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5iZWFuaW5mbywKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbml0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbiwKLSBvcmcuZWNsaXBzZS5qZW0uamF2YSwKLSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycywKLSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyxvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIiwKLSBvcmcuZWNsaXBzZS5qZW0uamF2YS51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS5qZW0ucHJveHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmplbS51dGlsCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaW5pIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFhM2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQubWFwcGluZ3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxZWNjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQKLSMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9SmF2YSBFTUYgTW9kZWxcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuIDIwMDAsIDIwMDQuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy92ZXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGQwNGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3JjLmV4Y2x1ZGVzID0gKiovLmN2c2lnbm9yZQotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgb3ZlcnJpZGVzLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgotamFycy5jb21waWxlLm9yZGVyID0gLgotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBtb2RlbC8sXAotICAgICAgICAgICAgICAgcm9zZS8KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBtb2ZqYXZhLyxcCi0gICAgICAgICAgIGphdmFpbnN0LwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vZWNsaXBzZTMyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0ltcGxpY2l0QWxsb2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW1wbGljaXRBbGxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDU4ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW1wbGljaXRBbGxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLSAqICAkUkNTZmlsZTogSW1wbGljaXRBbGxvY2F0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkltcGxpY2l0IEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIGZvciBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uIHdoZXJlIHRoZSBvYmplY3QgY29tZXMgZnJvbSB0aGUgZmVhdHVyZSBvZiBhbm90aGVyIG9iamVjdC4gSXQgaXMgdGhlIGxpdmUgSmF2YSB2YWx1ZSBmcm9tIHRoZSByZW1vdGUgdm0uCi0gKiA8L3A+IAotICogQHNpbmNlIDEuMC4wCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgaXMgZm9yIGFuIGltcGxpY2l0IGFsbG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBjb21lcyBmcm9tIHRoZSBmZWF0dXJlIG9mIGFub3RoZXIgb2JqZWN0LiBJdCBpcyB0aGUgbGl2ZSBKYXZhIHZhbHVlIGZyb20gdGhlIHJlbW90ZSB2bS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0UGFyZW50IDxlbT5QYXJlbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRGZWF0dXJlIDxlbT5GZWF0dXJlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRJbXBsaWNpdEFsbG9jYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1wbGljaXRBbGxvY2F0aW9uIGV4dGVuZHMgSmF2YUFsbG9jYXRpb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBUaGUgcGFyZW50IHdobyBpcyB0byBnaXZlIHVwIHRoZSB2YWx1ZS4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJlbnQoRU9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEltcGxpY2l0QWxsb2NhdGlvbl9QYXJlbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU9iamVjdCBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmVudChFT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIFRoZSBmZWF0dXJlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHF1ZXJ5IHRoZSBsaXZlIHZhbHVlLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZWF0dXJlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEltcGxpY2l0QWxsb2NhdGlvbl9GZWF0dXJlKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0RmVhdHVyZSA8ZW0+RmVhdHVyZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmVhdHVyZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RmVhdHVyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgdmFsdWUpOwotCi19IC8vIEltcGxpY2l0QWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5pdFN0cmluZ0FsbG9jYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luaXRTdHJpbmdBbGxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjg5NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5pdFN0cmluZ0FsbG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEluaXRTdHJpbmdBbGxvY2F0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8cD4KLSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBhbGxvY2F0aW9uIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJ5IHRoZSByZW1vdGUgdm0uIEl0IHVzZXMgdGhlIGFsbG9jU3RyaW5nLiAKLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb24jZ2V0QWxsb2NTdHJpbmcoKQotICogQHNpbmNlIDEuMC4wCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBhbGxvY2F0aW9uIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJ5IHRoZSByZW1vdGUgdm0uIEl0IHVzZXMgdGhlIGFsbG9jU3RyaW5nLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uI2dldEluaXRTdHJpbmcgPGVtPkluaXQgU3RyaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRJbml0U3RyaW5nQWxsb2NhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbml0U3RyaW5nQWxsb2NhdGlvbiBleHRlbmRzIEphdmFBbGxvY2F0aW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0IFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcgZm9yIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5pdFN0cmluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRJbml0U3RyaW5nQWxsb2NhdGlvbl9Jbml0U3RyaW5nKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEluaXRTdHJpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uI2dldEluaXRTdHJpbmcgPGVtPkluaXQgU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5pdFN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdFN0cmluZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEluaXRTdHJpbmdBbGxvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlZDE2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBJbnN0YW50aWF0aW9uRmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8xMC8yOCAyMjo1Njo0NiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnN0YW50aWF0aW9uRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5zdGFudGlhdGlvbkZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUluaXRTdHJpbmdBbGxvY2F0aW9uIGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUltcGxpY2l0QWxsb2NhdGlvbiBjcmVhdGVJbXBsaWNpdEFsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhcnNlVHJlZUFsbG9jYXRpb24gY3JlYXRlUGFyc2VUcmVlQWxsb2NhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBwYXJzZSB0cmVlIGFsbG9jYXRpb24gd2l0aCBhbiBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHJldHVybiBUaGUgbmV3IHBhcnNlIHRyZWUgYWxsb2NhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQYXJzZVRyZWVBbGxvY2F0aW9uIGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQXJyYXlBY2Nlc3MgY3JlYXRlUFRBcnJheUFjY2VzcygpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgYXJyYXkgYWNjZXNzIHdpdGggdGhlIGFycmF5IGFuZCBpbmRleGVzLgotCSAqIAotCSAqIEBwYXJhbSBhcnJheQotCSAqIEBwYXJhbSBpbmRleGVzIGxpc3Qgb2YgaW5kZXggZXhwcmVzc2lvbnMKLQkgKiBAcmV0dXJuIFRoZSBuZXcgYXJyYXkgYWNjZXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQXJyYXlBY2Nlc3MgY3JlYXRlUFRBcnJheUFjY2VzcyhQVEV4cHJlc3Npb24gYXJyYXksIExpc3QgaW5kZXhlcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBcnJheSBDcmVhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRBcnJheUNyZWF0aW9uIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYW4gYXJyYXkgY3JlYXRpb24gd2l0aCB0aGUgdHlwZSwgZGltZW5zaW9ucywgYW5kIGluaXRpYWxpemVyLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlLCBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+LgotCSAqIEBwYXJhbSBkaW1lbnNpb25zIFRoZSBkaW1lbnNpb24gZXhwcmVzc2lvbnMsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGRpbWVuc2lvbiBleHByZXNzaW9ucy4KLQkgKiBAcGFyYW0gaW5pdGlhbGl6ZXIgVGhlIGluaXRpYWxpemVyLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsaXplci4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgYXJyYXkgY3JlYXRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRBcnJheUNyZWF0aW9uIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbihTdHJpbmcgdHlwZSwgTGlzdCBkaW1lbnNpb25zLCBQVEFycmF5SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBcnJheSBJbml0aWFsaXplcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQXJyYXlJbml0aWFsaXplciBjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGFuIGFycmF5IGluaXRpbGl6ZXIgd2l0aCBpbml0aWFsaXplIGV4cGVzc2lvbnMuCi0JICogQHBhcmFtIGV4cHJlc3Npb25zIFRoZSBsaXN0IG9mIGV4cHJlc3Npb25zLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBlbXB0eSBhcnJheSBpbml0aWFsaXplci4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgYXJyYXkgaW5pdGlhbGl6ZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRBcnJheUluaXRpYWxpemVyIGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcihMaXN0IGV4cHJlc3Npb25zKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBCb29sZWFuIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQm9vbGVhbkxpdGVyYWwgY3JlYXRlUFRCb29sZWFuTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBib29sZWFuIGxpdGVyYWwgd2l0aCBhIGdpdmVuIHZhbHVlLgotCSAqIEBwYXJhbSBib29sZWFuVmFsdWUKLQkgKiBAcmV0dXJuIFRoZSBuZXcgYm9vbGVhbiBsaXRlcmFsLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQm9vbGVhbkxpdGVyYWwgY3JlYXRlUFRCb29sZWFuTGl0ZXJhbChib29sZWFuIGJvb2xlYW5WYWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDYXN0IEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRDYXN0RXhwcmVzc2lvbiBjcmVhdGVQVENhc3RFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBjYXN0IGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24sIGUuZy4gPGNvZGU+c2hvcnQ8L2NvZGU+IG9yIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+Ci0JICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gYmVpbmcgY2FzdC4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgY2FzdCBleHByZXNzaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQ2FzdEV4cHJlc3Npb24gY3JlYXRlUFRDYXN0RXhwcmVzc2lvbihTdHJpbmcgdHlwZSwgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ2hhcmFjdGVyIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQ2hhcmFjdGVyTGl0ZXJhbCBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGNoYXJhY3RlciBsaXRlcmFsLgotCSAqIEBwYXJhbSBlc2NhcGVkVmFsdWUgVGhlIGVzY2FwZWQgdmFsdWUgdG8gdXNlLgotCSAqIEByZXR1cm4gVGhlIG5ldyBjaGFyYWN0ZXIgbGl0ZXJhbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVENoYXJhY3RlckxpdGVyYWwgY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKFN0cmluZyBlc2NhcGVkVmFsdWUpOwkKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24uCi0JICogCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGNsYXNzLCBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+LgotCSAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgZm9yIGFyZ3VtZW50cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIGFyZ3MuCi0JICogQHJldHVybiBUaGUgbmV3IGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKFN0cmluZyB0eXBlLCBMaXN0IGFyZ3VtZW50cyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBjb25kaXRpb25hbCBleHByZXNzaW9uIHdpdGggdGhlIGNvbmRpdGlvbiBhbmQgdHJ1ZS9mYWxzZSBleHByZXNzaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogQHBhcmFtIHRydWVFeHByZXNzb2luCi0JICogQHBhcmFtIGZhbHNlRXhwcmVzc2lvbgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbihQVEV4cHJlc3Npb24gY29uZGl0aW9uLCBQVEV4cHJlc3Npb24gdHJ1ZUV4cHJlc3NvaW4sIFBURXhwcmVzc2lvbiBmYWxzZUV4cHJlc3Npb24pOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEZpZWxkIEFjY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRGaWVsZEFjY2VzcyBjcmVhdGVQVEZpZWxkQWNjZXNzKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBmaWVsZCBhY2Nlc3Mgd2l0aCByZWNlaXZlciBhbmQgZmllbGQgbmFtZS4KLQkgKiBAcGFyYW0gcmVjZWl2ZXIgVGhlIHJlY2VpdmVyIGV4cHJlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZCBuYW1lLgotCSAqIEByZXR1cm4gVGhlIG5ldyBmaWVsZCBhY2Nlc3MuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRGaWVsZEFjY2VzcyBjcmVhdGVQVEZpZWxkQWNjZXNzKFBURXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIGZpZWxkKTsJCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUSW5maXhFeHByZXNzaW9uIGNyZWF0ZVBUSW5maXhFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBpbmZpeCBleHByZXNzaW9uIHdpdGggdGhlIGxlZnQvcmlnaHQvZXh0ZW5kZWQgb3BlcmFuZHMgYW5kIHRoZSBvcGVyYXRvci4KLQkgKiBAcGFyYW0gbGVmdE9wZXJhbmQKLQkgKiBAcGFyYW0gb3BlcmF0b3IKLQkgKiBAcGFyYW0gcmlnaHRPcGVyYW5kCi0JICogQHBhcmFtIGV4dGVuZGVkT3BlcmFuZHMgVGhlIGxpc3Qgb2YgZXh0ZW5kZWQgb3BlcmFuZHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGV4dGVuZGVkIG9wZXJhbmRzLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEluZml4RXhwcmVzc2lvbiBjcmVhdGVQVEluZml4RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbGVmdE9wZXJhbmQsIFBUSW5maXhPcGVyYXRvciBvcGVyYXRvciwgUFRFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCwgTGlzdCBleHRlbmRlZE9wZXJhbmRzKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRJbnN0YW5jZW9mIGNyZWF0ZVBUSW5zdGFuY2VvZigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2Ygd2l0aCBhbiBvcGVyYW5kIGFuZCBhIHR5cGUuCi0JICogQHBhcmFtIG9wZXJhbmQKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSBvZi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEluc3RhbmNlb2YgY3JlYXRlUFRJbnN0YW5jZW9mKFBURXhwcmVzc2lvbiBvcGVyYW5kLCBTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIE1ldGhvZCBJbnZvY2F0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBNZXRob2QgSW52b2NhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRNZXRob2RJbnZvY2F0aW9uIGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgbWV0aG9kIGludm9jYXRpb24gd2l0aCBhIHJlY2VpdmVyLCBuYW1lLCBhbmQgYXJndW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSByZWNlaXZlciBUaGUgcmVjZWl2ZXIgZXhwcmVzc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcmVjZWl2ZXIuCi0JICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4KLQkgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhcmd1bWVudHMuCi0JICogQHJldHVybiBUaGUgbmV3IG1ldGhvZCBpbnZvY2F0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUTWV0aG9kSW52b2NhdGlvbiBjcmVhdGVQVE1ldGhvZEludm9jYXRpb24oUFRFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwgTGlzdCBhcmd1bWVudHMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOYW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVE5hbWUgY3JlYXRlUFROYW1lKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBuYW1lIHdpdGggdGhlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFRoZSBuZXcgbmFtZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVE5hbWUgY3JlYXRlUFROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTnVsbCBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUTnVsbExpdGVyYWwgY3JlYXRlUFROdWxsTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOdW1iZXIgTGl0ZXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTnVtYmVyIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUTnVtYmVyTGl0ZXJhbCBjcmVhdGVQVE51bWJlckxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IG51bWJlciBsaXRlcmFsIHdpdGggdGhlIHRva2VuLgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4gVGhlIG5ldyBudW1iZXIgbGl0ZXJhbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVE51bWJlckxpdGVyYWwgY3JlYXRlUFROdW1iZXJMaXRlcmFsKFN0cmluZyB0b2tlbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiB3aXRoIHRoZSBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRoYXQgaXMgaW4gdGhlIHBhcmVudGhlc2lzLgotCSAqIEByZXR1cm4gVGhlIG5ldyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgUHJlZml4IEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFByZWZpeEV4cHJlc3Npb24gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBwcmVmaXggZXhwcmVzc2lvbiBnaXZlbiBhbiBvcGVyYXRvciBhbmQgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gb3BlcmF0b3IKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEByZXR1cm4gVGhlIG5ldyBwcmVmaXggZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVFByZWZpeEV4cHJlc3Npb24gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKFBUUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IsIFBURXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgU3RyaW5nIExpdGVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFN0cmluZyBMaXRlcmFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFN0cmluZ0xpdGVyYWwgY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBzdHJpbmcgbGl0ZXJhbCBnaXZlbiB0aGUgZXNjYXBlZCBsaXRlcmFsIHN0cmluZy4KLQkgKiBAcGFyYW0gZXNjYXBlTGl0ZXJhbAotCSAqIEByZXR1cm4gVGhlIG5ldyBzdHJpbmcgbGl0ZXJhbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVFN0cmluZ0xpdGVyYWwgY3JlYXRlUFRTdHJpbmdMaXRlcmFsKFN0cmluZyBlc2NhcGVMaXRlcmFsKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgVGhpcyBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUVGhpc0xpdGVyYWwgY3JlYXRlUFRUaGlzTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBUeXBlIExpdGVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRUeXBlTGl0ZXJhbCBjcmVhdGVQVFR5cGVMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyB0eXBlIGxpdGVyYWwgZ2l2ZW4gdGhlIHR5cGUuCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIFRoZSBuZXcgdHlwZSBsaXRlcmFsLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUVHlwZUxpdGVyYWwgY3JlYXRlUFRUeXBlTGl0ZXJhbChTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEludmFsaWQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW52YWxpZCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEludmFsaWRFeHByZXNzaW9uIGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUSW5zdGFuY2VSZWZlcmVuY2UgY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGNyZWF0ZVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgUFRJbnN0YW5jZVJlZmVyZW5jZSB3aXRoIGEgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT4nLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCVBUSW5zdGFuY2VSZWZlcmVuY2UgY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZShJSmF2YUluc3RhbmNlIGluc3RhbmNlKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGludmFsaWQgZXhwcmVzc2lvbiB3aXRoIGEgbWVzc2FnZS4KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEByZXR1cm4gVGhlIG5ldyBpbnZhbGlkIGV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRJbnZhbGlkRXhwcmVzc2lvbiBjcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+JyBhcwotCSAqIHV0aWxpdHkgd2l0aCBhIGdpdmVuIGluaXQgc3RyaW5nLgotCSAqIEBwYXJhbSBpbml0U3RyaW5nIC0gU3RyaW5nIHRvIHB1dCBpbnRvIGluaXRpYWxpemF0aW9uLgotCSAqIEByZXR1cm4gVGhlIGFsbG9jYXRpb24gaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSW5pdFN0cmluZ0FsbG9jYXRpb24gY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oU3RyaW5nIGluaXRTdHJpbmcpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+JyBhcwotCSAqIHV0aWxpdHkgd2l0aCBhIGdpdmVuIHBhcmVudCBhbmQgZmVhdHVyZS4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBzb3VyY2UgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tLgotCSAqIEBwYXJhbSBzZiBUaGUgZmVhdHVyZSBvbiB0aGUgc291cmNlIGZvciB0aGUgdmFsdWUuCi0JICogQHJldHVybiBUaGUgYWxsb2NhdGlvbiBpbml0aWFsaXplZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJbXBsaWNpdEFsbG9jYXRpb24gY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgc2YpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnN0YW50aWF0aW9uUGFja2FnZSBnZXRJbnN0YW50aWF0aW9uUGFja2FnZSgpOwotCi19IC8vSW5zdGFudGlhdGlvbkZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25QYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjVhOTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBJbnN0YW50aWF0aW9uUGFja2FnZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8xMC8yOCAyMjo1Njo0NiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBKYXZhIEluc3RhbnRpYXRpb24gUGFja2FnZQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5zdGFudGlhdGlvblBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJpbnN0YW50aWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUluc3RhbnRpYXRpb25QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlIDxlbT5JSmF2YSBJbnN0YW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SUphdmFJbnN0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSkFWQV9JTlNUQU5DRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklKYXZhIEluc3RhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElKQVZBX0lOU1RBTkNFX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UgPGVtPklKYXZhIE9iamVjdCBJbnN0YW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFPYmplY3RJbnN0YW5jZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SUphdmFPYmplY3RJbnN0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSkFWQV9PQkpFQ1RfSU5TVEFOQ0UgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZSA8ZW0+SUphdmEgRGF0YSBUeXBlIEluc3RhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldElKYXZhRGF0YVR5cGVJbnN0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSkFWQV9EQVRBX1RZUEVfSU5TVEFOQ0UgPSAwOwotCi0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklKYXZhIERhdGEgVHlwZSBJbnN0YW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSkFWQV9EQVRBX1RZUEVfSU5TVEFOQ0VfRkVBVFVSRV9DT1VOVCA9IElKQVZBX0lOU1RBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSmF2YSBPYmplY3QgSW5zdGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUpBVkFfT0JKRUNUX0lOU1RBTkNFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9JTlNUQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5KYXZhQWxsb2NhdGlvbkltcGwgPGVtPkphdmEgQWxsb2NhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSmF2YUFsbG9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRKYXZhQWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKQVZBX0FMTE9DQVRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KYXZhIEFsbG9jYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbCA8ZW0+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRJbml0U3RyaW5nQWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTklUX1NUUklOR19BTExPQ0FUSU9OID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0IFN0cmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOSVRfU1RSSU5HX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbXBsaWNpdEFsbG9jYXRpb25JbXBsIDxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbXBsaWNpdEFsbG9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRJbXBsaWNpdEFsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU1QTElDSVRfQUxMT0NBVElPTiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNUExJQ0lUX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBhcnNlVHJlZUFsbG9jYXRpb25JbXBsIDxlbT5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBhcnNlVHJlZUFsbG9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQYXJzZVRyZWVBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBUlNFX1RSRUVfQUxMT0NBVElPTiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTiA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUlNFX1RSRUVfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURXhwcmVzc2lvbkltcGwgPGVtPlBUIEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBURXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9FWFBSRVNTSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlBY2Nlc3NJbXBsIDxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlBY2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEFycmF5QWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0FSUkFZX0FDQ0VTUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJyYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9BQ0NFU1NfX0FSUkFZID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQUNDRVNTX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlDcmVhdGlvbkltcGwgPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5Q3JlYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEFycmF5Q3JlYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT04gPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9DUkVBVElPTl9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGltZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWxpemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQXJyYXkgQ3JlYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUluaXRpYWxpemVySW1wbCA8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlJbml0aWFsaXplckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQXJyYXlJbml0aWFsaXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9BUlJBWV9JTklUSUFMSVpFUiA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBBcnJheSBJbml0aWFsaXplcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9JTklUSUFMSVpFUl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEJvb2xlYW5MaXRlcmFsSW1wbCA8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEJvb2xlYW5MaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRCb29sZWFuTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9CT09MRUFOX0xJVEVSQUwgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb29sZWFuIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0JPT0xFQU5fTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENhc3RFeHByZXNzaW9uSW1wbCA8ZW0+UFQgQ2FzdCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENhc3RFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRDYXN0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9DQVNUX0VYUFJFU1NJT04gPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQ2FzdCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NBU1RfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENoYXJhY3RlckxpdGVyYWxJbXBsIDxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0NIQVJBQ1RFUl9MSVRFUkFMID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXNjYXBlZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFyIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DSEFSQUNURVJfTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwgPGVtPlBUIENsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bcmd1bWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwgPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJ1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZhbHNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0UgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBDb25kaXRpb25hbCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRGaWVsZEFjY2Vzc0ltcGwgPGVtPlBUIEZpZWxkIEFjY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRGaWVsZEFjY2Vzc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBURmllbGRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfRklFTERfQUNDRVNTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjZWl2ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0ZJRUxEX0FDQ0VTU19fRklFTEQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfRklFTERfQUNDRVNTX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbCA8ZW0+UFQgSW5maXggRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbmZpeEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEluZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVmdCBPcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcGVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SaWdodCBPcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgT3BlcmFuZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgSW5maXggRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VvZkltcGwgPGVtPlBUIEluc3RhbmNlb2Y8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VvZkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUSW5zdGFuY2VvZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRU9GID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFT0ZfX09QRVJBTkQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRU9GX19UWVBFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRU9GX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTWV0aG9kSW52b2NhdGlvbkltcGwgPGVtPlBUIE1ldGhvZCBJbnZvY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE1ldGhvZEludm9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVE1ldGhvZEludm9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfTUVUSE9EX0lOVk9DQVRJT04gPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNlaXZlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bcmd1bWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBNZXRob2QgSW52b2NhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9NRVRIT0RfSU5WT0NBVElPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE5hbWVJbXBsIDxlbT5QVCBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfTkFNRSA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9OQU1FX19OQU1FID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgTmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9OQU1FX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTnVsbExpdGVyYWxJbXBsIDxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTnVsbExpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVE51bGxMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX05VTExfTElURVJBTCA9IDIxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTlVMTF9MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTnVtYmVyTGl0ZXJhbEltcGwgPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE51bWJlckxpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVE51bWJlckxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfTlVNQkVSX0xJVEVSQUwgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub2tlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX05VTUJFUl9MSVRFUkFMX19UT0tFTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX05VTUJFUl9MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsIDxlbT5QVCBQYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTiA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT04gPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBQYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUHJlZml4RXhwcmVzc2lvbkltcGwgPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFByZWZpeEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFByZWZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfUFJFRklYX0VYUFJFU1NJT04gPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcGVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgUHJlZml4IEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfUFJFRklYX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRTdHJpbmdMaXRlcmFsSW1wbCA8ZW0+UFQgU3RyaW5nIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUU3RyaW5nTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUU3RyaW5nTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9TVFJJTkdfTElURVJBTCA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzY2FwZWQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGl0ZXJhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgU3RyaW5nIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfU1RSSU5HX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUaGlzTGl0ZXJhbEltcGwgPGVtPlBUIFRoaXMgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUaGlzTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUVGhpc0xpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfVEhJU19MSVRFUkFMID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIFRoaXMgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9USElTX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUeXBlTGl0ZXJhbEltcGwgPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUeXBlTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUVHlwZUxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfVFlQRV9MSVRFUkFMID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1RZUEVfTElURVJBTF9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9UWVBFX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwgPGVtPlBUIEludmFsaWQgRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUSW52YWxpZEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5WQUxJRF9FWFBSRVNTSU9OID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEludmFsaWQgRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlZBTElEX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwgPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUSW5zdGFuY2VSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VfUkVGRVJFTkNFID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0UgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwgPGVtPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlY2xhcmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wb3J0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yIDxlbT5QVCBJbmZpeCBPcGVyYXRvcjwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEluZml4T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfT1BFUkFUT1IgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvciA8ZW0+UFQgUHJlZml4IE9wZXJhdG9yPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFByZWZpeE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9PUEVSQVRPUiA9IDMyOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UgPGVtPklKYXZhIE9iamVjdCBJbnN0YW5jZTwvZW0+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+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlI2dldFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZV9SZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiA8ZW0+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbiA8ZW0+RGVjbGFyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWNsYXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbigpCi0JICogQHNlZSAjZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0SW1wb3J0cyA8ZW0+SW1wb3J0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW1wb3J0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXRJbXBvcnRzKCkKLQkgKiBAc2VlICNnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9JbXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvciA8ZW0+UFQgSW5maXggT3BlcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5QVCBJbmZpeCBPcGVyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRQVEluZml4T3BlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvciA8ZW0+UFQgUHJlZml4IE9wZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UFQgUHJlZml4IE9wZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRQVFByZWZpeE9wZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZSA8ZW0+SUphdmEgRGF0YSBUeXBlIEluc3RhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIERhdGEgVHlwZSBJbnN0YW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUphdmFEYXRhVHlwZUluc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UgPGVtPklKYXZhIEluc3RhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIEluc3RhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElKYXZhSW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUluc3RhbnRpYXRpb25GYWN0b3J5IGdldEluc3RhbnRpYXRpb25GYWN0b3J5KCk7Ci0KLX0gLy9JbnN0YW50aWF0aW9uUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSmF2YUFsbG9jYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0phdmFBbGxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTI5ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSmF2YUFsbG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhQWxsb2NhdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzEwLzAzIDE5OjIwOjQxICQgCi0gKi8KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB0aGUgYWxsb2NhdGlvbiBjbGFzcy4gSXQgaXMgdGhlIHZhbHVlIG9mIHRoZSAiYWxsb2NhdGlvbiIgcHJvcGVydHkgb24gYSBKYXZhIE9iamVjdCBzbyB0aGF0IHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBjYW4gYmUgY29udHJvbGxlZC4gRm9yIGV4YW1wbGUsIHRoZXJlIGNvdWxkIGJlIG9uZSBmb3IganVzdCBpbml0IHN0cmluZywgb3Igb25lIGZvciBzZXJpYWxpemVkLgotICogPC9wPgotICogQHNpbmNlIDEuMC4wCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgdGhlIGFsbG9jYXRpb24gY2xhc3MuIEl0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgImFsbG9jYXRpb24iIHByb3BlcnR5IG9uIGEgSmF2YSBPYmplY3Qgc28gdGhhdCB0aGUgYWN0dWFsIGFsbG9jYXRpb24gY2FuIGJlIGNvbnRyb2xsZWQuIEZvciBleGFtcGxlLCB0aGVyZSBjb3VsZCBiZSBvbmUgZm9yIGp1c3QgaW5pdCBzdHJpbmcsIG9yIG9uZSBmb3Igc2VyaWFsaXplZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRKYXZhQWxsb2NhdGlvbigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUFsbG9jYXRpb24gZXh0ZW5kcyBFT2JqZWN0ewotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGlzIGEgcGFyc2UgdHJlZSBhbGxvY2F0aW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGFyc2UgdHJlZSBhbGxvY2F0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWUoKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGUgYWxsb2NhdGlvbiBpcyBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaW1wbGljaXQgYWxsb2NhdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXQoKTsKLX0gLy8gSmF2YUFsbG9jYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYjZiOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhLHYgMS4xIDIwMDUvMTAvMjggMjI6NTY6NDYgcmt1bHAgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24uIEN1cnJlbnRseSB3ZSBvbmx5IHN0b3JlIHRoZSAKLSAqIGVudGlyZSBkZWNsYXJhdGlvbiBhcyBhIHN0cmluZywgaW5jbHVkaW5nIHRoZSAibmV3IEFDbGFzcygpIHsuLi59Ii4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0RGVjbGFyYXRpb24gPGVtPkRlY2xhcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0SW1wb3J0cyA8ZW0+SW1wb3J0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWNsYXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlY2xhcmF0aW9uIHRleHQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlY2xhcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWNsYXJhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fRGVjbGFyYXRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbiA8ZW0+RGVjbGFyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlY2xhcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWNsYXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVjbGFyYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcG9ydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGltcG9ydHMgbmVlZGVkIGluIHRoZSBtYWluIGNsYXNzIGJ5IHRoaXMgZGVjbGFyYXRpb24uIFRoaXMgaXMgYSB0cmFuc2llbnQgYXR0cmlidXRlLiBJdCBpcyBub3Qgc2VyaWFsaXplZCwgbm9yIGlzIGl0IHBhcnNlZCBpbnRvIGZyb20gZXhpc3RpbmcgY29kZS4gSXRzIG9ubHkgcHVycG9zZSBpcyB0byBoZWxwIGNvZGUgZ2VuZXJhdGlvbiBvbiBhIGJyYW5kIG5ldyBkZWNsYXJhdGlvbiB0byBrbm93IHdoYXQgaW1wb3J0cyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIG1haW4gY2xhc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkltcG9ydHM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fSW1wb3J0cygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW1wb3J0cygpOwotCi19IC8vIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUFjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY4ZmE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBQVEFycmF5QWNjZXNzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+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+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQYXJzZVRyZWVBbGxvY2F0aW9uX0V4cHJlc3Npb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBQYXJzZVRyZWVBbGxvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QYXJzZVZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2M2Zjg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBhcnNlVmlzaXRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzEwLzI4IDIyOjU2OjQ2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0gCi0vKioKLSAqIEEgdmlzaXRvciBmb3IgYWJzdHJhY3QgcGFyc2UgZXhwcmVzc2lvbiB0cmVlcy4KLSAqIDxwPgotICogRm9yIGVhY2ggZGlmZmVyZW50IGNvbmNyZXRlIEV4cHJlc3Npb24gbm9kZSB0eXBlIDxpdD5UPC9pdD4gdGhlcmUgYXJlCi0gKiBhIHBhaXIgb2YgbWV0aG9kczoKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5wdWJsaWMgYm9vbGVhbiB2aXNpdCg8aXQ+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+KS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIG5vZGUgdG8gdmlzaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0VmlzaXQoUFRFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5zdGFuY2VvZiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE5hbWUgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bWJlckxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUVGhpc0xpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluc3RhbmNlUmVmZXJlbmNlIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRBcnJheUFjY2VzcyBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRJbnN0YW5jZW9mIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUTmFtZSBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFROdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFROdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRUaGlzTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRJbnN0YW5jZVJlZmVyZW5jZSBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0ZlYXR1cmVWYWx1ZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0ZlYXR1cmVWYWx1ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMWM4YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9GZWF0dXJlVmFsdWVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEZlYXR1cmVWYWx1ZVByb3ZpZGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgKGFuIEVNRiBFT2JqZWN0IHN1YmNsYXNzKSBwcm92aWRlIGEgdmlzaXRlcgotICogY2FwYWJpbGl0eSB0byB0aGUgc2V0IGZlYXR1cmVzIG9uIHRoZSBFT2JqZWN0LiBUaGlzIHdheSBvbmx5IHRoZSBzZXQgZmVhdHVyZXMKLSAqIGFyZSBwcmVzZW50ZWQgdG8gdGhlIHZpc2l0b3IuIFRoaXMgY2FuIHNhdmUgYSBsb3Qgb2YgdGltZS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZVZhbHVlUHJvdmlkZXIgewotCQotCS8qKgotCSAqIEEgaGVscGVyIGNsYXNzIGZvciBGZWF0dXJlVmFsdWVQcm92aWRlci4KLQkgKiAKLQkgKiBAc2VlIEZlYXR1cmVWYWx1ZVByb3ZpZGVySGVscGVyI3Zpc2l0U2V0RmVhdHVyZXMoRU9iamVjdCwgVmlzaXRvcikKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZlYXR1cmVWYWx1ZVByb3ZpZGVySGVscGVyIHsKLQkJCi0JCS8qKgotCQkgKiBBIGhlbHBlciB0byBoYW5kbGUgd2hlcmUgdGhlIG9iamVjdCBtYXkgb3IgbWF5IG5vdCBiZQotCQkgKiBpbXBsZW1lbnQgRmVhdHVyZVZhbHVlUHJvdmlkZXIuIFRoaXMgd2F5IGl0IGNhbiBiZSBhCi0JCSAqIGNvbW1vbiBhY2Nlc3MgdG8gZG8gaXQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZW9iamVjdAotCQkgKiBAcGFyYW0gdmlzaXRvcgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHZpc2l0U2V0RmVhdHVyZXMoRU9iamVjdCBlb2JqZWN0LCBWaXNpdG9yIHZpc2l0b3IpIHsKLQkJCWlmIChlb2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlUHJvdmlkZXIpCi0JCQkJcmV0dXJuICgoRmVhdHVyZVZhbHVlUHJvdmlkZXIpZW9iamVjdCkudmlzaXRTZXRGZWF0dXJlcyh2aXNpdG9yKTsKLQkJCWVsc2UgewotCQkJCS8vIE5vdCBhIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLCBzbyBkbyBub3JtYWwuCi0JCQkJSXRlcmF0b3IgZmVhdHVyZXMgPSBlb2JqZWN0LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGZlYXR1cmVzLmhhc05leHQoKSl7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZXMubmV4dCgpOwotCQkJCQlpZihlb2JqZWN0LmVJc1NldChzZikpewotCQkJCQkJT2JqZWN0IHJlc3VsdCA9IHZpc2l0b3IuaXNTZXQoc2YsIGVvYmplY3QuZUdldChzZikpOwotCQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBBbnN3ZXJzIHdoZXRoZXIgYW55IGZlYXR1cmUgaXMgc2V0IG9yIG5vdC4KLQkJICogPHA+Ci0JCSAqIDxiPk5vdGU6PC9iPiBUaGlzIFNIT1VMRCBOT1QgYmUgdXNlZCBhcyBhIHRlc3QgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdG8gZG8gdmlzaXRTZXRGZWF0dXJlcyBvciBub3QuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGp1c3QgY2FsbAotCQkgKiB2aXNpdFNldEZlYXR1cmVzLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5IHRvIHNlZSBpZiBhbnkgZmVhdHVyZXMgYXJlIHNldC4KLQkJICogCi0JCSAqIEBwYXJhbSBlb2JqZWN0Ci0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW55RmVhdHVyZVNldChFT2JqZWN0IGVvYmplY3QpIHsKLQkJCWlmIChlb2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlUHJvdmlkZXIpCi0JCQkJcmV0dXJuICgoRmVhdHVyZVZhbHVlUHJvdmlkZXIpZW9iamVjdCkuaXNBbnlGZWF0dXJlU2V0KCk7Ci0JCQllbHNlIHsKLQkJCQkvLyBOb3QgYSBGZWF0dXJlVmFsdWVQcm92aWRlciwgc28gZG8gbm9ybWFsLgotCQkJCUl0ZXJhdG9yIGZlYXR1cmVzID0gZW9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZShmZWF0dXJlcy5oYXNOZXh0KCkpewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmVzLm5leHQoKTsKLQkJCQkJaWYoZW9iamVjdC5lSXNTZXQoc2YpKXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0JCQkKLQkJfQotCQkKLQkJcHJpdmF0ZSBGZWF0dXJlVmFsdWVQcm92aWRlckhlbHBlcigpIHsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdmlzaXRlciBjYWxsYmFjay4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFZpc2l0b3J7Ci0JCS8qKgotCQkgKiBDYWxsZWQgZm9yIGVhY2ggc2V0IGZlYXR1cmUgb24gdGhlIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLgotCQkgKiAKLQkJICogQHBhcmFtIGZlYXR1cmUKLQkJICogQHBhcmFtIHZhbHVlCi0JCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gdG8gY29udGludWUgdG8gbmV4dCBzZXR0aW5nLCBvciBhIHZhbHVlIHRvIHN0b3AgdmlzaXRpbmcgYW5kIHJldHVybiB0aGF0IHZhbHVlIGJlIHRoZSByZWFsIGV4Y2VwdGlvbi4KLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlPYmplY3QgaXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSk7Ci0JfQkKLQotCS8qKgotCSAqIFZpc2l0IHRoZSBzZXQgZmVhdHVyZXMuCi0JICogQHBhcmFtIGFWaXNpdG9yCi0JICogQHBhcmFtIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFsbCBzZXR0aW5ncyB2aXNpdGVkLCBvciB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgdmlzaXQgKGlzU2V0KSB0aGF0IHJldHVybmVkIGEgbm9uLW51bGxTZS4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0U2V0RmVhdHVyZXMoVmlzaXRvciBhVmlzaXRvcik7Ci0JCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIGFueSBmZWF0dXJlIGlzIHNldCBvciBub3QuCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgU0hPVUxEIE5PVCBiZSB1c2VkIGFzIGEgdGVzdCBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciB0byBkbyB2aXNpdFNldEZlYXR1cmVzIG9yIG5vdC4gSXQgaXMKLQkgKiBtb3JlIGVmZmljaWVudCB0byBqdXN0IGNhbGwgdmlzaXRTZXRGZWF0dXJlcy4gSXQgc2hvdWxkIGJlIHVzZWQgb25seSB0byBzZWUgaWYgYW55IGZlYXR1cmVzIGFyZSBzZXQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgZmVhdHVyZXMgYXJlIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FueUZlYXR1cmVTZXQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFEYXRhVHlwZUluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjk1NDYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFEYXRhVHlwZUluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotICogICRSQ1NmaWxlOiBJSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciBpbnN0YW5jZXMgb2YgamF2YSBkYXRhIHR5cGVzLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFEYXRhVHlwZUluc3RhbmNlIGV4dGVuZHMgSUphdmFJbnN0YW5jZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YUluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWQ0MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YUluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotICogICRSQ1NmaWxlOiBJSmF2YUluc3RhbmNlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMTAvMDMgMTk6MjA6NDIgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSW5zdGFuY2U7Ci0vKioKLSAqIEEgY29tbW9uIGludGVyZmFjZSBmb3IgSmF2YSBpbnN0YW5jZXMuIEl0IHdpbGwgYmUKLSAqIHNoYXJlZCBieSBKYXZhIE9iamVjdHMgYW5kIEphdmEgRGF0YVR5cGUgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhSW5zdGFuY2UgZXh0ZW5kcyBFT2JqZWN0LCBGZWF0dXJlVmFsdWVQcm92aWRlciwgSUluc3RhbnRpYXRpb25JbnN0YW5jZSB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhbGxvY2F0aW9uIG9iamVjdC4KLQkgKiBAcmV0dXJuIFRoZSBhbGxvY2F0aW9uIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgSmF2YUFsbG9jYXRpb24gZ2V0QWxsb2NhdGlvbigpOwotCQotCS8qKgotCSAqIFNldCB0aGUgYWxsb2NhdGlvbiBmb3IgdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0JICogQHBhcmFtIGFsbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uKEphdmFBbGxvY2F0aW9uIGFsbG9jYXRpb24pOwkKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYWxsb2NhdGlvbiBoYXMgYmVlbiBzZXQgb3Igbm90LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2V0LiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFsbG9jYXRpb24oKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB3ZSBhcmUgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIEphdmEncyBwcmltaXRpdmUgZGF0YSB0eXBlcy4KLQkgKiBlLmcuIGJvb2xlYW4sIGNoYXIgLSB0cnVlIG90aGVyd2lzZSwgZS5nLiBqYXZhLmxhbmcuQm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhpcyBoYXMgYW4gaW1wbGljaXQgYWxsb2NhdGlvbi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGltcGxpY2l0IGFsbG9jYXRpb24uIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3Qgc2V0IG9yIG5vdCBpbXBsaWNpdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0QWxsb2NhdGlvbigpOwotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgaGFzIGFuIHBhcnNldHJlZSBhbGxvY2F0aW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGFyc2V0cmVlIGFsbG9jYXRpb24uIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3Qgc2V0IG9yIG5vdCBwYXJzZXRyZWUuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWVBbGxvY2F0aW9uKCk7Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFPYmplY3RJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YU9iamVjdEluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzliM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YU9iamVjdEluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotICogICRSQ1NmaWxlOiBJSmF2YU9iamVjdEluc3RhbmNlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciBqYXZhIG9iamVjdCBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFPYmplY3RJbnN0YW5jZSBleHRlbmRzIElKYXZhSW5zdGFuY2UgewotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0luc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1MjQ1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0luc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEluc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0N1cnJlbnRseVRoaXNOb3RTdXBwb3J0ZWRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3JfQ2Fubm90UHJvY2Vzc0Fub255bW91c0RlY2xhcmF0aW9uc19FWENfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyY2UzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFEYXRhVHlwZUluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBKYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgYSBKYXZhIE1vZGVsIERhdGF0eXBlIChpLmUuIHByaW1pdGl2ZSkuCi0gKiBJdCBjYW4gYmUgY3JlYXRlZCBmcm9tIGEgc3RyaW5nLCB3aGljaCBiZWNvbWVzIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcKLSAqIGZvciB0aGUgaW5zdGFuY2UuIEl0J3MgdG9TdHJpbmcgd2lsbCBiZSB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nLgotICoKLSAqIEl0IHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBkaXJlY3RseSwgdGhlIElKYXZhRGF0YVR5cGVJbnN0YW5jZSBpbnRlcmZhY2Ugc2hvdWxkIGJlCi0gKiB1c2VkIGluc3RlYWQuIEl0IGlzIHB1YmxpYyBzbyB0aGF0IGl0IGNhbiBiZSBzdWJjbGFzc2VkLiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFEYXRhVHlwZUluc3RhbmNlIGV4dGVuZHMgSmF2YUluc3RhbmNlIGltcGxlbWVudHMgSUphdmFEYXRhVHlwZUluc3RhbmNlIHsKLQotCXByb3RlY3RlZCBKYXZhRGF0YVR5cGVJbnN0YW5jZSgpIHsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCl7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUZhY3RvcnlIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFGYWN0b3J5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWU0MjU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUZhY3RvcnlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhRmFjdG9yeUhhbmRsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXI7Ci0KLS8qKgotICogQWRhcHRlciBvbiBKYXZhRmFjdG9yeUltcGwgdG8gZG8gaW5zdGFudGlhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEphdmFGYWN0b3J5SGFuZGxlciBpbXBsZW1lbnRzIElJbnN0YW50aWF0aW9uSGFuZGxlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEphdmFGYWN0b3J5SGFuZGxlciBJTlNUQU5DRSA9IG5ldyBKYXZhRmFjdG9yeUhhbmRsZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhRmFjdG9yeUFkYXB0ZXIuCi0JICovCi0JcHJvdGVjdGVkIEphdmFGYWN0b3J5SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlciNoYW5kbGVzQ2xhc3Mob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzQ2xhc3MoRUNsYXNzIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgaW5zdGFuY2VvZiBKYXZhQ2xhc3MgfHwgdHlwZSBpbnN0YW5jZW9mIEphdmFEYXRhVHlwZTsKLQkJLy8gRHVyaW5nIFhNSSBsb2FkaW5nLCBpdCBjYW4ndCB0ZWxsIHRoZSBKYXZhRGF0YVR5cGUgaXMgZGlmZmVyZW50IHRoYW4gSmF2YUNsYXNzLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyI2hhbmRsZXNEYXRhVHlwZShvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0RhdGFUeXBlKEphdmFEYXRhVHlwZSB0eXBlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyI2NyZWF0ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCUVPYmplY3QgcmVzdWx0ID0gamF2YUNsYXNzIGluc3RhbmNlb2YgSmF2YUNsYXNzID8gKEVPYmplY3QpIG5ldyBKYXZhT2JqZWN0SW5zdGFuY2UoKSA6IG5ldyBKYXZhRGF0YVR5cGVJbnN0YW5jZSgpOwotCQkoKEludGVybmFsRU9iamVjdCkgcmVzdWx0KS5lU2V0Q2xhc3MoamF2YUNsYXNzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4N2VlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGUkCi0gKiAgJFJldmlzaW9uJCAgJERhdGUkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBmb3IgamF2YSBtb2RlbCBvYmplY3RzLgotICogSXQgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGRpcmVjdGx5LCB0aGUgSUphdmFPYmplY3RJbnN0YW5jZSBpbnRlcmZhY2Ugc2hvdWxkIGJlCi0gKiB1c2VkIGluc3RlYWQuIEl0IGlzIHB1YmxpYyBzbyB0aGF0IGl0IGNhbiBiZSBzdWJjbGFzc2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUluc3RhbmNlIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJSmF2YUluc3RhbmNlIHsKLQkKLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0SmF2YVR5cGUoKXsKLQkJcmV0dXJuIChKYXZhSGVscGVycykgZUNsYXNzKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhQWxsb2NhdGlvbiBnZXRBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gaXNTZXRBbGxvY2F0aW9uKCkgPyAoSmF2YUFsbG9jYXRpb24pIGVHZXQoSmF2YUluc3RhbnRpYXRpb24uZ2V0QWxsb2NhdGlvbkZlYXR1cmUodGhpcykpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdEFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpc1NldEFsbG9jYXRpb24oKSAmJiBnZXRBbGxvY2F0aW9uKCkuaXNJbXBsaWNpdCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlVHJlZUFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpc1NldEFsbG9jYXRpb24oKSAmJiBnZXRBbGxvY2F0aW9uKCkuaXNQYXJzZVRyZWUoKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFZpc2l0IHRoZSBhcmd1bWVudCB3aXRoIGFsbCBvZiB0aGUgc2V0IGZlYXR1cmVzIGluIGFuIG9wdGltaXplZCBmYXNoaW9uIAotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIE9iamVjdCBOSUwgPSBFU3RydWN0dXJhbEZlYXR1cmVJbXBsLkludGVybmFsU2V0dGluZ0RlbGVnYXRlU2luZ2xlLk5JTDsKLQlwdWJsaWMgT2JqZWN0IHZpc2l0U2V0RmVhdHVyZXMoVmlzaXRvciBhVmlzaXRvcikgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGVIYXNTZXR0aW5ncygpKSB7Ci0JCQlKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyIHNldHRpbmdzID0gKEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIpIGVQcm9wZXJ0aWVzKCk7Ci0KLQkJCU9iamVjdFtdIHNldFByb3BlcnR5VmFsdWVzID0gc2V0dGluZ3MuZVNldHRpbmdzKCk7Ci0JCQlpZiAoc2V0UHJvcGVydHlWYWx1ZXMgIT0gbnVsbCkgewotCQkJCUxpc3QgYWxsRmVhdHVyZXMgPSBzZXR0aW5ncy5nZXRBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNldFByb3BlcnR5VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBwcm9wZXJ0eVZhbHVlID0gc2V0UHJvcGVydHlWYWx1ZXNbaV07Ci0JCQkJCWlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJCS8vIDxudWxsPiBpcyBoYW5kbGVkIGJ5IHRoZSBwbGFjZWhvbGRlciBOSUwuIEEgc2V0dGluZyBvZiB0cnVlIG51bGwgbWVhbnMgbm90IHNldC4gQSBzZXR0aW5nIG9mIE5JTCBtZWFucyBzZXQgdG8gbnVsbC4KLQkJCQkJCWlmIChwcm9wZXJ0eVZhbHVlID09IE5JTCkKLQkJCQkJCQlwcm9wZXJ0eVZhbHVlID0gbnVsbDsKLQkJCQkJCWlmICgocmVzdWx0ID0gYVZpc2l0b3IuaXNTZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsRmVhdHVyZXMuZ2V0KGkpLCBwcm9wZXJ0eVZhbHVlKSkgIT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBbnlGZWF0dXJlU2V0KCkgewotCQlpZiAoZUhhc1NldHRpbmdzKCkpIHsKLQkJCUphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIgc2V0dGluZ3MgPSAoSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlcikgZVByb3BlcnRpZXMoKTsKLQotCQkJT2JqZWN0W10gc2V0UHJvcGVydHlWYWx1ZXMgPSBzZXR0aW5ncy5lU2V0dGluZ3MoKTsKLQkJCWlmIChzZXRQcm9wZXJ0eVZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRQcm9wZXJ0eVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgcHJvcGVydHlWYWx1ZSA9IHNldFByb3BlcnR5VmFsdWVzW2ldOwotCQkJCQlpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBbGxvY2F0aW9uKCkgewotCQlFUmVmZXJlbmNlIGFsbG9jYXRpb25GZWF0dXJlID0gSmF2YUluc3RhbnRpYXRpb24uZ2V0QWxsb2NhdGlvbkZlYXR1cmUodGhpcyk7Ci0JCXJldHVybiBhbGxvY2F0aW9uRmVhdHVyZSAhPSBudWxsICYmIGVJc1NldChhbGxvY2F0aW9uRmVhdHVyZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb24oSmF2YUFsbG9jYXRpb24gYWxsb2NhdGlvbikgewotCQlFUmVmZXJlbmNlIGFsbG9jYXRpb25GZWF0dXJlID0gSmF2YUluc3RhbnRpYXRpb24uZ2V0QWxsb2NhdGlvbkZlYXR1cmUodGhpcyk7Ci0JCWlmIChhbGxvY2F0aW9uRmVhdHVyZSAhPSBudWxsKQotCQkJZVNldChhbGxvY2F0aW9uRmVhdHVyZSwgYWxsb2NhdGlvbik7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIEVPYmplY3QncyB0b1N0cmluZyBpcyB0b28gYmlnIGZvciB1cywgc28gd2UgZG8gYSBjdXN0b21pemVkIG9uZS4KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlyZXN1bHQuYXBwZW5kKCdAJyk7Ci0JCXJlc3VsdC5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7Ci0JCQotCQlpZiAoZUlzUHJveHkoKSkKLQkJewotCQkgIHJlc3VsdC5hcHBlbmQoIiAoZVByb3h5VVJJOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkgIHJlc3VsdC5hcHBlbmQoZVByb3h5VVJJKCkpOwotCQkgIHJlc3VsdC5hcHBlbmQoJyknKTsKLQkJfQotCQlpZihnZXRKYXZhVHlwZSgpICE9IG51bGwpewotCQkJcmVzdWx0LmFwcGVuZCgneycpOwotCQkJcmVzdWx0LmFwcGVuZChnZXRKYXZhVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCd9Jyk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlKYXZhQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0gZ2V0QWxsb2NhdGlvbigpOwotCQkJaWYgKGFsbG9jYXRpb24gIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hcHBlbmQoJzonKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoYWxsb2NhdGlvbi50b1N0cmluZygpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBjYW4gb2NjdXIgYmVjYXVzZSBzb21ldGltZXMgdGhpcyBlQ2xhc3MgY2FuJ3QgYmUgY29uc3RydWN0ZWQgcmlnaHQgYW5kIHdvbid0IGhhdmUgYW4gaW5pdHN0cmluZyBmZWF0dXJlLgotCQkJLy8gSW4gdGhhdCBjYXNlIGFuIE5QRSBpcyB0aHJvd24uCi0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIgZXh0ZW5kcyBFUHJvcGVydGllc0hvbGRlckltcGwgewotCQlwcml2YXRlIEVMaXN0IGFsbFN0cnVjdHVyYWxGZWF0dXJlczsKLQkJCi0JCXB1YmxpYyBKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyKCkgewotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZVNldHRpbmdzKCkgewotCQkJcmV0dXJuIGVTZXR0aW5nczsKLQkJfQotCi0JCXB1YmxpYyBFTGlzdCBnZXRBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSB7Ci0JCQlyZXR1cm4gYWxsU3RydWN0dXJhbEZlYXR1cmVzOwotCQl9Ci0JCQotCQkvKgotCQkgKiBDbGVhciB0aGUgY2FjaGUuIFRoaXMgaXMgZHVlIHRvIAotCQkgKiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIGhhdmUgY2hhbmdlZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCQllU2V0dGluZ3MgPSBudWxsOwotCQkJc2V0RUNvbnRlbnRzKG51bGwpOwotCQkJc2V0RUNyb3NzUmVmZXJlbmNlcyhudWxsKTsKLQkJCWFsbFN0cnVjdHVyYWxGZWF0dXJlcyA9IG51bGw7CQkJCi0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGwuRVByb3BlcnRpZXNIb2xkZXJJbXBsI2FsbG9jYXRlU2V0dGluZ3MoaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWxsb2NhdGVTZXR0aW5ncyhpbnQgbWF4aW11bUR5bmFtaWNGZWF0dXJlSUQpIHsKLQkJCWlmIChhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPT0gbnVsbCkKLQkJCQlhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPSBnZXRFQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7CQkJCi0JCQlzdXBlci5hbGxvY2F0ZVNldHRpbmdzKG1heGltdW1EeW5hbWljRmVhdHVyZUlEKTsKLQkJfQotCQkKLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGwuRVByb3BlcnRpZXNIb2xkZXJJbXBsI3NldEVDb250ZW50cyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFQ29udGVudHMoRUxpc3QgZUNvbnRlbnRzKSB7Ci0JCQlpZiAoYWxsU3RydWN0dXJhbEZlYXR1cmVzID09IG51bGwpCi0JCQkJYWxsU3RydWN0dXJhbEZlYXR1cmVzID0gZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJc3VwZXIuc2V0RUNvbnRlbnRzKGVDb250ZW50cyk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGwuRVByb3BlcnRpZXNIb2xkZXJJbXBsI3NldEVDcm9zc1JlZmVyZW5jZXMob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RUNyb3NzUmVmZXJlbmNlcyhFTGlzdCBlQ3Jvc3NSZWZlcmVuY2VzKSB7Ci0JCQlpZiAoYWxsU3RydWN0dXJhbEZlYXR1cmVzID09IG51bGwpCi0JCQkJYWxsU3RydWN0dXJhbEZlYXR1cmVzID0gZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJc3VwZXIuc2V0RUNyb3NzUmVmZXJlbmNlcyhlQ3Jvc3NSZWZlcmVuY2VzKTsKLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCBFUHJvcGVydGllc0hvbGRlciBlUHJvcGVydGllcygpCi0JewotCSAgaWYgKGVQcm9wZXJ0aWVzID09IG51bGwpCi0JICB7Ci0JCWVQcm9wZXJ0aWVzID0gbmV3IEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIoKTsKLQkgIH0KLQkgIHJldHVybiBlUHJvcGVydGllczsKLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlU2V0Q2xhc3MoRUNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXRDbGFzcyhFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyLmVTZXRDbGFzcyhlQ2xhc3MpOwotCQltaWdyYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0VDbGFzcyBOZXcgZUNsYXNzIHNldCB0by4gKG51bGwpIHdoZW4gbWlncmF0aW5nIHdoaWxlIG5vdCBzZXR0aW5nIGEgbmV3IEVDbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlKCkgewotCQkvLyBOb3RlOiBUaGlzIGlzIGV4dHJlbWVsbHkgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiBJdCBtYXkgY2hhbmdlIGZvciBhbnkgaW1wbGVtZW50YXRpb24gb2YgRU1GLgkKLQkJaWYgKGVQcm9wZXJ0aWVzICE9IG51bGwgJiYgKGVQcm9wZXJ0aWVzLmhhc1NldHRpbmdzKCkgfHwgZVByb3BlcnRpZXMuZ2V0RUNvbnRlbnRzKCkgIT0gbnVsbCB8fCBlUHJvcGVydGllcy5nZXRFQ3Jvc3NSZWZlcmVuY2VzKCkgIT0gbnVsbCkpIHsKLQkJCS8vIE1heWJlIG5lZWQgdG8gcmVjb25zdHJ1Y3Qgc2V0dGluZ3Mgb3IgY2xlYXIgY2FjaGUuCi0JCQlKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyIHByb3BlcnRpZXMgPSAoSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlcikgZVByb3BlcnRpZXM7Ci0JCQlFTGlzdCBvbGRBbGxGZWF0dXJlcyA9IHByb3BlcnRpZXMuZ2V0QWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQkKLQkJCS8vIFNlZSBpZiBtaWdyYXRpb24gbmVlZGVkLgotCQkJaWYgKHByb3BlcnRpZXMuZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpID09IG9sZEFsbEZlYXR1cmVzKQotCQkJCXJldHVybjsJLy8gTm8gbWlncmF0aW9uIG5lZWRlZC4KLQkJCQotCQkJT2JqZWN0W10gb2xkU2V0dGluZ3MgPSBwcm9wZXJ0aWVzLmVTZXR0aW5ncygpOwkJCQotCQkJcHJvcGVydGllcy5jbGVhckNhY2hlKCk7CS8vIENsZWFyIHRoZSBjYWNoZSBzbyB3ZSBjYW4gcmVidWlsZCBpdC4KLQkJCWlmIChvbGRTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwkvLyBJdCB3YXMganVzdCBlaXRoZXIgY29udGVudHMgb3IgY3Jvc3NyZWZzLCBhbmQgdGhleSBoYXZlIGJlZW4gYXBwcm9wcmlhdGVseSBjbGVhcmVkLgkJCQotCQkJfQotCQkJCi0JCQkvLyBJdCBpcyBhc3N1bWVkIHRoYXQgYW55IFNGIHRoYXQgKGJ5IGlkZW50aXR5KSBpcyBpbgotCQkJLy8gYm90aCB0aGUgb2xkIGFuZCB0aGUgbmV3IGVDbGFzcywgdGhlbiBpdCBkb2Vzbid0IGhhdmUgYW55IGludGVybmFsIGNoYW5nZXMuIEl0IHNpbXBseSBjaGFuZ2VkIHBvc2l0aW9uCi0JCQkvLyBpbiB0aGUgc2V0dGluZ3MgbGlzdC4gT3RoZXJ3aXNlLCBuZWVkIHRvIHNlZSBpZiBjb21wYXRpYmxlIGJ5IHNhbWUgbmFtZSwgYW5kIGlmIHNvLCBtb3ZlIGl0LgkJCQotCQkJZVNldHRpbmdzKCk7CS8vIENyZWF0ZSBuZXcgc2V0dGluZ3MKLQkJCU9iamVjdFtdIG5ld1NldHRpbmdzID0gcHJvcGVydGllcy5lU2V0dGluZ3MoKTsKLQkJCWludCBzdGF0aWNGZWF0dXJlQ250ID0gZVN0YXRpY0ZlYXR1cmVDb3VudCgpOwkJCQotCQkJZm9yIChpbnQgb2xkSW5kZXggPSAwOyBvbGRJbmRleCA8IG9sZFNldHRpbmdzLmxlbmd0aDsgb2xkSW5kZXgrKykgewotCQkJCWlmIChvbGRTZXR0aW5nc1tvbGRJbmRleF0gIT0gbnVsbCkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBvbGRBbGxGZWF0dXJlcy5nZXQob2xkSW5kZXgrc3RhdGljRmVhdHVyZUNudCk7Ci0JCQkJCWludCBuZXdJbmRleCA9IHN1cGVyLmVEeW5hbWljRmVhdHVyZUlEKHNmKTsJLy8gVG8gYXZvaWQgcmVjdXJzZSBvbiBtaWdyYXRlLgotCQkJCQlpZiAobmV3SW5kZXggPiAtMSkgewotCQkJCQkJbW92ZUVTZXR0aW5nKG9sZFNldHRpbmdzLCBuZXdTZXR0aW5ncywgb2xkSW5kZXgsIHNmLCBuZXdJbmRleCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBTZWUgaWYgaXQgZXhpc3RzIGJ5IG5hbWUgYW5kIGlzIGNvbXBhdGlibGUuCi0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgbmV3U0YgPSBwcm9wZXJ0aWVzLmdldEVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShzZi5nZXROYW1lKCkpOwotCQkJCQkJaWYgKG5ld1NGICE9IG51bGwgJiYgbmV3U0YuZ2V0Q2xhc3MoKS5lcXVhbHMoc2YuZ2V0Q2xhc3MoKSkgJiYKLQkJCQkJCQluZXdTRi5pc01hbnkoKSA9PSBzZi5pc01hbnkoKSAmJiBuZXdTRi5pc0NoYW5nZWFibGUoKSA9PSBzZi5pc0NoYW5nZWFibGUoKSkgewotCQkJCQkJCWJvb2xlYW4gY29tcGF0aWJsZSA9IG5ld1NGLmlzVW5pcXVlKCkgPT0gc2YuaXNVbmlxdWUoKSB8fCAhbmV3U0YuaXNVbmlxdWUoKTsJLy8gSWYgbmV3IGlzIG5vdCB1bmlxdWUsIHRoZW4gZG9lc24ndCBtYXR0ZXIgaWYgb2xkIGFuZCBuZXcgYXJlIHRoZSBzYW1lCi0JCQkJCQkJaWYgKG5ld1NGIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQkJCQlFUmVmZXJlbmNlIG5ld1JlZiA9IChFUmVmZXJlbmNlKSBuZXdTRjsKLQkJCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgc2Y7Ci0JCQkJCQkJCWNvbXBhdGlibGUgPSBuZXdSZWYuaXNDb250YWlubWVudCgpID09IHJlZi5pc0NvbnRhaW5tZW50KCkgJiYgbmV3UmVmLmdldEVSZWZlcmVuY2VUeXBlKCkuaXNTdXBlclR5cGVPZihyZWYuZ2V0RVJlZmVyZW5jZVR5cGUoKSk7Ci0JCQkJCQkJfSBlbHNlCi0JCQkJCQkJCWNvbXBhdGlibGUgPSBuZXdTRi5nZXRFVHlwZSgpLmVxdWFscyhzZi5nZXRFVHlwZSgpKTsKLQkJCQkJCQkJCi0JCQkJCQkJaWYgKGNvbXBhdGlibGUpIHsKLQkJCQkJCQkJbmV3SW5kZXggPSBlRHluYW1pY0ZlYXR1cmVJRChuZXdTRik7Ci0JCQkJCQkJCW1vdmVFU2V0dGluZyhvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MsIG9sZEluZGV4LCBuZXdTRiwgbmV3SW5kZXgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbW92ZUVTZXR0aW5nKE9iamVjdFtdIG9sZFNldHRpbmdzLCBPYmplY3RbXSBuZXdTZXR0aW5ncywgaW50IG9sZEluZGV4LCBFU3RydWN0dXJhbEZlYXR1cmUgc2YsIGludCBuZXdJbmRleCkgewotCQkvLyBTZWUgaWYgc2luZ2xlIHZzIG1hbnkuCi0JCWlmICghc2YuaXNNYW55KCkpCi0JCQluZXdTZXR0aW5nc1tuZXdJbmRleF0gPSBvbGRTZXR0aW5nc1tvbGRJbmRleF07CS8vIEdyZWF0LCB3ZSBjYW4ganVzdCBtb3ZlIGl0IG92ZXIuCi0JCWVsc2UgewotCQkJLy8gTWFueSBpcyBtb3JlIGRpZmZpY3VsdC4gTmVlZCB0byBjcmVhdGUgYSBuZXcgZHluYW1pYyBsaXN0IG9mIHJpZ2h0IHR5cGUsIGFuZAotCQkJLy8gdGhlbiBqdXN0IGNvcHkgb3ZlciB0aGUgZGF0YSBmcm9tIHRoZSBvbGQgb25lLiBXZSBjcmVhdGUgbmV3IG9uZSBieSBkb2luZyBhIHNpbXBsZSBlR2V0LgotCQkJLy8gVGhpcyB3aWxsIGNvbnN0cnVjdCBhbiBlbXB0eSBvbmUgd2l0aCBubyBub3RpZmljYXRpb25zIGdvaW5nIG91dC4KLQkJCS8vIE5vdGU6IFRoaXMgaXMgZXh0cmVtZWxseSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIFdlIHdpbGwgYmUgdGhyb3dpbmcgYXdheSB0aGUgb2xkCi0JCQkvLyBvbGRNYW55LCBzbyBpdCBpcyBvayB0byByZXVzZSB0aGUgYWN0dWFsIGFycmF5IG9mIGRhdGEgZm9yIHRoZSBuZXdNYW55LgotCQkJQmFzaWNFTGlzdCBuZXdNYW55ID0gKEJhc2ljRUxpc3QpIGVHZXQoc2YpOwotCQkJQmFzaWNFTGlzdCBvbGRNYW55ID0gKEJhc2ljRUxpc3QpIG9sZFNldHRpbmdzW29sZEluZGV4XTsKLQkJCW5ld01hbnkuc2V0RGF0YShvbGRNYW55LnNpemUoKSwgb2xkTWFueS5kYXRhKCkpOyAKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsI2VEeW5hbWljRmVhdHVyZUlEKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHJvdGVjdGVkIGludCBlRHluYW1pY0ZlYXR1cmVJRChFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCW1pZ3JhdGUoKTsJLy8gU2VlIGlmIG1pZ3JhdGlvbiBuZWVkZWQsIGFuZCBkbyBpZiBpdCBkb2VzLgotCQlyZXR1cm4gc3VwZXIuZUR5bmFtaWNGZWF0dXJlSUQoZVN0cnVjdHVyYWxGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCNlQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBlQ29udGVudHMoKSB7Ci0JCW1pZ3JhdGUoKTsJCQkKLQkJcmV0dXJuIHN1cGVyLmVDb250ZW50cygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0I2VDcm9zc1JlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBlQ3Jvc3NSZWZlcmVuY2VzKCkgewotCQltaWdyYXRlKCk7CQkJCi0JCXJldHVybiBzdXBlci5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNDZiMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFJbnN0YW50aWF0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBqYXZhIG1vZGVsIGluc3RhbnRpYXRpb24gY29kZSBhbmQgdG8gYWNjZXNzIGR5bmFtaWMgZmVhdHVyZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSW5zdGFudGlhdGlvbiB7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT0NBVElPTiA9ICJhbGxvY2F0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdldCBhIHN0cnVjdHVyYWwgZmVhdHVyZSBmcm9tIGFuIGluc3RhbmNlIG9mIGFuIElKYXZhT2JqZWN0SW5zdGFuY2UsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFNGZWF0dXJlKElKYXZhT2JqZWN0SW5zdGFuY2Ugam9iamVjdCwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiBqb2JqZWN0LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHJlZmVyZW5jZSBmcm9tIGFuIGluc3RhbmNlIG9mIGFuIElKYXZhT2JqZWN0SW5zdGFuY2UsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBnZXRTRmVhdHVyZShqb2JqZWN0LCBmZWF0dXJlTmFtZSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBHZXQgYSBzdHJ1Y3R1cmFsIGZlYXR1cmUgZnJvbSBhbiBpbnN0YW5jZSBvZiBhbiBJSmF2YU9iamVjdEluc3RhbmNlLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIGdldFNGZWF0dXJlKChKYXZhQ2xhc3MpIGpvYmplY3QuZ2V0SmF2YVR5cGUoKSwgc2ZVUkkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHN0cnVjdHVyYWwgZmVhdHVyZSBmcm9tIGEgSmF2YUNsYXNzLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoSmF2YUNsYXNzIGpjbGFzcywgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiBnZXRTRmVhdHVyZShqY2xhc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSwgc2ZVUkkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBzdHJ1Y3R1cmFsIGZlYXR1cmUgZnJvbSBhIFJlc291cmNlU2V0LCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoUmVzb3VyY2VTZXQgcnNldCwgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVN0cnVjdHVyYWxGZWF0dXJlKSByc2V0LmdldEVPYmplY3Qoc2ZVUkksIHRydWUpOwotCX0JCi0JCi0JLyoqCi0JICogR2V0IGEgcmVmZXJlbmNlIGZyb20gYW4gaW5zdGFuY2Ugb2YgYW4gSUphdmFPYmplY3RJbnN0YW5jZSwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBnZXRTRmVhdHVyZSgoSmF2YUNsYXNzKSBqb2JqZWN0LmdldEphdmFUeXBlKCksIHNmVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSByZWZlcmVuY2UgZnJvbSBhIEphdmFDbGFzcywgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoSmF2YUNsYXNzIGpjbGFzcywgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ2V0U0ZlYXR1cmUoamNsYXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCksIHNmVVJJKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgcmVmZXJlbmNlIGZyb20gYSBSZXNvdXJjZVNldCwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoUmVzb3VyY2VTZXQgcnNldCwgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcnNldC5nZXRFT2JqZWN0KHNmVVJJLCB0cnVlKTsKLQl9CQotCQotCS8qKgotCSAqIEdldCB0aGUgYWxsb2NhdGlvbiBGZWF0dXJlIGZvciB0aGlzIG9iamVjdC4gU2luY2UgaXQgZGVwZW5kcwotCSAqIG9uIHdoYXQgcmVzb3VyY2UgdGhhdCB0aGUgbWV0YWNsYXNzIGlzIGRlZmluZWQgaW4sIHdlIG11c3QgbG9vayBmb3IgaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBFUmVmZXJlbmNlIGdldEFsbG9jYXRpb25GZWF0dXJlKElKYXZhSW5zdGFuY2Ugamluc3RhbmNlKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgamluc3RhbmNlLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShBTExPQ0FUSU9OKTsKLQl9Ci0JCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShSZXNvdXJjZVNldCByc2V0KSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyc2V0LCBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5BREFQVEVSX0tFWSkgPT0gbnVsbCkKLQkJCQlyc2V0LmVBZGFwdGVycygpLmFkZChuZXcgSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDVkZjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzUgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIGF0dGFjaGVkIHRvIHRoZSByZXNvdXJjZSBzZXQgZm9yIGEgamF2YSBtb2RlbC4gVGhlCi0gKiBKYXZhWE1JRmFjdG9yeSB3aWxsIGFzayBmb3IgdGhpcyBhZGFwdGVyIGFuZCBhc2sgaXQgZm9yIHRoZSBJSW5zdGFudGlhdGlvbkhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBKYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyI2dldEluc3RhbnRpYXRpb25IYW5kbGVyKEphdmFGYWN0b3J5SW1wbCkKLQkgKi8KLQlwdWJsaWMgSUluc3RhbnRpYXRpb25IYW5kbGVyIGdldEluc3RhbnRpYXRpb25IYW5kbGVyKEphdmFGYWN0b3J5SW1wbCBmYWN0b3J5KSB7Ci0JCXJldHVybiBKYXZhRmFjdG9yeUhhbmRsZXIuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLkFEQVBURVJfS0VZID09IHR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFPYmplY3RJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhT2JqZWN0SW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3MzI3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFPYmplY3RJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSmF2YU9iamVjdEluc3RhbmNlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE4ICQgICREYXRlOiAyMDA1LzA4LzIzIDIxOjEzOjAxICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLSAKLQotLyoqCi0gKiBKYXZhIE9iamVjdCBJbnN0YW5jZSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBzaW5jZSAxLjEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhT2JqZWN0SW5zdGFuY2UgZXh0ZW5kcyBKYXZhSW5zdGFuY2UgaW1wbGVtZW50cyBJSmF2YU9iamVjdEluc3RhbmNlIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSNpc1ByaW1pdGl2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL1BhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTI3NDY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMTAvMjggMjI6NTY6NDYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS4qOwotIAotLyoqCi0gKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBwYXJzZSB2aXNpdG9yIGZvciBpbnN0YW50aWF0aW5nIGEgYmVhbiBwcm94eSBmcm9tIGEgamF2YSBwYXJzZSB0cmVlIGFsbG9jYXRpb24uCi0gKiBJdCBjYW4gYmUgcmV1c2VkLCBidXQgaXMgbm90IHRocmVhZC1zYWZlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvciBleHRlbmRzIFBhcnNlVmlzaXRvciB7Ci0JCQotCS8qKgotCSAqIFRoZSBleHByZXNzaW9uIHRoYXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgZXZhbHVhdGVkLgotCSAqLwotCXByaXZhdGUgSUV4cHJlc3Npb24gZXhwcmVzc2lvbjsKLQkKLQkvKgotCSAqIFRoZSBuZXh0IGV4cHJlc3Npb24gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkLiBJdCBpcyB1c2VkIHdoZW4gb25lIGV4cHJlc3Npb24gaXMgc2VuZGluZyB0aGUKLQkgKiB2aXNpdGF0aW9uIHRvIHRoZSBuZXh0IGV4cHJlc3Npb24uIEl0IHdpbGwgc2V0IHRoaXMgdG8gd2hhdCB0aGF0IGV4cHJlc3Npb24gc2hvdWxkIGJlIHVzaW5nLiBUaGlzCi0JICogaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIG5leHQgZXhwcmVzc2lvbiBkb2Vzbid0IGtub3cgd2hhdCBpdCBzaG91bGQgYmUuCi0JICovCi0JcHJpdmF0ZSBGb3JFeHByZXNzaW9uIG5leHRFeHByZXNzaW9uID0gRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTjsKLQkKLQkvKioKLQkgKiBBbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3NpbmcuIEl0IGlzIGEgUnVudGltZUV4Y2VwdGlvbiBiZWNhdXNlCi0JICogaXQgY2FuIGJlIHRocm93biBhdCBhbnkgdGltZS4gSXQgd3JhcHBlcnMgYW5vdGhlciBleGNlcHRpb24uIFRoYXQgZXhjZXB0aW9uCi0JICogY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBjYXVzZSBvZiB0aGUgUHJvY2Vzc2luZ0V4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAc2VlIFRocm93YWJsZSNnZXRDYXVzZSgpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzaW5nRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTI2ODYyNDIyMjQ5MDQwNjY0M0w7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBjYXVzZQotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgUHJvY2Vzc2luZ0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJCXN1cGVyKGNhdXNlKTsKLQkJfQotCX0KLQkKLQlzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvcltdIElORklYVE9QUk9YWTsKLQlzdGF0aWMgewotCQlJTkZJWFRPUFJPWFkgPSBuZXcgSW5maXhPcGVyYXRvcltQVEluZml4T3BlcmF0b3IuVkFMVUVTLnNpemUoKV07Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuQU5EXSA9IEluZml4T3BlcmF0b3IuSU5fQU5EOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX0FORF0gPSBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX0FORDsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5DT05ESVRJT05BTF9PUl0gPSBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkRJVklERV0gPSBJbmZpeE9wZXJhdG9yLklOX0RJVklERTsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5FUVVBTFNdID0gSW5maXhPcGVyYXRvci5JTl9FUVVBTFM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuR1JFQVRFUl0gPSBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVI7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuR1JFQVRFUl9FUVVBTFNdID0gSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSX0VRVUFMUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5MRUZUX1NISUZUXSA9IEluZml4T3BlcmF0b3IuSU5fTEVGVF9TSElGVDsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5MRVNTXSA9IEluZml4T3BlcmF0b3IuSU5fTEVTUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5MRVNTX0VRVUFMU10gPSBJbmZpeE9wZXJhdG9yLklOX0xFU1NfRVFVQUxTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLk1JTlVTXSA9IEluZml4T3BlcmF0b3IuSU5fTUlOVVM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuTk9UX0VRVUFMU10gPSBJbmZpeE9wZXJhdG9yLklOX05PVF9FUVVBTFM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuT1JdID0gSW5maXhPcGVyYXRvci5JTl9PUjsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5QTFVTXSA9IEluZml4T3BlcmF0b3IuSU5fUExVUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5SRU1BSU5ERVJdID0gSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVI7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfU0lHTkVEXSA9IEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfU0lHTkVEOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1VOU0lHTkVEXSA9IEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfVU5TSUdORUQ7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuVElNRVNdID0gSW5maXhPcGVyYXRvci5JTl9USU1FUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5YT1JdID0gSW5maXhPcGVyYXRvci5JTl9YT1I7Ci0JfQotCQotCS8qKgotCSAqIEEgaGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBwYXJzZSB0cmVlJ3MgaW5maXggb3BlcmF0b3IgdG8gdGhlIFByb3h5IGluZml4IG9wZXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRvcgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluZml4T3BlcmF0b3IgY29udmVydFBUSW5maXhPcGVyYXRvclRvUHJveHlJbmZpeE9wZXJhdG9yKFBUSW5maXhPcGVyYXRvciBvcGVyYXRvcikgewotCQlyZXR1cm4gSU5GSVhUT1BST1hZW29wZXJhdG9yLmdldFZhbHVlKCldOwotCX0KLQotCXN0YXRpYyBmaW5hbCBQcmVmaXhPcGVyYXRvcltdIFBSRUZJWFRPUFJPWFk7Ci0Jc3RhdGljIHsKLQkJUFJFRklYVE9QUk9YWSA9IG5ldyBQcmVmaXhPcGVyYXRvcltQVFByZWZpeE9wZXJhdG9yLlZBTFVFUy5zaXplKCldOwotCQlQUkVGSVhUT1BST1hZW1BUUHJlZml4T3BlcmF0b3IuQ09NUExFTUVOVF0gPSBQcmVmaXhPcGVyYXRvci5QUkVfQ09NUExFTUVOVDsKLQkJUFJFRklYVE9QUk9YWVtQVFByZWZpeE9wZXJhdG9yLk1JTlVTXSA9IFByZWZpeE9wZXJhdG9yLlBSRV9NSU5VUzsKLQkJUFJFRklYVE9QUk9YWVtQVFByZWZpeE9wZXJhdG9yLk5PVF0gPSBQcmVmaXhPcGVyYXRvci5QUkVfTk9UOwotCQlQUkVGSVhUT1BST1hZW1BUUHJlZml4T3BlcmF0b3IuUExVU10gPSBQcmVmaXhPcGVyYXRvci5QUkVfUExVUzsKLQl9Ci0JCi0JLyoqCi0JICogQSBoZWxwZXIgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHBhcnNlIHRyZWUncyBwcmVmaXggb3BlcmF0b3IgdG8gdGhlIFByb3h5IHByZWZpeCBvcGVyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0b3IKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVmaXhPcGVyYXRvciBjb252ZXJ0UFRQcmVmaXhPcGVyYXRvclRvUHJveHlQcmVmaXhPcGVyYXRvcihQVFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCXJldHVybiBQUkVGSVhUT1BST1hZW29wZXJhdG9yLmdldFZhbHVlKCldOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHZpc2l0b3Igd2l0aCB0aGUgZ2l2ZW4gcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50IHJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBleHByZXNzaW9uLmdldFJlZ2lzdHJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCBleHByZXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSUV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQkKLQotCS8qKgotCSAqIEdldCB0aGUgYmVhbnByb3h5IGZvciB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgcmVnaXN0cnkuIEl0IHdpbGwgZXZhbHVhdGUgaW1tZWRpYXRlbHkuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldEJlYW5Qcm94eShQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLCBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLQkJdGhpcy5leHByZXNzaW9uID0gcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCXRyeSB7Ci0JCQlleHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKLQkJfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBIYW5kbGUgdGhlIG1vc3QgY29tbW9uIHRoYXQgbWFrZSBzZW5zZSB0byBiZSBrbm93IGRpc3RpbmN0bHkgYW5kIHRocm93IHRoZW0gaW5zdGVhZCBvZiBQcm9jZXNzaW5nRXhjZXB0aW9uLgotCQkJVGhyb3dhYmxlIHQgPSBlLmdldENhdXNlKCk7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKQotCQkJCXRocm93IChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbikgdDsKLQkJCWVsc2UgaWYgKHQgaW5zdGFuY2VvZiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikgdDsKLQkJCWVsc2UKLQkJCQl0aHJvdyBlOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBVc2luZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBwcm9jZXNzb3IgYWxsb2NhdGUgdGhlIHByb3h5LiBJdCB3aWxsIG5vdCBldmFsdWF0ZSBpbW1lZGlhdGVseSwgYnV0IGp1c3QgcHVzaCBvbnRvIHRoZSBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGV4cHJlc3Npb25Qcm9jZXNzb3IKLQkgKiBAcmV0dXJuIHRoZSBFeHByZXNzaW9uUHJveHkgZm9yIHRoZSBhbGxvY2F0aW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGdldFByb3h5KFBURXhwcmVzc2lvbiBleHByZXNzaW9uLCBJRXhwcmVzc2lvbiBleHByZXNzaW9uUHJvY2Vzc29yKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFByb2Nlc3NpbmdFeGNlcHRpb24gewotCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uUHJvY2Vzc29yOwotCQl0cnkgewotCQkJRXhwcmVzc2lvblByb3h5IHByb3h5ID0gZXhwcmVzc2lvblByb2Nlc3Nvci5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hUKTsKLQkJCWV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwotCQkJcmV0dXJuIHByb3h5OwotCQl9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEhhbmRsZSB0aGUgbW9zdCBjb21tb24gdGhhdCBtYWtlIHNlbnNlIHRvIGJlIGtub3cgZGlzdGluY3RseSBhbmQgdGhyb3cgdGhlbSBpbnN0ZWFkIG9mIFByb2Nlc3NpbmdFeGNlcHRpb24uCi0JCQlUaHJvd2FibGUgdCA9IGUuZ2V0Q2F1c2UoKTsKLQkJCWlmICh0IGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKQotCQkJCXRocm93IChJbGxlZ2FsU3RhdGVFeGNlcHRpb24pIHQ7Ci0JCQllbHNlCi0JCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIFNldCB0aGUgbmV4dCBleHByZXNzaW9uIHR5cGUuIChpLmUuIHRoZSA8Y29kZT5mb3JFeHByZXNzaW9uPC9jb2RlPiBmaWVsZCBvZiBtb3N0IG9mIHRoZSBjcmVhdGUgZXhwcmVzc2lvbiBtZXRob2RzLgotCSAqIAotCSAqIEBwYXJhbSBuZXh0RXhwcmVzc2lvbgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlSW5maXhFeHByZXNzaW9uKGludCwgaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBuZXh0RXhwcmVzc2lvbikgewotCQl0aGlzLm5leHRFeHByZXNzaW9uID0gbmV4dEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IGV4cHJlc3Npb24gdHlwZS4gKGkuZS4gdGhlIDxjb2RlPmZvckV4cHJlc3Npb248L2NvZGU+IGZpZWxkIG9mIG1vc3Qgb2YgdGhlIGNyZWF0ZSBleHByZXNzaW9uIG1ldGhvZHMuCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlSW5maXhFeHByZXNzaW9uKGludCwgaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEZvckV4cHJlc3Npb24gZ2V0TmV4dEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXh0RXhwcmVzc2lvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0Nhbm5vdFByb2Nlc3NBbm9ueW1vdXNEZWNsYXJhdGlvbnNfRVhDXywgbmV3IE9iamVjdFtdIHtub2RlLmdldERlY2xhcmF0aW9uKCl9KSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUFjY2VzcyBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVBcnJheUFjY2VzcyhnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldEluZGV4ZXMoKS5zaXplKCkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0FSUkFZKTsKLQkJbm9kZS5nZXRBcnJheSgpLmFjY2VwdCh0aGlzKTsKLQkJTGlzdCBpZHggPSBub2RlLmdldEluZGV4ZXMoKTsKLQkJaW50IHMgPSBpZHguc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCk7Ci0JCQkoKFBURXhwcmVzc2lvbikgaWR4LmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVBcnJheUNyZWF0aW9uKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpLCBub2RlLmdldERpbWVuc2lvbnMoKS5zaXplKCkpOwotCQlpZiAobm9kZS5nZXREaW1lbnNpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlub2RlLmdldEluaXRpYWxpemVyKCkuYWNjZXB0KHRoaXMpOwkvLyBBcnJheSBpbml0aWFsaXplciBkb2Vzbid0IHJlcXVpcmUgYSBuZXh0IGV4cHJlc3Npb24uCi0JCX0gZWxzZSB7Ci0JCQlMaXN0IGRpbXMgPSBub2RlLmdldERpbWVuc2lvbnMoKTsKLQkJCWludCBzID0gZGltcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04pOwotCQkJCSgoUFRFeHByZXNzaW9uKSBkaW1zLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVBcnJheUluaXRpYWxpemVyKG5vZGUuZ2V0RXhwcmVzc2lvbnMoKS5zaXplKCkpOwotCQlMaXN0IGV4cHMgPSBub2RlLmdldEV4cHJlc3Npb25zKCk7Ci0JCWludCBzID0gZXhwcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTik7Ci0JCQkoKFBURXhwcmVzc2lvbikgZXhwcy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuaXNCb29sZWFuVmFsdWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUNhc3RFeHByZXNzaW9uKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04pOwotCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0Q2hhclZhbHVlKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldFR5cGUoKSwgbm9kZS5nZXRBcmd1bWVudHMoKS5zaXplKCkpOwotCQlMaXN0IGFyZ3MgPSBub2RlLmdldEFyZ3VtZW50cygpOwotCQlpbnQgcyA9IGFyZ3Muc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQpOwotCQkJKChQVEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OKTsKLQkJbm9kZS5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcyk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSk7Ci0JCW5vZGUuZ2V0VHJ1ZSgpLmFjY2VwdCh0aGlzKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9GQUxTRSk7Ci0JCW5vZGUuZ2V0RmFsc2UoKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUZpZWxkQWNjZXNzKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0RmllbGQoKSwgbm9kZS5nZXRSZWNlaXZlcigpICE9IG51bGwpOwotCQlpZiAobm9kZS5nZXRSZWNlaXZlcigpICE9IG51bGwpIHsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIpOwotCQkJbm9kZS5nZXRSZWNlaXZlcigpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUluZml4RXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpLCBjb252ZXJ0UFRJbmZpeE9wZXJhdG9yVG9Qcm94eUluZml4T3BlcmF0b3Iobm9kZS5nZXRPcGVyYXRvcigpKSwgbm9kZS5nZXRFeHRlbmRlZE9wZXJhbmRzKCkuc2l6ZSgpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZUKTsKLQkJbm9kZS5nZXRMZWZ0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCk7Ci0JCW5vZGUuZ2V0UmlnaHRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlMaXN0IGV4dGVuZGVkID0gbm9kZS5nZXRFeHRlbmRlZE9wZXJhbmRzKCk7Ci0JCWludCBzID0gZXh0ZW5kZWQuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCk7Ci0JCQkoKFBURXhwcmVzc2lvbikgZXh0ZW5kZWQuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnN0YW5jZW9mIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTlNUQU5DRU9GX1ZBTFVFKTsKLQkJbm9kZS5nZXRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obm9kZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXROYW1lKCksIG5vZGUuZ2V0UmVjZWl2ZXIoKSAhPSBudWxsLCBub2RlLmdldEFyZ3VtZW50cygpLnNpemUoKSk7Ci0JCWlmIChub2RlLmdldFJlY2VpdmVyKCkgIT0gbnVsbCkgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfUkVDRUlWRVIpOwotCQkJbm9kZS5nZXRSZWNlaXZlcigpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlMaXN0IGFyZ3MgPSBub2RlLmdldEFyZ3VtZW50cygpOwotCQlpbnQgcyA9IGFyZ3Muc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQpOwotCQkJKChQVEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROYW1lIG5vZGUpIHsKLQkJLy8gVGhpcyBpcyBzcGVjaWFsIGluIHRoZSBQVE5hbWUgY2FuIG9ubHkgYmUgdXNlZCBhcyBhIHR5cGUgcmVjZWl2ZXIgYXQgdGhpcyB0aW1lLgotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlVHlwZVJlY2VpdmVyKG5vZGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVsbExpdGVyYWwgbm9kZSkgewotCQkvLyBUaGlzIGlzIHNwZWNpYWwgaW4gdGhlIFBUTmFtZSBjYW4gb25seSBiZSB1c2VkIGFzIGEgdHlwZSByZWNlaXZlciBhdCB0aGlzIHRpbWUuCi0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVOdWxsKGdldE5leHRFeHByZXNzaW9uKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bWJlckxpdGVyYWwgbm9kZSkgewotCQkvLyBJdCBpcyBhc3N1bWVkIHRoZSB0b2tlbnMgYXJlIHRyaW1tZWQuCi0JCVN0cmluZyBsaXQgPSBub2RlLmdldFRva2VuKCk7Ci0JCWNoYXIgbGFzdENoYXIgPSBsaXQuY2hhckF0KGxpdC5sZW5ndGgoKS0xKTsKLQkJaWYgKGxhc3RDaGFyID09ICdsJyB8fCBsYXN0Q2hhciA9PSAnTCcgKSB7Ci0JCQkvLyBJdCBpcyBkZWZpbml0ZWx5IGEgbG9uZy4KLQkJCS8vIFVzaW5nIGRlY29kZSBzbyB0aGF0IHRoaW5ncyBsaWtlIDB4MyB3aWxsIGJlIHBhcnNlZC4gcGFyc2VMb25nIHdvbid0IHJlY29nbml6ZSB0aG9zZS4KLQkJCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIExvbmcuZGVjb2RlKGxpdC5zdWJzdHJpbmcoMCwgbGl0Lmxlbmd0aCgpLTEpKS5sb25nVmFsdWUoKSk7Ci0JCX0gZWxzZSBpZiAobGFzdENoYXIgPT0gJ0YnIHx8IGxhc3RDaGFyID09ICdmJykgewotCQkJLy8gSXQgaXMgZGVmaW5pdGVseSBhIGZsb2F0LgotCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgRmxvYXQucGFyc2VGbG9hdChsaXQuc3Vic3RyaW5nKDAsIGxpdC5sZW5ndGgoKS0xKSkpOwotCQl9IGVsc2UgaWYgKGxhc3RDaGFyID09ICdEJyB8fCBsYXN0Q2hhciA9PSAnZCcpICB7Ci0JCQkvLyBJdCBpcyBkZWZpbml0ZWx5IGEgZG91YmxlLgotCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgRG91YmxlLnBhcnNlRG91YmxlKGxpdC5zdWJzdHJpbmcoMCwgbGl0Lmxlbmd0aCgpLTEpKSk7Ci0JCX0gZWxzZSBpZiAobGl0LmluZGV4T2YoJy4nKSAhPSAtMSB8fCBsaXQuaW5kZXhPZignZScpICE9IC0xIHx8IGxpdC5pbmRleE9mKCdFJykgIT0gLTEpIHsKLQkJCQkvLyBJdCBpcyBkZWZpbml0ZWx5IGEgZG91YmxlLiAoaGFzIGEgcGVyaW9kIG9yIGFuIGV4cG9uZW50LCBidXQgZG9lcyBub3QgaGF2ZSBhbiAnZicgb24gdGhlIGVuZCBpcyBhbHdheXMgYSBkb3VibGUpLgotCQkJCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIERvdWJsZS5wYXJzZURvdWJsZShsaXQuc3Vic3RyaW5nKDAsIGxpdC5sZW5ndGgoKSkpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFVzaW5nIGRlY29kZSBzbyB0aGF0IHRoaW5ncyBsaWtlIDB4MyB3aWxsIGJlIHBhcnNlZC4gcGFyc2VJbnQgd29uJ3QgcmVjb2duaXplIHRob3NlLgotCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgSW50ZWdlci5kZWNvZGUobGl0KS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsJLy8gRm9yIGluc3RhbnRpYXRpb24gcHVycG9zZXMsIHRoZSBwYXJlbnRoZXNpcyBjYW4gYmUgaWdub3JlZC4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgY29udmVydFBUUHJlZml4T3BlcmF0b3JUb1Byb3h5UHJlZml4T3BlcmF0b3Iobm9kZS5nZXRPcGVyYXRvcigpKSk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUFJFRklYX09QRVJBTkQpOwotCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcm94eUV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChub2RlLmdldExpdGVyYWxWYWx1ZSgpKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFRoaXNMaXRlcmFsIG5vZGUpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihJbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzLlBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcl9DdXJyZW50bHlUaGlzTm90U3VwcG9ydGVkX0VYQ18pOyAKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVR5cGVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2UxZjE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3JfQ3VycmVudGx5VGhpc05vdFN1cHBvcnRlZF9FWENfID0gSVdBVjAwMDFFIEN1cnJlbnRseSAidGhpcyIgaXMgbm90IHN1cHBvcnRlZAotUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0Nhbm5vdFByb2Nlc3NBbm9ueW1vdXNEZWNsYXJhdGlvbnNfRVhDXyA9IENhbm5vdCBwcm9jZXNzIGFub255bW91cyBkZWNsYXJhdGlvbnM6ICJ7MH0iCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0ltcGxpY2l0QWxsb2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW1wbGljaXRBbGxvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWEyOTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW1wbGljaXRBbGxvY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEltcGxpY2l0QWxsb2NhdGlvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwNS8xMC8wMyAxOToyMDo0MSAkIAotICovCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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/IGluaXRTdHJpbmcgIT0gbnVsbCA6ICFJTklUX1NUUklOR19FREVGQVVMVC5lcXVhbHMoaW5pdFN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlyZXN1bHQuYXBwZW5kKCJJbml0U3RyaW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbml0U3RyaW5nKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0luaXRTdHJpbmdBbGxvY2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjg5ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBJbnN0YW50aWF0aW9uRmFjdG9yeUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMTAvMjggMjI6NTY6NDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBJbnN0YW50aWF0aW9uRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT046IHJldHVybiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OOiByZXR1cm4gY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTjogcmV0dXJuIGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTOiByZXR1cm4gY3JlYXRlUFRBcnJheUFjY2VzcygpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTjogcmV0dXJuIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUjogcmV0dXJuIGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT046IHJldHVybiBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTOiByZXR1cm4gY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRjogcmV0dXJuIGNyZWF0ZVBUSW5zdGFuY2VvZigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTjogcmV0dXJuIGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FOiByZXR1cm4gY3JlYXRlUFROYW1lKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTExfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUTnVsbExpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVE51bWJlckxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUU3RyaW5nTGl0ZXJhbCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9USElTX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVFRoaXNMaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUVHlwZUxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0U6IHJldHVybiBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTjogcmV0dXJuIGNyZWF0ZVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfT1BFUkFUT1I6IHsKLQkJCQlQVEluZml4T3BlcmF0b3IgcmVzdWx0ID0gUFRJbmZpeE9wZXJhdG9yLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9PUEVSQVRPUjogewotCQkJCVBUUHJlZml4T3BlcmF0b3IgcmVzdWx0ID0gUFRQcmVmaXhPcGVyYXRvci5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9PUEVSQVRPUjoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0U3RyaW5nQWxsb2NhdGlvbiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbigpIHsKLQkJSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsIGluaXRTdHJpbmdBbGxvY2F0aW9uID0gbmV3IEluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gaW5pdFN0cmluZ0FsbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltcGxpY2l0QWxsb2NhdGlvbiBjcmVhdGVJbXBsaWNpdEFsbG9jYXRpb24oKSB7Ci0JCUltcGxpY2l0QWxsb2NhdGlvbkltcGwgaW1wbGljaXRBbGxvY2F0aW9uID0gbmV3IEltcGxpY2l0QWxsb2NhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGltcGxpY2l0QWxsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VUcmVlQWxsb2NhdGlvbiBjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKCkgewotCQlQYXJzZVRyZWVBbGxvY2F0aW9uSW1wbCBwYXJzZVRyZWVBbGxvY2F0aW9uID0gbmV3IFBhcnNlVHJlZUFsbG9jYXRpb25JbXBsKCk7Ci0JCXJldHVybiBwYXJzZVRyZWVBbGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEFycmF5QWNjZXNzIGNyZWF0ZVBUQXJyYXlBY2Nlc3MoKSB7Ci0JCVBUQXJyYXlBY2Nlc3NJbXBsIHB0QXJyYXlBY2Nlc3MgPSBuZXcgUFRBcnJheUFjY2Vzc0ltcGwoKTsKLQkJcmV0dXJuIHB0QXJyYXlBY2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQXJyYXlDcmVhdGlvbiBjcmVhdGVQVEFycmF5Q3JlYXRpb24oKSB7Ci0JCVBUQXJyYXlDcmVhdGlvbkltcGwgcHRBcnJheUNyZWF0aW9uID0gbmV3IFBUQXJyYXlDcmVhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHB0QXJyYXlDcmVhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUluaXRpYWxpemVyIGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpIHsKLQkJUFRBcnJheUluaXRpYWxpemVySW1wbCBwdEFycmF5SW5pdGlhbGl6ZXIgPSBuZXcgUFRBcnJheUluaXRpYWxpemVySW1wbCgpOwotCQlyZXR1cm4gcHRBcnJheUluaXRpYWxpemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEJvb2xlYW5MaXRlcmFsIGNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoKSB7Ci0JCVBUQm9vbGVhbkxpdGVyYWxJbXBsIHB0Qm9vbGVhbkxpdGVyYWwgPSBuZXcgUFRCb29sZWFuTGl0ZXJhbEltcGwoKTsKLQkJcmV0dXJuIHB0Qm9vbGVhbkxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQ2FzdEV4cHJlc3Npb24gY3JlYXRlUFRDYXN0RXhwcmVzc2lvbigpIHsKLQkJUFRDYXN0RXhwcmVzc2lvbkltcGwgcHRDYXN0RXhwcmVzc2lvbiA9IG5ldyBQVENhc3RFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRDYXN0RXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRDaGFyYWN0ZXJMaXRlcmFsIGNyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbCgpIHsKLQkJUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCBwdENoYXJhY3RlckxpdGVyYWwgPSBuZXcgUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRDaGFyYWN0ZXJMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpIHsKLQkJUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsIHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gbmV3IFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHRDbGFzc0luc3RhbmNlQ3JlYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgewotCQlQVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwgcHRDb25kaXRpb25hbEV4cHJlc3Npb24gPSBuZXcgUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdENvbmRpdGlvbmFsRXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRGaWVsZEFjY2VzcyBjcmVhdGVQVEZpZWxkQWNjZXNzKCkgewotCQlQVEZpZWxkQWNjZXNzSW1wbCBwdEZpZWxkQWNjZXNzID0gbmV3IFBURmllbGRBY2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBwdEZpZWxkQWNjZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEluZml4RXhwcmVzc2lvbiBjcmVhdGVQVEluZml4RXhwcmVzc2lvbigpIHsKLQkJUFRJbmZpeEV4cHJlc3Npb25JbXBsIHB0SW5maXhFeHByZXNzaW9uID0gbmV3IFBUSW5maXhFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRJbmZpeEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUSW5zdGFuY2VvZiBjcmVhdGVQVEluc3RhbmNlb2YoKSB7Ci0JCVBUSW5zdGFuY2VvZkltcGwgcHRJbnN0YW5jZW9mID0gbmV3IFBUSW5zdGFuY2VvZkltcGwoKTsKLQkJcmV0dXJuIHB0SW5zdGFuY2VvZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRNZXRob2RJbnZvY2F0aW9uIGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbigpIHsKLQkJUFRNZXRob2RJbnZvY2F0aW9uSW1wbCBwdE1ldGhvZEludm9jYXRpb24gPSBuZXcgUFRNZXRob2RJbnZvY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHRNZXRob2RJbnZvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVE5hbWUgY3JlYXRlUFROYW1lKCkgewotCQlQVE5hbWVJbXBsIHB0TmFtZSA9IG5ldyBQVE5hbWVJbXBsKCk7Ci0JCXJldHVybiBwdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUTnVsbExpdGVyYWwgY3JlYXRlUFROdWxsTGl0ZXJhbCgpIHsKLQkJUFROdWxsTGl0ZXJhbEltcGwgcHROdWxsTGl0ZXJhbCA9IG5ldyBQVE51bGxMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHROdWxsTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFROdW1iZXJMaXRlcmFsIGNyZWF0ZVBUTnVtYmVyTGl0ZXJhbCgpIHsKLQkJUFROdW1iZXJMaXRlcmFsSW1wbCBwdE51bWJlckxpdGVyYWwgPSBuZXcgUFROdW1iZXJMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHROdW1iZXJMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKSB7Ci0JCVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsIHB0UGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSBuZXcgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0UGFyZW50aGVzaXplZEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUUHJlZml4RXhwcmVzc2lvbiBjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24oKSB7Ci0JCVBUUHJlZml4RXhwcmVzc2lvbkltcGwgcHRQcmVmaXhFeHByZXNzaW9uID0gbmV3IFBUUHJlZml4RXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0UHJlZml4RXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRTdHJpbmdMaXRlcmFsIGNyZWF0ZVBUU3RyaW5nTGl0ZXJhbCgpIHsKLQkJUFRTdHJpbmdMaXRlcmFsSW1wbCBwdFN0cmluZ0xpdGVyYWwgPSBuZXcgUFRTdHJpbmdMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRTdHJpbmdMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFRoaXNMaXRlcmFsIGNyZWF0ZVBUVGhpc0xpdGVyYWwoKSB7Ci0JCVBUVGhpc0xpdGVyYWxJbXBsIHB0VGhpc0xpdGVyYWwgPSBuZXcgUFRUaGlzTGl0ZXJhbEltcGwoKTsKLQkJcmV0dXJuIHB0VGhpc0xpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUVHlwZUxpdGVyYWwgY3JlYXRlUFRUeXBlTGl0ZXJhbCgpIHsKLQkJUFRUeXBlTGl0ZXJhbEltcGwgcHRUeXBlTGl0ZXJhbCA9IG5ldyBQVFR5cGVMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRUeXBlTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRJbnZhbGlkRXhwcmVzc2lvbiBjcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKCkgewotCQlQVEludmFsaWRFeHByZXNzaW9uSW1wbCBwdEludmFsaWRFeHByZXNzaW9uID0gbmV3IFBUSW52YWxpZEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdEludmFsaWRFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEluc3RhbmNlUmVmZXJlbmNlIGNyZWF0ZVBUSW5zdGFuY2VSZWZlcmVuY2UoKSB7Ci0JCVBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsIHB0SW5zdGFuY2VSZWZlcmVuY2UgPSBuZXcgUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwoKTsKLQkJcmV0dXJuIHB0SW5zdGFuY2VSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBjcmVhdGVQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSB7Ci0JCVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwgcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uID0gbmV3IFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgUFRJbnN0YW5jZVJlZmVyZW5jZSBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKElKYXZhSW5zdGFuY2UgaW5zdGFuY2UpIHsKLQkJUFRJbnN0YW5jZVJlZmVyZW5jZSBwdEluc3RhbmNlUmVmZXJlbmNlID0gY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZSgpOwotCQlwdEluc3RhbmNlUmVmZXJlbmNlLnNldFJlZmVyZW5jZShpbnN0YW5jZSk7Ci0JCXJldHVybiBwdEluc3RhbmNlUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnN0YW50aWF0aW9uUGFja2FnZSBnZXRJbnN0YW50aWF0aW9uUGFja2FnZSgpIHsKLQkJcmV0dXJuIChJbnN0YW50aWF0aW9uUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnN0YW50aWF0aW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSW1wbGljaXRBbGxvY2F0aW9uIGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbihFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIHNmKSB7Ci0JCUltcGxpY2l0QWxsb2NhdGlvbiBhbGxvYyA9IGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbigpOwotCQlhbGxvYy5zZXRQYXJlbnQocGFyZW50KTsKLQkJYWxsb2Muc2V0RmVhdHVyZShzZik7Ci0JCXJldHVybiBhbGxvYzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbml0U3RyaW5nQWxsb2NhdGlvbiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbihTdHJpbmcgaW5pdFN0cmluZykgewotCQlJbml0U3RyaW5nQWxsb2NhdGlvbiBhbGxvYyA9IGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCk7Ci0JCWFsbG9jLnNldEluaXRTdHJpbmcoaW5pdFN0cmluZyk7Ci0JCXJldHVybiBhbGxvYzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgUGFyc2VUcmVlQWxsb2NhdGlvbiBjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBhcnNlVHJlZUFsbG9jYXRpb24gYSA9IGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQkJYS5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEFycmF5QWNjZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUQXJyYXlBY2Nlc3MgY3JlYXRlUFRBcnJheUFjY2VzcyhQVEV4cHJlc3Npb24gYXJyYXksIExpc3QgaW5kZXhlcykgewotCQlQVEFycmF5QWNjZXNzIGEgPSBjcmVhdGVQVEFycmF5QWNjZXNzKCk7Ci0JCWEuc2V0QXJyYXkoYXJyYXkpOwotCQlhLmdldEluZGV4ZXMoKS5hZGRBbGwoaW5kZXhlcyk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQXJyYXlDcmVhdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyKQotCSAqLwotCXB1YmxpYyBQVEFycmF5Q3JlYXRpb24gY3JlYXRlUFRBcnJheUNyZWF0aW9uKFN0cmluZyB0eXBlLCBMaXN0IGRpbWVuc2lvbnMsIFBUQXJyYXlJbml0aWFsaXplciBpbml0aWFsaXplcikgewotCQlQVEFycmF5Q3JlYXRpb24gYSA9IGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpOwotCQlhLnNldFR5cGUodHlwZSk7Ci0JCWlmIChkaW1lbnNpb25zICE9IG51bGwpCi0JCQlhLmdldERpbWVuc2lvbnMoKS5hZGRBbGwoZGltZW5zaW9ucyk7Ci0JCWEuc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUQXJyYXlJbml0aWFsaXplciBjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoTGlzdCBleHByZXNzaW9ucykgewotCQlQVEFycmF5SW5pdGlhbGl6ZXIgYSA9IGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCQlpZiAoZXhwcmVzc2lvbnMgIT0gbnVsbCkKLQkJCWEuZ2V0RXhwcmVzc2lvbnMoKS5hZGRBbGwoZXhwcmVzc2lvbnMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKGJvb2xlYW4pCi0JICovCi0JcHVibGljIFBUQm9vbGVhbkxpdGVyYWwgY3JlYXRlUFRCb29sZWFuTGl0ZXJhbChib29sZWFuIGJvb2xlYW5WYWx1ZSkgewotCQlQVEJvb2xlYW5MaXRlcmFsIGEgPSBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKCk7Ci0JCWEuc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW5WYWx1ZSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVENhc3RFeHByZXNzaW9uIGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oU3RyaW5nIHR5cGUsIFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBUQ2FzdEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQkJYS5zZXRUeXBlKHR5cGUpOwotCQlhLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVENoYXJhY3RlckxpdGVyYWwgY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKFN0cmluZyBlc2NhcGVkVmFsdWUpIHsKLQkJUFRDaGFyYWN0ZXJMaXRlcmFsIGEgPSBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJYS5zZXRFc2NhcGVkVmFsdWUoZXNjYXBlZFZhbHVlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKFN0cmluZyB0eXBlLCBMaXN0IGFyZ3VtZW50cykgewotCQlQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBhID0gY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJYS5zZXRUeXBlKHR5cGUpOwotCQlpZiAoYXJndW1lbnRzICE9IG51bGwpCi0JCQlhLmdldEFyZ3VtZW50cygpLmFkZEFsbChhcmd1bWVudHMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigKLQkJUFRFeHByZXNzaW9uIGNvbmRpdGlvbiwKLQkJUFRFeHByZXNzaW9uIHRydWVFeHByZXNzb2luLAotCQlQVEV4cHJlc3Npb24gZmFsc2VFeHByZXNzaW9uKSB7Ci0JCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGEgPSBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotCQlhLnNldENvbmRpdGlvbihjb25kaXRpb24pOwotCQlhLnNldFRydWUodHJ1ZUV4cHJlc3NvaW4pOwotCQlhLnNldEZhbHNlKGZhbHNlRXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBURmllbGRBY2Nlc3Mob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVEZpZWxkQWNjZXNzIGNyZWF0ZVBURmllbGRBY2Nlc3MoUFRFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgZmllbGQpIHsKLQkJUFRGaWVsZEFjY2VzcyBhID0gY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCQlhLnNldFJlY2VpdmVyKHJlY2VpdmVyKTsKLQkJYS5zZXRGaWVsZChmaWVsZCk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUSW5maXhFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBQVEluZml4RXhwcmVzc2lvbiBjcmVhdGVQVEluZml4RXhwcmVzc2lvbigKLQkJUFRFeHByZXNzaW9uIGxlZnRPcGVyYW5kLAotCQlQVEluZml4T3BlcmF0b3Igb3BlcmF0b3IsCi0JCVBURXhwcmVzc2lvbiByaWdodE9wZXJhbmQsCi0JCUxpc3QgZXh0ZW5kZWRPcGVyYW5kcykgewotCQlQVEluZml4RXhwcmVzc2lvbiBhID0gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKTsKLQkJYS5zZXRMZWZ0T3BlcmFuZChsZWZ0T3BlcmFuZCk7Ci0JCWEuc2V0T3BlcmF0b3Iob3BlcmF0b3IpOwotCQlhLnNldFJpZ2h0T3BlcmFuZChyaWdodE9wZXJhbmQpOwotCQlpZiAoZXh0ZW5kZWRPcGVyYW5kcyAhPSBudWxsKQotCQkJYS5nZXRFeHRlbmRlZE9wZXJhbmRzKCkuYWRkQWxsKGV4dGVuZGVkT3BlcmFuZHMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEluc3RhbmNlb2Yob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVEluc3RhbmNlb2YgY3JlYXRlUFRJbnN0YW5jZW9mKFBURXhwcmVzc2lvbiBvcGVyYW5kLCBTdHJpbmcgdHlwZSkgewotCQlQVEluc3RhbmNlb2YgYSA9IGNyZWF0ZVBUSW5zdGFuY2VvZigpOwotCQlhLnNldE9wZXJhbmQob3BlcmFuZCk7Ci0JCWEuc2V0VHlwZSh0eXBlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVEludmFsaWRFeHByZXNzaW9uIGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJUFRJbnZhbGlkRXhwcmVzc2lvbiBhID0gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCQlhLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBQVE1ldGhvZEludm9jYXRpb24gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKFBURXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsIExpc3QgYXJndW1lbnRzKSB7Ci0JCVBUTWV0aG9kSW52b2NhdGlvbiBhID0gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCWEuc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotCQlhLnNldE5hbWUobmFtZSk7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKLQkJCWEuZ2V0QXJndW1lbnRzKCkuYWRkQWxsKGFyZ3VtZW50cyk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVE5hbWUgY3JlYXRlUFROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVBUTmFtZSBhID0gY3JlYXRlUFROYW1lKCk7Ci0JCWEuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFROdW1iZXJMaXRlcmFsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUTnVtYmVyTGl0ZXJhbCBjcmVhdGVQVE51bWJlckxpdGVyYWwoU3RyaW5nIHRva2VuKSB7Ci0JCVBUTnVtYmVyTGl0ZXJhbCBhID0gY3JlYXRlUFROdW1iZXJMaXRlcmFsKCk7Ci0JCWEuc2V0VG9rZW4odG9rZW4pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJYS5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvciwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVFByZWZpeEV4cHJlc3Npb24gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKFBUUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IsIFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBUUHJlZml4RXhwcmVzc2lvbiBhID0gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCWEuc2V0T3BlcmF0b3Iob3BlcmF0b3IpOwotCQlhLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUU3RyaW5nTGl0ZXJhbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVFN0cmluZ0xpdGVyYWwgY3JlYXRlUFRTdHJpbmdMaXRlcmFsKFN0cmluZyBlc2NhcGVMaXRlcmFsKSB7Ci0JCVBUU3RyaW5nTGl0ZXJhbCBhID0gY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCk7Ci0JCWEuc2V0RXNjYXBlZFZhbHVlKGVzY2FwZUxpdGVyYWwpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFR5cGVMaXRlcmFsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUVHlwZUxpdGVyYWwgY3JlYXRlUFRUeXBlTGl0ZXJhbChTdHJpbmcgdHlwZSkgewotCQlQVFR5cGVMaXRlcmFsIGEgPSBjcmVhdGVQVFR5cGVMaXRlcmFsKCk7Ci0JCWEuc2V0VHlwZSh0eXBlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi19IC8vSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGViZTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXJfSW52YWxpZEV4cHJlc3Npb247Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzg1YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEzICQgICREYXRlOiAyMDA1LzEwLzI4IDIyOjU2OjQ2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2Y7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFRoaXNMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEluc3RhbnRpYXRpb25QYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpSmF2YURhdGFUeXBlSW5zdGFuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqYXZhQWxsb2NhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRBcnJheUFjY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEFycmF5Q3JlYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRBcnJheUluaXRpYWxpemVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRDYXN0RXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRGaWVsZEFjY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEluZml4RXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEluc3RhbmNlb2ZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0TmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdE51bGxMaXRlcmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0TnVtYmVyTGl0ZXJhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdFN0cmluZ0xpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRUaGlzTGl0ZXJhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdFR5cGVMaXRlcmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBwdEluZml4T3BlcmF0b3JFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHB0UHJlZml4T3BlcmF0b3JFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpSmF2YUluc3RhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJbnN0YW50aWF0aW9uUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluc3RhbnRpYXRpb25QYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChJbnN0YW50aWF0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShJbnN0YW50aWF0aW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCB0aGVJbnN0YW50aWF0aW9uUGFja2FnZSA9IChJbnN0YW50aWF0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlSW5zdGFudGlhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVJbnN0YW50aWF0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVJbnN0YW50aWF0aW9uUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSmF2YU9iamVjdEluc3RhbmNlKCkgewotCQlyZXR1cm4gaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEphdmFBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gamF2YUFsbG9jYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbml0U3RyaW5nQWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIGluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluaXRTdHJpbmdBbGxvY2F0aW9uX0luaXRTdHJpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEltcGxpY2l0QWxsb2NhdGlvbl9QYXJlbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBsaWNpdEFsbG9jYXRpb25fRmVhdHVyZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIHBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbl9FeHByZXNzaW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRBcnJheUFjY2VzcygpIHsKLQkJcmV0dXJuIHB0QXJyYXlBY2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRBcnJheUFjY2Vzc19BcnJheSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0QXJyYXlBY2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEFycmF5QWNjZXNzX0luZGV4ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5QWNjZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEFycmF5Q3JlYXRpb24oKSB7Ci0JCXJldHVybiBwdEFycmF5Q3JlYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRBcnJheUNyZWF0aW9uX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEFycmF5Q3JlYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEFycmF5Q3JlYXRpb25fRGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0QXJyYXlDcmVhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQXJyYXlDcmVhdGlvbl9Jbml0aWFsaXplcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0QXJyYXlDcmVhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRBcnJheUluaXRpYWxpemVyKCkgewotCQlyZXR1cm4gcHRBcnJheUluaXRpYWxpemVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQXJyYXlJbml0aWFsaXplcl9FeHByZXNzaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0QXJyYXlJbml0aWFsaXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRCb29sZWFuTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRCb29sZWFuTGl0ZXJhbF9Cb29sZWFuVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEJvb2xlYW5MaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVENhc3RFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRDYXN0RXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVENhc3RFeHByZXNzaW9uX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdENhc3RFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRDYXN0RXhwcmVzc2lvbl9FeHByZXNzaW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRDYXN0RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkgewotCQlyZXR1cm4gcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQ2hhcmFjdGVyTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVENoYXJhY3RlckxpdGVyYWxfQ2hhclZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpIHsKLQkJcmV0dXJuIHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX0FyZ3VtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0NvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fVHJ1ZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fRmFsc2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRGaWVsZEFjY2VzcygpIHsKLQkJcmV0dXJuIHB0RmllbGRBY2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRGaWVsZEFjY2Vzc19SZWNlaXZlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0RmllbGRBY2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEZpZWxkQWNjZXNzX0ZpZWxkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRGaWVsZEFjY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRJbmZpeEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdEluZml4RXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEluZml4RXhwcmVzc2lvbl9MZWZ0T3BlcmFuZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0SW5maXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRJbmZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX1JpZ2h0T3BlcmFuZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0SW5maXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRJbmZpeEV4cHJlc3Npb25fRXh0ZW5kZWRPcGVyYW5kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0SW5maXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEluc3RhbmNlb2YoKSB7Ci0JCXJldHVybiBwdEluc3RhbmNlb2ZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRJbnN0YW5jZW9mX09wZXJhbmQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEluc3RhbmNlb2ZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEluc3RhbmNlb2ZfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0SW5zdGFuY2VvZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCkgewotCQlyZXR1cm4gcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9SZWNlaXZlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRNZXRob2RJbnZvY2F0aW9uX0FyZ3VtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFROYW1lKCkgewotCQlyZXR1cm4gcHROYW1lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUTmFtZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHROYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVE51bGxMaXRlcmFsKCkgewotCQlyZXR1cm4gcHROdWxsTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUTnVtYmVyTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0TnVtYmVyTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVE51bWJlckxpdGVyYWxfVG9rZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdE51bWJlckxpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25fRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0UGFyZW50aGVzaXplZEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUUHJlZml4RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0UHJlZml4RXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVFByZWZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVFByZWZpeEV4cHJlc3Npb25fRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRTdHJpbmdMaXRlcmFsKCkgewotCQlyZXR1cm4gcHRTdHJpbmdMaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUU3RyaW5nTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdFN0cmluZ0xpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVFN0cmluZ0xpdGVyYWxfTGl0ZXJhbFZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRTdHJpbmdMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVFRoaXNMaXRlcmFsKCkgewotCQlyZXR1cm4gcHRUaGlzTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUVHlwZUxpdGVyYWwoKSB7Ci0JCXJldHVybiBwdFR5cGVMaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUVHlwZUxpdGVyYWxfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0VHlwZUxpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUSW52YWxpZEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUSW52YWxpZEV4cHJlc3Npb25fTWVzc2FnZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUSW5zdGFuY2VSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUSW5zdGFuY2VSZWZlcmVuY2VfUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9EZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9JbXBvcnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFBUSW5maXhPcGVyYXRvcigpIHsKLQkJcmV0dXJuIHB0SW5maXhPcGVyYXRvckVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRQVFByZWZpeE9wZXJhdG9yKCkgewotCQlyZXR1cm4gcHRQcmVmaXhPcGVyYXRvckVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFEYXRhVHlwZUluc3RhbmNlKCkgewotCQlyZXR1cm4gaUphdmFEYXRhVHlwZUluc3RhbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGlKYXZhSW5zdGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluc3RhbnRpYXRpb25GYWN0b3J5IGdldEluc3RhbnRpYXRpb25GYWN0b3J5KCkgewotCQlyZXR1cm4gKEluc3RhbnRpYXRpb25GYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWlKYXZhRGF0YVR5cGVJbnN0YW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9EQVRBX1RZUEVfSU5TVEFOQ0UpOwotCi0JCWlKYXZhSW5zdGFuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfSU5TVEFOQ0UpOwotCi0JCWlKYXZhT2JqZWN0SW5zdGFuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfT0JKRUNUX0lOU1RBTkNFKTsKLQotCQlqYXZhQWxsb2NhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0FMTE9DQVRJT04pOwotCi0JCWluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSVRfU1RSSU5HX0FMTE9DQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzLCBJTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORyk7Ci0KLQkJaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNUExJQ0lUX0FMTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcywgSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MsIElNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkUpOwotCi0JCXBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFSU0VfVFJFRV9BTExPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzLCBQQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04pOwotCi0JCXB0RXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9FWFBSRVNTSU9OKTsKLQotCQlwdEFycmF5QWNjZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0FSUkFZX0FDQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUFjY2Vzc0VDbGFzcywgUFRfQVJSQVlfQUNDRVNTX19BUlJBWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUFjY2Vzc0VDbGFzcywgUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTKTsKLQotCQlwdEFycmF5Q3JlYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQVJSQVlfQ1JFQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0QXJyYXlDcmVhdGlvbkVDbGFzcywgUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0QXJyYXlDcmVhdGlvbkVDbGFzcywgUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0QXJyYXlDcmVhdGlvbkVDbGFzcywgUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSKTsKLQotCQlwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQVJSQVlfSU5JVElBTElaRVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0QXJyYXlJbml0aWFsaXplckVDbGFzcywgUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TKTsKLQotCQlwdEJvb2xlYW5MaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0JPT0xFQU5fTElURVJBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRCb29sZWFuTGl0ZXJhbEVDbGFzcywgUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFKTsKLQotCQlwdENhc3RFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0NBU1RfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRDYXN0RXhwcmVzc2lvbkVDbGFzcywgUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdENhc3RFeHByZXNzaW9uRUNsYXNzLCBQVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT04pOwotCi0JCXB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9DSEFSQUNURVJfTElURVJBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLCBQVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLCBQVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRSk7Ci0KLQkJcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzLCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MsIFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFMpOwotCi0JCXB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcywgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0UpOwotCi0JCXB0RmllbGRBY2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfRklFTERfQUNDRVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEZpZWxkQWNjZXNzRUNsYXNzLCBQVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEZpZWxkQWNjZXNzRUNsYXNzLCBQVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEKTsKLQotCQlwdEluZml4RXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9JTkZJWF9FWFBSRVNTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEluZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEluZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5maXhFeHByZXNzaW9uRUNsYXNzLCBQVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEluZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFMpOwotCi0JCXB0SW5zdGFuY2VvZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9JTlNUQU5DRU9GKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEluc3RhbmNlb2ZFQ2xhc3MsIFBUX0lOU1RBTkNFT0ZfX09QRVJBTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0SW5zdGFuY2VvZkVDbGFzcywgUFRfSU5TVEFOQ0VPRl9fVFlQRSk7Ci0KLQkJcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX01FVEhPRF9JTlZPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MsIFBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTKTsKLQotCQlwdE5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHROYW1lRUNsYXNzLCBQVF9OQU1FX19OQU1FKTsKLQotCQlwdE51bGxMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX05VTExfTElURVJBTCk7Ci0KLQkJcHROdW1iZXJMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX05VTUJFUl9MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdE51bWJlckxpdGVyYWxFQ2xhc3MsIFBUX05VTUJFUl9MSVRFUkFMX19UT0tFTik7Ci0KLQkJcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0UGFyZW50aGVzaXplZEV4cHJlc3Npb25FQ2xhc3MsIFBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTik7Ci0KLQkJcHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1BSRUZJWF9FWFBSRVNTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzLCBQVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTik7Ci0KLQkJcHRTdHJpbmdMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1NUUklOR19MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdFN0cmluZ0xpdGVyYWxFQ2xhc3MsIFBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdFN0cmluZ0xpdGVyYWxFQ2xhc3MsIFBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFKTsKLQotCQlwdFRoaXNMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1RISVNfTElURVJBTCk7Ci0KLQkJcHRUeXBlTGl0ZXJhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9UWVBFX0xJVEVSQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0VHlwZUxpdGVyYWxFQ2xhc3MsIFBUX1RZUEVfTElURVJBTF9fVFlQRSk7Ci0KLQkJcHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9JTlZBTElEX0VYUFJFU1NJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MsIFBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRSk7Ci0KLQkJcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9JTlNUQU5DRV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3MsIFBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFKTsKLQotCQlwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MsIFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcywgUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJcHRJbmZpeE9wZXJhdG9yRUVudW0gPSBjcmVhdGVFRW51bShQVF9JTkZJWF9PUEVSQVRPUik7Ci0JCXB0UHJlZml4T3BlcmF0b3JFRW51bSA9IGNyZWF0ZUVFbnVtKFBUX1BSRUZJWF9PUEVSQVRPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUVjb3JlUGFja2FnZUltcGwgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJaUphdmFEYXRhVHlwZUluc3RhbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFJbnN0YW5jZSgpKTsKLQkJaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhSW5zdGFuY2UoKSk7Ci0JCWluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUFsbG9jYXRpb24oKSk7Ci0JCWltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFBbGxvY2F0aW9uKCkpOwotCQlwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUFsbG9jYXRpb24oKSk7Ci0JCXB0QXJyYXlBY2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0QXJyYXlDcmVhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRBcnJheUluaXRpYWxpemVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEJvb2xlYW5MaXRlcmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdENhc3RFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRGaWVsZEFjY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0SW5zdGFuY2VvZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdE5hbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0TnVsbExpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0TnVtYmVyTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdFN0cmluZ0xpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0VGhpc0xpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0VHlwZUxpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGlKYXZhRGF0YVR5cGVJbnN0YW5jZUVDbGFzcywgSUphdmFEYXRhVHlwZUluc3RhbmNlLmNsYXNzLCAiSUphdmFEYXRhVHlwZUluc3RhbmNlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpSmF2YUluc3RhbmNlRUNsYXNzLCBJSmF2YUluc3RhbmNlLmNsYXNzLCAiSUphdmFJbnN0YW5jZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzcywgSUphdmFPYmplY3RJbnN0YW5jZS5jbGFzcywgIklKYXZhT2JqZWN0SW5zdGFuY2UiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGphdmFBbGxvY2F0aW9uRUNsYXNzLCBKYXZhQWxsb2NhdGlvbi5jbGFzcywgIkphdmFBbGxvY2F0aW9uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcywgSW5pdFN0cmluZ0FsbG9jYXRpb24uY2xhc3MsICJJbml0U3RyaW5nQWxsb2NhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb25fSW5pdFN0cmluZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5pdFN0cmluZyIsIG51bGwsIDAsIDEsIEluaXRTdHJpbmdBbGxvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLCBJbXBsaWNpdEFsbG9jYXRpb24uY2xhc3MsICJJbXBsaWNpdEFsbG9jYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEltcGxpY2l0QWxsb2NhdGlvbl9QYXJlbnQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVPYmplY3QoKSwgbnVsbCwgInBhcmVudCIsIG51bGwsIDEsIDEsIEltcGxpY2l0QWxsb2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW1wbGljaXRBbGxvY2F0aW9uX0ZlYXR1cmUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBudWxsLCAiZmVhdHVyZSIsIG51bGwsIDEsIDEsIEltcGxpY2l0QWxsb2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MsIFBhcnNlVHJlZUFsbG9jYXRpb24uY2xhc3MsICJQYXJzZVRyZWVBbGxvY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQYXJzZVRyZWVBbGxvY2F0aW9uX0V4cHJlc3Npb24oKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImV4cHJlc3Npb24iLCBudWxsLCAxLCAxLCBQYXJzZVRyZWVBbGxvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRFeHByZXNzaW9uRUNsYXNzLCBQVEV4cHJlc3Npb24uY2xhc3MsICJQVEV4cHJlc3Npb24iLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHB0QXJyYXlBY2Nlc3NFQ2xhc3MsIFBUQXJyYXlBY2Nlc3MuY2xhc3MsICJQVEFycmF5QWNjZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEFycmF5QWNjZXNzX0FycmF5KCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJhcnJheSIsIG51bGwsIDAsIDEsIFBUQXJyYXlBY2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQXJyYXlBY2Nlc3NfSW5kZXhlcygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiaW5kZXhlcyIsIG51bGwsIDEsIC0xLCBQVEFycmF5QWNjZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRBcnJheUNyZWF0aW9uRUNsYXNzLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICJQVEFycmF5Q3JlYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQXJyYXlDcmVhdGlvbl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUFRBcnJheUNyZWF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEFycmF5Q3JlYXRpb25fRGltZW5zaW9ucygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZGltZW5zaW9ucyIsIG51bGwsIDAsIC0xLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQXJyYXlDcmVhdGlvbl9Jbml0aWFsaXplcigpLCB0aGlzLmdldFBUQXJyYXlJbml0aWFsaXplcigpLCBudWxsLCAiaW5pdGlhbGl6ZXIiLCBudWxsLCAwLCAxLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MsIFBUQXJyYXlJbml0aWFsaXplci5jbGFzcywgIlBUQXJyYXlJbml0aWFsaXplciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRBcnJheUluaXRpYWxpemVyX0V4cHJlc3Npb25zKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9ucyIsIG51bGwsIDAsIC0xLCBQVEFycmF5SW5pdGlhbGl6ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEJvb2xlYW5MaXRlcmFsRUNsYXNzLCBQVEJvb2xlYW5MaXRlcmFsLmNsYXNzLCAiUFRCb29sZWFuTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRCb29sZWFuTGl0ZXJhbF9Cb29sZWFuVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJib29sZWFuVmFsdWUiLCBudWxsLCAwLCAxLCBQVEJvb2xlYW5MaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRDYXN0RXhwcmVzc2lvbkVDbGFzcywgUFRDYXN0RXhwcmVzc2lvbi5jbGFzcywgIlBUQ2FzdEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQ2FzdEV4cHJlc3Npb25fVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFBUQ2FzdEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQ2FzdEV4cHJlc3Npb25fRXhwcmVzc2lvbigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXhwcmVzc2lvbiIsIG51bGwsIDAsIDEsIFBUQ2FzdEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MsIFBUQ2hhcmFjdGVyTGl0ZXJhbC5jbGFzcywgIlBUQ2hhcmFjdGVyTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXNjYXBlZFZhbHVlIiwgbnVsbCwgMCwgMSwgUFRDaGFyYWN0ZXJMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVENoYXJhY3RlckxpdGVyYWxfQ2hhclZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFQ2hhcigpLCAiY2hhclZhbHVlIiwgbnVsbCwgMCwgMSwgUFRDaGFyYWN0ZXJMaXRlcmFsLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcywgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24uY2xhc3MsICJQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9Bcmd1bWVudHMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImFyZ3VtZW50cyIsIG51bGwsIDAsIC0xLCBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLCBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5jbGFzcywgIlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9Db25kaXRpb24oKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9UcnVlKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJ0cnVlIiwgbnVsbCwgMCwgMSwgUFRDb25kaXRpb25hbEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0ZhbHNlKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJmYWxzZSIsIG51bGwsIDAsIDEsIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRGaWVsZEFjY2Vzc0VDbGFzcywgUFRGaWVsZEFjY2Vzcy5jbGFzcywgIlBURmllbGRBY2Nlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBURmllbGRBY2Nlc3NfUmVjZWl2ZXIoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgInJlY2VpdmVyIiwgbnVsbCwgMCwgMSwgUFRGaWVsZEFjY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRGaWVsZEFjY2Vzc19GaWVsZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGQiLCBudWxsLCAwLCAxLCBQVEZpZWxkQWNjZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUSW5maXhFeHByZXNzaW9uLmNsYXNzLCAiUFRJbmZpeEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUSW5maXhFeHByZXNzaW9uX0xlZnRPcGVyYW5kKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJsZWZ0T3BlcmFuZCIsIG51bGwsIDAsIDEsIFBUSW5maXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEluZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpLCB0aGlzLmdldFBUSW5maXhPcGVyYXRvcigpLCAib3BlcmF0b3IiLCBudWxsLCAwLCAxLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbmZpeEV4cHJlc3Npb25fUmlnaHRPcGVyYW5kKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJyaWdodE9wZXJhbmQiLCBudWxsLCAwLCAxLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbmZpeEV4cHJlc3Npb25fRXh0ZW5kZWRPcGVyYW5kcygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXh0ZW5kZWRPcGVyYW5kcyIsIG51bGwsIDAsIC0xLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0SW5zdGFuY2VvZkVDbGFzcywgUFRJbnN0YW5jZW9mLmNsYXNzLCAiUFRJbnN0YW5jZW9mIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEluc3RhbmNlb2ZfT3BlcmFuZCgpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAib3BlcmFuZCIsIG51bGwsIDAsIDEsIFBUSW5zdGFuY2VvZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRJbnN0YW5jZW9mX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQVEluc3RhbmNlb2YuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MsIFBUTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIlBUTWV0aG9kSW52b2NhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRNZXRob2RJbnZvY2F0aW9uX1JlY2VpdmVyKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJyZWNlaXZlciIsIG51bGwsIDAsIDEsIFBUTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRNZXRob2RJbnZvY2F0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQVE1ldGhvZEludm9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUTWV0aG9kSW52b2NhdGlvbl9Bcmd1bWVudHMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImFyZ3VtZW50cyIsIG51bGwsIDAsIC0xLCBQVE1ldGhvZEludm9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdE5hbWVFQ2xhc3MsIFBUTmFtZS5jbGFzcywgIlBUTmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFROYW1lX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQVE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdE51bGxMaXRlcmFsRUNsYXNzLCBQVE51bGxMaXRlcmFsLmNsYXNzLCAiUFROdWxsTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHB0TnVtYmVyTGl0ZXJhbEVDbGFzcywgUFROdW1iZXJMaXRlcmFsLmNsYXNzLCAiUFROdW1iZXJMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVE51bWJlckxpdGVyYWxfVG9rZW4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRva2VuIiwgbnVsbCwgMCwgMSwgUFROdW1iZXJMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcywgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5jbGFzcywgIlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25fRXhwcmVzc2lvbigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXhwcmVzc2lvbiIsIG51bGwsIDAsIDEsIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUUHJlZml4RXhwcmVzc2lvbi5jbGFzcywgIlBUUHJlZml4RXhwcmVzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRQcmVmaXhFeHByZXNzaW9uX09wZXJhdG9yKCksIHRoaXMuZ2V0UFRQcmVmaXhPcGVyYXRvcigpLCAib3BlcmF0b3IiLCBudWxsLCAwLCAxLCBQVFByZWZpeEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUUHJlZml4RXhwcmVzc2lvbl9FeHByZXNzaW9uKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9uIiwgbnVsbCwgMCwgMSwgUFRQcmVmaXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRTdHJpbmdMaXRlcmFsRUNsYXNzLCBQVFN0cmluZ0xpdGVyYWwuY2xhc3MsICJQVFN0cmluZ0xpdGVyYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUU3RyaW5nTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVzY2FwZWRWYWx1ZSIsIG51bGwsIDAsIDEsIFBUU3RyaW5nTGl0ZXJhbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRTdHJpbmdMaXRlcmFsX0xpdGVyYWxWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGl0ZXJhbFZhbHVlIiwgbnVsbCwgMCwgMSwgUFRTdHJpbmdMaXRlcmFsLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdFRoaXNMaXRlcmFsRUNsYXNzLCBQVFRoaXNMaXRlcmFsLmNsYXNzLCAiUFRUaGlzTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHB0VHlwZUxpdGVyYWxFQ2xhc3MsIFBUVHlwZUxpdGVyYWwuY2xhc3MsICJQVFR5cGVMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVFR5cGVMaXRlcmFsX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQVFR5cGVMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcywgUFRJbnZhbGlkRXhwcmVzc2lvbi5jbGFzcywgIlBUSW52YWxpZEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUSW52YWxpZEV4cHJlc3Npb25fTWVzc2FnZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWVzc2FnZSIsIG51bGwsIDAsIDEsIFBUSW52YWxpZEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzLCBQVEluc3RhbmNlUmVmZXJlbmNlLmNsYXNzLCAiUFRJbnN0YW5jZVJlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZV9SZWZlcmVuY2UoKSwgdGhpcy5nZXRJSmF2YUluc3RhbmNlKCksIG51bGwsICJyZWZlcmVuY2UiLCBudWxsLCAxLCAxLCBQVEluc3RhbmNlUmVmZXJlbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzLCBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uY2xhc3MsICJQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9EZWNsYXJhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVjbGFyYXRpb24iLCBudWxsLCAwLCAxLCBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9JbXBvcnRzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbXBvcnRzIiwgbnVsbCwgMCwgLTEsIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLmNsYXNzLCAiUFRJbmZpeE9wZXJhdG9yIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlRJTUVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5ESVZJREVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlJFTUFJTkRFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuUExVU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuTUlOVVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkxFRlRfU0hJRlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkxFU1NfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkdSRUFURVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkxFU1NfRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5HUkVBVEVSX0VRVUFMU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5OT1RfRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5YT1JfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkFORF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuT1JfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX0FORF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuQ09ORElUSU9OQUxfT1JfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHB0UHJlZml4T3BlcmF0b3JFRW51bSwgUFRQcmVmaXhPcGVyYXRvci5jbGFzcywgIlBUUHJlZml4T3BlcmF0b3IiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0UHJlZml4T3BlcmF0b3JFRW51bSwgUFRQcmVmaXhPcGVyYXRvci5QTFVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRQcmVmaXhPcGVyYXRvckVFbnVtLCBQVFByZWZpeE9wZXJhdG9yLk1JTlVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRQcmVmaXhPcGVyYXRvckVFbnVtLCBQVFByZWZpeE9wZXJhdG9yLkNPTVBMRU1FTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdFByZWZpeE9wZXJhdG9yRUVudW0sIFBUUHJlZml4T3BlcmF0b3IuTk9UX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSmF2YUFsbG9jYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0phdmFBbGxvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjhkNDYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSmF2YUFsbG9jYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhQWxsb2NhdGlvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8xMC8wMyAxOToyMDo0MSAkIAotICovCi0gCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFBbGxvY2F0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSmF2YUFsbG9jYXRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQWxsb2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUFsbG9jYXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19IC8vSmF2YUFsbG9jYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL05haXZlRXhwcmVzc2lvbkZsYXR0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9OYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2ZWNiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL05haXZlRXhwcmVzc2lvbkZsYXR0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IE5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8xMC8yOCAyMjo1Njo0NiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci0gCi0vKioKLSAqIFRoaXMgbmFpdmVseSBmbGF0dGVucyB0aGUgUGFyc2VUcmVlLiBJdCBqdXN0IHdvcmtzIHdpdGggd2hhdCdzIHRoZXJlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIE5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lciBleHRlbmRzIFBhcnNlVmlzaXRvciB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgZ2V0U3RyaW5nQnVmZmVyKCkgewotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cmluZyByZXN1bHQgb2YgdGhlIGZsYXR0ZW5pbmcuCi0JICogQHJldHVybiBUaGUgZmxhdHRlbmVkIHN0cmluZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXNldCB0aGUgcmVzdWx0IHNvIHRoYXQgZmxhdHRlbmVyIGNhbiBiZSB1c2VkIGFnYWluLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlidWZmZXIuc2V0TGVuZ3RoKDApOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXREZWNsYXJhdGlvbigpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQlub2RlLmdldEFycmF5KCkuYWNjZXB0KHRoaXMpOwotCQlpZiAoIW5vZGUuZ2V0SW5kZXhlcygpLmlzRW1wdHkoKSkgewotCQkJTGlzdCBpbmRleGVzID0gbm9kZS5nZXRJbmRleGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlidWZmZXIuYXBwZW5kKCdbJyk7Ci0JCQkJKChQVEV4cHJlc3Npb24pIGluZGV4ZXMuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXScpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQlTdHJpbmcgdHlwZSA9IGhhbmRsZVF1YWxpZmllZE5hbWUobm9kZS5nZXRUeXBlKCkpOwotCQlidWZmZXIuYXBwZW5kKCJuZXcgIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IG9iID0gdHlwZS5pbmRleE9mKCdbJyk7Ci0JCWJ1ZmZlci5hcHBlbmQodHlwZS5zdWJzdHJpbmcoMCwgb2IpKTsKLQkJaW50IHJlYWxkaW1zID0gMDsKLQkJd2hpbGUgKG9iICE9IC0xKSB7Ci0JCQlyZWFsZGltcysrOwotCQkJb2IgPSB0eXBlLmluZGV4T2YoJ1snLG9iKzEpOwotCQl9Ci0JCUxpc3QgZGltcyA9IG5vZGUuZ2V0RGltZW5zaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbXMuc2l6ZSgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ1snKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBkaW1zLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQkJYnVmZmVyLmFwcGVuZCgnXScpOwotCQl9Ci0JCWZvciAoaW50IGk9ZGltcy5zaXplKCk7IGkgPCByZWFsZGltczsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWlmIChub2RlLmdldEluaXRpYWxpemVyKCkgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJKChQVEV4cHJlc3Npb24pIG5vZGUuZ2V0SW5pdGlhbGl6ZXIoKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCd7Jyk7Ci0JCUxpc3QgZXhwID0gbm9kZS5nZXRFeHByZXNzaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cC5zaXplKCk7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkoKFBURXhwcmVzc2lvbikgZXhwLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJ30nKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuaXNCb29sZWFuVmFsdWUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoaGFuZGxlUXVhbGlmaWVkTmFtZShub2RlLmdldFR5cGUoKSkpOwotCQlidWZmZXIuYXBwZW5kKCIpICIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIm5ldyAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGhhbmRsZVF1YWxpZmllZE5hbWUobm9kZS5nZXRUeXBlKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlMaXN0IGFyZ3MgPSBub2RlLmdldEFyZ3VtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChpICE9IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJKChQVEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJbm9kZS5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiA/ICIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuZ2V0VHJ1ZSgpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5nZXRGYWxzZSgpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBURmllbGRBY2Nlc3Mgbm9kZSkgewotCQlub2RlLmdldFJlY2VpdmVyKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRGaWVsZCgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCW5vZGUuZ2V0TGVmdE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJU3RyaW5nIG9wZXIgPSBub2RlLmdldE9wZXJhdG9yKCkuZ2V0T3BlcmF0b3IoKTsKLQkJYnVmZmVyLmFwcGVuZChvcGVyKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlub2RlLmdldFJpZ2h0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJTGlzdCBleHQgPSBub2RlLmdldEV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHQuc2l6ZSgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQob3Blcik7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkoKFBURXhwcmVzc2lvbikgZXh0LmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5zdGFuY2VvZiBub2RlKSB7Ci0JCW5vZGUuZ2V0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgiIGluc3RhbmNlb2YgIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChoYW5kbGVRdWFsaWZpZWROYW1lKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzLk5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lcl9JbnZhbGlkRXhwcmVzc2lvbiwgbmV3IE9iamVjdFtde25vZGUuZ2V0TWVzc2FnZSgpfSkpOyAKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0UmVjZWl2ZXIoKSAhPSBudWxsKSB7Ci0JCQlub2RlLmdldFJlY2VpdmVyKCkuYWNjZXB0KHRoaXMpOwotCQkJYnVmZmVyLmFwcGVuZCgnLicpOwotCQl9Ci0JCQotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0TmFtZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlMaXN0IGFyZ3MgPSBub2RlLmdldEFyZ3VtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChpICE9IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJKChQVEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROYW1lIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChoYW5kbGVRdWFsaWZpZWROYW1lKG5vZGUuZ2V0TmFtZSgpKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdWxsTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZCgibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRUb2tlbigpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0T3BlcmF0b3IoKS5nZXRPcGVyYXRvcigpKTsKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVGhpc0xpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUaGlzTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoInRoaXMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoaGFuZGxlUXVhbGlmaWVkTmFtZShub2RlLmdldFR5cGUoKSkpOwotCQlidWZmZXIuYXBwZW5kKCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgb25lIHRvIG92ZXJpZGUgdGhlIGhhbmRsaW5nIG9mIHF1YWxpZmllZCBuYW1lcy4KLQkgKiBUaGUgZGVmYXVsdCBvcGVyYXRpb24gaXMgdG8gZG8gbm90aGluZy4KLQkgKiAKLQkgKiBPdmVycmlkZXJzIG1heSBjaG9vc2UgdG8gdXNlIHNob3J0IG5hbWVzLCByZWx5aW5nIG9uIGltcG9ydCBzdGF0ZW1lbnQgaGFuZGxpbmcuCi0JICogCi0JICogQHBhcmFtIHFOYW1lICAKLQkgKiBAcmV0dXJuIE5hbWUgdG8gdXNlIGZvciB0aGUgZmxhdHRlbmVkIHJlc3VsdAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaGFuZGxlUXVhbGlmaWVkTmFtZShTdHJpbmcgcU5hbWUpIHsKLQkJcmV0dXJuIHFOYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExZDNmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMTAvMjggMjI6NTY6NDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCNnZXREZWNsYXJhdGlvbiA8ZW0+RGVjbGFyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCNnZXRJbXBvcnRzIDxlbT5JbXBvcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWNsYXJhdGlvbigpIDxlbT5EZWNsYXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVjbGFyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xBUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlY2xhcmF0aW9uKCkgPGVtPkRlY2xhcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWNsYXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNsYXJhdGlvbiA9IERFQ0xBUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wb3J0cygpIDxlbT5JbXBvcnRzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcG9ydHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbXBvcnRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJhdGlvbihTdHJpbmcgbmV3RGVjbGFyYXRpb24pIHsKLQkJU3RyaW5nIG9sZERlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCWRlY2xhcmF0aW9uID0gbmV3RGVjbGFyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT04sIG9sZERlY2xhcmF0aW9uLCBkZWNsYXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbXBvcnRzKCkgewotCQlpZiAoaW1wb3J0cyA9PSBudWxsKSB7Ci0JCQlpbXBvcnRzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gaW1wb3J0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT046Ci0JCQkJcmV0dXJuIGdldERlY2xhcmF0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUzoKLQkJCQlyZXR1cm4gZ2V0SW1wb3J0cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTjoKLQkJCQlzZXREZWNsYXJhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUzoKLQkJCQlnZXRJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0RFQ0xBUkFUSU9OOgotCQkJCXNldERlY2xhcmF0aW9uKERFQ0xBUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUzoKLQkJCQlnZXRJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTjoKLQkJCQlyZXR1cm4gREVDTEFSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlY2xhcmF0aW9uICE9IG51bGwgOiAhREVDTEFSQVRJT05fRURFRkFVTFQuZXF1YWxzKGRlY2xhcmF0aW9uKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTOgotCQkJCXJldHVybiBpbXBvcnRzICE9IG51bGwgJiYgIWltcG9ydHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVjbGFyYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlY2xhcmF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbXBvcnRzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbXBvcnRzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUFjY2Vzc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUFjY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiZTU5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlBY2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRBcnJheUFjY2Vzc0ltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnJheSBBY2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUFjY2Vzc0ltcGwjZ2V0QXJyYXkgPGVtPkFycmF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlBY2Nlc3NJbXBsI2dldEluZGV4ZXMgPGVtPkluZGV4ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEFycmF5QWNjZXNzSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEFycmF5QWNjZXNzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcnJheSgpIDxlbT5BcnJheTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJyYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gYXJyYXkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5kZXhlcygpIDxlbT5JbmRleGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluZGV4ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmRleGVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEFycmF5QWNjZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEFycmF5QWNjZXNzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRBcnJheSgpIHsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFycmF5KFBURXhwcmVzc2lvbiBuZXdBcnJheSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkQXJyYXkgPSBhcnJheTsKLQkJYXJyYXkgPSBuZXdBcnJheTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWSwgb2xkQXJyYXksIG5ld0FycmF5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcnJheShQVEV4cHJlc3Npb24gbmV3QXJyYXkpIHsKLQkJaWYgKG5ld0FycmF5ICE9IGFycmF5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhcnJheSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhcnJheSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FycmF5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FycmF5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBcnJheShuZXdBcnJheSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZLCBuZXdBcnJheSwgbmV3QXJyYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5kZXhlcygpIHsKLQkJaWYgKGluZGV4ZXMgPT0gbnVsbCkgewotCQkJaW5kZXhlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUyk7Ci0JCX0KLQkJcmV0dXJuIGluZGV4ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRBcnJheShudWxsLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmRleGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWToKLQkJCQlyZXR1cm4gZ2V0QXJyYXkoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTOgotCQkJCXJldHVybiBnZXRJbmRleGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZOgotCQkJCXNldEFycmF5KChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTOgotCQkJCWdldEluZGV4ZXMoKS5jbGVhcigpOwotCQkJCWdldEluZGV4ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVk6Ci0JCQkJc2V0QXJyYXkoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQlnZXRJbmRleGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWToKLQkJCQlyZXR1cm4gYXJyYXkgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTOgotCQkJCXJldHVybiBpbmRleGVzICE9IG51bGwgJiYgIWluZGV4ZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEFycmF5KCkpOwotCQkJaWYgKGluZGV4ZXMgIT0gbnVsbCkKLQkJCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBpbmRleGVzKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9BcnJheUFjY2Vzc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUNyZWF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5Q3JlYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MDExZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5Q3JlYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRBcnJheUNyZWF0aW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFycmF5IENyZWF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlDcmVhdGlvbkltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5Q3JlYXRpb25JbXBsI2dldERpbWVuc2lvbnMgPGVtPkRpbWVuc2lvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUNyZWF0aW9uSW1wbCNnZXRJbml0aWFsaXplciA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEFycmF5Q3JlYXRpb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQXJyYXlDcmVhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaW1lbnNpb25zKCkgPGVtPkRpbWVuc2lvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGltZW5zaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpbWVuc2lvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbGl6ZXIoKSA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRBcnJheUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEFycmF5Q3JlYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQXJyYXlDcmVhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREaW1lbnNpb25zKCkgewotCQlpZiAoZGltZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlkaW1lbnNpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlMpOwotCQl9Ci0JCXJldHVybiBkaW1lbnNpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEFycmF5SW5pdGlhbGl6ZXIgZ2V0SW5pdGlhbGl6ZXIoKSB7Ci0JCXJldHVybiBpbml0aWFsaXplcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbml0aWFsaXplcihQVEFycmF5SW5pdGlhbGl6ZXIgbmV3SW5pdGlhbGl6ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRBcnJheUluaXRpYWxpemVyIG9sZEluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7Ci0JCWluaXRpYWxpemVyID0gbmV3SW5pdGlhbGl6ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUiwgb2xkSW5pdGlhbGl6ZXIsIG5ld0luaXRpYWxpemVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXplcihQVEFycmF5SW5pdGlhbGl6ZXIgbmV3SW5pdGlhbGl6ZXIpIHsKLQkJaWYgKG5ld0luaXRpYWxpemVyICE9IGluaXRpYWxpemVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbml0aWFsaXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5pdGlhbGl6ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW5pdGlhbGl6ZXIobmV3SW5pdGlhbGl6ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSLCBuZXdJbml0aWFsaXplciwgbmV3SW5pdGlhbGl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpbWVuc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRJbml0aWFsaXplcihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlM6Ci0JCQkJcmV0dXJuIGdldERpbWVuc2lvbnMoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSOgotCQkJCXJldHVybiBnZXRJbml0aWFsaXplcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TOgotCQkJCWdldERpbWVuc2lvbnMoKS5jbGVhcigpOwotCQkJCWdldERpbWVuc2lvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSOgotCQkJCXNldEluaXRpYWxpemVyKChQVEFycmF5SW5pdGlhbGl6ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUzoKLQkJCQlnZXREaW1lbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQlzZXRJbml0aWFsaXplcigoUFRBcnJheUluaXRpYWxpemVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUzoKLQkJCQlyZXR1cm4gZGltZW5zaW9ucyAhPSBudWxsICYmICFkaW1lbnNpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSOgotCQkJCXJldHVybiBpbml0aWFsaXplciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBkaW1lbnNpb25zKTsKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEluaXRpYWxpemVyKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLX0gLy9BcnJheUNyZWF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5SW5pdGlhbGl6ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlJbml0aWFsaXplckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzN2EzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlJbml0aWFsaXplckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVEFycmF5SW5pdGlhbGl6ZXJJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnJheSBJbml0aWFsaXplcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5SW5pdGlhbGl6ZXJJbXBsI2dldEV4cHJlc3Npb25zIDxlbT5FeHByZXNzaW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQXJyYXlJbml0aWFsaXplckltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRBcnJheUluaXRpYWxpemVyIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHByZXNzaW9ucygpIDxlbT5FeHByZXNzaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4cHJlc3Npb25zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEFycmF5SW5pdGlhbGl6ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQXJyYXlJbml0aWFsaXplcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHByZXNzaW9ucygpIHsKLQkJaWYgKGV4cHJlc3Npb25zID09IG51bGwpIHsKLQkJCWV4cHJlc3Npb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TKTsKLQkJfQotCQlyZXR1cm4gZXhwcmVzc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXhwcmVzc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJcmV0dXJuIGdldEV4cHJlc3Npb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJZ2V0RXhwcmVzc2lvbnMoKS5jbGVhcigpOwotCQkJCWdldEV4cHJlc3Npb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJZ2V0RXhwcmVzc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb25zICE9IG51bGwgJiYgIWV4cHJlc3Npb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBleHByZXNzaW9ucyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vQXJyYXlJbml0aWFsaXplckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRCb29sZWFuTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRCb29sZWFuTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZTFmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQm9vbGVhbkxpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRCb29sZWFuTGl0ZXJhbEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb29sZWFuIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRCb29sZWFuTGl0ZXJhbEltcGwjaXNCb29sZWFuVmFsdWUgPGVtPkJvb2xlYW4gVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEJvb2xlYW5MaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEJvb2xlYW5MaXRlcmFsIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNCb29sZWFuVmFsdWUoKSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNCb29sZWFuVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBCT09MRUFOX1ZBTFVFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Jvb2xlYW5WYWx1ZSgpIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Jvb2xlYW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQk9PTEVBTl9WQUxVRV9FRkxBRyA9IDEgPDwgODsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEJvb2xlYW5MaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEJvb2xlYW5MaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCb29sZWFuVmFsdWUoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQk9PTEVBTl9WQUxVRV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiBuZXdCb29sZWFuVmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRCb29sZWFuVmFsdWUgPSAoZUZsYWdzICYgQk9PTEVBTl9WQUxVRV9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0Jvb2xlYW5WYWx1ZSkgZUZsYWdzIHw9IEJPT0xFQU5fVkFMVUVfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5CT09MRUFOX1ZBTFVFX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUUsIG9sZEJvb2xlYW5WYWx1ZSwgbmV3Qm9vbGVhblZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUU6Ci0JCQkJcmV0dXJuIGlzQm9vbGVhblZhbHVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFOgotCQkJCXNldEJvb2xlYW5WYWx1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUU6Ci0JCQkJc2V0Qm9vbGVhblZhbHVlKEJPT0xFQU5fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQk9PTEVBTl9WQUxVRV9FRkxBRykgIT0gMCkgIT0gQk9PTEVBTl9WQUxVRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL0Jvb2xlYW5MaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENhc3RFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENhc3RFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRhOTY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDYXN0RXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVENhc3RFeHByZXNzaW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDYXN0RXhwcmVzc2lvbkltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENhc3RFeHByZXNzaW9uSW1wbCNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRDYXN0RXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRDYXN0RXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHByZXNzaW9uKCkgPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRDYXN0RXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRDYXN0RXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCQlleHByZXNzaW9uID0gbmV3RXhwcmVzc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBvbGRFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKSB7Ci0JCWlmIChuZXdFeHByZXNzaW9uICE9IGV4cHJlc3Npb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhwcmVzc2lvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHByZXNzaW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEV4cHJlc3Npb24obmV3RXhwcmVzc2lvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG5ld0V4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXhwcmVzc2lvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb24gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9DYXN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENoYXJhY3RlckxpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2hhcmFjdGVyTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1MDRlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2hhcmFjdGVyTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVENoYXJhY3RlckxpdGVyYWxJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFyYWN0ZXIgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENoYXJhY3RlckxpdGVyYWxJbXBsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENoYXJhY3RlckxpdGVyYWxJbXBsI2dldENoYXJWYWx1ZSA8ZW0+Q2hhciBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRDaGFyYWN0ZXJMaXRlcmFsIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXNjYXBlZFZhbHVlKCkgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNDQVBFRF9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc2NhcGVkVmFsdWUoKSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVzY2FwZWRWYWx1ZSA9IEVTQ0FQRURfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhclZhbHVlKCkgPGVtPkNoYXIgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYXJWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIENIQVJfVkFMVUVfRURFRkFVTFQgPSAnXHUwMDAwJzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYXJWYWx1ZSgpIDxlbT5DaGFyIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFyVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBjaGFyIGNoYXJWYWx1ZSA9IENIQVJfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVENoYXJhY3RlckxpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVzY2FwZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGVzY2FwZWRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFc2NhcGVkVmFsdWUoU3RyaW5nIG5ld0VzY2FwZWRWYWx1ZSkgewotCQljaGFyVmFsdWVTZXQgPSBmYWxzZTsKLQkJc2V0Q2hhclZhbHVlR2VuKENIQVJfVkFMVUVfRURFRkFVTFQpOwotCQlzZXRFc2NhcGVkVmFsdWVHZW4obmV3RXNjYXBlZFZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXNjYXBlZFZhbHVlR2VuKFN0cmluZyBuZXdFc2NhcGVkVmFsdWUpIHsKLQkJU3RyaW5nIG9sZEVzY2FwZWRWYWx1ZSA9IGVzY2FwZWRWYWx1ZTsKLQkJZXNjYXBlZFZhbHVlID0gbmV3RXNjYXBlZFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRSwgb2xkRXNjYXBlZFZhbHVlLCBlc2NhcGVkVmFsdWUpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hhclZhbHVlU2V0OwotCQotCXB1YmxpYyBjaGFyIGdldENoYXJWYWx1ZSgpIHsKLQkJaWYgKCFjaGFyVmFsdWVTZXQgJiYgZXNjYXBlZFZhbHVlICE9IEVTQ0FQRURfVkFMVUVfRURFRkFVTFQpIHsKLQkJCVN0cmluZyBzID0gZ2V0RXNjYXBlZFZhbHVlKCk7Ci0JCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPCAyIHx8IHMuY2hhckF0KDApICE9ICdcJycgfHwgcy5jaGFyQXQobGVuLTEpICE9ICdcJycgKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJY2hhciBjID0gcy5jaGFyQXQoMSk7Ci0JCQlpZiAoYyA9PSAnXCcnKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKGMgPT0gJ1xcJykgewotCQkJCWlmIChsZW4gPT0gNCkgewotCQkJCQlzZXRDaGFyVmFsdWVHZW4oZ2V0Q2hhckVzY2FwZWQocy5jaGFyQXQoMikpKTsKLQkJCQl9IGVsc2UgaWYgKGxlbiA9PSA4KSB7Ci0JCQkJCS8vaGFuZGxlIHRoZSBjYXNlIG9mIHVuaWNvZGUuCi0JCQkJCWludCBjdXJyZW50UG9zaXRpb24gPSAyOwotCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOwotCQkJCQlpZiAocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspID09ICd1JykgewotCQkJCQkJaWYgKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQotCQkJCQkJCQl8fCBjMSA8IDAKLQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1Ci0JCQkJCQkJCXx8IGMyIDwgMAotCQkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKLQkJCQkJCQkJfHwgYzMgPCAwCi0JCQkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQotCQkJCQkJCQl8fCBjNCA8IDApewotCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXNldENoYXJWYWx1ZUdlbigoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCkpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlCi0JCQkJc2V0Q2hhclZhbHVlR2VuKGMpOwotCQkJCi0JCQljaGFyVmFsdWVTZXQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBnZXRDaGFyVmFsdWVHZW4oKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjaGFyIGdldENoYXJFc2NhcGVkKGNoYXIgbmV4dENoYXIpIHsKLQkJc3dpdGNoKG5leHRDaGFyKSB7Ci0JCQljYXNlICdiJyA6Ci0JCQkJcmV0dXJuICdcYic7Ci0JCQljYXNlICd0JyA6Ci0JCQkJcmV0dXJuICdcdCc7Ci0JCQljYXNlICduJyA6Ci0JCQkJcmV0dXJuICdcbic7Ci0JCQljYXNlICdmJyA6Ci0JCQkJcmV0dXJuICdcZic7Ci0JCQljYXNlICdyJyA6Ci0JCQkJcmV0dXJuICdccic7Ci0JCQljYXNlICdcIic6Ci0JCQkJcmV0dXJuICdcIic7Ci0JCQljYXNlICdcJyc6Ci0JCQkJcmV0dXJuICdcJyc7Ci0JCQljYXNlICdcXCc6Ci0JCQkJcmV0dXJuICdcXCc7Ci0JCQljYXNlICcwJyA6Ci0JCQkJcmV0dXJuICdcMCc7Ci0JCQljYXNlICcxJyA6Ci0JCQkJcmV0dXJuICdcMSc7Ci0JCQljYXNlICcyJyA6Ci0JCQkJcmV0dXJuICdcMic7Ci0JCQljYXNlICczJyA6Ci0JCQkJcmV0dXJuICdcMyc7Ci0JCQljYXNlICc0JyA6Ci0JCQkJcmV0dXJuICdcNCc7Ci0JCQljYXNlICc1JyA6Ci0JCQkJcmV0dXJuICdcNSc7Ci0JCQljYXNlICc2JyA6Ci0JCQkJcmV0dXJuICdcNic7Ci0JCQljYXNlICc3JyA6Ci0JCQkJcmV0dXJuICdcNyc7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNoYXIgZ2V0Q2hhclZhbHVlR2VuKCkgewotCQlyZXR1cm4gY2hhclZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYXJWYWx1ZShjaGFyIG5ld0NoYXJWYWx1ZSkgewkJCi0JCWNoYXJWYWx1ZVNldCA9IHRydWU7Ci0JCXNldENoYXJWYWx1ZUdlbihuZXdDaGFyVmFsdWUpOwotCQkKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDgpOwotCQliLmFwcGVuZCgnXCcnKTsgLy8gb3BlbmluZyBkZWxpbWl0ZXIKLQkJYXBwZW5kQ2hhcmFjdGVyKG5ld0NoYXJWYWx1ZSwgYik7Ci0JCWIuYXBwZW5kKCdcJycpOyAvLyBjbG9zaW5nIGRlbGltaXRlcgotCQlzZXRFc2NhcGVkVmFsdWVHZW4oYi50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZENoYXJhY3RlcihjaGFyIGNoYXJhY3RlciwgU3RyaW5nQnVmZmVyIGIpIHsKLQkJc3dpdGNoKGNoYXJhY3RlcikgewotCQkJY2FzZSAnXGInIDoKLQkJCQliLmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x0JyA6Ci0JCQkJYi5hcHBlbmQoIlxcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcbicgOgotCQkJCWIuYXBwZW5kKCJcXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXGYnIDoKLQkJCQliLmFwcGVuZCgiXFxmIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xyJyA6Ci0JCQkJYi5hcHBlbmQoIlxcciIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcIic6Ci0JCQkJYi5hcHBlbmQoIlxcXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCWIuYXBwZW5kKCJcXFwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xcJzoKLQkJCQliLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcMCcgOgotCQkJCWIuYXBwZW5kKCJcXDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDEnIDoKLQkJCQliLmFwcGVuZCgiXFwxIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wyJyA6Ci0JCQkJYi5hcHBlbmQoIlxcMiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcMycgOgotCQkJCWIuYXBwZW5kKCJcXDMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDQnIDoKLQkJCQliLmFwcGVuZCgiXFw0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1w1JyA6Ci0JCQkJYi5hcHBlbmQoIlxcNSIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcNicgOgotCQkJCWIuYXBwZW5kKCJcXDYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDcnIDoKLQkJCQliLmFwcGVuZCgiXFw3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsJCQkKLQkJCWRlZmF1bHQ6Ci0JCQkJLy8gdXNlIGEgc2ltcGxlIGFsZ29yaXRobSwgaWYgY2hhciBpcyA8IDI1NSB0aGVuIGp1c3QgdXNlIGl0LCBlbHNlIHVzZSBpdCBhcyB1bmljb2RlLgotCQkJCWlmIChjaGFyYWN0ZXIgPCAyNTUpCi0JCQkJCWIuYXBwZW5kKGNoYXJhY3Rlcik7Ci0JCQkJZWxzZSB7Ci0JCQkJCWIuYXBwZW5kKCJcXHUiKTsKLQkJCQkJU3RyaW5nIHMgPSBJbnRlZ2VyLnRvU3RyaW5nKGNoYXJhY3RlciwgMTYpOwotCQkJCQlpbnQgemVyb3MgPSA0LXMubGVuZ3RoKCk7Ci0JCQkJCXdoaWxlICh6ZXJvcy0tID4gMCkgewotCQkJCQkJYi5hcHBlbmQoJzAnKTsKLQkJCQkJfQotCQkJCQliLmFwcGVuZChzKTsKLQkJCQl9CQotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhclZhbHVlR2VuKGNoYXIgbmV3Q2hhclZhbHVlKSB7Ci0JCWNoYXIgb2xkQ2hhclZhbHVlID0gY2hhclZhbHVlOwotCQljaGFyVmFsdWUgPSBuZXdDaGFyVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFLCBvbGRDaGFyVmFsdWUsIGNoYXJWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldEVzY2FwZWRWYWx1ZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRToKLQkJCQlyZXR1cm4gbmV3IENoYXJhY3RlcihnZXRDaGFyVmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlzZXRFc2NhcGVkVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRToKLQkJCQlzZXRDaGFyVmFsdWUoKChDaGFyYWN0ZXIpbmV3VmFsdWUpLmNoYXJWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlzZXRFc2NhcGVkVmFsdWUoRVNDQVBFRF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRToKLQkJCQlzZXRDaGFyVmFsdWUoQ0hBUl9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXJldHVybiBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBlc2NhcGVkVmFsdWUgIT0gbnVsbCA6ICFFU0NBUEVEX1ZBTFVFX0VERUZBVUxULmVxdWFscyhlc2NhcGVkVmFsdWUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRToKLQkJCQlyZXR1cm4gY2hhclZhbHVlICE9IENIQVJfVkFMVUVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vQ2hhcmFjdGVyTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWVhMTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCNnZXRBcmd1bWVudHMgPGVtPkFyZ3VtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcmd1bWVudHMoKSA8ZW0+QXJndW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFyZ3VtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFyZ3VtZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFyZ3VtZW50cygpIHsKLQkJaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7Ci0JCQlhcmd1bWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUFRFeHByZXNzaW9uLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gYXJndW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcmd1bWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTOgotCQkJCXJldHVybiBnZXRBcmd1bWVudHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTOgotCQkJCWdldEFyZ3VtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXJndW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlnZXRBcmd1bWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTOgotCQkJCXJldHVybiBhcmd1bWVudHMgIT0gbnVsbCAmJiAhYXJndW1lbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgYXJndW1lbnRzKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9DbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjYWU0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25kaXRpb25hbCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCNnZXRDb25kaXRpb24gPGVtPkNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwjZ2V0VHJ1ZSA8ZW0+VHJ1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwjZ2V0RmFsc2UgPGVtPkZhbHNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25kaXRpb24oKSA8ZW0+Q29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gY29uZGl0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRydWUoKSA8ZW0+VHJ1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJ1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiB0cnVlXyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGYWxzZSgpIDxlbT5GYWxzZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmFsc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZmFsc2VfID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldENvbmRpdGlvbigpIHsKLQkJcmV0dXJuIGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb25kaXRpb24oUFRFeHByZXNzaW9uIG5ld0NvbmRpdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkQ29uZGl0aW9uID0gY29uZGl0aW9uOwotCQljb25kaXRpb24gPSBuZXdDb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiwgb2xkQ29uZGl0aW9uLCBuZXdDb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmRpdGlvbihQVEV4cHJlc3Npb24gbmV3Q29uZGl0aW9uKSB7Ci0JCWlmIChuZXdDb25kaXRpb24gIT0gY29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29uZGl0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbmRpdGlvbihuZXdDb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OLCBuZXdDb25kaXRpb24sIG5ld0NvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0VHJ1ZSgpIHsKLQkJcmV0dXJuIHRydWVfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRydWUoUFRFeHByZXNzaW9uIG5ld1RydWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZFRydWUgPSB0cnVlXzsKLQkJdHJ1ZV8gPSBuZXdUcnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFLCBvbGRUcnVlLCBuZXdUcnVlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcnVlKFBURXhwcmVzc2lvbiBuZXdUcnVlKSB7Ci0JCWlmIChuZXdUcnVlICE9IHRydWVfKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0cnVlXyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0cnVlXykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1RydWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VHJ1ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VHJ1ZShuZXdUcnVlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUsIG5ld1RydWUsIG5ld1RydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEZhbHNlKCkgewotCQlyZXR1cm4gZmFsc2VfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEZhbHNlKFBURXhwcmVzc2lvbiBuZXdGYWxzZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkRmFsc2UgPSBmYWxzZV87Ci0JCWZhbHNlXyA9IG5ld0ZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSwgb2xkRmFsc2UsIG5ld0ZhbHNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGYWxzZShQVEV4cHJlc3Npb24gbmV3RmFsc2UpIHsKLQkJaWYgKG5ld0ZhbHNlICE9IGZhbHNlXykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZmFsc2VfICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWZhbHNlXykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdGYWxzZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdGYWxzZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEZhbHNlKG5ld0ZhbHNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFLCBuZXdGYWxzZSwgbmV3RmFsc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0VHJ1ZShudWxsLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRGYWxzZShudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRDb25kaXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRToKLQkJCQlyZXR1cm4gZ2V0VHJ1ZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQlyZXR1cm4gZ2V0RmFsc2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTjoKLQkJCQlzZXRDb25kaXRpb24oKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFOgotCQkJCXNldFRydWUoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQlzZXRGYWxzZSgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT046Ci0JCQkJc2V0Q29uZGl0aW9uKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFOgotCQkJCXNldFRydWUoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFOgotCQkJCXNldEZhbHNlKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTjoKLQkJCQlyZXR1cm4gY29uZGl0aW9uICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUU6Ci0JCQkJcmV0dXJuIHRydWVfICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFOgotCQkJCXJldHVybiBmYWxzZV8gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRDb25kaXRpb24oKSk7Ci0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRUcnVlKCkpOwotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RmFsc2UoKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2NGQ3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVEV4cHJlc3Npb25JbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUFRFeHByZXNzaW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUFRFeHByZXNzaW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5FeHByZXNzaW9uI2FjY2VwdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWNjZXB0KFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXRyeSB7Ci0JCQljaGlsZEFjY2VwdDAodmlzaXRvcik7Ci0JCX0gY2F0Y2ggKFBhcnNlVmlzaXRvci5TdG9wVmlzaXRpbmcgZSkgewotCQkJLy8gRG8gbm90aGluZywgdGhpcyBpcyBhIG5vcm1hbCB3YXkgdG8ganVzdCBzdG9wIHZpc2l0aW5nLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvciBvbiBhIHR5cGUtc3BlY2lmaWMgdmlzaXQgb2YgdGhlIGN1cnJlbnQgbm9kZS4KLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGluIGFsbCBjb25jcmV0ZSBFeHByZXNzaW9uIG5vZGUgdHlwZXMuCi0JICogPHA+Ci0JICogR2VuZXJhbCB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50YXRpb24gb24gZWFjaCBjb25jcmV0ZSBBU1ROb2RlIGNsYXNzOgotCSAqIDxwcmU+Ci0JICogPGNvZGU+Ci0JICogYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkgKiBpZiAodmlzaXRDaGlsZHJlbikgewotCSAqICAgIC8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkgKiAgICBhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRQcm9wZXJ0eTEoKSk7Ci0JICogICAgYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgcmF3TGlzdFByb3BlcnR5KTsKLQkgKiAgICBhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRQcm9wZXJ0eTIoKSk7Ci0JICogfQotCSAqIHZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JICogPC9jb2RlPgotCSAqIDwvcHJlPgotCSAqIE5vdGUgdGhhdCB0aGUgY2FsbGVyICg8Y29kZT5hY2NlcHQ8L2NvZGU+KSB0YWtlIGNhcmVzIG9mIGludm9raW5nCi0JICogPGNvZGU+dmlzaXRvci5wcmVWaXNpdCh0aGlzKTwvY29kZT4gYW5kIDxjb2RlPnZpc2l0b3IucG9zdFZpc2l0KHRoaXMpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3Igb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcik7Ci0KLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiB2aXNpdG9yIG9uIGEgdmlzaXQgb2YgdGhlIGN1cnJlbnQgbm9kZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBieSB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mCi0JICogPGNvZGU+YWNjZXB0MDwvY29kZT4gdG8gdHJhdmVyc2Ugb3B0aW9uYWwgcHJvcGVydGllcy4gRXF1aXZhbGVudAotCSAqIHRvIDxjb2RlPmNoaWxkLmFjY2VwdCh2aXNpdG9yKTwvY29kZT4gaWYgPGNvZGU+Y2hpbGQ8L2NvZGU+Ci0JICogaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKLQkgKiBAcGFyYW0gY2hpbGQgdGhlIGNoaWxkIEV4cHJlc3Npb24gbm9kZSB0byBkaXNwYXRjaCB0b28sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgaWYgbm9uZS4gSXQgYWN0dWFsbHkgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBQVEV4cHJlc3Npb25JbXBsLCBidXQgCi0JICogICAgaXQgd291bGQgYmUgdG9vIGRpZmZpY3VsdCB0byBwdXQgdGhlIGNhc3QgaW4gZWFjaCBjYWxsIHRvIGFjY2VwdENoaWxkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFjY2VwdENoaWxkKFBhcnNlVmlzaXRvciB2aXNpdG9yLCBQVEV4cHJlc3Npb24gY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkoKFBURXhwcmVzc2lvbkltcGwpIGNoaWxkKS5jaGlsZEFjY2VwdDAodmlzaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBPTkxZIGJ5IFBURXhwcmVzc2lvbkltcGwgZm9yIHRoZSBjaGlsZCB0byBhY2NlcHQgdGhlIHZpc2l0b3IsIGJ1dAotCSAqIGl0IGRvZXNuJ3QgY2F0Y2ggU3RvcFZpc2l0aW5nLgotCSAqIEBwYXJhbSB2aXNpdG9yCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGlsZEFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJaWYgKHZpc2l0b3IgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIGJlZ2luIHdpdGggdGhlIGdlbmVyaWMgcHJlLXZpc2l0Ci0JCXZpc2l0b3IucHJlVmlzaXQodGhpcyk7Ci0JCS8vIGR5bmFtaWMgZGlzcGF0Y2ggdG8gaW50ZXJuYWwgbWV0aG9kIGZvciB0eXBlLXNwZWNpZmljIHZpc2l0L2VuZFZpc2l0Ci0JCWFjY2VwdDAodmlzaXRvcik7Ci0JCS8vIGVuZCB3aXRoIHRoZSBnZW5lcmljIHBvc3QtdmlzaXQKLQkJdmlzaXRvci5wb3N0VmlzaXQodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3Igb24gYSB2aXNpdCBvZiB0aGUgZ2l2ZW4gbGl2ZSBsaXN0IG9mCi0JICogY2hpbGQgbm9kZXMuIAotCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIG9iamVjdAotCSAqIEBwYXJhbSBjaGlsZHJlbiB0aGUgY2hpbGQgRXhwcmVzc2lvbiBub2RlcyB0byBkaXNwYXRjaCB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhY2NlcHRDaGlsZHJlbihQYXJzZVZpc2l0b3IgdmlzaXRvciwgTGlzdCBjaGlsZHJlbikgewotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIChQVEV4cHJlc3Npb24pIGNoaWxkcmVuLmdldChpKSk7Ci0JCQl9Ci0JCX0gCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIGFsbG9jYXRlIGEgYnVmZmVyIHRoYXQgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW4gYXZlcmFnZSBjb21waWxhdGlvbiB1bml0Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDYwMDApOwotCQlpbnQgcCA9IGJ1ZmZlci5sZW5ndGgoKTsKLQkJdHJ5IHsKLQkJCWFwcGVuZERlYnVnU3RyaW5nKGJ1ZmZlcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gc2luY2UgZGVidWdnZXIgc29tZXRpbWVzIGNhbGwgdG9TdHJpbmcgbWV0aG9kcywgcHJvYmxlbXMgY2FuIGVhc2lseSBoYXBwZW4gd2hlbgotCQkJLy8gdG9TdHJpbmcgaXMgY2FsbGVkIG9uIGFuIGluc3RhbmNlIHRoYXQgaXMgYmVpbmcgaW5pdGlhbGl6ZWQKLQkJCWJ1ZmZlci5zZXRMZW5ndGgocCk7Ci0JCQlidWZmZXIuYXBwZW5kKCIhIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoc3RhbmRhcmRUb1N0cmluZygpKTsKLQkJfQotCQkvLyBjb252ZXJ0IHRvIGEgc3RyaW5nLCBidXQgbG9zZSB0aGUgZXh0cmEgc3BhY2UgaW4gdGhlIHN0cmluZyBidWZmZXIgYnkgY29weWluZwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgc3RhbmRhcmRUb1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFwcGVuZERlYnVnU3RyaW5nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJLy8gcHJpbnQgdGhlIHN1YnRyZWUgYnkgZGVmYXVsdAotCQlhcHBlbmRQcmludFN0cmluZyhidWZmZXIpOwotCX0KLQkKLQkvKgotCSAqIEFwcGVuZHMgYSBzdGFuZGFyZCBKYXZhIHNvdXJjZSBjb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc3VidHJlZSB0byB0aGUgZ2l2ZW4KLQkgKiBzdHJpbmcgYnVmZmVyLgotCSAqIAotCSAqIEBwYXJhbSBidWZmZXIgdGhlIHN0cmluZyBidWZmZXIgdG8gYXBwZW5kIHRvCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYXBwZW5kUHJpbnRTdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlOYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIgcHJpbnRlciA9IG5ldyBOYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIoKTsKLQkJdGhpcy5hY2NlcHQocHJpbnRlcik7Ci0JCWJ1ZmZlci5hcHBlbmQocHJpbnRlci5nZXRSZXN1bHQoKSk7Ci0JfQkKLQotfSAvL0V4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURmllbGRBY2Nlc3NJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURmllbGRBY2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODdlMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEZpZWxkQWNjZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBURmllbGRBY2Nlc3NJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmllbGQgQWNjZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURmllbGRBY2Nlc3NJbXBsI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEZpZWxkQWNjZXNzSW1wbCNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEZpZWxkQWNjZXNzSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEZpZWxkQWNjZXNzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWNlaXZlcigpIDxlbT5SZWNlaXZlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVjZWl2ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gcmVjZWl2ZXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkKCkgPGVtPkZpZWxkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGQoKSA8ZW0+RmllbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkID0gRklFTERfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRGaWVsZEFjY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRGaWVsZEFjY2VzcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0UmVjZWl2ZXIoKSB7Ci0JCXJldHVybiByZWNlaXZlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gbmV3UmVjZWl2ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZFJlY2VpdmVyID0gcmVjZWl2ZXI7Ci0JCXJlY2VpdmVyID0gbmV3UmVjZWl2ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIsIG9sZFJlY2VpdmVyLCBuZXdSZWNlaXZlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uIG5ld1JlY2VpdmVyKSB7Ci0JCWlmIChuZXdSZWNlaXZlciAhPSByZWNlaXZlcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVjZWl2ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVjZWl2ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZWNlaXZlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZWNlaXZlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVjZWl2ZXIobmV3UmVjZWl2ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUiwgbmV3UmVjZWl2ZXIsIG5ld1JlY2VpdmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZCgpIHsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkKFN0cmluZyBuZXdGaWVsZCkgewotCQlTdHJpbmcgb2xkRmllbGQgPSBmaWVsZDsKLQkJZmllbGQgPSBuZXdGaWVsZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19GSUVMRCwgb2xkRmllbGQsIGZpZWxkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZWNlaXZlcihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUjoKLQkJCQlyZXR1cm4gZ2V0UmVjZWl2ZXIoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19GSUVMRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVI6Ci0JCQkJc2V0UmVjZWl2ZXIoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEOgotCQkJCXNldEZpZWxkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVI6Ci0JCQkJc2V0UmVjZWl2ZXIoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fRklFTEQ6Ci0JCQkJc2V0RmllbGQoRklFTERfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSOgotCQkJCXJldHVybiByZWNlaXZlciAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEOgotCQkJCXJldHVybiBGSUVMRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGQgIT0gbnVsbCA6ICFGSUVMRF9FREVGQVVMVC5lcXVhbHMoZmllbGQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRSZWNlaXZlcigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9GaWVsZEFjY2Vzc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbmZpeEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5maXhFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWM4Nzc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbmZpeEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRJbmZpeEV4cHJlc3Npb25JbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmZpeCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbCNnZXRMZWZ0T3BlcmFuZCA8ZW0+TGVmdCBPcGVyYW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbCNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbmZpeEV4cHJlc3Npb25JbXBsI2dldFJpZ2h0T3BlcmFuZCA8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwjZ2V0RXh0ZW5kZWRPcGVyYW5kcyA8ZW0+RXh0ZW5kZWQgT3BlcmFuZHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEluZml4RXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRJbmZpeEV4cHJlc3Npb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlZnRPcGVyYW5kKCkgPGVtPkxlZnQgT3BlcmFuZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVmdE9wZXJhbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gbGVmdE9wZXJhbmQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhdG9yKCkgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgT1BFUkFUT1JfRURFRkFVTFQgPSBQVEluZml4T3BlcmF0b3IuVElNRVNfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhdG9yKCkgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBUSW5maXhPcGVyYXRvciBvcGVyYXRvciA9IE9QRVJBVE9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmlnaHRPcGVyYW5kKCkgPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJpZ2h0T3BlcmFuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiByaWdodE9wZXJhbmQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRPcGVyYW5kcygpIDxlbT5FeHRlbmRlZCBPcGVyYW5kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZE9wZXJhbmRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRPcGVyYW5kcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRJbmZpeEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUSW5maXhFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRMZWZ0T3BlcmFuZCgpIHsKLQkJcmV0dXJuIGxlZnRPcGVyYW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldExlZnRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdMZWZ0T3BlcmFuZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkTGVmdE9wZXJhbmQgPSBsZWZ0T3BlcmFuZDsKLQkJbGVmdE9wZXJhbmQgPSBuZXdMZWZ0T3BlcmFuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5ELCBvbGRMZWZ0T3BlcmFuZCwgbmV3TGVmdE9wZXJhbmQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlZnRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdMZWZ0T3BlcmFuZCkgewotCQlpZiAobmV3TGVmdE9wZXJhbmQgIT0gbGVmdE9wZXJhbmQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGxlZnRPcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxlZnRPcGVyYW5kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdMZWZ0T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMZWZ0T3BlcmFuZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRMZWZ0T3BlcmFuZChuZXdMZWZ0T3BlcmFuZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQsIG5ld0xlZnRPcGVyYW5kLCBuZXdMZWZ0T3BlcmFuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEluZml4T3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBvcGVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcGVyYXRvcihQVEluZml4T3BlcmF0b3IgbmV3T3BlcmF0b3IpIHsKLQkJUFRJbmZpeE9wZXJhdG9yIG9sZE9wZXJhdG9yID0gb3BlcmF0b3I7Ci0JCW9wZXJhdG9yID0gbmV3T3BlcmF0b3IgPT0gbnVsbCA/IE9QRVJBVE9SX0VERUZBVUxUIDogbmV3T3BlcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SLCBvbGRPcGVyYXRvciwgb3BlcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldFJpZ2h0T3BlcmFuZCgpIHsKLQkJcmV0dXJuIHJpZ2h0T3BlcmFuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSaWdodE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld1JpZ2h0T3BlcmFuZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkUmlnaHRPcGVyYW5kID0gcmlnaHRPcGVyYW5kOwotCQlyaWdodE9wZXJhbmQgPSBuZXdSaWdodE9wZXJhbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQsIG9sZFJpZ2h0T3BlcmFuZCwgbmV3UmlnaHRPcGVyYW5kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWdodE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld1JpZ2h0T3BlcmFuZCkgewotCQlpZiAobmV3UmlnaHRPcGVyYW5kICE9IHJpZ2h0T3BlcmFuZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmlnaHRPcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJpZ2h0T3BlcmFuZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JpZ2h0T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSaWdodE9wZXJhbmQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJpZ2h0T3BlcmFuZChuZXdSaWdodE9wZXJhbmQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORCwgbmV3UmlnaHRPcGVyYW5kLCBuZXdSaWdodE9wZXJhbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRPcGVyYW5kcygpIHsKLQkJaWYgKGV4dGVuZGVkT3BlcmFuZHMgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRPcGVyYW5kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRPcGVyYW5kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0TGVmdE9wZXJhbmQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSaWdodE9wZXJhbmQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZE9wZXJhbmRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EOgotCQkJCXJldHVybiBnZXRMZWZ0T3BlcmFuZCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0T3BlcmF0b3IoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORDoKLQkJCQlyZXR1cm4gZ2V0UmlnaHRPcGVyYW5kKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZE9wZXJhbmRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQ6Ci0JCQkJc2V0TGVmdE9wZXJhbmQoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlzZXRPcGVyYXRvcigoUFRJbmZpeE9wZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQ6Ci0JCQkJc2V0UmlnaHRPcGVyYW5kKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFM6Ci0JCQkJZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EOgotCQkJCXNldExlZnRPcGVyYW5kKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlzZXRPcGVyYXRvcihPUEVSQVRPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EOgotCQkJCXNldFJpZ2h0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFM6Ci0JCQkJZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORDoKLQkJCQlyZXR1cm4gbGVmdE9wZXJhbmQgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIG9wZXJhdG9yICE9IE9QRVJBVE9SX0VERUZBVUxUOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EOgotCQkJCXJldHVybiByaWdodE9wZXJhbmQgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFM6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkT3BlcmFuZHMgIT0gbnVsbCAmJiAhZXh0ZW5kZWRPcGVyYW5kcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldExlZnRPcGVyYW5kKCkpOwotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UmlnaHRPcGVyYW5kKCkpOwotCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgZXh0ZW5kZWRPcGVyYW5kcyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jYXNDb21wcmVzc2VkRXhwcmVzc2lvbigpCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBhc0NvbXByZXNzZWRFeHByZXNzaW9uKCkgewotCQkvLyBJZiBubyBsZWZ0IGFuZCBubyByaWdodAotCQlpZihnZXRMZWZ0T3BlcmFuZCgpID09IG51bGwgJiYgZ2V0UmlnaHRPcGVyYW5kKCkgIT0gbnVsbCl7Ci0JCQkvLyBubyBleHRlbmRzIHNvIGp1c3QgdXNlIHRoZSByaWdodCBvcGVyYW5kCi0JCQlpZihnZXRFeHRlbmRlZE9wZXJhbmRzKCkuaXNFbXB0eSgpKXsKLQkJCQlyZXR1cm4gZ2V0UmlnaHRPcGVyYW5kKCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSByaWdodCBiZWNvbWVzIHRoZSBuZXcgbGVmdAotCQkJCXNldExlZnRPcGVyYW5kKGdldFJpZ2h0T3BlcmFuZCgpKTsKLQkJCQkvLyBUaGUgZmlyc3Qgb3BlcmFuZCBiZWNvbWVzIHRoZSByaWdodCBvbmUKLQkJCQlzZXRSaWdodE9wZXJhbmQoKFBURXhwcmVzc2lvbikgZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLnJlbW92ZSgwKSk7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZ2V0UmlnaHRPcGVyYW5kKCkgPT0gbnVsbCAmJiBnZXRMZWZ0T3BlcmFuZCgpICE9IG51bGwpewotCQkJLy8gbm8gZXh0ZW5kcyBzbyBqdXN0IHVzZSB0aGUgbGVmdCBvcGVyYW5kCi0JCQlpZihnZXRFeHRlbmRlZE9wZXJhbmRzKCkuaXNFbXB0eSgpKXsKLQkJCQlyZXR1cm4gZ2V0TGVmdE9wZXJhbmQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVGhlIHJpZ2h0IGJlY29tZXMgdGhlIGZpcnN0IGV4dGVuZGVkCi0JCQkJc2V0UmlnaHRPcGVyYW5kKChQVEV4cHJlc3Npb24pZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLnJlbW92ZSgwKSk7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9CQkJCi0JCX0JCi0JCXJldHVybiB0aGlzOwotCX0KLX0gLy9JbmZpeEV4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VSZWZlcmVuY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjVkMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlUmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICVXJQotICogQHZlcnNpb24gJUklICVIJQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlUmVmZXJlbmNlSW1wbCNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUSW5zdGFuY2VSZWZlcmVuY2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZSgpIDxlbT5SZWZlcmVuY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIElKYXZhSW5zdGFuY2UgcmVmZXJlbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEluc3RhbmNlUmVmZXJlbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEluc3RhbmNlUmVmZXJlbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElKYXZhSW5zdGFuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQlpZiAocmVmZXJlbmNlICE9IG51bGwgJiYgcmVmZXJlbmNlLmVJc1Byb3h5KCkpIHsKLQkJCUlKYXZhSW5zdGFuY2Ugb2xkUmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCQkJcmVmZXJlbmNlID0gKElKYXZhSW5zdGFuY2UpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXJlZmVyZW5jZSk7Ci0JCQlpZiAocmVmZXJlbmNlICE9IG9sZFJlZmVyZW5jZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFLCBvbGRSZWZlcmVuY2UsIHJlZmVyZW5jZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElKYXZhSW5zdGFuY2UgYmFzaWNHZXRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlKElKYXZhSW5zdGFuY2UgbmV3UmVmZXJlbmNlKSB7Ci0JCUlKYXZhSW5zdGFuY2Ugb2xkUmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCQlyZWZlcmVuY2UgPSBuZXdSZWZlcmVuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFLCBvbGRSZWZlcmVuY2UsIHJlZmVyZW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZWZlcmVuY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZWZlcmVuY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFOgotCQkJCXNldFJlZmVyZW5jZSgoSUphdmFJbnN0YW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0U6Ci0JCQkJc2V0UmVmZXJlbmNlKChJSmF2YUluc3RhbmNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gcmVmZXJlbmNlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRFeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSW5zdGFuY2VSZWZ7IiArIHJlZmVyZW5jZSArICJ9IjsKLQl9Ci0KLX0gLy9QVEluc3RhbmNlUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlb2ZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VvZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyODkyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VvZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVEluc3RhbmNlb2ZJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2Y7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnN0YW5jZW9mPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VvZkltcGwjZ2V0T3BlcmFuZCA8ZW0+T3BlcmFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlb2ZJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEluc3RhbmNlb2ZJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUSW5zdGFuY2VvZiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3BlcmFuZCgpIDxlbT5PcGVyYW5kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIG9wZXJhbmQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRJbnN0YW5jZW9mSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEluc3RhbmNlb2YoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldE9wZXJhbmQoKSB7Ci0JCXJldHVybiBvcGVyYW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld09wZXJhbmQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZE9wZXJhbmQgPSBvcGVyYW5kOwotCQlvcGVyYW5kID0gbmV3T3BlcmFuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCwgb2xkT3BlcmFuZCwgbmV3T3BlcmFuZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3BlcmFuZChQVEV4cHJlc3Npb24gbmV3T3BlcmFuZCkgewotCQlpZiAobmV3T3BlcmFuZCAhPSBvcGVyYW5kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9wZXJhbmQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdPcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09wZXJhbmQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE9wZXJhbmQobmV3T3BlcmFuZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5ELCBuZXdPcGVyYW5kLCBuZXdPcGVyYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQ6Ci0JCQkJCXJldHVybiBiYXNpY1NldE9wZXJhbmQobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQ6Ci0JCQkJcmV0dXJuIGdldE9wZXJhbmQoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORDoKLQkJCQlzZXRPcGVyYW5kKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQ6Ci0JCQkJc2V0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5EOgotCQkJCXJldHVybiBvcGVyYW5kICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0T3BlcmFuZCgpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL0luc3RhbmNlb2ZJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW52YWxpZEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW52YWxpZEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGRkNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEludmFsaWRFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUSW52YWxpZEV4cHJlc3Npb25JbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW52YWxpZCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW52YWxpZEV4cHJlc3Npb25JbXBsI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEludmFsaWRFeHByZXNzaW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEludmFsaWRFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZSgpIDxlbT5NZXNzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2UoKSA8ZW0+TWVzc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlID0gTUVTU0FHRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEludmFsaWRFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEludmFsaWRFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlKSB7Ci0JCVN0cmluZyBvbGRNZXNzYWdlID0gbWVzc2FnZTsKLQkJbWVzc2FnZSA9IG5ld01lc3NhZ2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRSwgb2xkTWVzc2FnZSwgbWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFOgotCQkJCXJldHVybiBnZXRNZXNzYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0U6Ci0JCQkJc2V0TWVzc2FnZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0U6Ci0JCQkJc2V0TWVzc2FnZShNRVNTQUdFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFOgotCQkJCXJldHVybiBNRVNTQUdFX0VERUZBVUxUID09IG51bGwgPyBtZXNzYWdlICE9IG51bGwgOiAhTUVTU0FHRV9FREVGQVVMVC5lcXVhbHMobWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9JbnZhbGlkRXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRNZXRob2RJbnZvY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE1ldGhvZEludm9jYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTA0ZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE1ldGhvZEludm9jYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRNZXRob2RJbnZvY2F0aW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEludm9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRNZXRob2RJbnZvY2F0aW9uSW1wbCNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRNZXRob2RJbnZvY2F0aW9uSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTWV0aG9kSW52b2NhdGlvbkltcGwjZ2V0QXJndW1lbnRzIDxlbT5Bcmd1bWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVE1ldGhvZEludm9jYXRpb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUTWV0aG9kSW52b2NhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVjZWl2ZXIoKSA8ZW0+UmVjZWl2ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlY2VpdmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIHJlY2VpdmVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJndW1lbnRzKCkgPGVtPkFyZ3VtZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcmd1bWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhcmd1bWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUTWV0aG9kSW52b2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRSZWNlaXZlcigpIHsKLQkJcmV0dXJuIHJlY2VpdmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlY2VpdmVyKFBURXhwcmVzc2lvbiBuZXdSZWNlaXZlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkUmVjZWl2ZXIgPSByZWNlaXZlcjsKLQkJcmVjZWl2ZXIgPSBuZXdSZWNlaXZlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSLCBvbGRSZWNlaXZlciwgbmV3UmVjZWl2ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlY2VpdmVyKFBURXhwcmVzc2lvbiBuZXdSZWNlaXZlcikgewotCQlpZiAobmV3UmVjZWl2ZXIgIT0gcmVjZWl2ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlY2VpdmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlY2VpdmVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZWNlaXZlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZWNlaXZlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZWNlaXZlcihuZXdSZWNlaXZlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVIsIG5ld1JlY2VpdmVyLCBuZXdSZWNlaXZlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBcmd1bWVudHMoKSB7Ci0JCWlmIChhcmd1bWVudHMgPT0gbnVsbCkgewotCQkJYXJndW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGFyZ3VtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmVjZWl2ZXIobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFyZ3VtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUjoKLQkJCQlyZXR1cm4gZ2V0UmVjZWl2ZXIoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QXJndW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVI6Ci0JCQkJc2V0UmVjZWl2ZXIoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlnZXRBcmd1bWVudHMoKS5jbGVhcigpOwotCQkJCWdldEFyZ3VtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSOgotCQkJCXNldFJlY2VpdmVyKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlnZXRBcmd1bWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVI6Ci0JCQkJcmV0dXJuIHJlY2VpdmVyICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFM6Ci0JCQkJcmV0dXJuIGFyZ3VtZW50cyAhPSBudWxsICYmICFhcmd1bWVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRSZWNlaXZlcigpKTsKLQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGFyZ3VtZW50cyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vTWV0aG9kSW52b2NhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTkwZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFROYW1lSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTmFtZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUTmFtZUltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFROYW1lIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVE5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9OYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bGxMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bGxMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzI2OTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdWxsTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUTnVsbExpdGVyYWxJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OdWxsIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVE51bGxMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVE51bGxMaXRlcmFsIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFROdWxsTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFROdWxsTGl0ZXJhbCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9OdWxsTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdW1iZXJMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bWJlckxpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDk0YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bWJlckxpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFROdW1iZXJMaXRlcmFsSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TnVtYmVyIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROdW1iZXJMaXRlcmFsSW1wbCNnZXRUb2tlbiA8ZW0+VG9rZW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVE51bWJlckxpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUTnVtYmVyTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRva2VuKCkgPGVtPlRva2VuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb2tlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9rZW4oKSA8ZW0+VG9rZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRva2VuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRva2VuID0gVE9LRU5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFROdW1iZXJMaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVE51bWJlckxpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRva2VuKCkgewotCQlyZXR1cm4gdG9rZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9rZW4oU3RyaW5nIG5ld1Rva2VuKSB7Ci0JCVN0cmluZyBvbGRUb2tlbiA9IHRva2VuOwotCQl0b2tlbiA9IG5ld1Rva2VuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVU1CRVJfTElURVJBTF9fVE9LRU4sIG9sZFRva2VuLCB0b2tlbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOOgotCQkJCXJldHVybiBnZXRUb2tlbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOOgotCQkJCXNldFRva2VuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMX19UT0tFTjoKLQkJCQlzZXRUb2tlbihUT0tFTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMX19UT0tFTjoKLQkJCQlyZXR1cm4gVE9LRU5fRURFRkFVTFQgPT0gbnVsbCA/IHRva2VuICE9IG51bGwgOiAhVE9LRU5fRURFRkFVTFQuZXF1YWxzKHRva2VuKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRva2VuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b2tlbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9OdW1iZXJMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWU4ZGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwcmVzc2lvbigpIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCQlleHByZXNzaW9uID0gbmV3RXhwcmVzc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBvbGRFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKSB7Ci0JCWlmIChuZXdFeHByZXNzaW9uICE9IGV4cHJlc3Npb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhwcmVzc2lvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHByZXNzaW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEV4cHJlc3Npb24obmV3RXhwcmVzc2lvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG5ld0V4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXhwcmVzc2lvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBnZXRFeHByZXNzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb24gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLQotfSAvL1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFByZWZpeEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUUHJlZml4RXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxNTBhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUUHJlZml4RXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVFByZWZpeEV4cHJlc3Npb25JbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByZWZpeCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUHJlZml4RXhwcmVzc2lvbkltcGwjZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUHJlZml4RXhwcmVzc2lvbkltcGwjZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUUHJlZml4RXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRQcmVmaXhFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3BlcmF0b3IoKSA8ZW0+T3BlcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBUUHJlZml4T3BlcmF0b3IgT1BFUkFUT1JfRURFRkFVTFQgPSBQVFByZWZpeE9wZXJhdG9yLlBMVVNfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhdG9yKCkgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBUUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IgPSBPUEVSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cHJlc3Npb24oKSA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVFByZWZpeEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUUHJlZml4RXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFByZWZpeE9wZXJhdG9yIGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gb3BlcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoUFRQcmVmaXhPcGVyYXRvciBuZXdPcGVyYXRvcikgewotCQlQVFByZWZpeE9wZXJhdG9yIG9sZE9wZXJhdG9yID0gb3BlcmF0b3I7Ci0JCW9wZXJhdG9yID0gbmV3T3BlcmF0b3IgPT0gbnVsbCA/IE9QRVJBVE9SX0VERUZBVUxUIDogbmV3T3BlcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUiwgb2xkT3BlcmF0b3IsIG9wZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQkJZXhwcmVzc2lvbiA9IG5ld0V4cHJlc3Npb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBvbGRFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKSB7Ci0JCWlmIChuZXdFeHByZXNzaW9uICE9IGV4cHJlc3Npb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhwcmVzc2lvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFeHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4cHJlc3Npb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHByZXNzaW9uKG5ld0V4cHJlc3Npb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG5ld0V4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRFeHByZXNzaW9uKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIGdldE9wZXJhdG9yKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBnZXRFeHByZXNzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJc2V0T3BlcmF0b3IoKFBUUHJlZml4T3BlcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJc2V0T3BlcmF0b3IoT1BFUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIG9wZXJhdG9yICE9IE9QRVJBVE9SX0VERUZBVUxUOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZXhwcmVzc2lvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vUHJlZml4RXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRTdHJpbmdMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFN0cmluZ0xpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjg5MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFN0cmluZ0xpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRTdHJpbmdMaXRlcmFsSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RyaW5nIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRTdHJpbmdMaXRlcmFsSW1wbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRTdHJpbmdMaXRlcmFsSW1wbCNnZXRMaXRlcmFsVmFsdWUgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFN0cmluZ0xpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUU3RyaW5nTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzY2FwZWRWYWx1ZSgpIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXNjYXBlZFZhbHVlKCkgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlc2NhcGVkVmFsdWUgPSBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpdGVyYWxWYWx1ZSgpIDxlbT5MaXRlcmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaXRlcmFsVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJVEVSQUxfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGl0ZXJhbFZhbHVlKCkgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpdGVyYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsaXRlcmFsVmFsdWUgPSBMSVRFUkFMX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUU3RyaW5nTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRTdHJpbmdMaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFc2NhcGVkVmFsdWUoKSB7Ci0JCXJldHVybiBlc2NhcGVkVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXNjYXBlZFZhbHVlKFN0cmluZyBuZXdFc2NhcGVkVmFsdWUpIHsKLQkJc3RyaW5nTGl0ZXJhbFNldCA9IGZhbHNlOwotCQlzZXRMaXRlcmFsVmFsdWVHZW4oTElURVJBTF9WQUxVRV9FREVGQVVMVCk7Ci0JCXNldEVzY2FwZWRWYWx1ZUdlbihuZXdFc2NhcGVkVmFsdWUpOwkJCi0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzY2FwZWRWYWx1ZUdlbihTdHJpbmcgbmV3RXNjYXBlZFZhbHVlKSB7Ci0JCVN0cmluZyBvbGRFc2NhcGVkVmFsdWUgPSBlc2NhcGVkVmFsdWU7Ci0JCWVzY2FwZWRWYWx1ZSA9IG5ld0VzY2FwZWRWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUsIG9sZEVzY2FwZWRWYWx1ZSwgZXNjYXBlZFZhbHVlKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN0cmluZ0xpdGVyYWxTZXQ7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsVmFsdWUoKSB7Ci0JCWlmICghc3RyaW5nTGl0ZXJhbFNldCAmJiBlc2NhcGVkVmFsdWUgIT0gRVNDQVBFRF9WQUxVRV9FREVGQVVMVCkgewotCQkJU3RyaW5nIHMgPSBnZXRFc2NhcGVkVmFsdWUoKTsKLQkJCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA8IDIgfHwgcy5jaGFyQXQoMCkgIT0gJ1wiJyB8fCBzLmNoYXJBdChsZW4tMSkgIT0gJ1wiJyApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0JCQlpbnQgc3RvcCA9IGxlbi0xOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzdG9wOyBpKyspIHsKLQkJCQljaGFyIGF0aSA9IHMuY2hhckF0KGkpOwotCQkJCWlmIChhdGkgPT0gJ1xcJykgewotCQkJCQlpZiAoKytpIDwgc3RvcCkgewotCQkJCQkJYXRpID0gcy5jaGFyQXQoaSk7Ci0JCQkJCQlpZiAoYXRpID09ICd1JykgewotCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7Ci0JCQkJCQkJaWYgKGkrNCA+PSBzdG9wCi0JCQkJCQkJCQl8fCAoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KCsraSkpKSA+IDE1Ci0JCQkJCQkJCQl8fCBjMSA8IDAKLQkJCQkJCQkJCXx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoKytpKSkpID4gMTUKLQkJCQkJCQkJCXx8IGMyIDwgMAotCQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdCgrK2kpKSkgPiAxNQotCQkJCQkJCQkJfHwgYzMgPCAwCi0JCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KCsraSkpKSA+IDE1Ci0JCQkJCQkJCQl8fCBjNCA8IDApewotCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIHN0cmluZyBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQlidWZmZXIuYXBwZW5kKChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KSk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlidWZmZXIuYXBwZW5kKFBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwuZ2V0Q2hhckVzY2FwZWQoYXRpKSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBzdHJpbmcgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UKLQkJCQkJYnVmZmVyLmFwcGVuZChhdGkpOwkKLQkJCX0KLQkJCQotCQkJc3RyaW5nTGl0ZXJhbFNldCA9IHRydWU7Ci0JCQlzZXRMaXRlcmFsVmFsdWVHZW4oYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0TGl0ZXJhbFZhbHVlR2VuKCk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbFZhbHVlR2VuKCkgewotCQlyZXR1cm4gbGl0ZXJhbFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpdGVyYWxWYWx1ZShTdHJpbmcgbmV3TGl0ZXJhbFZhbHVlKSB7Ci0JCXN0cmluZ0xpdGVyYWxTZXQgPSB0cnVlOwotCQlzZXRMaXRlcmFsVmFsdWVHZW4obmV3TGl0ZXJhbFZhbHVlKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcihuZXdMaXRlcmFsVmFsdWUubGVuZ3RoKCkrMik7Ci0JCWIuYXBwZW5kKCdcIicpOyAvLyBvcGVuaW5nIGRlbGltaXRlcgotCQlpbnQgc3RvcCA9IG5ld0xpdGVyYWxWYWx1ZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9wOyBpKyspIHsKLQkJCVBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwuYXBwZW5kQ2hhcmFjdGVyKG5ld0xpdGVyYWxWYWx1ZS5jaGFyQXQoaSksIGIpOwkKLQkJfQotCQliLmFwcGVuZCgnXCInKTsgLy8gY2xvc2luZyBkZWxpbWl0ZXIKLQkJc2V0RXNjYXBlZFZhbHVlR2VuKGIudG9TdHJpbmcoKSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpdGVyYWxWYWx1ZUdlbihTdHJpbmcgbmV3TGl0ZXJhbFZhbHVlKSB7Ci0JCVN0cmluZyBvbGRMaXRlcmFsVmFsdWUgPSBsaXRlcmFsVmFsdWU7Ci0JCWxpdGVyYWxWYWx1ZSA9IG5ld0xpdGVyYWxWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUUsIG9sZExpdGVyYWxWYWx1ZSwgbGl0ZXJhbFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RXNjYXBlZFZhbHVlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFOgotCQkJCXJldHVybiBnZXRMaXRlcmFsVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXNldEVzY2FwZWRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFOgotCQkJCXNldExpdGVyYWxWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlzZXRFc2NhcGVkVmFsdWUoRVNDQVBFRF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRToKLQkJCQlzZXRMaXRlcmFsVmFsdWUoTElURVJBTF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXJldHVybiBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBlc2NhcGVkVmFsdWUgIT0gbnVsbCA6ICFFU0NBUEVEX1ZBTFVFX0VERUZBVUxULmVxdWFscyhlc2NhcGVkVmFsdWUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRToKLQkJCQlyZXR1cm4gTElURVJBTF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gbGl0ZXJhbFZhbHVlICE9IG51bGwgOiAhTElURVJBTF9WQUxVRV9FREVGQVVMVC5lcXVhbHMobGl0ZXJhbFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL1N0cmluZ0xpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUVGhpc0xpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUVGhpc0xpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmU3MWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFRoaXNMaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRUaGlzTGl0ZXJhbEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRoaXMgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUVGhpc0xpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUVGhpc0xpdGVyYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVFRoaXNMaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVFRoaXNMaXRlcmFsKCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLQotfSAvL1RoaXNMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFR5cGVMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFR5cGVMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2MxYzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUeXBlTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVFR5cGVMaXRlcmFsSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGUgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFR5cGVMaXRlcmFsSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRUeXBlTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRUeXBlTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRUeXBlTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRUeXBlTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9UWVBFX0xJVEVSQUxfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTF9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVFlQRV9MSVRFUkFMX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVFlQRV9MSVRFUkFMX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTF9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL1R5cGVMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDgzOGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQYXJzZVRyZWVBbGxvY2F0aW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzEwLzAzIDE5OjIwOjQxICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbCNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwgZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbkltcGwgaW1wbGVtZW50cyBQYXJzZVRyZWVBbGxvY2F0aW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHByZXNzaW9uKCkgPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JCWV4cHJlc3Npb24gPSBuZXdFeHByZXNzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04sIG9sZEV4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24pIHsKLQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gZXhwcmVzc2lvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHByZXNzaW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFeHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4cHJlc3Npb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXhwcmVzc2lvbihuZXdFeHByZXNzaW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTiwgbmV3RXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRFeHByZXNzaW9uKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGdldEV4cHJlc3Npb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZXhwcmVzc2lvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpICE9IG51bGwgPyBnZXRFeHByZXNzaW9uKCkudG9TdHJpbmcoKSA6IHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfSAvL1BhcnNlVHJlZUFsbG9jYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYjQ0YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lcl9JbnZhbGlkRXhwcmVzc2lvbj0gaW52YWxpZDogInswfSIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNGZmOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iaW5zdGFudGlhdGlvbiIKLSAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkphdmEgSW5zdGFudGlhdGlvbiBQYWNrYWdlIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhRGF0YVR5cGVJbnN0YW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhSW5zdGFuY2UiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YUluc3RhbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhT2JqZWN0SW5zdGFuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFJbnN0YW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpbnRlcmZhY2UgaXMgdGhlIGluc3RhbmNlIG9mIGFuIGphdmEgb2JqZWN0IGluIHRoZSBqYXZhIG1vZGVsLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhQWxsb2NhdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgdGhlIGFsbG9jYXRpb24gY2xhc3MuIEl0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgJnF1b3Q7YWxsb2NhdGlvbiZxdW90OyBwcm9wZXJ0eSBvbiBhIEphdmEgT2JqZWN0IHNvIHRoYXQgdGhlIGFjdHVhbCBhbGxvY2F0aW9uIGNhbiBiZSBjb250cm9sbGVkLiBGb3IgZXhhbXBsZSwgdGhlcmUgY291bGQgYmUgb25lIGZvciBqdXN0IGluaXQgc3RyaW5nLCBvciBvbmUgZm9yIHNlcmlhbGl6ZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluaXRTdHJpbmdBbGxvY2F0aW9uIiBlU3VwZXJUeXBlcz0iIy8vSmF2YUFsbG9jYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdXNlZCB3aGVuIHRoZSBhbGxvY2F0aW9uIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJ5IHRoZSByZW1vdGUgdm0uIEl0IHVzZXMgdGhlIGFsbG9jU3RyaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0U3RyaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nIGZvciB0aGlzIG9iamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1wbGljaXRBbGxvY2F0aW9uIiBlU3VwZXJUeXBlcz0iIy8vSmF2YUFsbG9jYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgaXMgZm9yIGFuIGltcGxpY2l0IGFsbG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBjb21lcyBmcm9tIHRoZSBmZWF0dXJlIG9mIGFub3RoZXIgb2JqZWN0LiBJdCBpcyB0aGUgbGl2ZSBKYXZhIHZhbHVlIGZyb20gdGhlIHJlbW90ZSB2bS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmVhdHVyZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RydWN0dXJhbEZlYXR1cmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFyc2VUcmVlQWxsb2NhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0phdmFBbGxvY2F0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbGxvY2F0aW9ucyB2aWEgUGFyc2UgVHJlZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cHJlc3Npb24iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBURXhwcmVzc2lvbiIgYWJzdHJhY3Q9InRydWUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEFycmF5QWNjZXNzIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnJheSBhY2Nlc3MuIGUuZy4geFszXS4gJiN4RDsmI3hBOyYjeEQ7JiN4QTtVbmxpa2UgQVNULCB0aGUgZW50aXJlIGV4cHJlc3Npb24gb2YgdHlwZSB4WzNdWzRdIHdpbGwgYmUgZG9uZSBpbiBvbmUgZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBoYXZpbmcgYSBzZXBhcmF0ZSBBcnJheUFjY2VzcyBmb3IgZWFjaCBkaW1lbnNpb24uIFRoaXMgaXMganVzdCBhIHNpbXBsaWZpY2F0aW9uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgaWYgaXQgaXMgYSBzaW1wbGUgYXJyYXkgYWNjZXNzIHdoZXJlIGl0IGlzIG9mIHRoZSBmb3JtIHtleHByZXNzaW9ufVtleHByZXNzaW9uXVtleHByZXNzaW9uXS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXJyYXkiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBhcnJheSB0byBhY2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluZGV4ZXMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9ucyByZXByZXNlbnRpbmcgdGhlIGluZGV4ZXMgb2YgdGhlIGFjY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRBcnJheUNyZWF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnJheSBDcmVhdGlvbiBleHByZXNzaW9uLCBlLmcuIG5ldyBpbnRbM10gb3IgbmV3IGphdmEubGFuZ1N0cmluZ1tdW10ge3smcXVvdDthJnF1b3Q7fSwgeyZxdW90O2ImcXVvdDt9fSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlLCBlLmcuIGludFtdW10gb3IgamF2YS5sYW5nLlN0cmluZ1tdLCBpbmNsdWRpbmcgdGhlIG51bWJlciBvZiBkaW1lbnNpb24gYnJhY2tldHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpbWVuc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGZvciB0aGUgZGltZW5zaW9ucy4gWW91IGNhbiBoYXZlIFszXVs0XVtdIGJ1dCBbXVszM10gaXMgaW52YWxpZC4gU28gZm9yIGVhY2ggZGltZW5zaW9uIHRoYXQgaGFzIGFuIGV4cHJlc3Npb24sIHRoZXJlIHdpbGwgYmUgYW4gZW50cnkgaW4gdGhlIGxpc3QsIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBXaGVuIHlvdSByZWFjaCB0aGUgZW1wdHkgZGltZW5zaW9ucywgdGhlIGxpc3Qgd2lsbCBlbmQgdG9vLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdGlhbGl6ZXIiIGVUeXBlPSIjLy9QVEFycmF5SW5pdGlhbGl6ZXIiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgaW5pdGlhbGl6ZXIsIGlmIGFueSwgZm9yIHRoaXMgYXJyYXkuIEUuZy4gbmV3IGludFtdIHsyLDN9LiBJdCBpcyB0aGUgezIsM30uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQXJyYXlJbml0aWFsaXplciIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJyYXkgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbi4gVGhpcyBpcyB0aGUgZW50aXJlIGV4cHJlc3Npb24sIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSB7MiwzfSB3aWxsIGJlIGFuIEFycmF5SW5pdGlhbGl6ZXIgY29udGFpbmVkIHdpdGhpbiB0aGUgZXhwcmVzc2lvbnMgbGlzdCBmb3IgdGhlIHRvcCBBcnJheUluaXRpYWxpemVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHByZXNzaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpc3RoZSBsaXN0IG9mIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgaW5pdGlhbGl6ZXIsIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgZmlyc3QgY2FzZSBpdCB3aWxsIGJlIHR3byBOdW1iZXJMaXRlcmFscy4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgezIsM30gd2lsbCBiZSBhbiBBcnJheUluaXRpYWxpemVyLCBmb2xsb3dlZCBieSBhIE51bWJlckxpdGVyYWwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQm9vbGVhbkxpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBib29sZWFuIGxpdGVyYWwsIGkuZS4gdHJ1ZSBvciBmYWxzZSBkaXJlY3RseSBpbiB0aGUgY29kZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9vbGVhblZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgbGl0ZXJhbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRDYXN0RXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2FzdCBleHByZXNzaW9uLCBlLmcuIChzaG9ydCkgMTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG9mIHRoZSBjYXN0LCBlLmcuIGludCBvciBqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cHJlc3Npb24iIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4cHJlc3Npb24gYmVpbmcgY2FzdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVENoYXJhY3RlckxpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBjaGFyYWN0ZXIgZXhwcmVzc2lvbiwgZS5nLiAnYScgb3IgJ1xyJy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXNjYXBlZFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuIEluIG90aGVyIHdvcmRzIHRoZSBsaXRlcmFsIGV4YWN0bHkgYXMgaXQgaXMgaW4gdGhlIGphdmEgZmlsZS4gRS5nLiAnYScgb3IgJ1xyJy4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBzaW5nbGUgcXVvdGVzIHRoZW1zZWx2ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYXJWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUNoYXIiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgcHJpbWl0aXZlIGNoYXJhY3RlciB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24uIEUuZy4gbmV3IFN0cmluZygmcXVvdDthJnF1b3Q7KSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgY2xhc3MuIEUuZy4gamF2YS5sYW5nLlN0cmluZy4gVGhpcyBzaG91bGQgYmUgZnVsbHktcXVhbGlmaWVkIGZvciBhbGxvY2F0aW9uIHB1cnBvc2VzLiBJdCBzaG91bGQgYWxzbyBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBpZiBYIGlzIGFuIGlubmVyIGNsYXNzIG9mIGouWSwgdGhlbiB0aGUgdHlwZSBoZXJlIHNob3VsZCBiZSAmcXVvdDtqLlkkWCZxdW90Oy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFyZ3VtZW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGVzdCBFeHByZXNzb24sIGUuZy4gKHg9MykgPyAxIDogMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25kaXRpb24iIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbmRpdGlvbiBleHByZXNzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0cnVlIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0cnVlIGV4cHJlc3Npb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmFsc2UiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZhbHNlIGV4cHJlc3Npb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBURmllbGRBY2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFjY2VzcyBhIGZpZWxkIGV4cHJlc3Npb24sIGUuZy4gamF2YS5hd3QuQ29sb3IucmVkIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlY2VpdmVyIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0IHRoYXQgdGhlIGZpZWxkIGlzIGluLCBlLmcuIGphdmEuYXd0LkNvbG9yLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBhY2Nlc3NlZCwgZS5nLiByZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUSW5maXhFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHByZXNzaW9uIHdpdGggYW4gb3BlcmF0b3IgdGhhdCBoYXMgdHdvIG9wZXJhbmRzLCBlLmcuIDMgKyA0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsZWZ0T3BlcmFuZCIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3BlcmF0b3IiIGVUeXBlPSIjLy9QVEluZml4T3BlcmF0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3BlcmF0b3IsIGUuZy4gKyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyaWdodE9wZXJhbmQiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJpZ2h0IGV4cHJlc3Npb24uIGkuZS4gNCBvZiAmcXVvdDszICsgNCZxdW90OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZE9wZXJhbmRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVc2VkIHdoZW4gdGhlcmUgYXJlIGEgc2VyaWVzIG9mIGluZml4IG9wZXJhdGlvbnMgb2YgdGhlIHNhbWUgb3BlcmF0b3IsIGUuZy4gMSArIDIgKyAzICsgNC4gMSBhbmQgMiB3aWxsIGdvIGludG8gbGVmdCBhbmQgcmlnaHQsIHdoaWxlIHszLCA0fSB3aWxsIGdvIGludG8gdGhlIGV4dGVuZGVkIG9wZXJhbmRzLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJQVEluZml4T3BlcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVudW1lcmF0b3IgZm9yIHRoZSBvcGVyYXRvciBvbiBhbiBJbmZpeEV4cHJlc3Npb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJUSU1FUyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Iiogb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRElWSURFIiB2YWx1ZT0iMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ii8gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUkVNQUlOREVSIiB2YWx1ZT0iMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiUgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUExVUyIgdmFsdWU9IjMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIrIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik1JTlVTIiB2YWx1ZT0iNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ii0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTEVGVF9TSElGVCIgdmFsdWU9IjUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImbHQ7Jmx0OyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSSUdIVF9TSElGVF9TSUdORUQiIHZhbHVlPSI2Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPj4gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUklHSFRfU0hJRlRfVU5TSUdORUQiIHZhbHVlPSI3Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPj4+IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxFU1MiIHZhbHVlPSI4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmx0OyAgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iR1JFQVRFUiIgdmFsdWU9IjkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSI+IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxFU1NfRVFVQUxTIiB2YWx1ZT0iMTAiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImbHQ7PSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJHUkVBVEVSX0VRVUFMUyIgdmFsdWU9IjExIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPj0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRVFVQUxTIiB2YWx1ZT0iMTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSI9PSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOT1RfRVFVQUxTIiB2YWx1ZT0iMTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIhPSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJYT1IiIHZhbHVlPSIxNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Il4gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQU5EIiB2YWx1ZT0iMTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImYW1wOyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJPUiIgdmFsdWU9IjE2Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0ifCAgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09ORElUSU9OQUxfQU5EIiB2YWx1ZT0iMTciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImYW1wOyZhbXA7IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNPTkRJVElPTkFMX09SIiB2YWx1ZT0iMTgiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJ8fCBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUSW5zdGFuY2VvZiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSW5zdGFuY2VvZiBleHByZXNzaW9uLCBlLmcuIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wZXJhbmQiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIHRvIHRlc3QsIGUuZy4geCBpbiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHRlc3QsIGUuZy4gamF2YS5sYW5nLlN0cmluZy4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUTWV0aG9kSW52b2NhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kSW52b2NhdGlvbiBleHByZXNzaW9uLCBlLmcuIHguZ2V0WSgzKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWNlaXZlciIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaG8gdGhlIG1ldGhvZCBpcyBpbnZva2VkIGFnYWluc3QuIFRoaXMgbWF5IGJlIG5vdCBzZXQsIHdoaWNoIG1lYW5zICZxdW90O3RoaXMmcXVvdDsuIEl0IG1heSBhbHNvIGJlIGEgTmFtZSwgd2hpY2ggd291bGQgbWVhbiBhIGNsYXNzIGxpa2UgJnF1b3Q7amF2YS5sYW5nLlN0cmluZyZxdW90OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBpbnZva2VkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhcmd1bWVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaXN0IG9mIGFyZ3VtZW50cywgaWYgYW55LCB0byB0aGUgbWV0aG9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVE5hbWUiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcmVwcmVzZW50cyBhIG5hbWUuIFRoaXMgY2FuIGhhcHBlbiBmb3IgdGhlIHJlY2VpdmVyIG9mIGEgbWV0aG9kIGludm9jYXRpb24sIGUuZy4geC5nZXRZKCkgb3IgamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKDEwKS4gSW4gdGhlc2UgY2FzZXMgeW91IHdvdWxkIGhhdmUgYSBuYW1lIG9mICZxdW90O3gmcXVvdDsgb3IgJnF1b3Q7amF2YS5sYW5nLlN0cmluZyZxdW90Oy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lLCB3aGljaCBjYW4gYmUgYSB0eXBlIG9yIGEgdmFyaWFibGUuIElmIGl0IGlzIGEgdHlwZSwgdGhlbiAgaXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUTnVsbExpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gJnF1b3Q7bnVsbCZxdW90OyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVE51bWJlckxpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudCBhIG51bWJlciBwcmltaXRpdmUgbGl0ZXJhbCwgZS5nLiAxMC4gT25lIG9wdGltaXphdGlvbiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkIGlzIHRoYXQgaWYgYW4gZXhwcmVzc2lvbiBpcyBvZiB0aGUgZm9ybSArbnVtYmVyIG9yIC1udW1iZXIsIGl0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBQcmVmaXhFeHByZXNzaW9uIHdpdGggYSBOdW1iZXJMaXRlcmFsIHRvIGp1c3QgYSBOdW1iZXJMaXRlcmFsLiBUaGlzIHdpbGwgc2ltcGxpZnkgdGhlIG1vZGVsLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b2tlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b2tlbiB2YWx1ZSwgZS5nLiAxMCwgMTBkLCBvciAtMTAuNzUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXhwcmVzc2lvbiB3aXRoaW4gcGFyZW50aGVzaXMsIGUuZy4gKHgrMykiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhwcmVzc2lvbiIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbiB3cmFwcGVkIGJ5IHRoZSBwYXJlbnRoZXNpcywgZS5nLiAoeCszKSB0aGVuIHRoZSBleHByZXNzaW9uIGlzICZxdW90O3grMyZxdW90OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVFByZWZpeEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgb25lIG9wZXJhbmQgb3BlcmF0b3IsIHdoZXJlIHRoZSBvcGVyYXRvciBjb21lcyBiZWZvcmUgdGhlIG9wZXJhbmQsIGUuZy4gLSAoeCszKS4gSW4gQVNULCBldmVuIC0zIGlzIG1vZGVsZWQgYXMgYSBQcmVmaXhFeHByZXNzaW9uIG9mIG9wZXJhdG9yICZxdW90Oy0mcXVvdDsgYW5kIGV4cHJlc3Npb24gb2YgTnVtYmVyTGl0ZXJhbCgzKS4gQnV0IHdlIG9wdGltaXplIHRoaXMgYXdheSBhbmQganVzdCB1c2UgYSBOdW1iZXJMaXRlcmFsKC0zKSBkaXJlY3RseSBpbnN0ZWFkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcGVyYXRvciIgZVR5cGU9IiMvL1BUUHJlZml4T3BlcmF0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3BlcmF0b3Igb2YgdGhpcyBleHByZXNzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHByZXNzaW9uIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9uIHRoYXQgdGhlIG9wZXJhdG9yIGlzIGFwcGxpZWQgdG8uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUFRQcmVmaXhPcGVyYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByZWZpeCBleHByZXNzaW9uIG9wZXJhdG9yLiBXZSBhcmUgbm90IG1vZGVsaW5nICsrIGFuZCAtLS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBMVVMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIrIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik1JTlVTIiB2YWx1ZT0iMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ii0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09NUExFTUVOVCIgdmFsdWU9IjIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJ+IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PVCIgdmFsdWU9IjMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIhIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRTdHJpbmdMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnRhdGlvbiBvZiBhIHN0cmluZyBsaXRlcmFsLCBlLmcuICZxdW90O2FzZGYmcXVvdDsuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzY2FwZWRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGVzY2FwZWQgc3RyaW5nLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gJnF1b3Q7YWImcXVvdDsgb3IgJnF1b3Q7Y1xyJnF1b3Q7LiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHF1b3RlcyB0aGVtc2VsdmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaXRlcmFsVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgc3RyaW5nIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVFRoaXNMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnRzICZxdW90O3RoaXMmcXVvdDssIGUuZy4gdGhpcy5nZXRYKCkgd2lsbCBiZSBhIE1ldGhvZEludm9jYXRpb24gd2l0aCB0aGUgcmVjZWl2ZXIgYmVpbmcgYSBUaGlzTGl0ZXJhbC4gV2UgY2FuJ3QgaGFuZGxlIHRoZSBmb3JtYXQgWFlaLnRoaXMgYmVjYXVzZSB0aGF0IGlzIGZvciBpbm5lciBjbGFzc2VzIGFuZCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQgcmlnaHQgbm93LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVFR5cGVMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHJlcHJlc2VudHMgYSBsaXRlcmFsIG9mIHRoZSBmb3JtIGouWFlaLmNsYXNzLiBGb3IgaW5zdGFuY2UgaW4gYSBtZXRob2QgaW52b2NhdGlvbiB4LmdldFgoalhZWi5jbGFzcykgdGhlIGFyZ3VtZW50IHdpbGwgYmUgYSBUeXBlTGl0ZXJhbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRoZSBsaXRlcmFsLiAgSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUSW52YWxpZEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgc29tZSBleHByZXNzaW9uIHdlIGp1c3QgY2FuJ3QgZXZhbHVhdGUgZm9yIG91ciBwdXJwb3Nlcy4gSXQgYWxsb3dzIHVzIHRvIHRlbGwgdGhlIGV2YWx1YXRpb24gd2hhdCBpcyBhY3R1YWxseSB3cm9uZy4gSXQgc2hvdWxkIGJlIHBsYWNlZCBhcyB0aGUgcm9vdCBleHByZXNzaW9uIHRvIHByZXZlbnQgcHJvY2Vzc2luZyBtdWNoIG9mIHRoZSB0cmVlIGFuZCB0aGVuIGZpbmFsbHkgZmFpbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVzc2FnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgbWVzc2FnZSBhcyB0byB3aHkgaXQgaXMgaW52YWxpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRJbnN0YW5jZVJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0lKYXZhSW5zdGFuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24uIEN1cnJlbnRseSB3ZSBvbmx5IHN0b3JlIHRoZSAmI3hEOyYjeEE7ZW50aXJlIGRlY2xhcmF0aW9uIGFzIGEgc3RyaW5nLCBpbmNsdWRpbmcgdGhlICZxdW90O25ldyBBQ2xhc3MoKSB7Li4ufSZxdW90Oy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVjbGFyYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVjbGFyYXRpb24gdGV4dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wb3J0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGltcG9ydHMgbmVlZGVkIGluIHRoZSBtYWluIGNsYXNzIGJ5IHRoaXMgZGVjbGFyYXRpb24uIFRoaXMgaXMgYSB0cmFuc2llbnQgYXR0cmlidXRlLiBJdCBpcyBub3Qgc2VyaWFsaXplZCwgbm9yIGlzIGl0IHBhcnNlZCBpbnRvIGZyb20gZXhpc3RpbmcgY29kZS4gSXRzIG9ubHkgcHVycG9zZSBpcyB0byBoZWxwIGNvZGUgZ2VuZXJhdGlvbiBvbiBhIGJyYW5kIG5ldyBkZWNsYXJhdGlvbiB0byBrbm93IHdoYXQgaW1wb3J0cyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIG1haW4gY2xhc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzc2NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0IgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9IiIgbW9kZWxOYW1lPSJpbnN0YW5jZSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5wcm92aWRlci5pbnN0YW5jZUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLnByZXNlbnRhdGlvbi5pbnN0YW5jZUVkaXRvclBsdWdpbiIKLSAgICB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIiBib29sZWFuRmxhZ3NGaWVsZD0iZUZsYWdzIiBib29sZWFuRmxhZ3NSZXNlcnZlZEJpdHM9IjgiCi0gICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLnJvc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcaW5zdGFuY2UubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+V29ya3NwYWNlUm9vdDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ikluc3RhbnRpYXRpb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIKLSAgICAgIGVjb3JlUGFja2FnZT0iaW5zdGFuY2UuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9USU1FUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9ESVZJREUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvUkVNQUlOREVSIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL1BMVVMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvTUlOVVMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvTEVGVF9TSElGVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9SSUdIVF9TSElGVF9TSUdORUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvUklHSFRfU0hJRlRfVU5TSUdORUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvTEVTUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9HUkVBVEVSIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0xFU1NfRVFVQUxTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0dSRUFURVJfRVFVQUxTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0VRVUFMUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9OT1RfRVFVQUxTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL1hPUiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9BTkQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvT1IiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvQ09ORElUSU9OQUxfQU5EIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0NPTkRJVElPTkFMX09SIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4T3BlcmF0b3IiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4T3BlcmF0b3IvUExVUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4T3BlcmF0b3IvTUlOVVMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeE9wZXJhdG9yL0NPTVBMRU1FTlQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeE9wZXJhdG9yL05PVCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9JSmF2YURhdGFUeXBlSW5zdGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL0lKYXZhSW5zdGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL0lKYXZhT2JqZWN0SW5zdGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL0phdmFBbGxvY2F0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9Jbml0U3RyaW5nQWxsb2NhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9Jbml0U3RyaW5nQWxsb2NhdGlvbi9pbml0U3RyaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vSW1wbGljaXRBbGxvY2F0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL0ltcGxpY2l0QWxsb2NhdGlvbi9wYXJlbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL0ltcGxpY2l0QWxsb2NhdGlvbi9mZWF0dXJlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUGFyc2VUcmVlQWxsb2NhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUGFyc2VUcmVlQWxsb2NhdGlvbi9leHByZXNzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRFeHByZXNzaW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5QWNjZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5QWNjZXNzL2FycmF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUFjY2Vzcy9pbmRleGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUNyZWF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlDcmVhdGlvbi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUNyZWF0aW9uL2RpbWVuc2lvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5Q3JlYXRpb24vaW5pdGlhbGl6ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5SW5pdGlhbGl6ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlJbml0aWFsaXplci9leHByZXNzaW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQm9vbGVhbkxpdGVyYWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRCb29sZWFuTGl0ZXJhbC9ib29sZWFuVmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVENhc3RFeHByZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQ2FzdEV4cHJlc3Npb24vdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQ2FzdEV4cHJlc3Npb24vZXhwcmVzc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQ2hhcmFjdGVyTGl0ZXJhbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVENoYXJhY3RlckxpdGVyYWwvZXNjYXBlZFZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVENoYXJhY3RlckxpdGVyYWwvY2hhclZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24vdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uL2FyZ3VtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbi9jb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbi90cnVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRDb25kaXRpb25hbEV4cHJlc3Npb24vZmFsc2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEZpZWxkQWNjZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEZpZWxkQWNjZXNzL3JlY2VpdmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEZpZWxkQWNjZXNzL2ZpZWxkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeEV4cHJlc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhFeHByZXNzaW9uL2xlZnRPcGVyYW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4RXhwcmVzc2lvbi9vcGVyYXRvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhFeHByZXNzaW9uL3JpZ2h0T3BlcmFuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhFeHByZXNzaW9uL2V4dGVuZGVkT3BlcmFuZHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEluc3RhbmNlb2YiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5zdGFuY2VvZi9vcGVyYW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEluc3RhbmNlb2YvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUTWV0aG9kSW52b2NhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRNZXRob2RJbnZvY2F0aW9uL3JlY2VpdmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVE1ldGhvZEludm9jYXRpb24vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUTWV0aG9kSW52b2NhdGlvbi9hcmd1bWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVE5hbWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFROYW1lL25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVE51bGxMaXRlcmFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVE51bWJlckxpdGVyYWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFROdW1iZXJMaXRlcmFsL3Rva2VuIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi9leHByZXNzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRQcmVmaXhFeHByZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4RXhwcmVzc2lvbi9vcGVyYXRvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4RXhwcmVzc2lvbi9leHByZXNzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRTdHJpbmdMaXRlcmFsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUU3RyaW5nTGl0ZXJhbC9lc2NhcGVkVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUU3RyaW5nTGl0ZXJhbC9saXRlcmFsVmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVFRoaXNMaXRlcmFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVFR5cGVMaXRlcmFsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUVHlwZUxpdGVyYWwvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUSW52YWxpZEV4cHJlc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRJbnZhbGlkRXhwcmVzc2lvbi9tZXNzYWdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRJbnN0YW5jZVJlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEluc3RhbmNlUmVmZXJlbmNlL3JlZmVyZW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24vZGVjbGFyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi9pbXBvcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjhhYTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iamF2YSIKLSAgICBuc1VSST0iamF2YS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qZW0uamF2YSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDaGFuZ2VzIHRvIHN5bmNoIHVwIHdpdGggSmF2YTNlOiYjeEQ7JiN4QTstIGRlbGV0ZWQgSmF2YUVsZW1lbnQsIEJvZHlFbGVtZW50IHdoaWNoIGRpZG4ndCBhZGQgYW55dGhpbmcgdXNlZnVsJiN4RDsmI3hBOy0gZGVsZXRlZCBOZXN0ZWRDbGFzcyBhbmQgdGhlIGFzc29jaWF0aW9uIHdoaWNoIGRlc2NyaWJlZCBuZXN0aW5nLCBjb250ZW50cyBjYW4gYmUgdXNlZCBpbnN0ZWFkJiN4RDsmI3hBOy0gZGVsZXRlZCBleHRlbmRzL2V4dGVuZGVkQnkgd2hpY2ggaXMgcmVwbGFjZWQgd2l0aCBNT0Ygc3VidHlwZS9zdXBlcnR5cGUmI3hEOyYjeEE7LSBkZWxldGVkIHRoZSBjbHVtc3kgbWFpbiBkaWFncmFtJiN4RDsmI3hBOy0gbW92ZWQgdGhlIE1PRiBpbmhlcml0YW5jZSBkZXRhaWxzIHRvIHRoZSBNT0YgYmluZGluZyBkaWFncmFtJiN4RDsmI3hBOy0gZGVsZXRlZCAmcXVvdDtmaW5hbCZxdW90OyBvbiBKYXZhUGFyYW1ldGVyLCBkb24ndCBrbm93IHdoYXQgdGhhdCB3YXMgc3VwcG9zZWQgdG8gYmUmI3hEOyYjeEE7LSBkZWxldGVkIHRoZSBDYXRlZ29yeSBqdW5rJiN4RDsmI3hBOy0gY2hhbmdlZCB0aGUgQmxvY2stdHlwZWQgYXR0cmlidXRlcyBvbiBGaWVsZCwgTWV0aG9kLCBJbml0aWFsaXplciB0byBiZSBhc3NvY2lhdGlvbnMgdG8gQmxvY2smI3hEOyYjeEE7JiN4RDsmI3hBO091dHN0YW5kaW5nIHF1ZXN0aW9ucy9pc3N1ZXM6JiN4RDsmI3hBOy0gSmF2YVBhcmFtZXRlcktpbmQgc2hvdWxkIGdvIGF3YXkgaWYgd2UgZ2V0IHRoZSBiYXNlIFBhcmFtZXRlciBraW5kIGZpeGVkIHVwJiN4RDsmI3hBOyIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhQ2xhc3MiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQ2xhc3MiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc05lc3RlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmllbGQiIGVUeXBlPSIjLy9GaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImZpZWxkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZpZWxkRXh0ZW5kZWQiIGVUeXBlPSIjLy9GaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4mI3hEOyYjeEE7JiN4RDsmI3hBO1JldHVybiBudWxsIGlmIGEgRmllbGQgbmFtZWQgZmllbGROYW1lIGlzIG5vdCBmb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImZpZWxkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZpZWxkTmFtZWQiIGVUeXBlPSIjLy9GaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImZpZWxkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZpZWxkc0V4dGVuZGVkIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGFsbCBmaWVsZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2QiIGVUeXBlPSIjLy9NZXRob2QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXRob2ROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFyYW1ldGVyVHlwZXMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9lUGFyYW1ldGVycz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIExpc3Qgb2YgU3RyaW5ncyB0aGF0IHJlcHJlc2VudCBNZXRob2RFbGVtZW50IHNpZ25hdHVyZXMgZnJvbSBtb3N0IGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1ldGhvZEV4dGVuZGVkIiBlVHlwZT0iIy8vTWV0aG9kIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXRob2ROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFyYW1ldGVyVHlwZXMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9lUGFyYW1ldGVycz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2RzRXh0ZW5kZWQiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYWxsIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRPbmx5U3BlY2lmaWNNZXRob2RzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RzIHRoYXQgYmVnaW5zIHdpdGggQGFNZXRob2ROYW1lUHJlZml4IGFuZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEBleGNsdWRlZE5hbWVzIGxpc3QuIElmIEBhTWV0aG9kTmFtZVByZWZpeCBpcyBudWxsLCBhbGwgbWV0aG9kcyB3aWxsIGJlIHJldHVybmVkLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImFNZXRob2ROYW1lUHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZXhjbHVkZWROYW1lcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFB1YmxpY01ldGhvZCIgZVR5cGU9IiMvL01ldGhvZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyBtYXRjaGluZyBhbGwgdGhlIHR5cGVzIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMuICBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWV0aG9kTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcmFtZXRlclR5cGVzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZVBhcmFtZXRlcnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UHVibGljTWV0aG9kcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbGwgbWV0aG9kcywgaXQgd2lsbCBub3QgZ28gdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYWxsIHB1YmxpYyBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UHVibGljTWV0aG9kc05hbWVkIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0byB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U3VwZXJ0eXBlIiBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImltcGxlbWVudHNJbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVzdCB3aGV0aGVyIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIHRoZSBwYXNzZWQgaW50ZXJmYWNlIChvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaW50ZXJmYWNlVHlwZSIgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImluZm9TdHJpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBzdHJpbmcgc2hvd2luZyBvdXIgZGV0YWlscy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImluaGVyaXRzRnJvbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXN0cyB3aGV0aGVyIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSB0aGUgcGFzc2VkIGluIGNsYXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iamF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNFeGlzdGluZ1R5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9lcyB0aGlzIHR5cGUgZXhpc3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0ludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGFuIGludGVyZmFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFN1cGVydHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgc3VwZXJ0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iamF2YWNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2luZCIgZVR5cGU9IiMvL1R5cGVLaW5kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1YmxpYyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGxlbWVudHNJbnRlcmZhY2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbGFzc0ltcG9ydCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFja2FnZUltcG9ydHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YVBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmllbGRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpZWxkIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9GaWVsZC9qYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01ldGhvZC9qYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdGlhbGl6ZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0luaXRpYWxpemVyIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Jbml0aWFsaXplci9qYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVjbGFyZWRDbGFzc2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFDbGFzcyIgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvZGVjbGFyaW5nQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVjbGFyaW5nQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL2RlY2xhcmVkQ2xhc3NlcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhUGFja2FnZSIgZVR5cGU9IiMvL0phdmFQYWNrYWdlIgotICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9KYXZhUGFja2FnZS9qYXZhQ2xhc3NlcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJldmVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUV2ZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbGxFdmVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUV2ZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluaXRpYWxpemVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTdGF0aWMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0phdmFDbGFzcy9pbml0aWFsaXplcnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBlVHlwZT0iIy8vQmxvY2siLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVBhcmFtZXRlciIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VQYXJhbWV0ZXIiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0FycmF5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgcGFyYW1ldGVyIHR5cGUgYW4gYXJyYXkgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzUmV0dXJuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgYSByZXR1cm4gcGFyYW1ldGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0SmF2YVR5cGUiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFF1YWxpZmllZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmFtZXRlcktpbmQiIGVUeXBlPSIjLy9KYXZhUGFyYW1ldGVyS2luZCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2QiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FT3BlcmF0aW9uIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiB0aGUgamF2YSBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHRoZSBtZXRob2QgbmFtZSBhbmQgaXRzIHBhcmFtZXRlcnMuIGUuZy4gJmx0O2NvZGU+IHNldEZpcnN0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSAmbHQ7L2NvZGU+IC4mI3hEOyYjeEE7ICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGFyYW1ldGVyIiBlVHlwZT0iIy8vSmF2YVBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIFBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcmFtZXRlck5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRSZXR1cm5UeXBlIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgcmV0dXJuIHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRSZXR1cm5UeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2V0IHRoZSByZXR1cm4gdHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idHlwZSIgZVR5cGU9IiMvL0pUeXBlSmF2YUhlbHBlcnMiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTaWduYXR1cmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLnRvU3RyaW5nKCkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBNZXRob2QuICBUaGUgc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyB0aGUgbWV0aG9kIGFjY2VzcyBtb2RpZmllcnMsIGlmIGFueSwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCByZXR1cm4gdHlwZSwgZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWV0aG9kLCBmb2xsb3dlZCBieSBhIHBlcmlvZCwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCBuYW1lLCBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2l6ZWQsIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBtZXRob2QncyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgbWV0aG9kIHRocm93cyBjaGVja2VkIGV4Y2VwdGlvbnMsIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgd29yZCB0aHJvd3MgZm9sbG93ZWQgYnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgdGhyb3duIGV4Y2VwdGlvbiB0eXBlcy4mI3hEOyYjeEE7JiN4RDsmI3hBO0ZvciBleGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIHB1YmxpYyBib29sZWFuIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgYWNjZXNzIG1vZGlmaWVycyBhcmUgcGxhY2VkIGluIGNhbm9uaWNhbCBvcmRlciBhcyBzcGVjaWZpZWQgYnkgJnF1b3Q7VGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiZxdW90Oy4gIFRoaXMgaXMgcHVibGljLCAmbHQ7dHQ+cHJvdGVjdGVkJmx0Oy90dD4gb3IgJmx0O3R0PnByaXZhdGUmbHQ7L3R0PiBmaXJzdCwgYW5kIHRoZW4gb3RoZXIgbW9kaWZpZXJzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6ICZsdDt0dD5hYnN0cmFjdCZsdDsvdHQ+LCAmbHQ7dHQ+c3RhdGljJmx0Oy90dD4sICZsdDt0dD5maW5hbCZsdDsvdHQ+LCAmbHQ7dHQ+c3luY2hyb25pemVkJmx0Oy90dD4gJmx0O3R0Pm5hdGl2ZSZsdDsvdHQ+LiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzR2VuZXJhdGVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIHN5c3RlbSBnZW5lcmF0ZWQuJiN4RDsmI3hBO1RoaXMgaXMgdXN1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBAZ2VuZXJhdGVkIHRhZyBpbiB0aGUgY29tbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldElzR2VuZXJhdGVkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2V0IHRoZSBpc0dlbmVyYXRlZCBmbGFnLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZ2VuZXJhdGVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzVm9pZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGEgdm9pZCByZXR1cm4gdHlwZSBtZXRob2QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhYnN0cmFjdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmF0aXZlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzeW5jaHJvbml6ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJ1Y3RvciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhdGljIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhVmlzaWJpbGl0eSIgZVR5cGU9IiMvL0phdmFWaXNpYmlsaXR5S2luZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJhbWV0ZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFQYXJhbWV0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFFeGNlcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvbWV0aG9kcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9CbG9jayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGaWVsZCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VUeXBlZEVsZW1lbnQiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRDb250YWluaW5nSmF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBjbGFzcyB0aGF0IHRoaXMgZmllbGQgaXMgd2l0aGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNBcnJheSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGZpZWxkIGFuIGFycmF5IHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhdGljIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhVmlzaWJpbGl0eSIgZVR5cGU9IiMvL0phdmFWaXNpYmlsaXR5S2luZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2llbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZvbGF0aWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvZmllbGRzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRpYWxpemVyIiBlVHlwZT0iIy8vQmxvY2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVHlwZUtpbmQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVOREVGSU5FRD0xIENMQVNTPTIgSU5URVJGQUNFPTMgRVhDRVBUSU9OPTQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlVOREVGSU5FRCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0xBU1MiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTlRFUkZBQ0UiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJFWENFUFRJT04iIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJsb2NrIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic291cmNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmxvY2siIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbW1lbnQiIGVTdXBlclR5cGVzPSIjLy9CbG9jayIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YXRlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Jsb2NrIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVBhY2thZ2UiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FUGFja2FnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFDbGFzc2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFDbGFzcyIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL2phdmFQYWNrYWdlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iSmF2YVZpc2liaWxpdHlLaW5kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQQUNLQUdFPTEmI3hEOyYjeEE7UFVCTElDPTImI3hEOyYjeEE7UFJJVkFURT0zJiN4RDsmI3hBO1BST1RFQ1RFRD00Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQVUJMSUMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBSSVZBVEUiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQUk9URUNURUQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQQUNLQUdFIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkphdmFQYXJhbWV0ZXJLaW5kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJTj0wJiN4RDsmI3hBO09VVD0xJiN4RDsmI3hBO0lOT1VUPTImI3hEOyYjeEE7UkVUVVJOPTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJPVVQiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTk9VVCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJFVFVSTiIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YURhdGFUeXBlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUNsYXNzIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFycmF5VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0phdmFDbGFzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGEgSmF2YSBBcnJheSB0eXBlJiN4RDsmI3hBOyAgIEZvciBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMsIGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUmI3hEOyYjeEE7ICAgc3BlY2lmaWVkIGRpcmVjdGx5LiAgVGhpcyB3b3VsZCByZXF1aXJlIGluc3RhbnRpYXRpbmcgYSBjaGFpbiBvZiBjb21wb25lbnQgdHlwZXMmI3hEOyYjeEE7ICAgc3VjaCBhcyBTdHJpbmdbXVtdW11bXS0+U3RyaW5nW11bXVtdLT5TdHJpbmdbXVtdLT5TdHJpbmdbXS0+U3RyaW5nLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICBUaGUgY29tcG9uZW50IHR5cGUgcmVsYXRpb25zaGlwIHdpbGwgYmUgY29tcHV0ZWQgaWYgdGhlIGZpbmFsQ29tcG9uZW50VHlwZSYjeEQ7JiN4QTsgIGFuZCBhcnJheSBkaW1lbnNpb25zIGlzIHNwZWNpZmllZC4mI3hEOyYjeEE7ICYjeEQ7JiN4QTsgIEZvciB0aGlzIHJlYXNvbiwgdGhlIHByZWZlcnJlZCB3YXkgdG8gY3JlYXRlIGlzIHRocm91Z2ggdGhlIEphdmFSZWZGYWN0b3J5IGZhY3RvcnkgbWV0aG9kOiYjeEQ7JiN4QTsgICAgICAgY3JlYXRlQXJyYXlUeXBlKEphdmFDbGFzcyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGaW5hbENvbXBvbmVudFR5cGUiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBBcnJheSBUeXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SW4gb3JkZXIgdG8gZW5zdXJlIGEgdW5pcXVlIGluc3RhbmNlLCB3ZSB3aWxsIHJlc29sdmUgdGhpcyB0eXBlIHVzaW5nIHJlZmxlY3Rpb24uIEl0IHR1cm5zIG91dCB0byBiZSBtb3N0IGVmZmljaWVudCB0byBqdXN0IGRvIHRoaXMgYnkgdHJpbW1pbmcgdGhlIG5hbWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRDb21wb25lbnRUeXBlQXNIZWxwZXIiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5LiAmI3hEOyYjeEE7JiN4RDsmI3hBO0lmIHRoaXMgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSwgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUgdGhlIG5lc3RlZCBhcnJheSB0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNQcmltaXRpdmVBcnJheSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGFuIGFycmF5IG9mIGphdmEgcHJpbWl0aXZlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0Q29tcG9uZW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgY29tcG9uZW50IHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJoZWxwZXJDb21wb25lbnRUeXBlIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFycmF5RGltZW5zaW9ucyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21wb25lbnRUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VDbGFzc2lmaWVyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkpUeXBlSmF2YUhlbHBlcnMiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpbnRlcmZhY2UgaXMgYSBjb21tb24gaW50ZXJmYWNlIGJldHdlZW4gSmF2YUNsYXNzIGFuZCBKYXZhRGF0YVR5cGUgcGx1cyBzb21lIGNvbW1vbiBoZWxwZXIgbWV0aG9kcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSlR5cGVMaXN0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9ImphdmEudXRpbC5MaXN0IHR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUV2ZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJ1Y3R1cmFsRmVhdHVyZSIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0ZmQ2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtL21vZmphdmEiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iIiBtb2RlbE5hbWU9IkphdmEiIG1vZGVsUGx1Z2luQ2xhc3M9IiIgZWRpdFBsdWdpbkNsYXNzPSJqYXZhLnByb3ZpZGVyLkphdmFFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJqYXZhLnByZXNlbnRhdGlvbi5KYXZhRWRpdG9yUGx1Z2luIiB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIgotICAgIGJvb2xlYW5GbGFnc0ZpZWxkPSJlRmxhZ3MiIGJvb2xlYW5GbGFnc1Jlc2VydmVkQml0cz0iOCIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxqYXZhTW9kZWwubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+V29ya3NwYWNlUm9vdDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkphdmFSZWYiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qZW0iIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIKLSAgICAgIGVjb3JlUGFja2FnZT0iamF2YS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQvVU5ERUZJTkVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9UeXBlS2luZC9DTEFTUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQvSU5URVJGQUNFIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9UeXBlS2luZC9FWENFUFRJT04iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImphdmEuZWNvcmUjLy9KYXZhVmlzaWJpbGl0eUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVZpc2liaWxpdHlLaW5kL1BVQkxJQyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVZpc2liaWxpdHlLaW5kL1BSSVZBVEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFWaXNpYmlsaXR5S2luZC9QUk9URUNURUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFWaXNpYmlsaXR5S2luZC9QQUNLQUdFIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlcktpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlcktpbmQvSU4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kL09VVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlcktpbmQvSU5PVVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kL1JFVFVSTiIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJqYXZhLmVjb3JlIy8vSlR5cGVKYXZhSGVscGVycyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iamF2YS5lY29yZSMvL0pUeXBlTGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3Mva2luZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvcHVibGljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0phdmFDbGFzcy9maW5hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2ltcGxlbWVudHNJbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvY2xhc3NJbXBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9wYWNrYWdlSW1wb3J0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2ZpZWxkcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL21ldGhvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbml0aWFsaXplcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9kZWNsYXJlZENsYXNzZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9kZWNsYXJpbmdDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9qYXZhUGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2V2ZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2FsbEV2ZW50cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaXNOZXN0ZWQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGQvZmllbGROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZEV4dGVuZGVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGRFeHRlbmRlZC9maWVsZE5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkTmFtZWQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZE5hbWVkL2ZpZWxkTmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGRzRXh0ZW5kZWQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZC9tZXRob2ROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZC9wYXJhbWV0ZXJUeXBlcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZEV4dGVuZGVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kRXh0ZW5kZWQvbWV0aG9kTmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2RFeHRlbmRlZC9wYXJhbWV0ZXJUeXBlcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kc0V4dGVuZGVkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRPbmx5U3BlY2lmaWNNZXRob2RzIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0T25seVNwZWNpZmljTWV0aG9kcy9hTWV0aG9kTmFtZVByZWZpeCIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRPbmx5U3BlY2lmaWNNZXRob2RzL2V4Y2x1ZGVkTmFtZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZC9tZXRob2ROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZC9wYXJhbWV0ZXJUeXBlcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2RzTmFtZWQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2RzTmFtZWQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0U3VwZXJ0eXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbXBsZW1lbnRzSW50ZXJmYWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW1wbGVtZW50c0ludGVyZmFjZS9pbnRlcmZhY2VUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbmZvU3RyaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbmhlcml0c0Zyb20iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbmhlcml0c0Zyb20vamF2YUNsYXNzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pc0V4aXN0aW5nVHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaXNJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL3NldFN1cGVydHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL3NldFN1cGVydHlwZS9qYXZhY2xhc3MiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0luaXRpYWxpemVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSW5pdGlhbGl6ZXIvaXNTdGF0aWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0luaXRpYWxpemVyL2phdmFDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0luaXRpYWxpemVyL3NvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvZmluYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlci9wYXJhbWV0ZXJLaW5kIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvaXNBcnJheSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL2lzUmV0dXJuIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvZ2V0SmF2YVR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlci9nZXRRdWFsaWZpZWROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9NZXRob2QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2QvYWJzdHJhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL25hdGl2ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2Qvc3luY2hyb25pemVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9maW5hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2QvY29uc3RydWN0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL3N0YXRpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2QvamF2YVZpc2liaWxpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL01ldGhvZC9wYXJhbWV0ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9NZXRob2QvamF2YUV4Y2VwdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL01ldGhvZC9qYXZhQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9NZXRob2Qvc291cmNlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRDb250YWluaW5nSmF2YUNsYXNzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRQYXJhbWV0ZXIiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRQYXJhbWV0ZXIvcGFyYW1ldGVyTmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0UmV0dXJuVHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2Qvc2V0UmV0dXJuVHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vTWV0aG9kL3NldFJldHVyblR5cGUvdHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0U2lnbmF0dXJlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9pc0dlbmVyYXRlZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2Qvc2V0SXNHZW5lcmF0ZWQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL01ldGhvZC9zZXRJc0dlbmVyYXRlZC9nZW5lcmF0ZWQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2lzVm9pZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vRmllbGQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9GaWVsZC9maW5hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9GaWVsZC9zdGF0aWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vRmllbGQvamF2YVZpc2liaWxpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vRmllbGQvdHJhbnNpZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0ZpZWxkL3ZvbGF0aWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9GaWVsZC9qYXZhQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0ZpZWxkL2luaXRpYWxpemVyIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0ZpZWxkL2dldENvbnRhaW5pbmdKYXZhQ2xhc3MiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vRmllbGQvaXNBcnJheSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vQmxvY2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9CbG9jay9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vQmxvY2svbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vQmxvY2svY29udGVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0NvbW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vU3RhdGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0phdmFQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFQYWNrYWdlL2phdmFDbGFzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9KYXZhRGF0YVR5cGUiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhRGF0YVR5cGUvZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9BcnJheVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9BcnJheVR5cGUvYXJyYXlEaW1lbnNpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL2NvbXBvbmVudFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL2dldEZpbmFsQ29tcG9uZW50VHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9BcnJheVR5cGUvZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0FycmF5VHlwZS9pc1ByaW1pdGl2ZUFycmF5Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0FycmF5VHlwZS9zZXRDb21wb25lbnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9BcnJheVR5cGUvc2V0Q29tcG9uZW50VHlwZS9oZWxwZXJDb21wb25lbnRUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9KYXZhRXZlbnQiLz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL2phdmFhZGFwdGVycy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9qYXZhYWRhcHRlcnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkOGE4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL2phdmFhZGFwdGVycy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvamF2YWFkYXB0ZXJzLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQKLSMKLQotRmFpbGVkX3JlZmxlY3RpbmdfdmFsdWVzX0VSUk9SXyAgICAgICA9IElXQVYwMDAyRSBGYWlsZWQgcmVmbGVjdGluZyB2YWx1ZXMuCi1Db3VsZF9Ob3RfUmVmbGVjdF9NZXRob2RzX0VSUk9SXyAgICAgID0gSVdBVjAwMDNFIENvdWxkIG5vdCByZWZsZWN0IG1ldGhvZHMgZm9yIHswfSBiZWNhdXNlIG9uZSBvZiB0aGUgbWV0aG9kcyByZWZlcmVuY2VzIGEgdHlwZSB0aGF0IGNvdWxkIG5vdCBiZSBsb2FkZWQuICBFeGNlcHRpb246IHsxfQotQ291bGRfTm90X1JlZmxlY3RfQ29uc3RydWN0b3JzX0VSUk9SXyA9IElXQVYwMTQyRSBDb3VsZCBub3QgcmVmbGVjdCBjb25zdHJ1Y3RvcnMgZm9yIHswfSBiZWNhdXNlIG9uZSBvZiB0aGUgbWV0aG9kcyByZWZlcmVuY2VzIGEgdHlwZSB0aGF0IGNvdWxkIG5vdCBiZSBsb2FkZWQuICBFeGNlcHRpb246IHsxfQotQ291bGRfTm90X1JlZmxlY3RfRmllbGRzX0VSUk9SXyAgICAgICA9IElXQVYwMTQzRSBDb3VsZCBub3QgcmVmbGVjdCBmaWVsZHMgZm9yIHswfSBiZWNhdXNlIG9uZSBvZiB0aGUgZmllbGRzIGlzIGEgdHlwZSB0aGF0IGNvdWxkIG5vdCBiZSBsb2FkZWQuIEV4Y2VwdGlvbjogezF9Ci1FcnJvcl9Mb29raW5nX1VwX1R5cGVfRVJST1JfICAgICAgICAgID0gSVdBVjAxNDRFIEVycm9yIGxvb2tpbmcgdXAgdHlwZSB7MH0uICBFeGNlcHRpb246IHsxfQotRXJyb3JfSW50cm9zcGVjdGluZ19GbGFnc19FUlJPUl8gICAgICA9IElXQVYwMTQ1RSBFcnJvciBpbnRyb3NwZWN0aW5nIGZsYWdzIG9uIHswfS4gIEV4Y2VwdGlvbjogezF9Ci1FcnJvcl9TZXR0aW5nX0dlbkZsYWdfRVJST1JfICAgICAgICAgID0gSVdBVjAxNTNFIEVycm9yIHNldHRpbmcgdGhlIGdlbmVyYXRlZCBmbGFnIG9uIHswfS4gIEV4Y2VwdGlvbjogezF9Ci1KYXZhX0luaF9DeWNsZV9FUlJPUl8gICAgICAgICAgICAgICAgID0gSVdBVjAxNTRFIERldGVjdGVkIGFuIGluaGVyaXRhbmNlIGN5Y2xlIHdoZW4gezB9IHRyeXMgdG8gZXh0ZW5kIHsxfS4KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2NvcmUvSkVNUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9jb3JlL0pFTVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGNmMjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2NvcmUvSkVNUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBKRU1QbHVnaW4uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkVjbGlwc2VMb2dnZXI7Ci0KLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5qZW0gcGx1Z2luCi0gKi8KLXB1YmxpYyBjbGFzcyBKRU1QbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgSkVNUGx1Z2luIFBMVUdJTjsKLQlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0JCi0JcHVibGljIEpFTVBsdWdpbigpIHsKLQkJUExVR0lOID0gdGhpczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKRU1QbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gUExVR0lOOwotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCWxvZ2dlciA9IEVjbGlwc2VMb2dnZXIuZ2V0RWNsaXBzZUxvZ2dlcih0aGlzKTsJCQotCX0KLQkKLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSUphdmFDbGFzc0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSUphdmFDbGFzc0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjYmI5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhQ2xhc3NBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLSAqICAkUkNTZmlsZTogSUphdmFDbGFzc0FkYXB0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkIAotICovCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8yNy8yMDAxIDE6MTc6NDYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFDbGFzc0FkYXB0b3IgewotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBpcyBudWxsIG9yIGlmCi0gKiBpdCBpcyBhIGJpbmFyeSB0eXBlLgotICovCi1ib29sZWFuIGlzU291cmNlVHlwZUZyb21CaW5hcnkoKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2VUeXBlIGNhbiBiZSBmb3VuZC4KLSAqLwotYm9vbGVhbiBzb3VyY2VUeXBlRXhpc3RzKCkgOwotCi0vKioKLSAqIFJlZmxlY3QgdGhlIGZpZWxkcwotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZsZWN0aW9uIG9jY3VycmVkLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotYm9vbGVhbiByZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKTsJCi0KLS8qKgotICogUmVmbGVjdCB0aGUgbWV0aG9kcy4KLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmbGVjdGlvbiBvY2N1cnJlZC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLWJvb2xlYW4gcmVmbGVjdE1ldGhvZHNJZk5lY2Vzc2FyeSgpOwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhTWV0aG9kQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YU1ldGhvZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwNjMwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhTWV0aG9kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUphdmFNZXRob2RBZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLSAKLQotLyoqCi0gKiBVc2VkIHRvIHJlZmxlY3QgbWV0aG9kcwotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFNZXRob2RBZGFwdGVyIHsKLQotCS8qKgotCSAqIFJlZmxlY3QgdGhlIGdlbmVyYXRlZCBpZiBuZWNlc3NhcnkuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZsZWN0aW9uIG9jY3VycmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RHZW5lcmF0ZWRJZk5lY2Vzc2FyeSgpOwotCQotCS8qKgotCSAqIFJlZmxlY3QgdGhlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZsZWN0aW9uIG9jY3VycmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RQYXJhbU5hbWVzSWZOZWNlc3NhcnkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSW50ZXJuYWxSZWFkQWRhcHRhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0ludGVybmFsUmVhZEFkYXB0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjZmZWI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSW50ZXJuYWxSZWFkQWRhcHRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLSAqICAkUkNTZmlsZTogSW50ZXJuYWxSZWFkQWRhcHRhYmxlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEludGVybmFsUmVhZEFkYXB0YWJsZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyIHsKLS8qKgotICogSW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlIG5lZWQgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nIG1ldGhvZAotICogaW1wbGVtZW50YXRpb25zOgotICogcHVibGljIE9iamVjdCBwcmltUmVmVmFsdWUoRU9iamVjdCBhKSB7Ci0gKglyZXR1cm4gc3VwZXIuZ2V0VmFsdWUoYSk7Ci0gKiB9Ci0gKiBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVPYmplY3QgYSkgewotICoJcmV0dXJuIFJlZmxlY3Rpb25BZGFwdG9yLmdldFZhbHVlKHRoaXMsIGEpOwotICogfQotICovCi0vL3B1YmxpYyBPYmplY3QgcHJpbVJlZlZhbHVlKEVPYmplY3QgYSk7Ci12b2lkIHNldFJlZmxlY3RlZChib29sZWFuIGFCb29sZWFuKTsKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzYyODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBKYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuQXJyYXlUeXBlSW1wbDsKLQotLyoqCi0gKiBBcnJheSB0eXBlIHJlZmxlY3Rpb24gYWRhcHRlci4gU2luY2UgYXJyYXlzIGFyZSB2ZXJ5IGNvbnN0YW50IHdlIGRvbid0IG5lZWQgYW55IGZhbmN5IHJlZmxlY3Rpb24gdG8gdGhlIHNvdXJjZSB0eXBlIChjbGFzcyBvYmplY3QpLiBJdCByZWFsbHkKLSAqIGRvZXNuJ3QgZG8gYW55dGhpbmcuIEl0IGlzIGp1c3QgaGVyZSBzbyB0aGF0IGl0IGV4aXN0cy4gRXZlcnl0aGluZyBpcyBjb25zdGFudCBvciBkZXBlbmRzIG9uIHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIgZXh0ZW5kcyBKYXZhUmVmbGVjdGlvbkFkYXB0b3IgaW1wbGVtZW50cyBJSmF2YUNsYXNzQWRhcHRvciB7Ci0KLQlwdWJsaWMgSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2dldFJlZmxlY3Rpb25Tb3VyY2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIFRoZXJlIGlzbid0IGFueSBmb3IgYXJyYXlzLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2hhc1JlZmxlY3Rpb25Tb3VyY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1JlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHZhbGlkLCBzbyB3ZSBwYXNzIG9uIHRvIHVzZSB0aGUgZmluYWwgY29tcG9uZW50LgotCQlBcnJheVR5cGUgamggPSAoQXJyYXlUeXBlKSBnZXRUYXJnZXQoKTsKLQkJSmF2YUhlbHBlcnMgZmMgPSBqaC5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJcmV0dXJuIChmYy5pc1ByaW1pdGl2ZSgpIHx8ICgoSmF2YUNsYXNzKSBmYykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCUFycmF5VHlwZSBqaCA9IChBcnJheVR5cGUpIGdldFRhcmdldCgpOwotCQlKYXZhSGVscGVycyBmYyA9IGpoLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQlpZihmYy5pc1ByaW1pdGl2ZSgpKQotCQkgICAgcmV0dXJuIHRydWU7Ci0JCWVsc2UgewotCQkgICAgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIHJlZmxlY3Rpb25BZGFwdG9yID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihmYywgUmVmbGVjdGlvbkFkYXB0b3IuVFlQRV9LRVkpOwotCQkgICAgcmV0dXJuIChyZWZsZWN0aW9uQWRhcHRvciAhPSBudWxsKSA/IHJlZmxlY3Rpb25BZGFwdG9yLmhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSA6IGZhbHNlOwkJICAgIAotCQl9IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3IjcmVmbGVjdFZhbHVlcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJQXJyYXlUeXBlSW1wbCBhdCA9IChBcnJheVR5cGVJbXBsKSBnZXRUYXJnZXQoKTsKLQotCQkvLyBBcnJheXMgYXJlIGFsd2F5czoKLQkJLy8JCWZpbmFsCi0JCS8vCQlTdXBlcnR5cGUgb2YgamF2YS5sYW5nLk9iamVjdAotCQkvLwkJaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCQlhdC5zZXRGaW5hbCh0cnVlKTsKLQkJdHJ5IHsKLQkJCWF0LnNldFN1cGVydHlwZSgoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmEubGFuZy5PYmplY3QiLCAoRU9iamVjdCkgZ2V0VGFyZ2V0KCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlMaXN0IGxpc3QgPSBhdC5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpOwotCQlsaXN0LmFkZChKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5DbG9uZWFibGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGlzdC5hZGQoSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIucmVmbGVjdFZhbHVlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2ZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCUFycmF5VHlwZUltcGwgYXQgPSAoQXJyYXlUeXBlSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JCWF0LmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFDbGFzc0FkYXB0b3IjaXNTb3VyY2VUeXBlRnJvbUJpbmFyeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTb3VyY2VUeXBlRnJvbUJpbmFyeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yI3JlZmxlY3RGaWVsZHNJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlZmxlY3RGaWVsZHNJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yI3JlZmxlY3RNZXRob2RzSWZOZWNlc3NhcnkoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFDbGFzc0FkYXB0b3Ijc291cmNlVHlwZUV4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc291cmNlVHlwZUV4aXN0cygpIHsKLQkJcmV0dXJuIGhhc1JlZmxlY3Rpb25Tb3VyY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmIzNjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvLyBNYWludGFpbiBhIG1hcHBpbmcgb2YgdGhlIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBhZGFwdG9ycyB3aGljaCBoYXZlCi0JLy8gcmVsZmVjdGVkIGZyb20gdGhlbS4gIFRoaXMgYWxsb3dzIGEgZmx1c2ggb3BlcmF0aW9uIHRvIGZvcmNlIHRob3NlCi0JLy8gYWRhcHRlcnMgdG8gcmUtcmVmbGVjdC4KLQlwcm90ZWN0ZWQgSGFzaE1hcCByZWZsZWN0ZWQgPSBuZXcgSGFzaE1hcCgpOwotCS8qKgotCSAqIEtleSBmb3IgdGhlIHR5cGUgb2YgYWRhcHRlcnMgdGhhdCB0aGlzIGZhY3RvcnkgY3JlYXRlcy4gKFVzZWQgaW4gaXNGYWN0b3J5Rm9yVHlwZSgpKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0tFWSA9IFJlYWRBZGFwdG9yLlRZUEVfS0VZOwotCXByb3RlY3RlZCBib29sZWFuIGlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBNYXAgcmVnaXN0ZXJRdWV1ZTsKLQlwcm90ZWN0ZWQgTGlzdCB1bnJlZ2lzdGVyUXVldWU7Ci0vKioKLSAqIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRlciA9IG51bGw7Ci0JRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdCkgdGFyZ2V0OwotCUphdmFSZWZQYWNrYWdlIHBhY2sgPSBnZXRKYXZhUmVmUGFja2FnZSgpOwotCWlmIChvYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRKYXZhQ2xhc3MoKSkKLQkJYWRhcHRlciA9IGNyZWF0ZUphdmFDbGFzc0FkYXB0b3IodGFyZ2V0KTsKLQllbHNlCi0JCWlmIChvYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRBcnJheVR5cGUoKSkKLQkJCWFkYXB0ZXIgPSBjcmVhdGVBcnJheVR5cGVBZGFwdG9yKHRhcmdldCk7Ci0JCWVsc2UKLQkJCWlmIChvYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRNZXRob2QoKSkKLQkJCQlhZGFwdGVyID0gY3JlYXRlSmF2YU1ldGhvZEFkYXB0b3IodGFyZ2V0KTsKLQkJCWVsc2UKLQkJCQlpZiAob2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0RmllbGQoKSkKLQkJCQkJYWRhcHRlciA9IGNyZWF0ZUphdmFGaWVsZEFkYXB0b3IodGFyZ2V0KTsKLQlyZXR1cm4gYWRhcHRlcjsKLX0KLQotcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUFycmF5VHlwZUFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JcmV0dXJuIG5ldyBKYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIodGFyZ2V0KTsKLX0KLQotcHJvdGVjdGVkIGFic3RyYWN0IFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFDbGFzc0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSA7Ci1wcm90ZWN0ZWQgYWJzdHJhY3QgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YUZpZWxkQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIDsKLXByb3RlY3RlZCBhYnN0cmFjdCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhTWV0aG9kQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIDsKLS8vIEZsdXNoIHRoZSBhZGFwdGVyIGZvciBhIHNvdXJjZSBvYmplY3QKLXB1YmxpYyBOb3RpZmljYXRpb24gZGlzQXNzb2NpYXRlU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQlyZXR1cm4gZGlzQXNzb2NpYXRlU291cmNlKHNvdXJjZSwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyBOb3RpZmljYXRpb24gZGlzQXNzb2NpYXRlU291cmNlKFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gZG9Ob3RpZnkpIHsKLQlKYXZhUmVmbGVjdGlvbkFkYXB0b3IgYSA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoc291cmNlKTsKLQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbnVsbDsKLQlpZiAoYSAhPSBudWxsKSB7Ci0JCWlmIChkb05vdGlmeSkKLQkJCWEucmVsZWFzZVNvdXJjZVR5cGUoKTsKLQkJZWxzZQotCQkJbm90aWZpY2F0aW9uID0gYS5yZWxlYXNlU291cmNlVHlwZU5vTm90aWZpY2F0aW9uKCk7Ci0JfQotCXJldHVybiBub3RpZmljYXRpb247Ci19Ci1wdWJsaWMgdm9pZCBmbHVzaEFsbCgpIHt9Ci0vLyBGbHVzaCB0aGUgYWRhcHRlciBmb3IgYSBzb3VyY2Ugb2JqZWN0Ci1wdWJsaWMgdm9pZCBmbHVzaFJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSkge30KLXByb3RlY3RlZCBKYXZhUmVmUGFja2FnZSBnZXRKYXZhUmVmUGFja2FnZSgpIHsKLQlyZXR1cm4gKEphdmFSZWZQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLX0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVmbGVjdGlvbihTdHJpbmcgc291cmNlLCBSZWZsZWN0aW9uQWRhcHRvciBhZGFwdGVyKSB7Ci0JaWYgKGlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCkgewotCQlpZiAocmVnaXN0ZXJRdWV1ZSA9PSBudWxsKQotCQkJcmVnaXN0ZXJRdWV1ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlZ2lzdGVyUXVldWUucHV0KHNvdXJjZSwgYWRhcHRlcik7Ci0JfSBlbHNlCi0JCXJlZmxlY3RlZC5wdXQoc291cmNlLCBhZGFwdGVyKTsKLX0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJSZWZsZWN0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQlpZiAoaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkKSB7Ci0JCWlmICh1bnJlZ2lzdGVyUXVldWUgPT0gbnVsbCkKLQkJCXVucmVnaXN0ZXJRdWV1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdW5yZWdpc3RlclF1ZXVlLmFkZChzb3VyY2UpOwotCX0gZWxzZQotCQlyZWZsZWN0ZWQucmVtb3ZlKHNvdXJjZSk7Ci19Ci1wdWJsaWMgdm9pZCBkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoU3RyaW5nIHNvdXJjZSkgewotCWRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihzb3VyY2UsIHRydWUpOwotfQotCi1wdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihTdHJpbmcgc291cmNlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gdHJ1ZTsKLQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbnVsbDsKLQl0cnkgewotCQlTdHJpbmcgaW5uZXJOYW1lID0gc291cmNlICsgJyQnOwotCQlJdGVyYXRvciBpdCA9IHJlZmxlY3RlZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJU3RyaW5nIGtleTsKLQkJSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGFkYXB0b3I7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJa2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoa2V5LmVxdWFscyhzb3VyY2UpIHx8IGtleS5zdGFydHNXaXRoKGlubmVyTmFtZSkpIHsKLQkJCQlhZGFwdG9yID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgcmVmbGVjdGVkLmdldChrZXkpOwotCQkJCWlmIChhZGFwdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGRvTm90aWZ5KQotCQkJCQkJYWRhcHRvci5yZWxlYXNlU291cmNlVHlwZSgpOwotCQkJCQllbHNlCi0JCQkJCQlub3RpZmljYXRpb24gPSBhZGFwdG9yLnJlbGVhc2VTb3VyY2VUeXBlTm9Ob3RpZmljYXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCX0KLQlyZXR1cm4gbm90aWZpY2F0aW9uOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpIHsKLQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSBmYWxzZTsKLQlpZiAodW5yZWdpc3RlclF1ZXVlICE9IG51bGwgJiYgIXVucmVnaXN0ZXJRdWV1ZS5pc0VtcHR5KCkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bnJlZ2lzdGVyUXVldWUuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZmxlY3RlZC5yZW1vdmUodW5yZWdpc3RlclF1ZXVlLmdldChpKSk7Ci0JCX0KLQkJdW5yZWdpc3RlclF1ZXVlLmNsZWFyKCk7Ci0JfQotCWlmIChyZWdpc3RlclF1ZXVlICE9IG51bGwgJiYgIXJlZ2lzdGVyUXVldWUuaXNFbXB0eSgpKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVnaXN0ZXJRdWV1ZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlyZWZsZWN0ZWQucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZWdpc3RlclF1ZXVlLmNsZWFyKCk7Ci0JfQotfQotcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCXJldHVybiBUWVBFX0tFWS5lcXVhbHModHlwZSk7Ci19Ci19Ci0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbkFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYTA3ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbkFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVJlZmxlY3Rpb25BZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEzICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjM1ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0JCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGV4dGVuZHMgUmVmbGVjdGlvbkFkYXB0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDX01FVEhPRF9ERUZBVUxUX0NUT1IgPSBTdHJpbmcudmFsdWVPZihDX01FVEhPRF9QQVJNX0RFTElNSVRFUikgKyBTX0NPTlNUUlVDVE9SX1RPS0VOOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfQlJBQ0tFVCA9ICJbIjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU3BlY2lhbCBub3RpZmljYXRpb24gZXZlbnQgdHlwZS4gVGhpcyBpcyBzZW50IGFnYWluc3QgYSBKYXZhQ2xhc3MgKGFzIHRoZSB0YXJnZXQpIHdoZW5ldmVyIGZsdXNoIG9mIHRoZSByZWZsZWN0aW9uIG9jY3Vycy4gSXQgd2lsbCBiZQotCSAqIHNlbnQgdW5kZXIgdGhlIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlIG9mIFJFRkxFQ1RJT05fRVZFTlQuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEZMVVNIX1JFRkxFQ1RJT05fRVZFTlQgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVjb3JlRmFjdG9yeSgpLmNyZWF0ZUVBdHRyaWJ1dGUoKTsKLQkKLQkvKioKLQkgKiBTcGVjaWFsIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlLiBUaGlzIGlzIHNlbnQgYWdhaW5zdCBhIEphdmFDbGFzcyAoYXMgdGhlIHRhcmdldCkgd2hlbmV2ZXIgZmx1c2ggb2YgYSBuZXcgY2xhc3MgKGkuZS4gCi0JICogbm8gc291cmNlIHdhcyBmb3VuZCkgb2YgdGhlIHJlZmxlY3Rpb24gb2NjdXJzLiBJdCB3aWxsIGJlCi0JICogc2VudCB1bmRlciB0aGUgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUgb2YgUkVGTEVDVElPTl9FVkVOVC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgRkxVU0hfTkVXX1JFRkxFQ1RJT05fRVZFTlQgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVjb3JlRmFjdG9yeSgpLmNyZWF0ZUVBdHRyaWJ1dGUoKTsKLQotCS8qCi0JICogRmlsbCBpbiB0aGUgbmFtZS4gTm90IHJlYWxseSBuZWVkZWQgYnV0IGl0IHdvdWxkIGJlIG5pY2UuCi0JICovCi0Jc3RhdGljIHsKLQkJRkxVU0hfUkVGTEVDVElPTl9FVkVOVC5zZXROYW1lKCJmbHVzaFJlZmxlY3RlZFZhbHVlcyIpOyAgICAvLyROT04tTkxTLTEkCi0JCUZMVVNIX05FV19SRUZMRUNUSU9OX0VWRU5ULnNldE5hbWUoImZsdXNoTmV3UmVmbGVjdGVkVmFsdWVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRmx1c2hlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGlzRmx1c2hpbmcgPSBmYWxzZTsKLS8qKgotICogSmF2YVJlZmxlY3Rpb25BZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhUmVmbGVjdGlvbkFkYXB0b3IoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogSmF2YVJlZmxlY3Rpb25BZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gdGFyZ2V0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyCi0gKi8KLXB1YmxpYyBKYXZhUmVmbGVjdGlvbkFkYXB0b3Iob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIgdGFyZ2V0KSB7Ci0Jc3VwZXIodGFyZ2V0KTsKLX0KLS8qKgotICogY3JlYXRlQmxvY2sgLSBpbnN0YW50aWF0ZSBhIEJsb2NrIGNvbnRhaW5pbmcgdGhlIHBhc3NlZCBzb3VyY2UKLSAqLwotcHVibGljIEJsb2NrIGNyZWF0ZUJsb2NrKFN0cmluZyBuYW1lLCBTdHJpbmcgc291cmNlU3RyaW5nKSB7Ci0JQmxvY2sgbmV3QmxvY2sgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUJsb2NrKCk7Ci0JbmV3QmxvY2suc2V0TmFtZShuYW1lICsgIl8iICsgImJsb2NrIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQluZXdCbG9jay5zZXRTb3VyY2Uoc291cmNlU3RyaW5nKTsKLQlyZXR1cm4gbmV3QmxvY2s7Ci19Ci0vKioKLSAqIHNldFN1cGVyIC0gc2V0IG91ciBzdXBlcnR5cGUgaGVyZSwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkKLSAqLwotcHVibGljIEphdmFDbGFzcyBjcmVhdGVKYXZhQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQlKYXZhQ2xhc3MgcmVmID0gb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLmNyZWF0ZUphdmFDbGFzcygpOwotICAgSmF2YVVSTCBqYXZhdXJsID0gbmV3IEphdmFVUkwodGFyZ2V0TmFtZSk7Ci0gICgoSW50ZXJuYWxFT2JqZWN0KSByZWYpLmVTZXRQcm94eVVSSShVUkkuY3JlYXRlVVJJKGphdmF1cmwuZ2V0RnVsbFN0cmluZygpKSk7Ci0gICByZXR1cm4gcmVmOwotfQotLyoqCi0gKiBjcmVhdGVKYXZhUGFyYW1ldGVyIC0gaW5zdGFudGlhdGUgYSBKYXZhIFBhcmFtZXRlciBiYXNlZCBvbiB0aGUgcGFzc2VkIG5hbWUgYW5kIHR5cGUgbmFtZSAoYSBzaW1wbGUgbmFtZSwgTk9UIEEgU0lHTkFUVVJFISEhKQotICogVGhlIGlkIGZvciBhIHBhcmFtZXRlciBoYXMgdG8gYmUgY29tcGxleCBpbiBvcmRlciB0byBiZSBwYXJzYWJsZSBpbnRvIGNsYXNzLCBtZXRob2QsIGFuZCBwYXJtLgotICogSXQgaXMgY3JlYXRlZCBieSBhcHBlbmRpbmcgdGhlIHBhcm0gbmFtZSB0byB0aGUgbWV0aG9kIGlkLCB3aXRoIGEga25vd24gc2VwYXJhdG9yLgotICogSXQgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlICJGb28uZG9Tb21ldGhpbmcoamF2YS5sYW5nLkludGVnZXItYXJnMCIKLSAqLwotcHVibGljIEphdmFQYXJhbWV0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlcihNZXRob2QgcGFyZW50TWV0aG9kLCBTdHJpbmcgcGFybU5hbWUsIFN0cmluZyBwYXJtVHlwZU5hbWUpIHsKLQlKYXZhUGFyYW1ldGVyIG5ld1Bhcm0gPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLQlpZiAocGFybU5hbWUhPW51bGwpCi0JICAgbmV3UGFybS5zZXROYW1lKHBhcm1OYW1lKTsKLS8vICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bhcm0pLmVTZXRJRChwYXJlbnRNZXRob2QuZUlEKCkgKyBDX01FVEhPRElEX1BBUk1JRF9ERUxJTUlURVIgKyBwYXJtTmFtZSk7Ci0JU3RyaW5nIGNsYXNzUmVmU3RyaW5nID0gcGFybVR5cGVOYW1lOwotCW5ld1Bhcm0uc2V0RVR5cGUoY3JlYXRlSmF2YUNsYXNzUmVmKGNsYXNzUmVmU3RyaW5nKSk7Ci0JcmV0dXJuIG5ld1Bhcm07Ci19Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgTGlzdCBvZiBkaW1lbnNpb25zIGZvciBhIHR5cGVOYW1lLgotICogRm9yIGV4YW1wbGUgImZvb1tdW10iIHdvdWxkIHJldHVybiBhIExpc3Qgb2YgSW50ZWdlcnMKLSAqIDEsIDEuICBBdCBzb21lIHBvaW50IHdlIG1heSB3YW50IHRvIGFjdHVhbGx5IGNhcHR1cmUgdGhlIHNpemUKLSAqIGZvciBGaWVsZHMgYnV0IHdlIHdvdWxkIG5lZWQgdGhlIGluaXRpYWxpemVyIHNvdXJjZSB0byBkZXRlcm1pbmUgdGhhdC4KLSAqLwotcHVibGljIExpc3QgZ2V0QXJyYXlEaW1lbnNpb25zKFN0cmluZyB0eXBlTmFtZSkgewotCUxpc3QgZGltZW5zaW9ucyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0JaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLQkJaW50IGJlZ2luID0gMDsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCXdoaWxlIChiZWdpbiA8IHR5cGVOYW1lLmxlbmd0aCgpKSB7Ci0JCQlpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoTEVGVF9CUkFDS0VULCBiZWdpbik7Ci0JCQlpZiAoaW5kZXggPiAtMSkgewotCQkJCWRpbWVuc2lvbnMuYWRkKG5ldyBJbnRlZ2VyKDEpKTsKLQkJCQliZWdpbiA9IGluZGV4ICsgMTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmVnaW4gPSB0eXBlTmFtZS5sZW5ndGgoKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZGltZW5zaW9uczsKLX0KLS8qIEdldCB0aGUgSmF2YSBGYWN0b3J5Ci0gKi8KLXByb3RlY3RlZCBzdGF0aWMgSmF2YVJlZkZhY3RvcnkgZ2V0SmF2YUZhY3RvcnkoKSB7Ci0JcmV0dXJuICgob3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2Uob3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkpLmdldEphdmFSZWZGYWN0b3J5KCk7Ci19Ci1wdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKTsKLS8qKgotICogZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZFVVSUQgLSBQdWxsIHRoZSBwYXJtIHR5cGUgbmFtZXMgb3V0IG9mIGEgbWV0aG9kIElECi0gKiAJCUl0IHdpbGwgYmUgaW4gdGhlIGZvcm06ICJzaW1wbGVjbGFzcy5tZXRob2ROYW1lKGNvbS5mcm9uay5QYXJtMV90eXBlLHBhcm0ydHlwZSIKLSAqLwotcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBnZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoU3RyaW5nIG1ldGhvZElEKSB7Ci0JaWYgKG1ldGhvZElELmNoYXJBdChtZXRob2RJRC5sZW5ndGgoKS0xKSA9PSBDX01FVEhPRF9QQVJNX0RFTElNSVRFUiB8fCBtZXRob2RJRC5lbmRzV2l0aChDX01FVEhPRF9ERUZBVUxUX0NUT1IpKQotCQlyZXR1cm4gZW1wdHlTdHJpbmdBcnJheTsKLQkJCi0JLy8gQ291bnQgdGhlIHBhcm1zIGZpcnN0LiAgVGhlIG51bWJlciBvZiBwYXJtcyBpcyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mICcsJyArIDEKLQlpbnQgbnVtUGFybXMgPSAxOwotCWludCBwb3MgPSAtMTsKLQkvLyBTa2lwIHRoZSAnLicgYWZ0ZXIgY2xhc3NuYW1lCi0JcG9zID0gbWV0aG9kSUQuaW5kZXhPZihDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIsICsrcG9zKTsKLQkvLyBMb29rIGZvciB0aGUgc3RhcnQgb2YgdGhlIHBhcm1zCi0JaW50IHBhcm1Qb3MgPSBtZXRob2RJRC5pbmRleE9mKENfTUVUSE9EX1BBUk1fREVMSU1JVEVSLCArK3Bvcyk7Ci0JcG9zID0gcGFybVBvczsKLQl3aGlsZSAoKHBvcyA9IG1ldGhvZElELmluZGV4T2YoQ19QQVJNX1BBUk1fREVMSU1JVEVSLCArK3BvcykpICE9IC0xKQotCQludW1QYXJtcysrOwotCVN0cmluZ1tdIHBhcm1UeXBlTmFtZXMgPSBuZXcgU3RyaW5nW251bVBhcm1zXTsKLQkvLyBub3cgY29sbGVjdCB0aGUgcGFybSBuYW1lcwotCS8vIHNraXAgdGhlIG1ldGhvZCBuYW1lCi0JcG9zID0gcGFybVBvczsKLQlpbnQgaSA9IDAsIGVuZDsKLQlkbyB7Ci0JCWVuZCA9IG1ldGhvZElELmluZGV4T2YoQ19QQVJNX1BBUk1fREVMSU1JVEVSLCBwb3MgKyAxKTsKLQkJLy8gVGhpcyBpcyB0aGUgbGFzdCBwYXJhbWV0ZXIsIHdlIG1heSBuZWVkIHRvIHN0cmlwIGEgdHJhaWxpbmcgJlYgZm9yIGEgY29uc3RydWN0b3IKLQkJaWYgKGVuZCA9PSAtMSkKLQkJCWVuZCA9IG1ldGhvZElELmluZGV4T2YoU19DT05TVFJVQ1RPUl9UT0tFTiwgcG9zICsgMSk7Ci0JCS8vIG90aGVyd2lzZSB0YWtlIHRoZSByZXN0IG9mIHRoZSBJRAotCQlpZiAoZW5kID09IC0xKQotCQkJZW5kID0gbWV0aG9kSUQubGVuZ3RoKCk7Ci0JCXBhcm1UeXBlTmFtZXNbaSsrXSA9IG1ldGhvZElELnN1YnN0cmluZyhwb3MgKyAxLCBlbmQpOwotCX0gd2hpbGUgKChwb3MgPSBtZXRob2RJRC5pbmRleE9mKENfUEFSTV9QQVJNX0RFTElNSVRFUiwgKytwb3MpKSAhPSAtMSk7Ci0JcmV0dXJuIHBhcm1UeXBlTmFtZXM7Ci19Ci1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCk7Ci0KLXB1YmxpYyBib29sZWFuIGhhc1JlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0gICAgcmV0dXJuIGdldFJlZmxlY3Rpb25Tb3VyY2UoKSAhPSBudWxsOwotfQotCi0vKioKLSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotICoKLSAqLwotcHVibGljIHZvaWQgcmVsZWFzZVNvdXJjZVR5cGUoKXsKLX0KLQotLyoqCi0gKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4KLSAqIEByZXR1cm4KLSAqLwotcHVibGljIE5vdGlmaWNhdGlvbiByZWxlYXNlU291cmNlVHlwZU5vTm90aWZpY2F0aW9uKCkgewotCXJldHVybiBudWxsOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZVNvdXJjZVR5cGUoSmF2YUNsYXNzIGphdmFDbGFzcykgewotCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCkKLQkJcmV0dXJuOwotCi0JSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGV4aXN0aW5nID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgcmV0cmlldmVBZGFwdG9yRnJvbShqYXZhQ2xhc3MpOwotCWlmIChleGlzdGluZyAhPSBudWxsKQotCQlleGlzdGluZy5yZWxlYXNlU291cmNlVHlwZSgpOwotfQotLyoKLSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBhIEZpZWxkIEFkYXB0b3IgdG8gc2V0IHRoZSB0eXBlIG9mIGFGaWVsZAotICogdG8gYmUgYVR5cGVOYW1lLiAgYVR5cGVOYW1lIG1heSBjb250YWluIGFycmF5IGJyYWNrZXRzIHdoaWNoIG5lZWQKLSAqIHRvIGJlIGRldGVjdGVkIGluIG9yZGVyIHRvIHNldCB0aGUgYXJyYXkgZGltZW5zaW9ucyBvbiBhRmllbGQuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHNldEZpZWxkVHlwZShGaWVsZCBhRmllbGQsIFN0cmluZyBhVHlwZU5hbWUpIHsKLQlpZiAoYUZpZWxkICE9IG51bGwgJiYgYVR5cGVOYW1lICE9IG51bGwpIHsKLQkJU3RyaW5nIGNsYXNzUmVmU3RyaW5nID0gYVR5cGVOYW1lOwotCQlhRmllbGQuc2V0RVR5cGUoY3JlYXRlSmF2YUNsYXNzUmVmKGNsYXNzUmVmU3RyaW5nKSk7Ci0JfQotfQotcHVibGljIGZpbmFsIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpIHsKLQlyZXR1cm4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShmYWxzZSk7Ci19Ci1wdWJsaWMgZmluYWwgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCU5vdGlmaWNhdGlvbiBub3QgPSBmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oY2xlYXJDYWNoZWRNb2RlbE9iamVjdCk7Ci0JaWYgKG5vdCAhPSBudWxsKQotCQlnZXRUYXJnZXQoKS5lTm90aWZ5KG5vdCk7Ci0JcmV0dXJuIGhhc0ZsdXNoZWQ7Ci19Ci0KLXB1YmxpYyBzeW5jaHJvbml6ZWQgTm90aWZpY2F0aW9uIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbihib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQlpZiAoIWhhc0ZsdXNoZWQgJiYgIWlzRmx1c2hpbmcpIHsKLQkJYm9vbGVhbiBpc0V4aXN0aW5nID0gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpOwotCQl0cnkgewotCQkJaXNGbHVzaGluZyA9IHRydWU7Ci0JCQloYXNSZWZsZWN0ZWQgPSBmYWxzZTsKLQkJCWhhc0ZsdXNoZWQgPSBmbHVzaFJlZmxlY3RlZFZhbHVlcyhjbGVhckNhY2hlZE1vZGVsT2JqZWN0KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWhhc0ZsdXNoZWQgPSBmYWxzZTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpCi0JCQkJdGhyb3cgKEVycm9yKSBlOwotCQkJZWxzZQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzRmx1c2hpbmcgPSBmYWxzZTsKLQkJCXBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVGbHVzaE5vdGlmaWNhdGlvbihpc0V4aXN0aW5nKTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogQHBhcmFtIGlzRXhpc3RpbmcKLSAqIEByZXR1cm4KLSAqLwotcHJvdGVjdGVkIE5vdGlmaWNhdGlvbiBjcmVhdGVGbHVzaE5vdGlmaWNhdGlvbihib29sZWFuIGlzRXhpc3RpbmcpIHsKLQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGlzRXhpc3RpbmcgPyBGTFVTSF9SRUZMRUNUSU9OX0VWRU5UIDogRkxVU0hfTkVXX1JFRkxFQ1RJT05fRVZFTlQ7Ci0JcmV0dXJuIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KWdldFRhcmdldCgpLEVWRU5ULCBmZWF0dXJlLCBudWxsLCBudWxsKTsKLX0KLXByb3RlY3RlZCB2b2lkIHBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGJvb2xlYW4gaXNFeGlzdGluZykgewotfQotLyoqCi0gKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBwZXJmb3JtIHRoZSBhY3R1YWwgY2xlYXJpbmcgb2YgdGhlIHZhbHVlcy4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKioKLSAqIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHJlZmxlY3Rpb24gaGFkIG9jY3VycmVkLgotICovCi1wdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSB7Ci0JaWYgKGlzRmx1c2hpbmcpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gc3VwZXIucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci19Ci0KLS8qKgotICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldAotICovCi1wdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCWhhc0ZsdXNoZWQgPSBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbktleS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzJiMjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVJlZmxlY3Rpb25LZXkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozNSAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb247Ci0KLS8qKgotICogVGhpcyBrZXkgaGFuZGxlcyBKYXZhIFJlZmxlY3Rpb24uIEl0IGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZW50cmllcyBpZgotICogdGhleSBhcmUgbm90IGFscmVhZHkgaW4gdGhlIHJlc291cmNlLiBUaGVyZSBpcyBhbiBleHRlbnNpb24gbWVjaGFuaXNtIGZvciBvdGhlcgotICogdHlwZXMgb2YgaWRzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkIGJ5IHRoaXMga2V5LiBUaGV5IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlCi0gKiBKYXZhWE1JRmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIHRoZXNlIGtleXMsIGFuZCB0aGUgZmFjdG9yeSB3aWxsIHBhc3MgaW4KLSAqIGEgTGlzdCBvZiB0aGVzZSByZWdpc3RlcmVkIGV4dGVuc2lvbiBwcm9jZXNzZXJzIChJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24pLgotICogCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvNC8yMDAwIDg6MjQ6MzYgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmbGVjdGlvbktleSBpbXBsZW1lbnRzIElKYXZhUmVmbGVjdGlvbktleSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBQUklNSVRJVkVTID0gbmV3IEFycmF5TGlzdCg4KTsKLQotCXN0YXRpYyB7IGluaXRpYWxpemVQcmltaXRpdmVzQ29sbGVjdGlvbigpOyB9Ci0JCi0JcHJvdGVjdGVkIEphdmFYTUlGYWN0b3J5SW1wbC5KYXZhWE1JUmVzb3VyY2UgcmVzb3VyY2U7IC8vRkIKLQlwcm90ZWN0ZWQgTGlzdCBleHRlbnNpb25zOwotCi1wdWJsaWMgSmF2YVJlZmxlY3Rpb25LZXkoTGlzdCBleHRlbnNpb25zLCBKYXZhWE1JRmFjdG9yeUltcGwuSmF2YVhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0gIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0gIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLX0KLS8vRkIgRU5ECi0KLS8qIAotICogQ3JlYXRlIGFuIEFycmF5VHlwZSBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVBcnJheVR5cGUoKQotICovCi1wdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZSgpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVBcnJheVR5cGUoKTsKLX0KLS8qIAotICogQ3JlYXRlIGEgSmF2YUNsYXNzIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2NyZWF0ZUphdmFDbGFzcygpCi0gKi8KLXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlSmF2YUNsYXNzKCkgewotCXJldHVybiBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUphdmFDbGFzcygpOwotfQotLyoqCi0gKiBDcmVhdGUgYSBkYXRhIHR5cGUgYW5kIHB1dCBpdCBpbiB0aGUgcHJpbWl0aXZlcyByZXNvdXJjZQotICovCi1wcm90ZWN0ZWQgRUNsYXNzaWZpZXIgZ2V0SmF2YURhdGFUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCUphdmFEYXRhVHlwZSByZXN1bHQgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUphdmFEYXRhVHlwZSgpOwotCXJlc3VsdC5zZXROYW1lKHR5cGVOYW1lKTsKLQkvLyAoKEludGVybmFsRU9iamVjdClyZXN1bHQpLmVTZXRJRCh0eXBlTmFtZSk7Ci0JLy9yZXN1bHQuZVNldFVVSUQoKFVVSUQpIG51bGwpOwotCS8vcmVzdWx0LnNldEVQYWNrYWdlKGdldFBhY2thZ2UoKSk7Ci0JZ2V0UGFja2FnZSgpLmdldEVDbGFzc2lmaWVycygpLmFkZChyZXN1bHQpOwotCXJlc291cmNlLnNldElEKHJlc3VsdCwgdHlwZU5hbWUpOwkKLQlyZXR1cm4gcmVzdWx0OwotfQotLyogCi0gKiBDcmVhdGUgYSBGaWVsZCBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVKYXZhRmllbGQoKQotICovCi1wdWJsaWMgRmllbGQgY3JlYXRlSmF2YUZpZWxkKCkgewotCXJldHVybiBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci19Ci0vKiAKLSAqIENyZWF0ZSBhIE1ldGhvZCBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVKYXZhTWV0aG9kKCkKLSAqLwotcHVibGljIE1ldGhvZCBjcmVhdGVKYXZhTWV0aG9kKCkgewotCXJldHVybiBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotfQotLyogCi0gKiBDcmVhdGUgYSBKYXZhUGFyYW1ldGVyIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2NyZWF0ZUphdmFQYXJhbWV0ZXIoKQotICovCi1wdWJsaWMgSmF2YVBhcmFtZXRlciBjcmVhdGVKYXZhUGFyYW1ldGVyKCkgewotCXJldHVybiBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLX0KLS8vRkIvKioKLS8vRkIgKiBPdmVycmlkZSB0byB0cnkgdG8gaW50cm9zcGVjdCBvYmplY3RzCi0vL0ZCICogdGhhdCBhcmVuJ3QgZm91bmQgdXNpbmcgdGhlIGRlZmF1bHQgbWVjaGFuaXNtLgotLy9GQiAqLwotLy9GQnB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLS8vRkIgCU9iamVjdCBqYXZhT2JqZWN0ID0gc3VwZXIuZ2V0KGtleSk7Ci0vL0ZCIAlpZiAoamF2YU9iamVjdCA9PSBudWxsKSB7Ci0vL0ZCIAkJamF2YU9iamVjdCA9IGdldE9iamVjdEZyb21FeHRlbnNpb25zKChTdHJpbmcpIGtleSk7Ci0vL0ZCIAkJaWYgKGphdmFPYmplY3QgPT0gbnVsbCkKLS8vRkIgCQkJamF2YU9iamVjdCA9IGdldEphdmFPYmplY3QoKFN0cmluZykga2V5KTsKLS8vRkIgCX0KLS8vRkIJcmV0dXJuIGphdmFPYmplY3Q7Ci0vL0ZCfQotCi0vL0ZCIEFEREVECi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNnZXQoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgewotCU9iamVjdCBqYXZhT2JqZWN0ID0gZ2V0T2JqZWN0RnJvbUV4dGVuc2lvbnMoa2V5KTsKLQlpZiAoamF2YU9iamVjdCA9PSBudWxsKQotCQlqYXZhT2JqZWN0ID0gZ2V0SmF2YU9iamVjdChrZXkpOwotCXJldHVybiBqYXZhT2JqZWN0OwotfQotLy9GQiBFTkQKLQotLyoKLSAqIEluc3RhbnRpYXRlIHRoZSBuYW1lZCBjbGFzcy4KLSAqIElmIHdlIG1ha2UgaXQgdG8gdGhpcyBwb2ludCwgdGhlIGNsYXNzIGhhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkIG9yIHJlZmxlY3RlZC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjZ2V0QXJyYXlUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBFQ2xhc3NpZmllciBnZXRBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JQXJyYXlUeXBlIGFycmF5VHlwZSA9IHRoaXMuY3JlYXRlQXJyYXlUeXBlKCk7Ci0JYXJyYXlUeXBlLnNldE5hbWUodHlwZU5hbWUpOwotCS8vICgoSW50ZXJuYWxFT2JqZWN0KWFycmF5VHlwZSkuZVNldElEKHR5cGVOYW1lKTsKLQkvL2FycmF5VHlwZS5lU2V0VVVJRCgoVVVJRCkgbnVsbCk7Ci0JaW50IHBvcyA9IC0xLCBicmFjZXMgPSAwOwotCWRvIHsKLQkJcG9zID0gdHlwZU5hbWUuaW5kZXhPZigiWyIsIHBvcysxKTsvLyROT04tTkxTLTEkCi0JCWlmIChwb3MgIT0gLTEpCi0JCQlicmFjZXMrKzsKLQl9IHdoaWxlIChwb3MgIT0gLTEpOwotCWFycmF5VHlwZS5zZXRBcnJheURpbWVuc2lvbnMoYnJhY2VzKTsKLQkvL2FycmF5VHlwZS5zZXRFUGFja2FnZShnZXRQYWNrYWdlKCkpOwotCWdldFBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcnMoKS5hZGQoYXJyYXlUeXBlKTsKLQlyZXNvdXJjZS5zZXRJRChhcnJheVR5cGUsIHR5cGVOYW1lKTsJCi0JcmV0dXJuIGFycmF5VHlwZTsKLX0KLS8qCi0gKiBJbnN0YW50aWF0ZSB0aGUgbmFtZWQgY2xhc3MuCi0gKiBJZiB3ZSBtYWtlIGl0IHRvIHRoaXMgcG9pbnQsIHRlaCBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGluc3RhbnRpYXRlZCBvciByZWZsZWN0ZWQuCi0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2dldEphdmFDbGFzcyhqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgRUNsYXNzaWZpZXIgZ2V0SmF2YUNsYXNzKFN0cmluZyB0eXBlTmFtZSkgewotCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSB0aGlzLmNyZWF0ZUphdmFDbGFzcygpOwotCWphdmFDbGFzcy5zZXROYW1lKHR5cGVOYW1lKTsKLQkvLyAoKEludGVybmFsRU9iamVjdClqYXZhQ2xhc3MpLmVTZXRJRChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkvL2phdmFDbGFzcy5lU2V0VVVJRCgoVVVJRCkgbnVsbCk7Ci0JLy8gamF2YUNsYXNzLnNldEVQYWNrYWdlKGdldFBhY2thZ2UoKSk7Ci0JZ2V0UGFja2FnZSgpLmdldEVDbGFzc2lmaWVycygpLmFkZChqYXZhQ2xhc3MpOwotCXJlc291cmNlLnNldElEKGphdmFDbGFzcywgdHlwZU5hbWUpOwotCXJldHVybiBqYXZhQ2xhc3M7Ci19Ci0vKiBHZXQgdGhlIEphdmEgRmFjdG9yeQotICovCi1wcm90ZWN0ZWQgc3RhdGljIEphdmFSZWZGYWN0b3J5IGdldEphdmFGYWN0b3J5KCkgewotCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0U7Ci19Ci0vKioKLSAqIFRoaXMgYWxsb3dzIGZvciB0aGUgZGlyZWN0IHJldHJpZXZhbCBvZiBmaWVsZHMgd2l0aCB0aGUgZm9sbG93aW5nIG5vdGF0aW9uOgotICogZmllbGQ6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vCi0gKiAKLSAqLwotcHJvdGVjdGVkIEZpZWxkIGdldEphdmFGaWVsZChTdHJpbmcga2V5VmFsdWUpIHsKLQlGaWVsZCByZXN1bHQgPSBudWxsOwotCVN0cmluZyBjbGFzc05hbWUsIG1lbWJlck5hbWU7Ci0JaW50IG1lbWJlckRlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQljbGFzc05hbWUgPSBrZXlWYWx1ZS5zdWJzdHJpbmcoMCwgbWVtYmVyRGVsaW1pdGVyKTsKLQltZW1iZXJOYW1lID0ga2V5VmFsdWUuc3Vic3RyaW5nKG1lbWJlckRlbGltaXRlciArIDEpOwotCUVDbGFzc2lmaWVyIGphdmFDbGFzcyA9IChFQ2xhc3NpZmllcikgcHJpbUdldChjbGFzc05hbWUpOwotCS8vIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBpbnN0YW50aWF0ZWQgdGhlIGNvbnRhaW5pbmcgY2xhc3MsIHRoZW4gZ28gZG8gaXQuCi0JaWYgKGphdmFDbGFzcyA9PSBudWxsKQotCQlqYXZhQ2xhc3MgPSBnZXRKYXZhVHlwZShjbGFzc05hbWUpOwotCWlmICgoamF2YUNsYXNzICE9IG51bGwpICYmICEoKEphdmFIZWxwZXJzKSBqYXZhQ2xhc3MpLmlzUHJpbWl0aXZlKCkpIHsKLQkJLy8gV2UgaGF2ZSBhIGNsYXNzLiBOb3cgd2UgbmVlZCB0byBmb3JjZSByZWZsZWN0aW9uLCB0aGlzIHdpbGwgY2F1c2UKLQkJLy8gdGhlIEphdmFSZWZsZWN0aW9uS2V5IHRvIGJlIHVwZGF0ZWQgYW5kIGhhdmUgdGhlIG1lbWJlciBhZGRlZCB0byB0aGUKLQkJLy8gbGlzdC4KLQkJKChKYXZhQ2xhc3MpIGphdmFDbGFzcykuZ2V0RmllbGRzKCk7Ci0JCS8vRkIgcmVzdWx0ID0gKEZpZWxkKSBzdXBlci5nZXQoa2V5VmFsdWUpOyAvLyBJdCBzaG91bGQgbm93IGJlIHJlZ2lzdGVyZWQuCi0JCXJlc3VsdCA9IChGaWVsZCkgcHJpbUdldChrZXlWYWx1ZSk7IC8vIEl0IHNob3VsZCBub3cgYmUgcmVnaXN0ZXJlZC4KLQkJCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJRmllbGQgdGVtcEZpZWxkID0gY3JlYXRlSmF2YUZpZWxkKCk7Ci0JCQl0ZW1wRmllbGQuc2V0TmFtZShtZW1iZXJOYW1lKTsKLQkJCS8vICgoSW50ZXJuYWxFT2JqZWN0KXRlbXBGaWVsZCkuZVNldElEKGtleVZhbHVlKTsKLQkJCS8vdGVtcEZpZWxkLmVTZXRVVUlEKChVVUlEKSBudWxsKTsKLQkJCSgoSmF2YUNsYXNzKSBqYXZhQ2xhc3MpLmdldEZpZWxkcygpLmFkZCh0ZW1wRmllbGQpOwotCQkJcmVzdWx0ID0gdGVtcEZpZWxkOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIFRoaXMgYWxsb3dzIGZvciB0aGUgcmV0cmlldmFsIG9mIG1ldGhvZHMgd2l0aCB0aGUgZm9sbG93aW5nIG5vdGF0aW9uOgotICogbWV0aG9kOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvb2ZvbygKLSAqIAotICovCi1wcm90ZWN0ZWQgTWV0aG9kIGdldEphdmFNZXRob2QoU3RyaW5nIGtleVZhbHVlKSB7Ci0JTWV0aG9kIHJlc3VsdCA9IG51bGw7Ci0JU3RyaW5nIGNsYXNzTmFtZSwgbWVtYmVyTmFtZTsKLQlpbnQgbWVtYmVyRGVsaW1pdGVyID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCWNsYXNzTmFtZSA9IGtleVZhbHVlLnN1YnN0cmluZygwLCBtZW1iZXJEZWxpbWl0ZXIpOwotCWludCBwYXJtRGVsaW1pdGVyID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX01FVEhPRF9QQVJNX0RFTElNSVRFUiwgbWVtYmVyRGVsaW1pdGVyKTsKLQltZW1iZXJOYW1lID0ga2V5VmFsdWUuc3Vic3RyaW5nKG1lbWJlckRlbGltaXRlciArIDEsIHBhcm1EZWxpbWl0ZXIpOwotCUVDbGFzc2lmaWVyIGphdmFDbGFzcyA9IChFQ2xhc3NpZmllcikgcHJpbUdldChjbGFzc05hbWUpOwotCS8vIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBpbnN0YW50aWF0ZWQgdGhlIGNvbnRhaW5pbmcgY2xhc3MsIHRoZW4gZ28gZG8gaXQuCi0JaWYgKGphdmFDbGFzcyA9PSBudWxsKQotCQlqYXZhQ2xhc3MgPSBnZXRKYXZhVHlwZShjbGFzc05hbWUpOwotCWlmICgoamF2YUNsYXNzICE9IG51bGwpICYmICEoKEphdmFIZWxwZXJzKSBqYXZhQ2xhc3MpLmlzUHJpbWl0aXZlKCkpIHsKLQkJLy8gV2UgaGF2ZSBhIGNsYXNzLiBOb3cgd2UgbmVlZCB0byBmb3JjZSByZWZsZWN0aW9uLCB0aGlzIHdpbGwgY2F1c2UKLQkJLy8gdGhlIEphdmFSZWZsZWN0aW9uS2V5IHRvIGJlIHVwZGF0ZWQgYW5kIGhhdmUgdGhlIG1lbWJlciBhZGRlZCB0byB0aGUKLQkJLy8gbGlzdC4KLQkJKChKYXZhQ2xhc3MpIGphdmFDbGFzcykuZ2V0TWV0aG9kcygpOwotCQlyZXN1bHQgPSAoTWV0aG9kKSBwcmltR2V0KGtleVZhbHVlKTsgLy8gSXQgc2hvdWxkIG5vdyBiZSByZWdpc3RlcmVkLgotCQkKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlNZXRob2QgdGVtcE1ldGhvZCA9IGNyZWF0ZUphdmFNZXRob2QoKTsKLQkJCXRlbXBNZXRob2Quc2V0TmFtZShtZW1iZXJOYW1lKTsKLQkJCXJlc291cmNlLnNldElEKHRlbXBNZXRob2QsIGtleVZhbHVlKTsKLQkJCSgoSmF2YUNsYXNzKSBqYXZhQ2xhc3MpLmdldE1ldGhvZHMoKS5hZGQodGVtcE1ldGhvZCk7Ci0JCQlyZXN1bHQgPSB0ZW1wTWV0aG9kOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNnZXRKYXZhT2JqZWN0KGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBFT2JqZWN0IGdldEphdmFPYmplY3QoU3RyaW5nIGtleVZhbHVlKSB7Ci0JRU9iamVjdCByZXN1bHQgPSBudWxsOwotCWludCBpbmRleCA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQlpZiAoaW5kZXggPiAwKSB7Ci0JCS8vIFRoZSByZWZlcmVuY2UgaXMgdG8gYSBtZW1iZXI6IGZpZWxkLCBtZXRob2QsIG9yIHBhcmFtZXRlci4KLQkJLy8gVGFrZSB0aGUgbW9zdCBzcGVjaWZpYyBjYXNlIGZpcnN0LCBhIHBhcmFtZXRlci4KLQkJLy8gT25seSBhIHBhcmFtZXRlciBzaG91bGQgY29udGFpbiB0aGUgbWV0aG9kSUQgdG8gcGFybUlEIGRlbGltaXRlci4KLQkJYm9vbGVhbiBpc1BhcmFtZXRlciA9IChrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfTUVUSE9ESURfUEFSTUlEX0RFTElNSVRFUiwgaW5kZXgpICE9IC0xKTsKLQkJaWYgKGlzUGFyYW1ldGVyKSB7Ci0JCQlyZXN1bHQgPSBnZXRKYXZhUGFyYW1ldGVyKGtleVZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRoZSB0YXJnZXQgaXMgYSBmaWVsZCBvciBtZXRob2QuIElmIGl0IGhhcyBhICIoIiwgdGhlbiBpdCBpcyBhIG1ldGhvZC4KLQkJCS8vIElmIGl0IGlzIG5vdCBmb3VuZCwgdGhlbiB3ZSB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBvYmplY3QuCi0JCQlpbnQgcGFybVN0YXJ0ID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX01FVEhPRF9QQVJNX0RFTElNSVRFUiwgaW5kZXgpOwotCQkJYm9vbGVhbiBpc0ZpZWxkID0gcGFybVN0YXJ0ID09IC0xOwotCQkJaWYgKGlzRmllbGQpIHsKLQkJCQlyZXN1bHQgPSBnZXRKYXZhRmllbGQoa2V5VmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBnZXRKYXZhTWV0aG9kKGtleVZhbHVlKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IGdldEphdmFUeXBlKGtleVZhbHVlKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBTZWUgaWYgdGhlIGV4dGVuc2lvbnMgY2FuIHJlc29sdmUgdGhpcyBmaXJzdC4KLSAqLwotcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3RGcm9tRXh0ZW5zaW9ucyhTdHJpbmcga2V5VmFsdWUpIHsKLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbikgaXRlci5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqID0gZXh0ZW5zaW9uLmdldE9iamVjdChrZXlWYWx1ZSwgdGhpcyk7Ci0JCQlpZiAob2JqICE9IG51bGwpCi0JCQkJcmV0dXJuIG9iajsKLQkJfQotCX0KLQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBUaGlzIGFsbG93cyBmb3IgdGhlIHJldHJpZXZhbCBvZiBwYXJhbWV0ZXJzIHdpdGggdGhlIGZvbGxvd2luZyBub3RhdGlvbjoKLSAqIHBhcmFtZXRlcjogamF2YTovY29tLmlibS5mb28jVGVzdC5mb29mb28oLWFyZzAKLSAqIAotICovCi1wcm90ZWN0ZWQgSmF2YVBhcmFtZXRlciBnZXRKYXZhUGFyYW1ldGVyKFN0cmluZyBrZXlWYWx1ZSkgewotCUphdmFQYXJhbWV0ZXIgcmVzdWx0ID0gbnVsbDsKLQlTdHJpbmcgcGFybU5hbWU7Ci0JaW50IG1lbWJlckRlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQlpbnQgcGFybURlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19NRVRIT0RJRF9QQVJNSURfREVMSU1JVEVSLCBtZW1iZXJEZWxpbWl0ZXIpOwotCXBhcm1OYW1lID0ga2V5VmFsdWUuc3Vic3RyaW5nKHBhcm1EZWxpbWl0ZXIgKyAxKTsKLQkvLyBnZXRNZXRob2QoKSB3aWxsIGZpbmQgb3IgY3JlYXRlIGEgbWV0aG9kCi0JTWV0aG9kIG1ldGhvZCA9IHRoaXMuZ2V0SmF2YU1ldGhvZChrZXlWYWx1ZS5zdWJzdHJpbmcocGFybURlbGltaXRlcikpOwotCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQlyZXN1bHQgPSBtZXRob2QuZ2V0UGFyYW1ldGVyKHBhcm1OYW1lKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlKYXZhUGFyYW1ldGVyIHRlbXBQYXJhbWV0ZXIgPSBjcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0JCQl0ZW1wUGFyYW1ldGVyLnNldE5hbWUocGFybU5hbWUpOwotCQkJLy8gKChJbnRlcm5hbEVPYmplY3QpdGVtcFBhcmFtZXRlcikuZVNldElEKGtleVZhbHVlKTsKLQkJCS8vIHRlbXBQYXJhbWV0ZXIuZVNldFVVSUQoKFVVSUQpIG51bGwpOwotCQkJbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQodGVtcFBhcmFtZXRlcik7Ci0JCQlyZXN1bHQgPSB0ZW1wUGFyYW1ldGVyOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNnZXRKYXZhVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgRUNsYXNzaWZpZXIgZ2V0SmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JaWYgKGlzUHJpbWl0aXZlKHR5cGVOYW1lKSkKLQkJcmV0dXJuIGdldEphdmFEYXRhVHlwZSh0eXBlTmFtZSk7Ci0JZWxzZSBpZiAoaXNBcnJheSh0eXBlTmFtZSkpCi0JCXJldHVybiBnZXRBcnJheVR5cGUodHlwZU5hbWUpOwotCWVsc2UgaWYgKGlzVmFsaWRKYXZhSWRlbnRpZmllcih0eXBlTmFtZSkpCi0JCXJldHVybiBnZXRKYXZhQ2xhc3ModHlwZU5hbWUpOwotCXJldHVybiBudWxsOwotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkSmF2YUlkZW50aWZpZXIoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JaWYgKHR5cGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydCh0eXBlTmFtZS5jaGFyQXQoMCkpKSB7Ci0JCQkvLyBTdGFydHMgd2l0aCBhIHZhbGlkIGphdmEgaWRlbnRpZmllciBjaGFyYWN0ZXIuCi0JCQkvLyBOb3cgc2VlIGlmIHRoZSByZXN0IGFyZSB2YWxpZC4KLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgdHlwZU5hbWUubGVuZ3RoKCk7IGkrKykgewotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHR5cGVOYW1lLmNoYXJBdChpKSkpCi0JCQkJCXJldHVybiBmYWxzZTsgLy8gTm90IHZhbGlkCi0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I3ByaW1HZXQoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIE9iamVjdCBwcmltR2V0KFN0cmluZyBrZXkpIHsKLQlyZXR1cm4gcmVzb3VyY2UucHJpbUdldEVPYmplY3Qoa2V5KTsKLX0KLXByb3RlY3RlZCBFUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCS8vRkIgcmV0dXJuIChFUGFja2FnZSkgc3VwZXIuZ2V0KEphdmFQYWNrYWdlLlBBQ0tBR0VfSUQpOwotCS8vIHJldHVybiAoRVBhY2thZ2UpIHJlc291cmNlLmdldEVPYmplY3QoSmF2YVBhY2thZ2UuUEFDS0FHRV9JRCk7IC8vRkIKLQkvL3JldHVybiAoRVBhY2thZ2UpIHJlc291cmNlLmdldEVPYmplY3QoSmF2YVBhY2thZ2UuUEFDS0FHRV9JRCk7IC8vRkIKLQlyZXR1cm4gKEVQYWNrYWdlKUVjb3JlVXRpbC5nZXRPYmplY3RCeVR5cGUocmVzb3VyY2UuZ2V0Q29udGVudHMoKSwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFUGFja2FnZSgpKTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEwLzQvMjAwMCA5OjU2OjUzIEFNKQotICovCi1wcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQcmltaXRpdmVzQ29sbGVjdGlvbigpIHsKLQlQUklNSVRJVkVTLmFkZChOX1ZPSUQpOwotCVBSSU1JVElWRVMuYWRkKE5fQk9PTEVBTik7Ci0JUFJJTUlUSVZFUy5hZGQoTl9CWVRFKTsKLQlQUklNSVRJVkVTLmFkZChOX0NIQVIpOwotCVBSSU1JVElWRVMuYWRkKE5fRE9VQkxFKTsKLQlQUklNSVRJVkVTLmFkZChOX0ZMT0FUKTsKLQlQUklNSVRJVkVTLmFkZChOX0lOVCk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9MT05HKTsKLQlQUklNSVRJVkVTLmFkZChOX1NIT1JUKTsKLX0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2lzQXJyYXkoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIGJvb2xlYW4gaXNBcnJheShTdHJpbmcgdHlwZU5hbWUpIHsKLQlyZXR1cm4gdHlwZU5hbWUuZW5kc1dpdGgoIltdIik7Ly8kTk9OLU5MUy0xJAotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvNC8yMDAwIDk6NTQ6MjMgQU0pCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBwYXJhbSB0eXBlTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXByaXZhdGUgYm9vbGVhbiBpc1ByaW1pdGl2ZShTdHJpbmcgdHlwZU5hbWUpIHsKLQlyZXR1cm4gUFJJTUlUSVZFUy5jb250YWlucyh0eXBlTmFtZSk7Ci19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVhNSUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmRhMzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVhNSUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFYTUlGYWN0b3J5SW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjM1ICQgCi0gKi8KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRmFjdG9yeUltcGw7Ci0KLS8qKgotICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIFJlc291cmNlIGZvciB0aGUgSmF2YSBwcm90b2NvbC4KLSAqIAotICogSXQgYWxsb3dzIGV4dGVuc2lvbnMgdG8gdGhlIHJlZmxlY3Rpb24ga2V5IHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBpdC4KLSAqIAotICogQ3JlYXRpb24gZGF0ZTogKDEwLzQvMjAwMCA4OjIyOjIzIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVhNSUZhY3RvcnlJbXBsIGV4dGVuZHMgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEphdmFYTUlGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX1NFUEVSQVRPUiA9ICI6LyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgTGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogSmF2YVhNSUZhY3RvcnlJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFYTUlGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlclJlZmxlY3Rpb25LZXlFeHRlbnNpb24oSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlleHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBleHRlbnNpb24pIHsKLQkJZXh0ZW5zaW9ucy5yZW1vdmUoZXh0ZW5zaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKYXZhUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB4bWl1cmksIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vIGNoYW5nZWQgdG8gYWxsb3cgYSB6ZXJvLWxlbmd0aCBwYWNrYWdlIG5hbWUgCi0JCS8vIGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mICJqYXZhOi8jaW50IiwgZXRjLgotCQlKYXZhUmVmRmFjdG9yeSBqZmFjID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFOwotCQlKYXZhUGFja2FnZSBwYWNrID0gamZhYy5jcmVhdGVKYXZhUGFja2FnZSgpOwotCQkvLyBOZWVkIHRvIGNyZWF0ZSBhbmQgYWRkIHNwZWNpYWwgSmF2YUZhY3RvcnkgZm9yIGluc3RhbnRpYXRpb24gdG8gd29yay4KLQkJSmF2YUZhY3RvcnlJbXBsIGZhY3QgPSBuZXcgSmF2YUZhY3RvcnlJbXBsKCk7Ci0JCXBhY2suc2V0RUZhY3RvcnlJbnN0YW5jZShmYWN0KTsKLQkJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gU3RhbmRhcmQgSmF2YSBwYWNrYWdlCi0JCQlwYWNrLnNldE5zUHJlZml4KHBhY2thZ2VOYW1lKTsKLQkJCXBhY2suc2V0TmFtZShwYWNrYWdlTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBQcmltaXRpdmUgcGFja2FnZQotCQkJcGFjay5zZXROc1ByZWZpeChKYXZhUGFja2FnZS5QUklNSVRJVkVfUEFDS0FHRV9OQU1FKTsKLQkJCXBhY2suc2V0TmFtZShKYXZhUGFja2FnZS5QUklNSVRJVkVfUEFDS0FHRV9OQU1FKTsKLQkJfQotCi0JCXBhY2suc2V0TnNVUkkoeG1pdXJpKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocGFjayk7Ci0JCSgoWE1JUmVzb3VyY2UpIHBhY2suZVJlc291cmNlKCkpLnNldElEKHBhY2ssIEphdmFQYWNrYWdlLlBBQ0tBR0VfSUQpOwotCX0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEphdmFYTUlSZXNvdXJjZSBleHRlbmRzIFhNSVJlc291cmNlSW1wbCB7Ci0JCXByb3RlY3RlZCBJSmF2YVJlZmxlY3Rpb25LZXkgcmVmbGVjdGlvbktleTsKLQotCQlwdWJsaWMgSmF2YVhNSVJlc291cmNlKFVSSSB1cmkpIHsKLQkJCXN1cGVyKHVyaSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRSZWZsZWN0aW9uS2V5KElKYXZhUmVmbGVjdGlvbktleSBrZXkpIHsKLQkJCXJlZmxlY3Rpb25LZXkgPSBrZXk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdHJ5IHsKLQkJCQlzdXBlci5sb2FkKG9wdGlvbnMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJfQotCQl9Ci0KLQkJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChTdHJpbmcgdXJpRnJhZ21lbnQpIHsKLQkJCUVPYmplY3QgcmVzdWx0ID0gc3VwZXIuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwgJiYgcmVmbGVjdGlvbktleSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gKEVPYmplY3QpIHJlZmxlY3Rpb25LZXkuZ2V0KHVyaUZyYWdtZW50KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBVc2VkIGJ5IEphdmFSZWZsZWN0aW9uS2V5IHRvIGxvb2sgZGlyZWN0bHkgaW50byBJRCB0YWJsZSB0byBieXBhc3MgYW4gaW5maW5pdGUgbG9vcC4gSXQgd2lsbCAKLQkJICogY2FsbCBoZXJlIGJlY2F1c2UgaXQgbWF5IG5vdCBvZiBmaXJzdCBiZWVuIGZvdW5kLCBidXQgdGhlbiBhZGRlZCwgc28gbm93IGlzIGZvdW5kLgotCQkgKiAKLQkJICogQHBhcmFtIHVyaUZyYWdtZW50Ci0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJRU9iamVjdCBwcmltR2V0RU9iamVjdChTdHJpbmcgdXJpRnJhZ21lbnQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRFT2JqZWN0KHVyaUZyYWdtZW50KTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjdXNlSURBdHRyaWJ1dGVzKCkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUlEQXR0cmlidXRlcygpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJSmF2YVhNSVJlc291cmNlIHJlc291cmNlID0gbmV3IEphdmFYTUlSZXNvdXJjZSh1cmkpOwotCQlyZXNvdXJjZS5zZXRSZWZsZWN0aW9uS2V5KG5ldyBKYXZhUmVmbGVjdGlvbktleShleHRlbnNpb25zLCByZXNvdXJjZSkpOwotCi0JCVN0cmluZyB1cmlTdHJpbmcgPSB1cmkudG9TdHJpbmcoKTsKLQkJY3JlYXRlSmF2YVBhY2thZ2Uoc3RyaXBTY2hlbWUodXJpU3RyaW5nKSwgdXJpU3RyaW5nLCByZXNvdXJjZSk7Ci0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpLnB1dChKYXZhWE1JRmFjdG9yeS5TQ0hFTUUsIEphdmFYTUlGYWN0b3J5LklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpcCB0aGUgdHJhaWxpbmcgaWRlbnRpZmllciwgaWYgYW55LCBmcm9tIHRoZSB1cmkuICBBbiBpZGVudGlmaWVyCi0JICogYmVnaW5zIHdpdGggIyBvciB8LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN0cmlwU2NoZW1lKFN0cmluZyB1cmkpIHsKLQkJaW50IGluZGV4ID0gdXJpLmluZGV4T2YoU0NIRU1BX1NFUEVSQVRPUik7Ci0JCWlmIChpbmRleCAhPSAtMSkKLQkJCXJldHVybiB1cmkuc3Vic3RyaW5nKGluZGV4ICsgU0NIRU1BX1NFUEVSQVRPUi5sZW5ndGgoKSwgdXJpLmxlbmd0aCgpKTsKLQkJZWxzZQotCQkJcmV0dXJuIHVyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVhZEFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVhZEFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmMDJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlYWRBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLSAqICAkUkNTZmlsZTogUmVhZEFkYXB0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogRXh0ZW5kZWQgQWRhcHRvciBpbnRlcmZhY2Ugd2hpY2ggYWRkcyBzdXBwb3J0IGZvciBhbiBhZGFwdGVyCi0gKiBwcm92aWRpbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIGF0dHJpYnV0ZXMuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0MToxOSBQTSkKLSAqIEBhdXRob3I6IFNjb3R0IFJpY2gKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkQWRhcHRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfS0VZID0gIkphdmFSZWZsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpOwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOyAvL0ZCCi19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVmbGVjdGlvbkFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVmbGVjdGlvbkFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlODM5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlZmxlY3Rpb25BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJlZmxlY3Rpb25BZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0vKioKLSAqIFJlZmxlY3Rpb25BZGFwdG9yIC0gYSByZWFkIGFkYXB0b3IgYmFzZSBpbXBsZW1lbnRhdGlvbiB3aGljaCBkb2VzIGEgYnVsawotICogCWxvYWQgb2YgcmVsZmxlY3RlZCB2YWx1ZXMgb24gdGhlIGZpcnN0IHJlcXVlc3QuCi0gKiAJU3ViY2xhc3NlcyBjYW4gb3B0aW1pemUgdG8gZGVmZXIgc29tZSBwcm9wZXJ0aWVzLgotICogCVByb3BlcnRpZXMgbWF5IGFsc28gYmUgZGVmZXJyZWQgYnkgc2V0dGluZyB0aGVpciB2YWx1ZXMgd2l0aCBwcm94eSByZWZlcmVuY2VzLAotICogCWZvciBleGFtcGxlLCBmb3Igc3VwZXJ0eXBlIGFuZCBvdGhlciByZWZlcmVuY2VkIHR5cGVzLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZsZWN0aW9uQWRhcHRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwgaW1wbGVtZW50cyBSZWFkQWRhcHRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUiA9ICcuJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIgPSAnKCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfTUVUSE9ESURfUEFSTUlEX0RFTElNSVRFUiA9ICctJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19QQVJNX1BBUk1fREVMSU1JVEVSID0gJywnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBQQVRIX0RFTElNSVRFUiA9ICcvJzsKLQkvLyBTVyBpZCBjb250YWlucyAmIGluIHhtbCBmaWxlIGNhc3VlcyBleGNlcHRpb24gdGhyb3cgZHVyaW5nIGxvYWQKLSAgICAgICAgLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU19DT05TVFJVQ1RPUl9UT0tFTiA9ICImViI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNfQ09OU1RSVUNUT1JfVE9LRU4gPSAiX1YiOy8vJE5PTi1OTFMtMSQgLy8gU1cKLQkvLyBjYWNoZSBhIHN0YXRpYyBlbXB0eSBTdHJpbmdbXSBmb3Igbm8gcGFybSBtZXRob2RzCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBlbXB0eVN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1swXTsKLQkKLQkKLQkvKioKLQkgKiBOb3RpZmljYXRpb24gZXZlbnQgdHlwZSBmb3Igc3BlY2lhbCBSZWZsZWN0aW9uIG5vdGlmaWNhdGlvbnMuIFRoaXMgd2lsbCBiZSB0aGUgZXZlbnQgdHlwZSBmb3IgdGhlIHNwZWNpYWwgb25lcywgbGlrZSBSRUZMRUNUSU9OX0VWRU5ULgotCSAqIFRoZSBsaXN0ZW5lciBzaG91bGQgbGlzdGVuIGZvciB0aGlzIGV2ZW50IHR5cGUsIGFuZCB0aGVuIGNoZWNrIHRoZSBmZWF0dXJlIGZvciB0aGUgdHlwZSBvZiBzcGVjaWFsIGV2ZW50IChsaWtlIFJFRkxFQ1RJT05fRVZFTlQpLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UID0gLTM0NTY7CS8vIFVzaW5nIGEgZnVubnkgbnVtYmVyIHRvIHRyeSB0byBlbGltaW5hdGUgY29uZmxpY3Rpb24gd2l0aCBhbnkgb3RoZXIgc3BlY2lhbHMgdGhhdCBtYXkgb2Ygb2NjdXIgZnJvbSBvdGhlciBjb2RlIG9uIHRoZSBKYXZhQ2xhc3MuCi0JCi0JLyoqCi0JICogU3BlY2lhbCBub3RpZmljYXRpb24gZXZlbnQgdHlwZS4gVGhpcyBpcyBzZW50IGFnYWluc3QgYSBKYXZhQ2xhc3MgKGFzIHRoZSB0YXJnZXQpIHdoZW5ldmVyIHJlZmxlY3Rpb24gb2NjdXJzLiBJdCB3aWxsIGJlCi0JICogc2VudCB1bmRlciB0aGUgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUgb2YgUkVGTEVDVElPTl9FVkVOVC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgUkVGTEVDVElPTl9FVkVOVCA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUF0dHJpYnV0ZSgpOwotCi0JLyoKLQkgKiBGaWxsIGluIHRoZSBuYW1lLiBOb3QgcmVhbGx5IG5lZWRlZCBidXQgaXQgd291bGQgYmUgbmljZS4KLQkgKi8KLQlzdGF0aWMge1JFRkxFQ1RJT05fRVZFTlQuc2V0TmFtZSgicmVmbGVjdFZhbHVlcyIpO30gLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc1JlZmxlY3RlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVmbGVjdGluZyA9IGZhbHNlOwotcHVibGljIFJlZmxlY3Rpb25BZGFwdG9yKCkgewotCXN1cGVyKCk7Ci19Ci1wdWJsaWMgUmVmbGVjdGlvbkFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0Jc3VwZXIoKTsKLQlzZXRUYXJnZXQodGFyZ2V0KTsKLX0KLS8qKgotICogSGVscGVyIG1ldGhvZCB0byBlbnN1cmUgZnVsbCBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFyZ2V0LiAgUmVxdWlyZWQKLSAqIGZvciBzZXJpYWxpemF0aW9uLgotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgZm9yY2VEZWZlcnJlZFJlYWRGb3IoRU9iamVjdCB0YXJnZXQpIHsKLQlSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yID0gcmV0cmlldmVBZGFwdG9yRnJvbSh0YXJnZXQpOwotCWlmIChhZGFwdG9yICE9IG51bGwpIHsKLQkJYWRhcHRvci5yZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci19Ci1wcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0VGFyZ2V0UmVzb3VyY2UoKSB7Ci0JaWYgKGdldFRhcmdldCgpICE9IG51bGwpCi0JCXJldHVybiAoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBnZXRUYXJnZXQoKSkuZVJlc291cmNlKCk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIEhlbHBlciBtZXRob2QgdG8gZmV0Y2ggdGhlIGFkYXB0b3IgZnJvbSB0aGUgb2JqZWN0LCBhbmQgaWYgaXQgZXhpc3RzLCBnZXQgdGhlIGFkYXB0ZWQKLSAqIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLiAgT3ZlcmxvYWRlZCBmb3IgbWFueS1zaWRlZCBhdHRyaWJ1dGVzIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgd291bGQKLSAqIG90aGVyd2lzZSBiZSBhbiBlbnVtZXJhdGlvbjsgaW4gdGhpcyBjYXNlIHdpbGwgcmV0dXJuIGFuIEFycmF5IGluc3RlYWQuIAotICovCi1wdWJsaWMgc3RhdGljIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwgRVJlZmVyZW5jZSBhdHRyaWJ1dGUpIHsJCi0vL0ZCCVJlZmxlY3Rpb25BZGFwdG9yIGFkYXB0b3IgPSByZXRyaWV2ZUFkYXB0b3JGcm9tKG9iamVjdCk7Ci0vL0ZCCWlmIChhZGFwdG9yICE9IG51bGwpCi0vL0ZCCQlyZXR1cm4gYWRhcHRvci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLS8vRkIJcmV0dXJuICgoSVJlYWRBZGFwdGFibGUpIG9iamVjdCkucHJpbVJlZlZhbHVlKGF0dHJpYnV0ZSk7Ci0JcmV0dXJuIG9iamVjdC5lR2V0KGF0dHJpYnV0ZSk7IC8vRkIKLQkKLX0KLS8qSGVscGVyIG1ldGhvZCB0byBmZXRjaCB0aGUgYWRhcHRvciBmcm9tIHRoZSBvYmplY3QsIGFuZCBpZiBpdCBleGlzdHMsIGdldCB0aGUgYWRhcHRlZAotICp2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4KLSAqLwotcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VmFsdWUoRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7CQotLy9GQglSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yID0gcmV0cmlldmVBZGFwdG9yRnJvbShvYmplY3QpOwotLy9GQglpZiAoYWRhcHRvciAhPSBudWxsKQotLy9GQgkJcmV0dXJuIGFkYXB0b3IuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0vL0ZCCXJldHVybiAoKElSZWFkQWRhcHRhYmxlKSBvYmplY3QpLnByaW1SZWZWYWx1ZShhdHRyaWJ1dGUpOwotCXJldHVybiBvYmplY3QuZUdldCgoRVN0cnVjdHVyYWxGZWF0dXJlKWF0dHJpYnV0ZSk7IC8vRkIKLX0KLS8qKgotICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotLy9GQglyZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLS8vRkIJcmV0dXJuICgoSVJlYWRBZGFwdGFibGUpIG9iamVjdCkucHJpbVJlZlZhbHVlKGF0dHJpYnV0ZSk7Ci0JcmV0dXJuIG9iamVjdC5lR2V0KChFU3RydWN0dXJhbEZlYXR1cmUpYXR0cmlidXRlKTsgLy9GQgotfQotLyoqCi0gKiBpc0FkYXB0b3JGb3JUeXBlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JcmV0dXJuICh0eXBlID09IFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLX0KLS8qKgotICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldAotICovCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCk7Ci0vKioKLSAqIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHJlZmxlY3Rpb24gaGFkIG9jY3VycmVkLgotICovCi1wdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkgewotCWlmICghaGFzUmVmbGVjdGVkICYmICFpc1JlZmxlY3RpbmcpIHsKLQkJdHJ5IHsKLQkJCWlzUmVmbGVjdGluZyA9IHRydWU7Ci0JCQlpZiAoISgoRU9iamVjdClnZXRUYXJnZXQoKSkuZUlzUHJveHkoKSkKLQkJCQloYXNSZWZsZWN0ZWQgPSByZWZsZWN0VmFsdWVzKCk7Ci0JCQllbHNlCi0JCQkJaGFzUmVmbGVjdGVkID0gZmFsc2U7CS8vIEFTIGxvbmcgd2UgYXJlIGEgcHJveHksIHdlIHdvbid0IHJlZmxlY3QuCi0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQloYXNSZWZsZWN0ZWQgPSBmYWxzZTsKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJbG9nZ2VyLmxvZyhSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGYWlsZWRfcmVmbGVjdGluZ192YWx1ZXNfRVJST1JfIiksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkID0gIkZhaWxlZCByZWZsZWN0aW5nIHZhbHVlcyEhISIKLQkJCQlsb2dnZXIubG9nV2FybmluZyhlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlzUmVmbGVjdGluZyA9IGZhbHNlOwotCQkJZ2V0VGFyZ2V0KCkuZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClnZXRUYXJnZXQoKSwgRVZFTlQsIFJFRkxFQ1RJT05fRVZFTlQsIG51bGwsIG51bGwsIE5vdGlmaWNhdGlvbi5OT19JTkRFWCkpOwotCQl9Ci0JfQotCXJldHVybiBoYXNSZWZsZWN0ZWQ7Ci19Ci1wdWJsaWMgc3RhdGljIFJlZmxlY3Rpb25BZGFwdG9yIHJldHJpZXZlQWRhcHRvckZyb20oRU9iamVjdCBvYmplY3QpIHsKLQlzeW5jaHJvbml6ZWQgKG9iamVjdCkgewotCQlyZXR1cm4gKFJlZmxlY3Rpb25BZGFwdG9yKUVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihvYmplY3QsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQl9Ci19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0pES0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0pES0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0MjNlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KREtBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7Ci0vKgotICogICRSQ1NmaWxlOiBKREtBZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKREtBZGFwdG9yIGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIHsKLQlwdWJsaWMgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXB1YmxpYyBKREtBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGFuQWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJc2V0QWRhcHRlckZhY3RvcnkoYW5BZGFwdGVyRmFjdG9yeSk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2RJRCAtIGdlbmVyYXRlIHRoZSB1bmlxdWUgSUQgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIGNvbnN0cnVjdG9yLgotCSAqIFNpbWlsYXIgdG8gYSBTaWduYXR1cmUsIGJ1dCBob3BlZnVsbHkgbW9yZSByZWFkYWJsZS4KLQkgKiBUaGUgbmFtZSBmb3JtYXQgd2lsbCBiZToKLQkgKiAJc2ltcGxlQ2xhc3NOYW1lLnNpbXBsZUNsYXNzTmFtZShjb20uZnJvbmsuUGFybVR5cGUxX3Bhcm1UeXBlMiZWCi0JICogTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aWdodGx5IGNvdXBsZWQgd2l0aCBSZWZsZWN0aW9uQWRhcHRlci5nZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoKS4KLQkgKgotCSAqIEl0IGhhcyB0byBiZSBkb25lIHNlcGFyYXRlbHkgZm9yIEpESyBiZWNhdXNlIENvbnN0cnVjdG9ycyBhbmQgTWV0aG9kcyBhcmUgZGlmZmVyZW50IGNsYXNzZXMuCi0JICogSG93ZXZlciwgaW4gdGhlIEphdmEgTW9kZWwgdGhleSBhcmUgYm90aCBqdXN0IE1ldGhvZHMgd2l0aCBhIGZsYWcgaW5kaWNhdGluZyBDb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kSUQoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgamRrQ29uc3RydWN0b3IpIHsKLQkJU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldFNpbXBsZU5hbWUoamRrQ29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOwotCQlvdXQuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCW91dC5hcHBlbmQoQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQkJb3V0LmFwcGVuZChjb21wdXRlTWV0aG9kTmFtZShqZGtDb25zdHJ1Y3RvcikpOwotCQlvdXQuYXBwZW5kKENfTUVUSE9EX1BBUk1fREVMSU1JVEVSKTsKLQkJQ2xhc3NbXSBwYXJtVHlwZXMgPSBqZGtDb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJb3V0LmFwcGVuZChwYXJtVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCWlmIChpIDwgcGFybVR5cGVzLmxlbmd0aCAtIDEpCi0JCQkJb3V0LmFwcGVuZChDX1BBUk1fUEFSTV9ERUxJTUlURVIpOwotCQl9Ci0JCW91dC5hcHBlbmQoU19DT05TVFJVQ1RPUl9UT0tFTik7IC8vSXQncyBhIGNvbnN0cnVjdG9yCi0JCXJldHVybiBvdXQudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZElEIC0gZ2VuZXJhdGUgdGhlIHVuaXF1ZSBJRCB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIFNpbWlsYXIgdG8gYSBTaWduYXR1cmUsIGJ1dCBob3BlZnVsbHkgbW9yZSByZWFkYWJsZS4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gcGFybXMsIGl0IHdpbGwgZW5kIHdpdGggYSAiKCIgc28gdGhhdCBpdCBjYW4gYmUgZGlzdGljdGl2ZSBmcm9tIGEgZmllbGQuCi0JICogVGhlIG5hbWUgZm9ybWF0IHdpbGwgYmU6Ci0JICogCXNpbXBsZUNsYXNzTmFtZS5tZXRob2ROYW1lKGNvbS5mcm9uay5QYXJtVHlwZTFfcGFybVR5cGUyCi0JICogTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aWdodGx5IGNvdXBsZWQgd2l0aCBSZWZsZWN0aW9uQWRhcHRlci5nZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kSUQoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGpka01ldGhvZCkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0U2ltcGxlTmFtZShqZGtNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOwotCQlvdXQuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCW91dC5hcHBlbmQoQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQkJb3V0LmFwcGVuZChjb21wdXRlTWV0aG9kTmFtZShqZGtNZXRob2QpKTsKLQkJb3V0LmFwcGVuZChDX01FVEhPRF9QQVJNX0RFTElNSVRFUik7Ci0JCUNsYXNzW10gcGFybVR5cGVzID0gamRrTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlvdXQuYXBwZW5kKHBhcm1UeXBlc1tpXS5nZXROYW1lKCkpOwotCQkJaWYgKGkgPCBwYXJtVHlwZXMubGVuZ3RoIC0gMSkKLQkJCQlvdXQuYXBwZW5kKENfUEFSTV9QQVJNX0RFTElNSVRFUik7Ci0JCX0KLQkJaWYgKGpka01ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoamRrTWV0aG9kLmdldE5hbWUoKSkpCi0JCQlvdXQuYXBwZW5kKFNfQ09OU1RSVUNUT1JfVE9LRU4pOyAvL0l0J3MgYSBjb25zdHJ1Y3RvcgotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2ROYW1lIC0gZ2VuZXJhdGUgdGhlIG5hbWUgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIGNvbnN0cnVjdG9yLgotCSAqIEZvciB0aGUgbW9tZW50LCBuYW1lcyBhcmUgc2ltcGxlLCBhbmQgVVVJRCdzIGFyZSBjb21wbGV4LgotCSAqCi0JICogSXQgaGFzIHRvIGJlIGRvbmUgc2VwYXJhdGVseSBmb3IgSkRLIGJlY2F1c2UgQ29uc3RydWN0b3JzIGFuZCBNZXRob2RzIGFyZSBkaWZmZXJlbnQgY2xhc3Nlcy4KLQkgKiBIb3dldmVyLCBpbiB0aGUgSmF2YSBNb2RlbCB0aGV5IGFyZSBib3RoIGp1c3QgTWV0aG9kcyB3aXRoIGEgZmxhZyBpbmRpY2F0aW5nIENvbnN0cnVjdG9yLiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kTmFtZShqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBqZGtDb25zdHJ1Y3RvcikgewotCQlyZXR1cm4gZ2V0U2ltcGxlTmFtZShqZGtDb25zdHJ1Y3Rvci5nZXROYW1lKCkpOyAvLyBDVE9SIG5hbWVzIGNvbWUgYmFjayBmdWxseS1xdWFsaWZpZWQgd2l0aCBwYWNrYWdlLgotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kTmFtZSAtIGdlbmVyYXRlIHRoZSBuYW1lIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogRm9yIHRoZSBtb21lbnQsIG5hbWVzIGFyZSBzaW1wbGUsIGFuZCBVVUlEJ3MgYXJlIGNvbXBsZXguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZE5hbWUoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGpka01ldGhvZCkgewotCQlyZXR1cm4gamRrTWV0aG9kLmdldE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YUZpZWxkIC0gaW5zdGFudGlhdGUgYSBKYXZhIEZpZWxkIGJhc2VkIG9uIHRoZSBwYXNzZWQgRmllbGQKLQkgKiBXZSBhcmUgZGVmZXJyaW5nIGZpZWxkIGNvbnRlbnRzIGFzc3VtaW5nIHRoYXQgaXRzIGFkYXB0b3Igd2lsbCByZWZsZWN0IGl0cyBkZXRhaWxzLgotCSAqLwotCXB1YmxpYyBGaWVsZCBjcmVhdGVKYXZhRmllbGQoamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgcmVmbGVjdGVkRmllbGQsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUZpZWxkIG5ld0ZpZWxkID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVGaWVsZCgpOwotCQluZXdGaWVsZC5zZXROYW1lKHJlZmxlY3RlZEZpZWxkLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRTaW1wbGVOYW1lKHJlZmxlY3RlZEZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJcmVzb3VyY2Uuc2V0SUQobmV3RmllbGQsIGNsYXNzTmFtZSArIENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUiArIHJlZmxlY3RlZEZpZWxkLmdldE5hbWUoKSk7Ci0JCXJldHVybiBuZXdGaWVsZDsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YU1ldGhvZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBNZXRob2QgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIFJlZmxlY3Rpb24gQ29uc3RydWN0b3IKLQkgKiBXZSBhcmUgZGVmZXJyaW5nIG1ldGhvZCBjb250ZW50cyBhc3N1bWluZyB0aGF0IGl0cyBhZGFwdG9yIHdpbGwgcmVmbGVjdCBpdHMgZGV0YWlscy4KLQkgKiBXZSBuZWVkIHRvIHN0b3JlIGVub3VnaCBpbmZvIGluIHRoZSBlbXB0eSBNZXRob2QgdG8gZmluZCBpdHMgSmF2YSBzb3VyY2UuCi0JICogVGhlIElEIHdpbGwgZXZlbnR1YWxseSBob2xkIGVub3VnaCBpbmZvIHRvIGlkZW50aWZ5IHRoZSBzb3VyY2UsIHNvIHdlIHVzZSBpdC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGNyZWF0ZUphdmFNZXRob2QoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgamRrQ29uc3RydWN0b3IsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZCBuZXdNZXRob2QgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotCQkvLyBXZSB1c2UgYSBzaW1wbGUgbmFtZSwgYnV0IGEgY29tcGxleCBJRCAKLQkJbmV3TWV0aG9kLnNldE5hbWUoY29tcHV0ZU1ldGhvZE5hbWUoamRrQ29uc3RydWN0b3IpKTsKLQkJcmVzb3VyY2Uuc2V0SUQobmV3TWV0aG9kLCBjb21wdXRlTWV0aG9kSUQoamRrQ29uc3RydWN0b3IpKTsKLQkJcmV0dXJuIG5ld01ldGhvZDsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YU1ldGhvZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBNZXRob2QgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIFJlZmxlY3Rpb24gTWV0aG9kCi0JICogV2UgYXJlIGRlZmVycmluZyBtZXRob2QgY29udGVudHMgYXNzdW1pbmcgdGhhdCBpdHMgYWRhcHRvciB3aWxsIHJlZmxlY3QgaXRzIGRldGFpbHMuCi0JICogV2UgbmVlZCB0byBzdG9yZSBlbm91Z2ggaW5mbyBpbiB0aGUgZW1wdHkgTWV0aG9kIHRvIGZpbmQgaXRzIEphdmEgc291cmNlLgotCSAqIFRoZSBJRCB3aWxsIGV2ZW50dWFsbHkgaG9sZCBlbm91Z2ggaW5mbyB0byBpZGVudGlmeSB0aGUgc291cmNlLCBzbyB3ZSB1c2UgaXQuCi0JICovCi0JcHVibGljIE1ldGhvZCBjcmVhdGVKYXZhTWV0aG9kKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBqZGtNZXRob2QsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZCBuZXdNZXRob2QgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotCQkvLyBXZSB1c2UgYSBzaW1wbGUgbmFtZSwgYnV0IGEgY29tcGxleCBJRCAKLQkJbmV3TWV0aG9kLnNldE5hbWUoY29tcHV0ZU1ldGhvZE5hbWUoamRrTWV0aG9kKSk7Ci0JCXJlc291cmNlLnNldElEKG5ld01ldGhvZCwgY29tcHV0ZU1ldGhvZElEKGpka01ldGhvZCkpOwotCQlyZXR1cm4gbmV3TWV0aG9kOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDExLzA3LzAwIDM6NDM6NTUgUE0pCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5KYXZhSkRLQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCXB1YmxpYyBDbGFzc0xvYWRlciBnZXRBbHRlcm5hdGVDbGFzc0xvYWRlcigpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXJGYWN0b3J5KCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JfQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogTWV0aG9kIHRvIGNvbnZlcnQgdGhlIHRleHR1YWwgZm9ybSBvZiBhIHByaW1pdGl2ZSB0eXBlIGludG8gaXRzIENsYXNzIG9iamVjdAotCSoKLQkqIEBwYXJhbSB0eXBlIFRoZSBwcmltaXRpdmUgdHlwZSdzIHRleHR1YWwgcmVwcmVzZW50YXRpb24KLQkqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0UHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZSkgewotCQlDbGFzcyBjID0gbnVsbDsKLQotCQlpZiAodHlwZS5lcXVhbHMoYnl0ZS5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gYnl0ZS5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhzaG9ydC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gc2hvcnQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBpbnQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMobG9uZy5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gbG9uZy5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhmbG9hdC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gZmxvYXQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoZG91YmxlLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBkb3VibGUuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gYm9vbGVhbi5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhjaGFyLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBjaGFyLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IHZvaWQuY2xhc3M7Ci0JCX0KLQotCQlyZXR1cm4gYzsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFzdCBzZWdtZW50IG9mIGEgJy4nLXNlcGFyYXRlZCBxdWFsaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm5zIHRoZSBnaXZlbiBuYW1lIGlmIGl0IGlzIG5vdCBxdWFsaWZpZWQuCi0JICogRm9yIGV4YW1wbGU6Ci0JICogPHByZT4KLQkgKiBnZXRTaW1wbGVOYW1lKCJqYXZhLmxhbmcuT2JqZWN0IikgLT4gIk9iamVjdCIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWludCBsYXN0RG90ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobGFzdERvdCA9PSAtMSkKLQkJCXJldHVybiBuYW1lOwotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpOwotCX0KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZShKYXZhSGVscGVycyBtb2RlbENsYXNzKSB7Ci0JCUNsYXNzIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChtb2RlbENsYXNzLmlzQXJyYXkoKSkgewotCQkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIG1vZGVsQ2xhc3M7Ci0JCQlDbGFzcyBjb21wb25lbnRDbGFzcyA9IGdldFR5cGUoYXJyYXlUeXBlLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpKTsKLQkJCXJlc3VsdCA9IChBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRDbGFzcywgbmV3IGludFthcnJheVR5cGUuZ2V0QXJyYXlEaW1lbnNpb25zKCldKSkuZ2V0Q2xhc3MoKTsKLQkJfSBlbHNlIGlmIChtb2RlbENsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXJlc3VsdCA9IGdldFR5cGUobW9kZWxDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gZ2V0VHlwZSgoKEphdmFDbGFzcykgbW9kZWxDbGFzcykuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIENsYXNzIGdldFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJLy8gVHJ5IGZvciBhIHByaW1pdGl2ZSB0eXBlICgiaW50IiwiY2hhciIsZXRjLikgZmlyc3QKLQkJQ2xhc3MgcHJpbVR5cGUgPSBnZXRQcmltaXRpdmVUeXBlKHF1YWxpZmllZE5hbWUpOwotCQlpZiAocHJpbVR5cGUgPT0gbnVsbCkgewotCQkJLy8gQ2hhbmdlZCBmb3IgZGVmZWN0ICMyMTIxNDcgYm90cEBhdXNhaXgxOS5hdXN0aW4uaWJtLmNvbUA3NjMwIHN5c3RlbS4KLQkJCS8vCi0JCQkvLyBTZWFyY2ggb25seSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2xvYWRlcnMgKHRoZSBmaXJzdCBvbmUgdGhhdCBleGlzdHMpIGluIHRoaXMgb3JkZXIuIElmIG5vdCBmb3VuZAotCQkJLy8gaW4gYSBjbGFzc2xvYWRlciwgaXQgd2lsbCBub3Qgcm9sbC1vdmVyIHRvIGFub3RoZXIgY2xhc3MgbG9hZGVyLiBUaGlzIGlzIHRvIGF2b2lkIHByb2JsZW1zIHdoZXJlIGEKLQkJCS8vIGNsYXNzIG1heSBleGlzdCBpbiBtb3JlIHRoYW4gb25lIGNsYXNzbG9hZGVyLiBZb3UgZ2V0IGVycm9ycyB3aGVuIHRoaXMgaGFwcGVucyBkdWUgdG8gb25lIGNsYXNzIHRoYXQKLQkJCS8vIHdhcyBmb3VuZCBpbiBvbmx5IG9uZSBjbGFzc2xvYWRlciB0aGF0IHJlZmVycyB0byBhbm90aGVyIGNsYXNzIHRoYXQgd2FzIGZvdW5kIGluIGJvdGggY2xhc3Nsb2FkZXJzLgotCQkJLy8gVGhleSBkb24ndCBtYXRjaCB3aGVuIHRyeWluZyB0byByZWZsZWN0IGxhdGVyLgotCQkJLy8gMSkgQWx0ZXJuYXRlIGNsYXNzbG9hZGVyIChpZiBleGlzdHMpCi0JCQkvLyAyKSBUaHJlYWQgY29udGV4dCBjbGFzc2xvYWRlciAoaWYgZXhpc3RzKQotCQkJLy8gMykgU3lzdGVtIGNsYXNzbG9hZGVyIChpZiBleGlzdHMpCi0JCQkvLyA0KSBDbGFzcy5mb3JOYW1lKCkuCi0JCQlpZiAoZ2V0QWx0ZXJuYXRlQ2xhc3NMb2FkZXIoKSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIGdldEFsdGVybmF0ZUNsYXNzTG9hZGVyKCkubG9hZENsYXNzKHF1YWxpZmllZE5hbWUpOwotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mMikgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUNsYXNzTG9hZGVyIGNvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCQlpZiAoY29udGV4dENsYXNzTG9hZGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gY29udGV4dENsYXNzTG9hZGVyLmxvYWRDbGFzcyhxdWFsaWZpZWROYW1lKTsKLQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDbGFzc0xvYWRlciBzeXN0ZW1DbGFzc0xvYWRlciA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7Ci0JCQlpZiAoc3lzdGVtQ2xhc3NMb2FkZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBzeXN0ZW1DbGFzc0xvYWRlci5sb2FkQ2xhc3MocXVhbGlmaWVkTmFtZSk7Ci0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShxdWFsaWZpZWROYW1lKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9IGVsc2UKLQkJCXJldHVybiBwcmltVHlwZTsKLQl9Ci0JLyoKLQkgKiBVdGlsaXR5IHJvdXRpbmUgdG8gcGFwZXIgb3ZlciBhcnJheSB0eXBlIG5hbWVzCi0JICogQm9ycm93ZWQgZnJvbSBhIHBhY2thZ2UtdmlzaWJpbGl0eSBoZWxwZXIgb24gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKENsYXNzIHR5cGUpIHsKLQkJaWYgKHR5cGUuaXNBcnJheSgpKSB7Ci0JCQl0cnkgewotCQkJCUNsYXNzIGNsID0gdHlwZTsKLQkJCQlpbnQgZGltZW5zaW9ucyA9IDA7Ci0JCQkJd2hpbGUgKGNsLmlzQXJyYXkoKSkgewotCQkJCQlkaW1lbnNpb25zKys7Ci0JCQkJCWNsID0gY2wuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCX0KLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJc2IuYXBwZW5kKGNsLmdldE5hbWUoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKLQkJCQkJc2IuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsgLypGQUxMVEhSVSovCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogTWV0aG9kIHRvIGNvbnZlcnQgdGhlIHRleHR1YWwgZm9ybSBvZiBhIHByaW1pdGl2ZSB0eXBlIGludG8gaXRzIENsYXNzIG9iamVjdAotCSoKLQkqIEBwYXJhbSB0eXBlIFRoZSBwcmltaXRpdmUgdHlwZSdzIHRleHR1YWwgcmVwcmVzZW50YXRpb24KLQkqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgcHJpbWl0aXZlRm9yTmFtZShTdHJpbmcgdHlwZSkgewotCQlDbGFzcyBjID0gbnVsbDsKLQotCQlpZiAodHlwZS5lcXVhbHMoYnl0ZS5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gYnl0ZS5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhzaG9ydC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gc2hvcnQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBpbnQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMobG9uZy5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gbG9uZy5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhmbG9hdC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gZmxvYXQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoZG91YmxlLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBkb3VibGUuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gYm9vbGVhbi5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhjaGFyLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBjaGFyLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IHZvaWQuY2xhc3M7Ci0JCX0KLQotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDExLzA3LzAwIDM6NDM6NTUgUE0pCi0JICogQHBhcmFtIG5ld0FkYXB0ZXJGYWN0b3J5IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFKREtBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KEphdmFKREtBZGFwdGVyRmFjdG9yeSBuZXdBZGFwdGVyRmFjdG9yeSkgewotCQlhZGFwdGVyRmFjdG9yeSA9IG5ld0FkYXB0ZXJGYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFDbGFzc0pES0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFDbGFzc0pES0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5MTZmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhQ2xhc3NKREtBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSmF2YUNsYXNzSkRLQWRhcHRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNCAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozNSAkIAotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFDbGFzc0FkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0vKioKLSAqIFJlZmxlY3QgdGhlIGNsYXNzIHVzaW5nIHN0YW5kYXJkIGphdmEucmVmbGVjdCBtZXRob2RzLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ2xhc3NKREtBZGFwdG9yIGV4dGVuZHMgSkRLQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhQ2xhc3NBZGFwdG9yIHsKLQotCXByb3RlY3RlZCBDbGFzcyBzb3VyY2VUeXBlID0gbnVsbDsKLQotCXB1YmxpYyBKYXZhQ2xhc3NKREtBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGFuQWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCBhbkFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRGaWVsZHMgLSByZWZsZWN0IG91ciBmaWVsZHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWVsZHMoKSB7Ci0JCVhNSVJlc291cmNlIHJlc291cmNlID0gKFhNSVJlc291cmNlKSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5lUmVzb3VyY2UoKTsKLQkJTGlzdCB0YXJnZXRGaWVsZHMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRGaWVsZHNHZW4oKTsKLQkJdGFyZ2V0RmllbGRzLmNsZWFyKCk7Ci0JCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkW10gZmllbGRzID0ge307Ci0JCXRyeSB7Ci0JCQlmaWVsZHMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZXJyb3IpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKAotCQkJCQkiQ291bGRfTm90X1JlZmxlY3RfRmllbGRzX0VSUk9SXyIsIG5ldyBPYmplY3RbXSB7IGdldEphdmFDbGFzc1RhcmdldCgpLmdldFF1YWxpZmllZE5hbWUoKSwgZXJyb3IuZ2V0TWVzc2FnZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCXRhcmdldEZpZWxkcy5hZGQoY3JlYXRlSmF2YUZpZWxkKGZpZWxkc1tpXSwgcmVzb3VyY2UpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZE1ldGhvZHMgLSByZWZsZWN0IG91ciBtZXRob2RzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kcygpIHsKLQkJLy8gV2UgbmVlZCB0byBmaXJzdCBkbyBtZXRob2RzIGFuZCB0aGVuIGRvIGNvbnN0cnVjdG9ycyBiZWNhdXNlIHRoZSBKREsgdHJlYXRzIHRoZW0gYXMgdHdvCi0JCS8vIGRpZmZlcmVudCBvYmplY3RzLCB3aGljaCB0aGUgSmF2YSBNb2RlbCB0cmVhdHMgdGhlbSBhcyBib3RoIE1ldGhvZCdzLgotCQlYTUlSZXNvdXJjZSByZXNvdXJjZSA9IChYTUlSZXNvdXJjZSkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZVJlc291cmNlKCk7Ci0JCUxpc3QgdGFyZ2V0TWV0aG9kcyA9IGdldEphdmFDbGFzc1RhcmdldCgpLmdldE1ldGhvZHNHZW4oKTsKLQkJdGFyZ2V0TWV0aG9kcy5jbGVhcigpOwotCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBtZXRob2RzID0ge307Ci0JCXRyeSB7Ci0JCQltZXRob2RzID0gZ2V0U291cmNlVHlwZSgpLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlcnJvcikgewotCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2coCi0JCQkJCQkJCVJlc291cmNlSGFuZGxlcgotCQkJCQkJCQkJCS5nZXRTdHJpbmcoCi0JCQkJCQkJCQkJCQkiQ291bGRfTm90X1JlZmxlY3RfTWV0aG9kc19FUlJPUl8iLCBuZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRRdWFsaWZpZWROYW1lKCksIGVycm9yLnRvU3RyaW5nKCl9KSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCXRhcmdldE1ldGhvZHMuYWRkKGNyZWF0ZUphdmFNZXRob2QobWV0aG9kc1tpXSwgcmVzb3VyY2UpKTsKLQkJfQotCi0JCS8vIE5vdyBkbyB0aGUgY29uc3RydWN0b3JzCi0JCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yW10gY3RvcnMgPSB7fTsKLQkJdHJ5IHsKLQkJCWN0b3JzID0gZ2V0U291cmNlVHlwZSgpLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7Ci0JCX0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGVycm9yKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZygKLQkJCQkJCQkJUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJCQkJCSJDb3VsZF9Ob3RfUmVmbGVjdF9Db25zdHJ1Y3RvcnNfRVJST1JfIiwgbmV3IE9iamVjdFtdIHsgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBlcnJvci5nZXRNZXNzYWdlKCl9KSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0YXJnZXRNZXRob2RzLmFkZChjcmVhdGVKYXZhTWV0aG9kKGN0b3JzW2ldLCByZXNvdXJjZSkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIGZpZWxkcyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoRmllbGRzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRGaWVsZHNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgaW1wbGVtZW50cyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoSW1wbGVtZW50cygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIG1ldGhvZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaE1ldGhvZHMoKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLmdldE1ldGhvZHNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaElubmVyQ2xhc3NlcygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hNb2RpZmllcnMoKSB7Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEFic3RyYWN0KGZhbHNlKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEZpbmFsKGZhbHNlKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldFB1YmxpYyhmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmbHVzaE1vZGlmaWVycygpOwotCQlyZXN1bHQgJj0gZmx1c2hTdXBlcigpOwotCQlyZXN1bHQgJj0gZmx1c2hJbXBsZW1lbnRzKCk7Ci0JCXJlc3VsdCAmPSBmbHVzaE1ldGhvZHMoKTsKLQkJcmVzdWx0ICY9IGZsdXNoRmllbGRzKCk7Ci0JCXJlc3VsdCAmPSBmbHVzaElubmVyQ2xhc3NlcygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI3Bvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGlzRXhpc3RpbmcpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuc2V0UmVmbGVjdGVkKGZhbHNlKTsKLQkJc3VwZXIucG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoaXNFeGlzdGluZyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzdXBlcnR5cGUgdG8gYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFN1cGVyKCkgewotCQlMaXN0IHRhcmdldFN1cGVycyA9IGdldEphdmFDbGFzc1RhcmdldCgpLnByaW1HZXRFU3VwZXJUeXBlcygpOwotCQl0YXJnZXRTdXBlcnMuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YXJnZXQgdHlwZWQgdG8gYSBKYXZhQ2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzc0ltcGwgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkgewotCQlyZXR1cm4gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKTsKLQl9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2hhc1JlZmxlY3Rpb25Tb3VyY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2VUeXBlICE9IG51bGw7Ci0gICAgfQotCi0JLyoqCi0JICogZ2V0U291cmNlVHlwZSAtIHJldHVybiB0aGUgamF2YS5sYW5nLkNsYXNzIHdoaWNoIGRlc2NyaWJlcyBvdXIgZXhpc3RpbmcgSmF2YSBjbGFzcwotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRTb3VyY2VUeXBlKCkgewotCQlpZiAoc291cmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlzb3VyY2VUeXBlID0gZ2V0VHlwZSgoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgaXMgbnVsbCBvciBpZiBpdCBpcyBhIGJpbmFyeSB0eXBlLiBSZWZsZWN0aW9uIGZyb20gdGhlIEpESyBpcyBhbHdheXMgZnJvbSBiaW5hcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTb3VyY2VUeXBlRnJvbUJpbmFyeSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldC4gb24gZW50cnk6IG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kCi0JICogZG9jdW1lbnQgbXVzdCBiZSBzZXQuIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwgSmF2YUNsYXNzIGFkYXB0b3I6IC0gc2V0IG1vZGlmaWVycyAtIHNldCBuYW1lIC0gc2V0IHJlZmVyZW5jZSB0byBzdXBlciAtIGNyZWF0ZSBtZXRob2RzIC0KLQkgKiBjcmVhdGUgZmllbGRzIC0gYWRkIGltcG9ydHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlzdXBlci5yZWZsZWN0VmFsdWVzKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0U291cmNlVHlwZSgpICE9IG51bGwpIHsKLQkJCQlzZXRNb2RpZmllcnMoKTsKLQkJCQlzZXROYW1pbmcoKTsKLQkJCQl0cnkgewotCQkJCQlzZXRTdXBlcigpOwotCQkJCX0gY2F0Y2ggKEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCX0KLQkJCQlzZXRJbXBsZW1lbnRzKCk7Ci0JCQkJYWRkTWV0aG9kcygpOwotCQkJCWFkZEZpZWxkcygpOwotCQkJCXJlZmxlY3RJbm5lckNsYXNzZXMoKTsKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLnJlZ2lzdGVyUmVmbGVjdGlvbihnZXRTb3VyY2VUeXBlKCkuZ2V0TmFtZSgpLCB0aGlzKTsKLQkJCQkvLwlhZGRJbXBvcnRzKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL0Rvbid0IGNhY2hlIHRoZSBjbGFzcyBiZXlvbmQgdGhlIG9wZXJhdGlvbiBvZiByZWZsZWN0IHZhbHVlczsKLQkJCS8vdGhpcyBlbmFibGVzIGR5bmFtaWMgc3dhcHBpbmcgb2YgdGhlIGFsdGVybmF0ZSBjbGFzcyBsb2FkZXIKLQkJCS8vZm9yIGphdmEgcmVmbGVjdGlvbiwgYXMgd2VsbCBhcyBhdm9pZHMgcG90ZW50aWFsIG1lbW9yeSBsZWFrYWdlCi0JCQlzb3VyY2VUeXBlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0SW5uZXJDbGFzc2VzKCkgewotCQlDbGFzc1tdIGlubmVyQ2xhc3NlcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRDbGFzc2VzKCk7Ci0JCWlmIChpbm5lckNsYXNzZXMubGVuZ3RoICE9IDApIHsKLQkJCUxpc3QgZGVjbGFyZWRDbGFzc2VzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCk7Ci0JCQlKYXZhQ2xhc3MgaW5uZXI7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRUYXJnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlubmVyQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCWlubmVyID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGlubmVyQ2xhc3Nlc1tpXS5nZXROYW1lKCksIHNldCk7Ci0JCQkJZGVjbGFyZWRDbGFzc2VzLmFkZChpbm5lcik7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHNldEltcGxlbWVudHMgLSBzZXQgb3VyIGltcGxlbWVudGVkL3N1cGVyIGludGVyZmFjZXMgaGVyZSBGb3IgYW4gaW50ZXJmYWNlLCB0aGVzZSBhcmUgc3VwZXJjbGFzc2VzLiBGb3IgYSBjbGFzcywgdGhlc2UgYXJlIGltcGxlbWVudGVkCi0JICogaW50ZXJmYWNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbXBsZW1lbnRzKCkgewotCQlDbGFzc1tdIGludGVyZmFjZXMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0SW50ZXJmYWNlcygpOwotCQkvLyBuZWVkcyB3b3JrLCB0aGUgbmFtZXMgYWJvdmUgd2lsbCBiZSBzaW1wbGUgbmFtZXMgaWYgd2UgYXJlIHJlbGZlY3RpbmcgZnJvbSBhIHNvdXJjZSBmaWxlCi0JCUphdmFDbGFzc0ltcGwgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCQlKYXZhQ2xhc3MgcmVmOwotCQlMaXN0IGludExpc3QgPSBqYXZhQ2xhc3NUYXJnZXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXNHZW4oKTsKLQkJaW50TGlzdC5jbGVhcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlZiA9IGNyZWF0ZUphdmFDbGFzc1JlZihpbnRlcmZhY2VzW2ldLmdldE5hbWUoKSk7Ci0JCQlpbnRMaXN0LmFkZChyZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0TW9kaWZpZXJzIC0gc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHJlbGF0ZWQgdG8gbW9kaWZpZXJzIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoKSB7Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEFic3RyYWN0KGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzQWJzdHJhY3QoZ2V0U291cmNlVHlwZSgpLmdldE1vZGlmaWVycygpKSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRGaW5hbChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0ZpbmFsKGdldFNvdXJjZVR5cGUoKS5nZXRNb2RpZmllcnMoKSkpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0UHVibGljKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHVibGljKGdldFNvdXJjZVR5cGUoKS5nZXRNb2RpZmllcnMoKSkpOwotCQkvLyBTZXQgdHlwZSB0byBjbGFzcyBvciBpbnRlcmZhY2UsIG5vdCB5ZXQgaGFuZGxpbmcgRVhDRVBUSU9OCi0JCWlmIChnZXRTb3VyY2VUeXBlKCkuaXNJbnRlcmZhY2UoKSkKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKTsKLQkJZWxzZQotCQkJamF2YUNsYXNzVGFyZ2V0LnNldEtpbmQoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCk7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtaW5nIC0gc2V0IHRoZSBuYW1pbmcgdmFsdWVzIGhlcmUgLSBxdWFsaWZpZWQgbmFtZSAocGFja2FnZSBuYW1lICsgbmFtZSkgbXVzdCBiZSBzZXQgZmlyc3QsIHRoYXQgaXMgdGhlIHBhdGggdG8gdGhlIHJlYWwgSmF2YSBjbGFzcyAtIElEIC0KLQkgKiBzaW1wbGUgbmFtZSwgaWRlbnRpdHkgd2l0aGluIGEgcGFja2FnZSBkb2N1bWVudCAtIE5PIFVVSUQhISEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1pbmcoKSB7Ci0JCS8vCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJLy8JamF2YUNsYXNzVGFyZ2V0LnJlZlNldFVVSUQoKFN0cmluZykgbnVsbCk7Ci0JCS8vCSgoWE1JUmVzb3VyY2UpamF2YUNsYXNzVGFyZ2V0LmVSZXNvdXJjZSgpKS5zZXRJRChqYXZhQ2xhc3NUYXJnZXQsZ2V0U2ltcGxlTmFtZShnZXRTb3VyY2VUeXBlKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogc2V0U3VwZXIgLSBzZXQgb3VyIHN1cGVydHlwZSBoZXJlLCBpbXBsZW1lbnRlZCBpbnRlcmZhY2UgYXJlIGhhbmRsZWQgc2VwYXJhdGVseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN1cGVyKCkgdGhyb3dzIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gewotCQlDbGFzcyBzdXBlckNsYXNzID0gbnVsbDsKLQkJc3VwZXJDbGFzcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRTdXBlcmNsYXNzKCk7Ci0JCWlmIChzdXBlckNsYXNzICE9IG51bGwpIHsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRTdXBlcnR5cGUoY3JlYXRlSmF2YUNsYXNzUmVmKHN1cGVyQ2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBjYW4gYmUgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc291cmNlVHlwZUV4aXN0cygpIHsKLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RGaWVsZHNJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RNZXRob2RzSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFGaWVsZEpES0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFGaWVsZEpES0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmYTZjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhRmllbGRKREtBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhRmllbGRKREtBZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRmllbGRKREtBZGFwdG9yIGV4dGVuZHMgSkRLQWRhcHRvciB7Ci0JcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHNvdXJjZUZpZWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ2xhc3MgcGFyZW50VHlwZSA9IG51bGw7Ci0JcHVibGljIEphdmFGaWVsZEpES0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBKYXZhSkRLQWRhcHRlckZhY3RvcnkgYW5BZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQsIGFuQWRhcHRlckZhY3RvcnkpOwotCX0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBDbGFzcyB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcwotCSAqIHdlJ3JlIGdvaW5nIHRvIGRvIHRoaXMgYSBsb3QsIHNvIGNhY2hlIGl0LgotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRQYXJlbnRUeXBlKCkgewotCQlpZiAocGFyZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlGaWVsZCB0YXJnZXRGaWVsZCA9IChGaWVsZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlKYXZhQ2xhc3MgcGFyZW50SmF2YUNsYXNzID0gdGFyZ2V0RmllbGQuZ2V0SmF2YUNsYXNzKCk7Ci0JCQlKYXZhQ2xhc3NKREtBZGFwdG9yIHBhID0gKEphdmFDbGFzc0pES0FkYXB0b3IpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHBhcmVudEphdmFDbGFzcy5lQWRhcHRlcnMoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJaWYgKHBhICE9IG51bGwpCi0JCQkJcGFyZW50VHlwZSA9IHBhLmdldFNvdXJjZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50VHlwZTsKLQl9Ci0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlRmllbGQoKTsKLQl9Ci0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2hhc1JlZmxlY3Rpb25Tb3VyY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2VGaWVsZCAhPSBudWxsOwotICAgIH0KLQkvKioKLQkgKiBnZXRTb3VyY2VGaWVsZCAtIHJldHVybiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgd2hpY2ggZGVzY3JpYmVzIG91ciBpbXBsZW1lbnRpbmcgZmllbGQKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZ2V0U291cmNlRmllbGQoKSB7Ci0JCWlmIChzb3VyY2VGaWVsZCA9PSBudWxsKSB7Ci0JCQlDbGFzcyBwYXJlbnQgPSB0aGlzLmdldFBhcmVudFR5cGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZUZpZWxkID0gcGFyZW50LmdldERlY2xhcmVkRmllbGQoKChGaWVsZCkgZ2V0VGFyZ2V0KCkpLmdldE5hbWUoKSk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBPSywgY2Fycnkgb24KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZUZpZWxkOwotCX0KLQlwdWJsaWMgRmllbGQgZ2V0VGFyZ2V0RmllbGQoKSB7Ci0JCXJldHVybiAoRmllbGQpIGdldFRhcmdldCgpOwotCX0KLQkvKioKLQkgKiBnZXRWYWx1ZUluIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLQkJLy8gQXQgdGhpcyBwb2ludCwgdGhpcyBhZGFwdGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGNvbXB1dGUgYW55IHZhbHVlcywKLQkJLy8gYWxsIHZhbHVlcyBhcmUgcHVzaGVkIGJhY2sgaW50byB0aGUgdGFyZ2V0IG9uIHRoZSBpbml0aWFsIGNhbGwuCi0JCXJldHVybiBzdXBlci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLQl9Ci0JLyoqCi0JICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldC4KLQkgKiBvbiBlbnRyeTogbmFtZSwgY29udGFpbmluZyBwYWNrYWdlIChhbmQgcXVhbGlmaWVkIG5hbWUpLCBhbmQgZG9jdW1lbnQgbXVzdCBiZSBzZXQuCi0JICogSmF2YUNsYXNzIGFkYXB0b3I6Ci0JICoJLSBzZXQgbW9kaWZpZXJzCi0JICoJLSBzZXQgbmFtZQotCSAqIAktIHNldCB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJaWYgKGdldFNvdXJjZUZpZWxkKCkgIT0gbnVsbCkgewotCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQlzZXRUeXBlKCk7Ci0JCQlzZXRJbml0aWFsaXplcklmUG9zc2libGUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogVXNlZCBmb3IgdGhlIHZlcnkgbmFycm93IGNhc2Ugb2YgZmluYWwgc3RhdGljIFN0cmluZ3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbml0aWFsaXplcklmUG9zc2libGUoKSB7Ci0JCWlmICghKGdldFRhcmdldEZpZWxkKCkuaXNTdGF0aWMoKSAmJiBnZXRUYXJnZXRGaWVsZCgpLmlzRmluYWwoKSAmJiAiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKCgoSmF2YUhlbHBlcnMpIGdldFRhcmdldEZpZWxkKCkuZ2V0RVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJdmFsdWUgPSAoU3RyaW5nKSBnZXRTb3VyY2VGaWVsZCgpLmdldChudWxsKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UKLQkJCXZhbHVlID0gIlwiIi5jb25jYXQodmFsdWUpLmNvbmNhdCgiXCIiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQlCbG9jayBhQmxvY2sgPSBjcmVhdGVCbG9jayhnZXRUYXJnZXRGaWVsZCgpLmdldE5hbWUoKSwgdmFsdWUpOwotCQlnZXRUYXJnZXRGaWVsZCgpLnNldEluaXRpYWxpemVyKGFCbG9jayk7Ci0JfQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlGaWVsZCBqYXZhRmllbGRUYXJnZXQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQkvLyBGb3IgSkRLIHJlZmxlY3Rpb24sIEkgZG9uJ3QgdGhpbmsgd2UgY2FuIHNldCB0aGUgaW5pdGlhbGl6ZXIKLQkJaW50IG1vZGlmaWVycyA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0TW9kaWZpZXJzKCk7Ci0JCWphdmFGaWVsZFRhcmdldC5zZXRTdGF0aWMoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSk7Ci0JCWphdmFGaWVsZFRhcmdldC5zZXRUcmFuc2llbnQoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNUcmFuc2llbnQobW9kaWZpZXJzKSk7Ci0JCWphdmFGaWVsZFRhcmdldC5zZXRWb2xhdGlsZShqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1ZvbGF0aWxlKG1vZGlmaWVycykpOwotCQlqYXZhRmllbGRUYXJnZXQuc2V0RmluYWwoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNGaW5hbChtb2RpZmllcnMpKTsKLQkJLy8gU2V0IHZpc2liaWxpdHkKLQkJaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpCi0JCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJZWxzZSBpZiAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykpCi0JCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEVfTElURVJBTCk7Ci0JCWVsc2UgaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykpCi0JCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRF9MSVRFUkFMKTsKLQkJZWxzZQotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciB0eXBlIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUeXBlKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZShnZXRTb3VyY2VGaWVsZCgpLmdldFR5cGUoKSk7Ci0JCXNldEZpZWxkVHlwZShnZXRUYXJnZXRGaWVsZCgpLCB0eXBlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUpES0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhSkRLQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwYjVlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhSkRLQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YUpES0FkYXB0ZXJGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8xMy8yMDAwIDE6MjA6MzEgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSkRLQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IHsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyOwotCS8qKgotCSAqIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSmF2YUpES0FkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQkvL2FkYXB0ZXJLZXkgPSBUWVBFX05BTUU7Ci0JfQotCS8qKgotCSAqIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSmF2YUpES0FkYXB0ZXJGYWN0b3J5KENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcikgewotCQl0aGlzKCk7Ci0JCXNldENvbnRleHRDbGFzc0xvYWRlcihhQ2xhc3NMb2FkZXIpOwotCX0KLQlwcm90ZWN0ZWQgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YUNsYXNzQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhQ2xhc3NKREtBZGFwdG9yKHRhcmdldCwgdGhpcyk7Ci0JfQotCXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhRmllbGRBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbmV3IEphdmFGaWVsZEpES0FkYXB0b3IodGFyZ2V0LCB0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFNZXRob2RBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbmV3IEphdmFNZXRob2RKREtBZGFwdG9yKHRhcmdldCwgdGhpcyk7Ci0JfQotCS8vIEZsdXNoIEFMTCBhZGFwdGVycywgd29yc3QgY2FzZQotCXB1YmxpYyB2b2lkIGZsdXNoQWxsKCkgewotCQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCQl0cnkgewotCQkJSXRlcmF0b3IgaSA9IHJlZmxlY3RlZC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKQotCQkJCSAoKEphdmFDbGFzc0pES0FkYXB0b3IpIGkubmV4dCgpKS5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCQl9Ci0JfQotCS8vIEZsdXNoIHRoZSBhZGFwdGVyIGZvciBhIHNvdXJjZSBvYmplY3QKLQlwdWJsaWMgdm9pZCBmbHVzaFJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSkgewotCQlKYXZhQ2xhc3NKREtBZGFwdG9yIGEgPSAoSmF2YUNsYXNzSkRLQWRhcHRvcikgcmVmbGVjdGVkLmdldChzb3VyY2UpOwotCQlpZiAoYSAhPSBudWxsKQotCQkJYS5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDcvMDAgMzozODoxMiBQTSkKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewotCQlyZXR1cm4gY29udGV4dENsYXNzTG9hZGVyOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDExLzA3LzAwIDM6Mzg6MTIgUE0pCi0JICogQHBhcmFtIG5ld0NvbnRleHRDbGFzc0xvYWRlciBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0Q2xhc3NMb2FkZXIoamF2YS5sYW5nLkNsYXNzTG9hZGVyIG5ld0NvbnRleHRDbGFzc0xvYWRlcikgewotCQljb250ZXh0Q2xhc3NMb2FkZXIgPSBuZXdDb250ZXh0Q2xhc3NMb2FkZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YU1ldGhvZEpES0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFNZXRob2RKREtBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjJmYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YU1ldGhvZEpES0FkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkazsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFNZXRob2RKREtBZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzUgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhTWV0aG9kQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLk1ldGhvZEltcGw7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFNZXRob2RKREtBZGFwdG9yIGV4dGVuZHMgSkRLQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhTWV0aG9kQWRhcHRlciB7Ci0JcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Qgc291cmNlQWNjZXNzaWJsZSA9IG51bGw7IC8vIENvdWxkIGJlIG1ldGhvZCBvciBjdG9yLgotCXByb3RlY3RlZCBDbGFzcyBwYXJlbnRUeXBlID0gbnVsbDsKLQkvLyBjYWNoZSBhIHN0YXRpYyBlbXB0eSBDbGFzc1tdIGZvciBubyBwYXJtIG1ldGhvZHMKLQlwcm90ZWN0ZWQgc3RhdGljIENsYXNzW10gZW1wdHlDbGFzc0FycmF5ID0gbmV3IENsYXNzWzBdOwotCS8vIGNhY2hlIGEgc3RhdGljIGVtcHR5IFN0cmluZ1tdLCB0b28KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGVtcHR5U3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCXB1YmxpYyBKYXZhTWV0aG9kSkRLQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIEphdmFKREtBZGFwdGVyRmFjdG9yeSBhbkFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHRhcmdldCwgYW5BZGFwdGVyRmFjdG9yeSk7Ci0JfQotCS8qKgotCSAqIGFkZEV4Y2VwdGlvbnMgLSByZWZsZWN0IG91ciBleGNlcHRpb24gbGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4Y2VwdGlvbnMoKSB7Ci0JCUNsYXNzW10gZXhjZXB0aW9ucyA9Ci0JCQkoZ2V0U291cmNlQWNjZXNzaWJsZSgpIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCQkJCT8gKChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0RXhjZXB0aW9uVHlwZXMoKQotCQkJCTogKChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRFeGNlcHRpb25UeXBlcygpOwotCQkvLwlFTGlzdCBleExpc3QgPSAoRUxpc3QpIGphdmFNZXRob2RUYXJnZXQucHJpbVJlZlZhbHVlKEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RfSmF2YUV4Y2VwdGlvbnMoKSk7Ci0JCUxpc3QgZXhMaXN0ID0gZ2V0TWV0aG9kVGFyZ2V0KCkuZ2V0SmF2YUV4Y2VwdGlvbnNHZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlleExpc3QuYWRkKGNyZWF0ZUphdmFDbGFzc1JlZihleGNlcHRpb25zW2ldLmdldE5hbWUoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEltcGwgZ2V0TWV0aG9kVGFyZ2V0KCkgewotCQlyZXR1cm4gKE1ldGhvZEltcGwpIGdldFRhcmdldCgpOwotCX0KLQkvKioKLQkgKiBhZGRQYXJhbWV0ZXJzIC0gcmVmbGVjdCBvdXIgcGFybXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbWV0ZXJzKCkgewotCQlDbGFzc1tdIHBhcm1UeXBlcyA9Ci0JCQkoZ2V0U291cmNlQWNjZXNzaWJsZSgpIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCQkJCT8gKChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0UGFyYW1ldGVyVHlwZXMoKQotCQkJCTogKChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlNZXRob2RJbXBsIGphdmFNZXRob2RUYXJnZXQgPSBnZXRNZXRob2RUYXJnZXQoKTsKLQkJLy8gCUxpc3QgcExpc3QgPSAoTGlzdCkgamF2YU1ldGhvZFRhcmdldC5wcmltUmVmVmFsdWUoSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZF9QYXJhbWV0ZXJzKCkpOwotCQlMaXN0IHBMaXN0ID0gamF2YU1ldGhvZFRhcmdldC5nZXRQYXJhbWV0ZXJzR2VuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwTGlzdC5hZGQoY3JlYXRlSmF2YVBhcmFtZXRlcihqYXZhTWV0aG9kVGFyZ2V0LCAiYXJnIiArIGksIGdldFR5cGVOYW1lKHBhcm1UeXBlc1tpXSkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpIHsKLQkJcmV0dXJuICgoTWV0aG9kKSBnZXRUYXJnZXQoKSkuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCX0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBDbGFzcyB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcwotCSAqIHdlJ3JlIGdvaW5nIHRvIGRvIHRoaXMgYSBsb3QsIHNvIGNhY2hlIGl0LgotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRQYXJlbnRUeXBlKCkgewotCQlpZiAocGFyZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlNZXRob2QgdGFyZ2V0TWV0aG9kID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlKYXZhQ2xhc3MgcGFyZW50SmF2YUNsYXNzID0gdGFyZ2V0TWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJCUphdmFDbGFzc0pES0FkYXB0b3IgcGEgPSAoSmF2YUNsYXNzSkRLQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocGFyZW50SmF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQlpZiAocGEgIT0gbnVsbCkKLQkJCQlwYXJlbnRUeXBlID0gcGEuZ2V0U291cmNlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBwYXJlbnRUeXBlOwotCX0KLQkvKioKLQkgKiBnZXRQYXJtVHlwZVNpZ25hdHVyZXMgLSByZXR1cm4gYW4gYXJyYXkgb2YgQ2xhc3NlcyBmb3Igb3VyIHBhcmFtZXRlciB0eXBlcwotCSAqIAlGb3IgcmVmbGVjdGlvbiBwdXJwb3Nlcywgd2UgY2FuIG9ubHkgcmVseSBvbiBvdXIgSUQsIHNpbmNlIG91ciBwYXJtcyBtYXkKLQkgKiAgbm90IHlldCBiZSBrbm93bi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NbXSBnZXRQYXJtVHlwZXMoKSB7Ci0JCU1ldGhvZCBqYXZhTWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCVN0cmluZyBpZCA9ICgoWE1JUmVzb3VyY2UpIGphdmFNZXRob2RUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKGphdmFNZXRob2RUYXJnZXQpOwotCQlTdHJpbmdbXSB0eXBlTmFtZXMgPSBnZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoaWQpOwotCQlpZiAodHlwZU5hbWVzID09IG51bGwpCi0JCQlyZXR1cm4gZW1wdHlDbGFzc0FycmF5OwotCQlpbnQgbiA9IHR5cGVOYW1lcy5sZW5ndGg7Ci0JCWlmIChuID09IDApCi0JCQlyZXR1cm4gZW1wdHlDbGFzc0FycmF5OwotCQlDbGFzc1tdIHR5cGVzID0gbmV3IENsYXNzW25dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotCQkJdHlwZXNbaV0gPSBnZXRUeXBlKHR5cGVOYW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VBY2Nlc3NpYmxlKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgeyAKLSAgICAgICAgcmV0dXJuIHNvdXJjZUFjY2Vzc2libGUgIT0gbnVsbDsKLSAgICB9Ci0JLyoqCi0JICogZ2V0c291cmNlTWV0aG9kIC0gcmV0dXJuIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Qgd2hpY2ggZGVzY3JpYmVzIG91ciBpbXBsZW1lbnRpbmcgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QgZ2V0U291cmNlQWNjZXNzaWJsZSgpIHsKLQkJaWYgKHNvdXJjZUFjY2Vzc2libGUgPT0gbnVsbCkgewotCQkJQ2xhc3MgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnRUeXBlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlDbGFzc1tdIHBhcm1UeXBlcyA9IHRoaXMuZ2V0UGFybVR5cGVzKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc291cmNlQWNjZXNzaWJsZSA9IHBhcmVudC5nZXREZWNsYXJlZE1ldGhvZCgoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLmdldE5hbWUoKSwgcGFybVR5cGVzKTsKLQkJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCQkvLyBPSywgY2FuJ3QgcmVmbGVjdCBpdAotCQkJCX0KLQotCQkJCWlmIChzb3VyY2VBY2Nlc3NpYmxlID09IG51bGwpIHsKLQkJCQkJLy8gSXQgd2Fzbid0IGEgbWV0aG9kLCB0cnkgZm9yIGNvbnN0cnVjdG9yLgotCQkJCQl0cnkgewotCQkJCQkJc291cmNlQWNjZXNzaWJsZSA9IHBhcmVudC5nZXREZWNsYXJlZENvbnN0cnVjdG9yKHBhcm1UeXBlcyk7Ci0JCQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBPSywgY2FuJ3QgcmVmbGVjdCBpdAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VBY2Nlc3NpYmxlOwotCX0KLQkvKioKLQkgKiBnZXRWYWx1ZUluIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLQkJLy8gQXQgdGhpcyBwb2ludCwgdGhpcyBhZGFwdGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGNvbXB1dGUgYW55IHZhbHVlcywKLQkJLy8gYWxsIHZhbHVlcyBhcmUgcHVzaGVkIGJhY2sgaW50byB0aGUgdGFyZ2V0IG9uIHRoZSBpbml0aWFsIGNhbGwuCi0JCXJldHVybiBzdXBlci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLQl9Ci0JLyoqCi0JICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldC4KLQkgKiBvbiBlbnRyeTogVVVJRCwgbmFtZSwgY29udGFpbmluZyBwYWNrYWdlIChhbmQgcXVhbGlmaWVkIG5hbWUpLCBhbmQgZG9jdW1lbnQgbXVzdCBiZSBzZXQuCi0JICogTWV0aG9kIGFkYXB0b3I6Ci0JICoJLSBzZXQgbW9kaWZpZXJzCi0JICoJLSBzZXQgbmFtZQotCSAqIAktIHNldCByZXR1cm4gdHlwZQotCSAqIAktIGFkZCBwYXJhbWV0ZXJzCi0JICogCS0gYWRkIGV4Y2VwdGlvbnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlpZiAoZ2V0U291cmNlQWNjZXNzaWJsZSgpICE9IG51bGwpIHsKLQkJCSgoTWV0aG9kKSBnZXRUYXJnZXQoKSkuc2V0SXNHZW5lcmF0ZWQoZmFsc2UpOwotCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQlzZXROYW1pbmcoKTsKLQkJCXNldFJldHVyblR5cGUoKTsKLQkJCWFkZFBhcmFtZXRlcnMoKTsKLQkJCWFkZEV4Y2VwdGlvbnMoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyI3JlZmxlY3RHZW5lcmF0ZWRJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RQYXJhbU5hbWVzSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogc2V0TW9kaWZpZXJzIC0gc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHJlbGF0ZWQgdG8gbW9kaWZpZXJzIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoKSB7Ci0JCU1ldGhvZCBtZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJaW50IG1vZGlmaWVycyA9Ci0JCQkoZ2V0U291cmNlQWNjZXNzaWJsZSgpIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCQkJCT8gKChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0TW9kaWZpZXJzKCkKLQkJCQk6ICgoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0TW9kaWZpZXJzKCk7Ci0JCW1ldGhvZFRhcmdldC5zZXRBYnN0cmFjdChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0Fic3RyYWN0KG1vZGlmaWVycykpOwotCQltZXRob2RUYXJnZXQuc2V0RmluYWwoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNGaW5hbChtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldE5hdGl2ZShqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc05hdGl2ZShtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldFN0YXRpYyhqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0YXRpYyhtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldFN5bmNocm9uaXplZChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N5bmNocm9uaXplZChtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldENvbnN0cnVjdG9yKGdldFNvdXJjZUFjY2Vzc2libGUoKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yKTsKLQkJLy8gU2V0IHZpc2liaWxpdHkKLQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJaWYgKChqYXZhQ2xhc3MuZ2V0S2luZCgpID09IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKSB8fCAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkpCi0JCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJZWxzZSBpZiAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykpCi0JCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEVfTElURVJBTCk7Ci0JCWVsc2UgaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykpCi0JCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRF9MSVRFUkFMKTsKLQkJZWxzZQotCQkJLy9WaXNpYmlsaXR5IG11c3QgYmUgcGFja2FnZQotCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCX0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZQotCSAqIAktIHF1YWxpZmllZCBuYW1lIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MKLQkgKgktIElECi0JICogCS0gbmFtZS1iYXNlZCBVVUlECi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtaW5nKCkgewotCQkvLwotCQkvLwluYW1pbmcgaXMgY3VycmVudGx5IGEgbm8tb3Agc2luY2UgdGhlIG5hbWUgYW5kIFVVSUQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gcmVmbGVjdGlvbgotCQkvLwkuLi5hbmQgSUQgaXMgcmVkdW5kYW50IHdpdGggVVVJRC4KLQkJLy8JamF2YUZpZWxkVGFyZ2V0LnNldElEKHBhcmVudC5nZXRRdWFsaWZpZWROYW1lKCkgKyAiXyIgKyBqYXZhRmllbGRUYXJnZXQuZ2V0TmFtZSgpKTsKLQl9Ci0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgcmV0dXJuIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJldHVyblR5cGUoKSB7Ci0JCWlmIChnZXRTb3VyY2VBY2Nlc3NpYmxlKCkgaW5zdGFuY2VvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIHsKLQkJCUNsYXNzIHR5cGUgPSAoKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlNZXRob2QgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQkJLyoKLQkJCQkJSmF2YVBhcmFtZXRlciBuZXdQYXJhbWV0ZXIgPSBjcmVhdGVKYXZhUGFyYW1ldGVyKGphdmFNZXRob2RUYXJnZXQsICJyZXN1bHQiLCBnZXRUeXBlTmFtZSh0eXBlKSk7Ly8kTk9OLU5MUy0xJAotCQkJCQluZXdQYXJhbWV0ZXIuc2V0UGFyYW1ldGVyS2luZChNZXRhSmF2YVBhcmFtZXRlcktpbmQuUkVUVVJOKTsKLQkJCQkJamF2YU1ldGhvZFRhcmdldC5nZXRQYXJhbWV0ZXJzKCkuYWRkKG5ld1BhcmFtZXRlcik7Ci0JCQkqLwotCQkJamF2YU1ldGhvZFRhcmdldC5zZXRFVHlwZShjcmVhdGVKYXZhQ2xhc3NSZWYoZ2V0VHlwZU5hbWUodHlwZSkpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvbmxzL1Jlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9ubHMvUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZWY2ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9ubHMvUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5sczsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJlc291cmNlSGFuZGxlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotcHVibGljIGNsYXNzIFJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImphdmFhZGFwdGVycyIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nLCBTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0JCQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JdHJ5IHtyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHtyZXR1cm4gZ2V0U3RyaW5nKGtleSk7fQotCi19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYmVhbmluZm8vSUludHJvc3BlY3Rpb25BZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2JlYW5pbmZvL0lJbnRyb3NwZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWVmMGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYmVhbmluZm8vSUludHJvc3BlY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogSUludHJvc3BlY3Rpb25BZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBCZWFuaW5mbyBhZGFwdGVyLiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gKiBpcyBpbiBhIHNlcGFyYXRlIHByb2plY3Qgc28gdGhhdCBiZWFuaW5mbyBjb2RlIHdpbGwgbm90IGJlIGxvYWRlZAotICogdW5sZXNzIGl0IG5lZWRzIHRvIGJlLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUludHJvc3BlY3Rpb25BZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX0tFWSA9IElJbnRyb3NwZWN0aW9uQWRhcHRlci5jbGFzczsKLQlwdWJsaWMgdm9pZCBpbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsKLQlwdWJsaWMgYm9vbGVhbiBpc1N0YWxlKCk7Ci0JcHVibGljIEVMaXN0IGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKTsKLQlwdWJsaWMgQmFzaWNFTGlzdCBnZXRFQWxsT3BlcmF0aW9ucygpOwotCXB1YmxpYyBFTGlzdCBnZXRFdmVudHMoKTsKLQlwdWJsaWMgRUxpc3QgZ2V0QWxsRXZlbnRzKCk7Ci0JcHVibGljIEVMaXN0IGdldEFsbFByb3BlcnRpZXMoKTsJCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbml0L0phdmFJbml0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luaXQvSmF2YUluaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjNjhhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luaXQvSmF2YUluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFJbml0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhWE1JRmFjdG9yeUltcGw7Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgSmF2YSBSZWZsZWN0aW9uIG1lY2hhbmlzbXMuIAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUluaXQgewotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBwbHVnaW5faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgewotCQlpbml0KHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KGJvb2xlYW4gc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykgewotCQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQlpZiAoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykgewotCQkJCXByZVJlZ2lzdGVyUGFja2FnZXMoKTsKLQkJCQlzZXREZWZhdWx0UmVzb3VyY2VGYWN0b3J5KCk7Ci0JCQl9Ci0JCQkvL1JlZ2lzdGVyIHJlc291cmNlIGZhY3RvcnkKLQkJCUphdmFYTUlGYWN0b3J5SW1wbC5yZWdpc3RlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVSZWdpc3RlclBhY2thZ2VzKCkgewotCQkvL2Vjb3JlCi0JCWlmICghRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuY29udGFpbnNLZXkoImVjb3JlLnhtaSIpKSAvLyROT04tTkxTLTEkCi0JCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoImVjb3JlLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL2phdmEKLQkJaWYgKCFFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5jb250YWluc0tleSgiamF2YS54bWkiKSkgLy8kTk9OLU5MUy0xJAotCQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KCJqYXZhLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2VGYWN0b3J5KCkgewotCQkvL1RoaXMgaXMgbm90IGRvbmUgb3V0c2lkZSBvZiBFY2xpcHNlCi0JCWlmIChSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLmdldChSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OKSA9PSBudWxsKQotCQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoCi0JCQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTiwKLQkJCQluZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGx1Z2luSW5pdChib29sZWFuIGJQbHVnaW5Jbml0KSB7Ci0JCS8vIEhlcmUncyB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdvdWxkIGJlIHJlYWQuCi0JCXBsdWdpbl9pbml0aWFsaXplZCA9IGJQbHVnaW5Jbml0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjcwMmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IElJbnN0YW50aWF0aW9uSGFuZGxlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFEYXRhVHlwZTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgSW5zdGFudGlhdGlvbiBoYW5kbGVyLiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gKiBpcyBpbiBhIHNlcGFyYXRlIHByb2plY3Qgc28gdGhhdCBpbnN0YW50aWF0aW9uIGNvZGUgd2lsbCBub3QgYmUgbG9hZGVkCi0gKiB1bmxlc3MgaXQgbmVlZHMgdG8gYmUuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJSW5zdGFudGlhdGlvbkhhbmRsZXIgewotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgYWRhcHRlciBoYW5kbGVzIHRoZSBkYXRhdHlwZQotCSAqIG9yIHdoZXRoZXIgdGhlIHN0YW5kYXJkIEVGYWN0b3J5IGRvZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0RhdGFUeXBlKEphdmFEYXRhVHlwZSB0eXBlKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgdGhlIGFkYXB0ZXIgaGFuZGxlcyB0aGUgRUNsYXNzIG9yIHRoZQotCSAqIHN0YW5kYXJkIEVGYWN0b3J5IGRvZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0NsYXNzKEVDbGFzcyB0eXBlKTsKLQkKLQkvKioKLQkgKiBJZiBhZGFwdGVySGFuZGxlc0luc3RhbmNlIHJldHVybnMgdHJ1ZSwgdGhlbgotCSAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHRvIGNyZWF0ZSB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBqYXZhQ2xhc3MpOwotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzNjE3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzUgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgaXMgYSBmYWN0b3J5IGZvciBJSW5zdGFudGlhdGlvbkhhbmRsZXIncy4gSXQgaXMgYXR0YWNoZWQgYXMKLSAqIGFuIGFkYXB0ZXIgb24gdGhlIFJlc291cmNlU2V0IHRoYXQgY29udGFpbnMgdGhlIGphdmEgbW9kZWwuIEphdmFYTUlGYWN0b3J5Ci0gKiB3aWxsIHVzZSBpdCB0byByZXRyaWV2ZSBpdHMgSUluc3RhbnRpYXRpb25IYW5kbGVyLiBJZiB0aGUgYWRhcHRlciBpcyBub3QKLSAqIGZvdW5kLCB0aGVuIG5vIGluc3RhbnRpYXRpb24gaGFuZGxlciBleGlzdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIENsYXNzIEFEQVBURVJfS0VZID0gSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuY2xhc3M7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIElJbnN0YW50aWF0aW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbnRpYXRpb25IYW5kbGVyIGdldEluc3RhbnRpYXRpb25IYW5kbGVyKEphdmFGYWN0b3J5SW1wbCBmYWN0b3J5KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYzlkZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IElJbnN0YW50aWF0aW9uSW5zdGFuY2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYW4gaW5zdGFuY2UuIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24KLSAqIGlzIGluIGEgc2VwYXJhdGUgcHJvamVjdCBzbyB0aGF0IGluc3RhbnRpYXRpb24gY29kZSB3aWxsIG5vdCBiZSBsb2FkZWQKLSAqIHVubGVzcyBpdCBuZWVkcyB0byBiZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zdGFudGlhdGlvbkluc3RhbmNlIHsKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBKYXZhSGVscGVycyBmb3IgdGhlIGphdmEgdHlwZSBvZiB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIGdldEphdmFUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQXJyYXlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0FycmF5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDVhMzliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotICogICRSQ1NmaWxlOiBBcnJheVR5cGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci0vKioKLSAqIERlc2NyaWJlcyBhIEphdmEgQXJyYXkgdHlwZQotICogICAgRm9yIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cywgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZQotICogICAgc3BlY2lmaWVkIGRpcmVjdGx5LiAgVGhpcyB3b3VsZCByZXF1aXJlIGluc3RhbnRpYXRpbmcgYSBjaGFpbiBvZiBjb21wb25lbnQgdHlwZXMKLSAqICAgIHN1Y2ggYXMgU3RyaW5nW11bXVtdW10tPlN0cmluZ1tdW11bXS0+U3RyaW5nW11bXS0+U3RyaW5nW10tPlN0cmluZy4KLSAqIAotICogICBUaGUgY29tcG9uZW50IHR5cGUgcmVsYXRpb25zaGlwIHdpbGwgYmUgY29tcHV0ZWQgaWYgdGhlIGZpbmFsQ29tcG9uZW50VHlwZQotICogICBhbmQgYXJyYXkgZGltZW5zaW9ucyBpcyBzcGVjaWZpZWQuCi0gKiAgCi0gKiAgIEZvciB0aGlzIHJlYXNvbiwgdGhlIHByZWZlcnJlZCB3YXkgdG8gY3JlYXRlIGlzIHRocm91Z2ggdGhlIEphdmFSZWZGYWN0b3J5IGZhY3RvcnkgbWV0aG9kOgotICogICAgICAgIGNyZWF0ZUFycmF5VHlwZShKYXZhQ2xhc3MgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucykKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnJheVR5cGUgZXh0ZW5kcyBKYXZhQ2xhc3N7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQXJyYXlEaW1lbnNpb25zIGF0dHJpYnV0ZQotCSAqLwotCWludCBnZXRBcnJheURpbWVuc2lvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBcnJheURpbWVuc2lvbnMgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRBcnJheURpbWVuc2lvbnMoaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIENvbXBvbmVudFR5cGUgcmVmZXJlbmNlCi0JICovCi0JRUNsYXNzaWZpZXIgZ2V0Q29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlI2dldENvbXBvbmVudFR5cGUgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tcG9uZW50VHlwZShFQ2xhc3NpZmllciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIEFycmF5IFR5cGUuCi0JICogCi0JICogSW4gb3JkZXIgdG8gZW5zdXJlIGEgdW5pcXVlIGluc3RhbmNlLCB3ZSB3aWxsIHJlc29sdmUgdGhpcyB0eXBlIHVzaW5nCi0JICogcmVmbGVjdGlvbi4gSXQgdHVybnMgb3V0IHRvIGJlIG1vc3QgZWZmaWNpZW50IHRvIGp1c3QgZG8gdGhpcyBieSB0cmltbWluZyB0aGUKLQkgKiBuYW1lLgotCSAqLwotCUphdmFIZWxwZXJzIGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5LiAKLQkgKiAKLQkgKiBJZiB0aGlzIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXksIHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlIHRoZSBuZXN0ZWQKLQkgKiBhcnJheSB0eXBlLgotCSAqLwotCUphdmFIZWxwZXJzIGdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogSXMgdGhpcyBhbiBhcnJheSBvZiBqYXZhIHByaW1pdGl2ZXMKLQkgKi8KLQlib29sZWFuIGlzUHJpbWl0aXZlQXJyYXkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNldCB0aGUgY29tcG9uZW50IHR5cGUuCi0JICovCi0Jdm9pZCBzZXRDb21wb25lbnRUeXBlKEphdmFIZWxwZXJzIGhlbHBlckNvbXBvbmVudFR5cGUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9CbG9jay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjg2NGM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEJsb2NrLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2sgZXh0ZW5kcyBFT2JqZWN0ewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNvdXJjZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU291cmNlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0U291cmNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIENvbnRlbnRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRDb250ZW50cygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Db21tZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0NvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjMTZhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0NvbW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IENvbW1lbnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1lbnQgZXh0ZW5kcyBCbG9jayB7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0ZpZWxkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0ZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYWFmZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9GaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEZpZWxkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWVsZCBleHRlbmRzIEVUeXBlZEVsZW1lbnR7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNGaW5hbCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzRmluYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNTdGF0aWMgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc1N0YXRpYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNTdGF0aWMgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdGljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdGljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEphdmFWaXNpYmlsaXR5IGF0dHJpYnV0ZQotCSAqLwotCUphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjZ2V0SmF2YVZpc2liaWxpdHkgPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBWaXNpYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZAotCSAqIEBzZWUgI2dldEphdmFWaXNpYmlsaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc2llbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNpZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUcmFuc2llbnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEZpZWxkX1RyYW5zaWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNUcmFuc2llbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzVHJhbnNpZW50IDxlbT5UcmFuc2llbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zaWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNUcmFuc2llbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zaWVudChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Wb2xhdGlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Wb2xhdGlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Vm9sYXRpbGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEZpZWxkX1ZvbGF0aWxlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1ZvbGF0aWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1ZvbGF0aWxlIDxlbT5Wb2xhdGlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Vm9sYXRpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzVm9sYXRpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZvbGF0aWxlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgSmF2YUNsYXNzIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2dldEphdmFDbGFzcyA8ZW0+SmF2YSBDbGFzczwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgQ2xhc3M8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgSW5pdGlhbGl6ZXIgcmVmZXJlbmNlCi0JICovCi0JQmxvY2sgZ2V0SW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2dldEluaXRpYWxpemVyIDxlbT5Jbml0aWFsaXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbml0aWFsaXplcihCbG9jayB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIGNsYXNzIHRoYXQgdGhpcyBmaWVsZCBpcyB3aXRoaW4uCi0JICovCi0JSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgZmllbGQgYW4gYXJyYXkgdHlwZS4KLQkgKi8KLQlib29sZWFuIGlzQXJyYXkoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Jbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTYzMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Jbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLSAqICAkUkNTZmlsZTogSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjM4NTY5MDg0NzQyNzg5NzY1Nkw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1TR19QQVRURVJOID0gUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSmF2YV9JbmhfQ3ljbGVfRVJST1JfIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24oSmF2YUNsYXNzIGFTdWJjbGFzcywgSmF2YUNsYXNzIGFTdXBlcmNsYXNzKSB7Ci0JCXRoaXMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoTVNHX1BBVFRFUk4sIG5ldyBTdHJpbmdbXXthU3ViY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpLCBhU3VwZXJjbGFzcy5nZXRRdWFsaWZpZWROYW1lKCl9KSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4NWYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotICogICRSQ1NmaWxlOiBJbml0aWFsaXplci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaXRpYWxpemVyIGV4dGVuZHMgRU9iamVjdHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc1N0YXRpYyBhdHRyaWJ1dGUKLQkgKi8KLQlCb29sZWFuIGdldElzU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgSXNTdGF0aWMgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRJc1N0YXRpYyhCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEphdmFDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbml0aWFsaXplciNnZXRKYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNvdXJjZSByZWZlcmVuY2UKLQkgKi8KLQlCbG9jayBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaXRpYWxpemVyI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U291cmNlKEJsb2NrIHZhbHVlKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUNsYXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODgyMTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFDbGFzcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA5LzE1IDEzOjQyOjA0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQGV4dGVuZHMgSmF2YUhlbHBlcnMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNQdWJsaWMgPGVtPlB1YmxpYzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMgPGVtPkltcGxlbWVudHMgSW50ZXJmYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldENsYXNzSW1wb3J0IDxlbT5DbGFzcyBJbXBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRQYWNrYWdlSW1wb3J0cyA8ZW0+UGFja2FnZSBJbXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0RmllbGRzIDxlbT5GaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0SW5pdGlhbGl6ZXJzIDxlbT5Jbml0aWFsaXplcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXREZWNsYXJlZENsYXNzZXMgPGVtPkRlY2xhcmVkIENsYXNzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXREZWNsYXJpbmdDbGFzcyA8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0SmF2YVBhY2thZ2UgPGVtPkphdmEgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEV2ZW50cyA8ZW0+RXZlbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0QWxsRXZlbnRzIDxlbT5BbGwgRXZlbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhQ2xhc3MoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNsYXNzIGV4dGVuZHMgRUNsYXNzLCBKYXZhSGVscGVyc3sKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUVUSE9EX05BTUUgPSAiKiI7Ci0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIG1hdGNoaW5nIHRoZSBuYW1lLCBhbmQgbm9uLXJldHVybiBwYXJhbWV0ZXJzIHdpdGggZnVsbHkgcXVhbGlmaWVkIHR5cGVzIG1hdGNoaW5nIGFsbCB0aGUgdHlwZXMgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cy4gIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRQdWJsaWNNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgOwotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MsIGhhdmluZyBhIG5hbWUgZXF1YWwgdG8gdGhhdCBvZiB0aGUgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1YmxpY01ldGhvZHNFeHRlbmRlZE5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIG91ciBGaWVsZHMsIGluY2x1ZGluZyBpbmhlcml0ZWQgZmllbGRzLgotCSAqIFRoZSBmaWVsZCByZWxhdGlvbnNoaXAgaXMgZGVyaXZlZCBmcm9tIGNvbnRlbnRzLgotCSAqLyAgCi0JcHVibGljIEZpZWxkW10gbGlzdEZpZWxkRXh0ZW5kZWQoKTsKLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyBvdXIgTWV0aG9kcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLgotCSAqIFRoZSBtZXRob2QgcmVsYXRpb25zaGlwIGlzIGRlcml2ZWQgZnJvbSBjb250ZW50cy4KLQkgKi8gIAotCXB1YmxpYyBNZXRob2RbXSBsaXN0TWV0aG9kRXh0ZW5kZWQoKTsKLS8vRkIgICAvKioKLS8vRkIgICAgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uLiBEbyBub3QgdXNlLgotLy9GQiAgICAqLwotLy9GQiAgIE9iamVjdCBwcmltUmVmVmFsdWUoRU9iamVjdCBmZWF0dXJlKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgS2luZCBhdHRyaWJ1dGUKLQkgKi8KLQlUeXBlS2luZCBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5UeXBlS2luZAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtpbmQoVHlwZUtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzUHVibGljIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNQdWJsaWMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc1B1YmxpYyA8ZW0+UHVibGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUHVibGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNGaW5hbCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzRmluYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBJbXBsZW1lbnRzSW50ZXJmYWNlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQ2xhc3NJbXBvcnQgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldENsYXNzSW1wb3J0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFBhY2thZ2VJbXBvcnRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRQYWNrYWdlSW1wb3J0cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBGaWVsZHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEZpZWxkcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNZXRob2RzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEluaXRpYWxpemVycyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBEZWNsYXJpbmdDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXREZWNsYXJpbmdDbGFzcyA8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWNsYXJpbmcgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERlY2xhcmluZ0NsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWNsYXJpbmdDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBEZWNsYXJlZENsYXNzZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldERlY2xhcmVkQ2xhc3NlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgSmF2YVBhY2thZ2UgcmVmZXJlbmNlCi0JICovCi0JSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRXZlbnRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRFdmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbCBFdmVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsIEV2ZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBFdmVudHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhQ2xhc3NfQWxsRXZlbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50IiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBbGxFdmVudHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCWJvb2xlYW4gaXNOZXN0ZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlGaWVsZCBnZXRGaWVsZChTdHJpbmcgZmllbGROYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqICBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4KLQkgKiAKLQkgKiBSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuCi0JICovCi0JRmllbGQgZ2V0RmllbGRFeHRlbmRlZChTdHJpbmcgZmllbGROYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlGaWVsZCBnZXRGaWVsZE5hbWVkKFN0cmluZyBmaWVsZE5hbWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGFsbCBmaWVsZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuCi0JICovCi0JTGlzdCBnZXRGaWVsZHNFeHRlbmRlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZQotCSAqIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIFN0cmluZ3MgdGhhdCByZXByZXNlbnQgTWV0aG9kRWxlbWVudCBzaWduYXR1cmVzIGZyb20gbW9zdAotCSAqIGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4KLQkgKi8KLQlMaXN0IGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIAotCSAqIGhpZXJhcmNoeS4KLQkgKi8KLQlNZXRob2QgZ2V0TWV0aG9kRXh0ZW5kZWQoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCUxpc3QgZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMgZXhjbHVkaW5nIHBhcnRpY3VsYXIgY2xhc3NlcyBhbmQgbWV0aG9kcy4KLQkgKiBAcGFyYW0gZXhjbHVkZWRDbGFzc2VzIC0gQSBsaXN0IG9mIEphdmFDbGFzcyBpbnN0YW5jZXMgdG8gYmUgaWdub3JlZC4KLQkgKiBAcGFyYW0gZXhjbHVkZWRNZXRob2RzIC0gQSBsaXN0IG9mIE1ldGhvZCBpbnN0YW5jZXMgdG8gYmUgaWdub3JlZC4KLQkgKi8KLQlMaXN0IGdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKExpc3QgZXhjbHVkZWRDbGFzc2VzLCBMaXN0IGV4Y2x1ZGVkTWV0aG9kcykgOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RzIHRoYXQgYmVnaW5zIHdpdGggQGFNZXRob2ROYW1lUHJlZml4IGFuZCBpcyBub3QKLQkgKiBpbmNsdWRlZCBpbiB0aGUgQGV4Y2x1ZGVkTmFtZXMgbGlzdC4gSWYgQGFNZXRob2ROYW1lUHJlZml4IGlzIG51bGwsIGFsbCBtZXRob2RzIAotCSAqIHdpbGwgYmUgcmV0dXJuZWQuCi0KLQkgKi8KLQlMaXN0IGdldE9ubHlTcGVjaWZpY01ldGhvZHMoU3RyaW5nIGFNZXRob2ROYW1lUHJlZml4LCBMaXN0IGV4Y2x1ZGVkTmFtZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgbWV0aG9kIG1hdGNoaW5nIHRoZSBuYW1lLCBhbmQgbm9uLXJldHVybiBwYXJhbWV0ZXJzIHdpdGggZnVsbHkKLQkgKiBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiAgSXQgd2lsbCBub3QKLQkgKiBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCU1ldGhvZCBnZXRQdWJsaWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpdCB3aWxsIG5vdCBnbyB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlMaXN0IGdldFB1YmxpY01ldGhvZHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbGwgcHVibGljIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuCi0JICovCi0JTGlzdCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MsIGhhdmluZyBhIG5hbWUgZXF1YWwgdG8KLQkgKiB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuCi0JICovCi0JTGlzdCBnZXRQdWJsaWNNZXRob2RzTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JSmF2YUNsYXNzIGdldFN1cGVydHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGVzdCB3aGV0aGVyIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIHRoZSBwYXNzZWQgaW50ZXJmYWNlIChvciBvbmUgb2YgaXRzCi0JICogc3VwZXJ0eXBlcykuCi0JICovCi0JYm9vbGVhbiBpbXBsZW1lbnRzSW50ZXJmYWNlKEphdmFDbGFzcyBpbnRlcmZhY2VUeXBlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIHN0cmluZyBzaG93aW5nIG91ciBkZXRhaWxzLgotCSAqLwotCVN0cmluZyBpbmZvU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUZXN0cyB3aGV0aGVyIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSB0aGUgcGFzc2VkIGluIGNsYXNzLgotCSAqLwotCWJvb2xlYW4gaW5oZXJpdHNGcm9tKEphdmFDbGFzcyBqYXZhQ2xhc3MpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRG9lcyB0aGlzIHR5cGUgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBpc0V4aXN0aW5nVHlwZSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSXMgdGhpcyBhbiBpbnRlcmZhY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTZXQgdGhlIHN1cGVydHlwZS4KLQkgKi8KLQl2b2lkIHNldFN1cGVydHlwZShKYXZhQ2xhc3MgamF2YWNsYXNzKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXNzZWQgSmF2YUNsYXNzIGNhbiBiZSBzZXQgYXMgdGhlIHN1cGVydHlwZQotCSAqIG9mIHRoaXMgSmF2YUNsYXNzLiAgVGhpcyBtZXRob2Qgd2lsbCB0ZXN0IHRvIHNlZSBpZiBhSmF2YUNsYXNzIHdpbGwKLQkgKiBjcmVhdGUgYSBjeWNsZSBpbiB0aGUgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLiAgUmV0dXJuIHRydWUgaWYgbm8KLQkgKiBpbmhlcml0YW5jZSBjeWNsZSB3aWxsIGJlIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZFN1cGVydHlwZShKYXZhQ2xhc3MgYUphdmFDbGFzcykgOwotCi0JLyoqCi0JICogR2V0IHRoZSBFU3RydWN0dXJhbEZlYXR1cmVzIHRoYXQgcmVwcmVzZW50IHRoZSBCZWFuSW5mbyBwcm9wZXJ0aWVzIGZvcgotCSAqIGp1c3QgdGhpcyBKYXZhIGNsYXNzLCBub3QgaW5jbHVkaW5nIGluaGVyaXRlZC4gSXQgd2lsbCByZXR1cm4gYW55IEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIHRoYXQgd2FzIHNwZWNpZmllZCBhcyBiZWluZyBhdCB0aGlzIGNsYXNzIGVpdGhlciB0aHJvdWdoIHRoZSBYTUkgb3ZlcnJpZGUgZG9jdW1lbnQgb3IKLQkgKiB0aHJvdWdoIHRoZSBCZWFuSW5mby4gU3RydWN0dXJhbCBmZWF0dXJlcyB0aHJvdWdoIHRoZSBYTUkgbWF5IG5vdCBiZSBiZWFuIHByb3BlcnRpZXMsCi0JICogYnV0IHRoZXkgYXJlIHBhcnQgb2YgdGhlIGZlYXR1cmVzIGF2YWlsYWJsZSBhdCB0aGlzIGNsYXNzIG9ubHkuIAotCSAqIAotCSAqIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiBnZXRFQXR0cmlidXRlcygpIGFuZCBnZXRFUmVmZXJlbmNlcygpLgotCSAqIAotCSAqIFRvIHJldHJpZXZlIG9ubHkgdGhlIEJlYW4gUHJvcGVydGllcywgdGhlbiB1c2UgQmVhbmluZm8gCi0JICogVXRpbGl0aWVzLmdldFByb3BlcnRpZXNJdGVyYXRvcihqYXZhY2xhc3MuZ2V0UHJvcGVydGllcygpKSBhbmQgdGhpcyB3aWxsIGl0ZXJhdGUgb3ZlcgotCSAqIHRoZSBCZWFuIFByb3BlcnR5RGVjb3JhdG9ycywgYW5kIGZpbHRlciBvdXQgdGhlIG5vbi1iZWFuIGZlYXR1cmVzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgcHJvcGVydGllcyAoYXMgRVN0cnVjdHVyYWxGZWF0dXJlJ3MpIGZvciB0aGlzIGphdmEgY2xhc3MuIFRoaXMgbGlzdCBpcwotCSAqIG5vdCBtb2RpZmlhYmxlLgotCSAqLwotCUVMaXN0IGdldFByb3BlcnRpZXMoKTsKLQkKLQkvKioKLQkgKiBHZXQgYWxsIG9mIHRoZSBFU3RydWN0dXJhbEZlYXR1cmVzIHRoYXQgcmVwcmVzZW50IHRoZSBCZWFuSW5mbyBwcm9wZXJ0aWVzIGZvcgotCSAqIGp1c3QgdGhpcyBKYXZhIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkLiBJdCB3aWxsIHJldHVybiBhbnkgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogdGhhdCB3YXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIFhNSSBvdmVycmlkZSBkb2N1bWVudCBvcgotCSAqIHRocm91Z2ggdGhlIEJlYW5JbmZvLiBTdHJ1Y3R1cmFsIGZlYXR1cmVzIHRocm91Z2ggdGhlIFhNSSBtYXkgbm90IGJlIGJlYW4gcHJvcGVydGllcywKLQkgKiBidXQgdGhleSBhcmUgcGFydCBvZiB0aGUgZmVhdHVyZXMgYXZhaWxhYmxlLgotCSAqIAotCSAqIFRoZSBpcyBsaWtlIGdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSBleGNlcHQgdGhhdCBpZiBCZWFuSW5mbyBoaWRlcyBhbnkgYmVhbiBwcm9wZXJ0aWVzCi0JICogZnJvbSB0aGUgc3VwZXIgY2xhc3MsIHRoaXMgbGlzdCB3aWxsIGFsc28gaGlkZSB0aGVtLCB3aGlsZSBnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzCi0JICogd2lsbCBub3QuCi0JICogCi0JICogVG8gcmV0cmlldmUgb25seSB0aGUgQmVhbiBQcm9wZXJ0aWVzLCB0aGVuIHVzZSBCZWFuaW5mbyAKLQkgKiBVdGlsaXRpZXMuZ2V0UHJvcGVydGllc0l0ZXJhdG9yKGphdmFjbGFzcy5nZXRBbGxQcm9wZXJ0aWVzKCkpIGFuZCB0aGlzIHdpbGwgaXRlcmF0ZSBvdmVyCi0JICogdGhlIEJlYW4gUHJvcGVydHlEZWNvcmF0b3JzLCBhbmQgZmlsdGVyIG91dCB0aGUgbm9uLWJlYW4gZmVhdHVyZXMuCi0JICogCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBhbGwgcHJvcGVydGllcywgaW5jbHVkaW5nIGluaGVyaXRlZCwgKGFzIEVTdHJ1Y3R1cmFsRmVhdHVyZSdzKSBmb3IgdGhpcyBjbGFzcy4gVGhpcyBsaXN0IGlzCi0JICogbm90IG1vZGlmaWFibGUuCi0JICovCi0JRUxpc3QgZ2V0QWxsUHJvcGVydGllcygpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVmbGVjdGlvbiB0eXBlLCBpZiBpdCBleGlzdHMsIGZvciB0aGlzIGNsYXNzLiBJZiBydW5uaW5nIHdpdGhpbiBFY2xpcHNlIHRoaXMKLQkgKiB3aWxsIGJlIGFuIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZX0sIG9yIHJ1bm5pbmcgb3V0c2lkZSBvZiBFY2xpcHNlIGl0IHdpbGwgYmUgYSB7QGxpbmsgamF2YS5sYW5nLkNsYXNzfS4KLQkgKiAKLQkgKiBAcmV0dXJuIElUeXBlIGlmIGluIEVjbGlwc2UsIENsYXNzIGlmIG91dHNpZGUgRWNsaXBzZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdHlwZSBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JT2JqZWN0IGdldFJlZmxlY3Rpb25UeXBlKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFEYXRhVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM1Yjg1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFEYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLSAqICAkUkNTZmlsZTogSmF2YURhdGFUeXBlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEBleHRlbmRzIEphdmFIZWxwZXJzCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhRGF0YVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YURhdGFUeXBlIGV4dGVuZHMgRUNsYXNzLCBKYXZhSGVscGVyc3sKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNjA0MjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhRXZlbnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBFdmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhRXZlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFdmVudCBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZXsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUhlbHBlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUhlbHBlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjZWZhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFIZWxwZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLSAqICAkUkNTZmlsZTogSmF2YUhlbHBlcnMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzI3LzIwMDAgNDo0MjowNCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhSGVscGVycyBleHRlbmRzIEVDbGFzcyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOX05BTUUgPSAiamF2YS5sYW5nLkJvb2xlYW4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVJfTkFNRSA9ICJqYXZhLmxhbmcuQ2hhcmFjdGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQllURV9OQU1FID0gImphdmEubGFuZy5CeXRlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX05BTUUgPSAiamF2YS5sYW5nLkRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEZMT0FUX05BTUUgPSAiamF2YS5sYW5nLkZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URUdFUl9OQU1FID0gImphdmEubGFuZy5JbnRlZ2VyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR19OQU1FID0gImphdmEubGFuZy5Mb25nIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlRfTkFNRSA9ICJqYXZhLmxhbmcuU2hvcnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0JPT0xFQU5fTkFNRSA9ICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9DSEFSQUNURVJfTkFNRSA9ICJjaGFyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9CWVRFX05BTUUgPSAiYnl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fRE9VQkxFX05BTUUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9GTE9BVF9OQU1FID0gImZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9JTlRFR0VSX05BTUUgPSAiaW50IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9MT05HX05BTUUgPSAibG9uZyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fU0hPUlRfTkFNRSA9ICJzaG9ydCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fTk9UX0lEID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fQk9PTEVBTl9JRCA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0NIQVJBQ1RFUl9JRCA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0JZVEVfSUQgPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9ET1VCTEVfSUQgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9GTE9BVF9JRCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0lOVEVHRVJfSUQgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9MT05HX0lEID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fU0hPUlRfSUQgPSA4OwotCQotCS8qKgotCSAqIEdldCB0aGUgcXVhbGlmaWVkIG5hbWUgKHdpdGggdXNpbmcgJy4nIGZvciBpbm5lciBjbGFzc2VzKS4gV2lsbCByZXR1cm4gdGhlIG5hbWUgaWYgcHJpbWl0aXZlIHRvbyAoZS5nLiAiYm9vbGVhbiIpCi0JICogTm90ZTogVGhpcyBzaG91bGQgb2YgYmVlbiBnZXQgdGhlIHNpbXBsZSBuYW1lIGFuZCBub3QgdGhlIHF1YWxpZmVkIG5hbWUsIGJ1dCBpdCBpcyB0b28gbGF0ZSBhbmQgaGFzIGJlZW4gZXN0YWJsaXNoZWQKLQkgKiBhcyB0aGUgQVBJLiBVc2UgPGNvZGU+Z2V0U2ltcGxlTmFtZSgpPC9jb2RlPiBpbnN0ZWFkIGlmIHlvdSB3YW50IHRoZSBuYW1lIG5vdCBxdWFsaWZpZWQuCi0JICogQHJldHVybiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUuCi0JICogQHNlZSBKYXZhSGVscGVycyNnZXRTaW1wbGVOYW1lKCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFOYW1lKCk7Ci0JLyoqCi0JICogR2V0IHRoZSBzaW1wbGUgbmFtZS4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcHJpbWl0aXZlLCBvciBpZiBhIGNsYXNzLCB0aGUgbmFtZSB3aXRob3V0IHRoZSBwYWNrYWdlLiBBbmQgaWYgaXQgaXMgYW4KLQkgKiBpbm5lciBjbGFzcywgaXQgd2lsbCB1c2UgJy4nIGluc3RlYWQgb2YgJyQnLiBJZiB5b3Ugd2FudCB0aGUgc2ltcGxlIG5hbWUgZm9yIHJlZmxlY3Rpb24gKGkuZS4gd2l0aCAnJCcpIHVzZSA8Y29kZT5nZXROYW1lKCk8L2NvZGU+LgotCSAqIEByZXR1cm4gdGhlIHNpbXBsZSBuYW1lIChubyBwYWNrYWdlKSBvZiB0aGUgdHlwZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgcHJpbWl0aXZlIHR5cGUgdGhhdCB0aGlzIGhlbHBlciB3cmFwcGVycyBvciBpcyAoZS5nLiAiamF2YS5sYW5nLkludGVnZXIiIGFuZCAiaW50IiB0eXBlcyByZXR1cm4gImludCIgdHlwZSkuIElmIG5vdCBhIHByaW1pdGl2ZQotCSAqIG9yIGEgd3JhcHBlciBmb3IgYSBwcmltaXRpdmUsIHRoZW4gcmV0dXJuIG51bGwuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhRGF0YVR5cGUgZ2V0UHJpbWl0aXZlKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBwcmltaXRpdmUgaWQgdGhhdCB0aGlzIGhlbHBlciB3cmFwcGVycyBvciBpcyAoZS5nLiAiamF2YS5sYW5nLkludGVnZXIiIGFuZCAiaW50IiB3aWxsIHJldHVybiB7QGxpbmsgSmF2YUhlbHBlcnMjUFJJTV9JTlRFR0VSX0lEfSkuIElmCi0JICogbm90IGEgd3JhcHBlciBmb3IgYSBwcmltaXRpdmUgdGhlbiByZXR1cm4ge0BsaW5rIEphdmFIZWxwZXJzI1BSSU1fTk9UX0lEfS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGludCBnZXRQcmltaXRpdmVJRCgpOwotCS8qKgotCSAqIFRvIGJlIHVzZWQgYnkgcGVvcGxlIHRoYXQgbmVlZCB0byBnZXQgdGhlIHF1YWxpZmllZCBuYW1lLiBUaGlzIHdvdWxkIHVzZSAnLicgZm9yIGlubmVyIGNsYXNzZXMKLQkgKiBhbmQgaW5jbHVkZSB0aGUgcGFja2FnZSBuYW1lLgotCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lLCBpbmNsdWRpbmcgcGFja2FnZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8JCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCk7Ci0JcHVibGljIEphdmFDbGFzcyBnZXRXcmFwcGVyKCk7Ci0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpOwotCS8qKgotCSAqIENhbiBhbiBvYmplY3Qgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcyBiZSBhc3NpZ25lZCB0byBhbgotCSAqIG9iamVjdCBvZiB0aGlzIGNsYXNzPyBJbiBvdGhlciB3b3JkcyBpcyB0aGlzIGNsYXNzIGEKLQkgKiBzdXBlcnR5cGUgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcywgb3IgaXMgaXQgc3VwZXJpbnRlcmZhY2UKLQkgKiBvZiBpdD8gT3IgaW4gdGhlIGNhc2Ugb2YgcHJpbWl0aXZlcywgYXJlIHRoZXkgdGhlIHNhbWUuIAotCSAqIEBwYXJhbSBhQ2xhc3MKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFzc2lnbmFibGUgZnJvbSB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShFQ2xhc3NpZmllciBhQ2xhc3MpOwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCk7Ci0KLQkvKioKLQkgKiBUbyBiZSB1c2VkIGJ5IHBlb3BsZSB0aGF0IG5lZWQgdG8gZ2V0IHRoZSBxdWFsaWZpZWQgbmFtZSB1c2VkIGZvciByZWZsZWN0aW9uLiBUaGlzIHdvdWxkIHVzZSAnJCcgaW5zdGVhZCBvZiAnLicgZm9yIGlubmVyIGNsYXNzZXMKLQkgKiBhbmQgaW5jbHVkZSB0aGUgcGFja2FnZSBuYW1lLgotCSAqIFR5cGljYWxseSBiZWFuIGluZm8gd291bGQgbmVlZCB0byB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcy4KLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSwgdXNlICckJyBmb3IgaW5uZXIgY2xhc3NlcwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSA7CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmY3MWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUGFja2FnZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX0lEID0gIipwYWNrYWdlIjsJLy8gVGhlIGlkICh0aGUgcGFydCB0aGF0IGdvZXMgYWZ0ZXIgdGhlICcjJyBmb3IgYSBqYXZhIHBhY2thZ2UuKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCS8vIFRoZXJlIHdpbGwgb25seSBiZSBvbmUgcGFja2FnZSBwZXIgamF2YSByZXNvdXJjZSBzbyBpdAotCQkJCQkJCQkJCQkJCQkvLyBjYW4gYmUgdW5pcXVlLiBObyBqYXZhIHR5cGVzLCBtZXRob2RzLCBmaWVsZHMgaWRzIGNhbgotCQkJCQkJCQkJCQkJCQkvLyBzdGFydCB3aXRoIGFuIGFzdGVyaWNrIHNvIHdpbGwgYmUgdW5pcXVlLgotCQkJCQkJCQkJCQkJCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNSVRJVkVfUEFDS0FHRV9OQU1FID0gIl8tamF2YXByaW0iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBKYXZhQ2xhc3NlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0SmF2YUNsYXNzZXMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSA7Ci0KLX0gLy9KYXZhUGFja2FnZQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZTdhMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotICogICRSQ1NmaWxlOiBKYXZhUGFyYW1ldGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYXJhbWV0ZXI7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQYXJhbWV0ZXIgZXh0ZW5kcyBFUGFyYW1ldGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc0ZpbmFsIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNGaW5hbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlciNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFBhcmFtZXRlcktpbmQgYXR0cmlidXRlCi0JICovCi0JSmF2YVBhcmFtZXRlcktpbmQgZ2V0UGFyYW1ldGVyS2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlciNnZXRQYXJhbWV0ZXJLaW5kIDxlbT5QYXJhbWV0ZXIgS2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyIEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcktpbmQKLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXJLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJhbWV0ZXJLaW5kKEphdmFQYXJhbWV0ZXJLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgcGFyYW1ldGVyIHR5cGUgYW4gYXJyYXkgdHlwZS4KLQkgKi8KLQlib29sZWFuIGlzQXJyYXkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgYSByZXR1cm4gcGFyYW1ldGVyLgotCSAqLwotCWJvb2xlYW4gaXNSZXR1cm4oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCUphdmFIZWxwZXJzIGdldEphdmFUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyS2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjM0NzM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlcktpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotICogICRSQ1NmaWxlOiBKYXZhUGFyYW1ldGVyS2luZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogSU49MAotICogT1VUPTEKLSAqIElOT1VUPTIKLSAqIFJFVFVSTj0zCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEphdmFQYXJhbWV0ZXJLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YVBhcmFtZXRlcktpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI0lOX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTiA9IDA7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjT1VUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVQgPSAxOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOT1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjSU5PVVRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOT1VUID0gMjsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVRVUk48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNSRVRVUk5fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFVFVSTiA9IDM7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjSU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyYW1ldGVyS2luZCBJTl9MSVRFUkFMID0gbmV3IEphdmFQYXJhbWV0ZXJLaW5kKElOLCAiSU4iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjT1VUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgT1VUX0xJVEVSQUwgPSBuZXcgSmF2YVBhcmFtZXRlcktpbmQoT1VULCAiT1VUIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOT1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNJTk9VVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJhbWV0ZXJLaW5kIElOT1VUX0xJVEVSQUwgPSBuZXcgSmF2YVBhcmFtZXRlcktpbmQoSU5PVVQsICJJTk9VVCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVUVVJOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVUVVJOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNSRVRVUk4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyYW1ldGVyS2luZCBSRVRVUk5fTElURVJBTCA9IG5ldyBKYXZhUGFyYW1ldGVyS2luZChSRVRVUk4sICJSRVRVUk4iKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSmF2YVBhcmFtZXRlcktpbmRbXSB7Ci0JCQlJTl9MSVRFUkFMLAotCQkJT1VUX0xJVEVSQUwsCi0JCQlJTk9VVF9MSVRFUkFMLAotCQkJUkVUVVJOX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SmF2YSBQYXJhbWV0ZXIgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgSmF2YVBhcmFtZXRlcktpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlKYXZhUGFyYW1ldGVyS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIEphdmFQYXJhbWV0ZXJLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBJTjogcmV0dXJuIElOX0xJVEVSQUw7Ci0JCQljYXNlIE9VVDogcmV0dXJuIE9VVF9MSVRFUkFMOwotCQkJY2FzZSBJTk9VVDogcmV0dXJuIElOT1VUX0xJVEVSQUw7Ci0JCQljYXNlIFJFVFVSTjogcmV0dXJuIFJFVFVSTl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgSmF2YVBhcmFtZXRlcktpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vSmF2YVBhcmFtZXRlcktpbmQKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFSZWZGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFSZWZGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZDhjMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFSZWZGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzUgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZWZGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFSZWZGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZGYWN0b3J5SW1wbCgpOwotCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcm94eSByZWZlcmVuY2UgdG8gdGhlIGNsYXNzIG5hbWUuCi0JICogQHBhcmFtIHRhcmdldE5hbWUgQ2xhc3NuYW1lIHRvIGNyZWF0ZSBhIHByb3h5IHJlZmVyZW5jZSB0b28uCi0JICogQHJldHVybiBBIHByb3h5IHJlZmVyZW5jZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpOwotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgamF2YSB0eXBlIChjbGFzcyBvciBwcmltaXRpdmUpIGZvciBhIGdpdmVuIHF1YWxpZmllZCBuYW1lLgotCSAqIDxwPklmIHRoZSBwYWNrYWdlIG9yIHR5cGUgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaAotCSAqIHRoZSByZWZsZWN0aW9uIG1lY2hhbmlzbS4KLQkgKiA8cD5Mb29rdXAgdGhlIEphdmFDbGFzcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgcGFzc2VkIG9iamVjdCwgaGFuZGxpbmcgc29tZSBlcnJvciBjYXNlcy4KLQkgKiBAcGFyYW0gYVF1YWxpZmllZE5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgY2xhc3Mgb3IgcHJpbWl0aXZlIChlLmcuIDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IG9yIDxjb2RlPmludDwvY29kZT4KLQkgKiBAcGFyYW0gcmVsYXRlZE9iamVjdCBFT2JqZWN0IHRoYXQgaXQgd2lsbCBiZSByZWxhdGVkIHRvbyAoaXQgd2lsbCBsb29rIHRocm91Z2ggdGhlIHJlc291cmNlIHNldCdzIHByb2plY3Qgb2YgdGhlIEVPYmplY3QpCi0JICogQHJldHVybiBUaGUgdHlwZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbmFtZSBpcyBub3Qgb2YgY29ycmVjdCBmb3JtYXQsIHJlbGF0ZWRPYmplY3QgaXMgbm90IGNvbnRhaW5lZCBieSBhIHJlc291cmNlIHNldCwgb3IgcmVzb3VyY2Ugc2V0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVF1YWxpZmllZE5hbWUsIEVPYmplY3QgcmVsYXRlZE9iamVjdCk7Ci0JCi0JCi0JLyoqCi0JICogcmVmbGVjdCAtIHJlZmxlY3QgYSBqYXZhIHR5cGUgKGNsYXNzIG9yIHByaW1pdGl2ZSkgZm9yIGEgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUuCi0JICogPHA+SWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaAotCSAqIHRoZSByZWZsZWN0aW9uIG1lY2hhbmlzbS4KLQkgKiBAcGFyYW0gYVF1YWxpZmllZE5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgY2xhc3Mgb3IgcHJpbWl0aXZlIChlLmcuIDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IG9yIDxjb2RlPmludDwvY29kZT4KLQkgKiBAcGFyYW0gc2V0IFJlc291cmNlIHNldCB0byB1c2UuIEl0cyBwcm9qZWN0IHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSB0eXBlLgotCSAqIEByZXR1cm4gVGhlIHR5cGUuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5hbWUgaXMgbm90IG9mIGNvcnJlY3QgZm9ybWF0LCBvciByZXNvdXJjZSBzZXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIHJlZmxlY3RUeXBlKFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgUmVzb3VyY2VTZXQgc2V0KTsJCi0JCi0JCi0JLyoqCi0JICogcmVmbGVjdCAtIHJlZmxlY3QgYSB0eXBlIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbmFtZS4KLQkgKiA8cD5JZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIEBwYXJhbSBhUGFja2FnZU5hbWUgUGFja2FnZSBuYW1lCi0JICogQHBhcmFtIGFUeXBlTmFtZSBUeXBlIG5hbWUgCi0JICogQHBhcmFtIHNldCBSZXNvdXJjZSBzZXQgdG8gdXNlLiBJdHMgcHJvamVjdCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgdHlwZS4KLQkgKiBAcmV0dXJuIFRoZSB0eXBlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIG5vdCBvZiBjb3JyZWN0IGZvcm1hdCwgb3IgcmVzb3VyY2Ugc2V0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVBhY2thZ2VOYW1lLCBTdHJpbmcgYVR5cGVOYW1lLCBSZXNvdXJjZVNldCBzZXQpOwotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YSBwYWNrYWdlIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZS4KLQkgKiA8cD5JZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBOYW1lIG9mIHBhY2thZ2UKLQkgKiBAcGFyYW0gc2V0IFJlc291cmNlIHNldCB0byB1c2UuIEl0cyBwcm9qZWN0IHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSBwYWNrYWdlLgotCSAqIEByZXR1cm4gVGhlIHBhY2thZ2UuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5hbWUgaXMgbm90IG9mIGNvcnJlY3QgZm9ybWF0LCBvciByZXNvdXJjZSBzZXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEphdmFQYWNrYWdlIHJlZmxlY3RQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgUmVzb3VyY2VTZXQgc2V0KTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIEFycmF5VHlwZSB2YWx1ZSB3aXRoIGFuIGFycmF5IG9mIHRoZSBjb21wb25lbnQgdHlwZQotCSAqLwotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKEphdmFIZWxwZXJzIGNvbXBvbmVudFR5cGUpOwotCS8qKgotCSAqIEByZXR1cm4gQXJyYXlUeXBlIHZhbHVlIHdpdGggYW4gYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zIGFuZCBmaW5hbCBjb21wb25lbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZShKYXZhSGVscGVycyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZCB2YWx1ZQotCSAqLwotCU1ldGhvZCBjcmVhdGVNZXRob2QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YUNsYXNzIHZhbHVlCi0JICovCi0JSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBGaWVsZCB2YWx1ZQotCSAqLwotCUZpZWxkIGNyZWF0ZUZpZWxkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEJsb2NrIHZhbHVlCi0JICovCi0JQmxvY2sgY3JlYXRlQmxvY2soKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29tbWVudCB2YWx1ZQotCSAqLwotCUNvbW1lbnQgY3JlYXRlQ29tbWVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTdGF0ZW1lbnQgdmFsdWUKLQkgKi8KLQlTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEluaXRpYWxpemVyIHZhbHVlCi0JICovCi0JSW5pdGlhbGl6ZXIgY3JlYXRlSW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhcmFtZXRlciB2YWx1ZQotCSAqLwotCUphdmFQYXJhbWV0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBcnJheVR5cGUgdmFsdWUKLQkgKi8KLQlBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFEYXRhVHlwZSB2YWx1ZQotCSAqLwotCUphdmFEYXRhVHlwZSBjcmVhdGVKYXZhRGF0YVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhY2thZ2UgdmFsdWUKLQkgKi8KLQlKYXZhUGFja2FnZSBjcmVhdGVKYXZhUGFja2FnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JSmF2YVJlZlBhY2thZ2UgZ2V0SmF2YVJlZlBhY2thZ2UoKTsKLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZiYTk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZlBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFSZWZQYWNrYWdlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzUgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgSmF2YVJlZlBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZWZQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiamF2YSI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTUyA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19BQlNUUkFDVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lOVEVSRkFDRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOVEVSRkFDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VTVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRU9QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRVJFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIENvbnRhaW5tZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFMTF9DT05UQUlOTUVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIE9wZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQUxMX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSUQgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX0NMQVNTX19FSURfQVRUUklCVVRFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUlEX0FUVFJJQlVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19LSU5EID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fUFVCTElDID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0ZJTkFMID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19DTEFTU19JTVBPUlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19GSUVMRFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19NRVRIT0RTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU5JVElBTElaRVJTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRVZFTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0FMTF9FVkVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkphdmEgQ2xhc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklFTEQgPSA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0QgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUiA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFID0gMTA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFID0gOTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9FVkVOVCA9IDExOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBQ0tBR0UgPSA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBCTE9DSyA9IDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTU1FTlQgPSA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTVEFURU1FTlQgPSA3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUSUFMSVpFUiA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRJQUxJWkVSX19JU19TVEFUSUMgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUSUFMSVpFUl9fSkFWQV9DTEFTUyA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRJQUxJWkVSX19TT1VSQ0UgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Jbml0aWFsaXplcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUSUFMSVpFUl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19OQU1FID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fT1JERVJFRCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fTUFOWSA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX0VPUEVSQVRJT04gPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fRU9QRVJBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19GSU5BTCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SmF2YSBQYXJhbWV0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fTkFNRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19PUkRFUkVEID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fTUFOWSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUNvbnRhaW5pbmcgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FQ09OVEFJTklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FUEFSQU1FVEVSUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FUEFSQU1FVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXhjZXB0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FRVhDRVBUSU9OUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FRVhDRVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fQUJTVFJBQ1QgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYXRpdmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX05BVElWRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN5bmNocm9uaXplZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fU1lOQ0hST05JWkVEID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0ZJTkFMID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RydWN0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0NPTlNUUlVDVE9SID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhdGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19TVEFUSUMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX0pBVkFfVklTSUJJTElUWSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX1BBUkFNRVRFUlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19KQVZBX0VYQ0VQVElPTlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19KQVZBX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fU09VUkNFID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJRUxEX19OQU1FID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX09SREVSRUQgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1VOSVFVRSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19NQU5ZID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fRklOQUwgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhdGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1NUQVRJQyA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUVMRF9fSkFWQV9WSVNJQklMSVRZID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fVFJBTlNJRU5UID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1ZPTEFUSUxFID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJRUxEX19KQVZBX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUVMRF9fSU5JVElBTElaRVIgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5GaWVsZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEJMT0NLX19TT1VSQ0UgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBCTE9DS19fTkFNRSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEJMT0NLX19DT05URU5UUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJsb2NrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJMT0NLX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTU1FTlRfX1NPVVJDRSA9IEJMT0NLX19TT1VSQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTU1FTlRfX05BTUUgPSBCTE9DS19fTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09NTUVOVF9fQ09OVEVOVFMgPSBCTE9DS19fQ09OVEVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NTUVOVF9GRUFUVVJFX0NPVU5UID0gQkxPQ0tfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU1RBVEVNRU5UX19TT1VSQ0UgPSBCTE9DS19fU09VUkNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTVEFURU1FTlRfX05BTUUgPSBCTE9DS19fTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU1RBVEVNRU5UX19DT05URU5UUyA9IEJMT0NLX19DT05URU5UUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U3RhdGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFTUVOVF9GRUFUVVJFX0NPVU5UID0gQkxPQ0tfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19OU19VUkkgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX05TX1VSSTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnMgUHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19OU19QUkVGSVggPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX05TX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRmFjdG9yeSBJbnN0YW5jZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fRUZBQ1RPUllfSU5TVEFOQ0UgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VGQUNUT1JZX0lOU1RBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDbGFzc2lmaWVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19FQ0xBU1NJRklFUlMgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VDTEFTU0lGSUVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VicGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fRVNVQlBBQ0tBR0VTID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FU1VCUEFDS0FHRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19FU1VQRVJfUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRVNVUEVSX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19KQVZBX0NMQVNTRVMgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KYXZhIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRVBBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19BQlNUUkFDVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19JTlRFUkZBQ0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlRFUkZBQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRVNVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRU9QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX0FUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRVJFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBDb250YWlubWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgT3BlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJRCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUlEX0FUVFJJQlVURSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VJRF9BVFRSSUJVVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KYXZhIERhdGEgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTk5PVEFUSU9OUyA9IEpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19OQU1FID0gSkFWQV9DTEFTU19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBKQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lOU1RBTkNFX0NMQVNTID0gSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19ERUZBVUxUX1ZBTFVFID0gSkFWQV9DTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FUEFDS0FHRSA9IEpBVkFfQ0xBU1NfX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fQUJTVFJBQ1QgPSBKQVZBX0NMQVNTX19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19JTlRFUkZBQ0UgPSBKQVZBX0NMQVNTX19JTlRFUkZBQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FU1VQRVJfVFlQRVMgPSBKQVZBX0NMQVNTX19FU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VPUEVSQVRJT05TID0gSkFWQV9DTEFTU19fRU9QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX0FUVFJJQlVURVMgPSBKQVZBX0NMQVNTX19FQUxMX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX1JFRkVSRU5DRVMgPSBKQVZBX0NMQVNTX19FQUxMX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VSRUZFUkVOQ0VTID0gSkFWQV9DTEFTU19fRVJFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBVFRSSUJVVEVTID0gSkFWQV9DTEFTU19fRUFUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBDb250YWlubWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTID0gSkFWQV9DTEFTU19fRUFMTF9DT05UQUlOTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBPcGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX09QRVJBVElPTlMgPSBKQVZBX0NMQVNTX19FQUxMX09QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgPSBKQVZBX0NMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9TVVBFUl9UWVBFUyA9IEpBVkFfQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlEIEF0dHJpYnV0ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgQVJSQVlfVFlQRV9fRUlEX0FUVFJJQlVURSA9IEpBVkFfQ0xBU1NfX0VJRF9BVFRSSUJVVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTID0gSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fS0lORCA9IEpBVkFfQ0xBU1NfX0tJTkQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1YmxpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX1BVQkxJQyA9IEpBVkFfQ0xBU1NfX1BVQkxJQzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0ZJTkFMID0gSkFWQV9DTEFTU19fRklOQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSU1QTEVNRU5UU19JTlRFUkZBQ0VTID0gSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19DTEFTU19JTVBPUlQgPSBKQVZBX0NMQVNTX19DTEFTU19JTVBPUlQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX1BBQ0tBR0VfSU1QT1JUUyA9IEpBVkFfQ0xBU1NfX1BBQ0tBR0VfSU1QT1JUUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRklFTERTID0gSkFWQV9DTEFTU19fRklFTERTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19NRVRIT0RTID0gSkFWQV9DTEFTU19fTUVUSE9EUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSU5JVElBTElaRVJTID0gSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19ERUNMQVJFRF9DTEFTU0VTID0gSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fREVDTEFSSU5HX0NMQVNTID0gSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19KQVZBX1BBQ0tBR0UgPSBKQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VWRU5UUyA9IEpBVkFfQ0xBU1NfX0VWRU5UUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fQUxMX0VWRU5UUyA9IEpBVkFfQ0xBU1NfX0FMTF9FVkVOVFM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlMgPSBKQVZBX0NMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSA9IEpBVkFfQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BcnJheSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfRkVBVFVSRV9DT1VOVCA9IEpBVkFfQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX05BTUUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX09SREVSRUQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fTUFOWSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fQ0hBTkdFQUJMRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19DSEFOR0VBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fVk9MQVRJTEUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fVk9MQVRJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fVFJBTlNJRU5UID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1RSQU5TSUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlIExpdGVyYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5zZXR0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1VOU0VUVEFCTEUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fVU5TRVRUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXJpdmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fREVSSVZFRCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19ERVJJVkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0VDT05UQUlOSU5HX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KYXZhIEV2ZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfVklTSUJJTElUWV9LSU5EID0gMTM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX0tJTkQgPSAxNDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkpUeXBlIEphdmEgSGVscGVyczwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKVHlwZUphdmFIZWxwZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpUWVBFX0pBVkFfSEVMUEVSUyA9IDE1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5KVHlwZSBMaXN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEpUeXBlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKVFlQRV9MSVNUID0gMTY7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUWVBFX0tJTkQgPSAxMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJqYXZhLnhtaSI7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuamVtLmphdmEiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhUmVmUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFDbGFzcyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEphdmFDbGFzc19LaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc1B1YmxpYyA8ZW0+UHVibGljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVibGljPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzUHVibGljKCkKLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEphdmFDbGFzc19QdWJsaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNGaW5hbCgpCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKYXZhQ2xhc3NfRmluYWwoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0ltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19DbGFzc0ltcG9ydCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfUGFja2FnZUltcG9ydHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0ZpZWxkcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfTWV0aG9kcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfSW5pdGlhbGl6ZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19EZWNsYXJpbmdDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRGVjbGFyZWRDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19KYXZhUGFja2FnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19BbGxFdmVudHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRmllbGQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc0ZpbmFsKCkKLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmllbGRfRmluYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNTdGF0aWMgPGVtPlN0YXRpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXRpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzU3RhdGljKCkKLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmllbGRfU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX0phdmFWaXNpYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzVHJhbnNpZW50IDxlbT5UcmFuc2llbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc2llbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1RyYW5zaWVudCgpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX1RyYW5zaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1ZvbGF0aWxlIDxlbT5Wb2xhdGlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZvbGF0aWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNWb2xhdGlsZSgpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX1ZvbGF0aWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpZWxkX0phdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWVsZF9Jbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2Qgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNBYnN0cmFjdCA8ZW0+QWJzdHJhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BYnN0cmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9BYnN0cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNOYXRpdmUgPGVtPk5hdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hdGl2ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc05hdGl2ZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfTmF0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N5bmNocm9uaXplZCA8ZW0+U3luY2hyb25pemVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3luY2hyb25pemVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3luY2hyb25pemVkKCkKLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9TeW5jaHJvbml6ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNGaW5hbCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfRmluYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzQ29uc3RydWN0b3IgPGVtPkNvbnN0cnVjdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RydWN0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNDb25zdHJ1Y3RvcigpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfQ29uc3RydWN0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3RhdGljIDxlbT5TdGF0aWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGF0aWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNTdGF0aWMoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX1N0YXRpYygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kX1BhcmFtZXRlcnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kX0phdmFFeGNlcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kX1NvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhUGFyYW1ldGVyIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRKYXZhUGFyYW1ldGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIjaXNGaW5hbCgpCi0JICogQHNlZSAjZ2V0SmF2YVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SmF2YVBhcmFtZXRlcl9GaW5hbCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXJyYXlUeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcnJheVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnJheVR5cGVfQ29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhRGF0YVR5cGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFEYXRhVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhRXZlbnQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFFdmVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhUGFja2FnZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YVBhY2thZ2VfSmF2YUNsYXNzZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQmxvY2sgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEJsb2NrKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEJsb2NrX1NvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCbG9ja19OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJsb2NrX0NvbnRlbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENvbW1lbnQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU3RhdGVtZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRTdGF0ZW1lbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSW5pdGlhbGl6ZXIgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEluaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEluaXRpYWxpemVyX0lzU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEluaXRpYWxpemVyX0phdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbml0aWFsaXplcl9Tb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVZpc2liaWxpdHlLaW5kIG9iamVjdAotCSAqLwotCUVFbnVtIGdldEphdmFWaXNpYmlsaXR5S2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhUGFyYW1ldGVyS2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRKYXZhUGFyYW1ldGVyS2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUeXBlS2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRUeXBlS2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKVHlwZUxpc3Qgb2JqZWN0Ci0JICovCi0JRURhdGFUeXBlIGdldEpUeXBlTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKVHlwZUphdmFIZWxwZXJzIG9iamVjdAotCSAqLwotCUVEYXRhVHlwZSBnZXRKVHlwZUphdmFIZWxwZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlKYXZhUmVmRmFjdG9yeSBnZXRKYXZhUmVmRmFjdG9yeSgpOwotCi19IC8vSmF2YVJlZlBhY2thZ2UKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVVSTC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVVJMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTRkM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVVJMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVVSTC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjM1ICQgCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgSmF2YVVSTCBleHRlbmRzIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuVVJMIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1BST1RPQ09MX1VSSV9QUkVGSVggPSAiamF2YTovIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEphdmFVUkwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gdXJsU3RyaW5nIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSmF2YVVSTChTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCXN1cGVyKHVybFN0cmluZyk7Ci0JfQotCS8qKgotCSAqIEphdmFVUkwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbmFtZVNwYWNlTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGlEIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSmF2YVVSTChTdHJpbmcgbmFtZVNwYWNlTmFtZSwgU3RyaW5nIGlEKSB7Ci0JCXN1cGVyKG51bGwsIG51bGwpOwotCQlpbml0aWFsaXplTmFtZXNwYWNlU3RyaW5nKG5hbWVTcGFjZU5hbWUpOwotCQl0aGlzLklEID0gaUQ7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBjcmVhdGVkIGluIFZpc3VhbEFnZS4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChuYW1lc3BhY2VOYW1lICE9IG51bGwpIHsKLQkJCWJ1Zi5hcHBlbmQobmFtZXNwYWNlTmFtZSk7Ci0JCQlpZiAoSUQgIT0gbnVsbCkKLQkJCQlidWYuYXBwZW5kKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoSUQgIT0gbnVsbCkKLQkJCWJ1Zi5hcHBlbmQoSUQpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCVN0cmluZyBpbnRlcm5hbE5hbWUgPSBuYW1lc3BhY2VOYW1lLnN1YnN0cmluZyhKQVZBX1BST1RPQ09MX1VSSV9QUkVGSVgubGVuZ3RoKCksIG5hbWVzcGFjZU5hbWUubGVuZ3RoKCkpOwotCQlyZXR1cm4gSmF2YVBhY2thZ2UuUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRS5lcXVhbHMoaW50ZXJuYWxOYW1lKSA/ICIiIDogaW50ZXJuYWxOYW1lOyAvLyROT04tTkxTLTEkCi0JfQotCS8qIElmIHdlIGRvbid0IGhhdmUgYSAjIHNpZ24gdG8gZGVsaW1pdCB0aGUgc3RhcnQgb2YgdGhlIGphdmEgcGFja2FnZSB1cyB0aGUgaW5oZXJpdGVkIGJlaGF2aW9yCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21TdHJpbmcoU3RyaW5nIHVybCkgewotCQlpZiAodXJsLmluZGV4T2YoIiMiKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21TdHJpbmcodXJsKTsKLQkJZWxzZSB7Ci0JCQlpbnQgZW5kT2ZQYWNrYWdlTmFtZSA9IHVybC5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGVuZE9mUGFja2FnZU5hbWUgPT0gLTEpCi0JCQkJaW5pdGlhbGl6ZU5hbWVzcGFjZVN0cmluZyhudWxsKTsKLQkJCWVsc2UKLQkJCQlpbml0aWFsaXplTmFtZXNwYWNlU3RyaW5nKHVybC5zdWJzdHJpbmcoMCwgZW5kT2ZQYWNrYWdlTmFtZSkpOwotCQkJSUQgPSB1cmwuc3Vic3RyaW5nKGVuZE9mUGFja2FnZU5hbWUgKyAxKTsKLQkJfQotCi0JfQotCS8qIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOYW1lc3BhY2VTdHJpbmcoU3RyaW5nIGFOYW1lc3BhY2VOYW1lKSB7Ci0JCWlmIChhTmFtZXNwYWNlTmFtZSA9PSBudWxsKQotCQkJbmFtZXNwYWNlTmFtZSA9IEpBVkFfUFJPVE9DT0xfVVJJX1BSRUZJWDsKLQkJZWxzZQotCQkJbmFtZXNwYWNlTmFtZSA9IEpBVkFfUFJPVE9DT0xfVVJJX1BSRUZJWCArIGFOYW1lc3BhY2VOYW1lOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhVVJMKFN0cmluZyBhVXJsU3RyaW5nKSB7Ci0JCWlmIChhVXJsU3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhVXJsU3RyaW5nLnN0YXJ0c1dpdGgoSkFWQV9QUk9UT0NPTF9VUklfUFJFRklYKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlVSTCgiICsgZ2V0RnVsbFN0cmluZygpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFWaXNpYmlsaXR5S2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVmlzaWJpbGl0eUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlODEzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFWaXNpYmlsaXR5S2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhVmlzaWJpbGl0eUtpbmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQQUNLQUdFPTEKLSAqIFBVQkxJQz0yCi0gKiBQUklWQVRFPTMKLSAqIFBST1RFQ1RFRD00Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEphdmFWaXNpYmlsaXR5S2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEphdmFWaXNpYmlsaXR5S2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBVQkxJQzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQVUJMSUNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSUMgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFJJVkFURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUklWQVRFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QUk9URUNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPVEVDVEVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVEVEID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBBQ0tBR0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUEFDS0FHRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0UgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFVCTElDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QVUJMSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFVCTElDCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIFBVQkxJQ19MSVRFUkFMID0gbmV3IEphdmFWaXNpYmlsaXR5S2luZChQVUJMSUMsICJQVUJMSUMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBSSVZBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBSSVZBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJJVkFURQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBQUklWQVRFX0xJVEVSQUwgPSBuZXcgSmF2YVZpc2liaWxpdHlLaW5kKFBSSVZBVEUsICJQUklWQVRFIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QUk9URUNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBST1RFQ1RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUk9URUNURUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmQgUFJPVEVDVEVEX0xJVEVSQUwgPSBuZXcgSmF2YVZpc2liaWxpdHlLaW5kKFBST1RFQ1RFRCwgIlBST1RFQ1RFRCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UEFDS0FHRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UEFDS0FHRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQQUNLQUdFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIFBBQ0tBR0VfTElURVJBTCA9IG5ldyBKYXZhVmlzaWJpbGl0eUtpbmQoUEFDS0FHRSwgIlBBQ0tBR0UiKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSmF2YVZpc2liaWxpdHlLaW5kW10gewotCQkJUFVCTElDX0xJVEVSQUwsCi0JCQlQUklWQVRFX0xJVEVSQUwsCi0JCQlQUk9URUNURURfTElURVJBTCwKLQkJCVBBQ0tBR0VfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJSmF2YVZpc2liaWxpdHlLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFBVQkxJQzogcmV0dXJuIFBVQkxJQ19MSVRFUkFMOwotCQkJY2FzZSBQUklWQVRFOiByZXR1cm4gUFJJVkFURV9MSVRFUkFMOwotCQkJY2FzZSBQUk9URUNURUQ6IHJldHVybiBQUk9URUNURURfTElURVJBTDsKLQkJCWNhc2UgUEFDS0FHRTogcmV0dXJuIFBBQ0tBR0VfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBKYXZhVmlzaWJpbGl0eUtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vSmF2YVZpc2liaWxpdHlLaW5kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL01ldGhvZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9NZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1MzY5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL01ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IE1ldGhvZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA5LzE1IDEzOjQyOjA0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZCBleHRlbmRzIEVPcGVyYXRpb257Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURURfQ09NTUVOVF9UQUcgPSAiQGdlbmVyYXRlZCI7Ci0JLyoqCi0JICogTGlzdHMgYWxsIHRoZSBwYXJhbWV0ZXJzLCBleGNsdWRpbmcgdGhlIHJldHVybiB0eXBlCi0JICovIAotCXB1YmxpYyBKYXZhUGFyYW1ldGVyW10gbGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNBYnN0cmFjdCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0Fic3RyYWN0IDxlbT5BYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFic3RyYWN0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzTmF0aXZlIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNOYXRpdmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc05hdGl2ZSA8ZW0+TmF0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYXRpdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTmF0aXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYXRpdmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNTeW5jaHJvbml6ZWQgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3luY2hyb25pemVkIDxlbT5TeW5jaHJvbml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5bmNocm9uaXplZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTeW5jaHJvbml6ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN5bmNocm9uaXplZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc0ZpbmFsIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNGaW5hbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNDb25zdHJ1Y3RvciBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzQ29uc3RydWN0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0NvbnN0cnVjdG9yIDxlbT5Db25zdHJ1Y3RvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RydWN0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzQ29uc3RydWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnN0cnVjdG9yKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzU3RhdGljIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNTdGF0aWMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N0YXRpYyA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0aWM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGF0aWMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSmF2YVZpc2liaWxpdHkgYXR0cmlidXRlCi0JICovCi0JSmF2YVZpc2liaWxpdHlLaW5kIGdldEphdmFWaXNpYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjZ2V0SmF2YVZpc2liaWxpdHkgPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBWaXNpYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZAotCSAqIEBzZWUgI2dldEphdmFWaXNpYmlsaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBQYXJhbWV0ZXJzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRQYXJhbWV0ZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEphdmFFeGNlcHRpb25zIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRKYXZhRXhjZXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgSmF2YUNsYXNzIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNnZXRKYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNvdXJjZSByZWZlcmVuY2UKLQkgKi8KLQlCbG9jayBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShCbG9jayB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gdGhlIGphdmEgY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGluLgotCSAqLwotCUphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgdGhlIG1ldGhvZCBuYW1lIGFuZCBpdHMgcGFyYW1ldGVycy4gZS5nLiA8Y29kZT4KLQkgKiBzZXRGaXJzdE5hbWUoamF2YS5sYW5nLlN0cmluZykgPC8vY29kZT4gLgotCSAqICAKLQkgKi8KLQlTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgUGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLgotCSAqLwotCUphdmFQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbWV0ZXJOYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEdldCB0aGUgcmV0dXJuIHR5cGUuCi0JICovCi0JSmF2YUhlbHBlcnMgZ2V0UmV0dXJuVHlwZSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTZXQgdGhlIHJldHVybiB0eXBlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbCB0eXBlRGF0YVR5cGU9Im9yZy5lY2xpcHNlLmplbS5qYXZhLkpUeXBlSmF2YUhlbHBlcnMiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV0dXJuVHlwZShKYXZhSGVscGVycyB0eXBlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QudG9TdHJpbmcoKS4KLQkgKiAKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBNZXRob2QuICBUaGUgc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyB0aGUgbWV0aG9kIAotCSAqIGFjY2VzcyBtb2RpZmllcnMsIGlmIGFueSwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCByZXR1cm4gdHlwZSwgZm9sbG93ZWQgYnkgYQotCSAqIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZXRob2QsIGZvbGxvd2VkIGJ5IGEgcGVyaW9kLAotCSAqIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgbmFtZSwgZm9sbG93ZWQgYnkgYSBwYXJlbnRoZXNpemVkLCBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCSAqIG9mIHRoZSBtZXRob2QncyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgbWV0aG9kIHRocm93cyBjaGVja2VkCi0JICogZXhjZXB0aW9ucywgdGhlIHBhcmFtZXRlciBsaXN0IGlzIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSB3b3JkCi0JICogdGhyb3dzIGZvbGxvd2VkIGJ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRocm93biBleGNlcHRpb24gdHlwZXMuCi0JICogCi0JICogRm9yIGV4YW1wbGU6Ci0JICogCi0JICogICAgIHB1YmxpYyBib29sZWFuIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICogCi0JICogVGhlIGFjY2VzcyBtb2RpZmllcnMgYXJlIHBsYWNlZCBpbiBjYW5vbmljYWwgb3JkZXIgYXMgc3BlY2lmaWVkIGJ5ICJUaGUgSmF2YQotCSAqIExhbmd1YWdlIFNwZWNpZmljYXRpb24iLiAgVGhpcyBpcyBwdWJsaWMsIDx0dD5wcm90ZWN0ZWQ8Ly90dD4gb3IKLQkgKiA8dHQ+cHJpdmF0ZTwvL3R0PiBmaXJzdCwgYW5kIHRoZW4gb3RoZXIgbW9kaWZpZXJzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0JICogPHR0PmFic3RyYWN0PC8vdHQ+LCA8dHQ+c3RhdGljPC8vdHQ+LCA8dHQ+ZmluYWw8Ly90dD4sIDx0dD5zeW5jaHJvbml6ZWQ8Ly90dD4KLQkgKiA8dHQ+bmF0aXZlPC8vdHQ+LgotCi0JICovCi0JU3RyaW5nIGdldFNpZ25hdHVyZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2QgaXMgc3lzdGVtIGdlbmVyYXRlZC4KLQkgKiBUaGlzIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgQGdlbmVyYXRlZCB0YWcgaW4gdGhlIGNvbW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0dlbmVyYXRlZCgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTZXQgdGhlIGlzR2VuZXJhdGVkIGZsYWcuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzR2VuZXJhdGVkKGJvb2xlYW4gZ2VuZXJhdGVkKTsKLQotICAgIC8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgYSB2b2lkIHJldHVybiB0eXBlIG1ldGhvZC4KLQkgKi8KLQlib29sZWFuIGlzVm9pZCgpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9TdGF0ZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTU1N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9TdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFN0YXRlbWVudC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRlbWVudCBleHRlbmRzIEJsb2NrIHsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvVHlwZUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvVHlwZUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhNTc2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1R5cGVLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFR5cGVLaW5kLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVOREVGSU5FRD0xIENMQVNTPTIgSU5URVJGQUNFPTMgRVhDRVBUSU9OPTQKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0VHlwZUtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUeXBlS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVOREVGSU5FRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVTkRFRklORURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0xBU1M8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0xBU1NfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFUkZBQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5URVJGQUNFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJGQUNFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWENFUFRJT05fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWENFUFRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VU5ERUZJTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VTkRFRklORUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVU5ERUZJTkVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUtpbmQgVU5ERUZJTkVEX0xJVEVSQUwgPSBuZXcgVHlwZUtpbmQoVU5ERUZJTkVELCAiVU5ERUZJTkVEIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DTEFTUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0xBU1M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0xBU1MKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlS2luZCBDTEFTU19MSVRFUkFMID0gbmV3IFR5cGVLaW5kKENMQVNTLCAiQ0xBU1MiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVEVSRkFDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5URVJGQUNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVEVSRkFDRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVLaW5kIElOVEVSRkFDRV9MSVRFUkFMID0gbmV3IFR5cGVLaW5kKElOVEVSRkFDRSwgIklOVEVSRkFDRSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVhDRVBUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FWENFUFRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhDRVBUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUtpbmQgRVhDRVBUSU9OX0xJVEVSQUwgPSBuZXcgVHlwZUtpbmQoRVhDRVBUSU9OLCAiRVhDRVBUSU9OIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFR5cGVLaW5kW10gewotCQkJVU5ERUZJTkVEX0xJVEVSQUwsCi0JCQlDTEFTU19MSVRFUkFMLAotCQkJSU5URVJGQUNFX0xJVEVSQUwsCi0JCQlFWENFUFRJT05fTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UeXBlIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBUeXBlS2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVR5cGVLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgVHlwZUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFVOREVGSU5FRDogcmV0dXJuIFVOREVGSU5FRF9MSVRFUkFMOwotCQkJY2FzZSBDTEFTUzogcmV0dXJuIENMQVNTX0xJVEVSQUw7Ci0JCQljYXNlIElOVEVSRkFDRTogcmV0dXJuIElOVEVSRkFDRV9MSVRFUkFMOwotCQkJY2FzZSBFWENFUFRJT046IHJldHVybiBFWENFUFRJT05fTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBUeXBlS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9UeXBlS2luZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDVkNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJSmF2YVJlZmxlY3Rpb25LZXkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotcHVibGljIGludGVyZmFjZSBJSmF2YVJlZmxlY3Rpb25LZXkgewotCi0JLyogQ29uc3RhbnRzIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUgbmFtZXMKLQkgKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyB3aGljaCBhcmUgdXNlZCB0byByZWZlciB0byBhIHByaW1pdGl2ZSB0eXBlLAotCSAqIGkuZS4gbmV3IEphdmFVUkwoImludCIpICBvciBuZXcgVVJMKCJqYXZhOi8vI2ludCIpCi0JICogVGhlc2UgdHlwZXMgYXJlIGNhY2hlZCBieSBwcmUtbG9hZGluZyBkb2N1bWVudHMgZm9yIHRoZSBwcmltaXRpdmVzLAotCSAqIGluICJqYXZhOi8vIiwgYW5kIGZvciB0aGUgamF2YS5sYW5nIChPYmplY3QgYW5kIFN0cmluZykgY2xhc3NlcwotCSAqLwotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fVk9JRCA9ICJ2b2lkIjsJIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0lOVCA9ICJpbnQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0JPT0xFQU4gPSAiYm9vbGVhbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fQ0hBUiA9ICJjaGFyIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9CWVRFID0gImJ5dGUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0xPTkcgPSAibG9uZyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fRkxPQVQgPSAiZmxvYXQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0RPVUJMRSA9ICJkb3VibGUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX1NIT1JUID0gInNob3J0IjsvLyROT04tTkxTLTEkCi0KLQkvKiAKLQkgKiBDcmVhdGUgYW4gQXJyYXlUeXBlIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBKYXZhQ2xhc3MgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEphdmFDbGFzcyBjcmVhdGVKYXZhQ2xhc3MoKTsKLQotCS8qIAotCSAqIENyZWF0ZSBhIEZpZWxkIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBGaWVsZCBjcmVhdGVKYXZhRmllbGQoKTsKLQotCS8qIAotCSAqIENyZWF0ZSBhIE1ldGhvZCBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTWV0aG9kIGNyZWF0ZUphdmFNZXRob2QoKTsKLQotCS8qIAotCSAqIENyZWF0ZSBhIEphdmFQYXJhbWV0ZXIgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSmF2YVBhcmFtZXRlciBjcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0KLQkvL0ZCLyoqCi0JLy9GQiAqIE92ZXJyaWRlIHRvIHRyeSB0byBpbnRyb3NwZWN0IG9iamVjdHMKLQkvL0ZCICogdGhhdCBhcmVuJ3QgZm91bmQgdXNpbmcgdGhlIGRlZmF1bHQgbWVjaGFuaXNtLgotCS8vRkIgKi8KLQkvL0ZCcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotCS8vRkIgCU9iamVjdCBqYXZhT2JqZWN0ID0gc3VwZXIuZ2V0KGtleSk7Ci0JLy9GQiAJaWYgKGphdmFPYmplY3QgPT0gbnVsbCkgewotCS8vRkIgCQlqYXZhT2JqZWN0ID0gZ2V0T2JqZWN0RnJvbUV4dGVuc2lvbnMoKFN0cmluZykga2V5KTsKLQkvL0ZCIAkJaWYgKGphdmFPYmplY3QgPT0gbnVsbCkKLQkvL0ZCIAkJCWphdmFPYmplY3QgPSBnZXRKYXZhT2JqZWN0KChTdHJpbmcpIGtleSk7Ci0JLy9GQiAJfQotCS8vRkIJcmV0dXJuIGphdmFPYmplY3Q7Ci0JLy9GQn0KLQotCS8vRkIgQURERUQKLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldChTdHJpbmcga2V5KTsKLQotCS8vRkIgRU5ECi0KLQkvKgotCSAqIEluc3RhbnRpYXRlIHRoZSBuYW1lZCBjbGFzcy4KLQkgKiBJZiB3ZSBtYWtlIGl0IHRvIHRoaXMgcG9pbnQsIHRoZSBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGluc3RhbnRpYXRlZCBvciByZWZsZWN0ZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVDbGFzc2lmaWVyIGdldEFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoKLQkgKiBJbnN0YW50aWF0ZSB0aGUgbmFtZWQgY2xhc3MuCi0JICogSWYgd2UgbWFrZSBpdCB0byB0aGlzIHBvaW50LCB0ZWggY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQgb3IgcmVmbGVjdGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFQ2xhc3NpZmllciBnZXRKYXZhQ2xhc3MoU3RyaW5nIHR5cGVOYW1lKTsKLQotCS8qKgotCSAqIFRoaXMgYWxsb3dzIGZvciB0aGUgcmV0cmlldmFsIG9mIGF0dHJpYnV0ZXMvbWV0aG9kcyB3aXRoIHRoZSBmb2xsb3dpbmcgbm90YXRpb246Ci0JICogZmllbGQ6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vCi0JICogbWV0aG9kOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvb2ZvbygKLQkgKiBwYXJhbWV0ZXI6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vZm9vKC1hcmcwCi0JICogCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVPYmplY3QgZ2V0SmF2YU9iamVjdChTdHJpbmcga2V5VmFsdWUpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMC80LzIwMDAgOTo1MjoyOCBBTSkKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcgotCSAqIEBwYXJhbSB0eXBlTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVDbGFzc2lmaWVyIGdldEphdmFUeXBlKFN0cmluZyB0eXBlTmFtZSk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBrZXkgYnV0IGRvbid0IGRvIGFueSAKLQkgKiB0cmllcyBhdCBjcmVhdGlvbiBvZiB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKiBUaGUgS2V5IG11c3QgYmUgYW4gSUQgZm9yIGl0IHRvIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgcHJpbUdldChTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXNzZWQgdHlwZSByZXByZXNlbnRzIGEgSmF2YSBBcnJheSB0eXBlCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBcnJheShTdHJpbmcgdHlwZU5hbWUpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNmQzNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjMyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnM7Ci0KLS8qKgotICogRXh0ZW5zaW9uIGludGVyZmFjZSB0byBhZGQgYW4gYWRkaXRpb25hbCByZWZsZWN0aW9uIGtleSBpbiB0byBoYW5kbGUKLSAqIG90aGVyIHR5cGVzIG9mIGtleSdzIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlZC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqIEdldCB0aGUgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGlkLgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSByZWZsZWN0aW9uS2V5Ci0JICogQHJldHVybiB0aGUgb2JqZWN0IChpdCBzaG91bGQgYWRkIHRoZSBpZCB3aXRoIG9iamVjdCB0byB0aGUgcmVzb3VyY2UncyBpZCB0YWJsZSBiZWZvcmUgcmV0dXJuaW5nIGl0KSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgb25lIGl0IGhhbmRsZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIGlkLCBJSmF2YVJlZmxlY3Rpb25LZXkgcmVmbGVjdGlvbktleSk7Ci0JCi19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZGY2ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVhNSUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVhNSUZhY3RvcnlJbXBsOwotIAotCi0vKioKLSAqIEZhY3RvcnkgZm9yIEphdmEgWE1JIFJlc291cmNlcy4KLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFYTUlGYWN0b3J5IHsKLQotCS8qKgotCSAqIFNjaGVtZSB1c2VkIGluIFVSSSdzIGZvciBqZW0gZWxlbWVudHMuCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhWE1JRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBKYXZhWE1JRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJlZ2lzdGVyIHRoZSByZWZsZWN0aW9uIGtleSBleHRlbnNpb24uCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVmbGVjdGlvbktleUV4dGVuc2lvbihJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gZXh0ZW5zaW9uKTsKLQkKLQkvKioKLQkgKiBEZXJlZ2lzdGVyIHRoZSByZWZsZWN0aW9uIGtleSBleHRlbnNpb24uCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBleHRlbnNpb24pOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0FycmF5VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9BcnJheVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZTE0ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0FycmF5VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBBcnJheVR5cGVJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjA6Mjg6MDQgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuVHlwZUtpbmQ7Ci0KLS8qKgotICogRGVzY3JpYmVzIGEgSmF2YSBBcnJheSB0eXBlCi0gKiAgICBGb3IgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlCi0gKiAgICBzcGVjaWZpZWQgZGlyZWN0bHkuICBUaGlzIHdvdWxkIHJlcXVpcmUgaW5zdGFudGlhdGluZyBhIGNoYWluIG9mIGNvbXBvbmVudCB0eXBlcwotICogICAgc3VjaCBhcyBTdHJpbmdbXVtdW11bXS0+U3RyaW5nW11bXVtdLT5TdHJpbmdbXVtdLT5TdHJpbmdbXS0+U3RyaW5nLgotICogCi0gKiAgIFRoZSBjb21wb25lbnQgdHlwZSByZWxhdGlvbnNoaXAgd2lsbCBiZSBjb21wdXRlZCBpZiB0aGUgZmluYWxDb21wb25lbnRUeXBlCi0gKiAgIGFuZCBhcnJheSBkaW1lbnNpb25zIGlzIHNwZWNpZmllZC4KLSAqICAKLSAqICAgRm9yIHRoaXMgcmVhc29uLCB0aGUgcHJlZmVycmVkIHdheSB0byBjcmVhdGUgaXMgdGhyb3VnaCB0aGUgSmF2YVJlZkZhY3RvcnkgZmFjdG9yeSBtZXRob2Q6Ci0gKiAgICAgICAgY3JlYXRlQXJyYXlUeXBlKEphdmFDbGFzcyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKQotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlUeXBlSW1wbCBleHRlbmRzIEphdmFDbGFzc0ltcGwgaW1wbGVtZW50cyBBcnJheVR5cGUsIEphdmFDbGFzc3sKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcnJheURpbWVuc2lvbnMoKSA8ZW0+QXJyYXkgRGltZW5zaW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJyYXlEaW1lbnNpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBBUlJBWV9ESU1FTlNJT05TX0VERUZBVUxUID0gMDsKLQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBpbnQgYXJyYXlEaW1lbnNpb25zID0gQVJSQVlfRElNRU5TSU9OU19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wb25lbnRUeXBlKCkgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzaWZpZXIgY29tcG9uZW50VHlwZSA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIEphdmFIZWxwZXJzIGZpbmFsQ29tcG9uZW50VHlwZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJyYXlUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgYXJyYXkgdHlwZSBmcm9tIG91ciB0eXBlIG5hbWUuCi0JICogVGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkgdHlwZSBpcyBlc3NlbnRpYWxseTogbmV3IEFycmF5VHlwZUltcGwoZmluYWxDb21wb25lbnRUeXBlLCBhcnJheURpbWVuc2lvbnMtMSkKLQkgKiB1bmxlc3Mgb3VyIGFycmF5IGRpbWVuc2lvbiBpcyAxLCBpbiB3aGljaCBjYXNlIGl0IGlzIG9ubHkgb3VyIGZpbmFsIGNvbXBvbmVudCB0eXBlLgotCSAqCi0JICogSW4gb3JkZXIgdG8gZW5zdXJlIGEgdW5pcXVlIGluc3RhbmNlLCB3ZSB3aWxsIHJlc29sdmUgdGhpcyB0eXBlIHVzaW5nIHJlZmxlY3Rpb24uCi0JICogImphdmEubGFuZy5TdHJpbmdbXVtdIiBjb21wb25lbnQgdHlwZSBpcyAiamF2YS5sYW5nLlN0cmluZ1tdIgotCSAqCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIGNvbXB1dGVDb21wb25lbnRUeXBlKCkgewotCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IGdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCS8vIFN0cmlwIHRoZSBsYXN0IFtdIGZvcm0gbXkgbmFtZSB0byBnZXQgbXkgY29tcG9uZW50IHR5cGUncyBuYW1lCi0JCWNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lLnN1YnN0cmluZygwLCBjb21wb25lbnROYW1lLmxlbmd0aCgpIC0gMik7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoY29tcG9uZW50TmFtZSwgdGhpcyk7Ci0JfQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHBlcmZvcm0gc29tZSBsYXp5IGluaXRpYWxpemF0aW9uCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldENvbXBvbmVudFR5cGUoKSB7Ci0JCS8vIElmIHdlIGRvIG5vdCBoYXZlIGEgY29tcG9uZW50IHR5cGUgc2V0LCBidXQgd2UgaGF2ZSBhIG5hbWUgKHdoaWNoIGNvbnRhaW5zIG91ciBjb21wb25lbnQgdHlwZSBuYW1lKQotCQkvLyB3ZSBjYW4gY29tcHV0ZSB0aGUgY29tcG9uZW50IHR5cGUuCi0JCWlmICgodGhpcy5nZXRDb21wb25lbnRUeXBlR2VuKCkgPT0gbnVsbCkgJiYgKHRoaXMuZ2V0TmFtZSgpICE9IG51bGwpKSB7Ci0JCQljb21wb25lbnRUeXBlID0gY29tcHV0ZUNvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZ2V0Q29tcG9uZW50VHlwZUdlbigpOwotCX0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkuIAotCSAqIAotCSAqIElmIHRoaXMgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSwgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUgdGhlIG5lc3RlZCBhcnJheSB0eXBlLgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKSB7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpIGdldENvbXBvbmVudFR5cGUoKTsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBBcnJheSBUeXBlLgotCSAqIAotCSAqIEluIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZyByZWZsZWN0aW9uLiBJdCB0dXJucyBvdXQgdG8gYmUgbW9zdCBlZmZpY2llbnQgdG8ganVzdCBkbyB0aGlzIGJ5IHRyaW1taW5nIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRGaW5hbENvbXBvbmVudFR5cGUoKSB7Ci0JCWlmIChmaW5hbENvbXBvbmVudFR5cGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJLy8gU3RyaXAgYWxsIHRoZSBbXSBmcm9tIG15IG5hbWUgdG8gZ2V0IG15IEZJTkFMIGNvbXBvbmVudCB0eXBlJ3MgbmFtZQotCQkJY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUuc3Vic3RyaW5nKDAsIGNvbXBvbmVudE5hbWUuaW5kZXhPZigiWyIpKTsKLQkJCWZpbmFsQ29tcG9uZW50VHlwZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShjb21wb25lbnROYW1lLCB0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmluYWxDb21wb25lbnRUeXBlOwotCX0KLQkvKioKLQkgKiAoSmF2YUhlbHBlcnMpaXNBcnJheSAtIEFycmF5VHlwZXMgYXJlIGFycmF5cwotCSAqIE92ZXJyaWRlIGZyb20gSmF2YUNsYXNzLgotCSAqLyAgICAKLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogSXMgdGhpcyBhbiBhcnJheSBvZiBqYXZhIHByaW1pdGl2ZXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZUFycmF5KCkgewotCQlyZXR1cm4gZ2V0RmluYWxDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKTsKLQl9Ci0JLyoqCi0JICogU2V0IHRoZSBjb21wb25lbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlKEphdmFIZWxwZXJzIGhlbHBlckNvbXBvbmVudFR5cGUpIHsKLQkJc2V0Q29tcG9uZW50VHlwZSgoRUNsYXNzaWZpZXIpIGhlbHBlckNvbXBvbmVudFR5cGUpOwkJCi0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXJyYXlEaW1lbnNpb25zKCkgewotCQlyZXR1cm4gYXJyYXlEaW1lbnNpb25zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFycmF5RGltZW5zaW9ucyhpbnQgbmV3QXJyYXlEaW1lbnNpb25zKSB7Ci0JCWludCBvbGRBcnJheURpbWVuc2lvbnMgPSBhcnJheURpbWVuc2lvbnM7Ci0JCWFycmF5RGltZW5zaW9ucyA9IG5ld0FycmF5RGltZW5zaW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUywgb2xkQXJyYXlEaW1lbnNpb25zLCBhcnJheURpbWVuc2lvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3NOYW1lICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzc05hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTlNUQU5DRV9DTEFTUzoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGdldEluc3RhbmNlQ2xhc3MoKSAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX0VERUZBVUxULmVxdWFscyhnZXRJbnN0YW5jZUNsYXNzKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUZBVUxUX1ZBTFVFOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVBBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDApICE9IEFCU1RSQUNUX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5URVJGQUNFX0VGTEFHKSAhPSAwKSAhPSBJTlRFUkZBQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VTVVBFUl9UWVBFUzoKLQkJCQlyZXR1cm4gZVN1cGVyVHlwZXMgIT0gbnVsbCAmJiAhZVN1cGVyVHlwZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FT1BFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZU9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhZU9wZXJhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQUxMX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTOgotCQkJCXJldHVybiAhZ2V0RUFsbFJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VSRUZFUkVOQ0VTOgotCQkJCXJldHVybiAhZ2V0RVJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBVFRSSUJVVEVTOgotCQkJCXJldHVybiAhZ2V0RUF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTOgotCQkJCXJldHVybiAhZ2V0RUFsbENvbnRhaW5tZW50cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFMTF9PUEVSQVRJT05TOgotCQkJCXJldHVybiAhZ2V0RUFsbE9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfU1VQRVJfVFlQRVM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3VwZXJUeXBlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUlEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuIGVTdHJ1Y3R1cmFsRmVhdHVyZXMgIT0gbnVsbCAmJiAhZVN0cnVjdHVyYWxGZWF0dXJlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0tJTkQ6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fUFVCTElDOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFBVQkxJQ19FRkxBRykgIT0gMCkgIT0gUFVCTElDX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19GSU5BTDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCkgIT0gRklOQUxfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lNUExFTUVOVFNfSU5URVJGQUNFUzoKLQkJCQlyZXR1cm4gaW1wbGVtZW50c0ludGVyZmFjZXMgIT0gbnVsbCAmJiAhaW1wbGVtZW50c0ludGVyZmFjZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DTEFTU19JTVBPUlQ6Ci0JCQkJcmV0dXJuIGNsYXNzSW1wb3J0ICE9IG51bGwgJiYgIWNsYXNzSW1wb3J0LmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fUEFDS0FHRV9JTVBPUlRTOgotCQkJCXJldHVybiBwYWNrYWdlSW1wb3J0cyAhPSBudWxsICYmICFwYWNrYWdlSW1wb3J0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gZmllbGRzICE9IG51bGwgJiYgIWZpZWxkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIG1ldGhvZHMgIT0gbnVsbCAmJiAhbWV0aG9kcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOSVRJQUxJWkVSUzoKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXJzICE9IG51bGwgJiYgIWluaXRpYWxpemVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGRlY2xhcmVkQ2xhc3NlcyAhPSBudWxsICYmICFkZWNsYXJlZENsYXNzZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0pBVkFfUEFDS0FHRToKLQkJCQlyZXR1cm4gYmFzaWNHZXRKYXZhUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VWRU5UUzoKLQkJCQlyZXR1cm4gZXZlbnRzICE9IG51bGwgJiYgIWV2ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FMTF9FVkVOVFM6Ci0JCQkJcmV0dXJuICFnZXRBbGxFdmVudHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlM6Ci0JCQkJcmV0dXJuIGFycmF5RGltZW5zaW9ucyAhPSBBUlJBWV9ESU1FTlNJT05TX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRToKLQkJCQlyZXR1cm4gY29tcG9uZW50VHlwZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRToKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FCU1RSQUNUOgotCQkJCXNldEFic3RyYWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU5URVJGQUNFOgotCQkJCXNldEludGVyZmFjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VTVVBFUl9UWVBFUzoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRU9QRVJBVElPTlM6Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVPcGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCWdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5jbGVhcigpOwotCQkJCWdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fS0lORDoKLQkJCQlzZXRLaW5kKChUeXBlS2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19QVUJMSUM6Ci0JCQkJc2V0UHVibGljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRklOQUw6Ci0JCQkJc2V0RmluYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJCWdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NMQVNTX0lNUE9SVDoKLQkJCQlnZXRDbGFzc0ltcG9ydCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2xhc3NJbXBvcnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fUEFDS0FHRV9JTVBPUlRTOgotCQkJCWdldFBhY2thZ2VJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYWNrYWdlSW1wb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19GSUVMRFM6Ci0JCQkJZ2V0RmllbGRzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWVsZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOSVRJQUxJWkVSUzoKLQkJCQlnZXRJbml0aWFsaXplcnMoKS5jbGVhcigpOwotCQkJCWdldEluaXRpYWxpemVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCWdldERlY2xhcmVkQ2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVjbGFyZWRDbGFzc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlzZXREZWNsYXJpbmdDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VWRU5UUzoKLQkJCQlnZXRFdmVudHMoKS5jbGVhcigpOwotCQkJCWdldEV2ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BTExfRVZFTlRTOgotCQkJCWdldEFsbEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0QWxsRXZlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlM6Ci0JCQkJc2V0QXJyYXlEaW1lbnNpb25zKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRToKLQkJCQlzZXRDb21wb25lbnRUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQUJTVFJBQ1Q6Ci0JCQkJc2V0QWJzdHJhY3QoQUJTVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU5URVJGQUNFOgotCQkJCXNldEludGVyZmFjZShJTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVNVUEVSX1RZUEVTOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VPUEVSQVRJT05TOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCWdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fS0lORDoKLQkJCQlzZXRLaW5kKEtJTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fUFVCTElDOgotCQkJCXNldFB1YmxpYyhQVUJMSUNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRklOQUw6Ci0JCQkJc2V0RmluYWwoRklOQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU1QTEVNRU5UU19JTlRFUkZBQ0VTOgotCQkJCWdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NMQVNTX0lNUE9SVDoKLQkJCQlnZXRDbGFzc0ltcG9ydCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19QQUNLQUdFX0lNUE9SVFM6Ci0JCQkJZ2V0UGFja2FnZUltcG9ydHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRklFTERTOgotCQkJCWdldEZpZWxkcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19NRVRIT0RTOgotCQkJCWdldE1ldGhvZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU5JVElBTElaRVJTOgotCQkJCWdldEluaXRpYWxpemVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCWdldERlY2xhcmVkQ2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJc2V0RGVjbGFyaW5nQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VWRU5UUzoKLQkJCQlnZXRFdmVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQUxMX0VWRU5UUzoKLQkJCQlnZXRBbGxFdmVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUzoKLQkJCQlzZXRBcnJheURpbWVuc2lvbnMoQVJSQVlfRElNRU5TSU9OU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRToKLQkJCQlzZXRDb21wb25lbnRUeXBlKChFQ2xhc3NpZmllciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFycmF5RGltZW5zaW9uczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXJyYXlEaW1lbnNpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldENvbXBvbmVudFR5cGVHZW4oKSB7Ci0JCWlmIChjb21wb25lbnRUeXBlICE9IG51bGwgJiYgY29tcG9uZW50VHlwZS5lSXNQcm94eSgpKSB7Ci0JCQlFQ2xhc3NpZmllciBvbGRDb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKLQkJCWNvbXBvbmVudFR5cGUgPSAoRUNsYXNzaWZpZXIpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWNvbXBvbmVudFR5cGUpOwotCQkJaWYgKGNvbXBvbmVudFR5cGUgIT0gb2xkQ29tcG9uZW50VHlwZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFLCBvbGRDb21wb25lbnRUeXBlLCBjb21wb25lbnRUeXBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBvbmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGJhc2ljR2V0Q29tcG9uZW50VHlwZSgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZShFQ2xhc3NpZmllciBuZXdDb21wb25lbnRUeXBlKSB7Ci0JCWZpbmFsQ29tcG9uZW50VHlwZSA9IG51bGw7Ci0JCXNldENvbXBvbmVudFR5cGVHZW4obmV3Q29tcG9uZW50VHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGVHZW4oRUNsYXNzaWZpZXIgbmV3Q29tcG9uZW50VHlwZSkgewotCQlFQ2xhc3NpZmllciBvbGRDb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKLQkJY29tcG9uZW50VHlwZSA9IG5ld0NvbXBvbmVudFR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFLCBvbGRDb21wb25lbnRUeXBlLCBjb21wb25lbnRUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VQQUNLQUdFOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VPUEVSQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVPcGVyYXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRklFTERTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpZWxkcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19NRVRIT0RTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZHMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU5JVElBTElaRVJTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRpYWxpemVycygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlY2xhcmVkQ2xhc3NlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlY2xhcmluZ0NsYXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXREZWNsYXJpbmdDbGFzcygoSmF2YUNsYXNzKW90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FUEFDS0FHRToKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FT1BFUkFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFT3BlcmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0ZJRUxEUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWVsZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fTUVUSE9EUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOSVRJQUxJWkVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0aWFsaXplcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZWNsYXJlZENsYXNzZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVDTEFSSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXREZWNsYXJpbmdDbGFzcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VWRU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFdmVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VQQUNLQUdFOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VDTEFTU0lGSUVSUywgRVBhY2thZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3NOYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOU1RBTkNFX0NMQVNTOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0RFRkFVTFRfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gaXNJbnRlcmZhY2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VTVVBFUl9UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRU9QRVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVPcGVyYXRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRFQWxsUmVmZXJlbmNlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0RVJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEVBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTOgotCQkJCXJldHVybiBnZXRFQWxsQ29udGFpbm1lbnRzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfT1BFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCXJldHVybiBnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfU1VQRVJfVFlQRVM6Ci0JCQkJcmV0dXJuIGdldEVBbGxTdXBlclR5cGVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VJRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlyZXR1cm4gZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19LSU5EOgotCQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX1BVQkxJQzoKLQkJCQlyZXR1cm4gaXNQdWJsaWMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0ZJTkFMOgotCQkJCXJldHVybiBpc0ZpbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NMQVNTX0lNUE9SVDoKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NJbXBvcnQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fUEFDS0FHRV9JTVBPUlRTOgotCQkJCXJldHVybiBnZXRQYWNrYWdlSW1wb3J0cygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19GSUVMRFM6Ci0JCQkJcmV0dXJuIGdldEZpZWxkcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRNZXRob2RzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOSVRJQUxJWkVSUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGdldERlY2xhcmVkQ2xhc3NlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZWNsYXJpbmdDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0pBVkFfUEFDS0FHRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEphdmFQYWNrYWdlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0SmF2YVBhY2thZ2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVZFTlRTOgotCQkJCXJldHVybiBnZXRFdmVudHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQUxMX0VWRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QWxsRXZlbnRzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlM6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEFycmF5RGltZW5zaW9ucygpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBUeXBlS2luZCBnZXRLaW5kKCkgewotCQkvLyBPdmVycmlkZSB0byBhbHdheXMgcmV0dXJuIHRoZSBjbGFzcyBpZiBmaW5hbCB0eXBlIGlzIHZhbGlkLgotCQlKYXZhSGVscGVycyBmdCA9IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQlpZiAoIWZ0LmlzUHJpbWl0aXZlKCkpIHsKLQkJCVR5cGVLaW5kIGZ0S2luZCA9ICgoSmF2YUNsYXNzKSBmdCkuZ2V0S2luZCgpOyAKLQkJCXJldHVybiAgZnRLaW5kICE9IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMID8gVHlwZUtpbmQuQ0xBU1NfTElURVJBTCA6IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMOwotCQl9IGVsc2UKLQkJCXJldHVybiBUeXBlS2luZC5DTEFTU19MSVRFUkFMOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNQdWJsaWMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgewotCQkvLyBPdmVycmlkZSB0byByZXR1cm4gdGhlIGtpbmQgb2YgdGhlIGZpbmFsIGNvbXBvbmVudCwgYmVjYXVzZSB0aGF0IGRldGVybWluZXMgaXQuCi0JCUphdmFIZWxwZXJzIGZ0ID0gZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCWlmICghZnQuaXNQcmltaXRpdmUoKSkgewotCQkJcmV0dXJuICgoSmF2YUNsYXNzKSBmdCkuaXNQdWJsaWMoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0Jsb2NrSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0Jsb2NrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWZmMTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9CbG9ja0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEJsb2NrSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjMyICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCbG9ja3sKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2UoKSA8ZW0+U291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZSA9IFNPVVJDRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGVudHMoKSA8ZW0+Q29udGVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250ZW50cyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQmxvY2tJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRCbG9jaygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgbmV3U291cmNlKSB7Ci0JCVN0cmluZyBvbGRTb3VyY2UgPSBzb3VyY2U7Ci0JCXNvdXJjZSA9IG5ld1NvdXJjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudHMoKSB7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsKSB7Ci0JCQljb250ZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChCbG9jay5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTKTsKLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzb3VyY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNvdXJjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Db21tZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMThlYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0NvbW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi0vKgotICogICRSQ1NmaWxlOiBDb21tZW50SW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjMyICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRJbXBsIGV4dGVuZHMgQmxvY2tJbXBsIGltcGxlbWVudHMgQ29tbWVudHsKLQotCQotCXByb3RlY3RlZCBDb21tZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbWVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVF9fQ09OVEVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlRfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVF9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlRfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVF9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVF9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIFNPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gc291cmNlICE9IG51bGwgOiAhU09VUkNFX0VERUZBVUxULmVxdWFscyhzb3VyY2UpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlRfX0NPTlRFTlRTOgotCQkJCXJldHVybiBjb250ZW50cyAhPSBudWxsICYmICFjb250ZW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9GaWVsZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9GaWVsZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhN2I0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvRmllbGRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogRmllbGRJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjA6Mjg6MDMgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVUeXBlZEVsZW1lbnRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5CbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmllbGRJbXBsIGV4dGVuZHMgRVR5cGVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBGaWVsZCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJTkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSU5BTF9FRkxBRyA9IDEgPDwgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdGF0aWMoKSA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNUQVRJQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdGF0aWMoKSA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDX0VGTEFHID0gMSA8PCAxMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhVmlzaWJpbGl0eSgpIDxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFWaXNpYmlsaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQgPSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVZpc2liaWxpdHlLaW5kIGphdmFWaXNpYmlsaXR5ID0gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVHJhbnNpZW50KCkgPGVtPlRyYW5zaWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNUcmFuc2llbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUUkFOU0lFTlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVHJhbnNpZW50KCkgPGVtPlRyYW5zaWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNUcmFuc2llbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRSQU5TSUVOVF9FRkxBRyA9IDEgPDwgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWb2xhdGlsZSgpIDxlbT5Wb2xhdGlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNWb2xhdGlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFZPTEFUSUxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZvbGF0aWxlKCkgPGVtPlZvbGF0aWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ZvbGF0aWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBWT0xBVElMRV9FRkxBRyA9IDEgPDwgMTM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsaXplcigpIDxlbT5Jbml0aWFsaXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbGl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCbG9jayBpbml0aWFsaXplciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgRmllbGRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEZpZWxkKCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRmllbGRSZWYgLSByZXR1cm4gYSBKYXZhVVJMIHJlZmVyZW5jZSB0byB0aGUgbmFtZWQgZmllbGQgaW4gdGhlIG5hbWVkIEphdmEgY2xhc3MgaW4gdGhlIGZvcm0gInBhY2thZ2UuY2xhc3NfZmllbGQiCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBjcmVhdGVGaWVsZFJlZihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCUZpZWxkIHJlZiA9IEphdmFSZWZGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLQkJSmF2YVVSTCBqYXZhdXJsID0gbmV3IEphdmFVUkwoY2xhc3NOYW1lICsgIi8iICsgZmllbGROYW1lKTsKLQkJKChJbnRlcm5hbEVPYmplY3QpIHJlZikuZVNldFByb3h5VVJJKFVSSS5jcmVhdGVVUkkoamF2YXVybC5nZXRGdWxsU3RyaW5nKCkpKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNsYXNzIHRoYXQgdGhpcyBmaWVsZCBpcyB3aXRoaW4uCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2xhc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgdG8gcGVyZm9ybSBsYXp5IGluaXRpYWxpemF0aW9ucy9yZWZsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRFVHlwZSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2sgZ2V0SW5pdGlhbGl6ZXIoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGdldEluaXRpYWxpemVyR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNGaW5hbEdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc1N0YXRpY0dlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc1RyYW5zaWVudEdlbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZvbGF0aWxlKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc1ZvbGF0aWxlR2VuKCk7Ci0JfQkKLQotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRKYXZhVHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhSGVscGVycykgZ2V0RVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldEphdmFWaXNpYmlsaXR5KCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBnZXRKYXZhVmlzaWJpbGl0eUdlbigpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUmVhZEFkYXB0b3IgZ2V0UmVhZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoUmVhZEFkYXB0b3IpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcih0aGlzLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVmbGVjdGVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0VmFsdWVzKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICghaGFzUmVmbGVjdGVkKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9IHJlYWRBZGFwdG9yLnJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJLy8gRG9uJ3Qgd2FudCB0byBzZXQgaXQgZmFsc2UuIFRoYXQgaXMgam9iIG9mIHJlZmxlY3Rpb24gYWRhcHRlci4gT3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgYSByYWNlLgotCQkJCWlmIChzZXRSZWZsZWN0ZWQpCi0JCQkJCWhhc1JlZmxlY3RlZCA9IHNldFJlZmxlY3RlZDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVXNlZCBieSByZWZsZWN0aW9uIGFkYXB0ZXIgdG8gY2xlYXIgdGhlIHJlZmxlY3Rpb24uIFRoaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXJzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWZsZWN0ZWQoYm9vbGVhbiByZWZsZWN0ZWQpIHsKLQkJaGFzUmVmbGVjdGVkID0gcmVmbGVjdGVkOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgZmllbGQgYW4gYXJyYXkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZ2V0SmF2YVR5cGUoKS5pc0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBwcmV2ZW50IHRoZSByZWZsZWN0aW9uIG9mIHRoZSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZUNvbnRlbnRzKCkgewotCQlFTGlzdCByZXN1bHRzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJLy9GQgotCQkvL0ZCIEVMaXN0IGNvbnRhaW5tZW50cyA9IGVDbGFzcygpLmdldEVBbGxDb250YWlubWVudHMoKTsKLQkJLy9GQiBpZiAoY29udGFpbm1lbnRzICE9IG51bGwpIHsKLQkJLy9GQiBJdGVyYXRvciBpID0gY29udGFpbm1lbnRzLml0ZXJhdG9yKCk7Ci0JCS8vRkIgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCS8vRkIgRVN0cnVjdHVyYWxGZWF0dXJlIHNmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaS5uZXh0KCk7Ci0JCS8vRkIgLy9DaGFuZ2UgZnJvbSBzdXBlciB0byBwcmltUmVmVmFsdWUKLQkJLy9GQiBPYmplY3QgdmFsdWUgPSBwcmltUmVmVmFsdWUoc2YpOwotCQkvL0ZCIC8vRW5kQ2hhbmdlCi0JCS8vRkIgaWYgKHZhbHVlICE9IG51bGwpCi0JCS8vRkIgaWYgKHNmLmlzTWFueSgpKQotCQkvL0ZCIHJlc3VsdHMuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCS8vRkIgZWxzZQotCQkvL0ZCIHJlc3VsdHMuYWRkKHZhbHVlKTsKLQkJLy9GQiB9Ci0JCS8vRkIgfQotCQlpZiAoZ2V0SW5pdGlhbGl6ZXJHZW4oKSAhPSBudWxsKQotCQkJcmVzdWx0cy5hZGQoZ2V0SW5pdGlhbGl6ZXJHZW4oKSk7IC8vRkIKLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiAiICsgIigiICsgZ2V0TmFtZSgpICsgIikiOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHlHZW4oKSB7Ci0JCXJldHVybiBqYXZhVmlzaWJpbGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmFsKGJvb2xlYW4gbmV3RmluYWwpIHsKLQkJYm9vbGVhbiBvbGRGaW5hbCA9IChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0ZpbmFsKSBlRmxhZ3MgfD0gRklOQUxfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5GSU5BTF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0ZJTkFMLCBvbGRGaW5hbCwgbmV3RmluYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpY0dlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdGljKGJvb2xlYW4gbmV3U3RhdGljKSB7Ci0JCWJvb2xlYW4gb2xkU3RhdGljID0gKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1N0YXRpYykgZUZsYWdzIHw9IFNUQVRJQ19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflNUQVRJQ19FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX1NUQVRJQywgb2xkU3RhdGljLCBuZXdTdGF0aWMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQgbmV3SmF2YVZpc2liaWxpdHkpIHsKLQkJSmF2YVZpc2liaWxpdHlLaW5kIG9sZEphdmFWaXNpYmlsaXR5ID0gamF2YVZpc2liaWxpdHk7Ci0JCWphdmFWaXNpYmlsaXR5ID0gbmV3SmF2YVZpc2liaWxpdHkgPT0gbnVsbCA/IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCA6IG5ld0phdmFWaXNpYmlsaXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9WSVNJQklMSVRZLCBvbGRKYXZhVmlzaWJpbGl0eSwgamF2YVZpc2liaWxpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudEdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNpZW50KGJvb2xlYW4gbmV3VHJhbnNpZW50KSB7Ci0JCWJvb2xlYW4gb2xkVHJhbnNpZW50ID0gKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1RyYW5zaWVudCkgZUZsYWdzIHw9IFRSQU5TSUVOVF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflRSQU5TSUVOVF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX1RSQU5TSUVOVCwgb2xkVHJhbnNpZW50LCBuZXdUcmFuc2llbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZvbGF0aWxlR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZvbGF0aWxlKGJvb2xlYW4gbmV3Vm9sYXRpbGUpIHsKLQkJYm9vbGVhbiBvbGRWb2xhdGlsZSA9IChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1ZvbGF0aWxlKSBlRmxhZ3MgfD0gVk9MQVRJTEVfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5WT0xBVElMRV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX1ZPTEFUSUxFLCBvbGRWb2xhdGlsZSwgbmV3Vm9sYXRpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1MpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEphdmFDbGFzcyllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzKSB7Ci0JCWlmIChuZXdKYXZhQ2xhc3MgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUyAmJiBuZXdKYXZhQ2xhc3MgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdKYXZhQ2xhc3MpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0phdmFDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTLCBuZXdKYXZhQ2xhc3MsIG5ld0phdmFDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fT1JERVJFRDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBPUkRFUkVEX0VGTEFHKSAhPSAwKSAhPSBPUkRFUkVEX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVU5JUVVFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFVOSVFVRV9FRkxBRykgIT0gMCkgIT0gVU5JUVVFX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fTE9XRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIGxvd2VyQm91bmQgIT0gTE9XRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19VUFBFUl9CT1VORDoKLQkJCQlyZXR1cm4gdXBwZXJCb3VuZCAhPSBVUFBFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX01BTlk6Ci0JCQkJcmV0dXJuIGlzTWFueSgpICE9IE1BTllfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRVRZUEU6Ci0JCQkJcmV0dXJuIGVUeXBlICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19GSU5BTDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCkgIT0gRklOQUxfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19TVEFUSUM6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKSAhPSBTVEFUSUNfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJcmV0dXJuIGphdmFWaXNpYmlsaXR5ICE9IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDApICE9IFRSQU5TSUVOVF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1ZPTEFUSUxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwKSAhPSBWT0xBVElMRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUjoKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXIgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX09SREVSRUQ6Ci0JCQkJc2V0T3JkZXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRVRZUEU6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19TVEFUSUM6Ci0JCQkJc2V0U3RhdGljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfVklTSUJJTElUWToKLQkJCQlzZXRKYXZhVmlzaWJpbGl0eSgoSmF2YVZpc2liaWxpdHlLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19UUkFOU0lFTlQ6Ci0JCQkJc2V0VHJhbnNpZW50KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1ZPTEFUSUxFOgotCQkJCXNldFZvbGF0aWxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSOgotCQkJCXNldEluaXRpYWxpemVyKChCbG9jayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoT1JERVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZShVTklRVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoTE9XRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1VQUEVSX0JPVU5EOgotCQkJCXNldFVwcGVyQm91bmQoVVBQRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19GSU5BTDoKLQkJCQlzZXRGaW5hbChGSU5BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fU1RBVElDOgotCQkJCXNldFN0YXRpYyhTVEFUSUNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfVklTSUJJTElUWToKLQkJCQlzZXRKYXZhVmlzaWJpbGl0eShKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1RSQU5TSUVOVDoKLQkJCQlzZXRUcmFuc2llbnQoVFJBTlNJRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRToKLQkJCQlzZXRWb2xhdGlsZShWT0xBVElMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUjoKLQkJCQlzZXRJbml0aWFsaXplcigoQmxvY2spbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBCbG9jayBnZXRJbml0aWFsaXplckdlbigpIHsKLQkJcmV0dXJuIGluaXRpYWxpemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEluaXRpYWxpemVyKEJsb2NrIG5ld0luaXRpYWxpemVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUJsb2NrIG9sZEluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7Ci0JCWluaXRpYWxpemVyID0gbmV3SW5pdGlhbGl6ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUiwgb2xkSW5pdGlhbGl6ZXIsIG5ld0luaXRpYWxpemVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXplcihCbG9jayBuZXdJbml0aWFsaXplcikgewotCQlpZiAobmV3SW5pdGlhbGl6ZXIgIT0gaW5pdGlhbGl6ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluaXRpYWxpemVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbml0aWFsaXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbml0aWFsaXplcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbml0aWFsaXplcihuZXdJbml0aWFsaXplciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVIsIG5ld0luaXRpYWxpemVyLCBuZXdJbml0aWFsaXplcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVI6Ci0JCQkJCXJldHVybiBiYXNpY1NldEluaXRpYWxpemVyKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fT1JERVJFRDoKLQkJCQlyZXR1cm4gaXNPcmRlcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVU5JUVVFOgotCQkJCXJldHVybiBpc1VuaXF1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0xPV0VSX0JPVU5EOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRMb3dlckJvdW5kKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFVwcGVyQm91bmQoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0VUWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFVHlwZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19TVEFUSUM6Ci0JCQkJcmV0dXJuIGlzU3RhdGljKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXJldHVybiBnZXRKYXZhVmlzaWJpbGl0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVFJBTlNJRU5UOgotCQkJCXJldHVybiBpc1RyYW5zaWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1ZPTEFUSUxFOgotCQkJCXJldHVybiBpc1ZvbGF0aWxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUjoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdHZW4oKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaW5hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGF0aWM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGphdmFWaXNpYmlsaXR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqYXZhVmlzaWJpbGl0eSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNpZW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2b2xhdGlsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Jbml0aWFsaXplckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Jbml0aWFsaXplckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyNTUwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSW5pdGlhbGl6ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogSW5pdGlhbGl6ZXJJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzIgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5CbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxpemVySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSW5pdGlhbGl6ZXJ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNTdGF0aWMoKSA8ZW0+SXMgU3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1NUQVRJQ19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1N0YXRpYyA9IElTX1NUQVRJQ19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2UoKSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCbG9jayBzb3VyY2UgPSBudWxsOwotCi0JcHJvdGVjdGVkIEluaXRpYWxpemVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdGlhbGl6ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1N0YXRpYygpIHsKLQkJcmV0dXJuIGlzU3RhdGljOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3RhdGljKEJvb2xlYW4gbmV3SXNTdGF0aWMpIHsKLQkJQm9vbGVhbiBvbGRJc1N0YXRpYyA9IGlzU3RhdGljOwotCQlpc1N0YXRpYyA9IG5ld0lzU3RhdGljOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSVNfU1RBVElDLCBvbGRJc1N0YXRpYywgaXNTdGF0aWMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEphdmFDbGFzcyllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzKSB7Ci0JCWlmIChuZXdKYXZhQ2xhc3MgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUyAmJiBuZXdKYXZhQ2xhc3MgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdKYXZhQ2xhc3MpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0phdmFDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MsIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTLCBuZXdKYXZhQ2xhc3MsIG5ld0phdmFDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBCbG9jayBnZXRTb3VyY2UoKSB7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UuZUlzUHJveHkoKSkgewotCQkJQmxvY2sgb2xkU291cmNlID0gc291cmNlOwotCQkJc291cmNlID0gKEJsb2NrKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClzb3VyY2UpOwotCQkJaWYgKHNvdXJjZSAhPSBvbGRTb3VyY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJsb2NrIGJhc2ljR2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShCbG9jayBuZXdTb3VyY2UpIHsKLQkJQmxvY2sgb2xkU291cmNlID0gc291cmNlOwotCQlzb3VyY2UgPSBuZXdTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0UsIG9sZFNvdXJjZSwgc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSVNfU1RBVElDOgotCQkJCXJldHVybiBnZXRJc1N0YXRpYygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTb3VyY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19JU19TVEFUSUM6Ci0JCQkJcmV0dXJuIElTX1NUQVRJQ19FREVGQVVMVCA9PSBudWxsID8gaXNTdGF0aWMgIT0gbnVsbCA6ICFJU19TVEFUSUNfRURFRkFVTFQuZXF1YWxzKGlzU3RhdGljKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIHNvdXJjZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSVNfU1RBVElDOgotCQkJCXNldElzU3RhdGljKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChCbG9jayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0lTX1NUQVRJQzoKLQkJCQlzZXRJc1N0YXRpYyhJU19TVEFUSUNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoQmxvY2spbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1N0YXRpYzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaXNTdGF0aWMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUNsYXNzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFDbGFzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2NWY5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUNsYXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBKYXZhQ2xhc3NJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjA6Mjg6MDMgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUNvbGxlY3Rpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuVHlwZUtpbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldEtpbmQgPGVtPktpbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNpc1B1YmxpYyA8ZW0+UHVibGljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcyA8ZW0+SW1wbGVtZW50cyBJbnRlcmZhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0Q2xhc3NJbXBvcnQgPGVtPkNsYXNzIEltcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldFBhY2thZ2VJbXBvcnRzIDxlbT5QYWNrYWdlIEltcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRGaWVsZHMgPGVtPkZpZWxkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldE1ldGhvZHMgPGVtPk1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRJbml0aWFsaXplcnMgPGVtPkluaXRpYWxpemVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldERlY2xhcmVkQ2xhc3NlcyA8ZW0+RGVjbGFyZWQgQ2xhc3NlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldERlY2xhcmluZ0NsYXNzIDxlbT5EZWNsYXJpbmcgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRKYXZhUGFja2FnZSA8ZW0+SmF2YSBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0RXZlbnRzIDxlbT5FdmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRBbGxFdmVudHMgPGVtPkFsbCBFdmVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ2xhc3NJbXBsIGV4dGVuZHMgRUNsYXNzSW1wbCBpbXBsZW1lbnRzIEphdmFDbGFzcyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFR5cGVLaW5kIEtJTkRfRURFRkFVTFQgPSBUeXBlS2luZC5VTkRFRklORURfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUeXBlS2luZCBraW5kID0gS0lORF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1B1YmxpYygpIDxlbT5QdWJsaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHVibGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFVCTElDX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1B1YmxpYygpIDxlbT5QdWJsaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHVibGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQVUJMSUNfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSU5BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfRUZMQUcgPSAxIDw8IDExOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKSA8ZW0+SW1wbGVtZW50cyBJbnRlcmZhY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGxlbWVudHNJbnRlcmZhY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW1wbGVtZW50c0ludGVyZmFjZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NJbXBvcnQoKSA8ZW0+Q2xhc3MgSW1wb3J0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzSW1wb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY2xhc3NJbXBvcnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnZUltcG9ydHMoKSA8ZW0+UGFja2FnZSBJbXBvcnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2VJbXBvcnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGFja2FnZUltcG9ydHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRzKCkgPGVtPkZpZWxkczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmaWVsZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kcygpIDxlbT5NZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxpemVycygpIDxlbT5Jbml0aWFsaXplcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbGl6ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5pdGlhbGl6ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlY2xhcmVkQ2xhc3NlcygpIDxlbT5EZWNsYXJlZCBDbGFzc2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlY2xhcmVkQ2xhc3NlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlY2xhcmVkQ2xhc3NlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWNsYXJpbmdDbGFzcygpIDxlbT5EZWNsYXJpbmcgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlY2xhcmluZ0NsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGRlY2xhcmluZ0NsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV2ZW50cygpIDxlbT5FdmVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXZlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXZlbnRzID0gbnVsbDsKLQotCXByb3RlY3RlZCBKYXZhQ2xhc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgRUxpc3QgZ2V0RUFubm90YXRpb25zSW50ZXJuYWwoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm90ZWN0ZWQgaGVscGVyIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEZpZWxkc0V4dGVuZGVkKExpc3QgZmllbGRzKSB7Ci0JCWZpZWxkcy5hZGRBbGwoZ2V0RmllbGRzKCkpOwotCQlJdGVyYXRvciBpdDsKLQkJaXQgPSBnZXRFeHRlbmRlZExvb2t1cEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpCi0JCQkoKEphdmFDbGFzc0ltcGwpIGl0Lm5leHQoKSkuY29sbGVjdEZpZWxkc0V4dGVuZGVkKGZpZWxkcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE1ldGhvZHNFeHRlbmRlZChNYXAgbWV0aG9kcywgYm9vbGVhbiBvbmx5UHVibGljLCBMaXN0IGV4Y2x1ZGVkQ2xhc3NlcywgTGlzdCBleGNsdWRlZE1ldGhvZHMpIHsKLQkJSXRlcmF0b3IgaXQxLCBpdDI7Ci0JCWl0MiA9IGdldEV4dGVuZGVkTG9va3VwSXRlcmF0b3IoKTsKLQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3M7Ci0JCXdoaWxlIChpdDIuaGFzTmV4dCgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzSW1wbCkgaXQyLm5leHQoKTsKLQkJCWlmICghZXhjbHVkZWRDbGFzc2VzLmNvbnRhaW5zKGphdmFDbGFzcykpCi0JCQkJamF2YUNsYXNzLmNvbGxlY3RNZXRob2RzRXh0ZW5kZWQobWV0aG9kcywgb25seVB1YmxpYywgZXhjbHVkZWRDbGFzc2VzLCBleGNsdWRlZE1ldGhvZHMpOwotCQl9Ci0JCWl0MSA9IG9ubHlQdWJsaWMgPyBnZXRQdWJsaWNNZXRob2RzKCkuaXRlcmF0b3IoKSA6IGdldE1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQlNZXRob2QgbmV4dE1ldGhvZDsKLQkJd2hpbGUgKGl0MS5oYXNOZXh0KCkpIHsKLQkJCW5leHRNZXRob2QgPSAoTWV0aG9kKSBpdDEubmV4dCgpOwotCQkJaWYgKCFleGNsdWRlZE1ldGhvZHMuY29udGFpbnMobmV4dE1ldGhvZCkpCi0JCQkJbWV0aG9kcy5wdXQobmV4dE1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCksIG5leHRNZXRob2QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQ2xhc3NSZWYgLSByZXR1cm4gYSBKYXZhVVJMIHJlZmVyZW5jZSB0byB0aGUgbmFtZWQgSmF2YSBjbGFzcwotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjY3JlYXRlQ2xhc3NSZWYoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHRhcmdldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXByb3RlY3RlZCBNZXRob2QgZmluZENsYXNzTWV0aG9kRXh0ZW5kZWQoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpIHsKLQkJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkKLQkJCXJldHVybiBtZXRob2Q7Ci0JCWVsc2UgewotCQkJSmF2YUNsYXNzSW1wbCBteVN1cGVyOwotCQkJbXlTdXBlciA9IChKYXZhQ2xhc3NJbXBsKSBnZXRTdXBlcnR5cGUoKTsKLQkJCWlmIChteVN1cGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIG15U3VwZXIuZmluZENsYXNzTWV0aG9kRXh0ZW5kZWQobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXByb3RlY3RlZCBNZXRob2QgZmluZEludGVyZmFjZU1ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQlyZXR1cm4gbWV0aG9kOwotCQllbHNlIHsKLQkJCUphdmFDbGFzc0ltcGwgc3VwZXJJbnRlcmZhY2U7Ci0JCQlMaXN0IGxpc3QgPSBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJc3VwZXJJbnRlcmZhY2UgPSAoSmF2YUNsYXNzSW1wbCkgbGlzdC5nZXQoaSk7Ci0JCQkJbWV0aG9kID0gc3VwZXJJbnRlcmZhY2UuZmluZEludGVyZmFjZU1ldGhvZEV4dGVuZGVkKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIElmIGFueW9uZSBpcyByZWZlcmVuY2luZyB0aGlzLCBwbGVhc2UgdXNlIGdldEVBbGxTdXBlclR5cGVzKCkgaW5zdGVhZC4gVGhpcyB3YXMgcGxhY2VkIGhlcmUgYW5kIG1pc3NwZWxsZWQgYnkgbWlzdGFrZS4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsU3VwZXJ0eXBlcygpIHsKLQkJZ2V0RVN1cGVyVHlwZXMoKTsgLy9Gb3JjZSByZWZsZWN0aW9uLCBpZiBuZWVkZWQsIGJlZm9yZSBnZXR0aW5nIGFsbCBzdXBlcnR5cGVzLgotCQlyZXR1cm4gc3VwZXIuZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgdG8gcGVyZm9ybSByZWZsZWN0aW9uIGlmIG5lY2Vzc2FyeQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDbGFzc0ltcG9ydCgpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldENsYXNzSW1wb3J0R2VuKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVBbGxPcGVyYXRpb25zKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgaWEgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoaWEgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5nZXRFQWxsT3BlcmF0aW9ucygpOyAvLyBObyBpbnRyb3NwZWN0aW9uLCBkbyBub3JtYWwuCi0JCWlmIChlQWxsT3BlcmF0aW9ucyA9PSBudWxsKQotCQkJZUFsbE9wZXJhdGlvbnMgPSBpYS5nZXRFQWxsT3BlcmF0aW9ucygpOwotCQlyZXR1cm4gZUFsbE9wZXJhdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgb3RoZXJzLiBJdCBpcyBoZXJlIHNvIHRoYXQgQmVhbkluZm8gYWRhcHRlciBjYW4gYWNjZXNzCi0JICogdW4taW50cm9zcGVjdGVkIGFsbCBvcGVyYXRpb25zLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgcHJpbUdldEVBbGxPcGVyYXRpb25zKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKSB7Ci0JCUlJbnRyb3NwZWN0aW9uQWRhcHRlciBhZGFwdGVyID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldEVPcGVyYXRpb25zKCk7Ci0JCXJldHVybiBzdXBlci5nZXRFT3BlcmF0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IG90aGVycy4gSXQgaXMgaGVyZSBzbyB0aGF0IEJlYW5JbmZvIGFkYXB0ZXJzIGNhbiBnbyB0bwotCSAqIHRoZSBub24taW50cm9zcGVjdGVkIG9wZXJhdGlvbnMuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFT3BlcmF0aW9uc0ludGVybmFsKCkgewotCQkvLyBBbiBpbnRlcm5hbCBtZXRob2QgZm9yIHJldHVybmluZyBhY3R1YWwgd28gZmx1ZmZpbmcgdXAuCi0JCXJldHVybiBzdXBlci5nZXRFT3BlcmF0aW9ucygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFQW5ub3RhdGlvbnMoKSB7Ci0JCUlJbnRyb3NwZWN0aW9uQWRhcHRlciBhZGFwdGVyID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIuaW50cm9zcGVjdElmTmVjZXNzYXJ5KCk7IC8vIFRvIGNhdXNlIGludHJvc3BlY3Rpb24gc28gdGhlIGFwcHJvcHJpYXRlIGRlY29yYXRvciBpcyBhZGRlZC4KLQkJcmV0dXJuIHN1cGVyLmdldEVBbm5vdGF0aW9ucygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCXJldHVybiBzdXBlci5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpIHsKLQkJLy8gQW4gaW50ZXJuYWwgbWV0aG9kIGZvciByZXR1cm5pbmcgYWN0dWFsIHdvIGZsdWZmaW5nIHVwLgotCQlyZXR1cm4gc3VwZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBJdGVyYXRvciBvbiB0aGUgaW1wbGVtbnRzSW5mZXJmYWNlIExpc3QgaWYgdGhpcyBpcyBhbiBpbnRlcmZhY2UgY2xhc3Mgb3Igb24gdGhlIHN1cGVyIExpc3QgaWYgaXQgaXMgYSBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0RXh0ZW5kZWRMb29rdXBJdGVyYXRvcigpIHsKLQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5pdGVyYXRvcigpOwotCQllbHNlCi0JCQlyZXR1cm4gZ2V0RVN1cGVyVHlwZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlwdWJsaWMgRmllbGQgZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlqYXZhLnV0aWwuTGlzdCBmaWVsZHMgPSBnZXRGaWVsZHMoKTsKLQkJRmllbGQgZmllbGQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQlmaWVsZCA9IChGaWVsZCkgZmllbGRzLmdldChpKTsKLQkJCWlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKGZpZWxkTmFtZSkpCi0JCQkJcmV0dXJuIGZpZWxkOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSBmcm9tIHRoaXMgSmF2YUNsYXNzIG9yIGFueSBzdXBlcnR5cGVzLgotCSAqIAotCSAqIFJldHVybiBudWxsIGlmIGEgRmllbGQgbmFtZWQgZmllbGROYW1lIGlzIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgRmllbGQgZ2V0RmllbGRFeHRlbmRlZChTdHJpbmcgZmllbGROYW1lKSB7Ci0JCUZpZWxkIGZpZWxkID0gZ2V0RmllbGROYW1lZChmaWVsZE5hbWUpOwotCQlpZiAoZmllbGQgIT0gbnVsbCkKLQkJCXJldHVybiBmaWVsZDsKLQkJSXRlcmF0b3IgaXQgPSBnZXRFeHRlbmRlZExvb2t1cEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUZpZWxkIHJlc3VsdCA9ICgoSmF2YUNsYXNzKSBpdC5uZXh0KCkpLmdldEZpZWxkRXh0ZW5kZWQoZmllbGROYW1lKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlwdWJsaWMgRmllbGQgZ2V0RmllbGROYW1lZChTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBnZXRGaWVsZChmaWVsZE5hbWUpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRGaWVsZHMoKSB7Ci0JCXJlZmxlY3RGaWVsZHMoKTsKLQkJcmV0dXJuIGdldEZpZWxkc0dlbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgZmllbGRzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpZWxkc0V4dGVuZGVkKCkgewotCQlMaXN0IGZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY29sbGVjdEZpZWxkc0V4dGVuZGVkKGZpZWxkcyk7Ci0JCXJldHVybiBmaWVsZHM7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gZ2V0SW1wbGVtZW50c0ludGVyZmFjZXNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSW50cm9zcGVjdGlvbkFkYXB0b3Igd2hpY2ggY2FuIGludHJvc3BlY3Qgb3VyIEphdmEgcHJvcGVydGllcwotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgSUludHJvc3BlY3Rpb25BZGFwdGVyIGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCkgewotCQkvLyBOZWVkIHRvIHN5bmMgdGhpcyBiZWNhdXNlIHdlIGFyZSBub3cgaW4gbXVsdGktdGhyZWFkIGVudi4KLQkJcmV0dXJuIChJSW50cm9zcGVjdGlvbkFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcih0aGlzLCBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YU5hbWUoKSB7Ci0JCXJldHVybiBnZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnMjZ2V0U2ltcGxlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKCkgewotCQlyZXR1cm4gcHJpbUdldE5hbWUoKS5yZXBsYWNlKCckJywgJy4nKTsKLQl9Ci0JLyoqCi0JICogZ2V0SmF2YVBhY2thZ2UuIFRoaXMgaXMgYSBkZXJpdmVkIHJlbGF0aW9uc2hpcCwgc28gd2UgbXVzdCBpbXBsZW1lbnQgaXQgaGVyZSB0byBnZXQgdGhlIEVQYWNrYWdlIHRoYXQgdGhpcyBvYmplY3QgaXMgY29udGFpbmVkIGluLgotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSBnZXRKYXZhUGFja2FnZSgpIHsKLQkJcmV0dXJuIChKYXZhUGFja2FnZSkgZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgZ2V0TWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcywgTGlzdCBtZXRob2RMaXN0KSB7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJTWV0aG9kIG1ldGhvZDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RMaXN0LmdldChpKTsKLQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJhbXM7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlwYXJhbXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCQkJaWYgKHBhcmFtcy5sZW5ndGggPT0gcGFyYW1ldGVyVHlwZXMuc2l6ZSgpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsgLy9NYXliZTsgd2UgbmVlZCBtb3JlIGluZm8KLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCS8vaWYgYW55IG9uZSBvZiB0aGUgcGFyYW1ldGVycyBkb2Vzbid0IG1hdGNoIHRoZW4gZmxpcCBiYWNrIHRvIGZhbHNlCi0JCQkJCQlKYXZhSGVscGVycyBqaCA9IChKYXZhSGVscGVycykgcGFyYW1zW2pdLmdldEVUeXBlKCk7Ci0JCQkJCQlpZiAoIWpoLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMocGFyYW1ldGVyVHlwZXMuZ2V0KGopKSkgewotCQkJCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9IC8vIGVuZCBpZiBwYXJhbXMgZXF1YWwKLQkJCQkJfSAvLyBlbmQgY29tcGFyZSBhbGwgcGFyYW1zCi0JCQkJCWlmIChmb3VuZCkgLy9zaG9ydCBjaXJjdWl0IG91dCBvZiB0aGlzIGxvb3AgYW5kIHJldHVybiB0aGUgd2lubmVyCi0JCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCX0gLy8gZW5kIGNvbXBhcmUgbGVuZ3RocwotCQkJfSAvLyBlbmQgY29tcGFyZSBuYW1lcwotCQl9IC8vIGVuZCBsb29wIHRocm91Z2ggYWxsIG1ldGhvZExpc3QKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBTdHJpbmdzIHRoYXQgcmVwcmVzZW50IE1ldGhvZEVsZW1lbnQgc2lnbmF0dXJlcyBmcm9tIG1vc3QgZ2VuZXJhbCB0byBtb3N0IHNwZWNpZmljLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkgewotCQlMaXN0IG1ldGhvZHMsIHNpZ25hdHVyZXMsIHNhbWVOYW1lczsKLQkJbWV0aG9kcyA9IGdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQlzYW1lTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNpZ25hdHVyZXMgPSBuZXcgQXJyYXlMaXN0KG1ldGhvZHMuc2l6ZSgpICsgMSk7Ci0JCXNpZ25hdHVyZXMuYWRkKERFRkFVTFRfTUVUSE9EX05BTUUpOwotCQlJdGVyYXRvciBpdCA9IG1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJTWV0aG9kIGFNZXRob2Q7Ci0JCVN0cmluZyBtZXRob2ROYW1lOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhTWV0aG9kID0gKE1ldGhvZCkgaXQubmV4dCgpOwotCQkJbWV0aG9kTmFtZSA9IGFNZXRob2QuZ2V0TmFtZSgpOwotCQkJaWYgKHNhbWVOYW1lcy5jb250YWlucyhtZXRob2ROYW1lKSkgewotCQkJCWlmICghc2lnbmF0dXJlcy5jb250YWlucyhtZXRob2ROYW1lKSkKLQkJCQkJc2lnbmF0dXJlcy5hZGQobWV0aG9kTmFtZSk7Ci0JCQl9IGVsc2UKLQkJCQlzYW1lTmFtZXMuYWRkKG1ldGhvZE5hbWUpOwotCQkJc2lnbmF0dXJlcy5hZGQoYU1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQoc2lnbmF0dXJlcyk7Ci0JCXJldHVybiBzaWduYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kRXh0ZW5kZWQoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpIHsKLQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gZmluZEludGVyZmFjZU1ldGhvZEV4dGVuZGVkKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZpbmRDbGFzc01ldGhvZEV4dGVuZGVkKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kcygpIHsKLQkJcmVmbGVjdE1ldGhvZHMoKTsKLQkJcmV0dXJuIGdldE1ldGhvZHNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kc0V4dGVuZGVkKCkgewotCQlNYXAgbWV0aG9kcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbGxlY3RNZXRob2RzRXh0ZW5kZWQobWV0aG9kcywgZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChtZXRob2RzLnZhbHVlcygpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgZ2V0TWV0aG9kc0V4dGVuZGVkV2l0aEZpbHRlcnMoTGlzdCwgTGlzdCkgb24gSmF2YUNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKExpc3QgZXhjbHVkZWRDbGFzc2VzLCBMaXN0IGV4Y2x1ZGVkTWV0aG9kcykgewotCQlNYXAgbWV0aG9kcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbGxlY3RNZXRob2RzRXh0ZW5kZWQobWV0aG9kcywgZmFsc2UsIGV4Y2x1ZGVkQ2xhc3NlcywgZXhjbHVkZWRNZXRob2RzKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobWV0aG9kcy52YWx1ZXMoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gdGhpcy5wcmltR2V0TmFtZSgpOwotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgZUlzUHJveHkoKSkgewotCQkJSmF2YVVSTCB1cmwgPSBuZXcgSmF2YVVSTChlUHJveHlVUkkoKS50b1N0cmluZygpKTsKLQkJCXJlc3VsdCA9IHVybC5nZXRDbGFzc05hbWUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgTWV0aG9kcyB0aGF0IGJlZ2lucyB3aXRoIEBhTWV0aG9kTmFtZVByZWZpeCBhbmQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBAZXhjbHVkZWROYW1lcyBsaXN0LiBJZiBAYU1ldGhvZE5hbWVQcmVmaXggaXMgbnVsbCwgYWxsIG1ldGhvZHMgd2lsbCBiZSByZXR1cm5lZC4KLQkgCi0JICovCi0JcHVibGljIExpc3QgZ2V0T25seVNwZWNpZmljTWV0aG9kcyhTdHJpbmcgYU1ldGhvZE5hbWVQcmVmaXgsIExpc3QgZXhjbHVkZWROYW1lcykgewotCQlMaXN0IG1ldGhvZHMsIHNwZWNpZmljOwotCQltZXRob2RzID0gZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCXNwZWNpZmljID0gbmV3IEFycmF5TGlzdChtZXRob2RzLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGl0ID0gbWV0aG9kcy5pdGVyYXRvcigpOwotCQlNZXRob2QgYU1ldGhvZDsKLQkJU3RyaW5nIG1ldGhvZE5hbWU7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWFNZXRob2QgPSAoTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQltZXRob2ROYW1lID0gYU1ldGhvZC5nZXROYW1lKCk7Ci0JCQlpZiAoYU1ldGhvZE5hbWVQcmVmaXggIT0gbnVsbCAmJiBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoYU1ldGhvZE5hbWVQcmVmaXgpICYmIGV4Y2x1ZGVkTmFtZXMgIT0gbnVsbCAmJiAhZXhjbHVkZWROYW1lcy5jb250YWlucyhtZXRob2ROYW1lKSkKLQkJCQlzcGVjaWZpYy5hZGQoYU1ldGhvZCk7Ci0JCX0KLQkJcmV0dXJuIHNwZWNpZmljOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRQYWNrYWdlSW1wb3J0cygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldFBhY2thZ2VJbXBvcnRzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJpbWl0aXZlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKYXZhRGF0YVR5cGUgZ2V0UHJpbWl0aXZlKCkgewotCQlTdHJpbmcgcHJpbWl0aXZlTmFtZSA9IGdldFByaW1pdGl2ZU5hbWUoKTsKLQkJaWYgKHByaW1pdGl2ZU5hbWUgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzID0gZVJlc291cmNlKCk7Ci0JCQlyZXR1cm4gKEphdmFEYXRhVHlwZSkgSmF2YUNsYXNzSW1wbC5yZWZsZWN0KHByaW1pdGl2ZU5hbWUsIHJlcy5nZXRSZXNvdXJjZVNldCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnMjZ2V0UHJpbWl0aXZlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJpbWl0aXZlSUQoKSB7Ci0JCVN0cmluZyBteU5hbWUgPSBnZXRRdWFsaWZpZWROYW1lKCk7Ci0JCWlmIChteU5hbWUuZXF1YWxzKElOVEVHRVJfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9JTlRFR0VSX0lEOwotCQlpZiAobXlOYW1lLmVxdWFscyhCT09MRUFOX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQk9PTEVBTl9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoQllURV9OQU1FKSkKLQkJCXJldHVybiBQUklNX0JZVEVfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKFNIT1JUX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fU0hPUlRfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKExPTkdfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9MT05HX0lEOwotCQlpZiAobXlOYW1lLmVxdWFscyhGTE9BVF9OQU1FKSkKLQkJCXJldHVybiBQUklNX0ZMT0FUX0lEOwotCQlpZiAobXlOYW1lLmVxdWFscyhET1VCTEVfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9ET1VCTEVfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKENIQVJBQ1RFUl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0NIQVJBQ1RFUl9JRDsKLQkJcmV0dXJuIFBSSU1fTk9UX0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIG5hbWUgZm9yIHRoaXMgdHlwZSBpZiBvbmUgZXhpc3RzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJpbWl0aXZlTmFtZSgpIHsKLQkJU3RyaW5nIG15TmFtZSA9IGdldFF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoSU5URUdFUl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0lOVEVHRVJfTkFNRTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoQk9PTEVBTl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0JPT0xFQU5fTkFNRTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoQllURV9OQU1FKSkKLQkJCXJldHVybiBQUklNX0JZVEVfTkFNRTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoU0hPUlRfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9TSE9SVF9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhMT05HX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fTE9OR19OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhGTE9BVF9OQU1FKSkKLQkJCXJldHVybiBQUklNX0ZMT0FUX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKERPVUJMRV9OQU1FKSkKLQkJCXJldHVybiBQUklNX0RPVUJMRV9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhDSEFSQUNURVJfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9DSEFSQUNURVJfTkFNRTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIG1hdGNoaW5nIHRoZSBuYW1lLCBhbmQgbm9uLXJldHVybiBwYXJhbWV0ZXJzIHdpdGggZnVsbHkgcXVhbGlmaWVkIHR5cGVzIG1hdGNoaW5nIGFsbCB0aGUgdHlwZXMgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cy4gSXQKLQkgKiB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0UHVibGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGdldFB1YmxpY01ldGhvZHMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIG1hdGNoaW5nIHRoZSBuYW1lLCBhbmQgbm9uLXJldHVybiBwYXJhbWV0ZXJzIHdpdGggZnVsbHkgcXVhbGlmaWVkIHR5cGVzIG1hdGNoaW5nIGFsbCB0aGUgdHlwZXMgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cy4gSXQKLQkgKiB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0UHVibGljTWV0aG9kRXh0ZW5kZWQoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgbWV0aG9kcywgaXQgd2lsbCBub3QgZ28gdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHVibGljTWV0aG9kcygpIHsKLQkJTGlzdCBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZU1ldGhvZHMgPSBnZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlTWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kIG0gPSAoTWV0aG9kKSB0aGVNZXRob2RzLmdldChpKTsKLQkJCWlmIChKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwgPT0gbS5nZXRKYXZhVmlzaWJpbGl0eSgpKQotCQkJCXB1YmxpY01ldGhvZHMuYWRkKG0pOwotCQl9Ci0JCXJldHVybiBwdWJsaWNNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgcHVibGljIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkKCkgewotCQlNYXAgbWV0aG9kcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbGxlY3RNZXRob2RzRXh0ZW5kZWQobWV0aG9kcywgdHJ1ZSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KG1ldGhvZHMudmFsdWVzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MsIGhhdmluZyBhIG5hbWUgZXF1YWwgdG8gdGhhdCBvZiB0aGUgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1YmxpY01ldGhvZHNFeHRlbmRlZE5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCUxpc3QgcHVibGljTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0aGVNZXRob2RzID0gZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlTWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kIG0gPSAoTWV0aG9kKSB0aGVNZXRob2RzLmdldChpKTsKLQkJCWlmIChtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcHVibGljTWV0aG9kcy5hZGQobSk7Ci0JCX0KLQkJcmV0dXJuIHB1YmxpY01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0byB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHVibGljTWV0aG9kc05hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCUxpc3QgcHVibGljTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0aGVNZXRob2RzID0gZ2V0UHVibGljTWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZU1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZCBtID0gKE1ldGhvZCkgdGhlTWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXB1YmxpY01ldGhvZHMuYWRkKG0pOwotCQl9Ci0JCXJldHVybiBwdWJsaWNNZXRob2RzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChlSXNQcm94eSgpKSB7Ci0JCQlKYXZhVVJMIHVybCA9IG5ldyBKYXZhVVJMKGVQcm94eVVSSSgpLnRvU3RyaW5nKCkpOwotCQkJU3RyaW5nIGludGVybmFsTmFtZSA9IHVybC5nZXRQYWNrYWdlTmFtZSgpOwotCQkJaWYgKGludGVybmFsTmFtZSAhPSBudWxsICYmIGludGVybmFsTmFtZS5sZW5ndGgoKSA+IDApCi0JCQkJcmVzdWx0ID0gaW50ZXJuYWxOYW1lICsgIi4iICsgdXJsLmdldENsYXNzTmFtZSgpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IHVybC5nZXRDbGFzc05hbWUoKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IHByaW1HZXRRdWFsaWZpZWROYW1lKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoJyQnLCAnLicpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRvIGJlIHVzZWQgYnkgcGVvcGxlIHRoYXQgbmVlZCB0byBnZXQgdGhlIHF1YWxpZmllZCBuYW1lIHVzZWQgZm9yIHJlZmxlY3Rpb24uIFR5cGljYWxseSBiZWFuIGluZm8gd291bGQgbmVlZCB0byB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkgewotCQlyZXR1cm4gcHJpbUdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBSZWFkQWRhcHRvciB3aGljaCBjYW4gcmVmbGVjdCBvdXIgSmF2YSBwcm9wZXJ0aWVzCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBSZWFkQWRhcHRvciBnZXRSZWFkQWRhcHRlcigpIHsKLQkJLy8gTmVlZCB0byBzeW5jIGJlY2F1c2Ugbm93IGluIGEgbXVsdGktdGhyZWFkIGVudi4KLQkJcmV0dXJuIChSZWFkQWRhcHRvcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKHRoaXMsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1JFRkxFQ1RFRCA9IDB4MCwgUkVGTEVDVEVEX0JBU0UgPSAweDEsIFJFRkxFQ1RFRF9NRVRIT0RTID0gMHgyLCBSRUZMRUNURURfRklFTERTID0gMHg0OwotCi0JcHJvdGVjdGVkIGludCByZWZsZWN0aW9uU3RhdHVzID0gTk9UX1JFRkxFQ1RFRDsKLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RCYXNlKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9CQVNFKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9IHJlYWRBZGFwdG9yLnJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJLy8gRG9uJ3Qgd2FudCB0byBzZXQgaXQgZmFsc2UuIFRoYXQgaXMgam9iIG9mIHJlZmxlY3Rpb24gYWRhcHRlci4gT3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgYSByYWNlLgotCQkJCWlmIChzZXRSZWZsZWN0ZWQpCi0JCQkJCXJlZmxlY3Rpb25TdGF0dXMgfD0gUkVGTEVDVEVEX0JBU0U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0RmllbGRzKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9GSUVMRFMpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gKChJSmF2YUNsYXNzQWRhcHRvcikgcmVhZEFkYXB0b3IpLnJlZmxlY3RGaWVsZHNJZk5lY2Vzc2FyeSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJLy8gRG9uJ3Qgd2FudCB0byBzZXQgaXQgZmFsc2UuIFRoYXQgaXMgam9iIG9mIHJlZmxlY3Rpb24gYWRhcHRlci4gT3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgYSByYWNlLgotCQkJCWlmIChzZXRSZWZsZWN0ZWQpCi0JCQkJCXJlZmxlY3Rpb25TdGF0dXMgfD0gKFJFRkxFQ1RFRF9GSUVMRFMgfCBSRUZMRUNURURfQkFTRSk7IC8vIFdlIGNhbiBiZSBjZXJ0YWluIGJhc2Ugd2lsbCBiZSBkb25lIGJ5IHJlZmxlY3QgZmllbGRzIGlmIG5vdCBhbHJlYWR5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJIC8vIGRvbmUuCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0TWV0aG9kcygpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoKHJlZmxlY3Rpb25TdGF0dXMgJiBSRUZMRUNURURfTUVUSE9EUykgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSAoKElKYXZhQ2xhc3NBZGFwdG9yKSByZWFkQWRhcHRvcikucmVmbGVjdE1ldGhvZHNJZk5lY2Vzc2FyeSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJLy8gRG9uJ3Qgd2FudCB0byBzZXQgaXQgZmFsc2UuIFRoYXQgaXMgam9iIG9mIHJlZmxlY3Rpb24gYWRhcHRlci4gT3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgYSByYWNlLgotCQkJCWlmIChzZXRSZWZsZWN0ZWQpCi0JCQkJCXJlZmxlY3Rpb25TdGF0dXMgfD0gKFJFRkxFQ1RFRF9NRVRIT0RTIHwgUkVGTEVDVEVEX0JBU0UpOyAvLyBXZSBjYW4gYmUgY2VydGFpbiBiYXNlIHdpbGwgYmUgZG9uZSBieSByZWZsZWN0IGZpZWxkcyBpZiBub3QgYWxyZWFkeQotCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gZG9uZS4KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0U3VwZXJ0eXBlKCkgewotCQkvLyBJZiB0aGlzIGlzIGFuIGludGVyZmFjZSwgdGhlcmUgaXMgbm8gc3VwZXJ0eXBlLiBIb3dldmVyLCB0aGUgZVN1cGVyVHlwZXMgSVMgZmlsbGVkIGluIHdpdGggYW55IGludGVyZmFjZSB0aGF0IHRoaXMgZXh0ZW5kcy4gCi0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IGdldEVTdXBlclR5cGVzKCk7Ci0JCXJldHVybiAoIWxpc3QuaXNFbXB0eSgpKSA/IChKYXZhQ2xhc3MpIGxpc3QuZ2V0KDApIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFdyYXBwZXIoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRlc3Qgd2hldGhlciB0aGUgcmVjZWl2ZXIgaW1wbGVtZW50cyB0aGUgcGFzc2VkIGludGVyZmFjZSAob3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzKS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRzSW50ZXJmYWNlKEphdmFDbGFzcyBpbnRlcmZhY2VUeXBlKSB7Ci0JCWlmICh0aGlzID09IGludGVyZmFjZVR5cGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJRUxpc3QgaW1wbGVtZW50ZWQgPSBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCQlKYXZhQ2xhc3MgYW5JbnRlcmZhY2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wbGVtZW50ZWQuc2l6ZSgpOyBpKyspIHsKLQkJCWFuSW50ZXJmYWNlID0gKEphdmFDbGFzcykgaW1wbGVtZW50ZWQuZ2V0KGkpOwotCQkJaWYgKGFuSW50ZXJmYWNlLmltcGxlbWVudHNJbnRlcmZhY2UoaW50ZXJmYWNlVHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGdldFN1cGVydHlwZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlKCkuaW1wbGVtZW50c0ludGVyZmFjZShpbnRlcmZhY2VUeXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyBzaG93aW5nIG91ciBkZXRhaWxzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaW5mb1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gdHJpcCBjbGFzcyByZWZsZWN0aW9uCi0JCS8vRkIgdGhpcy5lR2V0KEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfUHVibGljKCkpOwotCQlyZWZsZWN0QmFzZSgpOyAvL0ZCCi0JCW91dC5hcHBlbmQoIkphdmEgY2xhc3M6ICIgKyBnZXRRdWFsaWZpZWROYW1lKCkgKyAiXG4iKTsKLQkJb3V0LmFwcGVuZCgiICBzdXBlcmNsYXNzOiAiICsgdGhpcy5nZXRTdXBlcnR5cGUoKSArICJcbiIpOwotCQlFTGlzdCBmaWVsZHMgPSBnZXRGaWVsZHMoKTsKLQkJRmllbGQgZmllbGQ7Ci0JCWlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotCQkJb3V0LmFwcGVuZCgiICBGaWVsZHM6XG4iKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJZmllbGQgPSAoRmllbGQpIGZpZWxkcy5nZXQoaSk7Ci0JCQkJb3V0LmFwcGVuZCgiICAgICIgKyAoKEphdmFIZWxwZXJzKSBmaWVsZC5nZXRFVHlwZSgpKS5nZXRKYXZhTmFtZSgpICsgIiAiICsgZmllbGQuZ2V0TmFtZSgpICsgIlxuIik7Ci0JCQl9Ci0JCX0KLQkJRUxpc3QgbWV0aG9kcyA9IGdldE1ldGhvZHMoKTsKLQkJTWV0aG9kIG1ldGhvZDsKLQkJaWYgKG1ldGhvZHMuc2l6ZSgpID4gMCkgewotCQkJb3V0LmFwcGVuZCgiICBNZXRob2RzOlxuIik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCQkvLyB0cmlwIG1ldGhvZCByZWZsZWN0aW9uCi0JCQkJbWV0aG9kLmlzU3RhdGljKCk7Ci0JCQkJaWYgKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgIT0gbnVsbCkKLQkJCQkJb3V0LmFwcGVuZCgiICAgICIgKyBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCkgKyAiICIpOwotCQkJCWVsc2UKLQkJCQkJb3V0LmFwcGVuZCgiICAgIHZvaWQgIik7Ci0JCQkJb3V0LmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpICsgIigiKTsKLQkJCQlFTGlzdCBwYXJtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQkJSmF2YVBhcmFtZXRlciBwYXJtOwotCQkJCWlmIChwYXJtcy5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoaW50IGlpID0gMDsgaWkgPCBwYXJtcy5zaXplKCk7IGlpKyspIHsKLQkJCQkJCXBhcm0gPSAoSmF2YVBhcmFtZXRlcikgcGFybXMuZ2V0KGlpKTsKLQkJCQkJCS8vRkIgaWYgKCFwYXJtLmlzUmV0dXJuKCkpIHsKLQkJCQkJCW91dC5hcHBlbmQoKChKYXZhSGVscGVycykgcGFybS5nZXRFVHlwZSgpKS5nZXRKYXZhTmFtZSgpICsgIiAiICsgcGFybS5nZXROYW1lKCkpOwotCQkJCQkJaWYgKGlpIDwgcGFybXMuc2l6ZSgpIC0gMSkKLQkJCQkJCQlvdXQuYXBwZW5kKCIsICIpOwotCQkJCQkJLy9GQiB9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJb3V0LmFwcGVuZCgiKVxuIik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhpcyBjbGFzcyBpbmhlcml0cyBmcm9tIHRoZSBwYXNzZWQgaW4gY2xhc3MuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5oZXJpdHNGcm9tKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJaWYgKHRoaXMgPT0gamF2YUNsYXNzKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGdldFN1cGVydHlwZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlKCkuaW5oZXJpdHNGcm9tKGphdmFDbGFzcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2FuIGFuIG9iamVjdCBvZiB0aGUgcGFzc2VkIGluIGNsYXNzIGJlIGFzc2lnbmVkIHRvIGFuIG9iamVjdCBvZiB0aGlzIGNsYXNzLiBJbiBvdGhlciB3b3JkcyBpcyB0aGlzIGNsYXNzIGEgc3VwZXJ0eXBlIG9mIHRoZSBwYXNzZWQgaW4gY2xhc3MsCi0JICogb3IgaXMgaXQgc3VwZXJpbnRlcmZhY2Ugb2YgaXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShFQ2xhc3NpZmllciBhQ2xhc3MpIHsKLQkJaWYgKGFDbGFzcyBpbnN0YW5jZW9mIEphdmFDbGFzcykgewotCQkJSmF2YUNsYXNzIHRoZUNsYXNzID0gKEphdmFDbGFzcykgYUNsYXNzOwotCQkJLy8gSWYgZWl0aGVyIHRoaXMgY2xhc3Mgb3IgYUNsYXNzIGtpbmQgaXMgdW5rbm93biB0aGVuIGl0IGlzbid0IGFzc2lnbmFibGVGcm9tLgotCQkJaWYgKGdldEtpbmQoKSA9PSBUeXBlS2luZC5VTkRFRklORURfTElURVJBTCB8fCB0aGVDbGFzcy5nZXRLaW5kKCkgPT0gVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gSWYgdGhlICJhQ2xhc3MiIGlzIG5vdCBhIEphdmFDbGFzcyAoaS5lLiBpdCBpcyBlaXRoZXIgYSBKYXZhRGF0YXR5cGUgb3IKLQkJCS8vIHNvbWUgb3RoZXIga2luZCBvZiBNT0YgY2xhc3NpZmllciksIHRoZW4gaXQgY2Fubm90IGJlCi0JCQkvLyBhc3NpZ25lZCB0byBzb21ldGhpbmcgb2YgdGhpcyBjbGFzcy4KLQkJCWlmIChnZXRLaW5kKCkgIT0gVHlwZUtpbmQuSU5URVJGQUNFX0xJVEVSQUwpCi0JCQkJaWYgKHRoZUNsYXNzLmdldEtpbmQoKSAhPSBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCkKLQkJCQkJcmV0dXJuIHRoZUNsYXNzLmluaGVyaXRzRnJvbSh0aGlzKTsKLQkJCQllbHNlIHsKLQkJCQkJLy8gYUNsYXNzIGlzIGFuIGludGVyZmFjZSwgc28gaXQgaXMgYXNzaWduYWJsZSBvbmx5IGlmCi0JCQkJCS8vICJ0aGlzIiBpcyAiamF2YS5sYW5nLk9iamVjdCIuCi0JCQkJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0Iik7Ci0JCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiB0aGVDbGFzcy5pbXBsZW1lbnRzSW50ZXJmYWNlKHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIHRoaXMgdHlwZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4aXN0aW5nVHlwZSgpIHsKLQkJLy8gVE9ETzogVGVtcG9yYXJ5LCBpbmVmZmljaWVudCBpbXBsZW1lbnRhdGlvbgotCQlyZXR1cm4gKChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIGdldFJlYWRBZGFwdGVyKCkpLmhhc1JlZmxlY3Rpb25Tb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgaWYgdGhpcyBpcyB2YWxpZCBvYmplY3Qgb2YgdGhpcyB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5zdGFuY2UoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBJSW5zdGFudGlhdGlvbkluc3RhbmNlID8gaXNBc3NpZ25hYmxlRnJvbSgoKElJbnN0YW50aWF0aW9uSW5zdGFuY2UpIG8pLmdldEphdmFUeXBlKCkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBhbiBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBnZXRLaW5kKCkgPT0gVHlwZUtpbmQuSU5URVJGQUNFX0xJVEVSQUw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWQoKSB7Ci0JCXJldHVybiBnZXREZWNsYXJpbmdDbGFzcygpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyBvdXIgZmllbGRzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4gVGhlIGZpZWxkIHJlbGF0aW9uc2hpcCBpcyBkZXJpdmVkIGZyb20gY29udGVudHMuIFRoaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbgotCSAqIHRoZSBhc3N1bXB0aW9uIHRoYXQgc3VwZXJ0eXBlcyBhYm92ZSBKYXZhQ2xhc3Mgd2lsbCBob2xkIEF0dHJpYnV0ZXMgcmF0aGVyIHRoYW4gRmllbGRzLgotCSAqLwotCXB1YmxpYyBGaWVsZFtdIGxpc3RGaWVsZEV4dGVuZGVkKCkgewotCQlMaXN0IGZpZWxkcyA9IGdldEZpZWxkc0V4dGVuZGVkKCk7Ci0JCUZpZWxkW10gcmVzdWx0ID0gbmV3IEZpZWxkW2ZpZWxkcy5zaXplKCldOwotCQlmaWVsZHMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIG91ciBNZXRob2RzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIG1ldGhvZHMuIFRoZSBtZXRob2QgcmVsYXRpb25zaGlwIGlzIGRlcml2ZWQgZnJvbSBjb250ZW50cy4gVGhpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRzCi0JICogb24gdGhlIGFzc3VtcHRpb24gdGhhdCBzdXBlcnR5cGVzIGFib3ZlIEphdmFDbGFzcyB3aWxsIGhvbGQgT3BlcmF0aW9ucyByYXRoZXIgdGhhbiBNZXRob2RzLgotCSAqLwotCXB1YmxpYyBNZXRob2RbXSBsaXN0TWV0aG9kRXh0ZW5kZWQoKSB7Ci0JCWphdmEudXRpbC5MaXN0IG1ldGhvZHMgPSBnZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJTWV0aG9kW10gcmVzdWx0ID0gbmV3IE1ldGhvZFttZXRob2RzLnNpemUoKV07Ci0JCW1ldGhvZHMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGludGVybmFsIHJlZmxlY3Rpb24gZG8gbm90IHVzZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByaW1HZXROYW1lKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGludGVybmFsIHJlZmxlY3Rpb24gZG8gbm90IHVzZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByaW1HZXRRdWFsaWZpZWROYW1lKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCUphdmFQYWNrYWdlIHBhY2sgPSBnZXRKYXZhUGFja2FnZSgpOwotCQlpZiAocGFjayAhPSBudWxsICYmIHBhY2suZ2V0UGFja2FnZU5hbWUoKS5sZW5ndGgoKSAhPSAwKQotCQkJcmVzdWx0ID0gcGFjay5nZXRQYWNrYWdlTmFtZSgpICsgIi4iICsgdGhpcy5wcmltR2V0TmFtZSgpOwotCQllbHNlCi0JCQlyZXN1bHQgPSB0aGlzLmdldE5hbWUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIEphdmFDbGFzcyBmb3IgYSBnaXZlbiBxdWFsaWZpZWQgbmFtZS4gSWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgcmVmbGVjdGlvbgotCSAqIG1lY2hhbmlzbS4gTG9va3VwIHRoZSBKYXZhQ2xhc3MgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBhc3NlZCBvYmplY3QsIGhhbmRsaW5nIHNvbWUgZXJyb3IgY2FzZXMuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0VHlwZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyByZWZsZWN0KFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgRU9iamVjdCByZWxhdGVkT2JqZWN0KSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoYVF1YWxpZmllZE5hbWUsIHJlbGF0ZWRPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YUNsYXNzIGZvciBhIGdpdmVuIHF1YWxpZmllZCBuYW1lLiBJZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoIHRoZSByZWZsZWN0aW9uCi0JICogbWVjaGFuaXNtLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgcmVmbGVjdChTdHJpbmcgYVF1YWxpZmllZE5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLCBzZXQpOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YUNsYXNzIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZSBvciBjbGFzcyBuYW1lLiBJZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoIHRoZQotCSAqIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyByZWZsZWN0KFN0cmluZyBhUGFja2FnZU5hbWUsIFN0cmluZyBhQ2xhc3NOYW1lLCBSZXNvdXJjZVNldCBzZXQpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShhUGFja2FnZU5hbWUsIGFDbGFzc05hbWUsIHNldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3VwZXJ0eXBlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlU3VwZXJ0eXBlKGFKYXZhQ2xhc3MpOwotCQlMaXN0IHMgPSBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCQlzLmNsZWFyKCk7Ci0JCWlmIChhSmF2YUNsYXNzICE9IG51bGwpCi0JCQlzLmFkZChhSmF2YUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcGFzc2VkIEphdmFDbGFzcyBpcyBhIHZhbGlkIHN1cGVyIGNsYXNzIChpLmUuLCBpdCBkb2VzIG5vdCBjcmVhdGUgYW55IGN5Y2xlcyBpbiB0aGUgaW5oZXJpdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFKYXZhQ2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVN1cGVydHlwZShKYXZhQ2xhc3MgYUphdmFDbGFzcykgdGhyb3dzIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gewotCQlpZiAoIWlzVmFsaWRTdXBlcnR5cGUoYUphdmFDbGFzcykpCi0JCQl0aHJvdyBuZXcgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbih0aGlzLCBhSmF2YUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkU3VwZXJ0eXBlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JCWlmIChhSmF2YUNsYXNzICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmVxdWFscyhhSmF2YUNsYXNzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gZXh0ZW5kZWRJc1ZhbGlkU3VwZXJ0eXBlKGdldFN1YnR5cGVzKCksIGFKYXZhQ2xhc3MpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdWJ0eXBlcwotCSAqIEBwYXJhbSBhSmF2YUNsYXNzCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkSXNWYWxpZFN1cGVydHlwZShMaXN0IHN1YnR5cGVzLCBKYXZhQ2xhc3MgYUphdmFDbGFzcykgewotCQlpZiAoIWJhc2ljSXNWYWxpZFN1cGVydHlwZShzdWJ0eXBlcywgYUphdmFDbGFzcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUphdmFDbGFzcyBzdWJ0eXBlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YnR5cGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlzdWJ0eXBlID0gKEphdmFDbGFzcykgc3VidHlwZXMuZ2V0KGkpOwotCQkJaWYgKCFzdWJ0eXBlLmlzVmFsaWRTdXBlcnR5cGUoYUphdmFDbGFzcykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiYXNpY0lzVmFsaWRTdXBlcnR5cGUoTGlzdCBzdWJ0eXBlcywgSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIHN1YnR5cGU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VidHlwZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXN1YnR5cGUgPSAoSmF2YUNsYXNzKSBzdWJ0eXBlcy5nZXQoaSk7Ci0JCQlpZiAoc3VidHlwZS5lcXVhbHMoYUphdmFDbGFzcykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFN1YnR5cGVzKCkgewotCQlyZXR1cm4gZ2V0RVN1cGVyQWRhcHRlcigpLmdldFN1YmNsYXNzZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKCIgKyBnZXRRdWFsaWZpZWROYW1lKCkgKyAiKSI7Ci0JfQotCi0JcHVibGljIFR5cGVLaW5kIGdldEtpbmQoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBnZXRLaW5kR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2luZChUeXBlS2luZCBuZXdLaW5kKSB7Ci0JCVR5cGVLaW5kIG9sZEtpbmQgPSBraW5kOwotCQlraW5kID0gbmV3S2luZCA9PSBudWxsID8gS0lORF9FREVGQVVMVCA6IG5ld0tpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0tJTkQsIG9sZEtpbmQsIGtpbmQpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGlzUHVibGljR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljKGJvb2xlYW4gbmV3UHVibGljKSB7Ci0JCWJvb2xlYW4gb2xkUHVibGljID0gKGVGbGFncyAmIFBVQkxJQ19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1B1YmxpYykgZUZsYWdzIHw9IFBVQkxJQ19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflBVQkxJQ19FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUFVCTElDLCBvbGRQdWJsaWMsIG5ld1B1YmxpYykpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBpc0ZpbmFsR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluYWwoYm9vbGVhbiBuZXdGaW5hbCkgewotCQlib29sZWFuIG9sZEZpbmFsID0gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3RmluYWwpIGVGbGFncyB8PSBGSU5BTF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkZJTkFMX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTCwgb2xkRmluYWwsIG5ld0ZpbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFR5cGVLaW5kIGdldEtpbmRHZW4oKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGljR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFBVQkxJQ19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRJbml0aWFsaXplcnMoKSB7Ci0JCWlmIChpbml0aWFsaXplcnMgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoSW5pdGlhbGl6ZXIuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUywKLQkJCQkJSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MpOwotCQl9Ci0JCXJldHVybiBpbml0aWFsaXplcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyaW5nQ2xhc3MoSmF2YUNsYXNzIG5ld0RlY2xhcmluZ0NsYXNzKSB7Ci0JCWlmIChuZXdEZWNsYXJpbmdDbGFzcyAhPSBkZWNsYXJpbmdDbGFzcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVjbGFyaW5nQ2xhc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3RGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGVjbGFyaW5nQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREZWNsYXJpbmdDbGFzcyhuZXdEZWNsYXJpbmdDbGFzcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1MsIG5ld0RlY2xhcmluZ0NsYXNzLCBuZXdEZWNsYXJpbmdDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7Ci0JCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBudWxsICYmIGRlY2xhcmluZ0NsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGREZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOwotCQkJZGVjbGFyaW5nQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClkZWNsYXJpbmdDbGFzcyk7Ci0JCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gb2xkRGVjbGFyaW5nQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1MsIG9sZERlY2xhcmluZ0NsYXNzLCBkZWNsYXJpbmdDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWNsYXJpbmdDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0RGVjbGFyaW5nQ2xhc3MoKSB7Ci0JCXJldHVybiBkZWNsYXJpbmdDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREZWNsYXJpbmdDbGFzcyhKYXZhQ2xhc3MgbmV3RGVjbGFyaW5nQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJSmF2YUNsYXNzIG9sZERlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7Ci0JCWRlY2xhcmluZ0NsYXNzID0gbmV3RGVjbGFyaW5nQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUywgb2xkRGVjbGFyaW5nQ2xhc3MsIG5ld0RlY2xhcmluZ0NsYXNzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RGVjbGFyZWRDbGFzc2VzKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlY2xhcmVkQ2xhc3Nlc0dlbigpIHsKLQkJaWYgKGRlY2xhcmVkQ2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlkZWNsYXJlZENsYXNzZXMgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoSmF2YUNsYXNzLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1MpOwotCQl9Ci0JCXJldHVybiBkZWNsYXJlZENsYXNzZXM7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7IC8vIEFzIG9mIEVNRiAyLjAsIGxvY2FsIHByb3BlcnRpZXMgYXJlIHRoZSBsb2NhbCBmZWF0dXJlcy4gVXNlZCB0byBiZSBhIG1lcmdlIG9mIGVhdHRyaWJ1dGVzIGFuZCBlcmVmZXJlbmNlcy4KLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RXZlbnRzKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFdmVudHMoKTsKLQkJcmV0dXJuIGdldEV2ZW50c0dlbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFdmVudHNHZW4oKSB7Ci0JCWlmIChldmVudHMgPT0gbnVsbCkgewotCQkJZXZlbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEphdmFFdmVudC5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTKTsKLQkJfQotCQlyZXR1cm4gZXZlbnRzOwotCX0KLQotCXByaXZhdGUgRUxpc3QgYWxsRXZlbnRzOwotCi0JcHVibGljIEVMaXN0IGdldEFsbEV2ZW50cygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGlhID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGlhID09IG51bGwpCi0JCQlyZXR1cm4gRUNvbGxlY3Rpb25zLkVNUFRZX0VMSVNUOyAvLyBObyBpbnRyb3NwZWN0aW9uLCBkbyBub3JtYWwuCi0JCXJldHVybiBhbGxFdmVudHMgPSBpYS5nZXRBbGxFdmVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsRXZlbnRzR2VuKCkgewotCQlyZXR1cm4gYWxsRXZlbnRzOwotCX0KLQotCXByaXZhdGUgRUxpc3QgYWxsUHJvcGVydGllczsKLQotCXB1YmxpYyBFTGlzdCBnZXRBbGxQcm9wZXJ0aWVzKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgaWEgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoaWEgPT0gbnVsbCkKLQkJCXJldHVybiBFQ29sbGVjdGlvbnMuRU1QVFlfRUxJU1Q7IC8vIE5vIGludHJvc3BlY3Rpb24sIGRvIG5vcm1hbC4KLQkJcmV0dXJuIGFsbFByb3BlcnRpZXMgPSBpYS5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEFsbFByb3BlcnRpZXNHZW4oKSB7Ci0JCXJldHVybiBhbGxQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzTmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gZ2V0SW5zdGFuY2VDbGFzcygpICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGdldEluc3RhbmNlQ2xhc3MoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFRkFVTFRfVkFMVUU6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwgOiAhREVGQVVMVF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMCkgIT0gQUJTVFJBQ1RfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJTlRFUkZBQ0VfRUZMQUcpICE9IDApICE9IElOVEVSRkFDRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNVUEVSX1RZUEVTOgotCQkJCXJldHVybiBlU3VwZXJUeXBlcyAhPSBudWxsICYmICFlU3VwZXJUeXBlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VPUEVSQVRJT05TOgotCQkJCXJldHVybiBlT3BlcmF0aW9ucyAhPSBudWxsICYmICFlT3BlcmF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTExfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQUxMX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVJFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuICFnZXRFUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFUVFJJQlVURVM6Ci0JCQkJcmV0dXJuICFnZXRFQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFMTF9DT05UQUlOTUVOVFM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQ29udGFpbm1lbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQUxMX09QRVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsT3BlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCXJldHVybiAhZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFMTF9TVVBFUl9UWVBFUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FSURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlyZXR1cm4gZVN0cnVjdHVyYWxGZWF0dXJlcyAhPSBudWxsICYmICFlU3RydWN0dXJhbEZlYXR1cmVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fS0lORDoKLQkJCQlyZXR1cm4ga2luZCAhPSBLSU5EX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUM6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwKSAhPSBQVUJMSUNfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJTkFMOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKSAhPSBGSU5BTF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTOgotCQkJCXJldHVybiBpbXBsZW1lbnRzSW50ZXJmYWNlcyAhPSBudWxsICYmICFpbXBsZW1lbnRzSW50ZXJmYWNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVDoKLQkJCQlyZXR1cm4gY2xhc3NJbXBvcnQgIT0gbnVsbCAmJiAhY2xhc3NJbXBvcnQuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFM6Ci0JCQkJcmV0dXJuIHBhY2thZ2VJbXBvcnRzICE9IG51bGwgJiYgIXBhY2thZ2VJbXBvcnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTOgotCQkJCXJldHVybiBmaWVsZHMgIT0gbnVsbCAmJiAhZmllbGRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUzoKLQkJCQlyZXR1cm4gbWV0aG9kcyAhPSBudWxsICYmICFtZXRob2RzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCXJldHVybiBpbml0aWFsaXplcnMgIT0gbnVsbCAmJiAhaW5pdGlhbGl6ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gZGVjbGFyZWRDbGFzc2VzICE9IG51bGwgJiYgIWRlY2xhcmVkQ2xhc3Nlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSkFWQV9QQUNLQUdFOgotCQkJCXJldHVybiBiYXNpY0dldEphdmFQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCXJldHVybiBldmVudHMgIT0gbnVsbCAmJiAhZXZlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQUxMX0VWRU5UUzoKLQkJCQlyZXR1cm4gIWdldEFsbEV2ZW50cygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BQlNUUkFDVDoKLQkJCQlzZXRBYnN0cmFjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FU1VQRVJfVFlQRVM6Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5jbGVhcigpOwotCQkJCWdldEVTdXBlclR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VPUEVSQVRJT05TOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0tJTkQ6Ci0JCQkJc2V0S2luZCgoVHlwZUtpbmQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUFVCTElDOgotCQkJCXNldFB1YmxpYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJTkFMOgotCQkJCXNldEZpbmFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTOgotCQkJCWdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19DTEFTU19JTVBPUlQ6Ci0JCQkJZ2V0Q2xhc3NJbXBvcnQoKS5jbGVhcigpOwotCQkJCWdldENsYXNzSW1wb3J0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BBQ0tBR0VfSU1QT1JUUzoKLQkJCQlnZXRQYWNrYWdlSW1wb3J0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFja2FnZUltcG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTOgotCQkJCWdldEZpZWxkcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmllbGRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlM6Ci0JCQkJZ2V0SW5pdGlhbGl6ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0aWFsaXplcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlnZXREZWNsYXJlZENsYXNzZXMoKS5jbGVhcigpOwotCQkJCWdldERlY2xhcmVkQ2xhc3NlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJc2V0RGVjbGFyaW5nQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FVkVOVFM6Ci0JCQkJZ2V0RXZlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRFdmVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQUxMX0VWRU5UUzoKLQkJCQlnZXRBbGxFdmVudHMoKS5jbGVhcigpOwotCQkJCWdldEFsbEV2ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQUJTVFJBQ1Q6Ci0JCQkJc2V0QWJzdHJhY3QoQUJTVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5URVJGQUNFOgotCQkJCXNldEludGVyZmFjZShJTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNVUEVSX1RZUEVTOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VPUEVSQVRJT05TOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCWdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fS0lORDoKLQkJCQlzZXRLaW5kKEtJTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUFVCTElDOgotCQkJCXNldFB1YmxpYyhQVUJMSUNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklOQUw6Ci0JCQkJc2V0RmluYWwoRklOQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTOgotCQkJCWdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVDoKLQkJCQlnZXRDbGFzc0ltcG9ydCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFM6Ci0JCQkJZ2V0UGFja2FnZUltcG9ydHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTOgotCQkJCWdldEZpZWxkcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19NRVRIT0RTOgotCQkJCWdldE1ldGhvZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCWdldEluaXRpYWxpemVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCWdldERlY2xhcmVkQ2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJc2V0RGVjbGFyaW5nQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUzoKLQkJCQlnZXRFdmVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQUxMX0VWRU5UUzoKLQkJCQlnZXRBbGxFdmVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIEVMaXN0IGdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCkgewotCQlpZiAoaW1wbGVtZW50c0ludGVyZmFjZXMgPT0gbnVsbCkgewotCQkJaW1wbGVtZW50c0ludGVyZmFjZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KEphdmFDbGFzcy5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTKSB7Ci0KLQkJCQkvKioKLQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCSAqIAotCQkJCSAqIEBzaW5jZSAxLjEuMAotCQkJCSAqLwotCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLmdldChpbmRleCk7IC8vZm9yY2UgcmVzb2x1dGlvbiBzbyB0aGUgRVN1cGVyQWRhcHRlciB3aWxsIGJlIHVwZGF0ZWQgY29ycmVjdGx5Ci0JCQkJCXJldHVybiBzdXBlci5nZXQoaW5kZXgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJCQlzdXBlci5jbGVhcigpOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5jbGVhcigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotCQkJCQlPYmplY3QgcmVzdWx0ID0gc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5yZW1vdmVBbGwoY29sbGVjdGlvbik7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLnJlbW92ZUFsbChjb2xsZWN0aW9uKTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXN1cGVyLmFkZChpbmRleCwgb2JqZWN0KTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkuYWRkKGluZGV4LCBvYmplY3QpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkKG9iamVjdCk7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLmFkZChvYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5hZGRBbGwoY29sbGVjdGlvbik7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLmFkZEFsbChjb2xsZWN0aW9uKTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5hZGRBbGwoaW5kZXgsIGNvbGxlY3Rpb24pOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5hZGRBbGwoaW5kZXgsIGNvbGxlY3Rpb24pOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGltcGxlbWVudHNJbnRlcmZhY2VzOwotCX0KLQotCXByaXZhdGUgRUxpc3QgZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEVTdXBlclR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENsYXNzSW1wb3J0R2VuKCkgewotCQlpZiAoY2xhc3NJbXBvcnQgPT0gbnVsbCkgewotCQkJY2xhc3NJbXBvcnQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KEphdmFDbGFzcy5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NJbXBvcnQ7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVBbGxTdXBlclR5cGVzKCkgewotCQlyZWZsZWN0QmFzZSgpOy8vRm9yY2UgcmVmbGVjdGlvbiwgaWYgbmVlZGVkLCBiZWZvcmUgZ2V0dGluZyBhbGwgc3VwZXJ0eXBlcy4KLQkJcmV0dXJuIHN1cGVyLmdldEVBbGxTdXBlclR5cGVzKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVTdXBlclR5cGVzKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RVN1cGVyVHlwZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgb3RoZXJzLiBJdCBpcyBoZXJlIHNvIHRoYXQgdGhlIHJlZmxlY3Rpb24KLQkgKiBhZGFwdGVycyBjYW4gcmVmZXJlbmNlIHRoZSB1bnJlZmxlY3RlZCBzdXBlcnR5cGVzLgotCSAqICAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEVMaXN0IHByaW1HZXRFU3VwZXJUeXBlcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEVTdXBlclR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBhY2thZ2VJbXBvcnRzR2VuKCkgewotCQlpZiAocGFja2FnZUltcG9ydHMgPT0gbnVsbCkgewotCQkJcGFja2FnZUltcG9ydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KEphdmFQYWNrYWdlLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFMpOwotCQl9Ci0JCXJldHVybiBwYWNrYWdlSW1wb3J0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RmllbGRzR2VuKCkgewotCQlpZiAoZmllbGRzID09IG51bGwpIHsKLQkJCWZpZWxkcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KEZpZWxkLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFMsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTKTsKLQkJfQotCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RzR2VuKCkgewotCQlpZiAobWV0aG9kcyA9PSBudWxsKSB7Ci0JCQltZXRob2RzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTWV0aG9kLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19NRVRIT0RTLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1MpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSBnZXRKYXZhUGFja2FnZUdlbigpIHsKLQkJSmF2YVBhY2thZ2UgamF2YVBhY2thZ2UgPSBiYXNpY0dldEphdmFQYWNrYWdlKCk7Ci0JCXJldHVybiBqYXZhUGFja2FnZSA9PSBudWxsID8gbnVsbCA6IChKYXZhUGFja2FnZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpamF2YVBhY2thZ2UpOwotCX0KLQotCS8qCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEphdmFQYWNrYWdlIGJhc2ljR2V0SmF2YVBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXZhUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FUEFDS0FHRToKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FT1BFUkFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFT3BlcmF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWVsZHMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0aWFsaXplcnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZWNsYXJlZENsYXNzZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTOgotCQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZWNsYXJpbmdDbGFzcykuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RGVjbGFyaW5nQ2xhc3MoKEphdmFDbGFzcylvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVBBQ0tBR0U6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRU9QRVJBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmllbGRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdGlhbGl6ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RGVjbGFyaW5nQ2xhc3MobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FVkVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXZlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FUEFDS0FHRToKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzTmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUZBVUxUX1ZBTFVFOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVBBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0FCU1RSQUNUOgotCQkJCXJldHVybiBpc0Fic3RyYWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGlzSW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FU1VQRVJfVFlQRVM6Ci0JCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VPUEVSQVRJT05TOgotCQkJCXJldHVybiBnZXRFT3BlcmF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQUxMX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVJFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldEVSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRFQXR0cmlidXRlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbENvbnRhaW5tZW50cygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQUxMX09QRVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQUxMX1NVUEVSX1RZUEVTOgotCQkJCXJldHVybiBnZXRFQWxsU3VwZXJUeXBlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FSURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fS0lORDoKLQkJCQlyZXR1cm4gZ2V0S2luZCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUM6Ci0JCQkJcmV0dXJuIGlzUHVibGljKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTDoKLQkJCQlyZXR1cm4gaXNGaW5hbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTOgotCQkJCXJldHVybiBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19DTEFTU19JTVBPUlQ6Ci0JCQkJcmV0dXJuIGdldENsYXNzSW1wb3J0KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BBQ0tBR0VfSU1QT1JUUzoKLQkJCQlyZXR1cm4gZ2V0UGFja2FnZUltcG9ydHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTOgotCQkJCXJldHVybiBnZXRGaWVsZHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlM6Ci0JCQkJcmV0dXJuIGdldEluaXRpYWxpemVycygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCXJldHVybiBnZXREZWNsYXJlZENsYXNzZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZWNsYXJpbmdDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRKYXZhUGFja2FnZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEphdmFQYWNrYWdlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUzoKLQkJCQlyZXR1cm4gZ2V0RXZlbnRzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0FMTF9FVkVOVFM6Ci0JCQkJcmV0dXJuIGdldEFsbEV2ZW50cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGtpbmQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGtpbmQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1YmxpYzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFBVQkxJQ19FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGggdHJ1ZS4gSXQgaXMgYmFzaWNhbGx5IG9ubHkgZm9yIHJlc2V0IG9mIHJlZmxlY3Rpb24sIG5vdCB0byBzZXQgYSBwYXJ0aWN1bGFyIHN0YXRlLiBCdXQgSW50ZXJuYWxSZWFkQWRhcHRhYmxlCi0JICogbWF5IGJlIHVzZWQgYnkgc29tZW9uZSB0aGF0IHNob3VsZG4ndCBzbyB0byBiZSBiZSBzYWZlIHdlIGtlZXAgaXQuIFRPRE8gUmVtb3ZlIEludGVybmFsUmVhZEFkYXB0YWJsZSBpbiBuZXh0IHZlcnNpb24uIE5lZWQgdG8gd2FpdCBiZWNhdXNlIHdlCi0JICogbmVlZCB0aW1lIHRvIG5vdGlmeSBldmVyeW9uZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkludGVybmFsUmVhZEFkYXB0YWJsZSNzZXRSZWZsZWN0ZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UmVmbGVjdGVkKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJaWYgKCFhQm9vbGVhbikKLQkJCXJlZmxlY3Rpb25TdGF0dXMgPSBOT1RfUkVGTEVDVEVEOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0UmVmbGVjdGlvblR5cGUoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblR5cGUoKSB7Ci0JCUphdmFSZWZsZWN0aW9uQWRhcHRvciBqYSA9ICgoSmF2YVJlZmxlY3Rpb25BZGFwdG9yKSBnZXRSZWFkQWRhcHRlcigpKTsKLQkJcmV0dXJuIGphICE9IG51bGwgPyBqYS5nZXRSZWZsZWN0aW9uU291cmNlKCkgOiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRGF0YVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YURhdGFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWUyZWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRGF0YVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YURhdGFUeXBlSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjMyICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSW5zdGFuY2U7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFEYXRhVHlwZUltcGwgZXh0ZW5kcyBFQ2xhc3NJbXBsIGltcGxlbWVudHMgSmF2YURhdGFUeXBlewotCi0JCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfWkVSTyA9ICIwLjAiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVRfWkVSTyA9ICIwLjBmIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJfWkVSTyA9ICInMCciOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWkVSTyA9ICIwIjsKLQkKLQlwcml2YXRlIGludCBwcmltaXRpdmVfdHlwZSA9IFBSSU1fTk9UX0lEOwotCQotCXByb3RlY3RlZCBKYXZhRGF0YVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhRGF0YVR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRKYXZhTmFtZSgpOwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKFBSSU1fQk9PTEVBTl9OQU1FKSkKLQkJCXJldHVybiBGQUxTRTsKLQkJaWYgKHR5cGVOYW1lLmVxdWFscyhQUklNX0RPVUJMRV9OQU1FKSkKLQkJCXJldHVybiBET1VCTEVfWkVSTzsKLQkJaWYgKHR5cGVOYW1lLmVxdWFscyhQUklNX0ZMT0FUX05BTUUpKQotCQkJcmV0dXJuIEZMT0FUX1pFUk87CQkJCi0JCWlmICh0eXBlTmFtZS5lcXVhbHMoUFJJTV9DSEFSQUNURVJfTkFNRSkpCi0JCQlyZXR1cm4gQ0hBUl9aRVJPOwotCQlyZXR1cm4gWkVSTzsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRKYXZhTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0JcHVibGljIEphdmFEYXRhVHlwZSBnZXRQcmltaXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyNnZXRQcmltaXRpdmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmltaXRpdmVJRCgpIHsKLQkJaWYgKHByaW1pdGl2ZV90eXBlID09IFBSSU1fTk9UX0lEKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0JPT0xFQU5fTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0JPT0xFQU5fSUQ7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9DSEFSQUNURVJfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0NIQVJBQ1RFUl9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0JZVEVfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0JZVEVfSUQ7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9TSE9SVF9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fU0hPUlRfSUQ7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9JTlRFR0VSX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9JTlRFR0VSX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fTE9OR19OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fTE9OR19JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0ZMT0FUX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9GTE9BVF9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0RPVUJMRV9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fRE9VQkxFX0lEOwotCQl9Ci0JCXJldHVybiBwcmltaXRpdmVfdHlwZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiBnZXRKYXZhTmFtZSgpOwotCX0KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFdyYXBwZXIoKSB7Ci0JCVN0cmluZyB3cmFwcGVyTmFtZSA9IGdldFdyYXBwZXJRdWFsaWZpZWROYW1lKCk7Ci0JCWlmICh3cmFwcGVyTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHdyYXBwZXJOYW1lLCB0aGlzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZ2V0V3JhcHBlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFdyYXBwZXJRdWFsaWZpZWROYW1lKCkgewotCQlzd2l0Y2ggKGdldFByaW1pdGl2ZUlEKCkpIHsKLQkJCWNhc2UgUFJJTV9JTlRFR0VSX0lEOgotCQkJCXJldHVybiBJTlRFR0VSX05BTUU7Ci0JCQljYXNlIFBSSU1fQ0hBUkFDVEVSX0lEOgotCQkJCXJldHVybiBDSEFSQUNURVJfTkFNRTsKLQkJCWNhc2UgUFJJTV9CT09MRUFOX0lEOgotCQkJCXJldHVybiBCT09MRUFOX05BTUU7Ci0JCQljYXNlIFBSSU1fQllURV9JRDoKLQkJCQlyZXR1cm4gQllURV9OQU1FOwotCQkJY2FzZSBQUklNX1NIT1JUX0lEOgotCQkJCXJldHVybiBTSE9SVF9OQU1FOwotCQkJY2FzZSBQUklNX0xPTkdfSUQ6Ci0JCQkJcmV0dXJuIExPTkdfTkFNRTsKLQkJCWNhc2UgUFJJTV9GTE9BVF9JRDoKLQkJCQlyZXR1cm4gRkxPQVRfTkFNRTsKLQkJCWNhc2UgUFJJTV9ET1VCTEVfSUQ6Ci0JCQkJcmV0dXJuIERPVUJMRV9OQU1FOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvKgotCSAqIEphdmFIZWxwZXJzLmlzQXJyYXkoKSAtIGFycmF5IHR5cGVzIGFyZSBhbHdheXMgSmF2YUNsYXNzZXMsIGV2ZW4gaWYgdGhlaXIgY29tcG9uZW50IHR5cGUgaXMKLQkgKgkJYSBwcmltaXRpdmUgZGF0YSB0eXBlLiBSZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBDYW4gYW4gb2JqZWN0IG9mIHRoZSBwYXNzZWQgaW4gY2xhc3MgYmUgYXNzaWduZWQgdG8gYW4KLQkgKiBvYmplY3Qgb2YgdGhpcyBjbGFzcz8gSW4gdGhlIGNhc2Ugb2YgcHJpbWl0aXZlcywgYXJlIHRoZXkgdGhlIHNhbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShFQ2xhc3NpZmllciBhQ2xhc3MpIHsKLQkJcmV0dXJuIHRoaXMgPT0gYUNsYXNzOwotCX0KLQkvKioKLQkgKiBTZWUgaWYgdGhpcyBpcyB2YWxpZCBvYmplY3Qgb2YgdGhpcyB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5zdGFuY2UoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBJSW5zdGFudGlhdGlvbkluc3RhbmNlID8gaXNBc3NpZ25hYmxlRnJvbSgoKElJbnN0YW50aWF0aW9uSW5zdGFuY2UpIG8pLmdldEphdmFUeXBlKCkpIDogZmFsc2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVBBQ0tBR0U6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FT1BFUkFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFT3BlcmF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FUEFDS0FHRToKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VPUEVSQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVBBQ0tBR0U6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUNMQVNTSUZJRVJTLCBFUGFja2FnZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0lOU1RBTkNFX0NMQVNTOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19ERUZBVUxUX1ZBTFVFOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VQQUNLQUdFOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGlzSW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNVUEVSX1RZUEVTOgotCQkJCXJldHVybiBnZXRFU3VwZXJUeXBlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRU9QRVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVPcGVyYXRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0RVJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRFQXR0cmlidXRlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFMTF9DT05UQUlOTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEVBbGxDb250YWlubWVudHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBTExfT1BFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFMTF9TVVBFUl9UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VJRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0FCU1RSQUNUOgotCQkJCXNldEFic3RyYWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNVUEVSX1RZUEVTOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRU9QRVJBVElPTlM6Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVPcGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUU6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fQUJTVFJBQ1Q6Ci0JCQkJc2V0QWJzdHJhY3QoQUJTVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FU1VQRVJfVFlQRVM6Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VPUEVSQVRJT05TOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzTmFtZSAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3NOYW1lKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0lOU1RBTkNFX0NMQVNTOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gZ2V0SW5zdGFuY2VDbGFzcygpICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGdldEluc3RhbmNlQ2xhc3MoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19ERUZBVUxUX1ZBTFVFOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VQQUNLQUdFOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMCkgIT0gQUJTVFJBQ1RfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5URVJGQUNFX0VGTEFHKSAhPSAwKSAhPSBJTlRFUkZBQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FU1VQRVJfVFlQRVM6Ci0JCQkJcmV0dXJuIGVTdXBlclR5cGVzICE9IG51bGwgJiYgIWVTdXBlclR5cGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VPUEVSQVRJT05TOgotCQkJCXJldHVybiBlT3BlcmF0aW9ucyAhPSBudWxsICYmICFlT3BlcmF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBTExfUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVJFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuICFnZXRFUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBVFRSSUJVVEVTOgotCQkJCXJldHVybiAhZ2V0RUF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX0NPTlRBSU5NRU5UUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxDb250YWlubWVudHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX09QRVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsT3BlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX1NVUEVSX1RZUEVTOgotCQkJCXJldHVybiAhZ2V0RUFsbFN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FSURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuIGVTdHJ1Y3R1cmFsRmVhdHVyZXMgIT0gbnVsbCAmJiAhZVN0cnVjdHVyYWxGZWF0dXJlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzI2dldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkgewotCQlyZXR1cm4gZ2V0SmF2YU5hbWUoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUV2ZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFFdmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3YzFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUV2ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFFdmVudEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIEV2ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUV2ZW50SW1wbCBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwgaW1wbGVtZW50cyBKYXZhRXZlbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhRXZlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUywgRUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19PUkRFUkVEOgotCQkJCXJldHVybiBpc09yZGVyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VOSVFVRToKLQkJCQlyZXR1cm4gaXNVbmlxdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0xPV0VSX0JPVU5EOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRMb3dlckJvdW5kKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19VUFBFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VXBwZXJCb3VuZCgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fTUFOWToKLQkJCQlyZXR1cm4gaXNNYW55KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRVRZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVUeXBlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0NIQU5HRUFCTEU6Ci0JCQkJcmV0dXJuIGlzQ2hhbmdlYWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVk9MQVRJTEU6Ci0JCQkJcmV0dXJuIGlzVm9sYXRpbGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gaXNUcmFuc2llbnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0RFRkFVTFRfVkFMVUVfTElURVJBTDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVU5TRVRUQUJMRToKLQkJCQlyZXR1cm4gaXNVbnNldHRhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERVJJVkVEOgotCQkJCXJldHVybiBpc0Rlcml2ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCXJldHVybiBnZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fT1JERVJFRDoKLQkJCQlzZXRPcmRlcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VQUEVSX0JPVU5EOgotCQkJCXNldFVwcGVyQm91bmQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19DSEFOR0VBQkxFOgotCQkJCXNldENoYW5nZWFibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19WT0xBVElMRToKLQkJCQlzZXRWb2xhdGlsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1RSQU5TSUVOVDoKLQkJCQlzZXRUcmFuc2llbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VOU0VUVEFCTEU6Ci0JCQkJc2V0VW5zZXR0YWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0RFUklWRUQ6Ci0JCQkJc2V0RGVyaXZlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX09SREVSRUQ6Ci0JCQkJc2V0T3JkZXJlZChPUkRFUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoTE9XRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVVBQRVJfQk9VTkQ6Ci0JCQkJc2V0VXBwZXJCb3VuZChVUFBFUl9CT1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FVFlQRToKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19DSEFOR0VBQkxFOgotCQkJCXNldENoYW5nZWFibGUoQ0hBTkdFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19WT0xBVElMRToKLQkJCQlzZXRWb2xhdGlsZShWT0xBVElMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19UUkFOU0lFTlQ6Ci0JCQkJc2V0VHJhbnNpZW50KFRSQU5TSUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlTGl0ZXJhbChERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVU5TRVRUQUJMRToKLQkJCQlzZXRVbnNldHRhYmxlKFVOU0VUVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVSSVZFRDoKLQkJCQlzZXREZXJpdmVkKERFUklWRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX09SREVSRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgT1JERVJFRF9FRkxBRykgIT0gMCkgIT0gT1JERVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVU5JUVVFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFVOSVFVRV9FRkxBRykgIT0gMCkgIT0gVU5JUVVFX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbG93ZXJCb3VuZCAhPSBMT1dFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX01BTlk6Ci0JCQkJcmV0dXJuIGlzTWFueSgpICE9IE1BTllfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VUWVBFOgotCQkJCXJldHVybiBlVHlwZSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19DSEFOR0VBQkxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIENIQU5HRUFCTEVfRUZMQUcpICE9IDApICE9IENIQU5HRUFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1ZPTEFUSUxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwKSAhPSBWT0xBVElMRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVFJBTlNJRU5UOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMCkgIT0gVFJBTlNJRU5UX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVkFMVUVfTElURVJBTF9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdFZhbHVlTGl0ZXJhbCAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfTElURVJBTF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFZhbHVlTGl0ZXJhbCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0RFRkFVTFRfVkFMVUU6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwgOiAhREVGQVVMVF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19VTlNFVFRBQkxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFVOU0VUVEFCTEVfRUZMQUcpICE9IDApICE9IFVOU0VUVEFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0RFUklWRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgREVSSVZFRF9FRkxBRykgIT0gMCkgIT0gREVSSVZFRF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVDb250YWluaW5nQ2xhc3MoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjZmRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhRmFjdG9yeUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXI7Ci0KLS8qKgotICogVGhlIGZhY3RvcnkgdG8gdXNlIEphdmFSZWYgcGFja2FnZXMuIEl0IHdpbGwgdXNlIHRoZQotICogSUluc3RhbnRpYXRpb25IYW5kbGVyLCBpZiB0aGVyZSBpcyBvbmUsIHRvIGRvIHRoZQotICogZmFjdG9yeSByZXF1ZXN0cy4gRWxzZSBpdCB3aWxsIGxldCB0aGUgc3VwZXJjbGFzcyBoYW5kbGUgaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgewotCQotCXByaXZhdGUgSUluc3RhbnRpYXRpb25IYW5kbGVyIGluc3RhbnRpYXRpb25IYW5kbGVyOwotCXByaXZhdGUgYm9vbGVhbiByZXRyaWV2ZWRIYW5kbGVyOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFGYWN0b3J5SW1wbC4KLQkgKi8KLQlwdWJsaWMgSmF2YUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJSW5zdGFudGlhdGlvbkhhbmRsZXIgZ2V0SW5zdGFudGlhdGlvbkhhbmRsZXIoKSB7Ci0JCWlmICghcmV0cmlldmVkSGFuZGxlcikgewotCQkJLy8gTmVlZCB0byByZXRyaWV2ZSBoYW5kbGVyIGxhemlseSBiZWNhdXNlIHdoZW4gZmFjdG9yeSBpcyBjcmVhdGVkIGl0IGRvZXMgbm90IHlldCBrbm93IHdoYXQgUmVzb3VyY2VTZXQgaXQgaXMgaW4uCi0JCQkvLyBDYW4ndCBrbm93IHRoYXQgdW50aWwgdGhlIGZpcnN0IHRpbWUgd2UgbmVlZCBhIGhhbmRsZXIuCi0JCQlSZXNvdXJjZVNldCByc2V0ID0gZ2V0RVBhY2thZ2UoKS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJzZXQgIT0gbnVsbCkgewotCQkJCXJldHJpZXZlZEhhbmRsZXIgPSB0cnVlOwotCQkJCUlJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyIGZhY3RvcnkgPSAoSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIocnNldCwgSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCQkJCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQkJCWluc3RhbnRpYXRpb25IYW5kbGVyID0gZmFjdG9yeS5nZXRJbnN0YW50aWF0aW9uSGFuZGxlcih0aGlzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFudGlhdGlvbkhhbmRsZXI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5I2NyZWF0ZShFQ2xhc3MpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJSUluc3RhbnRpYXRpb25IYW5kbGVyIGlhID0gZ2V0SW5zdGFudGlhdGlvbkhhbmRsZXIoKTsKLQkJaWYgKGlhID09IG51bGwgfHwgIWlhLmhhbmRsZXNDbGFzcyhlQ2xhc3MpKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZShlQ2xhc3MpOwotCQllbHNlCi0JCQlyZXR1cm4gaWEuY3JlYXRlKGVDbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNGNhZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFQYWNrYWdlSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjMyICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVDb2xsZWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKYXZhUGFja2FnZSwgRVBhY2thZ2UgewotCQkvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByb3RlY3RlZCBKYXZhUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgY2xhc3NlcyB0aGF0IHRoaXMgcGFja2FnZSBjb250YWlucy4KLQkgKiBTaW5jZSB0aGlzIGlzIGEgZGVyaXZlZCByZWxhdGlvbnNoaXAsIHdlIG5lZWQgdG8gaW1wbGVtZW50Ci0JICogaXQgaGVyZS4gSXQgd2lsbCBnZXQgdGhlIG1ldGFvYmplY3RzIGxpc3QuIFRoZXNlIGFyZSB0aGUKLQkgKiBqYXZhIGNsYXNzZXMgdGhpcyBwYWNrYWdlIGNvbnRhaW5zLgotCSAqCi0JICogSWYgdGhpcyBpcyB0aGUgcHJpbWl0aXZlcyBwYWNrYWdlLCB0aGVuIGl0IG11c3QgcmV0dXJuCi0JICogYW4gZW1wdHkgbGlzdCBiZWNhdXNlIGl0IGRvZXNuJ3QgY29udGFpbiBhbnkgY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SmF2YUNsYXNzZXMoKSB7Ci0JCXJldHVybiAhUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRS5lcXVhbHMoZ2V0TmFtZSgpKSA/Ci0JCQlFQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlRUxpc3QoZ2V0RUNsYXNzaWZpZXJzKCkpIDoKLQkJCUVDb2xsZWN0aW9ucy5FTVBUWV9FTElTVDsKLQl9Ci0vKioKLSAqIFJldHVybiB0aGUgbmFtZSBmb3IgdGhpcyBwYWNrYWdlLgotICogV2UgZG8gbm90IHdhbnQgdG8gZXhwb3NlIHRoZSAuamF2YXByaW0gcGFja2FnZQotICogc2luY2UgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBwYWNrYWdlLgotICovCi1wdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JaWYgKGlzRGVmYXVsdCgpKQotCQlyZXR1cm4gIiI7Ci0JZWxzZQotCQlyZXR1cm4gc3VwZXIuZ2V0TmFtZSgpOwotfQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0KLQlTdHJpbmcgaW50ZXJuYWxOYW1lID0gc3VwZXIuZ2V0TmFtZSgpIDsKLQlyZXR1cm4gSmF2YVBhY2thZ2UuUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRS5lcXVhbHMoaW50ZXJuYWxOYW1lKSA/ICIiIDogaW50ZXJuYWxOYW1lIDsJCi19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JcmV0dXJuIEphdmFQYWNrYWdlLlBSSU1JVElWRV9QQUNLQUdFX05BTUUuZXF1YWxzKHN1cGVyLmdldE5hbWUoKSk7CQotfQotCS8qKgotCSAqIFNpbmNlIGNsYXNzZXMgYXJlIGxvYWRlZCBkeW5hbWljYWxseSBhbmQgbm90IGZyb20gYSBzY2hlbWEsIGEKLQkgKiBjbGFzcyBjb3VsZCBiZSBhc2tlZCBmb3IgdGhyb3VnaCB0aGlzIG1ldGhvZCwgYW5kIGlmIG5vdCB5ZXQgcmVmbGVjdGVkLAotCSAqIGl0IHdvdWxkbid0IGJlIGZvdW5kLiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFueSBjbGFzcyBhc2tlZCBmb3IKLQkgKiBpbiB0aGlzIHBhY2thZ2UgaXMgZm91bmQgKGkuZS4gcG9vZmVkIHVwKS4gT3RoZXJ3aXNlIGxvYWRpbmcgYW4gaW5zdGFuY2UKLQkgKiBkb2N1bWVudCB0aGF0IHJlZmVycyB0byBqYXZhIGNsYXNzIHRocm91Z2ggbmFtZXNwYWNlcyB3b24ndCBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0RUNsYXNzaWZpZXIoU3RyaW5nIGNsYXNzTmFtZSkgewkJCQotCQkvLyBUcnkgdG8gZ2V0IHRoZSBjbGFzcyBmcm9tIHRoZSByZXNvdXJjZSB0aGF0IHRoaXMgcGFja2FnZSBpcyBpbi4KLQkJLy8gVGhpcyB3aWxsIGNyZWF0ZSBpdCBpZiBub3QgZm91bmQuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUKLQkJLy8gc3RydWN0dXJlIGlzIHRoZXJlIGlzIG9uZSBqYXZhIHBhY2thZ2UgcGVyIHJlc291cmNlLCBhbmQKLQkJLy8gdGhlIGlkIG9mIHRoZSBjbGFzcyBpcyB0aGUgY2xhc3MgbmFtZSB3aXRob3V0IHRoZSBwYWNrYWdlCi0JCS8vIHBvcnRpb24sIHdoaWNoIGlzIHdoYXQgY2xhc3NOYW1lIGFib3ZlIGlzLgotCQlPYmplY3QgcmVzdWx0ID0gZVJlc291cmNlKCkuZ2V0RU9iamVjdChjbGFzc05hbWUpOwotCQlyZXR1cm4gKHJlc3VsdCBpbnN0YW5jZW9mIEVDbGFzc2lmaWVyKSA/IChFQ2xhc3NpZmllcikgcmVzdWx0IDogbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogcmVmbGVjdCAtIHJlZmxlY3QgYSBKYXZhIHBhY2thZ2UgZm9yIGEgZ2l2ZW4gcGFja2FnZSBuYW1lLgotCSAqIElmIHRoZSBwYWNrYWdlIGRvZXMgbm90IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHRocm91Z2gKLQkgKiB0aGUgcmVmbGVjdGlvbiBtZWNoYW5pc20uCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I3JlZmxlY3RQYWNrYWdlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkgCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhUGFja2FnZSByZWZsZWN0KFN0cmluZyBwYWNrYWdlTmFtZSwgUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFBhY2thZ2UocGFja2FnZU5hbWUsIHNldCk7Ci0gICAgfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FRkFDVE9SWV9JTlNUQU5DRToKLQkJCQkJaWYgKGVGYWN0b3J5SW5zdGFuY2UgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllRmFjdG9yeUluc3RhbmNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRUZBQ1RPUllfX0VQQUNLQUdFLCBFRmFjdG9yeS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEVGYWN0b3J5SW5zdGFuY2UoKEVGYWN0b3J5KW90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUNMQVNTSUZJRVJTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVDbGFzc2lmaWVycygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VTVUJQQUNLQUdFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFU3VicGFja2FnZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VQRVJfUEFDS0FHRToKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VTVVBFUl9QQUNLQUdFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUZBQ1RPUllfSU5TVEFOQ0U6Ci0JCQkJCXJldHVybiBiYXNpY1NldEVGYWN0b3J5SW5zdGFuY2UobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VDTEFTU0lGSUVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQ2xhc3NpZmllcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VCUEFDS0FHRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVN1YnBhY2thZ2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRVNVUEVSX1BBQ0tBR0U6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VQRVJfUEFDS0FHRSwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VQRVJfUEFDS0FHRToKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FU1VCUEFDS0FHRVMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19OU19VUkk6Ci0JCQkJcmV0dXJuIGdldE5zVVJJKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTlNfUFJFRklYOgotCQkJCXJldHVybiBnZXROc1ByZWZpeCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VGQUNUT1JZX0lOU1RBTkNFOgotCQkJCXJldHVybiBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUNMQVNTSUZJRVJTOgotCQkJCXJldHVybiBnZXRFQ2xhc3NpZmllcnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VCUEFDS0FHRVM6Ci0JCQkJcmV0dXJuIGdldEVTdWJwYWNrYWdlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VTVVBFUl9QQUNLQUdFOgotCQkJCXJldHVybiBnZXRFU3VwZXJQYWNrYWdlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3NlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX05TX1VSSToKLQkJCQlzZXROc1VSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTlNfUFJFRklYOgotCQkJCXNldE5zUHJlZml4KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FRkFDVE9SWV9JTlNUQU5DRToKLQkJCQlzZXRFRmFjdG9yeUluc3RhbmNlKChFRmFjdG9yeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VDTEFTU0lGSUVSUzoKLQkJCQlnZXRFQ2xhc3NpZmllcnMoKS5jbGVhcigpOwotCQkJCWdldEVDbGFzc2lmaWVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VTVUJQQUNLQUdFUzoKLQkJCQlnZXRFU3VicGFja2FnZXMoKS5jbGVhcigpOwotCQkJCWdldEVTdWJwYWNrYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19OU19VUkk6Ci0JCQkJc2V0TnNVUkkoTlNfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTlNfUFJFRklYOgotCQkJCXNldE5zUHJlZml4KE5TX1BSRUZJWF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VGQUNUT1JZX0lOU1RBTkNFOgotCQkJCXNldEVGYWN0b3J5SW5zdGFuY2UoKEVGYWN0b3J5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FQ0xBU1NJRklFUlM6Ci0JCQkJZ2V0RUNsYXNzaWZpZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRVNVQlBBQ0tBR0VTOgotCQkJCWdldEVTdWJwYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTlNfVVJJOgotCQkJCXJldHVybiBOU19VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5zVVJJICE9IG51bGwgOiAhTlNfVVJJX0VERUZBVUxULmVxdWFscyhuc1VSSSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTlNfUFJFRklYOgotCQkJCXJldHVybiBOU19QUkVGSVhfRURFRkFVTFQgPT0gbnVsbCA/IG5zUHJlZml4ICE9IG51bGwgOiAhTlNfUFJFRklYX0VERUZBVUxULmVxdWFscyhuc1ByZWZpeCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUZBQ1RPUllfSU5TVEFOQ0U6Ci0JCQkJcmV0dXJuIGVGYWN0b3J5SW5zdGFuY2UgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FQ0xBU1NJRklFUlM6Ci0JCQkJcmV0dXJuIGVDbGFzc2lmaWVycyAhPSBudWxsICYmICFlQ2xhc3NpZmllcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VTVUJQQUNLQUdFUzoKLQkJCQlyZXR1cm4gZVN1YnBhY2thZ2VzICE9IG51bGwgJiYgIWVTdWJwYWNrYWdlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRVNVUEVSX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldEVTdXBlclBhY2thZ2UoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0pBVkFfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gIWdldEphdmFDbGFzc2VzKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9KYXZhUGFja2FnZUltcGwKLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVBhcmFtZXRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFyYW1ldGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzNhYmEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFyYW1ldGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotLyoKLSAqICAkUkNTZmlsZTogSmF2YVBhcmFtZXRlckltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMDoyODowNCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhcmFtZXRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhTWV0aG9kQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXJLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGFyYW1ldGVySW1wbCBleHRlbmRzIEVQYXJhbWV0ZXJJbXBsIGltcGxlbWVudHMgSmF2YVBhcmFtZXRlcnsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklOQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX0VGTEFHID0gMSA8PCAxMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbWV0ZXJLaW5kKCkgPGVtPlBhcmFtZXRlciBLaW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXJLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFQYXJhbWV0ZXJLaW5kIFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUID0gSmF2YVBhcmFtZXRlcktpbmQuSU5fTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhUGFyYW1ldGVyS2luZCBwYXJhbWV0ZXJLaW5kID0gUEFSQU1FVEVSX0tJTkRfRURFRkFVTFQ7Ci0JcHJvdGVjdGVkIEphdmFQYXJhbWV0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhUGFyYW1ldGVyKCk7Ci0JfQotCi0JcHVibGljIEphdmFIZWxwZXJzIGdldEphdmFUeXBlKCkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKWdldEVUeXBlKCk7Ci0JfQotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0gICAgcmV0dXJuIChlQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBNZXRob2QpID8gKChNZXRob2QpZUNvbnRhaW5lcigpKS5nZXROYW1lKCkgKyAiLiIgKyB0aGlzLmdldE5hbWUoKSA6IHRoaXMuZ2V0TmFtZSgpOwotICB9Ci0JLyoqCi0JICogSXMgdGhpcyBwYXJhbWV0ZXIgdHlwZSBhbiBhcnJheSB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBnZXRKYXZhVHlwZSgpLmlzQXJyYXkoKTsKLQl9Ci0JLyoqCi0JICogSXMgdGhpcyBhIHJldHVybiBwYXJhbWV0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXR1cm4oKSB7Ci0JCXJldHVybiBKYXZhUGFyYW1ldGVyS2luZC5SRVRVUk4gPT0gZ2V0UGFyYW1ldGVyS2luZCgpLmdldFZhbHVlKCk7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluYWwoYm9vbGVhbiBuZXdGaW5hbCkgewotCQlib29sZWFuIG9sZEZpbmFsID0gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3RmluYWwpIGVGbGFncyB8PSBGSU5BTF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkZJTkFMX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRklOQUwsIG9sZEZpbmFsLCBuZXdGaW5hbCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyS2luZCBnZXRQYXJhbWV0ZXJLaW5kKCkgewotCQlyZXR1cm4gcGFyYW1ldGVyS2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJLaW5kKEphdmFQYXJhbWV0ZXJLaW5kIG5ld1BhcmFtZXRlcktpbmQpIHsKLQkJSmF2YVBhcmFtZXRlcktpbmQgb2xkUGFyYW1ldGVyS2luZCA9IHBhcmFtZXRlcktpbmQ7Ci0JCXBhcmFtZXRlcktpbmQgPSBuZXdQYXJhbWV0ZXJLaW5kID09IG51bGwgPyBQQVJBTUVURVJfS0lORF9FREVGQVVMVCA6IG5ld1BhcmFtZXRlcktpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORCwgb2xkUGFyYW1ldGVyS2luZCwgcGFyYW1ldGVyS2luZCkpOwotCX0KLQotCS8qCi0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSByZWZsZWN0aW9uIGFkYXB0ZXJzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUmVhZEFkYXB0b3IgZ2V0UmVhZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoUmVhZEFkYXB0b3IpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihlQ29udGFpbmVyKCksIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBSRUZMRUNURURfQkFTRSA9IDB4MSwgUkVGTEVDVEVEX1BBUkFNX05BTUUgPSAweDI7Ci0KLQlwcm90ZWN0ZWQgaW50IHJlZmxlY3Rpb25TdGF0dXMgPSBSRUZMRUNURURfQkFTRTsgIC8vIEF0IHRoaXMgdGltZSBiYXNlIHJlZmxlY3Rpb24KLQkJCQkJCQkJCQkJCQkgIC8vIGlzIHBlcmZvcm1lZCBhdCBjcmVhdGlvbi4KLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RQYXJhbU5hbWUoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX1BBUkFNX05BTUUpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gKChJSmF2YU1ldGhvZEFkYXB0ZXIpIHJlYWRBZGFwdG9yKS5yZWZsZWN0UGFyYW1OYW1lc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJLy8gTm9ybWFsbHkgd2Ugd291bGRuJ3QgbmVlZCB0byBzZXQgdGhpcyBiZWNhdXNlIGl0IHdvdWxkIGJlIHNldCBkdXJpbmcgdGhlIHJlZmxlY3RQYXJhbU5hbWVzSWZOZWNlc3NhcnksIGJ1dAotCQkJCS8vIGluIGNhc2UgdGhlcmUgd2FzIGEgcHJvYmxlbSB3ZSBtYXJrIGl0IHN0aWxsIHJlZmxlY3RlZCBzbyB3ZSBkb24ndCB0cnkgYWdhaW4uCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX0JBU0UgfCBSRUZMRUNURURfUEFSQU1fTkFNRSk7IC8vIFdlIGNhbiBiZSBjZXJ0YWluIGJhc2Ugd2lsbCBiZSBkb25lIGJ5IHJlZmxlY3QgZ2VuZXJhdGVkIGlmIG5vdCBhbHJlYWR5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBkb25lLgotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmVmbGVjdFBhcmFtTmFtZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyLnNldE5hbWUobmFtZSk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkgICByZWZsZWN0aW9uU3RhdHVzIHw9IChSRUZMRUNURURfUEFSQU1fTkFNRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX09SREVSRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgT1JERVJFRF9FRkxBRykgIT0gMCkgIT0gT1JERVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1VOSVFVRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EOgotCQkJCXJldHVybiBsb3dlckJvdW5kICE9IExPV0VSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSAhPSBNQU5ZX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VUWVBFOgotCQkJCXJldHVybiBlVHlwZSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRU9QRVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0RU9wZXJhdGlvbigpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCkgIT0gRklOQUxfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlyZXR1cm4gcGFyYW1ldGVyS2luZCAhPSBQQVJBTUVURVJfS0lORF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX09SREVSRUQ6Ci0JCQkJc2V0T3JkZXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRVRZUEU6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlzZXRQYXJhbWV0ZXJLaW5kKChKYXZhUGFyYW1ldGVyS2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoT1JERVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZShVTklRVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoTE9XRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1VQUEVSX0JPVU5EOgotCQkJCXNldFVwcGVyQm91bmQoVVBQRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTDoKLQkJCQlzZXRGaW5hbChGSU5BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQ6Ci0JCQkJc2V0UGFyYW1ldGVyS2luZChQQVJBTUVURVJfS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaW5hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJLaW5kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXJLaW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRU9QRVJBVElPTjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRU9QRVJBVElPTiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19FT1BFUkFUSU9OOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19FT1BFUkFUSU9OLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRU9QRVJBVElPTjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VQQVJBTUVURVJTLCBFT3BlcmF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19PUkRFUkVEOgotCQkJCXJldHVybiBpc09yZGVyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19VTklRVUU6Ci0JCQkJcmV0dXJuIGlzVW5pcXVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fTE9XRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldExvd2VyQm91bmQoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19VUFBFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VXBwZXJCb3VuZCgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX01BTlk6Ci0JCQkJcmV0dXJuIGlzTWFueSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRVRZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVUeXBlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19FT1BFUkFUSU9OOgotCQkJCXJldHVybiBnZXRFT3BlcmF0aW9uKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTDoKLQkJCQlyZXR1cm4gaXNGaW5hbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5EOgotCQkJCXJldHVybiBnZXRQYXJhbWV0ZXJLaW5kKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWJhNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFSZWZGYWN0b3J5SW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjMyICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkay5KYXZhSkRLQWRhcHRlckZhY3Rvcnk7Ci0KLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZWZGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEphdmFSZWZGYWN0b3J5IHsKLQotCQotCXByb3RlY3RlZCBzdGF0aWMgQ2xhc3MgUmVmbGVjdGlvbkZhY3RvcnlDbGFzcyA9IEphdmFKREtBZGFwdGVyRmFjdG9yeS5jbGFzczsKLQlwdWJsaWMgSmF2YVJlZkZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTOiByZXR1cm4gY3JlYXRlSmF2YUNsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSOiByZXR1cm4gY3JlYXRlSW5pdGlhbGl6ZXIoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVI6IHJldHVybiBjcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRDogcmV0dXJuIGNyZWF0ZU1ldGhvZCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRDogcmV0dXJuIGNyZWF0ZUZpZWxkKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLOiByZXR1cm4gY3JlYXRlQmxvY2soKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVDogcmV0dXJuIGNyZWF0ZUNvbW1lbnQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UOiByZXR1cm4gY3JlYXRlU3RhdGVtZW50KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRTogcmV0dXJuIGNyZWF0ZUphdmFQYWNrYWdlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFOiByZXR1cm4gY3JlYXRlSmF2YURhdGFUeXBlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEU6IHJldHVybiBjcmVhdGVBcnJheVR5cGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlRZUEVfS0lORDogewotCQkJCVR5cGVLaW5kIHJlc3VsdCA9IFR5cGVLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfVklTSUJJTElUWV9LSU5EOiB7Ci0JCQkJSmF2YVZpc2liaWxpdHlLaW5kIHJlc3VsdCA9IEphdmFWaXNpYmlsaXR5S2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9LSU5EOiB7Ci0JCQkJSmF2YVBhcmFtZXRlcktpbmQgcmVzdWx0ID0gSmF2YVBhcmFtZXRlcktpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSlRZUEVfSkFWQV9IRUxQRVJTOgotCQkJCXJldHVybiBjcmVhdGVKVHlwZUphdmFIZWxwZXJzRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpUWVBFX0xJU1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZUpUeXBlTGlzdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuVFlQRV9LSU5EOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1ZJU0lCSUxJVFlfS0lORDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfS0lORDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSlRZUEVfSkFWQV9IRUxQRVJTOgotCQkJCXJldHVybiBjb252ZXJ0SlR5cGVKYXZhSGVscGVyc1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpUWVBFX0xJU1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKVHlwZUxpc3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JcHVibGljIEFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoSmF2YUhlbHBlcnMgY29tcG9uZW50VHlwZSkgewotCQlBcnJheVR5cGUgYXQgPSBjcmVhdGVBcnJheVR5cGUoKTsKLQkJCi0JCVN0cmluZyBjb21wdXRlZE5hbWUgPSBjb21wb25lbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKSArICJbXSI7Ci0JCWF0LnNldE5hbWUoY29tcHV0ZWROYW1lKTsKLQkJcmV0dXJuIGF0OwotCX0KLQlwdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZShKYXZhSGVscGVycyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKSB7Ci0JCUFycmF5VHlwZSBhdCA9IGNyZWF0ZUFycmF5VHlwZSgpOwotCQkKLQkJU3RyaW5nIGNvbXB1dGVkTmFtZSA9IGZpbmFsQ29tcG9uZW50VHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKXsKLQkJCWNvbXB1dGVkTmFtZSA9IGNvbXB1dGVkTmFtZSArICJbXSI7Ci0JCX0KLQkJYXQuc2V0TmFtZShjb21wdXRlZE5hbWUpOwotCQlyZXR1cm4gYXQ7Ci0JfQotICBwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGNyZWF0ZUphdmFDb250ZXh0KCkgewotICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQuSmF2YUluaXQuaW5pdCgpOwotICAgIFJlc291cmNlU2V0IHNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICBzZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChjcmVhdGVKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5KCkpOwotICAgIHJldHVybiBzZXQ7Ci0gIH0KLQlwcm90ZWN0ZWQgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnlJbnN0YW5jZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKSAhPSBudWxsKQotCQkJCWZhY3RvcnlJbnN0YW5jZSA9IChBZGFwdGVyRmFjdG9yeSkgZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKS5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gUmVmbGVjdGlvbiBvciBpbnN0YW50aWF0aW9uIHByb2JsZW1zLgotCQkJLy8gT0ssIGNhbid0IGRvIEphdmEgTW9kZWwgcmVmbGVjdGlvbgotCQl9Ci0JCXJldHVybiBmYWN0b3J5SW5zdGFuY2U7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgQ2xhc3MgZm9yIHRoZSBKYXZhIHJlZmVjdGlvbiBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBnZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIFJlZmxlY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgQ2xhc3MgZm9yIHRoZSBKYXZhIHJlZmVjdGlvbiBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHNlZSBKYXZhUGx1Z2luLnN0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcyhDbGFzcyBqYXZhUmVmbGVjdGlvbkZhY3RvcnlDbGFzcykgewotCQlSZWZsZWN0aW9uRmFjdG9yeUNsYXNzID0gamF2YVJlZmxlY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNZXRob2QgY3JlYXRlTWV0aG9kKCkgewotCQlNZXRob2RJbXBsIG1ldGhvZCA9IG5ldyBNZXRob2RJbXBsKCk7Ci0JCXJldHVybiBtZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBjcmVhdGVKYXZhQ2xhc3MoKSB7Ci0JCUphdmFDbGFzc0ltcGwgamF2YUNsYXNzID0gbmV3IEphdmFDbGFzc0ltcGwoKTsKLQkJcmV0dXJuIGphdmFDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRmllbGQgY3JlYXRlRmllbGQoKSB7Ci0JCUZpZWxkSW1wbCBmaWVsZCA9IG5ldyBGaWVsZEltcGwoKTsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBCbG9jayBjcmVhdGVCbG9jaygpIHsKLQkJQmxvY2tJbXBsIGJsb2NrID0gbmV3IEJsb2NrSW1wbCgpOwotCQlyZXR1cm4gYmxvY2s7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudCgpIHsKLQkJQ29tbWVudEltcGwgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbCgpOwotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RhdGVtZW50IGNyZWF0ZVN0YXRlbWVudCgpIHsKLQkJU3RhdGVtZW50SW1wbCBzdGF0ZW1lbnQgPSBuZXcgU3RhdGVtZW50SW1wbCgpOwotCQlyZXR1cm4gc3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJbml0aWFsaXplciBjcmVhdGVJbml0aWFsaXplcigpIHsKLQkJSW5pdGlhbGl6ZXJJbXBsIGluaXRpYWxpemVyID0gbmV3IEluaXRpYWxpemVySW1wbCgpOwotCQlyZXR1cm4gaW5pdGlhbGl6ZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFQYXJhbWV0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlcigpIHsKLQkJSmF2YVBhcmFtZXRlckltcGwgamF2YVBhcmFtZXRlciA9IG5ldyBKYXZhUGFyYW1ldGVySW1wbCgpOwotCQlyZXR1cm4gamF2YVBhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZSgpIHsKLQkJQXJyYXlUeXBlSW1wbCBhcnJheVR5cGUgPSBuZXcgQXJyYXlUeXBlSW1wbCgpOwotCQlyZXR1cm4gYXJyYXlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBjcmVhdGVKVHlwZUphdmFIZWxwZXJzRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SlR5cGVKYXZhSGVscGVyc1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBjcmVhdGVKVHlwZUxpc3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChMaXN0KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEpUeXBlTGlzdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YURhdGFUeXBlIGNyZWF0ZUphdmFEYXRhVHlwZSgpIHsKLQkJSmF2YURhdGFUeXBlSW1wbCBqYXZhRGF0YVR5cGUgPSBuZXcgSmF2YURhdGFUeXBlSW1wbCgpOwotCQlyZXR1cm4gamF2YURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSBjcmVhdGVKYXZhUGFja2FnZSgpIHsKLQkJSmF2YVBhY2thZ2VJbXBsIGphdmFQYWNrYWdlID0gbmV3IEphdmFQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gamF2YVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFSZWZQYWNrYWdlIGdldEphdmFSZWZQYWNrYWdlKCkgewotCQlyZXR1cm4gKEphdmFSZWZQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhUmVmUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSmF2YVJlZkZhY3RvcnkgZ2V0QWN0aXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZUNsYXNzUmVmKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQlKYXZhQ2xhc3MgcmVmID0gY3JlYXRlSmF2YUNsYXNzKCk7Ci0JCUphdmFVUkwgamF2YXVybCA9IG5ldyBKYXZhVVJMKHRhcmdldE5hbWUpOwotCQkoKEludGVybmFsRU9iamVjdCkgcmVmKS5lU2V0UHJveHlVUkkoVVJJLmNyZWF0ZVVSSShqYXZhdXJsLmdldEZ1bGxTdHJpbmcoKSkpOwotCQlyZXR1cm4gcmVmOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I3JlZmxlY3RUeXBlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVF1YWxpZmllZE5hbWUsIEVPYmplY3QgcmVsYXRlZE9iamVjdCkgewotCQlSZXNvdXJjZSByID0gcmVsYXRlZE9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKHIgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VTZXQgcnMgPSByLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocnMgIT0gbnVsbCkgewotCQkJCXJldHVybiByZWZsZWN0VHlwZShhUXVhbGlmaWVkTmFtZSwgcnMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I3JlZmxlY3RUeXBlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFRdWFsaWZpZWROYW1lLCBSZXNvdXJjZVNldCBzZXQpIHsKLQkJaWYgKGFRdWFsaWZpZWROYW1lICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGFRdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0JCQlpZiAoaW5kZXggPiAwKQotCQkJCXJldHVybiByZWZsZWN0VHlwZShhUXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpLCBhUXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBhUXVhbGlmaWVkTmFtZS5sZW5ndGgoKSksIHNldCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHJlZmxlY3RUeXBlKCIiLCBhUXVhbGlmaWVkTmFtZSwgc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0VHlwZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIHJlZmxlY3RUeXBlKFN0cmluZyBhUGFja2FnZU5hbWUsIFN0cmluZyBhVHlwZU5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAoYVR5cGVOYW1lICE9IG51bGwgJiYgYVBhY2thZ2VOYW1lICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQuSmF2YUluaXQuaW5pdCgpOwotCQkJSmF2YVVSTCB1cmwgPSBuZXcgSmF2YVVSTChhUGFja2FnZU5hbWUsIGFUeXBlTmFtZSk7Ci0JCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKHVybC5nZXRGdWxsU3RyaW5nKCkpLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0UGFja2FnZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHVibGljIEphdmFQYWNrYWdlIHJlZmxlY3RQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbml0LkphdmFJbml0LmluaXQoKTsKLQkJCUphdmFVUkwgdXJsID0gbmV3IEphdmFVUkwocGFja2FnZU5hbWUsIEphdmFQYWNrYWdlLlBBQ0tBR0VfSUQpOwotCQkJcmV0dXJuIChKYXZhUGFja2FnZSkgc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSh1cmwuZ2V0RnVsbFN0cmluZygpKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZmYwNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUmVmUGFja2FnZUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXJLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLlR5cGVLaW5kOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgSmF2YVJlZlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YVJlZlBhY2thZ2UsIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKYXZhUmVmUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUNsYXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluaXRpYWxpemVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFQYXJhbWV0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpZWxkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJsb2NrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc3RhdGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFEYXRhVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnJheVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUV2ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHlwZUtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGphdmFWaXNpYmlsaXR5S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gamF2YVBhcmFtZXRlcktpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBqVHlwZUphdmFIZWxwZXJzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGpUeXBlTGlzdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkJICAgLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcml2YXRlIEphdmFSZWZQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUphdmFSZWZQYWNrYWdlSW1wbCB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgSmF2YVJlZlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgSmF2YVJlZlBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlSmF2YVJlZlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVKYXZhUmVmUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVKYXZhUmVmUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlSmF2YVJlZlBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiBqYXZhQ2xhc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX0tpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhQ2xhc3NfUHVibGljKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX0ZpbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0ltcGxlbWVudHNJbnRlcmZhY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0NsYXNzSW1wb3J0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX1BhY2thZ2VJbXBvcnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0ZpZWxkcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19NZXRob2RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0luaXRpYWxpemVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19EZWNsYXJpbmdDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRGVjbGFyZWRDbGFzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0phdmFQYWNrYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19FdmVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0FsbEV2ZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpZWxkKCkgewotCQlyZXR1cm4gZmllbGRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmllbGRfRmluYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX1N0YXRpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpZWxkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmllbGRfSmF2YVZpc2liaWxpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX1RyYW5zaWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpZWxkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmllbGRfVm9sYXRpbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpZWxkX0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpZWxkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmllbGRfSW5pdGlhbGl6ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kKCkgewotCQlyZXR1cm4gbWV0aG9kRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9BYnN0cmFjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9OYXRpdmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfU3luY2hyb25pemVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kX0ZpbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kX0NvbnN0cnVjdG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kX1N0YXRpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9KYXZhVmlzaWJpbGl0eSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9QYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kX0phdmFFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kX0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9Tb3VyY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhUGFyYW1ldGVyKCkgewotCQlyZXR1cm4gamF2YVBhcmFtZXRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhUGFyYW1ldGVyX0ZpbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YVBhcmFtZXRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFQYXJhbWV0ZXJfUGFyYW1ldGVyS2luZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFycmF5VHlwZSgpIHsKLQkJcmV0dXJuIGFycmF5VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnJheVR5cGVfQXJyYXlEaW1lbnNpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJyYXlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXJyYXlUeXBlX0NvbXBvbmVudFR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcnJheVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEphdmFEYXRhVHlwZSgpIHsKLQkJcmV0dXJuIGphdmFEYXRhVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEphdmFFdmVudCgpIHsKLQkJcmV0dXJuIGphdmFFdmVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEphdmFQYWNrYWdlKCkgewotCQlyZXR1cm4gamF2YVBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YVBhY2thZ2VfSmF2YUNsYXNzZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QmxvY2soKSB7Ci0JCXJldHVybiBibG9ja0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCbG9ja19Tb3VyY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlibG9ja0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJsb2NrX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlibG9ja0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJsb2NrX0NvbnRlbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYmxvY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U3RhdGVtZW50KCkgewotCQlyZXR1cm4gc3RhdGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5pdGlhbGl6ZXIoKSB7Ci0JCXJldHVybiBpbml0aWFsaXplckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0aWFsaXplcl9Jc1N0YXRpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWluaXRpYWxpemVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5pdGlhbGl6ZXJfSmF2YUNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbml0aWFsaXplcl9Tb3VyY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbml0aWFsaXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRKYXZhVmlzaWJpbGl0eUtpbmQoKSB7Ci0JCXJldHVybiBqYXZhVmlzaWJpbGl0eUtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SmF2YVBhcmFtZXRlcktpbmQoKSB7Ci0JCXJldHVybiBqYXZhUGFyYW1ldGVyS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRUeXBlS2luZCgpIHsKLQkJcmV0dXJuIHR5cGVLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRKVHlwZUxpc3QoKSB7Ci0JCXJldHVybiBqVHlwZUxpc3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRKVHlwZUphdmFIZWxwZXJzKCkgewotCQlyZXR1cm4galR5cGVKYXZhSGVscGVyc0VEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVJlZkZhY3RvcnkgZ2V0SmF2YVJlZkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSmF2YVJlZkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJamF2YUNsYXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fS0lORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19QVUJMSUMpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fRklOQUwpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fRklFTERTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX01FVEhPRFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fSU5JVElBTElaRVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19FVkVOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fQUxMX0VWRU5UUyk7Ci0KLQkJaW5pdGlhbGl6ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5JVElBTElaRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRpYWxpemVyRUNsYXNzLCBJTklUSUFMSVpFUl9fSVNfU1RBVElDKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbml0aWFsaXplckVDbGFzcywgSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGluaXRpYWxpemVyRUNsYXNzLCBJTklUSUFMSVpFUl9fU09VUkNFKTsKLQotCQlqYXZhUGFyYW1ldGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfUEFSQU1FVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhUGFyYW1ldGVyRUNsYXNzLCBKQVZBX1BBUkFNRVRFUl9fRklOQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIEpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORCk7Ci0KLQkJbWV0aG9kRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX0FCU1RSQUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fTkFUSVZFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fU1lOQ0hST05JWkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fRklOQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19DT05TVFJVQ1RPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1NUQVRJQyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX0pBVkFfVklTSUJJTElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1BBUkFNRVRFUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19KQVZBX0VYQ0VQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19KQVZBX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fU09VUkNFKTsKLQotCQlmaWVsZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGSUVMRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmllbGRFQ2xhc3MsIEZJRUxEX19GSU5BTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmllbGRFQ2xhc3MsIEZJRUxEX19TVEFUSUMpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fSkFWQV9WSVNJQklMSVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWVsZEVDbGFzcywgRklFTERfX1RSQU5TSUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmllbGRFQ2xhc3MsIEZJRUxEX19WT0xBVElMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmllbGRFQ2xhc3MsIEZJRUxEX19KQVZBX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWVsZEVDbGFzcywgRklFTERfX0lOSVRJQUxJWkVSKTsKLQotCQlibG9ja0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCTE9DSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmxvY2tFQ2xhc3MsIEJMT0NLX19TT1VSQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGJsb2NrRUNsYXNzLCBCTE9DS19fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYmxvY2tFQ2xhc3MsIEJMT0NLX19DT05URU5UUyk7Ci0KLQkJY29tbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01NRU5UKTsKLQotCQlzdGF0ZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RBVEVNRU5UKTsKLQotCQlqYXZhUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFQYWNrYWdlRUNsYXNzLCBKQVZBX1BBQ0tBR0VfX0pBVkFfQ0xBU1NFUyk7Ci0KLQkJamF2YURhdGFUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfREFUQV9UWVBFKTsKLQotCQlhcnJheVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJSQVlfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJyYXlUeXBlRUNsYXNzLCBBUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnJheVR5cGVFQ2xhc3MsIEFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFKTsKLQotCQlqYXZhRXZlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQV9FVkVOVCk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCXR5cGVLaW5kRUVudW0gPSBjcmVhdGVFRW51bShUWVBFX0tJTkQpOwotCQlqYXZhVmlzaWJpbGl0eUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKEpBVkFfVklTSUJJTElUWV9LSU5EKTsKLQkJamF2YVBhcmFtZXRlcktpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKEpBVkFfUEFSQU1FVEVSX0tJTkQpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWpUeXBlSmF2YUhlbHBlcnNFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSlRZUEVfSkFWQV9IRUxQRVJTKTsKLQkJalR5cGVMaXN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEpUWVBFX0xJU1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWphdmFDbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzKCkpOwotCQlqYXZhUGFyYW1ldGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFUGFyYW1ldGVyKCkpOwotCQltZXRob2RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVPcGVyYXRpb24oKSk7Ci0JCWZpZWxkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFVHlwZWRFbGVtZW50KCkpOwotCQljb21tZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmxvY2soKSk7Ci0JCXN0YXRlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJsb2NrKCkpOwotCQlqYXZhUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RVBhY2thZ2UoKSk7Ci0JCWphdmFEYXRhVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzKCkpOwotCQlhcnJheVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKYXZhQ2xhc3MoKSk7Ci0JCWphdmFFdmVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoamF2YUNsYXNzRUNsYXNzLCBKYXZhQ2xhc3MuY2xhc3MsICJKYXZhQ2xhc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFDbGFzc19LaW5kKCksIHRoaXMuZ2V0VHlwZUtpbmQoKSwgImtpbmQiLCBudWxsLCAwLCAxLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFDbGFzc19QdWJsaWMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwdWJsaWMiLCBudWxsLCAwLCAxLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFDbGFzc19GaW5hbCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZpbmFsIiwgbnVsbCwgMCwgMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfSW1wbGVtZW50c0ludGVyZmFjZXMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImltcGxlbWVudHNJbnRlcmZhY2VzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0NsYXNzSW1wb3J0KCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJjbGFzc0ltcG9ydCIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19QYWNrYWdlSW1wb3J0cygpLCB0aGlzLmdldEphdmFQYWNrYWdlKCksIG51bGwsICJwYWNrYWdlSW1wb3J0cyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19GaWVsZHMoKSwgdGhpcy5nZXRGaWVsZCgpLCB0aGlzLmdldEZpZWxkX0phdmFDbGFzcygpLCAiZmllbGRzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX01ldGhvZHMoKSwgdGhpcy5nZXRNZXRob2QoKSwgdGhpcy5nZXRNZXRob2RfSmF2YUNsYXNzKCksICJtZXRob2RzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0luaXRpYWxpemVycygpLCB0aGlzLmdldEluaXRpYWxpemVyKCksIHRoaXMuZ2V0SW5pdGlhbGl6ZXJfSmF2YUNsYXNzKCksICJpbml0aWFsaXplcnMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfRGVjbGFyZWRDbGFzc2VzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0RlY2xhcmluZ0NsYXNzKCksICJkZWNsYXJlZENsYXNzZXMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfRGVjbGFyZWRDbGFzc2VzKCksICJkZWNsYXJpbmdDbGFzcyIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0phdmFQYWNrYWdlKCksIHRoaXMuZ2V0SmF2YVBhY2thZ2UoKSwgdGhpcy5nZXRKYXZhUGFja2FnZV9KYXZhQ2xhc3NlcygpLCAiamF2YVBhY2thZ2UiLCBudWxsLCAwLCAxLCBKYXZhQ2xhc3MuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0V2ZW50cygpLCB0aGlzLmdldEphdmFFdmVudCgpLCBudWxsLCAiZXZlbnRzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0FsbEV2ZW50cygpLCB0aGlzLmdldEphdmFFdmVudCgpLCBudWxsLCAiYWxsRXZlbnRzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNOZXN0ZWQiKTsKLQotCQlFT3BlcmF0aW9uIG9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0RmllbGQoKSwgImdldEZpZWxkIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmaWVsZE5hbWUiKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEZpZWxkKCksICJnZXRGaWVsZEV4dGVuZGVkIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmaWVsZE5hbWUiKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEZpZWxkKCksICJnZXRGaWVsZE5hbWVkIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmaWVsZE5hbWUiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldEZpZWxkc0V4dGVuZGVkIik7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRNZXRob2QoKSwgImdldE1ldGhvZCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWV0aG9kTmFtZSIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAicGFyYW1ldGVyVHlwZXMiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzIik7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRNZXRob2QoKSwgImdldE1ldGhvZEV4dGVuZGVkIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtZXRob2ROYW1lIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJwYXJhbWV0ZXJUeXBlcyIpOwotCi0JCWFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZ2V0TWV0aG9kc0V4dGVuZGVkIik7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldE9ubHlTcGVjaWZpY01ldGhvZHMiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFNZXRob2ROYW1lUHJlZml4Iik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJleGNsdWRlZE5hbWVzIik7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRNZXRob2QoKSwgImdldFB1YmxpY01ldGhvZCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWV0aG9kTmFtZSIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAicGFyYW1ldGVyVHlwZXMiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldFB1YmxpY01ldGhvZHMiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldFB1YmxpY01ldGhvZHNFeHRlbmRlZCIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJnZXRQdWJsaWNNZXRob2RzTmFtZWQiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImdldFN1cGVydHlwZSIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaW1wbGVtZW50c0ludGVyZmFjZSIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEphdmFDbGFzcygpLCAiaW50ZXJmYWNlVHlwZSIpOwotCi0JCWFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5mb1N0cmluZyIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaW5oZXJpdHNGcm9tIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJqYXZhQ2xhc3MiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0V4aXN0aW5nVHlwZSIpOwotCi0JCWFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzSW50ZXJmYWNlIik7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgbnVsbCwgInNldFN1cGVydHlwZSIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEphdmFDbGFzcygpLCAiamF2YWNsYXNzIik7Ci0KLQkJaW5pdEVDbGFzcyhpbml0aWFsaXplckVDbGFzcywgSW5pdGlhbGl6ZXIuY2xhc3MsICJJbml0aWFsaXplciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdGlhbGl6ZXJfSXNTdGF0aWMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksICJpc1N0YXRpYyIsIG51bGwsIDAsIDEsIEluaXRpYWxpemVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJbml0aWFsaXplcl9KYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfSW5pdGlhbGl6ZXJzKCksICJqYXZhQ2xhc3MiLCBudWxsLCAwLCAxLCBJbml0aWFsaXplci5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdGlhbGl6ZXJfU291cmNlKCksIHRoaXMuZ2V0QmxvY2soKSwgbnVsbCwgInNvdXJjZSIsIG51bGwsIDAsIDEsIEluaXRpYWxpemVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoamF2YVBhcmFtZXRlckVDbGFzcywgSmF2YVBhcmFtZXRlci5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFQYXJhbWV0ZXJfRmluYWwoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJmaW5hbCIsIG51bGwsIDAsIDEsIEphdmFQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFQYXJhbWV0ZXJfUGFyYW1ldGVyS2luZCgpLCB0aGlzLmdldEphdmFQYXJhbWV0ZXJLaW5kKCksICJwYXJhbWV0ZXJLaW5kIiwgbnVsbCwgMCwgMSwgSmF2YVBhcmFtZXRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNBcnJheSIpOwotCi0JCWFkZEVPcGVyYXRpb24oamF2YVBhcmFtZXRlckVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc1JldHVybiIpOwotCi0JCWFkZEVPcGVyYXRpb24oamF2YVBhcmFtZXRlckVDbGFzcywgdGhpcy5nZXRKVHlwZUphdmFIZWxwZXJzKCksICJnZXRKYXZhVHlwZSIpOwotCi0JCWFkZEVPcGVyYXRpb24oamF2YVBhcmFtZXRlckVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldFF1YWxpZmllZE5hbWUiKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVDbGFzcywgTWV0aG9kLmNsYXNzLCAiTWV0aG9kIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfQWJzdHJhY3QoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhYnN0cmFjdCIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX05hdGl2ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIm5hdGl2ZSIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN5bmNocm9uaXplZCIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZF9Db25zdHJ1Y3RvcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImNvbnN0cnVjdG9yIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfU3RhdGljKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic3RhdGljIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKSwgdGhpcy5nZXRKYXZhVmlzaWJpbGl0eUtpbmQoKSwgImphdmFWaXNpYmlsaXR5IiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RfUGFyYW1ldGVycygpLCB0aGlzLmdldEphdmFQYXJhbWV0ZXIoKSwgbnVsbCwgInBhcmFtZXRlcnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RfSmF2YUV4Y2VwdGlvbnMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImphdmFFeGNlcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kX0phdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19NZXRob2RzKCksICJqYXZhQ2xhc3MiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZF9Tb3VyY2UoKSwgdGhpcy5nZXRCbG9jaygpLCBudWxsLCAic291cmNlIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCB0aGlzLmdldEphdmFDbGFzcygpLCAiZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIpOwotCi0JCWFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIHRoaXMuZ2V0SmF2YVBhcmFtZXRlcigpLCAiZ2V0UGFyYW1ldGVyIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbWV0ZXJOYW1lIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0UmV0dXJuVHlwZSIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIG51bGwsICJzZXRSZXR1cm5UeXBlIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAidHlwZSIpOwotCi0JCWFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0U2lnbmF0dXJlIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNHZW5lcmF0ZWQiKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCBudWxsLCAic2V0SXNHZW5lcmF0ZWQiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZWQiKTsKLQotCQlhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc1ZvaWQiKTsKLQotCQlpbml0RUNsYXNzKGZpZWxkRUNsYXNzLCBGaWVsZC5jbGFzcywgIkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9GaW5hbCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZpbmFsIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkX1N0YXRpYygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN0YXRpYyIsIG51bGwsIDAsIDEsIEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9KYXZhVmlzaWJpbGl0eSgpLCB0aGlzLmdldEphdmFWaXNpYmlsaXR5S2luZCgpLCAiamF2YVZpc2liaWxpdHkiLCBudWxsLCAwLCAxLCBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmllbGRfVHJhbnNpZW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidHJhbnNpZW50IiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkX1ZvbGF0aWxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidm9sYXRpbGUiLCBudWxsLCAwLCAxLCBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmllbGRfSmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0ZpZWxkcygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpZWxkX0luaXRpYWxpemVyKCksIHRoaXMuZ2V0QmxvY2soKSwgbnVsbCwgImluaXRpYWxpemVyIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJYWRkRU9wZXJhdGlvbihmaWVsZEVDbGFzcywgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImdldENvbnRhaW5pbmdKYXZhQ2xhc3MiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGZpZWxkRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzQXJyYXkiKTsKLQotCQlpbml0RUNsYXNzKGJsb2NrRUNsYXNzLCBCbG9jay5jbGFzcywgIkJsb2NrIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCbG9ja19Tb3VyY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNvdXJjZSIsIG51bGwsIDAsIDEsIEJsb2NrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCbG9ja19OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQmxvY2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEJsb2NrX0NvbnRlbnRzKCksIHRoaXMuZ2V0QmxvY2soKSwgbnVsbCwgImNvbnRlbnRzIiwgbnVsbCwgMCwgLTEsIEJsb2NrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29tbWVudEVDbGFzcywgQ29tbWVudC5jbGFzcywgIkNvbW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhzdGF0ZW1lbnRFQ2xhc3MsIFN0YXRlbWVudC5jbGFzcywgIlN0YXRlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGphdmFQYWNrYWdlRUNsYXNzLCBKYXZhUGFja2FnZS5jbGFzcywgIkphdmFQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhUGFja2FnZV9KYXZhQ2xhc3NlcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19KYXZhUGFja2FnZSgpLCAiamF2YUNsYXNzZXMiLCBudWxsLCAwLCAtMSwgSmF2YVBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGphdmFEYXRhVHlwZUVDbGFzcywgSmF2YURhdGFUeXBlLmNsYXNzLCAiSmF2YURhdGFUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWFkZEVPcGVyYXRpb24oamF2YURhdGFUeXBlRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIik7Ci0KLQkJaW5pdEVDbGFzcyhhcnJheVR5cGVFQ2xhc3MsIEFycmF5VHlwZS5jbGFzcywgIkFycmF5VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiYXJyYXlEaW1lbnNpb25zIiwgbnVsbCwgMCwgMSwgQXJyYXlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcnJheVR5cGVfQ29tcG9uZW50VHlwZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoKSwgbnVsbCwgImNvbXBvbmVudFR5cGUiLCBudWxsLCAxLCAxLCBBcnJheVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0RmluYWxDb21wb25lbnRUeXBlIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNQcmltaXRpdmVBcnJheSIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIG51bGwsICJzZXRDb21wb25lbnRUeXBlIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiaGVscGVyQ29tcG9uZW50VHlwZSIpOwotCi0JCWluaXRFQ2xhc3MoamF2YUV2ZW50RUNsYXNzLCBKYXZhRXZlbnQuY2xhc3MsICJKYXZhRXZlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0odHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuY2xhc3MsICJUeXBlS2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuQ0xBU1NfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0eXBlS2luZEVFbnVtLCBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0eXBlS2luZEVFbnVtLCBUeXBlS2luZC5FWENFUFRJT05fTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuY2xhc3MsICJKYXZhVmlzaWJpbGl0eUtpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVZpc2liaWxpdHlLaW5kRUVudW0sIEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVZpc2liaWxpdHlLaW5kRUVudW0sIEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhVmlzaWJpbGl0eUtpbmRFRW51bSwgSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0VfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLmNsYXNzLCAiSmF2YVBhcmFtZXRlcktpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLklOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVBhcmFtZXRlcktpbmRFRW51bSwgSmF2YVBhcmFtZXRlcktpbmQuT1VUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVBhcmFtZXRlcktpbmRFRW51bSwgSmF2YVBhcmFtZXRlcktpbmQuSU5PVVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhUGFyYW1ldGVyS2luZEVFbnVtLCBKYXZhUGFyYW1ldGVyS2luZC5SRVRVUk5fTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoalR5cGVKYXZhSGVscGVyc0VEYXRhVHlwZSwgSmF2YUhlbHBlcnMuY2xhc3MsICJKVHlwZUphdmFIZWxwZXJzIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZShqVHlwZUxpc3RFRGF0YVR5cGUsIExpc3QuY2xhc3MsICJKVHlwZUxpc3QiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9KYXZhUmVmUGFja2FnZUltcGwKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9NZXRob2RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvTWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDg2Y2JiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9NZXRob2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotLyoKLSAqICAkUkNTZmlsZTogTWV0aG9kSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA5LzE1IDIwOjI4OjAzICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPcGVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhTWV0aG9kQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RJbXBsIGV4dGVuZHMgRU9wZXJhdGlvbkltcGwgaW1wbGVtZW50cyBNZXRob2QgewotCi0JcHJvdGVjdGVkIFN0cmluZyBzaWduYXR1cmU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBYnN0cmFjdCgpIDxlbT5BYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFCU1RSQUNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Fic3RyYWN0KCkgPGVtPkFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9FRkxBRyA9IDEgPDwgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOYXRpdmUoKSA8ZW0+TmF0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05hdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5BVElWRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOYXRpdmUoKSA8ZW0+TmF0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05hdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTkFUSVZFX0VGTEFHID0gMSA8PCAxMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N5bmNocm9uaXplZCgpIDxlbT5TeW5jaHJvbml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3luY2hyb25pemVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1lOQ0hST05JWkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N5bmNocm9uaXplZCgpIDxlbT5TeW5jaHJvbml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3luY2hyb25pemVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTWU5DSFJPTklaRURfRUZMQUcgPSAxIDw8IDEyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSU5BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfRUZMQUcgPSAxIDw8IDEzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uc3RydWN0b3IoKSA8ZW0+Q29uc3RydWN0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ29uc3RydWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT05TVFJVQ1RPUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25zdHJ1Y3RvcigpIDxlbT5Db25zdHJ1Y3RvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25zdHJ1Y3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RSVUNUT1JfRUZMQUcgPSAxIDw8IDE0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3RhdGljKCkgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTVEFUSUNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3RhdGljKCkgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19FRkxBRyA9IDEgPDwgMTU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVZpc2liaWxpdHkoKSA8ZW0+SmF2YSBWaXNpYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhVmlzaWJpbGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmQgSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUID0gSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBpc0dlbmVyYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFWaXNpYmlsaXR5S2luZCBqYXZhVmlzaWJpbGl0eSA9IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlcnMoKSA8ZW0+UGFyYW1ldGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGFyYW1ldGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhRXhjZXB0aW9ucygpIDxlbT5KYXZhIEV4Y2VwdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YUV4Y2VwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBqYXZhRXhjZXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2UoKSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCbG9jayBzb3VyY2UgPSBudWxsOwotCi0JcHJvdGVjdGVkIE1ldGhvZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdEdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBYnN0cmFjdChib29sZWFuIG5ld0Fic3RyYWN0KSB7Ci0JCWJvb2xlYW4gb2xkQWJzdHJhY3QgPSAoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdBYnN0cmFjdCkgZUZsYWdzIHw9IEFCU1RSQUNUX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+QUJTVFJBQ1RfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQUJTVFJBQ1QsIG9sZEFic3RyYWN0LCBuZXdBYnN0cmFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmF0aXZlR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIE5BVElWRV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYXRpdmUoYm9vbGVhbiBuZXdOYXRpdmUpIHsKLQkJYm9vbGVhbiBvbGROYXRpdmUgPSAoZUZsYWdzICYgTkFUSVZFX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3TmF0aXZlKSBlRmxhZ3MgfD0gTkFUSVZFX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+TkFUSVZFX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX05BVElWRSwgb2xkTmF0aXZlLCBuZXdOYXRpdmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZEdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBTWU5DSFJPTklaRURfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVkKGJvb2xlYW4gbmV3U3luY2hyb25pemVkKSB7Ci0JCWJvb2xlYW4gb2xkU3luY2hyb25pemVkID0gKGVGbGFncyAmIFNZTkNIUk9OSVpFRF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1N5bmNocm9uaXplZCkgZUZsYWdzIHw9IFNZTkNIUk9OSVpFRF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflNZTkNIUk9OSVpFRF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TWU5DSFJPTklaRUQsIG9sZFN5bmNocm9uaXplZCwgbmV3U3luY2hyb25pemVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbEdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbChib29sZWFuIG5ld0ZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkRmluYWwgPSAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaW5hbCkgZUZsYWdzIHw9IEZJTkFMX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklOQUxfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUwsIG9sZEZpbmFsLCBuZXdGaW5hbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3JHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQ09OU1RSVUNUT1JfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uc3RydWN0b3IoYm9vbGVhbiBuZXdDb25zdHJ1Y3RvcikgewotCQlib29sZWFuIG9sZENvbnN0cnVjdG9yID0gKGVGbGFncyAmIENPTlNUUlVDVE9SX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3Q29uc3RydWN0b3IpIGVGbGFncyB8PSBDT05TVFJVQ1RPUl9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkNPTlNUUlVDVE9SX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SLCBvbGRDb25zdHJ1Y3RvciwgbmV3Q29uc3RydWN0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpY0dlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdGljKGJvb2xlYW4gbmV3U3RhdGljKSB7Ci0JCWJvb2xlYW4gb2xkU3RhdGljID0gKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1N0YXRpYykgZUZsYWdzIHw9IFNUQVRJQ19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflNUQVRJQ19FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TVEFUSUMsIG9sZFN0YXRpYywgbmV3U3RhdGljKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBqYXZhIGNsYXNzIHRoYXQgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFDbGFzcygpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlcyB0byBlbnN1cmUgcmVmbGVjdGlvbiBpcyBkb25lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzQWJzdHJhY3RHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc0NvbnN0cnVjdG9yR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNGaW5hbEdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmF0aXZlKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc05hdGl2ZUdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc1N0YXRpY0dlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZEdlbigpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRKYXZhRXhjZXB0aW9ucygpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gZ2V0SmF2YUV4Y2VwdGlvbnNHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldEphdmFWaXNpYmlsaXR5KCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBnZXRKYXZhVmlzaWJpbGl0eUdlbigpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRQYXJhbWV0ZXJzKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBnZXRQYXJhbWV0ZXJzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudCNnZXRFVHlwZSgpCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldEVUeXBlKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBzdXBlci5nZXRFVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB0aGUgbWV0aG9kIG5hbWUgYW5kIGl0cyBwYXJhbWV0ZXJzLiBlLmcuIDxjb2RlPiBzZXRGaXJzdE5hbWUoamF2YS5sYW5nLlN0cmluZykgPC8vY29kZT4gLgotCSAqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDc1KTsKLQkJc2IuYXBwZW5kKGdldE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgiKCIpOwotCQlMaXN0IHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoKTsKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTsKLQkJaW50IHBhcm1TaXplID0gcGFyYW1zLnNpemUoKTsKLQkJaW50IGNvbW1hVGVzdCA9IDA7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcGFybVNpemU7IGorKykgewotCQkJaWYgKGogPiBjb21tYVRlc3QpIHsKLQkJCQlzYi5hcHBlbmQoIiwiKTsKLQkJCX0KLQkJCXBhcmFtID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoaik7Ci0JCQkvL0ZCIGlmIChwYXJhbS5pc1JldHVybigpKSB7Ci0JCQkvL0ZCIGNvbW1hVGVzdCArKzsKLQkJCS8vRkIgY29udGludWU7Ci0JCQkvL0ZCIH0KLQkJCXNiLmFwcGVuZCgoKEphdmFIZWxwZXJzKSBwYXJhbS5nZXRFVHlwZSgpKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgiKSIpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBQYXJhbWV0ZXIgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JcHVibGljIEphdmFQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0JCUxpc3QgcGFybXMgPSBnZXRQYXJhbWV0ZXJzKCk7Ci0JCUphdmFQYXJhbWV0ZXIgcGFybTsKLQkJaW50IHBhcm1TaXplID0gcGFybXMuc2l6ZSgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcm1TaXplOyBqKyspIHsKLQkJCXBhcm0gPSAoSmF2YVBhcmFtZXRlcikgcGFybXMuZ2V0KGopOwotCQkJaWYgKHBhcm0uZ2V0TmFtZSgpLmVxdWFscyhwYXJhbWV0ZXJOYW1lKSkKLQkJCQlyZXR1cm4gcGFybTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1JFRkxFQ1RFRCA9IDB4MCwgUkVGTEVDVEVEX0JBU0UgPSAweDEsIFJFRkxFQ1RFRF9HRU5FUkFURUQgPSAweDI7Ci0KLQlwcm90ZWN0ZWQgaW50IHJlZmxlY3Rpb25TdGF0dXMgPSBOT1RfUkVGTEVDVEVEOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdFZhbHVlcygpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoKHJlZmxlY3Rpb25TdGF0dXMgJiBSRUZMRUNURURfQkFTRSkgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSByZWFkQWRhcHRvci5yZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQlyZWZsZWN0aW9uU3RhdHVzIHw9IFJFRkxFQ1RFRF9CQVNFOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIHJlZmxlY3Rpb24gYWRhcHRlcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBSZWFkQWRhcHRvciBnZXRSZWFkQWRhcHRlcigpIHsKLQkJcmV0dXJuIChSZWFkQWRhcHRvcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKHRoaXMsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQl9Ci0KLQkvKgotCSAqIFVzZWQgYnkgcmVmbGVjdGlvbiBhZGFwdGVyIHRvIGNsZWFyIHRoZSByZWZsZWN0aW9uLiBUaGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UmVmbGVjdGVkKGJvb2xlYW4gcmVmbGVjdGVkKSB7Ci0JCWlmICghcmVmbGVjdGVkKQotCQkJcmVmbGVjdGlvblN0YXR1cyA9IE5PVF9SRUZMRUNURUQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXR1cm4gdHlwZS4KLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0UmV0dXJuVHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhSGVscGVycykgZ2V0RVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJaWYgKHNpZ25hdHVyZSA9PSBudWxsKQotCQkJc2lnbmF0dXJlID0gZG9HZXRTaWduYXR1cmUoKTsKLQkJcmV0dXJuIHNpZ25hdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLnRvU3RyaW5nKCkuCi0JICogCi0JICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgTWV0aG9kLiBUaGUgc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyB0aGUgbWV0aG9kIGFjY2VzcyBtb2RpZmllcnMsIGlmIGFueSwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCByZXR1cm4gdHlwZSwKLQkgKiBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZXRob2QsIGZvbGxvd2VkIGJ5IGEgcGVyaW9kLCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIG5hbWUsIGZvbGxvd2VkIGJ5IGEKLQkgKiBwYXJlbnRoZXNpemVkLCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbWV0aG9kJ3MgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG1ldGhvZCB0aHJvd3MgY2hlY2tlZCBleGNlcHRpb25zLCB0aGUgcGFyYW1ldGVyIGxpc3QgaXMKLQkgKiBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgd29yZCB0aHJvd3MgZm9sbG93ZWQgYnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgdGhyb3duIGV4Y2VwdGlvbiB0eXBlcy4KLQkgKiAKLQkgKiBGb3IgZXhhbXBsZToKLQkgKiAKLQkgKiBwdWJsaWMgYm9vbGVhbiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqIAotCSAqIFRoZSBhY2Nlc3MgbW9kaWZpZXJzIGFyZSBwbGFjZWQgaW4gY2Fub25pY2FsIG9yZGVyIGFzIHNwZWNpZmllZCBieSAiVGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiIuIFRoaXMgaXMgcHVibGljLAotCSAqIDx0dD5wcm90ZWN0ZWQ8Ly90dD4gb3IgPHR0PnByaXZhdGU8Ly90dD4gZmlyc3QsIGFuZCB0aGVuIG90aGVyIG1vZGlmaWVycyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiA8dHQ+YWJzdHJhY3Q8Ly90dD4sIDx0dD5zdGF0aWM8Ly90dD4sIDx0dD5maW5hbDwvL3R0PiwgPHR0PnN5bmNocm9uaXplZDwvL3R0PiA8dHQ+bmF0aXZlPC8vdHQ+LgotCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkb0dldFNpZ25hdHVyZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzd2l0Y2ggKGdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDOgotCQkJCXNiLmFwcGVuZCgiUHVibGljICIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBKYXZhVmlzaWJpbGl0eUtpbmQuUFJPVEVDVEVEOgotCQkJCXNiLmFwcGVuZCgiUHJvdGVjdGVkICIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBKYXZhVmlzaWJpbGl0eUtpbmQuUFJJVkFURToKLQkJCQlzYi5hcHBlbmQoIlByaXZhdGUgIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFOgotCQkJCXNiLmFwcGVuZCgiUGFja2FnZSAiKTsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaXNBYnN0cmFjdCgpKQotCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCAiKTsKLQkJaWYgKGlzU3RhdGljKCkpCi0JCQlzYi5hcHBlbmQoInN0YXRpYyAiKTsKLQkJaWYgKGlzRmluYWwoKSkKLQkJCXNiLmFwcGVuZCgiZmluYWwgIik7Ci0JCWlmIChpc1N5bmNocm9uaXplZCgpKQotCQkJc2IuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIik7Ci0JCWlmIChpc05hdGl2ZSgpKQotCQkJc2IuYXBwZW5kKCJuYXRpdmUgIik7Ci0JCWlmIChpc1ZvaWQoKSkKLQkJCXNiLmFwcGVuZCgidm9pZCAiKTsKLQkJZWxzZQotCQkJc2IuYXBwZW5kKGdldFJldHVyblR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkgKyAiICIpOwotCQlzYi5hcHBlbmQoZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpLmdldEphdmFOYW1lKCkgKyAiLiIpOwotCQlzYi5hcHBlbmQoZ2V0TmFtZSgpICsgIigiKTsKLQkJTGlzdCBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKCk7Ci0JCUphdmFQYXJhbWV0ZXIgcGFyYW07Ci0JCWludCBwYXJtU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcGFybVNpemU7IGorKykgewotCQkJcGFyYW0gPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldChqKTsKLQkJCS8vRkIgaWYgKHBhcmFtLmlzUmV0dXJuKCkpCi0JCQkvL0ZCIGNvbnRpbnVlOyAvLyBsaXN0UGFyYW1ldGVycygpIGluY2x1ZGVzIHJldHVybiB0eXBlIGluIGFycmF5Ci0JCQlzYi5hcHBlbmQoKChKYXZhSGVscGVycykgcGFyYW0uZ2V0RVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWlmIChqIDwgKHBhcmFtcy5zaXplKCkgLSAxKSkgewotCQkJCXNiLmFwcGVuZCgiLCIpOwotCQkJfQotCQl9Ci0JCXNiLmFwcGVuZCgiKSIpOwotCQlMaXN0IGV4Y2VwdGlvbnMgPSBnZXRKYXZhRXhjZXB0aW9ucygpOwotCQlKYXZhQ2xhc3MgZXhjZXB0aW9uOwotCQlpZiAoZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlzYi5hcHBlbmQoIiB0aHJvd3MgIik7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IGV4Y2VwdGlvbnMuc2l6ZSgpOyBrKyspIHsKLQkJCQlleGNlcHRpb24gPSAoSmF2YUNsYXNzKSBleGNlcHRpb25zLmdldChrKTsKLQkJCQlzYi5hcHBlbmQoZXhjZXB0aW9uLmdldEphdmFOYW1lKCkpOwotCQkJCWlmIChrIDwgKGV4Y2VwdGlvbnMuc2l6ZSgpIC0gMSkpIHsKLQkJCQkJc2IuYXBwZW5kKCIsIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RHZW5lcmF0ZWQoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX0dFTkVSQVRFRCkgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSAoKElKYXZhTWV0aG9kQWRhcHRlcikgcmVhZEFkYXB0b3IpLnJlZmxlY3RHZW5lcmF0ZWRJZk5lY2Vzc2FyeSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJLy8gRG9uJ3Qgd2FudCB0byBzZXQgaXQgZmFsc2UuIFRoYXQgaXMgam9iIG9mIHJlZmxlY3Rpb24gYWRhcHRlci4gT3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgYSByYWNlLgotCQkJCWlmIChzZXRSZWZsZWN0ZWQpCi0JCQkJCXJlZmxlY3Rpb25TdGF0dXMgfD0gKFJFRkxFQ1RFRF9HRU5FUkFURUQgfCBSRUZMRUNURURfQkFTRSk7IC8vIFdlIGNhbiBiZSBjZXJ0YWluIGJhc2Ugd2lsbCBiZSBkb25lIGJ5IHJlZmxlY3QgZ2VuZXJhdGVkIGlmIG5vdCBhbHJlYWR5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBkb25lLgotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2QgaXMgc3lzdGVtIGdlbmVyYXRlZC4gVGhpcyBpcyB1c3VhbGx5IGRldGVybWluZWQgYnkgdGhlICJnZW5lcmF0ZWQiIHRhZyBpbiB0aGUgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlZCgpIHsKLQkJcmVmbGVjdEdlbmVyYXRlZCgpOwotCQlyZXR1cm4gaXNHZW5lcmF0ZWQ7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZWRHZW4oKSB7Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgYSB2b2lkIHJldHVybiB0eXBlIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZvaWQoKSB7Ci0JCS8vRkIgcmV0dXJuIChnZXRSZXR1cm5QYXJhbWV0ZXIoKSA9PSBudWxsIHx8ICJ2b2lkIi5lcXVhbHMoZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSkpOwotCQlyZXR1cm4gKGdldFJldHVyblR5cGUoKSA9PSBudWxsIHx8ICJ2b2lkIi5lcXVhbHMoZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyBKYXZhUGFyYW1ldGVyW10gbGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkgewotCQlDb2xsZWN0aW9uIHYgPSBnZXRQYXJhbWV0ZXJzKCk7Ci0JCUphdmFQYXJhbWV0ZXJbXSByZXN1bHQgPSBuZXcgSmF2YVBhcmFtZXRlclt2LnNpemUoKV07Ci0JCXYudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBFTGlzdCBlQ29udGVudHMoKSB7Ci0JCUVMaXN0IHJlc3VsdHMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlyZXN1bHRzLmFkZEFsbChnZXRQYXJhbWV0ZXJzR2VuKCkpOyAvL0ZCCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgaXNHZW5lcmF0ZWQgZmxhZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0dlbmVyYXRlZChib29sZWFuIGdlbmVyYXRlZCkgewotCQlpc0dlbmVyYXRlZCA9IGdlbmVyYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJldHVybiB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShKYXZhSGVscGVycyB0eXBlKSB7Ci0JCXRoaXMuc2V0RVR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eUdlbigpIHsKLQkJcmV0dXJuIGphdmFWaXNpYmlsaXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZCBuZXdKYXZhVmlzaWJpbGl0eSkgewotCQlKYXZhVmlzaWJpbGl0eUtpbmQgb2xkSmF2YVZpc2liaWxpdHkgPSBqYXZhVmlzaWJpbGl0eTsKLQkJamF2YVZpc2liaWxpdHkgPSBuZXdKYXZhVmlzaWJpbGl0eSA9PSBudWxsID8gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUIDogbmV3SmF2YVZpc2liaWxpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZLCBvbGRKYXZhVmlzaWJpbGl0eSwgamF2YVZpc2liaWxpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIG5ld0phdmFDbGFzcykgewotCQlpZiAobmV3SmF2YUNsYXNzICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTICYmIG5ld0phdmFDbGFzcyAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0phdmFDbGFzcykpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3SmF2YUNsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0phdmFDbGFzcykuZUludmVyc2VBZGQodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1MsIG5ld0phdmFDbGFzcywgbmV3SmF2YUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEJsb2NrIGdldFNvdXJjZSgpIHsKLQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5lSXNQcm94eSgpKSB7Ci0JCQlCbG9jayBvbGRTb3VyY2UgPSBzb3VyY2U7Ci0JCQlzb3VyY2UgPSAoQmxvY2spZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXNvdXJjZSk7Ci0JCQlpZiAoc291cmNlICE9IG9sZFNvdXJjZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJsb2NrIGJhc2ljR2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShCbG9jayBuZXdTb3VyY2UpIHsKLQkJQmxvY2sgb2xkU291cmNlID0gc291cmNlOwotCQlzb3VyY2UgPSBuZXdTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fT1JERVJFRDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBPUkRFUkVEX0VGTEFHKSAhPSAwKSAhPSBPUkRFUkVEX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1VOSVFVRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbG93ZXJCb3VuZCAhPSBMT1dFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19VUFBFUl9CT1VORDoKLQkJCQlyZXR1cm4gdXBwZXJCb3VuZCAhPSBVUFBFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSAhPSBNQU5ZX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRVRZUEU6Ci0JCQkJcmV0dXJuIGVUeXBlICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVDb250YWluaW5nQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VQQVJBTUVURVJTOgotCQkJCXJldHVybiBlUGFyYW1ldGVycyAhPSBudWxsICYmICFlUGFyYW1ldGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUVYQ0VQVElPTlM6Ci0JCQkJcmV0dXJuIGVFeGNlcHRpb25zICE9IG51bGwgJiYgIWVFeGNlcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMCkgIT0gQUJTVFJBQ1RfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFUSVZFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE5BVElWRV9FRkxBRykgIT0gMCkgIT0gTkFUSVZFX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NZTkNIUk9OSVpFRDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBTWU5DSFJPTklaRURfRUZMQUcpICE9IDApICE9IFNZTkNIUk9OSVpFRF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19GSU5BTDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCkgIT0gRklOQUxfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQ09OU1RSVUNUT1I6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQ09OU1RSVUNUT1JfRUZMQUcpICE9IDApICE9IENPTlNUUlVDVE9SX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQzoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDApICE9IFNUQVRJQ19FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJcmV0dXJuIGphdmFWaXNpYmlsaXR5ICE9IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19QQVJBTUVURVJTOgotCQkJCXJldHVybiBwYXJhbWV0ZXJzICE9IG51bGwgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gamF2YUV4Y2VwdGlvbnMgIT0gbnVsbCAmJiAhamF2YUV4Y2VwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFOgotCQkJCXJldHVybiBzb3VyY2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX09SREVSRUQ6Ci0JCQkJc2V0T3JkZXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTE9XRVJfQk9VTkQ6Ci0JCQkJc2V0TG93ZXJCb3VuZCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VQQVJBTUVURVJTOgotCQkJCWdldEVQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRFUGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VFWENFUFRJT05TOgotCQkJCWdldEVFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFRXhjZXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0FCU1RSQUNUOgotCQkJCXNldEFic3RyYWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkU6Ci0JCQkJc2V0TmF0aXZlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TWU5DSFJPTklaRUQ6Ci0JCQkJc2V0U3luY2hyb25pemVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQ09OU1RSVUNUT1I6Ci0JCQkJc2V0Q29uc3RydWN0b3IoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQzoKLQkJCQlzZXRTdGF0aWMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfVklTSUJJTElUWToKLQkJCQlzZXRKYXZhVmlzaWJpbGl0eSgoSmF2YVZpc2liaWxpdHlLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TOgotCQkJCWdldEphdmFFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRKYXZhRXhjZXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChCbG9jayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoT1JERVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTE9XRVJfQk9VTkQ6Ci0JCQkJc2V0TG93ZXJCb3VuZChMT1dFUl9CT1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1VQUEVSX0JPVU5EOgotCQkJCXNldFVwcGVyQm91bmQoVVBQRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FVFlQRToKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VQQVJBTUVURVJTOgotCQkJCWdldEVQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUVYQ0VQVElPTlM6Ci0JCQkJZ2V0RUV4Y2VwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVDoKLQkJCQlzZXRBYnN0cmFjdChBQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX05BVElWRToKLQkJCQlzZXROYXRpdmUoTkFUSVZFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1lOQ0hST05JWkVEOgotCQkJCXNldFN5bmNocm9uaXplZChTWU5DSFJPTklaRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19GSU5BTDoKLQkJCQlzZXRGaW5hbChGSU5BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXNldENvbnN0cnVjdG9yKENPTlNUUlVDVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1RBVElDOgotCQkJCXNldFN0YXRpYyhTVEFUSUNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJc2V0SmF2YVZpc2liaWxpdHkoSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TOgotCQkJCWdldEphdmFFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoQmxvY2spbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhYnN0cmFjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYXRpdmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5bmNocm9uaXplZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFNZTkNIUk9OSVpFRF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29uc3RydWN0b3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBDT05TVFJVQ1RPUl9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhdGljOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhVmlzaWJpbGl0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF2YVZpc2liaWxpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UGFyYW1ldGVyc0dlbigpIHsKLQkJaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgewotCQkJcGFyYW1ldGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKYXZhUGFyYW1ldGVyLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlMpOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRKYXZhRXhjZXB0aW9uc0dlbigpIHsKLQkJaWYgKGphdmFFeGNlcHRpb25zID09IG51bGwpIHsKLQkJCWphdmFFeGNlcHRpb25zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gamF2YUV4Y2VwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VDT05UQUlOSU5HX0NMQVNTLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRVBBUkFNRVRFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVBhcmFtZXRlcnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUNPTlRBSU5JTkdfQ0xBU1MsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FUEFSQU1FVEVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFUGFyYW1ldGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGFyYW1ldGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUywgRUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUzoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19PUkRFUkVEOgotCQkJCXJldHVybiBpc09yZGVyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fVU5JUVVFOgotCQkJCXJldHVybiBpc1VuaXF1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19VUFBFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VXBwZXJCb3VuZCgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRVRZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVUeXBlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gZ2V0RVBhcmFtZXRlcnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUV4Y2VwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gaXNBYnN0cmFjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkU6Ci0JCQkJcmV0dXJuIGlzTmF0aXZlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NZTkNIUk9OSVpFRDoKLQkJCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQ09OU1RSVUNUT1I6Ci0JCQkJcmV0dXJuIGlzQ29uc3RydWN0b3IoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1RBVElDOgotCQkJCXJldHVybiBpc1N0YXRpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJcmV0dXJuIGdldEphdmFWaXNpYmlsaXR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TT1VSQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTb3VyY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvU3RhdGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1N0YXRlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhMzkwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvU3RhdGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFN0YXRlbWVudEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuU3RhdGVtZW50OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZW1lbnRJbXBsIGV4dGVuZHMgQmxvY2tJbXBsIGltcGxlbWVudHMgU3RhdGVtZW50ewotCi0JcHJvdGVjdGVkIFN0YXRlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldFN0YXRlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlRfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlRfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoU09VUkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1VSTC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1VSTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjZmZWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9VUkwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFVSTC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjMyICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVVJMIHsKLQlwdWJsaWMgU3RyaW5nIG5hbWVzcGFjZU5hbWU7Ci0JcHVibGljIFN0cmluZyBJRDsKLQlMaXN0IGF0dHJpYnV0ZU5hbWVzOwotLyoqCi0gKiBVUkwgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFVSTChTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JaW5pdGlhbGl6ZUZyb21TdHJpbmcodXJsU3RyaW5nKTsKLX0KLS8qKgotICogVVJMIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBVUkwoU3RyaW5nIG5hbWVTcGFjZU5hbWUsIFN0cmluZyBhbklEKSB7Ci0JdGhpcy5uYW1lc3BhY2VOYW1lID0gbmFtZVNwYWNlTmFtZTsKLQl0aGlzLklEID0gYW5JRDsKLX0KLXB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZU5hbWVzKCkgewotCXJldHVybiBhdHRyaWJ1dGVOYW1lczsKLX0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tU3RyaW5nKFN0cmluZyB1cmxTdHJpbmcpIHsKLQlpbnQgcG91bmRJbnggPSB1cmxTdHJpbmcubGFzdEluZGV4T2YoJyMnKTsKLQlpZiAocG91bmRJbnggPiAtMSkgewotCQluYW1lc3BhY2VOYW1lID0gdXJsU3RyaW5nLnN1YnN0cmluZygwLCBwb3VuZElueCk7Ci0JCXVybFN0cmluZyA9IHVybFN0cmluZy5zdWJzdHJpbmcocG91bmRJbnggKyAxKTsKLQkJaW50IGRvdEluZGV4ID0gdXJsU3RyaW5nLmluZGV4T2YoIi0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRvdEluZGV4ID4gLTEpIHsKLQkJCUlEID0gdXJsU3RyaW5nLnN1YnN0cmluZygwLCBkb3RJbmRleCk7Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZVN0cmluZyA9IHVybFN0cmluZy5zdWJzdHJpbmcoZG90SW5kZXggKyAyKTsKLQkJCWF0dHJpYnV0ZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZG8gewotCQkJCWRvdEluZGV4ID0gYXR0cmlidXRlTmFtZVN0cmluZy5pbmRleE9mKCItPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGRvdEluZGV4ID4gLTEpIHsKLQkJCQkJYXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZU5hbWVTdHJpbmcuc3Vic3RyaW5nKDAsIGRvdEluZGV4KSk7Ci0JCQkJCWF0dHJpYnV0ZU5hbWVTdHJpbmcgPSBhdHRyaWJ1dGVOYW1lU3RyaW5nLnN1YnN0cmluZyhkb3RJbmRleCArIDIpOwotCQkJCX0gZWxzZQotCQkJCQlhdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlTmFtZVN0cmluZyk7Ci0JCQl9IHdoaWxlIChkb3RJbmRleCA+IC0xKTsKLQkJfSBlbHNlIHsKLQkJCUlEID0gdXJsU3RyaW5nOwotCQl9Ci0JfSBlbHNlIHsKLQkJLy8gYXNzdW1lIHRoYXQgYW55IFVSTCBzdHJpbmcgdGhhdCBlbmRzIHdpdGggLnhtaSBpcyBhIG5hbWVzcGFjZS4KLQkJaWYgKHVybFN0cmluZy5lbmRzV2l0aCgiLnhtaSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZXNwYWNlTmFtZSA9IHVybFN0cmluZzsKLQkJCUlEID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCW5hbWVzcGFjZU5hbWUgPSAiP2RlZmF1bHRVUkw/IjsgLy8kTk9OLU5MUy0xJAotCQkJSUQgPSB1cmxTdHJpbmc7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCXJldHVybiAiVVJMKCIgKyAoKG5hbWVzcGFjZU5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWVzcGFjZU5hbWUgKyAiIyIpICsgKChJRCA9PSBudWxsKSA/ICIiIDogSUQpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YVJlZkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YVJlZkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTg5OGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFSZWZBZGFwdGVyRmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKYXZhUmVmUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFSZWZBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVJlZlN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBKYXZhUmVmU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlSmF2YUNsYXNzKEphdmFDbGFzcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YUNsYXNzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUluaXRpYWxpemVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSmF2YVBhcmFtZXRlcihKYXZhUGFyYW1ldGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhUGFyYW1ldGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kKE1ldGhvZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRmllbGQoRmllbGQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZpZWxkQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQmxvY2soQmxvY2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJsb2NrQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tbWVudChDb21tZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21tZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU3RhdGVtZW50KFN0YXRlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU3RhdGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSmF2YVBhY2thZ2UoSmF2YVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFQYWNrYWdlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSmF2YURhdGFUeXBlKEphdmFEYXRhVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YURhdGFUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXJyYXlUeXBlKEFycmF5VHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJyYXlUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSmF2YUV2ZW50KEphdmFFdmVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YUV2ZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUNsYXNzaWZpZXIoRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUNsYXNzKEVDbGFzcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUNsYXNzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFVHlwZWRFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRVBhcmFtZXRlcihFUGFyYW1ldGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFUGFyYW1ldGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRU9wZXJhdGlvbihFT3BlcmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT3BlcmF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRVBhY2thZ2UoRVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVQYWNrYWdlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyA8ZW0+SmF2YSBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YUNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbml0aWFsaXplciA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5pdGlhbGl6ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5pdGlhbGl6ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIgPGVtPkphdmEgUGFyYW1ldGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kIDxlbT5NZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQgPGVtPkZpZWxkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpZWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5CbG9jayA8ZW0+QmxvY2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuQmxvY2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmxvY2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkNvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuQ29tbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21tZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5TdGF0ZW1lbnQgPGVtPlN0YXRlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5TdGF0ZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhdGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZSA8ZW0+SmF2YSBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGUgPGVtPkphdmEgRGF0YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFEYXRhVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhRGF0YVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZSA8ZW0+QXJyYXkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJyYXlUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnQgPGVtPkphdmEgRXZlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFFdmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQgPGVtPkVNb2RlbCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50IDxlbT5FTmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXIgPGVtPkVDbGFzc2lmaWVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQ2xhc3NpZmllckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcyA8ZW0+RUNsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudCA8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYXJhbWV0ZXIgPGVtPkVQYXJhbWV0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYXJhbWV0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVBhcmFtZXRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb24gPGVtPkVPcGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9wZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSA8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlIDxlbT5FUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSmF2YVJlZkFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YVJlZlN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3ZWRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YVJlZlN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbDsKLQotLyoKLSAqICAkUkNTZmlsZTogSmF2YVJlZlN3aXRjaC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZWZTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhUmVmU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTOiB7Ci0JCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFDbGFzcyhqYXZhQ2xhc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzcyhqYXZhQ2xhc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGphdmFDbGFzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqYXZhQ2xhc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoamF2YUNsYXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSOiB7Ci0JCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUluaXRpYWxpemVyKGluaXRpYWxpemVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSOiB7Ci0JCQkJSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyID0gKEphdmFQYXJhbWV0ZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFQYXJhbWV0ZXIoamF2YVBhcmFtZXRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVBhcmFtZXRlcihqYXZhUGFyYW1ldGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGphdmFQYXJhbWV0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoamF2YVBhcmFtZXRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChqYXZhUGFyYW1ldGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRDogewotCQkJCU1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2QobWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFT3BlcmF0aW9uKG1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVR5cGVkRWxlbWVudChtZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQobWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KG1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRDogewotCQkJCUZpZWxkIGZpZWxkID0gKEZpZWxkKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWVsZChmaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVR5cGVkRWxlbWVudChmaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChmaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChmaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DSzogewotCQkJCUJsb2NrIGJsb2NrID0gKEJsb2NrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCbG9jayhibG9jayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UOiB7Ci0JCQkJQ29tbWVudCBjb21tZW50ID0gKENvbW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbW1lbnQoY29tbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQmxvY2soY29tbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlQ6IHsKLQkJCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU3RhdGVtZW50KHN0YXRlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQmxvY2soc3RhdGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRTogewotCQkJCUphdmFQYWNrYWdlIGphdmFQYWNrYWdlID0gKEphdmFQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhUGFja2FnZShqYXZhUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVBhY2thZ2UoamF2YVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoamF2YVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoamF2YVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEU6IHsKLQkJCQlKYXZhRGF0YVR5cGUgamF2YURhdGFUeXBlID0gKEphdmFEYXRhVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YURhdGFUeXBlKGphdmFEYXRhVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzKGphdmFEYXRhVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoamF2YURhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGphdmFEYXRhVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChqYXZhRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRTogewotCQkJCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcnJheVR5cGUoYXJyYXlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKYXZhQ2xhc3MoYXJyYXlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3MoYXJyYXlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoYXJyYXlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UOiB7Ci0JCQkJSmF2YUV2ZW50IGphdmFFdmVudCA9IChKYXZhRXZlbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFFdmVudChqYXZhRXZlbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShqYXZhRXZlbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQoamF2YUV2ZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGphdmFFdmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChqYXZhRXZlbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIENsYXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgQ2xhc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUphdmFDbGFzcyhKYXZhQ2xhc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Jbml0aWFsaXplcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Jbml0aWFsaXplcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIFBhcmFtZXRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIFBhcmFtZXRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YVBhcmFtZXRlcihKYXZhUGFyYW1ldGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kKE1ldGhvZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpZWxkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpZWxkPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWVsZChGaWVsZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJsb2NrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJsb2NrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCbG9jayhCbG9jayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tbWVudChDb21tZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0YXRlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU3RhdGVtZW50KFN0YXRlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUphdmFQYWNrYWdlKEphdmFQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBEYXRhIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBEYXRhIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUphdmFEYXRhVHlwZShKYXZhRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnJheSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFycmF5IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFycmF5VHlwZShBcnJheVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIEV2ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgRXZlbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUphdmFFdmVudChKYXZhRXZlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVDbGFzc2lmaWVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVDbGFzc2lmaWVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3NpZmllcihFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVDbGFzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQ2xhc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzcyhFQ2xhc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FVHlwZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FVHlwZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVBhcmFtZXRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FUGFyYW1ldGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFUGFyYW1ldGVyKEVQYXJhbWV0ZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT3BlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVPcGVyYXRpb24oRU9wZXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFUGFja2FnZShFUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSmF2YVJlZlN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL05vdGlmaWNhdGlvblV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9Ob3RpZmljYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzkwMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL05vdGlmaWNhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBOb3RpZmljYXRpb25VdGlsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjI6Mzc6MDIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yOwotIAotCi0vKioKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIG9mIHN0YXRpYyBtZXRob2RzIGZvciBoYW5kbGluZyBzcGVjaWFsIEpFTSBub3RpZmljYXRpb25zLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIE5vdGlmaWNhdGlvblV0aWwgewotCS8qCi0JICogTm90IG1lYW50IHRvIGJlIGNvbnN0cnVjdGVkLgotCSAqLwotCXByaXZhdGUgTm90aWZpY2F0aW9uVXRpbCgpIHsKLQkJCi0JfQotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgbm90aWZpY2F0aW9uIGlzIGEgcmVmbGVjdGlvbiBub3RpZmljYXRpb24uIElmIGl0IGlzLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlIEphdmFDbGFzcyBoYXMKLQkgKiBqdXN0IGhhZCByZWZsZWN0aW9uIHBlcmZvcm1lZCBvbiBpdC4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcmVmbGVjdGlvbiBldmVudC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZsZWN0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG1zZykgewotCQlyZXR1cm4gbXNnLmdldEV2ZW50VHlwZSgpID09IFJlZmxlY3Rpb25BZGFwdG9yLkVWRU5UICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gUmVmbGVjdGlvbkFkYXB0b3IuUkVGTEVDVElPTl9FVkVOVDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhpcyBub3RpZmljYXRpb24gaXMgYSByZWZsZWN0aW9uIGZsdXNoIGV2ZW50IG9mIGEgSmF2YUNsYXNzIHdpdGggZXhpc3RpbmcgY29kZS4gSWYgaXQgaXMsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUgCi0JICogSmF2YUNsYXNzIGhhcyBqdXN0IGhhZCB0aGUgcmVmbGVjdGlvbiByZXN1bHRzIGZsdXNoZWQsIEFORCB0aGlzIHdhcyBhIGNsYXNzIHRoYXQgaGFkIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGNvZGUgb24gaXQuLgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBmbHVzaCBldmVudC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGbHVzaEV2ZW50KE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmV0dXJuIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBSZWZsZWN0aW9uQWRhcHRvci5FVkVOVCAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IEphdmFSZWZsZWN0aW9uQWRhcHRvci5GTFVTSF9SRUZMRUNUSU9OX0VWRU5UOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgbm90aWZpY2F0aW9uIGlzIGEgcmVmbGVjdGlvbiBmbHVzaCBldmVudCBvZiBhIEphdmFDbGFzcyB0aGF0IGlzIG5ldyBhbmQgZG9lc24ndCBoYXZlIGV4aXN0aW5nIGNvZGUuCi0JICogSWYgaXQgaXMsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUgSmF2YUNsYXNzIGhhcyBqdXN0IGhhZCB0aGUgcmVmbGVjdGlvbiByZXN1bHRzIGZsdXNoZWQsIEFORCB0aGlzIHdhcyBhIGNsYXNzIHRoYXQgd2FzIG5ldyBhbmQKLQkgKiBoYWQgbm8gY29kZSBiZWhpbmQgaXQuCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGZsdXNoIGV2ZW50IG9mIG5ldyBjbGFzcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGbHVzaE5ld0V2ZW50KE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmV0dXJuIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBSZWZsZWN0aW9uQWRhcHRvci5FVkVOVCAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IEphdmFSZWZsZWN0aW9uQWRhcHRvci5GTFVTSF9ORVdfUkVGTEVDVElPTl9FVkVOVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL292ZXJyaWRlcy8uLlJPT1QuLi5vdmVycmlkZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL292ZXJyaWRlcy8uLlJPT1QuLi5vdmVycmlkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0NTZlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvLi5ST09ULi4ub3ZlcnJpZGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoYW5nZTpDaGFuZ2VEZXNjcmlwdGlvbiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpjaGFuZ2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvQ2hhbmdlIiB4bWk6dmVyc2lvbj0iMi4wIj4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iWDpST09UIy8vQHJvb3QiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9Il9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICAgICA8IS0tIHRvbyByZW1pbmQgdXMgdGhhdCB0aGVzZSBhcmUgbmVlZCB0byBiZSBkb25lIHlldCBpbiB0aGUgbmV3IGFsbG9jYXRpb24gc2NoZW1lLiAKLSAgPGFkZGVkRU9iamVjdHMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc3RhbnRpYXRlVXNpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPGFkZGVkRU9iamVjdHMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcmlhbGl6ZURhdGEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLS0tPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9Il9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotPC9jaGFuZ2U6Q2hhbmdlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvamF2YS9sYW5nL09iamVjdC5vdmVycmlkZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL292ZXJyaWRlcy9qYXZhL2xhbmcvT2JqZWN0Lm92ZXJyaWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTMyMDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL292ZXJyaWRlcy9qYXZhL2xhbmcvT2JqZWN0Lm92ZXJyaWRlCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGFuZ2U6Q2hhbmdlRGVzY3JpcHRpb24geG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6Y2hhbmdlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL0NoYW5nZSIgeG1pOnZlcnNpb249IjIuMCI+Ci0gICA8IS0tIAotICAgICAgVGhpcyBpcyBraW5kIG9mIGNoZWF0LCBidXQgZGF0YXR5cGVzIGFyZSBuZXZlciBpbnRyb3NwZWN0ZWQsIHNvIHdlIGNhbid0IGdldCB0aGVzZSBhdHRyaWJ1dGVzCi0gICAgICBhZGRlZCB0byB0aGVtIGluIGEgbm9ybWFsIHdheS4gQnkgZG9pbmcgaXQgaGVyZSwgd2hlbiBqYXZhLmxhbmcuT2JqZWN0IGlzIGludHJvc3BlY3RlZCwgdGhlc2UKLSAgICAgIHdpbGwgYmUgZG9uZSBhdCB0aGUgc2FtZSB0aW1lLiBBbmQgc2luY2UgT2JqZWN0IG5lZWRzIHRvIGJlIGludHJvc3BlY3RlZCBiZWZvcmUgYW55dGhpbmcgZWxzZQotICAgICAgY2FuIGJlIGRvbmUsIHRoZXNlIHdpbGwgYmUgZG9uZSBiZWZvcmUgYW55dGhpbmcgbmVlZHMgdGhlbS4gLS0+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNib29sZWFuIj4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJib29sZWFuX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJib29sZWFuX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNjaGFyIj4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJjaGFyX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJjaGFyX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNpbnQiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImludF9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iaW50X2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNmbG9hdCI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iZmxvYXRfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9ImZsb2F0X2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNzaG9ydCI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0ic2hvcnRfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9InNob3J0X2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNsb25nIj4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJsb25nX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJsb25nX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNkb3VibGUiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImRvdWJsZV9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iZG91YmxlX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNieXRlIj4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJieXRlX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJieXRlX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci08L2NoYW5nZTpDaGFuZ2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmVhODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQKLSMKLQotCi1wbHVnaW5OYW1lID0gSmF2YSBFTUYgTW9kZWwKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkNGMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImphdmEueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5yZWdpc3RyYXRpb25zIj4KLSAgICAgIDxyZWdpc3RyYXRpb24gY29udGFpbmVyPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotICAgICAgICA8b3ZlcnJpZGUKLSAgICAgICAgICAgIHBhY2thZ2U9ImphdmEubGFuZyIKLSAgICAgICAgICAgIHBhdGg9Im92ZXJyaWRlcy9qYXZhL2xhbmciPgotICAgICAgICA8L292ZXJyaWRlPgotICAgICAgICA8b3ZlcnJpZGUKLSAgICAgICAgICAgIHBhY2thZ2U9Ii4uUk9PVC4uIgotICAgICAgICAgICAgcGF0aD0ib3ZlcnJpZGVzIj4KLSAgICAgICAgPC9vdmVycmlkZT4KLSAgICAgIDwvcmVnaXN0cmF0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmUzYTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5tZH4KLSouY2F+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9lZG9jamF2YTIuY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9lZG9jamF2YTIuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWIxZWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvZWRvY2phdmEyLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDU2MTMgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImphdmEiCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIklETCIKLQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDAtMDA1ZDllNmFkZWM0OjEiKSkKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmplbSIpKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJInByZWZpeCIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkphdmFSZWYiKSkKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgImphdmEueG1pIikpKQotICAgIHF1aWQgICAgICAgCSIzNjU0OUYyQzAwNEUiCi0gICAgZG9jdW1lbnRhdGlvbiAJCi18Q2hhbmdlcyB0byBzeW5jaCB1cCB3aXRoIEphdmEzZToKLXwtIGRlbGV0ZWQgSmF2YUVsZW1lbnQsIEJvZHlFbGVtZW50IHdoaWNoIGRpZG4ndCBhZGQgYW55dGhpbmcgdXNlZnVsCi18LSBkZWxldGVkIE5lc3RlZENsYXNzIGFuZCB0aGUgYXNzb2NpYXRpb24gd2hpY2ggZGVzY3JpYmVkIG5lc3RpbmcsIGNvbnRlbnRzIGNhbiBiZSB1c2VkIGluc3RlYWQKLXwtIGRlbGV0ZWQgZXh0ZW5kcy9leHRlbmRlZEJ5IHdoaWNoIGlzIHJlcGxhY2VkIHdpdGggTU9GIHN1YnR5cGUvc3VwZXJ0eXBlCi18LSBkZWxldGVkIHRoZSBjbHVtc3kgbWFpbiBkaWFncmFtCi18LSBtb3ZlZCB0aGUgTU9GIGluaGVyaXRhbmNlIGRldGFpbHMgdG8gdGhlIE1PRiBiaW5kaW5nIGRpYWdyYW0KLXwtIGRlbGV0ZWQgImZpbmFsIiBvbiBKYXZhUGFyYW1ldGVyLCBkb24ndCBrbm93IHdoYXQgdGhhdCB3YXMgc3VwcG9zZWQgdG8gYmUKLXwtIGRlbGV0ZWQgdGhlIENhdGVnb3J5IGp1bmsKLXwtIGNoYW5nZWQgdGhlIEJsb2NrLXR5cGVkIGF0dHJpYnV0ZXMgb24gRmllbGQsIE1ldGhvZCwgSW5pdGlhbGl6ZXIgdG8gYmUgYXNzb2NpYXRpb25zIHRvIEJsb2NrCi18Ci18T3V0c3RhbmRpbmcgcXVlc3Rpb25zL2lzc3VlczoKLXwtIEphdmFQYXJhbWV0ZXJLaW5kIHNob3VsZCBnbyBhd2F5IGlmIHdlIGdldCB0aGUgYmFzZSBQYXJhbWV0ZXIga2luZCBmaXhlZCB1cAotfAotICAgIAotICAgIHN0ZXJlb3R5cGUgCSJtZXRhbW9kZWwiCi0gICAgdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0Ci0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDAxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgxRERGNDcwMjcxIgotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2YiCi0JICAgIHF1aWR1ICAgICAgCSIzNzRBQThGOTAyOEUiKQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwMi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5QkQzNjYwMDBGRSIKLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmUiCi0JICAgIHF1aWR1ICAgICAgCSIzOUE1RUQwNDAwNEUiKSkKLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIgotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzcyAiSmF2YUNsYXNzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDAzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwNC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTkwOTUwMDAwQjMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc05lc3RlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQTlEN0MyMTAxRDYiCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGaWVsZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjVCMzAwNDQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJmaWVsZE5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFBQSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiRmllbGQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZpZWxkRXh0ZW5kZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI2MjUwMTFBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18IFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSBmcm9tIHRoaXMgSmF2YUNsYXNzIG9yIGFueSBzdXBlcnR5cGVzLgotfAotfFJldHVybiBudWxsIGlmIGEgRmllbGQgbmFtZWQgZmllbGROYW1lIGlzIG5vdCBmb3VuZC4KLQkJICAgIAotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImZpZWxkTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUFDIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJGaWVsZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmllbGROYW1lZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjY2NzAyNTUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJmaWVsZE5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFBRSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiRmllbGQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZpZWxkc0V4dGVuZGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNjhBMDMyOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYWxsIGZpZWxkcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4iCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXRob2QiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI5MTEwMjFBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBub3QgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWV0aG9kTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUIxIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlclR5cGVzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQjIiCi0JCQkgICAgZG9jdW1lbnRhdGlvbiAJIkxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVMaXN0IgotCQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJNZXRob2QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCOUVBMDNDQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYSBMaXN0IG9mIFN0cmluZ3MgdGhhdCByZXByZXNlbnQgTWV0aG9kRWxlbWVudCBzaWduYXR1cmVzIGZyb20gbW9zdCBnZW5lcmFsIHRvIG1vc3Qgc3BlY2lmaWMuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWV0aG9kRXh0ZW5kZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJBNTEwMTE1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXRob2ROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQjUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyVHlwZXMiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCNiIKLQkJCSAgICBkb2N1bWVudGF0aW9uIAkiTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUxpc3QiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpKQotCQkgICAgcmVzdWx0ICAgICAJIk1ldGhvZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWV0aG9kc0V4dGVuZGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQTdEMDM1NCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYWxsIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T25seVNwZWNpZmljTWV0aG9kcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkFDMzAyMUUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZHMgdGhhdCBiZWdpbnMgd2l0aCBAYU1ldGhvZE5hbWVQcmVmaXggYW5kIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQGV4Y2x1ZGVkTmFtZXMgbGlzdC4gSWYgQGFNZXRob2ROYW1lUHJlZml4IGlzIG51bGwsIGFsbCBtZXRob2RzIHdpbGwgYmUgcmV0dXJuZWQuCi18Ci0JCSAgICAKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJhTWV0aG9kTmFtZVByZWZpeCIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUI5IgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImV4Y2x1ZGVkTmFtZXMiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCQSIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVMaXN0IgotCQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFB1YmxpY01ldGhvZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkJDOTAzODMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGEgbWV0aG9kIG1hdGNoaW5nIHRoZSBuYW1lLCBhbmQgbm9uLXJldHVybiBwYXJhbWV0ZXJzIHdpdGggZnVsbHkgcXVhbGlmaWVkIHR5cGVzIG1hdGNoaW5nIGFsbCB0aGUgdHlwZXMgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cy4gIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1ldGhvZE5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCQyIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJUeXBlcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUJEIgotCQkJICAgIGRvY3VtZW50YXRpb24gCSJMaXN0IG9mIHBhcmFtZXRlciB0eXBlcy4iCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlTGlzdCIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikpCi0JCSAgICByZXN1bHQgICAgIAkiTWV0aG9kIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQdWJsaWNNZXRob2RzIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQzNEMDM0RSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYWxsIG1ldGhvZHMsIGl0IHdpbGwgbm90IGdvIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFB1YmxpY01ldGhvZHNFeHRlbmRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkM2MzAzMjAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGFsbCBwdWJsaWMgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4iCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQdWJsaWNNZXRob2RzTmFtZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJDQUEwMDVCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MsIGhhdmluZyBhIG5hbWUgZXF1YWwgdG8gdGhhdCBvZiB0aGUgcGFyYW1ldGVyLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQzEiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U3VwZXJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQ0Y5MDBDRCIKLQkJICAgIHJlc3VsdCAgICAgCSJKYXZhQ2xhc3MiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImltcGxlbWVudHNJbnRlcmZhY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJEMzkwMDlEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRlc3Qgd2hldGhlciB0aGUgcmVjZWl2ZXIgaW1wbGVtZW50cyB0aGUgcGFzc2VkIGludGVyZmFjZSAob3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzKS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiaW50ZXJmYWNlVHlwZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUM0IgotCQkJICAgIHR5cGUgICAgICAgCSJKYXZhQ2xhc3MiCi0JCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpKQotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaW5mb1N0cmluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkQ4MjAyRDMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGEgc3RyaW5nIHNob3dpbmcgb3VyIGRldGFpbHMuIgotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpbmhlcml0c0Zyb20iCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJEOUUwMkU3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRlc3RzIHdoZXRoZXIgdGhpcyBjbGFzcyBpbmhlcml0cyBmcm9tIHRoZSBwYXNzZWQgaW4gY2xhc3MuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImphdmFDbGFzcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUM3IgotCQkJICAgIHR5cGUgICAgICAgCSJKYXZhQ2xhc3MiCi0JCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpKQotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNFeGlzdGluZ1R5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJFMTEwMTIwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkRvZXMgdGhpcyB0eXBlIGV4aXN0LiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzSW50ZXJmYWNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRTJGMDEzNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIGFuIGludGVyZmFjZS4iCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRTdXBlcnR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJFN0IwMEEwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0aGUgc3VwZXJ0eXBlLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJqYXZhY2xhc3MiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFDQiIKLQkJCSAgICB0eXBlICAgICAgIAkiSmF2YUNsYXNzIgotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJ2b2lkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtpbmQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwNS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QTQ1RTAyMzIiCi0JCSAgICB0eXBlICAgICAgIAkiVHlwZUtpbmQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEI0NjAwMkJGIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpYyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDA2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY4Q0U4MDIwQyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjhGOUMwMkQ3IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJJbml0aWFsaXplciIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwOS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBNURDMDBCQiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaXNTdGF0aWMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwYS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QTg2NTAwMEYiCi0JCSAgICB0eXBlICAgICAgIAkiQm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIkphdmFQYXJhbWV0ZXIiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMGItMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjc4MThCMDAxODYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVBhcmFtZXRlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRTYxNTAxMDQiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNBcnJheSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkZENDAzNEYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBwYXJhbWV0ZXIgdHlwZSBhbiBhcnJheSB0eXBlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzUmV0dXJuIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRkVGMDAwNSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIGEgcmV0dXJuIHBhcmFtZXRlci4iCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRKYXZhVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzhFNzAwMUEiCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UXVhbGlmaWVkTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzkyNjAwMkYiCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMGMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEI2NDcwMkFGIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1ldGVyS2luZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDBlLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUMxRUI0MDBDMiIKLQkJICAgIHR5cGUgICAgICAgCSJKYXZhUGFyYW1ldGVyS2luZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTFDMUU4RjAxMjMiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJNZXRob2QiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMGYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDEwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5OTA5NTM4MDNBRCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFT3BlcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDREQUEyMDBBMCIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRDb250YWluaW5nSmF2YUNsYXNzIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMDQyMDJBMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gdGhlIGphdmEgY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGluLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKYXZhQ2xhc3MiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMwNzYwMTNGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHRoZSBtZXRob2QgbmFtZSBhbmQgaXRzIHBhcmFtZXRlcnMuIGUuZy4gPGNvZGU+IHNldEZpcnN0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSA8L2NvZGU+IC4KLXwgCi0JCSAgICAKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFyYW1ldGVyIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMEI4MDExQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYSBQYXJhbWV0ZXIgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlck5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFFMyIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiSmF2YVBhcmFtZXRlciIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UmV0dXJuVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzE0NzAwMTMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiR2V0IHRoZSByZXR1cm4gdHlwZS4iCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0UmV0dXJuVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzI3NDAzQ0UiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2V0IHRoZSByZXR1cm4gdHlwZSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJ0eXBlIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxRTgiCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpKQotCQkgICAgcmVzdWx0ICAgICAJInZvaWQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2lnbmF0dXJlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMTdEMDA0MyIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QudG9TdHJpbmcoKS4KLXwKLXxSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBNZXRob2QuICBUaGUgc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyB0aGUgbWV0aG9kIGFjY2VzcyBtb2RpZmllcnMsIGlmIGFueSwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCByZXR1cm4gdHlwZSwgZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWV0aG9kLCBmb2xsb3dlZCBieSBhIHBlcmlvZCwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCBuYW1lLCBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2l6ZWQsIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBtZXRob2QncyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgbWV0aG9kIHRocm93cyBjaGVja2VkIGV4Y2VwdGlvbnMsIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgd29yZCB0aHJvd3MgZm9sbG93ZWQgYnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgdGhyb3duIGV4Y2VwdGlvbiB0eXBlcy4KLXwKLXxGb3IgZXhhbXBsZToKLXwKLXwgICAgcHVibGljIGJvb2xlYW4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLXwKLXxUaGUgYWNjZXNzIG1vZGlmaWVycyBhcmUgcGxhY2VkIGluIGNhbm9uaWNhbCBvcmRlciBhcyBzcGVjaWZpZWQgYnkgIlRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24iLiAgVGhpcyBpcyBwdWJsaWMsIDx0dD5wcm90ZWN0ZWQ8L3R0PiBvciA8dHQ+cHJpdmF0ZTwvdHQ+IGZpcnN0LCBhbmQgdGhlbiBvdGhlciBtb2RpZmllcnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogPHR0PmFic3RyYWN0PC90dD4sIDx0dD5zdGF0aWM8L3R0PiwgPHR0PmZpbmFsPC90dD4sIDx0dD5zeW5jaHJvbml6ZWQ8L3R0PiA8dHQ+bmF0aXZlPC90dD4uCi18Ci0JCSAgICAKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNHZW5lcmF0ZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMxRkMwMDZFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2QgaXMgc3lzdGVtIGdlbmVyYXRlZC4KLXxUaGlzIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgQGdlbmVyYXRlZCB0YWcgaW4gdGhlIGNvbW1lbnQuCi0JCSAgICAKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldElzR2VuZXJhdGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMjQ0MDM3RiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdGhlIGlzR2VuZXJhdGVkIGZsYWcuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImdlbmVyYXRlZCIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUVDIgotCQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikpCi0JCSAgICByZXN1bHQgICAgIAkidm9pZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc1ZvaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMyMTgwMzhGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklzIHRoaXMgYSB2b2lkIHJldHVybiB0eXBlIG1ldGhvZC4iCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhYnN0cmFjdCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDExLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY5MEJDMDIyQiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hdGl2ZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDEyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY5MEQxMDM2NCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN5bmNocm9uaXplZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDEzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY5MERCMDNDMSIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2RTAwMDMzIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RydWN0b3IiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxNS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTFBREQyODAyNDUiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdGF0aWMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxNi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZFNDAzNTAiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhVmlzaWJpbGl0eSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDE3LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNkVCMDM5NyIKLQkJICAgIHR5cGUgICAgICAgCSJKYXZhVmlzaWJpbGl0eUtpbmQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzgyMzMzQkUwMzJFIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkibm9uZSIpCi0JKG9iamVjdCBDbGFzcyAiRmllbGQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QUY4RjAyODAiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA0ODdGOTAzMzQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVR5cGVkRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRGNjAzOTgiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjUxMjAwMjQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiR2V0IHRoZSBjbGFzcyB0aGF0IHRoaXMgZmllbGQgaXMgd2l0aGluLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKYXZhQ2xhc3MiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzQXJyYXkiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI1NUYwMUU3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklzIHRoaXMgZmllbGQgYW4gYXJyYXkgdHlwZS4iCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDFkLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNkJFMDI2RiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0YXRpYyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDFlLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNkMyMDJFRCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmFWaXNpYmlsaXR5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMWYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2QzcwMzRGIgotCQkgICAgdHlwZSAgICAgICAJIkphdmFWaXNpYmlsaXR5S2luZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzODIzMzNCRTAzMkUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHJhbnNpZW50IgotCQkgICAgcXVpZCAgICAgICAJIjQwMDQ4ODAxMDNCOCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZvbGF0aWxlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDQ4ODA4MDEyRCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkibm9uZSIpCi0JKG9iamVjdCBDbGFzcyAiVHlwZUtpbmQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QjQ2MDAyQkYiCi0JICAgIGRvY3VtZW50YXRpb24gCSJVTkRFRklORUQ9MSBDTEFTUz0yIElOVEVSRkFDRT0zIEVYQ0VQVElPTj00IgotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlVOREVGSU5FRCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDIxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEI5RTM2MDFBMSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDTEFTUyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDIyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEI5RTQ0MDI1RCIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJJTlRFUkZBQ0UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyMy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBCOUU1NjAxMjQiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRVhDRVBUSU9OIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwQjlFNjUwMUExIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkibm9uZSIpCi0JKG9iamVjdCBDbGFzcyAiQmxvY2siCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODBGODgzNzAxNTAiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvdXJjZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDI2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MTBFN0ZDMDIzOSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTZDNTNFMTAwMjkiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJDb21tZW50IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDI3LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgwRjg4OUIwMkI4IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyOC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGODhENjAwQTUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiKSkpCi0JKG9iamVjdCBDbGFzcyAiU3RhdGVtZW50IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDI5LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgwRjg4QjkwMjVBIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyYS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGODhEQTAwNTYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiKSkpCi0JKG9iamVjdCBDbGFzcyAiSmF2YVBhY2thZ2UiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMmItMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODEwOEUwMzAxRDIiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDJjLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5OTA5NEQ3MDA0NiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFUGFja2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTA1QzNGNzAwMEEiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkphdmFWaXNpYmlsaXR5S2luZCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzMC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MjMzM0JFMDMyRSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UEFDS0FHRT0xCi18UFVCTElDPTIKLXxQUklWQVRFPTMKLXxQUk9URUNURUQ9NAotCSAgICAKLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQVUJMSUMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzMS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODIzMzNFMjAyMkMiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUFJJVkFURSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDMyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjMzM0U3MDAzRSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQUk9URUNURUQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzMy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODIzMzNFODAzODkiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUEFDS0FHRSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjMzM0VBMDM4QyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiSmF2YVBhcmFtZXRlcktpbmQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTFDMUU4RjAxMjMiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfElOPTAKLXxPVVQ9MQotfElOT1VUPTIKLXxSRVRVUk49MwotCSAgICAKLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJJTiIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUMxRUZDMDJFQyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJPVVQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzNy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTFDMUVGRjAxNkEiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiSU5PVVQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzOC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTFDMUYwMTAwNDAiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUkVUVVJOIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzktMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQzIxOTQwMzg3IgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJKYXZhRGF0YVR5cGUiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwM2EtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTU5MTMzNDAzMTYiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRTUyNjhFMjAxQjEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXREZWZhdWx0VmFsdWVTdHJpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJGOTEwMzAzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuIgotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKSkKLQkob2JqZWN0IENsYXNzICJBcnJheVR5cGUiCi0JICAgIHF1aWQgICAgICAgCSIzQTlENzlFRDAxREYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfERlc2NyaWJlcyBhIEphdmEgQXJyYXkgdHlwZQotfCAgIEZvciBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMsIGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUKLXwgICBzcGVjaWZpZWQgZGlyZWN0bHkuICBUaGlzIHdvdWxkIHJlcXVpcmUgaW5zdGFudGlhdGluZyBhIGNoYWluIG9mIGNvbXBvbmVudCB0eXBlcwotfCAgIHN1Y2ggYXMgU3RyaW5nW11bXVtdW10tPlN0cmluZ1tdW11bXS0+U3RyaW5nW11bXS0+U3RyaW5nW10tPlN0cmluZy4KLXwKLXwgIFRoZSBjb21wb25lbnQgdHlwZSByZWxhdGlvbnNoaXAgd2lsbCBiZSBjb21wdXRlZCBpZiB0aGUgZmluYWxDb21wb25lbnRUeXBlCi18ICBhbmQgYXJyYXkgZGltZW5zaW9ucyBpcyBzcGVjaWZpZWQuCi18IAotfCAgRm9yIHRoaXMgcmVhc29uLCB0aGUgcHJlZmVycmVkIHdheSB0byBjcmVhdGUgaXMgdGhyb3VnaCB0aGUgSmF2YVJlZkZhY3RvcnkgZmFjdG9yeSBtZXRob2Q6Ci18ICAgICAgIGNyZWF0ZUFycmF5VHlwZShKYXZhQ2xhc3MgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucykKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQTlENzlGRDAxMEYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZpbmFsQ29tcG9uZW50VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTlEN0E4MjAxOTMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxHZXQgdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIEFycmF5IFR5cGUuCi18Ci18SW4gb3JkZXIgdG8gZW5zdXJlIGEgdW5pcXVlIGluc3RhbmNlLCB3ZSB3aWxsIHJlc29sdmUgdGhpcyB0eXBlIHVzaW5nIHJlZmxlY3Rpb24uIEl0IHR1cm5zIG91dCB0byBiZSBtb3N0IGVmZmljaWVudCB0byBqdXN0IGRvIHRoaXMgYnkgdHJpbW1pbmcgdGhlIG5hbWUuCi0JCSAgICAKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRDb21wb25lbnRUeXBlQXNIZWxwZXIiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUFGOTgwMTM2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18R2V0IHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5LiAKLXwKLXxJZiB0aGlzIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXksIHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlIHRoZSBuZXN0ZWQgYXJyYXkgdHlwZS4KLQkJICAgIAotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzUHJpbWl0aXZlQXJyYXkiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI0MTcwMkI4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklzIHRoaXMgYW4gYXJyYXkgb2YgamF2YSBwcmltaXRpdmVzIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0Q29tcG9uZW50VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjQ1NTAzQkMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2V0IHRoZSBjb21wb25lbnQgdHlwZS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiaGVscGVyQ29tcG9uZW50VHlwZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMjI2IgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcnJheURpbWVuc2lvbnMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJGaW5hbCIKLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCQkgICAgbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCQkgICAgbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCSAgICB2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCQkgICAgbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQkgICAgdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTlEN0FDODAyODQiCi0JCSAgICB0eXBlICAgICAgIAkiaW50IgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSlR5cGVKYXZhSGVscGVycyIKLQkgICAgcXVpZCAgICAgICAJIjNCNjVBREU0MDNBNiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaW50ZXJmYWNlIGlzIGEgY29tbW9uIGludGVyZmFjZSBiZXR3ZWVuIEphdmFDbGFzcyBhbmQgSmF2YURhdGFUeXBlIHBsdXMgc29tZSBjb21tb24gaGVscGVyIG1ldGhvZHMuIgotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVBRTE3MDI2OSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkpUeXBlTGlzdCIKLQkgICAgcXVpZCAgICAgICAJIjNCNjVCODc2MDJDMSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJImphdmEudXRpbC5MaXN0IHR5cGUiCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI4OEYwMzk5IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiSmF2YUV2ZW50IgotCSAgICBxdWlkICAgICAgIAkiM0M2MkZBRjEwM0M4IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0RGNENFODMwMzkwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDU5RDAyMzAiKSkKLQkgICAgYWJzdHJhY3QgICAJVFJVRSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJJbXBsZW1lbnRzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDNjLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEEwRDcwMjQyIgotCSAgICBkb2N1bWVudGF0aW9uIAkiQ29uc3RyYWludCAtIFNvdXJjZSBvZiBpbXBsZW1lbnRzIGlzIG9mIFR5cGVLaW5kIENMQVNTVFlQRSBhbmQgdGFyZ2V0IGlzIElOVEVSRkFDRVRZUEUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImltcGxlbWVudHNJbnRlcmZhY2VzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwM2QtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEEwREEwMTA5IgotCQkgICAgbGFiZWwgICAgICAJImltcGxlbWVudHNJbnRlcmZhY2VzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJpbXBsZW1lbnRlZEJ5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwM2UtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEEwREEwMTM4IgotCQkgICAgbGFiZWwgICAgICAJImltcGxlbWVudGVkQnkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIk1ldGhvZEhhcyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzZi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBRjAzMDJDRSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFyYW1ldGVycyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBRjA4MDE5NiIKLQkJICAgIGxhYmVsICAgICAgCSJwYXJhbWV0ZXJzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIm1ldGhvZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBRjA4MDE5NyIKLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Mi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRCMDg4MDFBNSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiL3R5cGUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0My0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QjA5MTAwN0QiCi0JCSAgICBsYWJlbCAgICAgIAkiL3R5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIi90eXBlZEVsZW1lbnQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0NC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QjA5MTAwOEMiCi0JCSAgICBsYWJlbCAgICAgIAkiL3R5cGVkRWxlbWVudCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFENzgwMjgwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIk1ldGhvZFRocm93cyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0NS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MTBCNjFCMDE3OCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRhcmdldCBtdXN0IGJlIG9mIGtpbmQgRVhDRVBUSU9OVFlQRSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiamF2YUV4Y2VwdGlvbnMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Ni0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODEwQjYxRTAxQzMiCi0JCSAgICBsYWJlbCAgICAgIAkiamF2YUV4Y2VwdGlvbnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIm1ldGhvZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQ3LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MTBCNjFFMDIyNyIKLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIkNvbnRlbnRzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQ4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgxMEU2MDgwMjY4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJjb250YWluZWRCeSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQ5LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MTBFNjBFMDE0NCIKLQkJICAgIGxhYmVsICAgICAgCSJjb250YWluZWRCeSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDRhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MTBFNjBFMDE2MiIKLQkJICAgIGxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJDbGFzc0ltcG9ydHMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNGItMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODI5QzRCRjAwMEQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImNsYXNzSW1wb3J0IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNGMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM0QkYwMDBFIgotCQkgICAgbGFiZWwgICAgICAJImNsYXNzSW1wb3J0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJpbXBvcnRlZEJ5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNGQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM0QkYwMDBGIgotCQkgICAgbGFiZWwgICAgICAJImltcG9ydGVkQnkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIlBhY2thZ2VJbXBvcnRzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDRlLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgyOUM0RUMwMjA3IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYWNrYWdlSW1wb3J0cyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDRmLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEVFMDBGQiIKLQkJICAgIGxhYmVsICAgICAgCSJwYWNrYWdlSW1wb3J0cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYWNrYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJpbXBvcnRlZEJ5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM0RUUwMTA1IgotCQkgICAgbGFiZWwgICAgICAJImltcG9ydGVkQnkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODJBMjlCRDAyMTkiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImZpZWxkcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDUyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUJFMDM1MCIKLQkJICAgIGxhYmVsICAgICAgCSJmaWVsZHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpGaWVsZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImphdmFDbGFzcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDUzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUJFMDNCRiIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhQ2xhc3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDU0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QzAwMTdEIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJtZXRob2RzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QzEwMTc0IgotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJqYXZhQ2xhc3MiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1Ni0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODJBMjlDMTAyMEEiCi0JCSAgICBsYWJlbCAgICAgIAkiamF2YUNsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1Ny0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkE5RUI0MDNDNiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiL3N1cGVydHlwZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDU4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkE5RUI4MDNCNyIKLQkJICAgIGxhYmVsICAgICAgCSIvc3VwZXJ0eXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIvc3VidHlwZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDU5LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkE5RUI5MDA5OCIKLQkJICAgIGxhYmVsICAgICAgCSIvc3VidHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1YS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkE5RjAzMDFBQyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiL3N1cGVydHlwZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDViLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkE5RjA5MDMyOCIKLQkJICAgIGxhYmVsICAgICAgCSIvc3VwZXJ0eXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIvc3VidHlwZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDVjLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkE5RjBBMDAxQyIKLQkJICAgIGxhYmVsICAgICAgCSIvc3VidHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDVkLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUEwOTUwM0U1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJpbml0aWFsaXplcnMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1ZS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQTA5NzAxNTMiCi0JCSAgICBsYWJlbCAgICAgIAkiaW5pdGlhbGl6ZXJzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SW5pdGlhbGl6ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEE1REMwMEJCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJqYXZhQ2xhc3MiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1Zi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQTA5NzAxNUQiCi0JCSAgICBsYWJlbCAgICAgIAkiamF2YUNsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2MC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBMjEyMDBDMiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZGVjbGFyZWRDbGFzc2VzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEyMTcwMUQ4IgotCQkgICAgbGFiZWwgICAgICAJImRlY2xhcmVkQ2xhc3NlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiZGVjbGFyaW5nQ2xhc3MiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2Mi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQTIxNzAyREMiCi0JCSAgICBsYWJlbCAgICAgIAkiZGVjbGFyaW5nQ2xhc3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDYzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUEyQTcwMUMxIgotCSAgICBzdGVyZW90eXBlIAkiZGVyaXZlZCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiamF2YUNsYXNzZXMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2NC0wMDVkOWU2YWRlYzQ6MSIpKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEyQTgwMzY3IgotCQkgICAgbGFiZWwgICAgICAJImphdmFDbGFzc2VzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJqYXZhUGFja2FnZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY1LTAwNWQ5ZTZhZGVjNDoxIikpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQTJBOTAwODMiCi0JCSAgICBsYWJlbCAgICAgIAkiamF2YVBhY2thZ2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFja2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwOEUwMzAxRDIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQUMzMzAzNkEiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNvdXJjZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY3LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzM4MDE0MCIKLQkJICAgIGxhYmVsICAgICAgCSJzb3VyY2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiaW5pdGlhbGl6ZXIiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2OC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUMzODAxNjgiCi0JCSAgICBsYWJlbCAgICAgIAkiaW5pdGlhbGl6ZXIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpJbml0aWFsaXplciIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTVEQzAwQkIiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2OS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzU2MDJBMiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW5pdGlhbGl6ZXIiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2YS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUM1NzAyREYiCi0JCSAgICBsYWJlbCAgICAgIAkiaW5pdGlhbGl6ZXIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImZpZWxkIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNmItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDNTcwMzA3IgotCQkgICAgbGFiZWwgICAgICAJImZpZWxkIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNmMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQUNBNTAxRTciCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNvdXJjZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDZhYzQwLTg4MjYtMTFlMS0wMDAwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQ0E3MDE3QyIKLQkJICAgIGxhYmVsICAgICAgCSJzb3VyY2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAibWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NmFjNDAtODgyNi0xMWUxLTAwMDEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDQTcwMUI4IgotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiCi0JICAgIHF1aWQgICAgICAgCSIzQzYyRkJFMDAxNjgiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImV2ZW50cyIKLQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkJFMjAwOEYiCi0JCSAgICBsYWJlbCAgICAgIAkiZXZlbnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUV2ZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQUYxMDNDOCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIiCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MkZCRTIwMDkxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIgotCSAgICBxdWlkICAgICAgIAkiM0M4OTM4NzcwMjUzIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJhbGxFdmVudHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNDODkzODc4MDJDQyIKLQkJICAgIGxhYmVsICAgICAgCSJhbGxFdmVudHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhRXZlbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MkZBRjEwM0M4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4OTM4NzgwMkNFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1IgotCSAgICBxdWlkICAgICAgIAkiM0RGNENBQUQwMUEzIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJjb21wb25lbnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNERjRDQUFFMDFFQiIKLQkJICAgIGxhYmVsICAgICAgCSJjb21wb25lbnRUeXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzc2lmaWVyIgotCQkgICAgcXVpZHUgICAgICAJIjNBQ0U0RkVFMDM3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNiIKLQkJICAgIHF1aWQgICAgICAgCSIzREY0Q0FBRTAxRjUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpBcnJheVR5cGUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E5RDc5RUQwMURGIikpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRWNvcmUgYmluZGluZyIKLQkgICAgcXVpZCAgICAgICAJIjM4MTA5QzBGMDA5QiIKLQkgICAgdGl0bGUgICAgICAJIkVjb3JlIGJpbmRpbmciCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTQwOTQKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpGaWVsZCIgQDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEwNCwgNTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoNjg5LCAzNjgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJODMwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmllbGQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDEKLQkJCWxvY2F0aW9uICAgCSg2ODksIDQyNCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk4Ci0JCQltYXhfd2lkdGggIAk3MDkpCi0JCSAgICB3aWR0aCAgICAgIAk4NDgKLQkJICAgIGhlaWdodCAgICAgCTQzOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFja2FnZSIgQDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyLCA0ODApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSgzMSwgNDM0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFQYWNrYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgxMDhFMDMwMUQyIgotCQkgICAgd2lkdGggICAgICAJMzQwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVQYWNrYWdlIiBAMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIDE0NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMwotCQkJbG9jYXRpb24gICAJKDEwMywgNDUpCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkxNzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFUGFja2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDVDM0Y3MDAwQSIKLQkJICAgIHdpZHRoICAgICAgCTE5NgotCQkgICAgaGVpZ2h0ICAgICAJMjIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzk5MDk0RDcwMDQ2IgotCQkgICAgY2xpZW50ICAgICAJQDIKLQkJICAgIHN1cHBsaWVyICAgCUAzCi0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiIEA1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3MjgsIDE4MjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUKLQkJCWxvY2F0aW9uICAgCSgxNDY1LCAxNjE1KQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTI2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANQotCQkJbG9jYXRpb24gICAJKDE0NjUsIDE3MTUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk2Ci0JCQltYXhfd2lkdGggIAk0NTIpCi0JCSAgICB3aWR0aCAgICAgIAk1NDQKLQkJICAgIGhlaWdodCAgICAgCTQ0MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RU9wZXJhdGlvbiIgQDYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMyMCwgMTQ0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2Ci0JCQlsb2NhdGlvbiAgIAkoMjIzMSwgNDUpCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkxNzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFT3BlcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwNERBQTIwMEEwIgotCQkgICAgd2lkdGggICAgICAJMTk2Ci0JCSAgICBoZWlnaHQgICAgIAkyMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YURhdGFUeXBlIiBANwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzNTIsIDEyMTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcKLQkJCWxvY2F0aW9uICAgCSgxMSwgMTE0MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2ODIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhRGF0YVR5cGUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTU5MTMzNDAzMTYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQlsb2NhdGlvbiAgIAkoMTEsIDExOTkpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTg1KQotCQkgICAgd2lkdGggICAgICAJNzAwCi0JCSAgICBoZWlnaHQgICAgIAkxNjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIiBAOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMzM2LCA3NjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDgKLQkJCWxvY2F0aW9uICAgCSgxNzM2LCAzNTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTIwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1ldGhvZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAOAotCQkJbG9jYXRpb24gICAJKDE3MzYsIDQxMykKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkxNwotCQkJbWF4X3dpZHRoICAJMTAyNykKLQkJICAgIHdpZHRoICAgICAgCTEyMTgKLQkJICAgIGhlaWdodCAgICAgCTg0NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5OTA5NTM4MDNBRCIKLQkJICAgIGNsaWVudCAgICAgCUA4Ci0JCSAgICBzdXBwbGllciAgIAlANgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzc2LCAzNDYpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3NiwgMjU1KSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEAxMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzEyLCAyODY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMAotCQkJbG9jYXRpb24gICAJKDMzMCwgMjI3MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxOTY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCWxvY2F0aW9uICAgCSgzMzAsIDIzMjkpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMjUKLQkJCW1heF93aWR0aCAgCTE2ODApCi0JCSAgICB3aWR0aCAgICAgIAkxOTgyCi0JCSAgICBoZWlnaHQgICAgIAkxMjA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzk5MDk1MDAwMEIzIgotCQkgICAgY2xpZW50ICAgICAJQDEwCi0JCSAgICBzdXBwbGllciAgIAlANQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTk0LCAyMjYyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTQsIDIwNDQpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXIiIEAxMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCAxNDcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMgotCQkJbG9jYXRpb24gICAJKDYwOCwgMTI4NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk4MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFyYW1ldGVyIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFENzgwMjgwIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTIKLQkJCWxvY2F0aW9uICAgCSg2MDgsIDEzNDIpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNwotCQkJbWF4X3dpZHRoICAJNjg1KQotCQkgICAgd2lkdGggICAgICAJODE4Ci0JCSAgICBoZWlnaHQgICAgIAkzOTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVQYXJhbWV0ZXIiIEAxMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCA5NjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEzCi0JCQlsb2NhdGlvbiAgIAkoOTE5LCA4NjEpCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkxNzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFUGFyYW1ldGVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRTYxNTAxMDQiCi0JCSAgICB3aWR0aCAgICAgIAkxOTYKLQkJICAgIGhlaWdodCAgICAgCTIyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjc4MThCMDAxODYiCi0JCSAgICBjbGllbnQgICAgIAlAMTIKLQkJICAgIHN1cHBsaWVyICAgCUAxMwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIiBAMTUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzIwLCA4MTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE1Ci0JCQlsb2NhdGlvbiAgIAkoNTYsIDYzMCkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUyOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCWxvY2F0aW9uICAgCSg1NiwgNzMwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJNDUyKQotCQkgICAgd2lkdGggICAgICAJNTQ2Ci0JCSAgICBoZWlnaHQgICAgIAkzOTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1MjY4RTIwMUIxIgotCQkgICAgY2xpZW50ICAgICAJQDcKLQkJICAgIHN1cHBsaWVyICAgCUAxNQotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RVR5cGVkRWxlbWVudCIgQDE3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDExMDQsIDExMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNwotCQkJbG9jYXRpb24gICAJKDkxNiwgNDEpCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNzYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFVHlwZWRFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRGNjAzOTgiCi0JCSAgICB3aWR0aCAgICAgIAkzOTQKLQkJICAgIGhlaWdodCAgICAgCTE2NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA0ODdGOTAzMzQiCi0JCSAgICBjbGllbnQgICAgIAlAMQotCQkgICAgc3VwcGxpZXIgICAJQDE3Ci0JCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBvbHltb3JwaGlzbSIKLQkgICAgcXVpZCAgICAgICAJIjM4MTA5RDAwMDM3MyIKLQkgICAgdGl0bGUgICAgICAJIlBvbHltb3JwaGlzbSIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDE5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQ5NiwgNTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxOQotCQkJbG9jYXRpb24gICAJKDM2NSwgNTMwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgd2lkdGggICAgICAJMjgwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAMjAKLQkJICAgIGxvY2F0aW9uICAgCSgxNjYsIDUzNykKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBOUVCNDAzQzYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIi9zdXBlcnR5cGUiIEAyMQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjAKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMzMCwgMjE3KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIKLQkJCQlQYXJlbnRfVmlldyAJQDIxCi0JCQkJbG9jYXRpb24gICAJKDIzNCwgNDgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMjYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIisvc3VwZXJ0eXBlIgotCQkJCXBjdERpc3QgICAgCTAuNDE5MTkyCi0JCQkJaGVpZ2h0ICAgICAJMzgKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBOUVCODAzQjciCi0JCQkgICAgY2xpZW50ICAgICAJQDIwCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE2NiwgNTM3KQotCQkJCSgxNjYsIDUxNykKLQkJCQkoMzU2LCA1MTcpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NiwgNTM3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTYsIDUxNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMwotCQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCQlsb2NhdGlvbiAgIAkoMzM0LCA0NjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvc3VidHlwZSIgQDI0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMAotCQkJICAgIGxvY2F0aW9uICAgCSgtMzMwLCAyMTcpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNQotCQkJCVBhcmVudF9WaWV3IAlAMjQKLQkJCQlsb2NhdGlvbiAgIAkoMjU3LCA1ODIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE4OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiKy9zdWJ0eXBlIgotCQkJCXBjdERpc3QgICAgCTAuNTMyNDY4Ci0JCQkJaGVpZ2h0ICAgICAJMjQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBOUVCOTAwOTgiCi0JCQkgICAgY2xpZW50ICAgICAJQDIwCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE2NiwgNTM3KQotCQkJCSgxNjYsIDU1OCkKLQkJCQkoMzU2LCA1NTgpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NiwgNTM3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTYsIDU1OCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNgotCQkJCVBhcmVudF9WaWV3IAlAMjQKLQkJCQlsb2NhdGlvbiAgIAkoMzM0LCA2MTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEAyNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzkyLCA1NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI3Ci0JCQlsb2NhdGlvbiAgIAkoMTI2MSwgNTMwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIHdpZHRoICAgICAgCTI4MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiSW1wbGVtZW50cyIgQDI4Ci0JCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCA1MjEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEEwRDcwMjQyIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbXBsZW1lbnRzSW50ZXJmYWNlcyIgQDI5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOAotCQkJICAgIGxvY2F0aW9uICAgCSg0MzAsIC01NCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJCWxvY2F0aW9uICAgCSg4MzksIDQ4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDA3Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW1wbGVtZW50c0ludGVyZmFjZXMiCi0JCQkJcGN0RGlzdCAgICAJLTAuMzQzNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMzQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTBEQTAxMDkiCi0JCQkgICAgY2xpZW50ICAgICAJQDI4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQ0LCA1MjEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNTIsIDUyMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMQotCQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCQlsb2NhdGlvbiAgIAkoMTE4MSwgNDg1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjc3MzAwNgotCQkJCWhlaWdodCAgICAgCTM3Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW1wbGVtZW50ZWRCeSIgQDMyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOAotCQkJICAgIGxvY2F0aW9uICAgCSg0MzAsIC01NCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzCi0JCQkJUGFyZW50X1ZpZXcgCUAzMgotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCA1NzUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMxMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ltcGxlbWVudGVkQnkiCi0JCQkJcGN0RGlzdCAgICAJLTAuNDcwNzY5Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTBEQTAxMzgiCi0JCQkgICAgY2xpZW50ICAgICAJQDI4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQ0LCA1MjEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYzNiwgNTIxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Ci0JCQkJUGFyZW50X1ZpZXcgCUAzMgotCQkJCWxvY2F0aW9uICAgCSg2ODQsIDU2NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC44NDMyMzAKLQkJCQloZWlnaHQgICAgIAk0MwotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDM1Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgNjAxKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkE5RjAzMDFBQyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiL3N1cGVydHlwZSIgQDM2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNQotCQkJICAgIGxvY2F0aW9uICAgCSgzNTgsIDI2NSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNgotCQkJCWxvY2F0aW9uICAgCSgxNzIxLCA2NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIyNgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiKy9zdXBlcnR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC4yMjcyNzMKLQkJCQloZWlnaHQgICAgIAkxMwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkE5RjA5MDMyOCIKLQkJCSAgICBjbGllbnQgICAgIAlAMzUKLQkJCSAgICBzdXBwbGllciAgIAlAMjcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTc1MCwgNjAxKQotCQkJCSgxNzUwLCA2MjcpCi0JCQkJKDE1MzIsIDYyNykpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgNjAxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTMyLCA2MjcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgKLQkJCQlQYXJlbnRfVmlldyAJQDM2Ci0JCQkJbG9jYXRpb24gICAJKDE1NTcsIDU3NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIi9zdWJ0eXBlIiBAMzkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Ci0JCQkgICAgbG9jYXRpb24gICAJKDM1OCwgMjY1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDAKLQkJCQlQYXJlbnRfVmlldyAJQDM5Ci0JCQkJbG9jYXRpb24gICAJKDE2MjYsIDU1MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTg4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrL3N1YnR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC42MTU5NzAKLQkJCQloZWlnaHQgICAgIAkyNAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkE5RjBBMDAxQyIKLQkJCSAgICBjbGllbnQgICAgIAlAMzUKLQkJCSAgICBzdXBwbGllciAgIAlAMjcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTc1MCwgNjAxKQotCQkJCSgxNzUwLCA1NzYpCi0JCQkJKDE1MzIsIDU3NikpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgNjAxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTMyLCA1NzYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDEKLQkJCQlQYXJlbnRfVmlldyAJQDM5Ci0JCQkJbG9jYXRpb24gICAJKDE1NTcsIDYzMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JICAgIHF1aWQgICAgICAgCSIzODEwOUY5MjAwMEIiCi0JICAgIHRpdGxlICAgICAgCSJNYWluIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkyNzYwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgTm90ZVZpZXcgQDQyCi0JCSAgICBsb2NhdGlvbiAgIAkoODQ4LCAxODQwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MgotCQkJbG9jYXRpb24gICAJKDU1MSwgMTcxOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk0Ci0JCQltYXhfd2lkdGggIAk1NTkKLQkJCWxhYmVsICAgICAgCSJUaGlzIHNob3VsZCByZWFsbHkgYmUgSmF2YUNsYXNzIGFuZCBKYXZhRGF0YVR5cGUsIGVDbGFzc2lmaWVyIGlzIHRoZWlyIGNsb3Nlc3QgY29tbW9uIGFuY2VzdG9yLiIpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAk4NDIxNjMxCi0JCSAgICB3aWR0aCAgICAgIAk2MTkKLQkJICAgIGhlaWdodCAgICAgCTI1NikKLQkJKG9iamVjdCBOb3RlVmlldyBANDMKLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDMyMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDMKLQkJCWxvY2F0aW9uICAgCSgxMDcsIDE2NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk2Ci0JCQltYXhfd2lkdGggIAkyOTUKLQkJCWxhYmVsICAgICAgCSJUaGUgY2xhc3NlcyB3aWxsIGJlIGNvbnRhaW5lZCBieSB0aGUgc3RhbmRhcmQgRVBhY2thZ2UgbWV0YU9iamVjdHMgcmVsYXRpb25zaGlwLiIpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJMzU1Ci0JCSAgICBoZWlnaHQgICAgIAkzMjApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiIEA0NAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzc2LCA0ODApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ0Ci0JCQlsb2NhdGlvbiAgIAkoMTY4MCwgNDM0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkZpZWxkIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICB3aWR0aCAgICAgIAkyMTAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpJbml0aWFsaXplciIgQDQ1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE1NjgsIDIyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDUKLQkJCWxvY2F0aW9uICAgCSgxMzYzLCAxNTEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDEwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW5pdGlhbGl6ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBNURDMDBCQiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDQ1Ci0JCQlsb2NhdGlvbiAgIAkoMTM2MywgMjA3KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTM0NSkKLQkJICAgIHdpZHRoICAgICAgCTQyOAotCQkgICAgaGVpZ2h0ICAgICAJMTY4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYWNrYWdlIiBANDYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNjA4LCA5NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDYKLQkJCWxvY2F0aW9uICAgCSg0NDcsIDUwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFQYWNrYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgxMDhFMDMwMUQyIgotCQkgICAgd2lkdGggICAgICAJMzQwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIgQDQ3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3NDQsIDE1ODQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ3Ci0JCQlsb2NhdGlvbiAgIAkoMTM0NCwgMTQ4OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk4MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFyYW1ldGVyIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFENzgwMjgwIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANDcKLQkJCWxvY2F0aW9uICAgCSgxMzQ0LCAxNTQ0KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTMKLQkJCW1heF93aWR0aCAgCTY3OCkKLQkJICAgIHdpZHRoICAgICAgCTgxOAotCQkgICAgaGVpZ2h0ICAgICAJMjE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIgQDQ4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3MTIsIDk5MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCWxvY2F0aW9uICAgCSgxNjEzLCA5NDYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICB3aWR0aCAgICAgIAkyMTYKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIk1ldGhvZEhhcyIgQDQ5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTcwMCwgMTI2MikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUYwMzAyQ0UiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZCIgQDUwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OQotCQkJICAgIGxvY2F0aW9uICAgCSgzMDgsIDIzOCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjA4MDE5NyIKLQkJCSAgICBjbGllbnQgICAgIAlANDkKLQkJCSAgICBzdXBwbGllciAgIAlANDgKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAwLCAxMjYyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAwLCAxMDQ5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxCi0JCQkJUGFyZW50X1ZpZXcgCUA1MAotCQkJCWxvY2F0aW9uICAgCSgxNjMzLCAxMDk3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjc4MTY1OQotCQkJCWhlaWdodCAgICAgCTY4Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAicGFyYW1ldGVycyIgQDUyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OQotCQkJICAgIGxvY2F0aW9uICAgCSgzMDgsIDIzOCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzCi0JCQkJUGFyZW50X1ZpZXcgCUA1MgotCQkJCWxvY2F0aW9uICAgCSgxODM3LCAxNDMzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMzUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwYXJhbWV0ZXJzIgotCQkJCXBjdERpc3QgICAgCTAuODAzNTY1Ci0JCQkJaGVpZ2h0ICAgICAJMTM3Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGMDgwMTk2IgotCQkJICAgIGNsaWVudCAgICAgCUA0OQotCQkJICAgIHN1cHBsaWVyICAgCUA0NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3MDAsIDEyNjIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDAsIDE0NzYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQKLQkJCQlQYXJlbnRfVmlldyAJQDUyCi0JCQkJbG9jYXRpb24gICAJKDE2MzYsIDE0NTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTA1MTI4Ci0JCQkJaGVpZ2h0ICAgICAJNjUKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NQotCQkJCVBhcmVudF9WaWV3IAlANTIKLQkJCQlsb2NhdGlvbiAgIAkoMTU5MiwgMTM5NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC42Mjg4MjEKLQkJCQloZWlnaHQgICAgIAkxMDkKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhRXZlbnQiIEA1NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMTkyLCA2NTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTYKLQkJCWxvY2F0aW9uICAgCSgyMDY0LCA2MDcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjU2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUV2ZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkFGMTAzQzgiCi0JCSAgICB3aWR0aCAgICAgIAkyNzQKLQkJICAgIGhlaWdodCAgICAgCTEyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEA1NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDY3MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTcKLQkJCWxvY2F0aW9uICAgCSgzNzQsIDU1NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDU3Ci0JCQlsb2NhdGlvbiAgIAkoMzc0LCA2MTApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJMzEzKQotCQkgICAgd2lkdGggICAgICAJMzkwCi0JCSAgICBoZWlnaHQgICAgIAkyNTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBANTgKLQkJICAgIGxvY2F0aW9uICAgCSgxMjEzLCA1MzgpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QkQwMjE5IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEA1OQotCQkJICAgIFBhcmVudF9WaWV3IAlANTgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzMzLCAyODIpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MAotCQkJCVBhcmVudF9WaWV3IAlANTkKLQkJCQlsb2NhdGlvbiAgIAkoMTUxMSwgNTEzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitmaWVsZHMiCi0JCQkJcGN0RGlzdCAgICAJMC42NTMwMTcKLQkJCQloZWlnaHQgICAgIAkyNgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MkEyOUJFMDM1MCIKLQkJCSAgICBjbGllbnQgICAgIAlANTgKLQkJCSAgICBzdXBwbGllciAgIAlANDQKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEzLCA1MzgpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzEsIDUzOCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MQotCQkJCVBhcmVudF9WaWV3IAlANTkKLQkJCQlsb2NhdGlvbiAgIAkoMTYyNCwgNDg1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YUNsYXNzIiBANjIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Ci0JCQkgICAgbG9jYXRpb24gICAJKDczMywgMjgyKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MkEyOUJFMDNCRiIKLQkJCSAgICBjbGllbnQgICAgIAlANTgKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEzLCA1MzgpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc1NSwgNTM4KSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDYzCi0JCSAgICBsb2NhdGlvbiAgIAkoOTE2LCAzMDcpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQUEwOTUwM0U1IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0aWFsaXplcnMiIEA2NAotCQkJICAgIFBhcmVudF9WaWV3IAlANjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc2LCA5OSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY1Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJCWxvY2F0aW9uICAgCSgxMDk2LCAyMTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIxMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2luaXRpYWxpemVycyIKLQkJCQlwY3REaXN0ICAgIAkwLjQxMDcxOQotCQkJCWhlaWdodCAgICAgCTkyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUEwOTcwMTUzIgotCQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkJICAgIHN1cHBsaWVyICAgCUA0NQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkxNiwgMzA3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU0LCAzMDcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYKLQkJCQlQYXJlbnRfVmlldyAJQDY0Ci0JCQkJbG9jYXRpb24gICAJKDEzNDUsIDM2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45Nzk2ODcKLQkJCQloZWlnaHQgICAgIAk2MQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImphdmFDbGFzcyIgQDY3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSgyNzYsIDk5KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMDk3MDE1RCIKLQkJCSAgICBjbGllbnQgICAgIAlANjMKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoOTE2LCAzMDcpCi0JCQkJKDcxMywgMzA3KQotCQkJCSg3MTMsIDU0MykpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTE2LCAzMDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcxMywgNTQzKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDY4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjA2LCA2NDIpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQUEyMTIwMEMyIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZWNsYXJlZENsYXNzZXMiIEA2OQotCQkJICAgIFBhcmVudF9WaWV3IAlANjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU3OCwgMjc0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAKLQkJCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQkJbG9jYXRpb24gICAJKDI0MCwgNTgyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMjUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitkZWNsYXJlZENsYXNzZXMiCi0JCQkJcGN0RGlzdCAgICAJMC4zNDMxOTUKLQkJCQloZWlnaHQgICAgIAkzMQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMjE3MDFEOCIKLQkJCSAgICBjbGllbnQgICAgIAlANjgKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMjA2LCA2NDIpCi0JCQkJKDIwNiwgNjEyKQotCQkJCSgzNjUsIDYxMikpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA2LCA2NDIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2NSwgNjEyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxCi0JCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCWxvY2F0aW9uICAgCSgzNDcsIDU1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDIzNjcKLQkJCQloZWlnaHQgICAgIAk1NwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImRlY2xhcmluZ0NsYXNzIiBANzIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ci0JCQkgICAgbG9jYXRpb24gICAJKC01NzgsIDI3NCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczCi0JCQkJUGFyZW50X1ZpZXcgCUA3MgotCQkJCWxvY2F0aW9uICAgCSgyNTgsIDY3NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjk4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZGVjbGFyaW5nQ2xhc3MiCi0JCQkJcGN0RGlzdCAgICAJMC40MzQyODYKLQkJCQloZWlnaHQgICAgIAkzCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUEyMTcwMkRDIgotCQkJICAgIGNsaWVudCAgICAgCUA2OAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMDYsIDY0MikKLQkJCQkoMjA2LCA2NzIpCi0JCQkJKDM2NSwgNjcyKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDYsIDY0MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY1LCA2NzIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQKLQkJCQlQYXJlbnRfVmlldyAJQDcyCi0JCQkJbG9jYXRpb24gICAJKDM0NSwgNzI2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBANzUKLQkJICAgIGxvY2F0aW9uICAgCSg2MDMsIDM0NykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANzYKLQkJCVBhcmVudF9WaWV3IAlANzUKLQkJCWxvY2F0aW9uICAgCSg2MDMsIDIyOCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlhbmNob3IgICAgIAkxMAotCQkJYW5jaG9yX2xvYyAJMQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDUwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxkZXJpdmVkPj4iCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJaGVpZ2h0ICAgICAJMTIwCi0JCQlvcmllbnRhdGlvbiAJMCkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTJBNzAxQzEiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImphdmFDbGFzc2VzIiBANzcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Ci0JCQkgICAgbG9jYXRpb24gICAJKDI3LCAyMTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OAotCQkJCVBhcmVudF9WaWV3IAlANzcKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA0MTkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2phdmFDbGFzc2VzIgotCQkJCXBjdERpc3QgICAgCTAuMzY3NTIxCi0JCQkJaGVpZ2h0ICAgICAJMTE3Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUEyQTgwMzY3IgotCQkJICAgIGNsaWVudCAgICAgCUA3NQotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDYwMywgMzQ3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDMsIDU0MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQotCQkJCVBhcmVudF9WaWV3IAlANzcKLQkJCQlsb2NhdGlvbiAgIAkoNjU3LCA1MjIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhUGFja2FnZSIgQDgwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NQotCQkJICAgIGxvY2F0aW9uICAgCSgyNywgMjE5KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEKLQkJCQlQYXJlbnRfVmlldyAJQDgwCi0JCQkJbG9jYXRpb24gICAJKDQ4MiwgMTc5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNjMKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitqYXZhUGFja2FnZSIKLQkJCQlwY3REaXN0ICAgIAkwLjg2MjkwMwotCQkJCWhlaWdodCAgICAgCTEyMgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMkE5MDA4MyIKLQkJCSAgICBjbGllbnQgICAgIAlANzUKLQkJCSAgICBzdXBwbGllciAgIAlANDYKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDMsIDM0NykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAzLCAxNTIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIKLQkJCQlQYXJlbnRfVmlldyAJQDgwCi0JCQkJbG9jYXRpb24gICAJKDY1NywgMTcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAODMKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUA0MwotCQkgICAgc3VwcGxpZXIgICAJQDc1Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDg0Ci0JCSAgICBsb2NhdGlvbiAgIAkoNjE2LCAxNTI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NQotCQkJUGFyZW50X1ZpZXcgCUA4NAotCQkJbG9jYXRpb24gICAJKDYxNiwgMTQ2NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCWFuY2hvciAgICAgCTEKLQkJCWFuY2hvcl9sb2MgCTEKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIiIKLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQloZWlnaHQgICAgIAk2MAotCQkJb3JpZW50YXRpb24gCTApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEIwODgwMUE1IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvdHlwZWRFbGVtZW50IiBAODYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDg0Ci0JCQkgICAgbG9jYXRpb24gICAJKDU2LCA5NDgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QjA5MTAwOEMiCi0JCQkgICAgY2xpZW50ICAgICAJQDg0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDYxNiwgMTUyNCkKLQkJCQkoNjE2LCAxNTg0KQotCQkJCSgxMzM1LCAxNTg0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTYsIDE1MjQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMzUsIDE1ODQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODcKLQkJCQlQYXJlbnRfVmlldyAJQDg2Ci0JCQkJbG9jYXRpb24gICAJKDEyNTYsIDE1MzEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvdHlwZSIgQDg4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA4NAotCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgOTQ4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkKLQkJCQlQYXJlbnRfVmlldyAJQDg4Ci0JCQkJbG9jYXRpb24gICAJKDY5NywgMTA5OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTE2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrL3R5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC41ODgxNjEKLQkJCQloZWlnaHQgICAgIAk4MQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRCMDkxMDA3RCIKLQkJCSAgICBjbGllbnQgICAgIAlAODQKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTYsIDE1MjQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYxNiwgODAxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDkwCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgOTYxKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MkEyOUMwMDE3RCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kcyIgQDkxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5MAotCQkJICAgIGxvY2F0aW9uICAgCSg2MDgsIDcwNSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQotCQkJCWxvY2F0aW9uICAgCSgxNDA5LCA4ODkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5MgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK21ldGhvZHMiCi0JCQkJcGN0RGlzdCAgICAJMC42MjQwMjMKLQkJCQloZWlnaHQgICAgIAk3MwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MkEyOUMxMDE3NCIKLQkJCSAgICBjbGllbnQgICAgIAlAOTAKLQkJCSAgICBzdXBwbGllciAgIAlANDgKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg4LCA5NjEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDQsIDk2MSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MwotCQkJCVBhcmVudF9WaWV3IAlAOTEKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4MywgMTAxNykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC43NjYwNDAKLQkJCQloZWlnaHQgICAgIAk1NgotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImphdmFDbGFzcyIgQDk0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5MAotCQkJICAgIGxvY2F0aW9uICAgCSg2MDgsIDcwNSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlDMTAyMEEiCi0JCQkgICAgY2xpZW50ICAgICAJQDkwCi0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEwODgsIDk2MSkKLQkJCQkoNzMyLCA5NjEpCi0JCQkJKDczMiwgODAxKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg4LCA5NjEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDczMiwgODAxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiTWV0aG9kVGhyb3dzIiBAOTUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDQ3LCA5ODEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgxMEI2MUIwMTc4IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2QiIEA5NgotCQkJICAgIFBhcmVudF9WaWV3IAlAOTUKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDg3LCA0MDUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgxMEI2MUUwMjI3IgotCQkJICAgIGNsaWVudCAgICAgCUA5NQotCQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNDcsIDk4MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwNCwgOTgxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImphdmFFeGNlcHRpb25zIiBAOTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ4NywgNDA1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTgKLQkJCQlQYXJlbnRfVmlldyAJQDk3Ci0JCQkJbG9jYXRpb24gICAJKDczMywgOTQ1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitqYXZhRXhjZXB0aW9ucyIKLQkJCQlwY3REaXN0ICAgIAkwLjU2MzY2NAotCQkJCWhlaWdodCAgICAgCTM3Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgxMEI2MUUwMUMzIgotCQkJICAgIGNsaWVudCAgICAgCUA5NQotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMDQ3LCA5ODEpCi0JCQkJKDY2OSwgOTgxKQotCQkJCSg2NjksIDgwMSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA0NywgOTgxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjksIDgwMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OQotCQkJCVBhcmVudF9WaWV3IAlAOTcKLQkJCQlsb2NhdGlvbiAgIAkoNzIzLCA4NTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExIiBAMTAwCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU0MSwgODA2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0M2MkZCRTAwMTY4IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJldmVudHMiIEAxMDEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMAotCQkJICAgIGxvY2F0aW9uICAgCSg5ODEsIDEzNCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMgotCQkJCVBhcmVudF9WaWV3IAlAMTAxCi0JCQkJbG9jYXRpb24gICAJKDIxNjksIDc2NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTQ0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZXZlbnRzIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkJFMjAwOEYiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwMAotCQkJICAgIHN1cHBsaWVyICAgCUA1NgotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNTQxLCA4MDYpCi0JCQkJKDIyMzgsIDgwNikKLQkJCQkoMjIzOCwgNzE3KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQxLCA4MDYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyMzgsIDcxNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMKLQkJCQlQYXJlbnRfVmlldyAJQDEwMQotCQkJCWxvY2F0aW9uICAgCSgyMjkyLCA3OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMiIgQDEwNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwCi0JCQkgICAgbG9jYXRpb24gICAJKDk4MSwgMTM0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQkUyMDA5MSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTAwCi0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0MSwgODA2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTUsIDgwNikpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzIiBAMTA1Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTQwNSwgNjYzKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0M4OTM4NzcwMjUzIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhbGxFdmVudHMiIEAxMDYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNQotCQkJICAgIGxvY2F0aW9uICAgCSg4NDUsIC05KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMDYKLQkJCQlsb2NhdGlvbiAgIAkoMTkyNSwgNjIyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTMKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIithbGxFdmVudHMiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDODkzODc4MDJDQyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTA1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU2Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQwNSwgNjYzKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDU1LCA2NjMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMDYKLQkJCQlsb2NhdGlvbiAgIAkoMTk3NSwgNzAyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjg3NjMzNgotCQkJCWhlaWdodCAgICAgCTM5Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxMDkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNQotCQkJICAgIGxvY2F0aW9uICAgCSg4NDUsIC05KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDODkzODc4MDJDRSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTA1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQwNSwgNjYzKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTUsIDY2MykpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzaWZpZXIiIEAxMTAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCAyMjU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExMAotCQkJbG9jYXRpb24gICAJKDEzMCwgMjA1OSkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYzNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVDbGFzc2lmaWVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzQUNFNEZFRTAzNzEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMTAKLQkJCWxvY2F0aW9uICAgCSgxMzAsIDIxNjIpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTUzOCkKLQkJICAgIHdpZHRoICAgICAgCTY1NAotCQkgICAgaGVpZ2h0ICAgICAJNDE4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkFycmF5VHlwZSIgQDExMQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzNTIsIDEzMjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExMQotCQkJbG9jYXRpb24gICAJKDExMiwgMTI1NSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0ODAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJBcnJheVR5cGUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTlENzlFRDAxREYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMTEKLQkJCWxvY2F0aW9uICAgCSgxMTIsIDEzMTEpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNDA1KQotCQkgICAgd2lkdGggICAgICAJNDk4Ci0JCSAgICBoZWlnaHQgICAgIAkxNjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBOUQ3OUZEMDEwRiIKLQkJICAgIGNsaWVudCAgICAgCUAxMTEKLQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0MzEsIDEyNDMpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDMxLCA4MDEpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEAxMTMKLQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDE3MjkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzREY0Q0FBRDAxQTMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbXBvbmVudFR5cGUiIEAxMTQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJICAgIGxvY2F0aW9uICAgCSgtNTUsIDM4NSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQotCQkJCVBhcmVudF9WaWV3IAlAMTE0Ci0JCQkJbG9jYXRpb24gICAJKDM3OCwgMTk4NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzI4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrY29tcG9uZW50VHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0RGNENBQUUwMUVCIgotCQkJICAgIGNsaWVudCAgICAgCUAxMTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTEwCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNgotCQkJCVBhcmVudF9WaWV3IAlAMTE0Ci0JCQkJbG9jYXRpb24gICAJKDQ3NywgMjAwOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBAMTE3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU1LCAzODUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0RGNENBQUUwMUY1IgotCQkJICAgIGNsaWVudCAgICAgCUAxMTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTExCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUiIEAxMTgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIyNCwgMjI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExOAotCQkJbG9jYXRpb24gICAJKDIwMzMsIDE0NSkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM4MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVTdHJ1Y3R1cmFsRmVhdHVyZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1OUQwMjMwIgotCQkgICAgd2lkdGggICAgICAJNDAwCi0JCSAgICBoZWlnaHQgICAgIAkxODIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExOQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNERjRDRTgzMDM5MCIKLQkJICAgIGNsaWVudCAgICAgCUA1NgotCQkgICAgc3VwcGxpZXIgICAJQDExOAotCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJJbXBvcnRzIgotCSAgICBxdWlkICAgICAgIAkiMzgxMEEwREMwMTVEIgotCSAgICB0aXRsZSAgICAgIAkiSW1wb3J0cyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDEyMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMjAsIDY3MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTIwCi0JCQlsb2NhdGlvbiAgIAkoMTg5LCA2MjYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICB3aWR0aCAgICAgIAkyODAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIkNsYXNzSW1wb3J0cyIgQDEyMQotCQkgICAgbG9jYXRpb24gICAJKDY0MywgMTExNSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyCi0JCQlQYXJlbnRfVmlldyAJQDEyMQotCQkJbG9jYXRpb24gICAJKDY3NywgMTA0MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWFuY2hvciAgICAgCTEKLQkJCWFuY2hvcl9sb2MgCTEKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkNsYXNzSW1wb3J0cyIKLQkJCXBjdERpc3QgICAgCTEuMDY2NjY3Ci0JCQloZWlnaHQgICAgIAk3NgotCQkJb3JpZW50YXRpb24gCTApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgyOUM0QkYwMDBEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjbGFzc0ltcG9ydCIgQDEyMwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNywgMzMxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjMKLQkJCQlsb2NhdGlvbiAgIAkoNjY1LCA2NzEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2NsYXNzSW1wb3J0IgotCQkJCXBjdERpc3QgICAgCTAuNzI3MTU0Ci0JCQkJaGVpZ2h0ICAgICAJMgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEJGMDAwRSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg2NDMsIDExMTUpCi0JCQkJKDcwMywgMTExNSkKLQkJCQkoNzAzLCA2NzIpCi0JCQkJKDQ2MCwgNjcyKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDMsIDExMTUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ2MCwgNjcyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNQotCQkJCVBhcmVudF9WaWV3IAlAMTIzCi0JCQkJbG9jYXRpb24gICAJKDUyNSwgNzIzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkxNDY3NgotCQkJCWhlaWdodCAgICAgCTUxCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjMKLQkJCQlsb2NhdGlvbiAgIAkoNzQyLCA3MzcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuNTg3NDY3Ci0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbXBvcnRlZEJ5IiBAMTI3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3LCAzMzEpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgKLQkJCQlQYXJlbnRfVmlldyAJQDEyNwotCQkJCWxvY2F0aW9uICAgCSgzMzAsIDkzNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW1wb3J0ZWRCeSIKLQkJCQlwY3REaXN0ICAgIAkwLjcwODA0MAotCQkJCWhlaWdodCAgICAgCTEwCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyOUM0QkYwMDBGIgotCQkJICAgIGNsaWVudCAgICAgCUAxMjEKLQkJCSAgICBzdXBwbGllciAgIAlAMTIwCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDY0MywgMTExNSkKLQkJCQkoMzIwLCAxMTE1KQotCQkJCSgzMjAsIDcyOSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjQzLCAxMTE1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMjAsIDcyOSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkKLQkJCQlQYXJlbnRfVmlldyAJQDEyNwotCQkJCWxvY2F0aW9uICAgCSgyODAsIDgwMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC44OTc2MTEKLQkJCQloZWlnaHQgICAgIAk0MQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYWNrYWdlIiBAMTMwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE0MDgsIDIyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTMwCi0JCQlsb2NhdGlvbiAgIAkoMTI0NywgMTc4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFQYWNrYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwOEUwMzAxRDIiCi0JCSAgICB3aWR0aCAgICAgIAkzNDAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIlBhY2thZ2VJbXBvcnRzIiBAMTMxCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAyMywgMzgyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIKLQkJCVBhcmVudF9WaWV3IAlAMTMxCi0JCQlsb2NhdGlvbiAgIAkoMTAzOCwgNDE5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJYW5jaG9yICAgICAJMQotCQkJYW5jaG9yX2xvYyAJMQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFja2FnZUltcG9ydHMiCi0JCQlwY3REaXN0ICAgIAkwLjc1MDAwMAotCQkJaGVpZ2h0ICAgICAJMzcKLQkJCW9yaWVudGF0aW9uIAkxKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEVDMDIwNyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaW1wb3J0ZWRCeSIgQDEzMwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxCi0JCQkgICAgbG9jYXRpb24gICAJKC00MTcsIC0zMDYpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQKLQkJCQlQYXJlbnRfVmlldyAJQDEzMwotCQkJCWxvY2F0aW9uICAgCSg2NDgsIDQzMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW1wb3J0ZWRCeSIKLQkJCQlwY3REaXN0ICAgIAkwLjY0NjUyNgotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyOUM0RUUwMTA1IgotCQkJICAgIGNsaWVudCAgICAgCUAxMzEKLQkJCSAgICBzdXBwbGllciAgIAlAMTIwCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEwMjMsIDM4MikKLQkJCQkoMTAyMywgMjU1KQotCQkJCSg0MTMsIDYxNCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNQotCQkJCVBhcmVudF9WaWV3IAlAMTMzCi0JCQkJbG9jYXRpb24gICAJKDUxMiwgNjE4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAicGFja2FnZUltcG9ydHMiIEAxMzYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDE3LCAtMzA2KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTIyMywgNTc5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwYWNrYWdlSW1wb3J0cyIKLQkJCQlwY3REaXN0ICAgIAkwLjUyMjQ3MgotCQkJCWhlaWdodCAgICAgCTQwCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyOUM0RUUwMEZCIgotCQkJICAgIGNsaWVudCAgICAgCUAxMzEKLQkJCSAgICBzdXBwbGllciAgIAlAMTMwCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEwMjMsIDM4MikKLQkJCQkoMTAyMywgNjE4KQotCQkJCSgxMjY1LCA2MTgpCi0JCQkJKDEzODYsIDI4MSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOAotCQkJCVBhcmVudF9WaWV3IAlAMTM2Ci0JCQkJbG9jYXRpb24gICAJKDE0MDksIDM3OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOQotCQkJCVBhcmVudF9WaWV3IAlAMTM2Ci0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDUwMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC43Njk2NjMKLQkJCQloZWlnaHQgICAgIAkxMDkKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJTb3VyY2UgY29kZSIKLQkgICAgcXVpZCAgICAgICAJIjM4MTBBMTNCMDE1OSIKLQkgICAgdGl0bGUgICAgICAJIlNvdXJjZSBjb2RlIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6Q29tbWVudCIgQDE0MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDY4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTQwCi0JCQlsb2NhdGlvbiAgIAkoNDc1LCA2NDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjM0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQ29tbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4OUIwMkI4IgotCQkgICAgd2lkdGggICAgICAJMjUyCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6U3RhdGVtZW50IiBAMTQxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDExMDQsIDY4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTQxCi0JCQlsb2NhdGlvbiAgIAkoOTgzLCA2NDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjQyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU3RhdGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODhCOTAyNUEiCi0JCSAgICB3aWR0aCAgICAgIAkyNjAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpJbml0aWFsaXplciIgQDE0MgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNDQsIDI4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTQyCi0JCQlsb2NhdGlvbiAgIAkoMzMsIDI0MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbml0aWFsaXplciIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBNURDMDBCQiIKLQkJICAgIHdpZHRoICAgICAgCTI0MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIiBAMTQzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI1NiwgMTEyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNDMKLQkJCWxvY2F0aW9uICAgCSgxNjAsIDY2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkZpZWxkIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIgotCQkgICAgd2lkdGggICAgICAJMjEwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siIEAxNDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODY0LCAzNTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0NAotCQkJbG9jYXRpb24gICAJKDY5MiwgMjU2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkJsb2NrIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNDQKLQkJCWxvY2F0aW9uICAgCSg2OTIsIDMxMikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAkyOTApCi0JCSAgICB3aWR0aCAgICAgIAkzNjIKLQkJICAgIGhlaWdodCAgICAgCTIxNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0NQotCQkgICAgbG9jYXRpb24gICAJKDg2NCwgNTgwKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUAxNDQKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDg2NCwgNTgwKQotCQkJKDg2NCwgNDU5KSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4OEQ2MDBBNSIKLQkJICAgIGNsaWVudCAgICAgCUAxNDAKLQkJICAgIHN1cHBsaWVyICAgCUAxNDQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTgxLCA2MzEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTgxLCA1ODApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNDUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4OERBMDA1NiIKLQkJICAgIGNsaWVudCAgICAgCUAxNDEKLQkJICAgIHN1cHBsaWVyICAgCUAxNDQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTEyMSwgNjMwKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMjEsIDU4MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDE0NSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEAxNDgKLQkJICAgIGxvY2F0aW9uICAgCSg0NzMsIDMwMCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUMzMzAzNkEiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInNvdXJjZSIgQDE0OQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4Ci0JCQkgICAgbG9jYXRpb24gICAJKDE1MywgLTM4OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MAotCQkJCVBhcmVudF9WaWV3IAlAMTQ5Ci0JCQkJbG9jYXRpb24gICAJKDU5OSwgMjY3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzb3VyY2UiCi0JCQkJcGN0RGlzdCAgICAJMC41OTkzOTMKLQkJCQloZWlnaHQgICAgIAkzNAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQzM4MDE0MCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTQ4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ3MywgMzAwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODMsIDMwMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTEKLQkJCQlQYXJlbnRfVmlldyAJQDE0OQotCQkJCWxvY2F0aW9uICAgCSg2MDUsIDMzNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42MzUyNjYKLQkJCQloZWlnaHQgICAgIAkzNAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImluaXRpYWxpemVyIiBAMTUyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzLCAtMzg4KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQzM4MDE2OCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTQ4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE0MgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ3MywgMzAwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjQsIDMwMCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEAxNTMKLQkJICAgIGxvY2F0aW9uICAgCSg2NzEsIDExNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU0Ci0JCQlQYXJlbnRfVmlldyAJQDE1MwotCQkJbG9jYXRpb24gICAJKDY3MSwgNTUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQloaWRkZW4gICAgIAlUUlVFCi0JCQlhbmNob3IgICAgIAkxCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIiIKLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQloZWlnaHQgICAgIAk2MAotCQkJb3JpZW50YXRpb24gCTApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDNTYwMkEyIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0aWFsaXplciIgQDE1NQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzCi0JCQkgICAgbG9jYXRpb24gICAJKDMxOSwgLTMzNCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NgotCQkJCVBhcmVudF9WaWV3IAlAMTU1Ci0JCQkJbG9jYXRpb24gICAJKDk1NCwgMjEwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbml0aWFsaXplciIKLQkJCQlwY3REaXN0ICAgIAkwLjg5MTgyNwotCQkJCWhlaWdodCAgICAgCTEwNAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQzU3MDJERiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTUzCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg2NzEsIDExNCkKLQkJCQkoODUwLCAxMTQpCi0JCQkJKDg1MCwgMjQ1KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzEsIDExNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODUwLCAyNDUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNTUKLQkJCQlsb2NhdGlvbiAgIAkoNzkwLCAyMTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTEzNDYyCi0JCQkJaGVpZ2h0ICAgICAJNjEKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmaWVsZCIgQDE1OAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzCi0JCQkgICAgbG9jYXRpb24gICAJKDMxOSwgLTMzNCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUM1NzAzMDciCi0JCQkgICAgY2xpZW50ICAgICAJQDE1MwotCQkJICAgIHN1cHBsaWVyICAgCUAxNDMKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzEsIDExNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzYxLCAxMTQpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIiBAMTU5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI4OCwgNDk2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNTkKLQkJCWxvY2F0aW9uICAgCSgxOTAsIDQ1MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxOTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2QiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICB3aWR0aCAgICAgIAkyMTQKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBAMTYwCi0JCSAgICBsb2NhdGlvbiAgIAkoNTk2LCA0OTYpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDQTUwMUU3IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzb3VyY2UiIEAxNjEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MAotCQkJICAgIGxvY2F0aW9uICAgCSgyNzYsIC00NDgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjIKLQkJCQlQYXJlbnRfVmlldyAJQDE2MQotCQkJCWxvY2F0aW9uICAgCSg2OTAsIDQ2MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTQ1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrc291cmNlIgotCQkJCXBjdERpc3QgICAgCTAuNDc0Nzc3Ci0JCQkJaGVpZ2h0ICAgICAJMzQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUNBNzAxN0MiCi0JCQkgICAgY2xpZW50ICAgICAJQDE2MAotCQkJICAgIHN1cHBsaWVyICAgCUAxNDQKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNTk2LCA0OTYpCi0JCQkJKDc1OSwgNDk2KQotCQkJCSg3NTksIDQ1OSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTk2LCA0OTYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc1OSwgNDU5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MwotCQkJCVBhcmVudF9WaWV3IAlAMTYxCi0JCQkJbG9jYXRpb24gICAJKDgxNywgNDc3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkxNTM2NwotCQkJCWhlaWdodCAgICAgCTU4Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kIiBAMTY0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc2LCAtNDQ4KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQ0E3MDFCOCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTYwCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1OQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU5NiwgNDk2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTUsIDQ5NikpKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJEYXRhIFR5cGVzIgotCSAgICBxdWlkICAgICAgIAkiMzgxMEExQ0UwMkVCIgotCSAgICB0aXRsZSAgICAgIAkiRGF0YSBUeXBlcyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OlR5cGVLaW5kIiBAMTY1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI0MCwgMjI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjUKLQkJCWxvY2F0aW9uICAgCSg3NywgODQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzI2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiVHlwZUtpbmQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY1Ci0JCQlsb2NhdGlvbiAgIAkoNzcsIDM5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRCNDYwMDJCRiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJbG9jYXRpb24gICAJKDc3LCAxNDApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNQotCQkJbWF4X3dpZHRoICAJMjc3KQotCQkgICAgd2lkdGggICAgICAJMzQ0Ci0JCSAgICBoZWlnaHQgICAgIAkzOTIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVZpc2liaWxpdHlLaW5kIiBAMTY2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI0MCwgNjQwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjYKLQkJCWxvY2F0aW9uICAgCSg2OCwgNTAwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFWaXNpYmlsaXR5S2luZCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjYKLQkJCWxvY2F0aW9uICAgCSg2OCwgNDU1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MjMzM0JFMDMyRSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE2NgotCQkJbG9jYXRpb24gICAJKDY4LCA1NTYpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNQotCQkJbWF4X3dpZHRoICAJMjkyKQotCQkgICAgd2lkdGggICAgICAJMzYyCi0JCSAgICBoZWlnaHQgICAgIAkzOTIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgTm90ZVZpZXcgQDE2NwotCQkgICAgbG9jYXRpb24gICAJKDEyOTYsIDIwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY3Ci0JCQlsb2NhdGlvbiAgIAkoODg3LCA1MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk2Ci0JCQltYXhfd2lkdGggIAk3ODMKLQkJCWxhYmVsICAgICAgCQotfFRoZSBKYXZhIHByaW1pdGl2ZSB0eXBlcyBhcmUgaW5zdGFuY2VzIG9mIEphdmFEYXRhVHlwZS4gIFRoZSBjb21tb24gcGFyZW50IGNsYXNzIHdpdGggSmF2YUNsYXNzIGlzIENsYXNzaWZpZXIuICBUaGUgcHJpbWl0aXZlIHR5cGVzIGNhbiBiZSBvYnRhaW5lZCB2aWEgYSBKYXZhVVJMKCJpbnQiKSwgd2hpY2ggcmVzb2x2ZXMgdG8gYSByZWZlcmVuY2UgbGlrZTogImphdmE6LyNpbnQiCi0JCQkpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJODQzCi0JCSAgICBoZWlnaHQgICAgIAkzMjUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlcktpbmQiIEAxNjgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2LCAxMDg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjgKLQkJCWxvY2F0aW9uICAgCSg2MywgOTQ4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM4NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFQYXJhbWV0ZXJLaW5kIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2OAotCQkJbG9jYXRpb24gICAJKDYzLCA5MDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM4NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM5MUMxRThGMDEyMyIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE2OAotCQkJbG9jYXRpb24gICAJKDYzLCAxMDA0KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTUKLQkJCW1heF93aWR0aCAgCTIwNykKLQkJICAgIHdpZHRoICAgICAgCTQwNAotCQkgICAgaGVpZ2h0ICAgICAJMzkyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IE5vdGVWaWV3IEAxNjkKLQkJICAgIGxvY2F0aW9uICAgCSg3NjgsIDExMjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2OQotCQkJbG9jYXRpb24gICAJKDU3NCwgMTAxNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk0Ci0JCQltYXhfd2lkdGggIAkzNTIKLQkJCWxhYmVsICAgICAgCSJUZW1wb3JhcnkgZW51bSBmb3IgSmF2YSBwYXJhbWV0ZXIga2luZCB1bnRpbCB3ZSBnZXQgdGhlIGJhc2Ugc29ydGVkIG91dCIpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJNDEyCi0JCSAgICBoZWlnaHQgICAgIAkyMTkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YURhdGFUeXBlIiBAMTcwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDExNjgsIDE0MDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3MAotCQkJbG9jYXRpb24gICAJKDk5OSwgMTM2MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhRGF0YVR5cGUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTU5MTMzNDAzMTYiCi0JCSAgICB3aWR0aCAgICAgIAkzNTYKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RURhdGFUeXBlIiBAMTcxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDY0MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTcxCi0JCQlsb2NhdGlvbiAgIAkoODEyLCA1MTEpCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1NTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFRGF0YVR5cGUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDUyNTAzM0UiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNzEKLQkJCWxvY2F0aW9uICAgCSg4MTIsIDYxMSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTUyMikKLQkJICAgIHdpZHRoICAgICAgCTU3MAotCQkgICAgaGVpZ2h0ICAgICAJMjgyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDE3MgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDE2OQotCQkgICAgc3VwcGxpZXIgICAJQDE2OAotCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJKYXZhIFR5cGVzIgotCSAgICBxdWlkICAgICAgIAkiM0I2NUI4MjMwMjBEIgotCSAgICB0aXRsZSAgICAgIAkiSmF2YSBUeXBlcyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgZGlhZ3JhbSBjb250YWlucyB0aGUgSmF2YSBUeXBlcyB0aGF0IGFyZSBub3QgRU1GIGNsYXNzZXMgYnV0IGFyZSByZWZlcmVuY2VkIGluIHRoaXMgZGlhZ3JhbS4iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAk0NzgKLQkgICAgb3JpZ2luX3kgICAJMzUKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKVHlwZUphdmFIZWxwZXJzIiBAMTczCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgMjA4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzMKLQkJCWxvY2F0aW9uICAgCSgzOTgsIDE1NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxMDI4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSlR5cGVKYXZhSGVscGVycyIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzMKLQkJCWxvY2F0aW9uICAgCSgzOTgsIDEwOSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTAyOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTczCi0JCQlsb2NhdGlvbiAgIAkoMzk4LCAyMTApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJODczKQotCQkgICAgd2lkdGggICAgICAJMTA0NgotCQkgICAgaGVpZ2h0ICAgICAJMjIwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkpUeXBlTGlzdCIgQDE3NAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDU3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTc0Ci0JCQlsb2NhdGlvbiAgIAkoNjI4LCA1MjMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTA0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSlR5cGVMaXN0IikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3NAotCQkJbG9jYXRpb24gICAJKDYyOCwgNDc4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE3NAotCQkJbG9jYXRpb24gICAJKDYyOCwgNTc5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTUwNykKLQkJICAgIHdpZHRoICAgICAgCTUyMgotCQkgICAgaGVpZ2h0ICAgICAJMjE4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKSkpKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFuY2UubWRsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9pbnN0YW5jZS5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDA3ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9pbnN0YW5jZS5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NjY5ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiSURFIgotCSAgICB2YWx1ZSAgICAgIAkiSW50ZXJuYWwgRWRpdG9yIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIgotCSAgICB2YWx1ZSAgICAgIAkiIikpCi0gICAgcXVpZCAgICAgICAJIjNBNzlFQkE1MDMzMSIKLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDAKLQl0b3BNYXJnaW4gIAkwLjI1MDAwMAotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKLQljbGlwSWNvbkxhYmVscyAJVFJVRQotCWF1dG9SZXNpemUgCVRSVUUKLQlzbmFwVG9HcmlkIAlGQUxTRQotCWdyaWRYICAgICAgCTE2Ci0JZ3JpZFkgICAgICAJMTYKLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250Ci0JICAgIHNpemUgICAgICAgCTEwCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkgICAgY29sb3IgICAgICAJMAotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCXNob3dNZXNzYWdlTnVtIAkxCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUKLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDI5NyIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNBNzk5OUI3MDJGNiIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3IgotCXF1aWQgICAgICAgCSIzQTc5OTlBRDAyOEUiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3IgotCXF1aWR1ICAgICAgCSIzQjg2RjE3MjAxNkYiCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiaW5zdGFudGlhdGlvbiIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdvcmtzcGFjZVJvb3RcXG9yZy5lY2xpcHNlLmplbVxccm9zZVxcaW5zdGFudGlhdGlvbi5jYXQiCi0JCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxODAiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdvcmtzcGFjZVJvb3RcXG9yZy5lY2xpcHNlLmVtZi5lY29yZVxcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FY29yZS5jYXQiCi0JCXF1aWQgICAgICAgCSIzOUE1RUQwNDAwNEUiKSkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNzMiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uIiBAMQotCQkJbG9jYXRpb24gICAJKDMzNCwgMjQwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkgICAgbG9jYXRpb24gICAJKDE5MCwgMTU2KQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiaW5zdGFudGlhdGlvbiIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiM0I4NkYxNzIwMTgwIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApKSkKLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIkRlcGVuZGVuY2llcyAoRG9uJ3QgZWRpdCkiCi0JCXF1aWQgICAgICAgCSIzQjg2RjMxRjAyODEiCi0JCXRpdGxlICAgICAgCSJEZXBlbmRlbmNpZXMgKERvbid0IGVkaXQpIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCSAgICAob2JqZWN0IE5vdGVWaWV3IEAyCi0JCQlsb2NhdGlvbiAgIAkoNzUzLCA2ODUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA1LCA1MzkpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAk2Ci0JCQkgICAgbWF4X3dpZHRoICAJODYwCi0JCQkgICAgbGFiZWwgICAgICAJIlRoZXNlIGFyZSB0aGUgZGVwZW5kZW5jaWVzLiBUaGV5IGFyZSBub3QgdG8gYmUgZWRpdGVkLiBUaGV5IG11c3Qgb25seSBiZSBlZGl0ZWQgYnkgdGhlaXIgb3duZXIgbW9kZWxzLiIpCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAk4NDIxNjMxCi0JCQl3aWR0aCAgICAgIAk5MjAKLQkJCWhlaWdodCAgICAgCTMwNSkKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVjb3JlIiBAMwotCQkJbG9jYXRpb24gICAJKDI2MywgMTg1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzCi0JCQkgICAgbG9jYXRpb24gICAJKDExOSwgMTAxKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiZWNvcmUiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkKLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3IgotCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNkYiCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNCODZGMTcyMDE3NiIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzCi0JcXVpZCAgICAgICAJIjNCODZGMTcyMDE3MCIKLQlQcm9jc05EZXZzIAkobGlzdAotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3IgotCQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTcyIgotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3IgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcwotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5oIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIgotCQkJdmFsdWUgICAgICAJOCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJLTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciIKLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIzIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNCIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5IgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlclNvdXJjZUZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJvZHlTb3VyY2VGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBTlNJIEMrKyBFdmVudCBXYXRjaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBTlNJQ29udmVydCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTgzX1NPVVJDRSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NOYW1lIgotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQWNjZXNzIgotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQb2x5bW9ycGhpY1VuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVBY2Nlc3MiCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJBXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4IgotCQkJdmFsdWUgICAgICAJIlRoZV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvcHkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NFcXVhbGl0eU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVFcXVhbGl0eU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1Rhc2siCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkxpbWl0ZWRQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck1vZGUiCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiCi0JCQkJdmFsdWUgICAgICAJMjI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJCb2R5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlVzZUNvbG9uTm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUNvbnRyb2xTZXQiIDIyNSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb250cm9sbGVkXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlRGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IiAyMDkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRLaW5kUGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtjbGFzc31fUmVjb3JkX0tpbmRzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNMaW1pdGVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiIDExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyZW50Q2xhc3NOYW1lIgotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJUaGVfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheU9mQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiUG9zaXRpdmUgcmFuZ2UgPD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvcHkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJGcmVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVR5cGVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cXVvdGV9PSR7cXVvdGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVGFnZ2VkIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVjb3JkIgotCQkJCXZhbHVlICAgICAgCTIxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTWl4aW4iCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlRhc2siCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVUeXBlIgotCQkJCXZhbHVlICAgICAgCTIwOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlwbGVUeXBlcyIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJVbmNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTIxNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMjYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRGaW5hbGl6YXRpb25Pbmx5IgotCQkJCXZhbHVlICAgICAgCTIyNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTIyOCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyIKLQkJCQl2YWx1ZSAgICAgIAkyMjkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkF1dG8iCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTW9kZSIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIgotCQkJdmFsdWUgICAgICAJIlRydWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTcGVjIgotCQkJCXZhbHVlICAgICAgCTIyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiCi0JCQkJdmFsdWUgICAgICAJMjMxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW4iCi0JCQkJdmFsdWUgICAgICAJMjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJPdXQiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjE3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjE3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDbGVhckNhc2UiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkicHJvamVjdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlZpZXdDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRvbWFpbkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU1BQYWNrYWdlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbmRleENvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludENvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImNPTlRBSU5FUkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlZpZXdQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRvbWFpblByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5kZXhQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFyZ2V0RGF0YWJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RlYXVsdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRXh0ZW50U2l6ZSIKLQkJCXZhbHVlICAgICAgCTEpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmVmZXRjaFNpemUiCi0JCQl2YWx1ZSAgICAgIAkxKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTWFuYWdlZEJ5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJMaXN0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtRG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb290U2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1Jvb3REb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRhdGFiYXNlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRCTVMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1ZpZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRG9tYWluIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3lub255bW5zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIgotCQkJdmFsdWUgICAgICAJIk5vbmUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTbmFwU2hvdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEaXN0aW5jdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGVyc2lzdFRvU2VydmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1BhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1N0b3JlZFByb2NlZHVyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGaWxsRmFjdG9yIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIktleUxpc3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RlbGV0ZUV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk9sZFJvdyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1JvdyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIgotCQkJdmFsdWUgICAgICAJIlByb2NlZHVyZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RldGVybWluaXN0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtZXRlciIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5QYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIgQ29tbXVuaWNhdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9vdERpciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm90U2hvd1Jvc2VJRERsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSb3NlSUQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFJldHVybkxpbmUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNIgotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIgotCQkJdmFsdWUgICAgICAJIjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGNoYXJzZXRzLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGpjZS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxqc3NlLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHJ0LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHN1bnJzYXNpZ24uamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxkbnNucy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXGxkYXBzZWMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxsb2NhbGVkYXRhLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcc3VuamNlX3Byb3ZpZGVyLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHNlY3VyaXR5XFxsb2NhbF9wb2xpY3kuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcc2VjdXJpdHlcXFVTX2V4cG9ydF9wb2xpY3kuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxsaWJcXGR0LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFxodG1sY29udmVydGVyLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFx0b29scy5qYXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlZmVyZW5jZUNsYXNzcGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdW4iCi0JCQkJdmFsdWUgICAgICAJMjAwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVkFKYXZhV29ya2luZ0ZvbGRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyIKLQkJCXZhbHVlICAgICAgCTMpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlbW90ZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlbW90ZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkhvbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJIb21lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJEVERMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREVERMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNlcnZsZXRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVKYXZhRG9jVGFncyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VDb250cm9sIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDU2VsZWN0ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0U291cmNlUm9vdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3ROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDQ29tbWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJNzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQm91bmQiCi0JCQkJdmFsdWUgICAgICAJNzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJNzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiCi0JCQkJdmFsdWUgICAgICAJODEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc05hdmlnYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSIKLQkJCXZhbHVlICAgICAgCSJfSUQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiCi0JCQkJdmFsdWUgICAgICAJMTkwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIgotCQkJCXZhbHVlICAgICAgCTE4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIgotCQkJCXZhbHVlICAgICAgCTE4MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiIKLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUk9XIgotCQkJCXZhbHVlICAgICAgCTE3MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIgotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIgotCQkJCXZhbHVlICAgICAgCTE2MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiNiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDb21wb25lbnRUZXN0IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSZXF1aXNpdGVQcm8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZSgkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZSgkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiY29tcGlsZXIzLjBfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSIKLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIgotCQkJCXZhbHVlICAgICAgCTIwNikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kQm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZERlY2wiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3BlY2lhbERlY2xSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGVudCIKLQkJCXZhbHVlICAgICAgCTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5IgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAk1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiCi0JCQkJdmFsdWUgICAgICAJNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlNvREEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlRvcExpbmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIlR5cGVLaW5kcyIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImVudW0iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkicmVjb3JkIgotCQkJCXZhbHVlICAgICAgCTEwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIm1vZHVsZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJjb2NsYXNzIgotCQkJCXZhbHVlICAgICAgCTEwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIgotCQkJCXZhbHVlICAgICAgCTEwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIgotCQkJCXZhbHVlICAgICAgCTEwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIm1heCIKLQkJCQl2YWx1ZSAgICAgIAkxMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJraW5kIgotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ1dWlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiZGxsbmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYWxpYXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkibGlicmFyeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidXVpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJsY2lkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiCi0JCQkJdmFsdWUgICAgICAJMjEzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJhc2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiMCIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIxIgotCQkJCXZhbHVlICAgICAgCTIyNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSIKLQkJCXZhbHVlICAgICAgCSgiQmFzZVNldCIgMjIyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nIgotCQkJdmFsdWUgICAgICAJKCJJbnN0YW5jaW5nU2V0IiAyMTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiVGV4dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0JvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRCb2R5IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCeVZhbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQnlSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQYXJhbUFycmF5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBvcnRSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlF1aWNrSW1wb3J0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcG9ydEJpbmFyeSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfU3lzdGVtSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfUHVibGljSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvblZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiSW50ZXJuYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlckVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsRW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fU3lzdGVtSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9QdWJsaWNJRCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdERlY2xUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbiBBbGwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJDb21wb25lbnRQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCS0yKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyIKLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIxIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMiIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjMiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI0IgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEZXBsb3kiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImNsYXNzaWZpZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImNvbnN0cmFpbnRzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sQ29udGVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRlbnRLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiQ29udGVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVtcHR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJNaXhlZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50T25seSIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkib3BlcmF0aW9uTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzSUQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkidmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRmVhdHVyZUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkF0dHJpYnV0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicmVmZXJlbmNlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkidmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRmVhdHVyZUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkF0dHJpYnV0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjkiKSkKLQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTcxIikpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbnRpYXRpb24uY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9pbnN0YW50aWF0aW9uLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhZDBkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbnRpYXRpb24uY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMjk1MyArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0NwotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiaW5zdGFudGlhdGlvbiIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbCIpKSkKLSAgICBxdWlkICAgICAgIAkiM0I4NkYxNzIwMTgwIgotICAgIGRvY3VtZW50YXRpb24gCSJKYXZhIEluc3RhbnRpYXRpb24gUGFja2FnZSIKLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIgotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzcyAiSUphdmFEYXRhVHlwZUluc3RhbmNlIgotCSAgICBxdWlkICAgICAgIAkiM0I4QUIxNzgwMkIxIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0U1Mjk1NjIwMTRFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFJbnN0YW5jZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QUIxOTEwMEMyIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJSmF2YUluc3RhbmNlIgotCSAgICBxdWlkICAgICAgIAkiM0U1MTU3NUEwMkQ0IgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MTU3NzgwMkI5IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJSmF2YU9iamVjdEluc3RhbmNlIgotCSAgICBxdWlkICAgICAgIAkiM0I3ODJENzkwMjk2IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpbnRlcmZhY2UgaXMgdGhlIGluc3RhbmNlIG9mIGFuIGphdmEgb2JqZWN0IGluIHRoZSBqYXZhIG1vZGVsLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNFNTE1N0RBMDNERCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhSW5zdGFuY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1MTU3NUEwMkQ0IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFPYmplY3RJbnN0YW5jZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjc4MzAxODAxQzkiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIkphdmFBbGxvY2F0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0ZEOUU2OTAwMDYxIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIGNsYXNzIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIHRoZSBhbGxvY2F0aW9uIGNsYXNzLiBJdCBpcyB0aGUgdmFsdWUgb2YgdGhlICJhbGxvY2F0aW9uIiBwcm9wZXJ0eSBvbiBhIEphdmEgT2JqZWN0IHNvIHRoYXQgdGhlIGFjdHVhbCBhbGxvY2F0aW9uIGNhbiBiZSBjb250cm9sbGVkLiBGb3IgZXhhbXBsZSwgdGhlcmUgY291bGQgYmUgb25lIGZvciBqdXN0IGluaXQgc3RyaW5nLCBvciBvbmUgZm9yIHNlcmlhbGl6ZWQuCi0JICAgIAotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQotCShvYmplY3QgQ2xhc3MgIkluaXRTdHJpbmdBbGxvY2F0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0ZEOUVBRjkwMDFFIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGFsbG9jYXRpb24gc3RyaW5nIGNhbiBiZSBwYXJzZWQgYnkgdGhlIHJlbW90ZSB2bS4gSXQgdXNlcyB0aGUgYWxsb2NTdHJpbmcuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVCNzUwMkRBIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SmF2YUFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUU2OTAwMDYxIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluaXRTdHJpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0ZGREUxREUwMzJFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZyBmb3IgdGhpcyBvYmplY3QuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiSW1wbGljaXRBbGxvY2F0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0ZEOUVDMTQwMjQyIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyBpcyBmb3IgYW4gaW1wbGljaXQgYWxsb2NhdGlvbiB3aGVyZSB0aGUgb2JqZWN0IGNvbWVzIGZyb20gdGhlIGZlYXR1cmUgb2YgYW5vdGhlciBvYmplY3QuIEl0IGlzIHRoZSBsaXZlIEphdmEgdmFsdWUgZnJvbSB0aGUgcmVtb3RlIHZtLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNGRDlFQzQ3MDBFNyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkphdmFBbGxvY2F0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFNjkwMDA2MSIpKSkKLQkob2JqZWN0IENsYXNzICJQYXJzZVRyZWVBbGxvY2F0aW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODJDOTEwMDA1IgotCSAgICBkb2N1bWVudGF0aW9uIAkiQWxsb2NhdGlvbnMgdmlhIFBhcnNlIFRyZWVzLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDgyQ0I3MDFENiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkphdmFBbGxvY2F0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFNjkwMDA2MSIpKSkKLQkob2JqZWN0IENsYXNzICJQVEV4cHJlc3Npb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpCi0JKG9iamVjdCBDbGFzcyAiUFRBcnJheUFjY2VzcyIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgyRTE0MDI1MCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18QXJyYXkgYWNjZXNzLiBlLmcuIHhbM10uIAotfAotfFVubGlrZSBBU1QsIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiBvZiB0eXBlIHhbM11bNF0gd2lsbCBiZSBkb25lIGluIG9uZSBleHByZXNzaW9uIHJhdGhlciB0aGFuIGhhdmluZyBhIHNlcGFyYXRlIEFycmF5QWNjZXNzIGZvciBlYWNoIGRpbWVuc2lvbi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxpZmljYXRpb24uIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBpZiBpdCBpcyBhIHNpbXBsZSBhcnJheSBhY2Nlc3Mgd2hlcmUgaXQgaXMgb2YgdGhlIGZvcm0ge2V4cHJlc3Npb259W2V4cHJlc3Npb25dW2V4cHJlc3Npb25dLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDgyRTZGMDFGNyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXJyYXkiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODJFOEUwMjM3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgYXJyYXkgdG8gYWNjZXNzLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluZGV4ZXMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODJFOUIwMDdEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBleHByZXNzaW9ucyByZXByZXNlbnRpbmcgdGhlIGluZGV4ZXMgb2YgdGhlIGFjY2Vzcy4iCi0JCSAgICBzdGVyZW90eXBlIAkiMS4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEFycmF5Q3JlYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4MzcxMjAyNUEiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfEFycmF5IENyZWF0aW9uIGV4cHJlc3Npb24sIGUuZy4gbmV3IGludFszXSBvciBuZXcgamF2YS5sYW5nU3RyaW5nW11bXSB7eyJhIn0sIHsiYiJ9fQotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzNzIxMDA0OSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MzdFOTAyQkQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlLCBlLmcuIGludFtdW10gb3IgamF2YS5sYW5nLlN0cmluZ1tdLCBpbmNsdWRpbmcgdGhlIG51bWJlciBvZiBkaW1lbnNpb24gYnJhY2tldHMuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaW1lbnNpb25zIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzODk1MDFFOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbGlzdCBvZiBleHByZXNzaW9ucyBmb3IgdGhlIGRpbWVuc2lvbnMuIFlvdSBjYW4gaGF2ZSBbM11bNF1bXSBidXQgW11bMzNdIGlzIGludmFsaWQuIFNvIGZvciBlYWNoIGRpbWVuc2lvbiB0aGF0IGhhcyBhbiBleHByZXNzaW9uLCB0aGVyZSB3aWxsIGJlIGFuIGVudHJ5IGluIHRoZSBsaXN0LCBpbiB0aGUgY29ycmVjdCBvcmRlci4gV2hlbiB5b3UgcmVhY2ggdGhlIGVtcHR5IGRpbWVuc2lvbnMsIHRoZSBsaXN0IHdpbGwgZW5kIHRvby4gIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbml0aWFsaXplciIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4Mzk3QzAyMzEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyB0aGUgaW5pdGlhbGl6ZXIsIGlmIGFueSwgZm9yIHRoaXMgYXJyYXkuIEUuZy4gbmV3IGludFtdIHsyLDN9LiBJdCBpcyB0aGUgezIsM30uIgotCQkgICAgdHlwZSAgICAgICAJIlBUQXJyYXlJbml0aWFsaXplciIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4Mzk2ODAxNEMiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQXJyYXlJbml0aWFsaXplciIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgzOTY4MDE0QyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkFycmF5IGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24uIFRoaXMgaXMgdGhlIGVudGlyZSBleHByZXNzaW9uLCBlLmcuIHsyLCAzfSwgb3Ige3syLDN9LCA0fS4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgezIsM30gd2lsbCBiZSBhbiBBcnJheUluaXRpYWxpemVyIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGV4cHJlc3Npb25zIGxpc3QgZm9yIHRoZSB0b3AgQXJyYXlJbml0aWFsaXplci4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4Mzk3OTAwMzgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4cHJlc3Npb25zIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzQTU3MDBFQiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSBpbml0aWFsaXplciwgZS5nLiB7MiwgM30sIG9yIHt7MiwzfSwgNH0uIEluIHRoZSBmaXJzdCBjYXNlIGl0IHdpbGwgYmUgdHdvIE51bWJlckxpdGVyYWxzLiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSB7MiwzfSB3aWxsIGJlIGFuIEFycmF5SW5pdGlhbGl6ZXIsIGZvbGxvd2VkIGJ5IGEgTnVtYmVyTGl0ZXJhbC4iCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEJvb2xlYW5MaXRlcmFsIgotCSAgICBxdWlkICAgICAgIAkiNDAwODNBRTcwMjQ3IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyByZXByZXNlbnRzIGEgcHJpbWl0aXZlIGJvb2xlYW4gbGl0ZXJhbCwgaS5lLiB0cnVlIG9yIGZhbHNlIGRpcmVjdGx5IGluIHRoZSBjb2RlLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzQjFEMDAwMCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYm9vbGVhblZhbHVlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzQjNEMDAxQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdmFsdWUgb2YgdGhlIGxpdGVyYWwuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQ2FzdEV4cHJlc3Npb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4M0I2RjAwNTgiCi0JICAgIGRvY3VtZW50YXRpb24gCSJDYXN0IGV4cHJlc3Npb24sIGUuZy4gKHNob3J0KSAxMCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzQkQ2MDMwOSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0I5NjAwRjQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgb2YgdGhlIGNhc3QsIGUuZy4gaW50IG9yIGphdmEubGFuZy5TdHJpbmciCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4cHJlc3Npb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNCQjYwMzNGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBleHByZXNzaW9uIGJlaW5nIGNhc3RlZC4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRDaGFyYWN0ZXJMaXRlcmFsIgotCSAgICBxdWlkICAgICAgIAkiNDAwODRERjEwMjc3IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyByZXByZXNlbnRzIGEgcHJpbWl0aXZlIGNoYXJhY3RlciBleHByZXNzaW9uLCBlLmcuICdhJyBvciAnXFxyJy4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NEUxMzAxRUEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVzY2FwZWRWYWx1ZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NEUzOTAxNEUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuIEluIG90aGVyIHdvcmRzIHRoZSBsaXRlcmFsIGV4YWN0bHkgYXMgaXQgaXMgaW4gdGhlIGphdmEgZmlsZS4gRS5nLiAnYScgb3IgJ1xccicuIEluY2x1ZGluZyB0aGUgc3Vycm91bmRpbmcgc2luZ2xlIHF1b3RlcyB0aGVtc2VsdmVzLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2hhclZhbHVlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjQwMDg0RUI3MDJDQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgYWN0dWFsIHByaW1pdGl2ZSBjaGFyYWN0ZXIgd2l0aG91dCB0aGUgcXVvdGVzLiBFc2NhcGUgYXJlIGV2YWx1YXRlZCBhbmQgdHVybmVkIGludG8gdGhlaXIgY2hhcmFjdGVyIHZhbHVlLiBUaGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLiBJZiBub3Qgc2V0IHdoZW4gY3JlYXRlZCB3aGVuIHF1ZXJpZWQgaXQgd2lsbCBjcmVhdGUgaXQuIFR5cGljYWxseSBpdCB3aWxsIGJlIHNldCB3aGVuIGNyZWF0ZWQgZnJvbSBhbiBBU1Qgbm9kZSBzaW5jZSB0aGUgbm9kZSBhbHJlYWR5IGhhcyBldmFsdWF0ZWQgaXQuIgotCQkgICAgdHlwZSAgICAgICAJImNoYXIiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODRGNDAwMjZGIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxDbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uLiBFLmcuIG5ldyBTdHJpbmcoImEiKQotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg0RjRDMDJGOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NEZBRDAyOTQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIGlzIHRoZSB0eXBlIG9mIHRoZSBjbGFzcy4gRS5nLiBqYXZhLmxhbmcuU3RyaW5nLiBUaGlzIHNob3VsZCBiZSBmdWxseS1xdWFsaWZpZWQgZm9yIGFsbG9jYXRpb24gcHVycG9zZXMuIEl0IHNob3VsZCBhbHNvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIGlmIFggaXMgYW4gaW5uZXIgY2xhc3Mgb2Ygai5ZLCB0aGVuIHRoZSB0eXBlIGhlcmUgc2hvdWxkIGJlICJqLlkkWCIuIAotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFyZ3VtZW50cyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTE1RTAxMzgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IuIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRDb25kaXRpb25hbEV4cHJlc3Npb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NTFGQjAyNkEiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdGVzdCBFeHByZXNzb24sIGUuZy4gKHg9MykgPyAxIDogMiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1Mjc0MDEyRSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uZGl0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MjFEMDJBRiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgY29uZGl0aW9uIGV4cHJlc3Npb24uIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHJ1ZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTI0MTAzMzMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHRydWUgZXhwcmVzc2lvbiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhbHNlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MjVGMDI5NiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZmFsc2UgZXhwcmVzc2lvbi4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRGaWVsZEFjY2VzcyIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1MkRGMDIwNCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkFjY2VzcyBhIGZpZWxkIGV4cHJlc3Npb24sIGUuZy4gamF2YS5hd3QuQ29sb3IucmVkIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUzNUQwMjQxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZWNlaXZlciIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTMxMzAxMkMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBvYmplY3QgdGhhdCB0aGUgZmllbGQgaXMgaW4sIGUuZy4gamF2YS5hd3QuQ29sb3IuIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmllbGQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUzNDUwMEFDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBhY2Nlc3NlZCwgZS5nLiByZWQuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRJbmZpeEV4cHJlc3Npb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NTM4QjAxNDMiCi0JICAgIGRvY3VtZW50YXRpb24gCSJBbiBleHByZXNzaW9uIHdpdGggYW4gb3BlcmF0b3IgdGhhdCBoYXMgdHdvIG9wZXJhbmRzLCBlLmcuIDMgKyA0LiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NTcwMDAzMiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGVmdE9wZXJhbmQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUzQUMwMDAwIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3BlcmF0b3IiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUzQjYwMEQ3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBvcGVyYXRvciwgZS5nLiArIgotCQkgICAgdHlwZSAgICAgICAJIlBUSW5maXhPcGVyYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTNFMTAzNTkiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmlnaHRPcGVyYW5kIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NDBEMDE4NiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSByaWdodCBleHByZXNzaW9uLiBpLmUuIDQgb2YgIjMgKyA0IgotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbmRlZE9wZXJhbmRzIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NTExMDM5QyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJVc2VkIHdoZW4gdGhlcmUgYXJlIGEgc2VyaWVzIG9mIGluZml4IG9wZXJhdGlvbnMgb2YgdGhlIHNhbWUgb3BlcmF0b3IsIGUuZy4gMSArIDIgKyAzICsgNC4gMSBhbmQgMiB3aWxsIGdvIGludG8gbGVmdCBhbmQgcmlnaHQsIHdoaWxlIHszLCA0fSB3aWxsIGdvIGludG8gdGhlIGV4dGVuZGVkIG9wZXJhbmRzLiAiCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEluZml4T3BlcmF0b3IiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NTNFMTAzNTkiCi0JICAgIGRvY3VtZW50YXRpb24gCSJFbnVtZXJhdG9yIGZvciB0aGUgb3BlcmF0b3Igb24gYW4gSW5maXhFeHByZXNzaW9uLiIKLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJUSU1FUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTY4MzAyNDAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiKiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJESVZJREUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2OEUwMUUyIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIi8gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUkVNQUlOREVSIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NjkyMDJCQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIlIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBMVVMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2OTcwMzlEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIisgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTUlOVVMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2OUMwMUQ4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIi0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTEVGVF9TSElGVCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZCNTAyNzQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPDwgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUklHSFRfU0hJRlRfU0lHTkVEIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkJBMDBDRCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI+PiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSSUdIVF9TSElGVF9VTlNJR05FRCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZDMzAzOEQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPj4+IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkxFU1MiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2Q0MwM0NDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIjwgIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkdSRUFURVIiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2RDkwMDFEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIj4gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTEVTU19FUVVBTFMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2REQwMDRCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIjw9IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkdSRUFURVJfRVFVQUxTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkU1MDI5QiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI+PSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJFUVVBTFMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2RUMwMjczIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIj09IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk5PVF9FUVVBTFMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2RjkwMzlFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiE9IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlhPUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTcwMTAzMjgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiXiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJBTkQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU3MTIwMzRBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiYgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiT1IiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU3MDQwMkZBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJInwgIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNPTkRJVElPTkFMX0FORCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTcxNjAwNzUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiJiYgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ09ORElUSU9OQUxfT1IiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU3MjYwMkJEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJInx8IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEluc3RhbmNlb2YiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NTdEMzAzQTIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJJbnN0YW5jZW9mIGV4cHJlc3Npb24sIGUuZy4geCBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmciCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTg5MTAzQUYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wZXJhbmQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU4MDcwMjM0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB2YWx1ZSB0byB0ZXN0LCBlLmcuIHggaW4geCBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmciCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1ODJBMDIyMCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdGVzdCwgZS5nLiBqYXZhLmxhbmcuU3RyaW5nLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVE1ldGhvZEludm9jYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NThCNjAxOEIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJNZXRob2RJbnZvY2F0aW9uIGV4cHJlc3Npb24sIGUuZy4geC5nZXRZKDMpIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVCOUQwMDY3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZWNlaXZlciIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUIwQTAxRUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxXaG8gdGhlIG1ldGhvZCBpcyBpbnZva2VkIGFnYWluc3QuIFRoaXMgbWF5IGJlIG5vdCBzZXQsIHdoaWNoIG1lYW5zICJ0aGlzIi4gSXQgbWF5IGFsc28gYmUgYSBOYW1lLCB3aGljaCB3b3VsZCBtZWFuIGEgY2xhc3MgbGlrZSAiamF2YS5sYW5nLlN0cmluZyIKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUI2MTAwRDkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBpbnZva2VkLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXJndW1lbnRzIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QjY5MDJFRCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbGlzdCBvZiBhcmd1bWVudHMsIGlmIGFueSwgdG8gdGhlIG1ldGhvZC4iCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVE5hbWUiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NThFQTAyODAiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgcmVwcmVzZW50cyBhIG5hbWUuIFRoaXMgY2FuIGhhcHBlbiBmb3IgdGhlIHJlY2VpdmVyIG9mIGEgbWV0aG9kIGludm9jYXRpb24sIGUuZy4geC5nZXRZKCkgb3IgamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKDEwKS4gSW4gdGhlc2UgY2FzZXMgeW91IHdvdWxkIGhhdmUgYSBuYW1lIG9mICJ4IiBvciAiamF2YS5sYW5nLlN0cmluZyIuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVCQTEwMERCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjQwMEMxMTA0MDFCRSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbmFtZSwgd2hpY2ggY2FuIGJlIGEgdHlwZSBvciBhIHZhcmlhYmxlLiBJZiBpdCBpcyBhIHR5cGUsIHRoZW4gIGl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUTnVsbExpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NUJCRjAwMjAiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gIm51bGwiCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVCRDQwMkYxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKSkKLQkob2JqZWN0IENsYXNzICJQVE51bWJlckxpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NUM0MDAzNUIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJSZXByZXNlbnQgYSBudW1iZXIgcHJpbWl0aXZlIGxpdGVyYWwsIGUuZy4gMTAuIE9uZSBvcHRpbWl6YXRpb24gdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBpcyB0aGF0IGlmIGFuIGV4cHJlc3Npb24gaXMgb2YgdGhlIGZvcm0gK251bWJlciBvciAtbnVtYmVyLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tIGEgUHJlZml4RXhwcmVzc2lvbiB3aXRoIGEgTnVtYmVyTGl0ZXJhbCB0byBqdXN0IGEgTnVtYmVyTGl0ZXJhbC4gVGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBtb2RlbC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUNFRjAyNDQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRva2VuIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1Q0FBMDI0RiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdG9rZW4gdmFsdWUsIGUuZy4gMTAsIDEwZCwgb3IgLTEwLjc1IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1Q0Y5MDA3QyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkFuIGV4cHJlc3Npb24gd2l0aGluIHBhcmVudGhlc2lzLCBlLmcuICh4KzMpIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVGNEUwM0UxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHByZXNzaW9uIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1RjIyMDEyQiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBleHByZXNzaW9uIHdyYXBwZWQgYnkgdGhlIHBhcmVudGhlc2lzLCBlLmcuICh4KzMpIHRoZW4gdGhlIGV4cHJlc3Npb24gaXMgIngrMyIKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUUHJlZml4RXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1RkFEMDA4QiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18QSBvbmUgb3BlcmFuZCBvcGVyYXRvciwgd2hlcmUgdGhlIG9wZXJhdG9yIGNvbWVzIGJlZm9yZSB0aGUgb3BlcmFuZCwgZS5nLiAtICh4KzMpLiBJbiBBU1QsIGV2ZW4gLTMgaXMgbW9kZWxlZCBhcyBhIFByZWZpeEV4cHJlc3Npb24gb2Ygb3BlcmF0b3IgIi0iIGFuZCBleHByZXNzaW9uIG9mIE51bWJlckxpdGVyYWwoMykuIEJ1dCB3ZSBvcHRpbWl6ZSB0aGlzIGF3YXkgYW5kIGp1c3QgdXNlIGEgTnVtYmVyTGl0ZXJhbCgtMykgZGlyZWN0bHkgaW5zdGVhZC4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjJEQzAxRDciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wZXJhdG9yIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MEJDMDE5OSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgb3BlcmF0b3Igb2YgdGhpcyBleHByZXNzaW9uLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVFByZWZpeE9wZXJhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2MDI0MDBEMiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHByZXNzaW9uIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MEM1MDA2NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhwcmVzc2lvbiB0aGF0IHRoZSBvcGVyYXRvciBpcyBhcHBsaWVkIHRvLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVFByZWZpeE9wZXJhdG9yIgotCSAgICBxdWlkICAgICAgIAkiNDAwODYwMjQwMEQyIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHByZWZpeCBleHByZXNzaW9uIG9wZXJhdG9yLiBXZSBhcmUgbm90IG1vZGVsaW5nICsrIGFuZCAtLS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUExVUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjA2RjAxQjYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiKyBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJNSU5VUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjA3MjAzQjkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiLSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDT01QTEVNRU5UIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MDc4MDBBQiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJ+IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk5PVCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjA3RDAxNDgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiISBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRTdHJpbmdMaXRlcmFsIgotCSAgICBxdWlkICAgICAgIAkiNDAwODYxRTIwMDBCIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXByZXNlbnRhdGlvbiBvZiBhIHN0cmluZyBsaXRlcmFsLCBlLmcuICJhc2RmIi4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjJENzAzMzgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVzY2FwZWRWYWx1ZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjFGQzAxQ0IiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIGlzIHRoZSBlc2NhcGVkIHN0cmluZy4gSW4gb3RoZXIgd29yZHMgdGhlIGxpdGVyYWwgZXhhY3RseSBhcyBpdCBpcyBpbiB0aGUgamF2YSBmaWxlLiBFLmcuICJhYiIgb3IgImNcciIuIEluY2x1ZGluZyB0aGUgc3Vycm91bmRpbmcgcXVvdGVzIHRoZW1zZWx2ZXMuCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGl0ZXJhbFZhbHVlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MjBBMDBCRCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgYWN0dWFsIHN0cmluZyB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVFRoaXNMaXRlcmFsIgotCSAgICBxdWlkICAgICAgIAkiNDAwODYzQTcwMENCIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXByZXNlbnRzICJ0aGlzIiwgZS5nLiB0aGlzLmdldFgoKSB3aWxsIGJlIGEgTWV0aG9kSW52b2NhdGlvbiB3aXRoIHRoZSByZWNlaXZlciBiZWluZyBhIFRoaXNMaXRlcmFsLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGZvcm1hdCBYWVoudGhpcyBiZWNhdXNlIHRoYXQgaXMgZm9yIGlubmVyIGNsYXNzZXMgYW5kIHdlIGRvbid0IHN1cHBvcnQgdGhhdCByaWdodCBub3cuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODY0MTgwMTlGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKSkKLQkob2JqZWN0IENsYXNzICJQVFR5cGVMaXRlcmFsIgotCSAgICBxdWlkICAgICAgIAkiNDAwODY0OTUwMTgxIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyByZXByZXNlbnRzIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybSBqLlhZWi5jbGFzcy4gRm9yIGluc3RhbmNlIGluIGEgbWV0aG9kIGludm9jYXRpb24geC5nZXRYKGpYWVouY2xhc3MpIHRoZSBhcmd1bWVudCB3aWxsIGJlIGEgVHlwZUxpdGVyYWwuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODY1NEMwMDA4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2NEQ3MDM3QiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdHlwZSBvZiB0aGUgbGl0ZXJhbC4gIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUSW52YWxpZEV4cHJlc3Npb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NjVBRjAyMDkiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHVzZWQgd2hlbiB3ZSBoYXZlIHNvbWUgZXhwcmVzc2lvbiB3ZSBqdXN0IGNhbid0IGV2YWx1YXRlIGZvciBvdXIgcHVycG9zZXMuIEl0IGFsbG93cyB1cyB0byB0ZWxsIHRoZSBldmFsdWF0aW9uIHdoYXQgaXMgYWN0dWFsbHkgd3JvbmcuIEl0IHNob3VsZCBiZSBwbGFjZWQgYXMgdGhlIHJvb3QgZXhwcmVzc2lvbiB0byBwcmV2ZW50IHByb2Nlc3NpbmcgbXVjaCBvZiB0aGUgdHJlZSBhbmQgdGhlbiBmaW5hbGx5IGZhaWwuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODY2RjUwMjU4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2NkU0MDI5OSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJBIG1lc3NhZ2UgYXMgdG8gd2h5IGl0IGlzIGludmFsaWQuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRJbnN0YW5jZVJlZmVyZW5jZSIKLQkgICAgcXVpZCAgICAgICAJIjQwMTdEQjE4MDJCMyIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMTdEQjRBMDM0MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiNDM2MjdDMTQwMzk2IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxBbiBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24uIEN1cnJlbnRseSB3ZSBvbmx5IHN0b3JlIHRoZSAKLXxlbnRpcmUgZGVjbGFyYXRpb24gYXMgYSBzdHJpbmcsIGluY2x1ZGluZyB0aGUgIm5ldyBBQ2xhc3MoKSB7Li4ufSIuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDM2MjdENEUwMEQwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWNsYXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MzYyN0Q2OTAxNDciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGRlY2xhcmF0aW9uIHRleHQuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbXBvcnRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjQzNjI4OUU1MDM0QiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHRoZSBpbXBvcnRzIG5lZWRlZCBpbiB0aGUgbWFpbiBjbGFzcyBieSB0aGlzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIGEgdHJhbnNpZW50IGF0dHJpYnV0ZS4gSXQgaXMgbm90IHNlcmlhbGl6ZWQsIG5vciBpcyBpdCBwYXJzZWQgaW50byBmcm9tIGV4aXN0aW5nIGNvZGUuIEl0cyBvbmx5IHB1cnBvc2UgaXMgdG8gaGVscCBjb2RlIGdlbmVyYXRpb24gb24gYSBicmFuZCBuZXcgZGVjbGFyYXRpb24gdG8ga25vdyB3aGF0IGltcG9ydHMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtYWluIGNsYXNzLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBxdWlkICAgICAgIAkiM0ZEOUVENzEwM0Q1IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHBhcmVudCB3aG8gaXMgdG8gZ2l2ZSB1cCB0aGUgdmFsdWUuIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYXJlbnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVENzIwMzkwIgotCQkgICAgbGFiZWwgICAgICAJInBhcmVudCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFT2JqZWN0IgotCQkgICAgcXVpZHUgICAgICAJIjNDNEYxQzg2MDEyMyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEiCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVENzIwMzlBIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SW1wbGljaXRBbGxvY2F0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQzE0MDI0MiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCSAgICBxdWlkICAgICAgIAkiM0ZEOUVERDAwMDg4IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGZlYXR1cmUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcXVlcnkgdGhlIGxpdmUgdmFsdWUuIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJmZWF0dXJlIgotCQkgICAgcXVpZCAgICAgICAJIjNGRDlFREQxMDE0OCIKLQkJICAgIGxhYmVsICAgICAgCSJmZWF0dXJlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDU5RDAyMzAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIgotCQkgICAgcXVpZCAgICAgICAJIjNGRDlFREQxMDE1MiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkltcGxpY2l0QWxsb2NhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUMxNDAyNDIiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgzNENFMDAxQiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSByb290IGV4cHJlc3Npb24gb2YgdGhlIHBhcnNlIHRyZWUuIFRoZSByZXN1bHQgb2YgaXQgaXMgdGhlIGFsbG9jYXRpb24uIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJleHByZXNzaW9uIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzNENGMDJFNCIKLQkJICAgIGxhYmVsICAgICAgCSJleHByZXNzaW9uIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MzRDRjAyRTYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQYXJzZVRyZWVBbGxvY2F0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyQzkxMDAwNSIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2IgotCSAgICBxdWlkICAgICAgIAkiNDAxN0RCRTMwMTM4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJyZWZlcmVuY2UiCi0JCSAgICBxdWlkICAgICAgIAkiNDAxN0RCRTYwMDA2IgotCQkgICAgbGFiZWwgICAgICAJInJlZmVyZW5jZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhSW5zdGFuY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1MTU3NUEwMkQ0IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDciCi0JCSAgICBxdWlkICAgICAgIAkiNDAxN0RCRTYwMTY0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbnN0YW5jZVJlZmVyZW5jZSIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDE3REIxODAyQjMiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIpKSkpCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JICAgIHF1aWQgICAgICAgCSIzQjc4MkQxQjAzNEYiCi0JICAgIHRpdGxlICAgICAgCSJNYWluIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgTm90ZVZpZXcgQDEKLQkJICAgIGxvY2F0aW9uICAgCSg3NDcsIDEwMDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEKLQkJCWxvY2F0aW9uICAgCSgzNDIsIDg1NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk2Ci0JCQltYXhfd2lkdGggIAk3NzUKLQkJCWxhYmVsICAgICAgCSJUaGlzIGlzIHVzZWQgYXMgdGhlIEVDbGFzc2lmaWVyIHdoZW4geW91IHdhbnQgYSBjb2RlLWdlbmVyYXRlZCBjbGFzcyB0byBwb2ludCB0byBhbiBpbnN0YW5jZSBvZiBhIElKYXZhT2JqZWN0SW5zdGFuY2UgaW1wbGVtZW50ZXIuIChXaGljaCBpcyBhbiBpbnN0YW5jZSBvZiBhIGphdmEgbW9kZWwgamF2YSBvYmplY3QpLiIpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJODM1Ci0JCSAgICBoZWlnaHQgICAgIAkzMjApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFEYXRhVHlwZUluc3RhbmNlIiBAMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNjU5LCA2NjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSgxNzc3LCA2MDUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTc2NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklKYXZhRGF0YVR5cGVJbnN0YW5jZSIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMTc3NywgNTU1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxNzY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjhBQjE3ODAyQjEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMTc3NywgNjY2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTE1MTIpCi0JCSAgICB3aWR0aCAgICAgIAkxNzgyCi0JCSAgICBoZWlnaHQgICAgIAkyNDIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgTm90ZVZpZXcgQDMKLQkJICAgIGxvY2F0aW9uICAgCSgyMzc4LCAxMDUzKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzCi0JCQlsb2NhdGlvbiAgIAkoMTk3MCwgODg5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTcKLQkJCW1heF93aWR0aCAgCTc4MAotCQkJbGFiZWwgICAgICAJIlRoaXMgaXMgdXNlZCBhcyB0aGUgRUNsYXNzaWZpZXIgd2hlbiB5b3Ugd2FudCBhIGNvZGUtZ2VuZXJhdGVkIGNsYXNzIHRvIHBvaW50IHRvIGFuIGluc3RhbmNlIG9mIGFuIElKYXZhRGF0YVR5cGVJbnN0YW5jZSBpbXBsZW1lbnRlci4gKFdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIGEgamF2YSBtb2RlbCBqYXZhIHByaW1pdGl2ZSkuIikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAk4NDAKLQkJICAgIGhlaWdodCAgICAgCTM0MCkKLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlAMgotCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFJbnN0YW5jZSIgQDUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU4NCwgMTY2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1Ci0JCQlsb2NhdGlvbiAgIAkoODA0LCA4NSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxNTYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUphdmFJbnN0YW5jZSIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIk5vbmUiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1NzVBMDJENCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDUKLQkJCWxvY2F0aW9uICAgCSg4MDQsIDE0NikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkxMzQwKQotCQkgICAgd2lkdGggICAgICAJMTU3OAotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANgotCQkgICAgbG9jYXRpb24gICAJKDE1ODQsIDQ1NSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlANQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTU4NCwgNDU1KQotCQkJKDE1ODQsIDI1OSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhT2JqZWN0SW5zdGFuY2UiIEA3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDg1OCwgNjY2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQlsb2NhdGlvbiAgIAkoNjI3LCA2MTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDgwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUphdmFPYmplY3RJbnN0YW5jZSIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQlsb2NhdGlvbiAgIAkoNjI3LCA1NjQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I3ODJENzkwMjk2IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDYyNywgNjc1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTE0NTkpCi0JCSAgICB3aWR0aCAgICAgIAk0ODAKLQkJICAgIGhlaWdodCAgICAgCTIyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlAMQotCQkgICAgc3VwcGxpZXIgICAJQDcKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTdEQTAzREQiCi0JCSAgICBjbGllbnQgICAgIAlANwotCQkgICAgc3VwcGxpZXIgICAJQDUKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzk1LCA1NTIpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzk1LCA0NTUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNTI5NTYyMDE0RSIKLQkJICAgIGNsaWVudCAgICAgCUAyCi0JCSAgICBzdXBwbGllciAgIAlANQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjU5LCA1NDMpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY1OSwgNDU1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANikpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJKYXZhIENvbnN0cnVjdG9ycyIKLQkgICAgcXVpZCAgICAgICAJIjNGRDlFNjZEMDA3RiIKLQkgICAgdGl0bGUgICAgICAJIkphdmEgQ29uc3RydWN0b3JzIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SmF2YUFsbG9jYXRpb24iIEAxMQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCAxMjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTEKLQkJCWxvY2F0aW9uICAgCSg5MDIsIDY5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFBbGxvY2F0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RTY5MDAwNjEiCi0JCSAgICB3aWR0aCAgICAgIAkzNjAKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJbml0U3RyaW5nQWxsb2NhdGlvbiIgQDEyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDU1MywgNDk1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMgotCQkJbG9jYXRpb24gICAJKDMyOSwgNDE0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ0OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkluaXRTdHJpbmdBbGxvY2F0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUFGOTAwMUUiCi0JCSAgICB3aWR0aCAgICAgIAk0NjYKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEzCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgMzIzKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUAxMQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTA3MywgMzIzKQotCQkJKDEwNzMsIDE4MykpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQjc1MDJEQSIKLQkJICAgIGNsaWVudCAgICAgCUAxMgotCQkgICAgc3VwcGxpZXIgICAJQDExCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgNDAxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY2OCwgMzIzKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTMpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPYmplY3QiIEAxNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzUxLCA5NDIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE1Ci0JCQlsb2NhdGlvbiAgIAkoMTY0NSwgODk2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIxMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVPYmplY3QiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjNDNEYxQzg2MDEyMyIKLQkJICAgIHdpZHRoICAgICAgCTIzMAotCQkgICAgaGVpZ2h0ICAgICAJMTE3Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUiIEAxNgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMTQyLCA5MjcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTYKLQkJCWxvY2F0aW9uICAgCSgxOTE4LCA4ODEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDQ4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRVN0cnVjdHVyYWxGZWF0dXJlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzY5NjAKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDU5RDAyMzAiCi0JCSAgICB3aWR0aCAgICAgIAk0NjYKLQkJICAgIGhlaWdodCAgICAgCTExNwotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJbXBsaWNpdEFsbG9jYXRpb24iIEAxNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMDE4LCA1MTApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3Ci0JCQlsb2NhdGlvbiAgIAkoMTgxOSwgNDU4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkltcGxpY2l0QWxsb2NhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVDMTQwMjQyIgotCQkgICAgd2lkdGggICAgICAJNDE2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVDNDcwMEU3IgotCQkgICAgY2xpZW50ICAgICAJQDE3Ci0JCSAgICBzdXBwbGllciAgIAlAMTEKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjAyMywgNDQ2KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjMsIDMyMykKLQkJICAgIGRyYXdTdXBwbGllciAJQDEzKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDE5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTg4MSwgNzI4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVENzEwM0Q1IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJlbnQiIEAyMAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTkKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzE2LCAyMjgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQotCQkJCVBhcmVudF9WaWV3IAlAMjAKLQkJCQlsb2NhdGlvbiAgIAkoMTcyNywgODQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxMzcKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwYXJlbnQiCi0JCQkJcGN0RGlzdCAgICAJMC45OTEyMjQKLQkJCQloZWlnaHQgICAgIAk3MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGRDlFRDcyMDM5MCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTkKLQkJCSAgICBzdXBwbGllciAgIAlAMTUKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIKLQkJCQlQYXJlbnRfVmlldyAJQDIwCi0JCQkJbG9jYXRpb24gICAJKDE4NzEsIDc5NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC4zMzc4MTcKLQkJCQloZWlnaHQgICAgIAkyNgotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEAyMwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTkKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzE2LCAyMjgpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVENzIwMzlBIgotCQkJICAgIGNsaWVudCAgICAgCUAxOQotCQkJICAgIHN1cHBsaWVyICAgCUAxNwotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAyNAotCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDcyMSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFREQwMDA4OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZmVhdHVyZSIgQDI1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJICAgIGxvY2F0aW9uICAgCSg5MTUsIDIyMSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNQotCQkJCWxvY2F0aW9uICAgCSgyMDI4LCA3NjYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ZlYXR1cmUiCi0JCQkJcGN0RGlzdCAgICAJMC4xODEzNDYKLQkJCQloZWlnaHQgICAgIAk2NAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGRDlFREQxMDE0OCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjQKLQkJCSAgICBzdXBwbGllciAgIAlAMTYKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcKLQkJCQlQYXJlbnRfVmlldyAJQDI1Ci0JCQkJbG9jYXRpb24gICAJKDIxNzIsIDgzOSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAyOAotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTE1LCAyMjEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVERDEwMTUyIgotCQkJICAgIGNsaWVudCAgICAgCUAyNAotCQkJICAgIHN1cHBsaWVyICAgCUAxNwotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iIEAyOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjY0LCA3NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCWxvY2F0aW9uICAgCSgxMDk1LCA3MjUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzM4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTI2MTU5MzUKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICB3aWR0aCAgICAgIAkzNTYKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQYXJzZVRyZWVBbGxvY2F0aW9uIiBAMzAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NSwgNDk1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzMAotCQkJbG9jYXRpb24gICAJKDEwMzIsIDQ0MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQYXJzZVRyZWVBbGxvY2F0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkM5MTAwMDUiCi0JCSAgICB3aWR0aCAgICAgIAk0ODQKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkNCNzAxRDYiCi0JCSAgICBjbGllbnQgICAgIAlAMzAKLQkJICAgIHN1cHBsaWVyICAgCUAxMQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY1LCA0MzEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2NSwgMzIzKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTMpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMzIKLQkJICAgIGxvY2F0aW9uICAgCSgxMjY0LCA2MzUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MzRDRTAwMUIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImV4cHJlc3Npb24iIEAzMwotCQkJICAgIFBhcmVudF9WaWV3IAlAMzIKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEsIDE0MCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Ci0JCQkJUGFyZW50X1ZpZXcgCUAzMwotCQkJCWxvY2F0aW9uICAgCSgxMTExLCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIyMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2V4cHJlc3Npb24iCi0JCQkJcGN0RGlzdCAgICAJMC40OTI1MzcKLQkJCQloZWlnaHQgICAgIAkxNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MzRDRjAyRTQiCi0JCQkgICAgY2xpZW50ICAgICAJQDMyCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1Ci0JCQkJUGFyZW50X1ZpZXcgCUAzMwotCQkJCWxvY2F0aW9uICAgCSgxMzA3LCA2NzkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuNTY3MTY0Ci0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMzYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkgICAgbG9jYXRpb24gICAJKC0xLCAxNDApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiNDAwODM0Q0YwMkU2IgotCQkJICAgIGNsaWVudCAgICAgCUAzMgotCQkJICAgIHN1cHBsaWVyICAgCUAzMAotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJQYXJzZSBUcmVlIEV4cHJlc3Npb25zIgotCSAgICBxdWlkICAgICAgIAkiNDAwODJDQzIwMTQ2IgotCSAgICB0aXRsZSAgICAgIAkiUGFyc2UgVHJlZSBFeHByZXNzaW9ucyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTI1Ci0JICAgIG9yaWdpbl95ICAgCTU3NjgKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iIEAzNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ4LCAxMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzcKLQkJCWxvY2F0aW9uICAgCSgxMTc5LCA3MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQXJyYXlBY2Nlc3MiIEAzOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMjM1LCA1NDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM4Ci0JCQlsb2NhdGlvbiAgIAkoMTg0OCwgNDEzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTc3NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQXJyYXlBY2Nlc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRTE0MDI1MCIKLQkJICAgIHdpZHRoICAgICAgCTc5MgotCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQXJyYXlDcmVhdGlvbiIgQDM5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQzNCwgNTE5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzOQotCQkJbG9jYXRpb24gICAJKDksIDM2MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk4NTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEFycmF5Q3JlYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzNzEyMDI1QSIKLQkJICAgIHdpZHRoICAgICAgCTg2OAotCQkgICAgaGVpZ2h0ICAgICAJMzM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQXJyYXlJbml0aWFsaXplciIgQDQwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNjEsIDUxOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDAKLQkJCWxvY2F0aW9uICAgCSg5MjksIDQzOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk4NjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEFycmF5SW5pdGlhbGl6ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzOTY4MDE0QyIKLQkJICAgIHdpZHRoICAgICAgCTg4MgotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQm9vbGVhbkxpdGVyYWwiIEA0MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg5OTcsIDg3MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDEKLQkJCWxvY2F0aW9uICAgCSg3MTksIDc5MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1NTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEJvb2xlYW5MaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4M0FFNzAyNDciCi0JCSAgICB3aWR0aCAgICAgIAk1NzQKLQkJICAgIGhlaWdodCAgICAgCTE4NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVENhc3RFeHByZXNzaW9uIiBANDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc5MSwgODg5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MgotCQkJbG9jYXRpb24gICAJKDE0NzQsIDc1OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk2MzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVENhc3RFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4M0I2RjAwNTgiCi0JCSAgICB3aWR0aCAgICAgIAk2NTIKLQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQzCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0OCwgMzMwKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTM0OCwgMzMwKQotCQkJKDEzNDgsIDE4NykpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzOTc5MDAzOCIKLQkJICAgIGNsaWVudCAgICAgCUA0MAotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzODEsIDQyNSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzgxLCAzMzApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0MykKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4M0IxRDAwMDAiCi0JCSAgICBjbGllbnQgICAgIAlANDEKLQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTgsIDc3OCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MTgsIDMzMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQzKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzQkQ2MDMwOSIKLQkJICAgIGNsaWVudCAgICAgCUA0MgotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3OTEsIDc0NikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzkxLCAzMzApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0MykKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkU2RjAxRjciCi0JCSAgICBjbGllbnQgICAgIAlAMzgKLQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjM1LCA0MDEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzNSwgMzMwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDMpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIiBANDgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM3MiwgMTA5NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0OAotCQkJbG9jYXRpb24gICAJKDEyMDMsIDEwNDQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzM4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTI2MTU5MzUKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICB3aWR0aCAgICAgIAkzNTYKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVENoYXJhY3RlckxpdGVyYWwiIEA0OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0MzAsIDE0MzgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ5Ci0JCQlsb2NhdGlvbiAgIAkoMTY0LCAxMzMyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUzMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQ2hhcmFjdGVyTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODRERjEwMjc3IgotCQkgICAgd2lkdGggICAgICAJNTUwCi0JCSAgICBoZWlnaHQgICAgIAkyMzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUwCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM3MjEwMDQ5IgotCQkgICAgY2xpZW50ICAgICAJQDM5Ci0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTYxLCAzNTEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYxLCAzMzApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0MykKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiIgQDUxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNDYsIDE0NjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUxCi0JCQlsb2NhdGlvbiAgIAkoOTMwLCAxMzMzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTgzMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NEY0MDAyNkYiCi0JCSAgICB3aWR0aCAgICAgIAk4NTAKLQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDUyCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM3MiwgMTI2MCkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlANDgKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEzNzIsIDEyNjApCi0JCQkoMTM3MiwgMTE1OCkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1MwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg0RTEzMDFFQSIKLQkJICAgIGNsaWVudCAgICAgCUA0OQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU2NCwgMTMxOSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjQsIDEyNjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1MikKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NEY0QzAyRjgiCi0JCSAgICBjbGllbnQgICAgIAlANTEKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY3LCAxMzIwKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjcsIDEyNjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1MikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiIgQDU1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIxNjksIDE0ODEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU1Ci0JCQlsb2NhdGlvbiAgIAkoMTg3MiwgMTMyNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1OTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUxRkIwMjZBIgotCQkgICAgd2lkdGggICAgICAJNjEyCi0JCSAgICBoZWlnaHQgICAgIAkzMzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUyNzQwMTJFIgotCQkgICAgY2xpZW50ICAgICAJQDU1Ci0JCSAgICBzdXBwbGllciAgIAlANDgKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjE2OCwgMTMxMykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTY4LCAxMjYwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTIpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRGaWVsZEFjY2VzcyIgQDU3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDc2MSwgMTc5NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTcKLQkJCWxvY2F0aW9uICAgCSg0NzksIDE2NjMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRGaWVsZEFjY2VzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUyREYwMjA0IgotCQkgICAgd2lkdGggICAgICAJNTgyCi0JCSAgICBoZWlnaHQgICAgIAkyODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUzNUQwMjQxIgotCQkgICAgY2xpZW50ICAgICAJQDU3Ci0JCSAgICBzdXBwbGllciAgIAlANDgKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzYwLCAxNjUxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUSW5maXhFeHByZXNzaW9uIiBANTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc5MCwgMTg0NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTkKLQkJCWxvY2F0aW9uICAgCSgxMjg2LCAxNjY0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTEwMDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEluZml4RXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUzOEIwMTQzIgotCQkgICAgd2lkdGggICAgICAJMTAyNgotCQkgICAgaGVpZ2h0ICAgICAJMzg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUSW5maXhPcGVyYXRvciIgQDYwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI2NjAsIDIyMDcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDYwCi0JCQlsb2NhdGlvbiAgIAkoMjM0NSwgMTY5OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MzAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEluZml4T3BlcmF0b3IiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjAKLQkJCWxvY2F0aW9uICAgCSgyMzQ1LCAxNjQ5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MzAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1M0UxMDM1OSIKLQkJICAgIHdpZHRoICAgICAgCTY0OAotCQkgICAgaGVpZ2h0ICAgICAJMTE0MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTU3MDAwMzIiCi0JCSAgICBjbGllbnQgICAgIAlANTkKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzg5LCAxNjUyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3ODksIDEyNjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1MikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iIEA2MgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjcyLCAyODUzKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDYyCi0JCQlsb2NhdGlvbiAgIAkoMTEwMywgMjgwMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYxNTkzNQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUSW5zdGFuY2VvZiIgQDYzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM3MSwgMzI1NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjMKLQkJCWxvY2F0aW9uICAgCSg4NSwgMzEyNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1NzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEluc3RhbmNlb2YiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1N0QzMDNBMiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDYzCi0JCQlsb2NhdGlvbiAgIAkoODUsIDMxODUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJNDkzKQotCQkgICAgd2lkdGggICAgICAJNTkwCi0JCSAgICBoZWlnaHQgICAgIAkyODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRNZXRob2RJbnZvY2F0aW9uIiBANjQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0NiwgMzI1OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCWxvY2F0aW9uICAgCSg4NjAsIDMxMTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNzcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRNZXRob2RJbnZvY2F0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NThCNjAxOEIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJbG9jYXRpb24gICAJKDg2MCwgMzE3OCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk0Ci0JCQltYXhfd2lkdGggIAk3MTUpCi0JCSAgICB3aWR0aCAgICAgIAk3OTAKLQkJICAgIGhlaWdodCAgICAgCTMwNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVE5hbWUiIEA2NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxOTYyLCAzMjEyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2NQotCQkJbG9jYXRpb24gICAJKDE4MDksIDMxMjEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzA3Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFROYW1lIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NThFQTAyODAiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA2NQotCQkJbG9jYXRpb24gICAJKDE4MDksIDMxODIpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMzAzKQotCQkgICAgd2lkdGggICAgICAJMzI1Ci0JCSAgICBoZWlnaHQgICAgIAkyMDUKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NgotCQkgICAgbG9jYXRpb24gICAJKDEyNzIsIDMwNjEpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMjcyLCAzMDYxKQotCQkJKDEyNzIsIDI5MTYpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTg5MTAzQUYiCi0JCSAgICBjbGllbnQgICAgIAlANjMKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NzQsIDMxMTIpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDc0LCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVCOUQwMDY3IgotCQkgICAgY2xpZW50ICAgICAJQDY0Ci0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI0NSwgMzEwNikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ1LCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVCQTEwMERCIgotCQkgICAgY2xpZW50ICAgICAJQDY1Ci0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkwNSwgMzExMCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTA1LCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFROdWxsTGl0ZXJhbCIgQDcwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMjgsIDMxOTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcwCi0JCQlsb2NhdGlvbiAgIAkoMjE3MCwgMzE0MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVE51bGxMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUJCRjAwMjAiCi0JCSAgICB3aWR0aCAgICAgIAkzMzQKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUJENDAyRjEiCi0JCSAgICBjbGllbnQgICAgIAlANzAKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjk3LCAzMTMxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTcsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iIEA3MgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjQzLCAzODY3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcyCi0JCQlsb2NhdGlvbiAgIAkoMTA3NCwgMzgxNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYxNTkzNQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUTnVtYmVyTGl0ZXJhbCIgQDczCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMzU4MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzMKLQkJCWxvY2F0aW9uICAgCSg2MTksIDM0ODkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzY3Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFROdW1iZXJMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUM0MDAzNUIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3MwotCQkJbG9jYXRpb24gICAJKDYxOSwgMzU1MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkzMDMpCi0JCSAgICB3aWR0aCAgICAgIAkzODUKLQkJICAgIGhlaWdodCAgICAgCTIxMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUNFRjAyNDQiCi0JCSAgICBjbGllbnQgICAgIAlANzMKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzAsIDM0NzgpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzMwLCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIgQDc1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE2NzksIDM2MDkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDc1Ci0JCQlsb2NhdGlvbiAgIAkoMTM4MSwgMzUxMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1OTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUNGOTAwN0MiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3NQotCQkJbG9jYXRpb24gICAJKDEzODEsIDM1NzQpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTQ2KQotCQkgICAgd2lkdGggICAgICAJNjE0Ci0JCSAgICBoZWlnaHQgICAgIAkyMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVGNEUwM0UxIgotCQkgICAgY2xpZW50ICAgICAJQDc1Ci0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY3NywgMzUwMikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc3LCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRQcmVmaXhFeHByZXNzaW9uIiBANzcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzMwLCA0MjIxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3NwotCQkJbG9jYXRpb24gICAJKDksIDQwOTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNjQyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRQcmVmaXhFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUZBRDAwOEIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3NwotCQkJbG9jYXRpb24gICAJKDksIDQxNTEpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJNTUzKQotCQkgICAgd2lkdGggICAgICAJNjYwCi0JCSAgICBoZWlnaHQgICAgIAkyODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRQcmVmaXhPcGVyYXRvciIgQDc4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMywgNDYwMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzgKLQkJCWxvY2F0aW9uICAgCSgzNCwgNDQ2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzOTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFByZWZpeE9wZXJhdG9yIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDc4Ci0JCQlsb2NhdGlvbiAgIAkoMzQsIDQ0MTgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYwMjQwMEQyIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANzgKLQkJCWxvY2F0aW9uICAgCSgzNCwgNDUyOSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk1Ci0JCQltYXhfd2lkdGggIAkzNDMpCi0JCSAgICB3aWR0aCAgICAgIAk0MTYKLQkJICAgIGhlaWdodCAgICAgCTM5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFN0cmluZ0xpdGVyYWwiIEA3OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDI1LCA0MTk2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3OQotCQkJbG9jYXRpb24gICAJKDg0OSwgNDA5MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFN0cmluZ0xpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2MUUyMDAwQiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDc5Ci0JCQlsb2NhdGlvbiAgIAkoODQ5LCA0MTUzKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTMKLQkJCW1heF93aWR0aCAgCTQ1OSkKLQkJICAgIHdpZHRoICAgICAgCTM3MAotCQkgICAgaGVpZ2h0ICAgICAJMjMwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODAKLQkJICAgIGxvY2F0aW9uICAgCSgxMjQzLCA0MDIwKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTI0MywgNDAyMCkKLQkJCSgxMjQzLCAzOTMwKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYyRDcwMzM4IgotCQkgICAgY2xpZW50ICAgICAJQDc5Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAwOCwgNDA4MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA4LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYyREMwMUQ3IgotCQkgICAgY2xpZW50ICAgICAJQDc3Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjk3LCA0MDc4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI5NywgNDAyMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDgwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUVGhpc0xpdGVyYWwiIEA4MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNjU1LCA0MTgwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4MwotCQkJbG9jYXRpb24gICAJKDE0OTQsIDQxMjkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRUaGlzTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYzQTcwMENCIgotCQkgICAgd2lkdGggICAgICAJMzQwCi0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODY0MTgwMTlGIgotCQkgICAgY2xpZW50ICAgICAJQDgzCi0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYyNywgNDExNykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjI3LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRUeXBlTGl0ZXJhbCIgQDg1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIyNTYsIDQyMDEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDg1Ci0JCQlsb2NhdGlvbiAgIAkoMjA5MywgNDEwNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFR5cGVMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjQ5NTAxODEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA4NQotCQkJbG9jYXRpb24gICAJKDIwOTMsIDQxNjcpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMjgxKQotCQkgICAgd2lkdGggICAgICAJMzQ1Ci0JCSAgICBoZWlnaHQgICAgIAkyMTUKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODY1NEMwMDA4IgotCQkgICAgY2xpZW50ICAgICAJQDg1Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjE5NywgNDA5MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTk3LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbnZhbGlkRXhwcmVzc2lvbiIgQDg3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE0NTcsIDQ1NDUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDg3Ci0JCQlsb2NhdGlvbiAgIAkoMTI3OSwgNDQ0OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNTcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEludmFsaWRFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjVBRjAyMDkiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA4NwotCQkJbG9jYXRpb24gICAJKDEyNzksIDQ1MTApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMzY4KQotCQkgICAgd2lkdGggICAgICAJMzc1Ci0JCSAgICBoZWlnaHQgICAgIAkyMTUKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODY2RjUwMjU4IgotCQkgICAgY2xpZW50ICAgICAJQDg3Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQxMywgNDQzOCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEzLCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFJbnN0YW5jZSIgQDg5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMDEsIDQ5MTcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDg5Ci0JCQlsb2NhdGlvbiAgIAkoMjEzNywgNDg4NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJSmF2YUluc3RhbmNlIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDg5Ci0JCQlsb2NhdGlvbiAgIAkoMjEzNywgNDgzNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzI4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiCi0JCSAgICB3aWR0aCAgICAgIAkzNDYKLQkJICAgIGhlaWdodCAgICAgCTE4NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEluc3RhbmNlUmVmZXJlbmNlIiBAOTAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAwNSwgNDUwOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOTAKLQkJCWxvY2F0aW9uICAgCSgxODA1LCA0MzkzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQwMQotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5zdGFuY2VSZWZlcmVuY2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQjE4MDJCMyIKLQkJICAgIHdpZHRoICAgICAgCTQxOQotCQkgICAgaGVpZ2h0ICAgICAJMjU3Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQjRBMDM0MSIKLQkJICAgIGNsaWVudCAgICAgCUA5MAotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NDMsIDQzODEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MywgNDAyMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDgwKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDkyCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE2NSwgNDczMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQkUzMDEzOCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNlIiBAOTMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDkyCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNywgMjU5KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQKLQkJCQlQYXJlbnRfVmlldyAJQDkzCi0JCQkJbG9jYXRpb24gICAJKDIxMjAsIDQ3OTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE4OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3JlZmVyZW5jZSIKLQkJCQlwY3REaXN0ICAgIAkwLjIzMTk2MAotCQkJCWhlaWdodCAgICAgCTc3Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCRTYwMDA2IgotCQkJICAgIGNsaWVudCAgICAgCUA5MgotCQkJICAgIHN1cHBsaWVyICAgCUA4OQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NQotCQkJCVBhcmVudF9WaWV3IAlAOTMKLQkJCQlsb2NhdGlvbiAgIAkoMjI3MCwgNDc4MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEA5NgotCQkJICAgIFBhcmVudF9WaWV3IAlAOTIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3LCAyNTkpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCRTYwMTY0IgotCQkJICAgIGNsaWVudCAgICAgCUA5MgotCQkJICAgIHN1cHBsaWVyICAgCUA5MAotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24iIEA5NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4NTIsIDQ1NzcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDk3Ci0JCQlsb2NhdGlvbiAgIAkoNDk1LCA0NDcxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTcxNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDM2MjdDMTQwMzk2IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAOTcKLQkJCWxvY2F0aW9uICAgCSg0OTUsIDQ1MzIpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJNTAzKQotCQkgICAgd2lkdGggICAgICAJNzMyCi0JCSAgICBoZWlnaHQgICAgIAkyMzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDM2MjdENEUwMEQwIgotCQkgICAgY2xpZW50ICAgICAJQDk3Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjc3LCA0NDU5KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY3NywgNDAyMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDgwKSkpKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvamF2YU1vZGVsLm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvamF2YU1vZGVsLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmYjkyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2phdmFNb2RlbC5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4ODE5ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiSURFIgotCSAgICB2YWx1ZSAgICAgIAkiSW50ZXJuYWwgRWRpdG9yIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIgotCSAgICB2YWx1ZSAgICAgIAkiIikpCi0gICAgcXVpZCAgICAgICAJIjM5RURGQkUwMDNCNCIKLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDAKLQl0b3BNYXJnaW4gIAkwLjI1MDAwMAotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKLQljbGlwSWNvbkxhYmVscyAJVFJVRQotCWF1dG9SZXNpemUgCVRSVUUKLQlzbmFwVG9HcmlkIAlUUlVFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiMzlFREZCRTAwM0I2IgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiMzlFREZCRTIwMDhEIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjM5RURGQkUwMDNCNSIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjM5RURGQkUwMDNCNyIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqYXZhIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuamVtXFxyb3NlXFxlZG9jamF2YTIuY2F0IgotCQlxdWlkICAgICAgIAkiMzY1NDlGMkMwMDRFIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWNvcmUiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRWNvcmUuY2F0IgotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiMzlFREZCRTIwMDhFIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6amF2YSIgQDEKLQkJCWxvY2F0aW9uICAgCSg3ODQsIDUyOCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMQotCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDQ5MykKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkzMDgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImphdmEiKQotCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjMwLCA0NDMpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCSAgICBtYXhfd2lkdGggIAkzMDgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJIjw8bWV0YW1vZGVsPj4iKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjM2NTQ5RjJDMDA0RSIKLQkJCXdpZHRoICAgICAgCTMyMAotCQkJaGVpZ2h0ICAgICAJMTgyKQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWNvcmUiIEAyCi0JCQlsb2NhdGlvbiAgIAkoMzA0LCA1NDQpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwLCA0NjApCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciCi0JcXVpZCAgICAgICAJIjM5RURGQkUwMDNCNyIKLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiMzlFREZCRTIwMDhDIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMKLQlxdWlkICAgICAgIAkiMzlFREZCRTAwM0I4IgotCVByb2NzTkRldnMgCShsaXN0Ci0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciCi0JCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQkEiCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJyb3NlSWQiCi0JCXZhbHVlICAgICAgCSI3NTMxMTc1NDAiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY5IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJyZWZlcmVuY2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5jcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAktMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIgotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIxIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMiIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjMiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI0IgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHkiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQm9keVNvdXJjZUZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFOU0kgQysrIEV2ZW50IFdhdGNoZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NBY2Nlc3MiCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0MykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlBvbHltb3JwaGljVW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyIKLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIkFfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSJUaGlzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJGcmVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0VxdWFsaXR5T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzVGFzayIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiTGltaXRlZFByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTW9kZSIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiU3BlYyIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiSW4iCi0JCQkJdmFsdWUgICAgICAJMjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJPdXQiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJJbk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uUmV0dXJuIgotCQkJCXZhbHVlICAgICAgCTIwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVXNlQ29sb25Ob3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQURBOTVfU09VUkNFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJUeXBlSW1wbGVtZW50YXRpb25TZXQiIDIwOCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sIgotCQkJdmFsdWUgICAgICAJKCJUeXBlQ29udHJvbFNldCIgMjI1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiIDIwOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEtpbmRQYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZURlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk1heWJlQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU3VwZXJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJBXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4IgotCQkJdmFsdWUgICAgICAJIlRoZV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHt0eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHt0eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZBY2Nlc3NUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheUluZGV4RGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSJQb3NpdGl2ZSByYW5nZSA8PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSJUaGlzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkZyZWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVFcXVhbGl0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtxdW90ZX09JHtxdW90ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJUYWdnZWQiCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZWNvcmQiCi0JCQkJdmFsdWUgICAgICAJMjEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJNaXhpbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVGFzayIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVR5cGUiCi0JCQkJdmFsdWUgICAgICAJMjA5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIgotCQkJCXZhbHVlICAgICAgCTIxMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJMjE0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTIyNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW5pdGlhbGl6YXRpb25Pbmx5IgotCQkJCXZhbHVlICAgICAgCTIyNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXNzaWdubWVudEZpbmFsaXphdGlvbk9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjI3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMjI4KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIgotCQkJCXZhbHVlICAgICAgCTIyOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXV0byIKLQkJCQl2YWx1ZSAgICAgIAkyMzApKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1ByaXZhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkaW5nIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc09wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiVHJ1ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiCi0JCQkJdmFsdWUgICAgICAJMjI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJCb2R5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZ0FzQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIgotCQkJCXZhbHVlICAgICAgCTIyMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluT3V0IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyMTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyMTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNsZWFyQ2FzZSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJwcm9qZWN0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRG9tYWluQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluZGV4Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVmlld1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbmRleFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RhdGFiYXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYXJnZXREYXRhYmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVGFibGVTcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGVhdWx0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJCdWZmZXJQb29sIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJFeHRlbnRTaXplIgotCQkJdmFsdWUgICAgICAJMSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSIKLQkJCXZhbHVlICAgICAgCTEpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYWdlU2l6ZSIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJNYW5hZ2VkQnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbVNjaGVtYSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1Eb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1Jvb3RTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGF0YWJhc2VJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiREJNUyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVmlldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU1BQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTeW5vbnltbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0Q2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTbmFwU2hvdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEaXN0aW5jdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGVyc2lzdFRvU2VydmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1BhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJZGVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTmF0aXZlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUmVsYXRpb25zaGlwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUklNZXRob2QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzQ2x1c3RlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJLZXlMaXN0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmVyYWxNb2RlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJbnNlcnRFdmVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmT2xkVGFibGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk5ld1JvdyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb3ciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxhbmd1YWdlIgotCQkJdmFsdWUgICAgICAJIlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSIKLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJTdHlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzT3V0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb290RGlyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJvc2VJRCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk0iCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcY2hhcnNldHMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcamNlLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGpzc2UuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxccnQuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcc3VucnNhc2lnbi5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXGRuc25zLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcbGRhcHNlYy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXGxvY2FsZWRhdGEuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxzdW5qY2VfcHJvdmlkZXIuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcc2VjdXJpdHlcXGxvY2FsX3BvbGljeS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzZWN1cml0eVxcVVNfZXhwb3J0X3BvbGljeS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcZHQuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxsaWJcXGh0bWxjb252ZXJ0ZXIuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxsaWJcXHRvb2xzLmphciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVmZXJlbmNlQ2xhc3NwYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN1biIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0IgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJJQk0iCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVkFKYXZhV29ya2luZ0ZvbGRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkibV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkic18iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJInZvaWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiCi0JCQl2YWx1ZSAgICAgIAkzKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlbW90ZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlbW90ZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkhvbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJIb21lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJEVERMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREVERMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNlcnZsZXRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVKYXZhRG9jVGFncyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VDb250cm9sIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDU2VsZWN0ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0U291cmNlUm9vdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3ROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDQ29tbWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0NvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJNzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQm91bmQiCi0JCQkJdmFsdWUgICAgICAJNzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJNzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiCi0JCQkJdmFsdWUgICAgICAJODEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIl9JRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCIKLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50IgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTE5MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIgotCQkJCXZhbHVlICAgICAgCTE5MDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQUZURVIiCi0JCQkJdmFsdWUgICAgICAJMTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiCi0JCQkJdmFsdWUgICAgICAJMTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIgotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJST1ciCi0JCQkJdmFsdWUgICAgICAJMTcwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiCi0JCQkJdmFsdWUgICAgICAJMTYwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSI2IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJlcXVpc2l0ZVBybyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiY29tcGlsZXIyLjFfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjMuMF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5IgotCQkJdmFsdWUgICAgICAJImNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBYnN0cmFjdEJvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmRCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kRGVjbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTcGVjaWFsRGVjbFJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kZW50IgotCQkJdmFsdWUgICAgICAJMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiCi0JCQkJdmFsdWUgICAgICAJNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciIKLQkJCQl2YWx1ZSAgICAgIAk3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiU29EQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVG9wTGluayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiZW51bSIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJyZWNvcmQiCi0JCQkJdmFsdWUgICAgICAJMTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkibW9kdWxlIgotCQkJCXZhbHVlICAgICAgCTEwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJkaXNwaW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTEwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiCi0JCQkJdmFsdWUgICAgICAJMTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiYWxpYXMiCi0JCQkJdmFsdWUgICAgICAJMTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkidW5pb24iCi0JCQkJdmFsdWUgICAgICAJMTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkibWF4IgotCQkJCXZhbHVlICAgICAgCTEwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkxMDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInV1aWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhbGlhcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ1dWlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImxjaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIxOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIyMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIwIgotCQkJCXZhbHVlICAgICAgCTIyMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIjEiCi0JCQkJdmFsdWUgICAgICAJMjI0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIgotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSIKLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmciCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJUZXh0IgotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJ5VmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCeVJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlBhcmFtQXJyYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUXVpY2tJbXBvcnQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJXZWIgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVudGl0eV9QdWJsaWNJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyRW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1B1YmxpY0lEIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSMkVkaXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5jcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAktMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIgotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIzIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNCIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGVwbG95IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImNsYXNzaWZpZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImNvbnN0cmFpbnRzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sQ29udGVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRlbnRLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiQ29udGVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVtcHR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJNaXhlZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50T25seSIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkib3BlcmF0aW9uTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKSkKLQlxdWlkICAgICAgIAkiMzlFREZCRTAwM0I5IikpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5ODY4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb250cm9sbGVyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTBiMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1jb250cm9sbGVyLmphcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjN2YyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2ZlNTA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQW5ub3RhdGlvbiBDb250cm9sbGVyIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAuLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlciwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjY4OGVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSAudGVtcGxhdGUsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBjb250cm9sbGVyLyxcCi0gICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvbnRyb2xsZXIvQW5ub3RhdGlvbnNDb250cm9sbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhMzBjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEFubm90YXRpb25zIENvbnRyb2xsZXIgaW50ZXJmYWNlIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBlbWl0dGVycyBhbmQgZGV0ZXJtaW5pbmcgYXZhaWxhYmxlCi0gKiB0YWcgc2V0cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25zQ29udHJvbGxlciB7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGEgdGFnIGhhbmRsZXIgaXMgaW5zdGFsbGVkIGZvciB0aGUgc3BlY2lmaWVkIHRhZwotCSAqIAotCSAqIEBwYXJhbSB0YWdzZXQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgdGFnc2V0IChlLmcuICJlamIiKQotCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBnaXZlbiB0YWdzZXQgaXMgYXZhaWxhYmxlIGFuZCBlbmFibGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUYWdIYW5kbGVySW5zdGFsbGVkKFN0cmluZyB0YWdzZXQpOwotCi0JLyoqCi0JICogRGlzYWJsZXMgYW5ub3RhdGlvbiBwcm9jZXNzaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIG1vZGVsT2JqZWN0Ci0JICogICAgICAgICAgICBUaGUgQW5ub3RhdGVkIEVNRiBPYmplY3QKLQkgKiBAcGFyYW0gdGFnc2V0Ci0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbnMgdGFnc2V0IHRvIGRpc2FibGUgb24gdGhlIG9iamVjdAotCSAqIEByZXR1cm4gYW4gSVN0YXR1cyByZXByZXNlbnRpbmcgc3VjY2VzcyBvciBmYWlsdXJlCi0JICovCi0JcHVibGljIElTdGF0dXMgZGlzYWJsZUFubm90YXRpb25zKEVPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyB0YWdzZXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRlZCBhbm5vdGF0ZWQgZmlsZSBpZiB0aGUgc3BlY2lmaWVkIG1vZGVsIG9iamVjdCB3YXMgZ2VuZXJhdGVkIHZpYQotCSAqIGFubm90YXRpb25zIGZyb20gYSBwYXJlbnQgcmVzb3VyY2UgYW5kIGlzIGVuYWJsZWQKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWxPYmplY3QKLQkgKiAgICAgICAgICAgIFRoZSBBbm5vdGF0ZWQgRU1GIE9iamVjdAotCSAqIEByZXR1cm4gdGhlIGFubm90YXRlZCBzb3VyY2UgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG1vZGVsT2JqZWN0Ci0JICovCi0JcHVibGljIElGaWxlIGdldEVuYWJsZWRBbm5vdGF0aW9uRmlsZShFT2JqZWN0IG1vZGVsT2JqZWN0KTsKLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGFubm90YXRpb25zIG9uIHRoZSBnaXZlbiByZXNvdXJjZSBkdXJpbmcgY3JlYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCBmaWxlcyB0b3VjaGVkIGJ5IHRoZSBhbm5vdGF0aW9ucyBwcm9jZXNzaW5nCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSBwcm9jZXNzaW5nCi0JICovCi0JcHVibGljIElGaWxlW10gcHJvY2VzcyhJUmVzb3VyY2UgcmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGFubm90YXRpb25zIG9uIHRoZSBnaXZlbiByZXNvdXJjZSBhcnJheQotCSAqIAotCSAqIEByZXR1cm4gYWxsIGZpbGVzIHRvdWNoZWQgYnkgdGhlIGFubm90YXRpb25zIHByb2Nlc3NpbmcKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcKLQkgKi8KLQlwdWJsaWMgSUZpbGVbXSBwcm9jZXNzKElSZXNvdXJjZVtdIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgYW4gb3Bwb3J0dW5pdHkgdG8gaW5pdGlhbGl6ZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgYW4gb3Bwb3J0dW5pdHkgdG8gZGlzcG9zZSBhbmQgY2xlYW51cAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb250cm9sbGVyL0Fubm90YXRpb25zQ29udHJvbGxlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjhhMDQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb250cm9sbGVyL0Fubm90YXRpb25zQ29udHJvbGxlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29udHJvbGxlckhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uc0NvbnRyb2xsZXJIZWxwZXIgSU5TVEFOQ0UgPSBuZXcgQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyKCk7Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGVkPyBtb2RlbCBvYmplY3QKLQkgKiBAcmV0dXJuIHRydWUgb25seSBpZiB0aGUgb2JqZWN0IGhhcyBhbm5vdGF0aW9ucwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVPYmplY3QsIEFubm90YXRpb25zQWRhcHRlci5HRU5FUkFURUQpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgdG8gdGFnIGEgbW9kZWwgb2JqZWN0IGFzIGFubm90YXRlZAotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW5ub3RhdGVkKEVPYmplY3QgZU9iamVjdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCUFubm90YXRpb25zQWRhcHRlci5hZGRBbm5vdGF0aW9ucyhlT2JqZWN0LCBBbm5vdGF0aW9uc0FkYXB0ZXIuR0VORVJBVEVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgdG8gdGFnIGEgbW9kZWwgb2JqZWN0IGFzIGFubm90YXRlZCBBbm5vdGF0aW9ucyBBZGFwdGVycyBjYW4gaG9sZCBleHRyYQotCSAqIGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nIGtleQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgQSBTdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9ucyhFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyLmFkZEFubm90YXRpb25zKGVPYmplY3QsIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0byB0YWcgYSBtb2RlbCBvYmplY3QgYXMgYW5ub3RhdGVkIEFubm90YXRpb25zIEFkYXB0ZXJzIGNhbiBob2xkIGV4dHJhCi0JICogaW5mb3JtYXRpb24uCi0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgQSBzdHJpbmcga2V5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBBIFN0cmluZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QW5ub3RhdGlvbnMoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVPYmplY3QsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFjcXVpcmVzIHRoZSBnZW5lcmF0ZWQgYW5ub3RhdGlvbiBjb21tZW50IGFuZCBwYXJzZXMgdGhlIEZyYWdtZW50IFVSTCBvZiB0aGUgZm9sbG93aW5nIGZvcm0KLQkgKiB0byByZXR1cm4gdGhlIHRhZ3NldCBuYW1lOgotCSAqIAotCSAqIGNvbS5hY21lLmVqYnMuTXlFSkIjIDx0YWdzZXQ+LyA8ZnJhZ21lbnQ+LiA8ZnJhZ21lbnQtcG9pbnRlcj4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqICAgICAgICAgICAgVGhlIGFubm90YXRlZCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiA8dGFnc2V0PmluIHRoZSBVUkwgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnc2V0KEVPYmplY3QgZU9iamVjdCkgewotCi0JCVN0cmluZyBnZW5lcmF0ZWRDb21tZW50ID0gKFN0cmluZykgQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVPYmplY3QsIEFubm90YXRpb25zQWRhcHRlci5HRU5FUkFURUQpOwotCQlpZiAoZ2VuZXJhdGVkQ29tbWVudCA9PSBudWxsIHx8IGdlbmVyYXRlZENvbW1lbnQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgcG91bmRpdCA9IGdlbmVyYXRlZENvbW1lbnQuaW5kZXhPZignIycpOwotCQlpbnQgc2xhc2ggPSBnZW5lcmF0ZWRDb21tZW50LmluZGV4T2YoJy8nKTsKLQkJaWYgKHBvdW5kaXQgPCAwIHx8IHNsYXNoIDwgMCB8fCBwb3VuZGl0ID49IHNsYXNoKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZW5lcmF0ZWRDb21tZW50LnN1YnN0cmluZyhwb3VuZGl0ICsgMSwgc2xhc2gpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ29tcGlsYXRpb25Vbml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbW9kZWwgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIGFuIEFubm90YXRlZCBtb2RlbCBPYmplY3QKLQkgKiBAcmV0dXJuIFRoZSBjb21waWxhdGlvbiB1bml0IHdoaWNoIHdhcyByZXNwb25zaWJsZSBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdAotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldEFubm90YXRlZENVKEVPYmplY3QgZU9iamVjdCkgewotCQlTdHJpbmcgZnJhZ2VtZW50U3RyaW5nID0gKFN0cmluZykgQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVPYmplY3QsIEFubm90YXRpb25zQWRhcHRlci5HRU5FUkFURUQpOwotCQlpZiAoZnJhZ2VtZW50U3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdHlwZVN0cmluZyA9IGZyYWdlbWVudFN0cmluZy5zdWJzdHJpbmcoMCwgZnJhZ2VtZW50U3RyaW5nLmluZGV4T2YoJyMnKSk7Ci0JCUlUeXBlIGl0eXBlOwotCi0JCWlmICh0eXBlU3RyaW5nICE9IG51bGwgJiYgKGl0eXBlID0gZmluZFR5cGUodHlwZVN0cmluZywgZU9iamVjdCkpICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGl0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldFdvcmtpbmdDb3B5KG51bGwpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKFN0cmluZyB0eXBlLCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJSVR5cGUgcmVzdWx0ID0gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlT2JqZWN0KTsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXJlc3VsdCA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKHR5cGUpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgPGNvZGU+cHJvamVjdDwvY29kZT4gaGFzIGFubm90YXRpb24gc3VwcG9ydCBlbmFibGVkIG9uIGl0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbm5vdGF0aW9uU3VwcG9ydChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyLklOU1RBTkNFLmhhc0Fubm90YXRpb25zQnVpbGRlcihwcm9qZWN0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvbnRyb2xsZXIvQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvbnRyb2xsZXIvQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTgxMjRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb250cm9sbGVyL0Fubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnkuQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGVDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZWdpc3RyeSBmb3IgcmVhZGluZyBhbm5vdGF0aW9ucyBjb250cm9sbGVyIGV4dGVuc2lvbnMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciBpbXBsZW1lbnRzIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyKCk7Ci0JCi0Jc3RhdGljIHsKLQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSBTb3J0ZWRTZXQgZGVzY3JpcHRvcnM7Ci0KLQlwcml2YXRlIE1hcCBhbm5vdGF0aW9uc0NvbnRyb2xsZXJzOwotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZXNjcmlwdG9yIGltcGxlbWVudHMgSWRlbnRpZmlhYmxlIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OU19DT05UUk9MTEVSID0gImFubm90YXRpb25zQ29udHJvbGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX0lEID0gImJ1aWxkZXJJRCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50OwotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBJRDsKLQkJcHJpdmF0ZSBTdHJpbmcgYnVpbGRlcklEOwotCQlwcml2YXRlIGZpbmFsIGludCBsb2FkT3JkZXI7Ci0JCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyID0gMDsKLQotCQlwdWJsaWMgRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYUNvbmZpZ0VsZW1lbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlBc3NlcnQuaXNMZWdhbChBTk5PVEFUSU9OU19DT05UUk9MTEVSLmVxdWFscyhhQ29uZmlnRWxlbWVudC5nZXROYW1lKCkpLCBBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuZ2V0U3RyaW5nKCJBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyX0VSUk9SXzAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbmZpZ0VsZW1lbnQgPSBhQ29uZmlnRWxlbWVudDsKLQkJCUlEID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCWJ1aWxkZXJJRCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEJVSUxERVJfSUQpOwotCQkJbG9hZE9yZGVyID0gbG9hZE9yZGVyQ291bnRlcisrOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGUjZ2V0SUQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJCXJldHVybiBJRDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRCdWlsZGVySUQoKSB7Ci0JCQlyZXR1cm4gYnVpbGRlcklEOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGUjZ2V0TG9hZE9yZGVyKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0TG9hZE9yZGVyKCkgewotCQkJcmV0dXJuIGxvYWRPcmRlcjsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY3JlYXRlSW5zdGFuY2UoKSB7Ci0JCQlBbm5vdGF0aW9uc0NvbnRyb2xsZXIgaW5zdGFuY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbnN0YW5jZSA9IChBbm5vdGF0aW9uc0NvbnRyb2xsZXIpIGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTUyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIoKSB7Ci0JCXN1cGVyKCJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIiLCAiYW5ub3RhdGlvbnNDb250cm9sbGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIHJlYWQgZXh0ZW5zaW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhEZXNjcmlwdG9yLkFOTk9UQVRJT05TX0NPTlRST0xMRVIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlhZGRBbm5vdGF0aW9uQ29udHJvbGxlcihuZXcgRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbkNvbnRyb2xsZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZGVzY3JpcHRvci5nZXRJRCgpLCBudWxsKS5hZGRJZGVudGlmaWVyTGlzdGVuZXIodGhpcyk7Ci0JCWdldERlc2NyaXB0b3JzKCkuYWRkKGRlc2NyaXB0b3IpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW5ub3RhdGlvbkNvbnRyb2xsZXJzLgotCSAqLwotCXByb3RlY3RlZCBTb3J0ZWRTZXQgZ2V0RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChkZXNjcmlwdG9ycyA9PSBudWxsKQotCQkJZGVzY3JpcHRvcnMgPSBuZXcgVHJlZVNldChJZGVudGlmaWFibGVDb21wYXJhdG9yLmdldEluc3RhbmNlKCkpOwotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldERlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IEVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZGVzY3JpcHRvci5nZXRJRCgpLCBwcm9qZWN0KTsKLQkJCWlmIChpZGVudGlmaWVyLmlzRW5hYmxlZCgpKQotCQkJCXJldHVybiBkZXNjcmlwdG9yOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiBhbnkgYW5ub3RhdGlvbnMgYXJlIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW55QW5ub3RhdGlvbnNTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdG9ycygpLnNpemUoKSA+IDA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciNpZGVudGlmaWVyQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllckV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlkZW50aWZpZXJDaGFuZ2VkKEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgaWRlbnRpZmllckV2ZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoKEVuYWJsZW1lbnRJZGVudGlmaWVyKSBpZGVudGlmaWVyRXZlbnQuZ2V0SWRlbnRpZmllcigpKS5nZXRQcm9qZWN0KCk7Ci0JCWdldEFubm90YXRpb25zQ29udHJvbGxlcnMoKS5yZW1vdmUocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0aW9ucyBjb250cm9sbGVyIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNDb250cm9sbGVyIGdldEFubm90YXRpb25zQ29udHJvbGxlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFubm90YXRpb25zQ29udHJvbGxlciBjb250cm9sbGVyID0gKEFubm90YXRpb25zQ29udHJvbGxlcikgZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVycygpLmdldChwcm9qZWN0KTsKLQkJaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotCQkJaWYgKCFoYXNBbm5vdGF0aW9uc0J1aWxkZXIocHJvamVjdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKHByb2plY3QpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQlnZXRBbm5vdGF0aW9uc0NvbnRyb2xsZXJzKCkucHV0KHByb2plY3QsIChjb250cm9sbGVyID0gZGVzY3JpcHRvci5jcmVhdGVJbnN0YW5jZSgpKSk7Ci0JCX0KLQotCQlyZXR1cm4gY29udHJvbGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFubm90YXRpb25Db250cm9sbGVycy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldEFubm90YXRpb25zQ29udHJvbGxlcnMoKSB7Ci0JCWlmIChhbm5vdGF0aW9uc0NvbnRyb2xsZXJzID09IG51bGwpCi0JCQlhbm5vdGF0aW9uc0NvbnRyb2xsZXJzID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uc0NvbnRyb2xsZXJzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNBbm5vdGF0aW9uc0J1aWxkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlEZXNjcmlwdG9yIGFubm90YXRpb25zRGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IocHJvamVjdCk7Ci0JCWlmIChhbm5vdGF0aW9uc0Rlc2NyaXB0b3I9PW51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBoYXNCdWlsZGVyKHByb2plY3QsIGFubm90YXRpb25zRGVzY3JpcHRvci5nZXRCdWlsZGVySUQoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgYnVpbGRlck5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlDb21tYW5kW10gYnVpbGRlcnMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0QnVpbGRTcGVjKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbW1hbmQgYnVpbGRlciA9IGJ1aWxkZXJzW2ldOwotCQkJCWlmIChidWlsZGVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1aWxkZXIuZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlck5hbWUpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gRG8gbm90aGluZwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMjIwOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBBbm5vdGF0aW9uVGFnUmVnaXN0cnkKLSAqIHdoZW4gaXQgaXMgdGltZSB0byByZWdpc3RlciB0aGUgdGFncyBmb3IgYSBnaXZlbgotICogVGFnU2V0LiAgQW4gQW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplciBkZWZpbmVkCi0gKiB1c2luZyB0aGUgYW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplci4KLSAqIAotICogQHNlZSBjb20uaWJtLnd0cC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5Bbm5vdGF0aW9uVGFnUmVnaXN0cnkKLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyIHsKLQl2b2lkIHJlZ2lzdGVyVGFncygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uVGFnUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uVGFnUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjYzE0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMjIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGtlbGxleXAKLSAqIAotICogU2luZ2xldG9uIHRoYXQgcGFyc2VzIHRoZSBhbm5vdGF0aW9uIHRhZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhbm5vdGF0aW9uLXRhZ2hhbmRsZXIgZXh0ZW5zaW9uCi0gKiBwb2ludCwgYW5kIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIGl0IGZvciBvdGhlciBjbGFzc2VzLiBMYXJnZWx5IHRha2VuIGZyb20gdGhlCi0gKiBBbm5vdGF0aW9uUHJvY2Vzc29yIGJ1aWxkZXIuCi0gKi8KLQotcHVibGljIGNsYXNzIEFubm90YXRpb25UYWdSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBTZXQgdG8gdHJ1ZSBvbmNlIHdlJ3ZlIHJlYWQgaW4gdGhlIGFubm90YXRpb24gdGFnIGluZm9ybWF0aW9uIGZyb20gdGhlIHBsdWdpbiByZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fVEFHX0lORk8gPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLkFubm90YXRpb25UYWdJbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTGlzdCBvZiB0YWcgc3BlY3MgZm9yIGFsbCBvZiB0aGUgdGFncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgYWxsVGFnU3BlY3MgPSBuZXcgQXJyYXlMaXN0KCkgewotCQlmaW5hbCBwcml2YXRlIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NjgzNDUyNTgxMTIyODkyMTkwTDsKLQotCQlwcml2YXRlIHZvaWQgc2NvcGVBbGwoQ29sbGVjdGlvbiBjLCBib29sZWFuIGZvckFkZCkgewotCQkJSXRlcmF0b3IgaXRlciA9IGMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVRhZ1NwZWMgdHMgPSAoVGFnU3BlYykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZvckFkZCkKLQkJCQkJYWRkU2NvcGUodHMpOwotCQkJCWVsc2UKLQkJCQkJcmVtb3ZlU2NvcGUodHMpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZFNjb3BlKFRhZ1NwZWMgdHMpIHsKLQkJCWlmICh0cyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXN3aXRjaCAodHMuZ2V0U2NvcGUoKSkgewotCQkJCWNhc2UgVGFnU3BlYy5GSUVMRCA6Ci0JCQkJCWZpZWxkVGFncy5wdXQodHMuZ2V0VGFnTmFtZSgpLCB0cyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnU3BlYy5NRVRIT0QgOgotCQkJCQltZXRob2RUYWdzLnB1dCh0cy5nZXRUYWdOYW1lKCksIHRzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdTcGVjLlRZUEUgOgotCQkJCQl0eXBlVGFncy5wdXQodHMuZ2V0VGFnTmFtZSgpLCB0cyk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlbW92ZVNjb3BlKFRhZ1NwZWMgdHMpIHsKLQkJCWlmICh0cyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXN3aXRjaCAodHMuZ2V0U2NvcGUoKSkgewotCQkJCWNhc2UgVGFnU3BlYy5GSUVMRCA6Ci0JCQkJCWZpZWxkVGFncy5yZW1vdmUodHMuZ2V0VGFnTmFtZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdTcGVjLk1FVEhPRCA6Ci0JCQkJCW1ldGhvZFRhZ3MucmVtb3ZlKHRzLmdldFRhZ05hbWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnU3BlYy5UWVBFIDoKLQkJCQkJdHlwZVRhZ3MucmVtb3ZlKHRzLmdldFRhZ05hbWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXN1cGVyLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQlhZGRTY29wZSgoVGFnU3BlYyllbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotCQkJVGFnU3BlYyBuZXdUYWdTcGVjID0gKFRhZ1NwZWMpbzsKLQkJCS8vIHNlYXJjaCBmb3IgYWxyZWFkeSBleGlzdGluZyB0YWcgc3BlYyB3aXRoIHNhbWUgbmFtZSBhbmQgc2FtZSB0YWcgc2V0IG5hbWUKLQkJCWZvciAoaW50IGk9MDsgaTx0aGlzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVGFnU3BlYyB0YWdTcGVjID0gKFRhZ1NwZWMpIGdldChpKTsKLQkJCQlpZiAodGFnU3BlYy5nZXRUYWdOYW1lKCkuZXF1YWxzKG5ld1RhZ1NwZWMuZ2V0VGFnTmFtZSgpKSAmJiB0YWdTcGVjLmdldFNjb3BlKCkgPT0gbmV3VGFnU3BlYy5nZXRTY29wZSgpKSB7Ci0JCQkJCXJlbW92ZSh0YWdTcGVjKTsKLQkJCQkJcmVtb3ZlU2NvcGUodGFnU3BlYyk7Ci0JCQkJfQkKLQkJCX0KLQkJCS8vIGFkZCB0aGUgbmV3IHRhZyBzcGVjCi0JCQlhZGRTY29wZShuZXdUYWdTcGVjKTsKLQkJCXJldHVybiBzdXBlci5hZGQobmV3VGFnU3BlYyk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCQlzY29wZUFsbChjLCB0cnVlKTsKLQkJCXJldHVybiBzdXBlci5hZGRBbGwoYyk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpIHsKLQkJCXNjb3BlQWxsKGMsIHRydWUpOwotCQkJcmV0dXJuIHN1cGVyLmFkZEFsbChpbmRleCwgYyk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBzdXBlci5yZW1vdmUoaW5kZXgpOwotCQkJcmVtb3ZlU2NvcGUoKFRhZ1NwZWMpIHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCQlyZW1vdmVTY29wZSgoVGFnU3BlYykgbyk7Ci0JCQlyZXR1cm4gc3VwZXIucmVtb3ZlKG8pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgewotCQkJc2NvcGVBbGwoYywgZmFsc2UpOwotCQkJcmV0dXJuIHN1cGVyLnJlbW92ZUFsbChjKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGMpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSB0aGlzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlUYWdTcGVjIHRzID0gKFRhZ1NwZWMpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghYy5jb250YWlucyh0cykpCi0JCQkJCXJlbW92ZVNjb3BlKHRzKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5yZXRhaW5BbGwoYyk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogTWFwIGZyb20gYSB0YWcgbmFtZSB0byBhIEluaXRUYWdJbmZvLiBPbmx5IGxpdmUgZHVyaW5nIHVwIHRvIHRoZSBlbmQgb2YgdGhlIGluaXQoKSBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHRhZ0F0dHJpYnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvKioKLQkgKiBEaXZpc2lvbiBvZiB0YWcgbmFtZXMgYmV0d2VlbiBhbGxvd2VkIHNjb3Blcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgbWV0aG9kVGFncyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgdHlwZVRhZ3MgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGZpZWxkVGFncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX1BST1AgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfSU5JVElBTElaRVJfRVhfUFQgPSAiYW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTlNfQ09OVFJPTExFUl9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSGVscGVyIGZvciBpbml0LCBwYXJzZSB0aGUgdGFnIGF0dHJpYnV0ZXMgZm9yIGEgQW5ub3RhdGlvblRhZ0luZm8gdGFnLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtcwotCSAqICAgICAgICAgICAgQXJyYXkgb2YgImF0dHJpYiIgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgTG93ZXJjYXNlZCBuYW1lIG9mIHRoZSB0YWcgdGhlc2UgYXR0cmlidXRlcyBhcmUgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEluaXRUYWdJbmZvIHBhcnNlVGFnQXR0cmlicyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtcywgU3RyaW5nIHRhZ05hbWUsIFN0cmluZyBzY29wZSkgewotCQlpbnQgaTsKLQkJQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSW5pdFRhZ0luZm8gdGFnSW5mID0gbmV3IEluaXRUYWdJbmZvKHRhZ05hbWUsIHNjb3BlLCBhdHRyaWJMaXN0KTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gZWxlbXNbaV07Ci0KLQkJCWlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJhdHRyaWIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJVGFnQXR0cmliU3BlYyB0YXMgPSBuZXcgVGFnQXR0cmliU3BlYyhlbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBlbGVtLmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyB1c2UgPSBlbGVtLmdldEF0dHJpYnV0ZSgidXNlIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXRhcy5zZXRUeXBlKGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBhZGQgdmFsaWQgdmFsdWVzCi0JCQkJaWYgKCJlbnVtIi5lcXVhbHMoZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHZhbGlkVmFsdWVzID0gZWxlbS5nZXRDaGlsZHJlbigiZW51bVZhbHVlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCUxpc3QgdmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGorKykgewotCQkJCQkJU3RyaW5nIHZhbHVlID0gdmFsaWRWYWx1ZXNbal0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZXNMaXN0LmFkZCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nW10gdmFsaWRWYWx1ZXNBcnJheSA9IG5ldyBTdHJpbmdbdmFsdWVzTGlzdC5zaXplKCldOwotCQkJCQl2YWxpZFZhbHVlc0FycmF5ID0gKFN0cmluZ1tdKSB2YWx1ZXNMaXN0LnRvQXJyYXkodmFsaWRWYWx1ZXNBcnJheSk7Ci0KLQkJCQkJdGFzLnNldFZhbGlkVmFsdWVzKHZhbGlkVmFsdWVzQXJyYXkpOwotCQkJCX0KLQotCQkJCWlmICh1c2UgPT0gbnVsbCkgewotCQkJCQl0YXMuY2xlYXJSZXF1aXJlZCgpOwotCQkJCX0gZWxzZSBpZiAodXNlLmVxdWFsc0lnbm9yZUNhc2UoInJlcXVpcmVkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl0YXMuc2V0UmVxdWlyZWQoKTsKLQkJCQl9IGVsc2UgaWYgKHVzZS5lcXVhbHNJZ25vcmVDYXNlKCJvcHRpb25hbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFzLmNsZWFyUmVxdWlyZWQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBVbmxpa2VseSwgdW5sZXNzIGFubm90YXRpb24gZXh0ZW5zaW9uIHNwZWMgY2hhbmdlcwotCQkJCQkvLyB3aXRob3V0IGNoYW5nZXMgaGVyZS4KLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5nZXRTdHJpbmcoIkFubm90YXRpb25UYWdSZWdpc3RyeS45IikgKyB1c2UpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1VbmlxdWVBcnJheSA9IGVsZW0uZ2V0Q2hpbGRyZW4oInVuaXF1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGVsZW1VbmlxdWVBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQkJCXRhcy5zZXRVbmlxdWUoKTsKLQkJCQkJaWYgKGVsZW1VbmlxdWVBcnJheVswXS5nZXRBdHRyaWJ1dGUoInNjb3BlIikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGFzLmdldFVuaXF1ZSgpLnNldFNjb3BlKFRhZ0F0dHJpYlNwZWMudW5pcXVlU2NvcGVGcm9tU3RyaW5nKGVsZW1VbmlxdWVBcnJheVswXS5nZXRBdHRyaWJ1dGUoInNjb3BlIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZWxlbVVuaXF1ZUFycmF5Lmxlbmd0aCA+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+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGM4YTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQW5ub3RhdGlvbiBDb3JlIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogLiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTYxNDNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4KLXNyYy5pbmNsdWRlcz1zY2hlbWEvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjY1ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3MThhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmFubm90YXRpb25zLmNvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvcmUucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3Byb3BlcnR5X2ZpbGVzL2Fubm90YXRpb25jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjRkNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvcmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRhZ1NwZWMuMz1Vbmtub3duIHRhZyBzY29wZToKLVRhZ1NwZWMuND1OdWxsIHRhZyBzY29wZS4KLUFubm90YXRpb25UYWdQYXJzZXIuMD1OdWxsIGV2ZW50IGhhbmRsZXIuCi1Bbm5vdGF0aW9uVGFnUGFyc2VyLjE9Ci1Bbm5vdGF0aW9uVGFnUmVnaXN0cnkuMD1Nb3JlIHRoYW4gb25lICdBbm5vdGF0aW9uVGFnSW5mbycgdGFnIGZvciB0aGUgdGFnICcKLUFubm90YXRpb25UYWdSZWdpc3RyeS45PXBhcnNlVGFnQXR0cmliczogdW5rbm93biAndXNlJyB2YWx1ZToKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3NjdlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRlZENvbW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0ZWRDb21tZW50SGFuZGxlciBpbXBsZW1lbnRzIFRhZ1BhcnNlRXZlbnRIYW5kbGVyIHsKLQotCXByaXZhdGUgTWFwIGFubm90YXRpb25zOwotCi0JcHJpdmF0ZSBUb2tlbiBhbm5vdGF0aW9uVG9rZW47Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFubm90YXRlZENvbW1lbnRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRhZ1BhcnNlRXZlbnRIYW5kbGVyI2Fubm90YXRpb25UYWcob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRva2VuKQotCSAqLwotCXB1YmxpYyB2b2lkIGFubm90YXRpb25UYWcoVG9rZW4gdGFnKSB7Ci0JCXRoaXMuYW5ub3RhdGlvblRva2VuID0gdGFnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRhZ1BhcnNlRXZlbnRIYW5kbGVyI2VuZE9mVGFnKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRPZlRhZyhpbnQgcG9zKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5UYWdQYXJzZUV2ZW50SGFuZGxlciNhdHRyaWJ1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRva2VuLAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVG9rZW4pCi0JICovCi0JcHVibGljIHZvaWQgYXR0cmlidXRlKFRva2VuIG5hbWUsIGludCBlcXVhbHNQb3NpdGlvbiwgVG9rZW4gdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmdldFRleHQoKSA9PSBudWxsIHx8IHZhbHVlLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKQotCQkJZ2V0QW5ub3RhdGlvbnMoKS5wdXQodGhpcy5hbm5vdGF0aW9uVG9rZW4uZ2V0VGV4dCgpLCBuYW1lLmdldFRleHQoKSk7Ci0JCWVsc2UKLQkJCWdldEFubm90YXRpb25zKCkucHV0KG5hbWUuZ2V0VGV4dCgpLCB2YWx1ZS5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW5ub3RhdGlvbnMuCi0JICovCi0JcHVibGljIE1hcCBnZXRBbm5vdGF0aW9ucygpIHsKLQkJaWYgKGFubm90YXRpb25zID09IG51bGwpCi0JCQlhbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uVGFnUGFyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25UYWdQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3YTM4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25UYWdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBhdCBLZWxsZXkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25UYWdQYXJzZXIgewotCi0JcHJpdmF0ZSBUYWdQYXJzZUV2ZW50SGFuZGxlciBoYW5kbGVyOwotCi0JcHJpdmF0ZSBjaGFyW10gaW5wdXQ7Ci0KLQlpbnQgcG9zOwotCi0JaW50IGVuZE9mTGFzdEdvb2RBdHRQYXJzZTsKLQotCXB1YmxpYyBBbm5vdGF0aW9uVGFnUGFyc2VyKFRhZ1BhcnNlRXZlbnRIYW5kbGVyIHRwKSB7Ci0JCWlmICh0cCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEFubm90YXRpb25zQ29yZVJlc291cmNlcy5nZXRTdHJpbmcoIkFubm90YXRpb25UYWdQYXJzZXIuMCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWhhbmRsZXIgPSB0cDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW9zKCkgewotCQlyZXR1cm4gcG9zID49IGlucHV0Lmxlbmd0aDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNXUyhjaGFyIGMpIHsKLQkJcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXHQnOwotCX0KLQotCXByaXZhdGUgdm9pZCBza2lwV1MoKSB7Ci0JCXdoaWxlIChwb3MgPCBpbnB1dC5sZW5ndGggJiYgKGlzV1MoaW5wdXRbcG9zXSkgfHwgaW5wdXRbcG9zXSA9PSAnKicpKSB7Ci0JCQlwb3MrKzsKLQkJfQotCX0KLQotCS8vIENhbGxlciBpcyBleHBlY3RlZCB0byBtYWtlIHN1cmUgdGhlIGVvcyBoYXMgbm90IGJlZW4gcmVhY2hlZC4KLQlwcml2YXRlIGNoYXIgcGVlaygpIHsKLQkJcmV0dXJuIGlucHV0W3Bvc107Ci0JfQotCi0JLy8gQ2FsbGVyIGlzIGV4cGVjdGVkIHRvIGNoZWNrIGZvciBFT1MuCi0JcHJpdmF0ZSBjaGFyIG5leHRDaGFyKCkgewotCQlyZXR1cm4gaW5wdXRbcG9zKytdOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05leHRDaGFyKGNoYXIgYykgewotCQlpZiAoZW9zKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBwZWVrKCkgPT0gYzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJRENoYXIoY2hhciBjKSB7Ci0JCXJldHVybiAhaXNXUyhjKSAmJiBjICE9ICc9JyAmJiBjICE9ICdAJyAmJiBjICE9ICdcIic7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBjb2xsZWN0SUQoKSB7Ci0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigxNik7Ci0JCVRva2VuIHQgPSBuZXcgVG9rZW4oKTsKLQotCQl0LnNldEJlZ2lubmluZyhwb3MpOwotCQl3aGlsZSAoIWVvcygpICYmIGlzSURDaGFyKHBlZWsoKSkpIHsKLQkJCWIuYXBwZW5kKG5leHRDaGFyKCkpOwotCQl9Ci0JCXQuc2V0RW5kKHBvcyAtIDEpOwotCQl0LnNldFRleHQoYi50b1N0cmluZygpKTsKLQkJcmV0dXJuIHQ7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBleHBlY3RBdHRyaWJOYW1lKCkgewotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBzYXZlID0gcG9zOwotCi0JCVRva2VuIHJldHZhbCA9IGNvbGxlY3RJRCgpOwotCQlpZiAocmV0dmFsLmxlbmd0aCgpID09IDApIHsKLQkJCXBvcyA9IHNhdmU7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByaXZhdGUgVG9rZW4gZXhwZWN0VGFnKCkgewotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBzYXZlUG9zID0gcG9zOwotCi0JCWlmIChuZXh0Q2hhcigpICE9ICdAJykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoZW9zKCkgfHwgaXNXUyhwZWVrKCkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVRva2VuIHJldHZhbCA9IGV4cGVjdEF0dHJpYk5hbWUoKTsKLQotCQlpZiAocmV0dmFsLmxlbmd0aCgpID09IDApIHsKLQkJCXBvcyA9IHNhdmVQb3MgKyAxOwotCQl9Ci0JCXJldHZhbC5zZXRCZWdpbm5pbmcoc2F2ZVBvcyk7Ci0KLQkJLy8gU2F2ZSBlbmQgb2YgcGFyc2Ugc28gd2UgY2FuIHBhc3MgaXQgYXMgdGhlIGVuZCBvZiB0aGUgcGFyc2VkIHRhZy4KLQkJZW5kT2ZMYXN0R29vZEF0dFBhcnNlID0gcG9zOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByaXZhdGUgVG9rZW4gZXhwZWN0UXVvdGVkVmFsdWUoKSB7Ci0JCXNraXBXUygpOwotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVG9rZW4gdG9rID0gbmV3IFRva2VuKCk7Ci0KLQkJdG9rLnNldEJlZ2lubmluZyhwb3MpOwotCQlpZiAocGVlaygpICE9ICdcIicpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCW5leHRDaGFyKCk7Ci0KLQkJaWYgKGVvcygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcig2NCk7Ci0KLQkJd2hpbGUgKCFlb3MoKSAmJiBwZWVrKCkgIT0gJ1wiJykgewotCQkJYi5hcHBlbmQobmV4dENoYXIoKSk7Ci0JCX0KLQkJaWYgKCFlb3MoKSkgewotCQkJbmV4dENoYXIoKTsKLQkJfQotCi0JCXRvay5zZXRFbmQocG9zIC0gMSk7Ci0JCXRvay5zZXRUZXh0KGIudG9TdHJpbmcoKSk7Ci0JCXJldHVybiB0b2s7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4cGVjdEFzc2lnbigpIHsKLQkJaWYgKGVvcygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAobmV4dENoYXIoKSA9PSAnPScpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXBvcy0tOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBta051bGxUb2tlbigpIHsKLQkJVG9rZW4gcmV0dmFsID0gbmV3IFRva2VuKCk7Ci0KLQkJcmV0dmFsLnNldEJlZ2lubmluZyhwb3MpOwotCQlyZXR2YWwuc2V0RW5kKHBvcyAtIDEpOwotCQlyZXR2YWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGFyc2VOZXh0QXR0cmlidXRlKCkgewotCQlza2lwV1MoKTsKLQkJaWYgKGVvcygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJVG9rZW4ga2V5ID0gY29sbGVjdElEKCk7Ci0KLQkJaWYgKGtleSA9PSBudWxsIHx8IGtleS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlza2lwV1MoKTsKLQkJaWYgKGVvcygpKSB7Ci0JCQkvLyBHbyBhaGVhZCBhbmQgcmVwb3J0IGl0LCBldmVuIHRob3VnaCBpdCBpcyBhIHBhcnRpYWwgYXR0cmlidXRlLiAoCi0JCQkvLyB3ZSBzdGlsbCBmYWlsIGhlcmUgKQotCQkJaGFuZGxlci5hdHRyaWJ1dGUoa2V5LCAtMSwgbWtOdWxsVG9rZW4oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpbnQgZXFQb3MgPSBwb3M7Ci0KLQkJaWYgKCFleHBlY3RBc3NpZ24oKSkgewotCQkJLy8gRXZlbiB0aG91Z2ggd2Ugd29uJ3QgcGFyc2UgdGhpcyBhcyBhIGZ1bGwgYXR0cmlidXRlLCBnbyBhaGVhZCBhbmQKLQkJCS8vIGNhbGwgdGhlIGhhbmRsZXIgd2l0aCBpdC4gU29tZSBjbGllbnRzIHdhbnQgdG8gc2VlIHBhcnRpYWwKLQkJCS8vIGF0dHJpYnV0ZXMuCi0JCQloYW5kbGVyLmF0dHJpYnV0ZShrZXksIC0xLCBta051bGxUb2tlbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlza2lwV1MoKTsKLQotCQlpZiAoZW9zKCkpIHsKLQkJCS8vIFNhbWUgaGVyZSAtIHdlIGZhaWwgb24gaXQsIGJ1dCB3ZSByZXBvcnQgaXQgYW55d2F5Ci0JCQloYW5kbGVyLmF0dHJpYnV0ZShrZXksIGVxUG9zLCBta051bGxUb2tlbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlUb2tlbiB2YWx1ZSA9IGV4cGVjdFF1b3RlZFZhbHVlKCk7Ci0KLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gY29sbGVjdElEKCk7Ci0JCQlpZiAoaXNOZXh0Q2hhcignPScpKSB7Ci0JCQkJcG9zID0gdmFsdWUuZ2V0QmVnaW5uaW5nKCk7Ci0JCQkJdmFsdWUgPSBta051bGxUb2tlbigpOwotCQkJfQotCQl9Ci0JCWVuZE9mTGFzdEdvb2RBdHRQYXJzZSA9IHBvczsKLQkJaGFuZGxlci5hdHRyaWJ1dGUoa2V5LCBlcVBvcywgdmFsdWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VBdHRyaWJ1dGVzKCkgewotCQl3aGlsZSAoIWVvcygpICYmIHBhcnNlTmV4dEF0dHJpYnV0ZSgpKSB7Ci0JCQkvLyBsb29wIHdoaWxlIG5vdCBlbmQgb2Ygc3RyaW5nCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2tpcFRvVGFnQ2hhcigpIHsKLQkJd2hpbGUgKCFlb3MoKSAmJiBwZWVrKCkgIT0gJ0AnKSB7Ci0JCQluZXh0Q2hhcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VySW5wdXQoY2hhcltdIHRleHQpIHsKLQkJaW5wdXQgPSB0ZXh0OwotCQlwb3MgPSAwOwotCQllbmRPZkxhc3RHb29kQXR0UGFyc2UgPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcnNlcklucHV0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldFBhcnNlcklucHV0KHRleHQudG9DaGFyQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFyc2UoKSB7Ci0JCXdoaWxlICghZW9zKCkpIHsKLQkJCXNraXBUb1RhZ0NoYXIoKTsKLQkJCVRva2VuIHRhZyA9IGV4cGVjdFRhZygpOwotCQkJaWYgKHRhZyA9PSBudWxsKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQloYW5kbGVyLmFubm90YXRpb25UYWcodGFnKTsKLQkJCXBhcnNlQXR0cmlidXRlcygpOwotCQkJaGFuZGxlci5lbmRPZlRhZyhlbmRPZkxhc3RHb29kQXR0UGFyc2UpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDMxY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQ2xvbmVhYmxlUHVibGljOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQ2xvbmVhYmxlUHVibGljIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFRCA9ICJnZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBREFQVEVSX1RZUEUgPSBBbm5vdGF0aW9uc0FkYXB0ZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgTk9USUZJQ0FUSU9OX0ZFQVRVUkUgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCgpIHsKLQkJLy8gYW5vbnltb3VzIGlubmVyIGNsYXNzCi0JfTsKLQotCXByaXZhdGUgTWFwIGFubm90YXRpb25zTWFwOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgeyAvLyB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotCQkvL3JldHVybiBzdXBlci5jbG9uZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9ucyhFT2JqZWN0IGVtZk9iamVjdCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUFubm90YXRpb25zQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbWZPYmplY3QpOwotCQlhZGFwdGVyLmFkZEFubm90YXRpb25zKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QW5ub3RhdGlvbnMoRU9iamVjdCBlbWZPYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaW50ZXJuYWxHZXRBbm5vdGF0aW9ucyhlbWZPYmplY3QsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGludGVybmFsR2V0QW5ub3RhdGlvbnMoRU9iamVjdCBlbWZPYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZW1mT2JqZWN0KTsKLQkJcmV0dXJuIChhZGFwdGVyID09IG51bGwpID8gaW50ZXJuYWxHZXRBbm5vdGF0aW9ucyhlbWZPYmplY3QuZUNvbnRhaW5lcigpLCBuYW1lKSA6IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbnMobmFtZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHJlbW92ZUFubm90YXRpb25zKEVPYmplY3QgZW1mT2JqZWN0LCBTdHJpbmcgbmFtZSkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVtZk9iamVjdCk7Ci0JCXJldHVybiBhZGFwdGVyLnJlbW92ZUFubm90YXRpb25zKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbnMoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlnZXRBbm5ub3RhdGlvbnMoKS5wdXQobmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0QW5ub3RhdGlvbnMoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm5vdGF0aW9ucygpLmdldChuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbW92ZUFubm90YXRpb25zKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5ub3RhdGlvbnMoKS5yZW1vdmUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0QW5ubm90YXRpb25zKCkgewotCQlpZiAoYW5ub3RhdGlvbnNNYXAgPT0gbnVsbCkKLQkJCWFubm90YXRpb25zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGFubm90YXRpb25zTWFwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBbm5vdGF0aW9uc0FkYXB0ZXIgZ2V0QWRhcHRlcihFT2JqZWN0IGVtZk9iamVjdCkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKGVtZk9iamVjdCk7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBjcmVhdGVBZGFwdGVyKGVtZk9iamVjdCkgOiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBbm5vdGF0aW9uc0FkYXB0ZXIgY3JlYXRlQWRhcHRlcihFT2JqZWN0IGVtZk9iamVjdCkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IG5ldyBBbm5vdGF0aW9uc0FkYXB0ZXIoKTsKLQkJYWRhcHRlci5zZXRUYXJnZXQoZW1mT2JqZWN0KTsKLQkJZW1mT2JqZWN0LmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFubm90YXRpb25zQWRhcHRlciByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gKEFubm90YXRpb25zQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihlbWZPYmplY3QsIEFEQVBURVJfVFlQRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBBREFQVEVSX1RZUEUuZXF1YWxzKHR5cGUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2ZkZWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA4LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3Iga2thdHlhbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0NvcmVSZXNvdXJjZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImFubm90YXRpb25jb3JlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIEFubm90YXRpb25zQ29yZVJlc291cmNlcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExMGFkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwcml2YXRlIEFubm90YXRlZENvbW1lbnRIYW5kbGVyIGhhbmRsZXI7Ci0KLQlwcml2YXRlIEFubm90YXRpb25UYWdQYXJzZXIgcGFyc2VyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uc1RyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgQW5ub3RhdGlvbnNUcmFuc2xhdG9yKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNUcmFuc2xhdG9yKCkgewotCQlzdXBlcigiI2NvbW1lbnQiLCBBbm5vdGF0aW9uc0FkYXB0ZXIuTk9USUZJQ0FUSU9OX0ZFQVRVUkUsIFRyYW5zbGF0b3IuQ09NTUVOVF9GRUFUVVJFKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBBbm5vdGF0aW9uc0FkYXB0ZXIuTk9USUZJQ0FUSU9OX0ZFQVRVUkUsIFRyYW5zbGF0b3IuQ09NTUVOVF9GRUFUVVJFKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBBbm5vdGF0aW9uc0FkYXB0ZXIuTk9USUZJQ0FUSU9OX0ZFQVRVUkUsIHN0eWxlIHwgVHJhbnNsYXRvci5DT01NRU5UX0ZFQVRVUkUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53dHAuZW1mLnhtbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRIYW5kbGVyKCkuZ2V0QW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQlnZXRQYXJzZXIoKS5zZXRQYXJzZXJJbnB1dCh2YWx1ZS50b1N0cmluZygpKTsKLQkJZ2V0UGFyc2VyKCkucGFyc2UoKTsKLQkJU3RyaW5nIG5hbWU7Ci0JCU1hcCBhbm5vdGF0aW9ucyA9IGdldEhhbmRsZXIoKS5nZXRBbm5vdGF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yIGtleXMgPSBhbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOyBrZXlzLmhhc05leHQoKTspIHsKLQkJCW5hbWUgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLQkJCUFubm90YXRpb25zQWRhcHRlci5hZGRBbm5vdGF0aW9ucyhlbWZPYmplY3QsIG5hbWUsIGFubm90YXRpb25zLmdldChuYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gZ2V0TU9GVmFsdWUoZW1mT2JqZWN0KSAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVtZk9iamVjdCwgQW5ub3RhdGlvbnNBZGFwdGVyLkdFTkVSQVRFRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciN1blNldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyLnJlbW92ZUFubm90YXRpb25zKGVtZk9iamVjdCwgQW5ub3RhdGlvbnNBZGFwdGVyLkdFTkVSQVRFRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNmZWF0dXJlRXhpc3RzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGZlYXR1cmVFeGlzdHMoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc0RhdGFUeXBlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RhdGFUeXBlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTWFwRm9yKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFwRm9yKE9iamVjdCBhRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIChhRmVhdHVyZSA9PSBmZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXIuCi0JICovCi0JcHJvdGVjdGVkIEFubm90YXRlZENvbW1lbnRIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQloYW5kbGVyID0gbmV3IEFubm90YXRlZENvbW1lbnRIYW5kbGVyKCk7Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyc2VyLgotCSAqLwotCXByb3RlY3RlZCBBbm5vdGF0aW9uVGFnUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKQotCQkJcGFyc2VyID0gbmV3IEFubm90YXRpb25UYWdQYXJzZXIoZ2V0SGFuZGxlcigpKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9UYWdQYXJzZUV2ZW50SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9UYWdQYXJzZUV2ZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTc5NDE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVGFnUGFyc2VFdmVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDExLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi0KLS8qKgotICogUGFyc2VyIGFuZCBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCB3YW50IHRvIHJlY2VpdmUgcGFyc2luZyBldmVudHMuIFdoZW4gcGFyc2luZyBpcyBzdGFydGVkCi0gKiB0aHJvdWdoIHRoZSA8Y29kZT5wYXJzZSgpPC9jb2RlPiBtZXRob2QsIGV2ZW50IG1ldGhvZHMgYXJlIGNhbGxlZCBmb3IgaW50ZXJlc3RpbmcgZmVhdHVyZXMgaW4KLSAqIHRoZSBwYXJzZS4gKCBsaWtlIGEgU0FYIENvbnRlbnRIYW5kbGVyICkKLSAqIAotICogQGF1dGhvciBQYXQgS2VsbGV5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnUGFyc2VFdmVudEhhbmRsZXIgewotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIGFubm90YXRpb24gdGFnIGlzIGVuY291bnRlcmVkLiBUaGlzIHdpbGwgYWx3YXlzIGJlIHRoZSBmaXJzdCBwaWVjZSBvZiBjb250ZW50Ci0JICogZW5jb3VudGVyZWQuIEZvbGxvd2VkIGJ5IGEgZW5kT2ZUYWcoICkgY2FsbCB3aGVuIHRoZSBlbmQgb2YgdGhlIHRhZyBpcyByZWFjaGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFubm90YXRpb25UYWcoVG9rZW4gdGFnKTsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBlbnRpcmUgYW5ub3RhdGlvbiBmb3IgYSBzaW5nbGUgdGFnIGhhcyBiZWVuIHBhcnNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zCi0JICogICAgICAgICAgICBQb3NpdGlvbiBpbiB0aGUgc3RyZWFtIG9mIHRoZSBlbmQgb2YgdGhlIGFubm90YXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZW5kT2ZUYWcoaW50IHBvcyk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgZm9yIGV2ZXJ5IGF0dHJpYnV0ZSBzZXR0aW5nIGVuY291bnRlcmVkIGZvciBhbiBhbm5vdGF0aW9uIHRhZy4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgTmFtZSBvZiB0aGUgYXR0cmlidXRlLgotCSAqIEBwYXJhbSBlcXVhbHNQb3NpdGlvbgotCSAqICAgICAgICAgICAgU291cmNlIHBvc2l0aW9uIG9mIHRoZSBlcXVhbHMgc2lnbiwgb3IgLTEgaWYgbm8gZXF1YWxzIHNpZ24gd2FzIGZvdW5kLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSwgd2l0aCBhbnkgcXVvdGVzIHN0cmlwcGVkIG9mZi4gV2lsbCBiZSB6ZXJvIGxlbmd0aCB0b2tlbiBpZgotCSAqICAgICAgICAgICAgbm8gYXR0cmlidXRlIHdhcyBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoVG9rZW4gbmFtZSwgaW50IGVxdWFsc1Bvc2l0aW9uLCBUb2tlbiB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Ub2tlbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAzMTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotLyoqCi0gKiBBIHN0cmluZywgYW5kIHRoZSByYW5nZSBpdCB3YXMgdGFrZW4gZnJvbSBpbiB0aGUgc291cmNlIGZpbGUuIFRoZSByYW5nZSBpcyBpbmNsdXNpdmUuIChpZSwgd2l0aAotICogc291cmNlICJBQkNEIiwgdGhlIGJlZ2lubmluZyBhbmQgZW5kIGZvciB0aGUgVG9rZW4gIkJDIiB3b3VsZCBiZSAoMSwyKSApCi0gKiAKLSAqIEBhdXRob3IgUGF0IEtlbGxleQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVG9rZW4gewotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBpbnQgYmVnaW5uaW5nOwotCXByaXZhdGUgaW50IGVuZDsKLQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFBvc2l0aW9uIGluIG9yaWdpbmFsIHNvdXJjZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgdG9rZW4uCi0JICovCi0JcHVibGljIGludCBnZXRCZWdpbm5pbmcoKSB7Ci0JCXJldHVybiBiZWdpbm5pbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBQb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIHRva2VuLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIHRva2VuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBBIHNvdXJjZSBwb3NpdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJlZ2lubmluZyhpbnQgaSkgewotCQliZWdpbm5pbmcgPSBpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBBIHNvdXJjZSBwb3NpdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmQoaW50IGkpIHsKLQkJZW5kID0gaTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgc3RyaW5nKSB7Ci0JCXRleHQgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIGludCBsZW5ndGgoKSB7Ci0JCXJldHVybiB0ZXh0Lmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgPGNvZGU+c3JjUG9zPC9jb2RlPiBjb21lcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhpcyB0b2tlbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3JjUG9zCi0JICogICAgICAgICAgICBBIHBvc2l0aW9uIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhlIHRva2VuIGNhbWUgZnJvbS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgc3JjUG9zIGNvbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgdG9rZW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW1tZWRpYXRlbHlQcmVjZWRlcyhpbnQgc3JjUG9zKSB7Ci0JCXJldHVybiBlbmQgKyAxID09IHNyY1BvczsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHNyY1BvcyBpcyB3aXRoaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSByYW5nZSByYW5nZSBvZiB0aGUgdG9rZW4uCi0JICogCi0JICogQHBhcmFtIHNyY1BvcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgc3JjUG9zKSB7Ci0JCXJldHVybiBzcmNQb3MgPj0gYmVnaW5uaW5nICYmIHNyY1BvcyA8PSBlbmQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjRkNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjFlNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotdWkuamFyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Yjg1NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzAzNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQW5ub3RhdGlvbnMgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWkuVWlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAuLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWkKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmpkdC51aSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5zd3QsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxYWZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLgotc3JjLmluY2x1ZGVzPXNjaGVtYS8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OWNlNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQW5ub3RhdGlvbnNDb21wbGV0aW9uUHJvY2Vzc29yPUFubm90YXRpb25zQ29tcGxldGlvblByb2Nlc3NvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTk2ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2NDb21wbGV0aW9uUHJvY2Vzc29yIj4KLSAgICAgIDxqYXZhZG9jQ29tcGxldGlvblByb2Nlc3NvcgotICAgICAgICAgICAgbmFtZT0iJUFubm90YXRpb25zQ29tcGxldGlvblByb2Nlc3NvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpLkFubm90YXRpb25UYWdDb21wbGV0aW9uUHJvYyIKLSAgICAgICAgICAgIGlkPSJBbm5vdGF0aW9uc0NvbXBsZXRpb25Qcm9jZXNzb3IiPgotICAgICAgPC9qYXZhZG9jQ29tcGxldGlvblByb2Nlc3Nvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0OTE4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC5hbm5vdGF0aW9ucy51aSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3Byb3BlcnR5X2ZpbGVzIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vcHJvcGVydHlfZmlsZXMiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcHJvcGVydHlfZmlsZXMvdGFnaGFuZGxlcnVpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcHJvcGVydHlfZmlsZXMvdGFnaGFuZGxlcnVpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODQxMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3Byb3BlcnR5X2ZpbGVzL3RhZ2hhbmRsZXJ1aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSjJFRUFubm90YXRpb25zQ29tcGxldGlvblByb2Nlc3Nvci4zPUVycm9yIHBhcnNpbmcgYXR0cmlidXRlcyAtIHdhcyBleHBlY2luZyBhICc9JyBidXQgZm91bmQgJwotSjJFRUFubm90YXRpb25zQ29tcGxldGlvblByb2Nlc3Nvci40PScgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zY2hlbWEvQW5ub3RhdGlvblVJLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc2NoZW1hL0Fubm90YXRpb25VSS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2FmOWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zY2hlbWEvQW5ub3RhdGlvblVJLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpIiBpZD0iQW5ub3RhdGlvblVJIiBuYW1lPSJBbm5vdGF0aW9uVUkiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IGZvciBlbmFibGluZyBjb250ZW50IGFzc2lzdCBmb3IgYW4gZXhpc3RpbmcgdGFnIHNldC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IkF1dG9Db21wbGV0ZURhdGEiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iQXV0b0NvbXBsZXRlRGF0YSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRW5hYmxlcyBjb250ZW50IGFzc2lzdCBmb3IgYSBzaW5nbGUgdGFnIHNldC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhZ1NldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSB0YWcgc2V0IGNvZGUgYXNzaXN0IHNob3VsZCBiZSBlbmFibGVkIGZvci4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0Fubm90YXRpb25UYWdDb21wbGV0aW9uUHJvYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0Fubm90YXRpb25UYWdDb21wbGV0aW9uUHJvYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODcwMTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9Bbm5vdGF0aW9uVGFnQ29tcGxldGlvblByb2MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhZG9jQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5UYWdQYXJzZUV2ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5Bbm5vdGF0aW9uVGFnUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5BdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnkuQXR0cmlidXRlVmFsdWVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnkuVGFnQXR0cmliU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5LlRhZ1NwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0KLS8qKgotICogQGF1dGhvciBQYXQgS2VsbGV5Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25UYWdDb21wbGV0aW9uUHJvYyBpbXBsZW1lbnRzIElKYXZhZG9jQ29tcGxldGlvblByb2Nlc3NvciwgVGFnUGFyc2VFdmVudEhhbmRsZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJPT0xFQU5fVkFMSURfVkFMVUVTID0gbmV3IFN0cmluZ1tdeyJmYWxzZSIsICJ0cnVlIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCUlDb21waWxhdGlvblVuaXQgbV9pY3U7Ci0KLQlJRG9jdW1lbnQgbV9kb2M7Ci0KLQlMaXN0IG1fdGFnczsKLQotCS8vIEluc3RhbmNlIHZhcmlhYmxlcyBhY3RpdmUgd2hlbiBtYXliZUNvbXBsZXRlQXR0cmlidXRlIGlzIGxpdmUuCi0JVG9rZW4gbV90YWdOYW1lOwotCi0JLyoqCi0JICogU2V0IG9mIGFsbCBhdHRyaWJ1dGVzIG5hbWVzIGVuY291bnRlcmVkLiBPbmx5IGxpdmUgd2hlbiBtYXliZUNvbXBsZXRlQXR0cmlidXRlIGlzIGxpdmUuCi0JICovCi0JU2V0IG1fYXR0U2V0ID0gbmV3IFRyZWVTZXQoKTsKLQotCS8qKgotCSAqIExpc3Qgb2YgQXR0cmlidXRlLiBPbmx5IGxpdmUgd2hlbiBtYXliZUNvbXBsZUF0dHJpYnV0ZSBpcyBsaXZlLgotCSAqLwotCUxpc3QgbV9hdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JQW5ub3RhdGlvblRhZ1BhcnNlciBtX3BhcnNlciA9IG5ldyBBbm5vdGF0aW9uVGFnUGFyc2VyKHRoaXMpOwotCi0JLyoqCi0JICogU2NvcGUgb2YgdGhlIHRhZy4gVGFnU3BlYy5UWVBFIHwgVGFnU3BlYy5NRVRIT0QgfCBUYWdTcGVjLkZJRUxELiBOb3QgdmFsaWQgdW50aWwKLQkgKiBnZXRBbm5vdGF0aW9uQXJlYSBoYXMgYmVlbiBjYWxsZWQgZm9yIGEgY29tcGxldGlvbnMgcmVxdWVzdCwgYW5kIG9ubHkgdGhlbiBpZgotCSAqIGdldEFubm90YXRpb25BcmVhKCkgZGlkIG5vdCByZXR1cm4gbnVsbC4KLQkgKi8KLQlpbnQgbV90YWdTY29wZTsKLQotCXB1YmxpYyBBbm5vdGF0aW9uVGFnQ29tcGxldGlvblByb2MoKSB7Ci0JCWluaXRUYWdJbmZvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRUYWdJbmZvKCkgewotCQlpZiAobV90YWdzID09IG51bGwpCi0JCQltX3RhZ3MgPSBBbm5vdGF0aW9uVGFnUmVnaXN0cnkuZ2V0QWxsVGFnU3BlY3MoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFkb2NDb21wbGV0aW9uUHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSUNvbXBpbGF0aW9uVW5pdCBjdSwgaW50IG9mZnNldCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YWRvY0NvbXBsZXRpb25Qcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCwKLQkgKiAgICAgIGludCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGZsYWdzKSB7Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQotCQkvLyBTZXQgdXAgY29tcGxldGlvbiBwcm9jZXNzb3Igc3RhdGUuCi0JCW1fZG9jID0gSmF2YVVJLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3JJbnB1dCk7Ci0JCW1faWN1ID0gY3U7Ci0KLQkJdHJ5IHsKLQkJCUFubm90YXRpb25BcmVhIGFyZWEgPSBnZXRBbm5vdGF0aW9uQXJlYShvZmZzZXQpOwotCi0JCQlpZiAoYXJlYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIGZvciB0YWcgY29tcGxldGlvbiBmaXJzdC4gKCB0aGUgZWFzaWVyIGNhc2UgKQotCQkJU3RyaW5nIHRzZiA9IGdldFRhZ1NvRmFySWZOb3RDb21wbGV0ZWQoYXJlYS5iZWdpbk9mZnNldCwgb2Zmc2V0KTsKLQotCQkJaWYgKHRzZiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFRhZ0NvbXBsZXRpb25zRm9yKHRzZiwgYXJlYSwgbGVuZ3RoKTsKLQkJCX0KLQotCQkJLy8gQWNoLCBoYXZlIHRvIHRyeSB0aGUgaGFyZGVyIGNhc2Ugbm93LCB3aGVyZSB3ZSBwYXJzZSB0aGUKLQkJCS8vIGFubm90YXRpb24KLQkJCXJldHVybiBtYXliZUNvbXBsZXRlQXR0cmlidXRlKGFyZWEsIG9mZnNldCk7Ci0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbGVudGx5IGZhaWwuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIG1heWJlQ29tcGxldGVBdHRyaWJ1dGUoQW5ub3RhdGlvbkFyZWEgYXJlYSwgaW50IGN1cnNvclBvcykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJbV9hdHRTZXQuY2xlYXIoKTsKLQkJbV9hdHRyaWJ1dGVzLmNsZWFyKCk7Ci0KLQkJbV9wYXJzZXIuc2V0UGFyc2VySW5wdXQobV9kb2MuZ2V0KGFyZWEuYmVnaW5PZmZzZXQsIGFyZWEubGVuZ3RoKCkpKTsKLQkJbV9wYXJzZXIucGFyc2UoKTsKLQotCQlUYWdTcGVjIHRzID0gZ2V0VGFnU3BlY0ZvclRhZ05hbWUobV90YWdOYW1lLmdldFRleHQoKSk7Ci0KLQkJLy8gRG8gd2UgZXZlbiByZWNvZ25pemUgdGhpcyB0YWc/Ci0JCWlmICh0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIExvb3AgdGhyb3VnaCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGN1cnNvciBpcyB3aXRoaW4gYSBhdHRyaWJ1dGUKLQkJLy8gYXNzaWdubWVudCwgb3IgYmV0d2VlbiBhc3NpZ25lbWVudHMuCi0JCUF0dHJpYnV0ZSB0YXJnZXQgPSBudWxsOwotCQlBdHRyaWJ1dGUgbGFzdCA9IG51bGw7Ci0JCUF0dHJpYnV0ZSBiZWZvcmUgPSBudWxsOwotCQlBdHRyaWJ1dGUgYSA9IG51bGw7Ci0JCWJvb2xlYW4gYmV0d2VlbiA9IGZhbHNlOwotCQlpbnQgckN1clBvcyA9IGFyZWEucmVsYXRpdmVDdXJzb3JQb3MoY3Vyc29yUG9zKTsKLQkJSXRlcmF0b3IgaSA9IG1fYXR0cmlidXRlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWEgPSAoQXR0cmlidXRlKSBpLm5leHQoKTsKLQotCQkJaWYgKGEuY29udGFpbnMockN1clBvcykpIHsKLQkJCQl0YXJnZXQgPSBhOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChsYXN0ICE9IG51bGwpIHsKLQkJCQkvLyBTZWUgaWYgdGhlIGN1cnNvciBpcyBiZXR3ZWVuLCBidXQgbm90IGRpcmVjdGx5IGFkamFjZW50IHRvCi0JCQkJLy8gdGhlIGxhc3QgdHdvIGF0dHJpYnV0ZXMuCi0JCQkJaWYgKHJDdXJQb3MgPiBsYXN0Lm1heEV4dGVudCgpICsgMSAmJiByQ3VyUG9zIDwgYS5taW5FeHRlbnQoKSAtIDEpIHsKLQkJCQkJYmV0d2VlbiA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoYS5pbW1lZGlhdGVseVByZWNlZGVzKHJDdXJQb3MpKSB7Ci0JCQkJCWJlZm9yZSA9IGE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWxhc3QgPSBhOwotCQl9Ci0KLQkJaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0JCQlpZiAoYmV0d2VlbikgewotCQkJCS8vIElmIHdlJ3JlIGJldHdlZW4gYXR0cmlidXRlcywgc3VnZ2VzdCBhbGwgcG9zc2libGUgYXR0cmlidXRlcy4KLQkJCQlyZXR1cm4gYXR0cmlidXRlQ29tcGxldGlvbnNGb3IodHMsIGN1cnNvclBvcywgMCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGJlZm9yZSAhPSBudWxsKSB7Ci0JCQkJLy8gV2UncmUgcmlnaHQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSBuYW1lZCBpbiAnYmVmb3JlJywgc28gc2V0IHRoZQotCQkJCS8vIHRhcmdldCB0byBpdCwgYW5kIGZhbGwKLQkJCQkvLyAgdGhyb3VnaCB0byB0aGUgdGFyZ2V0IGhhbmRsaW5nIGNvZGUuCi0JCQkJdGFyZ2V0ID0gYmVmb3JlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBub3QgYmV0d2VlbiBhbmQgbm90IGltbWVkaWF0ZWx5IGFmdGVyIGFuIGF0dHJpYnV0ZS4gV2UgYXJlCi0JCQkJLy8gcGFzdCB0aGUgZW5kIG9mIHRoZSBwYXJzZWQgYW5ub3RhdGlvbi4KLQkJCQkvLyAgT25seSBvZmZlciBzdWdnZXN0aW9ucyBpZiBpdCBsb29rcyBsaWtlIHRoZSBsYXN0IGFubm90YXRpb24KLQkJCQkvLyBhdHRyaWJ1dGUgaXMgdmFsaWQuCi0JCQkJaWYgKGEgPT0gbnVsbCkgewotCQkJCQkvLyBObyBhbm5vdGF0aW9ucyBhdHRyaWJ1dGVzLCBzdWdnZXN0IGV2ZXJ5dGhpbmcuCi0JCQkJCXJldHVybiBhdHRyaWJ1dGVDb21wbGV0aW9uc0Zvcih0cywgY3Vyc29yUG9zLCAwLCAiIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHJDdXJQb3MgPiBhLm1heEV4dGVudCgpKSB7Ci0JCQkJCWlmIChhLmhhc0Fzc2lnbm1lbnQoKSAmJiBhLmhhc1ZhbHVlKCkpIHsKLQkJCQkJCS8vIExhc3QgYW5ub3RhdGlvbiB3YXMgZ29vZCwgYW5kIHdlJ3JlIHBhc3QgaXQsIHNvIGRvCi0JCQkJCQkvLyBjb21wbGV0aW9ucyBmb3IgYW55dGhpbmcKLQkJCQkJCXJldHVybiBhdHRyaWJ1dGVDb21wbGV0aW9uc0Zvcih0cywgY3Vyc29yUG9zLCAwLCAiIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIGlmIChhLmhhc0Fzc2lnbm1lbnQoKSkKLQkJCQkJCXJldHVybiBhdHRyaWJ1dGVWYWxpZFZhbHVlc0Zvcih0cywgYSwgYXJlYSwgY3Vyc29yUG9zKTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKHRzLCBjdXJzb3JQb3MgLSBhLm5hbWUubGVuZ3RoKCksIDAsIGEubmFtZS5nZXRUZXh0KCksIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIERpZG4ndCBtYXRjaCBhbnl0aGluZywgbm90IHBhc3QgdGhlIGVuZCAtIHdlJ3JlIHByb2JhYmx5Ci0JCQkJCS8vIHRoZSBmaXJzdCBhdHRyaWJ1dGUKLQkJCQkJLy8gYmVpbmcgYWRkZWQgdG8gdGhlIHRhZy4KLQkJCQkJcmV0dXJuIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKHRzLCBjdXJzb3JQb3MsIDAsICIiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIENvbXBsZXRpb24gZm9yIGEgcGFydGlhbCBhdHRyaWJ1dGUgbmFtZT8KLQkJaWYgKHRhcmdldC5uYW1lLmltbWVkaWF0ZWx5UHJlY2VkZXMockN1clBvcykpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGVDb21wbGV0aW9uc0Zvcih0cywgYXJlYS5yZWxhdGl2ZVRvQWJzKHRhcmdldC5uYW1lLmdldEJlZ2lubmluZygpKSwgdGFyZ2V0Lm5hbWUubGVuZ3RoKCksIHRhcmdldC5uYW1lLmdldFRleHQoKSwgIXRhcmdldC5oYXNBc3NpZ25tZW50KCkpOwotCQl9Ci0KLQkJLy8gQXJlIHdlIGluIHRoZSBtaWRkbGUgb2YgYSBuYW1lPwotCQlpZiAodGFyZ2V0Lm5hbWUuY29udGFpbnMockN1clBvcykpIHsKLQkJCS8vIFdlJ3ZlIG9wdGVkIHRvIHJlcGxhY2UgdGhlIGVudGlyZSBuYW1lIGZvciB0aGlzIGNhc2UsIHdoaWNoIHNlZW1zCi0JCQkvLyB0byBtYWtlIHRoZSBtb3N0IHNlbnNlLgotCQkJcmV0dXJuIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKHRzLCBhcmVhLnJlbGF0aXZlVG9BYnModGFyZ2V0Lm5hbWUuZ2V0QmVnaW5uaW5nKCkpLCB0YXJnZXQubmFtZS5sZW5ndGgoKSwgdGFyZ2V0Lm5hbWUuZ2V0VGV4dCgpLnN1YnN0cmluZygwLCByQ3VyUG9zIC0gdGFyZ2V0Lm5hbWUuZ2V0QmVnaW5uaW5nKCkpLCAhdGFyZ2V0Lmhhc0Fzc2lnbm1lbnQoKSk7Ci0JCX0KLQotCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGVpdGhlciBpbiBhIHZhbHVlLCBvciByZWFsbHkgY29uZnVzZWQuCi0JCS8vIHRyeSBhbmQgcmV0dXJuIHZhbGlkIHZhbHVlcyBvciBiYWlsPwotCQlpZiAoYS52YWx1ZSAhPSBudWxsICYmIChhLnZhbHVlLmNvbnRhaW5zKHJDdXJQb3MpIHx8ICh0YXJnZXQuaGFzQXNzaWdubWVudCgpICYmIGFyZWEucmVsYXRpdmVDdXJzb3JQb3MoY3Vyc29yUG9zKSA+IGEubmFtZS5nZXRCZWdpbm5pbmcoKSkpKQotCQkJcmV0dXJuIGF0dHJpYnV0ZVZhbGlkVmFsdWVzRm9yKHRzLCBhLCBhcmVhLCBjdXJzb3JQb3MpOwotCQlyZXR1cm4gYXR0cmlidXRlQ29tcGxldGlvbnNGb3IodHMsIGN1cnNvclBvcywgMCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gYXR0cmlidXRlVmFsaWRWYWx1ZXNGb3IoVGFnU3BlYyB0cywgQXR0cmlidXRlIGEsIEFubm90YXRpb25BcmVhIGFyZWEsIGludCBjdXJzb3JQb3MpIHsKLQkJVGFnQXR0cmliU3BlYyB0YXMgPSB0cy5hdHRyaWJ1dGVOYW1lZChhLm5hbWUuZ2V0VGV4dCgpKTsKLQkJaWYgKHRhcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ1tdIHZhbGlkVmFsdWVzID0gZ2V0VmFsaWRWYWx1ZXModGFzLCBhLCBhcmVhKTsKLQkJU3RyaW5nIHBhcnRpYWxWYWx1ZSA9IGNhbGN1bGF0ZVBhcnRpYWxWYWx1ZShhLCBhcmVhLCBjdXJzb3JQb3MpOwotCQlpbnQgdmFsdWVPZmZzZXQgPSBjYWxjdWxhdGVWYWx1ZU9mZnNldChhLCBhcmVhLCBjdXJzb3JQb3MpOwotCQlpZiAodmFsaWRWYWx1ZXMgPT0gbnVsbCB8fCB2YWxpZFZhbHVlcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBjcmVhdGVDdXN0b21BdHRyaWJ1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRzLCB0YXMsIHBhcnRpYWxWYWx1ZSwgdmFsdWVPZmZzZXQsIGEudmFsdWUuZ2V0VGV4dCgpLCBhcmVhLmphdmFFbGVtZW50KTsKLQkJcmV0dXJuIGNyZWF0ZUF0dHJpYnV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMocGFydGlhbFZhbHVlLCB2YWx1ZU9mZnNldCwgdmFsaWRWYWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0cwotCSAqIEBwYXJhbSB0YXMKLQkgKiBAcGFyYW0gcGFydGlhbFZhbHVlCi0JICogQHBhcmFtIHZhbHVlT2Zmc2V0Ci0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIGphdmFFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBjcmVhdGVDdXN0b21BdHRyaWJ1dGVDb21wbGV0aW9uUHJvcG9zYWxzKFRhZ1NwZWMgdHMsIFRhZ0F0dHJpYlNwZWMgdGFzLCBTdHJpbmcgcGFydGlhbFZhbHVlLCBpbnQgdmFsdWVPZmZzZXQsIFN0cmluZyB2YWx1ZSwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB7Ci0JCUF0dHJpYnV0ZVZhbHVlc0hlbHBlciBoZWxwZXIgPSB0cy5nZXRWYWxpZFZhbHVlc0hlbHBlcigpOwotCQlpZiAoaGVscGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcltdIHByb3Bvc2FsSGVscGVycyA9IGhlbHBlci5nZXRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVycyh0YXMsIHBhcnRpYWxWYWx1ZSwgdmFsdWVPZmZzZXQsIGphdmFFbGVtZW50KTsKLQkJaWYgKHByb3Bvc2FsSGVscGVycyA9PSBudWxsIHx8IHByb3Bvc2FsSGVscGVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IG5ldyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbEhlbHBlcnMubGVuZ3RoXTsKLQkJQW5ub3RhdGlvblRhZ1Byb3Bvc2FsIHByb3Bvc2FsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2FsSGVscGVycy5sZW5ndGg7IGkrKykgewotCQkJcHJvcG9zYWwgPSBuZXcgQW5ub3RhdGlvblRhZ1Byb3Bvc2FsKHByb3Bvc2FsSGVscGVyc1tpXSk7Ci0JCQkvL3Byb3Bvc2FsLnNldFBhcnRpYWxWYWx1ZVN0cmluZyhwYXJ0aWFsVmFsdWUpOwotCQkJcHJvcG9zYWxzW2ldID0gcHJvcG9zYWw7Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQlwcml2YXRlIElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gY3JlYXRlQXR0cmlidXRlQ29tcGxldGlvblByb3Bvc2FscyhTdHJpbmcgcGFydGlhbFZhbHVlLCBpbnQgdmFsdWVPZmZzZXQsIFN0cmluZ1tdIHZhbGlkVmFsdWVzKSB7Ci0JCUxpc3QgcmVzdWx0aW5nVmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcnBsU3RyaW5nID0gdmFsaWRWYWx1ZXNbaV07Ci0JCQlpZiAocGFydGlhbFZhbHVlICE9IG51bGwgJiYgIXJwbFN0cmluZy5zdGFydHNXaXRoKHBhcnRpYWxWYWx1ZSkpCi0JCQkJY29udGludWU7Ci0JCQlBbm5vdGF0aW9uVGFnUHJvcG9zYWwgcHJvcCA9IG5ldyBBbm5vdGF0aW9uVGFnUHJvcG9zYWwocnBsU3RyaW5nLCB2YWx1ZU9mZnNldCwgMCwgbnVsbCwgcnBsU3RyaW5nLCAxKTsKLQkJCXByb3Auc2V0RW5zdXJlUXVvdGVkKHRydWUpOwotCQkJLy9wcm9wLnNldFBhcnRpYWxWYWx1ZVN0cmluZyhwYXJ0aWFsVmFsdWUpOwotCQkJcmVzdWx0aW5nVmFsdWVzLmFkZChwcm9wKTsKLQkJfQotCQlpZiAocmVzdWx0aW5nVmFsdWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10pIHJlc3VsdGluZ1ZhbHVlcy50b0FycmF5KG5ldyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRpbmdWYWx1ZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRWYWxpZFZhbHVlcyhUYWdBdHRyaWJTcGVjIHRhcywgQXR0cmlidXRlIGEsIEFubm90YXRpb25BcmVhIGFyZWEpIHsKLQkJU3RyaW5nW10gdmFsaWRWYWx1ZXMgPSB0YXMuZ2V0VmFsaWRWYWx1ZXMoKTsKLQkJaWYgKHZhbGlkVmFsdWVzID09IG51bGwgfHwgdmFsaWRWYWx1ZXMubGVuZ3RoID09IDApIHsKLQkJCUF0dHJpYnV0ZVZhbHVlc0hlbHBlciBoZWxwZXIgPSB0YXMuZ2V0VGFnU3BlYygpLmdldFZhbGlkVmFsdWVzSGVscGVyKCk7Ci0JCQlpZiAoaGVscGVyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl2YWxpZFZhbHVlcyA9IGhlbHBlci5nZXRWYWxpZFZhbHVlcyh0YXMsIGFyZWEuamF2YUVsZW1lbnQpOwotCQkJaWYgKCh2YWxpZFZhbHVlcyA9PSBudWxsIHx8IHZhbGlkVmFsdWVzLmxlbmd0aCA9PSAwKSAmJiB0YXMudmFsdWVJc0Jvb2woKSkKLQkJCQl2YWxpZFZhbHVlcyA9IEJPT0xFQU5fVkFMSURfVkFMVUVTOwotCQl9Ci0JCXJldHVybiB2YWxpZFZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYQotCSAqIEBwYXJhbSBhcmVhCi0JICogQHBhcmFtIGN1cnNvclBvcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVWYWx1ZU9mZnNldChBdHRyaWJ1dGUgYSwgQW5ub3RhdGlvbkFyZWEgYXJlYSwgaW50IGN1cnNvclBvcykgewotCQlpZiAoYS52YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIGN1cnNvclBvczsKLQkJaW50IG5hbWVFbmQgPSBhLm5hbWUuZ2V0RW5kKCk7Ci0JCWludCB2YWxCZWcgPSBhLnZhbHVlLmdldEJlZ2lubmluZygpOwotCQlpZiAodmFsQmVnID4gbmFtZUVuZCArIDIpCi0JCQlyZXR1cm4gYXJlYS5yZWxhdGl2ZVRvQWJzKG5hbWVFbmQgKyAyKTsgLy9WYWx1ZSB0b28gZmFyIGF3YXkgdG8gYmUgY29ycmVjdC4KLQkJcmV0dXJuIGFyZWEucmVsYXRpdmVUb0Ficyh2YWxCZWcpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhCi0JICogQHBhcmFtIGFyZWEKLQkgKiBAcGFyYW0gY3Vyc29yUG9zCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNhbGN1bGF0ZVBhcnRpYWxWYWx1ZShBdHRyaWJ1dGUgYSwgQW5ub3RhdGlvbkFyZWEgYXJlYSwgaW50IGN1cnNvclBvcykgewotCQlpZiAoYS52YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBuYW1lRW5kID0gYS5uYW1lLmdldEVuZCgpOwotCQlpbnQgdmFsdWVCZWcgPSBhLnZhbHVlLmdldEJlZ2lubmluZygpOwotCQlpZiAodmFsdWVCZWcgPiBuYW1lRW5kICsgMikKLQkJCXJldHVybiBudWxsOyAvL1ZhbHVlIGlzIHRvbyBmYXIgYXdheSBzbyBpdCBtdXN0IG5vdCBiZSBwYXJ0IG9mIHRoaXMgYXR0cmlidXRlLgotCQlpbnQgcmVsYXRpdmVQb3MgPSBhcmVhLnJlbGF0aXZlQ3Vyc29yUG9zKGN1cnNvclBvcyk7Ci0JCWlmIChhLnZhbHVlLmNvbnRhaW5zKHJlbGF0aXZlUG9zKSkgewotCQkJYm9vbGVhbiBoYXNCZWdpblF1b3RlID0gdmFsdWVCZWcgLSBuYW1lRW5kID09IDI7Ci0JCQlTdHJpbmcgdmFsdWUgPSBhLnZhbHVlLmdldFRleHQoKTsKLQkJCWludCBlbmQgPSByZWxhdGl2ZVBvcyAtIHZhbHVlQmVnOwotCQkJaWYgKGhhc0JlZ2luUXVvdGUpCi0JCQkJZW5kLS07Ci0JCQlpZiAoZW5kID4gLTEpIHsKLQkJCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCQkJaWYgKGVuZCA8IGxlbmd0aCkKLQkJCQkJcmV0dXJuIHZhbHVlLnN1YnN0cmluZygwLCBlbmQpOwotCQkJCWVsc2UgaWYgKGVuZCA9PSBsZW5ndGgpCi0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRhZ1NwZWMgZ2V0VGFnU3BlY0ZvclRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJU3RyaW5nIHNpbXBsZU5hbWUgPSB0YWdOYW1lOwotCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUubGVuZ3RoKCkgPiAwICYmIHRhZ05hbWUuY2hhckF0KDApID09ICdAJykKLQkJCXNpbXBsZU5hbWUgPSB0YWdOYW1lLmxlbmd0aCgpID09IDIgPyAiIiA6IHRhZ05hbWUuc3Vic3RyaW5nKDEpOyAvLyROT04tTkxTLTEkCi0JCXN3aXRjaCAobV90YWdTY29wZSkgewotCQkJY2FzZSBUYWdTcGVjLlRZUEUgOgotCQkJCXJldHVybiBBbm5vdGF0aW9uVGFnUmVnaXN0cnkuZ2V0VHlwZVRhZyhzaW1wbGVOYW1lKTsKLQkJCWNhc2UgVGFnU3BlYy5NRVRIT0QgOgotCQkJCXJldHVybiBBbm5vdGF0aW9uVGFnUmVnaXN0cnkuZ2V0TWV0aG9kVGFnKHNpbXBsZU5hbWUpOwotCQkJY2FzZSBUYWdTcGVjLkZJRUxEIDoKLQkJCQlyZXR1cm4gQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5LmdldEZpZWxkVGFnKHNpbXBsZU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBhdHRyaWJ1dGVDb21wbGV0aW9uc0ZvcihUYWdTcGVjIHRzLCBpbnQgcmVwbGFjZU9mZnNldCwgaW50IHJlcGxhY2VMZW5ndGgsIFN0cmluZyBwYXJ0aWFsQXR0cmlidXRlTmFtZSwgYm9vbGVhbiBhcHBlbmRFcXVhbHMpIHsKLQkJSXRlcmF0b3IgaSA9IHRzLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlMaXN0IHByb3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCVRhZ0F0dHJpYlNwZWMgdGFzID0gKFRhZ0F0dHJpYlNwZWMpIGkubmV4dCgpOwotCQkJU3RyaW5nIGFuYW1lID0gdGFzLmdldEF0dHJpYk5hbWUoKTsKLQotCQkJLy8gRG9uJ3Qgc3VnZ2VzdCBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLgotCQkJaWYgKCFtX2F0dFNldC5jb250YWlucyhhbmFtZSkpIHsKLQkJCQlpZiAoYW5hbWUuc3RhcnRzV2l0aChwYXJ0aWFsQXR0cmlidXRlTmFtZSkpIHsKLQkJCQkJU3RyaW5nIHJ0eHQgPSBhcHBlbmRFcXVhbHMgPyBhbmFtZSArICc9JyA6IGFuYW1lOwotCQkJCQlBbm5vdGF0aW9uVGFnUHJvcG9zYWwgcHJvcCA9IG5ldyBBbm5vdGF0aW9uVGFnUHJvcG9zYWwocnR4dCwgcmVwbGFjZU9mZnNldCwgcmVwbGFjZUxlbmd0aCwgbnVsbCwgYW5hbWUsIDEpOwotCQkJCQlwcm9wLnNldEhlbHBUZXh0KGxvb2t1cEF0dEhlbHAodGFzKSk7Ci0JCQkJCXByb3BzLmFkZChwcm9wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb3BzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wcy50b0FycmF5KG5ldyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wcy5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3MucmQuYW5ub3RhdGlvbnMuVGFnUGFyc2VFdmVudEhhbmRsZXIjYW5ub3RhdGlvblRhZyhjb20uaWJtLndzLnJkLmFubm90YXRpb25zLlRva2VuKQotCSAqLwotCXB1YmxpYyB2b2lkIGFubm90YXRpb25UYWcoVG9rZW4gdGFnKSB7Ci0JCW1fdGFnTmFtZSA9IHRhZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3MucmQuYW5ub3RhdGlvbnMuVGFnUGFyc2VFdmVudEhhbmRsZXIjZW5kT2ZUYWcoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZE9mVGFnKGludCBwb3MpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53cy5yZC5hbm5vdGF0aW9ucy5UYWdQYXJzZUV2ZW50SGFuZGxlciNhdHRyaWJ1dGUoY29tLmlibS53cy5yZC5hbm5vdGF0aW9ucy5Ub2tlbiwKLQkgKiAgICAgIGludCwgY29tLmlibS53cy5yZC5hbm5vdGF0aW9ucy5Ub2tlbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoVG9rZW4gbmFtZSwgaW50IGVxdWFsc1Bvc2l0aW9uLCBUb2tlbiB2YWx1ZSkgewotCQltX2F0dHJpYnV0ZXMuYWRkKG5ldyBBdHRyaWJ1dGUobmFtZSwgZXF1YWxzUG9zaXRpb24sIHZhbHVlKSk7Ci0JCW1fYXR0U2V0LmFkZChuYW1lLmdldFRleHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVwbGFjZW1lbnRGb3JUYWcoVGFnU3BlYyB0cywgaW50IGJlZ2luSW5kZXgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZCA9IG5ldyBTdHJpbmdCdWZmZXIoMzIpOwotCi0JCWJ1ZC5hcHBlbmQoJ0AnKTsKLQkJYnVkLmFwcGVuZCh0cy5nZXRUYWdOYW1lKCkpOwotCi0JCVN0cmluZyBwcmVmaXggPSBnZXRBcnJheVByZWZpeEZvck11bHRpcGxlQXR0cmlicyhiZWdpbkluZGV4KTsKLQkJTGlzdCBhdHRyaWJ1dGVzID0gdHMuZ2V0QXR0cmlidXRlcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJVGFnQXR0cmliU3BlYyB0YXMgPSAoVGFnQXR0cmliU3BlYykgYXR0cmlidXRlcy5nZXQoaSk7Ci0KLQkJCWlmICh0YXMuaXNSZXF1aXJlZCgpKSB7Ci0JCQkJYnVkLmFwcGVuZChwcmVmaXgpOwotCQkJCWJ1ZC5hcHBlbmQodGFzLmdldEF0dHJpYk5hbWUoKSk7Ci0JCQkJYnVkLmFwcGVuZCgnPScpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRBcnJheVByZWZpeEZvck11bHRpcGxlQXR0cmlicyhpbnQgYmVnaW5JbmRleCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIHNvdXJjZSA9IG51bGw7Ci0JCS8vIEdldCBzb3VyY2UgZnJvbSBjb21waWxhdGlvbiB1bml0Ci0JCXRyeSB7Ci0JCQlzb3VyY2UgPSBtX2ljdS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBiZWdpbkluZGV4IDwgMCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJLy8gdHJpbSBvZmYgZXZlcnl0aGluZyBhZnRlciBvdXIgYmVnaW4gaW5kZXgKLQkJCXNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgYmVnaW5JbmRleCArIDEpOwotCQkJaW50IG5ld0xpbmVJbmRleCA9IHNvdXJjZS5sYXN0SW5kZXhPZignXG4nKTsKLQkJCS8vaWYgd2UgYXJlIG9uIGZpcnN0IGxpbmUuLi4KLQkJCWlmIChuZXdMaW5lSW5kZXggPT0gLTEpCi0JCQkJbmV3TGluZUluZGV4ID0gMDsKLQkJCS8vIEdldCB0aGUgY3VycmVudCBsaW5lCi0JCQlTdHJpbmcgY3VycmVudExpbmUgPSBzb3VyY2Uuc3Vic3RyaW5nKG5ld0xpbmVJbmRleCwgYmVnaW5JbmRleCArIDEpOwotCQkJLy8gQ3VycmVudGx5IHdlIGhhdmUgdG8gaGF2ZSB0aGUgJ0AnIHNpZ24gdG8gc2hvdyBvdXIgbWVudQotCQkJaW50IGFubm90YXRpb25JbmRleCA9IGN1cnJlbnRMaW5lLmxhc3RJbmRleE9mKCdAJyk7Ci0JCQlyZXN1bHQgPSBjdXJyZW50TGluZS5zdWJzdHJpbmcoMCwgYW5ub3RhdGlvbkluZGV4KTsKLQkJCXJlc3VsdCA9IHJlc3VsdCArICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFRhZ0NvbXBsZXRpb25zRm9yKFN0cmluZyBwYXJ0aWFsVGFnTmFtZSwgQW5ub3RhdGlvbkFyZWEgYXJlYSwgaW50IHNlbGVjdExlbmd0aCkgewotCQlMaXN0IGZvdW5kID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbV90YWdzLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWdTcGVjIHRzID0gKFRhZ1NwZWMpIG1fdGFncy5nZXQoaSk7Ci0JCQlTdHJpbmcgdG5hbWUgPSB0cy5nZXRUYWdOYW1lKCk7Ci0KLQkJCWlmICh0cy5nZXRTY29wZSgpID09IG1fdGFnU2NvcGUgJiYgdG5hbWUuc3RhcnRzV2l0aChwYXJ0aWFsVGFnTmFtZSkpIHsKLQkJCQlTdHJpbmcgcnR4dCA9IGdldFJlcGxhY2VtZW50Rm9yVGFnKHRzLCBhcmVhLmJlZ2luT2Zmc2V0KTsKLQkJCQlTdHJpbmcgbGFibCA9ICdAJyArIHRuYW1lOwotCQkJCUFubm90YXRpb25UYWdQcm9wb3NhbCBwcm9wID0gbmV3IEFubm90YXRpb25UYWdQcm9wb3NhbChydHh0LCBhcmVhLmJlZ2luT2Zmc2V0LCBNYXRoLm1heChzZWxlY3RMZW5ndGgsIHJ0eHQubGVuZ3RoKCkpLCBudWxsLCBsYWJsLCAxKTsKLQkJCQlwcm9wLnNldEhlbHBUZXh0KGxvb2t1cFRhZ0hlbHAodHMpKTsKLQkJCQlmb3VuZC5hZGQocHJvcCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWZvdW5kLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIChJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBmb3VuZC50b0FycmF5KG5ldyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtmb3VuZC5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFkb2NDb21wbGV0aW9uUHJvY2Vzc29yI2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dTMShjaGFyIGMpIHsKLQkJcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICcqJyB8fCBjID09ICdccicgfHwgYyA9PSAnXG4nOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRhZ1NvRmFySWZOb3RDb21wbGV0ZWQoaW50IHN0YXJ0aW5nQXQsIGludCBjdXJzb3JBdCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKG1fZG9jLmdldENoYXIoc3RhcnRpbmdBdCkgIT0gJ0AnKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBmaXJzdENoYXIgPSBzdGFydGluZ0F0ICsgMTsKLQotCQlpZiAoZmlyc3RDaGFyID09IGN1cnNvckF0KSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoaW50IGkgPSBmaXJzdENoYXI7IGkgPCBjdXJzb3JBdDsgaSsrKSB7Ci0JCQljaGFyIGMgPSBtX2RvYy5nZXRDaGFyKGkpOwotCi0JCQlpZiAoaXNXUzEoYykpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtX2RvYy5nZXQoZmlyc3RDaGFyLCBjdXJzb3JBdCAtIGZpcnN0Q2hhcik7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgdGhlIGFyZWEgb2YgdGhlIGFubm90YXRpb24gd2UncmUgdHJ5aW5nIHRvIGNvbXBsZXRlLiBBbHNvIGluaXRpYWxpemVzCi0JICogbV90YWdTY29wZS4KLQkgKiAKLQkgKiBAcGFyYW0gZnJvbU9mZnNldAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgQW5ub3RhdGlvbkFyZWEgZ2V0QW5ub3RhdGlvbkFyZWEoaW50IGZyb21PZmZzZXQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvLyBGaXJzdCwgcm91Z2hseSBjYWxjdWxhdGUgdGhlIGVuZCBvZiB0aGUgY29tbWVudC4KLQkJSUphdmFFbGVtZW50IGVsID0gbV9pY3UuZ2V0RWxlbWVudEF0KGZyb21PZmZzZXQpOwotCQlpbnQgYWJzbWF4LCBhYnNtaW47Ci0JCWlmIChlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCB0eSA9IGVsLmdldEVsZW1lbnRUeXBlKCk7Ci0KLQkJc3dpdGNoICh0eSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQgOgotCQkJCUlGaWVsZCBmID0gKElGaWVsZCkgZWw7Ci0JCQkJYWJzbWF4ID0gZi5nZXROYW1lUmFuZ2UoKS5nZXRPZmZzZXQoKTsKLQkJCQlhYnNtaW4gPSBmLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJbV90YWdTY29wZSA9IFRhZ1NwZWMuRklFTEQ7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEUgOgotCQkJCUlUeXBlIHQgPSAoSVR5cGUpIGVsOwotCQkJCWFic21heCA9IHQuZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJYWJzbWluID0gdC5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpOwotCQkJCW1fdGFnU2NvcGUgPSBUYWdTcGVjLlRZUEU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRCA6Ci0JCQkJSU1ldGhvZCBtID0gKElNZXRob2QpIGVsOwotCQkJCWFic21heCA9IG0uZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJYWJzbWluID0gbS5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpOwotCQkJCW1fdGFnU2NvcGUgPSBUYWdTcGVjLk1FVEhPRDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJbV90YWdTY29wZSA9IC0xOwotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBhZnRlciB0aGUgbmFtZSBmb3IgdGhlIG1lbWJlci4KLQkJaWYgKGFic21heCA8IGZyb21PZmZzZXQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IG1pbiA9IDAsIG1heCA9IDA7Ci0JCXRyeSB7Ci0JCQkvLyBTZWFyY2ggYmFja3dhcmRzIGZvciB0aGUgc3RhcnRpbmcgJ0AnLgotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChtaW4gPSBmcm9tT2Zmc2V0OyBtaW4gPj0gYWJzbWluOyBtaW4tLSkgewotCQkJCWlmIChtX2RvYy5nZXRDaGFyKG1pbikgPT0gJ0AnKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBTZWFyY2ggZm9yd2FyZHMgZm9yIHRoZSBuZXh0ICdAJywgb3IgdGhlIGVuZCBvZiB0aGUgY29tbWVudC4KLQkJCWZvciAobWF4ID0gZnJvbU9mZnNldCArIDE7IG1heCA8IGFic21heDsgbWF4KyspIHsKLQkJCQlpZiAobV9kb2MuZ2V0Q2hhcihtYXgpID09ICdAJykgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uQXJlYShlbCwgbWluLCBNYXRoLm1pbihhYnNtYXgsIG1heCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGxvb2t1cFRhZ0hlbHAoVGFnU3BlYyB0cykgewotCQlpZiAodHMgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHRzLmxvb2t1cFRhZ0hlbHAoKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZywgcmV0dXJuIG51bGwKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbG9va3VwQXR0SGVscChUYWdBdHRyaWJTcGVjIHRhcykgewotCQlpZiAodGFzICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXJldHVybiB0YXMubG9va3VwVGFnSGVscCgpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nLCByZXR1cm4gbnVsbAotCQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBIHJhbmdlIHRoYXQgZ29lcyBmcm9tIHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgZW5kIHBvc2l0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEFubm90YXRpb25BcmVhIHsKLQkJLyoqCi0JCSAqIERvY3VtZW50IG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBqYXZhZG9jIGFubm90YXRpb24uCi0JCSAqLwotCQlpbnQgYmVnaW5PZmZzZXQ7Ci0KLQkJLyoqCi0JCSAqIERvY3VtZW50IG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoZSBhcmVhIHRoYXQgY291bGQgY29udGFpbiBhbiBhbm5vdGF0aW9uLgotCQkgKi8KLQkJaW50IGVuZE9mZnNldDsKLQkJLyoqCi0JCSAqIFRoZSBKYXZhIGVsZW1lbnQgdGhhdCB0aGlzIGFubm90YXRpb24gaXMgYXNzaWduZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gYmVnCi0JCSAqIEBwYXJhbSBlbmQKLQkJICovCi0JCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudDsKLQotCQlwdWJsaWMgQW5ub3RhdGlvbkFyZWEoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBpbnQgYmVnLCBpbnQgZW5kKSB7Ci0JCQl0aGlzLmphdmFFbGVtZW50ID0gamF2YUVsZW1lbnQ7Ci0JCQliZWdpbk9mZnNldCA9IGJlZzsKLQkJCWVuZE9mZnNldCA9IGVuZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBvZmZzZXQpIHsKLQkJCXJldHVybiBvZmZzZXQgPj0gYmVnaW5PZmZzZXQgJiYgb2Zmc2V0IDwgZW5kT2Zmc2V0OwotCQl9Ci0KLQkJcHVibGljIGludCBsZW5ndGgoKSB7Ci0JCQlyZXR1cm4gZW5kT2Zmc2V0IC0gYmVnaW5PZmZzZXQ7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgY3Vyc29yIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBhcmVhLiBPbmx5IHZhbGlkIGlmCi0JCSAqIDxjb2RlPnRoaXMuY29udGFpbnMoIGFic0N1cnNvclBvcyApPC9jb2RlPgotCQkgKiAKLQkJICogQHBhcmFtIGFic0N1cnNvclBvcwotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgaW50IHJlbGF0aXZlQ3Vyc29yUG9zKGludCBhYnNDdXJzb3JQb3MpIHsKLQkJCXJldHVybiBhYnNDdXJzb3JQb3MgLSBiZWdpbk9mZnNldDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgcmVsYXRpdmVUb0FicyhpbnQgcmVsUG9zKSB7Ci0JCQlyZXR1cm4gYmVnaW5PZmZzZXQgKyByZWxQb3M7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGUgewotCQlUb2tlbiBuYW1lOwotCi0JCVRva2VuIHZhbHVlOwotCi0JCWludCBlcXVhbHNQb3M7Ci0KLQkJQXR0cmlidXRlKFRva2VuIG4sIGludCBlcCwgVG9rZW4gdikgewotCQkJbmFtZSA9IG47Ci0JCQl2YWx1ZSA9IHY7Ci0JCQllcXVhbHNQb3MgPSBlcDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0Fzc2lnbm1lbnQoKSB7Ci0JCQlyZXR1cm4gZXF1YWxzUG9zICE9IC0xOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzVmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWUubGVuZ3RoKCkgIT0gMDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBzcmNQb3MpIHsKLQkJCXJldHVybiBzcmNQb3MgPj0gbWluRXh0ZW50KCkgJiYgc3JjUG9zIDw9IG1heEV4dGVudCgpOwotCQl9Ci0KLQkJcHVibGljIGludCBtaW5FeHRlbnQoKSB7Ci0JCQlyZXR1cm4gbmFtZS5nZXRCZWdpbm5pbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbWF4RXh0ZW50KCkgewotCQkJaWYgKGhhc0Fzc2lnbm1lbnQoKSkgewotCQkJCWlmIChoYXNWYWx1ZSgpKQotCQkJCQlyZXR1cm4gdmFsdWUuZ2V0RW5kKCk7Ci0JCQkJcmV0dXJuIGVxdWFsc1BvczsKLQkJCX0KLQkJCXJldHVybiBuYW1lLmdldEVuZCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaW1tZWRpYXRlbHlQcmVjZWRlcyhpbnQgcG9zKSB7Ci0JCQlyZXR1cm4gbWF4RXh0ZW50KCkgKyAxID09IHBvczsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9Bbm5vdGF0aW9uVGFnUHJvcG9zYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9Bbm5vdGF0aW9uVGFnUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhNTc3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvQW5ub3RhdGlvblRhZ1Byb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5LkF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBrZWxsZXlwCi0gKiAKLSAqIEEgY29tcGxldGlvbiBwcm9wb3NhbCBlc3BlY2lhbGx5IGZvciBBbm5vdGF0aW9uIHRhZyBjb21wbGV0aW9ucy4gVGhpcyBwcm9ibGVtIHRoaXMgY2xhc3Mgd2FzCi0gKiBjcmVhdGVkIHRvIHNvbHZlIHdhcyB0aGUgcHJvYmxlbSBvZiBhdHRhY2hpbmcgaGVscCB0ZXh0IHRvIGEgcHJvcG9zYWwuIFRoZSBtZWNoYW5pc20gaW5zaWRlIG9mCi0gKiBKYXZhQ29tcGxldGlvblByb3Bvc2FsIHdhcyB1c2VsZXNzIHRvIHVzLCBzaW5jZSBpdCB3YXMgdGllZCB0byB0aGUgaWRlYSB0aGF0IHRoZSBwcm9wb3NhbCB3b3VsZAotICogYmUgZm9yIGFuIGFjdHVhbCBqYXZhIGVsZW1lbnQsIHRoYXQgaGFzIGphdmFkb2MgYXR0YWNoZWQgdG8gaXQsIGV0Yy4uLiBTbyBoZXJlIHdlIHN1YmNsYXNzCi0gKiBKYXZhQ29tcGxldGlvblByb3Bvc2FsIGFuZCBvdmVycmlkZSA8Y29kZT5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvPC9jb2RlPiBmb3IgYSBtb3JlIHN1aXRhYmxlCi0gKiB3YXkgb2YgYXNzb2NpYXRpbmcgaGVscCB0ZXh0IHdpdGggYSBwcm9wb3NhbC4KLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25UYWdQcm9wb3NhbCBleHRlbmRzIEphdmFDb21wbGV0aW9uUHJvcG9zYWwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUVVPVEUgPSAnIic7Ci0JcHJpdmF0ZSBib29sZWFuIGVuc3VyZUJlZ2luUXVvdGUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZW5zdXJlRW5kUXVvdGUgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBsb2NhbFN0cmluZzsKLQkvL3ByaXZhdGUgU3RyaW5nIHBhcnRpYWxWYWx1ZVN0cmluZzsKLQkvL3ByaXZhdGUgQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlciBoZWxwZXI7Ci0KLQkvKioKLQkgKiBMb2NhbGl6ZWQgaGVscCB0ZXh0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxvY1RleHQ7Ci0KLQkvKioKLQkgKiBAc2VlIEphdmFDb21wbGV0aW9uUHJvcG9zYWwjSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSwgamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqIEBwYXJhbSByZXBsYWNlbWVudFN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNlbWVudE9mZnNldAotCSAqIEBwYXJhbSByZXBsYWNlbWVudExlbmd0aAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBkaXNwbGF5U3RyaW5nCi0JICogQHBhcmFtIHJlbGV2YW5jZQotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uVGFnUHJvcG9zYWwoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBpbnQgcmVwbGFjZW1lbnRPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UpOwotCQl0aGlzLmxvY2FsU3RyaW5nID0gZGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEphdmFDb21wbGV0aW9uUHJvcG9zYWwjSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSwgamF2YS5sYW5nLlN0cmluZywgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRTdHJpbmcKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRPZmZzZXQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRMZW5ndGgKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gZGlzcGxheVN0cmluZwotCSAqIEBwYXJhbSByZWxldmFuY2UKLQkgKi8KLQotCXB1YmxpYyBBbm5vdGF0aW9uVGFnUHJvcG9zYWwoQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlciBwcm9wb3NhbEhlbHBlcikgewotCQl0aGlzKHByb3Bvc2FsSGVscGVyLmdldFJlcGxhY2VtZW50U3RyaW5nKCksIHByb3Bvc2FsSGVscGVyLmdldFZhbHVlT2Zmc2V0KCksIHByb3Bvc2FsSGVscGVyLmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIG51bGwsIHByb3Bvc2FsSGVscGVyLmdldFZhbHVlRGlzcGxheVN0cmluZygpLCAxKTsKLQkJaWYgKHByb3Bvc2FsSGVscGVyIGluc3RhbmNlb2YgVUlBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyKQotCQkJc2V0SW1hZ2UoKChVSUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIpIHByb3Bvc2FsSGVscGVyKS5nZXRJbWFnZSgpKTsKLQkJc2V0RW5zdXJlQmVnaW5RdW90ZShwcm9wb3NhbEhlbHBlci5lbnN1cmVCZWdpblF1b3RlKCkpOwotCQlzZXRFbnN1cmVFbmRRdW90ZShwcm9wb3NhbEhlbHBlci5lbnN1cmVFbmRRdW90ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvblRhZ1Byb3Bvc2FsKFVJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlciBwcm9wb3NhbEhlbHBlcikgewotCQl0aGlzKHByb3Bvc2FsSGVscGVyLmdldFJlcGxhY2VtZW50U3RyaW5nKCksIHByb3Bvc2FsSGVscGVyLmdldFZhbHVlT2Zmc2V0KCksIHByb3Bvc2FsSGVscGVyLmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIHByb3Bvc2FsSGVscGVyLmdldEltYWdlKCksIHByb3Bvc2FsSGVscGVyLmdldFZhbHVlRGlzcGxheVN0cmluZygpLCAxKTsKLQkJc2V0RW5zdXJlQmVnaW5RdW90ZShwcm9wb3NhbEhlbHBlci5lbnN1cmVCZWdpblF1b3RlKCkpOwotCQlzZXRFbnN1cmVFbmRRdW90ZShwcm9wb3NhbEhlbHBlci5lbnN1cmVFbmRRdW90ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgb3ZlcnJpZGUgdGhhdCB1c2VzIDxjb2RlPnRleHRIb2xkZXI8L2NvZGU+IHRvIHByb3ZpZGUgdGhlIGhlbHAgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBsb2NUZXh0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGhvbGRlciBvZiB0aGUgaGVscCB0ZXh0IHRoYXQgY2FuIGJlIGRpc3BsYXllZCB3aXRoIHRoaXMgcHJvcG9zYWwuCi0JICogCi0JICogQHBhcmFtIGhsZAotCSAqICAgICAgICAgICAgYW4gTG9jYWxpemVkVGV4dENvbnRhaW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBUZXh0KFN0cmluZyBzKSB7Ci0JCWxvY1RleHQgPSBzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuamF2YS5KYXZhQ29tcGxldGlvblByb3Bvc2FsI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgY2hhciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCwgY2hhciB0cmlnZ2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCWVuc3VyZVF1b3RlZElmTmVjZXNzYXJ5KGRvY3VtZW50LCBvZmZzZXQpOwotCQlzdXBlci5hcHBseShkb2N1bWVudCwgdHJpZ2dlciwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVF1b3RlZElmTmVjZXNzYXJ5KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlpZiAoZW5zdXJlQmVnaW5RdW90ZSB8fCBlbnN1cmVFbmRRdW90ZSkgewotCQkJdHJ5IHsKLQkJCQljaGFyIGJlZ2luID0gZG9jdW1lbnQuZ2V0Q2hhcihnZXRSZXBsYWNlbWVudE9mZnNldCgpIC0gMSk7Ci0JCQkJY2hhciBlbmQgPSBkb2N1bWVudC5nZXRDaGFyKG9mZnNldCk7Ci0JCQkJaWYgKGVuc3VyZUJlZ2luUXVvdGUgJiYgZW5zdXJlRW5kUXVvdGUgJiYgYmVnaW4gIT0gUVVPVEUgJiYgZW5kICE9IFFVT1RFKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQliLmFwcGVuZChRVU9URSkuYXBwZW5kKGxvY2FsU3RyaW5nKS5hcHBlbmQoUVVPVEUpOwotCQkJCQlsb2NhbFN0cmluZyA9IGIudG9TdHJpbmcoKTsKLQkJCQl9IGVsc2UgaWYgKGVuc3VyZUJlZ2luUXVvdGUgJiYgYmVnaW4gIT0gUVVPVEUpCi0JCQkJCWxvY2FsU3RyaW5nID0gUVVPVEUgKyBsb2NhbFN0cmluZzsKLQkJCQllbHNlIGlmIChlbnN1cmVFbmRRdW90ZSAmJiBlbmQgIT0gUVVPVEUpCi0JCQkJCWxvY2FsU3RyaW5nID0gbG9jYWxTdHJpbmcgKyBRVU9URTsKLQkJCQlzZXRSZXBsYWNlbWVudFN0cmluZyhsb2NhbFN0cmluZyk7Ci0JCQkJc2V0Q3Vyc29yUG9zaXRpb24obG9jYWxTdHJpbmcubGVuZ3RoKCkpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIERvIG5vdGhpbmcKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuc3VyZVF1b3RlZChib29sZWFuIGVuc3VyZVF1b3RlZCkgewotCQlzZXRFbnN1cmVCZWdpblF1b3RlKGVuc3VyZVF1b3RlZCk7Ci0JCXNldEVuc3VyZUVuZFF1b3RlKGVuc3VyZVF1b3RlZCk7Ci0JfQotCi0JLy9wdWJsaWMgdm9pZCBzZXRQYXJ0aWFsVmFsdWVTdHJpbmcoU3RyaW5nIHBhcnRpYWxWYWx1ZVN0cmluZykgewotCS8vCXRoaXMucGFydGlhbFZhbHVlU3RyaW5nID0gcGFydGlhbFZhbHVlU3RyaW5nOwotCS8vfQotCXB1YmxpYyB2b2lkIHNldEVuc3VyZUJlZ2luUXVvdGUoYm9vbGVhbiBlbnN1cmVCZWdpblF1b3RlKSB7Ci0JCXRoaXMuZW5zdXJlQmVnaW5RdW90ZSA9IGVuc3VyZUJlZ2luUXVvdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5zdXJlRW5kUXVvdGUoYm9vbGVhbiBlbnN1cmVFbmRRdW90ZSkgewotCQl0aGlzLmVuc3VyZUVuZFF1b3RlID0gZW5zdXJlRW5kUXVvdGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9JV1JEUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvSVdSRFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDYyYjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9JV1JEUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGtrYXR5YWwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSVdSRFJlc291cmNlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAidGFnaGFuZGxlcnVpIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIElXUkRSZXNvdXJjZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL1VJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL1VJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTk1Mzg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9VSUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5BdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIgZXh0ZW5kcyBBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyIHsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogQHBhcmFtIHJlcGxhY2VtZW50U3RyaW5nCi0JICogQHBhcmFtIHZhbHVlT2Zmc2V0Ci0JICogQHBhcmFtIHJlcGxhY2VtZW50TGVuZ3RoCi0JICogQHBhcmFtIHZhbHVlRGlzcGxheVN0cmluZwotCSAqLwotCXB1YmxpYyBVSUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBpbnQgdmFsdWVPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIHZhbHVlRGlzcGxheVN0cmluZykgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgdmFsdWVPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCB2YWx1ZURpc3BsYXlTdHJpbmcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL1VpUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5NmY0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvVWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFVpUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFVpUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpLlVpUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVpUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzkzM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb2ZqMmVlLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYnNlcnZpY2VzLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbkFyY2hpdmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iajJlZS12YWxpZGF0aW9uLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImoyZWVDb3JlUGx1Z2luLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjNiYzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXJ1bnRpbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0ZjQ1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1YzUzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBKMkVFIENvcmUgQ29tcG9uZW50Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAuLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3ksCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuYXBwbGljYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jbGllbnQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb25uZWN0b3IsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJhcHBsaWNhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcAotUmVxdWlyZS1CdW5kbGU6ICBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGMwNGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjaGFuZ2VzLmxvZyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuCi1zcmMuaW5jbHVkZXMgPSByb3NlLyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIG1vZGVsLwotamFycy5jb21waWxlLm9yZGVyID0gLgotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IG1vZmoyZWUvLFwKLSAgICAgICAgICAgd2Vic2VydmljZXMvLFwKLSAgICAgICAgICAgY29tbW9uQXJjaGl2ZS8sXAotICAgICAgICAgICBqMmVlQ29yZVBsdWdpbi8sXAotICAgICAgICAgICBqMmVlLXZhbGlkYXRpb24vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9jb21tb25hcmNoaXZlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9jb21tb25hcmNoaXZlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzN2RmNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvY29tbW9uYXJjaGl2ZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3ViY2xhc3NfcmVzcG9uc2liaWx0eV9FWENfPUlXQUUwMDAxRSB7MH0gbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcwota2V5X2NsYXNzX3JlZmxlY3Rpb25fRVJST1JfPUlXQUUwMDAyRSBVbmFibGUgdG8gcmVmbGVjdCB0aGUgY2xhc3MgInswfSIgaW4gb3JkZXIgdG8gY29tcGFyZSB0aGUgcHJpbWFyeSBrZXkgZmllbGQgInsxfSIgZnJvbSBlbnRpdHkgInsyfSIKLWtleV9maWVsZF9yZWZsZWN0aW9uX0VSUk9SXz1JV0FFMDAwM0UgVW5hYmxlIHRvIHJlZmxlY3QgdGhlIHR5cGUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkICJ7MH0iIGZyb20gZW50aXR5ICJ7MX0iCi1yZW1vdmluZ19rZXlfZmllbGRfSU5GT189SVdBRTAwMDRJIFJlbW92aW5nIGludmFsaWQgcHJpbS1rZXktZmllbGQgInswfSIgZnJvbSBlbnRpdHkgInsxfSIKLXJlcGFpcl91c2FnZV9FUlJPUl89SVdBRTAwMDVFIFJlcGFpckFyY2hpdmVDb21tYW5kIHVzYWdlOiBjYW5ub3Qgd3JpdGUgdG8gZGVzdGluYXRpb25QYXRoOiB7MH0KLWludmFsaWRfYXJjaGl2ZV9FWENfPUlXQUUwMDA2RSBBcmNoaXZlIGlzIG5vdCBhIHZhbGlkIHswfSBiZWNhdXNlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY2FuIG5vdCBiZSBmb3VuZCAoY2FzZSBzZW5zaXRpdmUpOiB7MX0KLWxvYWRfcmVzb3VyY2VfRVhDXz1JV0FFMDAwN0UgQ291bGQgbm90IGxvYWQgcmVzb3VyY2UgInswfSIgaW4gYXJjaGl2ZSAiezF9IgotbmVzdGVkX2phcl9FWENfPUlXQUUwMDA4RSBBbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIHswfSBmcm9tIHsxfQotbWFrZV90ZW1wX2Rpcl9FWENfPUlXQUUwMDA5RSBVbmFibGUgdG8gbWFrZSB0ZW1wIGRpcmVjdG9yeTogezB9Ci1pbnZhbGlkX2NsYXNzcGF0aF9XQVJOXz1JV0FFMDAxMFcgQ2xhc3NwYXRoIGVsZW1lbnQgInswfSIgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGEgWmlwIGZpbGUKLWludmFsaWRfY3BfZmlsZV9XQVJOXz1JV0FFMDAxMVcgQ2xhc3NwYXRoIGVsZW1lbnQgInswfSIgZG9lcyBub3QgcG9pbnQgdG8gYSBsb2NhbCBmaWxlCi1pb19leF9sb2FkaW5nX0VYQ189SVdBRTAwMTJFIEFuIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIHswfQotdHhfYmVhbl9tZ2RfV0FSTl89SVdBRTAwMTNXIEVKQiAxLjAgSW1wb3J0OiBOb3QgbWFwcGluZyBUWF9CRUFOX01BTkFHRUQgY29udHJvbCBkZXNjcmlwdG9yIGZvciB7MH0KLWVycm9yX3NhdmluZ19FWENfPUlXQUUwMDE0RSBFcnJvciBzYXZpbmcgezB9Ci1pb19leF9tYW5pZmVzdF9FWENfPUlXQUUwMDE1RSBBbiBJT0V4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHRoZSBtYW5pZmVzdCBpbiBhcmNoaXZlOiB7MH0KLWlvX2V4X3Jlb3Blbl9FWENfPUlXQUUwMDE2RSBJT0V4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSByZW9wZW5pbmcgezB9Ci11bmFibGVfcmVwbGFjZV9FWENfPUlXQUUwMDE3RSBVbmFibGUgdG8gcmVwbGFjZSBvcmlnaW5hbCBhcmNoaXZlOiB7MH0KLWR1cGxpY2F0ZV9maWxlX0VYQ189SVdBRTAwMThFIFRoZSBhcmNoaXZlIG5hbWVkIHswfSBhbHJlYWR5IGNvbnRhaW5zIGEgZmlsZSBuYW1lZCB7MX0KLWR1cGxpY2F0ZV9lbnRyeV9FWENfPUlXQUUwMDE5RSBBIGZpbGUgb3IgcmVzb3VyY2Ugd2l0aCB1cmkgezB9IGFscmVhZHkgZXhpc3RzIGluIHRoZSBhcmNoaXZlIG5hbWVkIHsxfQotZmlsZV9leGlzdF9hc19kaXJfRVhDXz1JV0FFMDAyMEUgQSBmaWxlIG5hbWVkIHswfSBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5Ci11bmNvbnRhaW5lZF9tb2R1bGVfRVhDXz1JV0FFMDAyMUUgTW9kdWxlIHswfSBpcyBub3QgY29udGFpbmVkIGJ5IGFuIEVBUiBmaWxlCi1kZF9pbl9lYXJfbG9hZF9FWENfPUlXQUUwMDIyRSBFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIG1vZHVsZSAiezB9IiBpbiBFQVIgZmlsZSAiezF9IgotbmVzdGVkX29wZW5fZmFpbF9FWENfPUlXQUUwMDIzRSBVbmFibGUgdG8gb3BlbiBtb2R1bGUgZmlsZSAiezB9IiBpbiBFQVIgZmlsZSAiezF9IgotZHVwbGljYXRlX21vZHVsZV9FWENfPUlXQUUwMDI0RSBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgRUFSIGZpbGUgInswfSIgYWxyZWFkeSBjb250YWlucyBhIG1vZHVsZSBoYXZpbmcgdXJpICJ7MX0iCi1ub19zZWNfcm9sZV9FWENfPUlXQUUwMDI1RSB7MH06IEVBUiBGaWxlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MX0KLWR1cF9zZWNfcm9sZV9FWENfPUlXQUUwMDI2RSB7MH06IEVBUiBGaWxlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbHJlYWR5IGNvbnRhaW5zIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MX0KLWR1cF9zZWNfcm9sZV9tb2R1bGVfRVhDXz1JV0FFMDAyN0UgRGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB7MH0gYWxyZWFkeSBjb250YWlucyBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgezF9Ci1kdXBfcmVzb3VyY2VfRVhDXz1JV0FFMDAyOEUgUmVzb3VyY2UgbmFtZWQgInswfSIgYWxyZWFkeSBleGlzdHMgaW4gYXJjaGl2ZSAiezF9IgotZXJyb3Jfc2F2aW5nX0VYQ189SVdBRTAwMzBFIEVycm9yIHNhdmluZyB7MH0KLWFkZF9jb3B5X2NsYXNzX2Rpcl9FWENfPUlXQUUwMDMxRSBUaGUgbWV0aG9kICJhZGRDb3B5Q2xhc3MiIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yaWVzLiBVUkk6IHswfQotYWRkX2NvcHlfbGliX2Rpcl9FWENfPUlXQUUwMDMyRSBUaGUgbWV0aG9kICJhZGRDb3B5TGliIiBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3Rvcmllcy4gVVJJOiB7MH0KLWxpc3RfY29tcG9uZW50c193YXJfRVhDXz1JV0FFMDAzM0UgRXhjZXB0aW9uIG9jY3VycmVkIGxpc3RpbmcgY29tcG9uZW50cyBpbiBXQVIgZmlsZTogezB9Ci1vcGVuX25lc3RlZF9FWENfPUlXQUUwMDM0RSBDb3VsZCBub3Qgb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUgInswfSIgaW4gInsxfSIKLW1ha2VfdGVtcF9maWxlX1dBUk5fPUlXQUUwMDM1VyBXYXJuaW5nOiBVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZSBmb3IgezB9LiAgVGhpcyB3aWxsIGltcGFjdCBwZXJmb3JtYW5jZS4KLWZpbGVfbm90X2ZvdW5kX0VYQ189SVdBRTAwMzZFIFVSSSBOYW1lOiB7MH07IEZpbGUgbmFtZTogezF9Ci1jb3VsZF9ub3Rfb3Blbl9FWENfPUlXQUUwMDM3RSBDb3VsZCBub3Qgb3BlbiB7MH0KLWNvdWxkX25vdF9maW5kX2Rpcl9FWENfPUlXQUUwMDM4RSBVbmFibGUgdG8gb3BlbiBkaXJlY3RvcnkgezB9Ci1ub3RfYV9kaXJfRVhDXz1JV0FFMDAzOUUgVW5hYmxlIHRvIG9wZW4gZGlyZWN0b3J5IGJlY2F1c2UgZmlsZSBpcyBub3QgYSBkaXJlY3Rvcnk6IHswfQotaW5mZXJyZWRfZGRzX0VYQ189SVdBRTAwNDBFIFRoZSBFSkIgSkFSIGZpbGUgInswfSIgd2FzIGluZmVycmVkIHRvIGJlIG9mIHZlcnNpb24gMS4wIGJlY2F1c2UgdGhlIG1hbmlmZXN0IGRvZXMgbm90IGRlY2xhcmUgZW50ZXJwcmlzZSBiZWFucyBidXQgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGV4aXN0IGluIHRoZSBKQVIuCi1maWxlbmFtZV9leGNlcHRpb25fRVhDXz1JV0FFMDA0MUUgRmlsZW5hbWU6IHswfTsgRXhjZXB0aW9uOiB7MX0KLW5vX2Rkc18xMF9FWENfPUlXQUUwMDQyRSBObyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGluIEVKQiAxLjAgSkFSIGZpbGU6IHswfQotbWFuaWZlc3RfZGRfbG9hZF9FWENfPUlXQUUwMDQzRSBUaGUgSkFSIG1hbmlmZXN0IGRlY2xhcmVzIGFuIGVudGVycHJpc2UgYmVhbiBmb3Igd2hpY2ggdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIGNhbiBub3QgYmUgbG9hZGVkOiB7MH0KLW1hbmlmZXN0X2RkX2ZpbmRfRVhDXz1JV0FFMDA0NEUgVGhlIEpBUiBtYW5pZmVzdCBkZWNsYXJlcyBhbiBlbnRlcnByaXNlIGJlYW4gZm9yIHdoaWNoIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBjYW4gbm90IGJlIGZvdW5kOiB7MH0KLWlvX2V4X3JlYWRpbmdfZGRfRVhDXz1JV0FFMDA0NUUgSU8gRXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgezB9Ci1zZXJfbm90X2RkX0VYQ189SVdBRTAwNDZFIFRoZSBzZXJpYWxpemVkIG9iamVjdCBpbiBmaWxlICJ7MH0iIGlzIG5vdCBhIGFuIGluc3RhbmNlIG9mIGphdmF4LmVqYi5kZXBsb3ltZW50LkRlcGxveW1lbnREZXNjcmlwdG9yCi1yZWFkaW5nX2RkX0VYQ189SVdBRTAwNDdFIEV4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHswfQotbWlzc2luZ19jbGFzc19FWENfPUlXQUUwMDQ4RSBDb3VsZCBub3QgZGVzZXJpYWxpemUgezB9IGJlY2F1c2UgYSByZXF1aXJlZCBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQuICBFeGNlcHRpb246IHsxfQotQ29udmVydGVkPUNvbnZlcnRlZAotU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2VfRVhDXz1JV0FFMDA0OUUgU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoKLUlPRXhjZXB0aW9uX29jY3VycmVkX3doaWxlX0VYQ189SVdBRTAwNTBFIElPRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNvcHlpbmcgbWFuaWZlc3QKLUV4dHJhY3RfZGVzdGluYXRpb25faXNfdGhlX0VYQ189SVdBRTAwNTFFIEV4dHJhY3QgZGVzdGluYXRpb24gaXMgdGhlIHNhbWUgcGF0aCBhcyBzb3VyY2UgZmlsZQotUGFyYW1ldGVyX3Nob3VsZF9ub3RfYmVfbnVfRVhDXz1JV0FFMDA1MkUgUGFyYW1ldGVyIHNob3VsZCBub3QgYmUgbnVsbAotQXJjaGl2ZV9pc19ub3RfYV92YWxpZF9FSkJfRVhDXz1JV0FFMDA1NUUgQXJjaGl2ZSBpcyBub3QgYSB2YWxpZCBFSkIgSkFSIGZpbGUgKDEuMCkgYmVjYXVzZSBubyBzZXJpYWxpemVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgY2FuIGJlIGZvdW5kLCBlaXRoZXIgaW4gdGhlIG1hbmlmZXN0IG9yIGluIGVudHJpZXMgd2l0aCBhICIuc2VyIiBleHRlbnNpb24KLV9UaGVfZm9sbG93aW5nX2ZpbGVzX2NvdWxkX0VYQ189SVdBRTAwNTZFIFRoZSBmb2xsb3dpbmcgZmlsZXMgY291bGQgbm90IGJlIGxvYWRlZDoKLUZpeFByaW1LZXlDb21tYW5kX2ZhaWxlZF8tX0VYQ189SVdBRTAwNTdFIEZpeFByaW1LZXlDb21tYW5kIGZhaWxlZCAtIGV4Y2VwdGlvbiBzdGFjayB0cmFjZToKLUZpeFByaW1LZXlDb21tYW5kX3VzYWdlX19fPUZpeFByaW1LZXlDb21tYW5kIHVzYWdlOiAgPHNvdXJjZUphckZpbGVQYXRoPiBbZGVzdGluYXRpb25QYXRoXQotRml4UHJpbUtleUNvbW1hbmRfdXNhZ2VfX3NfRVhDXz1JV0FFMDA1OEUgRml4UHJpbUtleUNvbW1hbmQgdXNhZ2U6IHNvdXJjZUphckZpbGVQYXRoIG11c3QgcG9pbnQgdG8gYSB2YWxpZCBFSkIgSkFSIGZpbGUgb3IgZGlyZWN0b3J5IG9mIGFuIGluZmxhdGVkIEVKQiBKQVIgZmlsZQotUmVwYWlyX2NvbW1hbmRfZmFpbGVkXy1fZXhfRVhDXz1JV0FFMDA1OUUgUmVwYWlyIGNvbW1hbmQgZmFpbGVkIC0gZXhjZXB0aW9uIHN0YWNrIHRyYWNlOgotUmVwYWlyc19hbGxfZW50cmllc19pbl90aGU9UmVwYWlycyBhbGwgZW50cmllcyBpbiB0aGUgTUVUQS1JTkYgYW5kL29yIFdFQi1JTkYgZGlyZWN0b3JpZXMgdG8gYmUgdGhlIGNvcnJlY3QgY2FzZQotUmVwYWlyQXJjaGl2ZUNvbW1hbmRfdXNhZ2U9UmVwYWlyQXJjaGl2ZUNvbW1hbmQgdXNhZ2U6ICA8c291cmNlSmFyRmlsZVBhdGg+IDxkZXN0aW5hdGlvblBhdGg+Ci1SZXBhaXJBcmNoaXZlQ29tbWFuZF91c2FnZTFfRVJST1JfPUlXQUUwMDYwRSBSZXBhaXJBcmNoaXZlQ29tbWFuZCB1c2FnZTogc291cmNlSmFyRmlsZVBhdGggbXVzdCBwb2ludCB0byBhIHZhbGlkIGFyY2hpdmUgb3IgZGlyZWN0b3J5IG9mIGFuIGluZmxhdGVkIGFyY2hpdmUKLUFwcGxpY2F0aW9uX0NsaWVudF9KYXJfRmlsPUFwcGxpY2F0aW9uIENsaWVudCBKQVIgRmlsZQotRUFSX0ZpbGU9RUFSIEZpbGUKLUVKQl9KYXJfRmlsZT1FSkIgSkFSIEZpbGUKLVJBUl9GaWxlPVJBUiBGaWxlCi1XQVJfRmlsZT1XQVIgRmlsZQotRXJyb3Jfb2NjdXJyZWRfaXRlcmF0aW5nX2ZfRVhDXz1JV0FFMDA2MUUgRXJyb3Igb2NjdXJyZWQgaXRlcmF0aW5nIGZpbGVzCi1FbmRfb2ZfbGlzdF9yZWFjaGVkX0VYQ189SVdBRTAwNjJFIFJlYWNoZWQgZW5kIG9mIGxpc3QKLUludGVybmFsX0Vycm9yX19JdGVyYXRvcl9vX0VYQ189SVdBRTAwNjNFIEludGVybmFsIEVycm9yOiBJdGVyYXRvciBvdXQgb2Ygc3luYyB3aXRoIHppcCBlbnRyaWVzCi1FcnJvcl9pdGVyYXRpbmdfdGhlX2FyY2hpdl9FWENfPUlXQUUwMDY0RSBFcnJvciBpdGVyYXRpbmcgdGhlIGFyY2hpdmUKLUFic29sdXRlX3BhdGhfdW5rbm93bl9FWENfPUlXQUUwMDY1RSBBYnNvbHV0ZSBwYXRoIHVua25vd24KLU9yaWdpbmFsX2FyY2hpdmVfaXNfbm90X2FfX0VYQ189SVdBRTAwNjZFIE9yaWdpbmFsIGFyY2hpdmUgaXMgbm90IGEgZGlyZWN0b3J5Ci1OdWxsX3VyaV9FWENfPUlXQUUwMDY3RSBOdWxsIHVyaQotTW9kdWxlX2ZpbGU9TW9kdWxlIGZpbGUKLUFfV0FSX2ZpbGU9V0FSIGZpbGUKLUFuX0VKQl9KQVJfZmlsZT1FSkIgSkFSIGZpbGUKLUFuX0FwcGxpY2F0aW9uX0NsaWVudF9KQVJfZmlsZT1BcHBsaWNhdGlvbiBDbGllbnQgSkFSIGZpbGUKLUFfUkFSX2ZpbGU9UkFSIGZpbGUKLUFfQXBwbGljYXRpb25fZmlsZT1BcHBsaWNhdGlvbiBmaWxlCi1BX2ZpbGVfZG9lc19ub3RfZXhpc3RfZm9yX21vZHVsZT1BIGZpbGUgZG9lcyBub3QgZXhpc3QgZm9yIG1vZHVsZSBlbGVtZW50IGhhdmluZyB1cmk6IHswfQotRmlsZV9ub3RfY29ycmVjdF90eXBlPVRoZSBmaWxlIHswfSBpbiBFQVIgZmlsZSB7MX0gaXMgbm90IHRoZSBjb3JyZWN0IHR5cGUgYmFzZWQgb24gdGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEV4cGVjdGVkIHR5cGU6IHsyfSI7Ci1Nb2R1bGVfbm90X2luX0VBUj1Nb2R1bGUgaXMgbm90IGluIGFuIEVBUjogezB9Ci1Nb2R1bGVfZmlsZV9kb2VzX25vdF9leGlzdF8yPU1vZHVsZSBmaWxlIGRvZXMgbm90IGV4aXN0IGZvciBNb2R1bGUgcmVmLiAgTW9kdWxlID0gezB9Ci1GaWxlSW1wbC5fRXJyb3JfMD1SZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcHBsaWNhdGlvbkNsaWVudEZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2I4NDk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBleHRlbmRzIE1vZHVsZUZpbGUgewotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0JQXBwbGljYXRpb25DbGllbnQgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihBcHBsaWNhdGlvbkNsaWVudCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FyY2hpdmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FyY2hpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhMWQ2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZW9wZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5SdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmUgZXh0ZW5kcyBDb250YWluZXJ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX1dBUl9GSUxFUyA9IDEgPDwgMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfRUFSX0ZJTEVTID0gMSA8PCAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9FSkJKQVJfRklMRVMgPSAxIDw8IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0FQUENMSUVOVF9GSUxFUyA9IDEgPDwgNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfQVJDSElWRVMgPSAxIDw8IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX1JBUl9GSUxFUyA9IDEgPDwgNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfQUxMID0gKDEgPDwgMSkgfCAoMSA8PCAyKSB8ICgxIDw8IDMpIHwgKDEgPDwgNCkgfCAoMSA8PCA1KSB8ICgxIDw8IDYpOwotCi0JcHVibGljIEFyY2hpdmUgYWRkQ29weShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQlwdWJsaWMgRmlsZSBhZGRDb3B5KEZpbGUgYUZpbGUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogR2V0IGEgZmxhdHRlbmVkIGxpc3QgZnJvbSB0aGUgZGlyZWN0b3J5LCB0aGVuIGFkZENvcHkgdGhlIGxpc3QKLQkgKiAKLQkgKiBAdGhyb3dzIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgZmlsZSB3aXRoIGEgdXJpIHRoYXQgZXF1YWxzIG9uZSBvZiB0aGUgbmVzdGVkIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgZXhpc3RzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCB0aGUgY29waWVkIGZpbGVzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBMaXN0IGFkZENvcHkoUmVhZE9ubHlEaXJlY3RvcnkgZGlyKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBMaXN0IGFkZENvcHlGaWxlcyhMaXN0IGxpc3RPZkZpbGVzKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIGFkZE9yUmVwbGFjZU1vZlJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKX0KLQkgKiAKLQkgKiBJZiBhbnkgb3BlbmVkIGFyY2hpdmUgY29udGFpbnMgZmlsZXMgdGhhdCBoYXZlIHRoaXMgYXJjaGl2ZSBhcyBpdHMgbG9hZGluZyBjb250YWluZXIsIHJldHVybgotCSAqIGZhbHNlOyBvdGhlcndpc2UgcmV0dXJuIHRydWUuIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86IG9wZW4gamFyIEEuIGNyZWF0ZQotCSAqIGphciBCLiBDb3B5IGZpbGVzIGZyb20gQSB0byBCLiBBdHRlbXB0IHRvIGNsb3NlIGphciBBIGJlZm9yZSBzYXZpbmcgamFyIEIuIFRoZW4gYXR0ZW1wdCB0bwotCSAqIHNhdmUgQiwgYW5kIHRoZSBzYXZlIGZhaWxzIGJlY2F1c2UgQSBpcyBjbG9zZWQuIFRoaXMgbWV0aG9kIGFsbG93cyBjbGllbnQgY29kZSB0byB0ZXN0IGZvcgotCSAqIGRlcGVuZGVudCBvcGVuIGFyY2hpdmVzIGJlZm9yZSBzYXZpbmcgdGhlIHNvdXJjZSBhcmNoaXZlLiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGUKLQkgKiBzb2x1dGlvbiBpcyB0byBlaXRoZXIgY2xvc2Ugb3Igc2F2ZSBCIGJlZm9yZSBjbG9zaW5nIEEuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ2xvc2UoKTsKLQotCS8qKgotCSAqIENsb3NlcyB0aGUgbG9hZCBzdHJhdGVneSBmb3IgdGhpcyBhcmNoaXZlIGFuZCBjbG9zZXMgYWxsIGNvbnRhaW5lZCBhcmNoaXZlczsgV0FSTklORzogSWYKLQkgKiBmaWxlcyBoYXZlIGJlZW4gY29waWVkIGZyb20gdGhpcyBhcmNoaXZlIHRvIGFub3RoZXIgYXJjaGl2ZSwgdGhlbiB0aGUgZGVzdGluYXRpb24gYXJjaGl2ZQotCSAqIHNob3VsZCBiZSBzYXZlZCBvciBjbG9zZWQgYmVmb3JlIHRoaXMgYXJjaGl2ZSBjYW4gYmUgc2FmZWx5IGNsb3NlZDsgdG8gdGVzdCBpZiB0aGlzIGFyY2hpdmUKLQkgKiBjYW4gc2FmZWx5IGNsb3NlIGludm9rZSB7QGxpbmsgI2NhbkNsb3NlKCl9Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKTsKLQotCS8qKgotCSAqIFNhdmUgdGhpcyBhcmNoaXZlIGFzIGFuIGV4cGFuZGVkIGRpcmVjdG9yeSB3aGVyZSB0aGUgZmxhZ3MgaXMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9mIHRoZQotCSAqIHNwZWNpZmllZCB0eXBlcyB0byBiZSBleHBhbmRlZDsgZXhhbXBsZToKLQkgKiA8Y29kZT5hbkVhckZpbGUuc2F2ZUFzRGlyZWN0b3J5KGFuRWFyRmlsZS5FWFBBTkRfV0FSX0ZJTEVTIHwgYW5FYXJGaWxlLkVYUEFORF9FSkJKQVJGSUxFUyk8L2NvZGU+OwotCSAqIAotCSAqIElmIHRoaXMgYXJjaGl2ZSB3YXMgbG9hZGVkIGZyb20gdGhlIHNhbWUgdXJpIGFzIGl0IGlzIGJlaW5nIGV4dHJhY3RlZCB0bywgdGhlIG9yaWduYWwgd2lsbCBiZQotCSAqIGRlbGV0ZWQgYW5kIHJlcGxhY2VkIHdpdGggdGhlIGRpcmVjdG9yeQotCSAqIAotCSAqIEB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHNhdmluZwotCSAqIAotCSAqIEB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSByZS1zeW5jaW5nIHRoZSBhcmNoaXZlIHRvIHRoZSBuZXdseSBzYXZlZAotCSAqICAgICAgICAgICAgIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdChpbnQgZXhwYW5zaW9uRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRm9yIHBlcmZvcm1hbmNlLCBzYXZlIHRoZSBhcmNoaXZlIHdpdGhvdXQgcmVvcGVuaW5nOyBGdXJ0aGVyIG9wZXJhdGlvbnMgb24gdGhpcyBpbnN0YW5jZQotCSAqIHdpdGhvdXQgZmlyc3QgY2FsbGluZyB7QGxpbmsgI3Jlb3Blbn13aWxsIHlpZWxkIHVuZXhwZWN0ZWQgcmVzdWx0cy4KLQkgKiAKLQkgKiBAc2VlICNleHRyYWN0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0Tm9SZW9wZW4oaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlIHRoaXMgYXJjaGl2ZSBhcyBhIGRpcmVjdG9yeSB1c2luZyB0aGUgc3BlY2lmaWVkIHVyaQotCSAqIAotCSAqIFRoZSBhcmNoaXZlIHdpbGwgbm90IGJlIHJlbmFtZWQKLQkgKiAKLQkgKiBAdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzYXZpbmcKLQkgKiAKLQkgKiBAc2VlICNleHRyYWN0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0VG8oU3RyaW5nIHVyaSwgaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRBcmNoaXZlQ2xhc3NMb2FkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIEFSY2hpdmUgdGhhdCBzdGFydCB3aXRoIHRoZSBwcmVmaXgKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZmlsdGVyRmlsZXNCeVByZWZpeChTdHJpbmcgcHJlZml4KTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIEFyY2hpdmUgZXhjbHVkaW5nIGFueSBmaWxlIHRoYXQgc3RhcnRzIHdpdGggb25lIG9mIHRoZSBwcmVmaXhlcwotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmaWx0ZXJGaWxlc1dpdGhvdXRQcmVmaXgoU3RyaW5nW10gcHJlZml4ZXMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgYXJjaGl2ZSBmaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIAotCSAqIEBsaW5rIEFyY2hpdmUjYWRkKEZpbGUpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJvb3QgbGV2ZWwgKG5vbi1uZXN0ZWQpIG9wZW5lZCBhcmNoaXZlcyBjb250YWluaW5nIGZpbGVzIHRoYXQgaGF2ZSB0aGlzCi0JICogYXJjaGl2ZSBhcyBpdHMgbG9hZGluZyBjb250YWluZXI7IHRoZSBzZXQgd2lsbCBiZSBlbXB0eSBpZiBubyBzdWNoIG9wZW5lZCBhcmNoaXZlIGV4aXN0cy4KLQkgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOiBvcGVuIGphciBBLiBjcmVhdGUgamFyIEIuIENvcHkgZmlsZXMgZnJvbSBBIHRvCi0JICogQi4gQXR0ZW1wdCB0byBjbG9zZSBqYXIgQSBiZWZvcmUgc2F2aW5nIGphciBCLiBUaGVuIGF0dGVtcHQgdG8gc2F2ZSBCLCBhbmQgdGhlIHNhdmUgZmFpbHMKLQkgKiBiZWNhdXNlIEEgaXMgY2xvc2VkLiBUaGlzIG1ldGhvZCBhbGxvd3MgY2xpZW50IGNvZGUgdG8gdGVzdCBmb3IgZGVwZW5kZW50IG9wZW4gYXJjaGl2ZXMKLQkgKiBiZWZvcmUgc2F2aW5nIHRoZSBzb3VyY2UgYXJjaGl2ZS4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgZW1wdHksIHRoZSBzb2x1dGlvbiBpcyB0byBlaXRoZXIKLQkgKiBjbG9zZSBvciBzYXZlIEIgYmVmb3JlIGNsb3NpbmcgQS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldERlcGVuZGVudE9wZW5BcmNoaXZlcygpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFeHRyYUNsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBmcmFtZXdvcmssIHNwZWNpZmljYWxseSBhcyBhbiBvcHRpbWl6YXRpb24gd2hlbiBzYXZpbmcvZXhwbG9kaW5nCi0JICogYXJjaGl2ZXMgd2l0aCBuZXN0ZWQgYXJjaGl2ZXMKLQkgKi8KLQlwdWJsaWMgRmlsZUl0ZXJhdG9yIGdldEZpbGVzRm9yU2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExvYWRlZE1vZlJlc291cmNlcygpOwotCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdCBnZXRNYW5pZmVzdCgpOwotCi0JcHVibGljIFJlc291cmNlIGdldE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zIGdldE9wdGlvbnMoKTsKLQotCS8qKgotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5I2dldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZWQgZm9yIHdlYnNwaGVyZSBydW50aW1lIHdoZXJlIGFyY2hpdmVzIGFyZSBvbiBkaXNrIChub3QgbmVzdGVkIGluIGphcnMpCi0JICogCi0JICogQHJldHVybiBsaXN0IG9mIGFic29sdXRlIHBhdGhzIHRoYXQgcmVwcmVzZW50cyB0aGlzIGFyY2hpdmUgb25seSwgYW5kIGluIHRoZSBjYXNlIG9mCi0JICogICAgICAgICBXQVJGaWxlcywgdGhlIG5lc3RlZCBsb2FkYWJsZSBjb250ZW50cy4KLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0TG9jYWxSdW50aW1lQ2xhc3NQYXRoKCk7Ci0KLQkvKioKLQkgKiBVc2VkIGZvciB3ZWJzcGhlcmUgcnVudGltZSB3aGVyZSBhcmNoaXZlcyBhcmUgb24gZGlzayAobm90IG5lc3RlZCBpbiBqYXJzKSB0byBnZXQgdGhlCi0JICogcmVjdXJzaXZlIGJlaGF2aW9yLCB0aGUgQXJjaGl2ZSBtdXN0IGJlbG9uZyB0byBhbiBFQVIgZmlsZQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiBhYnNvbHV0ZSBwYXRocyB0aGF0IHJlcHJlc2VudHMgdGhpcyBhcmNoaXZlLCBhbGwgaXQncyBwcmVyZXFzLCByZWN1cnNpdmUuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldEZ1bGxSdW50aW1lQ2xhc3NQYXRoKCk7Ci0KLQkvKioKLQkgKiBVc2VkIGZvciB3ZWJzcGhlcmUgcnVudGltZSB3aGVyZSBhcmNoaXZlcyBhcmUgb24gZGlzayAobm90IG5lc3RlZCBpbiBqYXJzKSB0byBnZXQgdGhlCi0JICogcmVjdXJzaXZlIGJlaGF2aW9yLCB0aGUgQXJjaGl2ZSBtdXN0IGJlbG9uZyB0byBhbiBFQVIgZmlsZQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiBhYnNvbHV0ZSBwYXRocyB0aGF0IHJlcHJlc2VudHMgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGlzIEFyY2hpdmUsIGFsbCBpdCdzCi0JICogICAgICAgICBwcmVyZXFzLCByZWN1cnNpdmUuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldERlcGVuZGVuY3lDbGFzc1BhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcm9vdCBmcm9tIHdoaWNoIG1ldGEgcmVzb3VyY2VzIGdldCBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByb290IGZyb20gd2hpY2ggY2xhc3NlcyBhbmQgcHJvcGVydGllcyBhcmUgbG9hZGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3B0aW9uYWwgZmlsdGVyIGZvciBzYXZpbmcgYSBzdWJzZXQgb2YgZmlsZXM7IGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgZm9yIGFsbCBzYXZlIGFuZCBleHRyYWN0Ci0JICogaW52b2thdGlvbnMKLQkgKi8KLQlwdWJsaWMgU2F2ZUZpbHRlciBnZXRTYXZlRmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5IGdldFNhdmVTdHJhdGVneSgpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRYbWxFbmNvZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBBcmNoaXZlIGhhcwotCSAqIAotCSAqIEBvdGhlciBvbiBpdCdzIGNsYXNzcGF0aCwgZWl0aGVyIGRpcmVjdGx5IG9yIHRyYW5zaXRpdmVseQotCSAqIEBwYXJhbSBBcmNoaXZlCi0JICogICAgICAgICAgICBvdGhlciAtIGFub3RoZXIgYXJjaGl2ZSBpbiB0aGUgc2FtZSBFQVIgZmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhBcmNoaXZlIG90aGVyKTsKLQotCS8qKgotCSAqIEludGVybmFsIEFQSTsgVXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICNoYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8oQXJjaGl2ZSl9Ci0JICogCi0JICogQHBhcmFtIEFyY2hpdmUKLQkgKiAgICAgICAgICAgIG90aGVyIC0gYW5vdGhlciBhcmNoaXZlIGluIHRoZSBzYW1lIEVBUiBmaWxlCi0JICogQHBhcmFtIFNldAotCSAqICAgICAgICAgICAgdmlzaXRlZCAtIHRoZSBzZXQgb2YgYXJjaGl2ZXMgYWxyZWFkeSB2aXNpdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKEFyY2hpdmUgb3RoZXIsIFNldCB2aXNpdGVkLCBFQVJGaWxlIGVhcik7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgdGhlIGFyY2hpdmUgaGFzIGJlZW4gb3BlbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBZnRlck9wZW4oKTsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgbG9hZCBzdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCi0JLyoqCi0JICogQW4gaXRlbSBpcyBjb25zaWRlcmVkIGEgZHVwbGljYXRlIGlmIHRoZSBhcmNoaXZlIGNvbnRhaW5zIGEgZmlsZSBvciBsb2FkZWQgbW9mIHJlc291cmNlIHdpdGgKLQkgKiB0aGUgdXJpLCBvciBpZiB0aGUgdXJpIGlzIGVxdWFsIHRvIHRoZSBtYW5pZmVzdCB1cmkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0R1cGxpY2F0ZShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFVzZWQgYXMgYW4gb3B0aW1pemF0aW9uIGF0IGNvcHkgdGltZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFuaWZlc3RTZXQoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzTW9mUmVzb3VyY2VMb2FkZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIGRpc3BhdGNoIGJldHdlZW4gdGhlIGFyY2hpdmUgYW5kIHRoZSBsb2FkIHN0cmF0ZWd5IHdoZW4gYnVpbGRpbmcgdGhlIGZpbGUKLQkgKiBsaXN0OyBjbGllbnRzIHNob3VsZCBub3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkQXJjaGl2ZShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmNoaXZlIGlzIHN0aWxsIG9wZW5lZCBmb3IgcmVhZDsgaWYgbm90LCBJT0V4Y2VwdGlvbnMgY291bGQgYmUgdGhyb3duCi0JICogb24gYXR0ZW1wdHMgdG8gZ2V0IGlucHV0IHN0cmVhbXMgb24gZmlsZSBlbnRyaWVzLiByZW9wZW4oKSB3aWxsIGNhdXNlIHRoaXMgYXJjaGl2ZSBhbmQgaXRzCi0JICogbmVzdGVkIGFyY2hpdmVzIHRvIHJlYnVpbGQgdGhlaXIgbG9hZCBzdHJhdGVnaWVzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9mIHJlc291cmNlIGFuZCBhZGQgaXQgdG8gdGhlIHJlc291cmNlIHNldCBvZiB0aGUgY29udGV4dCBvZiB0aGlzIGFyY2hpdmU7IGFsbAotCSAqIHJlc291cmNlcyBpbiBtZW1vcnkgYXJlIHNhdmVkIHdoZW4gdGhlIGFyY2hpdmUgaXMgc2F2ZWQKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBhcmNoaXZlIGhhdmluZyB0aGUgdXJpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vZiByZXNvdXJjZSBhbmQgYWRkIGl0IHRvIHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIGNvbnRleHQgb2YgdGhpcyBhcmNoaXZlOyBhbGwKLQkgKiByZXNvdXJjZXMgaW4gbWVtb3J5IGFyZSBzYXZlZCB3aGVuIHRoZSBhcmNoaXZlIGlzIHNhdmVkCi0JICogCi0JICogQHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgYXJjaGl2ZSBoYXZpbmcgdGhlIHVyaQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSwgRUxpc3QgZXh0ZW50KSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBkaXNwYXRjaCBiZXR3ZWVuIHRoZSBhcmNoaXZlIGFuZCB0aGUgbG9hZCBzdHJhdGVneSB3aGVuIGJ1aWxkaW5nIHRoZSBmaWxlCi0JICogbGlzdDsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIGRpc3BhdGNoIGJldHdlZW4gdGhlIGFyY2hpdmUgYW5kIHRoZSBsb2FkIHN0cmF0ZWd5IHdoZW4gYnVpbGRpbmcgdGhlIGZpbGUKLQkgKiBsaXN0OyBjbGllbnRzIHNob3VsZCBub3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKExvb3NlQXJjaGl2ZSBsb29zZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXh0cmEgY2xhc3MgcGF0aCB3aXRoIG5vIHJlZnJlc2ggb2YgdGhlIGNsYXNzIGxvYWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TZXRFeHRyYUNsYXNzcGF0aChqYXZhLmxhbmcuU3RyaW5nIG5ld0V4dHJhQ2xhc3NwYXRoKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZShGaWxlIGFGaWxlKTsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBmb3IgInJlLXN5bmNpbmciIGFuIGFyY2hpdmUgYWZ0ZXIgc2F2ZTsgY2xpZW50cyBub3JtYWxseSBzaG91bGQgbm90IG5lZWQgdGhpcwotCSAqIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlb3BlbigpIHRocm93cyBSZW9wZW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIHJlb3BlbmluZyBuZXN0ZWQgYXJjaGl2ZXM7IGNsaWVudHMgbm9ybWFsbHkgc2hvdWxkIG5vdCBuZWVkIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgcmVvcGVuKEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZSB0aGlzIGFyY2hpdmUgYXMgYSBqYXIgZmlsZSB3aXRoIHRoZSB1cmkgb2YgdGhlIGFyY2hpdmU7Ci0JICogCi0JICogQHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc2F2aW5nCi0JICogCi0JICogQHRocm93cyBSZW9wZW5FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHJlLXN5bmNpbmcgdGhlIGFyY2hpdmUgdG8gdGhlIG5ld2x5IHNhdmVkCi0JICogICAgICAgICAgICAgZGVzdGluYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBSZW9wZW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlIHRoaXMgYXJjaGl2ZSB1c2luZyB0aGUgc2F2ZSBzdHJhdGVneSBzcGVjaWZpZWQKLQkgKiAKLQkgKiBAdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzYXZpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKFNhdmVTdHJhdGVneSBhU3RyYXRlZ3kpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmUgdGhpcyBhcmNoaXZlIGFzIGEgamFyIGZpbGUgdXNpbmcgdXJpIHByb3ZpZGVkOyBJZiB0aGUgdXJpIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBVUkkgb2YKLQkgKiB0aGlzIGFyY2hpdmUsIHRoZSB1cmkgb2YgdGhpcyBhcmNoaXZlIHdpbGwgY2hhbmdlIHRvIHRoZSBuZXcgdXJpIChmb3IgcmVvcGVuKQotCSAqIAotCSAqIEB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHNhdmluZwotCSAqIAotCSAqIEB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSByZS1zeW5jaW5nIHRoZSBhcmNoaXZlIHRvIHRoZSBuZXdseSBzYXZlZAotCSAqICAgICAgICAgICAgIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUFzKFN0cmluZyB1cmkpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRm9yIHBlcmZvcm1hbmNlLCBzYXZlIHRoZSBhcmNoaXZlIHdpdGhvdXQgcmVvcGVuaW5nOyBGdXJ0aGVyIG9wZXJhdGlvbnMgb24gdGhpcyBpbnN0YW5jZQotCSAqIHdpdGhvdXQgZmlyc3QgY2FsbGluZyB7QGxpbmsgI3Jlb3Blbn13aWxsIHlpZWxkIHVuZXhwZWN0ZWQgcmVzdWx0cy4KLQkgKiAKLQkgKiBAc2VlICNzYXZlQXMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBc05vUmVvcGVuKFN0cmluZyB1cmkpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZvciBwZXJmb3JtYW5jZSwgc2F2ZSB0aGUgYXJjaGl2ZSB3aXRob3V0IHJlb3BlbmluZzsgRnVydGhlciBvcGVyYXRpb25zIG9uIHRoaXMgaW5zdGFuY2UKLQkgKiB3aXRob3V0IGZpcnN0IGNhbGxpbmcge0BsaW5rICNyZW9wZW59d2lsbCB5aWVsZCB1bmV4cGVjdGVkIHJlc3VsdHMuCi0JICogCi0JICogQHNlZSAjc2F2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU5vUmVvcGVuKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3QXJjaGl2ZUNsYXNzTG9hZGVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlQ2xhc3NMb2FkZXIoamF2YS5sYW5nLkNsYXNzTG9hZGVyIG5ld0FyY2hpdmVDbGFzc0xvYWRlcik7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHRyYUNsYXNzcGF0aAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dHJhQ2xhc3NwYXRoKGphdmEubGFuZy5TdHJpbmcgbmV3RXh0cmFDbGFzc3BhdGgpOwotCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3QoQXJjaGl2ZU1hbmlmZXN0IG5ld01hbmlmZXN0KTsKLQotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KGphdmEudXRpbC5qYXIuTWFuaWZlc3QgYU1hbmlmZXN0KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIENsYXNzLXBhdGggbWFuaWZlc3QgZW50cnksIHJlYnVpbGRzIHRoZSBjbGFzcyBsb2FkZXIsIGFuZCByZWZyZXNoZXMgYW55IHJlZmxlY3RlZAotCSAqIGphdmEgY2xhc3NlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0Q2xhc3NQYXRoQW5kUmVmcmVzaChTdHJpbmcgY2xhc3NwYXRoKTsKLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbnMob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9ucyBuZXdPcHRpb25zKTsKLQotCS8qKgotCSAqIE9wdGlvbmFsIGZpbHRlciBmb3Igc2F2aW5nIGEgc3Vic2V0IG9mIGZpbGVzOyBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIGZvciBhbGwgc2F2ZSBhbmQgZXh0cmFjdAotCSAqIGludm9rYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZUZpbHRlcihTYXZlRmlsdGVyIGFGaWx0ZXIpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2F2ZVN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVTdHJhdGVneShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3kgbmV3U2F2ZVN0cmF0ZWd5KTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1htbEVuY29kaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0WG1sRW5jb2RpbmcoamF2YS5sYW5nLlN0cmluZyBuZXdYbWxFbmNvZGluZyk7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgd2hldGhlciBqYXZhIHJlZmxlY3Rpb24gc2hvdWxkIGJlIHNldCB1cCBmb3IgdGhpcyBhcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlSmF2YVJlZmxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZQotCSAqIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2UjZ2V0QXJjaGl2ZV9UeXBlcygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFR5cGVzKCk7Ci0KLQlib29sZWFuIGlzVHlwZShTdHJpbmcgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhNzYzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBkaXNjcmltaW5hdG9ycyA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGN1c3RvbVR5cGVzID0gbnVsbDsKLQotCS8qCi0JICogTW9zdCBrbm93biB0eXBlcyBhcmUgb2YgbGVuZ3RoIDMuIFdoZW52ZXIgYSBuZXcgdHlwZSBpcyBhZGRlZCB0aGF0IGlzIG5vdCBvZiBsZW5ndGggMywKLQkgKiBtb2RpZmljYXRpb25zIG1heSBiZSBuZWNlc3NhcnkgdG8gdGhlICdpc0tub3duQXJjaGl2ZVR5cGUoKSBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZWZhdWx0S25vd25UeXBlcyA9IG5ldyBTdHJpbmdbXXsiZWFyIiwgIndhciIsICJqYXIiLCAiemlwIiwgImZhciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeSgpOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdG9yRGlzY3JpbWluYXRvcihHZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3IpIHsKLQkJSU5TVEFOQ0UuZ2V0RGlzY3JpbWluYXRvcnMoKS5hZGQoZGlzY3JpbWluYXRvcik7Ci0JCUlOU1RBTkNFLmFkZEtub3duQXJjaGl2ZVR5cGVzKGRpc2NyaW1pbmF0b3IuZ2V0Q3VzdG9tRmlsZUV4dGVuc2lvbnMoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXREaXNjcmltaW5hdG9ycygpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3JzID09IG51bGwpCi0JCQlkaXNjcmltaW5hdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JzOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUeXBlcyhBcmNoaXZlIGFyY2hpdmUpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3JzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzY3JpbWluYXRvciA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gZGlzY3JpbWluYXRvcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCWRpc2NyaW1pbmF0b3IgPSAoR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvcikgaXRyLm5leHQoKTsKLQkJCWlmIChkaXNjcmltaW5hdG9yLmRpc2NyaW1pbmF0ZShhcmNoaXZlKSkKLQkJCQlhcmNoaXZlLmdldFR5cGVzKCkuYWRkKGRpc2NyaW1pbmF0b3IuZ2V0VHlwZUtleSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEtub3duQXJjaGl2ZVR5cGVzKFN0cmluZ1tdIG5ld1R5cGVzKSB7Ci0JCWlmIChjdXN0b21UeXBlcyA9PSBudWxsKSB7Ci0JCQljdXN0b21UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljdXN0b21UeXBlcy5hZGQobmV3VHlwZXNbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNLbm93bkFyY2hpdmVUeXBlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCWlmIChmaWxlVVJJID09IG51bGwgfHwgZmlsZVVSSS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBsb3dlckNhc2VVcmkgPSBmaWxlVVJJLnRvTG93ZXJDYXNlKCk7Ci0JCS8qCi0JCSAqIEVuc3VyZSB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIFVSSSBpcyBsb25nIGVub3VnaCB0byBjb250YWluIGEgLjMgc3R5bGUgZXh0ZW5zaW9uCi0JCSAqLwotCQlpZiAobG93ZXJDYXNlVXJpLmxlbmd0aCgpID4gNCAmJiBsb3dlckNhc2VVcmkuY2hhckF0KGxvd2VyQ2FzZVVyaS5sZW5ndGgoKSAtIDQpID09ICcuJykgewotCQkJU3RyaW5nIGVuZGluZyA9IGxvd2VyQ2FzZVVyaS5zdWJzdHJpbmcobG93ZXJDYXNlVXJpLmxlbmd0aCgpIC0gMyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRLbm93blR5cGVzLmxlbmd0aDsgaSsrKQotCQkJCWlmIChkZWZhdWx0S25vd25UeXBlc1tpXS5lcXVhbHMoZW5kaW5nKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgY3VzdG9tVHlwZSA9IG51bGw7Ci0JCWlmIChjdXN0b21UeXBlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBjdXN0b21UeXBlc0l0ZXJhdG9yID0gY3VzdG9tVHlwZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChjdXN0b21UeXBlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWN1c3RvbVR5cGUgPSAoU3RyaW5nKSBjdXN0b21UeXBlc0l0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZmlsZVVSSS5lbmRzV2l0aChjdXN0b21UeXBlKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9DbGllbnRNb2R1bGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NsaWVudE1vZHVsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQ4YjA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NsaWVudE1vZHVsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENsaWVudE1vZHVsZVJlZiBleHRlbmRzIE1vZHVsZVJlZiB7Ci0JQXBwbGljYXRpb25DbGllbnQgZ2V0QXBwbGljYXRpb25DbGllbnQoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci19IC8vQ2xpZW50TW9kdWxlUmVmCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MzA4MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkgewotCi0JcHVibGljIHN0YXRpYyBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkoKTsKLQotCXByb3RlY3RlZCBDb21tb25hcmNoaXZlRmFjdG9yeSBjb21tb25BcmNoaXZlRmFjdG9yeSA9ICgoQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsKSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKSkuZ2V0RGVsZWdhdGUoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gY29tbW9uQXJjaGl2ZUZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSkgewotCQljb21tb25BcmNoaXZlRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjM1N2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDIgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKi8KLQotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFscyAtIFByb3BlcnR5IG9mIElCTSwKLSAqIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwIDIwMDEKLSAqLwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiY29tbW9uYXJjaGl2ZSIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nLCBTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGUgPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0KLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25hcmNoaXZlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhZjBhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25hcmNoaXZlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tb25hcmNoaXZlRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBUZWxsIHRoZSBmYWN0b3J5IHRoYXQgYW4gYXJjaGl2ZSBoYXMgYmVlbiBvcGVuZWQ7IHRoZSBmYWN0b3J5IG1haW50YWlucyBhIHdlYWsgc2V0IG9mIGFsbCB0aGUKLQkgKiBvcGVuIGFyY2hpdmVzIHRvIGRldGVybWluZSBpZiBhbm90aGVyIGFyY2hpdmUgY2FuIGJlIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcmNoaXZlQ2xvc2VkKEFyY2hpdmUgYUNsb3NlZEFyY2hpdmUpOwotCi0JLyoqCi0JICogVGVsbCB0aGUgZmFjdG9yeSB0aGF0IGFuIGFyY2hpdmUgaGFzIGJlZW4gb3BlbmVkOyB0aGUgZmFjdG9yeSBtYWludGFpbnMgYSB3ZWFrIHNldCBvZiBhbGwgdGhlCi0JICogb3BlbiBhcmNoaXZlcyB0byBkZXRlcm1pbmUgaWYgYW5vdGhlciBhcmNoaXZlIGNhbiBiZSBjbG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgYXJjaGl2ZU9wZW5lZChBcmNoaXZlIGFuT3BlbkFyY2hpdmUpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24oQXJjaGl2ZSl9Ci0JICogCi0JICogSWYgYW55IG9wZW5lZCBhcmNoaXZlIGNvbnRhaW5zIGZpbGVzIHRoYXQgaGF2ZSB0aGUgcGFyYW1ldGVyIGFzIGl0cyBsb2FkaW5nIGNvbnRhaW5lciwgcmV0dXJuCi0JICogZmFsc2U7IG90aGVyd2lzZSByZXR1cm4gdHJ1ZS4gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzogb3BlbiBqYXIgQS4gY3JlYXRlCi0JICogamFyIEIuIENvcHkgZmlsZXMgZnJvbSBBIHRvIEIuIEF0dGVtcHQgdG8gY2xvc2UgamFyIEEgYmVmb3JlIHNhdmluZyBqYXIgQi4gVGhlbiBhdHRlbXB0IHRvCi0JICogc2F2ZSBCLCBhbmQgdGhlIHNhdmUgZmFpbHMgYmVjYXVzZSBBIGlzIGNsb3NlZC4gVGhpcyBtZXRob2QgYWxsb3dzIGNsaWVudCBjb2RlIHRvIHRlc3QgZm9yCi0JICogZGVwZW5kZW50IG9wZW4gYXJjaGl2ZXMgYmVmb3JlIHNhdmluZyB0aGUgc291cmNlIGFyY2hpdmUuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoZQotCSAqIHNvbHV0aW9uIGlzIHRvIGVpdGhlciBjbG9zZSBvciBzYXZlIEIgYmVmb3JlIGNsb3NpbmcgQS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5DbG9zZShBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBDbG9zZSBhbnkgb3BlbiBhcmNoaXZlcyBhbmQgZGVsZXRlIHRoZSB0ZW1wIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBuZXN0ZWQgYXJjaGl2ZXMuIER1ZSB0bwotCSAqIGxpbWl0YXRpb25zIGluIHRoZSBkZWxldGVPbkV4aXQoKSBtZXRob2Qgb2YgZmlsZSwgaW4gMS4yLjIgdGhlcmUgaXMgbm8gd2F5IHRvIGVuc3VyZSB0aGVzZQotCSAqIGZpbGVzIGdldCBkZWxldGVkLiBDbGllbnQgY29kZSBzaG91bGQgdXNlIGdvb2QgcHJhY3RpY2UgYnkgY2FsbGluZyB7QGxpbmsgQXJjaGl2ZSNjbG9zZX13aGVuCi0JICogZmluaXNoZWQgd2l0aCBhbiBBcmNoaXZlIGluc3RhbmNlLCByYXRoZXIgdGhhbiBqdXN0IGRpc2NhcmQgYW4gaW5zdGFuY2Ugd2l0aCBvcGVuIGZpbGUKLQkgKiBoYW5kbGVzIGFuZCB3YWl0IGZvciBpdCB0byBiZSBnYydkLiBCZXlvbmQgdGhhdCwgcHJvZ3JhbSBjb2RlIGNvbXBpbGVkIGZvciAxLjMgY2FuIChhbmQKLQkgKiBzaG91bGQpIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHNodXRkb3duIGhvb2s6IDxjb2RlPgotCSAqIAlSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZCgpIHsKLQkgcHVibGljIHZvaWQgcnVuKCkgewotCSAoKENvbW1vbmFyY2hpdmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpKS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLmNsb3NlT3BlbkFyY2hpdmVzKCk7Ci0JIH0KLQkgfSk7PC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlT3BlbkFyY2hpdmVzKCk7Ci0KLQlwdWJsaWMgQXJjaGl2ZSBjb3B5KEFyY2hpdmUgYW5BcmNoaXZlKTsKLQotCXB1YmxpYyBNb2R1bGVGaWxlIGNvcHkoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFyY2hpdmUgZm9yIGVkaXRpbmcsIGFuZCBpbml0aWFsaXplcyBpdCBhcHByb3ByaWF0ZWx5IChhZGRzIGFuIGVtcHR5IGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlSW5pdGlhbGl6ZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFyY2hpdmUgZm9yIGVkaXRpbmcsIGFuZCBpbml0aWFsaXplcyBpdCBhcHByb3ByaWF0ZWx5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgY3JlYXRlQXJjaGl2ZUluaXRpYWxpemVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5OyBjbGllbnRzIHVzdWFsbHkgc2hvdWxkIG5vdCBuZWVkIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIExvYWRTdHJhdGVneSBjcmVhdGVDaGlsZExvYWRTdHJhdGVneShTdHJpbmcgdXJpLCBMb2FkU3RyYXRlZ3kgcGFyZW50KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFyY2hpdmUgZm9yIGVkaXRpbmcsIGFuZCBpbml0aWFsaXplcyBpdCBhcHByb3ByaWF0ZWx5IChhZGRzIGFuIGVtcHR5IGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYXJjaGl2ZSBmb3IgZWRpdGluZywgYW5kIGluaXRpYWxpemVzIGl0IGFwcHJvcHJpYXRlbHkgKGFkZHMgYW4gZW1wdHkgZGVwbG95bWVudAotCSAqIGRlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluaXRpYWxpemVkIGFyY2hpdmUgYmFzZWQgb24gdGhlIGdpdmVuIFVSSSBhbmQgb3B0aW9ucwotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUFyY2hpdmVJbml0aWFsaXplZChBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5pdGlhbGl6ZWQgRUFSIGJhc2VkIG9uIHRoZSBnaXZlbiBVUkkgYW5kIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluaXRpYWxpemVkIEVKQiBiYXNlZCBvbiB0aGUgZ2l2ZW4gVVJJIGFuZCBvcHRpb25zCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3QXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3RUFSRmlsZShFQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplZCBhcmNoaXZlIGJhc2VkIG9uIHRoZSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0VKQkphckZpbGUoRUpCSmFyRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZWQgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdNb2R1bGVGaWxlKE1vZHVsZUZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVkIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3UkFSRmlsZShSQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplZCBhcmNoaXZlIGJhc2VkIG9uIHRoZSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld1dBUkZpbGUoV0FSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIE51bGxMb2FkU3RyYXRlZ3lJbXBsOyB1c2VkIGZvciBuZXcgYXJjaGl2ZXMKLQkgKi8KLQlMb2FkU3RyYXRlZ3kgY3JlYXRlRW1wdHlMb2FkU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gZHluYW1pY2FsbHkgYnVpbGQgYSBsb2FkIHN0cmF0ZWd5IGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEZXRlcm1pbmVzIHdoZXRoZXIKLQkgKiB0aGUgdXJpIHBvaW50cyB0byBhIGphciBmaWxlIG9yIGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZUxvYWRTdHJhdGVneShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSQVJGaWxlIGNyZWF0ZVJBUkZpbGVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFyY2hpdmUgZm9yIGVkaXRpbmcsIGFuZCBpbml0aWFsaXplcyBpdCBhcHByb3ByaWF0ZWx5IChhZGRzIGFuIGVtcHR5IGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBXQVJGaWxlIGNyZWF0ZVdBUkZpbGVJbml0aWFsaXplZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gaW50cm9zcGVjdCBhbiBhcmNoaXZlIGFuZCBnZXQgaXQncyBjbGFzcyBwYXRoIGVudHJpZXMgYmVmb3JlIGZ1bGx5IG9wZW5pbmcKLQkgKiB0aGUgYXJjaGl2ZTsgbmVlZGVkIGJlY2F1c2Ugd2UgbWF5IG5lZWQgZXh0cmEgY2xhc3NwYXRoIGluZm8gdG8gYmUgYWJsZSB0byBvcGVuIHRoZSAxLjAgZmlsZQotCSAqIGFuZCBkZXNlcmlhbGl6ZSBpdHMgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICogCi0JICogQHJldHVybiBhIHRva2VuaXplZCBhcnJheSBvZiBjbGFzcyBwYXRoIGNvbXBvbmVudHMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TWFuaWZlc3RDbGFzc1BhdGhWYWx1ZXMoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgcm9vdCBsZXZlbCAobm9uLW5lc3RlZCkgb3BlbmVkIGFyY2hpdmVzIGNvbnRhaW5pbmcgZmlsZXMgdGhhdCBoYXZlIHRoZQotCSAqIHBhcmFtZXRlciBhcyBpdHMgbG9hZGluZyBjb250YWluZXI7IHRoZSBzZXQgd2lsbCBiZSBlbXB0eSBpZiBubyBzdWNoIG9wZW5lZCBhcmNoaXZlIGV4aXN0cy4KLQkgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOiBvcGVuIGphciBBLiBjcmVhdGUgamFyIEIuIENvcHkgZmlsZXMgZnJvbSBBIHRvCi0JICogQi4gQXR0ZW1wdCB0byBjbG9zZSBqYXIgQSBiZWZvcmUgc2F2aW5nIGphciBCLiBUaGVuIGF0dGVtcHQgdG8gc2F2ZSBCLCBhbmQgdGhlIHNhdmUgZmFpbHMKLQkgKiBiZWNhdXNlIEEgaXMgY2xvc2VkLiBUaGlzIG1ldGhvZCBhbGxvd3MgY2xpZW50IGNvZGUgdG8gdGVzdCBmb3IgZGVwZW5kZW50IG9wZW4gYXJjaGl2ZXMKLQkgKiBiZWZvcmUgc2F2aW5nIHRoZSBzb3VyY2UgYXJjaGl2ZS4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgZW1wdHksIHRoZSBzb2x1dGlvbiBpcyB0byBlaXRoZXIKLQkgKiBjbG9zZSBvciBzYXZlIEIgYmVmb3JlIGNsb3NpbmcgQS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKEFyY2hpdmUgYW5BcmNoaXZlKTsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIG9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSBieSB0aGUgcGFzc2VkIHVyaQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGtpbmQgb2YgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUgYnkgdGhlIHBhc3NlZCB1cmksIGFuZCB1c2UgdGhlIGV4dHJhQ2xhc3NQYXRoIGZvciBqYXZhIHJlZmxlY3Rpb24sIGluCi0JICogYWRkaXRpb24gdG8gdGhlIG1hbmlmZXN0IGNsYXNzLXBhdGg7IG1vc3RseSB1c2VkIGZvciBlamIgMS4wIGphciBmaWxlcyB0byBiZSBjb252ZXJ0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBraW5kIG9mIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpLCBTdHJpbmcgZXh0cmFDbGFzc1BhdGgpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFQVJGaWxlIG9wZW5FQVJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFQVJGaWxlIG9wZW5FQVJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgRUFSRmlsZSBvcGVuRUFSRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCMTFKYXJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpLCBTdHJpbmcgZXh0cmFDbGFzc1BhdGgpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKFN0cmluZyB1cmksIFN0cmluZyBleHRyYUNsYXNzUGF0aCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBvcGVubmluZyBhbiBBcmNoaXZlIGluIGFuIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShTdHJpbmcgdXJpLCBBcmNoaXZlIHBhcmVudCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBvcGVubmluZyBhbiBBcmNoaXZlIGluIGFuIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UsIEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBvcGVuUkFSRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSQVJGaWxlIG9wZW5SQVJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBSZWFkT25seURpcmVjdG9yeSBvcGVuUmVhZE9ubHlEaXJlY3RvcnkoU3RyaW5nIHVyaSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBvcGVuV0FSRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBvcGVuV0FSRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIFdBUkZpbGUgb3BlbldBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbiB0aGUgYXJjaGl2ZSBieSB0aGUgcGFzc2VkIHBhcmFtZXRlciwgd2l0aG91dCBhdHRlbXB0aW5nIHRvIGRldGVybWluZSB3aGF0IGtpbmQgb2YKLQkgKiBhcmNoaXZlIGl0IGlzCi0JICogCi0JICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBBcmNoaXZlLCBidXQgbm90IGEgc3ViY2xhc3MKLQkgKi8KLQlBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JQXJjaGl2ZSBwcmltT3BlbkFyY2hpdmUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFdBUkZpbGUgdmFsdWUKLQkgKi8KLQlXQVJGaWxlIGNyZWF0ZVdBUkZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBFSkJKYXJGaWxlIHZhbHVlCi0JICovCi0JRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQXBwbGljYXRpb25DbGllbnRGaWxlIHZhbHVlCi0JICovCi0JQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVBUkZpbGUgdmFsdWUKLQkgKi8KLQlFQVJGaWxlIGNyZWF0ZUVBUkZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBSQVJGaWxlIHZhbHVlCi0JICovCi0JUkFSRmlsZSBjcmVhdGVSQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQXJjaGl2ZSB2YWx1ZQotCSAqLwotCUFyY2hpdmUgY3JlYXRlQXJjaGl2ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEZpbGUgdmFsdWUKLQkgKi8KLQlGaWxlIGNyZWF0ZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBSZWFkT25seURpcmVjdG9yeSB2YWx1ZQotCSAqLwotCVJlYWRPbmx5RGlyZWN0b3J5IGNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlDb21tb25hcmNoaXZlUGFja2FnZSBnZXRDb21tb25hcmNoaXZlUGFja2FnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVKQk1vZHVsZVJlZiB2YWx1ZQotCSAqLwotCUVKQk1vZHVsZVJlZiBjcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIENvbnZpZW5pbmNlIG1ldGhvZCBmb3Igd3JhcHBpbmcgYSBzdGFuZGFsb25lIEVKQiBKQVIgZmlsZQotCSAqLwotCUVKQk1vZHVsZVJlZiBjcmVhdGVFSkJNb2R1bGVSZWYoRUpCSmFyRmlsZSBlamJKYXJGaWxlKTsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFdlYk1vZHVsZVJlZiB2YWx1ZQotCSAqLwotCVdlYk1vZHVsZVJlZiBjcmVhdGVXZWJNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIENvbnZpZW5pbmNlIG1ldGhvZCBmb3Igd3JhcHBpbmcgYSBzdGFuZGFsb25lIFdBUiBmaWxlCi0JICovCi0JV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZihXQVJGaWxlIHdhckZpbGUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIENsaWVudE1vZHVsZVJlZiB2YWx1ZQotCSAqLwotCUNsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIENvbnZpZW5pbmNlIG1ldGhvZCBmb3Igd3JhcHBpbmcgYSBzdGFuZGFsb25lIEFwcGxpY2F0aW9uIENsaWVudCBKQVIgZmlsZQotCSAqLwotCUNsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoQXBwbGljYXRpb25DbGllbnRGaWxlIGNsaWVudEZpbGUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIENvbm5lY3Rvck1vZHVsZVJlZiB2YWx1ZQotCSAqLwotCUNvbm5lY3Rvck1vZHVsZVJlZiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIENvbnZpZW5pbmNlIG1ldGhvZCBmb3Igd3JhcHBpbmcgYSBzdGFuZGFsb25lIFJBUiBmaWxlCi0JICovCi0JQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZihSQVJGaWxlIHJhckZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbmFyY2hpdmVQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzY0ZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBDb21tb25hcmNoaXZlUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiY29tbW9uYXJjaGl2ZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSID0gNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEUgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfRklMRSA9IDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX1JFRiA9IDEwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTU9EVUxFX1JFRiA9IDExOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfTU9EVUxFX1JFRiA9IDEyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTElFTlRfTU9EVUxFX1JFRiA9IDEzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX1JFRiA9IDE0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEUgPSA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEUgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRSA9IDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSQ0hJVkUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxFID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRV9fVVJJID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRV9fTEFTVF9NT0RJRklFRCA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX1NJWkUgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFX19ESVJFQ1RPUllfRU5UUlkgPSAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX09SSUdJTkFMX1VSSSA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX0xPQURJTkdfQ09OVEFJTkVSID0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRV9fQ09OVEFJTkVSID0gNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFX0ZFQVRVUkVfQ09VTlQgPSA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9fVVJJID0gRklMRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfX0xBU1RfTU9ESUZJRUQgPSBGSUxFX19MQVNUX01PRElGSUVEOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfX1NJWkUgPSBGSUxFX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfX0RJUkVDVE9SWV9FTlRSWSA9IEZJTEVfX0RJUkVDVE9SWV9FTlRSWTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfX09SSUdJTkFMX1VSSSA9IEZJTEVfX09SSUdJTkFMX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19MT0FESU5HX0NPTlRBSU5FUiA9IEZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfX0NPTlRBSU5FUiA9IEZJTEVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfX0ZJTEVTID0gRklMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgPSBGSUxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSQ0hJVkVfX1VSSSA9IENPTlRBSU5FUl9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUkNISVZFX19MQVNUX01PRElGSUVEID0gQ09OVEFJTkVSX19MQVNUX01PRElGSUVEOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUkNISVZFX19TSVpFID0gQ09OVEFJTkVSX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkNISVZFX19ESVJFQ1RPUllfRU5UUlkgPSBDT05UQUlORVJfX0RJUkVDVE9SWV9FTlRSWTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUkNISVZFX19PUklHSU5BTF9VUkkgPSBDT05UQUlORVJfX09SSUdJTkFMX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJDSElWRV9fTE9BRElOR19DT05UQUlORVIgPSBDT05UQUlORVJfX0xPQURJTkdfQ09OVEFJTkVSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUkNISVZFX19DT05UQUlORVIgPSBDT05UQUlORVJfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUkNISVZFX19GSUxFUyA9IENPTlRBSU5FUl9fRklMRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkNISVZFX19UWVBFUyA9IENPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXJjaGl2ZTwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJDSElWRV9GRUFUVVJFX0NPVU5UID0gQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX19VUkkgPSBBUkNISVZFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX19MQVNUX01PRElGSUVEID0gQVJDSElWRV9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfX1NJWkUgPSBBUkNISVZFX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZID0gQVJDSElWRV9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX19PUklHSU5BTF9VUkkgPSBBUkNISVZFX19PUklHSU5BTF9VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX19MT0FESU5HX0NPTlRBSU5FUiA9IEFSQ0hJVkVfX0xPQURJTkdfQ09OVEFJTkVSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfRklMRV9fQ09OVEFJTkVSID0gQVJDSElWRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX19GSUxFUyA9IEFSQ0hJVkVfX0ZJTEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfX1RZUEVTID0gQVJDSElWRV9fVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1vZHVsZSBGaWxlPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UID0gQVJDSElWRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX1VSSSA9IE1PRFVMRV9GSUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fTEFTVF9NT0RJRklFRCA9IE1PRFVMRV9GSUxFX19MQVNUX01PRElGSUVEOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX1NJWkUgPSBNT0RVTEVfRklMRV9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlkgPSBNT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fT1JJR0lOQUxfVVJJID0gTU9EVUxFX0ZJTEVfX09SSUdJTkFMX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUiA9IE1PRFVMRV9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fRklMRVMgPSBNT0RVTEVfRklMRV9fRklMRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX1RZUEVTID0gTU9EVUxFX0ZJTEVfX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gTU9EVUxFX0ZJTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FSkIgSmFyIEZpbGU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9GRUFUVVJFX0NPVU5UID0gTU9EVUxFX0ZJTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX1VSSSA9IE1PRFVMRV9GSUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFX19MQVNUX01PRElGSUVEID0gTU9EVUxFX0ZJTEVfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFX19TSVpFID0gTU9EVUxFX0ZJTEVfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlkgPSBNT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFX19PUklHSU5BTF9VUkkgPSBNT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXQVJfRklMRV9fTE9BRElOR19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFX19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFX19GSUxFUyA9IE1PRFVMRV9GSUxFX19GSUxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdBUl9GSUxFX19UWVBFUyA9IE1PRFVMRV9GSUxFX19UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gTU9EVUxFX0ZJTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XQVIgRmlsZTwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0FSX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFX19VUkkgPSBNT0RVTEVfRklMRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRV9fTEFTVF9NT0RJRklFRCA9IE1PRFVMRV9GSUxFX19MQVNUX01PRElGSUVEOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRV9fU0laRSA9IE1PRFVMRV9GSUxFX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZID0gTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRV9fT1JJR0lOQUxfVVJJID0gTU9EVUxFX0ZJTEVfX09SSUdJTkFMX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRV9fQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRV9fRklMRVMgPSBNT0RVTEVfRklMRV9fRklMRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFQVJfRklMRV9fVFlQRVMgPSBNT0RVTEVfRklMRV9fVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX01PRFVMRV9SRUZTID0gTU9EVUxFX0ZJTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVBUiBGaWxlPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFQVJfRklMRV9GRUFUVVJFX0NPVU5UID0gTU9EVUxFX0ZJTEVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX1VSSSA9IE1PRFVMRV9GSUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19MQVNUX01PRElGSUVEID0gTU9EVUxFX0ZJTEVfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19TSVpFID0gTU9EVUxFX0ZJTEVfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ESVJFQ1RPUllfRU5UUlkgPSBNT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19PUklHSU5BTF9VUkkgPSBNT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fTE9BRElOR19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19GSUxFUyA9IE1PRFVMRV9GSUxFX19GSUxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19UWVBFUyA9IE1PRFVMRV9GSUxFX19UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gTU9EVUxFX0ZJTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUlkgPSA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZX19VUkkgPSBDT05UQUlORVJfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fTEFTVF9NT0RJRklFRCA9IENPTlRBSU5FUl9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fU0laRSA9IENPTlRBSU5FUl9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fRElSRUNUT1JZX0VOVFJZID0gQ09OVEFJTkVSX19ESVJFQ1RPUllfRU5UUlk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fT1JJR0lOQUxfVVJJID0gQ09OVEFJTkVSX19PUklHSU5BTF9VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX0xPQURJTkdfQ09OVEFJTkVSID0gQ09OVEFJTkVSX19MT0FESU5HX0NPTlRBSU5FUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fQ09OVEFJTkVSID0gQ09OVEFJTkVSX19DT05UQUlORVI7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZX19GSUxFUyA9IENPTlRBSU5FUl9fRklMRVM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SZWFkIE9ubHkgRGlyZWN0b3J5PC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkFSX0ZJTEVfX1VSSSA9IE1PRFVMRV9GSUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19MQVNUX01PRElGSUVEID0gTU9EVUxFX0ZJTEVfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19TSVpFID0gTU9EVUxFX0ZJTEVfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlkgPSBNT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19PUklHSU5BTF9VUkkgPSBNT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fTE9BRElOR19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19GSUxFUyA9IE1PRFVMRV9GSUxFX19GSUxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBUl9GSUxFX19UWVBFUyA9IE1PRFVMRV9GSUxFX19UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SQVIgRmlsZTwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFSX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX1JFRl9fRUFSX0ZJTEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9SRUZfX01PRFVMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1vZHVsZSBSZWY8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9NT0RVTEVfUkVGX19FQVJfRklMRSA9IE1PRFVMRV9SRUZfX0VBUl9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9NT0RVTEVfUkVGX19NT0RVTEUgPSBNT0RVTEVfUkVGX19NT0RVTEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVKQiBNb2R1bGUgUmVmPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UID0gTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEUgPSBNT0RVTEVfUkVGX19NT0RVTEVfRklMRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9SRUZfX0VBUl9GSUxFID0gTU9EVUxFX1JFRl9fRUFSX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9SRUZfX01PRFVMRSA9IE1PRFVMRV9SRUZfX01PRFVMRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V2ViIE1vZHVsZSBSZWY8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9NT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENMSUVOVF9NT0RVTEVfUkVGX19NT0RVTEVfRklMRSA9IE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTElFTlRfTU9EVUxFX1JFRl9fRUFSX0ZJTEUgPSBNT0RVTEVfUkVGX19FQVJfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTElFTlRfTU9EVUxFX1JFRl9fTU9EVUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DbGllbnQgTW9kdWxlIFJlZjwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xJRU5UX01PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfUkVGX19FQVJfRklMRSA9IE1PRFVMRV9SRUZfX0VBUl9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfUkVGX19NT0RVTEUgPSBNT0RVTEVfUkVGX19NT0RVTEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNvbm5lY3RvciBNb2R1bGUgUmVmPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UID0gTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImNvbW1vbmFyY2hpdmUueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbW1vbmFyY2hpdmVQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBDb250YWluZXIgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbnRhaW5lcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250YWluZXJfRmlsZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBXQVJGaWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRXQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBNb2R1bGVGaWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNb2R1bGVGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRUFSRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RUFSRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVBUkZpbGVfTW9kdWxlUmVmcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIE1vZHVsZVJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1vZHVsZVJlZl9Nb2R1bGVGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1vZHVsZVJlZl9FYXJGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZiNnZXRNb2R1bGUgPGVtPk1vZHVsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZiNnZXRNb2R1bGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TW9kdWxlUmVmX01vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVKQk1vZHVsZVJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RUpCTW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gV2ViTW9kdWxlUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRXZWJNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBDbGllbnRNb2R1bGVSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENsaWVudE1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIENvbm5lY3Rvck1vZHVsZVJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29ubmVjdG9yTW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQXBwbGljYXRpb25DbGllbnRGaWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRUpCSmFyRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RUpCSmFyRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gUkFSRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0UkFSRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlI2dldERlcGxveW1lbnREZXNjcmlwdG9yIDxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZSNnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQHNlZSAjZ2V0UkFSRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UkFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEFyY2hpdmUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEFyY2hpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5BcmNoaXZlI2dldFR5cGVzIDxlbT5UeXBlczwvZW0+fScuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlR5cGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUuQXJjaGl2ZSNnZXRUeXBlcygpCi0JICogQHNlZSAjZ2V0QXJjaGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJjaGl2ZV9UeXBlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZV9VUkkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZV9MYXN0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZV9TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjaXNEaXJlY3RvcnlFbnRyeSA8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjaXNEaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjZ2V0RmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZV9EaXJlY3RvcnlFbnRyeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWxlX09yaWdpbmFsVVJJKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbGVfTG9hZGluZ0NvbnRhaW5lcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWxlX0NvbnRhaW5lcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFJlYWRPbmx5RGlyZWN0b3J5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSZWFkT25seURpcmVjdG9yeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQotfSAvL0NvbW1vbmFyY2hpdmVQYWNrYWdlCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db25uZWN0b3JNb2R1bGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0Nvbm5lY3Rvck1vZHVsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDJkMDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0Nvbm5lY3Rvck1vZHVsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rvck1vZHVsZVJlZiBleHRlbmRzIE1vZHVsZVJlZiB7Ci0JQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLQotfSAvL0Nvbm5lY3Rvck1vZHVsZVJlZgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhMzM0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRhaW5lciBleHRlbmRzIEZpbGUgewotCi0JLyoqCi0JICogSW5kaWNhdGUgd2hldGhlciB0aGUgYXJjaGl2ZSBjb250YWlucyBhIGZpbGUgaGF2aW5nIGEgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcGFyYW1ldGVyOyB0aGUgdXJpCi0JICogbWF5IG9yIG1heSBub3QgaGF2ZSBhIGxlYWRpbmcgc2VwYXJhdG9yCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNGaWxlKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gaXRzIGxvYWQgc3RyYXRlZ3ksIGlmIGl0IGlzIGtub3duLiBTaG91bGQgYmUgdXNlZAotCSAqIG1haW5seSBmb3IgcmVhZC1vbmx5IHJ1bnRpbWUgcHVycG9zZXMsIGFzIGVkaXQtdGltZSBtb2RpZmljYXRpb25zIG1heSBtYWtlIHRoZSByZXN1bHQKLQkgKiB1bmRlZmluZWQuCi0JICogCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgYXJjaGl2ZSBpcyAidmlydHVhbCIsIGVnLCBhIG5lc3RlZCBqYXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQlwdWJsaWMgRmlsZSBnZXRGaWxlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IGdldExvYWRTdHJhdGVneSgpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFyY2hpdmUgaGFzIGV2ZXIgaGFkIGl0cyBmaWxlcyBlbnVtZXJhdGVkOyB1c2VkIGFzIGFuIG9wdGltaXphdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5kZXhlZCgpOwotCi0JLyoqCi0JICogR29lcyBkaXJlY3RseSB0byB0aGUgc3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gcHJpbUdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgcmVidWlsZEZpbGVJbmRleCgpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9hZFN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWRTdHJhdGVneShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgbmV3TG9hZFN0cmF0ZWd5KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBGaWxlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0RmlsZXMoKTsKLQotCS8qKgotCSAqIENsZWFycyB0aGUgbGlzdCBvZiBmaWxlcyBpbiB0aGlzIENvbnRhaW5lciBhbmQgZHJvcHMgdGhlIGluZGV4Ci0JICovCi0JcHVibGljIHZvaWQgY2xlYXJGaWxlcygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUFSRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUFSRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGM3NTQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VBUkZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUFSRmlsZSBleHRlbmRzIE1vZHVsZUZpbGUgewotCi0JLyoqCi0JICogTWFrZXMgYSBjb3B5IG9mCi0JICogCi0JICogQGFNb2R1bGVGaWxlLCB1c2luZyBpdHMgbG9jYWwgZGVwbG95bWVudCBkZXNjcmlwdG9yOyBjcmVhdGVzIGEgbmV3IE1vZHVsZSBhbmQgYWRkcyBpdCB0byB0aGUKLQkgKiAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBvZiB0aGlzIEVBUiBmaWxlIGFuZCBhZGRzIHRoZSBjb3B5IG9mIHRoZQotCSAqICAgICAgICAgICAgICAgTW9kdWxlRmlsZSB0byB0aGlzIEVBUi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb3BpZWQgbW9kdWxlIGZpbGUKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoaXMgRUFSIGFscmVhZHkgY29udGFpbnMgYSBmaWxlIHdpdGggdGhlIHNhbWUgdXJpIGFzCi0JICogQGFNb2R1bGVGaWxlCi0JICovCi0KLQlwdWJsaWMgTW9kdWxlRmlsZSBhZGRDb3B5KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgYWRkQ29weShNb2R1bGVGaWxlKSBleGNlcHQgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbmV3IE1vZHVsZVJlZgotCSAqLwotCXB1YmxpYyBNb2R1bGVSZWYgYWRkQ29weVJlZihNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQWRkIGEgY29weSBvZiB0aGUgc2VjdXJpdHkgcm9sZSB0byB0aGUgZGQgZm9yIHRoZSBtb2R1bGU7IGlmIGFuIGFsdCBkZCBpcyBzcGVjaWZpZWQsIGFkZCB0bwotCSAqIHRoYXQgZGQ7IG90aGVyd2lzZSBhZGQgdG8gdGhlIHN0YW5kYXJkIGRkIG9mIHRoZSBtb2R1bGU7IGFsc28gYWRkIGEgY29weSBvZiB0aGUgcm9sZSB0byB0aGUKLQkgKiBlYXIgZmlsZSBkZCBpZiBhIHJvbGUgd2l0aCB0aGF0IG5hbWUgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotCSAqIAotCSAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGRkIGZvciBhTW9kdWxlIGFscmVhZHkgY29udGFpbnMgYSByb2xlIHdpdGggdGhhdCBuYW1lCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZSBhZGRDb3B5KFNlY3VyaXR5Um9sZSBhUm9sZSwgTW9kdWxlIGFNb2R1bGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBZGQgYSBjb3B5IG9mIHRoZSBzZWN1cml0eSByb2xlIHRvIHRoZSBlYXIgZmlsZSdzIGRkLCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gYSByb2xlCi0JICogd2l0aCB0aGUgc2FtZSBuYW1lCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZSBhZGRDb3B5SWZOb3RFeGlzdHMoU2VjdXJpdHlSb2xlIGFSb2xlKTsKLQotCUVPYmplY3QgZ2V0QWx0RGVwbG95bWVudERlc2NyaXB0b3IoTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIEFwcGxpY2F0aW9uQ2xpZW50RmlsZXM7IGFkZHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkOyB1c2UKLQkgKiAKLQkgKiBAbGluayBBcmNoaXZlI2FkZChGaWxlKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIENsaWVudE1vZHVsZVJlZnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDbGllbnRNb2R1bGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBEZXBsb3ltZW50RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQlBcHBsaWNhdGlvbiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci0KLQlDb25uZWN0b3IgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoQ29ubmVjdG9yTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCUVKQkphciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihFamJNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uOwotCi0JQXBwbGljYXRpb25DbGllbnQgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoSmF2YUNsaWVudE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQlFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yKE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQlXZWJBcHAgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoV2ViTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIEVKQkphckZpbGVzOyBhZGRzIHdpbGwgbm90IGJlIHJlZmxlY3RlZDsgdXNlCi0JICogCi0JICogQGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFSkJKYXJGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgRUpCTW9kdWxlUmVmcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVKQk1vZHVsZVJlZnMoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMuIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUKLQkgKiByZWYgbXVzdCBlcXVhdGUgdG8gYSBuYW1lZCBlbnRlcnByaXNlIGJlYW4gY29udGFpbmVkIGluIHRoZSBqYXI7IG90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBoaXQgZm91bmQ7IGFzc3VtcHRpb24gdGhhdCB0aGUgZWpiIG5hbWVzIGFyZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUKLQkgKiBlYXIgZmlsZS4gVGhpcyB3aWxsIGxpa2VseSBiZSByZXBsYWNlZCB3aXRoIGEgYmV0dGVyIHdheSBmb3IgZGVyZWZlcmVuY2luZyBlamIgcmVmcy4KLQkgKiAKLQkgKiBDYW4gYmUgdXNlZCB3aXRoIGVqYiAxLjEgcmVmZXJlbmNlcyBvbmx5LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHtAbGluayNnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmLCBTdHJpbmcgbW9kdWxlVXJpICkKLQkgKiBAcGFyYW0gRWpiUmVmCi0JICogICAgICAgICAgICByZWYgLSBBbiBlamIgcmVmZXJlbmNlCi0JICogQHJldHVybiBFbnRlcnByaXNlQmVhbgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmIGFuZCBhIG1vZHVsZSB1cmksIGlmIG9uZSBleGlzdHMuIFRoZQotCSAqIGVqYi1saW5rIHZhbHVlIG9mIHRoZSByZWYgbXVzdCBlcXVhdGUgdG8gYSBuYW1lZCBlbnRlcnByaXNlIGJlYW4gY29udGFpbmVkIGluIHRoZSBqYXI7Ci0JICogb3RoZXJ3aXNlIHJldHVybiBudWxsLiBSZXR1cm5zIHRoZSBmaXJzdCBoaXQgZm91bmQ7IGFzc3VtcHRpb24gdGhhdCB0aGUgZWpiIG5hbWVzIGFyZSB1bmlxdWUKLQkgKiB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBlYXIgZmlsZS4gVGhpcyB3aWxsIGxpa2VseSBiZSByZXBsYWNlZCB3aXRoIGEgYmV0dGVyIHdheSBmb3IKLQkgKiBkZXJlZmVyZW5jaW5nIGVqYiByZWZzLgotCSAqIAotCSAqIENhbiBiZSB1c2VkIHdpdGggZWpiIDEuMSAmIGVqYiAyLjAgcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gRWpiUmVmCi0JICogICAgICAgICAgICByZWYgLSBBbiBlamIgcmVmZXJlbmNlCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAgbW9kdWxlVXJpIC0gVGhlIG1vZHVsZSB1cmkKLQkgKiBAcmV0dXJuIEVudGVycHJpc2VCZWFuCi0JICovCi0JcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYsIFN0cmluZyBtb2R1bGVVcmkpOwotCi0JcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIHVyaSwgU3RyaW5nIGFsdEREKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSByZWYgd2hpY2ggcmVmZXJlbmNlcwotCSAqIEBtb2R1bGVEZXNjcmlwdG9yCi0JICovCi0JcHVibGljIE1vZHVsZVJlZiBnZXRNb2R1bGVSZWYoTW9kdWxlIG1vZHVsZURlc2NyaXB0b3IpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCBvZiBhbGwgbW9kdWxlIHJlZnMgaW4gdGhpcyBFQVIgaGF2aW5nIGEgcmVmZXJlbmNlIHRvCi0JICogQGFNb2R1bGVGaWxlCi0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlUmVmcyhNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIE1vZHVsZUZpbGVzOyBhZGRzIHdpbGwgbm90IGJlIHJlZmxlY3RlZDsgdXNlCi0JICogCi0JICogQGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNb2R1bGVGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgUmFyRmlsZXM7IGFkZHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkOyB1c2UKLQkgKiAKLQkgKiBAbGluayBBcmNoaXZlI2FkZChGaWxlKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJBUkZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBGQVJGaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIHtAbGluayBBcmNoaXZlI2FkZChGaWxlKX0KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGQVJGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgQ29ubmVjdG9yTW9kdWxlUmVmcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbm5lY3Rvck1vZHVsZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgc2VjdXJpdHkgcm9sZXMgZnJvbSBhbGwgZXhpc3RpbmcgbW9kdWxlcyAoRWpiTW9kdWxlIGFuZCBXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGVzRnJvbUFsbE1vZHVsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgc2VjdXJpdHkgcm9sZXMgZnJvbSBhbiBleGlzdGluZyBtb2R1bGUgKEVqYk1vZHVsZSBhbmQgV2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlc0Zyb21Nb2R1bGUoTW9kdWxlIGFNb2R1bGUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgV2FyRmlsZXM7IGFkZHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkOyB1c2UKLQkgKiAKLQkgKiBAbGluayBBcmNoaXZlI2FkZChGaWxlKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdBUkZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBXZWJNb2R1bGVSZWZzCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlUmVmcygpOwotCi0JLyoqCi0JICogQ29weSB0aGUgcm9sZSBpbnRvIGVhY2ggTW9kdWxlRmlsZSBpbiB0aGUgZWFyIGZpbGUgd2hpY2ggZG9lcyBub3QgYWxyZWFkeSBjb250YWluIHRoZSByb2xlCi0JICogQXNzdW1wdGlvbjogYSByb2xlIHdpdGggdGhlIHNhbWUgbmFtZSBhcwotCSAqIAotCSAqIEByb2xlIGV4aXN0cyBpbiB0aGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHZvaWQgcHVzaERvd25Sb2xlKFNlY3VyaXR5Um9sZSByb2xlKTsKLQotCS8qKgotCSAqIENvcHkgdGhlIHJvbGUgaW50byB0aGUgTW9kdWxlRmlsZSBmb3IgdGhlIG1vZHVsZSwgaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gdGhlCi0JICogcm9sZSBBc3N1bXB0aW9uOiBhIHJvbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzCi0JICogCi0JICogQHJvbGUgZXhpc3RzIGluIHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoRG93blJvbGUoU2VjdXJpdHlSb2xlIHJvbGUsIE1vZHVsZSBhTW9kdWxlKTsKLQotCS8qKgotCSAqIEF0dGVtcHQgdG8gcmVtb3ZlIHRoZSBtb2R1bGUgZm9yIHRoZSBwYXJhbWV0ZXIgZnJvbSB0aGlzIG9iamVjdCdzIGRkLCB0aGVuIHJlbW92ZSB0aGUgbW9kdWxlCi0JICogZmlsZSwgaWYgaXQgaXMgbm90IHJlZmVyZW5jZWQgZnJvbSBhbnkgb3RoZXIgTW9kdWxlUmVmLCBmcm9tIHRoZSBsaXN0IG9mIGZpbGVzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKE1vZHVsZVJlZiBhTW9kdWxlUmVmKTsKLQotCS8qKgotCSAqIFJlbmFtZSB0aGUgc2VjdXJpdHkgcm9sZSBpbiB0aGUgZWFyIGZpbGUncyBkZDsgcHVzaCB0aGlzIGNoYW5nZSBkb3duIHRvIGFueSBjb250YWluZWQgbW9kdWxlCi0JICogZGQnczsgaWYgdGhlIG1vZHVsZSBzcGVjaWZpZXMgYW4gYWx0LWRkLCB0aGUgY2hhbmdlIHdpbGwgYmUgcmVmbGVjdGVkIHRoZXJlOyBvdGhlcndpc2UgaXQKLQkgKiB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgc3RhbmRhcmQgZGQgb2YgdGhlIG1vZHVsZQotCSAqIAotCSAqIEB0aHJvd3MgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZGQgZm9yIHRoZSBlYXIgZG9lcyBub3QgY29udGFpbiBhIHJvbGUgd2l0aCB0aGUgZXhpc3RpbmdSb2xlTmFtZQotCSAqIAotCSAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGRkIGZvciB0aGUgZWFyIGZpbGUgYWxyZWFkeSBjb250YWlucyBhIHJvbGUgd2l0aCB0aGUgbmV3IG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSkgdGhyb3dzIE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGb3IgZWFjaCBzZWN1cml0eSByb2xlIGluIHRoZSBkZCBmb3IgZWFjaCBtb2R1bGUsIGFkZCBhIGNvcHkgdG8gdGhlIGVhciBmaWxlJ3MgZGQ7IGlmIGFuCi0JICogYWx0LWRkIGlzIHNwZWNpZmllZCBmb3IgdGhlIG1vZHVsZSwgdXNlIHRoYXQgZGQ7IG90aGVyd2lzZSB1c2UgdGhlIHN0YW5kYXJkIGRkIGluIHRoZSBtb2R1bGUKLQkgKiBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgcm9sbFVwUm9sZXMoKTsKLQotCS8qKgotCSAqIEZvciBlYWNoIHNlY3VyaXR5IHJvbGUgaW4gdGhlIGRkIGZvciBhIG1vZHVsZSwgYWRkIGEgY29weSB0byB0aGUgZWFyIGZpbGUncyBkZDsgaWYgYW4gYWx0LWRkCi0JICogaXMgc3BlY2lmaWVkIGZvciB0aGUgbW9kdWxlLCB1c2UgdGhhdCBkZDsgb3RoZXJ3aXNlIHVzZSB0aGUgc3RhbmRhcmQgZGQgaW4gdGhlIG1vZHVsZSBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgcm9sbFVwUm9sZXMoTW9kdWxlIGFNb2R1bGUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihBcHBsaWNhdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTW9kdWxlUmVmcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TW9kdWxlUmVmcygpOwotCi0JcHVibGljIExpc3QgZ2V0QXJjaGl2ZXNPZlR5cGUoU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgTWFwIG9mIE1vZHVsZXMgYXMga2V5cyBhbmQgYSBMaXN0IG9mIEVKQiBSZWZlcmVuY2VzIGFzIHRoZSB2YWx1ZXMuIFRoaXMgd2lsbCBsZXQgeW91Ci0JICoga25vdyB3aGljaCBNb2R1bGVzIHRoZSByZWZlcmVuY2VzIGNhbWUgZnJvbS4gWW91IGNhbiBmaWx0ZXIgdGhlIGxpc3Qgb2YgRUpCIFJlZmVyZW5jZXMKLQkgKiByZXR1cm5lZCBvbiB0aGUgbGlua2VkIGF0dHJpYnV0ZWQgb2YgdGhlIHJlZmVyZW5jZS4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gZmlsdGVyIGxpbmtlZAotCSAqIHJlZmVyZW5jZXMsIG5vbi1saW5rZWQgcmVmZXJlbmNlcywgb3IgbmVpdGhlciAoaS5lLiwgcmV0dXJuIGFsbCByZWZlcmVuY2VzKS4KLQkgKi8KLQlNYXAgZ2V0RUpCUmVmZXJlbmNlcyhib29sZWFuIGZpbHRlckxpbmtlZFJlZmVyZW5jZXMsIGJvb2xlYW4gZmlsdGVyTm9uTGlua2VkUmVmZXJlbmNlcykgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUpCSmFyRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUpCSmFyRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2JkMGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VKQkphckZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCSmFyRmlsZSBleHRlbmRzIE1vZHVsZUZpbGUgewotCi0JLyoqCi0JICogVXNlZCBmb3IgdG9vbHMgcGVyZm9ybWluZyBzZWxlY3RpdmUgaW1wb3J0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXNzb2NpYXRlZEZpbGVzKEVudGVycHJpc2VCZWFuIGVqYik7Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBEZXBsb3ltZW50RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQlFSkJKYXIgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0JcHVibGljIGJvb2xlYW4gaXNJbXBvcnRlZEZyb20xMCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihFSkJKYXIgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FSkJNb2R1bGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VKQk1vZHVsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWM1MDcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VKQk1vZHVsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEVKQk1vZHVsZVJlZiBleHRlbmRzIE1vZHVsZVJlZiB7Ci0KLQlFSkJKYXIgZ2V0RUpCSmFyKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi19IC8vRUpCTW9kdWxlUmVmCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9GaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9GaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTRlMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGUgZXh0ZW5kcyBFT2JqZWN0ewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHVwIHRvIHRoZSBmaWxlbmFtZTsgZS5nLiwgZnJvbSBjb20vaWJtL2Zvby9iYXIuY2xhc3MsIGNvbS9pYm0vZm9vCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlVUkkoKTsKLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFpbCBvZiB0aGUgZmlsZSBwYXRoOyBlLmcuLCBmcm9tIGNvbS9pYm0vZm9vL2Jhci5jbGFzcywgcmV0dXJuIGJhci5jbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzRUFSRmlsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNGQVJGaWxlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQkphckZpbGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzTW9kdWxlRmlsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNSQVJGaWxlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5RGlyZWN0b3J5KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dBUkZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFVSSSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVVJJIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VVJJKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBMYXN0TW9kaWZpZWQgYXR0cmlidXRlCi0JICovCi0JbG9uZyBnZXRMYXN0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjZ2V0TGFzdE1vZGlmaWVkIDxlbT5MYXN0IE1vZGlmaWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFzdCBNb2RpZmllZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBzZWUgI3Vuc2V0TGFzdE1vZGlmaWVkKCkKLQkgKiBAc2VlICNnZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhc3RNb2RpZmllZChsb25nIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNnZXRMYXN0TW9kaWZpZWQgPGVtPkxhc3QgTW9kaWZpZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExhc3RNb2RpZmllZCgpCi0JICogQHNlZSAjZ2V0TGFzdE1vZGlmaWVkKCkKLQkgKiBAc2VlICNzZXRMYXN0TW9kaWZpZWQobG9uZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExhc3RNb2RpZmllZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2dldExhc3RNb2RpZmllZCA8ZW0+TGFzdCBNb2RpZmllZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhc3QgTW9kaWZpZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExhc3RNb2RpZmllZCgpCi0JICogQHNlZSAjZ2V0TGFzdE1vZGlmaWVkKCkKLQkgKiBAc2VlICNzZXRMYXN0TW9kaWZpZWQobG9uZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExhc3RNb2RpZmllZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU2l6ZSBhdHRyaWJ1dGUKLQkgKi8KLQlsb25nIGdldFNpemUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAnCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkZpbGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNpemUoKQotCSAqIEBzZWUgI3Vuc2V0U2l6ZSgpCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2l6ZShsb25nIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUuRmlsZSNnZXRTaXplIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjaXNTZXRTaXplKCkKLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAc2VlICNzZXRTaXplKGxvbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNpemUoKQotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBzZWUgI3NldFNpemUobG9uZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5Ci0JICogc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjdW5zZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjc2V0RGlyZWN0b3J5RW50cnkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkNvbW1vbmFyY2hpdmVQYWNrYWdlI2dldEZpbGVfRGlyZWN0b3J5RW50cnkoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRGlyZWN0b3J5RW50cnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjaXNEaXJlY3RvcnlFbnRyeSA8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERpcmVjdG9yeUVudHJ5KCkKLQkgKiBAc2VlICN1bnNldERpcmVjdG9yeUVudHJ5KCkKLQkgKiBAc2VlICNpc0RpcmVjdG9yeUVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREaXJlY3RvcnlFbnRyeShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNpc0RpcmVjdG9yeUVudHJ5IDxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldERpcmVjdG9yeUVudHJ5KCkKLQkgKiBAc2VlICNpc0RpcmVjdG9yeUVudHJ5KCkKLQkgKiBAc2VlICNzZXREaXJlY3RvcnlFbnRyeShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGlyZWN0b3J5RW50cnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNpc0RpcmVjdG9yeUVudHJ5IDxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERpcmVjdG9yeUVudHJ5KCkKLQkgKiBAc2VlICNpc0RpcmVjdG9yeUVudHJ5KCkKLQkgKiBAc2VlICNzZXREaXJlY3RvcnlFbnRyeShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGlyZWN0b3J5RW50cnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE9yaWdpbmFsVVJJIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRPcmlnaW5hbFVSSSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE9yaWdpbmFsVVJJIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0T3JpZ2luYWxVUkkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgTG9hZGluZ0NvbnRhaW5lciByZWZlcmVuY2UKLQkgKi8KLQlDb250YWluZXIgZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9hZGluZ0NvbnRhaW5lciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldExvYWRpbmdDb250YWluZXIoQ29udGFpbmVyIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgQ29udGFpbmVyIHJlZmVyZW5jZQotCSAqLwotCUNvbnRhaW5lciBnZXRDb250YWluZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENvbnRhaW5lciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9HZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9HZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWNjZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBHZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGNvbnRyaWJ1dG9ycyBzaG91bGQgdXNlIHRvIHNwZWNpZnkgdGhlIGdlbmVyaWMgdHlwZSB0aGF0Ci0JICogc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBhcmNoaXZlcy4gRXhhbXBsZTogY29tLnlvdXJjb21wYW55LmoyZWUuZXh0ZW5zaW9uLmN1c3RvbU1vZHVsZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVLZXkoKTsKLQotCS8qKgotCSAqIElmIGNvbW1vbiBhcmNoaXZlIHNob3VsZCByZWNvZ25pemUgZmlsZSBleHRlbnNpb25zIG90aGVyIHRoYW4gdGhlIHN0YW5kYXJkIG9uZXMsIGUuZy4sIC5qYXIsCi0JICogLnppcCwgdGhlbiB0aGVzZSBmaWxlIGV4dGVuc2lvbnMgY2FuIGJlIHNwZWNpZmllZCBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q3VzdG9tRmlsZUV4dGVuc2lvbnMoKTsKLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IGluZGl2aWR1YWwgZGlzY3JpbWluYXRvcnMgY2FuIGltcGxlbWVudCB0byBkZXRlcm1pbmUgaWYgYW4gQXJjaGl2ZSBpcyBvZiBhCi0JICogcGFydGljdWxhciB0eXBlLiBJbXBsZW1lbnRlcnMgc2hvdWxkIGJlIHNlbnNpdGl2ZSB0byBwZXJmb3JtYW5jZSByZXF1aXJtZW50cy4gVXN1YWxseSBzaW1wbGUKLQkgKiB0ZXN0cyBzaG91bGQgYmUgcGVyZm9ybWVkLCBzdWNoIGFzOgotCSAqIDxjb2RlPmlmIChhbkFyY2hpdmUuY29udGFpbnNGaWxlKCJ4eHgueG1sIik8Y29kZT4uICBUaGUgcmVzdWx0IHdpbGwKLQkgKiBiZSBzdG9yZWQgaW4gdGhlIEFyY2hpdmUncyAidHlwZXMiIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gYW5BcmNoaXZlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2NyaW1pbmF0ZShBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL01vZHVsZUZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL01vZHVsZUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwNGI4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kdWxlRmlsZSBleHRlbmRzIEFyY2hpdmUgewotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyIGZvciB0aGlzIGFyY2hpdmUgY2FzdGVkIHRvIEVBUkZpbGU7IG51bGwgaWYgdGhpcyBmaWxlIGlzIG5vdCBjb250YWluZWQKLQkgKiBpbiBhbiBFQVJGaWxlCi0JICovCi0JcHVibGljIEVBUkZpbGUgZ2V0RUFSRmlsZSgpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuRXhwb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5FeHBvcnRTdHJhdGVneSBnZXRFeHBvcnRTdHJhdGVneSgpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgZ2V0SW1wb3J0U3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGZpbGUuIEZvciBleGFtcGxlLCAiMi4wIgotCSAqIAotCSAqIEBkZXByZWNhdGVkLCBVc2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmVyc2lvbiBJRCBvZiB0aGUgbW9kdWxlIEZvciBleGFtcGxlLCAiMjAiCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwZWNWZXJzaW9uSUQoKTsKLQotCUVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBudWxsOyB1c2VkIGZvciBjb3B5LCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKLQkgKiBpbXBvcnQgc3RyYXRlZ3kgbmVlZHMgdG8gYmUgY29waWVkIG9yIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKTsKLQotCXB1YmxpYyBSZXNvdXJjZSBtYWtlRGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXhwb3J0U3RyYXRlZ3kKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuRXhwb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnRTdHJhdGVneShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkV4cG9ydFN0cmF0ZWd5IG5ld0V4cG9ydFN0cmF0ZWd5KTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0ltcG9ydFN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW1wb3J0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgbmV3SW1wb3J0U3RyYXRlZ3kpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgSjJFRSB2ZXJzaW9uIGZvciB0aGlzIGFyY2hpdmUKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oaW50IHZlcnNpb25JRCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL01vZHVsZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvTW9kdWxlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZDhmN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvTW9kdWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kdWxlUmVmIGV4dGVuZHMgRU9iamVjdHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFyc2VkIGxvY2FsIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBNb2R1bGVGaWxlCi0JICovCi0JRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhcnNlZCBhbHQgZGQsIGlmIGl0IGV4aXN0cywgZnJvbSB0aGUgRUFSIGZpbGUgY29udGFpbmluZyB0aGlzIG1vZHVsZQotCSAqLwotCUVPYmplY3QgZ2V0QWx0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYWx0IGRkIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHRoZSBsb2NhbCBkZAotCSAqLwotCUVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVyaSBmcm9tIHRoZSB7QGxpbmsgTW9kdWxlfXJlZmVyZW5jZWQgYnkgdGhpcyByZWY7IGlmIHRoZXJlIGlzIG5vIG1vZHVsZSwgKGVnLiBhCi0JICogc3RhbmRhbG9uZSBKQVIpLCBnZXRzIHRoZSB1cmkgZnJvbSB0aGUge0BsaW5rIE1vZHVsZUZpbGV9LiBBc3N1bXB0aW9uOiBUaGUgdXJpIG9mIHRoZQotCSAqIHtAbGluayBNb2R1bGV9YW5kIHtAbGluayBNb2R1bGVGaWxlfXNob3VsZCBzdGF5IGluIHN5bmMKLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIE1vZHVsZUZpbGUgcmVmZXJlbmNlCi0JICovCi0JTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlKCk7Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIHtAbGluayBBcmNoaXZlI2dldE1vZlJlc291cmNlKFN0cmluZyl9LCBleGNlcHQgdGhhdCBhbHQtZGQgaW5kaXJlY3Rpb24gaXMKLQkgKiBjb25zaWRlcmVkLiBJZiB0aGlzIG1vZHVsZSB1c2VzIGFuIGFsdC1kZCwgdGhlbiB0aGUgdXJpIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggdGhlICJhbHQtcm9vdCIKLQkgKiBhbmQgdGhlIHJlc291cmNlIHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIG93bmluZyBFQVIgZmlsZS4gSW4gdGhpcyBjYXNlLCBhbGwgaHJlZnMgaW50byBhbmQKLQkgKiBvdXQgb2YgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEVBUi4gVGhlIGhyZWZzIGFyZSB0YWtlbiBjYXJlIG9mCi0JICogZm9yIGZyZWUgd2hlbiB0aGUgY2xpZW50IHVzZXMge0BsaW5rICNtYWtlQWx0RGVzY3JpcHRvcnNBbmRSZXNvdXJjZXMoKX0uIFRoZSBhbHQgcm9vdCBpcwotCSAqIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHdoZW4gaXQgZG9lcyBub3QgZXhpc3QuCi0JICogCi0JICogQHNlZSBNb2R1bGVFeHRlbnNpb24jZ2V0QWx0Um9vdCgpCi0JICovCi0JUmVzb3VyY2UgZ2V0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotCi0JcHVibGljIElucHV0U3RyZWFtIGdldEFsdFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHVibGljIElucHV0U3RyZWFtIGdldExvY2FsUmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5wdXQgc3RyZWFtIGZyb20gdGhlIHJlc291cmNlcyBwYXRoIG9mIGVpdGhlciB0aGUgTW9kdWxlRmlsZSwgaWYgdGhlIG1vZHVsZSBkb2VzCi0JICogbm90IHVzZSBhbHQtZGQsIG9yIGZyb20gdGhlIGFsdFJvb3Qgb2YgdGhlIG1vZHVsZSwgZm91bmQgaW4gdGhlIHJlc291cmNlcyBwYXRoIG9mIHRoZSBFQVIKLQkgKiAKLQkgKiBAc2VlIExvYWRTdHJhdGVneSNnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFJldHJpZXZlIGEgcmVzb3VyY2UgZnJvbSB0aGUgTW9kdWxlRmlsZQotCSAqIAotCSAqIEBzZWUgQXJjaGl2ZSNnZXRNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JUmVzb3VyY2UgZ2V0TG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGUgdXJpIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggdGhlICJhbHQtcm9vdCIgYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBvd25pbmcKLQkgKiBFQVIgZmlsZS4KLQkgKi8KLQlSZXNvdXJjZSBnZXRBbHRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9mIHJlc291cmNlIGFuZCBhZGQgaXQgdG8gdGhlIHJlc291cmNlIHNldCBvZiB0aGUgY29udGV4dCBvZiBlaXRoZXIgdGhlIG1vZHVsZQotCSAqIGZpbGUgaWYgdGhpcyBNb2R1bGVSZWYgaXMgbm90IGFuIGFsdCwgb3IgdG8gdGhlIEVBUiBmaWxlIGlmIGl0IGlzIGFuIGFsdC4gSWYgdGhpcyBtb2R1bGUgaXMKLQkgKiB1c2VzIGFuIGFsdC1kZCwgdGhlbiB0aGUgdXJpIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggdGhlICJhbHQtcm9vdCIgVGhlIGFsdCByb290IGlzCi0JICogYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBhcmNoaXZlIGhhdmluZyB0aGUgdXJpCi0JICovCi0JUmVzb3VyY2UgbWFrZU1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQlSZXNvdXJjZSBtYWtlTG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JUmVzb3VyY2UgbWFrZUFsdE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE1vZHVsZUZpbGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRNb2R1bGVGaWxlKE1vZHVsZUZpbGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmVuYW1lIHRoaXMgbW9kdWxlOyBib3RoIGl0cyBNb2R1bGVGaWxlIGFuZCBNb2R1bGUgZWxlbWVudCBmcm9tIHRoZSBBcHBsaWNhdGlvbiBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSk7Ci0KLQlib29sZWFuIGlzRUpCKCk7Ci0KLQlib29sZWFuIGlzV2ViKCk7Ci0KLQlib29sZWFuIGlzQ2xpZW50KCk7Ci0KLQlib29sZWFuIGlzQ29ubmVjdG9yKCk7Ci0KLQlib29sZWFuIHVzZXNBbHRERCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBFYXJGaWxlIHJlZmVyZW5jZQotCSAqLwotCUVBUkZpbGUgZ2V0RWFyRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWFyRmlsZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEVhckZpbGUoRUFSRmlsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1vZHVsZShNb2R1bGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZSNnZXRNb2R1bGVSZWZfTW9kdWxlKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZHVsZSBnZXRNb2R1bGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZiNnZXRNb2R1bGUgPGVtPk1vZHVsZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1vZHVsZShNb2R1bGUgdmFsdWUpOwotCi19IC8vTW9kdWxlUmVmCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SQVJGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SQVJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZGRmNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUkFSRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJBUkZpbGUgZXh0ZW5kcyBNb2R1bGVGaWxlewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlCi0JICogcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERlcGxveW1lbnREZXNjcmlwdG9yKENvbm5lY3RvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkNvbW1vbmFyY2hpdmVQYWNrYWdlI2dldFJBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29ubmVjdG9yIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlI2dldERlcGxveW1lbnREZXNjcmlwdG9yIDxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihDb25uZWN0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIFJBUiBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBmb3IgZXhwYW5kaW5nCi0JICogdGhlIFJBUiBmaWxlIGlmIGl0IGlzIGEgc3RhbmRhbG9uZSBSQVIuIElmIHRoZSBSQVIgZmlsZSBpcyBwYWNrYWdlZCBhcyBwYXJ0IG9mIGFuIEVBUiwgdGhpcwotCSAqIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuIEluc3RlYWQsIHRoZSBleHBhbmRUbygpIG9mIHRoZSBFQVIgc2hvdWxkIGJlIHVzZWQgZXhwYW5kIHRoZQotCSAqIGNvbnRlbnRzIG9mIHRoZSBlYXIgYW5kIHRoZSBuZXN0ZWQgUkFSIHJlbGF0aXZlIHRvIHRoZSBFQVIncyBkaXJlY3RvcnkgKHNpbWlsYXIgdG8gV0FSJ3MpLgotCSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMjAwMSA3OjQ0OjQxIFBNKQotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZXhwYW5kRmxhZ3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXZvaWQgZXh0cmFjdFRvQ29ubmVjdG9yRGlyZWN0b3J5KFN0cmluZyBkaXIsIGludCBleHBhbmRGbGFncykgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUmVhZE9ubHlEaXJlY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JlYWRPbmx5RGlyZWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZWY3NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUmVhZE9ubHlEaXJlY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlEaXJlY3RvcnkgZXh0ZW5kcyBDb250YWluZXIgewotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoU3RyaW5nIHVyaSk7Ci0KLQlwdWJsaWMgRmlsZSBnZXRGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoU3RyaW5nIHVyaSkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZsYXQgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSBhbmQgc3ViZGlyZWN0b3JpZXMsIHdpdGggdGhlCi0JICogZGlyZWN0b3JpZXMgZmlsdGVyZWQgb3V0LCBhcyB0aGUgbGlzdCB3b3VsZCBhcHBlYXIgaW4gYW4gYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbGVzUmVjdXJzaXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBmaWxlcyB3aXRoIGp1c3QgdGhlIGluc3RhbmNlcyBvZiBSZWFkT25seURpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlYWRPbmx5RGlyZWN0b3JpZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JlcGFpckFyY2hpdmVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZXBhaXJBcmNoaXZlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2NmZTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JlcGFpckFyY2hpdmVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI3LzAxIDI6MjA6NDQgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJlcGFpckFyY2hpdmVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcm90ZWN0ZWQgQXJjaGl2ZSBhcmNoaXZlOwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGRpcmVjdG9yeU5hbWVzOwotCi0JLyoqCi0JICogUmVwYWlyTWV0YUluZkNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgUmVwYWlyQXJjaGl2ZUNvbW1hbmQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJc3VwZXIoIlJlcGFpciBBcmNoaXZlIiwgQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJlcGFpcnNfYWxsX2VudHJpZXNfaW5fdGhlIikpOyAvLyROT04tTkxTLTIkID0gIlJlcGFpcnMgYWxsIGVudHJpZXMgaW4gdGhlIE1FVEEtSU5GIGFuZC9vciBXRUItSU5GIGRpcmVjdG9yaWVzIHRvIGJlIHRoZSBjb3JyZWN0IGNhc2UiLy8kTk9OLU5MUy0xJAotCQlhcmNoaXZlID0gYW5BcmNoaXZlOwotCQkvL0Vuc3VyZSBJbml0aWFpbGl6YXRpb24KLQkJZ2V0RGlyZWN0b3J5TmFtZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlMaXN0IGZpbGVzID0gYXJjaGl2ZS5nZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCWlmIChhRmlsZS5pc0FyY2hpdmUoKSkgewotCQkJCW5ldyBSZXBhaXJBcmNoaXZlQ29tbWFuZCgoQXJjaGl2ZSkgYUZpbGUpLmV4ZWN1dGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHVwcGVyVXJpID0gYUZpbGUuZ2V0VVJJKCkudG9VcHBlckNhc2UoKTsKLQkJCQlJdGVyYXRvciBrZXlzQW5kVmFsdWVzID0gZGlyZWN0b3J5TmFtZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChrZXlzQW5kVmFsdWVzLmhhc05leHQoKSkgewotCQkJCQlTdHJpbmcgdXJpID0gYUZpbGUuZ2V0VVJJKCk7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGtleXNBbmRWYWx1ZXMubmV4dCgpOwotCQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCWlmICh1cHBlclVyaS5zdGFydHNXaXRoKGtleSkgJiYgIXVyaS5zdGFydHNXaXRoKHZhbHVlKSkgewotCQkJCQkJU3RyaW5nIHRhaWwgPSB1cmkuc3Vic3RyaW5nKGtleS5sZW5ndGgoKSk7Ci0JCQkJCQlhRmlsZS5zZXRVUkkodmFsdWUuY29uY2F0KHRhaWwpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTQvMDEgNTo1NToxNCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5TZXQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGphdmEudXRpbC5NYXAgZ2V0RGlyZWN0b3J5TmFtZXMoKSB7Ci0JCWlmIChkaXJlY3RvcnlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXJlY3RvcnlOYW1lcyA9IG5ldyBIYXNoTWFwKDYpOwotCQkJZGlyZWN0b3J5TmFtZXMucHV0KEoyRUVDb25zdGFudHMuTUVUQV9JTkYudG9VcHBlckNhc2UoKSwgSjJFRUNvbnN0YW50cy5NRVRBX0lORik7Ci0JCQlkaXJlY3RvcnlOYW1lcy5wdXQoSjJFRUNvbnN0YW50cy5XRUJfSU5GLnRvVXBwZXJDYXNlKCksIEoyRUVDb25zdGFudHMuV0VCX0lORik7Ci0JCQlkaXJlY3RvcnlOYW1lcy5wdXQoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSS50b1VwcGVyQ2FzZSgpLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKTsKLQkJCWRpcmVjdG9yeU5hbWVzLnB1dChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSS50b1VwcGVyQ2FzZSgpLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JCX0KLQkJcmV0dXJuIGRpcmVjdG9yeU5hbWVzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtde2FyY2hpdmV9KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xNC8wMSA2OjQ2OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmICghdmFsaWRhdGVBcmdzKGFyZ3MpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkucHJpbU9wZW5BcmNoaXZlKGFyZ3NbMF0pOwotCQkJbmV3IFJlcGFpckFyY2hpdmVDb21tYW5kKGFuQXJjaGl2ZSkuZXhlY3V0ZSgpOwotCQkJYW5BcmNoaXZlLnNhdmVBcyhhcmdzWzFdKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJlcGFpcl9jb21tYW5kX2ZhaWxlZF8tX2V4X0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQgPSAiUmVwYWlyIGNvbW1hbmQgZmFpbGVkIC0gZXhjZXB0aW9uIHN0YWNrIHRyYWNlOiIKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb24uY29tbWFuZC5Db21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlQXJncyhTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmICghKGFyZ3MubGVuZ3RoID09IDIpKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJSZXBhaXJBcmNoaXZlQ29tbWFuZF91c2FnZSIpKTsgLy8kTk9OLU5MUy0xJCA9ICJSZXBhaXJBcmNoaXZlQ29tbWFuZCB1c2FnZTogIDxzb3VyY2VKYXJGaWxlUGF0aD4gPGRlc3RpbmF0aW9uUGF0aD4iCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGFyZ3NbMF0pOwotCQlib29sZWFuIGlzWmlwID0gZmFsc2U7Ci0JCWphdmEudXRpbC56aXAuWmlwRmlsZSB6aXAgPSBudWxsOwotCQl0cnkgewotCQkJemlwID0gbmV3IGphdmEudXRpbC56aXAuWmlwRmlsZShmaWxlKTsKLQkJCWlzWmlwID0gdHJ1ZTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJaXNaaXAgPSBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh6aXAgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQl6aXAuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQl9Ci0JCWlmICghaXNaaXAgJiYgIWZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJSZXBhaXJBcmNoaXZlQ29tbWFuZF91c2FnZTFfRVJST1JfIikpOyAvLyROT04tTkxTLTEkID0gIlJlcGFpckFyY2hpdmVDb21tYW5kIHVzYWdlOiBzb3VyY2VKYXJGaWxlUGF0aCBtdXN0IHBvaW50IHRvIGEgdmFsaWQgYXJjaGl2ZSBvciBkaXJlY3Rvcnkgb2YgYW4gaW5mbGF0ZWQgYXJjaGl2ZSIKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobmV3IGphdmEuaW8uRmlsZShhcmdzWzFdKS5jYW5Xcml0ZSgpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoInJlcGFpcl91c2FnZV9FUlJPUl8iLCAobmV3IE9iamVjdFtde2FyZ3NbMV19KSkpOyAvLyROT04tTkxTLTEkID0gIlJlcGFpckFyY2hpdmVDb21tYW5kIHVzYWdlOiBjYW5ub3Qgd3JpdGUgdG8gZGVzdGluYXRpb25QYXRoICIKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9WYWxpZGF0ZVhtbENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1ZhbGlkYXRlWG1sQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjZiZmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1ZhbGlkYXRlWG1sQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuQ29sbGVjdGluZ0Vycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuWG1sRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE5LzAxIDEwOjA0OjA4IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVhtbENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByb3RlY3RlZCBMaXN0IHJlc3VsdHM7Ci0JcHJvdGVjdGVkIE1vZHVsZUZpbGUgYXJjaGl2ZTsKLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5lc3RlZCA9IHRydWU7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZVhtbENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdGVYbWxDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlWG1sQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBWYWxpZGF0ZVhtbENvbW1hbmQoTW9kdWxlRmlsZSBtKSB7Ci0JCXN1cGVyKCk7Ci0JCWFyY2hpdmUgPSBtOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlWG1sQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBWYWxpZGF0ZVhtbENvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZVhtbENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdGVYbWxDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGF0ZVhtbCgpOwotCQlpZiAoaXNWYWxpZGF0ZU5lc3RlZCgpKSB7Ci0JCQlMaXN0IGFyY2hpdmVzID0gYXJjaGl2ZS5nZXRBcmNoaXZlRmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJjaGl2ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlBcmNoaXZlIGEgPSAoQXJjaGl2ZSkgYXJjaGl2ZXMuZ2V0KGkpOwotCQkJCWlmICghYS5pc01vZHVsZUZpbGUoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJTW9kdWxlRmlsZSBtID0gKE1vZHVsZUZpbGUpIGE7Ci0JCQkJVmFsaWRhdGVYbWxDb21tYW5kIGNtZCA9IG5ldyBWYWxpZGF0ZVhtbENvbW1hbmQobSk7Ci0JCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQlyZXN1bHRzLmFkZEFsbChjbWQuZ2V0UmVzdWx0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBMaXN0IG9mIFhtbFZhbGlkYXRpb25SZXN1bHQ7IDEgZm9yIHRoZSBhcmNoaXZlLCBhbmQgb25lIGZvciBlYWNoIG5lc3RlZCBtb2R1bGUgZmlsZQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMjIvMjAwMSAxOjA2OjUyIFBNKQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGVOZXN0ZWQoKSB7Ci0JCXJldHVybiB2YWxpZGF0ZU5lc3RlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMC8yMi8yMDAxIDE6MDY6NTIgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbGlkYXRlTmVzdGVkCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGVOZXN0ZWQoYm9vbGVhbiBuZXdWYWxpZGF0ZU5lc3RlZCkgewotCQl2YWxpZGF0ZU5lc3RlZCA9IG5ld1ZhbGlkYXRlTmVzdGVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRhdGVYbWwoKSB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVJlc291cmNlIHJlcyA9IGFyY2hpdmUuZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpLmVSZXNvdXJjZSgpOwotCQlYbWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBYbWxWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCXJlc3VsdC5zZXRBcmNoaXZlKGFyY2hpdmUpOwotCQl0cnkgewotCQkJcmVzLnNhdmUoYm9zLCBuZXcgamF2YS51dGlsLkhhc2hNYXAoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOwotCQlJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW5TdHJlYW0pOwotCQlDb2xsZWN0aW5nRXJyb3JIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ29sbGVjdGluZ0Vycm9ySGFuZGxlcigpOwotCQlYbWxEb2N1bWVudFJlYWRlciBwYXJzZUFkYXB0ZXIgPSBuZXcgWG1sRG9jdW1lbnRSZWFkZXIoc291cmNlLCBudWxsLCBoYW5kbGVyKTsKLQotCQkvLyB0aGUgZm9sbG93aW5nIHRyeS9jYXRjaCBjbGF1c2UgaXMgYWRkZWQgdG8gaGFuZGxlIHRoZSBjYXNlCi0JCS8vIHdoZW4gU0FYIHBhcnNlciB0aHJvd3MgYSBmYXRhbCBleGNlcHRpb24gKHR5cGUgU0FYRXhjZXB0aW9uKQotCQkvLyBmb3IgdW5tYXRjaGluZyBlbmQgdGFnIHRoYXQgcmVzdWx0cyBpbiBhIFJ1bnRpbWVFeGNlcHRpb24gdG8KLQkJLy8gYmUgdGhyb3duLiBOZWVkIHRvIGNhdGNoIGl0IHNvIHdlIGNhbiBnZXQgdGhlIHBhcnNlciBleGNlcHRpb25zCi0JCS8vIGFuZCBkaXNwbGF5IHRoZW0gdG8gdGhlIHVzZXIuCi0JCXRyeSB7Ci0JCQlwYXJzZUFkYXB0ZXIucGFyc2VEb2N1bWVudCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0KLQkJCWlmIChoYW5kbGVyLmdldENhdWdodEV4Y2VwdGlvbnMoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LnNldEFyY2hpdmUoYXJjaGl2ZSk7Ci0JCQkJcmVzdWx0LnNldENhdWdodEV4Y2VwdGlvbnMoaGFuZGxlci5nZXRDYXVnaHRFeGNlcHRpb25zKCkpOwotCQkJCXJlc3VsdHMuYWRkKHJlc3VsdCk7Ci0JCQl9Ci0KLQkJCXRocm93IHJlOwotCQl9Ci0KLQkJcmVzdWx0LnNldEFyY2hpdmUoYXJjaGl2ZSk7Ci0JCXJlc3VsdC5zZXRDYXVnaHRFeGNlcHRpb25zKGhhbmRsZXIuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpKTsKLQkJcmVzdWx0cy5hZGQocmVzdWx0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9XQVJGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9XQVJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MDdlNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvV0FSRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV0FSRmlsZSBleHRlbmRzIE1vZHVsZUZpbGUgewotCi0JLyoqCi0JICogQ29weSB0aGUgZmlsZSwgYW5kIHN3aXp6bGUgdGhlIGZpbGUgdXJpIGlmIG5lY2Vzc2FyeSBieSBwcmVwZW5kaW5nIHRoZSBjbGFzc2VzIGRpcmVjdG9yeQotCSAqIAotCSAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgb2YgYSBmaWxlIHdpdGggdGhlIG1vZGlmaWVkIHVyaSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZQotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciBpcyBhIFJlYWRPbmx5RGlyZWN0b3J5Ci0JICovCi0JcHVibGljIEZpbGUgYWRkQ29weUNsYXNzKEZpbGUgYUZpbGUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ29weSB0aGUgZmlsZSwgYW5kIHN3aXp6bGUgdGhlIGZpbGUgdXJpIGlmIG5lY2Vzc2FyeSBieSBwcmVwZW5kaW5nIHRoZSBsaWJzIGRpcmVjdG9yeQotCSAqIAotCSAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgb2YgYSBmaWxlIHdpdGggdGhlIG1vZGlmaWVkIHVyaSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZQotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciBpcyBhIFJlYWRPbmx5RGlyZWN0b3J5Ci0JICovCi0JcHVibGljIEZpbGUgYWRkQ29weUxpYihGaWxlIGFGaWxlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIGdldENsYXNzZXMoKSAtIGZpbHRlciBmaWxlcyB0byByZXR1cm4gdGhlIGNsYXNzIGZpbGVzIGZyb20gXHdlYi1pbmZcY2xhc3NlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldENsYXNzZXMoKTsKLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGaWx0ZXIgZmlsZXMgdG8gcmV0dXJuIHRoZSBmaWxlcyBmcm9tIFx3ZS1pbmZcbGliCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGlicygpOwotCi0JLyoqCi0JICogRmlsdGVyIGZpbGVzIHRvIHJldHVybiB0aGUgSkFScyBhbmQgWmlwcyBmcm9tIFx3ZS1pbmZcbGliCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGliQXJjaGl2ZXMoKTsKLQotCS8qKgotCSAqIGdldFJlc291cmNlcygpIC0gZmlsdGVyIGZpbGVzIHRvIHJldHVybiB0aGUgV2ViIHJlc291cmNlcyB3aXRoaW4gdGhlIFdBUiAobm8KLQkgKiBjbGFzc2VzL2xpYnMvbWV0YWRhdGEpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSBmaWxlIHRoYXQgbWF0Y2hlcyB0aGUgb3V0cHV0IGZpbGUgcGFzc2VkIGluCi0JICogCi0JICogQHBhcmFtIGFDbGFzc0ZpbGUKLQkgKiAgICAgICAgICAgIFRoZSAuY2xhc3MgZmlsZSBvciBvdGhlciBvdXRwdXQgZmlsZSB0byBmaW5kIHRoZSBzb3VyY2UgZm9yCi0JICogQHJldHVybiBTdHJpbmcgVGhlIG1hdGNoaW5nIHNvdXJjZS4gTnVsbCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzb3VyY2UgZm91bmQKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRTb3VyY2VGaWxlKEZpbGUgYUNsYXNzRmlsZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXBsb3ltZW50RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKFdlYkFwcCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dlYk1vZHVsZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvV2ViTW9kdWxlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGEzZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvV2ViTW9kdWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotcHVibGljIGludGVyZmFjZSBXZWJNb2R1bGVSZWYgZXh0ZW5kcyBNb2R1bGVSZWYgewotCVdlYkFwcCBnZXRXZWJBcHAoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLX0gLy9XZWJNb2R1bGVSZWYKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1htbFZhbGlkYXRpb25SZXN1bHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1htbFZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1OTU4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9YbWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAzOjMxOjUzIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxWYWxpZGF0aW9uUmVzdWx0IHsKLQlwcm90ZWN0ZWQgTW9kdWxlRmlsZSBhcmNoaXZlOwotCXByb3RlY3RlZCBMaXN0IGNhdWdodEV4Y2VwdGlvbnM7Ci0KLQkvKioKLQkgKiBYbWxWYWxpZGF0aW9uUmVzdWx0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhtbFZhbGlkYXRpb25SZXN1bHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMzozNDo0NSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE5LzAxIDM6MzQ6NDUgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDYXVnaHRFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gY2F1Z2h0RXhjZXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAzOjM0OjQ1IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdBcmNoaXZlCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLk1vZHVsZUZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKE1vZHVsZUZpbGUgbmV3QXJjaGl2ZSkgewotCQlhcmNoaXZlID0gbmV3QXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAzOjM0OjQ1IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdDYXVnaHRFeGNlcHRpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdWdodEV4Y2VwdGlvbnMoamF2YS51dGlsLkxpc3QgbmV3Q2F1Z2h0RXhjZXB0aW9ucykgewotCQljYXVnaHRFeGNlcHRpb25zID0gbmV3Q2F1Z2h0RXhjZXB0aW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0NThiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIG5vbi1ydW50aW1lIGV4Y2VwdGlvbnMgb2NjdXJyaW5nIHdpdGggbWFuaXB1bGF0aW9uIG9mIGFyY2hpdmVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBcmNoaXZlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGFlNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBydW50aW1lIGV4Y2VwdGlvbnMgb2NjdXJyaW5nIHdpdGggbWFuaXB1bGF0aW9uIG9mIGFyY2hpdmVzOyB0aGVyZSBhcmUKLSAqIHNvbWUgc2l0dWF0aW9ucyB3aGVyZSB3ZSBjYW4gb25seSB0aHJvdyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGluc3RlYWQgb2YgYSBzdWJ0eXBlIG9mIGV4Y2VwdGlvbiwKLSAqIGJlY2F1c2UgdGhlIHNpZ25hdHVyZXMgb2YgZXRvb2xzIGdlbmVyYXRlZCBtZXRob2RzIGNhbm5vdCBiZSBvdmVycmlkZGVuIHRvIHRocm93IGFueSBleGNlcHRpb24KLSAqIG90aGVyIHRoYW4gcnVudGltZS4KLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2ZiZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIG5vbi1ydW50aW1lIGV4Y2VwdGlvbnMgb2NjdXJyaW5nIHdpdGggbWFuaXB1bGF0aW9uIG9mIGFyY2hpdmVzLCB3aGVyZSBhCi0gKiBjYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0aGlzIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24KLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZEV4Y2VwdGlvbiBpbXBsZW1lbnRzIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uCi0JICovCi0JcHVibGljIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0RlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0RlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTAyNWY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEV4Y2VwdGlvbiB3aGljaCBjYW4gb2NjdXIgaWYgYW4gZXJyb3IvZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBsb2FkaW5nIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUxvYWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMGVhNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0R1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIGNhbiBvY2N1ciB3aGVuIGFuIGF0dGVtcCBpcyBtYWRlIHRvIGFkZCB0byBhIGxpc3QgYW4gb2JqZWN0IGVxdWFsaW5nLCBvciBoYXZpbmcKLSAqIHRoZSBzYW1lIG5hbWUsIGlkLCBldGMsIGFzIGFub3RoZXIgb2JqZWN0IGluIHRoZSBsaXN0LgotICovCi1wdWJsaWMgY2xhc3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JcHJvdGVjdGVkIE9iamVjdCBkdXBsaWNhdGU7Ci0KLQkvKioKLQkgKiBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oU3RyaW5nIHMsIE9iamVjdCBvKSB7Ci0JCXN1cGVyKHMpOwotCQlzZXREdXBsaWNhdGUobyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDQvMTYvMDEgOTo0MzowMCBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREdXBsaWNhdGUoKSB7Ci0JCXJldHVybiBkdXBsaWNhdGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDQvMTYvMDEgOTo0MzowMCBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RHVwbGljYXRlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RHVwbGljYXRlKGphdmEubGFuZy5PYmplY3QgbmV3RHVwbGljYXRlKSB7Ci0JCWR1cGxpY2F0ZSA9IG5ld0R1cGxpY2F0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0VtcHR5UmVzb3VyY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjMjIzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIG9jY3VycyB3aGVuIGEgbW9mIHJlc291cmNlJ3MgZXh0ZW50IGNvbnRhaW5zIHplcm8gZWxlbWVudHMgYW5kIGFuIGF0dGVtcHQgaXMgbWFkZQotICogdG8gYWNjZXNzIGFuIGVsZW1lbXQgZnJvbSB0aGUgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXB0eVJlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFbXB0eVJlc291cmNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbXB0eVJlc291cmNlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9JQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9JQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5YjIwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vSUFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JV3JhcHBlZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5leGNlcHRpb24uSVdyYXBwZWRFeGNlcHRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gZXh0ZW5kcyBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLy9EZWZhdWx0Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTWFuaWZlc3RFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9NYW5pZmVzdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWFhZDczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9NYW5pZmVzdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFuaWZlc3RFeGNlcHRpb24uCi0JICovCi0JcHVibGljIE1hbmlmZXN0RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYW5pZmVzdEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBNYW5pZmVzdEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFuaWZlc3RFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbmlmZXN0RXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05lc3RlZEphckV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05lc3RlZEphckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmE3ZTNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9OZXN0ZWRKYXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIFJ1bnRpbWUgZXhjZXB0aW9uIHRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyByZWFkaW5nIGEgamFyIHdpdGhpbiBhIGphcgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkSmFyRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCi0JcHVibGljIE5lc3RlZEphckV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGVkSmFyRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCXB1YmxpYyBOZXN0ZWRKYXJFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLQotCXB1YmxpYyBOZXN0ZWRKYXJFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjA2MmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNS8wMSA3OjMxOjI3IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBOb0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBOb0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm9FSkIxMERlc2NyaXB0b3JzRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTFhYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgTm8gTG9uZ2VyIHVzZWQ7IGNoZWNrIGZvciBudWxsIGluc3RlYWQgRXhjZXB0aW9uIHdoaWNoIG9jY3VycyBpZiBhbiBhdHRlbXB0IGlzIG1hZGUKLSAqICAgICAgICAgICAgIHRvIGFjY2VzcyBhIG5vbi1leGlzdGVudCBtb2R1bGUgZGQgZWxlbWVudCBmcm9tIGFuIGVhciBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBOb01vZHVsZUVsZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBOb01vZHVsZUVsZW1lbnRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NTg2YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vTW9kdWxlRmlsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOb01vZHVsZUZpbGVFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOb01vZHVsZUZpbGVFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOb01vZHVsZUZpbGVFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBOb01vZHVsZUZpbGVFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vdEFEZXBsb3ltZW50RGVzY3JpcHRvckV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vdEFEZXBsb3ltZW50RGVzY3JpcHRvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjlkMzJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNi8wMSA5OjI2OjQzIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCS8qKgotCSAqIE5vdEFEZXBsb3ltZW50RGVzY3JpcHRvckV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOb3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQzMzQ4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL09iamVjdE5vdEZvdW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYTgxNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL09iamVjdE5vdEZvdW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMDgvMDEgODozMzo1MSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PcGVuRmFpbHVyZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL09wZW5GYWlsdXJlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjI5ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL09wZW5GYWlsdXJlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBFeGNlcHRpb24gd2hpY2ggb2NjdXJzIHdoaWxlIG9wZW5pbmcgYW4gYXJjaGl2ZTsgY291bGQgb2NjdXIgZm9yIGEgdmFyaWV0eSBvZiByZWFzb25zLCBlZywgaW8KLSAqIGZhaWx1cmUsIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlcnJvcnMsIGV0Yy4gQ2hlY2sgdGhlIG5lc3RlZCBleGNlcHRpb24gZm9yIG1vcmUgaW5mby4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIE9wZW5GYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9wZW5GYWlsdXJlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE9wZW5GYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT3BlbkZhaWx1cmVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbkZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT3BlbkZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZW9wZW5FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZW9wZW5FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2Yzc4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vUmVvcGVuRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBFeGNlcHRpb24gd2hpY2ggY2FuIGJlIHRocm93biBhcyBhIHJlc3VsdCBvZiBhbiBJTyBleGNlcHRpb24gd2hpY2ggbWF5IG9jY3VyIHdoaWxlICJyZS1zeW5jaW5nIgotICogYW4gYXJjaGl2ZSBhZnRlciBpdCBoYXMgYmVlbiBzYXZlZC4gRm9yIGV4YW1wbGUsIGlmIDEwIGZpbGVzIGFyZSBjb3BpZWQgZnJvbSBBcmNoaXZlIEEgdG8gQXJjaGl2ZQotICogQiwgdGhlbiBhcmNoaXZlIGIgaXMgc2F2ZWQsIGl0cyBjb250ZW50cyB3aWxsIGJlIGxvYWRlZCBmcm9tIGEgbmV3IHNvdXJjZSwgdGhlIG5ld2x5IHNhdmVkIGphcgotICogZmlsZS4gVGhlcmVmb3JlLCB0aGUgYXJjaGl2ZSB3aWxsIGJlIHJlb3BlbmVkIGFmdGVyIHNhdmluZywgd2hpY2ggY291bGQgcmVzdWx0IGluIGFuIElPRXhjZXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUmVvcGVuRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIFJlb3BlbkV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZW9wZW5FeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVvcGVuRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVvcGVuRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFJlb3BlbkV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlb3BlbkV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW9wZW5FeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFJlb3BlbkV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1Jlc291cmNlTG9hZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1Jlc291cmNlTG9hZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU4ZGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZXNvdXJjZUxvYWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEV4Y2VwdGlvbiB0aHJvd24gaWYgaW4gZXhjZXB0aW9uIG90aGVyIHRoYW4gamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gaXMgY2F1Z2h0IHdoaWxlCi0gKiBhdHRlbXB0aW5nIHRvIGxvYWQgYSBtb2YgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUxvYWRFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlc291cmNlTG9hZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUxvYWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvYWRFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vU2F2ZUZhaWx1cmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9TYXZlRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjA1NjVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9TYXZlRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIG9jY3VycyB3aGlsZSBzYXZpbmcgYW4gYXJjaGl2ZTsgY291bGQgb2NjdXIgZm9yIGEgdmFyaWV0eSBvZiByZWFzb25zLCBlZywgaW8KLSAqIGZhaWx1cmUsIGV0Yy4gQ2hlY2sgdGhlIG5lc3RlZCBleGNlcHRpb24gZm9yIG1vcmUgaW5mby4KLSAqLwotcHVibGljIGNsYXNzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIFNhdmVGYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNhdmVGYWlsdXJlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWx1cmVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZUZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFNhdmVGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1N1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllOWU1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotCi0vKioKLSAqIFJ1bnRpbWUgZXhjZXB0aW9uIHVzZWQgYXMgYSB3YXkgdG8gZW5mb3JjZSBhYnN0cmFjdCBiZWhhdmlvciB3aXRob3V0IGRlY2xhcmluZyB0aGUgbWV0aG9kcwotICogYWJzdHJhY3QuIE5lY2Vzc2FyeSBiZWNhdXNlIGltcGwgY2xhc3NlcyBpbiB0aGUgZXRvb2xzIGdlbmVyYXRlZCBoaWVyYXJjaHkgY2Fubm90IGJlIGFic3RyYWN0IGlmCi0gKiB0aGV5IGhhdmUgc3VidHlwZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIFN1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbihTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlzdXBlcihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygic3ViY2xhc3NfcmVzcG9uc2liaWx0eV9FWENfIiwgKG5ldyBPYmplY3RbXXttZXRob2ROYW1lfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICIgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcyIKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOTgxNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1VuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBFeGNlcHRpb24gbm8gbG9uZ2VyIHRocm93bjsgY2hlY2sgZm9yIG51bGwgaW5zdGVhZC4gRXhjZXB0aW9uIHdoaWNoIG1heSBiZSB0aHJvd24KLSAqICAgICAgICAgICAgIHdoZW5ldmVyIGEge0BsaW5rIE1vZHVsZUZpbGV9aXMgZXhwZWN0ZWQgdG8gYmUgY29udGFpbmVkIHdpdGhpbiBhbiBlYXIgZmlsZSBidXQgaXQKLSAqICAgICAgICAgICAgIGlzIG5vdAotICovCi1wdWJsaWMgY2xhc3MgVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIFVuY29udGFpbmVkTW9kdWxlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmNvbnRhaW5lZE1vZHVsZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFVuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQxOGVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIGEgY2F0YWxvZyBvZiB1c2VmdWwgY29uc3RhbnRzIGZvciB0aGUgYXJjaGl2ZSBzdXBwb3J0LiBDYW4gYmUgdXNlZCB0byBzdG9yZSByZWxhdGl2ZQotICogcGF0aHMgdG8gc3BlY2lmaWMgeG1sIGFuZCB4bWkgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmVDb25zdGFudHMgZXh0ZW5kcyBKMkVFQ29uc3RhbnRzIHsKLQkvL1N0YW5kYXJkIEphciBpbmZvCi0JLyoqICJjb20iICovCi0JU3RyaW5nIFJBUl9DTEFTU0VTX1VSSSA9ICJjb20iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZWxhdGl2ZSBwYXRoIGluIGEgd2FyIGZpbGUgd2l0aCBubyBsZWFkaW5nIHNsYXNoICJXRUItSU5GL2xpYi8iCi0JICovCi0JU3RyaW5nIFdFQkFQUF9MSUJfVVJJID0gIldFQi1JTkYvbGliLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlbGF0aXZlIHBhdGggaW4gYSB3YXIgZmlsZSB3aXRoIG5vIGxlYWRpbmcgc2xhc2ggIldFQi1JTkYvY2xhc3Nlcy8iCi0JICovCi0JU3RyaW5nIFdFQkFQUF9DTEFTU0VTX1VSSSA9ICJXRUItSU5GL2NsYXNzZXMvIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWNmNjlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZUluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotCi0vKioKLSAqIEluaXRpYWxpemVyIGNsYXNzIHRvIHByZXJlZ2lzdGVyIHBhY2thZ2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlSW5pdCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHBsdWdpbl9pbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7Ci0JCWluaXQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoYm9vbGVhbiBzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCWludm9rZVByZXJlcUluaXRzKHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpOwotCQkJaWYgKHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpCi0JCQkJcHJlUmVnaXN0ZXJQYWNrYWdlcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVSZWdpc3RlclBhY2thZ2VzKCkgewotCQkvL0NvbW1vbmFyY2hpdmVQYWNrYWdlIHJlZwotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoImNvbW1vbmFyY2hpdmUueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQkJCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJCQkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2VQcmVyZXFJbml0cyhib29sZWFuIHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJSjJFRUluaXQuaW5pdChzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3ZWJlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgQVBJIG9mCi0gKiAKLSAqIEBsaW5rIGphdmEudXRpbC5qYXIuTWFuaWZlc3QsIGFsb25nIHdpdGggYWRkZWQgaGVscGVycwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmVNYW5pZmVzdCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtYW5pZmVzdCBlbnRyeSAoYXR0cmlidXRlcykgZm9yIHRoZSBnaXZlbiBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5TmFtZSk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnlOYW1lLCBBdHRyaWJ1dGVzIGF0dHIpOwotCi0JLyoqCi0JICogQWRkcyB0aGUga2V5L3ZhbHVlIHBhaXIgdG8gdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBlbnRyeSBuYW1lOyBpZiB0aGUgZW50cnkgZG9lcyBub3QKLQkgKiBleGlzdCwgY3JlYXRlcyBhIG5ldyBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW50cnlBdHRyaWJ1dGUoU3RyaW5nIGVudHJ5TmFtZSwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIERlZmF1bHRzIHRoZSB2ZXJzaW9uIHRvICIxLjAiIGlmIG5vdCBhbHJlYWR5IHNldAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZlcnNpb25JZk5lY2Vzc2FyeSgpOwotCi0JcHVibGljIHZvaWQgYXBwZW5kQ2xhc3NQYXRoKFN0cmluZyBleHRlbnNpb24pOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I2NsZWFyCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNnZXRBdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzUGF0aCgpOwotCi0JcHVibGljIFN0cmluZ1tdIGdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I2dldEVudHJpZXMKLQkgKi8KLQlwdWJsaWMgTWFwIGdldEVudHJpZXMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW50cnlBdHRyaWJ1dGUoU3RyaW5nIGVudHJ5TmFtZSwgU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjZ2V0QXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVzIGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5DbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBpZmYgdGhlIGVudHJ5IGV4aXN0cyBpbiBhIGNhc2Utc2Vuc2l0aXZlIG1hbm5lcjsgbWFuaWZlc3QgdmVyc2lvbiBpcwotCSAqIHJlcXVpcmVkIGZvciB0aGUgbWFuaWZlc3QgdG8gc2F2ZSBjb3JyZWN0bHkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmlmZXN0VmVyc2lvbigpOwotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZW50cmllcyBub3QgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlIGNsYXNzIHBhdGggb2YgdGhpcyBtYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIG1lcmdlQ2xhc3NQYXRoKFN0cmluZ1tdIGNsYXNzUGF0aEVudHJpZXMpOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I3JlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeShTdHJpbmcgZW50cnlOYW1lKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIE9iamVjdCBrZXkpOwotCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NQYXRoKFN0cmluZyBhU3BhY2VEZWxpbWl0ZWRQYXRoKTsKLQotCXB1YmxpYyB2b2lkIHNldE1haW5DbGFzcyhTdHJpbmcgY2xhc3NOYW1lKTsKLQotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0VmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I3dyaXRlCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBNYW5pZmVzdCB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbSwgc3BsaXR0aW5nIGVhY2ggY2xhc3NwYXRoIGVudHJ5IG9uIGEgbGluZQotCSAqIGJ5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGVTcGxpdHRpbmdDbGFzc3BhdGgoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMmNkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIG1hbmlmZXN0IGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlTWFuaWZlc3RJbXBsIGV4dGVuZHMgamF2YS51dGlsLmphci5NYW5pZmVzdCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0IHsKLQkvKioKLQkgKiBBcmNoaXZlTWFuaWZlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBcmNoaXZlTWFuaWZlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiAgICAgICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3RJbXBsKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3VwZXIoaXMpOwotCX0KLQotCS8qKgotCSAqIEFyY2hpdmVNYW5pZmVzdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBtYW4KLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5qYXIuTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0SW1wbChqYXZhLnV0aWwuamFyLk1hbmlmZXN0IG1hbikgewotCQlzdXBlcihtYW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuaWZlc3QgZW50cnkgKGF0dHJpYnV0ZXMpIGZvciB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJQXR0cmlidXRlcyBhdHRyID0gbmV3IEF0dHJpYnV0ZXMoKTsKLQkJYWRkRW50cnkoZW50cnlOYW1lLCBhdHRyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnlOYW1lLCBBdHRyaWJ1dGVzIGF0dHIpIHsKLQkJZ2V0RW50cmllcygpLnB1dChlbnRyeU5hbWUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGtleS92YWx1ZSBwYWlyIHRvIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZW50cnkgbmFtZTsgaWYgdGhlIGVudHJ5IGRvZXMgbm90Ci0JICogZXhpc3QsIGNyZWF0ZXMgYSBuZXcgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlBdHRyaWJ1dGVzIGF0dHIgPSBnZXRBdHRyaWJ1dGVzKGVudHJ5TmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlhZGRFbnRyeShlbnRyeU5hbWUpOwotCQlhdHRyID0gZ2V0QXR0cmlidXRlcyhlbnRyeU5hbWUpOwotCQlhdHRyLnB1dFZhbHVlKGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZlcnNpb25JZk5lY2Vzc2FyeSgpIHsKLQkJLy9UaGlzIGlzIGEgaGFjayBiZWNhdXNlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIG1hbmlmZXN0IGRvZXMgbm90IHNlcmlhbGl6ZSBjb3JyZWN0bHkgaWYKLQkJLy9UaGUgdmVyc2lvbiBpcyBub3Qgc2V0LiBJbiBhZGRpdGlvbiB0byBzYXZlcywgdGhlIHNlcmlhbGl6YXRpb24gaXMgdXNlZCBmb3IgY29weQotCQlpZiAoZ2V0TWFuaWZlc3RWZXJzaW9uKCkgPT0gbnVsbCB8fCBnZXRNYW5pZmVzdFZlcnNpb24oKS5lcXVhbHMoIiIpKS8vJE5PTi1OTFMtMSQKLQkJCXNldE1hbmlmZXN0VmVyc2lvbigiMS4wIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRDbGFzc1BhdGgoamF2YS5sYW5nLlN0cmluZyBleHRlbnNpb24pIHsKLQkJU3RyaW5nIGNsYXNzUGF0aCA9IGdldENsYXNzUGF0aCgpOwotCQlpZiAoY2xhc3NQYXRoICE9IG51bGwpCi0JCQlzZXRDbGFzc1BhdGgoY2xhc3NQYXRoICsgIiAiICsgZXh0ZW5zaW9uKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXNldENsYXNzUGF0aChleHRlbnNpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDbGFzc1BhdGgoKSB7Ci0JCXJldHVybiBBcmNoaXZlVXRpbC5nZXRWYWx1ZUlnbm9yZUtleUNhc2UoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgudG9TdHJpbmcoKSwgZ2V0TWFpbkF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCkgewotCQlTdHJpbmcgY2xhc3NQYXRoID0gZ2V0Q2xhc3NQYXRoKCk7Ci0JCWlmIChjbGFzc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5nZXRUb2tlbnMoY2xhc3NQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXkpIHsKLQkJQXR0cmlidXRlcyBhdHRyID0gZ2V0QXR0cmlidXRlcyhlbnRyeU5hbWUpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBhdHRyLmdldFZhbHVlKGtleSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYWluQ2xhc3MoKSB7Ci0JCXJldHVybiBBcmNoaXZlVXRpbC5nZXRWYWx1ZUlnbm9yZUtleUNhc2UoQXR0cmlidXRlcy5OYW1lLk1BSU5fQ0xBU1MudG9TdHJpbmcoKSwgZ2V0TWFpbkF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYW5pZmVzdFZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5NQU5JRkVTVF9WRVJTSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgbWVyZ2VDbGFzc1BhdGgoamF2YS5sYW5nLlN0cmluZ1tdIGNsYXNzUGF0aEVudHJpZXMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlqYXZhLnV0aWwuTGlzdCBleGlzdGluZyA9IGphdmEudXRpbC5BcnJheXMuYXNMaXN0KGdldENsYXNzUGF0aFRva2VuaXplZCgpKTsKLQkJU3RyaW5nIGNwID0gZ2V0Q2xhc3NQYXRoKCk7Ci0JCWlmIChjcCAhPSBudWxsKQotCQkJc2IuYXBwZW5kKGNwKTsKLQkJYm9vbGVhbiBlbXB0eSA9IGNwID09IG51bGwgfHwgIiIuZXF1YWxzKGNwKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzUGF0aEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghZXhpc3RpbmcuY29udGFpbnMoY2xhc3NQYXRoRW50cmllc1tpXSkpIHsKLQkJCQlpZiAoIWVtcHR5KQotCQkJCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UKLQkJCQkJZW1wdHkgPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoY2xhc3NQYXRoRW50cmllc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJc2V0Q2xhc3NQYXRoKHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJZ2V0RW50cmllcygpLnJlbW92ZShlbnRyeU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIE9iamVjdCBrZXkpIHsKLQkJQXR0cmlidXRlcyBhdHRyID0gZ2V0QXR0cmlidXRlcyhlbnRyeU5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0ci5yZW1vdmUoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NQYXRoKGphdmEubGFuZy5TdHJpbmcgYVNwYWNlRGVsaW1pdGVkUGF0aCkgewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBnZXRNYWluQXR0cmlidXRlcygpOwotCQlpZiAoYVNwYWNlRGVsaW1pdGVkUGF0aCA9PSBudWxsKQotCQkJYXR0cmlidXRlcy5yZW1vdmUoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgpOwotCQllbHNlCi0JCQlhdHRyaWJ1dGVzLnB1dFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRILnRvU3RyaW5nKCksIGFTcGFjZURlbGltaXRlZFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoamF2YS5sYW5nLlN0cmluZyBjbGFzc05hbWUpIHsKLQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotCQkJYXR0cmlidXRlcy5yZW1vdmUoQXR0cmlidXRlcy5OYW1lLk1BSU5fQ0xBU1MpOwotCQllbHNlCi0JCQlhdHRyaWJ1dGVzLnB1dFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5NQUlOX0NMQVNTLnRvU3RyaW5nKCksIGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0VmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJYXR0cmlidXRlcy5wdXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuTUFOSUZFU1RfVkVSU0lPTi50b1N0cmluZygpLCB2ZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIE1hbmlmZXN0IHRvIHRoZSBzcGVjaWZpZWQgT3V0cHV0U3RyZWFtLCBzcGxpdHRpbmcgZWFjaCBjbGFzc3BhdGggZW50cnkgb24gYSBsaW5lCi0JICogYnkgaXRzZWxmLgotCSAqIAotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBoYXMgb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVNwbGl0dGluZ0NsYXNzcGF0aChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCS8vIFdyaXRlIG91dCB0aGUgbWFpbiBhdHRyaWJ1dGVzIGZvciB0aGUgbWFuaWZlc3QKLQkJd3JpdGVNYWluU3BsaXR0aW5nQ2xhc3NwYXRoKGdldE1haW5BdHRyaWJ1dGVzKCksIGRvcyk7Ci0JCS8vIE5vdyB3cml0ZSBvdXQgdGhlIHByZS1lbnRyeSBhdHRyaWJ1dGVzCi0JCUl0ZXJhdG9yIGl0ID0gZ2V0RW50cmllcygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoKFN0cmluZykgZS5nZXRLZXkoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvY2FsTWFrZTcyU2FmZShidWZmZXIpOwotCQkJZG9zLndyaXRlQnl0ZXMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJd3JpdGUoKEF0dHJpYnV0ZXMpIGUuZ2V0VmFsdWUoKSwgZG9zKTsKLQkJfQotCQlkb3MuZmx1c2goKTsKLQl9Ci0KLQkvKgotCSAqIFdyaXRlcyB0aGUgY3VycmVudCBhdHRyaWJ1dGVzIHRvIHRoZSBzcGVjaWZpZWQgZGF0YSBvdXRwdXQgc3RyZWFtLiBYWFggTmVlZCB0byBoYW5kbGUgVVRGOAotCSAqIHZhbHVlcyBhbmQgYnJlYWsgdXAgbGluZXMgbG9uZ2VyIHRoYW4gNzIgYnl0ZXMKLQkgKiAKLQkgKiBAc2VlIEF0dHJpYnV0ZXMjd3JpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIERhdGFPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKChBdHRyaWJ1dGVzLk5hbWUpIGUuZ2V0S2V5KCkpLnRvU3RyaW5nKCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZCgoU3RyaW5nKSBlLmdldFZhbHVlKCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCW9zLndyaXRlQnl0ZXMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCW9zLndyaXRlQnl0ZXMoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogV3JpdGVzIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMgdG8gdGhlIHNwZWNpZmllZCBkYXRhIG91dHB1dCBzdHJlYW0sIG1ha2Ugc3VyZSB0byB3cml0ZSBvdXQgdGhlCi0JICogTUFOSUZFU1RfVkVSU0lPTiBvciBTSUdOQVRVUkVfVkVSU0lPTiBhdHRyaWJ1dGVzIGZpcnN0LgotCSAqIAotCSAqIEBzZWUgQXR0cmlidXRlcyN3cml0ZU1haW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU1haW5TcGxpdHRpbmdDbGFzc3BhdGgoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBEYXRhT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSAqLVZlcnNpb24gaGVhZGVyIGZpcnN0LCBpZiBpdCBleGlzdHMKLQkJU3RyaW5nIHZlcm5hbWUgPSBBdHRyaWJ1dGVzLk5hbWUuTUFOSUZFU1RfVkVSU0lPTi50b1N0cmluZygpOwotCQlTdHJpbmcgdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUodmVybmFtZSk7Ci0JCWlmICh2ZXJzaW9uID09IG51bGwpIHsKLQkJCXZlcm5hbWUgPSBBdHRyaWJ1dGVzLk5hbWUuU0lHTkFUVVJFX1ZFUlNJT04udG9TdHJpbmcoKTsKLQkJCXZlcnNpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKHZlcm5hbWUpOwotCQl9Ci0KLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkgewotCQkJb3V0LndyaXRlQnl0ZXModmVybmFtZSArICI6ICIgKyB2ZXJzaW9uICsgIlxyXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQkvLyB3cml0ZSBvdXQgYWxsIGF0dHJpYnV0ZXMgZXhjZXB0IGZvciB0aGUgdmVyc2lvbgotCQkvLyB3ZSB3cm90ZSBvdXQgZWFybGllcgotCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gKChBdHRyaWJ1dGVzLk5hbWUpIGUuZ2V0S2V5KCkpLnRvU3RyaW5nKCk7Ci0JCQlpZiAoKHZlcnNpb24gIT0gbnVsbCkgJiYgIShuYW1lLmVxdWFsc0lnbm9yZUNhc2UodmVybmFtZSkpKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShBdHRyaWJ1dGVzLk5hbWUuQ0xBU1NfUEFUSC50b1N0cmluZygpKSkgewotCQkJCQl3cml0ZVNwbGl0KG91dCwgbmFtZSwgKFN0cmluZykgZS5nZXRWYWx1ZSgpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKChTdHJpbmcpIGUuZ2V0VmFsdWUoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJbG9jYWxNYWtlNzJTYWZlKGJ1ZmZlcik7Ci0JCQkJb3V0LndyaXRlQnl0ZXMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCW91dC53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVNwbGl0KERhdGFPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSk7Ci0JCWludCBpbmMgPSAwOwotCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCQlpZiAoaW5jID09IDApIHsKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQodG9rLm5leHRUb2tlbigpKTsKLQkJCWlmICh0b2suY291bnRUb2tlbnMoKSA+IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgiIFxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9jYWxNYWtlNzJTYWZlKGJ1ZmZlcik7Ci0JCQlvdXQud3JpdGVCeXRlcyhidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQlpbmMrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgbGluZSBicmVha3MgdG8gZW5mb3JjZSBhIG1heGltdW0gNzIgYnl0ZXMgcGVyIGxpbmUuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvY2FsTWFrZTcyU2FmZShTdHJpbmdCdWZmZXIgbGluZSkgewotCQlpbnQgbGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA+IDcyKSB7Ci0JCQlpbnQgaW5kZXggPSA3MDsKLQkJCXdoaWxlIChpbmRleCAtIDEgPCBsZW5ndGgpIHsKLQkJCQlsaW5lLmluc2VydChpbmRleCwgIlxyXG4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCArPSA3MjsKLQkJCQlsZW5ndGggKz0gMzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0MTNjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wMi8wMSAyOjU4OjQ4IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlT3B0aW9ucyBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVggPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPTSA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVCA9IDM7Ci0KLQlwcml2YXRlIGludCByZW5kZXJlclR5cGUgPSBERUZBVUxUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9NT0RFX0NPTVBBVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9NT0RFX1NQRUMgPSAxOwotCi0JcHJpdmF0ZSBpbnQgY2xhc3NMb2FkaW5nTW9kZSA9IExPQURfTU9ERV9DT01QQVQ7Ci0KLQkKLQkvKioKLQkgKiBMb2FkIHN0cmF0ZWd5IGZvciBvcGVuaW5nL3JlYWRpbmcgdGhlIGFyY2hpdmU7IG9wdGlvbmFsIC0gaWYgbnVsbCBhIGxvYWQgc3RyYXRlZ3kgd2lsbCBiZQotCSAqIGNyZWF0ZWQgd2hlbiB0aGUgYXJjaGl2ZSBpcyBvcGVuZWQKLQkgKi8KLQlwcml2YXRlIExvYWRTdHJhdGVneSBsb2FkU3RyYXRlZ3k7Ci0JLyoqCi0JICogSW5kaWNhdG9yIGZvciB3aGV0aGVyIGF1dG8gamF2YSByZWZsZWN0aW9uIHNob3VsZCBiZSB0dXJuZWQgb24gaW4gdGhlIGFyY2hpdmUgLSBkZWZhdWx0cyB0bwotCSAqIHRydWUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdXNlSmF2YVJlZmxlY3Rpb24gPSB0cnVlOwotCS8qKgotCSAqIEluZGljYXRvciBmb3Igd2hldGhlciB0aGUgYXJjaGl2ZSB3aWxsIGJlIG1vZGlmaWVkIGFmdGVyIG9wZW5pbmcgb3IgaWYgaXQgaXMganVzdCBiZWluZwotCSAqIG9wZW5lZCwgcmVhZCwgc2F2ZWQgdG8gYSBuZXcgbG9jYXRpb247IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvIGF2b2lkIHRlbXAgZmlsZSBjcmVhdGlvbgotCSAqIGFuZCBzYXZpbmcgb2YgaW5kaXZpZHVhbCBmaWxlcyB3aXRoaW4gYSBuZXN0ZWQgYXJjaGl2ZSBpZiB0aGUgbmVzdGVkIGFyY2hpdmUgd2lsbCBub3QgY2hhbmdlIC0KLQkgKiBkZWZhdWx0cyB0byBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlYWRPbmx5OwotCi0JLyoqCi0JICogSW5kaWNhdG9yIGZvciB3aGV0aGVyIGEgbGliYXJ5IG5lc3RlZCBpbiBhbm90aGVyIGFyY2hpdmUgKGVnLCB1dGlsaXR5IEpBUnMgaW4gYW4gRUFSKSB3aWxsIGJlCi0JICogc2F2ZWQgb3V0IGFzIGFuIG9yZGluYXJ5IGZpbGUgb3IgYXMgYSBuZXN0ZWQgQXJjaGl2ZS4gV2hlbiBsb2FkZWQgaW50byBtZW1vcnkgdGhlc2UgZmlsZXMgYXJlCi0JICogdHJlYXRlZCBhcyBBcmNoaXZlcywgdG8gc3VwcG9ydCBkeW5hbWljIGNsYXNzIGxvYWRpbmcgZm9yIEphdmEgcmVmbGVjdGlvbiBvZiBjbGFzc2VzIGluCi0JICogRUpCSmFyRmlsZXMgYW5kIGRlcGVuZGVudCBKQVJzLiBBbiBhcmNoaXZlIG9wZW5lZCBmb3IgZWRpdCwgZWl0aGVyIGJ5IGFkZGluZyBvciByZW1vdmluZwotCSAqIGZpbGVzIG9yIGNoYW5nbmluZyB0aGUgTWFuaWZlc3Qgb3IgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHdpbGwgYmUgc2F2ZWQgYXMgYSBuZXcgZmlsZSBvbmUKLQkgKiBmaWxlIGF0IGEgdGltZS4gVGhlIGRlZmF1bHQgZm9yIHRoaXMgZmxhZyBpcyB0cnVlOyBpdCBvbmx5IGFwcGxpZXMgdG8gbGlicmFyeSBBcmNoaXZlcywgbm90Ci0JICogaW5zdGFuY2VzIG9mIE1vZHVsZUZpbGUuIElmIHlvdSB3aXNoIHRvIGVkaXQgYSBuZXN0ZWQgbGlicmFyeSwgc2V0IHRoaXMgZmxhZyB0byBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzYXZlTGlicmFyaWVzQXNGaWxlcyA9IHRydWU7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBzYXZlT25seURpcnR5TW9mUmVzb3VyY2VzID0gdHJ1ZTsKLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIG5lc3RlZCBhcmNoaXZlcyBhcmUgdHJlYXRlZCBhcyBwcmltaXRpdmUgYXJjaGl2ZXMgYW5kIGFyZSBub3QgcGlwZWQgdGhyb3VnaCB0aGUKLQkgKiBkaXNjcmltaW5hdG9yIHRyZWUgb24gdGhlIGFyY2hpdmUgZmFjdG9yeTsgbW9kdWxlIGZpbGVzIGluIGFuIEVBUiBhcmUgb3BlbmVkIHVzaW5nIHRoZQotCSAqIHNwZWNpZmljIG9wZW4gbWV0aG9kcyBvbiB0aGUgZmFjdG9yeTsgY2hhbmdlIHRoaXMgZmxhZyBpZiB5b3UnZCBsaWtlIG5lc3RlZCBhcmNoaXZlcyB0byBiZQotCSAqIGRpc2NyaW1pbmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgTWFwIHJlYWRPbmx5RmxhZ3M7Ci0KLQkvKioKLQkgKiBBcmNoaXZlT3B0aW9ucyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBcmNoaXZlT3B0aW9ucygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIGEgY29weSBvZiB0aGUgcmVjaWV2ZXIsIHNldHRpbmcgdGhlIGxvYWRTdHJhdGVneSB0byBudWxsCi0JICovCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJcmV0dXJuIGNsb25lV2l0aChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIGEgY29weSBvZiB0aGUgcmVjaWV2ZXIsIHNldHRpbmcgdGhlIGxvYWRTdHJhdGVneSB0byBudWxsCi0JICovCi0JcHVibGljIEFyY2hpdmVPcHRpb25zIGNsb25lV2l0aChMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSkgewotCQl0cnkgewotCQkJQXJjaGl2ZU9wdGlvbnMgcmVzdWx0ID0gKEFyY2hpdmVPcHRpb25zKSBzdXBlci5jbG9uZSgpOwotCQkJcmVzdWx0LnNldExvYWRTdHJhdGVneShhTG9hZFN0cmF0ZWd5KTsKLQkJCXJlc3VsdC5yZWFkT25seUZsYWdzID0gbnVsbDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlnbm9yZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZU9wdGlvbnMgY2xvbmVXaXRoKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB7Ci0JCUFyY2hpdmVPcHRpb25zIHJlc3VsdCA9IGNsb25lV2l0aChhTG9hZFN0cmF0ZWd5KTsKLQkJcmVzdWx0LnNldElzUmVhZE9ubHkoaXNSZWFkT25seSh1cmkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IGdldExvYWRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGxvYWRTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNSZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzE4LzIwMDEgMjo0MjoxMSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYXZlT25seURpcnR5TW9mUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gc2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc1JlYWRPbmx5KGJvb2xlYW4gbmV3SXNSZWFkT25seSkgewotCQlpc1JlYWRPbmx5ID0gbmV3SXNSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc1JlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHksIFN0cmluZyB1cmkpIHsKLQkJaWYgKHJlYWRPbmx5RmxhZ3MgPT0gbnVsbCkKLQkJCXJlYWRPbmx5RmxhZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlyZWFkT25seUZsYWdzLnB1dCh1cmksIG5ldyBCb29sZWFuKHJlYWRPbmx5KSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShTdHJpbmcgdXJpKSB7Ci0JCWlmIChyZWFkT25seUZsYWdzICE9IG51bGwpIHsKLQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSByZWFkT25seUZsYWdzLmdldCh1cmkpOwotCQkJaWYgKGJvb2wgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYm9vbC5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gaXNSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2FkU3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IG5ld0xvYWRTdHJhdGVneSkgewotCQlsb2FkU3RyYXRlZ3kgPSBuZXdMb2FkU3RyYXRlZ3k7Ci0JCWxvYWRTdHJhdGVneS5zZXRSZWFkT25seShpc1JlYWRPbmx5KCkpOwotCQlsb2FkU3RyYXRlZ3kuc2V0UmVuZGVyZXJUeXBlKGdldFJlbmRlcmVyVHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzE4LzIwMDEgMjo0MjoxMSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXMoYm9vbGVhbiBuZXdTYXZlT25seURpcnR5TW9mUmVzb3VyY2VzKSB7Ci0JCXNhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXMgPSBuZXdTYXZlT25seURpcnR5TW9mUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZUphdmFSZWZsZWN0aW9uKGJvb2xlYW4gbmV3VXNlSmF2YVJlZmxlY3Rpb24pIHsKLQkJdXNlSmF2YVJlZmxlY3Rpb24gPSBuZXdVc2VKYXZhUmVmbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VKYXZhUmVmbGVjdGlvbigpIHsKLQkJcmV0dXJuIHVzZUphdmFSZWZsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNhdmVMaWJyYXJpZXNBc0ZpbGVzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVMaWJyYXJpZXNBc0ZpbGVzKCkgewotCQlyZXR1cm4gc2F2ZUxpYnJhcmllc0FzRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2F2ZUxpYnJhcmllc0FzRmlsZXMuCi0JICogCi0JICogQHBhcmFtIHNhdmVMaWJyYXJpZXNBc0ZpbGVzCi0JICogICAgICAgICAgICBUaGUgc2F2ZUxpYnJhcmllc0FzRmlsZXMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZUxpYnJhcmllc0FzRmlsZXMoYm9vbGVhbiBzYXZlTGlicmFyaWVzQXNGaWxlcykgewotCQl0aGlzLnNhdmVMaWJyYXJpZXNBc0ZpbGVzID0gc2F2ZUxpYnJhcmllc0FzRmlsZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMoKSB7Ci0JCXJldHVybiBkaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMKLQkgKiAgICAgICAgICAgIFRoZSBkaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcyhib29sZWFuIGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzKSB7Ci0JCXRoaXMuZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMgPSBkaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlbmRlcmVyVHlwZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlbmRlcmVyVHlwZSgpIHsKLQkJcmV0dXJuIHJlbmRlcmVyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcmVuZGVyZXJUeXBlIGFsbG93cyBhIHVzZXIgdG8gb3ZlcnJpZGUgdGhlIHJlbmRlcmVyIHVzZWQgYnkgQ29tbW9uIEFyY2hpdmUgZm9yIHNwZWNpYWwKLQkgKiBjYXNlcyBpbiB0aGUgVUkgd2hlcmUgeW91IHJlYWxseSB3YW50IHRvIHVzZSBhIG5vbi1zeW5jaHJvbml6aW5nIHJlbmRlcmVyLgotCSAqIAotCSAqIEBwYXJhbSByZW5kZXJlclR5cGUKLQkgKiAgICAgICAgICAgIFRoZSByZW5kZXJlclR5cGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyVHlwZShpbnQgcmVuZGVyZXJUeXBlKSB7Ci0JCXRoaXMucmVuZGVyZXJUeXBlID0gcmVuZGVyZXJUeXBlOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENsYXNzTG9hZGluZ01vZGUoKSB7Ci0JCXJldHVybiBjbGFzc0xvYWRpbmdNb2RlOwotCX0KLQotCS8qKgotCSAqIFZhbGlkIHZhbHVlcyBhcmUgTE9BRF9NT0RFX0NPTVBBVCBvciBMT0FEX01PREVfU1BFQy4gVGhlIGRlZmF1bHQgaXMgTE9BRF9NT0RFX0NPTVBBVC4gVGhpcwotCSAqIGZsYWcgaXMgdG8gc2V0IHRoZSBjbGFzcyBsb2FkaW5nIG1vZGU7IHRoZSBkZWZhdWx0IGlzIExPQURfTU9ERV9DT01QQVQgZm9yIGJhY2t3YXJkcwotCSAqIGNvbXBhdGliaWxpdHksIHdoaWxlIExPQURfTU9ERV9TUEVDIHdpbGwgZW5mb3JjZSBzcGVjIGRlZmluZWQgY2xhc3MgbG9hZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NMb2FkaW5nTW9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGluZ01vZGUoaW50IGNsYXNzTG9hZGluZ01vZGUpIHsKLQkJdGhpcy5jbGFzc0xvYWRpbmdNb2RlID0gY2xhc3NMb2FkaW5nTW9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzNjU4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGFuIEFQSSBmb3Igb3BlbmluZyBhcmNoaXZlcy4gVGhlIHtAbGluayBDb21tb25BcmNoaXZlRmFjdG9yeX0KLSAqIGltcGxlbWVudGF0aW9uIHVzZXMgYSByb290IGxldmVsIGRpc2NyaW1pbmF0b3IgdG8gb3BlbiBhbiBhcmNoaXZlLiBUaGUgbWFpbiBiZW5lZml0IG9mIHRoaXMgYXBpCi0gKiBpcyBpdCBhbGxvd3MgZXh0ZW5kZWQgdGVhbXMgb3IgdGhpcmQgcGFydGllcyB0byBwbHVnIGluIHRvIHRoZSBmcmFtZXdvcmsgdG8gYWxsb3cgc3BlY2lhbGl6ZWQKLSAqIGtpbmRzIG9mIGphciBmaWxlcyBkbyBiZSBkaXNjZXJuZWQgYXQgY3JlYXRpb24vb3BlbiB0aW1lIHdpdGhvdXQgdGhlIGNsaWVudCBoYXZpbmcgdG8gcHJvdmlkZSBhCi0gKiBsb3Qgb2YgbG9naWMuIEZvciBleGFtcGxlLCBhIGNsaWVudCB3b3VsZCBzaW1wbHkgd3JpdGUKLSAqIDxjb2RlPigoQ29tbW9uQXJjaGl2ZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uQXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSkpLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3BlbihhU3RyaW5nKTxjb2RlPiwgYW5kIGdldCBiYWNrIAotICogdGhlIGNvcnJlY3Qga2luZCBvZiBhcmNoaXZlIGluc3RhbmNlLiAgQSBkaXNjcmltaW5hdG9yIGNvbnRhaW5zIGNoaWxkcmVuLCB3aGljaCBpcyBhbiBvcmRlcmVkIGxpc3Qgb2YgZGlzY3JpbWluYXRvcnMsIGVhY2ggb2Ygd2hpY2ggCi0gKiBjYW4gaGF2ZSBpdHMgdHVybiB0byBkZXRlcm1pbmUgaWYgaXQgY2FuIG9wZW4gYW4gYXJjaGl2ZS4gIFRoZSBmaXJzdCBvbmUgdG8gc3VjY2VlZCB3aW5zLiAgT25jZSBhIGRpc2NyaW1pbmF0b3IgZGV0ZXJtaW5lcyB0aGF0IGl0Ci0gKiBjYW4gb3BlbiBhbiBhcmNoaXZlLCBpdCBnaXZlcyBlYWNoIG9mIGl0cyBjaGlsZHJlbiB0aGUgb3Bwb3J0dW50aXR5IHRvIGRvIHNvbWV0aGluZyBtb3JlIHNwZWNpZmljLCBhbmQgc28gb24uIEluIHRoZSBiYXNlCi0gKiBpbXBsZW1lbnRhdGlvbiwgZGlzY3JpbWluYXRvcnMgYXJlIGRlZmluZWQgYXMgc2luZ2xlIGluc3RhbmNlcyBvZiBhbiBpbm5lciBjbGFzcyBmb3IgZWFjaCBpbXBvcnQgc3RyYXRlZ3kuICBUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgCi0gKiBob3cgdG8gcmVnaXN0ZXIgYSBkaXNjcmltaW5hdG9yIGZvciBhIHNwZWNpYWxpemVkIEVKQkphckZpbGU6IAotICogPGNvZGU+RWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpLmFkZENoaWxkKGFEaXNjcmltaW5hdG9yKTs8L2NvZGU+Ci0gKiBUaGlzIHdvdWxkIGJlIGRvbmUgYXMgYW4gaW5pdGlhbGl6YXRpb24gYXQgc3RhcnR1cCB0aW1lLiAgSWYgdGhlIGNoaWxkIGRpc2NyaW1pbmF0b3IgaXMgZXZlciBpbnZva2VkLCB0aGUgcGFyZW50IHdpbGwgaGF2ZSBhbHJlYWR5Ci0gKiBkZXRlcm1pbmVkIHRoYXQgdGhlIGFyY2hpdmUgaXMgYW4gRUpCSmFyRmlsZSBhbmQgd2lsbCBoYXZlIGNvbnZlcnRlZCBpdCB0byB0aGF0IHR5cGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQpOwotCi0JLyoqCi0JICogQHRocm93cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBwcmVkZWNlc3NvciBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZEFmdGVyKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCwgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHByZWRlY2Vzc29yKSB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHN1Y2Nlc3NvciBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZEJlZm9yZShBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQsIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBzdWNjZXNzb3IpIHRocm93cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRlc3RzIG9uIHRoZSBhcmNoaXZlIHRvIGRldGVybWluZSBpZiBpdCBpcyB0aGUga2luZCB0aGlzIGRpc2NyaW1pbmF0b3IgaXMgaW50ZXJlc3RlZAotCSAqIGluCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKTsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgaW1wb3J0IHN0cmF0ZWd5IGZvciBhIGNvbnZlcnRlZCBhcmNoaXZlCi0JICovCi0JcHVibGljIEltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHRvIGJlIHByZXNlbnRlZCBlaXRoZXIgdGhyb3VnaCBhbiBleGNlcHRpb24gb3IgZXJyb3IgbWVzc2FnZSB3aGVuIGEgc3BlY2lmaWMKLQkgKiBraW5kIG9mIGFyY2hpdmUgaXMgZXhwZWN0ZWQgYW5kIHRoaXMgZGlzY3JpbWluYXRvciBjYW4ndCBvcGVuIGl0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5hYmxlVG9PcGVuTWVzc2FnZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGQoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MpOwotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKTsKLQotCS8qKgotCSAqIFBvaW50IG9mIGVudHJ5IGZvciBhdHRlbXB0aW5nIHRvIG9wZW4gYW4gYXJjaGl2ZQotCSAqIAotCSAqIEByZXR1cm4gYSBjb252ZXJ0ZWQgYXJjaGl2ZSBvciBudWxsIGlmIHRoaXMgZGlzY3JpbWluYXRvciBjYW4ndCBjb252ZXJ0IGl0Ci0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDdiMjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5OwotCi0KLS8qKgotICogQHNlZSBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgaW1wbGVtZW50cyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgewotCXByb3RlY3RlZCBMaXN0IGNoaWxkcmVuOwotCi0JcHVibGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCkgewotCQlpZiAoaGFzQ2hpbGQoY2hpbGQpKQotCQkJcmV0dXJuOwotCQlnZXRDaGlsZHJlbigpLmFkZChjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkQWZ0ZXIob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHByZWRlY2Vzc29yKSB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotCQlpZiAoaGFzQ2hpbGQoY2hpbGQpKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSBnZXRDaGlsZHJlbigpLmluZGV4T2YocHJlZGVjZXNzb3IpOwotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJaW5kZXgrKzsKLQkJCWdldENoaWxkcmVuKCkuYWRkKGluZGV4LCBjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24ocHJlZGVjZXNzb3IudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRCZWZvcmUoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkLCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Igc3VjY2Vzc29yKSB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotCQlpZiAoaGFzQ2hpbGQoY2hpbGQpKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSBnZXRDaGlsZHJlbigpLmluZGV4T2Yoc3VjY2Vzc29yKTsKLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWdldENoaWxkcmVuKCkuYWRkKGluZGV4LCBjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24oc3VjY2Vzc29yLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JICovCi0JcHVibGljIEFyY2hpdmUgY29udmVydChBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBkZXN0aW5hdGlvbiA9IGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKTsKLQotCQkvL3R1cm4gb2Ygbm90aWZpY2F0aW9ucwotCQlkZXN0aW5hdGlvbi5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCWRlc3RpbmF0aW9uLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkvL0NvcHkgdGhlIHJlbGV2YW50IGF0dHJpYnV0ZXMKLQkJZGVzdGluYXRpb24uc2V0VVJJKGFuQXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCWRlc3RpbmF0aW9uLnNldE9yaWdpbmFsVVJJKGFuQXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCWRlc3RpbmF0aW9uLnNldFNpemUoYW5BcmNoaXZlLmdldFNpemUoKSk7Ci0JCWRlc3RpbmF0aW9uLnNldExhc3RNb2RpZmllZChhbkFyY2hpdmUuZ2V0TGFzdE1vZGlmaWVkKCkpOwotCi0JCWRlc3RpbmF0aW9uLnNldExvYWRTdHJhdGVneShhbkFyY2hpdmUuZ2V0TG9hZFN0cmF0ZWd5KCkpOwotCQlkZXN0aW5hdGlvbi5zZXRPcHRpb25zKGFuQXJjaGl2ZS5nZXRPcHRpb25zKCkpOwotCQlkZXN0aW5hdGlvbi5zZXRFeHRyYUNsYXNzcGF0aChhbkFyY2hpdmUuZ2V0RXh0cmFDbGFzc3BhdGgoKSk7Ci0JCWlmIChkZXN0aW5hdGlvbi5pc01vZHVsZUZpbGUoKSkgewotCQkJSW1wb3J0U3RyYXRlZ3kgaW1wb3J0U3RyYXRlZ3kgPSBjcmVhdGVJbXBvcnRTdHJhdGVneShhbkFyY2hpdmUsIGRlc3RpbmF0aW9uKTsKLQkJCSgoTW9kdWxlRmlsZSkgZGVzdGluYXRpb24pLnNldEltcG9ydFN0cmF0ZWd5KGltcG9ydFN0cmF0ZWd5KTsKLQkJfQotCi0KLQotCQkvL3R1cm4gbm90aWZpY2F0aW9ucyBiYWNrIG9uCi0JCWRlc3RpbmF0aW9uLmVTZXREZWxpdmVyKHRydWUpOwotCQlkZXN0aW5hdGlvbi5lU2V0RGVsaXZlcih0cnVlKTsKLQotCQlyZXR1cm4gZGVzdGluYXRpb247Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKTsKLQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBhbmQgYXR0ZW1wdCB0byBjb252ZXJ0IHRoZSBhcmNoaXZlIHRvIHRoZSBjaGlsZCdzIHR5cGU7IHJldHVybiB0aGUKLQkgKiBjb252ZXJ0ZWQgYXJjaGl2ZSBmcm9tIHRoZSBmaXJzdCBjaGlsZCB0aGF0IHN1Y2NlZWRzLCBvciBudWxsIGlmIG5vIGNoaWxkIHN1Y2NlZWRzIG9yIG5vCi0JICogY2hpbGQgZXhpc3RzCi0JICovCi0JcHJvdGVjdGVkIEFyY2hpdmUgZ2V0SW1wb3J0YWJsZUFyY2hpdmVGcm9tQ2hpbGQoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmICghaGFzQ2hpbGRyZW4oKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCUFyY2hpdmUgY2hpbGRDb252ZXJ0ZWRBcmNoaXZlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVDaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkID0gKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcikgdGhlQ2hpbGRyZW4uZ2V0KGkpOwotCQkJY2hpbGRDb252ZXJ0ZWRBcmNoaXZlID0gY2hpbGQub3BlbkFyY2hpdmUoYW5BcmNoaXZlKTsKLQkJCWlmIChjaGlsZENvbnZlcnRlZEFyY2hpdmUgIT0gbnVsbCkgewotCQkJCXJldHVybiBjaGlsZENvbnZlcnRlZEFyY2hpdmU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRYbWxERE1lc3NhZ2UoU3RyaW5nIGFyY2hpdmVUeXBlLCBTdHJpbmcgZGRVcmkpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJpbnZhbGlkX2FyY2hpdmVfRVhDXyIsIChuZXcgT2JqZWN0W117YXJjaGl2ZVR5cGUsIGRkVXJpfSkpOyAvLyROT04tTkxTLTEkID0gIkFyY2hpdmUgaXMgbm90IGEgdmFsaWQgezB9IGJlY2F1c2UgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjYW4gbm90IGJlIGZvdW5kIChjYXNlIHNlbnNpdGl2ZSk6IHsxfSIKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYykgewotCQlyZXR1cm4gaGFzQ2hpbGRyZW4oKSAmJiBnZXRDaGlsZHJlbigpLmNvbnRhaW5zKGRpc2MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5zaXplKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKCFjYW5JbXBvcnQoYW5BcmNoaXZlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQXJjaGl2ZSBjb252ZXJ0ZWRBcmNoaXZlID0gY29udmVydChhbkFyY2hpdmUpOwotCQlBcmNoaXZlIGNoaWxkQ29udmVydGVkQXJjaGl2ZSA9IGdldEltcG9ydGFibGVBcmNoaXZlRnJvbUNoaWxkKGNvbnZlcnRlZEFyY2hpdmUpOwotCQlpZiAoY2hpbGRDb252ZXJ0ZWRBcmNoaXZlICE9IG51bGwpCi0JCQlyZXR1cm4gY2hpbGRDb252ZXJ0ZWRBcmNoaXZlOwotCQlyZXR1cm4gY29udmVydGVkQXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQpIHsKLQkJZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoY2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKGphdmEudXRpbC5MaXN0IG5ld0NoaWxkcmVuKSB7Ci0JCWNoaWxkcmVuID0gbmV3Q2hpbGRyZW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVVJJQ29udmVydGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVVJJQ29udmVydGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGMwMzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB1c2VkIGZvciBsb2FkaW5nIG9mIG1vZiByZXNvdXJjZXMgY29udGFpbmVkIHdpdGhpbiBhbiBhcmNoaXZlOyBrbm93cyBob3cgdG8gcmV0cmlldmUKLSAqIGFuIGlucHV0IHN0cmVhbSBmb3IgYSBnaXZlbiB1cmkKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsIGV4dGVuZHMgVVJJQ29udmVydGVySW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGxhdGZvcm1Qcm90b2NvbCA9ICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBpbkZpbGVwYXRoLCBvdXRGaWxlcGF0aDsKLQotCXB1YmxpYyBBcmNoaXZlVVJJQ29udmVydGVySW1wbChvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlIGFuQXJjaGl2ZSwgU3RyaW5nIHJlc291cmNlc1BhdGgpIHsKLQkJc2V0QXJjaGl2ZShhbkFyY2hpdmUpOwotCQl0aGlzLnJlc291cmNlc1BhdGggPSByZXNvdXJjZXNQYXRoOwotCQlzZXRJbnB1dEZpbGVwYXRoKHJlc291cmNlc1BhdGgpOwotCQlTdHJpbmcgb3V0cGF0aCA9IHJlc291cmNlc1BhdGg7Ci0JCWlmIChvdXRwYXRoID09IG51bGwpIHsKLQkJCUxvYWRTdHJhdGVneSBsID0gYW5BcmNoaXZlLmdldExvYWRTdHJhdGVneSgpOwotCQkJaWYgKGwgIT0gbnVsbCAmJiBsLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQl0cnkgewotCQkJCQlvdXRwYXRoID0gbC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXNldE91dHB1dEZpbGVwYXRoKG91dHBhdGgpOwotCX0KLQotCS8qKiBUaGUgYXJjaGl2ZSBmcm9tIHdoaWNoIHJlc291cmNlcyB3aWxsIGJlIGxvYWRlZCAqLwotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlIGFyY2hpdmU7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZXNQYXRoOwotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJaWYgKHJlc291cmNlc1BhdGggIT0gbnVsbCkKLQkJCWluID0gbWFrZUlucHV0U3RyZWFtKHVyaSk7Ci0JCWlmIChpbiAhPSBudWxsKQotCQkJcmV0dXJuIGluOwotCQlyZXR1cm4gZ2V0QXJjaGl2ZSgpLmdldElucHV0U3RyZWFtKHVyaS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlhcmNoaXZlID0gbmV3QXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZXNQYXRoLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VzUGF0aCgpIHsKLQkJcmV0dXJuIHJlc291cmNlc1BhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVzb3VyY2VzUGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzUGF0aAotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlc1BhdGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzUGF0aChTdHJpbmcgcmVzb3VyY2VzUGF0aCkgewotCQl0aGlzLnJlc291cmNlc1BhdGggPSByZXNvdXJjZXNQYXRoOwotCQlzZXRJbnB1dEZpbGVwYXRoKHJlc291cmNlc1BhdGgpOwotCQlzZXRPdXRwdXRGaWxlcGF0aChyZXNvdXJjZXNQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIG5vcm1hbGl6ZShVUkkgdXJpKSB7Ci0JCXJldHVybiBnZXRJbnRlcm5hbFVSSU1hcCgpLmdldFVSSSh1cmkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBpbnB1dCBmaWxlIHBhdGggY29uc2lzdHMgb2YgYSBzdHJpbmcgb2YgZGlyZWN0b3JpZXMgb3IgemlwIGZpbGVzIHNlcGFyYXRlZCBieSBzZW1pLWNvbG9ucwotCSAqIHRoYXQgYXJlIHNlYXJjaGVkIHdoZW4gYW4gaW5wdXQgc3RyZWFtIGlzIGNvbnN0cnVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRGaWxlcGF0aCgpIHsKLQkJcmV0dXJuIGluRmlsZXBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVwYXRoCi0JICogICAgICAgICAgICBUaGUgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXRGaWxlcGF0aChTdHJpbmcgZmlsZXBhdGgpIHsKLQkJaW5GaWxlcGF0aCA9IGZpbGVwYXRoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIG91dHB1dCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dEZpbGVwYXRoKCkgewotCQlyZXR1cm4gb3V0RmlsZXBhdGg7Ci0JfQotCi0JLyoqCi0JICogVGhlIG91dHB1dCBmaWxlIHBhdGggaXMgdGhlIHBhdGggbmFtZSBvZiBhIGRpcmVjdG9yeSB0byBwcmVwZW5kIHRvIHJlbGF0aXZlIGZpbGUgcGF0aCBuYW1lcwotCSAqIHdoZW4gYW4gb3V0cHV0IHN0cmVhbSBpcyBjb25zdHJ1Y3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0RmlsZXBhdGgoU3RyaW5nIGZpbGVwYXRoKSB7Ci0JCW91dEZpbGVwYXRoID0gZmlsZXBhdGg7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgVVJJIHRvIGFuIGlucHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgdXJpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIG1ha2VJbnB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlVUkkgY29udmVydGVkID0gdXJpOwotCi0JCWlmICgoZmlsZVByb3RvY29sLmVxdWFscyhjb252ZXJ0ZWQuc2NoZW1lKCkpIHx8IGNvbnZlcnRlZC5zY2hlbWUoKSA9PSBudWxsKSAmJiBpbkZpbGVwYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBzZWFyY2hGaWxlUGF0aChjb252ZXJ0ZWQudG9TdHJpbmcoKSk7Ci0JCX0KLQkJVVJMIHVybCA9IGNyZWF0ZVVSTChjb252ZXJ0ZWQudG9TdHJpbmcoKSk7Ci0JCVVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQlyZXR1cm4gdXJsQ29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCB0aGUgZmlsZSBwYXRoIGlmIHRoZSBmaWxlIHBvcnRpb24gb2YgdGhlIFVSTCBpcyBub3QgYWJzb2x1dGUgKGRvZXMgbm90IGJlZ2luIHdpdGggIi8iOwotCSAqIG90aGVyd2lzZSwgYXR0ZW1wdCB0byBjcmVhdGUgYW4gaW5wdXQgc3RyZWFtIGZvciB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gc2VhcmNoRmlsZVBhdGgoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0JCWlmIChmaWxlLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluRmlsZXBhdGgsICI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGYgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCVppcEZpbGUgemYgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6ZiA9IG5ldyBaaXBGaWxlKGYpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJaWYgKHpmICE9IG51bGwpIHsKLQkJCQlpbiA9IHNlYXJjaFppcEZpbGUoemYsIGZpbGVuYW1lKTsKLQkJCQlpZiAoaW4gPT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCXpmLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvL0lnbm9yZQotCQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWluID0gc2VhcmNoRGlyZWN0b3J5KGYsIGZpbGVuYW1lKTsKLQkJCX0KLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCXJldHVybiBpbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZpbGUgd2l0aCB0aGUgcmVsYXRpdmUgcGF0aCBuYW1lIG9mIGZpbGVuYW1lIGV4aXN0cyBpbiB0aGUKLQkgKiBnaXZlbiBkaXJlY3RvcnkuIElmIG5vdCwgaXQgcmV0dXJucyBudWxsOyBvdGhlcndpc2UsIGl0IG9wZW5zIHRoZSBmaWxlIHVwIGFuZCByZXR1cm5zIHRoZQotCSAqIGlucHV0IHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBqYXZhLmlvLklucHV0U291cmNlCi0JICovCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIHNlYXJjaERpcmVjdG9yeShTdHJpbmcgZGlyLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChkaXIuZXF1YWxzKCIuIikpIC8vJE5PTi1OTFMtMSQKLQkJCWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikgKyBmaWxlbmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFmLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRldGVybWluZXMgd2hldGhlciB0aGVyZSBpcyBhIFppcEVudHJ5IHdob3NlIG5hbWUgaXMgZmlsZW5hbWUgaW4gdGhlIGdpdmVuCi0JICogWmlwRmlsZS4gSWYgbm90LCBpdCByZXR1cm5zIG51bGw7IG90aGVyd2lzZSwgaXQgcmV0dXJucyBhbiBpbnB1dCBzb3VyY2UgdG8gcmVhZCBmcm9tIHRoZQotCSAqIFppcEVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSB6aXAKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZQotCSAqIEByZXR1cm4gamF2YS5pby5JbnB1dFNvdXJjZQotCSAqLwotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBzZWFyY2haaXBGaWxlKFppcEZpbGUgemlwLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVppcEVudHJ5IGVudHJ5ID0gemlwLmdldEVudHJ5KGZpbGVuYW1lKTsKLQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHppcC5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBhIFVSTCBmcm9tIHRoZSB1cmk7IGlmIHRoZSBhdHRlbXB0IGZhaWxzLCBhdHRlbXB0IHRvIGFwcGVuZCAiZmlsZToiIHRvIHRoZSBVUkk7IGlmIHRoZQotCSAqIGF0dGVtcHQgc3RpbGwgZmFpbHMsIGF0dGVtcHQgdG8gcmVwbGFjZSB0aGUgcHJvdG9jb2wgd2l0aCB0aGUgZmlsZSBwcm90b2NvbC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgc3RyaW5nIHVyaQotCSAqLwotCXB1YmxpYyBVUkwgY3JlYXRlVVJMKFN0cmluZyB1cmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlNYWxmb3JtZWRVUkxFeGNlcHRpb24gbSA9IG51bGw7Ci0JCWlmICh1cmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwodXJpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCW0gPSAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uKSBlOwotCQl9Ci0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCXJldHVybiB1cmw7Ci0JCS8vIEVpdGhlciB0cmVhdCB0aGUgVVJJIGFzIGEgZmlsZXBhdGggKGlmIHRoZXJlIGFyZSBubyA6IG9yCi0JCS8vIGEgOiBpbiBwb3NpdGlvbiAxKSBvciByZXBsYWNlIHRoZSBnaXZlbiBwcm90b2NvbCB3aXRoIHRoZQotCQkvLyBmaWxlIHByb3RvY29sLgotCQlpbnQgaW5kZXggPSB1cmkuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA9PSAxKQotCQkJdXJpID0gZmlsZVByb3RvY29sICsgIjoiICsgdXJpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGluZGV4ID4gMCkKLQkJCXVyaSA9IGZpbGVQcm90b2NvbCArICI6IiArIHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCh1cmkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlpZiAodXJsICE9IG51bGwpCi0JCQlyZXR1cm4gdXJsOwotCQl0aHJvdyBtOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIFVSSSB0byBhbiBvdXRwdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSB1cmkKLQkgKi8KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGNyZWF0ZU91dHB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlVUkkgY29udmVydGVkID0gdXJpOwotCQlpZiAocGxhdGZvcm1Qcm90b2NvbC5lcXVhbHMoY29udmVydGVkLnNjaGVtZSgpKSkgewotCQkJVVJMIHJlc29sdmVkVVJMID0gcmVzb2x2ZVBsYXRmb3JtKG5ldyBVUkwoY29udmVydGVkLnRvU3RyaW5nKCkpKTsKLQkJCWlmIChyZXNvbHZlZFVSTCAhPSBudWxsKSB7Ci0JCQkJY29udmVydGVkID0gVVJJLmNyZWF0ZUZpbGVVUkkocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZVByb3RvY29sLmVxdWFscyhjb252ZXJ0ZWQuc2NoZW1lKCkpIHx8IGNvbnZlcnRlZC5zY2hlbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gb3BlbkZpbGVPdXRwdXRTdHJlYW0oY29udmVydGVkKTsKLQkJfQotCQlVUkwgdXJsID0gY3JlYXRlVVJMKGNvbnZlcnRlZC50b1N0cmluZygpKTsKLQkJVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCXVybENvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7Ci0JCXJldHVybiB1cmxDb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpOwotCX0KLQotCXByb3RlY3RlZCBVUkwgcmVzb2x2ZVBsYXRmb3JtKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGxldCBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgaW1wbGVtZW50IHRoaXMgb25lLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgZmlsZSBvdXRwdXQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gdXJpICh0aGUgdXJpIGhhcyBmaWxlIHByb3RvY29sKS4gSWYgYW4gb3V0cHV0IGZpbGUKLQkgKiBwYXRoIGlzIHNwZWNpZmllZCBhbmQgdGhlIGZpbGUgbmFtZSBpcyByZWxhdGl2ZSwgcHJlcGVuZCB0aGUgb3V0cHV0IGZpbGUgcGF0aCB0byB0aGUgZmlsZQotCSAqIG5hbWUuIE1ha2UgdGhlIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiB0aGUgZmlsZSBpZiB0aGV5IGRvIG5vdCBleGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG9wZW5GaWxlT3V0cHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCWlmICghZmlsZS5pc0Fic29sdXRlKCkgJiYgb3V0RmlsZXBhdGggIT0gbnVsbCkgewotCQkJZmlsZSA9IG5ldyBGaWxlKG91dEZpbGVwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyB1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCVN0cmluZyBwYXJlbnQgPSBmaWxlLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCW5ldyBGaWxlKHBhcmVudCkubWtkaXJzKCk7Ci0JCX0KLQkJT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQlyZXR1cm4gb3V0cHV0U3RyZWFtOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRXhwb3J0U3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRXhwb3J0U3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliMDgwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0V4cG9ydFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkFyY2hpdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci0KLQotCi0vKioKLSAqIEV4cG9ydFN0cmF0ZWd5IGtub3dzIHdoYXQgdG8gZG8ganVzdCBiZWZvcmUgYSBkdW1wIG9mIGFuIGFyY2hpdmUgaXMgYWJvdXQgdG8gb2NjdXIsIHR5cGljYWxseQotICogYWRkaW5nIGl0ZW1zIHN1Y2ggYXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhbmQgc3VjaC4gVGhpcyBwcm92aWRlcyBhIGRlbGVnYXRpb24gbW9kZWwgZm9yCi0gKiBhcmNoaXZlL3ZlcnNpb24vcGxhdGZvcm0gc3BlY2lmaWMgcnVsZXMgYWJvdXQgd2hpY2ggcmVzb3VyY2VzIGV0YyBuZWVkIHRvIGJlIGV4cG9ydGVkLiBDbGllbnRzCi0gKiBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgInBsdWcgaW4iIHRvIGFuIGluc3RhbmNlIG9mIGFuIGFyY2hpdmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhwb3J0U3RyYXRlZ3kgZXh0ZW5kcyBBcmNoaXZlU3RyYXRlZ3kgewotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHN0cmF0ZWd5IGhhcyBhbHJlYWR5IHNhdmVkIGEgZmlsZSBlbnRyeSBoYXZpbmcgYSB1cmkgbmFtZWQgYnkgdGhlCi0JICogcGFyYW1ldGVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU2F2ZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBUaGUgYXJjaGl2ZSBpcyBzYXZpbmcgaXRzZWxmLCBhbmQgZ2l2aW5nIHRoZSBleHBvcnQgc3RyYXRlZ3kgdGhlIG9wcG9ydHVuaXR5IHRvIGRvIHdoYXRldmVyCi0JICogaXQgbmVlZHMgdG8gZG8uIFRoZSBleHBvcnQgc3RyYXRlZ3kgbWF5IHdyaXRlIGVudHJpZXMgZGlyZWN0bHkgdG8gdGhlIFNhdmVTdHJhdGVneSwgYnV0IGlmIGl0Ci0JICogZG9lcywgaXQgc2hvdWxkIHJlbWVtYmVyIHRoZSBuYW1lcyBvZiB0aGVzZSBlbnRyaWVzIHNvIHRoZSBhcmNoaXZlIGRvZXMgbm90IGF0dGVtcHQgdG8KLQkgKiBkdXBsaWNhdGUgYnkgc2F2aW5nIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVNhdmUoU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVFeHRlbnNpb25zRmlsdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiOWI3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVFeHRlbnNpb25zRmlsdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDE6MjA6MDkgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbCBleHRlbmRzIFNhdmVGaWx0ZXJJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIHsKLQlwcm90ZWN0ZWQgU2V0IGV4Y2x1ZGVkRXh0ZW5zaW9uczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU2V0IGV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlOwotCi0JLyoqCi0JICogRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbChTdHJpbmdbXSBleHRlbnNpb25zVG9FeGNsdWRlLCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJc3VwZXIoKTsKLQkJU2V0IGV4dGVuc2lvbnMgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zVG9FeGNsdWRlLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHRlbnNpb25zLmFkZChleHRlbnNpb25zVG9FeGNsdWRlW2ldKTsKLQkJfQotCQlzZXRFeGNsdWRlZEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCXNldElzQ2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBGaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwoU3RyaW5nIGV4dGVuc2lvbiwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXN1cGVyKCk7Ci0JCVNldCBleHRlbnNpb25zID0gbmV3IGphdmEudXRpbC5IYXNoU2V0KDEpOwotCQlleHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCQlzZXRFeGNsdWRlZEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCXNldElzQ2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBGaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwoU2V0IGV4dGVuc2lvbnNUb0V4Y2x1ZGUsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQlzdXBlcigpOwotCQlzZXRFeGNsdWRlZEV4dGVuc2lvbnMoZXh0ZW5zaW9uc1RvRXhjbHVkZSk7Ci0JCXNldElzQ2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDE6MjQ6MjggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5TZXQgZ2V0RXhjbHVkZWRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZXhjbHVkZWRFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDI6NDI6MjAgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5TZXQgZ2V0RXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UoKSB7Ci0JCXJldHVybiBleGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoaXNDYXNlU2Vuc2l0aXZlKCkpCi0JCQlyZXR1cm47Ci0KLQkJamF2YS51dGlsLkhhc2hTZXQgYVNldCA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgpOwotCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBnZXRFeGNsdWRlZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhU2V0LmFkZCgoKFN0cmluZykgaXQubmV4dCgpKS50b1VwcGVyQ2FzZSgpKTsKLQkJfQotCQlzZXRFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZShhU2V0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBpc0Nhc2VTZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjgvMDEgMToyNDoyOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXhjbHVkZWRFeHRlbnNpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhjbHVkZWRFeHRlbnNpb25zKGphdmEudXRpbC5TZXQgbmV3RXhjbHVkZWRFeHRlbnNpb25zKSB7Ci0JCWV4Y2x1ZGVkRXh0ZW5zaW9ucyA9IG5ld0V4Y2x1ZGVkRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yOC8wMSAyOjQyOjIwIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZQotCSAqICAgICAgICAgICAgamF2YS51dGlsLlNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlKGphdmEudXRpbC5TZXQgbmV3RXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UpIHsKLQkJZXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UgPSBuZXdFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJc0Nhc2VTZW5zaXRpdmUoYm9vbGVhbiB2YWx1ZSkgewotCQlpc0Nhc2VTZW5zaXRpdmUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZUZpbHRlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFNhdmUoU3RyaW5nIHVyaSwgQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJU3RyaW5nIGV4dGVuc2lvbiA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuZ2V0RmlsZU5hbWVFeHRlbnNpb24odXJpKTsKLQkJaWYgKGV4dGVuc2lvbi5lcXVhbHMoIiIpKS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCi0JCVNldCBleGNsdWRlZDsKLQkJaWYgKGlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlleGNsdWRlZCA9IGdldEV4Y2x1ZGVkRXh0ZW5zaW9ucygpOwotCQl9IGVsc2UgewotCQkJZXhjbHVkZWQgPSBnZXRFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZSgpOwotCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9uLnRvVXBwZXJDYXNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gIWV4Y2x1ZGVkLmNvbnRhaW5zKGV4dGVuc2lvbik7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVJdGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMmI2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMDIvMDEgNToyMDowMCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGVJdGVyYXRvciB7Ci0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKEZpbGUgYUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKTsKLQotCXB1YmxpYyBGaWxlIG5leHQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUl0ZXJhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlSXRlcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzNmOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlSXRlcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlSXRlcmF0b3JJbXBsIGltcGxlbWVudHMgRmlsZUl0ZXJhdG9yIHsKLQlwcm90ZWN0ZWQgTGlzdCBmaWxlczsKLQlwcm90ZWN0ZWQgaW50IHBvc2l0aW9uID0gMDsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzAyLzAxIDY6MTY6NTIgUE0pCi0JICovCi0JcHVibGljIEZpbGVJdGVyYXRvckltcGwoKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXB1YmxpYyBGaWxlSXRlcmF0b3JJbXBsKExpc3QgdGhlRmlsZXMpIHsKLQkJc3VwZXIoKTsKLQkJZmlsZXMgPSB0aGVGaWxlczsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oRmlsZSBhRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGFGaWxlLmdldElucHV0U3RyZWFtKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHBvc2l0aW9uIDwgZmlsZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBGaWxlIG5leHQoKSB7Ci0JCWlmICghaGFzTmV4dCgpKQotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVuZF9vZl9saXN0X3JlYWNoZWRfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJFbmQgb2YgbGlzdCByZWFjaGVkIgotCQlyZXR1cm4gKEZpbGUpIGZpbGVzLmdldChwb3NpdGlvbisrKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL01hbmlmZXN0UGFja2FnZUVudHJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9NYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlZjgyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL01hbmlmZXN0UGFja2FnZUVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotCi0vKioKLSAqIFVzZWQgZm9yIG1hbmlmZXN0IHN1cHBvcnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwgZXh0ZW5kcyBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJOYW1lIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSUZJQ0FUSU9OX1RJVExFID0gIlNwZWNpZmljYXRpb24tVGl0bGUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNJRklDQVRJT05fVkVSU0lPTiA9ICJTcGVjaWZpY2F0aW9uLVZlcnNpb24iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNJRklDQVRJT05fVkVORE9SID0gIlNwZWNpZmljYXRpb24tVmVuZG9yIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRBVElPTl9USVRMRSA9ICJJbXBsZW1lbnRhdGlvbi1UaXRsZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fVkVSU0lPTiA9ICJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRBVElPTl9WRU5ET1IgPSAiSW1wbGVtZW50YXRpb24tVmVuZG9yIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBNYW5pZmVzdFBhY2thZ2VFbnRyeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTWFuaWZlc3RQYWNrYWdlRW50cnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2l6ZQotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIE1hbmlmZXN0UGFja2FnZUVudHJ5SW1wbChpbnQgc2l6ZSkgewotCQlzdXBlcihzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBNYW5pZmVzdFBhY2thZ2VFbnRyeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsKGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyBhdHRyKSB7Ci0JCXN1cGVyKGF0dHIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldChJTVBMRU1FTlRBVElPTl9USVRMRSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlbmRvcigpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldChJTVBMRU1FTlRBVElPTl9WRU5ET1IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0KElNUExFTUVOVEFUSU9OX1ZFUlNJT04pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldChOQU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmljYXRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldChTUEVDSUZJQ0FUSU9OX1RJVExFKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmljYXRpb25WZW5kb3IoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoU1BFQ0lGSUNBVElPTl9WRU5ET1IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoU1BFQ0lGSUNBVElPTl9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvblRpdGxlKFN0cmluZyB2YWx1ZSkgewotCQlwdXQoSU1QTEVNRU5UQVRJT05fVElUTEUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvblZlbmRvcihTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KElNUExFTUVOVEFUSU9OX1ZFTkRPUiwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVmVyc2lvbihTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KElNUExFTUVOVEFUSU9OX1ZFUlNJT04sIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQlwdXQoTkFNRSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmljYXRpb25UaXRsZShTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KFNQRUNJRklDQVRJT05fVElUTEUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY2F0aW9uVmVuZG9yKFN0cmluZyB2YWx1ZSkgewotCQlwdXQoU1BFQ0lGSUNBVElPTl9WRU5ET1IsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY2F0aW9uVmVyc2lvbihTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KFNQRUNJRklDQVRJT05fVkVSU0lPTiwgdmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL05lc3RlZEFyY2hpdmVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGU5NzczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVSdW50aW1lRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBOZXN0ZWRBcmNoaXZlSXRlcmF0b3IgZXh0ZW5kcyBGaWxlSXRlcmF0b3JJbXBsIHsKLQlwcm90ZWN0ZWQgWmlwSW5wdXRTdHJlYW0gemlwSW5wdXRTdHJlYW07Ci0JcHJvdGVjdGVkIFppcEVudHJ5IGN1cnJlbnRFbnRyeTsKLQotCXN0YXRpYyBjbGFzcyBXcmFwcGVySW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7Ci0JCS8qKgotCQkgKiBAcGFyYW0gaW4KLQkJICovCi0JCXB1YmxpYyBXcmFwcGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKLQkJCXN1cGVyKGluKTsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI2Nsb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vZG8gbm90aGluZyBiZWNhdXNlIHdlIHdhbnQgdG8gcHJldmVudCB0aGUgY2xpZW50cyBmcm9tIGNsb3NpbmcgdGhlIHppcAotCQl9Ci0JfQotCi0JLyoqCi0JICogTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5lc3RlZEFyY2hpdmVJdGVyYXRvcihMaXN0IHRoZUZpbGVzLCBaaXBJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJc3VwZXIodGhlRmlsZXMpOwotCQl6aXBJbnB1dFN0cmVhbSA9IHN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oRmlsZSBhRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKCFhRmlsZS5nZXRVUkkoKS5lcXVhbHMoY3VycmVudEVudHJ5LmdldE5hbWUoKSkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW50ZXJuYWxfRXJyb3JfX0l0ZXJhdG9yX29fRVhDXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJJbnRlcm5hbCBFcnJvcjogSXRlcmF0b3Igb3V0IG9mIHN5bmMgd2l0aCB6aXAgZW50cmllcyIKLQkJcmV0dXJuIG5ldyBXcmFwcGVySW5wdXRTdHJlYW0oemlwSW5wdXRTdHJlYW0pOwotCX0KLQotCXB1YmxpYyBGaWxlIG5leHQoKSB7Ci0JCUZpbGUgbmV4dCA9IHN1cGVyLm5leHQoKTsKLQkJdHJ5IHsKLQkJCWRvIHsKLQkJCQljdXJyZW50RW50cnkgPSB6aXBJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsKLQkJCX0gd2hpbGUgKGN1cnJlbnRFbnRyeS5pc0RpcmVjdG9yeSgpKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9pdGVyYXRpbmdfdGhlX2FyY2hpdl9FWENfIiksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvciBpdGVyYXRpbmcgdGhlIGFyY2hpdmUiCi0JCX0KLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUmVzb3VyY2VQcm94eVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SZXNvdXJjZVByb3h5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOGEzYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SZXNvdXJjZVByb3h5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLWZpbmFsIGNsYXNzIFJlc291cmNlUHJveHlWYWxpZGF0b3IgewotCXN0YXRpYyBIYXNoTWFwIHJlc291cmNlVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzb2x2ZUNvbnRhaW5lZFByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJTGlzdCBjb250YWluZWQgPSByZWZPYmplY3QuZUNvbnRlbnRzKCk7Ci0JCUVPYmplY3QgbW9mT2JqZWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lZC5zaXplKCk7IGkrKykgewotCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIGNvbnRhaW5lZC5nZXQoaSk7Ci0JCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXNvbHZlTm9uQ29udGFpbmVkUHJveGllcyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlMaXN0IHJlZmVyZW5jZXMgPSByZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJRVJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JCUVPYmplY3QgcHJveHlPck9iamVjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAoIXJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkgJiYgIXJlZmVyZW5jZS5pc1RyYW5zaWVudCgpKSB7Ci0JCQkJaWYgKHJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJCQlJdGVyYXRvciB2YWx1ZSA9ICgoTGlzdCkgcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlKSkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKHZhbHVlLmhhc05leHQoKSkgewotCQkJCQkJcHJveHlPck9iamVjdCA9IChFT2JqZWN0KSB2YWx1ZS5uZXh0KCk7Ci0JCQkJCQlpZiAocHJveHlPck9iamVjdC5lSXNQcm94eSgpKQotCQkJCQkJCXZhbHVlLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJveHlPck9iamVjdCA9IChFT2JqZWN0KSByZWZPYmplY3QuZUdldChyZWZlcmVuY2UsIGZhbHNlKTsKLQkJCQkJaWYgKHByb3h5T3JPYmplY3QgIT0gbnVsbCAmJiBwcm94eU9yT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQkJCVVSSSByZXNvdXJjZVVSSSA9ICgoRU9iamVjdEltcGwpIHByb3h5T3JPYmplY3QpLmVQcm94eVVSSSgpLnRyaW1GcmFnbWVudCgpOwotCQkJCQkJU3RyaW5nIHByb3RvY29sID0gcmVzb3VyY2VVUkkuc2NoZW1lKCk7Ci0JCQkJCQlpZiAocHJvdG9jb2wgPT0gbnVsbCB8fCAhcHJvdG9jb2wuZXF1YWxzKCJqYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBpZCA9ICgoRU9iamVjdEltcGwpIHByb3h5T3JPYmplY3QpLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQkJaWYgKHJlc291cmNlVVJJTWFwLmdldChyZXNvdXJjZVVSSSkgIT0gbnVsbCkgewotCQkJCQkJCQlSZXNvdXJjZSBjYWNoZWRSZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVzb3VyY2VVUklNYXAuZ2V0KHJlc291cmNlVVJJKTsKLQkJCQkJCQkJcHJveHlPck9iamVjdCA9IChFT2JqZWN0KSAoKFhNTFJlc291cmNlKSBjYWNoZWRSZXNvdXJjZSkuZ2V0SURUb0VPYmplY3RNYXAoKS5nZXQoaWQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXByb3h5T3JPYmplY3QgPSAoRU9iamVjdCkgcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlKTsKLQkJCQkJCQkJcmVzb3VyY2VVUklNYXAucHV0KHJlc291cmNlVVJJLCBwcm94eU9yT2JqZWN0LmVSZXNvdXJjZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHByb3h5T3JPYmplY3QgPT0gbnVsbCB8fCBwcm94eU9yT2JqZWN0LmVJc1Byb3h5KCkpCi0JCQkJCQkJCXJlZk9iamVjdC5lU2V0KHJlZmVyZW5jZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc29sdmVQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCWlmIChyZWZPYmplY3QgIT0gbnVsbCkgewotCQkJcmVzb2x2ZU5vbkNvbnRhaW5lZFByb3hpZXMocmVmT2JqZWN0KTsKLQkJCXJlc29sdmVDb250YWluZWRQcm94aWVzKHJlZk9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSBhbGwgb2YgdGhlIHByb3hpZXMgd2l0aCA8Y29kZT5yZXNvdXJjZTwvY29kZT4gdG8gYmUgcmVzb2x2ZWQuCi0JICovCi0Jc3RhdGljIHZvaWQgY2hlY2tGb3JVbnJlc29sdmFibGVQcm94aWVzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJlc291cmNlVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsgLy9SZXNldCBoYXNobWFwIG9uIGVhY2ggY2FsbAotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJTGlzdCB0b3BMZXZlbHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQkJRU9iamVjdCBtb2ZPYmplY3Q7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRvcExldmVscy5zaXplKCk7IGkrKykgewotCQkJCW1vZk9iamVjdCA9IChFT2JqZWN0KSB0b3BMZXZlbHMuZ2V0KGkpOwotCQkJCXJlc29sdmVQcm94aWVzKG1vZk9iamVjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjgxYzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSB7Ci0KLQotCS8qKgotCSAqIFRoZSByZXNvbHZlZCBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBlbnRyeQotCSAqLwotCVN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKTsKLQotCXZvaWQgc2V0QWJzb2x1dGVQYXRoKFN0cmluZyBhYnNvbHV0ZVBhdGgpOwotCi0JLyoqCi0JICogQSBzaW5nbGUgdG9rZW4gZnJvbSB0aGUgQ2xhc3MtUGF0aDogYXR0cmJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0TWFuaWZlc3RWYWx1ZSgpOwotCi0Jdm9pZCBzZXRNYW5pZmVzdFZhbHVlKFN0cmluZyBtYW5pZmVzdFZhbHVlKTsKLQotCS8qKgotCSAqIHZhbGlkIG9ubHkgaWYgdGhpcyBlbnRyeSBpcyBhIGxpYnJhcnkgaW4gYSBXQVJGaWxlLCB1bmRlciBXRUItSU5GL2xpYgotCSAqLwotCVdBUkZpbGUgZ2V0V2FyRmlsZSgpOwotCi0Jdm9pZCBzZXRXYXJGaWxlKFdBUkZpbGUgYVdhckZpbGUpOwotCi0JLyoqCi0JICogdHJ1ZSBpZiB0aGlzIGVudHJ5IGlzIGEgbGlicmFyeSBpbiBhIFdBUiBmaWxlCi0JICovCi0JYm9vbGVhbiBpc1dlYkxpYigpOwotCi0JLyoqCi0JICogVGhlIHJlc29sdmVkIGFyY2hpdmUgaW5zaWRlIGFuIEVBUiB0aGF0IHRoaXMgZW50cnkgcG9pbnRzIHRvOyBOb3RlIHRoYXQgdGhpcyBpcyBOT1QgdGhlCi0JICogQXJjaGl2ZSB0aGF0IGhhcyB0aGUgZW50cnkgaW4gdGhlIG1hbmlmZXN0LCBidXQgcmF0aGVyIHRoZSByZWZlcmVuY2VkIGFyY2hpdmUvCi0JICovCi0JQXJjaGl2ZSBnZXRSZWZlcmVuY2VkQXJjaGl2ZSgpOwotCi0Jdm9pZCBzZXRSZWZlcmVuY2VkQXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjYwY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGwgaW1wbGVtZW50cyBSdW50aW1lQ2xhc3NwYXRoRW50cnkgewotCi0JLyoqIEEgc2luZ2xlIHRva2VuIGZyb20gdGhlIENsYXNzLVBhdGg6IGF0dHJidXRlICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYW5pZmVzdFZhbHVlOwotCS8qKiBUaGUgcmVzb2x2ZWQgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW50cnkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFic29sdXRlUGF0aDsKLQkvKiogdmFsaWQgb25seSBpZiB0aGlzIGVudHJ5IGlzIGEgbGlicmFyeSBpbiBhIFdBUkZpbGUsIHVuZGVyIFdFQi1JTkYvbGliICovCi0JcHJvdGVjdGVkIFdBUkZpbGUgd2FyRmlsZTsKLQotCXByb3RlY3RlZCBBcmNoaXZlIHJlZmVyZW5jZWRBcmNoaXZlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbmlmZXN0Q2xhc3NwYXRoRW50cnlJbXBsLgotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlUGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHsKLQkJcmV0dXJuIGFic29sdXRlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhYnNvbHV0ZVBhdGguCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlUGF0aCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIGFic29sdXRlUGF0aCkgewotCQl0aGlzLmFic29sdXRlUGF0aCA9IGFic29sdXRlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtYW5pZmVzdFZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFuaWZlc3RWYWx1ZSgpIHsKLQkJcmV0dXJuIG1hbmlmZXN0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWFuaWZlc3RWYWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuaWZlc3RWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIG1hbmlmZXN0VmFsdWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3RWYWx1ZShTdHJpbmcgbWFuaWZlc3RWYWx1ZSkgewotCQl0aGlzLm1hbmlmZXN0VmFsdWUgPSBtYW5pZmVzdFZhbHVlOwotCX0KLQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSB3YXJGaWxlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFdBUkZpbGUKLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBnZXRXYXJGaWxlKCkgewotCQlyZXR1cm4gd2FyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3YXJGaWxlLgotCSAqIAotCSAqIEBwYXJhbSB3YXJGaWxlCi0JICogICAgICAgICAgICBUaGUgd2FyRmlsZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXYXJGaWxlKFdBUkZpbGUgd2FyRmlsZSkgewotCQl0aGlzLndhckZpbGUgPSB3YXJGaWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBSdW50aW1lQ2xhc3NwYXRoRW50cnkpCi0JCQlyZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKCgoUnVudGltZUNsYXNzcGF0aEVudHJ5KSBvKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgUnVudGltZUNsYXNzcGF0aEVudHJ5I2lzV2ViTGliKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYkxpYigpIHsKLQkJcmV0dXJuIHdhckZpbGUgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2VkQXJjaGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBBcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgZ2V0UmVmZXJlbmNlZEFyY2hpdmUoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkQXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZWZlcmVuY2VkQXJjaGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZEFyY2hpdmUKLQkgKiAgICAgICAgICAgIFRoZSByZWZlcmVuY2VkQXJjaGl2ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQXJjaGl2ZShBcmNoaXZlIHJlZmVyZW5jZWRBcmNoaXZlKSB7Ci0JCXRoaXMucmVmZXJlbmNlZEFyY2hpdmUgPSByZWZlcmVuY2VkQXJjaGl2ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TYXZlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGI5N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TYXZlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLQotLyoqCi0gKiBPYmplY3QgdXNlZCBmb3Igc2F2aW5nIGFuIGFyY2hpdmUgd2l0aCBvbmx5IGEgc3Vic2V0IG9mIGl0cyBmaWxlcy4gQnkgZGVmYXVsdCBhbGwgZmlsZXMgYXJlCi0gKiBzYXZlZC4gQ2xpZW50cyBjYW4gY3JlYXRlIGEgY3VzdG9tIGZpbHRlciBhbmQgc2V0IGl0IG9uIGEgc2F2ZSBzdHJhdGVneSwgYW5kIGNhbGwKLSAqIHtAbGluayBBcmNoaXZlI3NhdmUoU2F2ZVN0cmF0ZWd5KX0KLSAqLwotcHVibGljIGludGVyZmFjZSBTYXZlRmlsdGVyIHsKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciBhbiBlbGVtZW50IGluIHRoZSBhcmNoaXZlIGhhdmluZyB0aGUgdXJpIHNob3VsZCBiZSBzYXZlZDsgdGhlIHVyaSBtYXkgYmUgZm9yIGEKLQkgKiBmaWxlLCBhIG5lc3RlZCBhcmNoaXZlLCBvciBhIGxvYWRlZCBtb2YgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTYXZlKFN0cmluZyB1cmksIEFyY2hpdmUgYW5BcmNoaXZlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwNDFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NhdmVGaWx0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci0KLQotCi0vKioKLSAqIERlZmF1bHQgZmlsdGVyIHdoaWNoIGFsbG93cyBhbGwgZWxlbWVtdHMgdG8gc2F2ZQotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUZpbHRlckltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXIgewotCS8qKgotCSAqIFNhdmVGaWx0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNhdmVGaWx0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlRmlsdGVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2F2ZShqYXZhLmxhbmcuU3RyaW5nIHVyaSwgQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TZWxlY3RlZEZpbGVzRmlsdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TZWxlY3RlZEZpbGVzRmlsdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjgxZjcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMjMvMDEgMTE6MDQ6NTIgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsIGV4dGVuZHMgU2F2ZUZpbHRlckltcGwgewotCS8qKiBTZXQgb2YgZmlsZSB1cmlzIHRvIGJlIHNhdmVkICovCi0JcHJvdGVjdGVkIFNldCBzZWxlY3RlZEZpbGVOYW1lczsKLQotCS8qKgotCSAqIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIHdpdGggYSBwcmVzZWxlY3RlZCBzdWJzZXQgb2YgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIHRvIGJlIHNhdmVkOyBlYWNoIGVsZW1lbnQKLQkgKiBpbiB0aGUgbGlzdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGV9Ci0JICovCi0JcHVibGljIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsKExpc3QgYXJjaGl2ZUZpbGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCVNldCBmaWxlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVGaWxlcy5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBhcmNoaXZlRmlsZXMuZ2V0KGkpOwotCQkJZmlsZU5hbWVzLmFkZChhRmlsZS5nZXRVUkkoKSk7Ci0JCX0KLQkJc2V0U2VsZWN0ZWRGaWxlTmFtZXMoZmlsZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJhbWV0ZXIgbXVzdCBiZSBhIHNldCBvZiB2YWxpZCB1cmlzIGluIHRoZSBhcmNoaXZlCi0JICovCi0JcHVibGljIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsKFNldCBmaWxlTmFtZXMpIHsKLQkJc3VwZXIoKTsKLQkJc2V0U2VsZWN0ZWRGaWxlTmFtZXMoZmlsZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8yMy8wMSAxMToxOTowMSBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5TZXQKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLlNldCBnZXRTZWxlY3RlZEZpbGVOYW1lcygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkRmlsZU5hbWVzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzIzLzAxIDExOjE5OjAxIEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTZWxlY3RlZEZpbGVOYW1lcwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkRmlsZU5hbWVzKGphdmEudXRpbC5TZXQgbmV3U2VsZWN0ZWRGaWxlTmFtZXMpIHsKLQkJc2VsZWN0ZWRGaWxlTmFtZXMgPSBuZXdTZWxlY3RlZEZpbGVOYW1lczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTYXZlKGphdmEubGFuZy5TdHJpbmcgdXJpLCBBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0U2VsZWN0ZWRGaWxlTmFtZXMoKS5jb250YWlucyh1cmkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQWx0UmVzb3VyY2VSZWdpc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BbHRSZXNvdXJjZVJlZ2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZWY3N2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BbHRSZXNvdXJjZVJlZ2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBBbHRSZXNvdXJjZVJlZ2lzdGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFNldCByZWdpc3RlcmVkVVJJcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcm90ZWN0ZWQgQWx0UmVzb3VyY2VSZWdpc3RlcigpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYW4gQXJjaGl2ZSByZWxhdGl2ZSBwYXRoIGZvciB0aGUgcmVzb3VyY2Ugd2hpY2ggY2FuIGJlIGNvcGllZCB1cCBhcyBhbiBhbHQgaW4gYW4KLQkgKiBFQVIgZmlsZS4gVGhlIHVyaSBzaG91bGQgYmUgaW4gY2FuYW5vbmljYWwgZm9ybSBhbmQgdXNlIHRoZSBmb3J3YXJkIHNsYXNoLCBlZywKLQkgKiAiTUVUQS1JTkYvdmVuZG9yLWV4dGVuc2lvbnMueG1pIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclVSSShTdHJpbmcgdXJpKSB7Ci0JCXJlZ2lzdGVyZWRVUklzLmFkZCh1cmkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZVJlZ2lzdGVyVVJJKFN0cmluZyB1cmkpIHsKLQkJcmVnaXN0ZXJlZFVSSXMucmVtb3ZlKHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiByZWdpc3RlcmVkVVJJcy5jb250YWlucyh1cmkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0IGdldFJlZ2lzdGVyZWRVUklzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHJlZ2lzdGVyZWRVUklzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTdlMjVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsIGV4dGVuZHMgTW9kdWxlRmlsZUltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50IGRlcGxveW1lbnREZXNjcmlwdG9yID0gbnVsbDsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IGRkID0gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCQlpZiAoZGQgPT0gbnVsbCAmJiBjYW5MYXp5SW5pdGlhbGl6ZSgpKSB7Ci0JCQl0cnkgewotCQkJCWdldEltcG9ydFN0cmF0ZWd5KCkuaW1wb3J0TWV0YURhdGEoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpLCBlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUkk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEZXBsb3llbWVudERlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuaW1wbC5Nb2R1bGVGaWxlSW1wbAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJQXBwbGljYXRpb25DbGllbnQgYUNsaWVudCA9ICgoQ2xpZW50UGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSkuZ2V0Q2xpZW50RmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0JCXJlc291cmNlLnNldElEKGFDbGllbnQsIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9JRCk7Ci0JCXNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGFDbGllbnQpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChhQ2xpZW50KTsKLQkJcmV0dXJuIGFDbGllbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb25DbGllbnQgbCkgewotCQl0aGlzLnNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGwpOwotCQlyZXBsYWNlUm9vdChnZXRNb2ZSZXNvdXJjZU1ha2VJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKSwgbCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fU0laRToKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0U2l6ZSgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNEaXJlY3RvcnlFbnRyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJCXJldHVybiBiYXNpY0dldExvYWRpbmdDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZ2V0RmlsZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX1RZUEVTOgotCQkJCXJldHVybiBnZXRUeXBlcygpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBpc1NldExhc3RNb2RpZmllZCgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fU0laRToKLQkJCQlyZXR1cm4gaXNTZXRTaXplKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzU2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gT1JJR0lOQUxfVVJJX0VERUZBVUxUID09IG51bGwgPyBvcmlnaW5hbFVSSSAhPSBudWxsIDogIU9SSUdJTkFMX1VSSV9FREVGQVVMVC5lcXVhbHMob3JpZ2luYWxVUkkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGxvYWRpbmdDb250YWluZXIgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0ZJTEVTOgotCQkJCXJldHVybiBmaWxlcyAhPSBudWxsICYmICFmaWxlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19UWVBFUzoKLQkJCQlyZXR1cm4gdHlwZXMgIT0gbnVsbCAmJiAhdHlwZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fVVJJOgotCQkJCXNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXNldExhc3RNb2RpZmllZCgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19TSVpFOgotCQkJCXNldFNpemUoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXNldERpcmVjdG9yeUVudHJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCWdldEZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoQXBwbGljYXRpb25DbGllbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19VUkk6Ci0JCQkJc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQl1bnNldExhc3RNb2RpZmllZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX1NJWkU6Ci0JCQkJdW5zZXRTaXplKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXVuc2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoT1JJR0lOQUxfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChBcHBsaWNhdGlvbkNsaWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKSB7Ci0JCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsICYmIGRlcGxveW1lbnREZXNjcmlwdG9yLmVJc1Byb3h5KCkpIHsKLQkJCUFwcGxpY2F0aW9uQ2xpZW50IG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IChBcHBsaWNhdGlvbkNsaWVudCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG9sZERlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKEFwcGxpY2F0aW9uQ2xpZW50IG5ld0RlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3RGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0ODY4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLQotCi0vKioKLSAqIE92ZXJSaWRlIGNsYXNzIHRvIHVzZSB0aGUgcHJvcGVyIGNvcHlpbmcgb2YgWE1MUmVzb3VyY2UgZG9jdHlwZXMuIEhhZCB0byBjcmVhdGUgdGhpcyBjbGFzcyBEdWUgdG8KLSAqIHRoZSB3YXkgaXQncyBoYW5kbGVkIGluIHRoZSBjb3B5IGNvbW1hbmRzIG9mIEV0b29sc0NvcHlVdGlsaXR5Ci0gKiAKLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8xOC8wMSA4ODg4ODg4ODo0OCBQTSkKLSAqIAotICogQGF1dGhvcjogSmFyZWQgSnVya2lld2ljegotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSBleHRlbmRzIEV0b29sc0NvcHlTZXNzaW9uIHsKLQlwdWJsaWMgRU9iamVjdCBjb3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29waWVkID0gc3VwZXIuY29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCWlmIChjb3BpZWQgaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KQotCQkJY29weVByaW1LZXlJbmZvKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBhUmVmT2JqZWN0LCAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgY29waWVkKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBwcmltQ29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLnByaW1Db3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJaWYgKGNvcGllZCBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpCi0JCQljb3B5UHJpbUtleUluZm8oKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGFSZWZPYmplY3QsIChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBjb3BpZWQpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5KEV0b29sc0NvcHlVdGlsaXR5IGFDb3B5VXRpbGl0eSkgewotCQlzdXBlcihhQ29weVV0aWxpdHkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5jb3B5LkV0b29sc0NvcHlTZXNzaW9uI25ld0luc3RhbmNlKFJlc291cmNlLCBTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIG5ld0luc3RhbmNlKFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlSZXNvdXJjZSBjb3B5UmVzb3VyY2UgPSBzdXBlci5uZXdJbnN0YW5jZShhUmVzb3VyY2UsIG5ld1VyaSk7Ci0KLQkJaWYgKGFSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKQotCQkJKChYTUxSZXNvdXJjZSkgY29weVJlc291cmNlKS5zZXRWZXJzaW9uSUQoKChYTUxSZXNvdXJjZSkgYVJlc291cmNlKS5nZXRWZXJzaW9uSUQoKSk7Ci0JCXJldHVybiBjb3B5UmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0Q29weUlmRm91bmQoRU9iamVjdCBhbk9iamVjdCkgewotCQlFT2JqZWN0IGNvcGllZE9iamVjdCA9IHN1cGVyLmdldENvcHlJZkZvdW5kKGFuT2JqZWN0KTsKLQkJaWYgKChhbk9iamVjdCBpbnN0YW5jZW9mIEphdmFDbGFzcykgJiYgKGFuT2JqZWN0ID09IGNvcGllZE9iamVjdCkpIHsKLQkJCWNvcGllZE9iamVjdCA9IG5ld0luc3RhbmNlKGFuT2JqZWN0KTsKLQkJCVVSSSB1cmkgPSBFY29yZVV0aWwuZ2V0VVJJKGFuT2JqZWN0KTsKLQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBjb3BpZWRPYmplY3QpLmVTZXRQcm94eVVSSSh1cmkpOwotCQl9Ci0JCXJldHVybiBjb3BpZWRPYmplY3Q7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLmNvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlpZiAoY29waWVkIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkKLQkJCWNvcHlQcmltS2V5SW5mbygoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYVJlZk9iamVjdCwgKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGNvcGllZCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY29weVByaW1LZXlJbmZvKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgc291cmNlLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNvcGllZCkgewotCQlDTVBBdHRyaWJ1dGUgcHJpbUtleUZpZWxkID0gc291cmNlLmdldFByaW1LZXlGaWVsZCgpOwotCQlpZiAocHJpbUtleUZpZWxkICE9IG51bGwpCi0JCQljb3BpZWQuc2V0UHJpbUtleUZpZWxkKHByaW1LZXlGaWVsZCk7Ci0JfQotCi0JLyoKLQkgKiBTdXBlciBjbGFzcyBvdmVycmlkZSB0byBoYW5kbGUgdW5yZXNvbHZhYmxlIHByb3hpZXMgKEphdmFDbGFzcykKLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2UoRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmIChhUmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IHZhbHVlID0gKExpc3QpIGFSZWZPYmplY3QuZUdldChhUmVmZXJlbmNlKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWNvcHlNYW55UmVmZXJlbmNlKGFSZWZlcmVuY2UsIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0gZWxzZSBpZiAoYVJlZk9iamVjdC5lSXNTZXQoYVJlZmVyZW5jZSkpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGFSZWZPYmplY3QuZUdldChhUmVmZXJlbmNlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCXZhbHVlID0gKChJbnRlcm5hbEVPYmplY3QpIGFSZWZPYmplY3QpLmVHZXQoYVJlZmVyZW5jZSwgZmFsc2UpOwotCQkJY29weVNpbmdsZVJlZmVyZW5jZShhUmVmZXJlbmNlLCAoRU9iamVjdCkgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWNjMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuRGVmYXVsdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQ29weUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5U2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOC8wMCA2OjI2OjQ4IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlQ29weVV0aWxpdHkgZXh0ZW5kcyBFdG9vbHNDb3B5VXRpbGl0eSB7Ci0JLyoqCi0JICogTW9kdWxlRmlsZUNvcHlVdGlsdGl0eSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBcmNoaXZlQ29weVV0aWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldENvcHlBZGFwdGVycyh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIEVuZCBvZiBjb2RlIHB1bGxlZCBmcm9tIEV0b29sc0NvcHlVdGlsaXR5IHRvIG92ZXItcmlkZSB0aGUgcHJpbUNvcHkgbWV0aG9kLgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5KEVSZWZlcmVuY2UgcmVmZXJlbmNlLCBFT2JqZWN0IGFWYWx1ZSwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCWlmICgoKERlZmF1bHRhYmxlKSBhVmFsdWUpLmlzRGVmYXVsdCgpKQotCQkJcmV0dXJuOwotCQlzdXBlci5hZGREZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHkocmVmZXJlbmNlLCBhVmFsdWUsIGlkU3VmZml4LCBhQ29weUNvbnRhaW5lcik7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdCBjb3B5KEFyY2hpdmVNYW5pZmVzdCBtZikgewotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCW1mLndyaXRlKG91dCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0JCQlyZXR1cm4gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCS8vVGhpcyBzaG91bGQgYWxtb3N0IG5ldmVyIGhhcHBlbiwgdW5sZXNzIHRoZXJlIGlzIGFuIGlzc3VyZSB3aXRoIG1lbW9yeSBhbGxvY2F0aW9uCi0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIklPRXhjZXB0aW9uX29jY3VycmVkX3doaWxlX0VYQ18iKSwgaW94KTsgLy8kTk9OLU5MUy0xJCA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBjb3B5aW5nIG1hbmlmZXN0IgotCQl9Ci0JfQotCi0JcHVibGljIEFyY2hpdmUgY29weShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCi0JCS8vRmlyc3QgY3JlYXRlIGEgY29weSBncm91cCBhbmQgY29weSB1dGlsOyBjb3B5IHRoZSBhcmNoaXZlIGFuZCBhbGwgaXRzIHJlc291cmNlcwotCQlDb3B5R3JvdXAgY29weUdyb3VwID0gbmV3IENvcHlHcm91cCgpOwotCQljb3B5R3JvdXAuc2V0UHJlc2VydmVJZHModHJ1ZSk7Ci0JCXByZXBhcmVSZXNvdXJjZXNGb3JDb3B5KGFuQXJjaGl2ZSwgY29weUdyb3VwKTsKLQkJY29weUdyb3VwLmFkZChhbkFyY2hpdmUpOwotCQl0aGlzLmNvcHkoY29weUdyb3VwKTsKLQotCQlBcmNoaXZlIGNvcGllZEFyY2hpdmUgPSAoQXJjaGl2ZSkgZ2V0Q29weShhbkFyY2hpdmUpOwotCi0JCWZpbmlzaENvcHkoYW5BcmNoaXZlLCBjb3BpZWRBcmNoaXZlLCBjb3B5R3JvdXApOwotCQlyZXR1cm4gY29waWVkQXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlRmlsZSBjb3B5KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHsKLQkJLyoqCi0JCSAqIFRpbWluZyBpc3N1ZTsgaWYgdGhlIHJlc291cmNlcyBjb250YWluaW5nIHRoZSBiaW5kaW5ncywgZXh0ZW5zaW9ucywgYW5kIGRkIGhhdmUgbm90IHlldAotCQkgKiBiZSBsb2FkZWQsIGZvcmNlIHRoYXQgYmVmb3JlIHRoZSBjb3B5IG9jY3Vyczsgb3RoZXJ3aXNlLCB0aGV5IHdpbGwgZ2V0IGxvYWRlZCBhcyB0aGUKLQkJICogYWNjZXNzb3JzIGFyZSBpbnZva2VkIGR1cmluZyBjb3B5LiBCZWNhdXNlIHRoZXkgd2lsbCBiZSBsb2FkZWQgYnV0IG5vdCBjb3BpZWQgaW50byB0aGUKLQkJICogbmV3IGFyY2hpdmUncyBjb250ZXh0LCB0aGVuIGNoYW5nZXMgd2lsbCBub3QgZ2V0IHNhdmVkLiBCeSBmb3JjaW5nIHRoZSBsb2FkIGJlZm9yZSB0aGUKLQkJICogY29weSBjb21tZW5jZXMsIHRoZSBsb2FkZWQgcmVzb3VyY2VzIHdpbGwgYWxzbyBiZSBjb3BpZWQgdG8gdGhlIG5ldyBhcmNoaXZlCi0JCSAqLwotCQlhTW9kdWxlRmlsZS5nZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoKLQkJICogUkxTLTgvMTIvMjAwMiBIYWNrIHRvIGZpeCBib3RwIGRlZmVjdCAiMTQxNjQwLWZhaWxlZCB0byBpbnN0YWxsIC53YXIgZmlsZSB3aXRoCi0JCSAqIGZpbHRlci1tYXBwaW5nIiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZXJlIGlzIGEgdHJhbnNpZW50IGZpZWxkIG9uIHRoZSBmaWx0ZXIgbWFwcGluZwotCQkgKiBjbGFzcyBmb3IgdGhlIHNlcnZsZXQgbmFtZSB0aGUgcmVsYXRpb25zaGlwIHRvIHRoZSBzZXJ2bGV0IGlzIGxhemlseSBwb3B1bGF0ZWQgdGhlIGZpcnN0Ci0JCSAqIHRpbWUgaXQgaXMgcmVxdWVzdGVkLiBJZiB3ZSBkb24ndCB0cmlwIGl0LCB0aGVuIGl0IHdvbid0IGdldCBjb3BpZWQuCi0JCSAqLwotCi0JCWlmIChhTW9kdWxlRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJTGlzdCBmaWx0ZXJNYXBwaW5ncyA9ICgoV0FSRmlsZSkgYU1vZHVsZUZpbGUpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyTWFwcGluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQkoKEZpbHRlck1hcHBpbmcpIGZpbHRlck1hcHBpbmdzLmdldChpKSkuZ2V0U2VydmxldCgpOwotCQkJfQotCQl9Ci0JCU1vZHVsZUZpbGUgY29waWVkID0gKE1vZHVsZUZpbGUpIGNvcHkoKEFyY2hpdmUpIGFNb2R1bGVGaWxlKTsKLQotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qCi0JICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHdlcmUgcHVsbGVkIG91dCBvZiBFdG9vbHNDb3B5VXRpbGl0eSBzbyB3ZSBjYW4gb3Zlci1yaWRlIHRoZQotCSAqIEV0b29sc0NvcHlTZXNzaW9uIG9iamVjdCB3aXRoIG91ciBvd24gc3VjaCB0aGF0IGRvaWN0eXBlcyBkbyBnZXQgcHJlc2VydmVkIHdpdGggWE1MCi0JICogUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHkoQ29weUdyb3VwIGFHcm91cCkgewotCQlpZiAoYUdyb3VwICE9IG51bGwpIHsKLQkJCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSh0aGlzKTsKLQkJCXNlc3Npb24uc2V0UHJlc2VydmVJZHMoYUdyb3VwLmdldFByZXNlcnZlSWRzKCkpOwotCQkJc2Vzc2lvbi5jb3B5KGFHcm91cCk7Ci0JCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjb3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSh0aGlzKTsKLQkJRU9iamVjdCBjb3BpZWQgPSBzZXNzaW9uLmNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNvcHkoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSh0aGlzKTsKLQkJUmVzb3VyY2UgY29waWVkID0gc2Vzc2lvbi5jb3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlJbXBvcnRTdHJhdGVneUlmTmVjZXNzYXJ5KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUsIE1vZHVsZUZpbGUgY29weSkgewotCQlpZiAoIWFNb2R1bGVGaWxlLmlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSkKLQkJCWNvcHkuc2V0SW1wb3J0U3RyYXRlZ3koYU1vZHVsZUZpbGUuZ2V0SW1wb3J0U3RyYXRlZ3koKS5jcmVhdGVJbXBvcnRTdHJhdGVneShhTW9kdWxlRmlsZSwgY29weSkpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBBcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5KHRoaXMpOwotCQlFT2JqZWN0IGNvcGllZCA9IHNlc3Npb24uY29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCXNlc3Npb24uZmx1c2goKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQ29weShDb3B5R3JvdXAgYUdyb3VwKSB7Ci0JCUFyY2hpdmVDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEFyY2hpdmVDb3B5VXRpbGl0eSgpOwotCQl1dGlsaXR5LmNvcHkoYUdyb3VwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hDb3B5KEFyY2hpdmUgc291cmNlLCBBcmNoaXZlIGNvcHksIENvcHlHcm91cCBncm91cCkgewotCi0JCWNvcHkuc2V0TG9hZFN0cmF0ZWd5KGdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRW1wdHlMb2FkU3RyYXRlZ3koKSk7Ci0JCWNvcHkuc2V0RXh0cmFDbGFzc3BhdGgoc291cmNlLmdldEV4dHJhQ2xhc3NwYXRoKCkpOwotCQljb3B5LnNldFhtbEVuY29kaW5nKHNvdXJjZS5nZXRYbWxFbmNvZGluZygpKTsKLQkJaWYgKHNvdXJjZS5pc01hbmlmZXN0U2V0KCkpIHsKLQkJCWNvcHkuc2V0TWFuaWZlc3QoY29weShzb3VyY2UuZ2V0TWFuaWZlc3QoKSkpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlGaWxlIG1hbmlmZXN0VG9Db3B5ID0gc291cmNlLmdldEZpbGUoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCQkJCWlmIChtYW5pZmVzdFRvQ29weSAhPSBudWxsKSB7Ci0JCQkJCUZpbGUgY29waWVkTWFuaWZlc3QgPSAoRmlsZSkgZ2V0Q29weShtYW5pZmVzdFRvQ29weSk7Ci0JCQkJCWNvcGllZE1hbmlmZXN0LnNldExvYWRpbmdDb250YWluZXIobWFuaWZlc3RUb0NvcHkuZ2V0TG9hZGluZ0NvbnRhaW5lcigpKTsKLQkJCQkJY29weS5hZGRDb3B5KGNvcGllZE1hbmlmZXN0KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9IGNhdGNoIChEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0cmlldmVSZXNvdXJjZXNGcm9tQ29weShjb3B5LCBncm91cCk7Ci0KLQkJaWYgKHNvdXJjZS5pc01vZHVsZUZpbGUoKSkKLQkJCWNvcHlJbXBvcnRTdHJhdGVneUlmTmVjZXNzYXJ5KChNb2R1bGVGaWxlKSBzb3VyY2UsIChNb2R1bGVGaWxlKSBjb3B5KTsKLQotCQlMaXN0IGZpbGVzID0gc291cmNlLmdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJRmlsZSBjb3BpZWRGaWxlID0gKEZpbGUpIGdldENvcHkoYUZpbGUpOwotCQkJY29waWVkRmlsZS5zZXRMb2FkaW5nQ29udGFpbmVyKGFGaWxlLmdldExvYWRpbmdDb250YWluZXIoKSk7Ci0JCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkpCi0JCQkJZmluaXNoTmVzdGVkQ29weSgoQXJjaGl2ZSkgYUZpbGUsIChBcmNoaXZlKSBjb3BpZWRGaWxlKTsKLQkJfQotCQkvL05vdGlmaWNhdGlvbiB3YXMgc3VzcGVuZGVkIGR1cmluZyBjb3B5OyB0aGVyZWZvcmUgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGZpbGVzCi0JCS8vSW4gdGhlIGFyY2hpdmUgZ2V0IGluZGV4ZWQKLQkJY29weS5yZWJ1aWxkRmlsZUluZGV4KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoTmVzdGVkQ29weShBcmNoaXZlIHNvdXJjZSwgQXJjaGl2ZSBjb3B5KSB7Ci0KLQkJQ29weUdyb3VwIGdyb3VwID0gbmV3IENvcHlHcm91cCgpOwotCQlwcmVwYXJlUmVzb3VyY2VzRm9yQ29weShzb3VyY2UsIGdyb3VwKTsKLQkJY29weShncm91cCk7Ci0JCWZpbmlzaENvcHkoc291cmNlLCBjb3B5LCBncm91cCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVSZXNvdXJjZXNGb3JDb3B5KEFyY2hpdmUgYW5BcmNoaXZlLCBDb3B5R3JvdXAgY29weUdyb3VwKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhbkFyY2hpdmUuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIUFyY2hpdmVVdGlsLmlzSmF2YVJlc291cmNlKHJlc291cmNlKSkKLQkJCQljb3B5R3JvdXAuYWRkKHJlc291cmNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldHJpZXZlUmVzb3VyY2VzRnJvbUNvcHkoQXJjaGl2ZSBjb3BpZWRBcmNoaXZlLCBDb3B5R3JvdXAgY29weUdyb3VwKSB7Ci0KLQkJTGlzdCByZXNvdXJjZXMgPSBjb3B5R3JvdXAuZ2V0Q29waWVkUmVzb3VyY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSBjb3BpZWRSZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWNvcGllZEFyY2hpdmUuYWRkT3JSZXBsYWNlTW9mUmVzb3VyY2UoY29waWVkUmVzb3VyY2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjVmZDYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkay5KYXZhSkRLQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uTWFuaWZlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZW9wZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5SdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5SdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5EaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5DbGFzc3BhdGhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlSW1wbCBleHRlbmRzIENvbnRhaW5lckltcGwgaW1wbGVtZW50cyBBcmNoaXZlIHsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVzKCkgPGVtPlR5cGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRUeXBlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHR5cGVzID0gbnVsbDsKLQotCS8qKiBPdXIgc3BlY2lhbGl6ZWQgbWFuaWZlc3QgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0OwotCi0JLyoqIEltcGxlbWVudGVyIGZvciBzYXZpbmcgdGhpcyBhcmNoaXZlICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBzYXZlU3RyYXRlZ3k7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCBmaWx0ZXIgZm9yIHNhdmluZyBhIHN1YnNldCBvZiBmaWxlczsgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCBmb3IgYWxsIHNhdmUgYW5kIGV4dHJhY3QKLQkgKiBpbnZva2F0aW9ucwotCSAqLwotCXByb3RlY3RlZCBTYXZlRmlsdGVyIHNhdmVGaWx0ZXI7Ci0KLQkvKiogRW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgYWxsIHhtaSByZXNvdXJjZXMgYW5kIHhtbCBkZHM7IGRlZmF1bHRzIHRvIFVURi04ICovCi0JcHJvdGVjdGVkIFN0cmluZyB4bWxFbmNvZGluZyA9IEoyRUVDb25zdGFudHMuREVGQVVMVF9YTUxfRU5DT0RJTkc7Ci0KLQkvKiogQ3VzdG9tIGNsYXNzIGxvYWRlciB1c2VkIHRvIGxvYWQgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXZlICovCi0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGFyY2hpdmVDbGFzc0xvYWRlcjsKLQotCS8qKgotCSAqIHBhdGggb2YgdGhlIHN0YW5kYXJkIGNsYXNzcGF0aCBmb3JtYXQgd2hlcmUgdGhlIGFyY2hpdmUgbWF5IGxvb2sgZm9yIGNsYXNzZXMgbm90IGZvdW5kIGluIHRoZQotCSAqIHN5c3RlbSBjbGFzc3BhdGggb3IgaW4gdGhlIGFyY2hpdmUgLSB1c2VkIGZvciBqYXZhIHJlZmxlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhQ2xhc3NwYXRoOwotCi0JcHJvdGVjdGVkIEFyY2hpdmVPcHRpb25zIG9wdGlvbnM7Ci0KLQlwdWJsaWMgQXJjaGl2ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuYXJjaGl2ZU9wZW5lZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJjaGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VHlwZXMoKSB7Ci0JCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0JCQl0eXBlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1RZUEVTKTsKLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fQ09OVEFJTkVSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTLCBDb250YWluZXIuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fVVJJOgotCQkJCXJldHVybiBnZXRVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19TSVpFOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRTaXplKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzRGlyZWN0b3J5RW50cnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19GSUxFUzoKLQkJCQlyZXR1cm4gZ2V0RmlsZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIGdldFR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fVVJJOgotCQkJCXNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJc2V0TGFzdE1vZGlmaWVkKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fU0laRToKLQkJCQlzZXRTaXplKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXNldERpcmVjdG9yeUVudHJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCWdldFR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fVVJJOgotCQkJCXNldFVSSShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fTEFTVF9NT0RJRklFRDoKLQkJCQl1bnNldExhc3RNb2RpZmllZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fU0laRToKLQkJCQl1bnNldFNpemUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQl1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoT1JJR0lOQUxfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1NJWkU6Ci0JCQkJcmV0dXJuIGlzU2V0U2l6ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzU2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBPUklHSU5BTF9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG9yaWdpbmFsVVJJICE9IG51bGwgOiAhT1JJR0lOQUxfVVJJX0VERUZBVUxULmVxdWFscyhvcmlnaW5hbFVSSSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXJldHVybiBsb2FkaW5nQ29udGFpbmVyICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fRklMRVM6Ci0JCQkJcmV0dXJuIGZpbGVzICE9IG51bGwgJiYgIWZpbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIHR5cGVzICE9IG51bGwgJiYgIXR5cGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGFkZENvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJY2hlY2tBZGRWYWxpZChhbkFyY2hpdmUpOwotCQlBcmNoaXZlIGNvcHkgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNvcHkoYW5BcmNoaXZlKTsKLQkJZ2V0RmlsZXMoKS5hZGQoY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlIEFkZHMgYSBjb3B5IG9mIHRoZSBwYXJhbWV0ZXIgdG8gdGhpcyBhcmNoaXZlCi0JICogQHRocm93cyBjb20uaWJtLmV0b29scy5hcmNoaXZlLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgYXJjaGl2ZSBhbHJlYWR5IGNvbnRhaW5zIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdXJpCi0JICovCi0JcHVibGljIEZpbGUgYWRkQ29weShGaWxlIGFGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmlzUmVhZE9ubHlEaXJlY3RvcnkoKSkgewotCQkJYWRkQ29weSgoUmVhZE9ubHlEaXJlY3RvcnkpIGFGaWxlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWNoZWNrQWRkVmFsaWQoYUZpbGUpOwotCQlGaWxlIGNvcHkgPSBjb3B5KGFGaWxlKTsKLQkJZ2V0RmlsZXMoKS5hZGQoY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCS8qKgotCSAqIEdldCBhIGZsYXR0ZW5lZCBsaXN0IGZyb20gdGhlIGRpcmVjdG9yeSwgdGhlbiBhZGRDb3B5IHRoZSBsaXN0Ci0JICogCi0JICogQHRocm93cyBjb20uaWJtLmV0b29scy5hcmNoaXZlLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIGZpbGUgd2l0aCBhIHVyaSB0aGF0IGVxdWFscyBvbmUgb2YgdGhlIG5lc3RlZCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGV4aXN0cwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QgdGhlIGNvcGllZCBmaWxlcyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgYWRkQ29weShSZWFkT25seURpcmVjdG9yeSBkaXIpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGFkZENvcHlGaWxlcyhkaXIuZ2V0RmlsZXNSZWN1cnNpdmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgTGlzdCBhZGRDb3B5RmlsZXMoamF2YS51dGlsLkxpc3QgbGlzdCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQkvL09wdGltaXphdGlvbiAtIG1ha2Ugc3VyZSB0aGUgZmlsZUluZGV4IGlzIGFscmVhZHkgYnVpbHQgdG8gc3BlZWQgdXAKLQkJLy8gY29udGFpbnNGaWxlCi0JCWdldEZpbGVzKCk7Ci0JCUxpc3QgY29weUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBsaXN0LmdldChpKTsKLQkJCWNoZWNrQWRkVmFsaWQoYUZpbGUpOwotCQkJY29weUxpc3QuYWRkKGNvcHkoYUZpbGUpKTsKLQkJfQotCQlnZXRGaWxlcygpLmFkZEFsbChjb3B5TGlzdCk7Ci0JCXJldHVybiBjb3B5TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE9yUmVwbGFjZU1vZlJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJZ2V0TG9hZFN0cmF0ZWd5KCkuYWRkT3JSZXBsYWNlTW9mUmVzb3VyY2UoYVJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKX0KLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNsb3NlKCkgewotCQlyZXR1cm4gIWdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24odGhpcykuaXNFbXB0eSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrQWRkVmFsaWQoRmlsZSBhRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWNoZWNrQWRkVmFsaWQoYUZpbGUuZ2V0VVJJKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrQWRkVmFsaWQoU3RyaW5nIGFVcmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQl0cnkgewotCQkJRmlsZSBmID0gZ2V0RmlsZShhVXJpKTsKLQkJCWlmIChmICE9IG51bGwpCi0JCQkJdGhyb3cgbmV3IER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZHVwbGljYXRlX2ZpbGVfRVhDXyIsIChuZXcgT2JqZWN0W117Z2V0VVJJKCksIGFVcml9KSksIGYpOyAvLyROT04tTkxTLTEkID0gIlRoZSBhcmNoaXZlIG5hbWVkIHswfSBhbHJlYWR5IGNvbnRhaW5zIGEgZmlsZSBuYW1lZCB7MX0iCi0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBvaykgewotCQkJLy9JZ25vcmUKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBBZnRlclRlbXBTYXZlKFN0cmluZyBhVXJpLCBqYXZhLmlvLkZpbGUgb3JpZ2luYWwsIGphdmEuaW8uRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJY2hlY2tXcml0ZWFibGUob3JpZ2luYWwpOwotCQlib29sZWFuIGRlbGV0ZVdvcmtlZCA9IGZhbHNlOwotCQlpZiAob3JpZ2luYWwuaXNEaXJlY3RvcnkoKSAmJiAhaXNSZW5hbWVhYmxlKG9yaWdpbmFsKSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJ1bmFibGVfcmVwbGFjZV9FWENfIiwgKG5ldyBPYmplY3RbXXtvcmlnaW5hbC5nZXRBYnNvbHV0ZVBhdGgoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiVW5hYmxlIHRvIHJlcGxhY2Ugb3JpZ2luYWwgYXJjaGl2ZSAiCi0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCWlmIChBcmNoaXZlVXRpbC5kZWxldGUob3JpZ2luYWwpKSB7Ci0JCQkJZGVsZXRlV29ya2VkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gVE9ETyBNYWpvciBoYWNrIGhlcmU7IHRoZSBwcm9ibGVtIGlzIHRoYXQgYSBwcmV2aW91cyBjYWxsCi0JCQkJLy8gdG8gY2xvc2UgdGhlIHNvdXJjZSBmaWxlIG1heSBub3QgeWV0IGhhdmUKLQkJCQkvL2JlZW4gcmVmbGVjdGVkIGluIHRoZSBvcy92bTsgdGhlcmVmb3JlIGEgc3Vic2VxdWVudCBjYWxsCi0JCQkJLy8gdG8gZGVsZXRlIGZhaWxzLiBUbyBnZXQgYXJvdW5kIHRoaXMsCi0JCQkJLy93YWl0IGZvciBhIGJpdCBhbmQgcmV0cnk7IGlmIGl0IGNvbnRpbnVlcyB0byBmYWlsLCB0aGVuCi0JCQkJLy8gdGltZSBvdXQgYW5kIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJaWYgKGRlbGV0ZVdvcmtlZCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJaWYgKGRlc3RpbmF0aW9uRmlsZS5yZW5hbWVUbyhvcmlnaW5hbCkpCi0JCQkJCXJldHVybjsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygidW5hYmxlX3JlcGxhY2VfRVhDXyIsIChuZXcgT2JqZWN0W117b3JpZ2luYWwuZ2V0QWJzb2x1dGVQYXRoKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIlVuYWJsZSB0byByZXBsYWNlIG9yaWdpbmFsIGFyY2hpdmUgIgotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWdldExvYWRTdHJhdGVneSgpLmNsb3NlKCk7Ci0JCXJlbGVhc2VDbGFzc0xvYWRlcigpOwotCQlnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmFyY2hpdmVDbG9zZWQodGhpcyk7Ci0JCWlmIChpc0luZGV4ZWQoKSkgewotCQkJTGlzdCBhcmNoaXZlcyA9IGdldEFyY2hpdmVGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJCSgoQXJjaGl2ZSkgYXJjaGl2ZXMuZ2V0KGkpKS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgY29weShGaWxlIGFGaWxlKSB7Ci0JCUZpbGUgY29weSA9IG51bGw7Ci0JCWlmIChhRmlsZS5pc0FyY2hpdmUoKSkKLQkJCWNvcHkgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNvcHkoKEFyY2hpdmUpIGFGaWxlKTsKLQkJZWxzZQotCQkJY29weSA9IChGaWxlKSBFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KGFGaWxlKTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHJvdGVjdGVkIExvYWRTdHJhdGVneSBjcmVhdGVMb2FkU3RyYXRlZ3lGb3JSZW9wZW4oQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5ID0gbnVsbDsKLQkJTG9vc2VBcmNoaXZlIGxvb3NlID0gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0TG9vc2VBcmNoaXZlKCk7Ci0KLQkJaWYgKGxvb3NlICE9IG51bGwpIHsKLQkJCWFMb2FkU3RyYXRlZ3kgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUxvYWRTdHJhdGVneShsb29zZS5nZXRCaW5hcmllc1BhdGgoKSk7Ci0JCQlhTG9hZFN0cmF0ZWd5LnNldExvb3NlQXJjaGl2ZShsb29zZSk7Ci0JCX0gZWxzZSBpZiAocGFyZW50ID09IG51bGwpCi0JCQlhTG9hZFN0cmF0ZWd5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVMb2FkU3RyYXRlZ3koZ2V0VVJJKCkpOwotCQllbHNlCi0JCQlhTG9hZFN0cmF0ZWd5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDaGlsZExvYWRTdHJhdGVneShnZXRVUkkoKSwgcGFyZW50LmdldExvYWRTdHJhdGVneSgpKTsKLQotCQlyZXR1cm4gYUxvYWRTdHJhdGVneTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUNsYXNzcGF0aEVudHJ5IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShTdHJpbmcgYWJzb2x1dGVQYXRoKSB7Ci0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsKCk7Ci0JCWVudHJ5LnNldEFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhbGwgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIHRvIGFic29sdXRlIHBhdGhzCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJpZXMoU3RyaW5nW10gZW50cmllcywgU3RyaW5nIHBhcmVudFBhdGgpIHsKLQotCQlMaXN0IGFMaXN0ID0gbmV3IEFycmF5TGlzdChlbnRyaWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCS8qCi0JCQkgKiBBZGRlZCBmb3IgbG9vc2UgbW9kdWxlIHN1cHBvcnQgLSBpZiB0aGUgY2FuYW5vbmljYWxpemVkIGVudHJ5IHJlc29sdmVzIHRvIGFuIGFyY2hpdmUKLQkJCSAqIGluIHRoZSBjb250YWluaW5nIGVhciwgdGhlbiBhZGQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhhdCBhcmNoaXZlCi0JCQkgKi8KLQkJCUFyY2hpdmUgZGVwZW5kZW50SmFyID0gcmVzb2x2ZUNsYXNzcGF0aEVudHJ5SW5FQVIoZW50cnkpOwotCQkJaWYgKGRlcGVuZGVudEphciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUnVudGltZUNsYXNzcGF0aEVudHJ5IHJ1bkVudHJ5ID0gY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KGRlcGVuZGVudEphci5nZXRCaW5hcmllc1BhdGgoKSwgZW50cnkpOwotCQkJCQlydW5FbnRyeS5zZXRSZWZlcmVuY2VkQXJjaGl2ZShkZXBlbmRlbnRKYXIpOwotCQkJCQlhTGlzdC5hZGQocnVuRW50cnkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gc2hvdWxkbnRIYXBwZW5JblJ1bnRpbWUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCQkvL090aGVyd2lzZSwgY29tcHV0ZSB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW50cnkgcmVsYXRpdmUgdG8KLQkJCS8vIHRoaXMgamFyCi0JCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGVudHJ5KTsKLQkJCVN0cmluZyBhYnNQYXRoID0gbnVsbDsKLQkJCWlmIChhRmlsZS5pc0Fic29sdXRlKCkpCi0JCQkJYWJzUGF0aCA9IGFGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJZWxzZSB7Ci0JCQkJYWJzUGF0aCA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKHBhcmVudFBhdGgsIGVudHJ5KTsKLQkJCQlhYnNQYXRoID0gQ2xhc3NwYXRoVXRpbC5ub3JtYWxpemVQYXRoKGFic1BhdGgpOwotCQkJfQotCQkJYUxpc3QuYWRkKGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShhYnNQYXRoLCBlbnRyeSkpOwotCQl9Ci0KLQkJcmV0dXJuIGFMaXN0OwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnkgY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KFN0cmluZyBhYnNvbHV0ZVBhdGgsIFN0cmluZyBtYW5pZmVzdFZhbHVlKSB7Ci0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShhYnNvbHV0ZVBhdGgpOwotCQllbnRyeS5zZXRNYW5pZmVzdFZhbHVlKG1hbmlmZXN0VmFsdWUpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JEaXJlY3RvcnkoamF2YS5pby5GaWxlIGRpciwgaW50IGV4cGFuc2lvbkZsYWdzKSB7Ci0JCXJldHVybiBuZXcgRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbChkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGV4cGFuc2lvbkZsYWdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZVNhdmVTdHJhdGVneUZvckRpcmVjdG9yeShTdHJpbmcgYVVyaSwgaW50IGV4cGFuc2lvbkZsYWdzKSB7Ci0JCXJldHVybiBuZXcgRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbChhVXJpLCBleHBhbnNpb25GbGFncyk7Ci0JfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JKYXIoamF2YS5pby5GaWxlIGFGaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZS5leGlzdHMoKSAmJiBhRmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJmaWxlX2V4aXN0X2FzX2Rpcl9FWENfIiwgKG5ldyBPYmplY3RbXXthRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0pKSk7Ly8kTk9OLU5MUy0xJCA9ICJBIGZpbGUgbmFtZWQgezB9IGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnkiCi0JCWphdmEuaW8uRmlsZSBwYXJlbnQgPSBhRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0ID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShhRmlsZSk7Ci0JCXJldHVybiBuZXcgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChvdXQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdChpbnQgZXhwYW5zaW9uRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uIHsKLQkJZXh0cmFjdE5vUmVvcGVuKGV4cGFuc2lvbkZsYWdzKTsKLQkJcmVvcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0Tm9SZW9wZW4oaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgYVVyaSA9IGdldFVSSSgpOwotCQlqYXZhLmlvLkZpbGUgYURpciA9IG5ldyBqYXZhLmlvLkZpbGUoYVVyaSk7Ci0JCWJvb2xlYW4gaW5Vc2UgPSBnZXRMb2FkU3RyYXRlZ3koKS5pc1VzaW5nKGFEaXIpOwotCi0JCXRyeSB7Ci0JCQlqYXZhLmlvLkZpbGUgZGVzdGluYXRpb25EaXIgPSBpblVzZSA/IEFyY2hpdmVVdGlsLmNyZWF0ZVRlbXBEaXJlY3RvcnkoYVVyaSwgYURpci5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGFyZW50RmlsZSgpKSA6IGFEaXI7Ci0JCQlTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSA9IGNyZWF0ZVNhdmVTdHJhdGVneUZvckRpcmVjdG9yeShkZXN0aW5hdGlvbkRpciwgZXhwYW5zaW9uRmxhZ3MpOwotCQkJc2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQkJCWFTYXZlU3RyYXRlZ3kuY2xvc2UoKTsKLQkJCWNsb3NlKCk7Ci0JCQlpZiAoaW5Vc2UpIHsKLQkJCQljbGVhbnVwQWZ0ZXJUZW1wU2F2ZShhVXJpLCBhRGlyLCBkZXN0aW5hdGlvbkRpcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3Jfc2F2aW5nX0VYQ18iLCAobmV3IE9iamVjdFtde3VyaX0pKSwgZXgpOyAvLyROT04tTkxTLTEkID0gIkVycm9yIHNhdmluZyAiCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIGV4dHJhY3RUbyhqYXZhLmxhbmcuU3RyaW5nIGFVcmksIGludCBleHBhbnNpb25GbGFncykgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJamF2YS5pby5GaWxlIGFEaXIgPSBuZXcgamF2YS5pby5GaWxlKGFVcmkpOwotCQlpZiAoZ2V0TG9hZFN0cmF0ZWd5KCkuaXNVc2luZyhhRGlyKSkKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXh0cmFjdF9kZXN0aW5hdGlvbl9pc190aGVfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJFeHRyYWN0IGRlc3RpbmF0aW9uIGlzIHRoZSBzYW1lIHBhdGggYXMgc291cmNlIGZpbGUiCi0KLQkJdHJ5IHsKLQkJCVNhdmVTdHJhdGVneSBhU2F2ZVN0cmF0ZWd5ID0gY3JlYXRlU2F2ZVN0cmF0ZWd5Rm9yRGlyZWN0b3J5KGFEaXIsIGV4cGFuc2lvbkZsYWdzKTsKLQkJCXNhdmUoYVNhdmVTdHJhdGVneSk7Ci0JCQlhU2F2ZVN0cmF0ZWd5LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3Jfc2F2aW5nX0VYQ18iLCAobmV3IE9iamVjdFtde2FVcml9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvciBzYXZpbmcgIgotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZmlsdGVyRmlsZXNCeVByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBmaWx0ZXJGaWxlcyhwcmVmaXgsIG51bGwpOwotCX0KLQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmaWx0ZXJGaWxlcyhTdHJpbmcgcHJlZml4LCBTdHJpbmdbXSBzdWZmaXhlcykgewotCQlMaXN0IHN1YnNldCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0aGVGaWxlcyA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgdGhlRmlsZXMuZ2V0KGkpOwotCQkJaWYgKCFhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkgJiYgYUZpbGUuZ2V0VVJJKCkuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCWlmIChzdWZmaXhlcyA9PSBudWxsIHx8IGhhc1N1ZmZpeChhRmlsZS5nZXRVUkkoKSwgc3VmZml4ZXMpKQotCQkJCQlzdWJzZXQuYWRkKGFGaWxlKTsKLQkJfQotCQlyZXR1cm4gc3Vic2V0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gc3VmZml4ZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1N1ZmZpeChTdHJpbmcgYVVyaSwgU3RyaW5nW10gc3VmZml4ZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFVcmkuZW5kc1dpdGgoc3VmZml4ZXNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZmlsdGVyRmlsZXNXaXRob3V0UHJlZml4KFN0cmluZ1tdIHByZWZpeGVzKSB7Ci0JCUxpc3Qgc3Vic2V0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZUZpbGVzID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVGaWxlcy5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSB0aGVGaWxlcy5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpKQotCQkJCWNvbnRpbnVlOwotCQkJYm9vbGVhbiBzaG91bGRBZGQgPSB0cnVlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcmVmaXhlcy5sZW5ndGg7IGorKykgewotCQkJCWlmIChhRmlsZS5nZXRVUkkoKS5zdGFydHNXaXRoKHByZWZpeGVzW2pdKSkgewotCQkJCQlzaG91bGRBZGQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNob3VsZEFkZCkKLQkJCQlzdWJzZXQuYWRkKGFGaWxlKTsKLQkJfQotCQlyZXR1cm4gc3Vic2V0OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldEFyY2hpdmVDbGFzc0xvYWRlcigpIHsKLQkJaWYgKGFyY2hpdmVDbGFzc0xvYWRlciA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUNsYXNzTG9hZGVyKCk7Ci0JCXJldHVybiBhcmNoaXZlQ2xhc3NMb2FkZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QXJjaGl2ZUZpbGVzKCkgewotCQlMaXN0IGFyY2hpdmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkpIHsKLQkJCQlhcmNoaXZlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcmNoaXZlczsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0aGUgbWFuaWZlc3QgY2xhc3MgcGF0aCBhbmQgdGhlIGV4dHJhIGNsYXNzIHBhdGgsIGFuZCBpbnN0YW50aWF0ZSBhIFVSTCBjbGFzc2xvYWRlciwKLQkgKiB3aXRoIGEgcGFyZW50IG9mIHRoZSBhcmNoaXZlQ2xhc3NMb2FkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NQYXRoQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50Q2wpIHsKLQotCQlMaXN0IGNsYXNzUGF0aENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChnZXRNYW5pZmVzdCgpICE9IG51bGwpCi0JCQljbGFzc1BhdGhDb21wb25lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCkpKTsKLQkJU3RyaW5nIGV4dHJhQ3AgPSBnZXRFeHRyYUNsYXNzcGF0aCgpOwotCQlpZiAoZXh0cmFDcCAhPSBudWxsKQotCQkJY2xhc3NQYXRoQ29tcG9uZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChBcmNoaXZlVXRpbC5nZXRUb2tlbnMoZXh0cmFDcCwgIjsiKSkpOy8vJE5PTi1OTFMtMSQKLQotCQlqYXZhLm5ldC5VUkxbXSB1cmxBcnJheSA9IEFyY2hpdmVVdGlsLnRvTG9jYWxVUkxzKGNsYXNzUGF0aENvbXBvbmVudHMsIGdldFJvb3RGb3JSZWxhdGl2ZURlcGVuZGVudEphcnMoKSk7Ci0JCXJldHVybiBuZXcgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIodXJsQXJyYXksIHBhcmVudENsKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSBwYXJlbnQgZm9yIHRoZSBjdXN0b20gY2xhc3MgbG9hZGVyIHVzZWQgYnkgdGhpcyBhcmNoaXZlCi0JICovCi0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGdldERlZmF1bHRDbGFzc0xvYWRlcigpIHsKLQkJQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0JCXJldHVybiBwbHVnaW5DbGFzc0xvYWRlciA9PSBudWxsID8gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSA6IHBsdWdpbkNsYXNzTG9hZGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5TZXQgZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCkgewotCQlyZXR1cm4gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5nZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGFsbCB0aGUgY2xhc3NwYXRoIGVudHJpZXMgdG8gYWJzb2x1dGUgcGF0aHMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFbnRyaWVzQXNBYnNvbHV0ZVBhdGhzKFN0cmluZ1tdIGVudHJpZXMsIFN0cmluZyBwYXJlbnRQYXRoKSB7Ci0KLQkJTGlzdCBhTGlzdCA9IG5ldyBBcnJheUxpc3QoZW50cmllcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkvKgotCQkJICogQWRkZWQgZm9yIGxvb3NlIG1vZHVsZSBzdXBwb3J0IC0gaWYgdGhlIGNhbmFub25pY2FsaXplZCBlbnRyeSByZXNvbHZlcyB0byBhbiBhcmNoaXZlCi0JCQkgKiBpbiB0aGUgY29udGFpbmluZyBlYXIsIHRoZW4gYWRkIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoYXQgYXJjaGl2ZQotCQkJICovCi0JCQlBcmNoaXZlIGRlcGVuZGVudEphciA9IHJlc29sdmVDbGFzc3BhdGhFbnRyeUluRUFSKGVudHJ5KTsKLQkJCWlmIChkZXBlbmRlbnRKYXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWFMaXN0LmFkZChkZXBlbmRlbnRKYXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gc2hvdWxkbnRIYXBwZW5JblJ1bnRpbWUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCQkvL090aGVyd2lzZSwgY29tcHV0ZSB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW50cnkgcmVsYXRpdmUgdG8KLQkJCS8vIHRoaXMgamFyCi0JCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGVudHJ5KTsKLQkJCWlmIChhRmlsZS5pc0Fic29sdXRlKCkpCi0JCQkJYUxpc3QuYWRkKGFGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWVsc2UKLQkJCQlhTGlzdC5hZGQoQXJjaGl2ZVV0aWwuZ2V0T1NVcmkocGFyZW50UGF0aCwgZW50cnkpKTsKLQkJfQotCi0JCXJldHVybiBhTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0cmFDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBleHRyYUNsYXNzcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGZyYW1ld29yaywgc3BlY2lmaWNhbGx5IGFzIGFuIG9wdGltaXphdGlvbiB3aGVuIHNhdmluZy9leHBsb2RpbmcKLQkgKiBhcmNoaXZlcyB3aXRoIG5lc3RlZCBhcmNoaXZlcwotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvciBnZXRGaWxlc0ZvclNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0RmlsZUl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWlmIChnZXRMb2FkaW5nQ29udGFpbmVyKCkgIT0gbnVsbCB8fCBnZXRMb2FkU3RyYXRlZ3koKSA9PSBudWxsIHx8IGdldExvYWRTdHJhdGVneSgpLmlzRGlyZWN0b3J5KCkpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0SW5wdXRTdHJlYW0oKTsKLQotCQkvL1RoaXMgYXJjaGl2ZSB3YXMgY29waWVkIGluOyB0aGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvcgotCQkvLyBtb2R1bGUgZmlsZXMKLQkJaWYgKGlzTW9kdWxlRmlsZSgpIHx8ICFnZXRPcHRpb25zKCkuaXNTYXZlTGlicmFyaWVzQXNGaWxlcygpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmRlZmluZWQgc3RhdGUgb2YgbmVzdGVkIGFyY2hpdmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vV2UgaGF2ZSB0byBmaW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBvcmlnaW5hbCBhcmNoaXZlIGZyb20gd2hpY2gKLQkJLy8gdGhpcyB3YXMgY29waWVkLAotCQkvL2lmIGl0IGlzIGtub3duCi0KLQkJTGlzdCBsaXN0ID0gZ2V0RmlsZXMoKTsKLQotCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpKQotCQkJCWNvbnRpbnVlOwotCQkJYWJzb2x1dGVQYXRoID0gYUZpbGUuZ2V0TG9hZGluZ0NvbnRhaW5lcigpLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oYWJzb2x1dGVQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExvYWRTdHJhdGVneSNnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgYVVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldFJlc291cmNlSW5wdXRTdHJlYW0oYVVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFKREtBZGFwdGVyRmFjdG9yeSBnZXRKYXZhQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSmF2YUpES0FkYXB0ZXJGYWN0b3J5KSBFY29yZVV0aWwuZ2V0QWRhcHRlckZhY3RvcnkoZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRBZGFwdGVyRmFjdG9yaWVzKCksIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZSByZXR1cm5zIGFuIGltbXV0YWJsZSBjb2xsZWN0aW9uIG9mIHRoZSBsb2FkZWQKLQkgKiAgICAgIHJlc291cmNlcyBpbiB0aGUgcmVzb3VyY2Ugc2V0Ci0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0IGdldE1hbmlmZXN0KCkgewotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkgewotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbiA9IGdldElucHV0U3RyZWFtKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJCQltYWtlTWFuaWZlc3QoaW4pOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkJbWFrZU1hbmlmZXN0KCk7Ci0JCQl9IGNhdGNoIChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCQlXcmFwcGVkRXhjZXB0aW9uIHdyYXBFeCA9IG5ldyBXcmFwcGVkRXhjZXB0aW9uKChleCkuZ2V0V3JhcHBlZEV4Y2VwdGlvbigpKTsKLQkJCQlpZiAoRXh0ZW5kZWRFY29yZVV0aWwuZ2V0RmlsZU5vdEZvdW5kRGV0ZWN0b3IoKS5pc0ZpbGVOb3RGb3VuZCh3cmFwRXgpKQotCQkJCQltYWtlTWFuaWZlc3QoKTsKLQkJCQllbHNlCi0JCQkJCXRocm93IG5ldyBNYW5pZmVzdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiaW9fZXhfbWFuaWZlc3RfRVhDXyIsIChuZXcgT2JqZWN0W117Z2V0VVJJKCl9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJBbiBJT0V4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHRoZSBtYW5pZmVzdDogIgotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgTWFuaWZlc3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImlvX2V4X21hbmlmZXN0X0VYQ18iLCAobmV3IE9iamVjdFtde2dldFVSSSgpfSkpLCBleCk7IC8vJE5PTi1OTFMtMSQgPSAiQW4gSU9FeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyB0aGUgbWFuaWZlc3Q6ICIKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlpbi5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCQkJCS8vSWdub3JlCi0JCQkJCX0KLQkJCX0KLQkJfQotCQkvL1RoaXMgaXMgYSBoYWNrIGJlY2F1c2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgbWFuaWZlc3QgZG9lcyBub3QKLQkJLy8gc2VyaWFsaXplIGNvcnJlY3RseSBpZgotCQkvL1RoZSB2ZXJzaW9uIGlzIG5vdCBzZXQuIEluIGFkZGl0aW9uIHRvIHNhdmVzLCB0aGUgc2VyaWFsaXphdGlvbiBpcwotCQkvLyB1c2VkIGZvciBjb3B5Ci0JCWlmIChtYW5pZmVzdC5nZXRNYW5pZmVzdFZlcnNpb24oKSA9PSBudWxsIHx8IG1hbmlmZXN0LmdldE1hbmlmZXN0VmVyc2lvbigpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCW1hbmlmZXN0LnNldE1hbmlmZXN0VmVyc2lvbigiMS4wIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGdldE1vZlJlc291cmNlKGphdmEubGFuZy5TdHJpbmcgYVVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldE1vZlJlc291cmNlKGFVcmkpOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZU1ha2VJZk5lY2Vzc2FyeShTdHJpbmcgYVVyaSkgewotCQlpZiAoZ2V0TG9hZFN0cmF0ZWd5KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZSA9IGdldE1vZlJlc291cmNlKGFVcmkpOwotCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZSA9IG1ha2VNb2ZSZXNvdXJjZShhVXJpKTsKLQkJCX0gY2F0Y2ggKER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiBkb3gpIHsKLQkJCQkvL1dlIGp1c3QgY2hlY2tlZCBmb3IgdGhpczsgaXQgd29uJ3QgaGFwcGVuCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zIGdldE9wdGlvbnMoKSB7Ci0JCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGxvb2tpbmcgYXQgdGhlIGNsYXNzIHBhdGggb2YgdGhpcyBqYXIgKGZyb20gdGhlIG1hbmlmZXN0KSwgc29tZSBvZiB0aGUgZWxlbWVudHMgbWF5IGhhdmUKLQkgKiBhIHJlbGF0aXZlIHBhdGgsIHRodXMgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIGluc3RhbGwgbG9jYXRpb24gb2YgdGhpcyBqYXIuIElmIHRoZSBhYnNvbHV0ZQotCSAqIHBhdGggZnJvbSB3aGljaCB0aGUgYXJjaGl2ZSB3YXMgbG9hZGVkLCByZXR1cm4gdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhhdCBwYXRoOyBvdGhlcndpc2UsCi0JICogc2VlIGlmIHRoZSBjb250YWluaW5nIGFyY2hpdmUgaGFzIGFuIGFic29sdXRlIHBhdGg7IGlmIG5laXRoZXIgd29yaywgZGVmYXVsdCB0byB0aGUgY3VycmVudAotCSAqIHdvcmtpbmcgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb290Rm9yUmVsYXRpdmVEZXBlbmRlbnRKYXJzKCkgewotCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCUNvbnRhaW5lciB0aGVDb250YWluZXIgPSB0aGlzOwotCQl3aGlsZSAodGhlQ29udGFpbmVyICE9IG51bGwgJiYgcGF0aCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXBhdGggPSB0aGVDb250YWluZXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQkJdGhlQ29udGFpbmVyID0gdGhlQ29udGFpbmVyLmdldExvYWRpbmdDb250YWluZXIoKTsKLQkJfQotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChwYXRoID09IG51bGwpCi0JCQkJLy9BdCB0aGlzIHBvaW50IHdoYXQgZWxzZSBjYW4gd2UgZG8/Ci0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgamF2YS5pby5GaWxlKHBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBuZXcgamF2YS5pby5GaWxlKHBhdGgpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0UnVudGltZUNsYXNzUGF0aCgpIHsKLQotCQlTdHJpbmcgYWJzb2x1dGVQYXRoOwotCQl0cnkgewotCQkJYWJzb2x1dGVQYXRoID0gZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCi0JCUxpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZW50cmllcy5hZGQoYWJzb2x1dGVQYXRoKTsKLQotCQlTdHJpbmcgcGFyZW50UGF0aCA9IG5ldyBqYXZhLmlvLkZpbGUoYWJzb2x1dGVQYXRoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCVN0cmluZ1tdIG1mRW50cmllcyA9IGdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCWVudHJpZXMuYWRkQWxsKGdldEVudHJpZXNBc0Fic29sdXRlUGF0aHMobWZFbnRyaWVzLCBwYXJlbnRQYXRoKSk7Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgZW50cmllcy50b0FycmF5KG5ldyBTdHJpbmdbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBPcHRpb25hbCBmaWx0ZXIgZm9yIHNhdmluZyBhIHN1YnNldCBvZiBmaWxlczsgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCBmb3IgYWxsIHNhdmUgYW5kIGV4dHJhY3QKLQkgKiBpbnZva2F0aW9ucwotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXIgZ2V0U2F2ZUZpbHRlcigpIHsKLQkJcmV0dXJuIHNhdmVGaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDQvMDAgMzozMTozMiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneSBnZXRTYXZlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBzYXZlU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRYbWxFbmNvZGluZygpIHsKLQkJcmV0dXJuIHhtbEVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmc7IHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUFmdGVyT3BlbigpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNsYXNzTG9hZGVyKCkgewotCQkvL1NvbWUgbG9hZCBzdHJhdGVnaWVzIG1heSBwcm92aWRlIGEgbW9mIGNvbnRleHQgZm9yIHdoaWNoCi0JCS8vYW4gYWx0ZXJuYXRlIGNsYXNzIGxvYWRlciBpcyBub3QgbmVjZXNzYXJ5Ci0JCWlmICghc2hvdWxkVXNlSmF2YVJlZmxlY3Rpb24oKSkKLQkJCXJldHVybjsKLQkJQ2xhc3NMb2FkZXIgZXh0cmFDbCA9IG51bGw7Ci0JCUNsYXNzTG9hZGVyIGRlZmF1bHRDbCA9IGdldERlZmF1bHRDbGFzc0xvYWRlcigpOwotCQlpZiAoZ2V0Q29udGFpbmVyKCkgPT0gbnVsbCB8fCAhZ2V0Q29udGFpbmVyKCkuaXNFQVJGaWxlKCkpCi0JCQlleHRyYUNsID0gZ2V0Q2xhc3NQYXRoQ2xhc3NMb2FkZXIoZGVmYXVsdENsKTsKLQkJQ2xhc3NMb2FkZXIgY2wgPSBjcmVhdGVEeW5hbWljQ2xhc3NMb2FkZXIoZGVmYXVsdENsLCBleHRyYUNsKTsKLQkJc2V0QXJjaGl2ZUNsYXNzTG9hZGVyKGNsKTsKLQkJSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRKYXZhQWRhcHRlckZhY3RvcnkoKTsKLQkJZmFjdG9yeS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2wpOwotCQlmYWN0b3J5LmZsdXNoQWxsKCk7Ci0JfQotCi0JcHVibGljIENsYXNzTG9hZGVyIGNyZWF0ZUR5bmFtaWNDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCkgewotCQlyZXR1cm4gbmV3IEFyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyKHRoaXMsIHBhcmVudENsLCBleHRyYUNsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0R1cGxpY2F0ZShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zRmlsZShhVXJpKSB8fCBpc01vZlJlc291cmNlTG9hZGVkKGFVcmkpIHx8IEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJLmVxdWFscyhhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFuaWZlc3RTZXQoKSB7Ci0JCXJldHVybiBtYW5pZmVzdCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2ZSZXNvdXJjZUxvYWRlZChqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmlzTW9mUmVzb3VyY2VMb2FkZWQoYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBqdXN0IHRlc3QgdGhlIGV4dGVuc2lvbiBvZiB0aGUgdXJpIGZvciBvbmUgb2YgdGhlIGtub3duIGFyY2hpdmUgdHlwZXM7IHN1YmNsYXNzZXMKLQkgKiBtYXkgd2hpY2ggdG8gb3ZlcnJpZGUuCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05lc3RlZEFyY2hpdmUoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB7Ci0JCS8vMTEwMzkwLjMgRXJyb3IgbG9hZGluZyBhbHQtYmluZGluZ3MKLQkJLyoKLQkJICogRG9uJ3QgaW5mZXIgdGhhdCBhIGZvbGRlciB3aGljaCBlbmRzIHdpdGggLmphciBpcyBhbiBleHBsb2RlZCBhcmNoaXZlOyBFQVIgZmlsZSB3aWxsIGRvCi0JCSAqIHRoYXQgSUYgdGhlIGZvbGRlciBpcyBkZWNsYXJlZCBhcyBhIG1vZHVsZSBpbiB0aGUgRUFSCi0JCSAqLwotCQlpZiAoZ2V0TG9hZFN0cmF0ZWd5KCkuaXNEaXJlY3RvcnkoKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcGF0aCA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKGdldEFic29sdXRlUGF0aCgpLCBhVXJpKTsKLQkJCQlqYXZhLmlvLkZpbGUgaW9GaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTsKLQkJCQlpZiAoIWlvRmlsZS5leGlzdHMoKSB8fCAoaW9GaWxlLmlzRGlyZWN0b3J5KCkgJiYgYVVyaS5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuQUxUX0lORikpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkuSU5TVEFOQ0UuaXNLbm93bkFyY2hpdmVUeXBlKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkgIT0gbnVsbCAmJiBnZXRMb2FkU3RyYXRlZ3koKS5pc09wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0IG1ha2VNYW5pZmVzdCgpIHsKLQkJQXJjaGl2ZU1hbmlmZXN0IG1mID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoKTsKLQkJc2V0TWFuaWZlc3QobWYpOwotCQlyZXR1cm4gbWY7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdCBtYWtlTWFuaWZlc3QoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUFyY2hpdmVNYW5pZmVzdCBtZiA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKGluKTsKLQkJc2V0TWFuaWZlc3QobWYpOwotCQlyZXR1cm4gbWY7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIG1ha2VNb2ZSZXNvdXJjZShTdHJpbmcgYVVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtYWtlTW9mUmVzb3VyY2UoYVVyaSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUjbWFrZU1vZlJlc291cmNlKFN0cmluZywgRUxpc3QpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VNb2ZSZXNvdXJjZShTdHJpbmcgYVVyaSwgRUxpc3QgZXh0ZW50KSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGlzRHVwbGljYXRlKGFVcmkpKQotCQkJdGhyb3cgbmV3IER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZHVwbGljYXRlX2VudHJ5X0VYQ18iLCAobmV3IE9iamVjdFtde2FVcmksIGdldFVSSSgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJBIGZpbGUgb3IgcmVzb3VyY2Ugd2l0aCB1cmkgezB9IGFscmVhZHkgZXhpc3RzIGluIHRoZSBhcmNoaXZlIG5hbWVkIHsxfSIKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLm1ha2VNb2ZSZXNvdXJjZShhVXJpLCBleHRlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKFN0cmluZyBhVXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5vcGVuTmVzdGVkQXJjaGl2ZShhVXJpLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW5OZXN0ZWRBcmNoaXZlKGxvb3NlLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBleHRyYSBjbGFzcyBwYXRoIHdpdGggbm8gcmVmcmVzaCBvZiB0aGUgY2xhc3MgbG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVNldEV4dHJhQ2xhc3NwYXRoKGphdmEubGFuZy5TdHJpbmcgbmV3RXh0cmFDbGFzc3BhdGgpIHsKLQkJZXh0cmFDbGFzc3BhdGggPSBuZXdFeHRyYUNsYXNzcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgYXJjaGl2ZSBjbGFzcyBsb2FkZXIgdG8gcHJldmVudCBnYyBwcm9ibGVtcyBvciBwcm9ibGVtcyB3aXRoIHRlbXAKLQkgKiBmaWxlcyBub3QgZ2V0dGluZyBkZWxldGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUNsYXNzTG9hZGVyKCkgewotCQlpZiAoYXJjaGl2ZUNsYXNzTG9hZGVyICE9IG51bGwpIHsKLQkJCXNldEFyY2hpdmVDbGFzc0xvYWRlcihudWxsKTsKLQkJCWdldEphdmFBZGFwdGVyRmFjdG9yeSgpLnNldENvbnRleHRDbGFzc0xvYWRlcihudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKEZpbGUgYUZpbGUpIHsKLQkJZ2V0RmlsZXMoKS5yZW1vdmUoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgcmVvcGVuKCkgdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbiB7Ci0JCXJlb3BlbihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlb3BlbihBcmNoaXZlIHBhcmVudCkgdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbiB7Ci0JCUxvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFMb2FkU3RyYXRlZ3kgPSBjcmVhdGVMb2FkU3RyYXRlZ3lGb3JSZW9wZW4ocGFyZW50KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSZW9wZW5FeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImlvX2V4X3Jlb3Blbl9FWENfIiwgKG5ldyBPYmplY3RbXXtnZXRVUkkoKX0pKSwgZXgpOyAvLyROT04tTkxTLTEkID0gIklPRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlb3BlbmluZyAiCi0JCX0KLQkJLy9QUTU0NTcyCi0JCUxvYWRTdHJhdGVneSBjdXJyZW50ID0gZ2V0TG9hZFN0cmF0ZWd5KCk7Ci0JCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCWFMb2FkU3RyYXRlZ3kuc2V0UmVzb3VyY2VTZXQoY3VycmVudC5wcmltR2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkvKgotCQkJICogZml4aW5nIHByb2JsZW0gd2l0aCBvcnBoYW5lZCBsb2FkIHN0cmF0ZWd5IGxpc3RlbmluZyB0byB0aGUgcmVzb3VyY2Ugc2V0Ci0JCQkgKi8KLQkJCWN1cnJlbnQuc2V0UmVzb3VyY2VTZXQobnVsbCk7Ci0JCX0KLQotCQlzZXRMb2FkU3RyYXRlZ3koYUxvYWRTdHJhdGVneSk7Ci0JCWluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCQlpZiAoIWlzSW5kZXhlZCgpKQotCQkJcmV0dXJuOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBmID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWYuc2V0T3JpZ2luYWxVUkkoZi5nZXRVUkkoKSk7Ci0JCQlmLnNldExvYWRpbmdDb250YWluZXIodGhpcyk7Ci0JCQlpZiAoZi5pc0FyY2hpdmUoKSkKLQkJCQkoKEFyY2hpdmUpIGYpLnJlb3Blbih0aGlzKTsKLQkJfQotCQlnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmFyY2hpdmVPcGVuZWQodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVJvb3QoUmVzb3VyY2UgYVJlc291cmNlLCBFT2JqZWN0IHJvb3QpIHsKLQkJaWYgKGFSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlFTGlzdCBleHRlbnQgPSBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJRU9iamVjdCBleGlzdGluZ1Jvb3QgPSBudWxsOwotCQlpZiAoIWV4dGVudC5pc0VtcHR5KCkpIHsKLQkJCWV4aXN0aW5nUm9vdCA9IChFT2JqZWN0KSBleHRlbnQuZ2V0KDApOwotCQkJaWYgKGV4aXN0aW5nUm9vdCA9PSByb290KQotCQkJCXJldHVybjsKLQkJCWV4dGVudC5yZW1vdmUoMCk7Ci0JCX0KLQkJaWYgKHJvb3QgIT0gbnVsbCkKLQkJCWV4dGVudC5hZGQoMCwgcm9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgcmVzb2x2ZUNsYXNzcGF0aEVudHJ5SW5FQVIoU3RyaW5nIGVudHJ5KSB7Ci0JCS8qCi0JCSAqIEFkZGVkIHRvIHN1cHBvcnQgcnVudGltZSBjbGFzc3BhdGggZm9yIGxvb3NlIG1vZHVsZXMKLQkJICovCi0JCUNvbnRhaW5lciBwYXJlbnQgPSBnZXRDb250YWluZXIoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8ICFwYXJlbnQuaXNFQVJGaWxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgYVVyaSA9IEFyY2hpdmVVdGlsLmRlcml2ZUVBUlJlbGF0aXZlVVJJKGVudHJ5LCB0aGlzKTsKLQkJaWYgKGFVcmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUZpbGUgYUZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJYUZpbGUgPSBwYXJlbnQuZ2V0RmlsZShhVXJpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBhRmlsZS5pc0FyY2hpdmUoKSA/IChBcmNoaXZlKSBhRmlsZSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBSZW9wZW5FeGNlcHRpb24gewotCQlzYXZlQXMoZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3kgYVN0cmF0ZWd5KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlzZXRTYXZlU3RyYXRlZ3koYVN0cmF0ZWd5KTsKLQkJU2F2ZUZpbHRlciBleGlzdGluZ0ZpbHRlciA9IGFTdHJhdGVneS5nZXRGaWx0ZXIoKTsKLQkJYm9vbGVhbiBvbGREZWxpdmVyeSA9IGVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0T3B0aW9ucygpLmlzUmVhZE9ubHkoKSkKLQkJCQllU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQlhU3RyYXRlZ3kuc2V0RmlsdGVyKGdldFNhdmVGaWx0ZXIoKSk7Ci0JCQlhU3RyYXRlZ3kuc2F2ZSgpOwotCQkJdHJ5IHsKLQkJCQlhU3RyYXRlZ3kuZmluaXNoKCk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlveCkgewotCQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihnZXRVUkkoKSwgaW94KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vV2UgaGF2ZSB0byBsZWF2ZSB0aGUgZmlsZSBpbmRleCBpZiB3ZSBhcmUgYSBkaXJlY3RvcnkgYmVjYXVzZSB3ZQotCQkJLy8gbWlnaHQgaGF2ZQotCQkJLy9vcGVuIGZpbGUgaGFuZGxlcyB0byBhcmNoaXZlcwotCQkJaWYgKGdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCkgJiYgIWdldExvYWRTdHJhdGVneSgpLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlmaWxlcy5jbGVhcigpOwotCQkJCS8vKChCYXNpY0VMaXN0KWZpbGVzKS5zZXRMaXN0SW1wbGVtZW50YXRpb24obmV3IEFycmF5TGlzdCgwKSk7Ci0JCQkJZVNldERlbGl2ZXIob2xkRGVsaXZlcnkpOwotCQkJCWVBZGFwdGVycygpLnJlbW92ZShnZXRGaWxlSW5kZXhBZGFwdGVyKCkpOwotCQkJCWZpbGVJbmRleEFkYXB0ZXIgPSBudWxsOwotCQkJCWZpbGVJbmRleCA9IG51bGw7Ci0JCQl9Ci0JCQlzZXRTYXZlU3RyYXRlZ3kobnVsbCk7Ci0JCQlhU3RyYXRlZ3kuc2V0RmlsdGVyKGV4aXN0aW5nRmlsdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUFzKFN0cmluZyBhVXJpKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIFJlb3BlbkV4Y2VwdGlvbiB7Ci0JCXNhdmVBc05vUmVvcGVuKGFVcmkpOwotCQlyZW9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBjYW4gcmVuYW1lIGl0IHRoZW4gd2UgY2FuIGRlbGV0ZSBpdAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVuYW1lYWJsZShqYXZhLmlvLkZpbGUgb3JpZykgewotCQlqYXZhLmlvLkZpbGUgb3JpZ0NvcHkxID0gbnVsbDsKLQkJamF2YS5pby5GaWxlIG9yaWdDb3B5MiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlvcmlnQ29weTEgPSBvcmlnLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCW9yaWdDb3B5MiA9IG9yaWcuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlTdHJpbmcgYmFzZU5hbWUgPSAic2F2ZS50bXAiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpZiAob3JpZy5nZXRQYXJlbnQoKSAhPSBudWxsKQotCQkJCWJhc2VOYW1lID0gbmV3IGphdmEuaW8uRmlsZShvcmlnLmdldFBhcmVudCgpLCBiYXNlTmFtZSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlqYXZhLmlvLkZpbGUgdGVtcCA9IG51bGw7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWRvIHsKLQkJCW5hbWUgPSBiYXNlTmFtZSArIGluZGV4OwotCQkJdGVtcCA9IG5ldyBqYXZhLmlvLkZpbGUobmFtZSk7Ci0JCQlpbmRleCsrOwotCQl9IHdoaWxlICh0ZW1wLmV4aXN0cygpKTsKLQkJcmV0dXJuIG9yaWdDb3B5MS5yZW5hbWVUbyh0ZW1wKSAmJiB0ZW1wLnJlbmFtZVRvKG9yaWdDb3B5Mik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tXcml0ZWFibGUoamF2YS5pby5GaWxlIGRlc3QpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgbG9ja2VkID0gQXJjaGl2ZVV0aWwuZ2V0V3JpdGVQcm90ZWN0ZWRGaWxlcyhkZXN0LCBudWxsKTsKLQkJaWYgKGxvY2tlZC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJbXNnLmFwcGVuZCgiQ2Fubm90IHdyaXRlIHRvIGZpbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQoZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCW1zZy5hcHBlbmQoJ1xuJyk7Ci0JCW1zZy5hcHBlbmQoIk9uZSBvciBtb3JlIGZpbGVzIGlzIHdyaXRlIHByb3RlY3RlZCBvciBsb2NrZWQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZCgnXG4nKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NrZWQuc2l6ZSgpOyBpKyspIHsKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IChqYXZhLmlvLkZpbGUpIGxvY2tlZC5nZXQoaSk7Ci0JCQltc2cuYXBwZW5kKGFGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCW1zZy5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKG1zZy50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBc05vUmVvcGVuKFN0cmluZyBhVXJpKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGFVcmkpOwotCQljaGVja1dyaXRlYWJsZShhRmlsZSk7Ci0JCWJvb2xlYW4gZmlsZUV4aXN0ZWQgPSBhRmlsZS5leGlzdHMoKTsKLQkJLy9ib3RwIDE0MjE0OQotCQkvL2Jvb2xlYW4gaW5Vc2UgPSBnZXRMb2FkU3RyYXRlZ3koKS5pc1VzaW5nKGFGaWxlKTsKLQkJU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlqYXZhLmlvLkZpbGUgZGVzdGluYXRpb25GaWxlID0gZmlsZUV4aXN0ZWQgPyBBcmNoaXZlVXRpbC5jcmVhdGVUZW1wRmlsZShhVXJpLCBhRmlsZS5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGFyZW50RmlsZSgpKSA6IGFGaWxlOwotCQkJCWFTYXZlU3RyYXRlZ3kgPSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JKYXIoZGVzdGluYXRpb25GaWxlKTsKLQkJCQlzYXZlKGFTYXZlU3RyYXRlZ3kpOwotCQkJCWFTYXZlU3RyYXRlZ3kuY2xvc2UoKTsKLQkJCQl0aGlzLmNsb3NlKCk7Ci0JCQkJaWYgKGZpbGVFeGlzdGVkKSB7Ci0JCQkJCWNsZWFudXBBZnRlclRlbXBTYXZlKGFVcmksIGFGaWxlLCBkZXN0aW5hdGlvbkZpbGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3NhdmluZ19FWENfIiwgKG5ldyBPYmplY3RbXXthVXJpfSkpLCBleCk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3Igc2F2aW5nICIKLQkJCX0KLQkJfSBjYXRjaCAoU2F2ZUZhaWx1cmVFeGNlcHRpb24gZmFpbHVyZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoYVNhdmVTdHJhdGVneSAhPSBudWxsKQotCQkJCQlhU2F2ZVN0cmF0ZWd5LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB3ZVRyaWVkKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJCWlmICghZmlsZUV4aXN0ZWQpCi0JCQkJYUZpbGUuZGVsZXRlKCk7Ci0JCQl0aHJvdyBmYWlsdXJlOwotCQl9Ci0KLQkJc2V0VVJJKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU5vUmVvcGVuKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJc2F2ZUFzTm9SZW9wZW4oZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0FyY2hpdmVDbGFzc0xvYWRlcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZUNsYXNzTG9hZGVyKGphdmEubGFuZy5DbGFzc0xvYWRlciBuZXdBcmNoaXZlQ2xhc3NMb2FkZXIpIHsKLQkJYXJjaGl2ZUNsYXNzTG9hZGVyID0gbmV3QXJjaGl2ZUNsYXNzTG9hZGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4dHJhQ2xhc3NwYXRoCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0cmFDbGFzc3BhdGgoamF2YS5sYW5nLlN0cmluZyBuZXdFeHRyYUNsYXNzcGF0aCkgewotCQlwcmltU2V0RXh0cmFDbGFzc3BhdGgobmV3RXh0cmFDbGFzc3BhdGgpOwotCQkvL09wdGltaXphdGlvbiAtIG9ubHkgcmUgaW5pdCBpZiBhIGNsIGV4aXN0czsgb3RoZXJ3aXNlIGl0IHdpbGwgaW5pdCBvbgotCQkvLyBkZW1hbmQKLQkJaWYgKGFyY2hpdmVDbGFzc0xvYWRlciAhPSBudWxsKQotCQkJaW5pdGlhbGl6ZUNsYXNzTG9hZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChBcmNoaXZlTWFuaWZlc3QgbmV3TWFuaWZlc3QpIHsKLQkJbWFuaWZlc3QgPSBuZXdNYW5pZmVzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KGphdmEudXRpbC5qYXIuTWFuaWZlc3QgYU1hbmlmZXN0KSB7Ci0JCXNldE1hbmlmZXN0KChBcmNoaXZlTWFuaWZlc3QpIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdEltcGwoYU1hbmlmZXN0KSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgQ2xhc3MtcGF0aCBtYW5pZmVzdCBlbnRyeSwgcmVidWlsZHMgdGhlIGNsYXNzIGxvYWRlciwgYW5kIHJlZnJlc2hlcyBhbnkgcmVmbGVjdGVkCi0JICogamF2YSBjbGFzc2VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3RDbGFzc1BhdGhBbmRSZWZyZXNoKFN0cmluZyBjbGFzc3BhdGgpIHsKLQkJQXJjaGl2ZU1hbmlmZXN0IG1mID0gZ2V0TWFuaWZlc3QoKTsKLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLQkJCW1ha2VNYW5pZmVzdCgpOwotCQl9Ci0JCW1mLnNldENsYXNzUGF0aChjbGFzc3BhdGgpOwotCQkvL09wdGltaXphdGlvbiAtIG9ubHkgcmUgaW5pdCBpZiBhIGNsIGV4aXN0czsgb3RoZXJ3aXNlIGl0IHdpbGwgaW5pdCBvbgotCQkvLyBkZW1hbmQKLQkJaWYgKGFyY2hpdmVDbGFzc0xvYWRlciAhPSBudWxsKQotCQkJaW5pdGlhbGl6ZUNsYXNzTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9ucyhvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zIG5ld09wdGlvbnMpIHsKLQkJb3B0aW9ucyA9IG5ld09wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogT3B0aW9uYWwgZmlsdGVyIGZvciBzYXZpbmcgYSBzdWJzZXQgb2YgZmlsZXM7IGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgZm9yIGFsbCBzYXZlIGFuZCBleHRyYWN0Ci0JICogaW52b2thdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYXZlRmlsdGVyKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlciBuZXdTYXZlRmlsdGVyKSB7Ci0JCXNhdmVGaWx0ZXIgPSBuZXdTYXZlRmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA0LzAwIDM6MzE6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1NhdmVTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYXZlU3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5IG5ld1NhdmVTdHJhdGVneSkgewotCQlzYXZlU3RyYXRlZ3kgPSBuZXdTYXZlU3RyYXRlZ3k7Ci0JCWlmIChuZXdTYXZlU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJbmV3U2F2ZVN0cmF0ZWd5LnNldEFyY2hpdmUodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdYbWxFbmNvZGluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhtbEVuY29kaW5nKGphdmEubGFuZy5TdHJpbmcgbmV3WG1sRW5jb2RpbmcpIHsKLQkJeG1sRW5jb2RpbmcgPSBuZXdYbWxFbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgd2hldGhlciBqYXZhIHJlZmxlY3Rpb24gc2hvdWxkIGJlIHNldCB1cCBmb3IgdGhpcyBhcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlSmF2YVJlZmxlY3Rpb24oKSB7Ci0JCXJldHVybiBnZXRPcHRpb25zKCkudXNlSmF2YVJlZmxlY3Rpb24oKSAmJiBnZXRMb2FkU3RyYXRlZ3koKS5pc0NsYXNzTG9hZGVyTmVlZGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGhyb3dSZXNvdXJjZUxvYWRFeGNlcHRpb24oU3RyaW5nIHJlc291cmNlVXJpLCBFeGNlcHRpb24gZXgpIHRocm93cyBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJsb2FkX3Jlc291cmNlX0VYQ18iLCAobmV3IE9iamVjdFtde3Jlc291cmNlVXJpLCBnZXRVUkkoKX0pKSwgZXgpOyAvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCBsb2FkIHJlc291cmNlICJ7MH0iIGluIGFyY2hpdmUgInsxfSIiCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRSZXNvdXJjZXNQYXRoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldEJpbmFyaWVzUGF0aCgpOwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBlbXB0eUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbMF07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBpbnRlcm5hbEdldEJpbmFyaWVzUGF0aCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRCaW5hcmllc1BhdGgoKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgcmV0dXJuIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRMb2NhbFJ1bnRpbWVDbGFzc1BhdGgoKSB7Ci0KLQkJU3RyaW5nIGFic29sdXRlUGF0aCA9IGludGVybmFsR2V0QmluYXJpZXNQYXRoKCk7Ci0JCWlmIChhYnNvbHV0ZVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBlbXB0eUNsYXNzcGF0aCgpOwotCQlyZXR1cm4gbmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtde2NyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShhYnNvbHV0ZVBhdGgpfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aEF0VGhpc0xldmVsKCkgewotCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gaW50ZXJuYWxHZXRCaW5hcmllc1BhdGgoKTsKLQkJaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5Q2xhc3NwYXRoKCk7Ci0JCVN0cmluZyBwYXJlbnRQYXRoID0gbmV3IGphdmEuaW8uRmlsZShhYnNvbHV0ZVBhdGgpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJU3RyaW5nW10gbWZFbnRyaWVzID0gZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJaWYgKG1mRW50cmllcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBlbXB0eUNsYXNzcGF0aCgpOwotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVudHJpZXMuYWRkQWxsKGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyaWVzKG1mRW50cmllcywgcGFyZW50UGF0aCkpOwotCi0JCXJldHVybiAoUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIGVudHJpZXMudG9BcnJheShuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldEZ1bGxSdW50aW1lQ2xhc3NQYXRoKCkgewotCQlyZXR1cm4gY29uY2F0KGdldExvY2FsUnVudGltZUNsYXNzUGF0aCgpLCBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKCkpOwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBjb25jYXQoUnVudGltZUNsYXNzcGF0aEVudHJ5W10gYXJyYXkxLCBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBhcnJheTIpIHsKLQkJTGlzdCB0ZW1wID0gbmV3IEFycmF5TGlzdCgpOwotCQl0ZW1wLmFkZEFsbChBcnJheXMuYXNMaXN0KGFycmF5MSkpOwotCQl0ZW1wLmFkZEFsbChBcnJheXMuYXNMaXN0KGFycmF5MikpOwotCQlyZXR1cm4gKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSB0ZW1wLnRvQXJyYXkobmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVt0ZW1wLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKCkgewotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVNldCB2aXNpdGVkID0gbmV3IEhhc2hTZXQoKTsKLQkJU2V0IHByb2Nlc3NlZEVudHJpZXMgPSBuZXcgSGFzaFNldCgpOwotCQl2aXNpdGVkLmFkZCh0aGlzKTsKLQkJZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aCh2aXNpdGVkLCBlbnRyaWVzLCBwcm9jZXNzZWRFbnRyaWVzLCB0aGlzKTsKLQkJcmV0dXJuIChSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSkgZW50cmllcy50b0FycmF5KG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKFNldCB2aXNpdGVkQXJjaGl2ZXMsIExpc3QgZW50cmllcywgU2V0IHByb2Nlc3NlZEVudHJpZXMsIEFyY2hpdmUgY3VycmVudCkgewotCi0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGxvY2FsID0gKChBcmNoaXZlSW1wbCkgY3VycmVudCkuZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aEF0VGhpc0xldmVsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWwubGVuZ3RoOyBpKyspIHsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGxvY2FsW2ldOwotCQkJaWYgKCFwcm9jZXNzZWRFbnRyaWVzLmNvbnRhaW5zKGVudHJ5KSkgewotCQkJCWVudHJpZXMuYWRkKGVudHJ5KTsKLQkJCQlwcm9jZXNzZWRFbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQl9Ci0JCQlBcmNoaXZlIHJlc29sdmVkID0gZW50cnkuZ2V0UmVmZXJlbmNlZEFyY2hpdmUoKTsKLQkJCWlmIChyZXNvbHZlZCA9PSBudWxsKQotCQkJCUNsYXNzcGF0aFV0aWwucHJvY2Vzc01hbmlmZXN0KGVudHJ5LmdldEFic29sdXRlUGF0aCgpLCBlbnRyaWVzLCBwcm9jZXNzZWRFbnRyaWVzKTsKLQkJCWVsc2UgaWYgKCF2aXNpdGVkQXJjaGl2ZXMuY29udGFpbnMocmVzb2x2ZWQpKSB7Ci0JCQkJdmlzaXRlZEFyY2hpdmVzLmFkZChyZXNvbHZlZCk7Ci0JCQkJZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aCh2aXNpdGVkQXJjaGl2ZXMsIGVudHJpZXMsIHByb2Nlc3NlZEVudHJpZXMsIHJlc29sdmVkKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEVBUkZpbGUgZ2V0RUFSRmlsZSgpIHsKLQkJQ29udGFpbmVyIHBhcmVudCA9IGdldENvbnRhaW5lcigpOwotCQlpZiAocGFyZW50ID09IG51bGwgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBFQVJGaWxlKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVBUkZpbGUpIHBhcmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBnZXRSZXNvbHZlZEFyY2hpdmUoU3RyaW5nIG1mVmFsdWUsIEVBUkZpbGUgZWFyKSB7Ci0JCVN0cmluZyBhVXJpID0gQXJjaGl2ZVV0aWwuZGVyaXZlRUFSUmVsYXRpdmVVUkkobWZWYWx1ZSwgdGhpcyk7Ci0JCWlmIChhVXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiAoQXJjaGl2ZSkgZWFyLmdldEZpbGUoYVVyaSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleDIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUjaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKEFyY2hpdmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKEFyY2hpdmUgb3RoZXIpIHsKLQkJaWYgKG90aGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVBUkZpbGUgZWFyID0gZ2V0RUFSRmlsZSgpOwotCQlpZiAoZWFyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVNldCB2aXNpdGVkID0gbmV3IEhhc2hTZXQoKTsKLQkJcmV0dXJuIGhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhvdGhlciwgdmlzaXRlZCwgZWFyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8oQXJjaGl2ZSBvdGhlciwgU2V0IHZpc2l0ZWQsIEVBUkZpbGUgZWFyKSB7Ci0JCWlmICh0aGlzID09IG90aGVyKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh2aXNpdGVkLmNvbnRhaW5zKHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQl2aXNpdGVkLmFkZCh0aGlzKTsKLQkJU3RyaW5nW10gbWZFbnRyaWVzID0gZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZkVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0UmVzb2x2ZWRBcmNoaXZlKG1mRW50cmllc1tpXSwgZWFyKTsKLQkJCWlmIChhbkFyY2hpdmUgIT0gbnVsbCAmJiBhbkFyY2hpdmUuaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKG90aGVyLCB2aXNpdGVkLCBlYXIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkFyY2hpdmUjaXNUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUeXBlKFN0cmluZyB0eXBlKSB7Ci0KLQkJcmV0dXJuICh0eXBlcyAhPSBudWxsICYmIGdldFR5cGVzKCkuY29udGFpbnModHlwZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9DbGllbnRNb2R1bGVSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NsaWVudE1vZHVsZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ2Y2VjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NsaWVudE1vZHVsZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5DbGllbnRNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIENsaWVudE1vZHVsZVJlZkltcGwgZXh0ZW5kcyBNb2R1bGVSZWZJbXBsIGltcGxlbWVudHMgQ2xpZW50TW9kdWxlUmVmLCBNb2R1bGVSZWYgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDbGllbnRNb2R1bGVSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGllbnRNb2R1bGVSZWYoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fRUFSX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUywgRUFSRmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNb2R1bGVGaWxlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TW9kdWxlRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZHVsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlzZXRNb2R1bGVGaWxlKChNb2R1bGVGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlzZXRFYXJGaWxlKChFQVJGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJc2V0TW9kdWxlKChNb2R1bGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlzZXRFYXJGaWxlKChFQVJGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlyZXR1cm4gbW9kdWxlRmlsZSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXJldHVybiBtb2R1bGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudCkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNDbGllbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0gLy9DbGllbnRNb2R1bGVSZWZJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzNTFjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNsaWVudE1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29ubmVjdG9yTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkRpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuRWFyMTJJbXBvcnRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5Lk5lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5Lk51bGxMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlJhckltcG9ydFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5SZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LldhcjIySW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgewotCi0KLQlwcm90ZWN0ZWQgTWFwIG9wZW5BcmNoaXZlczsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlbGVnYXRlTmVlZHNJbml0ID0gdHJ1ZTsKLQlwcml2YXRlIENvbW1vbmFyY2hpdmVGYWN0b3J5IGRlbGVnYXRlID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCWluaXRQcmVyZXFzKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXREZWxlZ2F0ZSgpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGVOZWVkc0luaXQpIHsKLQkJCWRlbGVnYXRlTmVlZHNJbml0ID0gZmFsc2U7Ci0JCQlkZWxlZ2F0ZSA9IG5ldyBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwoKSB7Ci0KLQkJCQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUdlbigpOwotCQkJCX0KLQotCi0JCQkJcHVibGljIENsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVDbGllbnRNb2R1bGVSZWZHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZkdlbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGUoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVFQVJGaWxlR2VuKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZSgpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUVKQkphckZpbGVHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgRUpCTW9kdWxlUmVmIGNyZWF0ZUVKQk1vZHVsZVJlZigpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUVKQk1vZHVsZVJlZkdlbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBSQVJGaWxlIGNyZWF0ZVJBUkZpbGUoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVSQVJGaWxlR2VuKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFdBUkZpbGUgY3JlYXRlV0FSRmlsZSgpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZVdBUkZpbGVHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZigpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZVJlZkdlbigpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFOiByZXR1cm4gY3JlYXRlRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFOiByZXR1cm4gY3JlYXRlQXJjaGl2ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEU6IHJldHVybiBjcmVhdGVFSkJKYXJGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFOiByZXR1cm4gY3JlYXRlV0FSRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRTogcmV0dXJuIGNyZWF0ZUVBUkZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEU6IHJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWTogcmV0dXJuIGNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFOiByZXR1cm4gY3JlYXRlUkFSRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRjogcmV0dXJuIGNyZWF0ZUVKQk1vZHVsZVJlZigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRjogcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZVJlZigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRjogcmV0dXJuIGNyZWF0ZUNsaWVudE1vZHVsZVJlZigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRjogcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgYXJjaGl2ZUNsb3NlZChBcmNoaXZlIGFDbG9zZWRBcmNoaXZlKSB7Ci0JCWdldE9wZW5BcmNoaXZlcygpLnJlbW92ZShhQ2xvc2VkQXJjaGl2ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgYXJjaGl2ZU9wZW5lZChBcmNoaXZlIGFuT3BlbkFyY2hpdmUpIHsKLQkJZ2V0T3BlbkFyY2hpdmVzKCkucHV0KGFuT3BlbkFyY2hpdmUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKEFyY2hpdmUpfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNsb3NlKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiAhZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24oYW5BcmNoaXZlKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2VPcGVuQXJjaGl2ZXMoKSB7Ci0JCWlmIChnZXRPcGVuQXJjaGl2ZXMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUxpc3Qgb3BlbmVkID0gbmV3IEFycmF5TGlzdChnZXRPcGVuQXJjaGl2ZXMoKS5zaXplKCkpOwotCQlJdGVyYXRvciBpdCA9IGdldE9wZW5BcmNoaXZlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW9wZW5lZC5hZGQoaXQubmV4dCgpKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wZW5lZC5zaXplKCk7IGkrKykgewotCQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSAoQXJjaGl2ZSkgb3BlbmVkLmdldChpKTsKLQkJCWFuQXJjaGl2ZS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgY29weShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gbmV3IEFyY2hpdmVDb3B5VXRpbGl0eSgpLmNvcHkoYW5BcmNoaXZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZSBjb3B5KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHsKLQkJcmV0dXJuIG5ldyBBcmNoaXZlQ29weVV0aWxpdHkoKS5jb3B5KGFNb2R1bGVGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUluaXRpYWxpemVkKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjbGllbnRGaWxlID0gY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdBcHBsaWNhdGlvbkNsaWVudEZpbGUoY2xpZW50RmlsZSwgdXJpKTsKLQkJcmV0dXJuIGNsaWVudEZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgY3JlYXRlQXJjaGl2ZUluaXRpYWxpemVkKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gY3JlYXRlQXJjaGl2ZSgpOwotCQlpbml0aWFsaXplTmV3QXJjaGl2ZShhbkFyY2hpdmUsIHVyaSk7Ci0JCXJldHVybiBhbkFyY2hpdmU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVBcmNoaXZlSW5pdGlhbGl6ZWQoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBjcmVhdGVBcmNoaXZlKCk7Ci0JCWluaXRpYWxpemVOZXdBcmNoaXZlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQkJcmV0dXJuIGFuQXJjaGl2ZTsKLQotCX0KLQotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlQ2hpbGRMb2FkU3RyYXRlZ3koU3RyaW5nIHVyaSwgTG9hZFN0cmF0ZWd5IHBhcmVudCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQotCQlMb2FkU3RyYXRlZ3kgY2hpbGRTdHJhdGVneSA9IG51bGw7Ci0JCWlmIChwYXJlbnQuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nIGRpck5hbWUgPSAoKERpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kpIHBhcmVudCkuZ2V0RGlyZWN0b3J5VXJpKCk7Ci0JCQlTdHJpbmcgcXVhbGlmaWVkVXJpID0gQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoZGlyTmFtZSwgdXJpKTsKLQkJCWNoaWxkU3RyYXRlZ3kgPSBjcmVhdGVMb2FkU3RyYXRlZ3kocXVhbGlmaWVkVXJpKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkU3RyYXRlZ3kgPSBjcmVhdGVOZXN0ZWRMb2FkU3RyYXRlZ3kodXJpLCBwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBjaGlsZFN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlFQVJGaWxlIGVhckZpbGUgPSBjcmVhdGVFQVJGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdFQVJGaWxlKGVhckZpbGUsIHVyaSk7Ci0JCXJldHVybiBlYXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlFQVJGaWxlIGVhckZpbGUgPSBjcmVhdGVFQVJGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdFQVJGaWxlKGVhckZpbGUsIHVyaSwgb3B0aW9ucyk7Ci0JCXJldHVybiBlYXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBjcmVhdGVFSkJKYXJGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdFSkJKYXJGaWxlKGVqYkphckZpbGUsIHVyaSk7Ci0JCXJldHVybiBlamJKYXJGaWxlOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IGNyZWF0ZUVKQkphckZpbGUoKTsKLQkJaW5pdGlhbGl6ZU5ld0VKQkphckZpbGUoZWpiSmFyRmlsZSwgdXJpLCBvcHRpb25zKTsKLQkJcmV0dXJuIGVqYkphckZpbGU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTnVsbExvYWRTdHJhdGVneUltcGw7IHVzZWQgZm9yIG5ldyBhcmNoaXZlcwotCSAqLwotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlRW1wdHlMb2FkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgTnVsbExvYWRTdHJhdGVneUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGR5bmFtaWNhbGx5IGJ1aWxkIGEgbG9hZCBzdHJhdGVneSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4gRGV0ZXJtaW5lcyB3aGV0aGVyCi0JICogdGhlIHVyaSBwb2ludHMgdG8gYSBqYXIgZmlsZSBvciBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIExvYWRTdHJhdGVneSBjcmVhdGVMb2FkU3RyYXRlZ3koU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZW5hbWUgPSB1cmkucmVwbGFjZSgnLycsIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVuYW1lKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJmaWxlX25vdF9mb3VuZF9FWENfIiwgKG5ldyBPYmplY3RbXXt1cmksIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIlVSSSBOYW1lOiB7MH07IEZpbGUgbmFtZTogezF9IgotCQl9Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXJldHVybiBuZXcgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwodXJpKTsKLQkJfQotCQlyZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGxvYWQgc3RyYXRlZ3kgZm9yIGEgbmVzdGVkIGFyY2hpdmU7IGJ5IGRlZmF1bHQgd2lsbCBleHRyYWN0IHRoZSBuZXN0ZWQgYXJjaGl2ZSB0byBhCi0JICogdGVtcCBmaWxlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBUaGlzIGlzIGJlY2F1c2UgcmFuZG9tIGFjY2VzcyB0byB0aGUgemlwIGVudHJpZXMgaW4gYQotCSAqIG5lc3RlZCBhcmNoaXZlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGphdmEudXRpbC56aXAgcGFja2FnZSwgYW5kIGlmIHRoZSBhcmNoaXZlJ3MgY29udGVudHMKLQkgKiBhcmUgYmVpbmcgbW9kaWZpZWQsIGNvcGllZCwgZXRjLCB0aGlzIGlzIG11Y2ggZmFzdGVyLiBJZiBhIHRlbXAgZmlsZSBjYW4gbm90IGJlIGNyZWF0ZWQsIG9yCi0JICogaWYgdGhlIGFyY2hpdmUgaXMgb3BlbmVkIHJlYWQgb25seSAoZm9yIHJ1bnRpbWUpLCB0aGVuIHVzZSBhIE5lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3ksIHdoaWNoCi0JICogcmV0cmlldmVzIHRoZSBjb250ZW50cyBvZiBhIHppcCBlbnRyeSBieSBzZXF1ZW50aWFsbHkgc2VhcmNoaW5nIGEgemlwIGlucHV0IHN0cmVhbQotCSAqLwotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlTmVzdGVkTG9hZFN0cmF0ZWd5KFN0cmluZyB1cmksIExvYWRTdHJhdGVneSBwYXJlbnQpIHsKLQkJTG9hZFN0cmF0ZWd5IGxvYWRTdHJhdGVneSA9IG51bGw7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSAoKEFyY2hpdmUpIHBhcmVudC5nZXRDb250YWluZXIoKSkuZ2V0T3B0aW9ucygpOwotCi0JCWlmICghb3B0aW9ucy5pc1JlYWRPbmx5KHVyaSkpCi0JCQlsb2FkU3RyYXRlZ3kgPSBjcmVhdGVUZW1wWmlwRmlsZVN0cmF0ZWd5SWZQb3NzaWJsZSh1cmksIHBhcmVudCk7Ci0KLQkJaWYgKGxvYWRTdHJhdGVneSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbChwYXJlbnQpOwotCQlyZXR1cm4gbG9hZFN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSQVJGaWxlIGNyZWF0ZVJBUkZpbGVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlSQVJGaWxlIHJhckZpbGUgPSBjcmVhdGVSQVJGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdSQVJGaWxlKHJhckZpbGUsIHVyaSk7Ci0JCXJldHVybiByYXJGaWxlOwotCX0KLQotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlVGVtcFppcEZpbGVTdHJhdGVneUlmUG9zc2libGUoU3RyaW5nIHVyaSwgTG9hZFN0cmF0ZWd5IHBhcmVudCkgewotCi0JCWlmICghQXJjaGl2ZVV0aWwuc2hvdWxkVXNlVGVtcERpcmVjdG9yeUZvclJlYWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlqYXZhLmlvLkZpbGUgdGVtcEZpbGUgPSBBcmNoaXZlVXRpbC5jcmVhdGVUZW1wRmlsZSh1cmkpOwotCQkJdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IHBhcmVudC5nZXRJbnB1dFN0cmVhbSh1cmkpOwotCQkJT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKLQkJCUFyY2hpdmVVdGlsLmNvcHkoaW4sIG91dCk7Ci0JCQlyZXR1cm4gbmV3IFRlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCh0ZW1wRmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlBcmNoaXZlVXRpbC5pbmZvcm0oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm1ha2VfdGVtcF9maWxlX1dBUk5fIiwgKG5ldyBPYmplY3RbXXt1cml9KSkgKyBleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkID0gIldhcm5pbmc6IFVuYWJsZSB0byBjcmVhdGUgdGVtcCBmaWxlIGZvciB7MH0uICBUaGlzIHdpbGwgaW1wYWN0IHBlcmZvcm1hbmNlLiIKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBjcmVhdGVXQVJGaWxlSW5pdGlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJV0FSRmlsZSB3YXJGaWxlID0gY3JlYXRlV0FSRmlsZSgpOwotCQlpbml0aWFsaXplTmV3V0FSRmlsZSh3YXJGaWxlLCB1cmkpOwotCQlyZXR1cm4gd2FyRmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZU9wdGlvbnMgZGVmYXVsdE9wdGlvbnMoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3kpIHsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRpb25zLnNldExvYWRTdHJhdGVneShhTG9hZFN0cmF0ZWd5KTsKLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBY3RpdmVGYWN0b3J5KCkgewotCQlDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBnZXRQYWNrYWdlKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkKLQkJCXJldHVybiBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRNYW5pZmVzdENsYXNzUGF0aFZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IGFuQXJjaGl2ZS5nZXRNYW5pZmVzdCgpLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yMy8wMSAyOjM1OjU1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLk1hcAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldE9wZW5BcmNoaXZlcygpIHsKLQkJaWYgKG9wZW5BcmNoaXZlcyA9PSBudWxsKQotCQkJb3BlbkFyY2hpdmVzID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0JCXJldHVybiBvcGVuQXJjaGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFNldCBnZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbihBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlTZXQgZGVwZW5kZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIG9wZW5lZCA9IGdldE9wZW5BcmNoaXZlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChvcGVuZWQuaGFzTmV4dCgpKSB7Ci0JCQlBcmNoaXZlIG9wZW5lZEFyY2hpdmUgPSAoQXJjaGl2ZSkgb3BlbmVkLm5leHQoKTsKLQkJCWlmIChvcGVuZWRBcmNoaXZlID09IGFuQXJjaGl2ZSkKLQkJCQljb250aW51ZTsKLQkJCWlmICghb3BlbmVkQXJjaGl2ZS5pc0luZGV4ZWQoKSkKLQkJCQkvLyoqKioqKioqKipPcHRpbWl6YXRpb24qKioqKioqKioqKgotCQkJCS8vSWYgdGhlIGZpbGUgbGlzdCBoYXMgbmV2ZXIgYmVlbiBidWlsdCBmb3IgdGhlIGFyY2hpdmUsIHdlIGRvbid0IHdhbnQgdG8gdHJpZ2dlcgotCQkJCS8vIGl0IG5vdywKLQkJCQkvL2FuZCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBhcmNoaXZlIGlzIG5vdCBwcmV2ZW50aW5nIHRoZSBwYXJhbWV0ZXIgZnJvbSBjbG9zaW5nCi0JCQkJY29udGludWU7Ci0JCQlMaXN0IGZpbGVzID0gb3BlbmVkQXJjaGl2ZS5nZXRGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJCWlmIChhRmlsZS5nZXRMb2FkaW5nQ29udGFpbmVyKCkgPT0gYW5BcmNoaXZlKSB7Ci0JCQkJCUFyY2hpdmUgb3V0ZXJtb3N0ID0gb3BlbmVkQXJjaGl2ZTsKLQkJCQkJQ29udGFpbmVyIGMgPSBvcGVuZWRBcmNoaXZlLmdldENvbnRhaW5lcigpOwotCQkJCQl3aGlsZSAoYyAhPSBudWxsICYmIGMuaXNBcmNoaXZlKCkpIHsKLQkJCQkJCW91dGVybW9zdCA9IChBcmNoaXZlKSBjOwotCQkJCQkJYyA9IGMuZ2V0Q29udGFpbmVyKCk7Ci0JCQkJCX0KLQkJCQkJZGVwZW5kZW50cy5hZGQob3V0ZXJtb3N0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy9FbGVtZW50cyBmcm9tIG9uZSBvZiB0aGUgY2hpbGRyZW4gKGUuZy4sIGEgbW9kdWxlIGZpbGUgaW4gYW4gZWFyKSBtYXkgaGF2ZSBiZWVuIGNvcGllZCB0bwotCQkvL2Fub3RoZXIgYXJjaGl2ZQotCQlMaXN0IG5lc3RlZEFyY2hpdmVzID0gYW5BcmNoaXZlLmdldEFyY2hpdmVGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZEFyY2hpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlkZXBlbmRlbnRzLmFkZEFsbChnZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbigoQXJjaGl2ZSkgbmVzdGVkQXJjaGl2ZXMuZ2V0KGkpKSk7Ci0JCX0KLQkJcmV0dXJuIGRlcGVuZGVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRQcmVyZXFzKCkgewotCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVJbml0Lmludm9rZVByZXJlcUluaXRzKHRydWUpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFJvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpOwotCQlkaXNjLmFkZENoaWxkKEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKSk7Ci0JCWRpc2MuYWRkQ2hpbGQoV2FyMjJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpKTsKLQkJZGlzYy5hZGRDaGlsZChBcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCkpOwotCQlkaXNjLmFkZENoaWxkKFJhckltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCkpOwotCQlkaXNjLmFkZENoaWxkKFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0FwcGxpY2F0aW9uQ2xpZW50RmlsZShBcHBsaWNhdGlvbkNsaWVudEZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3QXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlhbkFyY2hpdmUuc2V0VVJJKHVyaSk7Ci0JCWFuQXJjaGl2ZS5zZXRTaXplKDApOwotCQlhbkFyY2hpdmUuc2V0TGFzdE1vZGlmaWVkKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYW5BcmNoaXZlLnNldERpcmVjdG9yeUVudHJ5KGZhbHNlKTsKLQkJYW5BcmNoaXZlLnNldExvYWRTdHJhdGVneShjcmVhdGVFbXB0eUxvYWRTdHJhdGVneSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3RUFSRmlsZShFQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0VKQkphckZpbGUoRUpCSmFyRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmkpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdNb2R1bGVGaWxlKE1vZHVsZUZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpKSB7Ci0JCWluaXRpYWxpemVOZXdBcmNoaXZlKGFuQXJjaGl2ZSwgdXJpKTsKLQkJYW5BcmNoaXZlLm1ha2VEZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld1JBUkZpbGUoUkFSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmkpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdXQVJGaWxlKFdBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3QXBwbGljYXRpb25DbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmksIG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdBcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWlmIChvcHRpb25zLmdldExvYWRTdHJhdGVneSgpID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJb3B0aW9ucy5zZXRMb2FkU3RyYXRlZ3koY3JlYXRlRW1wdHlMb2FkU3RyYXRlZ3koKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJfQotCQl9Ci0KLQkJYW5BcmNoaXZlLnNldFVSSSh1cmkpOwotCQlhbkFyY2hpdmUuc2V0U2l6ZSgwKTsKLQkJYW5BcmNoaXZlLnNldExhc3RNb2RpZmllZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFuQXJjaGl2ZS5zZXREaXJlY3RvcnlFbnRyeShmYWxzZSk7Ci0JCWFuQXJjaGl2ZS5zZXRMb2FkU3RyYXRlZ3kob3B0aW9ucy5nZXRMb2FkU3RyYXRlZ3koKSk7Ci0JCWFuQXJjaGl2ZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0VBUkZpbGUoRUFSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmksIG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdFSkJKYXJGaWxlKEVKQkphckZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3TW9kdWxlRmlsZShNb2R1bGVGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpbml0aWFsaXplTmV3QXJjaGl2ZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JCWFuQXJjaGl2ZS5tYWtlRGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdSQVJGaWxlKFJBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3V0FSRmlsZShXQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUoYUxvYWRTdHJhdGVneSwgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBBcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnRGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCXJldHVybiBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCkpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlyZXR1cm4gb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIFJvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSAtIG9wZW4gdGhlIGFyY2hpdmUgYnkgdGhlIHBhc3NlZCBuYW1lLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZQotCSAqIHN0cmF0ZWdpZXMuIE5hbWUgbWF5IGJlIGEgcGF0aCB0byBhIGphciwgYSB6aXAsIG9yIGEgZGlyZWN0b3J5IHJldHVybiB0aGUgYXBwcm9wcmlhdGUgQXJjaGl2ZQotCSAqIHR5cGUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJcmV0dXJuIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSwgU3RyaW5nIGV4dHJhQ2xhc3NQYXRoKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlhbkFyY2hpdmUuc2V0RXh0cmFDbGFzc3BhdGgoZXh0cmFDbGFzc1BhdGgpOwotCQlyZXR1cm4gb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIFJvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBvcGVuRUFSRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChFQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVBUkZpbGUgb3BlbkVBUkZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEVBUkZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBvcGVuRUFSRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChFQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQjExSmFyRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQjExSmFyRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUoYUxvYWRTdHJhdGVneSwgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCVJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBkaXNjID0gKFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCkgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUoYUxvYWRTdHJhdGVneSwgdXJpKTsKLQkJUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGRpc2MgPSAoUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKSBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpLCBTdHJpbmcgZXh0cmFDbGFzc1BhdGgpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCWFuQXJjaGl2ZS5zZXRFeHRyYUNsYXNzcGF0aChleHRyYUNsYXNzUGF0aCk7Ci0JCVJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBkaXNjID0gKFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCkgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZGlzYyA9IChSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwpIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoU3RyaW5nIHVyaSwgU3RyaW5nIGV4dHJhQ2xhc3NQYXRoKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlhbkFyY2hpdmUuc2V0RXh0cmFDbGFzc3BhdGgoZXh0cmFDbGFzc1BhdGgpOwotCQlSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZGlzYyA9IChSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwpIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoTG9vc2VBcmNoaXZlIGxvb3NlLCBBcmNoaXZlIHBhcmVudCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVyaSA9IGxvb3NlLmdldFVyaSgpOwotCQl0cnkgewotCQkJaWYobG9vc2UuZ2V0QmluYXJpZXNQYXRoKCkgPT0gbnVsbCl7Ci0JCQkJdGhyb3cgbmV3IE9wZW5GYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvcGVuX25lc3RlZF9FWENfIiwgKG5ldyBPYmplY3RbXSB7dXJpLHBhcmVudC5nZXRVUkkoKX0pKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgPSAiQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iIgotCQkJfQotCQkJTG9hZFN0cmF0ZWd5IGNoaWxkU3RyYXRlZ3kgPSBjcmVhdGVMb2FkU3RyYXRlZ3kobG9vc2UuZ2V0QmluYXJpZXNQYXRoKCkpOwotCQkJY2hpbGRTdHJhdGVneS5zZXRMb29zZUFyY2hpdmUobG9vc2UpOwotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IHBhcmVudC5nZXRPcHRpb25zKCkuY2xvbmVXaXRoKGNoaWxkU3RyYXRlZ3ksIGxvb3NlLmdldFVyaSgpKTsKLQkJCXJldHVybiBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib3Blbl9uZXN0ZWRfRVhDXyIsIChuZXcgT2JqZWN0W117dXJpLCBwYXJlbnQuZ2V0VVJJKCl9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJDb3VsZCBub3Qgb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUgInswfSIgaW4gInsxfSIiCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoU3RyaW5nIHVyaSwgQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlMb2FkU3RyYXRlZ3kgY2hpbGRTdHJhdGVneSA9IGNyZWF0ZUNoaWxkTG9hZFN0cmF0ZWd5KHVyaSwgcGFyZW50LmdldExvYWRTdHJhdGVneSgpKTsKLQkJCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBwYXJlbnQuZ2V0T3B0aW9ucygpLmNsb25lV2l0aChjaGlsZFN0cmF0ZWd5LCB1cmkpOwotCQkJaWYgKG9wdGlvbnMuc2hvdWxkRGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMoKSkKLQkJCQlyZXR1cm4gb3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJCXJldHVybiBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib3Blbl9uZXN0ZWRfRVhDXyIsIChuZXcgT2JqZWN0W117dXJpLCBwYXJlbnQuZ2V0VVJJKCl9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJDb3VsZCBub3Qgb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUgInswfSIgaW4gInsxfSIiCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBvcGVuUkFSRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBSYXJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKFJBUkZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBvcGVuUkFSRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUoYUxvYWRTdHJhdGVneSwgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBSYXJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKFJBUkZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBvcGVuUkFSRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFJhckltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoUkFSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIG9wZW5SZWFkT25seURpcmVjdG9yeSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlEaXJlY3Rvcnkgb3BlblJlYWRPbmx5RGlyZWN0b3J5KGphdmEubGFuZy5TdHJpbmcgdXJpKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUodXJpKTsKLQkJaWYgKCFhRmlsZS5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImNvdWxkX25vdF9maW5kX2Rpcl9FWENfIiwgKG5ldyBPYmplY3RbXXt1cml9KSkpOyAvLyROT04tTkxTLTEkID0gIlVuYWJsZSB0byBvcGVuIGRpcmVjdG9yeSAiCi0JCWlmICghYUZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygibm90X2FfZGlyX0VYQ18iLCAobmV3IE9iamVjdFtde3VyaX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiVW5hYmxlIHRvIG9wZW4gZGlyZWN0b3J5IGJlY2F1c2UgZmlsZSBpcyBub3QgYSBkaXJlY3RvcnkgOiIKLQkJTG9hZFN0cmF0ZWd5IHN0cmF0ZWd5ID0gbmV3IFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbCh1cmkpOwotCQlSZWFkT25seURpcmVjdG9yeSBjb250YWluZXIgPSBjcmVhdGVSZWFkT25seURpcmVjdG9yeSgpOwotCQljb250YWluZXIuc2V0VVJJKHVyaSk7Ci0JCWNvbnRhaW5lci5zZXRMb2FkU3RyYXRlZ3koc3RyYXRlZ3kpOwotCQljb250YWluZXIuc2V0TGFzdE1vZGlmaWVkKGFGaWxlLmxhc3RNb2RpZmllZCgpKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBUYWtlIHRoZSBwcmltaXRpdmUgYXJjaGl2ZSBhbmQgcnVuIGl0IHRocm91Z2ggdGhlIGxpc3Qgb2YgZGlzY3JpbWluYXRvcnMgdG8gY29udmVydCBpdCB0byB0aGUKLQkgKiBjb3JyZWN0IHNwZWNpYWxpemVkIHR5cGU7IGFmdGVyIGFmdGVyIGNvbnZlcnNpb24sIHRlbGwgdGhlIGFyY2hpdmUgdG8gaW5pdGFsaXplIGl0c2VsZiBpZgotCSAqIG5lY2Vzc2FyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuU3BlY2lmaWNBcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlLCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYykgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKCFkaXNjLmNhbkltcG9ydChhbkFyY2hpdmUpKSB7Ci0JCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihkaXNjLmdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSk7Ci0JCX0KLQkJQXJjaGl2ZSBzcGVjaWZpY0FyY2hpdmUgPSBkaXNjLm9wZW5BcmNoaXZlKGFuQXJjaGl2ZSk7Ci0JCXNwZWNpZmljQXJjaGl2ZS5pbml0aWFsaXplQWZ0ZXJPcGVuKCk7Ci0JCXJldHVybiBzcGVjaWZpY0FyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBjYXNlIGZvciBlamIgamFyIGZpbGVzLCBiZWNhdXNlIG9mIHRoZSBuZWVkIHRvIHN1cHBvcnQgbm9uLWNvbXBsaWFudCAxLjAgamFycwotCSAqLwotCXByb3RlY3RlZCBBcmNoaXZlIG9wZW5TcGVjaWZpY0FyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUsIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBkaXNjKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIHNwZWNpZmljID0gb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIGRpc2MpOwotCQlpZiAoc3BlY2lmaWMgPT0gYW5BcmNoaXZlKSB7Ci0JCQkvL1RoZSBkaXNjcmltaW5hdG9yIGZhaWxlZCB0byBjb252ZXJ0IHRoZSBhcmNodmUgdG8gYW4gZWpiIGphciBmaWxlCi0JCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihkaXNjLmdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHNwZWNpZmljOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBXQVJGaWxlIG9wZW5XQVJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChXQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFdBUkZpbGUgb3BlbldBUkZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gV2FyMjJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKFdBUkZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBvcGVuV0FSRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChXQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFyY2hpdmUgcHJpbU9wZW5BcmNoaXZlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zLmdldExvYWRTdHJhdGVneSgpID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJb3B0aW9ucy5zZXRMb2FkU3RyYXRlZ3koY3JlYXRlTG9hZFN0cmF0ZWd5KHVyaSkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImNvdWxkX25vdF9vcGVuX0VYQ18iLCAobmV3IE9iamVjdFtde3VyaX0pKSwgZXgpOyAvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCBvcGVuICIKLQkJCX0KLQkJfQotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IGNyZWF0ZUFyY2hpdmUoKTsKLQkJYW5BcmNoaXZlLnNldFVSSSh1cmkpOwotCQlhbkFyY2hpdmUuc2V0T3JpZ2luYWxVUkkodXJpKTsKLQkJYW5BcmNoaXZlLnNldExvYWRTdHJhdGVneShvcHRpb25zLmdldExvYWRTdHJhdGVneSgpKTsKLQkJYW5BcmNoaXZlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuY29udHJpYnV0ZVR5cGVzKGFuQXJjaGl2ZSk7Ci0JCXJldHVybiBhbkFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFyY2hpdmUgcHJpbU9wZW5BcmNoaXZlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gcHJpbU9wZW5BcmNoaXZlKGRlZmF1bHRPcHRpb25zKGFMb2FkU3RyYXRlZ3kpLCB1cmkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gcHJpbU9wZW5BcmNoaXZlKG5ldyBBcmNoaXZlT3B0aW9ucygpLCB1cmkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9wZW5BcmNoaXZlcyhqYXZhLnV0aWwuTWFwIG5ld09wZW5BcmNoaXZlcykgewotCQlvcGVuQXJjaGl2ZXMgPSBuZXdPcGVuQXJjaGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdBUkZpbGUgY3JlYXRlV0FSRmlsZUdlbigpIHsKLQkJV0FSRmlsZUltcGwgd2FyRmlsZSA9IG5ldyBXQVJGaWxlSW1wbCgpOwotCQlyZXR1cm4gd2FyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlR2VuKCkgewotCQlFSkJKYXJGaWxlSW1wbCBlamJKYXJGaWxlID0gbmV3IEVKQkphckZpbGVJbXBsKCk7Ci0JCXJldHVybiBlamJKYXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlR2VuKCkgewotCQlBcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsIGFwcGxpY2F0aW9uQ2xpZW50RmlsZSA9IG5ldyBBcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBUkZpbGUgY3JlYXRlRUFSRmlsZUdlbigpIHsKLQkJRUFSRmlsZUltcGwgZWFyRmlsZSA9IG5ldyBFQVJGaWxlSW1wbCgpOwotCQlyZXR1cm4gZWFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBjcmVhdGVSQVJGaWxlR2VuKCkgewotCQlSQVJGaWxlSW1wbCByYXJGaWxlID0gbmV3IFJBUkZpbGVJbXBsKCk7Ci0JCXJldHVybiByYXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBGaWxlIGNyZWF0ZUZpbGUoKSB7Ci0JCUZpbGVJbXBsIGZpbGUgPSBuZXcgRmlsZUltcGwoKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFJlYWRPbmx5RGlyZWN0b3J5IGNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5KCkgewotCQlSZWFkT25seURpcmVjdG9yeUltcGwgcmVhZE9ubHlEaXJlY3RvcnkgPSBuZXcgUmVhZE9ubHlEaXJlY3RvcnlJbXBsKCk7Ci0JCXJldHVybiByZWFkT25seURpcmVjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgZ2V0Q29tbW9uYXJjaGl2ZVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vbmFyY2hpdmVQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVKQk1vZHVsZVJlZiBjcmVhdGVFSkJNb2R1bGVSZWZHZW4oKSB7Ci0JCUVKQk1vZHVsZVJlZkltcGwgZWpiTW9kdWxlUmVmID0gbmV3IEVKQk1vZHVsZVJlZkltcGwoKTsKLQkJcmV0dXJuIGVqYk1vZHVsZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZkdlbigpIHsKLQkJV2ViTW9kdWxlUmVmSW1wbCB3ZWJNb2R1bGVSZWYgPSBuZXcgV2ViTW9kdWxlUmVmSW1wbCgpOwotCQlyZXR1cm4gd2ViTW9kdWxlUmVmOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDbGllbnRNb2R1bGVSZWYgY3JlYXRlQ2xpZW50TW9kdWxlUmVmR2VuKCkgewotCQlDbGllbnRNb2R1bGVSZWZJbXBsIGNsaWVudE1vZHVsZVJlZiA9IG5ldyBDbGllbnRNb2R1bGVSZWZJbXBsKCk7Ci0JCXJldHVybiBjbGllbnRNb2R1bGVSZWY7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbm5lY3Rvck1vZHVsZVJlZiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWZHZW4oKSB7Ci0JCUNvbm5lY3Rvck1vZHVsZVJlZkltcGwgY29ubmVjdG9yTW9kdWxlUmVmID0gbmV3IENvbm5lY3Rvck1vZHVsZVJlZkltcGwoKTsKLQkJcmV0dXJuIGNvbm5lY3Rvck1vZHVsZVJlZjsKLQl9Ci0KLQlwdWJsaWMgQ2xpZW50TW9kdWxlUmVmIGNyZWF0ZUNsaWVudE1vZHVsZVJlZihBcHBsaWNhdGlvbkNsaWVudEZpbGUgY2xpZW50RmlsZSkgewotCQlDbGllbnRNb2R1bGVSZWYgcmVmID0gY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCk7Ci0JCXJlZi5zZXRNb2R1bGVGaWxlKGNsaWVudEZpbGUpOwotCQlyZXR1cm4gcmVmOwotCX0KLQotCS8qCi0JICogQHNlZSBDb21tb25hcmNoaXZlRmFjdG9yeSNjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoUkFSRmlsZSkKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZihSQVJGaWxlIHJhckZpbGUpIHsKLQkJQ29ubmVjdG9yTW9kdWxlUmVmIHJlZiA9IGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpOwotCQlyZWYuc2V0TW9kdWxlRmlsZShyYXJGaWxlKTsKLQkJcmV0dXJuIHJlZjsKLQotCX0KLQotCS8qCi0JICogQHNlZSBDb21tb25hcmNoaXZlRmFjdG9yeSNjcmVhdGVFSkJNb2R1bGVSZWYoRUpCSmFyRmlsZSkKLQkgKi8KLQlwdWJsaWMgRUpCTW9kdWxlUmVmIGNyZWF0ZUVKQk1vZHVsZVJlZihFSkJKYXJGaWxlIGVqYkphckZpbGUpIHsKLQkJRUpCTW9kdWxlUmVmIHJlZiA9IGNyZWF0ZUVKQk1vZHVsZVJlZigpOwotCQlyZWYuc2V0TW9kdWxlRmlsZShlamJKYXJGaWxlKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29tbW9uYXJjaGl2ZUZhY3RvcnkjY3JlYXRlV2ViTW9kdWxlUmVmKFdBUkZpbGUpCi0JICovCi0JcHVibGljIFdlYk1vZHVsZVJlZiBjcmVhdGVXZWJNb2R1bGVSZWYoV0FSRmlsZSB3YXJGaWxlKSB7Ci0JCVdlYk1vZHVsZVJlZiByZWYgPSBjcmVhdGVXZWJNb2R1bGVSZWYoKTsKLQkJcmVmLnNldE1vZHVsZUZpbGUod2FyRmlsZSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFyY2hpdmUgY3JlYXRlQXJjaGl2ZSgpIHsKLQkJQXJjaGl2ZUltcGwgYXJjaGl2ZSA9IG5ldyBBcmNoaXZlSW1wbCgpOwotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQl9Ci0KLQotCXB1YmxpYyBDbGllbnRNb2R1bGVSZWYgY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUNsaWVudE1vZHVsZVJlZigpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0b3JNb2R1bGVSZWYgY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpOwotCX0KLQotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGUoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZSgpOwotCX0KLQotCXB1YmxpYyBFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGUoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZSgpOwotCX0KLQotCXB1YmxpYyBFSkJNb2R1bGVSZWYgY3JlYXRlRUpCTW9kdWxlUmVmKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQk1vZHVsZVJlZigpOwotCX0KLQotCXB1YmxpYyBSQVJGaWxlIGNyZWF0ZVJBUkZpbGUoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlUkFSRmlsZSgpOwotCX0KLQotCXB1YmxpYyBXQVJGaWxlIGNyZWF0ZVdBUkZpbGUoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlV0FSRmlsZSgpOwotCX0KLQotCXB1YmxpYyBXZWJNb2R1bGVSZWYgY3JlYXRlV2ViTW9kdWxlUmVmKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdlYk1vZHVsZVJlZigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkzMTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ2xpZW50TW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbm5lY3Rvck1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XZWJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29tbW9uYXJjaGl2ZVBhY2thZ2UsCi0gKiAgICAgICAgICBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcmNoaXZlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlamJKYXJGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3YXJGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlYXJGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1vZHVsZUZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRhaW5lckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVhZE9ubHlEaXJlY3RvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJhckZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1vZHVsZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiTW9kdWxlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWJNb2R1bGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNsaWVudE1vZHVsZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29ubmVjdG9yTW9kdWxlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByaXZhdGUgQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vbmFyY2hpdmVQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChDb21tb25hcmNoaXZlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25hcmNoaXZlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCB0aGVDb21tb25hcmNoaXZlUGFja2FnZSA9IChDb21tb25hcmNoaXZlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUxvb3NlY29uZmlnUGFja2FnZUltcGwgdGhlTG9vc2Vjb25maWdQYWNrYWdlID0gKExvb3NlY29uZmlnUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKExvb3NlY29uZmlnUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIExvb3NlY29uZmlnUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMb29zZWNvbmZpZ1BhY2thZ2UuZU5TX1VSSSkgOiBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXZhUmVmUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKSA6IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVDb21tb25hcmNoaXZlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUxvb3NlY29uZmlnUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YVJlZlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVMb29zZWNvbmZpZ1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhUmVmUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVDb21tb25hcmNoaXZlUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBjb250YWluZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyX0ZpbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXQVJGaWxlKCkgewotCQlyZXR1cm4gd2FyRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2FyRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TW9kdWxlRmlsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZUZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFQVJGaWxlKCkgewotCQlyZXR1cm4gZWFyRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWFyRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVBUkZpbGVfTW9kdWxlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVhckZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIG1vZHVsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2R1bGVSZWZfTW9kdWxlRmlsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1vZHVsZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1vZHVsZVJlZl9FYXJGaWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kdWxlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kdWxlUmVmX01vZHVsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1vZHVsZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCTW9kdWxlUmVmKCkgewotCQlyZXR1cm4gZWpiTW9kdWxlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2ViTW9kdWxlUmVmKCkgewotCQlyZXR1cm4gd2ViTW9kdWxlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2xpZW50TW9kdWxlUmVmKCkgewotCQlyZXR1cm4gY2xpZW50TW9kdWxlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29ubmVjdG9yTW9kdWxlUmVmKCkgewotCQlyZXR1cm4gY29ubmVjdG9yTW9kdWxlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb25DbGllbnRGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCSmFyRmlsZSgpIHsKLQkJcmV0dXJuIGVqYkphckZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkphckZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJBUkZpbGUoKSB7Ci0JCXJldHVybiByYXJGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmFyRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFyY2hpdmVfVHlwZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcmNoaXZlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWxlX1VSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWxlX0xhc3RNb2RpZmllZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWxlX1NpemUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVfRGlyZWN0b3J5RW50cnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZV9PcmlnaW5hbFVSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWxlX0xvYWRpbmdDb250YWluZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsZV9Db250YWluZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZWFkT25seURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5RGlyZWN0b3J5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChDb21tb25hcmNoaXZlRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZUVDbGFzcywgRklMRV9fVVJJKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWxlRUNsYXNzLCBGSUxFX19MQVNUX01PRElGSUVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWxlRUNsYXNzLCBGSUxFX19TSVpFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWxlRUNsYXNzLCBGSUxFX19ESVJFQ1RPUllfRU5UUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbGVFQ2xhc3MsIEZJTEVfX09SSUdJTkFMX1VSSSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsZUVDbGFzcywgRklMRV9fTE9BRElOR19DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbGVFQ2xhc3MsIEZJTEVfX0NPTlRBSU5FUik7Ci0KLQkJYXJjaGl2ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUkNISVZFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcmNoaXZlRUNsYXNzLCBBUkNISVZFX19UWVBFUyk7Ci0KLQkJZWpiSmFyRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfSkFSX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckZpbGVFQ2xhc3MsIEVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQotCQl3YXJGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3YXJGaWxlRUNsYXNzLCBXQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQotCQllYXJGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlYXJGaWxlRUNsYXNzLCBFQVJfRklMRV9fTU9EVUxFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVhckZpbGVFQ2xhc3MsIEVBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IpOwotCi0JCWFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUFBMSUNBVElPTl9DTElFTlRfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRGaWxlRUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQotCQltb2R1bGVGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1PRFVMRV9GSUxFKTsKLQotCQljb250YWluZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250YWluZXJFQ2xhc3MsIENPTlRBSU5FUl9fRklMRVMpOwotCi0JCXJlYWRPbmx5RGlyZWN0b3J5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFQURfT05MWV9ESVJFQ1RPUlkpOwotCi0JCXJhckZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkFSX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJhckZpbGVFQ2xhc3MsIFJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IpOwotCi0JCW1vZHVsZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RVTEVfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtb2R1bGVSZWZFQ2xhc3MsIE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtb2R1bGVSZWZFQ2xhc3MsIE1PRFVMRV9SRUZfX0VBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtb2R1bGVSZWZFQ2xhc3MsIE1PRFVMRV9SRUZfX01PRFVMRSk7Ci0KLQkJZWpiTW9kdWxlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9NT0RVTEVfUkVGKTsKLQotCQl3ZWJNb2R1bGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX01PRFVMRV9SRUYpOwotCi0JCWNsaWVudE1vZHVsZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDTElFTlRfTU9EVUxFX1JFRik7Ci0KLQkJY29ubmVjdG9yTW9kdWxlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTk5FQ1RPUl9NT0RVTEVfUkVGKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlMb29zZWNvbmZpZ1BhY2thZ2VJbXBsIHRoZUxvb3NlY29uZmlnUGFja2FnZSA9IChMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKExvb3NlY29uZmlnUGFja2FnZS5lTlNfVVJJKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdWJwYWNrYWdlcwotCQlnZXRFU3VicGFja2FnZXMoKS5hZGQodGhlTG9vc2Vjb25maWdQYWNrYWdlKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWFyY2hpdmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250YWluZXIoKSk7Ci0JCWVqYkphckZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQl3YXJGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlRmlsZSgpKTsKLQkJZWFyRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7Ci0JCWFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7Ci0JCW1vZHVsZUZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBcmNoaXZlKCkpOwotCQljb250YWluZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGaWxlKCkpOwotCQlyZWFkT25seURpcmVjdG9yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRhaW5lcigpKTsKLQkJcmFyRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7Ci0JCWVqYk1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKLQkJd2ViTW9kdWxlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlUmVmKCkpOwotCQljbGllbnRNb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVSZWYoKSk7Ci0JCWNvbm5lY3Rvck1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGZpbGVFQ2xhc3MsIEZpbGUuY2xhc3MsICJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX1VSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiVVJJIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9MYXN0TW9kaWZpZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJsYXN0TW9kaWZpZWQiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVfU2l6ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgInNpemUiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVfRGlyZWN0b3J5RW50cnkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkaXJlY3RvcnlFbnRyeSIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9PcmlnaW5hbFVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAib3JpZ2luYWxVUkkiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWxlX0xvYWRpbmdDb250YWluZXIoKSwgdGhpcy5nZXRDb250YWluZXIoKSwgbnVsbCwgImxvYWRpbmdDb250YWluZXIiLCBudWxsLCAxLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWxlX0NvbnRhaW5lcigpLCB0aGlzLmdldENvbnRhaW5lcigpLCB0aGlzLmdldENvbnRhaW5lcl9GaWxlcygpLCAiY29udGFpbmVyIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFyY2hpdmVFQ2xhc3MsIEFyY2hpdmUuY2xhc3MsICJBcmNoaXZlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBcmNoaXZlX1R5cGVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlcyIsIG51bGwsIDAsIC0xLCBBcmNoaXZlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiSmFyRmlsZUVDbGFzcywgRUpCSmFyRmlsZS5jbGFzcywgIkVKQkphckZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQkphckZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSwgdGhlRWpiUGFja2FnZS5nZXRFSkJKYXIoKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgRUpCSmFyRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdhckZpbGVFQ2xhc3MsIFdBUkZpbGUuY2xhc3MsICJXQVJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5nZXRXZWJBcHAoKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgV0FSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVhckZpbGVFQ2xhc3MsIEVBUkZpbGUuY2xhc3MsICJFQVJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFQVJGaWxlX01vZHVsZVJlZnMoKSwgdGhpcy5nZXRNb2R1bGVSZWYoKSwgdGhpcy5nZXRNb2R1bGVSZWZfRWFyRmlsZSgpLCAibW9kdWxlUmVmcyIsIG51bGwsIDEsIC0xLCBFQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZUFwcGxpY2F0aW9uUGFja2FnZS5nZXRBcHBsaWNhdGlvbigpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBFQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXBwbGljYXRpb25DbGllbnRGaWxlRUNsYXNzLCBBcHBsaWNhdGlvbkNsaWVudEZpbGUuY2xhc3MsICJBcHBsaWNhdGlvbkNsaWVudEZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVDbGllbnRQYWNrYWdlLmdldEFwcGxpY2F0aW9uQ2xpZW50KCksIG51bGwsICJkZXBsb3ltZW50RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIEFwcGxpY2F0aW9uQ2xpZW50RmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1vZHVsZUZpbGVFQ2xhc3MsIE1vZHVsZUZpbGUuY2xhc3MsICJNb2R1bGVGaWxlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjb250YWluZXJFQ2xhc3MsIENvbnRhaW5lci5jbGFzcywgIkNvbnRhaW5lciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250YWluZXJfRmlsZXMoKSwgdGhpcy5nZXRGaWxlKCksIHRoaXMuZ2V0RmlsZV9Db250YWluZXIoKSwgImZpbGVzIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlYWRPbmx5RGlyZWN0b3J5RUNsYXNzLCBSZWFkT25seURpcmVjdG9yeS5jbGFzcywgIlJlYWRPbmx5RGlyZWN0b3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocmFyRmlsZUVDbGFzcywgUkFSRmlsZS5jbGFzcywgIlJBUkZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSwgdGhlSmNhUGFja2FnZS5nZXRDb25uZWN0b3IoKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgUkFSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1vZHVsZVJlZkVDbGFzcywgTW9kdWxlUmVmLmNsYXNzLCAiTW9kdWxlUmVmIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZVJlZl9Nb2R1bGVGaWxlKCksIHRoaXMuZ2V0TW9kdWxlRmlsZSgpLCBudWxsLCAibW9kdWxlRmlsZSIsIG51bGwsIDEsIDEsIE1vZHVsZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlUmVmX0VhckZpbGUoKSwgdGhpcy5nZXRFQVJGaWxlKCksIHRoaXMuZ2V0RUFSRmlsZV9Nb2R1bGVSZWZzKCksICJlYXJGaWxlIiwgbnVsbCwgMSwgMSwgTW9kdWxlUmVmLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNb2R1bGVSZWZfTW9kdWxlKCksIHRoZUFwcGxpY2F0aW9uUGFja2FnZS5nZXRNb2R1bGUoKSwgbnVsbCwgIm1vZHVsZSIsIG51bGwsIDEsIDEsIE1vZHVsZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVqYk1vZHVsZVJlZkVDbGFzcywgRUpCTW9kdWxlUmVmLmNsYXNzLCAiRUpCTW9kdWxlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod2ViTW9kdWxlUmVmRUNsYXNzLCBXZWJNb2R1bGVSZWYuY2xhc3MsICJXZWJNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjbGllbnRNb2R1bGVSZWZFQ2xhc3MsIENsaWVudE1vZHVsZVJlZi5jbGFzcywgIkNsaWVudE1vZHVsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbm5lY3Rvck1vZHVsZVJlZkVDbGFzcywgQ29ubmVjdG9yTW9kdWxlUmVmLmNsYXNzLCAiQ29ubmVjdG9yTW9kdWxlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9Db21tb25hcmNoaXZlUGFja2FnZUltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JNb2R1bGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NTNkNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JNb2R1bGVSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db25uZWN0b3JNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yTW9kdWxlUmVmSW1wbCBleHRlbmRzIE1vZHVsZVJlZkltcGwgaW1wbGVtZW50cyBDb25uZWN0b3JNb2R1bGVSZWYsIE1vZHVsZVJlZiB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rvck1vZHVsZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvck1vZHVsZVJlZigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fRUFSX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19FQVJfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTLCBFQVJGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZHVsZUZpbGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNb2R1bGVGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlyZXR1cm4gZ2V0RWFyRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TW9kdWxlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TW9kdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCXNldE1vZHVsZUZpbGUoKE1vZHVsZUZpbGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXNldEVhckZpbGUoKEVBUkZpbGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlzZXRNb2R1bGVGaWxlKChNb2R1bGVGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXNldEVhckZpbGUoKEVBUkZpbGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXNldE1vZHVsZSgoTW9kdWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCXJldHVybiBtb2R1bGVGaWxlICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlyZXR1cm4gZ2V0RWFyRmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJcmV0dXJuIG1vZHVsZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNDb25uZWN0b3IoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0gLy9Db25uZWN0b3JNb2R1bGVSZWZJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNhODRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRhaW5lckltcGwgZXh0ZW5kcyBGaWxlSW1wbCBpbXBsZW1lbnRzIENvbnRhaW5lciB7Ci0KLQotCS8qKgotCSAqIElubmVyIGNsYXNzIHdoaWNoIG1haW50YWlucyB0aGUgaW5kZXggZm9yIHRoZSBkb21haW4ncyBjb2xsZWN0aW9uIG9mIG5vZGVzIGtleWVkIGJ5IG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEZpbGVOb3RpZmljYXRpb25BZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gKHR5cGUgPT0gIkZpbGVOb3RpZmljYXRpb25BZGFwdGVyIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkSW5kZXhlZEZpbGUoU3RyaW5nIG5ld1ZhbHVlLCBOb3RpZmllciBub3RpZmllcikgewotCQkJZmlsZUluZGV4LnB1dChuZXdWYWx1ZSwgbm90aWZpZXIpOwotCQkJaWYgKG5vdGlmaWVyLmVBZGFwdGVycygpID09IG51bGwgfHwgIW5vdGlmaWVyLmVBZGFwdGVycygpLmNvbnRhaW5zKHRoaXMpKQotCQkJCW5vdGlmaWVyLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUluZGV4ZWRGaWxlKFN0cmluZyBvbGRWYWx1ZSwgTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJCWZpbGVJbmRleC5yZW1vdmUob2xkVmFsdWUpOwotCQkJbm90aWZpZXIuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAoZmlsZUluZGV4ID09IG51bGwgfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCS8vSWYgdGhlIG5hbWUgY2hhbmdlZCwgdXBkYXRlIHRoZSBpbmRleAotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkuZXF1YWxzKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxlX1VSSSgpKSAmJiAoKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKS5nZXRDb250YWluZXIoKSA9PSBDb250YWluZXJJbXBsLnRoaXMpIHsKLQkJCQlmaWxlSW5kZXgucmVtb3ZlKG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQlmaWxlSW5kZXgucHV0KG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQl9Ci0JCQkvL0hhbmRsZSBhZGRzIGFuZCByZW1vdmVzCi0JCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKS5lcXVhbHMoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRhaW5lcl9GaWxlcygpKSAmJiBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSA9PSBDb250YWluZXJJbXBsLnRoaXMpIHsKLQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOiB7Ci0JCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlhZGRJbmRleGVkRmlsZShmaWxlLmdldFVSSSgpLCBmaWxlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6IHsKLQkJCQkJCXJlbW92ZUluZGV4ZWRGaWxlKCgoRmlsZSkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpLmdldFVSSSgpLCAoRmlsZSkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOiB7Ci0JCQkJCQlmaWxlc0FkZGVkKChMaXN0KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6IHsKLQkJCQkJCWZpbGVzUmVtb3ZlZCgoTGlzdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6IHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6IHsKLQkJCQkJCWlmIChub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKSAhPSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsgLy9UaGlzIGlzIG5vdyBhCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIHJlcGxhY2UgaW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTU9GMgotCQkJCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCQlyZW1vdmVJbmRleGVkRmlsZSgoKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKS5nZXRVUkkoKSwgKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCQlhZGRJbmRleGVkRmlsZShmaWxlLmdldFVSSSgpLCBmaWxlKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZmlsZXNBZGRlZChMaXN0IG5ld0ZpbGVzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRmlsZSBmaWxlID0gKEZpbGUpIG5ld0ZpbGVzLmdldChpKTsKLQkJCQlhZGRJbmRleGVkRmlsZShmaWxlLmdldFVSSSgpLCBmaWxlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZpbGVzUmVtb3ZlZChMaXN0IG9sZEZpbGVzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRmlsZSBmaWxlID0gKEZpbGUpIG9sZEZpbGVzLmdldChpKTsKLQkJCQlyZW1vdmVJbmRleGVkRmlsZShmaWxlLmdldFVSSSgpLCBmaWxlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlYnVpbGRGaWxlSW5kZXgoKSB7Ci0JCQlyZW1vdmVBZGFwdGVyc0lmTmVjZXNzYXJ5KCk7Ci0JCQlmaWxlSW5kZXggPSBuZXcgSGFzaE1hcCgpOwotCi0JCQkvLyBJZiB0aGUgcHJpbWFyeSBjb2xsZWN0aW9uIGFscmVhZHkgaGFzIGVsZW1lbnRzLAotCQkJLy8ncmVmbGVjdCB0aGVtIGluIHRoZSBpbmRleC4uLgotCQkJaWYgKGdldEZpbGVzKCkuc2l6ZSgpID4gMCkgewotCQkJCUl0ZXJhdG9yIGkgPSBnZXRGaWxlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpLm5leHQoKTsKLQkJCQkJYWRkSW5kZXhlZEZpbGUoZmlsZS5nZXRVUkkoKSwgZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWRhcHRlcnNJZk5lY2Vzc2FyeSgpIHsKLQkJCWlmIChmaWxlSW5kZXggPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJdGVyYXRvciBpdGVyID0gZmlsZUluZGV4LnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlGaWxlIGFGaWxlID0gKEZpbGUpIGl0ZXIubmV4dCgpOwotCQkJCWFGaWxlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBJbXBsZW1lbnRlciBmb3IgbG9hZGluZyBlbnRyaWVzIGluIHRoaXMgY29udGFpbmVyICovCi0JcHJvdGVjdGVkIExvYWRTdHJhdGVneSBsb2FkU3RyYXRlZ3k7Ci0JLyoqCi0JICogSW5kZXggdG8gcHJvdmlkZSBmYXN0IGxvb2t1cCBieSBuYW1lIG9mIGZpbGVzLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZmlsZUluZGV4OwotCS8qKgotCSAqIEFuIGFkYXB0ZXIgd2hpY2ggbWFpbnRhaW5zIHRoZSBmaWxlIGluZGV4Ci0JICovCi0JcHJvdGVjdGVkIEZpbGVOb3RpZmljYXRpb25BZGFwdGVyIGZpbGVJbmRleEFkYXB0ZXI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGZpbGVzID0gbnVsbDsKLQotCXB1YmxpYyBDb250YWluZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHsKLQkJU3RyaW5nIGtleSA9IGFVcmkuc3RhcnRzV2l0aCgiLyIpID8gQXJjaGl2ZVV0aWwudHJ1bmNhdGVGcm9tRnJvbnRJZ25vcmVDYXNlKGFVcmksICIvIikgOiBhVXJpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCWlmIChpc0luZGV4ZWQoKSkKLQkJCXJldHVybiBnZXRGaWxlSW5kZXgoKS5jb250YWluc0tleShrZXkpOwotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuY29udGFpbnMoa2V5KTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db250YWluZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RmlsZShTdHJpbmcgVVJJKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoIWlzSW5kZXhlZCgpKSB7Ci0JCQlnZXRGaWxlcygpOwotCQl9Ci0JCUZpbGUgZmlsZSA9IChGaWxlKSBnZXRGaWxlSW5kZXgoKS5nZXQoVVJJKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uKFVSSSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDUvMDAgNzoyMDoyMSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLk1hcCBnZXRGaWxlSW5kZXgoKSB7Ci0JCWlmIChmaWxlSW5kZXggPT0gbnVsbCkKLQkJCWdldEZpbGVJbmRleEFkYXB0ZXIoKS5yZWJ1aWxkRmlsZUluZGV4KCk7Ci0JCXJldHVybiBmaWxlSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDUvMDAgNzoyMDoyMSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIEZpbGVOb3RpZmljYXRpb25BZGFwdGVyCi0JICovCi0JcHJvdGVjdGVkIEZpbGVOb3RpZmljYXRpb25BZGFwdGVyIGdldEZpbGVJbmRleEFkYXB0ZXIoKSB7Ci0JCWlmIChmaWxlSW5kZXhBZGFwdGVyID09IG51bGwpIHsKLQkJCWZpbGVJbmRleEFkYXB0ZXIgPSBuZXcgRmlsZU5vdGlmaWNhdGlvbkFkYXB0ZXIoKTsKLQkJCWVBZGFwdGVycygpLmFkZChmaWxlSW5kZXhBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gZmlsZUluZGV4QWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0IGlzIGJ1aWx0IG9uIGRlbWFuZCwgYnkgcmVxdWVzdGluZyBmcm9tIHRoZSBsb2FkIHN0cmF0ZWd5LgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGaWxlcygpIHsKLQkJRUxpc3QgZmlsZXNMaXN0ID0gdGhpcy5nZXRGaWxlc0dlbigpOwotCQlpZiAoIWlzSW5kZXhlZCgpKSB7Ci0JCQlpZiAoZmlsZXNMaXN0LmlzRW1wdHkoKSAmJiBnZXRMb2FkU3RyYXRlZ3koKSAhPSBudWxsKSB7Ci0JCQkJZmlsZXNMaXN0LmFkZEFsbChnZXRMb2FkU3RyYXRlZ3koKS5jb2xsZWN0RmlsZXMoKSk7Ci0JCQl9Ci0JCQkvL0NhdXNlcyB0aGUgaW5kZXggdG8gYmUgYnVpbHQKLQkJCWdldEZpbGVJbmRleCgpOwotCQl9Ci0JCXJldHVybiBmaWxlc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUgTG9va3MgZm9yIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiB1cmksIGFuZCByZXR1cm5zIGFuCi0JICogICAgICBpbnB1dCBzdHJlYW07IG9wdGltaXphdGlvbjogaWYgdGhlIGZpbGUgbGlzdCBoYXMgbm90IGJlZW4gYnVpbHQsIGdvZXMgZGlyZWN0bHkgdG8gdGhlCi0JICogICAgICBsb2FkU3RyYXRlZ3kuCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZyBhVXJpKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoaXNJbmRleGVkKCkpIHsKLQkJCXJldHVybiBnZXRGaWxlKGFVcmkpLmdldElucHV0U3RyZWFtKCk7Ci0JCX0KLQkJcmV0dXJuIHByaW1HZXRJbnB1dFN0cmVhbShhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IGdldExvYWRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGxvYWRTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkgewotCQlyZXR1cm4gZmlsZUluZGV4ICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUgR29lcyBkaXJlY3RseSB0byB0aGUgbG9hZFN0cmF0ZWd5LgotCSAqLwotCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIHByaW1HZXRJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRJbnB1dFN0cmVhbShhVXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWJ1aWxkRmlsZUluZGV4KCkgewotCQlnZXRGaWxlSW5kZXhBZGFwdGVyKCkucmVidWlsZEZpbGVJbmRleCgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0xvYWRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkU3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IG5ld0xvYWRTdHJhdGVneSkgewotCi0JCWlmIChuZXdMb2FkU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJbmV3TG9hZFN0cmF0ZWd5LnNldENvbnRhaW5lcih0aGlzKTsKLQkJCWlmIChsb2FkU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJCW5ld0xvYWRTdHJhdGVneS5zZXRSZW5kZXJlclR5cGUobG9hZFN0cmF0ZWd5LmdldFJlbmRlcmVyVHlwZSgpKTsKLQkJCQluZXdMb2FkU3RyYXRlZ3kuc2V0UmVhZE9ubHkobG9hZFN0cmF0ZWd5LmlzUmVhZE9ubHkoKSk7Ci0JCQkJbG9hZFN0cmF0ZWd5LnNldENvbnRhaW5lcihudWxsKTsKLQkJCQlsb2FkU3RyYXRlZ3kuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlsb2FkU3RyYXRlZ3kgPSBuZXdMb2FkU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RmlsZXNHZW4oKSB7Ci0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlmaWxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KEZpbGUuY2xhc3MsIHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUik7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fQ09OVEFJTkVSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTLCBDb250YWluZXIuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldExhc3RNb2RpZmllZCgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19TSVpFOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRTaXplKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNEaXJlY3RvcnlFbnRyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIGdldE9yaWdpbmFsVVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJcmV0dXJuIGdldEZpbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19VUkk6Ci0JCQkJc2V0VVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19MQVNUX01PRElGSUVEOgotCQkJCXNldExhc3RNb2RpZmllZCgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fU0laRToKLQkJCQlzZXRTaXplKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJc2V0RGlyZWN0b3J5RW50cnkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCWdldEZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19VUkk6Ci0JCQkJc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fU0laRToKLQkJCQl1bnNldFNpemUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXVuc2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKE9SSUdJTkFMX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19TSVpFOgotCQkJCXJldHVybiBpc1NldFNpemUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzU2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lciAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUzoKLQkJCQlyZXR1cm4gZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckZpbGVzKCkgewotCQlib29sZWFuIG9sZERlbGl2ZXJ5ID0gZURlbGl2ZXIoKTsKLQkJZmlsZXMuY2xlYXIoKTsKLQkJZVNldERlbGl2ZXIob2xkRGVsaXZlcnkpOwotCQlpZiAoaXNJbmRleGVkKCkpIHsKLQkJCWVBZGFwdGVycygpLnJlbW92ZShmaWxlSW5kZXhBZGFwdGVyKTsKLQkJCWZpbGVJbmRleEFkYXB0ZXIgPSBudWxsOwotCQkJZmlsZUluZGV4ID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUFSRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUFSRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiNmU1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VBUkZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQ29ubmVjdG9yTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkVqYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5FbXB0eVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVBUkZpbGVJbXBsIGV4dGVuZHMgTW9kdWxlRmlsZUltcGwgaW1wbGVtZW50cyBFQVJGaWxlIHsKLQotCS8qKgotCSAqIEludGVybmFsOyBjbGllbnRzIHNob3VsZCB1c2Uge0BsaW5rICNnZXRNb2R1bGVSZWYoTW9kdWxlKX0KLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlKE1vZHVsZSBtb2R1bGVEZXNjcmlwdG9yKSB7Ci0JCU1vZHVsZVJlZiByZWYgPSBnZXRNb2R1bGVSZWYobW9kdWxlRGVzY3JpcHRvcik7Ci0JCXJldHVybiAocmVmID09IG51bGwpID8gbnVsbCA6IHJlZi5nZXRNb2R1bGVGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZSBhZGRDb3B5KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlPYmplY3QgcmVzdWx0ID0gcHJpbUFkZENvcHlSZWYoYU1vZHVsZUZpbGUpOwotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgTW9kdWxlUmVmKQotCQkJcmV0dXJuICgoTW9kdWxlUmVmKSByZXN1bHQpLmdldE1vZHVsZUZpbGUoKTsKLQotCQlyZXR1cm4gKE1vZHVsZUZpbGUpIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb24gZGVwbG95bWVudERlc2NyaXB0b3IgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtb2R1bGVSZWZzID0gbnVsbDsKLQotCXB1YmxpYyBFQVJGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUFSRmlsZSgpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlIGFkZENvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGFuQXJjaGl2ZS5pc01vZHVsZUZpbGUoKSkKLQkJCXJldHVybiBhZGRDb3B5KChNb2R1bGVGaWxlKSBhbkFyY2hpdmUpOwotCQlBcmNoaXZlIGNvcHkgPSBzdXBlci5hZGRDb3B5KGFuQXJjaGl2ZSk7Ci0JCWNvcHkuaW5pdGlhbGl6ZUNsYXNzTG9hZGVyKCk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgcHJpbUFkZENvcHlSZWYoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCS8vZm9yY2UgdGhpcyBsaXN0IHRvIGdldCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGFkZAotCQlFTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCi0JCWlmIChhTW9kdWxlRmlsZS5pc0VBUkZpbGUoKSkKLQkJCS8vSWYgaXQncyBhbiBlYXIgdGhlbiBqdXN0IHRyZWF0IGl0IGxpa2UgYW55IG90aGVyIGFyY2hpdmUKLQkJCXJldHVybiAoTW9kdWxlRmlsZSkgc3VwZXIuYWRkQ29weShhTW9kdWxlRmlsZSk7Ci0JCWNoZWNrQWRkVmFsaWQoYU1vZHVsZUZpbGUpOwotCQlNb2R1bGVGaWxlIGNvcHkgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNvcHkoYU1vZHVsZUZpbGUpOwotCQlNb2R1bGUgbmV3TW9kdWxlID0gY3JlYXRlTW9kdWxlRm9yQ29weWluZyhhTW9kdWxlRmlsZSk7Ci0JCWdldEZpbGVzKCkuYWRkKGNvcHkpOwotCQljb3B5LmluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCQlpZiAoIWNvcHkuZ2V0VVJJKCkuZXF1YWxzKG5ld01vZHVsZS5nZXRVcmkoKSkpCi0JCQljb3B5LnNldFVSSShuZXdNb2R1bGUuZ2V0VXJpKCkpOwotCi0JCWdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpLmFkZChuZXdNb2R1bGUpOwotCQlNb2R1bGVSZWYgYVJlZiA9IGNyZWF0ZU1vZHVsZVJlZihuZXdNb2R1bGUsIGNvcHkpOwotCQlyZWZzLmFkZChhUmVmKTsKLQkJcmV0dXJuIGFSZWY7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlUmVmIGFkZENvcHlSZWYoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCByZXN1bHQgPSBwcmltQWRkQ29weVJlZihhTW9kdWxlRmlsZSk7Ci0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBNb2R1bGVSZWYpCi0JCQlyZXR1cm4gKE1vZHVsZVJlZikgcmVzdWx0OwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGUgYWRkQ29weShTZWN1cml0eVJvbGUgYVJvbGUsIE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJRU9iamVjdCBkZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKGFNb2R1bGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZGRfaW5fZWFyX2xvYWRfRVhDXyIsIChuZXcgT2JqZWN0W117YU1vZHVsZS5nZXRVcmkoKSwgZ2V0VVJJKCl9KSksIGUpOyAvLyROT04tTkxTLTEkID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgbW9kdWxlICJ7MH0iIGluIGVhciBmaWxlICJ7MX0iIgotCQl9Ci0JCVN0cmluZyByb2xlTmFtZSA9IGFSb2xlLmdldFJvbGVOYW1lKCk7Ci0JCVNlY3VyaXR5Um9sZSBjb3B5ID0gKFNlY3VyaXR5Um9sZSkgRXRvb2xzQ29weVV0aWxpdHkuY3JlYXRlQ29weShhUm9sZSk7Ci0JCWlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLQkJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKSBkZDsKLQkJCWlmIChlamJKYXIuY29udGFpbnNTZWN1cml0eVJvbGUocm9sZU5hbWUpKQotCQkJCXRocm93IG5ldyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImR1cF9zZWNfcm9sZV9tb2R1bGVfRVhDXyIsIChuZXcgT2JqZWN0W117YU1vZHVsZS5nZXRVcmkoKSwgcm9sZU5hbWV9KSksIGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVOYW1lZChyb2xlTmFtZSkpOyAvLyROT04tTkxTLTEkID0gIkRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgezB9IGFscmVhZHkgY29udGFpbnMgYSBzZWN1cml0eSByb2xlIG5hbWVkIHsxfSIKLQkJCWdldEFzc2VtYmx5RGVzY3JpcHRvckFkZElmTmVjZXNzYXJ5KGVqYkphcikuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChjb3B5KTsKLQkJfSBlbHNlIGlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBkZDsKLQkJCWlmICh3ZWJBcHAuY29udGFpbnNTZWN1cml0eVJvbGUocm9sZU5hbWUpKQotCQkJCXRocm93IG5ldyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImR1cF9zZWNfcm9sZV9tb2R1bGVfRVhDXyIsIChuZXcgT2JqZWN0W117YU1vZHVsZS5nZXRVcmkoKSwgcm9sZU5hbWV9KSksIHdlYkFwcC5nZXRTZWN1cml0eVJvbGVOYW1lZChyb2xlTmFtZSkpOy8vJE5PTi1OTFMtMSQgPSAiRGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB7MH0gYWxyZWFkeSBjb250YWlucyBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgezF9IgotCQkJd2ViQXBwLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoY29weSk7Ci0JCX0KLQkJYWRkQ29weUlmTm90RXhpc3RzKGFSb2xlKTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlIGFkZENvcHlJZk5vdEV4aXN0cyhTZWN1cml0eVJvbGUgYVJvbGUpIHsKLQkJQXBwbGljYXRpb24gZGQgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlTZWN1cml0eVJvbGUgY29weSA9IG51bGw7Ci0JCWlmICghZGQuY29udGFpbnNTZWN1cml0eVJvbGUoYVJvbGUuZ2V0Um9sZU5hbWUoKSkpIHsKLQkJCWNvcHkgPSAoU2VjdXJpdHlSb2xlKSBFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KGFSb2xlKTsKLQkJCWRkLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoY29weSk7Ci0JCX0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tEdXBsaWNhdGUoU3RyaW5nIGFVcmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlpZiAoaXNEdXBsaWNhdGUoYVVyaSkpCi0JCQl0aHJvdyBuZXcgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJkdXBfcmVzb3VyY2VfRVhDXyIsIChuZXcgT2JqZWN0W117YVVyaSwgZ2V0VVJJKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIlJlc291cmNlIG5hbWVkICJ7MH0iIGFscmVhZHkgZXhpc3RzIGluIGFyY2hpdmUgInsxfSIiCi0JfQotCi0KLQlwcm90ZWN0ZWQgTW9kdWxlIGNyZWF0ZU1vZHVsZUZvckNvcHlpbmcoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgewotCQlNb2R1bGUgYU1vZHVsZSA9IG51bGw7Ci0JCWlmIChhTW9kdWxlRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJYU1vZHVsZSA9IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZVdlYk1vZHVsZSgpOwotCQl9IGVsc2UgaWYgKGFNb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlhTW9kdWxlID0gZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlRWpiTW9kdWxlKCk7Ci0JCX0gZWxzZSBpZiAoYU1vZHVsZUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJYU1vZHVsZSA9IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKTsKLQkJfSBlbHNlIGlmIChhTW9kdWxlRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJYU1vZHVsZSA9IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotCQl9Ci0JCWFNb2R1bGUuc2V0VXJpKGFNb2R1bGVGaWxlLmdldFVSSSgpKTsKLQkJcmV0dXJuIGFNb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBPbmx5IHJldHVybiBudWxsIGlmIGFuIGFsdEREIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQkvLyBMb29rIGZvciBhbHRERAotCQlTdHJpbmcgYWx0REQgPSBhTW9kdWxlLmdldEFsdEREKCk7Ci0JCWlmIChBcmNoaXZlVXRpbC5pc051bGxPckVtcHR5KGFsdEREKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzTW9mUmVzb3VyY2VMb2FkZWQoYWx0REQudHJpbSgpKSkKLQkJCXJlZ2lzdGVyUmVzb3VyY2VGYWN0b3J5KGFNb2R1bGUsIGFsdEREKTsKLQkJWE1MUmVzb3VyY2UgZGRSZXMgPSAoWE1MUmVzb3VyY2UpIGdldE1vZlJlc291cmNlKGFsdERELnRyaW0oKSk7Ci0JCWlmICghZGRSZXMuaXNBbHQoKSkgewotCQkJZGRSZXMuc2V0SXNBbHQodHJ1ZSk7Ci0JCQlkZFJlcy5zZXRBcHBsaWNhdGlvbihnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpKTsKLQkJfQotCQlyZXR1cm4gQXJjaGl2ZVV0aWwuZ2V0Um9vdChkZFJlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVzKCkgewotCQlMaXN0IGNsaWVudEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJCWNsaWVudEZpbGVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNsaWVudEZpbGVzOwotCX0KLQotCXByb3RlY3RlZCBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkgewotCQlyZXR1cm4gKChBcHBsaWNhdGlvblBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSkuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFzc2VtYmx5RGVzY3JpcHRvciBnZXRBc3NlbWJseURlc2NyaXB0b3JBZGRJZk5lY2Vzc2FyeShFSkJKYXIgZWpiSmFyKSB7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhZCA9IGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJaWYgKGFkID09IG51bGwpIHsKLQkJCWFkID0gKChFamJQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpKS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCQllamJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGFkKTsKLQkJfQotCQlyZXR1cm4gYWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uIGRkID0gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCQlpZiAoZGQgPT0gbnVsbCAmJiBjYW5MYXp5SW5pdGlhbGl6ZSgpKSB7Ci0JCQl0cnkgewotCQkJCWdldEltcG9ydFN0cmF0ZWd5KCkuaW1wb3J0TWV0YURhdGEoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3QgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIFRha2VzIGludG8gYWNjb3VudAotCSAqIGFsdEREIGluZGlyZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoQ29ubmVjdG9yTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoTW9kdWxlKSBhTW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBUYWtlcyBpbnRvIGFjY291bnQKLQkgKiBhbHRERCBpbmRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGdldERlcGxveW1lbnREZXNjcmlwdG9yKEVqYk1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlyZXR1cm4gKEVKQkphcikgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKE1vZHVsZSkgYU1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldERlcGxveW1lbnREZXNjcmlwdG9yKEphdmFDbGllbnRNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudCkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKE1vZHVsZSkgYU1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCUVPYmplY3QgZGQgPSBnZXRBbHREZXBsb3ltZW50RGVzY3JpcHRvcihhTW9kdWxlKTsKLQkJaWYgKGRkID09IG51bGwpCi0JCQlkZCA9IGdldE1vZHVsZUZpbGUoYU1vZHVsZSkuZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlyZXR1cm4gZGQ7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihXZWJNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChXZWJBcHApIGdldERlcGxveW1lbnREZXNjcmlwdG9yKChNb2R1bGUpIGFNb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Nb2R1bGVGaWxlCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRFSkJKYXJGaWxlcygpIHsKLQkJTGlzdCBlamJKYXJGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZUxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQkJZWpiSmFyRmlsZXMuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWpiSmFyRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMuIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUKLQkgKiByZWYgbXVzdCBlcXVhdGUgdG8gYSBuYW1lZCBlbnRlcnByaXNlIGJlYW4gY29udGFpbmVkIGluIHRoZSBqYXI7IG90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBoaXQgZm91bmQ7IGFzc3VtcHRpb24gdGhhdCB0aGUgZWpiIG5hbWVzIGFyZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUKLQkgKiBlYXIgZmlsZS4gVGhpcyB3aWxsIGxpa2VseSBiZSByZXBsYWNlZCB3aXRoIGEgYmV0dGVyIHdheSBmb3IgZGVyZWZlcmVuY2luZyBlamIgcmVmcy4KLQkgKiAKLQkgKiBDYW4gYmUgdXNlZCB3aXRoIGVqYiAxLjEgcmVmZXJlbmNlcyBvbmx5LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHtAbGluayNnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmLCBTdHJpbmcgbW9kdWxlVXJpICkKLQkgKiBAcGFyYW0gRWpiUmVmCi0JICogICAgICAgICAgICByZWYgLSBBbiBlamIgcmVmZXJlbmNlCi0JICogQHJldHVybiBFbnRlcnByaXNlQmVhbgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmKSB7Ci0JCVN0cmluZyBsaW5rID0gcmVmLmdldExpbmsoKTsKLQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBqYXJGaWxlcyA9IGdldEVKQkphckZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamFyRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoKEVKQkphckZpbGUpIGphckZpbGVzLmdldChpKSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRFbnRlcnByaXNlQmVhbk5hbWVkKGxpbmspOwotCQkJaWYgKGJlYW4gIT0gbnVsbCkgewotCQkJCXJldHVybiBiZWFuOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLiBUaGUgZWpiLWxpbmsgdmFsdWUgb2YgdGhlCi0JICogcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICogUmV0dXJucyB0aGUgZmlyc3QgaGl0IGZvdW5kOyBhc3N1bXB0aW9uIHRoYXQgdGhlIGVqYiBuYW1lcyBhcmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlCi0JICogZWFyIGZpbGUuIFRoaXMgd2lsbCBsaWtlbHkgYmUgcmVwbGFjZWQgd2l0aCBhIGJldHRlciB3YXkgZm9yIGRlcmVmZXJlbmNpbmcgZWpiIHJlZnMKLQkgKiAKLQkgKiBDYW4gYmUgdXNlZCB3aXRoIGVqYiAxLjEgJiBlamIgMi4wIHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIEVqYlJlZgotCSAqICAgICAgICAgICAgcmVmIC0gQW4gZWpiIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIG1vZHVsZVVyaSAtIFRoZSBtb2R1bGUgdXJpCi0JICogQHJldHVybiBFbnRlcnByaXNlQmVhbgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmLCBTdHJpbmcgbW9kdWxlVXJpKSB7Ci0JCVN0cmluZyBsaW5rID0gcmVmLmdldExpbmsoKTsKLQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0vLyBpZgotCi0JCWlmIChsaW5rLmluZGV4T2YoJyMnKSA9PSAtMSkgewotCQkJRW50ZXJwcmlzZUJlYW4gbGlua2VkRUpCID0gbnVsbDsKLQkJCVhNTFJlc291cmNlIHJlcyA9IChYTUxSZXNvdXJjZSkgcmVmLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyBpbnN0YW5jZW9mIEVKQlJlc291cmNlKSB7Ci0JCQkJLy9NdXN0IGJlIGluIGFuIEVKQiBKQVIgdG8gYmUgaGVyZQotCQkJCUVKQkphciBqYXIgPSAoKEVKQlJlc291cmNlKSByZXMpLmdldEVKQkphcigpOwotCQkJCWlmIChqYXIgIT0gbnVsbCkKLQkJCQkJbGlua2VkRUpCID0gamFyLmdldEVudGVycGlzZUJlYW5Gcm9tUmVmKHJlZik7Ci0JCQl9Ci0JCQlpZiAobGlua2VkRUpCID09IG51bGwpIHsKLQkJCQlMaXN0IGphckZpbGVzID0gZ2V0RUpCSmFyRmlsZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGphckZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCWxpbmtlZEVKQiA9ICgoRUpCSmFyRmlsZSkgamFyRmlsZXMuZ2V0KGkpKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEVudGVycHJpc2VCZWFuTmFtZWQobGluayk7Ci0JCQkJCWlmIChsaW5rZWRFSkIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGxpbmtlZEVKQjsKLQkJCQkJfS8vIGlmCi0JCQkJfS8vIGZvcgotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIGxpbmtlZEVKQjsKLQkJfSBlbHNlIHsKLQkJCS8vR3JhYiB0aGUgZWpiIG5hbWUgYW5kIGVqYiBqYXIgbmFtZSBmcm9tIHRoZSBsaW5rCi0JCQlTdHJpbmcgZWpiQmVhbk5hbWUgPSBsaW5rLnN1YnN0cmluZyhsaW5rLmluZGV4T2YoIiMiKSArIDEsIGxpbmsubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZWpiSmFyTmFtZSA9IGxpbmsuc3Vic3RyaW5nKDAsIGxpbmsuaW5kZXhPZigiIyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoZWpiQmVhbk5hbWUgIT0gbnVsbCAmJiBlamJKYXJOYW1lICE9IG51bGwpIHsKLQkJCQkvL0dldCB0aGUgdXJpIG9mIHRoZSBqYXIgbmFtZS4KLQkJCQlTdHJpbmcgZWpiSmFyVXJpID0gQXJjaGl2ZVV0aWwuZGVyaXZlRUFSUmVsYXRpdmVVUkkoZWpiSmFyTmFtZSwgbW9kdWxlVXJpKTsKLQkJCQlpZiAoZWpiSmFyVXJpICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vR2V0IHRoZSBhY3R1YWwgamFyIGZpbGUKLQkJCQkJCUZpbGUgYUZpbGUgPSBnZXRGaWxlKGVqYkphclVyaSk7Ci0JCQkJCQlpZiAoYUZpbGUgPT0gbnVsbCB8fCAhYUZpbGUuaXNFSkJKYXJGaWxlKCkpCi0JCQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQkJCUVKQkphckZpbGUgamFyRmlsZSA9IChFSkJKYXJGaWxlKSBnZXRGaWxlKGVqYkphclVyaSk7Ci0JCQkJCQlMaXN0IGVqYnMgPSBqYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCQkJCQkvL0NoZWNrIGlmIGFueSBvZiB0aGUgYmVhbnMgaW4gdGhlIGxpc3QgbWF0Y2ggdGhlIGdpdmVuIGVqYiBiZWFuIG5hbWUgZ2l2ZQotCQkJCQkJLy8gaW4KLQkJCQkJCS8vdGhlIGxpbmsKLQkJCQkJCWlmIChlamJzICE9IG51bGwgJiYgIWVqYnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJSXRlcmF0b3IgaXQgPSBlamJzLml0ZXJhdG9yKCk7Ci0JCQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkJCQlFbnRlcnByaXNlQmVhbiBlamJCZWFuID0gKEVudGVycHJpc2VCZWFuKSBpdC5uZXh0KCk7Ci0JCQkJCQkJCWlmIChlamJCZWFuICE9IG51bGwgJiYgZWpiQmVhbi5nZXROYW1lKCkuZXF1YWxzKGVqYkJlYW5OYW1lKSkgewotCQkJCQkJCQkJcmV0dXJuIGVqYkJlYW47Ci0JCQkJCQkJCX0vLyBpZgotCQkJCQkJCX0vLyB3aGlsZQotCQkJCQkJfS8vIGlmCi0JCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmZSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0vLyB0cnkKLQkJCQl9Ly8gaWYKLQkJCX0vLyBpZgotCQl9Ly8gaWYKLQkJcmV0dXJuIG51bGw7Ci0JfS8vIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmCi0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyBhVXJpLCBTdHJpbmcgYWx0REQpIHsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlKGFVcmksIGFsdEREKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVSZWYgZ2V0TW9kdWxlUmVmKE1vZHVsZSBtb2R1bGVEZXNjcmlwdG9yKSB7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmdldE1vZHVsZSgpID09IG1vZHVsZURlc2NyaXB0b3IpCi0JCQkJcmV0dXJuIHJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWx0ZXJlZCBsaXN0IG9mIHRoZSBhcmNoaXZlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZHVsZUZpbGVzKCkgewotCQlMaXN0IG1vZHVsZUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNNb2R1bGVGaWxlKCkpIHsKLQkJCQltb2R1bGVGaWxlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVGaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZU9wdGlvbnMgZ2V0T3B0aW9uc0Zvck9wZW5pbmcoU3RyaW5nIGFVcmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJTG9hZFN0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDaGlsZExvYWRTdHJhdGVneShhVXJpLCBnZXRMb2FkU3RyYXRlZ3koKSk7Ci0JCXJldHVybiBnZXRPcHRpb25zKCkuY2xvbmVXaXRoKHN0cmF0ZWd5LCBhVXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZU9wdGlvbnMgZ2V0T3B0aW9uc0Zvck9wZW5pbmcoTG9vc2VBcmNoaXZlIGxvb3NlKSB0aHJvd3MgSU9FeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uewotCQlpZihsb29zZS5nZXRCaW5hcmllc1BhdGgoKSA9PSBudWxsKXsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib3Blbl9uZXN0ZWRfRVhDXyIsIChuZXcgT2JqZWN0W10ge2xvb3NlLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgPSAiQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iIgotCQl9Ci0JCUxvYWRTdHJhdGVneSBzdHJhdGVneSA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlTG9hZFN0cmF0ZWd5KGxvb3NlLmdldEJpbmFyaWVzUGF0aCgpKTsKLQkJc3RyYXRlZ3kuc2V0TG9vc2VBcmNoaXZlKGxvb3NlKTsKLQkJcmV0dXJuIGdldE9wdGlvbnMoKS5jbG9uZVdpdGgoc3RyYXRlZ3ksIGxvb3NlLmdldFVyaSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSQVJGaWxlcygpIHsKLQkJTGlzdCByYXJGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZUxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQkJcmFyRmlsZXMuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmFyRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Um9sZXNGcm9tQWxsTW9kdWxlcygpIHsKLQkJRUxpc3Qgcm9sZUxpc3QgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QoKTsKLQkJTGlzdCBtb2R1bGVzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gbW9kdWxlcy5zaXplKCk7IGkgPCBuOyBpKyspIHsKLQkJCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlFTGlzdCByb2xlcyA9IGdldFJvbGVzRnJvbU1vZHVsZShhTW9kdWxlKTsKLQkJCWZvciAoaW50IGogPSAwLCBtID0gcm9sZXMuc2l6ZSgpOyBqIDwgbTsgaisrKSB7Ci0JCQkJcm9sZUxpc3QuYWRkKHJvbGVzLmdldChqKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvbGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGVzRnJvbU1vZHVsZShNb2R1bGUgYU1vZHVsZSkgewotCQlFTGlzdCByb2xlTGlzdCA9IG5ldyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCgpOwotCQl0cnkgewotCQkJaWYgKGFNb2R1bGUuaXNXZWJNb2R1bGUoKSkKLQkJCQlyb2xlTGlzdCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKChXZWJNb2R1bGUpIGFNb2R1bGUpLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCWVsc2UgaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkKLQkJCQlyb2xlTGlzdCA9IGdldEFzc2VtYmx5RGVzY3JpcHRvckFkZElmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yKChFamJNb2R1bGUpIGFNb2R1bGUpKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJkZF9pbl9lYXJfbG9hZF9FWENfIiwgKG5ldyBPYmplY3RbXXthTW9kdWxlLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgZSk7IC8vJE5PTi1OTFMtMSQgPSAiRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBtb2R1bGUgInswfSIgaW4gZWFyIGZpbGUgInsxfSIiCi0JCX0KLQkJcmV0dXJuIHJvbGVMaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRGVwbG95ZW1lbnREZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0V0FSRmlsZXMoKSB7Ci0JCUxpc3Qgd2FyRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJCXdhckZpbGVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdhckZpbGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBZnRlck9wZW4oKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVBZnRlck9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUFSRmlsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgc3VwZXIgcmV0dXJucyB0cnVlLCBvciByZXR1cm4gd2hldGhlciB0aGUgYXBwIGRkIGNvbnRhaW5zIGEgbW9kdWxlIGhhdmluZyB0aGUKLQkgKiB1cmkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05lc3RlZEFyY2hpdmUoU3RyaW5nIGFVcmkpIHsKLQkJaWYgKHN1cGVyLmlzTmVzdGVkQXJjaGl2ZShhVXJpKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRGaXJzdE1vZHVsZShhVXJpKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5pbXBsLk1vZHVsZUZpbGVJbXBsCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IG1ha2VEZXBsb3ltZW50RGVzY3JpcHRvcihYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlBcHBsaWNhdGlvbiBhcHBsID0gKChBcHBsaWNhdGlvblBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSkuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLQkJcmVzb3VyY2Uuc2V0SUQoYXBwbCwgSjJFRUNvbnN0YW50cy5BUFBMX0lEKTsKLQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oYXBwbCk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGFwcGwpOwotCQlyZXR1cm4gYXBwbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKExvb3NlQXJjaGl2ZSBsb29zZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQotCQlNb2R1bGUgbSA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUobG9vc2UuZ2V0VXJpKCkpOwotCQlpZiAobSA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLm9wZW5OZXN0ZWRBcmNoaXZlKGxvb3NlKTsKLQotCQl0cnkgewotCQkJQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMgPSBnZXRPcHRpb25zRm9yT3BlbmluZyhsb29zZSk7Ci0JCQlyZXR1cm4gb3Blbk5lc3RlZEFyY2hpdmUobSwgYXJjaGl2ZU9wdGlvbnMpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL1Byb2JhYmx5IHRoZSBmaWxlIGRpZCBub3QgZXhpc3Q7IHNpbGVudGx5IGZhaWwsIHBlciByZXF1ZXN0IGZyb20gV1MgcnVudGltZQotCQkJLy9Nb3JlIHRoYW4gbGlrZWx5IGEgZmFpbHVyZSBpcyBnb2luZyB0byBvY2N1ciBkb3duIHRoZSByb2FkIHdoZW4gYSBNb2R1bGVGaWxlIGZvciBhCi0JCQkvLyBNb2R1bGUKLQkJCS8vaW4gdGhlIGRkIGlzIHJlcXVlc3RlZAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoU3RyaW5nIGFVcmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJTW9kdWxlIG0gPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKGFVcmkpOwotCQlpZiAobSA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLm9wZW5OZXN0ZWRBcmNoaXZlKGFVcmkpOwotCi0JCXRyeSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucyA9IGdldE9wdGlvbnNGb3JPcGVuaW5nKGFVcmkpOwotCQkJcmV0dXJuIG9wZW5OZXN0ZWRBcmNoaXZlKG0sIGFyY2hpdmVPcHRpb25zKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJLy9Qcm9iYWJseSB0aGUgZmlsZSBkaWQgbm90IGV4aXN0OyBzaWxlbnRseSBmYWlsLCBwZXIgcmVxdWVzdCBmcm9tIFdTIHJ1bnRpbWUKLQkJCS8vTW9yZSB0aGFuIGxpa2VseSBhIGZhaWx1cmUgaXMgZ29pbmcgdG8gb2NjdXIgZG93biB0aGUgcm9hZCB3aGVuIGEgTW9kdWxlRmlsZSBmb3IgYQotCQkJLy8gTW9kdWxlCi0JCQkvL2luIHRoZSBkZCBpcyByZXF1ZXN0ZWQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShNb2R1bGUgbSwgQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBhVXJpID0gbS5nZXRVcmkoKTsKLQotCQl0cnkgewotCQkJLyoKLQkJCSAqIFNpbmNlIHdlIGhhdmUgYSBjbHVlIGFib3V0IHRoZSB0eXBlIG9mIGFyY2hpdmUgdG8gb3BlbiBVc2UgdGhlIGFwcHJvcHJpYXRlIG9wZW4KLQkJCSAqIG1ldGhvZCwgc28gaWYgYSBmYWlsdXJlIG9jY3VycnMsIHdlIGNhbiBnZXQgYSBtb3JlIHNwZWNpZmljIG1lc3NhZ2UKLQkJCSAqLwotCQkJaWYgKG0uaXNXZWJNb2R1bGUoKSkKLQkJCQlyZXR1cm4gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5vcGVuV0FSRmlsZShhcmNoaXZlT3B0aW9ucywgYVVyaSk7Ci0JCQllbHNlIGlmIChtLmlzRWpiTW9kdWxlKCkpCi0JCQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3BlbkVKQkphckZpbGUoYXJjaGl2ZU9wdGlvbnMsIGFVcmkpOwotCQkJZWxzZSBpZiAobS5pc0phdmFNb2R1bGUoKSkKLQkJCQlyZXR1cm4gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKGFyY2hpdmVPcHRpb25zLCBhVXJpKTsKLQkJCWVsc2UgaWYgKG0uaXNDb25uZWN0b3JNb2R1bGUoKSkKLQkJCQlyZXR1cm4gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5vcGVuUkFSRmlsZShhcmNoaXZlT3B0aW9ucywgYVVyaSk7Ci0KLQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygibmVzdGVkX29wZW5fZmFpbF9FWENfIiwgKG5ldyBPYmplY3RbXXthVXJpLCBnZXRVUkkoKX0pKSwgZXgpOyAvLyROT04tTkxTLTEkID0gIlVuYWJsZSB0byBvcGVuIG1vZHVsZSBmaWxlICJ7MH0iIGluIEVBUiBmaWxlICJ7MX0iIgotCQl9Ci0JCS8vU2hvdWxkIG5ldmVyIHJlYWNoIHRoZSBjb2RlIGJlbG93Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hEb3duUm9sZShTZWN1cml0eVJvbGUgcm9sZSkgewotCQlpZiAocm9sZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUGFyYW1ldGVyX3Nob3VsZF9ub3RfYmVfbnVfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJQYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBudWxsIgotCi0JCUxpc3QgbW9kdWxlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlwdXNoRG93blJvbGUocm9sZSwgbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoRG93blJvbGUoU2VjdXJpdHlSb2xlIHJvbGUsIE1vZHVsZSBhTW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKSB7Ci0JCQkJV2ViQXBwIGRkID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYk1vZHVsZSkgYU1vZHVsZSk7Ci0JCQkJaWYgKGRkLmdldFNlY3VyaXR5Um9sZU5hbWVkKHJvbGUuZ2V0Um9sZU5hbWUoKSkgPT0gbnVsbCkKLQkJCQkJZGQuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KHJvbGUpKTsKLQkJCX0gZWxzZSBpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0JCQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5ID0gZ2V0QXNzZW1ibHlEZXNjcmlwdG9yQWRkSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEVqYk1vZHVsZSkgYU1vZHVsZSkpOwotCQkJCWlmIChhc3NlbWJseS5nZXRTZWN1cml0eVJvbGVOYW1lZChyb2xlLmdldFJvbGVOYW1lKCkpID09IG51bGwpCi0JCQkJCWFzc2VtYmx5LmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoRXRvb2xzQ29weVV0aWxpdHkuY3JlYXRlQ29weShyb2xlKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJkZF9pbl9lYXJfbG9hZF9FWENfIiwgKG5ldyBPYmplY3RbXXthTW9kdWxlLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgZSk7IC8vJE5PTi1OTFMtMSQgPSAiRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBtb2R1bGUgInswfSIgaW4gZWFyIGZpbGUgInsxfSIiCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbiBhbHQtZGQgaXMgYWJvdXQgdG8gYmUgbG9hZGVkOyByZWdpc3RlciB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UgZmFjdG9yeSBmb3IgdGhlIHVyaSBzbyBpdAotCSAqIHdpbGwgZ2V0IGxvYWRlZCBjb3JyZWN0bHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJSZXNvdXJjZUZhY3RvcnkoTW9kdWxlIGFNb2R1bGUsIFN0cmluZyBhVXJpKSB7Ci0JCW9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKQotCQkJZmFjdG9yeSA9IEVKQkphclJlc291cmNlRmFjdG9yeS5nZXRSZWdpc3RlcmVkRmFjdG9yeSgpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpCi0JCQlmYWN0b3J5ID0gV2ViQXBwUmVzb3VyY2VGYWN0b3J5LmdldFJlZ2lzdGVyZWRGYWN0b3J5KCk7Ci0JCWVsc2UgaWYgKGFNb2R1bGUuaXNKYXZhTW9kdWxlKCkpCi0JCQlmYWN0b3J5ID0gQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkuZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc0Nvbm5lY3Rvck1vZHVsZSgpKQotCQkJZmFjdG9yeSA9IENvbm5lY3RvclJlc291cmNlRmFjdG9yeS5nZXRSZWdpc3RlcmVkRmFjdG9yeSgpOwotCi0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KCk7Ci0JCQkoKEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSkgc2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkpLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KGFVcmksIGZhY3RvcnkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoTW9kdWxlUmVmIGFNb2R1bGVSZWYpIHsKLQkJaWYgKGFNb2R1bGVSZWYgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTW9kdWxlIGFNb2R1bGUgPSBhTW9kdWxlUmVmLmdldE1vZHVsZSgpOwotCi0JCWlmIChhTW9kdWxlICE9IG51bGwpCi0JCQlnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKS5yZW1vdmUoYU1vZHVsZSk7Ci0KLQkJZ2V0TW9kdWxlUmVmcygpLnJlbW92ZShhTW9kdWxlUmVmKTsKLQkJaWYgKGdldE1vZHVsZVJlZnMoYU1vZHVsZVJlZi5nZXRNb2R1bGVGaWxlKCkpLmlzRW1wdHkoKSkKLQkJCWdldEZpbGVzKCkucmVtb3ZlKGFNb2R1bGVSZWYuZ2V0TW9kdWxlRmlsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNb2R1bGVSZWZzKE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlUmVmIHJlZiA9IChNb2R1bGVSZWYpIHJlZnMuZ2V0KGkpOwotCQkJaWYgKHJlZi5nZXRNb2R1bGVGaWxlKCkgPT0gYU1vZHVsZUZpbGUpCi0JCQkJcmVzdWx0LmFkZChyZWYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVuYW1lUm9sZXNJbk1vZHVsZUREcyhTdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCWlmIChtLmlzRWpiTW9kdWxlKCkpCi0JCQkJCWdldERlcGxveW1lbnREZXNjcmlwdG9yKChFamJNb2R1bGUpIG0pLnJlbmFtZVNlY3VyaXR5Um9sZShleGlzdGluZ1JvbGVOYW1lLCBuZXdSb2xlTmFtZSk7Ci0JCQkJZWxzZSBpZiAobS5pc1dlYk1vZHVsZSgpKQotCQkJCQlnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViTW9kdWxlKSBtKS5yZW5hbWVTZWN1cml0eVJvbGUoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJkZF9pbl9lYXJfbG9hZF9FWENfIiwgKG5ldyBPYmplY3RbXXttLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgZSk7IC8vJE5PTi1OTFMtMSQgPSAiRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBtb2R1bGUgInswfSIgaW4gZWFyIGZpbGUgInsxfSIiCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmFtZVNlY3VyaXR5Um9sZShTdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgU3RyaW5nIG5ld1JvbGVOYW1lKSB0aHJvd3MgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uIGFwcCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCVNlY3VyaXR5Um9sZSBhUm9sZSA9IGFwcC5nZXRTZWN1cml0eVJvbGVOYW1lZChleGlzdGluZ1JvbGVOYW1lKTsKLQkJaWYgKGFSb2xlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm5vX3NlY19yb2xlX0VYQ18iLCAobmV3IE9iamVjdFtde2dldFVSSSgpLCBleGlzdGluZ1JvbGVOYW1lfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICI6IEVBUiBGaWxlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCAiCi0JCWlmIChhcHAuZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmV3Um9sZU5hbWUpICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJkdXBfc2VjX3JvbGVfRVhDXyIsIChuZXcgT2JqZWN0W117Z2V0VVJJKCksIG5ld1JvbGVOYW1lfSkpLCBhcHAuZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmV3Um9sZU5hbWUpKTsgLy8kTk9OLU5MUy0xJCA9ICI6IEVBUiBGaWxlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbHJlYWR5IGNvbnRhaW5zIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCAiCi0KLQkJYVJvbGUuc2V0Um9sZU5hbWUobmV3Um9sZU5hbWUpOwotCi0JCXJlbmFtZVJvbGVzSW5Nb2R1bGVERHMoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIHZvaWQgcm9sbFVwUm9sZXMoKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlyb2xsVXBSb2xlcyhhTW9kdWxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIHZvaWQgcm9sbFVwUm9sZXMoTW9kdWxlIGFNb2R1bGUpIHsKLQkJTGlzdCBzZWN1cml0eVJvbGVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpCi0JCQkJc2VjdXJpdHlSb2xlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKChXZWJNb2R1bGUpIGFNb2R1bGUpLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCWVsc2UgaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkKLQkJCQlzZWN1cml0eVJvbGVzID0gZ2V0QXNzZW1ibHlEZXNjcmlwdG9yQWRkSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEVqYk1vZHVsZSkgYU1vZHVsZSkpLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImRkX2luX2Vhcl9sb2FkX0VYQ18iLCAobmV3IE9iamVjdFtde2FNb2R1bGUuZ2V0VXJpKCksIGdldFVSSSgpfSkpLCBlKTsgLy8kTk9OLU5MUy0xJCA9ICJFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIG1vZHVsZSAiezB9IiBpbiBlYXIgZmlsZSAiezF9IiIKLQkJfQotCi0JCWlmIChzZWN1cml0eVJvbGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VjdXJpdHlSb2xlcy5zaXplKCk7IGkrKykgewotCQkJYWRkQ29weUlmTm90RXhpc3RzKChTZWN1cml0eVJvbGUpIHNlY3VyaXR5Um9sZXMuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uIGwpIHsKLQkJdGhpcy5zZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihsKTsKLQkJcmVwbGFjZVJvb3QoZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSksIGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIGlzU2V0U2l6ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXJldHVybiBsb2FkaW5nQ29udGFpbmVyICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIHR5cGVzICE9IG51bGwgJiYgIXR5cGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgotCQkJCXJldHVybiBtb2R1bGVSZWZzICE9IG51bGwgJiYgIW1vZHVsZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fVVJJOgotCQkJCXNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXNldExhc3RNb2RpZmllZCgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19TSVpFOgotCQkJCXNldFNpemUoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXNldERpcmVjdG9yeUVudHJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCWdldEZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgotCQkJCWdldE1vZHVsZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1vZHVsZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoQXBwbGljYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19VUkk6Ci0JCQkJc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQl1bnNldExhc3RNb2RpZmllZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX1NJWkU6Ci0JCQkJdW5zZXRTaXplKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXVuc2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoT1JJR0lOQUxfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlM6Ci0JCQkJZ2V0TW9kdWxlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChBcHBsaWNhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKSB7Ci0JCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsICYmIGRlcGxveW1lbnREZXNjcmlwdG9yLmVJc1Byb3h5KCkpIHsKLQkJCUFwcGxpY2F0aW9uIG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IChBcHBsaWNhdGlvbillUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG9sZERlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb24gYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKEFwcGxpY2F0aW9uIG5ld0RlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCUFwcGxpY2F0aW9uIG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3RGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1vZHVsZVJlZnNHZW4oKSB7Ci0JCWlmIChtb2R1bGVSZWZzID09IG51bGwpIHsKLQkJCW1vZHVsZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChNb2R1bGVSZWYuY2xhc3MsIHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEUpOwotCQl9Ci0JCXJldHVybiBtb2R1bGVSZWZzOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRNb2R1bGVSZWZzKCkgewotCQlFTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmc0dlbigpOwotCi0JCWlmIChyZWZzLmlzRW1wdHkoKSkKLQkJCWluaXRSZWZzKHJlZnMpOwotCi0JCXJldHVybiByZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1vZHVsZVJlZnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TW9kdWxlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbnRhaW5lci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fVVJJOgotCQkJCXJldHVybiBnZXRVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldExhc3RNb2RpZmllZCgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldFNpemUoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzRGlyZWN0b3J5RW50cnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIGdldE9yaWdpbmFsVVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fRklMRVM6Ci0JCQkJcmV0dXJuIGdldEZpbGVzKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgotCQkJCXJldHVybiBnZXRNb2R1bGVSZWZzKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCXJldHVybiBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0UmVmcyhFTGlzdCByZWZzKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCXJlZnMuYWRkKGNyZWF0ZU1vZHVsZVJlZihtb2R1bGUsIG51bGwpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNb2R1bGVSZWYgY3JlYXRlTW9kdWxlUmVmKE1vZHVsZSBhTW9kdWxlLCBNb2R1bGVGaWxlIGFGaWxlKSB7Ci0JCU1vZHVsZVJlZiBuZXdSZWYgPSBudWxsOwotCi0JCWlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpCi0JCQluZXdSZWYgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQk1vZHVsZVJlZigpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpCi0JCQluZXdSZWYgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdlYk1vZHVsZVJlZigpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzQ29ubmVjdG9yTW9kdWxlKCkpCi0JCQluZXdSZWYgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzSmF2YU1vZHVsZSgpKQotCQkJbmV3UmVmID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDbGllbnRNb2R1bGVSZWYoKTsKLQotCQluZXdSZWYuc2V0TW9kdWxlKGFNb2R1bGUpOwotCQluZXdSZWYuc2V0TW9kdWxlRmlsZShhRmlsZSk7Ci0KLQkJcmV0dXJuIG5ld1JlZjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRDbGllbnRNb2R1bGVSZWZzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDbGllbnRNb2R1bGVSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuaXNDbGllbnQoKSkKLQkJCQlyZXN1bHQuYWRkKHJlZik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRDb25uZWN0b3JNb2R1bGVSZWZzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb25uZWN0b3JNb2R1bGVSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuaXNDb25uZWN0b3IoKSkKLQkJCQlyZXN1bHQuYWRkKHJlZik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRFSkJNb2R1bGVSZWZzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFSkJNb2R1bGVSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuaXNFSkIoKSkKLQkJCQlyZXN1bHQuYWRkKHJlZik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRXZWJNb2R1bGVSZWZzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuaXNXZWIoKSkKLQkJCQlyZXN1bHQuYWRkKHJlZik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRGQVJGaWxlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RkFSRmlsZXMoKSB7Ci0JCUxpc3QgZmFyRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc0ZBUkZpbGUoKSkgewotCQkJCWZhckZpbGVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhckZpbGVzOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUjZ2V0QXJjaGl2ZXNPZlR5cGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcmNoaXZlc09mVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldEVKQlJlZmVyZW5jZXMoYm9vbGVhbiBmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzLCBib29sZWFuIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCWlmICghZmlsdGVyTGlua2VkUmVmZXJlbmNlcyB8fCAhZmlsdGVyTm9uTGlua2VkUmVmZXJlbmNlcykgewotCQkJQXBwbGljYXRpb24gYXBwID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCWlmIChhcHAgIT0gbnVsbCkgewotCQkJCUxpc3QgbW9kdWxlcyA9IGFwcC5nZXRNb2R1bGVzKCk7Ci0JCQkJTW9kdWxlIG1vZHVsZTsKLQkJCQlNYXAgcmVmZXJlbmNlcyA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCW1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJCQl0cnkgewotCQkJCQkJcmVmZXJlbmNlcyA9IGNvbGxlY3RFSkJSZWZlcmVuY2VzKG1vZHVsZSwgZmlsdGVyTGlua2VkUmVmZXJlbmNlcywgZmlsdGVyTm9uTGlua2VkUmVmZXJlbmNlcywgcmVmZXJlbmNlcyk7Ci0JCQkJCX0gY2F0Y2ggKFJlc291cmNlTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCX0gY2F0Y2ggKEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZWZlcmVuY2VzOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzCi0JICogQHBhcmFtIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1hcCBjb2xsZWN0RUpCUmVmZXJlbmNlcyhNb2R1bGUgbW9kdWxlLCBib29sZWFuIGZpbHRlckxpbmtlZFJlZmVyZW5jZXMsIGJvb2xlYW4gZmlsdGVyTm9uTGlua2VkUmVmZXJlbmNlcywgTWFwIHJlZmVyZW5jZXMpIHRocm93cyBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCU1hcCBteVJlZmVyZW5jZXMgPSByZWZlcmVuY2VzOwotCQlMaXN0IG1vZHVsZVJlZmVyZW5jZXMgPSBnZXRFSkJSZWZlcm5lY2VzKG1vZHVsZSk7Ci0JCWlmIChtb2R1bGVSZWZlcmVuY2VzICE9IG51bGwgJiYgIW1vZHVsZVJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQlFamJSZWYgcmVmID0gbnVsbDsKLQkJCUxpc3QgZmlsdGVyZWRSZWZzID0gbnVsbDsKLQkJCVN0cmluZyBsaW5rID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJCXJlZiA9IChFamJSZWYpIG1vZHVsZVJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJCWxpbmsgPSByZWYuZ2V0TGluaygpOwotCQkJCWlmICgobGluayAhPSBudWxsICYmIGxpbmsubGVuZ3RoKCkgPiAwICYmICFmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzKSB8fCAobGluayA9PSBudWxsIHx8IGxpbmsubGVuZ3RoKCkgPT0gMCAmJiAhZmlsdGVyTm9uTGlua2VkUmVmZXJlbmNlcykpIHsKLQkJCQkJaWYgKGZpbHRlcmVkUmVmcyA9PSBudWxsKQotCQkJCQkJZmlsdGVyZWRSZWZzID0gbmV3IEFycmF5TGlzdChtb2R1bGVSZWZlcmVuY2VzLnNpemUoKSk7Ci0JCQkJCWZpbHRlcmVkUmVmcy5hZGQocmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlsdGVyZWRSZWZzICE9IG51bGwpIHsKLQkJCQlpZiAobXlSZWZlcmVuY2VzID09IG51bGwpCi0JCQkJCW15UmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJbXlSZWZlcmVuY2VzLnB1dChtb2R1bGUsIGZpbHRlcmVkUmVmcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG15UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRFSkJSZWZlcm5lY2VzKE1vZHVsZSBtb2R1bGUpIHRocm93cyBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJaWYgKG1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0JCQkJRUpCSmFyIGVqYkphciA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKChFamJNb2R1bGUpIG1vZHVsZSk7Ci0JCQkJcmV0dXJuIGdldEVKQlJlZmVyZW5jZXMoZWpiSmFyKTsKLQkJCX0gZWxzZSBpZiAobW9kdWxlLmlzV2ViTW9kdWxlKCkpIHsKLQkJCQlXZWJBcHAgd2ViQXBwID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYk1vZHVsZSkgbW9kdWxlKTsKLQkJCQlpZiAod2ViQXBwICE9IG51bGwpCi0JCQkJCXJldHVybiB3ZWJBcHAuZ2V0RWpiUmVmcygpOwotCQkJfSBlbHNlIGlmIChtb2R1bGUuaXNKYXZhTW9kdWxlKCkpIHsKLQkJCQlBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnQgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoSmF2YUNsaWVudE1vZHVsZSkgbW9kdWxlKTsKLQkJCQlpZiAoYXBwQ2xpZW50ICE9IG51bGwpCi0JCQkJCXJldHVybiBhcHBDbGllbnQuZ2V0RWpiUmVmZXJlbmNlcygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlamJKYXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEVKQlJlZmVyZW5jZXMoRUpCSmFyIGVqYkphcikgewotCQlpZiAoZWpiSmFyICE9IG51bGwpIHsKLQkJCUxpc3QgZWpicyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJCUxpc3QgcmVmcyA9IG51bGw7Ci0JCQlFbnRlcnByaXNlQmVhbiBlamIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlamJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJZWpiID0gKEVudGVycHJpc2VCZWFuKSBlamJzLmdldChpKTsKLQkJCQlpZiAocmVmcyA9PSBudWxsKQotCQkJCQlyZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlZnMuYWRkQWxsKGVqYi5nZXRFamJSZWZzKCkpOwotCQkJfQotCQkJaWYgKHJlZnMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVmczsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCSmFyRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCSmFyRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5Yzg3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VKQkphckZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJKYXJGaWxlSW1wbCBleHRlbmRzIE1vZHVsZUZpbGVJbXBsIGltcGxlbWVudHMgRUpCSmFyRmlsZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUpCSmFyIGRlcGxveW1lbnREZXNjcmlwdG9yID0gbnVsbDsKLQotCXB1YmxpYyBFSkJKYXJGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCSmFyRmlsZSgpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgZm9yIHRvb2xzIHBlcmZvcm1pbmcgc2VsZWN0aXZlIGltcG9ydAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFzc29jaWF0ZWRGaWxlcyhFbnRlcnByaXNlQmVhbiBlamIpIHsKLQotCQlMaXN0IGNsYXNzTmFtZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGVqYi5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEKSB7Ci0JCQljbGFzc05hbWVzLmFkZChlamIuZ2V0SG9tZUludGVyZmFjZU5hbWUoKSk7Ci0JCQljbGFzc05hbWVzLmFkZChlamIuZ2V0UmVtb3RlSW50ZXJmYWNlTmFtZSgpKTsKLQkJfSBlbHNlIGlmIChlamIuZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJaWYgKGVqYi5oYXNSZW1vdGVDbGllbnQoKSkgewotCQkJCWNsYXNzTmFtZXMuYWRkKGVqYi5nZXRIb21lSW50ZXJmYWNlTmFtZSgpKTsKLQkJCQljbGFzc05hbWVzLmFkZChlamIuZ2V0UmVtb3RlSW50ZXJmYWNlTmFtZSgpKTsKLQkJCX0KLQkJCWlmIChlamIuaGFzTG9jYWxDbGllbnQoKSkgewotCQkJCWNsYXNzTmFtZXMuYWRkKGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkpOwotCQkJCWNsYXNzTmFtZXMuYWRkKGVqYi5nZXRMb2NhbEludGVyZmFjZU5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldEVqYkNsYXNzTmFtZSgpKTsKLQotCQlpZiAoZWpiLmlzRW50aXR5KCkpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAoKEVudGl0eSkgZWpiKS5nZXRQcmltYXJ5S2V5TmFtZSgpOwotCQkJaWYgKCFjbGFzc05hbWUuc3RhcnRzV2l0aCgiamF2YSIpKS8vJE5PTi1OTFMtMSQKLQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGNsYXNzTmFtZXMuZ2V0KGkpOwotCQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGNsYXNzVXJpID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5jbGFzc05hbWVUb1VyaShjbGFzc05hbWUpOwotCQkJU3RyaW5nIGphdmFVcmkgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsLmNsYXNzTmFtZVRvSmF2YVVyaShjbGFzc05hbWUpOwotCQkJdHJ5IHsKLQkJCQlyZXN1bHQuYWRkKGdldEZpbGUoY2xhc3NVcmkpKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlveCkgewotCQkJCS8vRG8gbm90aGluZyAtIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgamFyIGZpbGUKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVzdWx0LmFkZChnZXRGaWxlKGphdmFVcmkpKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlveCkgewotCQkJCS8vRG8gbm90aGluZyAtIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgamFyIGZpbGUKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCUVKQkphciBkZCA9IHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQkJaWYgKGRkID09IG51bGwgJiYgY2FuTGF6eUluaXRpYWxpemUoKSkgewotCQkJdHJ5IHsKLQkJCQlnZXRJbXBvcnRTdHJhdGVneSgpLmltcG9ydE1ldGFEYXRhKCk7Ci0JCQl9IGNhdGNoIChEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCX0KLQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRGVwbG95ZW1lbnREZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQkphckZpbGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FSkJKYXJGaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbXBvcnRlZEZyb20xMCgpIHsKLQkJcmV0dXJuIGdldEltcG9ydFN0cmF0ZWd5KCkgIT0gbnVsbCAmJiBnZXRJbXBvcnRTdHJhdGVneSgpLmlzRUpCMTAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuaW1wbC5Nb2R1bGVGaWxlSW1wbAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJRUpCSmFyIGVqYkphciA9ICgoRWpiUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSkuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQkphcigpOwotCQlyZXNvdXJjZS5zZXRJRChlamJKYXIsIEoyRUVDb25zdGFudHMuRUpCSkFSX0lEKTsKLQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oZWpiSmFyKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZWpiSmFyKTsKLQotCQlyZXR1cm4gZWpiSmFyOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoRUpCSmFyIGwpIHsKLQkJdGhpcy5zZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihsKTsKLQkJcmVwbGFjZVJvb3QoZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSksIGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBpc1NldExhc3RNb2RpZmllZCgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIGlzU2V0U2l6ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNTZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gT1JJR0lOQUxfVVJJX0VERUZBVUxUID09IG51bGwgPyBvcmlnaW5hbFVSSSAhPSBudWxsIDogIU9SSUdJTkFMX1VSSV9FREVGQVVMVC5lcXVhbHMob3JpZ2luYWxVUkkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXJldHVybiBsb2FkaW5nQ29udGFpbmVyICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0ZJTEVTOgotCQkJCXJldHVybiBmaWxlcyAhPSBudWxsICYmICFmaWxlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIHR5cGVzICE9IG51bGwgJiYgIXR5cGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fVVJJOgotCQkJCXNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlzZXRMYXN0TW9kaWZpZWQoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXNldERpcmVjdG9yeUVudHJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRUpCSmFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQl1bnNldExhc3RNb2RpZmllZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19TSVpFOgotCQkJCXVuc2V0U2l6ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJdW5zZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoT1JJR0lOQUxfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEVKQkphciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCkgewotCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXBsb3ltZW50RGVzY3JpcHRvci5lSXNQcm94eSgpKSB7Ci0JCQlFSkJKYXIgb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJCWRlcGxveW1lbnREZXNjcmlwdG9yID0gKEVKQkphcillUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG9sZERlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVKQkphciBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oRUpCSmFyIG5ld0RlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCUVKQkphciBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IG5ld0RlcGxveW1lbnREZXNjcmlwdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbnRhaW5lci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldFNpemUoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc0RpcmVjdG9yeUVudHJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZ2V0RmlsZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCXJldHVybiBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJNb2R1bGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTlhYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJNb2R1bGVSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLQotCi1wdWJsaWMgY2xhc3MgRUpCTW9kdWxlUmVmSW1wbCBleHRlbmRzIE1vZHVsZVJlZkltcGwgaW1wbGVtZW50cyBFSkJNb2R1bGVSZWYsIE1vZHVsZVJlZiB7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFSkJNb2R1bGVSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJNb2R1bGVSZWYoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUywgRUFSRmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNb2R1bGVGaWxlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TW9kdWxlRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZHVsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlzZXRNb2R1bGVGaWxlKChNb2R1bGVGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlzZXRFYXJGaWxlKChFQVJGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJc2V0TW9kdWxlKChNb2R1bGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlzZXRFYXJGaWxlKChFQVJGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlyZXR1cm4gbW9kdWxlRmlsZSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXJldHVybiBtb2R1bGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIEVKQkphciBnZXRFSkJKYXIoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlyZXR1cm4gKEVKQkphcikgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzRUpCKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19IC8vRUpCTW9kdWxlUmVmSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9GaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9GaWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjc2MWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLQotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmlsZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEZpbGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSSgpIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXN0TW9kaWZpZWQoKSA8ZW0+TGFzdCBNb2RpZmllZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhc3RNb2RpZmllZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIExBU1RfTU9ESUZJRURfRURFRkFVTFQgPSAwTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBsb25nIGxhc3RNb2RpZmllZCA9IExBU1RfTU9ESUZJRURfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMYXN0IE1vZGlmaWVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsYXN0TW9kaWZpZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgU0laRV9FREVGQVVMVCA9IDBMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgc2l6ZSA9IFNJWkVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTaXplIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2l6ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RpcmVjdG9yeUVudHJ5KCkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGlyZWN0b3J5RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBESVJFQ1RPUllfRU5UUllfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGlyZWN0b3J5RW50cnkoKSA8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEaXJlY3RvcnlFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlyZWN0b3J5RW50cnkgPSBESVJFQ1RPUllfRU5UUllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERpcmVjdG9yeSBFbnRyeSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlyZWN0b3J5RW50cnlFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JpZ2luYWxVUkkoKSA8ZW0+T3JpZ2luYWwgVVJJPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T3JpZ2luYWxVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9yaWdpbmFsVVJJID0gT1JJR0lOQUxfVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb250YWluZXIgbG9hZGluZ0NvbnRhaW5lciA9IG51bGw7Ci0KLQlwdWJsaWMgRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaXJlY3RvcnlVUkkoKSB7Ci0JCXJldHVybiBBcmNoaXZlVXRpbC5nZXRGaWxlTmFtZVBhcmVudChnZXRVUkkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkaW5nQ29udGFpbmVyKCkucHJpbUdldElucHV0U3RyZWFtKGdldE9yaWdpbmFsVVJJKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEFyY2hpdmVVdGlsLmdldEZpbGVOYW1lVGFpbChnZXRVUkkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcmNoaXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUFSRmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkJKYXJGaWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUkFSRmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGlzUmVhZE9ubHlEaXJlY3RvcnkgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXQVJGaWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIG5ld1VSSSkgewotCQlTdHJpbmcgb2xkVVJJID0gdXJpOwotCQl1cmkgPSBuZXdVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1VSSSwgb2xkVVJJLCB1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKLQkJcmV0dXJuIGxhc3RNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbmV3TGFzdE1vZGlmaWVkKSB7Ci0JCWxvbmcgb2xkTGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotCQlsYXN0TW9kaWZpZWQgPSBuZXdMYXN0TW9kaWZpZWQ7Ci0JCWJvb2xlYW4gb2xkTGFzdE1vZGlmaWVkRVNldCA9IGxhc3RNb2RpZmllZEVTZXQ7Ci0JCWxhc3RNb2RpZmllZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MQVNUX01PRElGSUVELCBvbGRMYXN0TW9kaWZpZWQsIGxhc3RNb2RpZmllZCwgIW9sZExhc3RNb2RpZmllZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCWxvbmcgb2xkTGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotCQlib29sZWFuIG9sZExhc3RNb2RpZmllZEVTZXQgPSBsYXN0TW9kaWZpZWRFU2V0OwotCQlsYXN0TW9kaWZpZWQgPSBMQVNUX01PRElGSUVEX0VERUZBVUxUOwotCQlsYXN0TW9kaWZpZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRCwgb2xkTGFzdE1vZGlmaWVkLCBMQVNUX01PRElGSUVEX0VERUZBVUxULCBvbGRMYXN0TW9kaWZpZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TGFzdE1vZGlmaWVkKCkgewotCQlyZXR1cm4gbGFzdE1vZGlmaWVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBsb25nIGdldFNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKGxvbmcgbmV3U2l6ZSkgewotCQlsb25nIG9sZFNpemUgPSBzaXplOwotCQlzaXplID0gbmV3U2l6ZTsKLQkJYm9vbGVhbiBvbGRTaXplRVNldCA9IHNpemVFU2V0OwotCQlzaXplRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkUsIG9sZFNpemUsIHNpemUsICFvbGRTaXplRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNpemUoKSB7Ci0JCWxvbmcgb2xkU2l6ZSA9IHNpemU7Ci0JCWJvb2xlYW4gb2xkU2l6ZUVTZXQgPSBzaXplRVNldDsKLQkJc2l6ZSA9IFNJWkVfRURFRkFVTFQ7Ci0JCXNpemVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fU0laRSwgb2xkU2l6ZSwgU0laRV9FREVGQVVMVCwgb2xkU2l6ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5RW50cnkoKSB7Ci0JCXJldHVybiBkaXJlY3RvcnlFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5RW50cnkoYm9vbGVhbiBuZXdEaXJlY3RvcnlFbnRyeSkgewotCQlib29sZWFuIG9sZERpcmVjdG9yeUVudHJ5ID0gZGlyZWN0b3J5RW50cnk7Ci0JCWRpcmVjdG9yeUVudHJ5ID0gbmV3RGlyZWN0b3J5RW50cnk7Ci0JCWJvb2xlYW4gb2xkRGlyZWN0b3J5RW50cnlFU2V0ID0gZGlyZWN0b3J5RW50cnlFU2V0OwotCQlkaXJlY3RvcnlFbnRyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19ESVJFQ1RPUllfRU5UUlksIG9sZERpcmVjdG9yeUVudHJ5LCBkaXJlY3RvcnlFbnRyeSwgIW9sZERpcmVjdG9yeUVudHJ5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERpcmVjdG9yeUVudHJ5KCkgewotCQlib29sZWFuIG9sZERpcmVjdG9yeUVudHJ5ID0gZGlyZWN0b3J5RW50cnk7Ci0JCWJvb2xlYW4gb2xkRGlyZWN0b3J5RW50cnlFU2V0ID0gZGlyZWN0b3J5RW50cnlFU2V0OwotCQlkaXJlY3RvcnlFbnRyeSA9IERJUkVDVE9SWV9FTlRSWV9FREVGQVVMVDsKLQkJZGlyZWN0b3J5RW50cnlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fRElSRUNUT1JZX0VOVFJZLCBvbGREaXJlY3RvcnlFbnRyeSwgRElSRUNUT1JZX0VOVFJZX0VERUZBVUxULCBvbGREaXJlY3RvcnlFbnRyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREaXJlY3RvcnlFbnRyeSgpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeUVudHJ5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JpZ2luYWxVUkkoKSB7Ci0JCXJldHVybiBvcmlnaW5hbFVSSTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmlnaW5hbFVSSShTdHJpbmcgbmV3T3JpZ2luYWxVUkkpIHsKLQkJU3RyaW5nIG9sZE9yaWdpbmFsVVJJID0gb3JpZ2luYWxVUkk7Ci0JCW9yaWdpbmFsVVJJID0gbmV3T3JpZ2luYWxVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX09SSUdJTkFMX1VSSSwgb2xkT3JpZ2luYWxVUkksIG9yaWdpbmFsVVJJKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyIGdldExvYWRpbmdDb250YWluZXIoKSB7Ci0JCWlmIChsb2FkaW5nQ29udGFpbmVyICE9IG51bGwgJiYgbG9hZGluZ0NvbnRhaW5lci5lSXNQcm94eSgpKSB7Ci0JCQlDb250YWluZXIgb2xkTG9hZGluZ0NvbnRhaW5lciA9IGxvYWRpbmdDb250YWluZXI7Ci0JCQlsb2FkaW5nQ29udGFpbmVyID0gKENvbnRhaW5lcillUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpbG9hZGluZ0NvbnRhaW5lcik7Ci0JCQlpZiAobG9hZGluZ0NvbnRhaW5lciAhPSBvbGRMb2FkaW5nQ29udGFpbmVyKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVIsIG9sZExvYWRpbmdDb250YWluZXIsIGxvYWRpbmdDb250YWluZXIpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRhaW5lciBiYXNpY0dldExvYWRpbmdDb250YWluZXIoKSB7Ci0JCXJldHVybiBsb2FkaW5nQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWRpbmdDb250YWluZXIoQ29udGFpbmVyIG5ld0xvYWRpbmdDb250YWluZXIpIHsKLQkJQ29udGFpbmVyIG9sZExvYWRpbmdDb250YWluZXIgPSBsb2FkaW5nQ29udGFpbmVyOwotCQlsb2FkaW5nQ29udGFpbmVyID0gbmV3TG9hZGluZ0NvbnRhaW5lcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVIsIG9sZExvYWRpbmdDb250YWluZXIsIGxvYWRpbmdDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKENvbnRhaW5lcillQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgbmV3Q29udGFpbmVyKSB7Ci0JCWlmIChuZXdDb250YWluZXIgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIgJiYgbmV3Q29udGFpbmVyICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3Q29udGFpbmVyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29udGFpbmVyKS5lSW52ZXJzZUFkZCh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTLCBDb250YWluZXIuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbnRhaW5lciwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUiwgbmV3Q29udGFpbmVyLCBuZXdDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbnRhaW5lci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldFNpemUoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNEaXJlY3RvcnlFbnRyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBnZXRPcmlnaW5hbFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBpc1NldExhc3RNb2RpZmllZCgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19TSVpFOgotCQkJCXJldHVybiBpc1NldFNpemUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gT1JJR0lOQUxfVVJJX0VERUZBVUxUID09IG51bGwgPyBvcmlnaW5hbFVSSSAhPSBudWxsIDogIU9SSUdJTkFMX1VSSV9FREVGQVVMVC5lcXVhbHMob3JpZ2luYWxVUkkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lciAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXNldExhc3RNb2RpZmllZCgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1VSSToKLQkJCQlzZXRVUkkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkU6Ci0JCQkJdW5zZXRTaXplKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJdW5zZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKE9SSUdJTkFMX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChVUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFzdE1vZGlmaWVkOiAiKTsKLQkJaWYgKGxhc3RNb2RpZmllZEVTZXQpIHJlc3VsdC5hcHBlbmQobGFzdE1vZGlmaWVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2l6ZTogIik7Ci0JCWlmIChzaXplRVNldCkgcmVzdWx0LmFwcGVuZChzaXplKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlyZWN0b3J5RW50cnk6ICIpOwotCQlpZiAoZGlyZWN0b3J5RW50cnlFU2V0KSByZXN1bHQuYXBwZW5kKGRpcmVjdG9yeUVudHJ5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3JpZ2luYWxVUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9yaWdpbmFsVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEZpbGUjaXNGQVJGaWxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZBUkZpbGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYzg0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZUZpbGVJbXBsIGV4dGVuZHMgQXJjaGl2ZUltcGwgaW1wbGVtZW50cyBNb2R1bGVGaWxlIHsKLQotCS8qKiBJbXBsZW1lbnRlciBmb3IgZXh0cmFjdGluZyBtZXRhLWRhdGEgZnJvbSB0aGlzIGFyY2hpdmUgaW50byB0aGUgcm9vdCBvYmplY3QgKi8KLQlwcm90ZWN0ZWQgSW1wb3J0U3RyYXRlZ3kgaW1wb3J0U3RyYXRlZ3k7Ci0JLyoqIEltcGxlbWVudGVyIGZvciBhZGRpbmcgbWV0YS1kYXRhIHRvIGFuIGFib3V0LXRvLWJlLWV4cG9ydGVkIGFyY2hpdmUgKi8KLQlwcm90ZWN0ZWQgRXhwb3J0U3RyYXRlZ3kgZXhwb3J0U3RyYXRlZ3k7Ci0KLQlwdWJsaWMgTW9kdWxlRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldE1vZHVsZUZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTLCBDb250YWluZXIuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19TSVpFOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRTaXplKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc0RpcmVjdG9yeUVudHJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBnZXRPcmlnaW5hbFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0ZJTEVTOgotCQkJCXJldHVybiBnZXRGaWxlcygpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIGdldFR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlzZXRMYXN0TW9kaWZpZWQoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fU0laRToKLQkJCQlzZXRTaXplKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCWdldFR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXVuc2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fU0laRToKLQkJCQl1bnNldFNpemUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJdW5zZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSShPUklHSU5BTF9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIGlzU2V0U2l6ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXJldHVybiBsb2FkaW5nQ29udGFpbmVyICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIHR5cGVzICE9IG51bGwgJiYgIXR5cGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTGF6eUluaXRpYWxpemUoKSB7Ci0JCXJldHVybiBnZXRJbXBvcnRTdHJhdGVneSgpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRNb2ZSZXNvdXJjZShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCk7Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGdldEVBUkZpbGUoKSB7Ci0JCUNvbnRhaW5lciBhQ29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChhQ29udGFpbmVyID09IG51bGwgfHwgIWFDb250YWluZXIuaXNFQVJGaWxlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoKEVBUkZpbGUpIGFDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkV4cG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3kgZ2V0RXhwb3J0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBleHBvcnRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBnZXRJbXBvcnRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGltcG9ydFN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGZpbGUsIG9yIGVtcHR5IHN0cmluZyBpZiB1bmtub3duIHZlcnNpb24uIEZvcgotCSAqIGV4YW1wbGUsICIyLjAiCi0JICogCi0JICogQGRlcHJlY2F0ZWQsIFVzZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjVmVyc2lvbigpIHsKLQkJZmxvYXQgdmVyID0gZ2V0U3BlY1ZlcnNpb25JRCgpOwotCQlGbG9hdCBzcGVjVmVyc2lvbiA9IG5ldyBGbG9hdCh2ZXIgLyAxMCk7Ci0JCXJldHVybiBzcGVjVmVyc2lvbi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmVyc2lvbiBJRCBvZiB0aGUgbW9kdWxlIEZvciBleGFtcGxlLCAiMjAiCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwZWNWZXJzaW9uSUQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChYTUxSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKS5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Nb2R1bGVGaWxlCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0KLQkvKioKLQkgKiBzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0JcHVibGljIFJlc291cmNlIG1ha2VEZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlYTUxSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgbWFrZU1vZlJlc291cmNlKGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkpOwotCQl9IGNhdGNoIChEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZkV4KSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQltYWtlRGVwbG95bWVudERlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJc2V0U2F2ZVN0cmF0ZWd5KGFTYXZlU3RyYXRlZ3kpOwotCQlpZiAoZ2V0RXhwb3J0U3RyYXRlZ3koKSAhPSBudWxsKQotCQkJZ2V0RXhwb3J0U3RyYXRlZ3koKS5wcmVTYXZlKGFTYXZlU3RyYXRlZ3kpOwotCQlzdXBlci5zYXZlKGFTYXZlU3RyYXRlZ3kpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4cG9ydFN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkV4cG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5FeHBvcnRTdHJhdGVneSBuZXdFeHBvcnRTdHJhdGVneSkgewotCQlleHBvcnRTdHJhdGVneSA9IG5ld0V4cG9ydFN0cmF0ZWd5OwotCQlpZiAobmV3RXhwb3J0U3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJbmV3RXhwb3J0U3RyYXRlZ3kuc2V0QXJjaGl2ZSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0ltcG9ydFN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW1wb3J0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgbmV3SW1wb3J0U3RyYXRlZ3kpIHsKLQkJaW1wb3J0U3RyYXRlZ3kgPSBuZXdJbXBvcnRTdHJhdGVneTsKLQkJaWYgKG5ld0ltcG9ydFN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCW5ld0ltcG9ydFN0cmF0ZWd5LnNldEFyY2hpdmUodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZSNzZXRKMkVFVmVyc2lvbihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oaW50IHZlcnNpb25JRCkgewotCQl0cnkgewotCQkJKChYTUxSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKS5zZXRWZXJzaW9uSUQodmVyc2lvbklEKTsKLQkJfSBjYXRjaCAoUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNGUyYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uTm9Nb2R1bGVGaWxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci0KLQotcHVibGljIGNsYXNzIE1vZHVsZVJlZkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1vZHVsZVJlZiwgRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZUZpbGUgbW9kdWxlRmlsZSA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxlKCkgPGVtPk1vZHVsZTwvZW0+fScgcmVmZXJlbmNlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlIG1vZHVsZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TW9kdWxlUmVmKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmc7IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29tcG9uZW50TGlzdChFTGlzdCBsaXN0KSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZUdlbigpIHsKLQkJaWYgKG1vZHVsZUZpbGUgIT0gbnVsbCAmJiBtb2R1bGVGaWxlLmVJc1Byb3h5KCkpIHsKLQkJCU1vZHVsZUZpbGUgb2xkTW9kdWxlRmlsZSA9IG1vZHVsZUZpbGU7Ci0JCQltb2R1bGVGaWxlID0gKE1vZHVsZUZpbGUpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KW1vZHVsZUZpbGUpOwotCQkJaWYgKG1vZHVsZUZpbGUgIT0gb2xkTW9kdWxlRmlsZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFLCBvbGRNb2R1bGVGaWxlLCBtb2R1bGVGaWxlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZUZpbGU7Ci0JfQotCi0JcHVibGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZSgpIHsKLQkJaWYgKG1vZHVsZUZpbGUgPT0gbnVsbCkKLQkJCWluaXRNb2R1bGVGaWxlRnJvbUVBUigpOwotCQlyZXR1cm4gbW9kdWxlRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgYmFzaWNHZXRNb2R1bGVGaWxlKCkgewotCQlyZXR1cm4gbW9kdWxlRmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TW9kdWxlRmlsZUZyb21FQVIoKSB7Ci0JCWNoZWNrRUFSRmlsZSgpOwotCQlNb2R1bGVGaWxlIGFGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFGaWxlID0gKE1vZHVsZUZpbGUpIGdldEVhckZpbGUoKS5nZXRGaWxlKG1vZHVsZS5nZXRVcmkoKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJLy9JZ25vcmUKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCWNoZWNrVHlwZShtb2R1bGUsIGFGaWxlKTsKLQkJc2V0TW9kdWxlRmlsZShhRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlRmlsZShNb2R1bGVGaWxlIG5ld01vZHVsZUZpbGUpIHsKLQkJTW9kdWxlRmlsZSBvbGRNb2R1bGVGaWxlID0gbW9kdWxlRmlsZTsKLQkJbW9kdWxlRmlsZSA9IG5ld01vZHVsZUZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFLCBvbGRNb2R1bGVGaWxlLCBtb2R1bGVGaWxlKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc0FsdEREKCkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAhQXJjaGl2ZVV0aWwuaXNOdWxsT3JFbXB0eShtb2R1bGUuZ2V0QWx0REQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJcmV0dXJuIG1vZHVsZUZpbGUgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJcmV0dXJuIG1vZHVsZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlzZXRNb2R1bGVGaWxlKChNb2R1bGVGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXNldEVhckZpbGUoKEVBUkZpbGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXNldE1vZHVsZSgoTW9kdWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlzZXRNb2R1bGVGaWxlKChNb2R1bGVGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJc2V0RWFyRmlsZSgoRUFSRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0QWx0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlpZiAoZ2V0RWFyRmlsZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRFYXJGaWxlKCkuZ2V0QWx0RGVwbG95bWVudERlc2NyaXB0b3IoZ2V0TW9kdWxlKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2dldERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRFYXJGaWxlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RWFyRmlsZSgpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKGdldE1vZHVsZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNnZXRFQVJGaWxlKCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlpZiAoZ2V0TW9kdWxlRmlsZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldE1vZHVsZUZpbGUoKS5nZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI3NldFVSSShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpIHsKLQkJaWYgKGdldE1vZHVsZUZpbGUoKSAhPSBudWxsKQotCQkJZ2V0TW9kdWxlRmlsZSgpLnNldFVSSSh1cmkpOwotCi0JCWlmIChnZXRNb2R1bGUoKSAhPSBudWxsKQotCQkJZ2V0TW9kdWxlKCkuc2V0VXJpKHVyaSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNpc0NsaWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGllbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzQ29ubmVjdG9yKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RvcigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNFSkIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNpc1dlYigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGdldEVhckZpbGUoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFQVJGaWxlKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFyRmlsZShFQVJGaWxlIG5ld0VhckZpbGUpIHsKLQkJaWYgKG5ld0VhckZpbGUgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRSAmJiBuZXdFYXJGaWxlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RWFyRmlsZSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RWFyRmlsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFYXJGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlMsIEVBUkZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0VhckZpbGUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFLCBuZXdFYXJGaWxlLCBuZXdFYXJGaWxlKSk7Ci0JfQotCi0JcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCAmJiBtb2R1bGUuZUlzUHJveHkoKSkgewotCQkJTW9kdWxlIG9sZE1vZHVsZSA9IG1vZHVsZTsKLQkJCW1vZHVsZSA9IChNb2R1bGUpIEVjb3JlVXRpbC5yZXNvbHZlKG1vZHVsZSwgdGhpcyk7Ci0JCQlpZiAobW9kdWxlICE9IG9sZE1vZHVsZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRSwgb2xkTW9kdWxlLCBtb2R1bGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2R1bGUgYmFzaWNHZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlKE1vZHVsZSBuZXdNb2R1bGUpIHsKLQkJTW9kdWxlIG9sZE1vZHVsZSA9IG1vZHVsZTsKLQkJbW9kdWxlID0gbmV3TW9kdWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEUsIG9sZE1vZHVsZSwgbW9kdWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTLCBFQVJGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TW9kdWxlRmlsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZUZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TW9kdWxlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TW9kdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5wdXQgc3RyZWFtIGZyb20gdGhlICJyZXNvdXJjZXMgcGF0aCIgb2YgZWl0aGVyIHRoZSBNb2R1bGVGaWxlLCBpZiB0aGUgbW9kdWxlIGRvZXMKLQkgKiBub3QgdXNlIGFsdC1kZCwgb3IgZnJvbSB0aGUgYWx0Um9vdCBvZiB0aGUgbW9kdWxlLCBmb3VuZCBpbiB0aGUgcmVzb3VyY2VzIHBhdGggb2YgdGhlIEVBUgotCSAqIAotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5I2dldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1c2VzQWx0REQoKSkKLQkJCXJldHVybiBnZXRBbHRSZXNvdXJjZUlucHV0U3RyZWFtKHVyaSk7Ci0JCXJldHVybiBnZXRMb2NhbFJlc291cmNlSW5wdXRTdHJlYW0odXJpKTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0TG9jYWxSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrTW9kdWxlRmlsZSgpOwotCQlyZXR1cm4gbW9kdWxlRmlsZS5nZXRSZXNvdXJjZUlucHV0U3RyZWFtKHVyaSk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldEFsdFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hlY2tFQVJGaWxlKCk7Ci0JCXJldHVybiBnZXRFYXJGaWxlKCkuZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbSh1cmkpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjZ2V0VXJpKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJcmV0dXJuIG1vZHVsZS5nZXRVcmkoKTsKLQkJaWYgKG1vZHVsZUZpbGUgIT0gbnVsbCkKLQkJCXJldHVybiBtb2R1bGVGaWxlLmdldFVSSSgpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlUmVmI2dldEFsdE1vZlJlc291cmNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0QWx0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIHsKLQkJY2hlY2tFQVJGaWxlKCk7Ci0JCXJldHVybiBnZXRFYXJGaWxlKCkuZ2V0TW9mUmVzb3VyY2UodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNnZXRMb2NhbE1vZlJlc291cmNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0TG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQljaGVja01vZHVsZUZpbGUoKTsKLQkJcmV0dXJuIG1vZHVsZUZpbGUuZ2V0TW9mUmVzb3VyY2UodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNnZXRNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VzQWx0REQoKSkKLQkJCXJldHVybiBnZXRBbHRNb2ZSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gZ2V0TG9jYWxNb2ZSZXNvdXJjZSh1cmkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlUmVmI21ha2VBbHRNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VBbHRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJY2hlY2tFQVJGaWxlKCk7Ci0JCXJldHVybiBnZXRFYXJGaWxlKCkubWFrZU1vZlJlc291cmNlKHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tFQVJGaWxlKCkgewotCQlpZiAoZ2V0RWFyRmlsZSgpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk1vZHVsZV9ub3RfaW5fRUFSIiwgbmV3IE9iamVjdFtde2dldFVyaSgpfSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBNb2R1bGVSZWYjbWFrZUxvY2FsTW9mUmVzb3VyY2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJY2hlY2tNb2R1bGVGaWxlKCk7Ci0JCXJldHVybiBtb2R1bGVGaWxlLm1ha2VNb2ZSZXNvdXJjZSh1cmkpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tNb2R1bGVGaWxlKCkgewotCQlnZXRNb2R1bGVGaWxlKCk7Ci0JCWlmIChtb2R1bGVGaWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNb2R1bGVfZmlsZV9kb2VzX25vdF9leGlzdF8yIiwgbmV3IE9iamVjdFtde2dldFVyaSgpfSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKE1vZHVsZSBtb2R1bGVEZXNjcmlwdG9yLCBGaWxlIGFGaWxlKSB7Ci0JCWlmIChhRmlsZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBX2ZpbGVfZG9lc19ub3RfZXhpc3RfZm9yX21vZHVsZSIsIG5ldyBPYmplY3RbXXttb2R1bGVEZXNjcmlwdG9yLmdldFVyaSgpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBOb01vZHVsZUZpbGVFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQkJLy9BZGRlZCBmb3IgZGVmZWN0IDExMzkyOQotCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQlTdHJpbmcgdHlwZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNb2R1bGVfZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtb2R1bGVEZXNjcmlwdG9yLmlzV2ViTW9kdWxlKCkgJiYgIWFGaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl0eXBlID0gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFfV0FSX2ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG1vZHVsZURlc2NyaXB0b3IuaXNFamJNb2R1bGUoKSAmJiAhYUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCXR5cGUgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQW5fRUpCX0pBUl9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChtb2R1bGVEZXNjcmlwdG9yLmlzSmF2YU1vZHVsZSgpICYmICFhRmlsZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKSB7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl0eXBlID0gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX0FwcGxpY2F0aW9uX0NsaWVudF9KQVJfZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobW9kdWxlRGVzY3JpcHRvci5pc0Nvbm5lY3Rvck1vZHVsZSgpICYmICFhRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJdHlwZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBX1JBUl9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmICghYUZpbGUuaXNNb2R1bGVGaWxlKCkpCi0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0KLQkJaWYgKGlzVmFsaWQpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGVhclVyaSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChnZXRFYXJGaWxlKCkgIT0gbnVsbCkKLQkJCWVhclVyaSA9IGdldEVhckZpbGUoKS5nZXRVUkkoKTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsZV9ub3RfY29ycmVjdF90eXBlIiwgbmV3IE9iamVjdFtde2FGaWxlLmdldFVSSSgpLCBlYXJVcmksIHR5cGV9KTsgLy8kTk9OLU5MUy0xJAotCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNtYWtlTW9mUmVzb3VyY2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VzQWx0REQoKSkKLQkJCXJldHVybiBtYWtlQWx0TW9mUmVzb3VyY2UodXJpKTsKLQkJcmV0dXJuIG1ha2VMb2NhbE1vZlJlc291cmNlKHVyaSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JBUkZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZDIzZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SQVJGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkNvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSQVJGaWxlSW1wbCBleHRlbmRzIE1vZHVsZUZpbGVJbXBsIGltcGxlbWVudHMgUkFSRmlsZSB7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIDxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3RvciBkZXBsb3ltZW50RGVzY3JpcHRvciA9IG51bGw7Ci0KLQlwdWJsaWMgUkFSRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldFJBUkZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuV0FSRmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGFkZENvcHlDbGFzcyhGaWxlIGFGaWxlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJhZGRfY29weV9jbGFzc19kaXJfRVhDXyIsIChuZXcgT2JqZWN0W117YUZpbGUuZ2V0VVJJKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIk1ldGhvZCBhZGRDb3B5Q2xhc3Mgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3JpZXMgOiIKLQkJcmV0dXJuIGFkZENvcHlGaWxlQWRkaW5nUHJlZml4KGFGaWxlLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgYWRkQ29weUZpbGVBZGRpbmdQcmVmaXgoRmlsZSBhRmlsZSwgU3RyaW5nIHVyaVByZWZpeCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzd2l6emxlZFVyaSA9IGFGaWxlLmdldFVSSSgpOwotCQlpZiAoIXN3aXp6bGVkVXJpLnN0YXJ0c1dpdGgodXJpUHJlZml4KSkgewotCQkJc3dpenpsZWRVcmkgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkodXJpUHJlZml4LCBzd2l6emxlZFVyaSwgJy8nKTsKLQkJfQotCQljaGVja0FkZFZhbGlkKHN3aXp6bGVkVXJpKTsKLQkJRmlsZSBjb3B5ID0gY29weShhRmlsZSk7Ci0JCWNvcHkuc2V0VVJJKHN3aXp6bGVkVXJpKTsKLQkJZ2V0RmlsZXMoKS5hZGQoY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5Rm9yQ29ubmVjdG9yRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBkaXIsIGludCBleHBhbnNpb25GbGFncykgewotCQlyZXR1cm4gbmV3IENvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoZGlyLmdldEFic29sdXRlUGF0aCgpLCBleHBhbnNpb25GbGFncyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0VG9Db25uZWN0b3JEaXJlY3RvcnkoamF2YS5sYW5nLlN0cmluZyBhVXJpLCBpbnQgZXhwYW5zaW9uRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWphdmEuaW8uRmlsZSBhRGlyID0gbmV3IGphdmEuaW8uRmlsZShhVXJpKTsKLQkJaWYgKGdldExvYWRTdHJhdGVneSgpLmlzVXNpbmcoYURpcikpCi0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkV4dHJhY3RfZGVzdGluYXRpb25faXNfdGhlX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXh0cmFjdCBkZXN0aW5hdGlvbiBpcyB0aGUgc2FtZSBwYXRoIGFzIHNvdXJjZSBmaWxlIgotCi0JCXRyeSB7Ci0JCQlTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSA9IGNyZWF0ZVNhdmVTdHJhdGVneUZvckNvbm5lY3RvckRpcmVjdG9yeShhRGlyLCBleHBhbnNpb25GbGFncyk7Ci0JCQlzYXZlKGFTYXZlU3RyYXRlZ3kpOwotCQkJYVNhdmVTdHJhdGVneS5jbG9zZSgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3NhdmluZ19FWENfIiwgKG5ldyBPYmplY3RbXXt1cml9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvciBzYXZpbmcgIgotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuUkFSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDbGFzc2VzKCkgewotCQlyZXR1cm4gZmlsdGVyRmlsZXNCeVByZWZpeChBcmNoaXZlQ29uc3RhbnRzLlJBUl9DTEFTU0VTX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJQ29ubmVjdG9yIGRkID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWlmIChkZCA9PSBudWxsICYmIGNhbkxhenlJbml0aWFsaXplKCkpCi0JCQl0cnkgewotCQkJCWdldEltcG9ydFN0cmF0ZWd5KCkuaW1wb3J0TWV0YURhdGEoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpLCBlKTsKLQkJCX0KLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFJlc291cmNlcygpIHsKLQkJU3RyaW5nW10gcHJlZml4ZXMgPSB7SjJFRUNvbnN0YW50cy5NRVRBX0lORiwgSjJFRUNvbnN0YW50cy5XRUJfSU5GfTsKLQkJcmV0dXJuIGZpbHRlckZpbGVzV2l0aG91dFByZWZpeChwcmVmaXhlcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEZXBsb3llbWVudERlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUkFSRmlsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCUpjYVBhY2thZ2UgcCA9IChKY2FQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpOwotCQlKY2FGYWN0b3J5IGZjdCA9IHAuZ2V0SmNhRmFjdG9yeSgpOwotCQlDb25uZWN0b3IgY29ubmVjdG9yID0gZmN0LmNyZWF0ZUNvbm5lY3RvcigpOwotCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcihjb25uZWN0b3IpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChjb25uZWN0b3IpOwotCQlyZXR1cm4gY29ubmVjdG9yOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQ29ubmVjdG9yIGwpIHsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSBsOwotCQlyZXBsYWNlUm9vdChnZXRNb2ZSZXNvdXJjZU1ha2VJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKSwgbCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fU0laRToKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0U2l6ZSgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNEaXJlY3RvcnlFbnRyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJCXJldHVybiBiYXNpY0dldExvYWRpbmdDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZ2V0RmlsZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX1RZUEVTOgotCQkJCXJldHVybiBnZXRUeXBlcygpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBpc1NldExhc3RNb2RpZmllZCgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fU0laRToKLQkJCQlyZXR1cm4gaXNTZXRTaXplKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzU2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gT1JJR0lOQUxfVVJJX0VERUZBVUxUID09IG51bGwgPyBvcmlnaW5hbFVSSSAhPSBudWxsIDogIU9SSUdJTkFMX1VSSV9FREVGQVVMVC5lcXVhbHMob3JpZ2luYWxVUkkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGxvYWRpbmdDb250YWluZXIgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0ZJTEVTOgotCQkJCXJldHVybiBmaWxlcyAhPSBudWxsICYmICFmaWxlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19UWVBFUzoKLQkJCQlyZXR1cm4gdHlwZXMgIT0gbnVsbCAmJiAhdHlwZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fVVJJOgotCQkJCXNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXNldExhc3RNb2RpZmllZCgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19TSVpFOgotCQkJCXNldFNpemUoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXNldERpcmVjdG9yeUVudHJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCWdldEZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoQ29ubmVjdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fVVJJOgotCQkJCXNldFVSSShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19TSVpFOgotCQkJCXVuc2V0U2l6ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQl1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKE9SSUdJTkFMX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoQ29ubmVjdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NMb2FkZXIgY3JlYXRlRHluYW1pY0NsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsKSB7Ci0JCXJldHVybiBuZXcgUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlcih0aGlzLCBwYXJlbnRDbCwgZXh0cmFDbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JlYWRPbmx5RGlyZWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SZWFkT25seURpcmVjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlMzYyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JlYWRPbmx5RGlyZWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5RGlyZWN0b3J5SW1wbCBleHRlbmRzIENvbnRhaW5lckltcGwgaW1wbGVtZW50cyBSZWFkT25seURpcmVjdG9yeSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlEaXJlY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWFkT25seURpcmVjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldExhc3RNb2RpZmllZCgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fU0laRToKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0U2l6ZSgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc0RpcmVjdG9yeUVudHJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIGdldE9yaWdpbmFsVVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJCXJldHVybiBiYXNpY0dldExvYWRpbmdDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fRklMRVM6Ci0JCQkJcmV0dXJuIGdldEZpbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fVVJJOgotCQkJCXNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJc2V0TGFzdE1vZGlmaWVkKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fU0laRToKLQkJCQlzZXRTaXplKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXNldERpcmVjdG9yeUVudHJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19VUkk6Ci0JCQkJc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19MQVNUX01PRElGSUVEOgotCQkJCXVuc2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19TSVpFOgotCQkJCXVuc2V0U2l6ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXVuc2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSShPUklHSU5BTF9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fU0laRToKLQkJCQlyZXR1cm4gaXNTZXRTaXplKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNTZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGxvYWRpbmdDb250YWluZXIgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19GSUxFUzoKLQkJCQlyZXR1cm4gZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHsKLQkJZ2V0RmlsZXMoKTsKLQkJcmV0dXJuIGdldEZpbGVJbmRleCgpLmNvbnRhaW5zS2V5KGFVcmkpOwotCX0KLQotCS8qKgotCSAqIGNvbnRhaW5zRmlsZUluUm9vdE9yU3ViZGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KGphdmEubGFuZy5TdHJpbmcgYVVyaSkgewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuY29udGFpbnMoYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICghY29udGFpbnNGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoYVVyaSkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24oYVVyaSk7Ci0KLQkJaWYgKGNvbnRhaW5zRmlsZShhVXJpKSkKLQkJCXJldHVybiBnZXRGaWxlKGFVcmkpOwotCi0JCUxpc3Qgc3ViZGlycyA9IGdldFJlYWRPbmx5RGlyZWN0b3JpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJkaXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZWFkT25seURpcmVjdG9yeSBzdWJkaXIgPSAoUmVhZE9ubHlEaXJlY3RvcnkpIHN1YmRpcnMuZ2V0KGkpOwotCQkJaWYgKHN1YmRpci5jb250YWluc0ZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShhVXJpKSkKLQkJCQlyZXR1cm4gc3ViZGlyLmdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShhVXJpKTsKLQkJfQotCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24oYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGZsYXQgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSBhbmQgc3ViZGlyZWN0b3JpZXMsIHdpdGggdGhlCi0JICogZGlyZWN0b3JpZXMgZmlsdGVyZWQgb3V0LCBhcyB0aGUgbGlzdCB3b3VsZCBhcHBlYXIgaW4gYW4gYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGaWxlc1JlY3Vyc2l2ZSgpIHsKLQkJTGlzdCBhbGxGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlc0xpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlc0xpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzUmVhZE9ubHlEaXJlY3RvcnkoKSkKLQkJCQlhbGxGaWxlcy5hZGRBbGwoKChSZWFkT25seURpcmVjdG9yeSkgYUZpbGUpLmdldEZpbGVzUmVjdXJzaXZlKCkpOwotCQkJZWxzZQotCQkJCWFsbEZpbGVzLmFkZChhRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIGFsbEZpbGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIGZpbGVzIHdpdGgganVzdCB0aGUgaW5zdGFuY2VzIG9mIFJlYWRPbmx5RGlyZWN0b3J5Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UmVhZE9ubHlEaXJlY3RvcmllcygpIHsKLQkJTGlzdCBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlc0xpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlc0xpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzUmVhZE9ubHlEaXJlY3RvcnkoKSkKLQkJCQlmaWx0ZXJlZC5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBpc1JlYWRPbmx5RGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzNTY3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNC8wMCA1OjI0OjQ0IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbCBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgc2luZ2xldG9uOwotCi0JLyoqCi0JICogQ29tbW9uQXJjaGl2ZUZhY3RvcnlEZXNjcmltaW5hdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNvbnZlcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIGFuQXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgVGhpcyBuZXZlciBnZXRzIGNhbGxlZCBmb3IgdGhpcwotCSAqICAgICAgaW1wbGVtZW50ZXIuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbnVsbCBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGdldCBjYWxsZWQgYXQgdGhpcyBsZXZlbAotCSAqIAotCSAqIEBzZWUgQXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9yI2dldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSB7Ci0JCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Igc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCXNpbmdsZXRvbiA9IG5ldyBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbCgpOwotCQl9Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Sb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOWFjYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Sb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDQvMDAgNToyNDo0NCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgewotCXByb3RlY3RlZCBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCBzaW5nbGV0b247Ci0KLQkvKioKLQkgKiBDb21tb25BcmNoaXZlRmFjdG9yeURlc2NyaW1pbmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlqYXZhLnV0aWwuTGlzdCB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCA9IChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIHRoZUNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChjaGlsZC5jYW5JbXBvcnQoYW5BcmNoaXZlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNvbnZlcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIGFuQXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgVGhpcyBuZXZlciBnZXRzIGNhbGxlZCBmb3IgdGhpcwotCSAqICAgICAgaW1wbGVtZW50ZXIuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbnVsbCBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGdldCBjYWxsZWQgYXQgdGhpcyBsZXZlbAotCSAqIAotCSAqIEBzZWUgQXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9yI2dldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlqYXZhLnV0aWwuTGlzdCB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCA9IChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIHRoZUNoaWxkcmVuLmdldChpKTsKLQkJCW1lc3NhZ2UuYXBwZW5kKGNoaWxkLmdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSk7Ci0JCQltZXNzYWdlLmFwcGVuZCgnXG4nKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWFkZENoaWxkKEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Ijb3BlbkFyY2hpdmUoQXJjaGl2ZSkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSByZXN1bHQgPSBzdXBlci5vcGVuQXJjaGl2ZShhbkFyY2hpdmUpOwotCQlpZiAocmVzdWx0ID09IGFuQXJjaGl2ZSkKLQkJCS8vQ291bGRuJ3QgY29udmVydAotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Igc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCXNpbmdsZXRvbiA9IG5ldyBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwoKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvV0FSRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvV0FSRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBkYWIwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dBUkZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5SdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLldhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV0FSRmlsZUltcGwgZXh0ZW5kcyBNb2R1bGVGaWxlSW1wbCBpbXBsZW1lbnRzIFdBUkZpbGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFdlYkFwcCBkZXBsb3ltZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3Qgc291cmNlRmlsZXM7Ci0KLQlwdWJsaWMgV0FSRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldFdBUkZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuV0FSRmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGFkZENvcHlDbGFzcyhGaWxlIGFGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmlzUmVhZE9ubHlEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImFkZF9jb3B5X2NsYXNzX2Rpcl9FWENfIiwgKG5ldyBPYmplY3RbXXthRmlsZS5nZXRVUkkoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiTWV0aG9kIGFkZENvcHlDbGFzcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcmllcyA6IgotCQlyZXR1cm4gYWRkQ29weUZpbGVBZGRpbmdQcmVmaXgoYUZpbGUsIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBhZGRDb3B5RmlsZUFkZGluZ1ByZWZpeChGaWxlIGFGaWxlLCBTdHJpbmcgdXJpUHJlZml4KSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN3aXp6bGVkVXJpID0gYUZpbGUuZ2V0VVJJKCk7Ci0JCWlmICghc3dpenpsZWRVcmkuc3RhcnRzV2l0aCh1cmlQcmVmaXgpKSB7Ci0JCQlzd2l6emxlZFVyaSA9IEFyY2hpdmVVdGlsLmNvbmNhdFVyaSh1cmlQcmVmaXgsIHN3aXp6bGVkVXJpLCAnLycpOwotCQl9Ci0JCWNoZWNrQWRkVmFsaWQoc3dpenpsZWRVcmkpOwotCQlGaWxlIGNvcHkgPSBjb3B5KGFGaWxlKTsKLQkJY29weS5zZXRVUkkoc3dpenpsZWRVcmkpOwotCQlnZXRGaWxlcygpLmFkZChjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBhZGRDb3B5TGliKEZpbGUgYUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlpZiAoYUZpbGUuaXNSZWFkT25seURpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiYWRkX2NvcHlfbGliX2Rpcl9FWENfIiwgKG5ldyBPYmplY3RbXXthRmlsZS5nZXRVUkkoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiTWV0aG9kIGFkZENvcHlMaWIgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3JpZXMgOiIKLQkJcmV0dXJuIGFkZENvcHlGaWxlQWRkaW5nUHJlZml4KGFGaWxlLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUNsYXNzcGF0aEVudHJ5IGNyZWF0ZUxpYkNsYXNzcGF0aEVudHJ5KFN0cmluZyBsaWJQYXRoKSB7Ci0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShsaWJQYXRoKTsKLQkJZW50cnkuc2V0V2FyRmlsZSh0aGlzKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBmb3IgYnVpbGRpbmcgdGhlIHJ1bnRpbWUgY2xhc3MgcGF0aAotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBvZiBTdHJpbmdzLCB0aGUgYWJzb2x1dGUgcGF0aHMgb2YgYWxsIGZpbGUgZW50cmllcyAobm8gZGlyZWN0b3JpZXMpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0QWxsRmlsZUVudHJpZXNSZWN1cnNpdmUoamF2YS5pby5GaWxlIGFGaWxlLCBMaXN0IGFMaXN0KSB7Ci0JCWlmICghYUZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gYUxpc3Q7Ci0JCS8vbW9kaWZpZWQgZm9yIGJvdHAgMTI2MTQwIDA1LjI5LjAyCi0JCVN0cmluZyBuYW1lID0gYUZpbGUuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5yZWdpb25NYXRjaGVzKHRydWUsIG5hbWUubGVuZ3RoKCkgLSA0LCAiLmphciIsIDAsIDQpKSB7Ly8kTk9OLU5MUy0xJAotCQkJYUxpc3QuYWRkKGFGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfSBlbHNlIGlmIChhRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlqYXZhLmlvLkZpbGVbXSBjaGlsZHJlbiA9IGFGaWxlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWdldEFsbEZpbGVFbnRyaWVzUmVjdXJzaXZlKGNoaWxkcmVuW2ldLCBhTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldENsYXNzZXMoKSB7Ci0JCXJldHVybiBmaWx0ZXJGaWxlc0J5UHJlZml4KEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlXZWJBcHAgZGQgPSB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JCWlmIChkZCA9PSBudWxsICYmIGNhbkxhenlJbml0aWFsaXplKCkpCi0JCQl0cnkgewotCQkJCWdldEltcG9ydFN0cmF0ZWd5KCkuaW1wb3J0TWV0YURhdGEoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpLCBlKTsKLQkJCX0KLQkJcmV0dXJuIHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0TGlicygpIHsKLQkJcmV0dXJuIGZpbHRlckZpbGVzQnlQcmVmaXgoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaWJBcmNoaXZlcygpIHsKLQkJcmV0dXJuIGZpbHRlckZpbGVzKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkksIG5ldyBTdHJpbmdbXXsiamFyIiwgInppcCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlTdHJpbmdbXSBwcmVmaXhlcyA9IHtKMkVFQ29uc3RhbnRzLk1FVEFfSU5GLCBKMkVFQ29uc3RhbnRzLldFQl9JTkZ9OwotCQlyZXR1cm4gZmlsdGVyRmlsZXNXaXRob3V0UHJlZml4KHByZWZpeGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIGZyb20gc3VwZXJjbGFzcyB0byBpbmNsdWRlIHRoZSBjbGFzZXNlcyBhbmQgbGlicyBvZiBhIFdBUkZpbGUgVGhlcmUgYWxzbyBpcyBhbgotCSAqIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGFuIGV4cGxvZGVkIHdhciBmaWxlIFRoZSBmb2xsb3dpbmcgaXMgd2hhdCBzaG91bGQgYmUgcmV0dXJuZWQ6Ci0JICogCi0JICogMSkgV0FSIGRpcmVjdG9yeSArIC9XRUItSU5GL2NsYXNzZXMgMikgYWxsIEpBUiBmaWxlcyBjb250YWluZWQgaW4gW1dBUiBkaXJlY3RvcnkgKwotCSAqIC9XRUItSU5GL2xpYl0gMykgV0FSIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRMb2NhbFJ1bnRpbWVDbGFzc1BhdGgoKSB7Ci0KLQkJU3RyaW5nIGFic29sdXRlUGF0aDsKLQkJdHJ5IHsKLQkJCWFic29sdXRlUGF0aCA9IGdldExvYWRTdHJhdGVneSgpLmdldEJpbmFyaWVzUGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbMF07Ci0JCX0KLQotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKGdldExvYWRTdHJhdGVneSgpLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZyBjbGFzc2VzUGF0aCA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKGFic29sdXRlUGF0aCwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCQkJZW50cmllcy5hZGQoY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KGNsYXNzZXNQYXRoKSk7Ci0JCQlhZGRXZWJMaWJzKGFic29sdXRlUGF0aCwgZW50cmllcyk7Ci0JCX0KLQotCQllbnRyaWVzLmFkZChjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkoYWJzb2x1dGVQYXRoKSk7Ci0JCXJldHVybiAoUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIGVudHJpZXMudG9BcnJheShuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldERlcGVuZGVuY3lDbGFzc1BhdGhBdFRoaXNMZXZlbCgpIHsKLQotCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gaW50ZXJuYWxHZXRCaW5hcmllc1BhdGgoKTsKLQkJaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5Q2xhc3NwYXRoKCk7Ci0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIG1mRW50cmllcyA9IHN1cGVyLmdldERlcGVuZGVuY3lDbGFzc1BhdGhBdFRoaXNMZXZlbCgpOwotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobWZFbnRyaWVzKSk7Ci0KLQkJcmV0dXJuIChSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSkgZW50cmllcy50b0FycmF5KG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJMaWJzKFN0cmluZyBhYnNvbHV0ZVBhdGgsIExpc3QgZW50cmllcykgewotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiBPcHRpbWl6YXRpb24qKioqKioqKioqKiBXZSBjb3VsZCBoYXZlIHVzZWQgdGhlIGhlbHBlciBnZXRsaWJzIGhlcmU7IGhvd2V2ZXIsIHRoYXQgY291bGQKLQkJICogZHJhZyBkb3duIHBlcmZvcm1hbmNlIGFzIHRoZSBmdWxsIGZpbGUgbGlzdCB3b3VsZCBoYXZlIHRvIGdldCBidWlsdCwgYW5kIHRoaXMgaXMgcnVudGltZTsKLQkJICogaWYgdGhlIGNsYXNzZXMgcG9ydGlvbiBpcyBodWdlIHRoZW4gYnVpbGRpbmcgdGhlIGZpbGUgbGlzdCB3b3VsZCBiZSBzbG93OyBtb3Jlb3Zlciwgd2UKLQkJICogd291bGQgdGhlbiBoYXZlIHRvIGNsZWFyIHRoZSBpbmRleCBmcm9tIHRoaXMgd2FyIGZpbGUuIHRoZXJlZm9yZSwgd2UnbGwgZG8gYSBsaXR0bGUgZXh0cmEKLQkJICogd29yayB0byBnZXQgdGhlIGxpYnMKLQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShBcmNoaXZlVXRpbC5nZXRPU1VyaShhYnNvbHV0ZVBhdGgsIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkkpKTsKLQkJTGlzdCBsaWJzID0gZ2V0QWxsRmlsZUVudHJpZXNSZWN1cnNpdmUoYUZpbGUsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIGxpYlBhdGggPSAoU3RyaW5nKSBsaWJzLmdldChpKTsKLQkJCWVudHJpZXMuYWRkKGNyZWF0ZUxpYkNsYXNzcGF0aEVudHJ5KGxpYlBhdGgpKTsKLQkJfQotCQlhZGRMb29zZUxpYnNUb1J1bnRpbWVDbGFzc3BhdGgoZW50cmllcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9vc2VMaWJzVG9SdW50aW1lQ2xhc3NwYXRoKExpc3QgZW50cmllcykgewotCQlMb29zZVdBUkZpbGUgbG9vc2UgPSAoTG9vc2VXQVJGaWxlKSBnZXRMb2FkU3RyYXRlZ3koKS5nZXRMb29zZUFyY2hpdmUoKTsKLQkJaWYgKGxvb3NlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTGlzdCBsb29zZUxpYnMgPSBsb29zZS5nZXRMb29zZUxpYnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb29zZUxpYnMuc2l6ZSgpOyBpKyspIHsKLQkJCUxvb3NlTGlicmFyeSBsaWIgPSAoTG9vc2VMaWJyYXJ5KSBsb29zZUxpYnMuZ2V0KGkpOwotCQkJZW50cmllcy5hZGQoY3JlYXRlTGliQ2xhc3NwYXRoRW50cnkobGliLmdldEJpbmFyaWVzUGF0aCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWxjdWxhdGVTb3VyY2VDYW5kaWRhdGVGaWxlcygpIHsKLQkJTGlzdCBmaWxlc0xpc3QgPSBnZXRGaWxlcygpOwotCQlMaXN0IHJldEZpbGVzID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmaWxlc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgYVVyaSA9IGZpbGUuZ2V0VVJJKCk7Ci0JCQlpZiAoYVVyaS5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuV0VCX0lORikgJiYgIWFVcmkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKSkKLQkJCQlyZXRGaWxlcy5hZGQoZmlsZSk7Ci0JCX0KLQkJcmV0dXJuIHJldEZpbGVzOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFNvdXJjZUNhbmRpZGF0ZUZpbGVzKCkgewotCQlpZiAoc291cmNlRmlsZXMgPT0gbnVsbCkgewotCQkJc291cmNlRmlsZXMgPSBjYWxjdWxhdGVTb3VyY2VDYW5kaWRhdGVGaWxlcygpOwotCQl9Ci0JCXJldHVybiBzb3VyY2VGaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgcGF0aFN0cmluZywgU3RyaW5nIHJlbFRvUGF0aFN0cmluZykgewotCi0JCWlmIChwYXRoU3RyaW5nLnN0YXJ0c1dpdGgocmVsVG9QYXRoU3RyaW5nKSkKLQkJCXJldHVybiBBcmNoaXZlVXRpbC50cnVuY2F0ZUZyb21Gcm9udElnbm9yZUNhc2UocGF0aFN0cmluZywgcmVsVG9QYXRoU3RyaW5nKTsKLQotCQlyZXR1cm4gcGF0aFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSBmaWxlIHRoYXQgbWF0Y2hlcyB0aGUgb3V0cHV0IGZpbGUgcGFzc2VkIGluCi0JICogCi0JICogQHBhcmFtIGFDbGFzc0ZpbGUKLQkgKiAgICAgICAgICAgIFRoZSAuY2xhc3MgZmlsZSBvciBvdGhlciBvdXRwdXQgZmlsZSB0byBmaW5kIHRoZSBzb3VyY2UgZm9yCi0JICogQHJldHVybiBTdHJpbmcgVGhlIG1hdGNoaW5nIHNvdXJjZS4gTnVsbCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzb3VyY2UgZm91bmQKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRTb3VyY2VGaWxlKEZpbGUgYUNsYXNzRmlsZSkgewotCQlMaXN0IHNvdXJjZUZpbGVzTGlzdCA9IGdldFNvdXJjZUNhbmRpZGF0ZUZpbGVzKCk7Ci0JCVN0cmluZyBjbGFzc1VSSSA9IGFDbGFzc0ZpbGUuZ2V0VVJJKCk7Ci0JCVN0cmluZyBjb252ZXJ0ZWRDbGFzc1VSSSA9IGNsYXNzVVJJOwotCQlpZiAoY2xhc3NVUkkuZW5kc1dpdGgoIi5jbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQljb252ZXJ0ZWRDbGFzc1VSSSA9IEFyY2hpdmVVdGlsLmNsYXNzVXJpVG9KYXZhVXJpKGFDbGFzc0ZpbGUuZ2V0VVJJKCkpOwotCQllbHNlIAotCQkJcmV0dXJuIG51bGw7Ci0JCWNvbnZlcnRlZENsYXNzVVJJID0gbWFrZVJlbGF0aXZlKGNvbnZlcnRlZENsYXNzVVJJLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JCWludCBiZXN0TGVuZ3RoID0gMzI3Njc7Ci0JCUZpbGUgYmVzdE1hdGNoID0gbnVsbDsKLQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJU3RyaW5nIGFVcmkgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VGaWxlc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlmaWxlID0gKEZpbGUpIGl0ZXIubmV4dCgpOwotCQkJYVVyaSA9IGZpbGUuZ2V0VVJJKCk7Ci0JCQlpZiAoYVVyaS5lbmRzV2l0aChjb252ZXJ0ZWRDbGFzc1VSSSkgJiYgIWFVcmkuZXF1YWxzKGNsYXNzVVJJKSkgewotCQkJCWludCBleGNlc3NMZW5ndGggPSBhVXJpLmxlbmd0aCgpIC0gY29udmVydGVkQ2xhc3NVUkkubGVuZ3RoKCk7Ci0JCQkJaWYgKGV4Y2Vzc0xlbmd0aCA8IGJlc3RMZW5ndGgpIHsKLQkJCQkJYmVzdE1hdGNoID0gZmlsZTsKLQkJCQkJYmVzdExlbmd0aCA9IGV4Y2Vzc0xlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJlc3RNYXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERlcGxveWVtZW50RGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXQVJGaWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuaW1wbC5Nb2R1bGVGaWxlSW1wbAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJV2ViQXBwIHdlYkFwcCA9ICgoV2ViYXBwbGljYXRpb25QYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkpLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZVdlYkFwcCgpOwotCQlyZXNvdXJjZS5zZXRJRCh3ZWJBcHAsIEoyRUVDb25zdGFudHMuV0VCQVBQX0lEKTsKLQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4od2ViQXBwKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQod2ViQXBwKTsKLQkJcmV0dXJuIHdlYkFwcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHAgbCkgewotCQl0aGlzLnNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGwpOwotCQlyZXBsYWNlUm9vdChnZXRNb2ZSZXNvdXJjZU1ha2VJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKSwgbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBpc1NldExhc3RNb2RpZmllZCgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fU0laRToKLQkJCQlyZXR1cm4gaXNTZXRTaXplKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzU2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gT1JJR0lOQUxfVVJJX0VERUZBVUxUID09IG51bGwgPyBvcmlnaW5hbFVSSSAhPSBudWxsIDogIU9SSUdJTkFMX1VSSV9FREVGQVVMVC5lcXVhbHMob3JpZ2luYWxVUkkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGxvYWRpbmdDb250YWluZXIgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0ZJTEVTOgotCQkJCXJldHVybiBmaWxlcyAhPSBudWxsICYmICFmaWxlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19UWVBFUzoKLQkJCQlyZXR1cm4gdHlwZXMgIT0gbnVsbCAmJiAhdHlwZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fVVJJOgotCQkJCXNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXNldExhc3RNb2RpZmllZCgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19TSVpFOgotCQkJCXNldFNpemUoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXNldERpcmVjdG9yeUVudHJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCWdldEZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fVVJJOgotCQkJCXNldFVSSShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19TSVpFOgotCQkJCXVuc2V0U2l6ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQl1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKE9SSUdJTkFMX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKSB7Ci0JCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsICYmIGRlcGxveW1lbnREZXNjcmlwdG9yLmVJc1Byb3h5KCkpIHsKLQkJCVdlYkFwcCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSAoV2ViQXBwKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClkZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gb2xkRGVwbG95bWVudERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SLCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciwgZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJBcHAgYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKFdlYkFwcCBuZXdEZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQlXZWJBcHAgb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXdEZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fU0laRToKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0U2l6ZSgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNEaXJlY3RvcnlFbnRyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJCXJldHVybiBiYXNpY0dldExvYWRpbmdDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZ2V0RmlsZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX1RZUEVTOgotCQkJCXJldHVybiBnZXRUeXBlcygpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JcHVibGljIENsYXNzTG9hZGVyIGNyZWF0ZUR5bmFtaWNDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCkgewotCQlyZXR1cm4gbmV3IFdhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIodGhpcywgcGFyZW50Q2wsIGV4dHJhQ2wpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dlYk1vZHVsZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5MjQ2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dlYk1vZHVsZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotcHVibGljIGNsYXNzIFdlYk1vZHVsZVJlZkltcGwgZXh0ZW5kcyBNb2R1bGVSZWZJbXBsIGltcGxlbWVudHMgV2ViTW9kdWxlUmVmLCBNb2R1bGVSZWYgewotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgV2ViTW9kdWxlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViTW9kdWxlUmVmKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19FQVJfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlMsIEVBUkZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TW9kdWxlRmlsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZUZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBnZXRFYXJGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNb2R1bGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNb2R1bGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJc2V0RWFyRmlsZSgoRUFSRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXNldE1vZHVsZSgoTW9kdWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCXNldE1vZHVsZUZpbGUoKE1vZHVsZUZpbGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJc2V0RWFyRmlsZSgoRUFSRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJc2V0TW9kdWxlKChNb2R1bGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJcmV0dXJuIG1vZHVsZUZpbGUgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBnZXRFYXJGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlyZXR1cm4gbW9kdWxlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogQHNlZSBXZWJNb2R1bGVSZWYjZ2V0V2ViQXBwKCkKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoV2ViQXBwKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNXZWIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0gLy9XZWJNb2R1bGVSZWZJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcHBDbGllbnQxMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXBwQ2xpZW50MTJFeHBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlNTkxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcHBDbGllbnQxMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGV4cG9ydCBtZXRhLWRhdGEgZm9yIGEgMS4yIEFwcGxpY2F0aW9uIENsaWVudAotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50MTJFeHBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBFeHBvcnRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIEFwcENsaWVudDEyRXhwb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50MTJFeHBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTFiZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGltcG9ydCBtZXRhLWRhdGEgZm9yIGEgMS4yIEFwcGxpY2F0aW9uIENsaWVudAotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKLQkJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCQlyZXR1cm4gYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQkJcmV0dXJuIG5ldyBBcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQXBwbGljYXRpb25fQ2xpZW50X0phcl9GaWwiKSwgSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSk7IC8vJE5PTi1OTFMtMSQgPSAiQXBwbGljYXRpb24gQ2xpZW50IEphciBGaWxlIgotCQl9Ci0KLQkJcHVibGljIEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpIHsKLQkJCXJldHVybiBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3I7Ci0KLQkvKioKLQkgKiBBcHBDbGllbnQyMkltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBnZXREaXNjcmltaW5hdG9yKCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3kob2xkLCBuZXdBcmNoaXZlKTsKLQl9Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlpZiAoZGlzY3JpbWluYXRvciA9PSBudWxsKSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQXBwbGljYXRpb25DbGllbnQgY2xpZW50ID0gbnVsbDsKLQotCQljbGllbnQgPSAoQXBwbGljYXRpb25DbGllbnQpIHByaW1Mb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQlnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGUoKS5zZXREZXBsb3ltZW50RGVzY3JpcHRvcihjbGllbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXJjaGl2ZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2M2FkMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXJjaGl2ZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc3VwZXJ0eXBlIGZvciBhbGwgdGhlIGFyY2hpdmUgc3RyYXRlZ2llcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBcmNoaXZlU3RyYXRlZ3kgewotCXB1YmxpYyBBcmNoaXZlIGdldEFyY2hpdmUoKTsKLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoQXJjaGl2ZSBhcmNoaXZlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MjQ5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcmNoaXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLQotLyoqCi0gKiBUaGlzIGFuIGFic3RyYWN0IHR5cGUgb2ZmIHdoaWNoIGFueSBpbXBsZW1lbnRlcnMgb2YgdGhlIGFyY2hpdmUgc3RyYXRlZ3kgY2FuIHN1YmNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXJjaGl2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIEFyY2hpdmVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIEFyY2hpdmUgYXJjaGl2ZTsKLQotCS8qKgotCSAqIEFyY2hpdmVTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBcmNoaXZlU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCWFyY2hpdmUgPSBuZXdBcmNoaXZlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0Nvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0Nvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1ODdkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Db25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0vKioKLSAqIEltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIHNhdmUgYW4gYXJjaGl2ZXMgY29udGVudHMgdG8gYSBkaXJlY3Rvcnkgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgU2F2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIFNhdmVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBkaXJlY3RvcnlOYW1lOwotCXByb3RlY3RlZCBVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyOwotCS8qKiBJbmRpY2F0ZXMgd2hpY2ggdHlwZSBvZiBhcmNoaXZlcyBzaG91bGQgYmUgZXhwYW5kZWQgKi8KLQlwcm90ZWN0ZWQgaW50IGV4cGFuc2lvbkZsYWdzOwotCi0JLyoqCi0JICogRGlyZWN0b3J5RHVtcFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlyZWN0b3J5RHVtcFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoU3RyaW5nIGRpck5hbWUsIGludCBmbGFncykgewotCQlzdXBlcigpOwotCQlzZXREaXJlY3RvcnlOYW1lKGRpck5hbWUpOwotCQlzZXRFeHBhbnNpb25GbGFncyhmbGFncyk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWREaXJlY3RvcnlTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlTdHJpbmcgdXJpID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5nZXRPU1VyaShnZXREaXJlY3RvcnlOYW1lKCksICIiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbCh1cmksIGdldEV4cGFuc2lvbkZsYWdzKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZFNhdmVTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNob3VsZEV4cGFuZChhbkFyY2hpdmUpKQotCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZERpcmVjdG9yeVN0cmF0ZWd5KGFuQXJjaGl2ZSk7Ci0JCXJldHVybiBjcmVhdGVOZXN0ZWRaaXBTdHJhdGVneShhbkFyY2hpdmUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZFppcFN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkoYW5BcmNoaXZlLmdldFVSSSgpKSk7Ci0JCXJldHVybiBuZXcgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChvdXQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzE1LzAwIDI6MjY6MzcgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlyZWN0b3J5TmFtZSgpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMTA6MTg6MjEgQU0pCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4cGFuc2lvbkZsYWdzKCkgewotCQlyZXR1cm4gZXhwYW5zaW9uRmxhZ3M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShhUmVzb3VyY2UuZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA4LzAwIDQ6NTA6MzIgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIgZ2V0VXJpQ29udmVydGVyKCkgewotCQlyZXR1cm4gdXJpQ29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCUFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsIGNvbnZlcnRlciA9IG5ldyBBcmNoaXZlVVJJQ29udmVydGVySW1wbChnZXRBcmNoaXZlKCksIGdldERpcmVjdG9yeU5hbWUoKSk7Ci0JCWNvbnZlcnRlci5zZXRPdXRwdXRGaWxlcGF0aChnZXREaXJlY3RvcnlOYW1lKCkpOwotCQlzZXRVcmlDb252ZXJ0ZXIoY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1rZGlycyhTdHJpbmcgZGlyZWN0b3J5UGF0aCkgewotCQlGaWxlIGFEaXJlY3RvcnkgPSBuZXcgRmlsZShnZXREaXJlY3RvcnlOYW1lKCkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBkaXJlY3RvcnlQYXRoKTsKLQkJYURpcmVjdG9yeS5ta2RpcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdCBhTWFuaWZlc3QpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKLQkJCWFNYW5pZmVzdC53cml0ZShvdXQpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJLCBpb3gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSBhRmlsZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlbnRyeU5hbWUgPSBhRmlsZS5nZXRVUkkoKTsKLQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSkKLQkJCW1rZGlycyhlbnRyeU5hbWUpOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJT3V0cHV0U3RyZWFtIG91dCA9IGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKGVudHJ5TmFtZSkpOwotCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuY29weShpbiwgb3V0KTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihhRmlsZS5nZXRVUkkoKSwgaW94KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2ZSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UgYVJlc291cmNlLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNhdmVNb2ZSZXNvdXJjZShhUmVzb3VyY2UsIG9zKTsKLQkJb3MuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8wMCAyOjI2OjM3IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdEaXJlY3RvcnlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld0RpcmVjdG9yeU5hbWUpIHsKLQkJZGlyZWN0b3J5TmFtZSA9IG5ld0RpcmVjdG9yeU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMTA6MTg6MjEgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4cGFuc2lvbkZsYWdzCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbnNpb25GbGFncyhpbnQgbmV3RXhwYW5zaW9uRmxhZ3MpIHsKLQkJZXhwYW5zaW9uRmxhZ3MgPSBuZXdFeHBhbnNpb25GbGFnczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wOC8wMCA0OjUwOjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdVcmlDb252ZXJ0ZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmlDb252ZXJ0ZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlciBuZXdVcmlDb252ZXJ0ZXIpIHsKLQkJdXJpQ29udmVydGVyID0gbmV3VXJpQ29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEV4cGFuZChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCi0JCWludCBmbGFnID0gMDsKLQotCQlpZiAoYW5BcmNoaXZlLmlzV0FSRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX1dBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzRUFSRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0VBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzRUpCSmFyRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0VKQkpBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzUkFSRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX1JBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfQVBQQ0xJRU5UX0ZJTEVTOwotCQllbHNlCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfQVJDSElWRVM7Ci0KLQkJcmV0dXJuIChnZXRFeHBhbnNpb25GbGFncygpICYgZmxhZykgIT0gMDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1NDljMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi0vKioKLSAqIFNwZWNpYWxpemVkIGxvYWQgc3RyYXRlZ3kgdGhhdCByZWFkcyBlbnRyaWVzIGluIGFuIGFyY2hpdmUgZnJvbSBhIGRpcmVjdG9yeSBvbiB0aGUgZmlsZSBzeXN0ZW0KLSAqLwotcHVibGljIGludGVyZmFjZSBEaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5IGV4dGVuZHMgTG9hZFN0cmF0ZWd5IHsKLQlwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVVyaSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MDYwMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ1JlZ2lzdGVyOwotCi0KLS8qKgotICogTG9hZCBzdHJhdGVneSB1c2VkIGZvciByZWFkaW5nIGV4cGFuZGluZyBhcmNoaXZlczsgdHlwaWNhbGx5IGluIGEgcnVubmluZyBzZXJ2ZXIgdGhpcyB3b3VsZCBiZSBhbgotICogRUFSIG9yIFdBUiwgYWx0aG91Z2ggaXQgY2FuIGJlIGFueSBBcmNoaXZlCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIERpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwgewotCi0KLQotCXB1YmxpYyBEaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbChTdHJpbmcgYURpcmVjdG9yeVVyaSkgewotCQlzdXBlcihhRGlyZWN0b3J5VXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXJlY3RvcnkoamF2YS5pby5GaWxlIGFGaWxlLCBqYXZhLnV0aWwuTGlzdCBhTGlzdCkgewotCQlhZGRGaWxlcyhhRmlsZSwgYUxpc3QpOwotCX0KLQotCXByb3RlY3RlZCBqYXZhLmlvLkZpbGUgZ2V0RGlyZWN0b3J5Rm9yTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBqYXZhLmlvLkZpbGUoZ2V0RGlyZWN0b3J5VXJpKCkpOwotCX0KLQotCi0KLQlwdWJsaWMgTG9vc2VBcmNoaXZlIGdldExvb3NlQXJjaGl2ZSgpIHsKLQkJaWYgKGxvb3NlQXJjaGl2ZSA9PSBudWxsICYmIGdldENvbnRhaW5lcigpLmlzRUFSRmlsZSgpKSB7Ci0JCQlTdHJpbmcgb3NTdHJpbmcgPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShnZXRDb250YWluZXIoKS5nZXRVUkkoKSk7Ci0JCQlzZXRMb29zZUFyY2hpdmUoTG9vc2VDb25maWdSZWdpc3Rlci5zaW5nbGV0b24oKS5maW5kTG9vc2VBcHBsaWNhdGlvbihvc1N0cmluZykpOwotCQl9Ci0JCXJldHVybiBsb29zZUFyY2hpdmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjkwNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotCi0vKioKLSAqIEltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIHJlYWQgZmlsZXMgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gYW5kIHRyZWF0IHRoZW0gYXMgZmlsZQotICogZW50cmllcyBpbiBhbiBhcmNoaXZlCi0gKiAKLSAqIEBzZWUgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIExvYWRTdHJhdGVneUltcGwgaW1wbGVtZW50cyBEaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5IHsKLQkvKioKLQkgKiBUaGUgcm9vdCB1cmkgZnJvbSB3aGljaCBhbGwgcmVsYXRpdmUgZmlsZXMgZW50cmllcyBhcmUgbG9hZGVkOyBtdXN0IHBvaW50IHRvIGEgdmFsaWQgbG9jYWwKLQkgKiBkaXJlY3RvcnkKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBJU19BSVggPSAiQUlYIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcm90ZWN0ZWQgU3RyaW5nIGRpcmVjdG9yeVVyaTsKLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHk7IHRoZSBkaXJlY3RvcnkgdXJpIHdpdGggdGhlIHN5c3RlbSBkZXBlbmRlbnQgZmlsZSBzZXBhcmF0b3IgcmVwbGFjZWQgYnkgYQotCSAqIGZvcndhcmQgc2xhc2gKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRpcmVjdG9yeVVyaUFzWmlwU3RyaW5nOwotCXByb3RlY3RlZCBzdGF0aWMgY2hhciBTRVBBUkFUT1JfQ0hBUiA9IGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCi0JcHVibGljIERpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwoU3RyaW5nIGFEaXJlY3RvcnlVcmkpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGlyZWN0b3J5VXJpKGFEaXJlY3RvcnlVcmkpOwotCQlTdHJpbmcgbm9ybWFsaXplZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlub3JtYWxpemVkID0gbmV3IEZpbGUoYURpcmVjdG9yeVVyaSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCW5vcm1hbGl6ZWQgPSBhRGlyZWN0b3J5VXJpOwotCQl9Ci0JCXNldERpcmVjdG9yeVVyaUFzWmlwU3RyaW5nKG5vcm1hbGl6ZWQucmVwbGFjZShTRVBBUkFUT1JfQ0hBUiwgJy8nKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGREaXJlY3RvcnkoamF2YS5pby5GaWxlIGFGaWxlLCBMaXN0IGFMaXN0KTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZpbGUoamF2YS5pby5GaWxlIGFGaWxlLCBMaXN0IGFMaXN0KSB7Ci0KLQkJU3RyaW5nIHVyaSA9IGdldFVSSUZyb20oYUZpbGUpOwotCQlpZiAoY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMuY29udGFpbnNLZXkodXJpKSkKLQkJCXJldHVybjsKLQotCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlIGNGaWxlID0gY3JlYXRlRmlsZSh1cmkpOwotCQljRmlsZS5zZXRTaXplKGFGaWxlLmxlbmd0aCgpKTsKLQkJY0ZpbGUuc2V0TGFzdE1vZGlmaWVkKGFGaWxlLmxhc3RNb2RpZmllZCgpKTsKLQkJYUxpc3QuYWRkKGNGaWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlcyhqYXZhLmlvLkZpbGUgYURpcmVjdG9yeSwgTGlzdCBhTGlzdCkgewotCi0JCVN0cmluZ1tdIGZpbGVOYW1lcyA9IGFEaXJlY3RvcnkubGlzdCgpOwotCQlpZiAoZmlsZU5hbWVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkoYURpcmVjdG9yeS5nZXRQYXRoKCksIGZpbGVOYW1lc1tpXSwgU0VQQVJBVE9SX0NIQVIpOwotCQkJaWYgKGZpbGVOYW1lc1tpXSA9PSBudWxsIHx8IChJU19BSVggJiYgIi5iYWNrdXAiLmVxdWFscyhmaWxlTmFtZXNbaV0pKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlTmFtZSk7Ci0JCQlpZiAoIWFGaWxlLmV4aXN0cygpKQotCQkJCWNvbnRpbnVlOwotCQkJLy9UaGlzIGNvdWxkIG9jY3VyIG9uIHNvbWUgd2luZG93cyBtYWNoaW5lcywgZWcgQzpccGFnZWZpbGUuc3lzCi0JCQkvL3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBzY2FubmluZyBkaXJlY3Rvcnkgc3RydWN0dXJlIik7Ci0JCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSAmJiAhaXNBcmNoaXZlKGdldFVSSUZyb20oYUZpbGUpKSkgewotCQkJCWFkZERpcmVjdG9yeShhRmlsZSwgYUxpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQlhZGRGaWxlKGFGaWxlLCBhTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUNvbnRhaW5zKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldEZpbGVOYW1lRnJvbSh1cmkpKS5leGlzdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBqYXZhLmlvLkZpbGUoZ2V0RGlyZWN0b3J5VXJpKCkpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLmlvLkZpbGUgZ2V0RGlyZWN0b3J5Rm9yTGlzdCgpOwotCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlyZWN0b3J5VXJpKCkgewotCQlyZXR1cm4gZGlyZWN0b3J5VXJpOwotCX0KLQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpcmVjdG9yeVVyaUFzWmlwU3RyaW5nKCkgewotCQlyZXR1cm4gZGlyZWN0b3J5VXJpQXNaaXBTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBPUyBmaWxlbmFtZSBmcm9tIGEgcmVsYXRpdmUgdXJpCi0JICovCi0JLy8gVE9ETyBGaXggdGhlIHR5cGUgY2FzaW5nIGluIHY2LjAKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lRnJvbShTdHJpbmcgdXJpKSB7Ci0JCUxvb3NlQXJjaGl2ZSBhTG9vc2VBcmNoaXZlID0gZ2V0TG9vc2VBcmNoaXZlKCk7Ci0JCWlmIChhTG9vc2VBcmNoaXZlICE9IG51bGwpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJc3dpdGNoIChhTG9vc2VBcmNoaXZlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT04gOgotCQkJCQlyZXN1bHQgPSBnZXRVUklGcm9tTG9vc2VBcmNoaXZlc0lmQXZhaWxhYmxlKCgoTG9vc2VBcHBsaWNhdGlvbikgYUxvb3NlQXJjaGl2ZSkuZ2V0TG9vc2VBcmNoaXZlcygpLCB1cmkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRSA6Ci0JCQkJCXJlc3VsdCA9IGdldFVSSUZyb21Mb29zZUFyY2hpdmVzSWZBdmFpbGFibGUoKChMb29zZVdBUkZpbGUpIGFMb29zZUFyY2hpdmUpLmdldExvb3NlTGlicygpLCB1cmkpOwotCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSB1cmk7Ci0JCWlmIChTRVBBUkFUT1JfQ0hBUiAhPSAnLycpCi0JCQluYW1lID0gbmFtZS5yZXBsYWNlKCcvJywgU0VQQVJBVE9SX0NIQVIpOwotCQlyZXR1cm4gZ2V0RGlyZWN0b3J5VXJpKCkgKyBTRVBBUkFUT1JfQ0hBUiArIG5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VVJJRnJvbUxvb3NlQXJjaGl2ZXNJZkF2YWlsYWJsZShMaXN0IGxvb3NlQXJjaGl2ZXMsIFN0cmluZyB1cmkpIHsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsb29zZUFyY2hpdmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTG9vc2VBcmNoaXZlIGxvb3NlQXJjaGl2ZUVsZW1lbnQgPSAoTG9vc2VBcmNoaXZlKSBpdGVyLm5leHQoKTsKLQkJCWlmICh1cmkuZXF1YWxzKGxvb3NlQXJjaGl2ZUVsZW1lbnQuZ2V0VXJpKCkpKQotCQkJCXJldHVybiBsb29zZUFyY2hpdmVFbGVtZW50LmdldEJpbmFyaWVzUGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJamF2YS5pby5GaWxlIGRpcmVjdG9yeSA9IGdldERpcmVjdG9yeUZvckxpc3QoKTsKLQkJYWRkRmlsZXMoZGlyZWN0b3J5LCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGdldEZpbGVOYW1lRnJvbSh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVsYXRpdmUgdXJpIGZyb20gdGhlIGphdmEuaW8uRmlsZSwgdG8gYmUgdXNlZCBmb3IgYSBmaWxlIGVudHJ5OyB0aGUgc2VwYXJhdG9yIHdpbGwKLQkgKiBiZSB0aGUgemlwIHN0YW5kYXJkIChmb3J3YXJkIHNsYXNoICgiLyIpKS4KLQkgKi8KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VVJJRnJvbShGaWxlIGFGaWxlKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlbGF0aXZlID0gbnVsbDsKLQkJU3RyaW5nIHJvb3QgPSBnZXREaXJlY3RvcnlVcmlBc1ppcFN0cmluZygpOwotCQl0cnkgewotCQkJbmFtZSA9IGFGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCXJlbGF0aXZlID0gbWFrZVJlbGF0aXZlKG5hbWUsIHJvb3QpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCW5hbWUgPSBudWxsOwotCQl9Ci0JCWlmIChyZWxhdGl2ZSA9PSBudWxsKSB7Ci0JCQluYW1lID0gYUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlyZWxhdGl2ZSA9IG1ha2VSZWxhdGl2ZShuYW1lLCByb290KTsKLQkJfQotCQlpZiAocmVsYXRpdmUgPT0gbnVsbCkgewotCQkJbmFtZSA9IGFGaWxlLmdldFBhdGgoKTsKLQkJCXJvb3QgPSByZXBsYWNlU2VwYXJhdG9ycyhnZXREaXJlY3RvcnlVcmkoKSk7Ci0JCQlyZWxhdGl2ZSA9IG1ha2VSZWxhdGl2ZShuYW1lLCByb290KTsKLQkJfQotCQlyZXR1cm4gcmVsYXRpdmU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZVNlcGFyYXRvcnMoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpCi0JCQlyZXR1cm4gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVJlbGF0aXZlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHJvb3QpIHsKLQkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgcm9vdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJZm9yICg7IHJvb3QuZW5kc1dpdGgoIi8iKTsgcm9vdCA9IEFyY2hpdmVVdGlsLnRydW5jYXRlSWdub3JlQ2FzZShyb290LCAiLyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW5hbWUgPSByZXBsYWNlU2VwYXJhdG9ycyhmaWxlTmFtZSk7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgocm9vdCkpCi0JCQluYW1lID0gbmFtZS5zdWJzdHJpbmcocm9vdC5sZW5ndGgoKSArIDEpOwotCQllbHNlCi0JCQluYW1lID0gbnVsbDsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZyhqYXZhLmlvLkZpbGUgYVN5c3RlbUZpbGUpIHsKLQkJamF2YS5pby5GaWxlIGRpciA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0RGlyZWN0b3J5VXJpKCkpOwotCQlyZXR1cm4gZGlyLmVxdWFscyhhU3lzdGVtRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VXJpKGphdmEubGFuZy5TdHJpbmcgbmV3RGlyZWN0b3J5VXJpKSB7Ci0JCWRpcmVjdG9yeVVyaSA9IG5ld0RpcmVjdG9yeVVyaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlVcmlBc1ppcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIG5ld0RpcmVjdG9yeVVyaUFzWmlwU3RyaW5nKSB7Ci0JCWRpcmVjdG9yeVVyaUFzWmlwU3RyaW5nID0gbmV3RGlyZWN0b3J5VXJpQXNaaXBTdHJpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2U2ZTcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBzYXZlIGFuIGFyY2hpdmVzIGNvbnRlbnRzIHRvIGEgZGlyZWN0b3J5IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIFNhdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBTYXZlU3RyYXRlZ3kgewotCXByb3RlY3RlZCBTdHJpbmcgZGlyZWN0b3J5TmFtZTsKLQlwcm90ZWN0ZWQgVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlcjsKLQkvKiogSW5kaWNhdGVzIHdoaWNoIHR5cGUgb2YgYXJjaGl2ZXMgc2hvdWxkIGJlIGV4cGFuZGVkICovCi0JcHJvdGVjdGVkIGludCBleHBhbnNpb25GbGFnczsKLQotCS8qKgotCSAqIERpcmVjdG9yeUR1bXBTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpcmVjdG9yeUR1bXBTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKFN0cmluZyBkaXJOYW1lLCBpbnQgZmxhZ3MpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGlyZWN0b3J5TmFtZShkaXJOYW1lKTsKLQkJc2V0RXhwYW5zaW9uRmxhZ3MoZmxhZ3MpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkRGlyZWN0b3J5U3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJU3RyaW5nIHVyaSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoZ2V0RGlyZWN0b3J5TmFtZSgpLCBhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQlyZXR1cm4gbmV3IERpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwodXJpLCBnZXRFeHBhbnNpb25GbGFncygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzaG91bGRFeHBhbmQoYW5BcmNoaXZlKSkKLQkJCXJldHVybiBjcmVhdGVOZXN0ZWREaXJlY3RvcnlTdHJhdGVneShhbkFyY2hpdmUpOwotCQlyZXR1cm4gY3JlYXRlTmVzdGVkWmlwU3RyYXRlZ3koYW5BcmNoaXZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRaaXBTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKGFuQXJjaGl2ZS5nZXRVUkkoKSkpOwotCQlyZXR1cm4gbmV3IFppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwob3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8wMCAyOjI2OjM3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpcmVjdG9yeU5hbWUoKSB7Ci0JCXJldHVybiBkaXJlY3RvcnlOYW1lOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDEwOjE4OjIxIEFNKQotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFeHBhbnNpb25GbGFncygpIHsKLQkJcmV0dXJuIGV4cGFuc2lvbkZsYWdzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtRm9yUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oYVJlc291cmNlLmdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wOC8wMCA0OjUwOjMyIFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyIGdldFVyaUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlBcmNoaXZlVVJJQ29udmVydGVySW1wbCBjb252ZXJ0ZXIgPSBuZXcgQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwoZ2V0QXJjaGl2ZSgpLCBnZXREaXJlY3RvcnlOYW1lKCkpOwotCQljb252ZXJ0ZXIuc2V0T3V0cHV0RmlsZXBhdGgoZ2V0RGlyZWN0b3J5TmFtZSgpKTsKLQkJc2V0VXJpQ29udmVydGVyKGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBta2RpcnMoU3RyaW5nIGRpcmVjdG9yeVBhdGgpIHsKLQkJRmlsZSBhRGlyZWN0b3J5ID0gbmV3IEZpbGUoZ2V0RGlyZWN0b3J5TmFtZSgpICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgZGlyZWN0b3J5UGF0aCk7Ci0JCWFEaXJlY3RvcnkubWtkaXJzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QgYU1hbmlmZXN0KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtIG91dCA9IGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0JCQlhTWFuaWZlc3Qud3JpdGUob3V0KTsKLQkJCW91dC5jbG9zZSgpOwotCQkJaWYgKGdldEFyY2hpdmUoKS5nZXRPcHRpb25zKCkuaXNSZWFkT25seSgpKQotCQkJCXNldFRpbWVzdGFtcEFmdGVyU2F2aW5nKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkksIGlveCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlIGFGaWxlLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVudHJ5TmFtZSA9IGFGaWxlLmdldFVSSSgpOwotCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpKQotCQkJbWtkaXJzKGVudHJ5TmFtZSk7Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkoZW50cnlOYW1lKSk7Ci0JCQkJQXJjaGl2ZVV0aWwuY29weShpbiwgb3V0KTsKLQkJCQlzZXRUaW1lc3RhbXBBZnRlclNhdmluZyhhRmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYUZpbGUuZ2V0VVJJKCksIGlveCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9mUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGFSZXNvdXJjZSwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5zYXZlTW9mUmVzb3VyY2UoYVJlc291cmNlLCBvcyk7Ci0JCW9zLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMTUvMDAgMjoyNjozNyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RGlyZWN0b3J5TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcmVjdG9yeU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdEaXJlY3RvcnlOYW1lKSB7Ci0JCWRpcmVjdG9yeU5hbWUgPSBuZXdEaXJlY3RvcnlOYW1lOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDEwOjE4OjIxIEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHBhbnNpb25GbGFncwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5zaW9uRmxhZ3MoaW50IG5ld0V4cGFuc2lvbkZsYWdzKSB7Ci0JCWV4cGFuc2lvbkZsYWdzID0gbmV3RXhwYW5zaW9uRmxhZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGltZXN0YW1wQWZ0ZXJTYXZpbmcob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSBhRmlsZSkgewotCQlsb25nIGxhc3RNb2QgPSBhRmlsZS5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJaWYgKGxhc3RNb2QgPT0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGFic1BhdGggPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShnZXREaXJlY3RvcnlOYW1lKCksIGFGaWxlLmdldFVSSSgpKTsKLQkJRmlsZSBpb0ZpbGUgPSBuZXcgRmlsZShhYnNQYXRoKTsKLQkJaW9GaWxlLnNldExhc3RNb2RpZmllZChsYXN0TW9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUaW1lc3RhbXBBZnRlclNhdmluZyhTdHJpbmcgdXJpKSB7Ci0JCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUgYUZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJYUZpbGUgPSBnZXRBcmNoaXZlKCkuZ2V0RmlsZSh1cmkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gbXVzdEJlQU5ld0VudHJ5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0VGltZXN0YW1wQWZ0ZXJTYXZpbmcoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA4LzAwIDQ6NTA6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1VyaUNvbnZlcnRlcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaUNvbnZlcnRlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyIG5ld1VyaUNvbnZlcnRlcikgewotCQl1cmlDb252ZXJ0ZXIgPSBuZXdVcmlDb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRXhwYW5kKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0KLQkJaW50IGZsYWcgPSAwOwotCi0JCWlmIChhbkFyY2hpdmUuaXNXQVJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfV0FSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFQVJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfRUFSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNSQVJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfUkFSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFSkJKYXJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfRUpCSkFSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9BUFBDTElFTlRfRklMRVM7Ci0JCWVsc2UKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9BUkNISVZFUzsKLQotCQlyZXR1cm4gKGdldEV4cGFuc2lvbkZsYWdzKCkgJiBmbGFnKSAhPSAwOwotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSXRlcmF0ZU92ZXIoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIHN1cGVyLnNob3VsZEl0ZXJhdGVPdmVyKGFuQXJjaGl2ZSkgfHwgc2hvdWxkRXhwYW5kKGFuQXJjaGl2ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJFeHBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VhcjEyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDJkMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJFeHBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBleHBvcnQgbWV0YS1kYXRhIGZvciBhIDEuMiBBcHBsaWNhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWFyMTJFeHBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBFeHBvcnRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIEVhcjEyRXhwb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRWFyMTJFeHBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOTEzYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGltcG9ydCBtZXRhLWRhdGEgZm9yIGEgMS4yIEFwcGxpY2F0aW9uIENsaWVudAotICovCi1wdWJsaWMgY2xhc3MgRWFyMTJJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKLQkJcHVibGljIEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpIHsKLQkJCXJldHVybiBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQkJcmV0dXJuIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCQlyZXR1cm4gbmV3IEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZ2V0WG1sRERNZXNzYWdlKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFQVJfRmlsZSIpLCBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSk7IC8vJE5PTi1OTFMtMSQgPSAiRUFSIEZpbGUiCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERpc2NyaW1pbmF0b3IgZGlzY3JpbWluYXRvcjsKLQotCS8qKgotCSAqIEVhcjEySW1wb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRWFyMTJJbXBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJcmV0dXJuIGdldERpc2NyaW1pbmF0b3IoKS5jcmVhdGVJbXBvcnRTdHJhdGVneShvbGQsIG5ld0FyY2hpdmUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGdldERpc2NyaW1pbmF0b3IoKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9yID09IG51bGwpIHsKLQkJCWRpc2NyaW1pbmF0b3IgPSBuZXcgRGlzY3JpbWluYXRvcigpOwotCQl9Ci0JCXJldHVybiBkaXNjcmltaW5hdG9yOwotCX0KLQotCXB1YmxpYyBFQVJGaWxlIGdldEVBUkZpbGUoKSB7Ci0JCXJldHVybiAoRUFSRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydE1ldGFEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlBcHBsaWNhdGlvbiBhcHBsID0gbnVsbDsKLQotCQlhcHBsID0gKEFwcGxpY2F0aW9uKSBwcmltTG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJZ2V0RUFSRmlsZSgpLnNldERlcGxveW1lbnREZXNjcmlwdG9yKGFwcGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VqYkphcjExRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzk0NGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VqYkphcjExRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gZXhwb3J0IG1ldGEtZGF0YSBmb3IgYSAxLjEgRWpiIEphcgotICovCi1wdWJsaWMgY2xhc3MgRWpiSmFyMTFFeHBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBFeHBvcnRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIEVqYkphcjExRXhwb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRWpiSmFyMTFFeHBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMDMxMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gaW1wb3J0IG1ldGEtZGF0YSBmb3IgYSAxLjEgRWpiIEphcgotICovCi1wdWJsaWMgY2xhc3MgRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKLQkJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCQlyZXR1cm4gYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCQlyZXR1cm4gbmV3IEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZ2V0WG1sRERNZXNzYWdlKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFSkJfSmFyX0ZpbGUiKSwgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKTsgLy8kTk9OLU5MUy0xJCA9ICJFSkIgSmFyIEZpbGUiCi0JCX0KLQotCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3I7Ci0KLQkvKioKLQkgKiBFamJKYXIxMUltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBnZXREaXNjcmltaW5hdG9yKCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3kob2xkLCBuZXdBcmNoaXZlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlpZiAoZGlzY3JpbWluYXRvciA9PSBudWxsKSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQlwdWJsaWMgRUpCSmFyRmlsZSBnZXRFSkJKYXJGaWxlKCkgewotCQlyZXR1cm4gKEVKQkphckZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRUpCSmFyIGVqYkphciA9IG51bGw7Ci0KLQkJZWpiSmFyID0gKEVKQkphcikgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlnZXRFSkJKYXJGaWxlKCkuc2V0RGVwbG95bWVudERlc2NyaXB0b3IoZWpiSmFyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FeHBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0V4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJkZjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0V4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkV4cG9ydFN0cmF0ZWd5OwotCi0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50ZXIgb2ZmIHdoaWNoIG90aGVyIGV4cG9ydCBzdHJhdGVnaWVzIGNhbiBzdWJjbGFzcwotICogCi0gKiBAc2VlIEV4cG9ydFN0cmF0ZWd5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBBcmNoaXZlU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgRXhwb3J0U3RyYXRlZ3kgewotCS8qKiBUaGUgbGlzdCBvZiBmaWxlcyBhbHJlYWR5IHNhdmVkIGJ5IHRoaXMgc3RyYXRlZ3kgZHVyaW5nIGludm9rYXRpb24gb2YgcHJlU2F2ZSgpICovCi0JcHJvdGVjdGVkIFNldCBzYXZlZEZpbGVzOwotCi0JcHVibGljIEV4cG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLlNldCBnZXRTYXZlZEZpbGVzKCkgewotCQlpZiAoc2F2ZWRGaWxlcyA9PSBudWxsKQotCQkJc2F2ZWRGaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJldHVybiBzYXZlZEZpbGVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NhdmVkKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIHNhdmVkRmlsZXMgIT0gbnVsbCAmJiBnZXRTYXZlZEZpbGVzKCkuY29udGFpbnModXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nOyBzdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlOyB0eXBpY2FsIG9wZXJhdGlvbnMgd291bGQgYmUgdG8KLQkgKiBhZGQgZXh0cmEgZWxlbWVudHMgdG8gdGhlIG91dGdvaW5nIGFyY2hpdmUsIHVzaW5nIFNhdmVTdHJhdGVneSNzYXZlKEZpbGUsCi0JICogamF2YS5pby5JbnB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVTYXZlKFNhdmVTdHJhdGVneSBhU2F2ZVN0cmF0ZWd5KSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogVGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gdXJpIGhhcyBqdXN0IGJlZW4gc2F2ZWQ7IGFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIHNhdmVkIGZpbGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZWQoU3RyaW5nIHVyaSkgewotCQlnZXRTYXZlZEZpbGVzKCkuYWRkKHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2F2ZWRGaWxlcyhqYXZhLnV0aWwuU2V0IG5ld1NhdmVkRmlsZXMpIHsKLQkJc2F2ZWRGaWxlcyA9IG5ld1NhdmVkRmlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvSW1wb3J0U3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0ltcG9ydFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDg1Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvSW1wb3J0U3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotCi0vKioKLSAqIEltcG9ydFN0cmF0ZWd5IGtub3dzIGhvdyB0byBpbnRlcnByZXQgdGhlIGluZm9ybWF0aW9uIGluIGFuIGFyY2hpdmUsIHVzdWFsbHkgaW4gZGVwbG95bWVudAotICogZGVzY3JpcHRvcnMsIHRvIGJ1aWxkIHVwIGEgbW9kZWwgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEltcG9ydFN0cmF0ZWd5IGV4dGVuZHMgQXJjaGl2ZVN0cmF0ZWd5IHsKLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHVzZWQgZm9yIGNvcHlpbmcgYXJjaGl2ZXM7IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGtpbmQgb2Ygc3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBEbyB3aGF0ZXZlciBpcyBuZWNlc3NhcnkgdG8gYnJpbmcgaW4gbWV0YWRhdGEgZnJvbSB0aGUgYXJjaGl2ZSBhbmQgc2V0IHRoZSBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvcnMgdG8gdGhlIHN0YW5kYXJkIGZvcm0gdGhhdCB0aGUgYXBpcyBjYW4gcmVjb2duaXplCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIGJvb2xlYW4gaXNFSkIxMCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9JbXBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0NjE3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9JbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLQotCi0vKioKLSAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mZiB3aGljaCBvdGhlciBpbXBvcnQgc3RyYXRlZ2llcyBjYW4gc3ViY2xhc3MKLSAqIAotICogQHNlZSBJbXBvcnRTdHJhdGVneQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgQXJjaGl2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIEltcG9ydFN0cmF0ZWd5IHsKLQkvKioKLQkgKiBBcmNoaXZlSW1wb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkIxMCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0xvYWRTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NWNmMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLQotCi0vKioKLSAqIExvYWRTdHJhdGVneSBrbm93cyBob3cgdG8gbG9hZCBvciByZWFkIHRoZSBjb250ZW50cyBvZiBhIGNvbnRhaW5lci4gVGhpcyBwcm92aWRlcyBhIGRlbGVnYXRpb24KLSAqIG1vZGVsIGZvciByZWFkaW5nIGluIHRoZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlIGZpbGUuIENsaWVudHMgY2FuIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYW5kCi0gKiAicGx1ZyBpbiIgdG8gYW4gaW5zdGFuY2Ugb2YgYW4gYXJjaGl2ZS4gRXhhbXBsZXMgbWlnaHQgaW5jbHVkZSByZWFkaW5nIGZyb20gYSB6aXAgZmlsZSwgZnJvbSBhbgotICogaW5wdXQgc3RyZWFtLCBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwgb3IgZnJvbSBhIHdvcmtiZW5jaC4KLSAqLwotcHVibGljIGludGVyZmFjZSBMb2FkU3RyYXRlZ3kgewotCXB1YmxpYyB2b2lkIGFkZE9yUmVwbGFjZU1vZlJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgYmVpbmcgaGVsZCBieSB0aGlzIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGlzIHN0cmF0ZWd5LCBpZiBpdCBleGlzdHM7IGNhc2VzIHdoZXJlIGl0IG1pZ2h0IG5vdCBleGlzdCBpcyBpZgotCSAqIHRoZSBsb2FkIHN0cmF0ZWd5IGlzICJ2aXJ0dWFsIiwgZS5nLiwgYSBqYXIgd2l0aGluIGEgamFyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByb290IGZyb20gd2hpY2ggbWV0YSByZXNvdXJjZXMgZ2V0IGxvYWRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VzUGF0aCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJvb3QgZnJvbSB3aGljaCBjbGFzc2VzIGFuZCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJpbmFyaWVzUGF0aCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQotCXB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKTsKLQotCXB1YmxpYyBSZXNvdXJjZVNldCBwcmltR2V0UmVzb3VyY2VTZXQoKTsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseTsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbAotCSAqLwotCXB1YmxpYyBGaWxlSXRlcmF0b3IgZ2V0RmlsZUl0ZXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBieSBhbiBhcmNoaXZlIHRvIG9idGFpbiBhIGxpc3Qgb2YgaXQncyBmaWxlcywgd2hpY2ggaXMgdXN1YWxseSBkZWZlcnJlZCB1bnRpbCB0aGUgZmlyc3QKLQkgKiB0aW1lIGl0IGlzIGludm9rZWQsIGFzIGFuIG9wdGltaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgTGlzdCBjb2xsZWN0RmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIG9uIGFuIGVudHJ5IG5hbWVkIGJ5IHRoZSBwYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBvbiBhbiBlbnRyeSBuYW1lZCBieSB0aGUgcGFyYW1ldGVyLCBmcm9tIHRoZSAicmVzb3VyY2VzIHBhdGgiIG9mIHRoZQotCSAqIGxvb3NlIGFyY2hpdmUgaWYgaXQgZXhpc3RzLCBPdGhlcndpc2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhlIHNhbWUgYXMKLQkgKiB7QGxpbmsgI2dldElucHV0U3RyZWFtKFN0cmluZyl9Ci0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKTsKLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBbiBhcmNoaXZlIHVzZXMgYSBjdXN0b20gY2xhc3MgbG9hZGVyIGZvciBqYXZhIHJlZmxlY3Rpb24gd2l0aGluIGEgbW9mIHJlc291cmNlU2V0OwotCSAqIGltcGxlbWVudGVycyBvZiBMb2FkU3RyYXRlZ3kgbWF5IHN1cHBseSBhIG1vZiByZXNvdXJjZVNldCBmb3Igd2hpY2ggdGhpcyBjbGFzcyBsb2FkZXIgaXMgbm90Ci0JICogbmVjZXNzYXJ5LCBvciBjb3VsZCBldmVuIGNhdXNlIGJyZWFrYWdlOyB0aGlzIHRlc3QgZ2l2ZXMgdGhlIHN0cmF0ZWd5IHRoZSBjaGFuY2UgdG8gIm9wdCBvdXQiCi0JICogb2YgdGhlIGNsYXNzIGxvYWRpbmcgZ2FtZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xhc3NMb2FkZXJOZWVkZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGFyY2hpdmUgaXMgcmVhZGluZyBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZlJlc291cmNlTG9hZGVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHJlc291cmNlcyBjYW4gYmUgcmVhZCBieSB0aGlzIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuKCk7Ci0KLQkvKioKLQkgKiBJcyB0aGUgcGFyYW1ldGVyIGluIHVzZSBieSB0aGlzIHN0cmF0ZWd5PyBOZWVkZWQgZm9yIHdoZW4gdGhlIGFyY2hpdmUgaXMgc2F2ZWQgdG8gdGhlIHNhbWUKLQkgKiBsb2NhdGlvbiBmcm9tIHdoaWNoIGl0IHdhcyByZWFkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZyhqYXZhLmlvLkZpbGUgYVN5c3RlbUZpbGUpOwotCi0JLyoqCi0JICogVXNlZCBmb3Igb3B0aW1pemF0aW9ucywgd2hlcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlIGhhdmUgbm90IGJlZW4gY2hhbmdlZDsgaW5zdGVhZCBvZgotCSAqIGl0ZXJhdGluZyBlYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUsIHdlIG1heSBiZSBhYmxlIHRvIGJ1bGsgc2F2ZSB0aGUgd2hvbGUgdGhpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0l0ZXJhdGlvbk9uU2F2ZSgpOwotCi0JcHVibGljIFJlc291cmNlIG1ha2VNb2ZSZXNvdXJjZShTdHJpbmcgdXJpLCBFTGlzdCBleHRlbnQpOwotCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBhQ29udGFpbmVyKTsKLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlU2V0KFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCk7Ci0KLQlwdWJsaWMgTG9vc2VBcmNoaXZlIGdldExvb3NlQXJjaGl2ZSgpOwotCi0JcHVibGljIHZvaWQgc2V0TG9vc2VBcmNoaXZlKExvb3NlQXJjaGl2ZSBhTG9vc2VBcmNoaXZlKTsKLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKTsKLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpOwotCi0JcHVibGljIGludCBnZXRSZW5kZXJlclR5cGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyVHlwZShpbnQgaSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0xvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0xvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhNzA3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqLwotCi0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0gKi8KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkay5KYXZhSkRLQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5RG9tUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlnUmVnaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0vKioKLSAqIEFic3RhY3QgaW1wbGVtZW50ZXIgb2ZmIHdoaWNoIGFuZCBsb2FkIHN0cmF0ZWd5IG1heSBzdWJjbGFzcwotICogCi0gKiBAc2VlIExvYWRTdHJhdGVneQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTG9hZFN0cmF0ZWd5IHsKLQotCS8qKiBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdW5kZXJseWluZyByZXNvdXJjZXMgaGF2ZSBiZWVuIGNsb3NlZCAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT3BlbiA9IHRydWU7Ci0KLQkvKiogVGhlIGFyY2hpdmUgb3IgZGlyZWN0b3J5IHRvIHdoaWNoIHRoaXMgc3RyYXRlZ3kgYmVsb25ncyAqLwotCXByb3RlY3RlZCBDb250YWluZXIgY29udGFpbmVyOwotCi0JLyoqIFJlc291cmNlU2V0IHVzZWQgZm9yIG1vZi94bWkgcmVzb3VyY2VzICovCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JcHJvdGVjdGVkIExvb3NlQXJjaGl2ZSBsb29zZUFyY2hpdmU7Ci0KLQlwcm90ZWN0ZWQgTWFwIGNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsKLQotCXByaXZhdGUgaW50IHJlbmRlcmVyVHlwZTsKLQotCXB1YmxpYyBMb2FkU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE9yUmVwbGFjZU1vZlJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlSZXNvdXJjZSBleGlzdGluZ1Jlc291cmNlID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShhUmVzb3VyY2UuZ2V0VVJJKCksIGZhbHNlKTsKLQkJaWYgKGV4aXN0aW5nUmVzb3VyY2UgIT0gbnVsbCkKLQkJCWdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGV4aXN0aW5nUmVzb3VyY2UpOwotCQlnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmFkZChhUmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1vZGlmaWNhdGlvblRyYWNraW5nKFJlc291cmNlIHJlcykgewotCQlib29sZWFuIHRyYWNraW5nTW9kcyA9IHJlcy5pc1RyYWNraW5nTW9kaWZpY2F0aW9uKCk7Ci0JCWJvb2xlYW4gaXNSZWFkT25seSA9IChjb250YWluZXIgIT0gbnVsbCkgPyAoKEFyY2hpdmUpIGNvbnRhaW5lcikuZ2V0T3B0aW9ucygpLmlzUmVhZE9ubHkoKSA6IGZhbHNlOwotCQlib29sZWFuIHNob3VsZFRyYWNrTW9kcyA9ICEoaXNSZWFkT25seSB8fCBBcmNoaXZlVXRpbC5pc0phdmFSZXNvdXJjZShyZXMpIHx8IEFyY2hpdmVVdGlsLmlzUmVnaXN0ZXJlZFVSSU1hcHBpbmcocmVzKSk7Ci0JCWlmIChzaG91bGRUcmFja01vZHMgJiYgIXRyYWNraW5nTW9kcykKLQkJCXJlcy5zZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgYmVpbmcgaGVsZCBieSB0aGlzIG9iamVjdCBhbmQgc2V0IHRoZSBzdGF0ZSB0byBjbG9zZWQuIFN1YmNsYXNzZXMKLQkgKiBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCXNldElzT3BlbihmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJpbUNvbnRhaW5zKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQHNlZSBMb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCWlmIChjb250YWluc1VzaW5nTG9vc2VBcmNoaXZlKHVyaSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHByaW1Db250YWlucyh1cmkpOwotCX0KLQotCS8qCi0JICogVHJ5IHRoZSByZXNvdXJjZXMgcGF0aCBmaXJzdDsgaWYgdGhhdCBmYWxzZSwgc2VlIGlmIHdlIGhhdmUgYSBjaGlsZCBsb29zZSBhcmNoaXZlIHdpdGggdGhlCi0JICogdXJpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNVc2luZ0xvb3NlQXJjaGl2ZShTdHJpbmcgdXJpKSB7Ci0JCWlmIChnZXRMb29zZUFyY2hpdmUoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUxvb3NlQXJjaGl2ZSBsb29zZSA9IGdldExvb3NlQXJjaGl2ZSgpOwotCQlpZiAobG9vc2UuZ2V0UmVzb3VyY2VzUGF0aCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShsb29zZS5nZXRSZXNvdXJjZXNQYXRoKCksIHVyaSk7Ci0JCWlmIChhRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBMb29zZUNvbmZpZ1JlZ2lzdGVyLnNpbmdsZXRvbigpLmZpbmRGaXJzdExvb3NlQ2hpbGQodXJpLCBsb29zZSkgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBjcmVhdGVGaWxlKFN0cmluZyB1cmkpIHsKLQkJRmlsZSBhRmlsZSA9IG51bGw7Ci0JCWlmIChpc0FyY2hpdmUodXJpKSkKLQkJCWFGaWxlID0gb3Blbk5lc3RlZEFyY2hpdmUodXJpKTsKLQkJaWYgKGFGaWxlID09IG51bGwpIHsKLQkJCWFGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVGaWxlKCk7Ci0JCQlhRmlsZS5zZXRVUkkodXJpKTsKLQkJCWFGaWxlLnNldE9yaWdpbmFsVVJJKHVyaSk7Ci0JCX0KLQkJYUZpbGUuc2V0TG9hZGluZ0NvbnRhaW5lcihnZXRDb250YWluZXIoKSk7Ci0JCXJldHVybiBhRmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQljbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFic29sdXRlX3BhdGhfdW5rbm93bl9FWENfIikpOyAvLyROT04tTkxTLTEkID0gIkFic29sdXRlIHBhdGggdW5rbm93biIKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvb3NlQXJjaGl2ZSgpID09IG51bGwgPyBnZXRBYnNvbHV0ZVBhdGgoKSA6IGdldExvb3NlQXJjaGl2ZSgpLmdldFJlc291cmNlc1BhdGgoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1HZXRSZXNvdXJjZXNQYXRoKCkgewotCQlyZXR1cm4gZ2V0TG9vc2VBcmNoaXZlKCkgPT0gbnVsbCA/IG51bGwgOiBnZXRMb29zZUFyY2hpdmUoKS5nZXRSZXNvdXJjZXNQYXRoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvb3NlQXJjaGl2ZSgpID09IG51bGwgPyBnZXRBYnNvbHV0ZVBhdGgoKSA6IGdldExvb3NlQXJjaGl2ZSgpLmdldEJpbmFyaWVzUGF0aCgpOwotCX0KLQotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgcHJpbUdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogU2hvdWxkIHdlIGl0ZXJhdGUgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBhcyBwYXJ0IG9mIHNhdmluZywgb3IgY2FuIHdlIHRyZWF0IHRoZSBhcmNoaXZlCi0JICogYXMgb25lIGJpZyBmaWxlIGR1cmluZyBzYXZlPyBUaGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5LCBpdGVyYXRpbmcgdGhlIGZpbGVzIGlmOiAxKSBJZiB0aGUKLQkgKiBhcmNoaXZlIGlzIGEgbW9kdWxlIGZpbGUgYW5kIGl0IGlzIE5PVCByZWFkLW9ubHkgMikgSWYgdGhlIGxvYWQgc3RyYXRlZ3kgaXMgYSBkaXJlY3RvcnkgMykgSWYKLQkgKiB0aGUgYXJjaGl2ZSBpcyBhIHV0aWxpdHkgSkFSLCBhbmQgdGhlIGZpbGVzIGxpc3QgaGFzIG5ldmVyIGJlZW4gaW5pdGlhbGl6ZWQsIG9yIGlmIHRoZQotCSAqIGxvYWRpbmcgY29udGFpbmVycyBmb3IgYWxsIHRoZSBmaWxlcyBhcmUgdGhlIHNhbWUgQU5EIG5vdCBkaXJlY3RvcmllcywgQU5EIHRoZQotCSAqIHtAbGluayBBcmNoaXZlT3B0aW9ucyNpc1NhdmVMaWJyYXJpZXNBc0ZpbGVzKCl9b2YgdGhlIGFyY2hpdmUgaXMgdHJ1ZS4KLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5I3JlcXVpcmVzSXRlcmF0aW9uT25TYXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0l0ZXJhdGlvbk9uU2F2ZSgpIHsKLQkJaWYgKCFnZXRDb250YWluZXIoKS5pc0FyY2hpdmUoKSB8fCBpc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gKEFyY2hpdmUpIGdldENvbnRhaW5lcigpOwotCQkvL1dlIHNob3VsZCBsZWF2ZSB1dGlsaXR5IEpBUnMgaW50YWN0LCB1bmxlc3Mgd2VyZSB0b2xkIG5vdCB0bwotCQkvL1RoZSBtYW5pZmVzdCBtYXkgaGF2ZSBiZWVuIHNpZ25lZAotCQlpZiAoYW5BcmNoaXZlLmlzTW9kdWxlRmlsZSgpKQotCQkJcmV0dXJuICFhbkFyY2hpdmUuZ2V0T3B0aW9ucygpLmlzUmVhZE9ubHkoKTsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmdldE9wdGlvbnMoKS5pc1NhdmVMaWJyYXJpZXNBc0ZpbGVzKCkgJiYgYW5BcmNoaXZlLmdldExvYWRpbmdDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlpZiAoYW5BcmNoaXZlLmlzSW5kZXhlZCgpKSB7Ci0JCQkJTGlzdCBmaWxlcyA9IGFuQXJjaGl2ZS5nZXRGaWxlcygpOwotCQkJCUZpbGUgYUZpbGUgPSBudWxsOwotCQkJCUNvbnRhaW5lciBmaXJzdENvbnRhaW5lciA9IG51bGw7Ci0JCQkJQ29udGFpbmVyIGxDb250YWluZXIgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJYUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQlmaXJzdENvbnRhaW5lciA9IGFGaWxlLmdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQkJCWlmIChmaXJzdENvbnRhaW5lci5nZXRMb2FkU3RyYXRlZ3koKS5pc0RpcmVjdG9yeSgpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCWxDb250YWluZXIgPSBhRmlsZS5nZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChsQ29udGFpbmVyICE9IGZpcnN0Q29udGFpbmVyKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVSZXNvdXJjZVNldCgpOwotCQkJcmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJCXVwZGF0ZU1vZGlmaWNhdGlvblRyYWNraW5nKChSZXNvdXJjZSkgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJdXBkYXRlTW9kaWZpY2F0aW9uVHJhY2tpbmcoKFJlc291cmNlKSBsaXN0LmdldChpKSk7Ci0JCQkJfQotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHk7IGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwKLQkgKi8KLQlwdWJsaWMgRmlsZUl0ZXJhdG9yIGdldEZpbGVJdGVyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRmlsZUl0ZXJhdG9ySW1wbChnZXRDb250YWluZXIoKS5nZXRGaWxlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3QgZ2V0RmlsZXMoKTsKLQotCXB1YmxpYyBMaXN0IGNvbGxlY3RGaWxlcygpIHsKLQkJLy9UaGUgbG9vc2UgYXJjaGl2ZXMgbmVlZCB0byBiZSByZWFkIGZpcnN0Ci0JCWNvbGxlY3RGaWxlc0Zyb21Mb29zZUFyY2hpdmVzKCk7Ci0JCUxpc3QgZmlsZXMgPSBnZXRGaWxlcygpOwotCQlmaWxlcy5hZGRBbGwoY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMudmFsdWVzKCkpOwotCQljb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcyA9IG51bGw7Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0RmlsZXNGcm9tTG9vc2VBcmNoaXZlcygpIHsKLQkJaWYgKCFjYW5IYXZlTG9vc2VDaGlsZHJlbigpIHx8IGdldExvb3NlQXJjaGl2ZSgpID09IG51bGwpIHsKLQkJCWNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IGNoaWxkcmVuID0gTG9vc2VDb25maWdSZWdpc3Rlci5zaW5nbGV0b24oKS5nZXRMb29zZUNoaWxkcmVuKGdldExvb3NlQXJjaGl2ZSgpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlMb29zZUFyY2hpdmUgbG9vc2UgPSAoTG9vc2VBcmNoaXZlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlTdHJpbmcgdXJpID0gbG9vc2UuZ2V0VXJpKCk7Ci0JCQlpZiAoIWNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzLmNvbnRhaW5zS2V5KHVyaSkpIHsKLQkJCQlBcmNoaXZlIGFyY2hpdmUgPSBvcGVuTmVzdGVkQXJjaGl2ZShsb29zZSk7Ci0JCQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJCQljb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcy5wdXQodXJpLCBhcmNoaXZlKTsKLQkJCQkJYXJjaGl2ZS5zZXRMb2FkaW5nQ29udGFpbmVyKGdldENvbnRhaW5lcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSSh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZSByZXR1cm5zIGFuIGltbXV0YWJsZSBjb2xsZWN0aW9uIG9mIHRoZSBsb2FkZWQKLQkgKiAgICAgIHJlc291cmNlcyBpbiB0aGUgcmVzb3VyY2Ugc2V0Ci0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCkgewotCQlDb2xsZWN0aW9uIHJlc291cmNlcyA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmIChyZXNvdXJjZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KHJlc291cmNlcy5zaXplKCkpOwotCQlJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZXMuaXNMb2FkZWQoKSkKLQkJCQlyZXN1bHQuYWRkKHJlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpLCB0cnVlKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiB3cmFwRXgpIHsKLQkJCWlmICgoRXh0ZW5kZWRFY29yZVV0aWwuZ2V0RmlsZU5vdEZvdW5kRGV0ZWN0b3IoKS5pc0ZpbGVOb3RGb3VuZCh3cmFwRXgpKSkgewotCQkJCUZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmaWxlTm90Rm91bmRFeCA9IEV4dGVuZGVkRWNvcmVVdGlsLmdldElubmVyRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHdyYXBFeCk7Ci0JCQkJdGhyb3cgZmlsZU5vdEZvdW5kRXg7Ci0JCQl9Ci0JCQl0aHJvd1Jlc291cmNlTG9hZEV4Y2VwdGlvbih1cmksIHdyYXBFeCk7Ci0JCQlyZXR1cm4gbnVsbDsgLy9uZXZlciBoYXBwZW5zIC0gY29tcGlsZXIgZXhwZWN0cyBpdCB0aG91Z2gKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZXNvdXJjZVNldCgpIHsKLQkJLy9Ob3QgdGhlIGJlc3QgZGVzaWduIGhlcmUsIGJlY2F1c2UgYSBsb2FkIHN0cmF0ZWd5IHNob3VsZCBvbmx5IGtub3cKLQkJLy8gYWJvdXQKLQkJLy9jb250YWluZXI7IGhvd2V2ZXIsIHRoaXMgbWV0aG9kIHdpbGwgb25seSBnZXQgY2FsbGVkIHdoZW4gdGhlCi0JCS8vIGNvbnRhaW5lcgotCQkvL2lzIGFuIGFyY2hpdmUKLQkJQXJjaGl2ZSBhcmNoaXZlID0gKEFyY2hpdmUpIGdldENvbnRhaW5lcigpOwotCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsKGFyY2hpdmUsIHByaW1HZXRSZXNvdXJjZXNQYXRoKCkpOwotCQlSZXNvdXJjZVNldCBycyA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSByZWcgPSBjcmVhdGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQlycy5zZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShyZWcpOwotCQlzZXRSZXNvdXJjZVNldChycyk7Ci0JCXJzLnNldFVSSUNvbnZlcnRlcihjb252ZXJ0ZXIpOwotCQlpZiAoYXJjaGl2ZS5zaG91bGRVc2VKYXZhUmVmbGVjdGlvbigpKSB7Ci0JCQlycy5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBKYXZhSkRLQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlhcmNoaXZlLmluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkgY3JlYXRlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCWlmIChpc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gbmV3IEoyRUVSZXNvdWNlRmFjdG9yeVNheFJlZ2lzdHJ5KCk7Ci0KLQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7Ci0JCXN3aXRjaCAoZ2V0UmVuZGVyZXJUeXBlKCkpIHsKLQkJCWNhc2UgQXJjaGl2ZU9wdGlvbnMuU0FYIDoKLQkJCQlyZWdpc3RyeSA9IG5ldyBKMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBcmNoaXZlT3B0aW9ucy5ET00gOgotCQkJCXJlZ2lzdHJ5ID0gbmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBcmNoaXZlT3B0aW9ucy5ERUZBVUxUIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJlZ2lzdHJ5ID0gbmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRSZW5kZXJlclR5cGUoKSB7Ci0JCXJldHVybiByZW5kZXJlclR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcmNoaXZlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuICgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLmlzTmVzdGVkQXJjaGl2ZSh1cmkpOwotCX0KLQotCS8qKgotCSAqIEFuIGFyY2hpdmUgdXNlcyBhIGN1c3RvbSBjbGFzcyBsb2FkZXIgZm9yIGphdmEgcmVmbGVjdGlvbiB3aXRoaW4gYSBtb2YgcmVzb3VyY2VTZXQ7Ci0JICogaW1wbGVtZW50ZXJzIG9mIExvYWRTdHJhdGVneSBtYXkgc3VwcGx5IGEgbW9mIHJlc291cmNlU2V0IGZvciB3aGljaCB0aGlzIGNsYXNzIGxvYWRlciBpcyBub3QKLQkgKiBuZWNlc3NhcnksIG9yIGNvdWxkIGV2ZW4gY2F1c2UgYnJlYWthZ2U7IHRoaXMgdGVzdCBnaXZlcyB0aGUgc3RyYXRlZ3kgdGhlIGNoYW5jZSB0byAib3B0IG91dCIKLQkgKiBvZiB0aGUgY2xhc3MgbG9hZGluZyBnYW1lCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzc0xvYWRlck5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneSBUaGUgZGVmYXVsdCBpcyBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneSNnZXRFeGlzdGluZ01vZlJlc291cmNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9mUmVzb3VyY2VMb2FkZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gcmVzICE9IG51bGwgJiYgcmVzLmlzTG9hZGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewotCQlyZXR1cm4gaXNPcGVuOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kgcmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQ7IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0JICogICAgICBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzaW5nKGphdmEuaW8uRmlsZSBhU3lzdGVtRmlsZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIG1ha2VNb2ZSZXNvdXJjZShTdHJpbmcgdXJpLCBFTGlzdCBleHRlbnQpIHsKLQkJUmVzb3VyY2UgZXhpc3RpbmcgPSBnZXRFeGlzdGluZ01vZlJlc291cmNlKHVyaSk7Ci0JCWlmIChleGlzdGluZyAhPSBudWxsKQotCQkJcmV0dXJuIGV4aXN0aW5nOwotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSkpOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKFN0cmluZyB1cmkpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuICgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLm9wZW5OZXN0ZWRBcmNoaXZlKHVyaSk7Ci0JCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCS8vQ2F1Z2h0IGFuIGV4Y2VwdGlvbiB0cnlpbmcgdG8gb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuICgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLm9wZW5OZXN0ZWRBcmNoaXZlKGxvb3NlKTsKLQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJLy9DYXVnaHQgYW4gZXhjZXB0aW9uIHRyeWluZyB0byBvcGVuIHRoZSBuZXN0ZWQgYXJjaGl2ZQotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgbmV3Q29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IG5ld0NvbnRhaW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVNldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQgbmV3UmVzb3VyY2VTZXQpIHsKLQkJLy8gZml4ZXMgcHJvYmxlbSBpbiByZW9wZW4KLQkJaWYgKHJlc291cmNlU2V0ICE9IG5ld1Jlc291cmNlU2V0KSB7Ci0KLQkJCS8vIHJlbW92ZSBhZGFwdGVyIGZyb20gb2xkIHJlc291cmNlIHNldAotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpCi0JCQkJcmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCi0JCQkvLyBhZGQgYXMgYWRhcHRlciB0byBuZXcgcmVzb3VyY2Ugc2V0IGlmIG5lY2Vzc2FyeQotCQkJaWYgKG5ld1Jlc291cmNlU2V0ICE9IG51bGwgJiYgIW5ld1Jlc291cmNlU2V0LmVBZGFwdGVycygpLmNvbnRhaW5zKHRoaXMpKQotCQkJCW5ld1Jlc291cmNlU2V0LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQotCQkJcmVzb3VyY2VTZXQgPSBuZXdSZXNvdXJjZVNldDsKLQkJfSAvLyBubyBuZWVkIHRvIHVwZGF0ZSBpZiBvbGQgc2V0IGVxdWFscyBuZXcgc2V0IChieSByZWZlcmVuY2UpCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SXNPcGVuKGJvb2xlYW4gbmV3SXNPcGVuKSB7Ci0JCWlzT3BlbiA9IG5ld0lzT3BlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd1Jlc291cmNlTG9hZEV4Y2VwdGlvbihTdHJpbmcgcmVzb3VyY2VVcmksIEV4Y2VwdGlvbiBleCkgdGhyb3dzIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBSZXNvdXJjZUxvYWRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImxvYWRfcmVzb3VyY2VfRVhDXyIsIChuZXcgT2JqZWN0W117cmVzb3VyY2VVcmksIGdldENvbnRhaW5lcigpLmdldFVSSSgpfSkpLCBleCk7IC8vJE5PTi1OTFMtMSQgPSAiQ291bGQgbm90IGxvYWQgcmVzb3VyY2UgInswfSIgaW4gYXJjaGl2ZSAiezF9IiIKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb29zZUFyY2hpdmUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTG9vc2VBcmNoaXZlCi0JICovCi0JcHVibGljIExvb3NlQXJjaGl2ZSBnZXRMb29zZUFyY2hpdmUoKSB7Ci0JCXJldHVybiBsb29zZUFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9vc2VBcmNoaXZlLgotCSAqIAotCSAqIEBwYXJhbSBsb29zZUFyY2hpdmUKLQkgKiAgICAgICAgICAgIFRoZSBsb29zZUFyY2hpdmUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TG9vc2VBcmNoaXZlKExvb3NlQXJjaGl2ZSBsb29zZUFyY2hpdmUpIHsKLQkJdGhpcy5sb29zZUFyY2hpdmUgPSBsb29zZUFyY2hpdmU7Ci0JCWNoZWNrTG9vc2VQYXRoc1ZhbGlkKCk7Ci0JfQotCi0JLyoKLQkgKiBBZGRlZCB0byBzdXBwb3J0IFdBUyBydW50aW1lOyB0aHJvdyBhbiBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiBpZiBvbmUgb2YgdGhlIHBhdGhzIGluIHRoZQotCSAqIGxvb3NlIGNvbmZpZyBkb2VzIG5vdCBwb2ludCB0byBhbiBleGlzdGluZyBmaWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tMb29zZVBhdGhzVmFsaWQoKSB7Ci0JCWlmIChsb29zZUFyY2hpdmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcGF0aCA9IGxvb3NlQXJjaGl2ZS5nZXRCaW5hcmllc1BhdGgoKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJamF2YS5pby5GaWxlIGlvRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7Ci0JCQlpZiAoIWlvRmlsZS5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgYmluYXJpZXMgcGF0aDogIiArIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcGF0aCA9IGxvb3NlQXJjaGl2ZS5nZXRSZXNvdXJjZXNQYXRoKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWphdmEuaW8uRmlsZSBpb0ZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpOwotCQkJaWYgKCFpb0ZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHJlc291cmNlcyBwYXRoOiAiICsgcGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkhhdmVMb29zZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gY29udGFpbmVyLmlzRUFSRmlsZSgpIHx8IGNvbnRhaW5lci5pc1dBUkZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQl0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlbmRlcmVyVHlwZQotCSAqICAgICAgICAgICAgVGhlIHJlbmRlcmVyVHlwZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVuZGVyZXJUeXBlKGludCByZW5kZXJlclR5cGUpIHsKLQkJdGhpcy5yZW5kZXJlclR5cGUgPSByZW5kZXJlclR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L05lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMjExZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uTmVzdGVkSmFyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yOwotCi0KLS8qKgotICogTG9hZCBzdHJhdGVneSB1c2VkIGFzIGEgbGFzdCByZXNvcnQgdG8gcmVhZCBlbnRyaWVzIGZyb20gamFycyBpbnNpZGUgb2YgamFycy4gSXQgaXMgYSBsYXN0IHJlc29ydAotICogYmVjYXVzZSBvZiB0aGUgcG9vciBwZXJmb21hbmNlIGludm9sdmVkLCBhcyB0aGUgY29udGVudHMgb2YgdGhlIHppcCBlbnRyaWVzIGFyZSBub3QgY2FjaGVkLCBhbmQKLSAqIHNlcXVlbnRpYWwgc2NhbiBzZWFyY2hlcyB3aWxsIGNhdXNlIHRoZSB6aXAgc3RyZWFtIHRvIGJlIGluZmxhdGVkIG9uIGVhY2ggc2VhcmNoLiBXaGVuZXZlcgotICogcG9zc2libGUsCi0gKiAKLSAqIEBsaW5rIHtUZW1wRmlsZUxvYWRTdHJhdGVneX0gc2hvdWxkIGJlIHVzZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIExvYWRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIEluZGV4IHRvIGltcHJvdmUgbG9va3VwIHBlcmZvcm1hbmNlIC0gbm90IHVzZWQgaWYgaW4gUnVudGltZSB0byByZWR1Y2UgZm9vdHByaW50Ci0JICovCi0JcHJvdGVjdGVkIE1hcCB1cmlzVG9Qb3NpdGlvbnM7Ci0JcHJvdGVjdGVkIExvYWRTdHJhdGVneSBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBOZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbChMb2FkU3RyYXRlZ3kgcGFyZW50U3RyYXRlZ3kpIHsKLQkJc3VwZXIoKTsKLQkJc2V0UGFyZW50KHBhcmVudFN0cmF0ZWd5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEluZGV4KCkgewotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdHJ5IHsKLQkJCVppcElucHV0U3RyZWFtIHppcyA9IGdldFppcElucHV0U3RyZWFtKCk7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCQlsb25nIHBvc2l0aW9uID0gMDsKLQkJCXdoaWxlICgoZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLQkJCQlwb3NpdGlvbisrOwotCQkJCW1hcC5wdXQoZW50cnkuZ2V0TmFtZSgpLCBuZXcgTG9uZyhwb3NpdGlvbikpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93TmVzdGVkSmFyRXhjZXB0aW9uKGlveCk7Ci0JCX0KLQkJc2V0VXJpc1RvUG9zaXRpb25zKG1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCWlmICh1c2luZ0luZGV4KCkpCi0JCQlyZXR1cm4gY29udGFpbnNVc2luZ0luZGV4KHVyaSk7Ci0JCXJldHVybiBjb250YWluc1NlcXVlbnRpYWxseSh1cmkpOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTZXF1ZW50aWFsbHkoU3RyaW5nIHVyaSkgewotCQlaaXBJbnB1dFN0cmVhbSB6aXMgPSBudWxsOwotCQl0cnkgewotCQkJemlzID0gZ2V0WmlwSW5wdXRTdHJlYW1Ta2lwcGVkVG8odXJpKTsKLQkJCXJldHVybiB6aXMgIT0gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh6aXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXppcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNVc2luZ0luZGV4KFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldFVyaXNUb1Bvc2l0aW9ucygpLmNvbnRhaW5zS2V5KHVyaSk7Ci0JfQotCi0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHk7IGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwKLQkgKi8KLQlwdWJsaWMgRmlsZUl0ZXJhdG9yIGdldEZpbGVJdGVyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICgoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5nZXRPcHRpb25zKCkuaXNSZWFkT25seSgpKQotCQkJcmV0dXJuIG5ldyBOZXN0ZWRBcmNoaXZlSXRlcmF0b3IoZ2V0Q29udGFpbmVyKCkuZ2V0RmlsZXMoKSwgZ2V0WmlwSW5wdXRTdHJlYW0oKSk7Ci0JCXJldHVybiBzdXBlci5nZXRGaWxlSXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KDUwMCk7Ci0JCVppcElucHV0U3RyZWFtIHppcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXMgPSBnZXRaaXBJbnB1dFN0cmVhbSgpOwotCQkJWmlwRW50cnkgZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCk7Ci0JCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCWlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlGaWxlIGFGaWxlID0gY3JlYXRlRmlsZShlbnRyeS5nZXROYW1lKCkpOwotCQkJCQlhRmlsZS5zZXRTaXplKGVudHJ5LmdldFNpemUoKSk7Ci0JCQkJCWFGaWxlLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOwotCQkJCQlsaXN0LmFkZChhRmlsZSk7Ci0JCQkJfQotCQkJCWVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93TmVzdGVkSmFyRXhjZXB0aW9uKGlveCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoemlzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl6aXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKHVzaW5nSW5kZXgoKSkKLQkJCXJldHVybiBnZXRJbnB1dFN0cmVhbVVzaW5nSW5kZXgodXJpKTsKLQkJcmV0dXJuIGdldElucHV0U3RyZWFtU2VxdWVudGlhbGx5KHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW1TZXF1ZW50aWFsbHkoU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShnZXRaaXBJbnB1dFN0cmVhbVNraXBwZWRUbyh1cmkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbVVzaW5nSW5kZXgoU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlMb25nIHBvc2l0aW9uID0gKExvbmcpIGdldFVyaXNUb1Bvc2l0aW9ucygpLmdldCh1cmkpOwotCQlpZiAocG9zaXRpb24gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gZ2V0WmlwSW5wdXRTdHJlYW0oKTsKLQkJbG9uZyBwb3MgPSBwb3NpdGlvbi5sb25nVmFsdWUoKTsKLQkJZm9yIChsb25nIGkgPSAwOyBpIDwgcG9zOyBpKyspIHsKLQkJCXppcy5nZXROZXh0RW50cnkoKTsKLQkJfQotCQlyZXR1cm4gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSh6aXMpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA3LzAwIDY6MTI6MzYgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA3LzAwIDQ6Mzg6MjEgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTWFwCi0JICovCi0JcHVibGljIGphdmEudXRpbC5NYXAgZ2V0VXJpc1RvUG9zaXRpb25zKCkgewotCQlpZiAodXNpbmdJbmRleCgpICYmIHVyaXNUb1Bvc2l0aW9ucyA9PSBudWxsKQotCQkJYnVpbGRJbmRleCgpOwotCQlyZXR1cm4gdXJpc1RvUG9zaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBaaXBJbnB1dFN0cmVhbSBnZXRaaXBJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVyaSA9IGdldENvbnRhaW5lcigpLmdldFVSSSgpOwotCQlJbnB1dFN0cmVhbSBpbiA9IGdldFBhcmVudCgpLmdldElucHV0U3RyZWFtKHVyaSk7Ci0JCXJldHVybiBuZXcgWmlwSW5wdXRTdHJlYW0oaW4pOwotCX0KLQotCXByb3RlY3RlZCBaaXBJbnB1dFN0cmVhbSBnZXRaaXBJbnB1dFN0cmVhbVNraXBwZWRUbyhTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTnVsbF91cmlfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJOdWxsIHVyaSIKLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gbnVsbDsKLQkJWmlwRW50cnkgZW50cnkgPSBudWxsOwotCQl0cnkgewotCQkJemlzID0gZ2V0WmlwSW5wdXRTdHJlYW0oKTsKLQkJCWVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpOwotCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlpZiAodXJpLmVxdWFscyhlbnRyeS5nZXROYW1lKCkpKQotCQkJCQlyZXR1cm4gemlzOwotCQkJCWVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gZW50cnkgd2FzIG5vdCBmb3VuZCBzbyBjbG9zZSB0aGUgc3RyZWFtCi0JCQlpZiAoZW50cnkgPT0gbnVsbCAmJiB6aXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXppcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDcvMDAgNjoxMjozNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UGFyZW50Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgbmV3UGFyZW50KSB7Ci0JCXBhcmVudCA9IG5ld1BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNy8wMCA0OjM4OjIxIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdVcmlzVG9Qb3NpdGlvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmlzVG9Qb3NpdGlvbnMoamF2YS51dGlsLk1hcCBuZXdVcmlzVG9Qb3NpdGlvbnMpIHsKLQkJdXJpc1RvUG9zaXRpb25zID0gbmV3VXJpc1RvUG9zaXRpb25zOwotCX0KLQotCS8qKgotCSAqIEFuIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IHJlYWRpbmcgdGhlIG5lc3RlZCBqYXI7IHRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGhyb3dOZXN0ZWRKYXJFeGNlcHRpb24oRXhjZXB0aW9uIGNhdWdodEV4Y2VwdGlvbikgewotCQl0aHJvdyBuZXcgTmVzdGVkSmFyRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJuZXN0ZWRfamFyX0VYQ18iLCAobmV3IE9iamVjdFtde2dldENvbnRhaW5lcigpLmdldFVSSSgpLCBnZXRQYXJlbnQoKS5nZXRDb250YWluZXIoKS5nZXRVUkkoKX0pKSwgY2F1Z2h0RXhjZXB0aW9uKTsvLyROT04tTkxTLTEkID0gIkFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgezB9IGZyb20gezF9IgotCX0KLQotCS8qKgotCSAqIERvbid0IHVzZSB0aGUgaW5kZXggaW4gdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQ7IHJlZHVjZSBmb290cHJpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1c2luZ0luZGV4KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vcmV0dXJuICFjb20uaWJtLmV0b29scy5hcmNoaXZlLnV0aWwuQXJjaGl2ZVV0aWwuaXNSdW50aW1lKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L051bGxMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OdWxsTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWY2MWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L051bGxMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBOby1vcCBpbXBsZW1lbnRlciB1c2VkIGZvciBuZXcgYXJjaGl2ZSBpbnN0YW5jZXMsIHdoaWNoIGhhdmUgdGhlaXIgY29udGVudHMgYWRkZWQgYW5kIGNvcGllZCBmcm9tCi0gKiBvdGhlciBzb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIExvYWRTdHJhdGVneUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBlbXB0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JLyoqCi0JICogTnVsbExvYWRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOdWxsTG9hZFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUNvbnRhaW5zKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoKSB7Ci0JCXJldHVybiBlbXB0eUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTc3ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gZXhwb3J0IG1ldGEtZGF0YSBmb3IgYSBKMkMgUmVzb3VyY2UgQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgUmFyRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgRXhwb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBSYXJFeHBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSYXJFeHBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SYXJJbXBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjMzVmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SYXJJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBpbXBvcnQgbWV0YS1kYXRhIGZvciBhIEoyQyBSZXNvdXJjZSBBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXJJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKLQkJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCQlyZXR1cm4gYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCQlyZXR1cm4gbmV3IFJhckltcG9ydFN0cmF0ZWd5SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUkFSX0ZpbGUiKSwgSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKTsgLy8kTk9OLU5MUy0xJCA9ICJSQVIgRmlsZSIKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVSQVJGaWxlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERpc2NyaW1pbmF0b3IgZGlzY3JpbWluYXRvcjsKLQotCS8qKgotCSAqIFJhckltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJhckltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvcigpLmNyZWF0ZUltcG9ydFN0cmF0ZWd5KG9sZCwgbmV3QXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3IgPT0gbnVsbCkgewotCQkJZGlzY3JpbWluYXRvciA9IG5ldyBEaXNjcmltaW5hdG9yKCk7Ci0JCQkvLyBDb25uZWN0b3JzIHVzZSB0aGVpciBvd24gc3BlY2lhbCBlbnRpdHkgcmVzb2x2ZXIgZm9yIG5vdy4uLgotCQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NZU1RFTUlEXzFfMCwgImNvbm5lY3Rvcl8xXzAuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQlwdWJsaWMgUkFSRmlsZSBnZXRSQVJGaWxlKCkgewotCQlyZXR1cm4gKFJBUkZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IG51bGw7Ci0KLQkJY29ubmVjdG9yID0gKENvbm5lY3RvcikgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlnZXRSQVJGaWxlKCkuc2V0RGVwbG95bWVudERlc2NyaXB0b3IoY29ubmVjdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjA4ZWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLQotcHVibGljIGNsYXNzIFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIERpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwgewotCXByb3RlY3RlZCBqYXZhLmlvLkZpbGUgc3ViZGlyZWN0b3J5OwotCi0JLyoqCi0JICogUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsKFN0cmluZyBhRGlyZWN0b3J5VXJpKSB7Ci0JCXN1cGVyKGFEaXJlY3RvcnlVcmkpOwotCX0KLQotCS8qKgotCSAqIFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbChTdHJpbmcgcm9vdERpcmVjdG9yeVVyaSwgamF2YS5pby5GaWxlIHN1YmRpcikgewotCQlzdXBlcihyb290RGlyZWN0b3J5VXJpKTsKLQkJc2V0U3ViZGlyZWN0b3J5KHN1YmRpcik7Ci0JfQotCi0JLyoqCi0JICogYWRkRGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpcmVjdG9yeShqYXZhLmlvLkZpbGUgYUZpbGUsIGphdmEudXRpbC5MaXN0IGFMaXN0KSB7Ci0JCVJlYWRPbmx5RGlyZWN0b3J5IGRpciA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnkoKTsKLQkJZGlyLnNldExhc3RNb2RpZmllZChhRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCWRpci5zZXRVUkkoZ2V0VVJJRnJvbShhRmlsZSkpOwotCQlkaXIuc2V0TG9hZGluZ0NvbnRhaW5lcihnZXRDb250YWluZXIoKSk7Ci0JCWRpci5zZXRMb2FkU3RyYXRlZ3kobmV3IFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbChnZXREaXJlY3RvcnlVcmkoKSwgYUZpbGUpKTsKLQkJYUxpc3QuYWRkKGRpcik7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gc3VwZXIuY29udGFpbnModXJpKSAmJiAoZ2V0U3ViZGlyZWN0b3J5KCkgPT0gbnVsbCB8fCBzdWJkaXJlY3RvcnlDb250YWlucyh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJamF2YS5pby5GaWxlIHN1YmRpciA9IGdldFN1YmRpcmVjdG9yeSgpOwotCQlpZiAoc3ViZGlyID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gc3ViZGlyLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIGdldERpcmVjdG9yeUZvckxpc3QgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIGphdmEuaW8uRmlsZSBnZXREaXJlY3RvcnlGb3JMaXN0KCkgewotCQlpZiAoZ2V0U3ViZGlyZWN0b3J5KCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTdWJkaXJlY3RvcnkoKTsKLQkJcmV0dXJuIG5ldyBqYXZhLmlvLkZpbGUoZ2V0RGlyZWN0b3J5VXJpKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAxLzA4LzAxIDE6MTA6NDcgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmlvLkZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5pby5GaWxlIGdldFN1YmRpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHN1YmRpcmVjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBBbHdheXMgcmV0dXJuIGZhbHNlLCBiZWNhdXNlIHdlIHdhbnQgdG8gdHJlYXQgdGhlIGVudHJpZXMgaW4gYSBmaWxlIHN5c3RlbSBkaXJlY3RvcnkgYXMgYmFzaWMKLQkgKiBmaWxlcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQXJjaGl2ZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMS8wOC8wMSAxOjEwOjQ3IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTdWJkaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIGphdmEuaW8uRmlsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN1YmRpcmVjdG9yeShqYXZhLmlvLkZpbGUgbmV3U3ViZGlyZWN0b3J5KSB7Ci0JCXN1YmRpcmVjdG9yeSA9IG5ld1N1YmRpcmVjdG9yeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdWJkaXJlY3RvcnlDb250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCWlmIChnZXRTdWJkaXJlY3RvcnkoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGdldEZpbGVOYW1lRnJvbSh1cmkpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJd2hpbGUgKGFGaWxlICE9IG51bGwgJiYgIWNvbnRhaW5zKSB7Ci0JCQlpZiAoZ2V0U3ViZGlyZWN0b3J5KCkuZXF1YWxzKGFGaWxlKSkgewotCQkJCWNvbnRhaW5zID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYUZpbGUgPSBhRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5zOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1NhdmVTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmNlMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyOwotCi0KLS8qKgotICogS25vd3MgaG93IHRvIGV4cG9ydCB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBmaWxlLiBUaGlzIHByb3ZpZGVzIGEgZGVsZWdhdGlvbiBtb2RlbCBzYXZpbmcgdGhlCi0gKiBhcmNoaXZlLiBFeGFtcGxlcyBtaWdodCBpbmNsdWRlIGV4cG9ydGluZyB0byBhIHppcCBvdXRwdXQgc3RyZWFtLCB0byB0aGUgZmlsZSBzeXN0ZW0sIG9yIGludG8gYQotICogd29ya2JlbmNoLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNhdmVTdHJhdGVneSBleHRlbmRzIEFyY2hpdmVTdHJhdGVneSB7Ci0JLyoqCi0JICogQ2xvc2UgYW5kIHJlbGVhc2UgYW55IHJlc291cmNlcyBiZWluZyBoZWxkIGJ5IHRoaXMgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5vdGlmeSByZXNvdXJjZXMgaWYgbmVjZXNzYXJ5IHRoYXQgc2F2ZSBpcyBjb21wbGV0ZSBmb3IgdGhpcyBhcmNoaXZlLCBiZWluZyBjYXJlZnVsIG5vdCB0bwotCSAqIGNsb3NlIGFueSByZXNvdXJjZXMgdGhhdCBhIHBhcmVudCBhcmNoaXZlIG1pZ2h0IHN0aWxsIGJlIHVzaW5nCi0JICovCi0JcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgU2F2ZUZpbHRlciBnZXRGaWx0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGFyY2hpdmUgaXMgc2F2aW5nIGZpbGVzIHRvIGEgZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCk7Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmUoQXJjaGl2ZU1hbmlmZXN0IGFNYW5pZmVzdCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmUoRmlsZSBhRmlsZSwgRmlsZUl0ZXJhdG9yIGl0ZXJhdG9yKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgc2F2ZShGaWxlIGFGaWxlLCBqYXZhLmlvLklucHV0U3RyZWFtIGluKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgc2F2ZU1vZlJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihTYXZlRmlsdGVyIGFGaWx0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTU0OWM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1NhdmVTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKLQotCi0vKioKLSAqIEFic3RyYWN0IGltcGxlbWVudGVyIG9mZiB3aGljaCBhbnkgc2F2ZSBzdHJhdGVneSBjYW4gc3ViY2xhc3MKLSAqIAotICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgQXJjaGl2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIFNhdmVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIFNhdmVGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogU2F2ZVN0cmF0ZWd5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTYXZlU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcgLSBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZyAtIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjgvMDEgNDoxMToyOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZUZpbHRlcgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpCi0JCQlmaWx0ZXIgPSBuZXcgU2F2ZUZpbHRlckltcGwoKTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvYWRlZFJlc291cmNlT3JNYW5pZmVzdChGaWxlIGFGaWxlKSB7Ci0JCXJldHVybiBnZXRBcmNoaXZlKCkuaXNNb2ZSZXNvdXJjZUxvYWRlZChhRmlsZS5nZXRVUkkoKSkgfHwgYUZpbGUuZ2V0VVJJKCkuZXF1YWxzKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQotCQlzYXZlTWFuaWZlc3QoKTsKLQkJc2F2ZU1vZlJlc291cmNlcygpOwotCQlzYXZlRmlsZXMoKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlTYXZlU3RyYXRlZ3kgc3RyYXQgPSBudWxsOwotCQl0cnkgewotCQkJc3RyYXQgPSBjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koYW5BcmNoaXZlKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihhbkFyY2hpdmUuZ2V0VVJJKCksIGlveCk7Ci0JCX0KLQkJYW5BcmNoaXZlLnNhdmUoc3RyYXQpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoRmlsZSBhRmlsZSwgRmlsZUl0ZXJhdG9yIGl0ZXJhdG9yKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkgJiYgc2hvdWxkSXRlcmF0ZU92ZXIoKEFyY2hpdmUpIGFGaWxlKSkKLQkJCXNhdmUoKEFyY2hpdmUpIGFGaWxlKTsKLQkJZWxzZSB7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQlpZiAoIWFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWluID0gaXRlcmF0b3IuZ2V0SW5wdXRTdHJlYW0oYUZpbGUpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihhRmlsZS5nZXRVUkkoKSwgZXgpOwotCQkJCX0KLQkJCX0KLQkJCXNhdmUoYUZpbGUsIGluKTsKLQkJfQotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmUoRmlsZSBhRmlsZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCB2b2lkIHNhdmVGaWxlcygpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlGaWxlSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRBcmNoaXZlKCkuZ2V0RmlsZXNGb3JTYXZlKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJRmlsZSBhRmlsZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoc2hvdWxkU2F2ZShhRmlsZSkpCi0JCQkJCXNhdmUoYUZpbGUsIGl0ZXJhdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX29jY3VycmVkX2l0ZXJhdGluZ19mX0VYQ18iKSwgaW94KTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvciBvY2N1cnJlZCBpdGVyYXRpbmcgZmlsZXMiCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTWFuaWZlc3QoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAoIXNob3VsZFNhdmUoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKQotCQkJcmV0dXJuOwotCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBnZXRBcmNoaXZlKCkuZ2V0TWFuaWZlc3QoKTsKLQkJaWYgKG1mLmdldE1hbmlmZXN0VmVyc2lvbigpID09IG51bGwgfHwgbWYuZ2V0TWFuaWZlc3RWZXJzaW9uKCkuZXF1YWxzKCIiKSkvLyROT04tTkxTLTEkCi0JCQltZi5zZXRNYW5pZmVzdFZlcnNpb24oIjEuMCIpOy8vJE5PTi1OTFMtMSQKLQkJc2F2ZShtZik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNb2ZSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAoIXNob3VsZFNhdmUoYVJlc291cmNlKSkKLQkJCXJldHVybjsKLQkJc2V0RW5jb2RpbmcoYVJlc291cmNlKTsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gd2FzTW9kaWZpZWQgPSBhUmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCQkJT3V0cHV0U3RyZWFtIG9zID0gZ2V0T3V0cHV0U3RyZWFtRm9yUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJCXNhdmVNb2ZSZXNvdXJjZShhUmVzb3VyY2UsIG9zKTsKLQkJCWFSZXNvdXJjZS5zZXRNb2RpZmllZCh3YXNNb2RpZmllZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYVJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2ZSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UgYVJlc291cmNlLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWFSZXNvdXJjZS5zYXZlKG9zLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2ZSZXNvdXJjZXMoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldEFyY2hpdmUoKS5nZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotCQkvL1dlIGhhdmUgdG8gZ28gdGhyb3VnaCB0aGlzIHByb2Nlc3MgYmVjYXVzZSBqYXZhIHJlc291cmNlcyBjb3VsZCBnZXQgYWRkZWQgZHVyaW5nIHRoZQotCQkvL3Byb2Nlc3Mgb2YgaXRlcmF0aW5nIGFuZCBzYXZpbmcsIGFuZCBhZGRpbmcgdG8gYSBjb2xsZWN0aW9uIHdoaWxlIGl0ZXJhdGluZyBjYXVzZXMgYQotCQkvLyBmYWlsdXJlCi0JCUxpc3QgeG1pUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvL1dlIHdpbGwgc2F2ZSB0aGUgeG1pIHJlc291cmNlcyBmaXJzdCwgdGhlbiB0aGUgeG1sIHJlc291cmNlcy4gVGhpcyB3YXkgdGhlCi0JCS8vYW55IG5lY2Vzc2FyeSBpZCdzIGZvciByZWZlcmVuY2VkIG9iamVjdHMgd2lsbCBoYXZlIGJlZW4gZ2VuZXJhdGVkIHByaW9yIHRvIHNhdmUKLQkJTGlzdCB4bWxSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJLy8JCVdlIGRvbid0IHdhbnQgdG8gc2F2ZSB0aGUgamF2YSByZWZsZWN0aW9uIHJlc291cmNlcyBvciB1cmkgbWFwcGVkIHJlc291cmNlcwotCQkJaWYgKCFBcmNoaXZlVXRpbC5pc0phdmFSZXNvdXJjZShyZXMpICYmICFBcmNoaXZlVXRpbC5pc1JlZ2lzdGVyZWRVUklNYXBwaW5nKHJlcykgJiYgIUFyY2hpdmVVdGlsLmlzUGxhdGZvcm1NZXRhUmVzb3VyY2UocmVzKSkgewotCQkJCVJldmlzaXQucmV2aXNpdCgpOwotCQkJCS8vRm9yIG5vdywgYWx3YXlzIHVzZSB0aGUgbW9mNSBmb3JtYXQKLQkJCQlpZiAocmVzIGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKQotCQkJCQkoKENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkgcmVzKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJCQlpZiAocmVzIGluc3RhbmNlb2YgVHJhbnNsYXRvclJlc291cmNlKQotCQkJCQl4bWxSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXhtaVJlc291cmNlcy5hZGQocmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYmFzaWNTYXZlTW9mUmVzb3VyY2VzKHhtaVJlc291cmNlcyk7Ci0JCWJhc2ljU2F2ZU1vZlJlc291cmNlcyh4bWxSZXNvdXJjZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2F2ZU1vZlJlc291cmNlcyhMaXN0IHJlc291cmNlcykgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCXNhdmVNb2ZSZXNvdXJjZShyZXMpOwotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmNvZGluZyhSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UpCi0JCQkoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UpIGFSZXNvdXJjZSkuc2V0RW5jb2RpbmcoYXJjaGl2ZS5nZXRYbWxFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yOC8wMSA0OjExOjI4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdGaWx0ZXIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZUZpbHRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXIgbmV3RmlsdGVyKSB7Ci0JCWZpbHRlciA9IG5ld0ZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGUgbmVzdGVkIGFyY2hpdmUgbmVlZHMgdG8gYmUgc2F2ZWQgb25lIGZpbGUgYXQgYSB0aW1lLCBvciBpZiB3ZSBjYW4gYnVsawotCSAqIHNhdmUgaXQgZnJvbSB0aGUgb3JpZ2luYWwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJdGVyYXRlT3ZlcihBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gYW5BcmNoaXZlLmdldExvYWRTdHJhdGVneSgpLnJlcXVpcmVzSXRlcmF0aW9uT25TYXZlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShGaWxlIGFGaWxlKSB7Ci0JCWJvb2xlYW4gbG9hZGVkID0gaXNMb2FkZWRSZXNvdXJjZU9yTWFuaWZlc3QoYUZpbGUpOwotCQlpZiAobG9hZGVkKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBhcmNoaXZlLmdldExvYWRTdHJhdGVneSgpLmdldEV4aXN0aW5nTW9mUmVzb3VyY2UoYUZpbGUuZ2V0VVJJKCkpOwotCQkJaWYgKHJlcyA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vbXVzdCBiZSBtYW5pZmVzdAotCQkJcmV0dXJuICFzaG91bGRTYXZlKHJlcyk7Ci0JCX0KLQotCQlpZiAoZ2V0QXJjaGl2ZSgpLmlzTW9kdWxlRmlsZSgpKSB7Ci0JCQlNb2R1bGVGaWxlIG0gPSAoTW9kdWxlRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCQkJaWYgKG0uZ2V0RXhwb3J0U3RyYXRlZ3koKSAhPSBudWxsICYmIG0uZ2V0RXhwb3J0U3RyYXRlZ3koKS5oYXNTYXZlZChhRmlsZS5nZXRVUkkoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzaG91bGRTYXZlKGFGaWxlLmdldFVSSSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKFJlc291cmNlIHJlcykgewotCQlpZiAoIXJlcy5pc01vZGlmaWVkKCkgJiYgZ2V0QXJjaGl2ZSgpLmdldE9wdGlvbnMoKS5zYXZlT25seURpcnR5TW9mUmVzb3VyY2VzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHNob3VsZFNhdmUocmVzLmdldFVSSSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgb25lIG1ldGhvZCB0aHJvdWdoIHdoaWNoIGFsbCBlbGVtZW50cyBvZiBhbiBhcmNoaXZlIChmaWxlLCBuZXN0ZWQgYXJjaGl2ZSwgbW9mCi0JICogcmVzb3VyY2UsIG9yIG1hbmlmZXN0KSB3aWxsIGJlIHRlc3RlZCBiZWZvcmUgc2F2aW5nLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBkbyBzb21ldGhpbmcKLQkgKiBtb3JlIHNwZWNpZmljCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBnZXRGaWx0ZXIoKS5zaG91bGRTYXZlKHVyaSwgZ2V0QXJjaGl2ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9UZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1RlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE4NWQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1RlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLQotCi0vKioKLSAqIFVzZWQgYXMgYW4gb3B0aW1pemF0aW9uIGZvciByZWFkaW5nIGphcnMgd2l0aGluIGphcnMuIFJlYWRpbmcgZnJvbSBhIFppcEZpbGUgaXMgbXVjaCBmYXN0ZXIgdGhhbgotICogZnJvbSBhIFppcElucHV0U3RyZWFtLCB0aGVyZWZvcmUsIHdoZW4gcG9zc2libGUsIGl0IG1ha2VzIHNlbnNlIHRvIGNvcHkgdGhlIG5lc3RlZCBqYXIgdG8gYSB0ZW1wCi0gKiBmaWxlLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBlbnN1cmUgdGhhdCB0aGUgdGVtcCBmaWxlIGdldHMgZGVsZXRlZCBvbiBub3JtYWwKLSAqIHN5c3RlbSBleGl0LCB1c2luZyB0aGUgaGVscGVyIG1ldGhvZCBvbiBqYXZhLmlvLkZpbGUuIFRoaXMgc3RyYXRlZ3kgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgZmlsZQotICogd2hlbiBjbG9zZWQgb3IgZmluYWxpemVkLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgWmlwRmlsZUxvYWRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIFRlbXBvcmFyeVppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZW1wb3JhcnlaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBqYXZhLmlvLkZpbGUKLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBUZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwoamF2YS5pby5GaWxlIGZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JCWdldEZpbGUoKS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQWJzb2x1dGVfcGF0aF91bmtub3duX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQgPSAiQWJzb2x1dGUgcGF0aCB1bmtub3duIgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9XYXIyMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTIwZWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gZXhwb3J0IG1ldGEtZGF0YSBmb3IgYSAyLjIgV2ViIGFwcAotICovCi1wdWJsaWMgY2xhc3MgV2FyMjJFeHBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBFeHBvcnRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIFdhcjIyRXhwb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV2FyMjJFeHBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvV2FyMjJJbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTQ4NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvV2FyMjJJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBpbXBvcnQgbWV0YS1kYXRhIGZvciBhIDIuMiBXZWIgYXBwCi0gKi8KLXB1YmxpYyBjbGFzcyBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIFhtbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGlzY3JpbWluYXRvciBleHRlbmRzIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgewotCQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJCXJldHVybiBhbkFyY2hpdmUuY29udGFpbnNGaWxlKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJCXJldHVybiBuZXcgV2FyMjJJbXBvcnRTdHJhdGVneUltcGwoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5hYmxlVG9PcGVuTWVzc2FnZSgpIHsKLQkJCXJldHVybiBnZXRYbWxERE1lc3NhZ2UoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldBUl9GaWxlIiksIEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSk7IC8vJE5PTi1OTFMtMSQgPSAiV0FSIEZpbGUiCi0JCX0KLQotCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlV0FSRmlsZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3I7Ci0KLQkvKioKLQkgKiBXYXIyMkltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBnZXREaXNjcmltaW5hdG9yKCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3kob2xkLCBuZXdBcmNoaXZlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlpZiAoZGlzY3JpbWluYXRvciA9PSBudWxsKSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQlwdWJsaWMgV0FSRmlsZSBnZXRXQVJGaWxlKCkgewotCQlyZXR1cm4gKFdBUkZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlXZWJBcHAgd2ViYXBwID0gbnVsbDsKLQkJd2ViYXBwID0gKFdlYkFwcCkgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCWdldFdBUkZpbGUoKS5zZXREZXBsb3ltZW50RGVzY3JpcHRvcih3ZWJhcHApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1htbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9YbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZiZmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1htbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLQotCi0vKioKLSAqIEFic3RyYWN0IGltcGxlbWVudGVyIGZvciBhcmNoaXZlcyB0aGF0IHVzZSB4bWwgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBJbXBvcnRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIFhtbEJhc2VkSW1wb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZSgpIHsKLQkJcmV0dXJuIChNb2R1bGVGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVPYmplY3QgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLQkJcmVzb3VyY2UgPSBnZXRNb2R1bGVGaWxlKCkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlFT2JqZWN0IHJvb3QgPSBudWxsOwotCi0JCXJvb3QgPSBBcmNoaXZlVXRpbC5nZXRSb290KHJlc291cmNlKTsKLQotCQlyZXR1cm4gcm9vdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwM2RiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLQotCi0vKioKLSAqIEltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIHJlYWQgZmlsZXMgZnJvbSBhIHppcC9qYXIgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KLSAqIAotICogQHNlZSBMb2FkU3RyYXRlZ3kKLSAqLwotCi1wdWJsaWMgY2xhc3MgWmlwRmlsZUxvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBMb2FkU3RyYXRlZ3lJbXBsIHsKLQlwcm90ZWN0ZWQgamF2YS5pby5GaWxlIGZpbGU7Ci0JcHJvdGVjdGVkIFppcEZpbGUgemlwRmlsZTsKLQotCS8qKgotCSAqIFppcEZpbGVMb2FkU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWmlwRmlsZUxvYWRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogWmlwRmlsZUxvYWRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbChqYXZhLmlvLkZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJc2V0RmlsZShmaWxlKTsKLQkJc2V0WmlwRmlsZShuZXcgWmlwRmlsZShmaWxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JCXRyeSB7Ci0JCQlnZXRaaXBGaWxlKCkuY2xvc2UoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUNvbnRhaW5zKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBnZXRaaXBGaWxlKCkuZ2V0RW50cnkodXJpKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzIwLzAwIDQ6NDA6MTQgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmlvLkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5GaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRW51bWVyYXRpb24gZW50cmllcyA9IGdldFppcEZpbGUoKS5lbnRyaWVzKCk7Ci0JCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpICYmICFjb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcy5jb250YWluc0tleShlbnRyeS5nZXROYW1lKCkpKSB7Ci0JCQkJRmlsZSBhRmlsZSA9IGNyZWF0ZUZpbGUoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCQlhRmlsZS5zZXRTaXplKGVudHJ5LmdldFNpemUoKSk7Ci0JCQkJYUZpbGUuc2V0TGFzdE1vZGlmaWVkKGVudHJ5LmdldFRpbWUoKSk7Ci0JCQkJbGlzdC5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJWmlwRW50cnkgZW50cnkgPSBnZXRaaXBGaWxlKCkuZ2V0RW50cnkodXJpKTsKLQkJCWlmIChlbnRyeSA9PSBudWxsKQotCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKLQotCQkJcmV0dXJuIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oZ2V0WmlwRmlsZSgpLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB6aXBDbG9zZWQpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih6aXBDbG9zZWQudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8wMS8wMCAxMToyODoxMiBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC56aXAuWmlwRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuemlwLlppcEZpbGUgZ2V0WmlwRmlsZSgpIHsKLQkJcmV0dXJuIHppcEZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmcoamF2YS5pby5GaWxlIGFTeXN0ZW1GaWxlKSB7Ci0JCXJldHVybiBnZXRGaWxlKCkgIT0gbnVsbCAmJiBnZXRGaWxlKCkuZXF1YWxzKGFTeXN0ZW1GaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8yMC8wMCA0OjQwOjE0IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdGaWxlCi0JICogICAgICAgICAgICBqYXZhLmlvLkZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlKGphdmEuaW8uRmlsZSBuZXdGaWxlKSB7Ci0JCWZpbGUgPSBuZXdGaWxlOwotCX0KLQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMDEvMDAgMTE6Mjg6MTIgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld1ppcEZpbGUKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFppcEZpbGUoamF2YS51dGlsLnppcC5aaXBGaWxlIG5ld1ppcEZpbGUpIHsKLQkJemlwRmlsZSA9IG5ld1ppcEZpbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDVjODc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXZpc2l0OwotCi0KLS8qKgotICogVGhpcyBpcyBhIGNvbmNyZXRlIGltcGxlbnRhdGlvbiBvZiBTYXZlU3RyYXRlZ3kuIEFsbCB0aGUgY29udGVudHMgb2YgdGhlIGFyY2hpdmUsIGluY2x1ZGluZyB4bWkKLSAqIHJlc291cmNlcywgd2lsbCBiZSBvdXRwdXQgdG8gYSBaaXBPdXRwdXRTdHJlYW0uIFRoZSBvdXRwdXQgc3RyZWFtIHNob3VsZCBiZSBwYXNzZWQgaW4gYnkgdGhlCi0gKiBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBaaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgU2F2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIFNhdmVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvblN0cmVhbTsKLQkvKiogVXNlZCBpbnRlcm5hbGx5ICovCi0JcHJvdGVjdGVkIFppcE91dHB1dFN0cmVhbSB6aXBPdXRwdXRTdHJlYW07Ci0KLQkvKioKLQkgKiBXcmFwcyBhIG5ldyB6aXAgb3V0cHV0IHN0cmVhbSBhcm91bmQgdGhlIHBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBaaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsKE91dHB1dFN0cmVhbSBvdXQpIHsKLQkJc2V0RGVzdGluYXRpb25TdHJlYW0ob3V0KTsKLQkJc2V0WmlwT3V0cHV0U3RyZWFtKG5ldyBaaXBPdXRwdXRTdHJlYW0ob3V0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlnZXREZXN0aW5hdGlvblN0cmVhbSgpLmNsb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIG5ldyBaaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsKGdldFppcE91dHB1dFN0cmVhbSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5maW5pc2goKTsKLQkJLy9JZiB0aGlzIGlzIG5vdCBuZXN0ZWQsIGNsb3NlIHRoZSBzdHJlYW0gdG8gZnJlZSB1cCB0aGUgcmVzb3VyY2UKLQkJLy9vdGhlcndpc2UsIGRvbid0IGNsb3NlIGl0IGJlY2F1c2UgdGhlIHBhcmVudCBtYXkgbm90IGJlIGRvbmUKLQkJaWYgKCEoZ2V0RGVzdGluYXRpb25TdHJlYW0oKSBpbnN0YW5jZW9mIFppcE91dHB1dFN0cmVhbSkpCi0JCQlnZXREZXN0aW5hdGlvblN0cmVhbSgpLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmlvLk91dHB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXREZXN0aW5hdGlvblN0cmVhbSgpIHsKLQkJcmV0dXJuIGRlc3RpbmF0aW9uU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtRm9yUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRaaXBPdXRwdXRTdHJlYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5I3NhdmVNb2ZSZXNvdXJjZShSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9mUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXZpc2l0LnJldmlzaXQoKTsKLQkJVVJJIHVyaSA9IGFSZXNvdXJjZS5nZXRVUkkoKTsKLQkJLy9FbnN1cmUgY29udGFpbmVyIHJlbGF0aXZlIFVSSQotCQlVUklDb252ZXJ0ZXIgY29udiA9IGdldEFyY2hpdmUoKS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQlpZiAoY29udiBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIpCi0JCQl1cmkgPSAoKENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIpIGNvbnYpLmRlTm9ybWFsaXplKHVyaSk7Ci0JCVppcEVudHJ5IGVudHJ5ID0gbmV3IFppcEVudHJ5KHVyaS50b1N0cmluZygpKTsKLQkJemlwT3V0cHV0U3RyZWFtLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCXN1cGVyLnNhdmVNb2ZSZXNvdXJjZShhUmVzb3VyY2UsIG91dCk7Ci0JCXppcE91dHB1dFN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbQotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbSBnZXRaaXBPdXRwdXRTdHJlYW0oKSB7Ci0JCXJldHVybiB6aXBPdXRwdXRTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QgYU1hbmlmZXN0KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJCWFNYW5pZmVzdC53cml0ZShnZXRaaXBPdXRwdXRTdHJlYW0oKSk7Ci0JCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5jbG9zZUVudHJ5KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJLCBpb3gpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gbmV3IFppcEVudHJ5KGFuQXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5wdXROZXh0RW50cnkoZW50cnkpOwotCQkJc3VwZXIuc2F2ZShhbkFyY2hpdmUpOwotCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuY2xvc2VFbnRyeSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihhbkFyY2hpdmUuZ2V0VVJJKCksIGlveCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEZpbGUgYUZpbGUsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJU3RyaW5nIGVudHJ5TmFtZSA9IGFGaWxlLmdldFVSSSgpOwotCQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSAmJiAhZW50cnlOYW1lLmVuZHNXaXRoKCIvIikpLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5TmFtZSA9IGVudHJ5TmFtZSArICcvJzsKLQkJCVppcEVudHJ5IGVudHJ5ID0gbmV3IFppcEVudHJ5KGVudHJ5TmFtZSk7Ci0JCQlpZiAoYUZpbGUuZ2V0TGFzdE1vZGlmaWVkKCkgPiAwKQotCQkJCWVudHJ5LnNldFRpbWUoYUZpbGUuZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJCWlmICghYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpKSB7Ci0JCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5jb3B5KGluLCBnZXRaaXBPdXRwdXRTdHJlYW0oKSk7Ci0JCQl9Ci0JCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5jbG9zZUVudHJ5KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKGFGaWxlLmdldFVSSSgpLCBpb3gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0Rlc3RpbmF0aW9uU3RyZWFtCi0JICogICAgICAgICAgICBqYXZhLmlvLk91dHB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uU3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtIG5ld0Rlc3RpbmF0aW9uU3RyZWFtKSB7Ci0JCWRlc3RpbmF0aW9uU3RyZWFtID0gbmV3RGVzdGluYXRpb25TdHJlYW07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ppcE91dHB1dFN0cmVhbQotCSAqICAgICAgICAgICAgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRaaXBPdXRwdXRTdHJlYW0oamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0gbmV3WmlwT3V0cHV0U3RyZWFtKSB7Ci0JCXppcE91dHB1dFN0cmVhbSA9IG5ld1ppcE91dHB1dFN0cmVhbTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmE3NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVSdW50aW1lRXhjZXB0aW9uOwotCi0KLS8qKgotICogQ2xhc3MgbG9hZGVyIHdoaWNoIGxvYWRzIGEgZ2l2ZW4gc2V0IG9mIGNsYXNzZXMgc3RvcmVkIGluIGJ5dGUgYXJyYXlzLiAoQXNzdW1wdGlvbjogU3lzdGVtCi0gKiBjbGFzc2VzIGFuZCB0aG9zZSBpbiB0aGUgc2V0IGFyZSB0aGUgb25seSBjbGFzc2VzIG5lZWRlZCB0byByZXNvbHZlIGVhY2ggb25lKQotICovCi0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKLQlwcm90ZWN0ZWQgQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZXh0cmFDbGFzc0xvYWRlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbkVBUkZpbGU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QUk9UT0NPTCA9ICJhcmNoaXZlIjsKLQlwcml2YXRlIEFyY2hpdmVVUkxTdHJlYW1IYW5kbGVyIGhhbmRsZXI7Ci0KLQlwdWJsaWMgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIoQXJjaGl2ZSBhbkFyY2hpdmUsIENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsKSB7Ci0JCXN1cGVyKHBhcmVudENsKTsKLQkJc2V0QXJjaGl2ZShhbkFyY2hpdmUpOwotCQlzZXRFeHRyYUNsYXNzTG9hZGVyKGV4dHJhQ2wpOwotCQlpbkVBUkZpbGUgPSBhbkFyY2hpdmUuZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCAmJiBhbkFyY2hpdmUuZ2V0Q29udGFpbmVyKCkuaXNFQVJGaWxlKCk7Ci0JCWhhbmRsZXIgPSBuZXcgQXJjaGl2ZVVSTFN0cmVhbUhhbmRsZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhIHNwZWNpZmllZCBjbGFzcy4gVGhpcyBnZXRzIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIGhhcyBoYWQgaXQncwotCSAqIGNoYW5jZSwgYmFzZWQgb24gdGhlIEphdmEyIGRlbGVnYXRpb24gbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0KLQkJQ2xhc3MgcmVzdWx0OwotCQkvLyBMb2FkIGNsYXNzIGJ5dGVzIGZyb20gY3VycmVudCBzZXQgb2YgY2xhc3MgYnl0ZVtdJ3MKLQkJYnl0ZVtdIGJ5dGVzID0gZ2V0Q2xhc3NCeXRlc0ZvcihuYW1lKTsKLQotCQlpZiAoYnl0ZXMgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZGVmaW5lQ2xhc3MobmFtZSwgYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLQkJCX0gLy8gZW5kaWYKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotCQl9IC8vIGVuZGlmCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMDAgOTo1OTo1NyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXByaXZhdGUgYnl0ZVtdIGdldERhdGEoRmlsZSBmaWxlKSB7Ci0JCWlmIChudWxsICE9IGZpbGUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEFyY2hpdmVVdGlsLmlucHV0U3RyZWFtVG9CeXRlcyhmaWxlLmdldElucHV0U3RyZWFtKCkpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImlvX2V4X2xvYWRpbmdfRVhDXyIsIChuZXcgT2JqZWN0W117ZmlsZS5nZXROYW1lKCl9KSksIGUpOyAvLyROT04tTkxTLTEkID0gIkFuIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nICIJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRDbGFzc0J5dGVzRm9yKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIENoYW5nZSB0aGUgY2xhc3MgbmFtZSB0byBhIGphciBlbnRyeSBuYW1lCi0JCVN0cmluZyBqYXJFbnRyeU5hbWUgPSBBcmNoaXZlVXRpbC5jbGFzc05hbWVUb1VyaShjbGFzc05hbWUpOwotCQlyZXR1cm4gZ2V0RGF0YShnZXRGaWxlKGphckVudHJ5TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBFQVJGaWxlIGdldEVBUkZpbGUoKSB7Ci0JCXJldHVybiAoRUFSRmlsZSkgZ2V0QXJjaGl2ZSgpLmdldENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzIxLzAwIDY6NTg6MDUgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldEV4dHJhQ2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBleHRyYUNsYXNzTG9hZGVyOwotCX0KLQotCS8qKgotCSAqIFVzZWQgZm9yIGR5bmFtaWMgY2xhc3MgbG9hZGluZyBpbiBkZXBlbmRlbnQgamFycyBpbiBlYXJzOyB0aGUgc2V0IGlzIHVzZWQgdG8gdGVybWluYXRlIGEKLQkgKiBjeWNsZSBpZiBvbmUgZXhpc3RzOyB0aGUgY3ljbGUgaXMgaW52YWxpZCwgYnV0IHlvdSBuZXZlciBrbm93IHdoYXQgcGVvcGxlIG1pZ2h0IHRyeS4uLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lLCBTZXQgdmlzaXRlZEFyY2hpdmVzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICh2aXNpdGVkQXJjaGl2ZXMuY29udGFpbnMoZ2V0QXJjaGl2ZSgpKSkKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotCQl2aXNpdGVkQXJjaGl2ZXMuYWRkKGdldEFyY2hpdmUoKSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIubG9hZENsYXNzKG5hbWUsIGZhbHNlKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGxvYWRDbGFzc0luRGVwZW5kZW50SmFySW5FQVIobmFtZSwgdmlzaXRlZEFyY2hpdmVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lLCBib29sZWFuIHJlc29sdmUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5sb2FkQ2xhc3MobmFtZSwgcmVzb2x2ZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzIGMgPSBsb2FkQ2xhc3NJbkRlcGVuZGVudEphcihuYW1lKTsKLQkJCWlmIChjICE9IG51bGwgJiYgcmVzb2x2ZSkKLQkJCQlyZXNvbHZlQ2xhc3MoYyk7Ci0JCQlyZXR1cm4gYzsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3NJbkRlcGVuZGVudEphcihTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCi0JCWlmIChpbkVBUkZpbGUpIHsKLQkJCXJldHVybiBsb2FkQ2xhc3NJbkRlcGVuZGVudEphckluRUFSKG5hbWUpOwotCQl9IGVsc2UgaWYgKGdldEV4dHJhQ2xhc3NMb2FkZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RXh0cmFDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhuYW1lKTsKLQkJfQotCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzSW5EZXBlbmRlbnRKYXJJbkVBUihTdHJpbmcgbmFtZSwgU2V0IHZpc2l0ZWRBcmNoaXZlcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqID0gZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIHZpc2l0ZWRBcmNoaXZlcywgQ0xBU1NfVFlQRSk7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0JCX0KLQkJcmV0dXJuIChDbGFzcykgb2JqOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3NJbkRlcGVuZGVudEphckluRUFSKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXNvdXJjZUluRGVwZW5kZW50SmFySW5FQVIobmFtZSwgQ0xBU1NfVFlQRSk7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0JCX0KLQkJcmV0dXJuIChDbGFzcykgb2JqOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGdldEZpbGVGcm9tRGVwZW5kZW50SmFyKFN0cmluZyBuYW1lKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXNvdXJjZUluRGVwZW5kZW50SmFySW5FQVIobmFtZSwgRklMRV9UWVBFKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKEZpbGUpIG9iajsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDTEFTU19UWVBFID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEUgPSAxOwotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRSZXNvdXJjZUluRGVwZW5kZW50SmFySW5FQVIoU3RyaW5nIG5hbWUsIGludCB0eXBlKSB7Ci0JCVNldCB2aXNpdGVkQXJjaGl2ZXMgPSBuZXcgSGFzaFNldCg1KTsKLQkJdmlzaXRlZEFyY2hpdmVzLmFkZChnZXRBcmNoaXZlKCkpOwotCQlyZXR1cm4gZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIHZpc2l0ZWRBcmNoaXZlcywgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRSZXNvdXJjZUluRGVwZW5kZW50SmFySW5FQVIoU3RyaW5nIG5hbWUsIFNldCB2aXNpdGVkQXJjaGl2ZXMsIGludCB0eXBlKSB7Ci0JCVN0cmluZ1tdIGNsYXNzcGF0aCA9IGFyY2hpdmUuZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHVyaSA9IEFyY2hpdmVVdGlsLmRlcml2ZUVBUlJlbGF0aXZlVVJJKGNsYXNzcGF0aFtpXSwgYXJjaGl2ZSk7Ci0JCQkJaWYgKHVyaSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlGaWxlIGphckZpbGUgPSBnZXRFQVJGaWxlKCkuZ2V0RmlsZSh1cmkpOwotCQkJCWlmIChqYXJGaWxlLmlzQXJjaGl2ZSgpKSB7Ci0JCQkJCUFyY2hpdmUgZGVwID0gKEFyY2hpdmUpIGphckZpbGU7Ci0JCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCQkJY2FzZSBDTEFTU19UWVBFIDoKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZXR1cm4gKChBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlcikgZGVwLmdldEFyY2hpdmVDbGFzc0xvYWRlcigpKS5sb2FkQ2xhc3MobmFtZSwgdmlzaXRlZEFyY2hpdmVzKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIG5vRGljZSkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQljYXNlIEZJTEVfVFlQRSA6Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcmV0dXJuIGRlcC5nZXRGaWxlKG5hbWUpOwotCQkJCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBub0RpY2UpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZGVwSmFyTm90SW5FQVIpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8wMCA5OjU5OjU3IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdBcmNoaXZlCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlhcmNoaXZlID0gbmV3QXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yMS8wMCA2OjU4OjA1IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHRyYUNsYXNzTG9hZGVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRyYUNsYXNzTG9hZGVyKGphdmEubGFuZy5DbGFzc0xvYWRlciBuZXdFeHRyYUNsYXNzTG9hZGVyKSB7Ci0JCWV4dHJhQ2xhc3NMb2FkZXIgPSBuZXdFeHRyYUNsYXNzTG9hZGVyOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRGaWxlKG5hbWUpOwotCQkJaWYgKG51bGwgIT0gZmlsZSkgewotCQkJCXJldHVybiBmaWxlLmdldElucHV0U3RyZWFtKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiaW9fZXhfbG9hZGluZ19FWENfIiwgKG5ldyBPYmplY3RbXXtuYW1lfSkpLCBlKTsgLy8kTk9OLU5MUy0xJCA9ICJBbiBJTyBleGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZUZyb21BcmNoaXZlKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZSgpLmdldEZpbGUobmFtZSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCXByb3RlY3RlZCBGaWxlIGdldEZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJRmlsZSBmaWxlID0gZ2V0RmlsZUZyb21BcmNoaXZlKG5hbWUpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlmaWxlID0gZ2V0RmlsZUZyb21EZXBlbmRlbnRKYXIobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGdldEZpbGUobmFtZSkgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IFVSTChudWxsLCBVUkxfUFJPVE9DT0wgKyAiOi8vIiArIG5hbWUsIGhhbmRsZXIpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgY2xhc3MgQXJjaGl2ZVVSTFN0cmVhbUhhbmRsZXIgZXh0ZW5kcyBVUkxTdHJlYW1IYW5kbGVyIHsKLQkJcHVibGljIEFyY2hpdmVVUkxTdHJlYW1IYW5kbGVyKCkgewotCQl9Ci0KLQkJcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXJldHVybiBuZXcgQXJjaGl2ZVVSTENvbm5lY3Rpb24odXJsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgQXJjaGl2ZVVSTENvbm5lY3Rpb24gZXh0ZW5kcyBVUkxDb25uZWN0aW9uIHsKLQkJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VOYW1lOwotCi0JCXByb3RlY3RlZCBBcmNoaXZlVVJMQ29ubmVjdGlvbihVUkwgdXJsKSB7Ci0JCQlzdXBlcih1cmwpOwotCQkJcmVzb3VyY2VOYW1lID0gdXJsLnRvU3RyaW5nKCkuc3Vic3RyaW5nKFVSTF9QUk9UT0NPTC5sZW5ndGgoKSArIDMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJcmV0dXJuIGdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjU5ZThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJTWFwcGluZ1JlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5HZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLlhtbERvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIGhvbGQgaGVscGVyIG1ldGhvZHMgY29tbW9uIHRvIG11bHRpcGxlIGNsYXNzZXMgaW4gdGhlIGFyY2hpdmUgc3VwcG9ydAotICogcGFja2FnZXMKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfQ0xBU1MgPSAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0pBVkEgPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfU1FMSiA9ICIuc3FsaiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfSlNQID0gIi5qc3AiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNSdW50aW1lID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHRlbXAgZGlyZWN0b3J5IHNob3VsZCBiZSB1c2VkIGZvciBleHRyYWN0aW5nIG5lc3RlZCBqYXJzIGZvcgotCSAqIHJlYWQ7IGRlZmF1bHRzIHRvIHRydWUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkVXNlVGVtcERpcmVjdG9yeUZvclJlYWQgPSB0cnVlOwotCi0JLyoqCi0JICogU2V0dGFibGUgbmFtZSBmb3IgdGhlIHRlbXAgZGlyZWN0b3J5OyBtdXN0IHJlc29sdmUgdG8gYSB2YWxpZCBmaWxlIG9uIHRoZSBmaWxlIHN5c3RlbTsgaWYgbm90Ci0JICogc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB0aGUgc3lzdGVtIHRlbXAgZGlyZWN0b3J5Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdGVtcERpcmVjdG9yeU5hbWU7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGphdmEuaW8uRmlsZSB0ZW1wRGlyZWN0b3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lVG9KYXZhVXJpKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKS5jb25jYXQoRE9UX0pBVkEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZVRvVXJpKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKS5jb25jYXQoRE9UX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgYSBnaXZlbiB1cmkgb2YgYSAuY2xhc3MgZmlsZSwgZGVyaXZlIHRoZSB1cmkgb2YgdGhlIC5qYXZhIGZpbGU7IHRha2VzIGludG8gY29uc2lkZXJhdGlvbgotCSAqIGlubmVyIGNsYXNzZXMgYnkgc3BsaXR0aW5nIG9uIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICckJwotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGEgdXJpIG9yIG51bGwgaWYgdGhlIGlucHV0IGlzIG51bGwgb3IgZG9lc24ndCBlbmQgd2l0aCAiLmNsYXNzIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzVXJpVG9KYXZhVXJpKFN0cmluZyBjbGFzc1VyaSkgewotCQlpZiAoY2xhc3NVcmkgPT0gbnVsbCB8fCAhY2xhc3NVcmkuZW5kc1dpdGgoRE9UX0NMQVNTKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB0cnVuY2F0ZWQgPSB0cnVuY2F0ZUlnbm9yZUNhc2UoY2xhc3NVcmksIERPVF9DTEFTUyk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRydW5jYXRlZCwgIiQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdG9rLm5leHRUb2tlbigpLmNvbmNhdChET1RfSkFWQSk7Ci0JfQotCi0JLyoqCi0JICogQ29uY2F0ZW5hdGVzIHRoZSB0d28gc3RyaW5ncyB3aXRoIGEgc2VwYXJhdG9yLCBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jYXRVcmkoU3RyaW5nIGRpcmVjdG9yeW5hbWUsIFN0cmluZyBmaWxlbmFtZSwgY2hhciBzZXBhcmF0b3IpIHsKLQkJU3RyaW5nIHVyaSA9IGRpcmVjdG9yeW5hbWU7Ci0JCWlmICghZGlyZWN0b3J5bmFtZS5lbmRzV2l0aChzZXBhcmF0b3IgKyAiIikgJiYgIWZpbGVuYW1lLnN0YXJ0c1dpdGgoc2VwYXJhdG9yICsgIiIpKSAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJdXJpID0gdXJpICsgc2VwYXJhdG9yOwotCQlyZXR1cm4gdXJpICsgZmlsZW5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtIHVwIHVudGlsIHRoZSBmaXJzdCBlbmQgb2YgZmlsZQotCSAqIGNoYXJhY3RlciwgYW5kIGNsb3NlIHRoZSB0d28gc3RyZWFtcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0JCXRyeSB7Ci0JCQlpbnQgbiA9IGluLnJlYWQoYnVmZmVyKTsKLQkJCXdoaWxlIChuID4gMCkgewotCQkJCW91dC53cml0ZShidWZmZXIsIDAsIG4pOwotCQkJCW4gPSBpbi5yZWFkKGJ1ZmZlcik7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoIShpbiBpbnN0YW5jZW9mIFppcElucHV0U3RyZWFtKSkKLQkJCQlpbi5jbG9zZSgpOwotCQkJaWYgKCEob3V0IGluc3RhbmNlb2YgWmlwT3V0cHV0U3RyZWFtKSkKLQkJCQlvdXQuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KFN0cmluZyBiYXNlTmFtZSwgRmlsZSBwYXJlbnREaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJRmlsZSB0ZW1wRmlsZSA9IGNyZWF0ZVRlbXBGaWxlKGJhc2VOYW1lLCBwYXJlbnREaXJlY3RvcnkpOwotCQl0ZW1wRmlsZS5kZWxldGUoKTsKLQkJdGVtcEZpbGUubWtkaXIoKTsKLQkJcmV0dXJuIHRlbXBGaWxlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcgYmFzZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZW1wRmlsZShiYXNlTmFtZSwgZ2V0VGVtcERpcmVjdG9yeSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIGJhc2VOYW1lLCBGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWVUYWlsKGJhc2VOYW1lKTsKLQkJaWYgKGZpbGVOYW1lLmxlbmd0aCgpIDwgMykgewotCQkJZmlsZU5hbWUgPSAiV1NUTVAiICsgZmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShmaWxlTmFtZSwgbnVsbCwgZGlyZWN0b3J5KTsKLQkJcmV0dXJuIHRlbXBGaWxlOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZXMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtOyBmb3IgZGlyZWN0b3JpZXMsIHJlY3Vyc2UgdGhlIHN1YmRpcmVjdG9yaWVzIGFuZCBkZWxldGUKLQkgKiB0aGVtIGFzIHdlbGwKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bDsgZmFsc2UgaWYgYW55IGZpbGUgb3Igc3ViIGZpbGUgY291bGQgbm90IGJlIGRlbGV0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlKEZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGFGaWxlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghZGVsZXRlKGZpbGVzW2ldKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBhRmlsZS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgZmlsZXMsIHJlY3Vyc2l2ZSwgdGhhdCBjYW4ndCBiZSB3cml0dGVuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdyaXRlUHJvdGVjdGVkRmlsZXMoRmlsZSBhRmlsZSwgTGlzdCBhTGlzdCkgewotCQlpZiAoYUxpc3QgPT0gbnVsbCkKLQkJCWFMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYUZpbGUuZXhpc3RzKCkgJiYgIWFGaWxlLmNhbldyaXRlKCkpCi0JCQlhTGlzdC5hZGQoYUZpbGUpOwotCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gYUZpbGUubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZ2V0V3JpdGVQcm90ZWN0ZWRGaWxlcyhmaWxlc1tpXSwgYUxpc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBMZXZlcmFnZSB0aGUgamF2YS5pby5GaWxlIGFwaXMgdG8gcmVzb2x2ZSB0aGluZ3MgbGlrZSAiLi94eHgiIGFuZCAiLi4veHh4IiBpbnRvIHVyaXMgb2YKLQkgKiBlbnRyaWVzIGluIHRoZSBlYXIgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGhFbnRyeSAtCi0JICogICAgICAgICAgICBhIGNsYXNzcGF0aCBlbnRyeSBmcm9tIHRoZSBtYW5pZmVzdCBvZgotCSAqIEBhbkFyY2hpdmUKLQkgKiBAcGFyYW0gYW5BcmNoaXZlIC0KLQkgKiAgICAgICAgICAgIHRoZSBhcmNoaXZlIHRvIHdoaWNoIHRoZSBkZXBlbmRlbnQgamFyIGlzIHJlbGF0aXZlCi0JICogCi0JICogQHJldHVybiBhIGNhbmFub25pY2FsaXplZCByZWxhdGl2ZSB1cmkgb2YgYW4gZW50cnkgaW4gYW4gZWFyIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBkZXBlbmRlbnQKLQkgKiAgICAgICAgIGphcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcml2ZUVBUlJlbGF0aXZlVVJJKFN0cmluZyBjbGFzc3BhdGhFbnRyeSwgQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIGRlcml2ZUVBUlJlbGF0aXZlVVJJKGNsYXNzcGF0aEVudHJ5LCBhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIExldmVyYWdlIHRoZSBqYXZhLmlvLkZpbGUgYXBpcyB0byByZXNvbHZlIHRoaW5ncyBsaWtlICIuL3h4eCIgYW5kICIuLi94eHgiIGludG8gdXJpcyBvZgotCSAqIGVudHJpZXMgaW4gdGhlIGVhciBmaWxlCi0JICogCi0JICogQHBhcmFtIGNsYXNzcGF0aEVudHJ5IC0KLQkgKiAgICAgICAgICAgIGEgY2xhc3NwYXRoIGVudHJ5IGZyb20gdGhlIG1hbmlmZXN0IG9mIGFuIGFyY2hpdmUKLQkgKiBAcGFyYW0gU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIHRoZSB1cmkgb2YgdGhlIGFyY2hpdmUgdG8gd2hpY2ggdGhlIGRlcGVuZGVudCBqYXIgaXMgcmVsYXRpdmUKLQkgKiAKLQkgKiBAcmV0dXJuIGEgY2FuYW5vbmljYWxpemVkIHJlbGF0aXZlIHVyaSBvZiBhbiBlbnRyeSBpbiBhbiBlYXIgZmlsZSByZXByZXNlbnRpbmcgdGhlIGRlcGVuZGVudAotCSAqICAgICAgICAgamFyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVyaXZlRUFSUmVsYXRpdmVVUkkoU3RyaW5nIGNsYXNzcGF0aEVudHJ5LCBTdHJpbmcgYXJjaGl2ZVVyaSkgewotCQl0cnkgewotCQkJU3RyaW5nIHBhcmVudCA9IGdldEZpbGVOYW1lUGFyZW50KGFyY2hpdmVVcmkpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJcGFyZW50ID0gIi4iOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgd29ya2luZ0RpciA9IG5ldyBqYXZhLmlvLkZpbGUoIi4iKS5nZXRDYW5vbmljYWxQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJU3RyaW5nIHJlc29sdmVkUGF0aCA9IG5ldyBqYXZhLmlvLkZpbGUocGFyZW50LCBjbGFzc3BhdGhFbnRyeSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJaWYgKCFyZXNvbHZlZFBhdGguc3RhcnRzV2l0aCh3b3JraW5nRGlyKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChyZXNvbHZlZFBhdGguZXF1YWxzKHdvcmtpbmdEaXIpKQotCQkJCXJldHVybiBudWxsOwotCQkJaW50IHN0YXJ0ID0gd29ya2luZ0Rpci5lbmRzV2l0aChqYXZhLmlvLkZpbGUuc2VwYXJhdG9yKSA/IHdvcmtpbmdEaXIubGVuZ3RoKCkgOiB3b3JraW5nRGlyLmxlbmd0aCgpICsgMTsKLQkJCXJldHVybiByZXNvbHZlZFBhdGguc3Vic3RyaW5nKHN0YXJ0LCByZXNvbHZlZFBhdGgubGVuZ3RoKCkpLnJlcGxhY2UoamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCS8vZ2V0Q2Fub25pY2FsUGF0aCBjb3VsZCB0aHJvdyB0aGlzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiAiIiBpZiB0aGVyZSBpcyBubyBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZUV4dGVuc2lvbihTdHJpbmcgdXJpKSB7Ci0KLQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCXJldHVybiB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IGZyb20gdGhlIHVyaSwgb3IgdGhlIHRydW5jYXRpb24gb2YgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIGxhc3QKLQkgKiBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWVQYXJlbnQoU3RyaW5nIHVyaSkgewotCQlpZiAodXJpPT1udWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0ZW1wVVJJID0gdXJpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJd2hpbGUgKHRlbXBVUkkuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJdGVtcFVSSSA9IHRlbXBVUkkuc3Vic3RyaW5nKDAsIHRlbXBVUkkubGVuZ3RoKCkgLSAxKTsKLQkJaW50IGxhc3RJbmRleCA9IHRlbXBVUkkubGFzdEluZGV4T2YoJy8nKTsKLQkJaWYgKGxhc3RJbmRleCA9PSAtMSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChsYXN0SW5kZXggPT0gMCkKLQkJCXJldHVybiAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHVyaS5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlbmFtZSBmcm9tIHRoZSB1cmksIG9yIHRoZSBzZWdtZW50IGFmdGVyIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZVRhaWwoU3RyaW5nIHVyaSkgewotCQlTdHJpbmcgdGVtcFVSSSA9IHVyaS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCXdoaWxlICh0ZW1wVVJJLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRlbXBVUkkgPSB0ZW1wVVJJLnN1YnN0cmluZygwLCB0ZW1wVVJJLmxlbmd0aCgpIC0gMSk7Ci0JCWludCBsYXN0SW5kZXggPSB0ZW1wVVJJLmxhc3RJbmRleE9mKCcvJyk7Ci0JCWlmIChsYXN0SW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gdXJpOwotCQlyZXR1cm4gdXJpLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxLCB0ZW1wVVJJLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdGhlIGdpdmVuIG9iamVjdCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCByZXR1cm4gdGhlIG93bmluZyBtb2R1bGUgZmlsZTsgZm9yCi0JICogZXhhbXBsZSwgcmV0cmlldmUgdGhlIEVKQkphckZpbGUgdGhhdCBvd25zIHRoZSBFSkJKYXIuIFRoaXMgd29ya3MgZXZlbiBmb3IgYWx0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlKEVPYmplY3QgZGRPYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzID0gZGRPYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFyY2hpdmUgYXJjaGl2ZSA9IGdldEFyY2hpdmUocmVzKTsKLQkJaWYgKGFyY2hpdmUgPT0gbnVsbCB8fCAhYXJjaGl2ZS5pc01vZHVsZUZpbGUoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghKHJlcyBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVhNTFJlc291cmNlIHhtbFJlcyA9IChYTUxSZXNvdXJjZSkgcmVzOwotCQlpZiAoeG1sUmVzLmlzQWx0KCkpCi0JCQlyZXR1cm4gZ2V0TW9kdWxlRmlsZVVzaW5nQWx0REQoKEVBUkZpbGUpIGFyY2hpdmUsIHJlcyk7Ci0KLQkJcmV0dXJuIChNb2R1bGVGaWxlKSBhcmNoaXZlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlVXNpbmdBbHRERChFQVJGaWxlIGVhciwgUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB1cmkgPSByZXMuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJTW9kdWxlIG0gPSBlYXIuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVIYXZpbmdBbHRERCh1cmkpOwotCQlpZiAobSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1vZHVsZVJlZiByZWYgPSBlYXIuZ2V0TW9kdWxlUmVmKG0pOwotCQlpZiAocmVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gcmVmLmdldE1vZHVsZUZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVGaWxlVHlwZU5hbWUoaW50IG1vZHVsZVR5cGUpIHsKLQkJc3dpdGNoIChtb2R1bGVUeXBlKSB7Ci0JCQljYXNlIFhNTFJlc291cmNlLkFQUExJQ0FUSU9OX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQV9BcHBsaWNhdGlvbl9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgWE1MUmVzb3VyY2UuQVBQX0NMSUVOVF9UWVBFIDoKLQkJCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX0FwcGxpY2F0aW9uX0NsaWVudF9KQVJfZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQljYXNlIFhNTFJlc291cmNlLkVKQl9UWVBFIDoKLQkJCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX0VKQl9KQVJfZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQljYXNlIFhNTFJlc291cmNlLldFQl9BUFBfVFlQRSA6Ci0JCQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBX1dBUl9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgWE1MUmVzb3VyY2UuUkFSX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQV9SQVJfZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRm9yIHRoZSBnaXZlbiByZXNvdXJjZSwgcmV0dXJuIHRoZSBvd25pbmcgbW9kdWxlIGZpbGU7IGZvciBleGFtcGxlLCByZXRyaWV2ZSB0aGUgRUpCSmFyRmlsZQotCSAqIHRoYXQgb3ducyB0aGUgRUpCSmFyLiBJbiB0aGUgY2FzZSBvZiBhbHRzLCB0aGlzIHJldHVybnMgdGhlIEVBUkZpbGUgYW5kIG5vdCB0aGUgbW9kdWxlIGZpbGUuCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWw7IGNsaWVudHMgc2hvdWxkIHVzZSB7QGxpbmsgI2dldE1vZHVsZUZpbGUoRU9iamVjdCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlIGdldEFyY2hpdmUoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVJlc291cmNlU2V0IHNldCA9IHJlcy5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlVUklDb252ZXJ0ZXIgY29udiA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJaWYgKGNvbnYgPT0gbnVsbCB8fCAhKGNvbnYgaW5zdGFuY2VvZiBBcmNoaXZlVVJJQ29udmVydGVySW1wbCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKChBcmNoaXZlVVJJQ29udmVydGVySW1wbCkgY29udikuZ2V0QXJjaGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbmNhdGVuYXRlcyB0aGUgdHdvIHN0cmluZ3MgYW5kIGVuc3VyZXMgdGhlIGNvcnJlY3Qgc2VwYXJhdG9yIGlzIHVzZWQgaW4gdGhlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPU1VyaShTdHJpbmcgdXJpKSB7Ci0JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlpZiAoc2VwICE9ICcvJykKLQkJCXJldHVybiB1cmkucmVwbGFjZSgnLycsIHNlcCk7Ci0JCXJldHVybiB1cmkucmVwbGFjZSgnXFwnLCBzZXApOwotCX0KLQotCS8qKgotCSAqIENvbmNhdGVuYXRlcyB0aGUgdHdvIHN0cmluZ3MgYW5kIGVuc3VyZXMgdGhlIGNvcnJlY3Qgc2VwYXJhdG9yIGlzIHVzZWQgaW4gdGhlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPU1VyaShTdHJpbmcgZGlyZWN0b3J5bmFtZSwgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZyBvc0Rpck5hbWUgPSBnZXRPU1VyaShkaXJlY3RvcnluYW1lKTsKLQkJU3RyaW5nIG9zRmlsZU5hbWUgPSBnZXRPU1VyaShmaWxlbmFtZSk7Ci0JCXJldHVybiBjb25jYXRVcmkob3NEaXJOYW1lLCBvc0ZpbGVOYW1lLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGV4dGVudCBvZiB0aGUgcmVzb3VyY2UKLQkgKiAKLQkgKiBAdGhyb3dzIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIHRocm93biBpZiB0aGUgZXh0ZW50IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldFJvb3QoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCUVMaXN0IGV4dGVudCA9IGFSZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQlpZiAoZXh0ZW50LnNpemUoKSA8IDEpIHsKLQkJCXRocm93IG5ldyBFbXB0eVJlc291cmNlRXhjZXB0aW9uKGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gKEVPYmplY3QpIGV4dGVudC5nZXQoMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2V0VGVtcERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBEaXJlY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMToxNjo0OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGVtcERpcmVjdG9yeU5hbWUoKSB7Ci0JCXJldHVybiB0ZW1wRGlyZWN0b3J5TmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFRva2VucyhTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gZ2V0VG9rZW5zKGFTdHJpbmcsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IChkZWxpbWl0ZXIgPT0gbnVsbCkgPyBuZXcgU3RyaW5nVG9rZW5pemVyKGFTdHJpbmcpIDogbmV3IFN0cmluZ1Rva2VuaXplcihhU3RyaW5nLCBkZWxpbWl0ZXIpOwotCQlpbnQgc2l6ZSA9IHRvay5jb3VudFRva2VucygpOwotCQlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgJiYgdG9rLmhhc01vcmVUb2tlbnMoKTsgaSsrKSB7Ci0JCQl0b2tlbnNbaV0gPSB0b2submV4dFRva2VuKCk7Ci0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZUlnbm9yZUtleUNhc2UgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlSWdub3JlS2V5Q2FzZShqYXZhLmxhbmcuU3RyaW5nIGtleSwgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzIGF0dHIpIHsKLQkJSXRlcmF0b3Iga2V5c0FuZFZhbHVlcyA9IGF0dHIuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoa2V5c0FuZFZhbHVlcy5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGtleXNBbmRWYWx1ZXMubmV4dCgpOwotCQkJU3RyaW5nIGVudHJ5S2V5ID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsKLQkJCWlmIChlbnRyeUtleS5lcXVhbHNJZ25vcmVDYXNlKGtleSkpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCA/IG51bGwgOiBlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSkgewotCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0luZm8obWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHVwIHVudGlsIHRoZSBmaXJzdCBlbmQgb2YgZmlsZSBjaGFyYWN0ZXIsIGFkZCB0aGlzCi0JICogZGF0YSB0byBhIGJ5dGUgYXJyYXksIGFuZCBjbG9zZSB0aGUgaW5wdXQgc3RyZWFtOyByZXR1cm5zIHRoZSBieXRlIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gaW5wdXRTdHJlYW1Ub0J5dGVzKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQljb3B5KGluLCBvdXQpOwotCQlyZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlyZXR1cm4gSmF2YVVSTC5pc0phdmFVUkwoYVJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWRVUklNYXBwaW5nKFJlc291cmNlIHJlcykgewotCQlyZXR1cm4gVVJJTWFwcGluZ1JlZ2lzdHJ5SW1wbC5JTlNUQU5DRS5nZXRVUkkocmVzLmdldFVSSSgpKSAhPSByZXMuZ2V0VVJJKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxhdGZvcm1NZXRhUmVzb3VyY2UoUmVzb3VyY2UgcmVzKSB7Ci0JCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCXJldHVybiAicGxhdGZvcm0iLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmICJtZXRhIi5lcXVhbHModXJpLnNlZ21lbnQoMCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gYVN0cmluZyA9PSBudWxsIHx8IGFTdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUnVudGltZSgpIHsKLQkJcmV0dXJuIGlzUnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiBJcyBpdCB3aXRoaW4gdGhlIHNwZWMgZm9yIHRoZSBKQVIgb3IgbW9kdWxlIGZpbGUgdG8gcmVmZXJlbmNlIHRoZSBhcmNoaXZlIHZpYSB0aGUgTWFuaWZlc3QKLQkgKiBDbGFzcy1QYXRoPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRGVwZW5kZW5jeShBcmNoaXZlIHJlZmVyZW5jZWRKQVIsIEFyY2hpdmUgcmVmZXJlbmNpbmdKQVIpIHsKLQkJLy9ObyBvdGhlciBtb2R1bGVzIHNob3VsZCByZWZlcmVuY2Ugd2FycwotCQlpZiAocmVmZXJlbmNlZEpBUi5pc1dBUkZpbGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAocmVmZXJlbmNlZEpBUiA9PSByZWZlcmVuY2luZ0pBUikKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvL0NsaWVudHMgY2FuIHJlZmVyZW5jZSBhbGwgYnV0IHRoZSBXQVJzLCB3aGljaCB3ZSd2ZSBhbHJlYWR5IGNvdmVyZWQKLQkJLy8gYWJvdmU7IFdBUnMgYW5kIEVKQiBKQVJzCi0JCS8vY2FuIHJlZmVyZW5jZSBhbGwgYnV0IFdBUnMsIGFib3ZlLCBvciBBcHBsaWNhdGlvbkNsaWVudHMKLQkJcmV0dXJuIHJlZmVyZW5jaW5nSkFSLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkgfHwgIXJlZmVyZW5jZWRKQVIuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhIHByb3BlcnRpZXMgZmlsZSB3aXRoIHRoZSBnaXZlbiB1cmkgZnJvbSB0aGUgZ2l2ZW4gYXJjaGl2ZQotCSAqIAotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3VycyByZWFkaW5nIHRoZSBwcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKEFyY2hpdmUgYXJjaGl2ZSwgU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IGFyY2hpdmUuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQkJCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwLmxvYWQoaW4pOwotCQkJcmV0dXJuIHA7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQlpbi5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldElzUnVudGltZShib29sZWFuIGFCb29sZWFuKSB7Ci0JCWlzUnVudGltZSA9IGFCb29sZWFuOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvdWxkVXNlVGVtcERpcmVjdG9yeUZvclJlYWQoYm9vbGVhbiB2YWx1ZSkgewotCQlzaG91bGRVc2VUZW1wRGlyZWN0b3J5Rm9yUmVhZCA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDE6MjY6MjggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1RlbXBEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIGphdmEuaW8uRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUZW1wRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBuZXdUZW1wRGlyZWN0b3J5KSB7Ci0JCXRlbXBEaXJlY3RvcnkgPSBuZXdUZW1wRGlyZWN0b3J5OwotCQl0ZW1wRGlyZWN0b3J5TmFtZSA9IG5ld1RlbXBEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGVtcCBkaXJlY3RvcnkgdG8gdGhlIHNwZWNpZmllZCBwYXRoOyBjcmVhdGVzIGl0IGFuZCBzZXRzIGl0IHRvIGJlIGRlbGV0ZWQgb24gZXhpdAotCSAqIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZW1wRGlyZWN0b3J5TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEB0aHJvd3MgQXJjaGl2ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHRocm93biBpZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGFuZCBjYW4gbm90IGJlIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGVtcERpcmVjdG9yeU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdUZW1wRGlyZWN0b3J5TmFtZSkgdGhyb3dzIEFyY2hpdmVFeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgZGlyID0gbmV3IGphdmEuaW8uRmlsZShuZXdUZW1wRGlyZWN0b3J5TmFtZSk7Ci0JCWlmICghZGlyLmV4aXN0cygpKSB7Ci0JCQlkaXIubWtkaXJzKCk7Ci0JCQlpZiAoIWRpci5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygibWFrZV90ZW1wX2Rpcl9FWENfIiwgKG5ldyBPYmplY3RbXXtuZXdUZW1wRGlyZWN0b3J5TmFtZX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiVW5hYmxlIHRvIG1ha2UgdGVtcCBkaXJlY3Rvcnk6ICIKLQkJCWRpci5kZWxldGVPbkV4aXQoKTsKLQkJfQotCQlzZXRUZW1wRGlyZWN0b3J5KGRpcik7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMTowODoyMCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkVXNlVGVtcERpcmVjdG9yeUZvclJlYWQoKSB7Ci0JCXJldHVybiBzaG91bGRVc2VUZW1wRGlyZWN0b3J5Rm9yUmVhZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBsaXN0IG9mIHN0cmluZyBlbGVtZW50cyB0byBhbiBhcnJheSBvZiBmaWxlIFVSTHM7IGlmIGFuIGVudHJ5IGlzIHJlbGF0aXZlLCBtYWtlCi0JICogaXQgcmVsYXRpdmUgdG8gdGhlIHVyaSByb290Ci0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLm5ldC5VUkxbXSB0b0xvY2FsVVJMcyhMaXN0IGVudHJpZXMsIFN0cmluZyB1cmlSb290KSB7Ci0JCUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgcGF0aEVudHJ5ID0gKFN0cmluZykgZW50cmllcy5nZXQoaSk7Ci0JCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGhFbnRyeSk7Ci0JCQlpZiAoIWFGaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJCXBhdGhFbnRyeSA9IGdldE9TVXJpKHVyaVJvb3QsIHBhdGhFbnRyeSk7Ci0JCQkJYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGhFbnRyeSk7Ci0JCQl9Ci0JCQlpZiAoIWFGaWxlLmV4aXN0cygpKSB7Ci0JCQkJLy9pbmZvcm0oIkNsYXNzcGF0aCBlbGVtZW50ICIgKyBwYXRoRW50cnkgKyAiIGRvZXMgbm90Ci0JCQkJLy8gZXhpc3QiKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChhRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJaWYgKCFwYXRoRW50cnkuZW5kc1dpdGgoamF2YS5pby5GaWxlLnNlcGFyYXRvcikpIHsKLQkJCQkJcGF0aEVudHJ5ID0gcGF0aEVudHJ5ICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlaaXBGaWxlIHppcCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJemlwID0gbmV3IFppcEZpbGUoYUZpbGUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlpbmZvcm0oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImludmFsaWRfY2xhc3NwYXRoX1dBUk5fIiwgKG5ldyBPYmplY3RbXXtwYXRoRW50cnl9KSkpOyAvLyROT04tTkxTLTEkID0gIkNsYXNzcGF0aCBlbGVtZW50ICJ7MH0iIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIFppcCBmaWxlIgotCQkJCQljb250aW51ZTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoemlwICE9IG51bGwpCi0JCQkJCQl0cnkgewotCQkJCQkJCXppcC5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7Ci0JCQkJCQkJLy9JZ25vcmUKLQkJCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoRW50cnkpOwotCQkJCWphdmEubmV0LlVSTCBhVXJsID0gYUZpbGUudG9VUkwoKTsgLy8kTk9OLU5MUy0xJAotCQkJCXVybHMuYWRkKGFVcmwpOwotCQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7Ci0JCQkJaW5mb3JtKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJpbnZhbGlkX2NwX2ZpbGVfV0FSTl8iLCAobmV3IE9iamVjdFtde3BhdGhFbnRyeX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiQ2xhc3NwYXRoIGVsZW1lbnQgInswfSIgZG9lcyBub3QgcG9pbnQgdG8gYSBsb2NhbCBmaWxlIgotCQkJfQotCQl9Ci0JCWphdmEubmV0LlVSTFtdIHVybEFycmF5ID0gbmV3IGphdmEubmV0LlVSTFt1cmxzLnNpemUoKV07Ci0JCXJldHVybiAoamF2YS5uZXQuVVJMW10pIHVybHMudG9BcnJheSh1cmxBcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3Vic3RyaW5nIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIHN0YXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIHByZWZpeAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRydW5jYXRlRnJvbUZyb250SWdub3JlQ2FzZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIGxlYWRpbmdTdWJTdHJpbmcpIHsKLQkJaWYgKCFhU3RyaW5nLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChsZWFkaW5nU3ViU3RyaW5nLnRvTG93ZXJDYXNlKCkpKQotCQkJcmV0dXJuIGFTdHJpbmc7Ci0JCXJldHVybiBhU3RyaW5nLnN1YnN0cmluZyhsZWFkaW5nU3ViU3RyaW5nLmxlbmd0aCgpLCBhU3RyaW5nLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWJzdHJpbmcgb2YgdGhlIGZpcnN0IHBhcmFtZXRlciwgdXAgdG8gdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNlY29uZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRydW5jYXRlSWdub3JlQ2FzZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHRyYWlsaW5nU3ViU3RyaW5nKSB7Ci0JCWludCBpbmRleCA9IGFTdHJpbmcudG9Mb3dlckNhc2UoKS5sYXN0SW5kZXhPZih0cmFpbGluZ1N1YlN0cmluZy50b0xvd2VyQ2FzZSgpKTsKLQkJaWYgKGluZGV4ICE9IC0xKQotCQkJcmV0dXJuIGFTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJcmV0dXJuIGFTdHJpbmc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXJpVG9DbGFzc05hbWUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gdHJ1bmNhdGVJZ25vcmVDYXNlKHVyaS5yZXBsYWNlKCcvJywgJy4nKSwgRE9UX0NMQVNTKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKMkVFMTNGYXN0Q2hlY2soTW9kdWxlRmlsZSBtb2R1bGVGaWxlKSB7Ci0JCWlmIChtb2R1bGVGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlTdHJpbmcgdXJpID0gbW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpOwotCQl0cnkgewotCQkJaW4gPSBtb2R1bGVGaWxlLmdldElucHV0U3RyZWFtKHVyaSk7Ci0KLQkJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gWG1sRG9jdW1lbnRSZWFkZXIucmVhZERvY3VtZW50VHlwZShpbiwgdXJpKTsKLQkJCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nW10gaWRzID0gZ2V0SjJFRTEzUHVibGljQW5kU3lzdGVtSWRGb3IobW9kdWxlRmlsZSk7Ci0JCQlpZiAoaWRzID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIGlkc1swXS5lcXVhbHMoZG9jVHlwZS5nZXRQdWJsaWNJZCgpKSAmJiBpZHNbMV0uZXF1YWxzKGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGdldEoyRUUxM1B1YmxpY0FuZFN5c3RlbUlkRm9yKE1vZHVsZUZpbGUgbW9kdWxlRmlsZSkgewotCQlpZiAobW9kdWxlRmlsZS5pc0VBUkZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzMsIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8zfTsKLQkJZWxzZSBpZiAobW9kdWxlRmlsZS5pc0VKQkphckZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5FSkJKQVJfUFVCTElDSURfMl8wLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8yXzB9OwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzMsIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzN9OwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzV0FSRmlsZSgpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLldFQkFQUF9QVUJMSUNJRF8yXzMsIEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfM307Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuQ09OTkVDVE9SX1BVQkxJQ0lEXzFfMCwgSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU1lTVEVNSURfMV8wfTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy9UT0RPIGRvaW5nIHRoZSBwYXJzZSB3aXRoIFNBWCB3b3VsZCBiZSBmYXN0ZXIKLQlwdWJsaWMgc3RhdGljIGludCBnZXRGYXN0U3BlY1ZlcnNpb24oTW9kdWxlRmlsZSBtb2R1bGVGaWxlKSB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJU3RyaW5nIHVyaSA9IG1vZHVsZUZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKTsKLQkJdHJ5IHsKLQkJCWluID0gbW9kdWxlRmlsZS5nZXRJbnB1dFN0cmVhbSh1cmkpOwotCi0JCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IG51bGw7Ci0KLQkJCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbik7Ci0JCQlHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIgYVJlYWRlciA9IG5ldyBYbWxEb2N1bWVudFJlYWRlcihzb3VyY2UpOwotCQkJYVJlYWRlci5zZXRWYWxpZGF0ZShmYWxzZSk7Ci0JCQlEb2N1bWVudCBhRG9jdW1lbnQgPSBhUmVhZGVyLnBhcnNlRG9jdW1lbnQoKTsKLQkJCWlmIChhRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWRvY1R5cGUgPSBhRG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQkJfQotCQkJaW50IHZlcnNpb24gPSAtMTsKLQkJCWlmIChudWxsICE9IGRvY1R5cGUpIHsKLQkJCQlTdHJpbmcgcHVibGljSUQgPSBkb2NUeXBlLmdldFB1YmxpY0lkKCk7Ci0JCQkJU3RyaW5nIHN5c3RlbUlEID0gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpOwotCQkJCWlmIChwdWJsaWNJRCAhPSBudWxsICYmIHN5c3RlbUlEICE9IG51bGwpIHsKLQkJCQkJdmVyc2lvbiA9IGxvb2t1cFZlcnNpb24obW9kdWxlRmlsZSwgcHVibGljSUQsIHN5c3RlbUlEKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodmVyc2lvbiA9PSAtMSkgewotCQkJCVN0cmluZyBzY2hlbWFOYW1lID0gbnVsbDsKLQkJCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7Ci0JCQkJaWYgKGFEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCWlmIChudWxsID09IGRvY1R5cGUpIHsKLQkJCQkJCU5hbWVkTm9kZU1hcCBtYXAgPSBhRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJaWYgKG51bGwgIT0gbWFwKSB7Ci0JCQkJCQkJTm9kZSBzY2hlbWFOb2RlID0gbWFwLmdldE5hbWVkSXRlbSgieHNpOnNjaGVtYUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAobnVsbCAhPSBzY2hlbWFOb2RlKSB7Ci0JCQkJCQkJCXNjaGVtYU5hbWUgPSBzY2hlbWFOb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCX0KLQkJCQkJCQlOb2RlIHZlcnNpb25Ob2RlID0gbWFwLmdldE5hbWVkSXRlbSgidmVyc2lvbiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAobnVsbCAhPSB2ZXJzaW9uTm9kZSkgewotCQkJCQkJCQl2ZXJzaW9uU3RyaW5nID0gdmVyc2lvbk5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChudWxsICE9IHNjaGVtYU5hbWUpIHsKLQkJCQkJdmVyc2lvbiA9IGxvb2t1cFZlcnNpb24obW9kdWxlRmlsZSwgc2NoZW1hTmFtZSk7Ci0JCQkJfQotCQkJCWlmICh2ZXJzaW9uID09IC0xKSB7Ci0JCQkJCXZlcnNpb24gPSBwYXJzZVZlcnNpb25TdHJpbmcobW9kdWxlRmlsZSwgdmVyc2lvblN0cmluZyk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gdmVyc2lvbjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiAtMTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VWZXJzaW9uU3RyaW5nKE1vZHVsZUZpbGUgbW9kdWxlRmlsZSwgU3RyaW5nIHZlcnNpb25BdHRyKSB7Ci0JCWludCB2ZXJzaW9uID0gLTE7Ci0JCWlmIChtb2R1bGVGaWxlLmlzRUFSRmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzFfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8wX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8yX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfM19URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb247Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9va3VwVmVyc2lvbihNb2R1bGVGaWxlIG1vZHVsZUZpbGUsIFN0cmluZyBzY2hlbWFOYW1lKSB7Ci0JCWludCB2ZXJzaW9uID0gLTE7Ci0JCWlmIChtb2R1bGVGaWxlLmlzRUFSRmlsZSgpKSB7Ci0JCQlpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfMV80KSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlpZiAoKHNjaGVtYU5hbWUuaW5kZXhPZihKMkVFQ29uc3RhbnRzLkVKQkpBUl9TQ0hFTUFfMl8xX05TKSkgIT0gLTEpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpIHsKLQkJCWlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BXzFfNCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NDSEVNQV8yXzQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NDSEVNQV8xXzUpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxvb2t1cFZlcnNpb24oTW9kdWxlRmlsZSBtb2R1bGVGaWxlLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgewotCQlpbnQgdmVyc2lvbiA9IC0xOwotCQlpZiAobW9kdWxlRmlsZS5pc0VBUkZpbGUoKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMykgJiYgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8zKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8yKSAmJiBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzIpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc0VKQkphckZpbGUoKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8yXzApICYmIHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8yXzApKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ7Ci0JCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8xXzEpICYmIHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8xXzEpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8zKSAmJiBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMykpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8yKSAmJiBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMikpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1BVQkxJQ0lEXzJfMykgJiYgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMykpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRDsKLQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1BVQkxJQ0lEXzJfMikgJiYgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMikpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9QVUJMSUNJRF8xXzApICYmIHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzApKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotCQkJfQotCQl9Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9DbGFzc3BhdGhVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NsYXNzcGF0aFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2MjU4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NsYXNzcGF0aFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGw7Ci0KLQotcHVibGljIGNsYXNzIENsYXNzcGF0aFV0aWwgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NNYW5pZmVzdChTdHJpbmcgaW5QYXRoLCBMaXN0IHJ0Q2xhc3NwYXRoLCBTZXQgcHJvY2Vzc2VkUGF0aHMpIHsKLQkJQXJyYXlMaXN0IHBhdGhzID0gZ2V0TWFuaWZlc3RQYXRocyhpblBhdGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLnNpemUoKTsgaSsrKSB7Ci0JCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoUnVudGltZUNsYXNzcGF0aEVudHJ5KSBwYXRocy5nZXQoaSk7Ci0JCQlpZiAoIXByb2Nlc3NlZFBhdGhzLmNvbnRhaW5zKGVudHJ5KSkgewotCQkJCXByb2Nlc3NlZFBhdGhzLmFkZChlbnRyeSk7Ci0JCQkJcnRDbGFzc3BhdGguYWRkKGVudHJ5KTsKLQkJCQlwcm9jZXNzTWFuaWZlc3QoZW50cnkuZ2V0QWJzb2x1dGVQYXRoKCksIHJ0Q2xhc3NwYXRoLCBwcm9jZXNzZWRQYXRocyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkoU3RyaW5nIGFic29sdXRlUGF0aCwgU3RyaW5nIG1hbmlmZXN0VmFsdWUpIHsKLQkJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gbmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGwoKTsKLQkJZW50cnkuc2V0QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7Ci0JCWVudHJ5LnNldE1hbmlmZXN0VmFsdWUobWFuaWZlc3RWYWx1ZSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEFycmF5TGlzdCBnZXRNYW5pZmVzdFBhdGhzKFN0cmluZyBwYXRoKSB7Ci0JCUFycmF5TGlzdCBtYW5pZmVzdFBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKGYuZXhpc3RzKCkpIHsKLQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKHBhdGggKyBGaWxlLnNlcGFyYXRvciArICJNRVRBLUlORiIgKyBGaWxlLnNlcGFyYXRvciArICJNQU5JRkVTVC5NRiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAobWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCUZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obWFuaWZlc3RGaWxlKTsKLQkJCQkJCU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KGlucHV0U3RyZWFtKTsKLQkJCQkJCW1hbmlmZXN0UGF0aHMgPSBnZXRNYW5pZmVzdENsYXNzUGF0aHMobWFuaWZlc3QsIGYuZ2V0UGFyZW50KCkpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvL0lnbm9yZQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKG51bGwgIT0gaW5wdXRTdHJlYW0pIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlKYXJGaWxlIGphckZpbGUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWphckZpbGUgPSBuZXcgSmFyRmlsZShmKTsKLQkJCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBqYXJGaWxlLmdldE1hbmlmZXN0KCk7Ci0JCQkJCWlmIChtYW5pZmVzdCAhPSBudWxsKQotCQkJCQkJbWFuaWZlc3RQYXRocyA9IGdldE1hbmlmZXN0Q2xhc3NQYXRocyhtYW5pZmVzdCwgZi5nZXRQYXJlbnQoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChqYXJGaWxlICE9IG51bGwpCi0JCQkJCQl0cnkgewotCQkJCQkJCWphckZpbGUuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJLy9JZ25vcmUKLQkJCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hbmlmZXN0UGF0aHM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBBcnJheUxpc3QgZ2V0TWFuaWZlc3RDbGFzc1BhdGhzKE1hbmlmZXN0IG1hbmlmZXN0LCBTdHJpbmcgYXJjaGl2ZVBhdGgpIHsKLQkJQXJyYXlMaXN0IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlBdHRyaWJ1dGVzIG1haW4gPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpOwotCQlTdHJpbmcgY2xhc3NQYXRoID0gbWFpbi5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuQ0xBU1NfUEFUSCk7Ci0JCWlmIChjbGFzc1BhdGggIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc1BhdGgsICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlTdHJpbmcgcGF0aCA9IGFyY2hpdmVQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyB0b2tlbjsKLQkJCQlwYXRoID0gbm9ybWFsaXplUGF0aChwYXRoKTsKLQkJCQlpZiAobmV3IEZpbGUocGF0aCkuZXhpc3RzKCkpIHsKLQkJCQkJcGF0aExpc3QuYWRkKGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShwYXRoLCB0b2tlbikpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aExpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplUGF0aChTdHJpbmcgcGF0aCkgewotCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJdHJ5IHsKLQkJCWYgPSBmLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiBmLmdldFBhdGgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmYmE1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5DbGllbnRNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29ubmVjdG9yTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uYXJjaGl2ZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIENvbW1vbmFyY2hpdmVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCXB1YmxpYyBDb21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gKENvbW1vbmFyY2hpdmVQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25hcmNoaXZlUGFja2FnZS5lTlNfVVJJKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpIHR5cGUpLmVDbGFzcygpLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBDb21tb25hcmNoaXZlU3dpdGNoIHN3ID0gbmV3IENvbW1vbmFyY2hpdmVTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRhaW5lcihDb250YWluZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlV0FSRmlsZShXQVJGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdBUkZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVGaWxlKE1vZHVsZUZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTW9kdWxlRmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVBUkZpbGUoRUFSRmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFQVJGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXJGaWxlKEVKQkphckZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUpCSmFyRmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVJBUkZpbGUoUkFSRmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSQVJGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQXJjaGl2ZShBcmNoaXZlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFyY2hpdmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWxlKEZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVJlYWRPbmx5RGlyZWN0b3J5KFJlYWRPbmx5RGlyZWN0b3J5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5QWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlcikgc3cuZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLiBJdCdzIHVzZWZ1bCB0bwotCSAqIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGFpbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kdWxlQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldENvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdBUkZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUFSRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkphckZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSQVJGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJjaGl2ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJDbGllbnRKYXJGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJNb2R1bGVSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJNb2R1bGVSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDbGllbnRNb2R1bGVSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGVHZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1vbmFyY2hpdmVTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQ29tbW9uYXJjaGl2ZVN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZpbGUoRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFyY2hpdmUoQXJjaGl2ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJjaGl2ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphckZpbGUoRUpCSmFyRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCSmFyRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdBUkZpbGUoV0FSRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV0FSRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVBUkZpbGUoRUFSRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUFSRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZShBcHBsaWNhdGlvbkNsaWVudEZpbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZUZpbGUoTW9kdWxlRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRhaW5lcihDb250YWluZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRhaW5lckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlYWRPbmx5RGlyZWN0b3J5KFJlYWRPbmx5RGlyZWN0b3J5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZWFkT25seURpcmVjdG9yeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJBUkZpbGUoUkFSRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUkFSRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZVJlZihNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQk1vZHVsZVJlZihFSkJNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQk1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYk1vZHVsZVJlZihXZWJNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNsaWVudE1vZHVsZVJlZihDbGllbnRNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNsaWVudE1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbm5lY3Rvck1vZHVsZVJlZihDb25uZWN0b3JNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJHZW4oTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLiBJdCdzIHVzZWZ1bCB0bwotCSAqIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGFpbmVyQWRhcHRlckdlbigpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXQVJGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kdWxlRmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBUkZpbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJKYXJGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUkFSRmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyY2hpdmVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Db21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZVN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjY2ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5DbGllbnRNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29ubmVjdG9yTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uYXJjaGl2ZVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5OwotCi0JcHVibGljIENvbW1vbmFyY2hpdmVTd2l0Y2goKSB7Ci0JCWZhY3RvcnkgPSAoQ29tbW9uYXJjaGl2ZUZhY3RvcnkpIENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQltb2RlbFBhY2thZ2UgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCUVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSAhPSBtb2RlbFBhY2thZ2UpCi0JCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0KLQkJc3dpdGNoICh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEUgOiB7Ci0JCQkJV0FSRmlsZSBjYXN0ZWRPYmplY3QgPSAoV0FSRmlsZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdBUkZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQXJjaGl2ZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFIDogewotCQkJCUVBUkZpbGUgY2FzdGVkT2JqZWN0ID0gKEVBUkZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFQVJGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUFyY2hpdmUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRSA6IHsKLQkJCQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgY2FzdGVkT2JqZWN0ID0gKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VBcmNoaXZlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFIDogewotCQkJCUVKQkphckZpbGUgY2FzdGVkT2JqZWN0ID0gKEVKQkphckZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJKYXJGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUFyY2hpdmUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRSA6IHsKLQkJCQlSQVJGaWxlIGNhc3RlZE9iamVjdCA9IChSQVJGaWxlKSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUkFSRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VBcmNoaXZlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRSA6IHsKLQkJCQlBcmNoaXZlIGNhc3RlZE9iamVjdCA9IChBcmNoaXZlKSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJjaGl2ZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEUgOiB7Ci0JCQkJRmlsZSBjYXN0ZWRPYmplY3QgPSAoRmlsZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUlkgOiB7Ci0JCQkJUmVhZE9ubHlEaXJlY3RvcnkgY2FzdGVkT2JqZWN0ID0gKFJlYWRPbmx5RGlyZWN0b3J5KSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVhZE9ubHlEaXJlY3RvcnkoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfSAvLyBkb1N3aXRjaAotCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyKENvbnRhaW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlV0FSRmlsZShXQVJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVGaWxlKE1vZHVsZUZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUVBUkZpbGUoRUFSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRmlsZShFSkJKYXJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VSQVJGaWxlKFJBUkZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUFyY2hpdmUoQXJjaGl2ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlRmlsZShGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZWFkT25seURpcmVjdG9yeShSZWFkT25seURpcmVjdG9yeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVSZWYoTW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJNb2R1bGVSZWYoRUpCTW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGVSZWYoV2ViTW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDbGllbnRNb2R1bGVSZWYoQ2xpZW50TW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGVSZWYoQ29ubmVjdG9yTW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoR2VuKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEU6IHsKLQkJCQlGaWxlIGZpbGUgPSAoRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRmlsZShmaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkU6IHsKLQkJCQlBcmNoaXZlIGFyY2hpdmUgPSAoQXJjaGl2ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJjaGl2ZShhcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIoYXJjaGl2ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShhcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRTogewotCQkJCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJKYXJGaWxlKGVqYkphckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoZWpiSmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXJjaGl2ZShlamJKYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIoZWpiSmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShlamJKYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFOiB7Ci0JCQkJV0FSRmlsZSB3YXJGaWxlID0gKFdBUkZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdBUkZpbGUod2FyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlRmlsZSh3YXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcmNoaXZlKHdhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcih3YXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKHdhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEU6IHsKLQkJCQlFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUFSRmlsZShlYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGVhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFyY2hpdmUoZWFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKGVhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUoZWFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRTogewotCQkJCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBsaWNhdGlvbkNsaWVudEZpbGUgPSAoQXBwbGljYXRpb25DbGllbnRGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkNsaWVudEZpbGUoYXBwbGljYXRpb25DbGllbnRGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGFwcGxpY2F0aW9uQ2xpZW50RmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXJjaGl2ZShhcHBsaWNhdGlvbkNsaWVudEZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihhcHBsaWNhdGlvbkNsaWVudEZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUoYXBwbGljYXRpb25DbGllbnRGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFOiB7Ci0JCQkJTW9kdWxlRmlsZSBtb2R1bGVGaWxlID0gKE1vZHVsZUZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUobW9kdWxlRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXJjaGl2ZShtb2R1bGVGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIobW9kdWxlRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShtb2R1bGVGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUjogewotCQkJCUNvbnRhaW5lciBjb250YWluZXIgPSAoQ29udGFpbmVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250YWluZXIoY29udGFpbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKGNvbnRhaW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZOiB7Ci0JCQkJUmVhZE9ubHlEaXJlY3RvcnkgcmVhZE9ubHlEaXJlY3RvcnkgPSAoUmVhZE9ubHlEaXJlY3RvcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlYWRPbmx5RGlyZWN0b3J5KHJlYWRPbmx5RGlyZWN0b3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIocmVhZE9ubHlEaXJlY3RvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUocmVhZE9ubHlEaXJlY3RvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEU6IHsKLQkJCQlSQVJGaWxlIHJhckZpbGUgPSAoUkFSRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUkFSRmlsZShyYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKHJhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFyY2hpdmUocmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKHJhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUocmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGOiB7Ci0JCQkJTW9kdWxlUmVmIG1vZHVsZVJlZiA9IChNb2R1bGVSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1vZHVsZVJlZihtb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUY6IHsKLQkJCQlFSkJNb2R1bGVSZWYgZWpiTW9kdWxlUmVmID0gKEVKQk1vZHVsZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCTW9kdWxlUmVmKGVqYk1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlUmVmKGVqYk1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRjogewotCQkJCVdlYk1vZHVsZVJlZiB3ZWJNb2R1bGVSZWYgPSAoV2ViTW9kdWxlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJNb2R1bGVSZWYod2ViTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVSZWYod2ViTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGOiB7Ci0JCQkJQ2xpZW50TW9kdWxlUmVmIGNsaWVudE1vZHVsZVJlZiA9IChDbGllbnRNb2R1bGVSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNsaWVudE1vZHVsZVJlZihjbGllbnRNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZVJlZihjbGllbnRNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUY6IHsKLQkJCQlDb25uZWN0b3JNb2R1bGVSZWYgY29ubmVjdG9yTW9kdWxlUmVmID0gKENvbm5lY3Rvck1vZHVsZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29ubmVjdG9yTW9kdWxlUmVmKGNvbm5lY3Rvck1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlUmVmKGNvbm5lY3Rvck1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyR2VuKENvbnRhaW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV0FSRmlsZUdlbihXQVJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVGaWxlR2VuKE1vZHVsZUZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUdlbihBcHBsaWNhdGlvbkNsaWVudEZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVBUkZpbGVHZW4oRUFSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRmlsZUdlbihFSkJKYXJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSQVJGaWxlR2VuKFJBUkZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFyY2hpdmVHZW4oQXJjaGl2ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRmlsZUdlbihGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZWFkT25seURpcmVjdG9yeUdlbihSZWFkT25seURpcmVjdG9yeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZUdlbihFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Db21tb25hcmNoaXZlU3dpdGNoCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0VBUkZpbGVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0VBUkZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNmVhNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9FQVJGaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotCi1wdWJsaWMgY2xhc3MgRUFSRmlsZVV0aWwgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVBUkZpbGVVdGlsLgotCSAqLwotCXByaXZhdGUgRUFSRmlsZVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIG1vZHVsZSBmaWxlcyB3aGljaCBhcmUgYSBzcGVjIGxldmVsIHRvbyBoaWdoIGZvciB0aGUgRUFSIGZpbGUuIElmIHRoZQotCSAqIEVBUiBpcyAxLjMsIHJldHVybnMgYW4gZW1wdHkgbGlzdC4gT3RoZXJ3aXNlIHJldHVybnMgYW55IEoyRUUgMS4zIG1vZHVsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEluY29tcGF0aWJsZTEzTW9kdWxlRmlsZXMoRUFSRmlsZSBlYXJGaWxlKSB7Ci0JCWlmIChpc0oyRUUxMyhlYXJGaWxlKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUxpc3QgbW9kdWxlRmlsZXMgPSBlYXJGaWxlLmdldE1vZHVsZUZpbGVzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVGaWxlIGFNb2R1bGVGaWxlID0gKE1vZHVsZUZpbGUpIG1vZHVsZUZpbGVzLmdldChpKTsKLQkJCWlmIChpc0oyRUUxMyhhTW9kdWxlRmlsZSkpCi0JCQkJcmVzdWx0LmFkZChhTW9kdWxlRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgbW9kdWxlIGZpbGVzIHdoaWNoIGFyZSBhIHNwZWMgbGV2ZWwgdG9vIGhpZ2ggZm9yIHRoZSBFQVIgZmlsZS4gSWYgdGhlCi0JICogRUFSIGlzIDEuNCwgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiBPdGhlcndpc2UgcmV0dXJucyBhbnkgSjJFRSAxLjQgbW9kdWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0SW5jb21wYXRpYmxlMTRNb2R1bGVGaWxlcyhFQVJGaWxlIGVhckZpbGUpIHsKLQkJaWYgKGlzSjJFRTE0KGVhckZpbGUpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJTGlzdCBtb2R1bGVGaWxlcyA9IGVhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZUZpbGUgYU1vZHVsZUZpbGUgPSAoTW9kdWxlRmlsZSkgbW9kdWxlRmlsZXMuZ2V0KGkpOwotCQkJaWYgKGlzSjJFRTE0KGFNb2R1bGVGaWxlKSkKLQkJCQlyZXN1bHQuYWRkKGFNb2R1bGVGaWxlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0oyRUUxMyhNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlYTUxSZXNvdXJjZSB4bWxSZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgYU1vZHVsZUZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJcmV0dXJuIHhtbFJlc291cmNlLmdldEoyRUVWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKMkVFMTQoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgewotCQl0cnkgewotCQkJWE1MUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIGFNb2R1bGVGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJCXJldHVybiB4bWxSZXNvdXJjZS5nZXRKMkVFVmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9GaWxlRHVwcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9GaWxlRHVwcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmIyMDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRmlsZUR1cHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEwOjI4OjQ0IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRHVwcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IHNGaWxlcyA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IHNEdXBzID0gMDsKLQlwcml2YXRlIHN0YXRpYyBpbnQgc0pBUnMgPSAwOwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGV4Y2x1ZGVkRW50cnlOYW1lcyA9IG5ldyBTdHJpbmdbXXsiY29tL2libS9pdmovZWpiL3J1bnRpbWUvX0NvcHlIZWxwZXJfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3JnL29tZy9zdHViL2phdmF4L2VqYi9fSG9tZUhhbmRsZV9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJvcmcvb21nL3N0dWIvamF2YXgvZWpiL19IYW5kbGVfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3JnL29tZy9zdHViL2phdmF4L2VqYi9fRUpCT2JqZWN0X1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJIm9yZy9vbWcvc3R1Yi9qYXZheC9lamIvX0VKQkhvbWVfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3JnL29tZy9zdHViL2phdmEvbGFuZy9fQ2xvbmVhYmxlX1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJImNvbS9pYm0vd2Vic3BoZXJlL2NzaS9fVHJhbnNhY3Rpb25hbE9iamVjdF9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJjb20vaWJtL3dlYnNwaGVyZS9jc2kvX0NTSVNlcnZhbnRfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiY29tL2libS9lanMvY29udGFpbmVyL19FSlNXcmFwcGVyX1RpZS5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiY29tL2libS9lanMvY29udGFpbmVyL19FSlNXcmFwcGVyX1N0dWIuY2xhc3MiIC8vJE5PTi1OTFMtMSQKLQl9OwotCXByaXZhdGUgc3RhdGljIEhhc2hTZXQgZXhjbHVkZWQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGV4Y2x1ZGVkRW50cnlOYW1lcykpOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnksIE1hcCBtYXAsIFN0cmluZyBqYXJOYW1lKSB7Ci0JCXNGaWxlcysrOwotCi0JCU9iamVjdCBjdXJyZW50ID0gbWFwLmdldChlbnRyeSk7Ci0JCWlmIChjdXJyZW50ID09IG51bGwpIHsKLQkJCS8vIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGVudHJ5IGlzIGZvdW5kCi0JCQltYXAucHV0KGVudHJ5LCBqYXJOYW1lKTsKLQkJfSBlbHNlIGlmIChjdXJyZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkvLyBUaGVyZSBpcyBvbmUgb3RoZXIgZW50cnkKLQkJCW1hcC5yZW1vdmUoZW50cnkpOwotCi0JCQlTdHJpbmcgb3RoZXIgPSAoU3RyaW5nKSBjdXJyZW50OwotCQkJTGlua2VkTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCWxpc3QuYWRkRmlyc3Qob3RoZXIpOwotCQkJbGlzdC5hZGRGaXJzdChqYXJOYW1lKTsKLQkJCW1hcC5wdXQoZW50cnksIGxpc3QpOwotCi0JCQlzRHVwcysrOwotCQl9IGVsc2UgewotCQkJLy8gVGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgb3RoZXIgaW5zdGFuY2VzCi0JCQlMaW5rZWRMaXN0IGxpc3QgPSAoTGlua2VkTGlzdCkgY3VycmVudDsKLQkJCWxpc3QuYWRkRmlyc3QoamFyTmFtZSk7Ci0KLQkJCXNEdXBzKys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MubGVuZ3RoICE9IDEpIHsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgiRmlsZUR1cHMgdXRpbGl0eVxyXG5cclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZCgiU3lub3BzaXM6XHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoIkFuYWx5emVzIEpBUiBhbmQgWklQIGZpbGVzIGluIGEgZGlyZWN0b3J5IGZvciBkdXBsaWNhdGUgZW50cmllcyB3aXRoIHRoZSBzYW1lIG5hbWUuICBUaGlzIGV4Y2x1ZGVzIGFsbCBlbnRyaWVzIGluIHRoZSBcIk1FVEEtSU5GXCIgZGlyZWN0b3J5IG9mIHRoZSBhcmNoaXZlLiAgVGhpcyBkb2VzIG5vdCBjaGVjayB0aW1lc3RhbXBzIG9yIHNpemUuXHJcblxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKCJVc2FnZTogRmlsZUR1cHMgZGlyTmFtZVxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVHJlZU1hcCBtYXAgPSBuZXcgVHJlZU1hcCgpOwotCi0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlGaWxlIHJvb3QgPSBuZXcgRmlsZShhcmdzW2ldKTsKLQkJCQlwcm9jZXNzRGlyZWN0b3J5KHJvb3QsIG1hcCk7Ci0JCQl9Ci0KLQkJCVRyZWVNYXAgb3V0cHV0TWFwID0gbmV3IFRyZWVNYXAoKTsKLQotCQkJU2V0IHNldCA9IG1hcC5lbnRyeVNldCgpOwotCQkJSXRlcmF0b3IgaXQgPSBzZXQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgbWUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IG8gPSBtZS5nZXRWYWx1ZSgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTGlua2VkTGlzdCkgewotCQkJCQlTdHJpbmdCdWZmZXIgamFycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQkJCQlMaW5rZWRMaXN0IGxpc3QgPSAoTGlua2VkTGlzdCkgbzsKLQkJCQkJSXRlcmF0b3IgZW50cnlJdGVyID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoZW50cnlJdGVyLmhhc05leHQoKSkgewotCQkJCQkJamFycy5hcHBlbmQoZW50cnlJdGVyLm5leHQoKSk7Ci0JCQkJCQlqYXJzLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQlMaW5rZWRMaXN0IG91dHB1dExpc3QgPSAoTGlua2VkTGlzdCkgb3V0cHV0TWFwLmdldChqYXJzLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAob3V0cHV0TGlzdCA9PSBudWxsKSB7Ci0JCQkJCQlvdXRwdXRMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCQkJCW91dHB1dE1hcC5wdXQoamFycy50b1N0cmluZygpLCBvdXRwdXRMaXN0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRMaXN0LmFkZEZpcnN0KG1lLmdldEtleSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVNldCBvdXRTZXQgPSBvdXRwdXRNYXAuZW50cnlTZXQoKTsKLQkJCWl0ID0gb3V0U2V0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJTWFwLkVudHJ5IG1lID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCVN0cmluZyBqYXJzID0gKFN0cmluZykgbWUuZ2V0S2V5KCk7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoamFycywgIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQkJfQotCi0JCQkJTGlua2VkTGlzdCBsaXN0ID0gKExpbmtlZExpc3QpIG1lLmdldFZhbHVlKCk7Ci0JCQkJSXRlcmF0b3IgZW50cnlJdGVyID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChlbnRyeUl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICIgKyAoU3RyaW5nKSBlbnRyeUl0ZXIubmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuU2VhcmNoZWQgIiArIHNKQVJzICsgIiBqYXJzLCBmb3VuZCAiICsgc0R1cHMgKyAiIGR1cHMgaW4gIiArIHNGaWxlcyArICIgZmlsZXMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKLQkJCXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoRmlsZSByb290LCBNYXAgbWFwKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZiA9IGZpbGVzW2ldOwotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkKLQkJCQlwcm9jZXNzRGlyZWN0b3J5KGYsIG1hcCk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKG5hbWUuZW5kc1dpdGgoIi56aXAiKSB8fCBuYW1lLmVuZHNXaXRoKCIuamFyIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXsKLQkJCQkJcHJvY2Vzc0ZpbGUoZiwgbWFwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgZmlsZSwgTWFwIG1hcCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlIYXNoU2V0IGZpbGVzSW5GaWxlID0gbmV3IEhhc2hTZXQoKTsKLQotCQlzSkFScysrOwotCQlaaXBGaWxlIHppcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXAgPSBuZXcgWmlwRmlsZShmaWxlKTsKLQkJCUVudW1lcmF0aW9uIGVOdW0gPSB6aXAuZW50cmllcygpOwotCQkJd2hpbGUgKGVOdW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZU51bS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJCWlmICghbmFtZS5zdGFydHNXaXRoKCJNRVRBLUlORiIpICYmICFleGNsdWRlZC5jb250YWlucyhuYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlmaWxlc0luRmlsZS5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIipFcnJvciBzZWFyY2hpbmcgaW4gIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh6aXAgIT0gbnVsbCkKLQkJCQkJemlwLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0KLQkJLy8gTm93IGFkZCB0aGUgcGFja2FnZXMgdG8gdGhlIG1hcAotCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldFBhdGgoKTsKLQotCQlJdGVyYXRvciBpdCA9IGZpbGVzSW5GaWxlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBlbnRyeU5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlhZGRFbnRyeShlbnRyeU5hbWUsIG1hcCwgZmlsZW5hbWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9PYmplY3RJbnB1dFN0cmVhbUN1c3RvbVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL09iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhYzkxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL09iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzczsKLWltcG9ydCBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotcHVibGljIGNsYXNzIE9iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIgZXh0ZW5kcyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHsKLQlwcml2YXRlIENsYXNzTG9hZGVyIGNsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQotCXB1YmxpYyBPYmplY3RJbnB1dFN0cmVhbUN1c3RvbVJlc29sdmVyKElucHV0U3RyZWFtIGlzLCBDbGFzc0xvYWRlciBsb2FkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uIHsKLQotCQlzdXBlcihpcyk7Ci0KLQkJaWYgKGxvYWRlciAhPSBudWxsKQotCQkJY2wgPSBsb2FkZXI7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBqYXZhIHR5cGUgY2xhc3MgZ2l2ZW4gYSBzaWduYXR1cmUgbGV0dGVyLgotCSAqLwotCi0JcHJpdmF0ZSBDbGFzcyBnZXRUeXBlKGNoYXIgdHlwZSkgewotCi0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSAnQicgOgotCQkJCXJldHVybiBieXRlLmNsYXNzOwotCQkJY2FzZSAnQycgOgotCQkJCXJldHVybiBjaGFyLmNsYXNzOwotCQkJY2FzZSAnRCcgOgotCQkJCXJldHVybiBkb3VibGUuY2xhc3M7Ci0JCQljYXNlICdGJyA6Ci0JCQkJcmV0dXJuIGZsb2F0LmNsYXNzOwotCQkJY2FzZSAnSScgOgotCQkJCXJldHVybiBpbnQuY2xhc3M7Ci0JCQljYXNlICdKJyA6Ci0JCQkJcmV0dXJuIGxvbmcuY2xhc3M7Ci0JCQljYXNlICdTJyA6Ci0JCQkJcmV0dXJuIHNob3J0LmNsYXNzOwotCQkJY2FzZSAnWicgOgotCQkJCXJldHVybiBib29sZWFuLmNsYXNzOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHJlc29sdmVDbGFzcygpIG1ldGhvZCB0byB1c2UgYSBjdXN0b20gY2xhc3MgbG9hZGVyLgotCSAqLwotCi0JcHJvdGVjdGVkIENsYXNzIHJlc29sdmVDbGFzcyhPYmplY3RTdHJlYW1DbGFzcyBjbGFzc0Rlc2MpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzRGVzYy5nZXROYW1lKCk7Ci0KLQkJLy9VdGlsc1RyYWNlLnRyYWNlKCIgT2JqZWN0SW5wdXRTdHJlYW1DdXN0b21SZXNvbHZlcjogUmVzb2x2aW5nICIgKyBjbGFzc05hbWUpOwotCi0JCS8vIEhhbmRsZSBhcnJheXMgb2YgY2xhc3NlcyBkaWZmZXJlbnRseQotCi0JCWlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgiWyIpKSB7Ly8kTk9OLU5MUy0xJAotCi0JCQlDbGFzcyBjb21wb25lbnQgPSBudWxsOwotCQkJaW50IGRpbU51bTsKLQotCQkJZm9yIChkaW1OdW0gPSAxOyBjbGFzc05hbWUuY2hhckF0KGRpbU51bSkgPT0gJ1snOyBkaW1OdW0rKykKLQotCQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoZGltTnVtKSA9PSAnTCcpIHsKLQkJCQljb21wb25lbnQgPSBjbC5sb2FkQ2xhc3MoY2xhc3NOYW1lLnN1YnN0cmluZyhkaW1OdW0gKyAxLCBjbGFzc05hbWUubGVuZ3RoKCkgLSAxKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjbGFzc05hbWUubGVuZ3RoKCkgIT0gZGltTnVtICsgMSkKLQkJCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oY2xhc3NOYW1lKTsgLy8gbWFsZm9ybWVkCi0JCQkJY29tcG9uZW50ID0gZ2V0VHlwZShjbGFzc05hbWUuY2hhckF0KGRpbU51bSkpOwotCQkJfQotCi0JCQlpbnQgZGltZW5zaW9uc1tdID0gbmV3IGludFtkaW1OdW1dOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1OdW07IGkrKykKLQkJCQlkaW1lbnNpb25zW2ldID0gMDsKLQotCQkJcmV0dXJuIEFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudCwgZGltZW5zaW9ucykuZ2V0Q2xhc3MoKTsKLQotCQl9Ci0JCXJldHVybiBjbC5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL1JhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzhhNmY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotCi0KLXB1YmxpYyBjbGFzcyBSYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyIGV4dGVuZHMgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIgewotCi0JcHVibGljIFJhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIoQXJjaGl2ZSBhbkFyY2hpdmUsIENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsKSB7Ci0JCXN1cGVyKGFuQXJjaGl2ZSwgcGFyZW50Q2wsIGV4dHJhQ2wpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGdldEZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IGdldFJhckZpbGUoKS5nZXRBcmNoaXZlRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChBcmNoaXZlKSBjaGlsZHJlbi5nZXQoaSkpLmdldEZpbGUobmFtZSk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRGaWxlRnJvbURlcGVuZGVudEphcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFJBUkZpbGUgZ2V0UmFyRmlsZSgpIHsKLQkJcmV0dXJuIChSQVJGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9XYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL1dhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4OTE1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL1dhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdHRwCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyIGV4dGVuZHMgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93TG9hZGluZ0Zyb21XQVIgPSB0cnVlOwotCi0JcHVibGljIFdhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIoQXJjaGl2ZSBhbkFyY2hpdmUsIENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsKSB7Ci0JCXN1cGVyKGFuQXJjaGl2ZSwgcGFyZW50Q2wsIGV4dHJhQ2wpOwotCQlhbGxvd0xvYWRpbmdGcm9tV0FSID0gYW5BcmNoaXZlLmdldE9wdGlvbnMoKS5nZXRDbGFzc0xvYWRpbmdNb2RlKCkgPT0gQXJjaGl2ZU9wdGlvbnMuTE9BRF9NT0RFX0NPTVBBVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBnZXRGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCS8vc2VhcmNoIGNsYXNzZXMgZGlyZWN0b3J5IGZpcnN0LCB0aGVuIHdhciwgdGhlbiBuZXN0ZWQgYXJjaGl2ZXMuCi0JCS8vc2VhcmNoIGNsYXNzZXMgZGlyZWN0b3J5Ci0JCVN0cmluZyBzd2l6emxlZE5hbWUgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkksIG5hbWUsICcvJyk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0V2FyRmlsZSgpLmdldEZpbGUoc3dpenpsZWROYW1lKTsKLQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJfQotCQkvL3NlYXJjaCB3YXIgaWYgcnVubmluZyB3aXRoIGNvbXBhdGliaWxpdHkKLQkJaWYgKGFsbG93TG9hZGluZ0Zyb21XQVIpIHsKLQkJCUZpbGUgZmlsZSA9IGdldEZpbGVGcm9tQXJjaGl2ZShuYW1lKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJfQotCQkvL3NlYXJjaCBuZXN0ZWQgYXJjaGl2ZXMKLQkJTGlzdCBjaGlsZHJlbiA9IGdldFdhckZpbGUoKS5nZXRMaWJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoQXJjaGl2ZSkgY2hpbGRyZW4uZ2V0KGkpKS5nZXRGaWxlKG5hbWUpOwotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQkvL2ZpbmFsbHkgc2VhcmNoIGphcnMgaW4gZWFyCi0JCXJldHVybiBnZXRGaWxlRnJvbURlcGVuZGVudEphcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFdBUkZpbGUgZ2V0V2FyRmlsZSgpIHsKLQkJcmV0dXJuIChXQVJGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXBwbGljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlMTQzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTG9vc2VBcHBsaWNhdGlvbiBleHRlbmRzIExvb3NlQXJjaGl2ZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIExvb3NlQXJjaGl2ZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldExvb3NlQXJjaGl2ZXMoKTsKLQotfSAvL0xvb3NlQXBwbGljYXRpb24KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXJjaGl2ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VBcmNoaXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDMwZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VBcmNoaXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLQotcHVibGljIGludGVyZmFjZSBMb29zZUFyY2hpdmUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBVcmkgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFVyaSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFVyaSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFVyaShTdHJpbmcgdmFsdWUpOwotCi0JYm9vbGVhbiBpc0VBUigpOwotCi0JYm9vbGVhbiBpc1dBUigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQmluYXJpZXNQYXRoIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRCaW5hcmllc1BhdGgoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBCaW5hcmllc1BhdGggYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRCaW5hcmllc1BhdGgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJlc291cmNlc1BhdGggYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZXNvdXJjZXNQYXRoIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VzUGF0aChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBMb29zZUFwcCByZWZlcmVuY2UKLQkgKi8KLQlMb29zZUFwcGxpY2F0aW9uIGdldExvb3NlQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMb29zZUFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldExvb3NlQXBwKExvb3NlQXBwbGljYXRpb24gdmFsdWUpOwotCi0JYm9vbGVhbiBpc01vZHVsZSgpOwotCi19IC8vTG9vc2VBcmNoaXZlCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUNvbmZpZ1JlZ2lzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUNvbmZpZ1JlZ2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYmRjYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VDb25maWdSZWdpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlN0cmluZ1V0aWw7Ci0KLQotLyoqCi0gKiBVc2VkIGludGVybmFsbHkgZm9yIGxvb3NlIG1vZHVsZSBzdXBwb3J0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb29zZUNvbmZpZ1JlZ2lzdGVyIHsKLQotCS8qKgotCSAqIFRoZSBzeXN0ZW0gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBsb29zZSBjb25maWcgZG9jdW1lbnQ7Ci0JICogIndhcy5sb29zZS5jb25maWciCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9PU0VfQ09ORklHX1BST1BFUlRZID0gIndhcy5sb29zZS5jb25maWciOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIExvb3NlQ29uZmlnUmVnaXN0ZXIgc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIExvb3NlQ29uZmlndXJhdGlvbiBsb29zZUNvbmZpZ3VyYXRpb247Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQkvKiogSGF2ZSB3ZSBwcmV2aW91c2x5IGxvYWRlZCBvciB0cmllZCB0byBsb2FkIHRoZSBsb29zZSBjb25maWd1cmF0aW9uPyAqLwotCXByb3RlY3RlZCBib29sZWFuIGxvYWRBdHRlbXB0ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgTWFwIGxvb3NlRWFyTWFwOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvb3NlQ29uZmlnUmVnaXN0ZXIuCi0JICovCi0JcHJvdGVjdGVkIExvb3NlQ29uZmlnUmVnaXN0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExvb3NlQ29uZmlnUmVnaXN0ZXIgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgTG9vc2VDb25maWdSZWdpc3RlcigpOwotCi0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIHRoZSBlYXIgZmlsZSBpbiB0aGUgZmx1ZmZlZCBMb29zZUNvbmZpZ3VyYXRpb24gb2JqZWN0LCBhbmQgYXR0ZW1wdHMgdG8gbG9hZCB0aGUKLQkgKiBMb29zZUFwcGxpY2F0aW9uIG9uIGRlbWFuZCBmcm9tIHRoZSBleGlzdGluZyBtYXBwaW5ncyBpZiBpdCBpcyBub3QgYWxyZWFkeSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExvb3NlQXBwbGljYXRpb24gZmluZExvb3NlQXBwbGljYXRpb24oU3RyaW5nIGVhckZpbGVVUkkpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbihTdHJpbmcKLQkJLy8gZWFyRmlsZVVSST1cIiIrZWFyRmlsZVVSSSsiXCIpIik7Ci0JCWlmIChnZXRMb29zZUNvbmZpZ3VyYXRpb24oKSAhPSBudWxsKSB7Ci0JCQlMaXN0IGFwcHMgPSBnZXRMb29zZUNvbmZpZ3VyYXRpb24oKS5nZXRBcHBsaWNhdGlvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXBwcy5zaXplKCk7IGkrKykgewotCQkJCUxvb3NlQXBwbGljYXRpb24gYXBwID0gKExvb3NlQXBwbGljYXRpb24pIGFwcHMuZ2V0KGkpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKToKLQkJCQkvLyBhcHBbIitpKyJdLmdldFVSSSgpPVwiIithcHAuZ2V0VXJpKCkrIlwiIiApOwotCQkJCWlmIChhcHAuZ2V0VXJpKCkuZXF1YWxzKGVhckZpbGVVUkkpKQotCQkJCQlyZXR1cm4gYXBwOwotCQkJfQotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKTogZGlkIG5vdCBmaW5kIGxvYWRlZAotCQkvLyBMb29zZUFwcGxpY2F0aW9uLCBsb2FkaW5nIG5ldyB2YWx1ZS4iICk7Ci0JCWlmIChnZXREb2N1bWVudFVSSSgpID09IG51bGwgfHwgZ2V0RG9jdW1lbnRVUkkoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJVVJJIGxvb3NlQ29uZmlnID0gKFVSSSkgZ2V0TG9vc2VFYXJNYXAoKS5nZXQoZWFyRmlsZVVSSSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKCk6IGxvb3NlQ29uZmlnIFVSSQotCQkJLy8gZnJvbSBtYXAgXCIiK2xvb3NlQ29uZmlnKyJcIiIpOwotCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IGxvYWRMb29zZUFwcGxpY2F0aW9uKGxvb3NlQ29uZmlnKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKToKLQkJCS8vIGxvb3NlQXBwbGljYXRpb249IithcHBsaWNhdGlvbik7Ci0JCQlpZiAoYXBwbGljYXRpb24gIT0gbnVsbCkgewotCQkJCUxpc3QgbW9kdWxlcyA9IGFwcGxpY2F0aW9uLmdldExvb3NlQXJjaGl2ZXMoKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKCk6Ci0JCQkJLy8gbG9vc2VBcHBsaWNhdGlvbiBjb250YWlucyAiICsgbW9kdWxlcy5zaXplKCkgKyAiIG1vZHVsZXMuIik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKCk6Ci0JCQkJCS8vIG1vZHVsZXMuZ2V0KCIraSsiKToiKyBtb2R1bGVzLmdldChpKSk7Ci0JCQkJCWdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpLmFkZChhcHBsaWNhdGlvbik7Ci0JCQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlYXJGaWxlVVJJCi0JICogICAgICAgICAgICBUaGUgY29udGFpbmluZyBFQVIgLS0gdGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIFVSSSB3aWxsIGJlIGRldGVybWluZWQKLQkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkKLQkgKiBAcGFyYW0gbG9vc2VBcHBsaWNhdGlvblJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgZmlsZSBzeXN0ZW0gVVJJIG9mIGEgZG9jdW1lbnQgY29udGFpbmluZyBhIExvb3NlQXBwbGljYXRpb24gYXMgaXRzCi0JICogICAgICAgICAgICByb290Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTG9vc2VNYXBwaW5nKENvbnRhaW5lciBjb250YWluZXIsIFN0cmluZyBsb29zZUFwcGxpY2F0aW9uUmVzb3VyY2UpIHsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKQotCQkJYWRkTG9vc2VNYXBwaW5nKEFyY2hpdmVVdGlsLmdldE9TVXJpKGNvbnRhaW5lci5nZXRVUkkoKSksIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBmaWxlIHN5c3RlbSBVUkkgb2YgdGhlIEVBUiBmaWxlIG9mIHRoZSBnaXZlbiBtYXBwaW5nCi0JICogQHBhcmFtIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIFVSSSBvZiBhIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBMb29zZUFwcGxpY2F0aW9uIGFzIGl0cwotCSAqICAgICAgICAgICAgcm9vdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExvb3NlTWFwcGluZyhTdHJpbmcgZWFyRmlsZVVSSSwgU3RyaW5nIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSkgewotCQlpZiAoZWFyRmlsZVVSSSAhPSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmFkZExvb3NlTWFwcGluZyhTdHJpbmcKLQkJCS8vIGVhckZpbGVVUkk9XCIiK2VhckZpbGVVUkkrIlwiLCBTdHJpbmcKLQkJCS8vIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZT1cIiIrbG9vc2VBcHBsaWNhdGlvblJlc291cmNlKyJcIikiKTsKLQkJCWlmIChnZXRMb29zZUVhck1hcCgpLmNvbnRhaW5zS2V5KGVhckZpbGVVUkkpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5hZGRMb29zZU1hcHBpbmcoKTogRm91bmQgZXhpc3Rpbmcga2V5Ci0JCQkJLy8gd2l0aCBzYW1lIGVhckZpbGVVUkksIGxvb2tpbmcgZm9yIGxvYWRlZCBhcHAuIik7Ci0JCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSBmaW5kTG9vc2VBcHBsaWNhdGlvbklmTG9hZGVkKGVhckZpbGVVUkkpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuYWRkTG9vc2VNYXBwaW5nKCk6IExvYWRlZCBhcHA9IiArCi0JCQkJLy8gYXBwKTsKLQkJCQlpZiAoYXBwICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gbG9hZExvb3NlQXBwbGljYXRpb25SZXNvdXJjZShVUkkuY3JlYXRlVVJJKGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSkpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmFkZExvb3NlTWFwcGluZygpOiBjbGVhcmluZwotCQkJCQkvLyByZXNvdXJjZToiICsgcmVzKTsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCQlyZW1vdmVMb29zZUFwcGxpY2F0aW9uKGFwcCk7Ci0JCQkJfQotCQkJfQotCQkJZ2V0TG9vc2VFYXJNYXAoKS5wdXQoZWFyRmlsZVVSSSwgVVJJLmNyZWF0ZVVSSShsb29zZUFwcGxpY2F0aW9uUmVzb3VyY2UpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlYXJGaWxlVVJJCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMb29zZUFwcGxpY2F0aW9uIGZpbmRMb29zZUFwcGxpY2F0aW9uSWZMb2FkZWQoU3RyaW5nIGVhckZpbGVVUkkpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbklmTG9hZGVkKFN0cmluZwotCQkvLyBlYXJGaWxlVVJJPVwiIitlYXJGaWxlVVJJKyJcIikiKTsKLQkJaWYgKGdldExvb3NlQ29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKLQkJCUxpc3QgYXBwcyA9IGdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBzLnNpemUoKTsgaSsrKSB7Ci0JCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSAoTG9vc2VBcHBsaWNhdGlvbikgYXBwcy5nZXQoaSk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbklmTG9hZGVkKCk6Ci0JCQkJLy8gYXBwWyIraSsiXS5nZXRVUkkoKT1cIiIrYXBwLmdldFVyaSgpKyJcIiIgKTsKLQkJCQlpZiAoYXBwLmdldFVyaSgpLmVxdWFscyhlYXJGaWxlVVJJKSkKLQkJCQkJcmV0dXJuIGFwcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd3MgYWRkaW5nIExvb3NlQXBwbGljYXRpb25zIGR5bm1pY2FsbHkuCi0JICogCi0JICogQHBhcmFtIGFwcGxpY2F0aW9uCi0JICogICAgICAgICAgICBBbiBhcHBsaWNhdGlvbiBjcmVhdGVkIGFuZCBwZXJzaXN0ZWQgYnkgYW4gZXh0ZXJuYWwgZW50aXR5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCWdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpLmFkZChhcHBsaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dzIHJlbW92aW5nIExvb3NlQXBwbGljYXRpb25zIGR5bm1pY2FsbHkuCi0JICogCi0JICogQHBhcmFtIGFwcGxpY2F0aW9uCi0JICogICAgICAgICAgICBBbiBhcHBsaWNhdGlvbiBjcmVhdGVkIGFuZCBwZXJzaXN0ZWQgYnkgYW4gZXh0ZXJuYWwgZW50aXR5Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIucmVtb3ZlTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uCi0JCS8vIGFwcGxpY2F0aW9uPVwiIithcHBsaWNhdGlvbisiXCIpIik7Ci0JCWdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpLnJlbW92ZShhcHBsaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBmaWxlIHN5c3RlbSBVUkkgb2YgdGhlIEVBUiBmaWxlIG9mIHRoZSBnaXZlbiBtYXBwaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9vc2VNYXBwaW5nKFN0cmluZyBlYXJGaWxlVVJJKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIucmVtb3ZlTG9vc2VNYXBwaW5nKFN0cmluZwotCQkvLyBlYXJGaWxlVVJJPVwiIitlYXJGaWxlVVJJKyJcIikiKTsKLQkJaWYgKGVhckZpbGVVUkkgIT0gbnVsbCkKLQkJCWdldExvb3NlRWFyTWFwKCkucmVtb3ZlKGVhckZpbGVVUkkpOwotCX0KLQotCXB1YmxpYyBMb29zZU1vZHVsZSBmaW5kTG9vc2VNb2R1bGUoTG9vc2VBcHBsaWNhdGlvbiBhcHAsIFN0cmluZyB1cmksIFN0cmluZyBhbHRERCkgewotCQlMaXN0IGFyY2hpdmVzID0gYXBwLmdldExvb3NlQXJjaGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJTG9vc2VBcmNoaXZlIGVsZW1lbnQgPSAoTG9vc2VBcmNoaXZlKSBhcmNoaXZlcy5nZXQoaSk7Ci0JCQlpZiAoIWVsZW1lbnQuaXNNb2R1bGUoKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHVyaSwgZWxlbWVudC5nZXRVcmkoKSkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoYWx0REQsICgoTG9vc2VNb2R1bGUpIGVsZW1lbnQpLmdldEFsdEREKCkpKQotCQkJCXJldHVybiAoTG9vc2VNb2R1bGUpIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExvb3NlTW9kdWxlIGZpbmRMb29zZU1vZHVsZShNb2R1bGUgbSwgRUFSRmlsZSBlYXIpIHsKLQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSBmaW5kTG9vc2VBcHBsaWNhdGlvbihlYXIuZ2V0VVJJKCkpOwotCQlyZXR1cm4gYXBwID09IG51bGwgPyBudWxsIDogZmluZExvb3NlTW9kdWxlKGFwcCwgbS5nZXRVcmkoKSwgbS5nZXRBbHRERCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGxvb3NlIGNvbmZpZ3VyYXRpb247IHRoZSBuZXh0IHRpbWUgaXQgaXMgcmVxdWVzdGVkIGl0IHdpbGwgYmUgcmVsb2FkZWQ7Ci0JICovCi0JcHVibGljIHZvaWQgZmx1c2goKSB7Ci0JCWxvYWRBdHRlbXB0ZWQgPSBmYWxzZTsKLQkJbG9vc2VDb25maWd1cmF0aW9uID0gbnVsbDsKLQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZExvb3NlQ29uZmlndXJhdGlvbigpIHsKLQkJUmVzb3VyY2UgcmVzID0gbG9hZExvb3NlQ29uZmlndXJhdGlvblJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJc2V0TG9vc2VDb25maWd1cmF0aW9uKChMb29zZUNvbmZpZ3VyYXRpb24pIHJlcy5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JCWVsc2UKLQkJCS8qCi0JCQkgKiBpZiB0aGUgZG9jdW1lbnQgaXMgZW1wdHkgdGhlbiBmbHVmZiB1cCBhIExvb3NlQ29uZmlndXJhdGlvbiBvYmplY3QKLQkJCSAqLwotCQkJc2V0TG9vc2VDb25maWd1cmF0aW9uKExvb3NlY29uZmlnRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uKCkpOwotCQlsb2FkQXR0ZW1wdGVkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgbG9hZExvb3NlQ29uZmlndXJhdGlvblJlc291cmNlKCkgewotCQlTdHJpbmcgdXJpID0gZ2V0RG9jdW1lbnRVUkkoKTsKLQkJaWYgKEFyY2hpdmVVdGlsLmlzTnVsbE9yRW1wdHkodXJpKSkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBsb29zZSBjb25maWd1cmF0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTG9vc2VBcHBsaWNhdGlvbiBsb2FkTG9vc2VBcHBsaWNhdGlvbihVUkkgbG9vc2VBcHBVUkkpIHsKLQkJUmVzb3VyY2UgcmVzID0gbG9hZExvb3NlQXBwbGljYXRpb25SZXNvdXJjZShsb29zZUFwcFVSSSk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIChMb29zZUFwcGxpY2F0aW9uKSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBsb2FkTG9vc2VBcHBsaWNhdGlvblJlc291cmNlKFVSSSBsb29zZUNvbmZpZ1VSSSkgewotCQlpZiAobG9vc2VDb25maWdVUkkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlU2V0LmdldFJlc291cmNlKGxvb3NlQ29uZmlnVVJJLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGxvb3NlIGFwcGxpY2F0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb29zZUNvbmZpZ3VyYXRpb24uIEJhc2ljIGFjY2Vzc29yIHdpdGggbm8gaW5pdGlhbGl6YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMb29zZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTG9vc2VDb25maWd1cmF0aW9uIHByaW1HZXRMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBsb29zZUNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqIFRoZSB2YWx1ZSBvZiB0aGUgbG9vc2UgY29uZmlnIHByb3BlcnR5ICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREb2N1bWVudFVSSSgpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShMT09TRV9DT05GSUdfUFJPUEVSVFkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxvb3NlQ29uZmlndXJhdGlvbi4gVHJpZXMgdG8gbG9hZCBpdCB1c2luZyB0aGUgc3lzdGVtIHByb3BlcnR5IHdhcy5sb29zZS5jb25maWcsIGlmCi0JICogbmVjZXNzYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExvb3NlQ29uZmlndXJhdGlvbiBvciBudWxsCi0JICovCi0JcHVibGljIExvb3NlQ29uZmlndXJhdGlvbiBnZXRMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChsb29zZUNvbmZpZ3VyYXRpb24gPT0gbnVsbCAmJiAhbG9hZEF0dGVtcHRlZCkKLQkJCWxvYWRMb29zZUNvbmZpZ3VyYXRpb24oKTsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bXB0aW9uOiB0aGUgcGFyYW1ldGVyIG11c3QgYmUgYSB0eXBlIHRoYXQgY2FuIGhhdmUgY2hpbGRyZW4sIGUuZy4sIExvb3NlV0FSIG9yCi0JICogTG9vc2VBcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBMaXN0IGdldExvb3NlQ2hpbGRyZW4oTG9vc2VBcmNoaXZlIGxvb3NlKSB7Ci0JCWlmIChsb29zZSAhPSBudWxsKSB7Ci0JCQlpZiAobG9vc2UuaXNFQVIoKSkKLQkJCQlyZXR1cm4gKChMb29zZUFwcGxpY2F0aW9uKSBsb29zZSkuZ2V0TG9vc2VBcmNoaXZlcygpOwotCQkJZWxzZSBpZiAobG9vc2UuaXNXQVIoKSkKLQkJCQlyZXR1cm4gKChMb29zZVdBUkZpbGUpIGxvb3NlKS5nZXRMb29zZUxpYnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bXB0aW9uOiB0aGUgcGFyYW1ldGVyIG11c3QgYmUgYSB0eXBlIHRoYXQgY2FuIGhhdmUgY2hpbGRyZW4sIGUuZy4sIExvb3NlV0FSIG9yCi0JICogTG9vc2VBcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBMb29zZUFyY2hpdmUgZmluZEZpcnN0TG9vc2VDaGlsZChTdHJpbmcgdXJpLCBMb29zZUFyY2hpdmUgbG9vc2UpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IGdldExvb3NlQ2hpbGRyZW4obG9vc2UpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlMb29zZUFyY2hpdmUgY2hpbGQgPSAoTG9vc2VBcmNoaXZlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwodXJpLCBjaGlsZC5nZXRVcmkoKSkpCi0JCQkJcmV0dXJuIGxvb3NlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvb3NlQ29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9vc2VDb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBUaGUgbG9vc2VDb25maWd1cmF0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlQ29uZmlndXJhdGlvbihMb29zZUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWxvb3NlQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBIYXZlIHdlIHByZXZpb3VzbHkgbG9hZGVkIG9yIHRyaWVkIHRvIGxvYWQgdGhlIGxvb3NlIGNvbmZpZ3VyYXRpb24/Ci0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldExvYWRBdHRlbXB0ZWQoKSB7Ci0JCXJldHVybiBsb2FkQXR0ZW1wdGVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9vc2VFYXJNYXAuCi0JICovCi0JcHVibGljIE1hcCBnZXRMb29zZUVhck1hcCgpIHsKLQkJaWYgKGxvb3NlRWFyTWFwID09IG51bGwpCi0JCQlsb29zZUVhck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBsb29zZUVhck1hcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUNvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQzY2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlQ29uZmlndXJhdGlvbiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBBcHBsaWNhdGlvbnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEFwcGxpY2F0aW9ucygpOwotCi19IC8vTG9vc2VDb25maWd1cmF0aW9uCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUxpYnJhcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzM0MjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlTGlicmFyeSBleHRlbmRzIExvb3NlQXJjaGl2ZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBMb29zZVdBUiByZWZlcmVuY2UKLQkgKi8KLQlMb29zZVdBUkZpbGUgZ2V0TG9vc2VXQVIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvb3NlV0FSIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9vc2VXQVIoTG9vc2VXQVJGaWxlIHZhbHVlKTsKLQotfSAvL0xvb3NlTGlicmFyeQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTcwZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotCi0KLQotcHVibGljIGludGVyZmFjZSBMb29zZU1vZHVsZSBleHRlbmRzIExvb3NlQXJjaGl2ZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldEFsdEREKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRBbHRERChTdHJpbmcgdmFsdWUpOwotCi19IC8vTG9vc2VNb2R1bGUKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlV0FSRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VXQVJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOTc5Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VXQVJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTG9vc2VXQVJGaWxlIGV4dGVuZHMgTG9vc2VNb2R1bGUgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBMb29zZUxpYnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldExvb3NlTGlicygpOwotCi19IC8vTG9vc2VXQVJGaWxlCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ0ZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlY29uZmlnRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTc3OTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlY29uZmlnRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLQotcHVibGljIGludGVyZmFjZSBMb29zZWNvbmZpZ0ZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZWNvbmZpZ0ZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIExvb3NlQXBwbGljYXRpb24gdmFsdWUKLQkgKi8KLQlMb29zZUFwcGxpY2F0aW9uIGNyZWF0ZUxvb3NlQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBMb29zZUxpYnJhcnkgdmFsdWUKLQkgKi8KLQlMb29zZUxpYnJhcnkgY3JlYXRlTG9vc2VMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTG9vc2VXQVJGaWxlIHZhbHVlCi0JICovCi0JTG9vc2VXQVJGaWxlIGNyZWF0ZUxvb3NlV0FSRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIExvb3NlTW9kdWxlIHZhbHVlCi0JICovCi0JTG9vc2VNb2R1bGUgY3JlYXRlTG9vc2VNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBMb29zZUNvbmZpZ3VyYXRpb24gdmFsdWUKLQkgKi8KLQlMb29zZUNvbmZpZ3VyYXRpb24gY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlMb29zZWNvbmZpZ1BhY2thZ2UgZ2V0TG9vc2Vjb25maWdQYWNrYWdlKCk7Ci0KLX0gLy9Mb29zZWNvbmZpZ0ZhY3RvcnkKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlY29uZmlnUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDg0MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIExvb3NlY29uZmlnUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9vc2Vjb25maWdQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImxvb3NlY29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9BUFBMSUNBVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0FSQ0hJVkUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9BUkNISVZFX19VUkkgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEggPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9BUkNISVZFX19MT09TRV9BUFAgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Mb29zZSBBcmNoaXZlPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0FQUExJQ0FUSU9OX19VUkkgPSBMT09TRV9BUkNISVZFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0FQUExJQ0FUSU9OX19CSU5BUklFU19QQVRIID0gTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX1JFU09VUkNFU19QQVRIID0gTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUFAgPSBMT09TRV9BUkNISVZFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTID0gTE9PU0VfQVJDSElWRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkxvb3NlIEFwcGxpY2F0aW9uPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9BUFBMSUNBVElPTl9GRUFUVVJFX0NPVU5UID0gTE9PU0VfQVJDSElWRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9MSUJSQVJZID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9fVVJJID0gTE9PU0VfQVJDSElWRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9MSUJSQVJZX19CSU5BUklFU19QQVRIID0gTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9fTE9PU0VfQVBQID0gTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Mb29zZSBMaWJyYXJ5PC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9MSUJSQVJZX0ZFQVRVUkVfQ09VTlQgPSBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFID0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19VUkkgPSBMT09TRV9BUkNISVZFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX01PRFVMRV9fQklOQVJJRVNfUEFUSCA9IExPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX01PRFVMRV9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19MT09TRV9BUFAgPSBMT09TRV9BUkNISVZFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19BTFRfREQgPSBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TG9vc2UgTW9kdWxlPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfQ09ORklHVVJBVElPTiA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUyA9IDA7Ci0KLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TG9vc2UgQ29uZmlndXJhdGlvbjwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9fVVJJID0gTE9PU0VfTU9EVUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX19CSU5BUklFU19QQVRIID0gTE9PU0VfTU9EVUxFX19CSU5BUklFU19QQVRIOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9NT0RVTEVfX1JFU09VUkNFU19QQVRIOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9fTE9PU0VfQVBQID0gTE9PU0VfTU9EVUxFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfV0FSX0ZJTEVfX0FMVF9ERCA9IExPT1NFX01PRFVMRV9fQUxUX0REOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUyA9IExPT1NFX01PRFVMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkxvb3NlIFdBUiBGaWxlPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9GRUFUVVJFX0NPVU5UID0gTE9PU0VfTU9EVUxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZWNvbmZpZ1BhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBMb29zZUFwcGxpY2F0aW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRMb29zZUFwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvb3NlQXBwbGljYXRpb25fTG9vc2VBcmNoaXZlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIExvb3NlQXJjaGl2ZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9vc2VBcmNoaXZlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldExvb3NlQXJjaGl2ZV9VcmkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9vc2VBcmNoaXZlX0JpbmFyaWVzUGF0aCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfUmVzb3VyY2VzUGF0aCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBMb29zZUxpYnJhcnkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldExvb3NlTGlicmFyeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBMb29zZVdBUkZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldExvb3NlV0FSRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTG9vc2VNb2R1bGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldExvb3NlTW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldExvb3NlTW9kdWxlX0FsdEREKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTG9vc2VDb25maWd1cmF0aW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRMb29zZUNvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TG9vc2VDb25maWd1cmF0aW9uX0FwcGxpY2F0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JTG9vc2Vjb25maWdGYWN0b3J5IGdldExvb3NlY29uZmlnRmFjdG9yeSgpOwotCi19IC8vTG9vc2Vjb25maWdQYWNrYWdlCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQXBwbGljYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQXBwbGljYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDVjYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFwcGxpY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgTG9vc2VBcHBsaWNhdGlvbkltcGwgZXh0ZW5kcyBMb29zZUFyY2hpdmVJbXBsIGltcGxlbWVudHMgTG9vc2VBcHBsaWNhdGlvbiwgTG9vc2VBcmNoaXZlIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbG9vc2VBcmNoaXZlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VBcHBsaWNhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRS5nZXRMb29zZUFwcGxpY2F0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TG9vc2VBcmNoaXZlcygpIHsKLQkJaWYgKGxvb3NlQXJjaGl2ZXMgPT0gbnVsbCkgewotCQkJbG9vc2VBcmNoaXZlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KExvb3NlQXJjaGl2ZS5jbGFzcywgdGhpcywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCk7Ci0JCX0KLQkJcmV0dXJuIGxvb3NlQXJjaGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUFA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUFAsIG1zZ3MpOwotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb29zZUFyY2hpdmVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVBQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVBQLCBtc2dzKTsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TG9vc2VBcmNoaXZlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVBQOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTLCBMb29zZUFwcGxpY2F0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fVVJJOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19CSU5BUklFU19QQVRIOgotCQkJCXJldHVybiBnZXRCaW5hcmllc1BhdGgoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzUGF0aCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FQUDoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VBcHAoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUzoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VBcmNoaXZlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fQklOQVJJRVNfUEFUSDoKLQkJCQlzZXRCaW5hcmllc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FQUDoKLQkJCQlzZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCWdldExvb3NlQXJjaGl2ZXMoKS5jbGVhcigpOwotCQkJCWdldExvb3NlQXJjaGl2ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fQklOQVJJRVNfUEFUSDoKLQkJCQlzZXRCaW5hcmllc1BhdGgoQklOQVJJRVNfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUFA6Ci0JCQkJc2V0TG9vc2VBcHAoKExvb3NlQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCWdldExvb3NlQXJjaGl2ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0JJTkFSSUVTX1BBVEg6Ci0JCQkJcmV0dXJuIEJJTkFSSUVTX1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IGJpbmFyaWVzUGF0aCAhPSBudWxsIDogIUJJTkFSSUVTX1BBVEhfRURFRkFVTFQuZXF1YWxzKGJpbmFyaWVzUGF0aCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJcmV0dXJuIFJFU09VUkNFU19QQVRIX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZXNQYXRoICE9IG51bGwgOiAhUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlc1BhdGgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FQUDoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VBcHAoKSAhPSBudWxsOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCXJldHVybiBsb29zZUFyY2hpdmVzICE9IG51bGwgJiYgIWxvb3NlQXJjaGl2ZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VBcmNoaXZlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFyY2hpdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmVmOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFyY2hpdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgTG9vc2VBcmNoaXZlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTG9vc2VBcmNoaXZlLCBFT2JqZWN0IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cmkgPSBVUklfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJpbmFyaWVzUGF0aCgpIDxlbT5CaW5hcmllcyBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmluYXJpZXNQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUklFU19QQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYmluYXJpZXNQYXRoID0gQklOQVJJRVNfUEFUSF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VzUGF0aCgpIDxlbT5SZXNvdXJjZXMgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlc1BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFU19QQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VzUGF0aCA9IFJFU09VUkNFU19QQVRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIExvb3NlQXJjaGl2ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRS5nZXRMb29zZUFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgbmV3VXJpKSB7Ci0JCVN0cmluZyBvbGRVcmkgPSB1cmk7Ci0JCXVyaSA9IG5ld1VyaTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1VSSSwgb2xkVXJpLCB1cmkpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV0FSKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJpbmFyaWVzUGF0aCgpIHsKLQkJcmV0dXJuIGJpbmFyaWVzUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCaW5hcmllc1BhdGgoU3RyaW5nIG5ld0JpbmFyaWVzUGF0aCkgewotCQlTdHJpbmcgb2xkQmluYXJpZXNQYXRoID0gYmluYXJpZXNQYXRoOwotCQliaW5hcmllc1BhdGggPSBuZXdCaW5hcmllc1BhdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRILCBvbGRCaW5hcmllc1BhdGgsIGJpbmFyaWVzUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCkgewotCQlyZXR1cm4gcmVzb3VyY2VzUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXNQYXRoKFN0cmluZyBuZXdSZXNvdXJjZXNQYXRoKSB7Ci0JCVN0cmluZyBvbGRSZXNvdXJjZXNQYXRoID0gcmVzb3VyY2VzUGF0aDsKLQkJcmVzb3VyY2VzUGF0aCA9IG5ld1Jlc291cmNlc1BhdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSCwgb2xkUmVzb3VyY2VzUGF0aCwgcmVzb3VyY2VzUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIExvb3NlQXBwbGljYXRpb24gZ2V0TG9vc2VBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKExvb3NlQXBwbGljYXRpb24pZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb29zZUFwcChMb29zZUFwcGxpY2F0aW9uIG5ld0xvb3NlQXBwKSB7Ci0JCWlmIChuZXdMb29zZUFwcCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFAgJiYgbmV3TG9vc2VBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdMb29zZUFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3TG9vc2VBcHAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TG9vc2VBcHApLmVJbnZlcnNlQWRkKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0xvb3NlQXBwLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFAsIG5ld0xvb3NlQXBwLCBuZXdMb29zZUFwcCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kdWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOgotCQkJCXJldHVybiBnZXRCaW5hcmllc1BhdGgoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZXNQYXRoKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGdldExvb3NlQXBwKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJcmV0dXJuIEJJTkFSSUVTX1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IGJpbmFyaWVzUGF0aCAhPSBudWxsIDogIUJJTkFSSUVTX1BBVEhfRURFRkFVTFQuZXF1YWxzKGJpbmFyaWVzUGF0aCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlyZXR1cm4gUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlc1BhdGggIT0gbnVsbCA6ICFSRVNPVVJDRVNfUEFUSF9FREVGQVVMVC5lcXVhbHMocmVzb3VyY2VzUGF0aCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGdldExvb3NlQXBwKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1VSSToKLQkJCQlzZXRVcmkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlzZXRCaW5hcmllc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJc2V0UmVzb3VyY2VzUGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFA6Ci0JCQkJc2V0TG9vc2VBcHAoKExvb3NlQXBwbGljYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19VUkk6Ci0JCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlzZXRCaW5hcmllc1BhdGgoQklOQVJJRVNfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJc2V0UmVzb3VyY2VzUGF0aChSRVNPVVJDRVNfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCXNldExvb3NlQXBwKChMb29zZUFwcGxpY2F0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJpOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJpbmFyaWVzUGF0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmluYXJpZXNQYXRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZXNQYXRoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZXNQYXRoKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTG9vc2VBcmNoaXZlSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUNvbmZpZ3VyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQ29uZmlndXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiZGU2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQ29uZmlndXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIExvb3NlQ29uZmlndXJhdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExvb3NlQ29uZmlndXJhdGlvbiwgRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFwcGxpY2F0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VDb25maWd1cmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFLmdldExvb3NlQ29uZmlndXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFwcGxpY2F0aW9ucygpIHsKLQkJaWYgKGFwcGxpY2F0aW9ucyA9PSBudWxsKSB7Ci0JCQlhcHBsaWNhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTG9vc2VBcHBsaWNhdGlvbi5jbGFzcywgdGhpcywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGFwcGxpY2F0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFwcGxpY2F0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCWdldEFwcGxpY2F0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXBwbGljYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUzoKLQkJCQlnZXRBcHBsaWNhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUzoKLQkJCQlyZXR1cm4gYXBwbGljYXRpb25zICE9IG51bGwgJiYgIWFwcGxpY2F0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0xvb3NlQ29uZmlndXJhdGlvbkltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VMaWJyYXJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUxpYnJhcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTJkMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUxpYnJhcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIExvb3NlTGlicmFyeUltcGwgZXh0ZW5kcyBMb29zZUFyY2hpdmVJbXBsIGltcGxlbWVudHMgTG9vc2VMaWJyYXJ5LCBMb29zZUFyY2hpdmUgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMb29zZUxpYnJhcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9vc2VMaWJyYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTG9vc2VXQVJGaWxlIGdldExvb3NlV0FSKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChMb29zZVdBUkZpbGUpZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb29zZVdBUihMb29zZVdBUkZpbGUgbmV3TG9vc2VXQVIpIHsKLQkJaWYgKG5ld0xvb3NlV0FSICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiAmJiBuZXdMb29zZVdBUiAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0xvb3NlV0FSKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdMb29zZVdBUiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMb29zZVdBUikuZUludmVyc2VBZGQodGhpcywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTLCBMb29zZVdBUkZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0xvb3NlV0FSLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIsIG5ld0xvb3NlV0FSLCBuZXdMb29zZVdBUikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9BUFA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX0FQUCwgbXNncyk7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX0FQUDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfQVBQLCBtc2dzKTsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTLCBMb29zZVdBUkZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19CSU5BUklFU19QQVRIOgotCQkJCXJldHVybiBnZXRCaW5hcmllc1BhdGgoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX1JFU09VUkNFU19QQVRIOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZXNQYXRoKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGdldExvb3NlQXBwKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6Ci0JCQkJcmV0dXJuIGdldExvb3NlV0FSKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJcmV0dXJuIEJJTkFSSUVTX1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IGJpbmFyaWVzUGF0aCAhPSBudWxsIDogIUJJTkFSSUVTX1BBVEhfRURFRkFVTFQuZXF1YWxzKGJpbmFyaWVzUGF0aCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlyZXR1cm4gUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlc1BhdGggIT0gbnVsbCA6ICFSRVNPVVJDRVNfUEFUSF9FREVGQVVMVC5lcXVhbHMocmVzb3VyY2VzUGF0aCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGdldExvb3NlQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VXQVIoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19CSU5BUklFU19QQVRIOgotCQkJCXNldEJpbmFyaWVzUGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlzZXRSZXNvdXJjZXNQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX0FQUDoKLQkJCQlzZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgotCQkJCXNldExvb3NlV0FSKChMb29zZVdBUkZpbGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19VUkk6Ci0JCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fQklOQVJJRVNfUEFUSDoKLQkJCQlzZXRCaW5hcmllc1BhdGgoQklOQVJJRVNfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJc2V0UmVzb3VyY2VzUGF0aChSRVNPVVJDRVNfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfQVBQOgotCQkJCXNldExvb3NlQXBwKChMb29zZUFwcGxpY2F0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQlzZXRMb29zZVdBUigoTG9vc2VXQVJGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9Mb29zZUxpYnJhcnlJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTW9kdWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZU1vZHVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk2YjAxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTW9kdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgTG9vc2VNb2R1bGVJbXBsIGV4dGVuZHMgTG9vc2VBcmNoaXZlSW1wbCBpbXBsZW1lbnRzIExvb3NlTW9kdWxlLCBMb29zZUFyY2hpdmUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRERCgpIDxlbT5BbHQgREQ8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRBbHRERCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxUX0REX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0REQgPSBBTFRfRERfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VNb2R1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9vc2VNb2R1bGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0REQoKSB7Ci0JCXJldHVybiBhbHRERDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRERChTdHJpbmcgbmV3QWx0REQpIHsKLQkJU3RyaW5nIG9sZEFsdEREID0gYWx0REQ7Ci0JCWFsdEREID0gbmV3QWx0REQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0FMVF9ERCwgb2xkQWx0REQsIGFsdEREKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fTE9PU0VfQVBQOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0xPT1NFX0FQUCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19MT09TRV9BUFA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fTE9PU0VfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fTE9PU0VfQVBQOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTLCBMb29zZUFwcGxpY2F0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJcmV0dXJuIGdldEJpbmFyaWVzUGF0aCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzUGF0aCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGdldExvb3NlQXBwKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gZ2V0QWx0REQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJcmV0dXJuIEJJTkFSSUVTX1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IGJpbmFyaWVzUGF0aCAhPSBudWxsIDogIUJJTkFSSUVTX1BBVEhfRURFRkFVTFQuZXF1YWxzKGJpbmFyaWVzUGF0aCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX1JFU09VUkNFU19QQVRIOgotCQkJCXJldHVybiBSRVNPVVJDRVNfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VzUGF0aCAhPSBudWxsIDogIVJFU09VUkNFU19QQVRIX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZXNQYXRoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fTE9PU0VfQVBQOgotCQkJCXJldHVybiBnZXRMb29zZUFwcCgpICE9IG51bGw7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gQUxUX0REX0VERUZBVUxUID09IG51bGwgPyBhbHRERCAhPSBudWxsIDogIUFMVF9ERF9FREVGQVVMVC5lcXVhbHMoYWx0REQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlzZXRCaW5hcmllc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlzZXRSZXNvdXJjZXNQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fTE9PU0VfQVBQOgotCQkJCXNldExvb3NlQXBwKChMb29zZUFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHRERCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19VUkk6Ci0JCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19CSU5BUklFU19QQVRIOgotCQkJCXNldEJpbmFyaWVzUGF0aChCSU5BUklFU19QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fTE9PU0VfQVBQOgotCQkJCXNldExvb3NlQXBwKChMb29zZUFwcGxpY2F0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKEFMVF9ERF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhbHRERDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWx0REQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Mb29zZU1vZHVsZUltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VXQVJGaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZVdBUkZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MzBkYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZVdBUkZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBMb29zZVdBUkZpbGVJbXBsIGV4dGVuZHMgTG9vc2VNb2R1bGVJbXBsIGltcGxlbWVudHMgTG9vc2VXQVJGaWxlLCBMb29zZU1vZHVsZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGxvb3NlTGlicyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VXQVJGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFLmdldExvb3NlV0FSRmlsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV0FSKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRMb29zZUxpYnMoKSB7Ci0JCWlmIChsb29zZUxpYnMgPT0gbnVsbCkgewotCQkJbG9vc2VMaWJzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTG9vc2VMaWJyYXJ5LmNsYXNzLCB0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIpOwotCQl9Ci0JCXJldHVybiBsb29zZUxpYnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9BUFA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9BUFAsIG1zZ3MpOwotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvb3NlTGlicygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0FQUDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0FQUCwgbXNncyk7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TG9vc2VMaWJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJcmV0dXJuIGdldEJpbmFyaWVzUGF0aCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX1JFU09VUkNFU19QQVRIOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZXNQYXRoKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfQVBQOgotCQkJCXJldHVybiBnZXRMb29zZUFwcCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gZ2V0QWx0REQoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTOgotCQkJCXJldHVybiBnZXRMb29zZUxpYnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX1VSSToKLQkJCQlzZXRVcmkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJc2V0QmluYXJpZXNQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlzZXRSZXNvdXJjZXNQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9BUFA6Ci0JCQkJc2V0TG9vc2VBcHAoKExvb3NlQXBwbGljYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19BTFRfREQ6Ci0JCQkJc2V0QWx0REQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJZ2V0TG9vc2VMaWJzKCkuY2xlYXIoKTsKLQkJCQlnZXRMb29zZUxpYnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlzZXRCaW5hcmllc1BhdGgoQklOQVJJRVNfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9BUFA6Ci0JCQkJc2V0TG9vc2VBcHAoKExvb3NlQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHRERChBTFRfRERfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTOgotCQkJCWdldExvb3NlTGlicygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlyZXR1cm4gQklOQVJJRVNfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gYmluYXJpZXNQYXRoICE9IG51bGwgOiAhQklOQVJJRVNfUEFUSF9FREVGQVVMVC5lcXVhbHMoYmluYXJpZXNQYXRoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlyZXR1cm4gUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlc1BhdGggIT0gbnVsbCA6ICFSRVNPVVJDRVNfUEFUSF9FREVGQVVMVC5lcXVhbHMocmVzb3VyY2VzUGF0aCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfQVBQOgotCQkJCXJldHVybiBnZXRMb29zZUFwcCgpICE9IG51bGw7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fQUxUX0REOgotCQkJCXJldHVybiBBTFRfRERfRURFRkFVTFQgPT0gbnVsbCA/IGFsdEREICE9IG51bGwgOiAhQUxUX0REX0VERUZBVUxULmVxdWFscyhhbHRERCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUzoKLQkJCQlyZXR1cm4gbG9vc2VMaWJzICE9IG51bGwgJiYgIWxvb3NlTGlicy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0xvb3NlV0FSRmlsZUltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZWNvbmZpZ0ZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZGQzNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZWNvbmZpZ0ZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIExvb3NlY29uZmlnRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBMb29zZWNvbmZpZ0ZhY3RvcnksIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2Vjb25maWdGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OOiByZXR1cm4gY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWTogcmV0dXJuIGNyZWF0ZUxvb3NlTGlicmFyeSgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFOiByZXR1cm4gY3JlYXRlTG9vc2VNb2R1bGUoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0NPTkZJR1VSQVRJT046IHJldHVybiBjcmVhdGVMb29zZUNvbmZpZ3VyYXRpb24oKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFOiByZXR1cm4gY3JlYXRlTG9vc2VXQVJGaWxlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2VBcHBsaWNhdGlvbiBjcmVhdGVMb29zZUFwcGxpY2F0aW9uKCkgewotCQlMb29zZUFwcGxpY2F0aW9uSW1wbCBsb29zZUFwcGxpY2F0aW9uID0gbmV3IExvb3NlQXBwbGljYXRpb25JbXBsKCk7Ci0JCXJldHVybiBsb29zZUFwcGxpY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZUxpYnJhcnkgY3JlYXRlTG9vc2VMaWJyYXJ5KCkgewotCQlMb29zZUxpYnJhcnlJbXBsIGxvb3NlTGlicmFyeSA9IG5ldyBMb29zZUxpYnJhcnlJbXBsKCk7Ci0JCXJldHVybiBsb29zZUxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlV0FSRmlsZSBjcmVhdGVMb29zZVdBUkZpbGUoKSB7Ci0JCUxvb3NlV0FSRmlsZUltcGwgbG9vc2VXQVJGaWxlID0gbmV3IExvb3NlV0FSRmlsZUltcGwoKTsKLQkJcmV0dXJuIGxvb3NlV0FSRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2VNb2R1bGUgY3JlYXRlTG9vc2VNb2R1bGUoKSB7Ci0JCUxvb3NlTW9kdWxlSW1wbCBsb29zZU1vZHVsZSA9IG5ldyBMb29zZU1vZHVsZUltcGwoKTsKLQkJcmV0dXJuIGxvb3NlTW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZUNvbmZpZ3VyYXRpb24gY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uKCkgewotCQlMb29zZUNvbmZpZ3VyYXRpb25JbXBsIGxvb3NlQ29uZmlndXJhdGlvbiA9IG5ldyBMb29zZUNvbmZpZ3VyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBsb29zZUNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlY29uZmlnUGFja2FnZSBnZXRMb29zZWNvbmZpZ1BhY2thZ2UoKSB7Ci0JCXJldHVybiAoTG9vc2Vjb25maWdQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBMb29zZWNvbmZpZ1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vTG9vc2Vjb25maWdGYWN0b3J5SW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5NzljYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5KYXZhUmVmUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTG9vc2Vjb25maWdQYWNrYWdlLAotICogICAgICAgICAgRVBhY2thZ2Uge30KLSAqLwotcHVibGljIGNsYXNzIExvb3NlY29uZmlnUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBMb29zZWNvbmZpZ1BhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb29zZUFwcGxpY2F0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb29zZUFyY2hpdmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvb3NlTGlicmFyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9vc2VNb2R1bGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9vc2VXQVJGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByaXZhdGUgTG9vc2Vjb25maWdQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgTG9vc2Vjb25maWdGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9vc2Vjb25maWdQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChMb29zZWNvbmZpZ1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTG9vc2Vjb25maWdQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJTG9vc2Vjb25maWdQYWNrYWdlSW1wbCB0aGVMb29zZWNvbmZpZ1BhY2thZ2UgPSAoTG9vc2Vjb25maWdQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgTG9vc2Vjb25maWdQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25hcmNoaXZlUGFja2FnZUltcGwgdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UgPSAoQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25hcmNoaXZlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXZhUmVmUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKSA6IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVMb29zZWNvbmZpZ1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25hcmNoaXZlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YVJlZlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUxvb3NlY29uZmlnUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhUmVmUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVMb29zZWNvbmZpZ1BhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUxvb3NlY29uZmlnUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlQXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBsb29zZUFwcGxpY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExvb3NlQXBwbGljYXRpb25fTG9vc2VBcmNoaXZlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxvb3NlQXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlQXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGxvb3NlQXJjaGl2ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfVXJpKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9vc2VBcmNoaXZlX0JpbmFyaWVzUGF0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxvb3NlQXJjaGl2ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvb3NlQXJjaGl2ZV9SZXNvdXJjZXNQYXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9vc2VBcmNoaXZlX0xvb3NlQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb29zZUxpYnJhcnkoKSB7Ci0JCXJldHVybiBsb29zZUxpYnJhcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9vc2VMaWJyYXJ5X0xvb3NlV0FSKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb29zZVdBUkZpbGUoKSB7Ci0JCXJldHVybiBsb29zZVdBUkZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9vc2VXQVJGaWxlX0xvb3NlTGlicygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxvb3NlV0FSRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9vc2VNb2R1bGUoKSB7Ci0JCXJldHVybiBsb29zZU1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb29zZU1vZHVsZV9BbHRERCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxvb3NlTW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBsb29zZUNvbmZpZ3VyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9vc2VDb25maWd1cmF0aW9uX0FwcGxpY2F0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZWNvbmZpZ0ZhY3RvcnkgZ2V0TG9vc2Vjb25maWdGYWN0b3J5KCkgewotCQlyZXR1cm4gKExvb3NlY29uZmlnRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWxvb3NlQXBwbGljYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9PU0VfQVBQTElDQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGxvb3NlQXBwbGljYXRpb25FQ2xhc3MsIExPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUyk7Ci0KLQkJbG9vc2VBcmNoaXZlRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPT1NFX0FSQ0hJVkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvb3NlQXJjaGl2ZUVDbGFzcywgTE9PU0VfQVJDSElWRV9fVVJJKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb29zZUFyY2hpdmVFQ2xhc3MsIExPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvb3NlQXJjaGl2ZUVDbGFzcywgTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEgpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxvb3NlQXJjaGl2ZUVDbGFzcywgTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQKTsKLQotCQlsb29zZUxpYnJhcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9PU0VfTElCUkFSWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9vc2VMaWJyYXJ5RUNsYXNzLCBMT09TRV9MSUJSQVJZX19MT09TRV9XQVIpOwotCi0JCWxvb3NlTW9kdWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPT1NFX01PRFVMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9vc2VNb2R1bGVFQ2xhc3MsIExPT1NFX01PRFVMRV9fQUxUX0REKTsKLQotCQlsb29zZUNvbmZpZ3VyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9PU0VfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9vc2VDb25maWd1cmF0aW9uRUNsYXNzLCBMT09TRV9DT05GSUdVUkFUSU9OX19BUFBMSUNBVElPTlMpOwotCi0JCWxvb3NlV0FSRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9XQVJfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9vc2VXQVJGaWxlRUNsYXNzLCBMT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJbG9vc2VBcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExvb3NlQXJjaGl2ZSgpKTsKLQkJbG9vc2VMaWJyYXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TG9vc2VBcmNoaXZlKCkpOwotCQlsb29zZU1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExvb3NlQXJjaGl2ZSgpKTsKLQkJbG9vc2VXQVJGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TG9vc2VNb2R1bGUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhsb29zZUFwcGxpY2F0aW9uRUNsYXNzLCBMb29zZUFwcGxpY2F0aW9uLmNsYXNzLCAiTG9vc2VBcHBsaWNhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VBcHBsaWNhdGlvbl9Mb29zZUFyY2hpdmVzKCksIHRoaXMuZ2V0TG9vc2VBcmNoaXZlKCksIHRoaXMuZ2V0TG9vc2VBcmNoaXZlX0xvb3NlQXBwKCksICJsb29zZUFyY2hpdmVzIiwgbnVsbCwgMCwgLTEsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsb29zZUFyY2hpdmVFQ2xhc3MsIExvb3NlQXJjaGl2ZS5jbGFzcywgIkxvb3NlQXJjaGl2ZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZUFyY2hpdmVfVXJpKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmkiLCBudWxsLCAwLCAxLCBMb29zZUFyY2hpdmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvb3NlQXJjaGl2ZV9CaW5hcmllc1BhdGgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImJpbmFyaWVzUGF0aCIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9vc2VBcmNoaXZlX1Jlc291cmNlc1BhdGgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlc1BhdGgiLCBudWxsLCAwLCAxLCBMb29zZUFyY2hpdmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldExvb3NlQXJjaGl2ZV9Mb29zZUFwcCgpLCB0aGlzLmdldExvb3NlQXBwbGljYXRpb24oKSwgdGhpcy5nZXRMb29zZUFwcGxpY2F0aW9uX0xvb3NlQXJjaGl2ZXMoKSwgImxvb3NlQXBwIiwgbnVsbCwgMCwgMSwgTG9vc2VBcmNoaXZlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWFkZEVPcGVyYXRpb24obG9vc2VBcmNoaXZlRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzTW9kdWxlIik7Ci0KLQkJaW5pdEVDbGFzcyhsb29zZUxpYnJhcnlFQ2xhc3MsIExvb3NlTGlicmFyeS5jbGFzcywgIkxvb3NlTGlicmFyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VMaWJyYXJ5X0xvb3NlV0FSKCksIHRoaXMuZ2V0TG9vc2VXQVJGaWxlKCksIHRoaXMuZ2V0TG9vc2VXQVJGaWxlX0xvb3NlTGlicygpLCAibG9vc2VXQVIiLCBudWxsLCAwLCAxLCBMb29zZUxpYnJhcnkuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsb29zZU1vZHVsZUVDbGFzcywgTG9vc2VNb2R1bGUuY2xhc3MsICJMb29zZU1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9vc2VNb2R1bGVfQWx0REQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFsdEREIiwgbnVsbCwgMCwgMSwgTG9vc2VNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsb29zZUNvbmZpZ3VyYXRpb25FQ2xhc3MsIExvb3NlQ29uZmlndXJhdGlvbi5jbGFzcywgIkxvb3NlQ29uZmlndXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VDb25maWd1cmF0aW9uX0FwcGxpY2F0aW9ucygpLCB0aGlzLmdldExvb3NlQXBwbGljYXRpb24oKSwgbnVsbCwgImFwcGxpY2F0aW9ucyIsIG51bGwsIDAsIC0xLCBMb29zZUNvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsb29zZVdBUkZpbGVFQ2xhc3MsIExvb3NlV0FSRmlsZS5jbGFzcywgIkxvb3NlV0FSRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VXQVJGaWxlX0xvb3NlTGlicygpLCB0aGlzLmdldExvb3NlTGlicmFyeSgpLCB0aGlzLmdldExvb3NlTGlicmFyeV9Mb29zZVdBUigpLCAibG9vc2VMaWJzIiwgbnVsbCwgMCwgLTEsIExvb3NlV0FSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQl9Ci0KLX0gLy9Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC91dGlsL0xvb3NlY29uZmlnQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWRmYTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIExvb3NlY29uZmlnQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwge30KLSAqLwotcHVibGljIGNsYXNzIExvb3NlY29uZmlnQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMb29zZWNvbmZpZ1BhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlY29uZmlnQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvb3NlY29uZmlnU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IExvb3NlY29uZmlnU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUFwcGxpY2F0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9vc2VBcmNoaXZlKExvb3NlQXJjaGl2ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9vc2VBcmNoaXZlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9vc2VMaWJyYXJ5KExvb3NlTGlicmFyeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9vc2VMaWJyYXJ5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9vc2VNb2R1bGUoTG9vc2VNb2R1bGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvb3NlTW9kdWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9vc2VDb25maWd1cmF0aW9uKExvb3NlQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9vc2VXQVJGaWxlKExvb3NlV0FSRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9vc2VXQVJGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuIEl0J3MgdXNlZnVsIHRvCi0JICogaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb29zZUFwcGxpY2F0aW9uQWRhcHRlcigpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb29zZUFyY2hpdmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb29zZUxpYnJhcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb29zZVdBUkZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlTW9kdWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ1N3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ1N3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTIyNTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIExvb3NlY29uZmlnU3dpdGNoIHt9Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb29zZWNvbmZpZ1N3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTG9vc2Vjb25maWdQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZWNvbmZpZ1N3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT046IHsKLQkJCQlMb29zZUFwcGxpY2F0aW9uIGxvb3NlQXBwbGljYXRpb24gPSAoTG9vc2VBcHBsaWNhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9vc2VBcHBsaWNhdGlvbihsb29zZUFwcGxpY2F0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMb29zZUFyY2hpdmUobG9vc2VBcHBsaWNhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRTogewotCQkJCUxvb3NlQXJjaGl2ZSBsb29zZUFyY2hpdmUgPSAoTG9vc2VBcmNoaXZlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMb29zZUFyY2hpdmUobG9vc2VBcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZOiB7Ci0JCQkJTG9vc2VMaWJyYXJ5IGxvb3NlTGlicmFyeSA9IChMb29zZUxpYnJhcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlTGlicmFyeShsb29zZUxpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxvb3NlQXJjaGl2ZShsb29zZUxpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRTogewotCQkJCUxvb3NlTW9kdWxlIGxvb3NlTW9kdWxlID0gKExvb3NlTW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMb29zZU1vZHVsZShsb29zZU1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTG9vc2VBcmNoaXZlKGxvb3NlTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OOiB7Ci0JCQkJTG9vc2VDb25maWd1cmF0aW9uIGxvb3NlQ29uZmlndXJhdGlvbiA9IChMb29zZUNvbmZpZ3VyYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlQ29uZmlndXJhdGlvbihsb29zZUNvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFOiB7Ci0JCQkJTG9vc2VXQVJGaWxlIGxvb3NlV0FSRmlsZSA9IChMb29zZVdBUkZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlV0FSRmlsZShsb29zZVdBUkZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxvb3NlTW9kdWxlKGxvb3NlV0FSRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTG9vc2VBcmNoaXZlKGxvb3NlV0FSRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUFyY2hpdmUoTG9vc2VBcmNoaXZlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUxpYnJhcnkoTG9vc2VMaWJyYXJ5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZVdBUkZpbGUoTG9vc2VXQVJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZU1vZHVsZShMb29zZU1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VDb25maWd1cmF0aW9uKExvb3NlQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Mb29zZWNvbmZpZ1N3aXRjaAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2NjJkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcCI+PC9wYWNrYWdlPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW1wbCI+PC9wYWNrYWdlPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZCI+PC9wYWNrYWdlPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbiI+PC9wYWNrYWdlPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudCI+PC9wYWNrYWdlPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQiPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuanNwIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAudXRpbCI+PC9wYWNrYWdlPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vYXBwbGljYXRpb25jbGllbnR2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2FwcGxpY2F0aW9uY2xpZW50dmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGQxOTk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vYXBwbGljYXRpb25jbGllbnR2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoaXMgcHJvcGVydGllcyBmaWxlIGhvbGRzIGFsbCB0aGUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIHRoZSBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdAotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcwotIyA6RW5kOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpFbmQ6Ci0KLQotRVJST1JfQVBQTElDQVRJT05DTElFTlRfSU5WQUxJRF9BUFBDTElFTlRfRklMRT1DSEtKMTAwMEU6IFZhbGlkYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBmaWxlIGlzIG5vdCB2YWxpZC4gRW5zdXJlIHRoYXQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyB2YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotRVJST1JfQVBQQ0xJRU5UX1ZBTElEQVRJT05fRkFJTEVEPUNIS0oxMDAxRTogVmFsaWRhdGlvbiBmYWlsZWQ6Ci0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUVSUk9SX0VKQl9SRUZTPUNIS0oxMDAyRTogVW5yZXNvbHZhYmxlIEVKQiByZWZlcmVuY2VzIGluIHswfTsKLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotSU5WQUxJRF9ERD1DSEtKMTAwM0U6IFRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBoYXMgYW4gaW52YWxpZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfQVBQQ0xJRU5UX01JU1NJTkdfVVJJPUNIS0oxMDA0RTogVGhlIFVSSSwgezB9LCBkb2VzIG5vdCBtYXRjaCBhbnl0aGluZyBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50IGZpbGUuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9ERF9QQVJTRV9MSU5FQ09MPUNIS0oxMDA1RTogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgbG9hZGVkIGR1ZSB0byBhbiB1bmtub3duIHN5bnRheCBlcnJvci4gVGhlIGJhZCBzZWN0aW9uIHN0YXJ0cyBhdCBsaW5lIHswfSwgY29sdW1uIHsxfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkU9Q0hLSjEwMDZFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIHVua25vd24gc3ludGF4IGVycm9yLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRERfUEFSU0VfTk9JTkZPPUNIS0oxMDA3RTogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgbG9hZGVkIGR1ZSB0byBhbiB1bmtub3duIHN5bnRheCBlcnJvci4gVGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGhlbHAgaWRlbnRpZnkgdGhlIGJhZCBzZWN0aW9uLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRERfQ0FOTk9UX09QRU5fREQ9Q0hLSjEwMDhFOiBWYWxpZGF0aW9uIGNhbm5vdCBjb21wbGV0ZSBiZWNhdXNlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY2Fubm90IGJlIG9wZW5lZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotQVBQQ0xJRU5UX0RVUF9SRVNfRU5WX1JFRl9FUlJPUl89SVdBRTAwMDJFIER1cGxpY2F0ZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgInswfSIgaW4gYXBwbGljYXRpb24tY2xpZW50LnhtbC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotQVBQQ0xJRU5UX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfPUlXQUUwMDAzRSBEb2N1bWVudCB0eXBlIHZlcnNpb24gInswfSIgZm9yIGFwcGxpY2F0aW9uLWNsaWVudC54bWwgaW4gcHJvamVjdCAiezF9IiBuZWVkcyB0byBiZSB2ZXJzaW9uICJ7Mn0iLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRFVQX0VKQl9SRUZfRVJST1JfPUlXQUUwMDA0RSBEdXBsaWNhdGUgZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZSAiezB9IiBpbiBhcHBsaWNhdGlvbi1jbGllbnQueG1sLgotQVBQQ0xJRU5UX01BSU5fQ0xBU1NfRVJST1JfPUlXQUUwMDM1RSBUaGUgTWFpbi1DbGFzcyBhdHRyaWJ1dGUgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2OGZhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoaXMgcHJvcGVydGllcyBmaWxlIGhvbGQgYWxsIHRoZSBleHRlcm5hbGlzZWQgc3RyaW5ncyBmb3IgZVRvb2xzIAotIyBFQVIgVmFsaWRhdGlvbiBwcm9qZWN0Ci0jCi0jIE1lc3NhZ2VzIHNob3VsZCBiZSBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBhdCAKLSMgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCi0jCi0jIEJyaWVmbHk6Ci0jICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgotIwotIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKLSMgICAgIENIS1cgKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKLSMKLSMgTWVzc2FnZSBudW1iZXJzIGFyZSBmb3VyIGRpZ2l0IG51bWJlcnMsIGZyb20gJzAwMDAnIHRvICc5OTk5JywgaW5jbHVzaXZlLgotIyBNZXNzYWdlIG51bWJlcnMgYXJlIGZpbGxlZCB0byB0aGUgbGVmdCB3aXRoICcwJywgdG8gYSB3aWR0aCBvZiA0LgotIwotIyBWYWxpZCBtZXNzYWdlIHR5cGUgY29kZXMgYXJlOgotIyAgICAgSSAoSW5mb3JtYXRpb25hbCkKLSMgICAgIFcgKFdhcm5pbmcpCi0jICAgICBFIChFcnJvcikKLSMKLSMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi9lYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKLSMgOkVuZDogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6RW5kOgotIwotIyAyOS1KdW5lLTIwMDE6Ci0jICBUaGlzIGZpbGUgaGFzIGJlZW4gdGVzdGVkIHVzaW5nIHRoZSBQcm9jZXNzTXNnRmlsZSB0b29sLCB3cml0dGVuIGJ5IAotIyAgSGFueSBTYWxlbSBhbmQgb3duZWQgYnkgRGVubmlzIEhlYmVydC4gIEFueSBmdXR1cmUgY2hhbmdlcyBzaG91bGQgCi0jICBhbHNvIGJlIHZlcmlmaWVkIHVzaW5nIHRoaXMgdG9vbC4gIFBsZWFzZSBjb250YWN0IERlbm5pcyAKLSMgIChoZWJlcnRAdXMuaWJtLmNvbSBvciBUL0wgNTQzLTI1MjApIGZvciBtb3JlIGluZm9ybWF0aW9uLgotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI05PVEFNU0cKLXZhbGlkYXRvci5uYW1lPUVBUiBWYWxpZGF0b3IKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX1ZBTElEQVRJT05fRkFJTEVEPUNIS0oxMDAwRTogRUFSIFZhbGlkYXRpb24gZmFpbGVkOiB7MH0KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0lOVkFMSURfRUFSX0ZJTEU9Q0hLSjEwMDFFOiBUaGUgRUFSIHByb2plY3QgezB9IGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVM9Q0hLSjEwMDJFOiBEdXBsaWNhdGUgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfRUFSX05PX01PRFVMRV9VUkk9Q0hLSjEwMDNFOiBBIG1vZHVsZSBoYXMgYmVlbiBkZWZpbmVkIHdpdGggbm8gVVJJLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX0VBUl9NSVNTSU5HX1VSST1DSEtKMTAwNEU6IFRoZSBVUkksIHswfSwgZG9lcyBub3QgbWF0Y2ggYW55dGhpbmcgaW4gdGhlIEVBUiBmaWxlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FQVJfRERfUEFSU0VfTElORUNPTD1DSEtKMTAwNUU6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZC4gVGhlIHN0YXJ0IG9mIHRoZSBiYWQgc2VjdGlvbiBpcyBhdCBsaW5lIHswfSwgY29sdW1uIHsxfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRUFSX0REX1BBUlNFX0xJTkU9Q0hLSjEwMDZFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRoZSBzdGFydCBvZiB0aGUgYmFkIHNlY3Rpb24gaXMgYXQgbGluZSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVBUl9ERF9QQVJTRV9OT0lORk89Q0hLSjEwMDdFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVBUl9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMTAwOEU6IENhbm5vdCBvcGVuIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIGVycm9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVVSSV9DT05UQUlOU19TUEFDRVNfRVJST1JfPUlXQUUwMDA1RSBUaGUgVVJJIHswfSBjb250YWlucyBhIHNwYWNlLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBiZWNhdXNlIGl0IGNhbm5vdCBiZSByZWZlcmVuY2VkIGZyb20gYSBtYW5pZmVzdCBmaWxlLgotTUVTU0FHRV9FQVJfRFVQTElDQVRFX1VSSV9FUlJPUl89SVdBRTAwMDZFIFRoZSBtb2R1bGUgezB9IGhhcyBkdXBsaWNhdGUgdXJpIGluIEVBUjogezF9LgotTUVTU0FHRV9FQVJfRFVQSUNBVEVfUk9PVENPTlRFWFRfRVJST1JfPUlXQUUwMDA3RSBTYW1lIGNvbnRleHQgcm9vdCAiezB9IiBleGlzdHMgaW4gV2ViIG1vZHVsZXMgInsxfSIgYW5kICJ7Mn0iLgotTUVTU0FHRV9FTVBUWV9BTFRfRERfRVJST1JfPUlXQUUwMDA5RSBUaGUgbW9kdWxlIHswfSBoYXMgZW1wdHkgPGFsdC1kZD4gdGFnIGluIEVBUiB7MX0uICBUaGUgdGFnIHNob3VsZCBiZSByZW1vdmVkIG9yIHRoZSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQuCi1EVVBMSUNBVEVfVVRJTEpBUl9GT1JfUFJPSkVDVF9OQU1FX0VSUk9SXz1JV0FFMDAxMEUgPVRoZSBwcm9qZWN0IHswfSBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezF9IGhhcyBkdXBsaWNhdGUgdXRpbGl0eSBKQVIgVVJJIHsyfS4KLURVUExJQ0FURV9NT0RVTEVfRk9SX1BST0pFQ1RfTkFNRV9FUlJPUl89SVdBRTAwMTFFIFRoZSBwcm9qZWN0IHswfSBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezF9IGhhcyBkdXBsaWNhdGUgbW9kdWxlIG5hbWUgezJ9LgotTUVTU0FHRV9VVElMX1VSSV9OQU1FX0NPTExJU0lPTl9FUlJPUl89SVdBRTAwMTJFIFRoZSBtb2R1bGUgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIHNhbWUgbmFtZSBhcyB1dGlsaXR5IEpBUiBVUkkuCi1NRVNTQUdFX1VUSUxfUFJPSkVDVF9OQU1FX0NPTExJU0lPTl9FUlJPUl89SVdBRTAwMTNFIFRoZSBtb2R1bGUgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIHNhbWUgbmFtZSBhcyB1dGlsaXR5IEpBUiBwcm9qZWN0IG5hbWUuCi1FUlJPUl9SRUFESU5HX01BTklGRVNUX0VSUk9SXz1JV0FFMDAxNEUgQW4gZXJyb3Igb2NjdXJyZWQgdmFsaWRhdGluZyB0aGUgTUFOSUZFU1QuTUYgZmlsZSBpbiBhcmNoaXZlIHswfS4KLU1BTklGRVNUX0xJTkVfRU5EX0VSUk9SXz1JV0FFMDAxNUUgVGhlIE1BTklGRVNULk1GIGZpbGUgaW4gYXJjaGl2ZSB7MH0gZG9lcyBub3QgZW5kIHdpdGggYSBuZXdsaW5lLgotTUFOSUZFU1RfTElORV9FWENFRURTX0xFTkdUSF9FUlJPUl89SVdBRTAwMTZFIExpbmUgezB9IGluIHRoZSBNQU5JRkVTVC5NRiBmaWxlIGluIGFyY2hpdmUgezF9IGV4Y2VlZHMgdGhlIHNwZWNpZmljYXRpb24gbGltaXQgb2YgNzIgYnl0ZXMuCi0KLUlOVkFMSURfVVJJX0ZPUl9NT0RVTEVfRVJST1JfPUlXQUUwMDE3RSBUaGUgbW9kdWxlIHswfSBoYXMgYSB3cm9uZyBkZWZhdWx0IGV4dGVuc2lvbiAoLmphciBmb3IgRUpCIG1vZHVsZXMgYW5kIC53YXIgZm9yIFdlYiBtb2R1bGVzKS4KLUVBUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXz1JV0FFMDAxOEUgRG9jdW1lbnQgdHlwZSB2ZXJzaW9uICJ7MH0iIGZvciBhcHBsaWNhdGlvbi54bWwgaW4gcHJvamVjdCAiezF9IiBuZWVkcyB0byBiZSB2ZXJzaW9uICJ7Mn0iLgotCi1NT0RVTEVfRERfUEFSU0VfTElORUNPTF9FUlJPUl89SVdBRTAwMTlFIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgbW9kdWxlIHswfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezF9LCBjb2x1bW4gezJ9LgotTU9EVUxFX0REX1BBUlNFX0xJTkVfRVJST1JfPUlXQUUwMDIwRSBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIG1vZHVsZSB7MH0gY291bGQgbm90IGJlIGxvYWRlZC4gVGhlIGJhZCBzZWN0aW9uIHN0YXJ0cyBhdCBsaW5lIHsxfQotTU9EVUxFX0REX1BBUlNFX05PSU5GT19FUlJPUl89SVdBRTAwMjFFIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgbW9kdWxlIHswfSBjb3VsZCBub3QgYmUgbG9hZGVkLgotRUpCX0JFQU5fRUpCX0xJTktfSU5URUZBQ0VfTUlTTUFUQ0hfRVJST1JfPUlXQUUwMDM3RSBUaGUgaW50ZXJmYWNlcyBvZiB0aGUgbGlua2VkIGVudGVycHJpc2UgYmVhbiB7MH0gZG8gbm90IG1hdGNoIHRob3NlIGluIEVKQiByZWYgezF9IGluIG1vZHVsZSB7Mn0uCi0KLSMgd2FybmluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSTklOR19NRVRBRk9MREVSX01JU1NJTkc9SVdBSjAwMDBXOiBNZXRhIGZvbGRlciB7MH0gbXVzdCBleGlzdCBpbiBwcm9qZWN0IHsxfS4KLVdBUk5JTkdfRklMRV9NSVNTSU5HPUlXQUowMDAxVzogezB9IG11c3QgZXhpc3QgaW4gcHJvamVjdCB7MX0uCi1NRVNTQUdFX0lOVkFMSURfQUxUX0REX1dBUk5fPUlXQUUwMDIyVyBUaGUgbW9kdWxlIHswfSBoYXMgYWx0LWRkIHsxfSwgYnV0IHRoZSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCBpbiBFQVIgezJ9LgotSU5WQUxJRF9NQU5JRkVTVF9DTEFTU1BBVEhfT05FX1dBUk5fPUlXQUUwMDIzVyBUaGUgTWFuaWZlc3QgQ2xhc3MtUGF0aCBpbiBhcmNoaXZlIHswfSBjb250YWlucyBhbiBlbnRyeSB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBpbiB0aGUgRUFSOiB7MX0uCi1JTlZBTElEX01BTklGRVNUX0NMQVNTUEFUSF9UV09fV0FSTl89SVdBRTAwMjRXIFRoZSBNYW5pZmVzdCBDbGFzcy1QYXRoIGZvciBhcmNoaXZlIHswfSBjb250YWlucyBhbiBlbnRyeSwgezF9LCB0aGF0IGlzIG5vdCByZXNvbHZhYmxlIHRvIGEgZmlsZSBvciBtb2R1bGUgaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb246IHsyfS4KLUlOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX0RFUEVOREVOQ1lfV0FSTl89SVdBRTAwMjVXIFRoZSBNYW5pZmVzdCBDbGFzcy1QYXRoIGluIG1vZHVsZSB7MH0gY29udGFpbnMgYW4gZW50cnksIHsxfSwgdGhhdCByZXNvbHZlcyB0byBhcmNoaXZlIHsyfS4gIFRoaXMgZGVwZW5kZW5jeSBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgSjJFRSBzcGVjaWZpY2F0aW9uLgotUFJPSkVDVF9JU19DTE9TRURfV0FSTl89SVdBRTAwMjZXIEVBUiBWYWxpZGF0aW9uIGNhbm5vdCBydW4gb24gY2xvc2VkIHByb2plY3Q6IHswfS4gT3BlbiB0aGUgcHJvamVjdCwgYW5kIHRyeSBhZ2Fpbi4KLVBST0pFQ1RfRE9FU19OT1RfRVhJU1RfV0FSTl89SVdBRTAwMjdXIFRoZSBwcm9qZWN0IHswfSBmb3IgbW9kdWxlIG9yIHV0aWxpdHkgSkFSIHsxfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezJ9IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi1NSVNTSU5HX1dFQk5BVFVSRV9GT1JNT0RVTEVfV0FSTl89SVdBRTAwMjhXIFRoZSB3ZWIgbW9kdWxlIHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezF9IGlzIG5vdCBhIEoyRUUgV2ViIHByb2plY3QuCi1ERVBSRUNBVEVEX0FCU1BBVEhTX1dBUk5fPUlXQUUwMDI5VyBUaGUgSUJNIGV4dGVuc2lvbnMgZmlsZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezB9IGNvbnRhaW5zIGRlcHJlY2F0ZWQgYWJzb2x1dGUgcGF0aHMuICBVc2UgdGhlIGFwcGxpY2F0aW9uIGVkaXRvciB0byBjbGVhbiB1cCB0aGUgZmlsZS4KLUlOVkFMSURfQ09OVEVYVFJPT1RfV0VCTU9EVUxFX1dBUk5fPUlXQUUwMDMwVyBUaGUgY29udGV4dCByb290IGZvciBXZWIgbW9kdWxlOiB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0OiB7MX0gZG9lcyBub3QgbWF0Y2ggdGhlIGNvbnRleHQgcm9vdCBpbiB3ZWIgcHJvamVjdCBzZXR0aW5ncyBvZiB7Mn0uCi1NSVNTSU5HX0NMSUVOVE5BVFVSRV9GT1JNT0RVTEVfV0FSTl89SVdBRTAwMzFXIFRoZSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlIHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q6ezF9IGlzIG5vdCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdC4KLU1JU1NJTkdfRUpCTkFUVVJFX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAzMlcgVGhlIEVKQiBtb2R1bGUgezB9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MX0gaXMgbm90IGFuIEVKQiBwcm9qZWN0LgotTUlTU0lOR19QUk9KRUNUX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAzM1cgVGhlIG1vZHVsZSB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBpcyBub3QgbWFwcGVkIHRvIGEgd29ya2JlbmNoIHByb2plY3QuICBVc2UgdGhlIGFwcGxpY2F0aW9uIGVkaXRvciB0byBjb3JyZWN0LgotSU5WQUxJRF9DQVNFX0ZPUl9NQU5JRkVTVF9FUlJPUl89SVdBRTAwMzhFIFRoZSBjYXNlIG9mIHRoZSBtYW5pZmVzdCBmaWxlIG5hbWUgInswfSIgaW4gYXJjaGl2ZSB7MX0gaW4gaW5jb3JyZWN0LiAgRmlsZSBuYW1lIG11c3QgYmUgIk1FVEEtSU5GL01BTklGRVNULk1GIiwgY2FzZSBzZW5zaXRpdmUuCi1VUklfQUxSRUFEWV9FWElTVFNfSU5fRUFSX1dBUk5fPUlXQUUwMDM5VyBQcm9qZWN0IHV0aWxpdHkgSkFSIFVSSSB7MH0gY29sbGlkZXMgd2l0aCBhbiBleGlzdGluZyBmaWxlIGluIHByb2plY3QgezF9LgotTUlTU0lOR19NT0RVTEVfRVhURU5TSU9OX0VSUk9SXz1JV0FFMDA0MEUgVGhlIGFwcGxpY2F0aW9uIGV4dGVuc2lvbiBpbiBFQVIgcHJvamVjdDogezB9IGlzIG1pc3NpbmcgbW9kdWxlIGV4dGVuc2lvbiBmb3IgbW9kdWxlIHByb2plY3Q6IHsxfS4KLVBST0pFQ1RfU0VSVkVSX1RBUkdFVF9ET0VTX05PVF9NQVRDSF9FQVI9VGhlIHRhcmdldCBzZXJ2ZXIgb2YgdGhlIG1vZHVsZSBwcm9qZWN0ICJ7MH0iIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgc2VydmVyIG9mIHRoZSBjb250YWluaW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCAiezF9IgotTk9fU0VSVkVSX1RBUkdFVF9NT0RVTEVfSU5fRUFSX1dJVEhfU0VSVkVSX1RBUkdFVD1UaGUgbW9kdWxlIHByb2plY3QgInswfSIgd2l0aCBubyB0YXJnZXQgc2VydmVyIGJlbG9uZ3MgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0ICJ7MX0iIHRoYXQgaGFzIGEgdGFyZ2V0IHNlcnZlcgotTk9fU0VSVkVSX1RBUkdFVF9PTl9FQVJfV0lUSF9NT0RVTEVfU0VSVkVSX1RBUkdFVFM9VGhlIGVhciBwcm9qZWN0ICJ7MH0iIHdpdGggbm8gdGFyZ2V0IHNlcnZlciBoYXMgbW9kdWxlIHByb2plY3QgInsxfSIgdGhhdCBoYXMgYSB0YXJnZXQgc2VydmVyCi1JTlZBTElEX0VBUl9TRVJWRVJfVEFSR0VUX0ZPUl8xNF9TUEVDX0xFVkVMPVRoZSBKMkVFIDEuNCBzcGVjaWZpY2F0aW9uIEVBUiBwcm9qZWN0ICJ7MH0iIGhhcyBhbiBpbmNvbXBhdGlibGUgdGFyZ2V0IHNlcnZlciAiezF9IgotSU5WQUxJRF9NT0RVTEVfU0VSVkVSX1RBUkdFVF9GT1JfMTRfU1BFQ19MRVZFTD1UaGUgSjJFRSAxLjQgc3BlY2lmaWNhdGlvbiBtb2R1bGUgcHJvamVjdCAiezB9IiBoYXMgYW4gaW5jb21wYXRpYmxlIHRhcmdldCBzZXJ2ZXIgInsxfSIuCi1NRVNTQUdFX0lOQ09NUEFUSUJMRV9TUEVDX1dBUk5JTkdfPUlXQUUwMDA4RSBUaGUgbW9kdWxlICJ7MH0iIGlzIGF0IGFuIGluY29tcGF0aWJsZSBKMkVFIHNwZWNpZmljYXRpb24gbGV2ZWwgdGhhbiB0aGF0IG9mIHRoZSAiezF9IiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uLgotRUFSX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1JfVUlfPUlXQUUwMDUzRSBBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQgcnVubmluZyB2YWxpZGF0aW9uIG9uIHByb2plY3Q6ezB9LCBjaGVjayB0aGUgbG9nIGZpbGUgZm9yIGRldGFpbHMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWpidmFsaWRhdG9yLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VqYnZhbGlkYXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTEzMmZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWpidmFsaWRhdG9yLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICAgICogQ29kZSBvcmllbnRlZCBpbnN0cnVjdGlvbnM6Ci0jICAgICAqCi0jICAgICAqIEluIHRoZSBzdHJpbmcsIHlvdSBtYXkgc2VlIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBzZXF1ZW5jZXM6Ci0jICAgICAqIGEpIHtufSAgd2hlcmUgbiBpcyBhIG51bWJlci4gVGhlc2UgYXJlIHJlcGxhY2VhYmxlIHBhcmFtZXRlcnMuCi0jICAgICAqIGIpICcnICBJbiAucHJvcGVydGllcyBmaWxlcywgaW4gb3JkZXIgdG8gc2VlIG9uZSBhcG9zdHJvcGhlICgnKSBpbiB0aGUgZmluYWwKLSMgICAgICogICAgc3RyaW5nLCBzb21ldGltZXMgdHdvIGFwb3N0cm9waGVzIG11c3QgYmUgZW50ZXJlZCBpbiB0aGUgc3RyaW5nLiBJbiB0aGUgdHJhbnNsYXRlZAotIyAgICAgKiAgICBzdHJpbmcsIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB7bn0gaW4gdGhlIHN0cmluZywgdGhlbiB0byBzaG93IG9uZSBhcG9zdHJvcGhlCi0jICAgICAqICAgIHRvIHRoZSB1c2VyLCBwdXQgdHdvIGFwb3N0cm9waGVzIGluIHRoZSBzdHJpbmcuIElmIHRoZXJlIGFyZSBubyB7bn0gaW4gdGhlIHN0cmluZywKLSMgICAgICogICAgdGhlbiBwdXQgb25lIGFwb3N0cm9waGUuCi0jICAgICAqICAgIEZvciBleGFtcGxlLCBzYXkgdGhhdCB5b3Ugd2FudCB0aGUgdXNlciB0byByZWFkICJHZW9yZ2UncyBmaWxlIi4gCi0jICAgICAqICAgICAgICBHRU9SR0U9R2VvcmdlJ3MgZmlsZSB3YXMgb24gdGhlIGRlc2suCi0jICAgICAqICAgICAgICBHRU9SR0UyPUdlb3JnZScncyBmaWxlIGFuZCB7MH0gd2VyZSBvbiB0aGUgZGVzay4KLSMgICAgICogICAgR0VPUkdFIHVzZXMgb25lIGFwb3N0cm9waGUgYmVjYXVzZSB0aGVyZSBhcmUgbm8ge259IGFuZCBHRU9SR0UyCi0jICAgICAqICAgIHVzZXMgdHdvIGFwb3N0cm9waGVzIGJlY2F1c2UgdGhlcmUgaXMgYSB7bn0uCi0jICAgICAqIGMpICcnIHRleHQgJycgd2hlcmUgdGV4dCBjYW4gYmUgYW55IHdvcmQocykuIFRoZSB0ZXh0IGJldHdlZW4gdGhlIGRvdWJsZQotIyAgICAgKiAgICBhcG9zdHJvcGhlcyBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQuIAotIyAgICAgKiBkKSA8dGV4dD4gd2hlcmUgdGV4dCBjYW4gYmUgYW55IHdvcmQocykuIFRoZSB0ZXh0IGJldHdlZW4gdGhlIGFuZ2xlCi0jICAgICAqICAgIGJyYWNrZXRzIHNob3VsZCBOT1QgYmUgdHJhbnNsYXRlZC4KLSMgICAgICogZSkgInRleHQiIHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBxdW90YXRpb24gCi0jICAgICAqICAgIG1hcmtzIHNob3VsZCBOT1QgYmUgdHJhbnNsYXRlZC4KLSMgICAgICogICAgCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jICAgICAqIE90aGVyIGluc3RydWN0aW9ucwotIyAgICAgKiBhKSBEbyBub3QgdHJhbnNsYXRlIGFueSB0ZXh0IHRoYXQgaXMgb24gYSBsaW5lIHdoaWNoIGJlZ2lucyB3aXRoIGEgY29tbWVudCAKLSMgICAgICogICAgc3ltYm9sICgjKS4KLSMgICAgICogYikgRG8gbm90IHRyYW5zbGF0ZSB0aGVzZSB3b3JkczogCi0jICAgICAqICAgICAgICBzY2hlbWEsIEVKQiwgUkRCLCBKQVIsIFJNSSwgQk1QLCBDTVAsIE9PU1FMCi0jICAgICAqIGMpIFBsZWFzZSByZXR1cm4gdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIHVzaW5nIHRoZSBzYW1lIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0jICAgICAqICAgIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdHdvIG9mIHRoZSBmaWxlcyBoYXZlIHRoZSBzYW1lIG5hbWUuCi0jICAgICAqCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIEFueSBvdGhlciBjb21tZW50cyB0byB0aGUgdHJhbnNsYXRvcnMgYXJlIG9uIGxpbmVzIHdoaWNoIHN0YXJ0IGxpa2UgdGhpczogICMgMlRDOgotIwotIyBWZXJzaW9uIDEuNDIKLSMKLQotIwotIyBCZWdpbiBFSkIgVmFsaWRhdG9yIHN0cmluZ3MuCi0jCi0jIFRoZSBwdXJwb3NlIG9mCi0jIElEczoKLSMgICAgU1RBVFVTPVN0YXR1cyBtZXNzYWdlCi0jICAgIExPQz1UZXh0IGRlc2NyaXB0aW9uIG9mIGEgbG9jYXRpb24gKGlkZW50aWZpZXMgdGhlIHNvdXJjZSBvZiB0aGUgcHJvYmxlbSB3aGVuIG5vIGxpbmUgbnVtYmVyIGlzIGF2YWlsYWJsZSkKLSMgICAgQ0hLSj1FSkIgdmFsaWRhdGlvbiBtZXNzYWdlCi0jCi0KLSMKLSMgU3RhcnQgb2Ygc3RhdHVzIG1lc3NhZ2VzCi0jCi1TVEFUVVNfVkFMSURBVElORz1WYWxpZGF0aW5nIHswfS4KLQotTE9DX0NMQVNTPUNsYXNzOiB7MH0KLUxPQ19GSUVMRD1GaWVsZDogezB9LCBDbGFzczogezF9Ci1MT0NfTUVUSE9EPU1ldGhvZDogezB9LCBDbGFzczogezF9Ci1MT0NfQkVBTj1FbnRlcnByaXNlIGJlYW46IHswfQotTE9DX1JPTEU9PGxvY2FsUmVsYXRpb25zaGlwUm9sZXM+OiB7MH0sIEVudGVycHJpc2UgYmVhbjogezF9Ci1MT0NfUk9MRVJFRj08c2VjdXJpdHktcm9sZS1yZWY+OiB7MH0KLUxPQ19NRVRIT0RFTEVNRU5UPTxtZXRob2Q+IGVsZW1lbnQ6IHswfQotTE9DX01FVEhPRFBFUk1JU1NJT049PG1ldGhvZC1wZXJtaXNzaW9uPiBlbGVtZW50OiB7MH0KLUxPQ19NRVRIT0RUUkFOU0FDVElPTj08Y29udGFpbmVyLXRyYW5zYWN0aW9uPiBlbGVtZW50OiB7MH0KLUxPQ19FSkJSRUxBVElPTj08ZWpiLXJlbGF0aW9uPjogezB9Ci1MT0NfRUpCUkVMQVRJT05TSElQUk9MRT08ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPjogezB9LCA8ZWpiLXJlbGF0aW9uPjogezF9Ci0jCi0jIGVuZCBvZiBzdGF0dXMgbWVzc2FnZXMKLSMKLQotIwotIyBTdGFydCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0jCi0jIEFsbCB1bmlxdWUgZXJyb3IgaWRzIGZvbGxvdyB0aGlzIGZvcm1hdDoKLSMKLSMgICAgQ0hLSm5ubm5bc10KLSMKLSMgd2hlcmUKLSMgICAgLSBDSEtKIGlzIHRoZSBmb3VyIGNoYXJhY3RlciB1bmlxdWUgY29tcG9uZW50IHByZWZpeAotIyAgICAtIG5ubm4gaXMgdGhlIG51bWVyaWNhbCBpZCwgdW5pcXVlIHdpdGhpbiBFSkIgVmFsaWRhdG9yCi0jICAgIC0gW3NdIGlzIHRoZSBzZXZlcml0eSBpbmRpY2F0b3I6IEUgKGVycm9yKSwgVyAod2FybmluZyksIG9yIEkgKGluZm9ybWF0aW9uKS4KLSMKLSMgbm5ubiByYW5nZXMgZnJvbSAyMDAwIC0gMjk5OQotIyAgICAyMDAwIC0gMjA5OSBNZXNzYWdlcyBvbiBhIGNsYXNzCi0jICAgIDIxMDAgLSAyMTk5IE1lc3NhZ2VzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBXZWJzcGhlcmUgb3IgV1NBIChpLmUuLCBub3QgbWVudGlvbmVkIGluIEVKQiBzcGVjaWZpY2F0aW9uLCBzdWNoIGFzIGFzc29jaWF0aW9ucyAmIGZpbmRlcnMpCi0jICAgIDIyMDAgLSAyMzk5IE1lc3NhZ2VzIG9uIGEgZmllbGQKLSMgICAgMjQwMCAtIDI3OTkgTWVzc2FnZXMgb24gYSBtZXRob2QKLSMgICAgMjgwMCAtIDI4OTkgTWVzc2FnZXMgb24gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotIyAgICAyOTAwIC0gMjk5OSBNaXNjZWxsYW5lb3VzCi0jCi0KLSMgCi0jIE1lc3NhZ2VzIGNvbW1vbiBhY3Jvc3MgRUpCIHNwZWNpZmljYXRpb25zCi0jCi1DSEtKMjkwMD1DSEtKMjkwMEk6IEludGVybmFsIGVycm9yIHdoZW4gcnVubmluZyBFSkIgdmFsaWRhdG9yLiBSZWFkIHRoZSBsb2cgZm9yIGRldGFpbHMuCi1DSEtKMjg1Mj1DSEtKMjg1Mlc6IEludGVybmFsIGVycm9yIHdoaWxlIHZhbGlkYXRpbmcgezB9LiBUaGUgYmVhbiBiZWluZyB2YWxpZGF0ZWQgd2FzIHsxfS4KLUNIS0oyNDMzPUNIS0oyNDMzVzogQ2Fubm90IHZhbGlkYXRlIHswfSBiZWNhdXNlIHsxfSBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI5MDc9Q0hLSjI5MDdFOiBUeXBlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI5MDU9Q0hLSjI5MDVXOiBUaGUgRUpCIFZhbGlkYXRvciBkaWQgbm90IHJ1biBiZWNhdXNlIGVqYi1qYXIueG1sIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFJ1biB0aGUgWE1MIHZhbGlkYXRvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLUNIS0oyMDQxPUNIS0oyMDQxSTogUGVybWFuZW50IGNsYXNzZXMgYW5kIGludGVyZmFjZXMgc2hvdWxkIGJlIGluIGEgbmFtZWQgcGFja2FnZS4gKEpMUyAyLjA6IDcuNC4yKS4KLQotQ0hLSjI0NTYuaT1DSEtKMjQ1Nlc6IHswfSBzaG91bGQgdGhyb3cgezF9IGZvciB7Mn0gb3IgdGhlcmUgbWF5IGJlIGNvbXBpbGUgZXJyb3JzIGluIHRoZSBkZXBsb3ltZW50IGNvZGUuCi1DSEtKMjQ1Ni5tPUNIS0oyNDU2VzogVGhpcyBtZXRob2Qgc2hvdWxkIHRocm93IHswfSBmb3IgezF9IG9yIHRoZXJlIG1heSBiZSBjb21waWxlIGVycm9ycyBpbiB0aGUgZGVwbG95bWVudCBjb2RlLgotCi0jCi0jIGVuZCBvZiBjb21tb24gbWVzc2FnZXMKLSMKLQotIwotIyBNZXNzYWdlcyBmb3IgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotIwotQ0hLSjIwMDEuZWIuZWpiMTE9Q0hLSjIwMDFXOiBUaGUgezB9IGtleSBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgezF9IG1ldGhvZC4gKEVKQiAxLjE6IDkuMi45KQotQ0hLSjIwMDIuZWIuaS5lamIxMT1DSEtKMjAwMlc6IFRoaXMgY2xhc3Mgc2hvdWxkIGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvciB7MH0uIChFSkIgMS4xOiA5LjIuNCkKLUNIS0oyMDAyLmViLm0uZWpiMTE9Q0hLSjIwMDJXOiBUaGlzIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJQb3N0Q3JlYXRlIG1ldGhvZCBmb3IgdGhpcyBtZXRob2QuIChFSkIgMS4xOiA5LjIuNCkKLUNIS0oyMDAzRS5lamIxMT1DSEtKMjAwM0U6IFRoaXMgY2xhc3MgbXVzdCBub3QgaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uLiAoRUpCIDEuMTogNi41LjMpLgotQ0hLSjIwMDNJLmVqYjExPUNIS0oyMDAzSTogQmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHN0YXRlZnVsIHNlc3Npb24gYmVhbnMgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uLiAoRUpCIDEuMTogNi41LjMpLgotQ0hLSjIwMDQuZWIuaS5lamIxMT1DSEtKMjAwNFc6IFRoZSB7MX0gYmVhbiBjbGFzcyBzaG91bGQgbm90IGltcGxlbWVudCB0aGUgezB9IGVqYkZpbmQgbWV0aG9kLiAoRUpCIDEuMTogOS40LjYpCi1DSEtKMjAwNC5lYi5tLmVqYjExPUNIS0oyMDA0VzogVGhlIHswfSBiZWFuIGNsYXNzIHNob3VsZCBub3QgaW1wbGVtZW50IGFuIGVqYkZpbmQgbWV0aG9kLiAoRUpCIDEuMTogOS40LjYpCi1DSEtKMjAwNS5laC5pLmVqYjExPUNIS0oyMDA1RTogezB9IG11c3QgYmUgZWl0aGVyIGEgY3JlYXRlIG1ldGhvZCBvciBhIGZpbmQgbWV0aG9kLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAwNS5laC5tLmVqYjExPUNIS0oyMDA1RTogVGhlIG1ldGhvZCBtdXN0IGJlIGVpdGhlciBhIGNyZWF0ZSBtZXRob2Qgb3IgYSBmaW5kIG1ldGhvZC4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMDYuc2IuZWpiMTE9Q0hLSjIwMDZFOiBUaGUgezB9IGJlYW4gY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLiAoRUpCIDEuMTogNi4xMC4yKQotQ0hLSjIwMDYuZWIuZWpiMTE9Q0hLSjIwMDZFOiBUaGUgezB9IGJlYW4gY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLiAoRUpCIDEuMTogOS4yLjIpCi1DSEtKMjAwNy5zYi5lamIxMT1DSEtKMjAwN1c6IHswfSBzaG91bGQgbm90IGRlY2xhcmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLiAoRUpCIDEuMTogNi4xMC4yKQotQ0hLSjIwMDcuZWIuZWpiMTE9Q0hLSjIwMDdXOiB7MH0gc2hvdWxkIG5vdCBkZWNsYXJlIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4gKEVKQiAxLjE6IDkuMi4yKQotQ0hLSjIwMDguc2IuZWpiMTE9Q0hLSjIwMDhFOiBUaGUgezB9IGJlYW4gY2xhc3MgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlamJDcmVhdGUgbWV0aG9kLiAoRUpCIDEuMTogNi41LjUsIDYuMTAuMykKLUNIS0oyMDA5LmViLmVqYjExPUNIS0oyMDA5RTogVGhlIHswfSBiZWFuIGNsYXNzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIChFSkIgMS4xOiA5LjIuNSkKLUNIS0oyMDEwLnNoLmVqYjExPUNIS0oyMDEwRTogVGhlIHswfSBob21lIGludGVyZmFjZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNyZWF0ZSBtZXRob2QuIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjAxMS5laC5lamIxMT1DSEtKMjAxMUU6IFRoZSB7MH0gaG9tZSBpbnRlcmZhY2UgbXVzdCBjb250YWluIG9uZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMTIuc3IuZWpiMTE9Q0hLSjIwMTJFOiBUaGlzIHR5cGUgbXVzdCBiZSBhbiBpbnRlcmZhY2UuIChFSkIgMS4xOiA2LjEwLjUpLgotQ0hLSjIwMTIuc2guZWpiMTE9Q0hLSjIwMTJFOiBUaGlzIHR5cGUgbXVzdCBiZSBhbiBpbnRlcmZhY2UuIChFSkIgMS4xOiA2LjEwLjYpLgotQ0hLSjIwMTIuZXIuZWpiMTE9Q0hLSjIwMTJFOiBUaGlzIHR5cGUgbXVzdCBiZSBhbiBpbnRlcmZhY2UuIChFSkIgMS4xOiA5LjIuNykuCi1DSEtKMjAxMi5laC5lamIxMT1DSEtKMjAxMkU6IFRoaXMgdHlwZSBtdXN0IGJlIGFuIGludGVyZmFjZS4gKEVKQiAxLjE6IDkuMi44KS4KLUNIS0oyMDEzLnNiLmVqYjExPUNIS0oyMDEzRTogVGhlIHswfSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IHsxfS4gKEVKQiAxLjE6IDYuMTAuMikuCi1DSEtKMjAxMy5lYi5lamIxMT1DSEtKMjAxM0U6IFRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB7MX0uIChFSkIgMS4xOiA5LjIuMikuCi1DSEtKMjAxNC5zYi5lamIxMT1DSEtKMjAxNEU6IFRoZSB7MH0gYmVhbiBjbGFzcyBjYW5ub3QgYmUgYWJzdHJhY3QuIChFSkIgMS4xOiA2LjEwLjIpCi1DSEtKMjAxNC5lYi5lamIxMT1DSEtKMjAxNEU6IFRoZSB7MH0gYmVhbiBjbGFzcyBjYW5ub3QgYmUgYWJzdHJhY3QuIChFSkIgMS4xOiA5LjIuMikKLUNIS0oyMDE1LnNiLmVqYjExPUNIS0oyMDE1RTogVGhlIHswfSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDYuMTAuMikKLUNIS0oyMDE1LmViLmVqYjExPUNIS0oyMDE1RTogVGhlIHswfSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi4yKQotQ0hLSjIwMTcuc3IuZWpiMTE9Q0hLSjIwMTdFOiBJbnRlcmZhY2UgbXVzdCBleHRlbmQgezB9LiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjIwMTcuc2guZWpiMTE9Q0hLSjIwMTdFOiBJbnRlcmZhY2UgbXVzdCBleHRlbmQgezB9LiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjIwMTcuZXIuZWpiMTE9Q0hLSjIwMTdFOiBJbnRlcmZhY2UgbXVzdCBleHRlbmQgezB9LiAoRUpCIDEuMTogOS4yLjcpCi1DSEtKMjAxNy5laC5lamIxMT1DSEtKMjAxN0U6IEludGVyZmFjZSBtdXN0IGV4dGVuZCB7MH0uIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDE5LmViLmVqYjExPUNIS0oyMDE5STogVGhlIHswfSBrZXkgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMi45KSAoUk1JIDEuMzogMi42KS4KLQotCi1DSEtKMjAyMC5lYi5lamIxMT1DSEtKMjAyMEU6IFRoZSB7MH0ga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS40LjcuMikKLUNIS0oyMDIxLmViLmVqYjExPUNIS0oyMDIxRTogVGhlIHswfSBrZXkgY2xhc3MgbXVzdCBkZWZpbmUgYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gKEVKQiAxLjE6IDkuNC43LjIpCi1DSEtKMjAyMi5zYi5lamIxMT1DSEtKMjAyMkU6IHswfSBiZWFuIGNsYXNzIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogNi4xMC4yKQotQ0hLSjIwMjIuZWIuZWpiMTE9Q0hLSjIwMjJFOiB7MH0gYmVhbiBjbGFzcyBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi4yKQotQ0hLSjIwMjMuc3IuaS5lamIxMT1DSEtKMjAyM0U6IHswfSBtdXN0IGhhdmUgYSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjIwMjMuc3IubS5lamIxMT1DSEtKMjAyM0U6IFRoaXMgbWV0aG9kIG11c3QgaGF2ZSBhIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezB9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjAyMy5lci5pLmVqYjExPUNIS0oyMDIzRTogezB9IG11c3QgaGF2ZSBhIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuNykKLUNIS0oyMDIzLmVyLm0uZWpiMTE9Q0hLSjIwMjNFOiBUaGlzIG1ldGhvZCBtdXN0IGhhdmUgYSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHswfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjcpCi1DSEtKMjAyNC5zaC5pLmVqYjExPUNIS0oyMDI0RTogezB9IG11c3Qgbm90IGV4aXN0LiBPbmx5IGNyZWF0ZSgpIG1heSBleGlzdCAoRUpCIDEuMTogNi44KS4KLUNIS0oyMDI0LnNoLm0uZWpiMTE9Q0hLSjIwMjRFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gT25seSBjcmVhdGUoKSBtYXkgZXhpc3QgKEVKQiAxLjE6IDYuOCkuCi1DSEtKMjAyNS5zYi5pLmVqYjExPUNIS0oyMDI1RTogezB9IG11c3Qgbm90IGV4aXN0LiBPbmx5IGVqYkNyZWF0ZSgpIG1heSBleGlzdCAoRUpCIDEuMTogNi44KS4KLUNIS0oyMDI1LnNiLm0uZWpiMTE9Q0hLSjIwMjVFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gT25seSBlamJDcmVhdGUoKSBtYXkgZXhpc3QgKEVKQiAxLjE6IDYuOCkuCi1DSEtKMjAyNi5zaC5pLmVqYjExPUNIS0oyMDI2RTogQmVhbiBjbGFzcyB7MX0gbXVzdCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGZvciB7MH0uIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjAyNi5zaC5tLmVqYjExPUNIS0oyMDI2RTogQmVhbiBjbGFzcyB7MH0gbXVzdCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGZvciB0aGlzIG1ldGhvZC4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyMDI2LmVoLmkuZWpiMTE9Q0hLSjIwMjZFOiBCZWFuIGNsYXNzIHsxfSBtdXN0IGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgZm9yIHswfS4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMjYuZWgubS5lamIxMT1DSEtKMjAyNkU6IEJlYW4gY2xhc3MgezB9IG11c3QgaW1wbGVtZW50IGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZCBmb3IgdGhpcyBtZXRob2QuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDI4LmViLmkuZWpiMTE9Q0hLSjIwMjhXOiB7MH0gd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgaXMgZGVmaW5lZC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAyOC5lYi5tLmVqYjExPUNIS0oyMDI4VzogVGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgaXMgZGVmaW5lZC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAyOS5lYi5pLmVqYjExPUNIS0oyMDI5VzogezB9IGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvbiB0aGUgaG9tZSBpbnRlcmZhY2UgezF9LiAoRUpCIDEuMTogOS4yLjMpCi1DSEtKMjAyOS5lYi5tLmVqYjExPUNIS0oyMDI5VzogVGhpcyBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9uIHRoZSBob21lIGludGVyZmFjZSB7MH0uIChFSkIgMS4xOiA5LjIuMykKLUNIS0oyMDMwLmVoLmkuZWpiMTE9Q0hLSjIwMzBFOiB7MH0gbXVzdCBoYXZlIGEgbWF0Y2hpbmcgZWpiRmluZCBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAzMC5laC5tLmVqYjExPUNIS0oyMDMwRTogVGhpcyBtZXRob2QgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgZWpiRmluZCBtZXRob2QgaW4gdGhlIHswfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAzMi5lYi5lamIxMT1DSEtKMjAzMlc6IEJlYW4gY2xhc3MgezB9IG11c3QgZGVjbGFyZSBhdCBsZWFzdCBvbmUgY29udGFpbmVyIG1hbmFnZWQgZmllbGQuIChFSkIgMS4xOiA5LjQuNykKLUNIS0oyMDMzLmViLmVqYjExPUNIS0oyMDMzVzogVGhlIHNldEVudGl0eUNvbnRleHQoRW50aXR5Q29udGV4dCBpYykgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMzQuZWIuZWpiMTE9Q0hLSjIwMzRXOiBUaGUgdW5zZXRFbnRpdHlDb250ZXh0KCkgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMzUuZWIuZWpiMTE9Q0hLSjIwMzVXOiBUaGUgZWpiQWN0aXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAzNi5lYi5lamIxMT1DSEtKMjAzNlc6IFRoZSBlamJQYXNzaXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAzNy5lYi5lamIxMT1DSEtKMjAzN1c6IFRoZSBlamJSZW1vdmUoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAzOC5lYi5lamIxMT1DSEtKMjAzOFc6IFRoZSBlamJMb2FkKCkgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMzkuZWIuZWpiMTE9Q0hLSjIwMzlXOiBUaGUgZWpiU3RvcmUoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi0KLUNIS0oyMDQwLnNiLmVqYjExPUNIS0oyMDQwSTogInRoaXMiIG11c3Qgbm90IGJlIHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQuIChFSkIgMS4xOiA2LjEwLjIpCi0KLUNIS0oyMTAwLmVqYjExPUNIS0oyMTAwRTogQm90aCBlbmRzIG9mIHRoZSByb2xlIG11c3QgdXNlIHRoZSBzYW1lIG51bWJlciBvZiBhdHRyaWJ1dGVzLgotQ0hLSjIxMDEuZWpiMTE9Q0hLSjIxMDFFOiBCb3RoIGVuZHMgb2YgdGhlIHJvbGUgbXVzdCB1c2UgdGhlIHNhbWUgdHlwZS4KLUNIS0oyMTAyLmVoLmVqYjExPUNIS0oyMTAyRTogRWl0aGVyIGEgZmluZGVyIGRlc2NyaXB0b3IsIG9yIGEgbWF0Y2hpbmcgY3VzdG9tIGZpbmRlciBtZXRob2Qgb24gdGhlIHswfSBjbGFzcywgbXVzdCBiZSBkZWZpbmVkLgotQ0hLSjIxMDMuZWpiMTE9Q0hLSjIxMDNFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGluaGVyaXQgezF9LiAoRUpCIDEuMTogQi4yKQotQ0hLSjIxMDQuZWpiMTE9Q0hLSjIxMDRFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gaG9tZSBpbnRlcmZhY2UgbXVzdCBub3QgaW5oZXJpdCB7MX0uIChFSkIgMS4xOiBCLjIpCi1DSEtKMjEwNS5lamIxMT1DSEtKMjEwNUU6IEluIGNvbXBvbmVudCBpbmhlcml0YW5jZSwgdGhlIHswfSByZW1vdGUgaW50ZXJmYWNlIG11c3QgaW5oZXJpdCB7MX0uIChFSkIgMS4xOiBCLjIpCi1DSEtKMjEwNi5lamIxMT1DSEtKMjEwNkU6IEJlYW4gezB9IG11c3QgdXNlIHsxfSBhcyBpdHMgPHByaW0ta2V5LWNsYXNzPiAoRUpCIDEuMTogQi4yKS4KLQotQ0hLSjIyMDAuaS5lamIxMT1DSEtKMjIwMFc6IFRoZSB7MH0gc3RhdGljIGZpZWxkIHNob3VsZCBiZSBmaW5hbC4gKEVKQiAxLjE6IDE4LjEuMikKLUNIS0oyMjAwLm0uZWpiMTE9Q0hLSjIyMDBXOiBUaGlzIHN0YXRpYyBmaWVsZCBzaG91bGQgYmUgZmluYWwuIChFSkIgMS4xOiAxOC4xLjIpCi1DSEtKMjIwMS5lYi5pLmVqYjExPUNIS0oyMjAxRTogezB9IG11c3Qgbm90IGJlIHRyYW5zaWVudC4gKEVKQiAxLjE6IDkuNC4xKQotQ0hLSjIyMDEuZWIubS5lamIxMT1DSEtKMjIwMUU6IFRoZSBmaWVsZCBtdXN0IG5vdCBiZSB0cmFuc2llbnQuIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjAyLmViLmkuZWpiMTE9Q0hLSjIyMDJXOiBUaGUgZmllbGQgdHlwZSBvZiBmaWVsZCB7MH0gaXMgaW52YWxpZCBmb3IgYSBDTVAgYmVhbi4gKEVKQiAxLjE6IDkuNC4xKQotQ0hLSjIyMDIuZWIubS5lamIxMT1DSEtKMjIwMlc6IFRoZSBmaWVsZCB0eXBlIGlzIGludmFsaWQgZm9yIGEgQ01QIGJlYW4uIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjAzLmViLmkuZWpiMTE9Q0hLSjIyMDNFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjAzLmViLm0uZWpiMTE9Q0hLSjIyMDNFOiBUaGUgZmllbGQgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjA1LmViLmkuZWpiMTE9Q0hLSjIyMDVXOiBUaGUgcHJpbWFyeSBrZXkgZmllbGQgbmFtZWQgezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS40LjcuMikKLUNIS0oyMjA1LmViLm0uZWpiMTE9Q0hLSjIyMDVXOiBUaGUgcHJpbWFyeSBrZXkgZmllbGQgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjQuNy4yKQotQ0hLSjIyMDYuZWIuaS5lamIxMT1DSEtKMjIwNlc6IHswfSBtdXN0IGJlIGEgPGNtcC1maWVsZD4gb2YgezF9IGFuZCBhIGZpZWxkIG9mIGJlYW4gY2xhc3MgezJ9LiAoRUpCIDEuMTogOS40LjcuMikuCi1DSEtKMjIwNi5lYi5tLmVqYjExPUNIS0oyMjA2VzogVGhpcyBmaWVsZCBtdXN0IGJlIGEgPGNtcC1maWVsZD4gb2YgezB9IGFuZCBhIGZpZWxkIG9mIGJlYW4gY2xhc3MgezF9LiAoRUpCIDEuMTogOS40LjcuMikuCi1DSEtKMjIwNy5lYi5lamIxMT1DSEtKMjIwN0U6IEtleSBmaWVsZCB7MH0gbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSBwcmltYXJ5IGtleSwgezF9LiAoRUpCIDEuMTogOS40LjcuMSkuCi0KLUNIS0oyNDAwLmVqYkNyZWF0ZS5zYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gbWV0aG9kIHswfS4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQwMC5lamJDcmVhdGUuc2IubS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDAwLmJ1cy5zYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gbWV0aG9kIHswfS4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQwMC5idXMuc2IubS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDAwLmVqYkNyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gezB9LiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MDAuZWpiQ3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDAwLmVqYlBvc3RDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIG9uIHswfS4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDAwLmVqYlBvc3RDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MDAuZWpiRmluZC5lYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gezB9LiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MDAuZWpiRmluZC5lYi5tLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQwMC5idXMuZWIuaS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIG9uIHswfS4gKEVKQiAxLjE6IDkuMi42KS4KLUNIS0oyNDAwLmJ1cy5lYi5tLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIChFSkIgMS4xOiA5LjIuNikuCi0KLUNIS0oyNDAxLnNiLmkuZWpiMTE9Q0hLSjI0MDFFOiB7MH0gbXVzdCByZXR1cm4gdm9pZC4gKEVKQiAxLjE6IDYuMTAuMykKLUNIS0oyNDAxLnNiLm0uZWpiMTE9Q0hLSjI0MDFFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiAoRUpCIDEuMTogNi4xMC4zKQotQ0hLSjI0MDIuc2guaS5lamIxMT1DSEtKMjQwMlc6IHswfSBtdXN0IHJldHVybiB0aGUgezF9IHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4gIChFSkIgMS4xOiA2LjEwLjYpLgotQ0hLSjI0MDIuc2gubS5lamIxMT1DSEtKMjQwMlc6IFRoaXMgY3JlYXRlIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgezB9IHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4gIChFSkIgMS4xOiA2LjEwLjYpLgotQ0hLSjI0MDIuZWguaS5lamIxMT1DSEtKMjQwMlc6IHswfSBtdXN0IHJldHVybiB0aGUgezF9IHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4gIChFSkIgMS4xOiA5LjIuOCkuCi1DSEtKMjQwMi5laC5tLmVqYjExPUNIS0oyNDAyVzogVGhpcyBjcmVhdGUgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSB7MH0gcmVtb3RlIGludGVyZmFjZSB0eXBlLiAgKEVKQiAxLjE6IDkuMi44KS4KLUNIS0oyNDAzLmVoLmkuZWpiMTE9Q0hLSjI0MDNXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjQwMy5laC5tLmVqYjExPUNIS0oyNDAzVzogVGhlIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyNDA1LmVoLmkuZWpiMTE9Q0hLSjI0MDVXOiBUaGUgb3JkZXIgYW5kIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgaW4gezB9IG11c3QgbWF0Y2ggdGhlIG9yZGVyIGFuZCB0eXBlcyBvZiB0aGUgZmllbGRzIGluIHRoZSB7MX0ga2V5IGNsYXNzLiAoRUpCIDEuMTogOS4yLjgsIDkuNC43LjMsIDE2LjUpCi1DSEtKMjQwNS5laC5tLmVqYjExPUNIS0oyNDA1VzogVGhlIG9yZGVyIGFuZCB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIG11c3QgbWF0Y2ggdGhlIG9yZGVyIGFuZCB0eXBlcyBvZiB0aGUgZmllbGRzIGluIHRoZSB7MH0ga2V5IGNsYXNzLiAoRUpCIDEuMTogOS4yLjgsIDkuNC43LjMsIDE2LjUpCi1DSEtKMjQwNi5lYi5pLmVqYjExPUNIS0oyNDA2VzogezB9IHNob3VsZCByZXR1cm4gdGhlIHByaW1hcnkga2V5IHR5cGUgezF9LiAoRUpCIDEuMTogOS4yLjMsIDkuNC4yLCA5LjQuNy4zKS4KLUNIS0oyNDA2LmViLm0uZWpiMTE9Q0hLSjI0MDZXOiBUaGUgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIHByaW1hcnkga2V5IHR5cGUgezB9LiAoRUpCIDEuMTogOS4yLjMsIDkuNC4yLCA5LjQuNy4zKS4KLUNIS0oyNDA3LmViLmkuZWpiMTE9Q0hLSjI0MDdXOiB7MH0gc2hvdWxkIHJldHVybiBlaXRoZXIgezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAgKEVKQiAxLjE6IDkuMi41KQotQ0hLSjI0MDcuZWIubS5lamIxMT1DSEtKMjQwN1c6IFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gZWl0aGVyIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZi4gIChFSkIgMS4xOiA5LjIuNSkKLQotQ0hLSjI0MDguZWpiQ3JlYXRlLnNiLmkuZWpiMTE9Q0hLSjI0MDhFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MDguZWpiQ3JlYXRlLnNiLm0uZWpiMTE9Q0hLSjI0MDhFOiBUaGUgbWV0aG9kIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDA4LmJ1cy5zYi5pLmVqYjExPUNIS0oyNDA4RTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDA4LmJ1cy5zYi5tLmVqYjExPUNIS0oyNDA4RTogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MDguZWpiQ3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MDhFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQwOC5lamJDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQwOEU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MDguZWpiUG9zdENyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDA4RTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MDguZWpiUG9zdENyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDA4RTogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuNCkuCi1DSEtKMjQwOC5lamJGaW5kLmViLmkuZWpiMTE9Q0hLSjI0MDhFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQwOC5lamJGaW5kLmViLm0uZWpiMTE9Q0hLSjI0MDhFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDA4LmJ1cy5lYi5pLmVqYjExPUNIS0oyNDA4RTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjYpLgotQ0hLSjI0MDguYnVzLmViLm0uZWpiMTE9Q0hLSjI0MDhFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi42KS4KLQotQ0hLSjI0MDkuZWpiQ3JlYXRlLnNiLmkuZWpiMTE9Q0hLSjI0MDlFOiB7MH0gbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MDkuZWpiQ3JlYXRlLnNiLm0uZWpiMTE9Q0hLSjI0MDlFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQwOS5idXMuc2IuaS5lamIxMT1DSEtKMjQwOUU6IHswfSBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQwOS5idXMuc2IubS5lamIxMT1DSEtKMjQwOUU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDA5LmVqYkNyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDA5RTogezB9IG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MDkuZWpiQ3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MDlFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDA5LmVqYlBvc3RDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQwOUU6IHswfSBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDA5LmVqYlBvc3RDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQwOUU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MDkuZWpiRmluZC5lYi5pLmVqYjExPUNIS0oyNDA5RTogezB9IG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MDkuZWpiRmluZC5lYi5tLmVqYjExPUNIS0oyNDA5RTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQwOS5idXMuZWIuaS5lamIxMT1DSEtKMjQwOUU6IHswfSBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi42KS4KLUNIS0oyNDA5LmJ1cy5lYi5tLmVqYjExPUNIS0oyNDA5RTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuNikuCi0KLUNIS0oyNDEwLmVqYkNyZWF0ZS5zYi5pLmVqYjExPUNIS0oyNDEwRTogezB9IG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQxMC5lamJDcmVhdGUuc2IubS5lamIxMT1DSEtKMjQxMEU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQxMC5idXMuc2IuaS5lamIxMT1DSEtKMjQxMEU6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MTAuYnVzLnNiLm0uZWpiMTE9Q0hLSjI0MTBFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MTAuZWpiQ3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MTBFOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MTAuZWpiQ3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MTBFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQxMC5lamJQb3N0Q3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MTBFOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MTAuZWpiUG9zdENyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDEwRTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MTAuZWpiRmluZC5lYi5pLmVqYjExPUNIS0oyNDEwRTogezB9IG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDEwLmVqYkZpbmQuZWIubS5lamIxMT1DSEtKMjQxMEU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDEwLmJ1cy5lYi5pLmVqYjExPUNIS0oyNDEwRTogezB9IG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi42KS4KLUNIS0oyNDEwLmJ1cy5lYi5tLmVqYjExPUNIS0oyNDEwRTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjYpLgotCi1DSEtKMjQxMS5zYi5pLmVqYjExPUNIS0oyNDExRTogVGhlIG5hbWUgb2YgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIuIChFSkIgMS4xOiA2LjEwLjQpCi1DSEtKMjQxMS5zYi5tLmVqYjExPUNIS0oyNDExRTogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiAoRUpCIDEuMTogNi4xMC40KQotQ0hLSjI0MTEuZWIuaS5lamIxMT1DSEtKMjQxMUU6IFRoZSBuYW1lIG9mIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiAoRUpCIDEuMTogOS4yLjYpCi1DSEtKMjQxMS5lYi5tLmVqYjExPUNIS0oyNDExRTogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiAoRUpCIDEuMTogOS4yLjYpCi0KLUNIS0oyNDEyLnNiLmkuZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogNi4xMCkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5zYi5tLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogNi4xMCkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5lYi5pLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDkuMikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5lYi5tLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogOS4yKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLnNyLmkuZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogNi4xMC41KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLnNyLm0uZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA2LjEwLjUpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuZXIuaS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA5LjIuNykgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5lci5tLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogOS4yLjcpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuc2guaS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA2LjEwLjYpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuc2gubS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDYuMTAuNikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5laC5pLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDkuMi44KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLmVoLm0uZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA5LjIuOCkgKFJNSSAxLjM6IDIuNikuCi0KLUNIS0oyNDEzLnNiLmkuZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA2LjEwKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLnNiLm0uZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDYuMTApIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuZWIuaS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5lYi5tLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuc3IuaS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDYuMTAuNSkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5zci5tLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA2LjEwLjUpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuZXIuaS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMi43KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLmVyLm0uZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMi43KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLnNoLmkuZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA2LjEwLjYpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuc2gubS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogNi4xMC42KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLmVoLmkuZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIuOCkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5laC5tLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIuOCkgKFJNSSAxLjM6IDIuNikuCi0KLUNIS0oyNDE0LnNoLmkuZWpiMTE9Q0hLSjI0MTRFOiB7MH0gbXVzdCB0aHJvdyB7MX0uIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjQxNC5zaC5tLmVqYjExPUNIS0oyNDE0RTogVGhlIG1ldGhvZCBtdXN0IHRocm93IHswfS4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyNDE0LmVoLmkuZWpiMTE9Q0hLSjI0MTRFOiB7MH0gbXVzdCB0aHJvdyB7MX0uIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyNDE0LmVoLm0uZWpiMTE9Q0hLSjI0MTRFOiBUaGUgbWV0aG9kIG11c3QgdGhyb3cgezB9LiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjQxNC5zci5pLmVqYjExPUNIS0oyNDE0RTogezB9IG11c3QgdGhyb3cgezF9LiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjI0MTQuc3IubS5lamIxMT1DSEtKMjQxNEU6IFRoZSBtZXRob2QgbXVzdCB0aHJvdyB7MH0uIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjQxNC5lci5pLmVqYjExPUNIS0oyNDE0RTogezB9IG11c3QgdGhyb3cgezF9LiAoRUpCIDEuMTogOS4yLjcpCi1DSEtKMjQxNC5lci5tLmVqYjExPUNIS0oyNDE0RTogVGhlIG1ldGhvZCBtdXN0IHRocm93IHswfS4gKEVKQiAxLjE6IDkuMi43KQotCi1DSEtKMjQxNS5zci5pLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezF9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7Mn0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDYuMTAuNSkKLUNIS0oyNDE1LnNyLm0uZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHswfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjQxNS5lci5pLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezF9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7Mn0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi43KQotQ0hLSjI0MTUuZXIubS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezB9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7MX0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi43KQotQ0hLSjI0MTUuc2guaS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHsxfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezJ9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjQxNS5zaC5tLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCB7MH0sIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjI0MTUuZWguaS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHsxfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezJ9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyNDE1LmVoLm0uZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHswfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuOCkKLQotQ0hLSjI0MTguZWIuaS5lamIxMT1DSEtKMjQxOEU6IHswfSBtdXN0IHJldHVybiB2b2lkLiAoRUpCIDEuMTogOS4yLjQpCi1DSEtKMjQxOC5lYi5tLmVqYjExPUNIS0oyNDE4RTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gKEVKQiAxLjE6IDkuMi40KQotQ0hLSjI0MTkuc2guaS5lamIxMT1DSEtKMjQxOUU6IHswfSBtdXN0IGJlIGEgY3JlYXRlIG1ldGhvZC4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyNDE5LnNoLm0uZWpiMTE9Q0hLSjI0MTlFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGEgY3JlYXRlIG1ldGhvZC4gKEVKQiAxLjE6IDYuMTAuNikKLQotQ0hLSjI0MjAuc2IuaS5lamIxMT1DSEtKMjQyMEU6IHsxfSBtdXN0IGJlIHRocm93biBieSB7MH0nJ3MgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHsyfSBob21lIGludGVyZmFjZS4gKEVKQiAxLjE6IDYuMTAuNiwgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQyMC5zYi5tLmVqYjExPUNIS0oyNDIwRTogezB9IG11c3QgYmUgdGhyb3duIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezF9IGhvbWUgaW50ZXJmYWNlLiAoRUpCIDEuMTogNi4xMC42LCAxMi4yLjEsIDEyLjIuMikKLUNIS0oyNDIwLmViLmkuZWpiMTE9Q0hLSjI0MjBFOiB7MX0gbXVzdCBiZSB0aHJvd24gYnkgezB9JydzIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7Mn0gaG9tZSBpbnRlcmZhY2UuIChFSkIgMS4xOiA5LjIuOCwgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQyMC5lYi5tLmVqYjExPUNIS0oyNDIwRTogezB9IG11c3QgYmUgdGhyb3duIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezF9IGhvbWUgaW50ZXJmYWNlLiAoRUpCIDEuMTogOS4yLjgsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MzIuc2IuaS5lamIxMT1DSEtKMjQzMkU6IHswfScncyBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezF9IHJlbW90ZSBpbnRlcmZhY2UgbXVzdCB0aHJvdyB7Mn0uIChFSkIgMS4xOiA2LjEwLjUsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MzIuc2IubS5lamIxMT1DSEtKMjQzMkU6IFRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezB9IHJlbW90ZSBpbnRlcmZhY2UgbXVzdCB0aHJvdyB7MX0uIChFSkIgMS4xOiA2LjEwLjUsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MzIuZWIuaS5lamIxMT1DSEtKMjQzMkU6IHswfScncyBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezF9IHJlbW90ZSBpbnRlcmZhY2UgbXVzdCB0aHJvdyB7Mn0uIChFSkIgMS4xOiA5LjIuNywgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQzMi5lYi5tLmVqYjExPUNIS0oyNDMyRTogVGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7MH0gcmVtb3RlIGludGVyZmFjZSBtdXN0IHRocm93IHsxfS4gKEVKQiAxLjE6IDkuMi43LCAxMi4yLjEsIDEyLjIuMikKLQotQ0hLSjI4MDEuZWpiMTE9Q0hLSjI4MDFFOiBUaGUgdmFsdWUgb2YgdGhlIDxlamItbmFtZT4gZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4gKEVKQiAxLjE6IDE2LjIsIDE2LjUpCi1DSEtKMjgwMi5uYW1lZC5lamIxMT1DSEtKMjgwMkU6IDxlamItY2xhc3M+IGNsYXNzIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDIudW5uYW1lZC5lamIxMT1DSEtKMjgwMkU6IFVua25vd24gY2xhc3Mgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLWNsYXNzPiBlbGVtZW50LiAoRUpCIDEuMTogMTYuMiwgMTYuNSkuCi1DSEtKMjgwMy5uYW1lZC5lamIxMT1DSEtKMjgwM0U6IDxob21lPiBpbnRlcmZhY2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwMy51bm5hbWVkLmVqYjExPUNIS0oyODAzRTogVW5rbm93biBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudC4gKEVKQiAxLjE6IDE2LjIsIDE2LjUpLgotQ0hLSjI4MDQubmFtZWQuZWpiMTE9Q0hLSjI4MDRFOiA8cmVtb3RlPiBpbnRlcmZhY2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwNC51bm5hbWVkLmVqYjExPUNIS0oyODA0RTogVW5rbm93biBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSA8cmVtb3RlPiBlbGVtZW50LiAoRUpCIDEuMTogMTYuMiwgMTYuNSkuCi1DSEtKMjgwNi5lamIxMT1DSEtKMjgwNkU6IFRoZSB2YWx1ZSBvZiB0aGUgPHJlZW50cmFudD4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiVHJ1ZSIgb3IgIkZhbHNlIi4gKEVKQiAxLjE6IDE2LjIsIDE2LjUpCi1DSEtKMjgwNy5lamIxMT1DSEtKMjgwN0U6IFRoZSB2YWx1ZSBvZiB0aGUgPHNlc3Npb24tdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiU3RhdGVmdWwiIG9yICJTdGF0ZWxlc3MiLiAoRUpCIDEuMTogMTYuMiwgMTYuNSkKLUNIS0oyODA4LmVqYjExPUNIS0oyODA4RTogVGhlIHZhbHVlIG9mIHRoZSA8dHJhbnNhY3Rpb24tdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiQ29udGFpbmVyIiBvciAiQmVhbiIuIChFSkIgMS4xOiAxMS4zLjUsIDE2LjIsLCAxNi41KQotQ0hLSjI4MDkuZWpiMTE9Q0hLSjI4MDlFOiBUaGUgdmFsdWUgb2YgdGhlIDxwZXJzaXN0ZW5jZS10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJDb250YWluZXIiIG9yICJCZWFuIi4gIChFSkIgMS4xOiAxNi4yLCAxNi41KQotQ0hLSjI4MTAubmFtZWQuZWpiMTE9Q0hLSjI4MTBFOiA8cHJpbS1rZXktY2xhc3M+IGNsYXNzIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MTAudW5uYW1lZC5lamIxMT1DSEtKMjgxMEU6IFVua25vd24gY2xhc3Mgc3BlY2lmaWVkIGluIHRoZSA8cHJpbS1rZXktY2xhc3M+IGVsZW1lbnQuICAoRUpCIDEuMTogMTYuMiwgMTYuNSkuCi1DSEtKMjgxMS5uYW1lZC5lamIxMT1DSEtKMjgxMUU6IDxmaWVsZC1uYW1lPiB7MH0gY2Fubm90IGJlIGxvY2F0ZWQgb24gYmVhbiBjbGFzcyB7MX0uIChFSkIgMS4xOiAxNi41KS4KLUNIS0oyODExLnVubmFtZWQuZWpiMTE9Q0hLSjI4MTFFOiA8Y21wLWZpZWxkPiBtdXN0IHNwZWNpZnkgYSA8ZmllbGQtbmFtZT4uIChFSkIgMS4xOiAxNi41KS4KLUNIS0oyODEyLmVqYjExPUNIS0oyODEyRTogQmVhbiBjbGFzcyB7MH0gbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBvZiBpdHMgZmllbGRzIGFzIGEgPGNtcC1maWVsZD4uIChFSkIgMS4xOiAxNi41KQotQ0hLSjI4MTQuZWpiMTE9Q0hLSjI4MTRXOiA8ZWpiLW5hbWU+LCBpbiA8bWV0aG9kPiwgc2hvdWxkIHNwZWNpZnkgYSBrbm93biBlbnRlcnByaXNlIGJlYW4uIChFSkIgMS4xOiAxMS40LjEsIDE1LjMuMiwgMTYuNSkKLQotQ0hLSjI4MjAuZWpiMTE9Q0hLSjI4MjBXOiBUaGUgc2VjdXJpdHkgcm9sZSByZWYgbXVzdCBiZSBkZWZpbmVkIG9ubHkgb25jZS4KLUNIS0oyODIyLmVqYjExPUNIS0oyODIyVzogPHNlY3VyaXR5LXJvbGUtcmVmPiBlbGVtZW50IGZvciBiZWFuIHswfSBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1uYW1lPiBlbGVtZW50LiAoRUpCIDEuMTogMTUuMi41LjMpCi1DSEtKMjgyMy5lamIxMT1DSEtKMjgyM1c6IDxzZWN1cml0eS1yb2xlLXJlZj4gZWxlbWVudCBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1saW5rPiBlbGVtZW50LiAoRUpCIDEuMTogMTUuMy4zKQotQ0hLSjI4MjQuZWpiMTE9Q0hLSjI4MjRXOiA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQgcmVmZXJzIHRvIHVua25vd24gcm9sZSB7MH0uIChFSkIgMS4xOiAxNS4zLjMpCi1DSEtKMjgyNS5lamIxMT1DSEtKMjgyNVc6IDxzZWN1cml0eS1yb2xlPiBlbGVtZW50IGluIGVqYi1qYXIueG1sIHNob3VsZCBkZWZpbmUgdGhlIDxyb2xlLW5hbWU+IGVsZW1lbnQuIChFSkIgMS4xOiAxNS4zLjEpCi1DSEtKMjgyNi5lamIxMT1DSEtKMjgyNlc6IFRoZSBzZWN1cml0eS1yb2xlIG5hbWUgbXVzdCBiZSB1bmlxdWUuIChFSkIgMS4xOiAxNS4zLjEpCi1DSEtKMjgyNy5lamIxMT1DSEtKMjgyN1c6IENhbm5vdCB1c2UgYSA8cm9sZS1saW5rPiBlbGVtZW50IHdpdGhvdXQgPHNlY3VyaXR5LXJvbGU+IGVsZW1lbnRzLiAoRUpCIDEuMTogMTUuMi41LjMsIDE1LjMuMSwgMTUuMy4zKQotQ0hLSjI4MjguZWpiMTE9Q0hLSjI4MjhFOiBDYW5ub3QgdXNlIGEgPHByaW1rZXktZmllbGQ+IGVsZW1lbnQgd2l0aG91dCBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleS4gKEVKQiAxLjE6IDkuNC43LCAxNi41KQotQ0hLSjI4MjkuZWpiMTE9Q0hLSjI4MjlFOiBLZXkgY2xhc3MgezB9IGRvZXMgbm90IG1hcCB0byBhbnkgZmllbGRzIGluIGVudGVycHJpc2UgYmVhbiB7MX0uIChFSkIgMS4xOiA5LjQuNywgMTYuNSkKLQotQ0hLSjI4MzAuZWpiMTE9Q0hLSjI4MzBXOiBUaGUgdHlwZSBvZiB0aGUgezB9IGZpZWxkIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgzMS5lamIxMT1DSEtKMjgzMVc6IHswfSBtdXN0IGJlIGRlY2xhcmVkIGluIGEgPGNtcC1maWVsZD4gZWxlbWVudC4gKEVKQiAxLjE6IDkuNC43LjIpCi1DSEtKMjgzMi5lamIxMT1DSEtKMjgzMkk6IEhvbWUgezB9LCBzcGVjaWZpZWQgaW4gdGhlIDxlamItcmVmPiBlbGVtZW50LCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIChFSkIgMS4xOiAxNC4zLjEuMikKLUNIS0oyODMzLmVqYjExPUNIS0oyODMzSTogUmVtb3RlIHswfSwgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAoRUpCIDEuMTogMTQuMy4xLjIpCi1DSEtKMjgzNC5lamIxMT1DSEtKMjgzNEk6IEJlYW4gezB9LCBzcGVjaWZpZWQgaW4gdGhlIDxlamItcmVmPiBlbGVtZW50LCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIChFSkIgMS4xOiAxNC4zLjIpCi1DSEtKMjgzNS5lamIxMT1DSEtKMjgzNUk6IEJlYW4gezB9IGlzIGEgezF9IHR5cGUuIFVwZGF0ZSB0aGUgPGVqYi1yZWYtdHlwZT4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIChFSkIgMS4xOiAxNC4zLjIpCi1DSEtKMjgzNi5lamIxMT1DSEtKMjgzNkk6IEJlYW4gezB9IHVzZXMgaG9tZSB7MX0uIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50LiAoRUpCIDEuMTogMTQuMy4yKQotQ0hLSjI4MzcuZWpiMTE9Q0hLSjI4MzdJOiBCZWFuIHswfSB1c2VzIHJlbW90ZSB7MX0uIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50LiAoRUpCIDEuMTogMTQuMy4yKS4KLUNIS0oyODM4LmVqYjExPUNIS0oyODM4STogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgcmVmZXJlbmNlcyB0byBlbnRlcnByaXNlIGJlYW5zIGJlIG9yZ2FuaXplZCBpbiB0aGUgImVqYiIgc3ViY29udGV4dC4gKEVKQiAxLjE6IDE0LjMuMS4xKS4KLUNIS0oyODM5LmVqYjExPUNIS0oyODM5VzogVGhlIDxlbnYtZW50cnktbmFtZT4gZWxlbWVudCwgb2YgdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQsIGlzIGludmFsaWQuIChFSkIgMS4xOiAxNC4yLjEuMikKLQotQ0hLSjI4NDAuZWpiMTE9Q0hLSjI4NDBXOiBUaGUgPGVudi1lbnRyeS10eXBlPiBlbGVtZW50LCBvZiB0aGUgPGVudi1lbnRyeT4gZWxlbWVudCwgaXMgaW52YWxpZC4gKEVKQiAxLjE6IDE0LjIuMS4yKS4KLUNIS0oyODQxLmVqYjExPUNIS0oyODQxVzogVGhlIHswfSBuYW1lLCBpbiB0aGUgPGVudi1lbnRyeS1uYW1lPiBlbGVtZW50LCBjYW4gYmUgdXNlZCBvbmx5IG9uY2UgaW4gdGhlIGJlYW4uIChFSkIgMS4xOiAxNC4yLjEuMikuCi1DSEtKMjg0Mi5lamIxMT1DSEtKMjg0Mlc6IDxtZXRob2QtcGFyYW1zPiBpcyBpZ25vcmVkIHdoZW4gPG1ldGhvZC1uYW1lPiBpcyAiKiIuIChFSkIgMS4xOiAxMS40LjEsIDE1LjMuMikuCi1DSEtKMjg0My5lamIxMT1DSEtKMjg0M1c6IE5vIG1ldGhvZHMsIG9uIHswfSwgbWF0Y2ggdGhpcyA8bWV0aG9kPi4gKEVKQiAxLjE6IDExLjQuMSwgMTUuMy4yKS4KLUNIS0oyODQ0LmVqYjExPUNIS0oyODQ0VzogQXQgbGVhc3Qgb25lIDxtZXRob2Q+IHNob3VsZCBiZSBzZXQgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+LiAoRUpCIDEuMTogMTEuNC4xLCAxNS4zLjIpLgotQ0hLSjI4NDUuZWpiMTE9Q0hLSjI4NDVXOiBBdCBsZWFzdCBvbmUgPHJvbGUtbmFtZT4gc2hvdWxkIGJlIHNldCBpbiBhIDxtZXRob2QtcGVybWlzc2lvbj4uIChFSkIgMS4xOiAxMS40LjEsIDE1LjMuMikuCi1DSEtKMjg0Ni5lamIxMT1DSEtKMjg0Nlc6IE5vIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGZvciB0aGlzIDxtZXRob2QtcGVybWlzc2lvbj4uIChFSkIgMS4xOiAxNS4zLjIpLgotQ0hLSjI4NDcuZWpiMTE9Q0hLSjI4NDdXOiBObyBtZXRob2RzIGNhbiBiZSBmb3VuZCBmb3IgdGhpcyA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPi4gKEVKQiAxLjE6IDExLjQuMSkuCi1DSEtKMjg0OS5lamIxMT1DSEtKMjg0OVc6IENhbm5vdCB2YWxpZGF0ZSBjb21wb25lbnQgaW5oZXJpdGFuY2Ugb2YgezB9IGJlY2F1c2UgezF9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjg1MC5lamIxMT1DSEtKMjg1MFc6IENhbm5vdCB2YWxpZGF0ZSA8bWV0aG9kPiBiZWNhdXNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4NTEuZWpiMTE9Q0hLSjI4NTFXOiBDYW5ub3QgdmFsaWRhdGUgezB9IGJlY2F1c2UgezF9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjg1Mi5lamIxMT1DSEtKMjg1Mlc6IFRocm93YWJsZSBjYXVnaHQgd2hpbGUgdmFsaWRhdGluZyB0aGUgZWpiLWphci54bWwuIFRoZSBiZWFuIGJlaW5nIHZhbGlkYXRlZCB3YXMgezB9LgotQ0hLSjI4NTMuZWpiMTE9Q0hLSjI4NTNXOiBUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHZhbGlkYXRpbmcgdGhlIGlibS1lamItamFyLWV4dC54bWkuIFRoZSBiZWFuIGJlaW5nIHZhbGlkYXRlZCB3YXMgezB9LgotCi1DSEtKMjkwOC5lamIxMT1DSEtKMjkwOFc6IEFuIGVudGVycHJpc2UgYmVhbiBjYW5ub3QgYmUgcmVmbGVjdGVkIHByb3Blcmx5LiBSdW4gdGhlIFhNTCB2YWxpZGF0b3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUNIS0oyODk1LmVqYjExPUNIS0oyODk1VzogPGVqYi1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyLnhtbCBmaWxlIChFSkIgMS4xOiAxNi41KS4KLUNIS0oyODc1LmVqYjExPUNIS0oyODc1RTogPGVqYi1jbGllbnQtamFyPiB7MH0gbXVzdCBleGlzdCBpbiBldmVyeSBFQVIgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgRUpCIG1vZHVsZSAoRUpCIDEuMTogMTYuNSwgMTcuNCkuCi0KLQotIyBFSkJfTUVUSE9EX0JFQU5fTlVMTD1DSEtKMjQzNFc6IFZhbGlkYXRpb24gb2YgdGhpcyBtZXRob2Qgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgYmVhbiBjbGFzcyBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgYmVhbiBjbGFzcycnIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9NRVRIT0RfSE9NRV9OVUxMPUNIS0oyNDM1VzogVmFsaWRhdGlvbiBvZiB0aGlzIG1ldGhvZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBob21lIGludGVyZmFjZSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgaG9tZSBpbnRlcmZhY2UnJ3MgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX01FVEhPRF9SRU1PVEVfTlVMTD1DSEtKMjQzNlc6IFZhbGlkYXRpb24gb2YgdGhpcyBtZXRob2Qgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgcmVtb3RlIGludGVyZmFjZSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgcmVtb3RlIGludGVyZmFjZScncyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfTUVUSE9EX05VTEw9Q0hLSjI0MzdXOiBWYWxpZGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGVudGVycHJpc2UgYmVhbiBjYW5ub3QgYmUgZm91bmQuCi0jIEVKQl9NRVRIT0RfS0VZX05VTEw9Q0hLSjI0MzhXOiBWYWxpZGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIHByaW1hcnkga2V5IGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBrZXkgY2xhc3MnJyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfUkVNT1RFX05VTEw9Q0hLSjI5MDRFOiBWYWxpZGF0aW9uIG9mIHswfSB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSByZW1vdGUgaW50ZXJmYWNlIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIGl0cyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfTlVMTD1DSEtKMjkwM0U6IFZhbGlkYXRpb24gd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNhbm5vdCBiZSBmb3VuZC4KLSMgRUpCX05PVFJFRkxFQ1RFRF9KQVZBQ0xBU1M9Q0hLSjI5MDdFOiBDYW5ub3QgdmFsaWRhdGUgYmVjYXVzZSB0aGUgezB9IHR5cGUgY2Fubm90IGJlIHJlZmxlY3RlZC4gRW5zdXJlIHRoYXQgaXQsIGFuZCBhbGwgb2YgaXRzIGRlcGVuZGVuY2llcywgYXJlIGluY2x1ZGVkIGluIHRoZSBjbGFzc3BhdGguCi0jIEVKQl9GSUVMRF9DQU5OT1RfUkVGTEVDVD1DSEtKMjIwOFc6IFR5cGUgezB9IG9mIGZpZWxkIHsxfSBjYW5ub3QgYmUgcmVmbGVjdGVkLiBFbnN1cmUgdGhhdCB7MH0sIGFuZCBhbGwgb2YgaXRzIGRlcGVuZGVuY2llcywgYXJlIGluY2x1ZGVkIGluIHRoZSBjbGFzc3BhdGguCi0jIEVKQl9GSUVMRF9CRUFOX05VTEw9Q0hLSjIyMDlXOiBWYWxpZGF0aW9uIG9mIHRoaXMgZmllbGQgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgYmVhbiBjbGFzcyBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgYmVhbiBjbGFzcycnIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9GSUVMRF9IT01FX05VTEw9Q0hLSjIyMTBXOiBWYWxpZGF0aW9uIG9mIHRoaXMgZmllbGQgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgaG9tZSBpbnRlcmZhY2UgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIGhvbWUgaW50ZXJmYWNlJydzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9GSUVMRF9SRU1PVEVfTlVMTD1DSEtKMjIxMVc6IFZhbGlkYXRpb24gb2YgdGhpcyBmaWVsZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSByZW1vdGUgaW50ZXJmYWNlIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlJydzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9GSUVMRF9OVUxMPUNIS0oyMjEyVzogVmFsaWRhdGlvbiBvZiB0aGlzIGZpZWxkIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGVudGVycHJpc2UgYmVhbiBjYW5ub3QgYmUgZm91bmQuCi0jIEVKQl9GSUVMRF9LRVlfTlVMTD1DSEtKMjIxM1c6IFZhbGlkYXRpb24gb2YgdGhpcyBmaWVsZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBwcmltYXJ5IGtleSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUga2V5IGNsYXNzJycgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX0hBU19NVUxUSVBMRV9QS19NRVRIT0RTPUNIS0oyMDAwVzogVGhlIHswfSBob21lIGludGVyZmFjZSBtdXN0IGNvbnRhaW4gb25seSBvbmUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIChFSkIgMS4xOiA5LjIuOCkKLSMgRUpCX0hPTUVfTlVMTD1DSEtKMjkwMUU6IFZhbGlkYXRpb24gb2YgezB9IHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGhvbWUgaW50ZXJmYWNlIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIGl0cyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfS0VZX05VTEw9Q0hLSjI5MDJFOiBWYWxpZGF0aW9uIG9mIHswfSB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBrZXkgY2xhc3MgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgaXRzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9CRUFOX05VTEw9Q0hLSjI5MDBFOiBWYWxpZGF0aW9uIG9mIHswfSB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIGl0cyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfQk1QX05PRklFTERTPUNIS0oyMDQyVzogVG8gaGF2ZSBhIHByaW1hcnkga2V5LCB0aGUgezB9IGJlYW4gY2xhc3MgbXVzdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSBmaWVsZC4gKEVKQiAxLjE6IDkuMS41LjEpCi0jIEVKQl9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMjgyMUU6IENhbm5vdCBvcGVuIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlLgotIyBFSkJfRERfTUVUSFRSQU5TQUNUSU9OX05PX1RSQU5TQUNUSU9OPUNIS0oyODQ4VzogQXQgbGVhc3Qgb25lIDx0cmFucy1hdHRyaWJ1dGU+IG11c3QgYmUgc2V0IGluIGEgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4uIChFSkIgMS4xOiAxMS40LjEpCi0KLSMKLSMgZW5kIG9mIG1lc3NhZ2VzIGZvciB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0jCi0KLSMKLSMgTWVzc2FnZXMgZm9yIEVKQiAyLjAgc3BlY2lmaWNhdGlvbgotIwotQ0hLSjI4MjguZWpiMjA9Q0hLSjI4MjhFOiBDYW5ub3QgdXNlIGEgPHByaW1rZXktZmllbGQ+IHdpdGhvdXQgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkgKEVKQiAyLjA6IDEwLjguMSwgMjIuNSkuCi1DSEtKMjgyOS5lamIyMD1DSEtKMjgyOUU6IEtleSBjbGFzcyB7MH0gZG9lcyBub3QgbWFwIHRvIGFueSBmaWVsZHMgaW4gZW50ZXJwcmlzZSBiZWFuIHsxfS4gKEVKQiAyLjA6IDEwLjgsIDIyLjUpLgotQ0hLSjI4MzkuZWpiMjA9Q0hLSjI4MzlXOiBUaGUgPGVudi1lbnRyeS1uYW1lPiBlbGVtZW50LCBvZiB0aGUgPGVudi1lbnRyeT4gZWxlbWVudCwgaXMgaW52YWxpZC4gKEVKQiAyLjA6IDIwLjIuMS4yKS4KLUNIS0oyODQwLmVqYjIwPUNIS0oyODQwVzogVGhlIDxlbnYtZW50cnktdHlwZT4gZWxlbWVudCwgb2YgdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQsIGlzIGludmFsaWQuIChFSkIgMi4wOiAyMC4yLjEuMikuCi1DSEtKMjg0MS5lamIyMD1DSEtKMjg0MVc6IFRoZSB7MH0gbmFtZSwgaW4gdGhlIDxlbnYtZW50cnktbmFtZT4gZWxlbWVudCwgY2FuIGJlIHVzZWQgb25seSBvbmNlIGluIHRoZSBiZWFuLiAoRUpCIDIuMDogMjAuMi4xLjIpLgotQ0hLSjI4MzAuZWpiMjA9Q0hLSjI4MzBXOiBUaGUgdHlwZSBvZiB0aGUgezB9IGZpZWxkIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgzMS5lamIyMD1DSEtKMjgzMVc6IHswfSBtdXN0IGJlIGRlY2xhcmVkIGluIGEgPGNtcC1maWVsZD4gZWxlbWVudC4gKEVKQiAyLjA6IDEwLjguMikuCi1DSEtKMjgwMS5lamIyMD1DSEtKMjgwMUU6IFRoZSB2YWx1ZSBvZiB0aGUgPGVqYi1uYW1lPiBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkLiAoRUpCIDIuMCAyMi4yLCAyMi41KS4KLUNIS0oyODA5LmVqYjIwPUNIS0oyODA5RTogVGhlIHZhbHVlIG9mIHRoZSA8cGVyc2lzdGVuY2UtdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiQ29udGFpbmVyIiBvciAiQmVhbiIuICAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgwNi5lamIyMD1DSEtKMjgwNkU6IFRoZSB2YWx1ZSBvZiB0aGUgPHJlZW50cmFudD4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiVHJ1ZSIgb3IgIkZhbHNlIi4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDcuZWpiMjA9Q0hLSjI4MDdFOiBUaGUgdmFsdWUgb2YgdGhlIDxzZXNzaW9uLXR5cGU+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIlN0YXRlZnVsIiBvciAiU3RhdGVsZXNzIi4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDguZWpiMjA9Q0hLSjI4MDhFOiBUaGUgdmFsdWUgb2YgdGhlIDx0cmFuc2FjdGlvbi10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJDb250YWluZXIiIG9yICJCZWFuIi4gKEVKQiAyLjA6IDE3LjMuNiwgMjIuMiwgMjIuNSkuCi1DSEtKMjgxNC5lamIyMD1DSEtKMjgxNFc6IDxlamItbmFtZT4sIGluIDxtZXRob2Q+LCBzaG91bGQgc3BlY2lmeSBhIGtub3duIGVudGVycHJpc2UgYmVhbi4gKEVKQiAyLjA6IDE3LjQuMSwgMjEuMy4yLCAyMi41KS4KLUNIS0oyODQyLmVqYjIwPUNIS0oyODQyVzogPG1ldGhvZC1wYXJhbXM+IGlzIGlnbm9yZWQgd2hlbiA8bWV0aG9kLW5hbWU+IGlzICIqIi4gKEVKQiAyLjA6IDE3LjQuMSwgMjEuMy4yKS4KLUNIS0oyODQzLmVqYjIwPUNIS0oyODQzVzogTm8gbWV0aG9kcywgb24gezB9LCBtYXRjaCB0aGlzIDxtZXRob2Q+LiAoRUpCIDIuMDogMTcuNC4xLCAyMS4zLjIpLgotQ0hLSjI4NDQuZWpiMjA9Q0hLSjI4NDRXOiBBdCBsZWFzdCBvbmUgPG1ldGhvZD4gc2hvdWxkIGJlIHNldCBpbiBhIDxtZXRob2QtcGVybWlzc2lvbj4uIChFSkIgMi4wOiAxNy40LjEsIDIxLjMuMikuCi1DSEtKMjg0NS5lamIyMD1DSEtKMjg0NVc6IEEgPHJvbGUtbmFtZT4gb3IgYW4gPHVuY2hlY2tlZD4gZWxlbWVudCBzaG91bGQgYmUgc2V0IGluIGEgPG1ldGhvZC1wZXJtaXNzaW9uPi4gKEVKQiAyLjA6IDE3LjQuMSwgMjEuMy4yKS4KLUNIS0oyODQ2LmVqYjIwPUNIS0oyODQ2VzogTm8gbWV0aG9kcyBjYW4gYmUgZm91bmQgZm9yIHRoaXMgPG1ldGhvZC1wZXJtaXNzaW9uPi4gKEVKQiAyLjA6IDIxLjMuMikuCi1DSEtKMjg0Ny5lamIyMD1DSEtKMjg0N1c6IE5vIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGZvciB0aGlzIDxjb250YWluZXItdHJhbnNhY3Rpb24+LiAoRUpCIDIuMDogMTcuNC4xKS4KLUNIS0oyODEyLmVqYjIwPUNIS0oyODEyRTogQmVhbiBjbGFzcyB7MH0gbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBvZiBpdHMgZmllbGRzIGFzIGEgPGNtcC1maWVsZD4uIChFSkIgMi4wOiAyMi41KS4KLUNIS0oyODMyLmVqYjIwPUNIS0oyODMySTogSG9tZSB7MH0sIHNwZWNpZmllZCBpbiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQsIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gKEVKQiAyLjA6IDIwLjMuMS4yKS4KLUNIS0oyODMzLmVqYjIwPUNIS0oyODMzSTogUmVtb3RlIHswfSwgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAoRUpCIDIuMDogMjAuMy4xLjIpLgotQ0hLSjI4MzQuZWpiMjA9Q0hLSjI4MzRJOiBCZWFuIHswfSwgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAoRUpCIDIuMDogMjAuMy4yKS4KLUNIS0oyODM1LmVqYjIwPUNIS0oyODM1STogQmVhbiB7MH0gaXMgYSB7MX0gdHlwZS4gVXBkYXRlIHRoZSA8ZWpiLXJlZi10eXBlPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gKEVKQiAyLjA6IDIwLjMuMikuCi1DSEtKMjgzNi5lamIyMD1DSEtKMjgzNkk6IEJlYW4gezB9IHVzZXMgaG9tZSB7MX0uIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50LiAoRUpCIDIuMDogMjAuMy4yKS4KLUNIS0oyODM3LmVqYjIwPUNIS0oyODM3STogQmVhbiB7MH0gdXNlcyByZW1vdGUgezF9LiBVcGRhdGUgdGhlIDxlamItcmVmPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gKEVKQiAyLjA6IDIwLjMuMikuCi1DSEtKMjgzOC5lamIyMD1DSEtKMjgzOEk6IEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gZW50ZXJwcmlzZSBiZWFucyBiZSBvcmdhbml6ZWQgaW4gdGhlICJlamIiIHN1YmNvbnRleHQuIChFSkIgMi4wOiAyMC4zLjEuMSkuCi1DSEtKMjgyMC5lamIyMD1DSEtKMjgyMFc6IFRoZSBzZWN1cml0eSByb2xlIHJlZiBpcyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlLgotQ0hLSjI4MjIuZWpiMjA9Q0hLSjI4MjJXOiA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQgZm9yIGJlYW4gezB9IHNob3VsZCBkZWZpbmUgdGhlIDxyb2xlLW5hbWU+IGVsZW1lbnQuIChFSkIgMi4wOiAyMS4yLjUuMykuCi1DSEtKMjgyMy5lamIyMD1DSEtKMjgyM1c6IDxzZWN1cml0eS1yb2xlLXJlZj4gZWxlbWVudCBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1saW5rPiBlbGVtZW50LiAoRUpCIDIuMDogMjEuMy4zKS4KLUNIS0oyODI0LmVqYjIwPUNIS0oyODI0VzogPHNlY3VyaXR5LXJvbGUtcmVmPiBlbGVtZW50IHJlZmVycyB0byB1bmtub3duIHJvbGUgezB9LiAoRUpCIDIuMDogMjEuMy4zKS4KLUNIS0oyODI1LmVqYjIwPUNIS0oyODI1VzogPHNlY3VyaXR5LXJvbGU+IGVsZW1lbnQgaW4gZWpiLWphci54bWwgc2hvdWxkIGRlZmluZSB0aGUgPHJvbGUtbmFtZT4gZWxlbWVudC4gKEVKQiAyLjA6IDIxLjMuMSkuCi1DSEtKMjgyNi5lamIyMD1DSEtKMjgyNlc6IFRoZSBzZWN1cml0eS1yb2xlIG5hbWUgbXVzdCBiZSB1bmlxdWUuIChFSkIgMi4wOiAyMS4zLjEpLgotQ0hLSjI4MjcuZWpiMjA9Q0hLSjI4MjdXOiBDYW5ub3QgdXNlIGEgPHJvbGUtbGluaz4gZWxlbWVudCB3aXRob3V0IDxzZWN1cml0eS1yb2xlPiBlbGVtZW50cy4gKEVKQiAyLjA6IDIxLjIuNS4zLCAyMS4zLjEsIDIxLjMuMykuCi1DSEtKMjg1MC5lamIyMD1DSEtKMjg1MFc6IENhbm5vdCB2YWxpZGF0ZSA8bWV0aG9kPiBiZWNhdXNlIHRoZSB7MH0gdHlwZSBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4NTEuZWpiMjA9Q0hLSjI4NTFXOiBDYW5ub3QgdmFsaWRhdGUgezB9IGJlY2F1c2UgdHlwZSB7MX0gY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODc1LmVqYjIwPUNIS0oyODc1RTogPGVqYi1jbGllbnQtamFyPiB7MH0gbXVzdCBleGlzdCBpbiBldmVyeSBFQVIgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgRUpCIG1vZHVsZSAoRUpCIDIuMDogMjIuNSwgMjMuNCwgMjMuNikuCi0KLUNIS0oyMDAzRS5lamIyMD1DSEtKMjAwM0U6IFRoaXMgY2xhc3MgbXVzdCBub3QgaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uIChFSkIgMi4wOiA3LjUuMywgNy4xMC4yLCAxNy4zLjQuMSkuCi1DSEtKMjAwM0kuZWpiMjA9Q0hLSjIwMDNJOiBCZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gc3RhdGVmdWwgc2Vzc2lvbiBiZWFucyBuZWVkIG5vdCBpbXBsZW1lbnQgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gKEVKQiAyLjA6IDcuNS4zLCA3LjEwLjIsIDE3LjMuNC4xKS4KLUNIS0oyODAyLm5hbWVkLmVqYjIwPUNIS0oyODAyRTogPGVqYi1jbGFzcz4gY2xhc3MgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwMi51bm5hbWVkLmVqYjIwPUNIS0oyODAyRTogVGhlIGJlYW4gY2xhc3MsIGlkZW50aWZpZWQgYnkgdGhlIDxlamItY2xhc3M+IGVsZW1lbnQsIGNhbm5vdCBiZSBmb3VuZC4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDMubmFtZWQuZWpiMjA9Q0hLSjI4MDNFOiA8aG9tZT4gaW50ZXJmYWNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDMudW5uYW1lZC5lamIyMD1DSEtKMjgwM0U6IFVua25vd24gaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODA0Lm5hbWVkLmVqYjIwPUNIS0oyODA0RTogPHJlbW90ZT4gaW50ZXJmYWNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDQudW5uYW1lZC5lamIyMD1DSEtKMjgwNEU6IFVua25vd24gaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgPHJlbW90ZT4gZWxlbWVudC4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDUubmFtZWQuZWpiMjA9Q0hLSjI4MDVFOiA8bG9jYWwtaG9tZT4gaW50ZXJmYWNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDUudW5uYW1lZC5lamIyMD1DSEtKMjgwNUU6IFVua25vd24gaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgPGxvY2FsLWhvbWU+IGVsZW1lbnQuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODAwLm5hbWVkLmVqYjIwPUNIS0oyODAwRTogPGxvY2FsPiBpbnRlcmZhY2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwMC51bm5hbWVkLmVqYjIwPUNIS0oyODAwRTogVW5rbm93biBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSA8bG9jYWw+IGVsZW1lbnQuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODEwLm5hbWVkLmVqYjIwPUNIS0oyODEwRTogPHByaW0ta2V5LWNsYXNzPiBjbGFzcyB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODEwLnVubmFtZWQuZWpiMjA9Q0hLSjI4MTBFOiBVbmtub3duIGNsYXNzIHNwZWNpZmllZCBpbiB0aGUgPHByaW0ta2V5LWNsYXNzPiBlbGVtZW50LiAgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MTEuZWpiMjA9Q0hLSjI4MTFFOiA8ZmllbGQtbmFtZT4gezB9IGNhbm5vdCBiZSBsb2NhdGVkIG9uIGJlYW4gY2xhc3MgezF9LiAoRUpCIDIuMDogMjIuNSkuCi0KLUNIS0oyMTAzLmVqYjIwPUNIS0oyMTAzRTogSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgezB9IGJlYW4gY2xhc3MgbXVzdCBpbmhlcml0IHsxfSAoRUpCIDIuMDogRC4yKQotQ0hLSjIxMDQuZWpiMjA9Q0hLSjIxMDRFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gaG9tZSBpbnRlcmZhY2UgbXVzdCBub3QgaW5oZXJpdCB7MX0uIChFSkIgMi4wOiBELjIpLgotQ0hLSjIxMDUuZWpiMjA9Q0hLSjIxMDVFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gY29tcG9uZW50IGludGVyZmFjZSBtdXN0IGluaGVyaXQgezF9LiAoRUpCIDIuMDogRC4yKS4KLUNIS0oyMTA2LmVqYjIwPUNIS0oyMTA2RTogIEJlYW4gezB9IG11c3QgdXNlIHsxfSBhcyBpdHMgPHByaW0ta2V5LWNsYXNzPiAoRUpCIDIuMDogRC4yKS4KLUNIS0oyODQ5LmVqYjIwPUNIS0oyODQ5VzogQ2Fubm90IHZhbGlkYXRlIGNvbXBvbmVudCBpbmhlcml0YW5jZSBvZiB7MH0gYmVjYXVzZSB0aGUgezF9IHR5cGUsIG9yIG9uZSBvZiBpdHMgZGVwZW5kZW5jaWVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotCi1DSEtKMjg5NS5lamIyMD1DSEtKMjg5NVc6IDxlamItbmFtZT4gezB9IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphci54bWwgZmlsZSAoRUpCIDIuMDogMjIuNSkuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGNsYXNzL2ludGVyZmFjZSBjaGVja3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGltcGxlbWVudCBTZXNzaW9uQmVhbi9FbnRpdHlCZWFuL01lc3NhZ2VEcml2ZW5CZWFuL01lc3NhZ2VMaXN0ZW5lcgotQ0hLSjIwMTcuc2IuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHswfSAoRUpCIDIuMDogNy41LjEsIDcuMTAuMikuCi1DSEtKMjAxNy5tYi5lamIyMD1DSEtKMjAxN0U6IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgezB9IChFSkIgMi4wOiAxNS40LjEsIDE1LjcuMikuCi1DSEtKMjAxNy5jYi5lamIyMD1DSEtKMjAxN0U6IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgezB9IChFSkIgMi4wOiAxMC42LjIpLgotQ0hLSjIwMTcuYmIuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHswfSAoRUpCIDIuMDogMTIuMi4yKS4KLQotIyBpbXBsZW1lbnQgRUpCSG9tZQotQ0hLSjIwMTcuc3JoLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkhvbWUgKEVKQiAyLjA6IDYuMywgNy4xMC42KS4KLUNIS0oyMDE3LmNyaC5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJIb21lIChFSkIgMi4wOiA5LjUsIDEwLjYuMTApLgotQ0hLSjIwMTcuYnJoLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkhvbWUgKEVKQiAyLjA6IDkuNSwgMTIuMi45KS4KLQotIyBpbXBsZW1lbnQgRUpCTG9jYWxIb21lCi1DSEtKMjAxNy5zbGguZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxIb21lIChFSkIgMi4wOiA2LjQsIDcuMTAuOCkuCi1DSEtKMjAxNy5jbGguZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxIb21lIChFSkIgMi4wOiA5LjYsIDEwLjYuMTIpLgotQ0hLSjIwMTcuYmxoLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkxvY2FsSG9tZSAoRUpCIDIuMDogOS42LCAxMi4yLjExKS4KLQotIyBpbXBsZW1lbnQgRUpCT2JqZWN0Ci1DSEtKMjAxNy5zcmMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCT2JqZWN0IChFSkIgMi4wOiA2LjUsIDcuMTAuNSkuCi1DSEtKMjAxNy5jcmMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCT2JqZWN0IChFSkIgMi4wOiA5LjksIDEwLjYuOSkuCi1DSEtKMjAxNy5icmMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCT2JqZWN0IChFSkIgMi4wOiA5LjksIDEyLjIuOCkuCi0KLSMgaW1wbGVtZW50IEVKQkxvY2FsT2JqZWN0Ci1DSEtKMjAxNy5zbGMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QgKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjAxNy5jbGMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QgKEVKQiAyLjA6IDkuMTAsIDEwLjYuMTApLgotQ0hLSjIwMTcuYmxjLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkxvY2FsT2JqZWN0IChFSkIgMi4wOiA5LjEwLCAxMi4yLjEwKS4KLQotIyBpbXBsIGNvbXBvbmVudCBpbnRlcmZhY2UKLUNIS0oyMDQwLmNiLmVqYjIwPUNIS0oyMDQwSTogInRoaXMiIG11c3Qgbm90IGJlIHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQgKEVKQiAyLjA6IDEwLjYuMikuCi1DSEtKMjA0MC5iYi5lamIyMD1DSEtKMjA0MEk6ICJ0aGlzIiBtdXN0IG5vdCBiZSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiAxMi4yLjIpLgotQ0hLSjIwNDAuc2IuZWpiMjA9Q0hLSjIwNDBJOiAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdCAoRUpCIDIuMDogNy4xMC4yKS4KLQotIyBiZWFuIGNsYXNzCi1DSEtKMjAxNC5jYi5lamIyMD1DSEtKMjAxNFc6IFRoaXMgY2xhc3MgbXVzdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTAuMy4xLCAxMC40LjEsIDEwLjYuMikuCi1DSEtKMjAxNC5tYi5lamIyMD1DSEtKMjAxNFc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDE1LjcuMikuCi1DSEtKMjAxNC5iYi5lamIyMD1DSEtKMjAxNFc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEyLjIuMikuCi1DSEtKMjAxNC5zYi5lamIyMD1DSEtKMjAxNFc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDcuMTAuMSkuCi0KLUNIS0oyMDIyLmNiLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyMDIyLm1iLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy4yKS4KLUNIS0oyMDIyLmJiLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi4yKS4KLUNIS0oyMDIyLnNiLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogNy4xMC4xKS4KLUNIS0oyMDIyLmtjLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuOC4yKS4KLQotQ0hLSjIwMTUuY2IuZWpiMjA9Q0hLSjIwMTVXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC42LjIpLgotQ0hLSjIwMTUubWIuZWpiMjA9Q0hLSjIwMTVXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjIwMTUuYmIuZWpiMjA9Q0hLSjIwMTVXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjIpLgotQ0hLSjIwMTUuc2IuZWpiMjA9Q0hLSjIwMTVXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjEwLjEpLgotCi0jIGRlcGVuZGVudCB2YWx1ZSBjbGFzcwotQ0hLSjIwMTguZWpiMjA9Q0hLSjIwMThXOiBUaGlzIGNsYXNzIG11c3QgYmUgc2VyaWFsaXphYmxlIChFSkIgMi4wOiAxMC4zLjMsIDEwLjYuMykuCi1DSEtKMjA0My5lamIyMD1DSEtKMjA0M1c6IFRoaXMgY2xhc3MgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuMykuCi1DSEtKMjA0NC5lamIyMD1DSEtKMjA0NFc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEwLjYuMykuCi0KLSMga2V5IGNsYXNzCi1DSEtKMjAxOS5rYy5lamIyMD1DSEtKMjAxOVc6IFRoaXMgY2xhc3MgbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AgKEVKQiAyLjA6IDkuOCwgMTAuNi4xMykuCi1DSEtKMjAxOS5rYi5lamIyMD1DSEtKMjAxOVc6IFRoaXMgY2xhc3MgbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AgKEVKQiAyLjA6IDkuOCwgMTIuMi4xMikuCi0KLQotIyMjCi0jIG1ldGhvZHMgd2hpY2ggbXVzdCBleGlzdAotIyMjCi0jIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycwotQ0hLSjIwNTAuY29uc3RyLnNiLmVqYjIwPUNIS0oyMDUwVzogcHVibGljIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiA3LjEwLjIpLgotQ0hLSjIwNTAuY29uc3RyLmNiLmVqYjIwPUNIS0oyMDUwVzogcHVibGljIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjYuMikuCi1DSEtKMjA1MC5jb25zdHIuYmIuZWpiMjA9Q0hLSjIwNTBXOiBwdWJsaWMgezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xLCAxMi4yLjIpLgotQ0hLSjIwNTAuY29uc3RyLm1iLmVqYjIwPUNIS0oyMDUwVzogcHVibGljIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjIwNTAuY29uc3RyLmtjLmVqYjIwPUNIS0oyMDUwVzogcHVibGljIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC44LjIpLgotCi0KLSMgYWNjZXNzb3IgbWV0aG9kCi1DSEtKMjA1MC5hY2MuY2IuZWpiMjA9Q0hLSjIwNTBFOiBUaGlzIGNsYXNzIG11c3QgZGVmaW5lIHswfSAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjIwNTAub25NZXNzYWdlLm1iLmVqYjIwPUNIS0oyMDUwVzogb25NZXNzYWdlKGphdmF4Lmptcy5NZXNzYWdlKSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxNS40LjIsIDE1LjcuNCkuCi0KLUNIS0oyMDUwLmVqYkNyZWF0ZS5zZmIuZWpiMjA9Q0hLSjIwNTBXOiBBdCBsZWFzdCBvbmUgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA3LjUuNSkuCi1DSEtKMjA1MC5lamJDcmVhdGUuc3NiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkNyZWF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA3LjgpLgotQ0hLSjIwNTAuZWpiQ3JlYXRlLm1iLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkNyZWF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxNS40LjQsIDE1LjcuMikuCi0KLUNIS0oyMDUwLmVqYkZpbmRCeVByaW1hcnlLZXkuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMi41KS4KLQotQ0hLSjIwNTAuc2V0RW50aXR5Q29udGV4dC5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBzZXRFbnRpdHlDb250ZXh0KEVudGl0eUNvbnRleHQpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuc2V0RW50aXR5Q29udGV4dC5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBzZXRFbnRpdHlDb250ZXh0KEVudGl0eUNvbnRleHQpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi0KLUNIS0oyMDUwLnVuc2V0RW50aXR5Q29udGV4dC5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSB1bnNldEVudGl0eUNvbnRleHQoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLnVuc2V0RW50aXR5Q29udGV4dC5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSB1bnNldEVudGl0eUNvbnRleHQoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC5lamJBY3RpdmF0ZS5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJBY3RpdmF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuZWpiQWN0aXZhdGUuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiQWN0aXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC5lamJQYXNzaXZhdGUuY2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUGFzc2l2YXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5lamJQYXNzaXZhdGUuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUGFzc2l2YXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyMDUwLmVqYlBhc3NpdmF0ZS5zYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJQYXNzaXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogNy41LjEpLgotCi1DSEtKMjA1MC5lamJSZW1vdmUuY2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUmVtb3ZlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5lamJSZW1vdmUuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUmVtb3ZlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyMDUwLmVqYlJlbW92ZS5tYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJSZW1vdmUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyMDUwLmVqYlJlbW92ZS5zYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJSZW1vdmUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogNC4yLjIsIDcuNS4xKS4KLQotQ0hLSjIwNTAuZWpiTG9hZC5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJMb2FkKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5lamJMb2FkLmJiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkxvYWQoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC5lamJTdG9yZS5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJTdG9yZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuZWpiU3RvcmUuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiU3RvcmUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC5jcmVhdGUuc3NyaC5lamIyMD1DSEtKMjA1MFc6IFRoZSBjcmVhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogNy44LCA3LjEwLjYpLgotQ0hLSjIwNTAuY3JlYXRlLnNzbGguZWpiMjA9Q0hLSjIwNTBXOiBUaGUgY3JlYXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDcuOCwgNy4xMC44KS4KLQotQ0hLSjIwNTAuY3JlYXRlLnNyaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBjcmVhdGUgbWV0aG9kIChFSkIgMi4wOiA2LjMuMSwgNy4xMC42KS4KLUNIS0oyMDUwLmNyZWF0ZS5zbGguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgY3JlYXRlIG1ldGhvZCAoRUpCIDIuMDogNi40LjEsIDcuMTAuOCkuCi0KLUNIS0oyMDUwLmZpbmQuY3JoLmVqYjIwPUNIS0oyMDUwVzogQXQgbGVhc3Qgb25lIGZpbmRlciBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogOS41LjIpLgotQ0hLSjIwNTAuZmluZC5icmguZWpiMjA9Q0hLSjIwNTBXOiBBdCBsZWFzdCBvbmUgZmluZGVyIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjUuMikuCi1DSEtKMjA1MC5maW5kLmNsaC5lamIyMD1DSEtKMjA1MFc6IEF0IGxlYXN0IG9uZSBmaW5kZXIgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNi4yKS4KLUNIS0oyMDUwLmZpbmQuYmxoLmVqYjIwPUNIS0oyMDUwVzogQXQgbGVhc3Qgb25lIGZpbmRlciBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogOS42LjIpLgotCi1DSEtKMjA1MC5ob21lLmNyaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBob21lIG1ldGhvZCAoRUpCIDIuMDogOS41LjQpLgotQ0hLSjIwNTAuaG9tZS5icmguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgaG9tZSBtZXRob2QgKEVKQiAyLjA6IDkuNS40KS4KLUNIS0oyMDUwLmhvbWUuY2xoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjYuNCkuCi1DSEtKMjA1MC5ob21lLmJsaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBob21lIG1ldGhvZCAoRUpCIDIuMDogOS42LjQpLgotCi1DSEtKMjA1MC5lamJIb21lLmNyaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGVqYkhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjUuNCkuCi1DSEtKMjA1MC5lamJIb21lLmJyaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGVqYkhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjUuNCkuCi1DSEtKMjA1MC5lamJIb21lLmNsaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGVqYkhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjYuNCkuCi1DSEtKMjA1MC5lamJIb21lLmJsaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGVqYkhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjYuNCkuCi0KLUNIS0oyMDUwLmhhc2hDb2RlLmtiLmVqYjIwPUNIS0oyMDUwVzogaGFzaENvZGUoKSBtdXN0IGV4aXN0IG9uIHRoaXMgY2xhc3MgKEVKQiAyLjA6IDEyLjIuMTIpLgotQ0hLSjIwNTAuaGFzaENvZGUua2MuZWpiMjA9Q0hLSjIwNTBXOiBoYXNoQ29kZSgpIG11c3QgZXhpc3Qgb24gdGhpcyBjbGFzcyAoRUpCIDIuMDogMTAuNi4xMykuCi0KLUNIS0oyMDUwLmVxdWFscy5rYi5lamIyMD1DSEtKMjA1MFc6IGVxdWFscyhPYmplY3QpIG11c3QgZXhpc3Qgb24gdGhpcyBjbGFzcyAoRUpCIDIuMDogMTIuMi4xMikuCi1DSEtKMjA1MC5lcXVhbHMua2MuZWpiMjA9Q0hLSjIwNTBXOiBlcXVhbHMoT2JqZWN0KSBtdXN0IGV4aXN0IG9uIHRoaXMgY2xhc3MgKEVKQiAyLjA6IDEwLjYuMTMpLgotCi0jIGVqYlNlbGVjdCAtIG5lZWRlZD8gcGwxNzQgc2F5cyB6ZXJvIG9yIG1vcmUsIHAuMTkzIHNheXMgb25lIG9yIG1vcmUKLUNIS0oyMDUwLmVqYlNlbGVjdC5jYi5lamIyMD1DSEtKMjA1MFc6IEFuIGVqYlNlbGVjdCBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjcpLgotCi1DSEtKMjA1MC5maW5kQnlQcmltYXJ5S2V5LmNyaC5lamIyMD1DSEtKMjA1MFc6IGZpbmRCeVByaW1hcnlLZXkgbXVzdCBleGlzdCAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjIwNTAuZmluZEJ5UHJpbWFyeUtleS5jbGguZWpiMjA9Q0hLSjIwNTBXOiBmaW5kQnlQcmltYXJ5S2V5IG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLUNIS0oyMDUwLmZpbmRCeVByaW1hcnlLZXkuYmxoLmVqYjIwPUNIS0oyMDUwVzogZmluZEJ5UHJpbWFyeUtleSBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSkuCi1DSEtKMjA1MC5maW5kQnlQcmltYXJ5S2V5LmJyaC5lamIyMD1DSEtKMjA1MFc6IGZpbmRCeVByaW1hcnlLZXkgbXVzdCBleGlzdCAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi0KLSMgZWpiRmluZAotQ0hLSjIwNTAuZWpiRmluZC5iYi5lamIyMD1DSEtKMjA1MFc6IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi0KLUNIS0oyMDUwLmVqYlBvc3RDcmVhdGUuY2IuZWpiMjA9Q0hLSjIwNTBFOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLmVqYlBvc3RDcmVhdGUuYmIuZWpiMjA9Q0hLSjIwNTBFOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEsIDEyLjIuNCkuCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgbWV0aG9kIGNoZWNrcwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYXBwbGljYXRpb24gZXhjZXB0aW9uCi1DSEtKMjQwNC5pLmVqYjIwPUNIS0oyNDA0VzogQXBwbGljYXRpb24gZXhjZXB0aW9uIHsxfSBvbiB7MH0gbXVzdCBleHRlbmQgamF2YS5sYW5nLkV4Y2VwdGlvbiAoRUpCIDIuMDogMTguMS4xLCAxOC4yLjEpLgotQ0hLSjI0MDQubS5lamIyMD1DSEtKMjQwNFc6IEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB7MH0gbXVzdCBleHRlbmQgamF2YS5sYW5nLkV4Y2VwdGlvbiAoRUpCIDIuMDogMTguMS4xLCAxOC4yLjEpLgotQ0hLSjI0MTYuaS5lamIyMD1DSEtKMjQxNlc6IEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB7MX0gb24gezB9IG11c3Qgbm90IGV4dGVuZCBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTguMS4xLCAxOC4yLjEpLgotQ0hLSjI0MTYubS5lamIyMD1DSEtKMjQxNlc6IEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB7MH0gbXVzdCBub3QgZXh0ZW5kIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIChFSkIgMi4wOiAxOC4xLjEsIDE4LjIuMSkuCi0KLSMgZWpiUmVtb3ZlCi1DSEtKMjQ5Mi5tYi5pLmVqYjIwPUNIS0oyNDkyVzogezB9IG9uIHsxfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNDkyLm1iLm0uZWpiMjA9Q0hLSjI0OTJXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNDkyLmNiLmkuZWpiMjA9Q0hLSjI0OTJXOiB7MH0gb24gezF9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTIuY2IubS5lamIyMD1DSEtKMjQ5Mlc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTIuYmIuaS5lamIyMD1DSEtKMjQ5Mlc6IHswfSBvbiB7MX0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNDkyLmJiLm0uZWpiMjA9Q0hLSjI0OTJXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTIuc2IuaS5lamIyMD1DSEtKMjQ5Mlc6IHswfSBvbiB7MX0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuNikuCi1DSEtKMjQ5Mi5zYi5tLmVqYjIwPUNIS0oyNDkyVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuNikuCi0KLUNIS0oyNDkzLm1iLmkuZWpiMjA9Q0hLSjI0OTNXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjQ5My5tYi5tLmVqYjIwPUNIS0oyNDkzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjQ5My5jYi5pLmVqYjIwPUNIS0oyNDkzVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTMuY2IubS5lamIyMD1DSEtKMjQ5M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTMuYmIuaS5lamIyMD1DSEtKMjQ5M1c6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTMuYmIubS5lamIyMD1DSEtKMjQ5M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjQ5My5zYi5pLmVqYjIwPUNIS0oyNDkzVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjYpLgotQ0hLSjI0OTMuc2IubS5lamIyMD1DSEtKMjQ5M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjYpLgotCi1DSEtKMjQ5NC5tYi5pLmVqYjIwPUNIS0oyNDk0VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNDk0Lm1iLm0uZWpiMjA9Q0hLSjI0OTRXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjQ5NC5jYi5pLmVqYjIwPUNIS0oyNDk0VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNDk0LmNiLm0uZWpiMjA9Q0hLSjI0OTRXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjQ5NC5iYi5pLmVqYjIwPUNIS0oyNDk0VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTQuYmIubS5lamIyMD1DSEtKMjQ5NFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTQuc2IuaS5lamIyMD1DSEtKMjQ5NFc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDcuNikuCi1DSEtKMjQ5NC5zYi5tLmVqYjIwPUNIS0oyNDk0VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiA3LjYpLgotCi1DSEtKMjUwNS5lamJSZW1vdmUubWIuaS5lamIyMD1DSEtKMjUwNVc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLm1iLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLmNiLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5jYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5iYi5pLmVqYjIwPUNIS0oyNTA1VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5iYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLnNiLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogNy42KS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5zYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogNy42KS4KLQotIyBlamJDcmVhdGUKLUNIS0oyNDIxLm1iLmkuZWpiMjA9Q0hLSjI0MjFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDE1LjcuMykuCi1DSEtKMjQyMS5jYi5pLmVqYjIwPUNIS0oyNDIxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjEuYmIuaS5lamIyMD1DSEtKMjQyMVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDIxLnNiLmkuZWpiMjA9Q0hLSjI0MjFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyMS5tYi5tLmVqYjIwPUNIS0oyNDIxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDE1LjcuMykuCi1DSEtKMjQyMS5jYi5tLmVqYjIwPUNIS0oyNDIxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMS5iYi5tLmVqYjIwPUNIS0oyNDIxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyMS5zYi5tLmVqYjIwPUNIS0oyNDIxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuMTAuMykuCi0KLUNIS0oyNDIyLnNiLmkuZWpiMjA9Q0hLSjI0MjJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyMi5jYi5pLmVqYjIwPUNIS0oyNDIyVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjIuYmIuaS5lamIyMD1DSEtKMjQyMlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDIyLm1iLmkuZWpiMjA9Q0hLSjI0MjJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuMykuCi1DSEtKMjQyMi5zYi5tLmVqYjIwPUNIS0oyNDIyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyMi5jYi5tLmVqYjIwPUNIS0oyNDIyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMi5iYi5tLmVqYjIwPUNIS0oyNDIyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyMi5tYi5tLmVqYjIwPUNIS0oyNDIyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuMykuCi0KLUNIS0oyNDIzLnNiLmkuZWpiMjA9Q0hLSjI0MjNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI0MjMuY2IuaS5lamIyMD1DSEtKMjQyM1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMy5iYi5pLmVqYjIwPUNIS0oyNDIzVzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDIzLm1iLmkuZWpiMjA9Q0hLSjI0MjNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxNS43LjMpLgotQ0hLSjI0MjMuc2IubS5lamIyMD1DSEtKMjQyM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNDIzLmNiLm0uZWpiMjA9Q0hLSjI0MjNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMy5iYi5tLmVqYjIwPUNIS0oyNDIzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjMubWIubS5lamIyMD1DSEtKMjQyM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTUuNy4zKS4KLQotQ0hLSjI0MjQuY2IuaS5lamIyMD1DSEtKMjQyNFc6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyNC5iYi5pLmVqYjIwPUNIS0oyNDI0VzogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDI0LnNiLmkuZWpiMjA9Q0hLSjI0MjRXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNDI0Lm1iLmkuZWpiMjA9Q0hLSjI0MjRXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTUuNy4zKS4KLUNIS0oyNDI0LmNiLm0uZWpiMjA9Q0hLSjI0MjRXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyNC5iYi5tLmVqYjIwPUNIS0oyNDI0VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjQuc2IubS5lamIyMD1DSEtKMjQyNFc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyNC5tYi5tLmVqYjIwPUNIS0oyNDI0VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTUuNy4zKS4KLQotCi0KLSMgZWpiQ3JlYXRlJ3MgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlCi1DSEtKMjUwMC5lamJDcmVhdGUuc2IuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjUwMC5lamJDcmVhdGUuY2IuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjUwMC5lamJDcmVhdGUuYmIuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjUwMC5lamJDcmVhdGUuc2IubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI1MDAuZWpiQ3JlYXRlLmNiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNTAwLmVqYkNyZWF0ZS5iYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuMykuCi0KLUNIS0oyNDk3LmNiLmkuZWpiMjA9Q0hLSjI0OTdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0OTcuY2IubS5lamIyMD1DSEtKMjQ5N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi40KS4KLQotQ0hLSjI1MDEuZWpiQ3JlYXRlLm1iLmkuZWpiMjA9Q0hLSjI1MDFJOiB7MH0gbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucyAoRUpCIDIuMDogMTUuNy4zLCAxOC4xLjEsIDE4LjIuMSwgMTguMy4yKS4KLUNIS0oyNTAxLmVqYkNyZWF0ZS5tYi5tLmVqYjIwPUNIS0oyNTAxSTogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucyAoRUpCIDIuMDogMTUuNy4zLCAxOC4xLjEsIDE4LjIuMSwgMTguMy4yKS4KLUNIS0oyNTAxLmVqYlJlbW92ZS5tYi5pLmVqYjIwPUNIS0oyNTAxSTogezB9IG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgKEVKQiAyLjA6IDE1LjcuNSwgMTguMS4xLCAxOC4yLjEsIDE4LjMuMikuCi1DSEtKMjUwMS5lamJSZW1vdmUubWIubS5lamIyMD1DSEtKMjUwMUk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgKEVKQiAyLjA6IDE1LjcuNSwgMTguMS4xLCAxOC4yLjEsIDE4LjMuMikuCi1DSEtKMjUwMS5vbk1lc3NhZ2UubWIuaS5lamIyMD1DSEtKMjUwMUk6IHswfSBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zIChFSkIgMi4wOiAxNS40LjEwLCAxNS43LjQsIDE4LjEuMSwgMTguMi4xLCAxOC4zLjIpLgotQ0hLSjI1MDEub25NZXNzYWdlLm1iLm0uZWpiMjA9Q0hLSjI1MDFJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zIChFSkIgMi4wOiAxNS40LjEwLCAxNS43LjQsIDE4LjEuMSwgMTguMi4xLCAxOC4zLjIpLgotCi0KLUNIS0oyNTAzLmVqYkNyZWF0ZS5zYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC4zLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiQ3JlYXRlLmNiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjQsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJDcmVhdGUuYmIuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuMywgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkNyZWF0ZS5zYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjMsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJDcmVhdGUuY2IubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi40LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiQ3JlYXRlLmJiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuMywgMTguMy44LCAxOC42KS4KLQotIyBlamJQb3N0Q3JlYXRlCi1DSEtKMjQyNi5jYi5pLmVqYjIwPUNIS0oyNDI2VzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI0MjYuYmIuaS5lamIyMD1DSEtKMjQyNlc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi40KS4KLUNIS0oyNDI2LmNiLm0uZWpiMjA9Q0hLSjI0MjZXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNDI2LmJiLm0uZWpiMjA9Q0hLSjI0MjZXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi40KS4KLQotQ0hLSjI0MjcuY2IuaS5lamIyMD1DSEtKMjQyN1c6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNDI3LmJiLmkuZWpiMjA9Q0hLSjI0MjdXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNCkuCi1DSEtKMjQyNy5jYi5tLmVqYjIwPUNIS0oyNDI3VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjQyNy5iYi5tLmVqYjIwPUNIS0oyNDI3VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNCkuCi0KLUNIS0oyNDI4LmNiLmkuZWpiMjA9Q0hLSjI0MjhXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI0MjguYmIuaS5lamIyMD1DSEtKMjQyOFc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNCkuCi1DSEtKMjQyOC5jYi5tLmVqYjIwPUNIS0oyNDI4VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI0MjguYmIubS5lamIyMD1DSEtKMjQyOFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi40KS4KLQotQ0hLSjI1MDUuZWpiUG9zdENyZWF0ZS5jYi5pLmVqYjIwPUNIS0oyNTA1VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjUwNS5lamJQb3N0Q3JlYXRlLmJiLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTIuMi40KS4KLUNIS0oyNTA1LmVqYlBvc3RDcmVhdGUuY2IubS5lamIyMD1DSEtKMjUwNVc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjUwNS5lamJQb3N0Q3JlYXRlLmJiLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxMi4yLjQpLgotCi1DSEtKMjUwMy5lamJQb3N0Q3JlYXRlLmNiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjUsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJQb3N0Q3JlYXRlLmJiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjQsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJQb3N0Q3JlYXRlLmNiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYlBvc3RDcmVhdGUuYmIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi40LCAxOC4zLjgsIDE4LjYpLgotCi0KLSMgZWpiSG9tZQotQ0hLSjI0MzAuY2IuaS5lamIyMD1DSEtKMjQzMEk6IHsxfSBtdXN0IGV4aXN0IGZvciB7MH0gdG8gYmUgY2FsbGVkIChFSkIgMi4wOiAxMC41LjIsIDEwLjYuNikuCi1DSEtKMjQzMC5iYi5pLmVqYjIwPUNIS0oyNDMwSTogezF9IG11c3QgZXhpc3QgZm9yIHswfSB0byBiZSBjYWxsZWQgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNDMwLmNiLm0uZWpiMjA9Q0hLSjI0MzBJOiB7MH0gbXVzdCBleGlzdCBmb3IgdGhpcyBtZXRob2QgdG8gYmUgY2FsbGVkIChFSkIgMi4wOiAxMC41LjIsIDEwLjYuNikuCi1DSEtKMjQzMC5iYi5tLmVqYjIwPUNIS0oyNDMwSTogezB9IG11c3QgZXhpc3QgZm9yIHRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjQzMS5jYi5pLmVqYjIwPUNIS0oyNDMxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI0MzEuYmIuaS5lamIyMD1DSEtKMjQzMVc6IHswfSBtdXN0IGJlIHB1YmxpYy4gIChFSkIgMi4wOiAxMi4yLjYpLgotQ0hLSjI0MzEuY2IubS5lamIyMD1DSEtKMjQzMVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI0MzEuYmIubS5lamIyMD1DSEtKMjQzMVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAgKEVKQiAyLjA6IDEyLjIuNikuCi0KLUNIS0oyNDM5LmNiLmkuZWpiMjA9Q0hLSjI0MzlXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI0MzkuYmIuaS5lamIyMD1DSEtKMjQzOVc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNikuCi1DSEtKMjQzOS5jYi5tLmVqYjIwPUNIS0oyNDM5VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI0MzkuYmIubS5lamIyMD1DSEtKMjQzOVc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi42KS4KLQotQ0hLSjI1MDAuZWpiSG9tZS5jYi5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi42KS4KLUNIS0oyNTAwLmVqYkhvbWUuYmIuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuNikuCi1DSEtKMjUwMC5lamJIb21lLmNiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi42KS4KLUNIS0oyNTAwLmVqYkhvbWUuYmIubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjYpLgotCi1DSEtKMjUwMy5lamJIb21lLmNiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjYsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJIb21lLmJiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjYsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJIb21lLmNiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkhvbWUuYmIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi42LCAxOC4zLjgsIDE4LjYpLgotCi0jIGVqYkZpbmQKLUNIS0oyNDU3LmJiLmkuZWpiMjA9Q0hLSjI0NTdXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuNSkuCi1DSEtKMjQ1Ny5iYi5tLmVqYjIwPUNIS0oyNDU3VzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuNSkuCi0KLUNIS0oyNDU4LmJiLmkuZWpiMjA9Q0hLSjI0NThXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNSkuCi1DSEtKMjQ1OC5iYi5tLmVqYjIwPUNIS0oyNDU4VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNSkuCi0KLUNIS0oyNDU5LmJiLmkuZWpiMjA9Q0hLSjI0NTlXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjUpLgotQ0hLSjI0NTkuYmIubS5lamIyMD1DSEtKMjQ1OVc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi41KS4KLQotQ0hLSjI1MDAuZWpiRmluZC5iYi5pLmVqYjIwPUNIS0oyNTAwSTogezB9IG9uIG1ldGhvZCB7MX0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi41KS4KLUNIS0oyNTAwLmVqYkZpbmQuYmIubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjUpLgotCi1DSEtKMjQwNy5iYi5pLmVqYjIwPUNIS0oyNDA3VzogezB9IG11c3QgcmV0dXJuIHsxfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogMTIuMi41KS4KLUNIS0oyNDA3LmJiLm0uZWpiMjA9Q0hLSjI0MDdXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDEyLjIuNSkuCi0KLUNIS0oyNTAzLmVqYkZpbmQuYmIuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuNSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkZpbmQuYmIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi41LCAxOC4zLjgsIDE4LjYpLgotCi1DSEtKMjQ5OC5iYi5pLmVqYjIwPUNIS0oyNDk4VzogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi1DSEtKMjQ5OC5iYi5tLmVqYjIwPUNIS0oyNDk4VzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLQotCi0jCi0jIG1ldGhvZHMgd2hpY2ggbXVzdCBub3QgZXhpc3QKLSMKLUNIS0oyNTAyLmVqYkZpbmQuY2IuaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdC4gVGhlIGNvbnRhaW5lciBwcm92aWRlcyB0aGlzIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjIpLgotQ0hLSjI1MDIuZWpiRmluZC5jYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuIFRoZSBjb250YWluZXIgcHJvdmlkZXMgdGhpcyBtZXRob2QgaW1wbGVtZW50YXRpb24gKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi4yKS4KLQotQ0hLSjI1MDIuZWpiU2VsZWN0LmJiLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QuIE9ubHkgQ01QIGJlYW5zIG1heSBoYXZlIGVqYlNlbGVjdCBtZXRob2RzIChFSkIgMi4wOiAxMi4xLjUpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmJiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gT25seSBDTVAgYmVhbnMgbWF5IGhhdmUgZWpiU2VsZWN0IG1ldGhvZHMgIChFSkIgMi4wOiAxMi4xLjUpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LnNmYi5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0LiBPbmx5IENNUCBiZWFucyBtYXkgaGF2ZSBlamJTZWxlY3QgbWV0aG9kcyAoRUpCIDIuMDogNy42LjEpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LnNmYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuIE9ubHkgQ01QIGJlYW5zIG1heSBoYXZlIGVqYlNlbGVjdCBtZXRob2RzICAoRUpCIDIuMDogNy42LjEpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LnNzYi5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0LiBPbmx5IENNUCBiZWFucyBtYXkgaGF2ZSBlamJTZWxlY3QgbWV0aG9kcyAoRUpCIDIuMDogNy44LjIpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LnNzYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuIE9ubHkgQ01QIGJlYW5zIG1heSBoYXZlIGVqYlNlbGVjdCBtZXRob2RzICAoRUpCIDIuMDogNy44LjIpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNyaC5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY3JoLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNsaC5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY2xoLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNyYy5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY3JjLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNsYy5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY2xjLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotCi0jIGZpbmFsaXplCi1DSEtKMjUwMi5maW5hbGl6ZS5jYi5pLmVqYjIwPUNIS0oyNTAySTogZmluYWxpemUoKSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLmNiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLm1iLmkuZWpiMjA9Q0hLSjI1MDJJOiBmaW5hbGl6ZSgpIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjI1MDIuZmluYWxpemUubWIubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjI1MDIuZmluYWxpemUuYmIuaS5lamIyMD1DSEtKMjUwMkk6IGZpbmFsaXplKCkgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEyLjIuMikuCi1DSEtKMjUwMi5maW5hbGl6ZS5iYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEyLjIuMikuCi1DSEtKMjUwMi5maW5hbGl6ZS5zYi5pLmVqYjIwPUNIS0oyNTAySTogZmluYWxpemUoKSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogNy4xMC4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLnNiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogNy4xMC4yKS4KLQotQ0hLSjI1MDIuc2xoLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDcuMTAuOCkuCi1DSEtKMjUwMi5zbGgubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI1MDIuc3JoLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMi5zcmgubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiA3LjEwLjYpLgotCi0KLSMgYnVzaW5lc3MKLUNIS0oyNDExLnNiLmkuZWpiMjA9Q0hLSjI0MTFXOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQxMS5jYi5pLmVqYjIwPUNIS0oyNDExVzogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0MTEuYmIuaS5lamIyMD1DSEtKMjQxMVc6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiAoRUpCIDIuMDogMTIuMi43KS4KLUNIS0oyNDExLnNiLm0uZWpiMjA9Q0hLSjI0MTFXOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQxMS5jYi5tLmVqYjIwPUNIS0oyNDExVzogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0MTEuYmIubS5lamIyMD1DSEtKMjQxMVc6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiAoRUpCIDIuMDogMTIuMi43KS4KLQotQ0hLSjI0NDEuc2IuaS5lamIyMD1DSEtKMjQ0MVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNDQxLmNiLmkuZWpiMjA9Q0hLSjI0NDFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQ0MS5iYi5pLmVqYjIwPUNIS0oyNDQxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjcpLgotQ0hLSjI0NDEuc2IubS5lamIyMD1DSEtKMjQ0MVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0NDEuY2IubS5lamIyMD1DSEtKMjQ0MVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0NDEuYmIubS5lamIyMD1DSEtKMjQ0MVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjcpLgotCi1DSEtKMjQ0Mi5zYi5pLmVqYjIwPUNIS0oyNDQyVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0NDIuY2IuaS5lamIyMD1DSEtKMjQ0Mlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNDQyLmJiLmkuZWpiMjA9Q0hLSjI0NDJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNykuCi1DSEtKMjQ0Mi5zYi5tLmVqYjIwPUNIS0oyNDQyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQ0Mi5jYi5tLmVqYjIwPUNIS0oyNDQyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQ0Mi5iYi5tLmVqYjIwPUNIS0oyNDQyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNykuCi0KLUNIS0oyNDQzLnNiLmkuZWpiMjA9Q0hLSjI0NDNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0NDMuY2IuaS5lamIyMD1DSEtKMjQ0M1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQ0My5iYi5pLmVqYjIwPUNIS0oyNDQzVzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi43KS4KLUNIS0oyNDQzLnNiLm0uZWpiMjA9Q0hLSjI0NDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQ0My5jYi5tLmVqYjIwPUNIS0oyNDQzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0NDMuYmIubS5lamIyMD1DSEtKMjQ0M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi43KS4KLQotQ0hLSjI1MDAuYnVzLnNiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI1MDAuYnVzLmNiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI1MDAuYnVzLmJiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjcpLgotQ0hLSjI1MDAuYnVzLnNiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNTAwLmJ1cy5jYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjUwMC5idXMuYmIubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjcpLgotCi1DSEtKMjUwMy5idXMuc2IuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5jYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi44LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmJiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjcsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuc2IubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC40LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmNiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuOCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5iYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjcsIDE4LjMuOCwgMTguNikuCi0KLSMgb25NZXNzYWdlCi1DSEtKMjUwMy5vbk1lc3NhZ2UubWIuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDE1LjQuMTAsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5vbk1lc3NhZ2UubWIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTUuNC4xMCwgMTguMy44LCAxOC42KS4KLQotQ0hLSjI0NDUubWIuaS5lamIyMD1DSEtKMjQ0NVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy40KS4KLUNIS0oyNDQ1Lm1iLm0uZWpiMjA9Q0hLSjI0NDVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy40KS4KLQotQ0hLSjI0NDYubWIuaS5lamIyMD1DSEtKMjQ0Nlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTUuNy40KS4KLUNIS0oyNDQ2Lm1iLm0uZWpiMjA9Q0hLSjI0NDZXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTUuNy40KS4KLQotQ0hLSjI0NDcubWIuaS5lamIyMD1DSEtKMjQ0N1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDE1LjcuNCkuCi1DSEtKMjQ0Ny5tYi5tLmVqYjIwPUNIS0oyNDQ3VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxNS43LjQpLgotCi1DSEtKMjUwNS5vbk1lc3NhZ2UubWIuaS5lamIyMD1DSEtKMjUwNVc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjQpLgotQ0hLSjI1MDUub25NZXNzYWdlLm1iLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjQpLgotCi0jIGFjY2Vzc29yIG1ldGhvZAotQ0hLSjI0NDkuY2IuaS5lamIyMD1DSEtKMjQ0OVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuMy4xKS4KLUNIS0oyNDQ5LmNiLm0uZWpiMjA9Q0hLSjI0NDlXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjI0NTAuY2IuaS5lamIyMD1DSEtKMjQ1MFc6IHswfSBtdXN0IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjQ1MC5jYi5tLmVqYjIwPUNIS0oyNDUwVzogVGhpcyBtZXRob2QgbXVzdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTAuMy4xLCAxMC42LjIpLgotCi0jIGdldCAmIHNldCBtZXRob2RzIG9mIGNtciBmaWVsZHMKLUNIS0oyNDczLmNyYy5pLmVqYjIwPUNIS0oyNDczVzogezB9IG11c3Qgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNIS0oyNDczLmNyYy5tLmVqYjIwPUNIS0oyNDczVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0hLSjI0NzMuY3JoLmkuZWpiMjA9Q0hLSjI0NzNXOiB7MH0gbXVzdCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0hLSjI0NzMuY3JoLm0uZWpiMjA9Q0hLSjI0NzNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi0KLSMgaG9tZQotQ0hLSjI0NjEuaG9tZS5icmguZWpiMjA9Q0hLSjI0NjFXOiBUaGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMgKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjQ2MS5ob21lLmNyaC5lamIyMD1DSEtKMjQ2MVc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjQ2MS5ob21lLnNyaC5lamIyMD1DSEtKMjQ2MVc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogNy4xMC42KS4KLQotQ0hLSjI0NjIuY2xoLmkuZWpiMjA9Q0hLSjI0NjJJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDYyLmJyaC5pLmVqYjIwPUNIS0oyNDYySTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDYyLmNyaC5pLmVqYjIwPUNIS0oyNDYySTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2Mi5ibGguaS5lamIyMD1DSEtKMjQ2Mkk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotQ0hLSjI0NjIuY2xoLm0uZWpiMjA9Q0hLSjI0NjJJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDYyLmJyaC5tLmVqYjIwPUNIS0oyNDYySTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDYyLmNyaC5tLmVqYjIwPUNIS0oyNDYySTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2Mi5ibGgubS5lamIyMD1DSEtKMjQ2Mkk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotCi1DSEtKMjQ2My5jbGguaS5lamIyMD1DSEtKMjQ2M0k6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDYzLmJyaC5pLmVqYjIwPUNIS0oyNDYzSTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjQ2My5jcmguaS5lamIyMD1DSEtKMjQ2M0k6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNi40LCAxMC42LjEyKS4KLUNIS0oyNDYzLmJsaC5pLmVqYjIwPUNIS0oyNDYzSTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotQ0hLSjI0NjMuY2xoLm0uZWpiMjA9Q0hLSjI0NjNJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjQ2My5icmgubS5lamIyMD1DSEtKMjQ2M0k6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI0NjMuY3JoLm0uZWpiMjA9Q0hLSjI0NjNJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2My5ibGgubS5lamIyMD1DSEtKMjQ2M0k6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjExKS4KLQotQ0hLSjI0NjQuY2xoLmkuZWpiMjA9Q0hLSjI0NjRJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDY0LmJyaC5pLmVqYjIwPUNIS0oyNDY0STogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDY0LmNyaC5pLmVqYjIwPUNIS0oyNDY0STogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2NC5ibGguaS5lamIyMD1DSEtKMjQ2NEk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotQ0hLSjI0NjQuY2xoLm0uZWpiMjA9Q0hLSjI0NjRJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDY0LmJyaC5tLmVqYjIwPUNIS0oyNDY0STogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDY0LmNyaC5tLmVqYjIwPUNIS0oyNDY0STogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2NC5ibGgubS5lamIyMD1DSEtKMjQ2NEk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotCi1DSEtKMjUwMy5ob21lLmJyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNTAzLmhvbWUuY3JoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAzLmhvbWUuc3JoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMy5ob21lLmJsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjQsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5ob21lLmNsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjQsIDEwLjYuMTIsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5ob21lLnNsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuaG9tZS5icmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNTAzLmhvbWUuY3JoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDMuaG9tZS5zcmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDMuaG9tZS5ibGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjQsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5ob21lLmNsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmhvbWUuc2xoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCwgMTguMy44LCAxOC42KS4KLQotCi0jIGNyZWF0ZQotQ0hLSjI1MDMuY3JlYXRlLmJyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNTAzLmNyZWF0ZS5jcmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEwLjYuMTApLgotQ0hLSjI1MDMuY3JlYXRlLnNyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDMuY3JlYXRlLmJsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5jcmVhdGUuY2xoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTAuNi4xMiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5zbGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5icmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNTAzLmNyZWF0ZS5jcmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTAuNi4xMCkuCi1DSEtKMjUwMy5jcmVhdGUuc3JoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5ibGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5jcmVhdGUuY2xoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4xLCAxMC42LjEyLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuY3JlYXRlLnNsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgsIDE4LjMuOCwgMTguNikuCi0KLUNIS0oyNDY3LnNyaC5pLmVqYjIwPUNIS0oyNDY3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNDY3LnNsaC5pLmVqYjIwPUNIS0oyNDY3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44KS4KLUNIS0oyNDY3LmNyaC5pLmVqYjIwPUNIS0oyNDY3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEwLjYuMTApLgotQ0hLSjI0NjcuY2xoLmkuZWpiMjA9Q0hLSjI0NjdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTAuNi4xMikuCi1DSEtKMjQ2Ny5icmguaS5lamIyMD1DSEtKMjQ2N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMi4yLjkpLgotQ0hLSjI0NjcuYmxoLmkuZWpiMjA9Q0hLSjI0NjdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTIuMi4xMSkuCi1DSEtKMjQ2Ny5zcmgubS5lamIyMD1DSEtKMjQ2N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNDY3LnNsaC5tLmVqYjIwPUNIS0oyNDY3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI0NjcuY3JoLm0uZWpiMjA9Q0hLSjI0NjdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMC42LjEwKS4KLUNIS0oyNDY3LmNsaC5tLmVqYjIwPUNIS0oyNDY3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTAuNi4xMikuCi1DSEtKMjQ2Ny5icmgubS5lamIyMD1DSEtKMjQ2N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEyLjIuOSkuCi1DSEtKMjQ2Ny5ibGgubS5lamIyMD1DSEtKMjQ2N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEpLgotCi1DSEtKMjQwMi5zZnJoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA2LjMuMSwgNy4xMC42KS4KLUNIS0oyNDAyLnNmbGguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDYuNC4xLCA3LjEwLjgpLgotQ0hLSjI0MDIuc3NyaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogNi4zLjEsIDcuOCwgNy4xMC42KS4KLUNIS0oyNDAyLnNzbGguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDYuNC4xLCA3LjgsIDcuMTAuOCkuCi1DSEtKMjQwMi5jcmguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNS4xLCAxMC42LjEwKS4KLUNIS0oyNDAyLmNsaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS42LjEsIDEwLjYuMTIpLgotQ0hLSjI0MDIuYnJoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNDAyLmJsaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEpLgotQ0hLSjI0MDIuc2ZyaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA2LjMuMSwgNy4xMC42KS4KLUNIS0oyNDAyLnNmbGgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogNi40LjEsIDcuMTAuOCkuCi1DSEtKMjQwMi5zc3JoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDYuMy4xLCA3LjgsIDcuMTAuNikuCi1DSEtKMjQwMi5zc2xoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDYuNC4xLCA3LjgsIDcuMTAuOCkuCi1DSEtKMjQwMi5jcmgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS41LjEsIDEwLjYuMTApLgotQ0hLSjI0MDIuY2xoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNi4xLCAxMC42LjEyKS4KLUNIS0oyNDAyLmJyaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNDAyLmJsaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjYuMSwgMTIuMi4xMSkuCi0KLUNIS0oyNDc2LnNyaC5pLmVqYjIwPUNIS0oyNDc2RTogezB9IG11c3QgYmUgdGhlIGNyZWF0ZSgpIG1ldGhvZCAoRUpCIDIuMDogNy44LCA3LjEwLjYpLgotQ0hLSjI0NzYuc2xoLmkuZWpiMjA9Q0hLSjI0NzZFOiB7MH0gbXVzdCBiZSB0aGUgY3JlYXRlKCkgbWV0aG9kIChFSkIgMi4wOiA3LjgsIDcuMTAuOCkuCi1DSEtKMjQ3Ni5zcmgubS5lamIyMD1DSEtKMjQ3NkU6IFRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIGNyZWF0ZSgpIG1ldGhvZCAoRUpCIDIuMDogNy44LCA3LjEwLjYpLgotQ0hLSjI0NzYuc2xoLm0uZWpiMjA9Q0hLSjI0NzZFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBjcmVhdGUoKSBtZXRob2QgKEVKQiAyLjA6IDcuOCwgNy4xMC44KS4KLUNIS0oyNDc2LnNzYi5pLmVqYjIwPUNIS0oyNDc2RTogezB9IG11c3QgYmUgdGhlIGVqYkNyZWF0ZSgpIG1ldGhvZCAoRUpCIDIuMDogNy44KS4KLUNIS0oyNDc2LnNzYi5tLmVqYjIwPUNIS0oyNDc2RTogVGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgZWpiQ3JlYXRlKCkgbWV0aG9kIChFSkIgMi4wOiA3LjgpLgotCi0KLSMgcmVtb3RlIGNyZWF0ZQotQ0hLSjI1MDQuY3JlYXRlLnNyaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTA0LmNyZWF0ZS5zbGguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDcuMTAuOCkuCi1DSEtKMjUwNC5jcmVhdGUuY3JoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNTA0LmNyZWF0ZS5jbGguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjYuMTIpLgotQ0hLSjI1MDQuY3JlYXRlLmJyaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmNyZWF0ZS5ibGguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEyLjIuMTEpLgotQ0hLSjI1MDQuY3JlYXRlLnNyaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwNC5jcmVhdGUuc2xoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogNy4xMC44KS4KLUNIS0oyNTA0LmNyZWF0ZS5jcmgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNTA0LmNyZWF0ZS5jbGgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC42LjEyKS4KLUNIS0oyNTA0LmNyZWF0ZS5icmgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI1MDQuY3JlYXRlLmJsaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEyLjIuMTEpLgotCi1DSEtKMjUwMC5jcmVhdGUuc3JoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDAuY3JlYXRlLmNyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDAuY3JlYXRlLmJyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjUwMC5jcmVhdGUuc3JoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAwLmNyZWF0ZS5jcmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMC5jcmVhdGUuYnJoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi0KLSMgaG9tZSBtZXRob2QKLUNIS0oyNTA0LmhvbWUuY3JoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMC41LjIsIDEwLjYuMTApLgotQ0hLSjI1MDQuaG9tZS5jbGguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi4xMikuCi1DSEtKMjUwNC5ob21lLmJyaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmhvbWUuYmxoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMi4yLjExKS4KLUNIS0oyNTA0LmhvbWUuY3JoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjEwKS4KLUNIS0oyNTA0LmhvbWUuY2xoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjEyKS4KLUNIS0oyNTA0LmhvbWUuYnJoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmhvbWUuYmxoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi4xMSkuCi0KLQotIyBmaW5kIG1ldGhvZAotQ0hLSjI1MDMuZmluZC5icmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjUwMy5maW5kLmNyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjUwMy5maW5kLnNyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDMuZmluZC5ibGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZmluZC5jbGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZmluZC5zbGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmZpbmQuYnJoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjUwMy5maW5kLmNyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNTAzLmZpbmQuc3JoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAzLmZpbmQuYmxoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZmluZC5jbGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5maW5kLnNsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgsIDE4LjMuOCwgMTguNikuCi0KLUNIS0oyNDc3LmNyaC5pLmVqYjIwPUNIS0oyNDc3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjQ3Ny5icmguaS5lamIyMD1DSEtKMjQ3N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLUNIS0oyNDc3LmNsaC5pLmVqYjIwPUNIS0oyNDc3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjI0NzcuYmxoLmkuZWpiMjA9Q0hLSjI0NzdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMikuCi1DSEtKMjQ3Ny5jcmgubS5lamIyMD1DSEtKMjQ3N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjQ3Ny5icmgubS5lamIyMD1DSEtKMjQ3N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEpLgotQ0hLSjI0NzcuY2xoLm0uZWpiMjA9Q0hLSjI0NzdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNDc3LmJsaC5tLmVqYjIwPUNIS0oyNDc3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMikuCi0KLUNIS0oyNDc4LmNyaC5pLmVqYjIwPUNIS0oyNDc4STogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMC41LjguNCkuCi1DSEtKMjQ3OC5jcmgubS5lamIyMD1DSEtKMjQ3OEk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMC41LjguNCkuCi1DSEtKMjQ3OC5jbGguaS5lamIyMD1DSEtKMjQ3OEk6IHswfSBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNS44LjQpLgotQ0hLSjI0NzguY2xoLm0uZWpiMjA9Q0hLSjI0NzhJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNS44LjQpLgotQ0hLSjI0NzguYnJoLmkuZWpiMjA9Q0hLSjI0NzhJOiB7MH0gbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLUNIS0oyNDc4LmJyaC5tLmVqYjIwPUNIS0oyNDc4STogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLUNIS0oyNDc4LmJsaC5pLmVqYjIwPUNIS0oyNDc4STogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi1DSEtKMjQ3OC5ibGgubS5lamIyMD1DSEtKMjQ3OEk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi1DSEtKMjQ3OC5jYi5pLmVqYjIwPUNIS0oyNDc4STogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMC41LjguNCkuCi1DSEtKMjQ3OC5jYi5tLmVqYjIwPUNIS0oyNDc4STogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjUuOC40KS4KLUNIS0oyNDc4LmJiLmkuZWpiMjA9Q0hLSjI0NzhJOiB7MH0gbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLUNIS0oyNDc4LmJiLm0uZWpiMjA9Q0hLSjI0NzhJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMS44LjQpLgotCi1DSEtKMjQwMy5icmguaS5lamIyMD1DSEtKMjQwM1c6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNS4yLCAxMi4xLjcsIDEyLjIuOSkuCi1DSEtKMjQwMy5ibGguaS5lamIyMD1DSEtKMjQwM1c6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNi4yLCAxMi4xLjcsIDEyLjIuMTEpLgotQ0hLSjI0MDMuY3JoLmkuZWpiMjA9Q0hLSjI0MDNXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjUuMiwgMTAuNS42LCAxMC42LjEwLCAxMS4yLjIpLgotQ0hLSjI0MDMuY2xoLmkuZWpiMjA9Q0hLSjI0MDNXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjYuMiwgMTAuNS42LCAxMC42LjEyLCAxMS4yLjIpLgotQ0hLSjI0MDMuYnJoLm0uZWpiMjA9Q0hLSjI0MDNXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNS4yLCAxMi4xLjcsIDEyLjIuOSkuCi1DSEtKMjQwMy5ibGgubS5lamIyMD1DSEtKMjQwM1c6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS42LjIsIDEyLjEuNywgMTIuMi4xMSkuCi1DSEtKMjQwMy5jcmgubS5lamIyMD1DSEtKMjQwM1c6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS41LjIsIDEwLjUuNiwgMTAuNi4xMCwgMTEuMi4yKS4KLUNIS0oyNDAzLmNsaC5tLmVqYjIwPUNIS0oyNDAzVzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjYuMiwgMTAuNS42LCAxMC42LjEyLCAxMS4yLjIpLgotCi0jIHJlbW90ZSBmaW5kCi1DSEtKMjUwNC5maW5kLmJyaC5pLmVqYjIwPUNIS0oyNTA0VzogezF9IG11c3QgZXhpc3Qgb24gezJ9IGZvciB7MH0gKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjUwNC5maW5kLmNyaC5pLmVqYjIwPUNIS0oyNTA0VzogezF9IG11c3QgZXhpc3Qgb24gezJ9IGZvciB7MH0gKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI1MDQuZmluZC5icmgubS5lamIyMD1DSEtKMjUwNFc6IHswfSBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmZpbmQuY3JoLm0uZWpiMjA9Q0hLSjI1MDRXOiB7MH0gbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjYuMTApLgotCi0jIGxvY2FsIGZpbmQKLUNIS0oyNTA0LmZpbmQuYmxoLmkuZWpiMjA9Q0hLSjI1MDRXOiB7MX0gbXVzdCBleGlzdCBvbiB7Mn0gZm9yIHswfSAoRUpCIDIuMDogMTIuMi4xMSkuCi1DSEtKMjUwNC5maW5kLmNsaC5pLmVqYjIwPUNIS0oyNTA0VzogezF9IG11c3QgZXhpc3Qgb24gezJ9IGZvciB7MH0gKEVKQiAyLjA6IDEwLjYuMikuCi1DSEtKMjUwNC5maW5kLmJsaC5tLmVqYjIwPUNIS0oyNTA0VzogezB9IG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjExKS4KLUNIS0oyNTA0LmZpbmQuY2xoLm0uZWpiMjA9Q0hLSjI1MDRXOiB7MH0gbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjYuMikuCi0KLQotQ0hLSjI1MDAuZmluZC5zcmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMC5maW5kLmNyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDAuZmluZC5icmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI1MDAuZmluZC5zcmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDAuZmluZC5jcmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMC5maW5kLmJyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotCi1DSEtKMjQ5NS5jbGguaS5lamIyMD1DSEtKMjQ5NUk6IHswfSBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwgKEVKQiAyLjA6IDEwLjUuNiwgMTAuNi4xNCkuCi1DSEtKMjQ5NS5jbGgubS5lamIyMD1DSEtKMjQ5NUk6IFRoaXMgbWV0aG9kIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbCAoRUpCIDIuMDogMTAuNS42LCAxMC42LjE0KS4KLUNIS0oyNDk1LmNyaC5pLmVqYjIwPUNIS0oyNDk1STogezB9IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbCAoRUpCIDIuMDogMTAuNS42LCAxMC42LjE0KS4KLUNIS0oyNDk1LmNyaC5tLmVqYjIwPUNIS0oyNDk1STogVGhpcyBtZXRob2QgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC41LjYsIDEwLjYuMTQpLgotCi0KLSMgbWV0aG9kIG9uIGEgY29tcG9uZW50IGludGVyZmFjZQotQ0hLSjI1MDMuYnVzLnNyYy5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI1MDMuYnVzLnNsYy5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC43LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmJyYy5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI1MDMuYnVzLmJsYy5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS4xMCwgMTIuMi4xMCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5jcmMuaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNTAzLmJ1cy5jbGMuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuMTAsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuc3JjLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNTAzLmJ1cy5zbGMubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC43LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmJyYy5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjUwMy5idXMuYmxjLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuMTAsIDEyLjIuMTAsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuY3JjLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNTAzLmJ1cy5jbGMubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS4xMCwgMTguMy44LCAxOC42KS4KLQotIyBtZXRob2Qgb24gYSBob21lIGludGVyZmFjZQotQ0hLSjI0NjUuYnJoLmkuZWpiMjA9Q0hLSjI0NjVXOiB7MH0gbXVzdCB0aHJvdyB7MX0gZm9yIHsyfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNDY1LmJsaC5pLmVqYjIwPUNIS0oyNDY1VzogezB9IG11c3QgdGhyb3cgezF9IGZvciB7Mn0gKEVKQiAyLjA6IDEyLjIuMTEpLgotQ0hLSjI0NjUuY3JoLmkuZWpiMjA9Q0hLSjI0NjVXOiB7MH0gbXVzdCB0aHJvdyB7MX0gZm9yIHsyfSAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjQ2NS5jbGguaS5lamIyMD1DSEtKMjQ2NVc6IHswfSBtdXN0IHRocm93IHsxfSBmb3IgezJ9IChFSkIgMi4wOiAxMC42LjEyKS4KLUNIS0oyNDY1LnNyaC5pLmVqYjIwPUNIS0oyNDY1VzogezB9IG11c3QgdGhyb3cgezF9IGZvciB7Mn0gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjQ2NS5zbGguaS5lamIyMD1DSEtKMjQ2NVc6IHswfSBtdXN0IHRocm93IHsxfSBmb3IgezJ9IChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI0NjUuYnJoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI0NjUuYmxoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiAxMi4yLjExKS4KLUNIS0oyNDY1LmNyaC5tLmVqYjIwPUNIS0oyNDY1VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gZm9yIHsxfSAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjQ2NS5jbGgubS5lamIyMD1DSEtKMjQ2NVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IGZvciB7MX0gKEVKQiAyLjA6IDEwLjYuMTIpLgotQ0hLSjI0NjUuc3JoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI0NjUuc2xoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiA3LjEwLjgpLgotCi0jIG1ldGhvZCBvbiBhIHJlbW90ZSBob21lCi1DSEtKMjUwMC5ob21lLnNyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAwLmhvbWUuY3JoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMC5ob21lLmJyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjUwMC5ob21lLnNyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMC5ob21lLmNyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAwLmhvbWUuYnJoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi0KLUNIS0oyNDY2LnNyYy5pLmVqYjIwPUNIS0oyNDY2STogezB9IG11c3Qgbm90IGV4cG9zZSB0aGUgezF9IHR5cGUgKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjQ2Ni5jcmguaS5lamIyMD1DSEtKMjQ2Nkk6IHswfSBtdXN0IG5vdCBleHBvc2UgdGhlIHsxfSB0eXBlIChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNDY2LmJyaC5pLmVqYjIwPUNIS0oyNDY2STogezB9IG11c3Qgbm90IGV4cG9zZSB0aGUgezF9IHR5cGUgKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjQ2Ni5jcmgubS5lamIyMD1DSEtKMjQ2Nkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUgKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI0NjYuYnJoLm0uZWpiMjA9Q0hLSjI0NjZJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlIChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI0NjYuc3JjLm0uZWpiMjA9Q0hLSjI0NjZJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlIChFSkIgMi4wOiA3LjEwLjUpLgotCi0jIG1ldGhvZCBvbiBhIHJlbW90ZSBjb21wb25lbnQKLUNIS0oyNDY4LnNyYy5lamIyMD1DSEtKMjQ2OFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNDY4LmNyYy5lamIyMD1DSEtKMjQ2OFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNDY4LmJyYy5lamIyMD1DSEtKMjQ2OFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogMTIuMi44KS4KLQotQ0hLSjI1MDAuYnVzLnNyYy5pLmVqYjIwPUNIS0oyNTAwSTogezB9IGluIG1ldGhvZCB7MX0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNTAwLmJ1cy5jcmMuaS5lamIyMD1DSEtKMjUwMEk6IHswfSBpbiBtZXRob2QgezF9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjUwMC5idXMuYnJjLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MH0gaW4gbWV0aG9kIHsxfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI1MDAuYnVzLnNyYy5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjUwMC5idXMuY3JjLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNTAwLmJ1cy5icmMubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjgpLgotCi1DSEtKMjQ3Mi5zcmguaS5lamIyMD1DSEtKMjQ3Mlc6IHsxfSBpbiBtZXRob2QgezB9IGNhbm5vdCBiZSBhbiBhcmd1bWVudCBvciByZXN1bHQgdHlwZSAoRUpCIDIuMDogNi43LjIpLgotQ0hLSjI0NzIuYnJjLmkuZWpiMjA9Q0hLSjI0NzJXOiB7MH0gbXVzdCBub3QgcGFzcyB7MX0gYXMgYW4gYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiA5LjcuMiwgMTIuMi44KS4KLUNIS0oyNDcyLmNyYy5pLmVqYjIwPUNIS0oyNDcyVzogezB9IG11c3Qgbm90IHBhc3MgezF9IGFzIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCAoRUpCIDIuMDogOS43LjIsIDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNIS0oyNDcyLmJyYy5tLmVqYjIwPUNIS0oyNDcyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgcGFzcyB7MH0gYXMgYW4gYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiA5LjcuMiwgMTIuMi44KS4KLUNIS0oyNDcyLmNyYy5tLmVqYjIwPUNIS0oyNDcyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgcGFzcyB7MH0gYXMgYW4gYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiA5LjcuMiwgMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0hLSjI0NzIuc3JoLm0uZWpiMjA9Q0hLSjI0NzJXOiB7MH0gY2Fubm90IGJlIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCB0eXBlIChFSkIgMi4wOiA2LjcuMikuCi0KLSMgbWV0aG9kIG9uIGEgcmVtb3RlIGNvbXBvbmVudCBDTVAKLUNIS0oyNDc0LmNyYy5pLmVqYjIwPUNIS0oyNDc0VzogezB9IG11c3Qgbm90IGV4cG9zZSB7MX0gKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNIS0oyNDc0LmNyYy5tLmVqYjIwPUNIS0oyNDc0VzogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHswfSAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotCi1DSEtKMjQ5MC5jcmMuaS5lamIyMD1DSEtKMjQ5MFc6IHswfSBtdXN0IG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi1DSktKMjQ5MC5jcmMubS5lamIyMD1DSEtKMjQ5MFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLQotIyBlamJTZWxlY3QgbWV0aG9kCi1DSEtKMjQ4NS5jYi5pLmVqYjIwPUNIS0oyNDg1VzogezB9IG11c3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEwLjUuNywgMTAuNi43KS4KLUNIS0oyNDg1LmNiLm0uZWpiMjA9Q0hLSjI0ODVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxMC41LjcsIDEwLjYuNykuCi0KLUNIS0oyNDg3LmNiLmkuZWpiMjA9Q0hLSjI0ODdXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNykuCi1DSEtKMjQ4Ny5jYi5tLmVqYjIwPUNIS0oyNDg3VzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNykuCi0KLUNIS0oyNDg4LmNiLmkuZWpiMjA9Q0hLSjI0ODhXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjcpLgotQ0hLSjI0ODguY2IubS5lamIyMD1DSEtKMjQ4OFc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi43KS4KLQotQ0hLSjI0ODYuY2IuaS5lamIyMD1DSEtKMjQ4Nlc6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDEwLjUuNywgMTEuMi4yKS4KLUNIS0oyNDg2LmNiLm0uZWpiMjA9Q0hLSjI0ODZXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDEwLjUuNywgMTEuMi4yKS4KLQotQ0hLSjI0OTYuY2IuaS5lamIyMD1DSEtKMjQ5Nlc6IHswfSBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwgKEVKQiAyLjA6IDEwLjUuNywgMTAuNi4xNCkuCi1DSEtKMjQ5Ni5jYi5tLmVqYjIwPUNIS0oyNDk2VzogVGhpcyBtZXRob2QgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC41LjcsIDEwLjYuMTQpLgotCi0jIGNvbXBvbmVudCBtYXRjaGluZyBtZXRob2QKLUNIS0oyMDIzLnNyYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyMDIzLnNsYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyMDIzLmJyYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyMDIzLmJsYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi4xMCkuCi1DSEtKMjAyMy5jcmMuaS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG5lZWRzIHsxfSB0byBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjAyMy5jbGMuaS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG5lZWRzIHsxfSB0byBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjYuMTEpLgotQ0hLSjIwMjMuc3JjLm0uZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyMDIzLnNsYy5tLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjAyMy5icmMubS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjIwMjMuYmxjLm0uZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi4xMCkuCi1DSEtKMjAyMy5jcmMubS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjIwMjMuY2xjLm0uZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNi4xMSkuCi0KLUNIS0oyNDcwLnNyYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNDcwLnNsYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyNDcwLmNyYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNDcwLmNsYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogMTAuNi4xMSkuCi1DSEtKMjQ3MC5icmMuaS5lamIyMD1DSEtKMjQ3MEU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjQ3MC5ibGMuaS5lamIyMD1DSEtKMjQ3MEU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDEyLjIuMTApLgotQ0hLSjI0NzAuc3JjLm0uZWpiMjA9Q0hLSjI0NzBFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjQ3MC5zbGMubS5lamIyMD1DSEtKMjQ3MEU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyNDcwLmNyYy5tLmVqYjIwPUNIS0oyNDcwRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI0NzAuY2xjLm0uZWpiMjA9Q0hLSjI0NzBFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDEwLjYuMTEpLgotQ0hLSjI0NzAuYnJjLm0uZWpiMjA9Q0hLSjI0NzBFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjQ3MC5ibGMubS5lamIyMD1DSEtKMjQ3MEU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogMTIuMi4xMCkuCi0KLUNIS0oyNDcxLnNyYy5pLmVqYjIwPUNIS0oyNDcxVzogezB9IG11c3QgdGhyb3cgezF9IChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI0NzEuc2xjLmkuZWpiMjA9Q0hLSjI0NzFXOiB7MH0gbXVzdCB0aHJvdyB7MX0gKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjQ3MS5jcmMuaS5lamIyMD1DSEtKMjQ3MVc6IHswfSBtdXN0IHRocm93IHsxfSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNDcxLmNsYy5pLmVqYjIwPUNIS0oyNDcxVzogezB9IG11c3QgdGhyb3cgezF9IChFSkIgMi4wOiAxMC42LjExKS4KLUNIS0oyNDcxLmJyYy5pLmVqYjIwPUNIS0oyNDcxVzogezB9IG11c3QgdGhyb3cgezF9IChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI0NzEuYmxjLmkuZWpiMjA9Q0hLSjI0NzFXOiB7MH0gbXVzdCB0aHJvdyB7MX0gKEVKQiAyLjA6IDEyLjIuMTApLgotQ0hLSjI0NzEuc3JjLm0uZWpiMjA9Q0hLSjI0NzFXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNDcxLnNsYy5tLmVqYjIwPUNIS0oyNDcxVzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjQ3MS5jcmMubS5lamIyMD1DSEtKMjQ3MVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI0NzEuY2xjLm0uZWpiMjA9Q0hLSjI0NzFXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSAoRUpCIDIuMDogMTAuNi4xMSkuCi1DSEtKMjQ3MS5icmMubS5lamIyMD1DSEtKMjQ3MVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI0NzEuYmxjLm0uZWpiMjA9Q0hLSjI0NzFXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSAoRUpCIDIuMDogMTIuMi4xMCkuCi0KLSMgRUpCT2JqZWN0LCBFSkJMb2NhbE9iamVjdCBtZXRob2RzCi1DSEtKMjQ2OS5zcmMuaS5lamIyMD1DSEtKMjQ2OVc6IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA2LjUpLgotQ0hLSjI0Njkuc2xjLmkuZWpiMjA9Q0hLSjI0NjlXOiB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogNi41KS4KLUNIS0oyNDY5LmNyYy5pLmVqYjIwPUNIS0oyNDY5VzogezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuOSkuCi1DSEtKMjQ2OS5jbGMuaS5lamIyMD1DSEtKMjQ2OVc6IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjEwKS4KLUNIS0oyNDY5LmJyYy5pLmVqYjIwPUNIS0oyNDY5VzogezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuOSkuCi1DSEtKMjQ2OS5ibGMuaS5lamIyMD1DSEtKMjQ2OVc6IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjEwKS4KLUNIS0oyNDY5LnNyYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogNi41KS4KLUNIS0oyNDY5LnNsYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogNi41KS4KLUNIS0oyNDY5LmNyYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS45KS4KLUNIS0oyNDY5LmNsYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS4xMCkuCi1DSEtKMjQ2OS5icmMubS5lamIyMD1DSEtKMjQ2OVc6IFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuOSkuCi1DSEtKMjQ2OS5ibGMubS5lamIyMD1DSEtKMjQ2OVc6IFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuMTApLgotCi0jIGZpbmRCeVByaW1hcnlLZXkKLUNIS0oyNDc1LmNyaC5pLmVqYjIwPUNIS0oyNDc1VzogezB9IG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MX0pIChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjQ3NS5jbGguaS5lamIyMD1DSEtKMjQ3NVc6IHswfSBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoezF9KSAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIpLgotQ0hLSjI0NzUuY3JoZC5pLmVqYjIwPUNIS0oyNDc1VzogezB9IG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleShPYmplY3QpIChFSkIgMi4wOiAxMC44LjMpLgotQ0hLSjI0NzUuY2xoZC5pLmVqYjIwPUNIS0oyNDc1VzogezB9IG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleShPYmplY3QpIChFSkIgMi4wOiAxMC44LjMpLgotQ0hLSjI0NzUuYnJoLmkuZWpiMjA9Q0hLSjI0NzVXOiB7MH0gbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHsxfSkgKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI0NzUuYmxoLmkuZWpiMjA9Q0hLSjI0NzVXOiB7MH0gbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHsxfSkgKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLUNIS0oyNDc1LmNyaC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHswfSkgKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNDc1LmNsaC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHswfSkgKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLUNIS0oyNDc1LmNyaGQubS5lamIyMD1DSEtKMjQ3NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleShPYmplY3QpIChFSkIgMi4wOiAxMC44LjMpLgotQ0hLSjI0NzUuY2xoZC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KE9iamVjdCkgKEVKQiAyLjA6IDEwLjguMykuCi1DSEtKMjQ3NS5icmgubS5lamIyMD1DSEtKMjQ3NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MH0pIChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLUNIS0oyNDc1LmJsaC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHswfSkgKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLQotQ0hLSjI0NzkuY3JoLmkuZWpiMjA9Q0hLSjI0NzlFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjQ3OS5jbGguaS5lamIyMD1DSEtKMjQ3OUU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLUNIS0oyNDc5LmJyaC5pLmVqYjIwPUNIS0oyNDc5RTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjQ3OS5ibGguaS5lamIyMD1DSEtKMjQ3OUU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLUNIS0oyNDc5LmNyaC5tLmVqYjIwPUNIS0oyNDc5RTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjQ3OS5jbGgubS5lamIyMD1DSEtKMjQ3OUU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIpLgotQ0hLSjI0NzkuYnJoLm0uZWpiMjA9Q0hLSjI0NzlFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI0NzkuYmxoLm0uZWpiMjA9Q0hLSjI0NzlFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZpZWxkIGNoZWNrcwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNIS0oyNDUyLnNiLmkuZWpiMjA9Q0hLSjI0NTJXOiBUcmFuc2llbnQgZmllbGQgezB9IHNob3VsZCBub3QgYmUgdGhlIHsxfSB0eXBlIChFSkIgMi4wOiA3LjQuMSkuCi1DSEtKMjQ1Mi5zYi5tLmVqYjIwPUNIS0oyNDUyVzogQSB0cmFuc2llbnQgZmllbGQgc2hvdWxkIG5vdCBiZSB0aGUgezB9IHR5cGUgKEVKQiAyLjA6IDcuNC4xKS4KLQotQ0hLSjI0NTMuc2IuaS5lamIyMD1DSEtKMjQ1M1c6IFRyYW5zaWVudCBmaWVsZHMgKHswfSkgYXJlIGRpc2NvdXJhZ2VkIChFSkIgMi4wOiA3LjQuMSkuCi1DSEtKMjQ1My5zYi5tLmVqYjIwPUNIS0oyNDUzVzogVHJhbnNpZW50IGZpZWxkcyBhcmUgZGlzY291cmFnZWQgKEVKQiAyLjA6IDcuNC4xKS4KLQotIyBDTVIgYW5kIENNUCBmaWVsZHMgbXVzdCBOT1QgYmUgZGVmaW5lZCBvbiB0aGUgYmVhbiBjbGFzcy4KLUNIS0oyNDU0LmNiLmkuZWpiMjA9Q0hLSjI0NTRXOiB7MH0gbXVzdCBub3QgYmUgZGVmaW5lZCAoRUpCIDIuMDogMTAuMy4xKS4KLUNIS0oyNDU0LmNiLm0uZWpiMjA9Q0hLSjI0NTRXOiB7MH0gbXVzdCBub3QgYmUgZGVmaW5lZCAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjI0ODAuY2IuaS5lamIyMD1DSEtKMjQ4MEk6IHswfSBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIChFSkIgMi4wOiAxMC4zLjEpLgotQ0hLSjI0ODAuY2IubS5lamIyMD1DSEtKMjQ4MEk6IHswfSBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIChFSkIgMi4wOiAxMC4zLjEpLgotCi1DSEtKMjQ4MS5jYi5pLmVqYjIwPUNIS0oyNDgxVzogezB9IG11c3QgYmUgZGVjbGFyZWQgYXMgYSA8Y21wLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEzKS4KLUNIS0oyNDgxLmNiLm0uZWpiMjA9Q0hLSjI0ODFXOiB7MH0gbXVzdCBiZSBkZWNsYXJlZCBhcyBhIDxjbXAtZmllbGQ+IChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTMpLgotCi1DSEtKMjQ4Mi5jYi5pLmVqYjIwPUNIS0oyNDgyVzogezB9IG11c3QgYmUgZGVjbGFyZWQgYXMgYSA8Y21yLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEzKS4KLUNIS0oyNDgyLmNiLm0uZWpiMjA9Q0hLSjI0ODJXOiB7MH0gbXVzdCBiZSBkZWNsYXJlZCBhcyBhIDxjbXItZmllbGQ+IChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTMpLgotCi1DSEtKMjQ4My5jYi5pLmVqYjIwPUNIS0oyNDgzVzogezB9IHNob3VsZCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xKS4KLUNIS0oyNDgzLmNiLm0uZWpiMjA9Q0hLSjI0ODNXOiB7MH0gc2hvdWxkIG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEpLgotCi1DSEtKMjQ4NC5jYi5pLmVqYjIwPUNIS0oyNDg0VzogezB9IG11c3QgYmUgZWl0aGVyIGEgcHJpbWl0aXZlIG9yIGEgc2VyaWFsaXphYmxlIHR5cGUgKEVKQiAyLjA6IDEwLjMuMSkuCi1DSEtKMjQ4NC5jYi5tLmVqYjIwPUNIS0oyNDg0VzogezB9IG11c3QgYmUgZWl0aGVyIGEgcHJpbWl0aXZlIG9yIGEgc2VyaWFsaXphYmxlIHR5cGUgKEVKQiAyLjA6IDEwLjMuMSkuCi0KLUNIS0oyNDg5LmNiLmkuZWpiMjA9Q0hLSjI0ODlXOiBGaWVsZCB7MH0gbXVzdCBiZSB0aGUgezF9IHR5cGUgKEVKQiAyLjA6IDEwLjguMSkuCi1DSEtKMjQ4OS5jYi5tLmVqYjIwPUNIS0oyNDg5VzogVGhpcyBmaWVsZCBtdXN0IGJlIHRoZSB7MH0gdHlwZSAoRUpCIDIuMDogMTAuOC4xKS4KLQotQ0hLSjIyMDUua2MuaS5lamIyMD1DSEtKMjIwNVc6IEZpZWxkIHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuOC4yKS4KLUNIS0oyMjA1LmtjLm0uZWpiMjA9Q0hLSjIyMDVXOiBUaGlzIGZpZWxkIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC44LjIpLgotCi1DSEtKMjIwNi5rYy5pLmVqYjIwPUNIS0oyMjA2VzogRmllbGQgezB9IG11c3QgYmUgYSA8Y21wLWZpZWxkPiAoRUpCIDIuMDogMTAuOC4yKS4KLUNIS0oyMjA2LmtjLm0uZWpiMjA9Q0hLSjIyMDZXOiBUaGlzIGZpZWxkIG11c3QgYmUgYSA8Y21wLWZpZWxkPiAoRUpCIDIuMDogMTAuOC4yKS4KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIERECi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNIS0oyODgwLnMuZWpiMjA9Q0hLSjI4ODBXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsLWhvbWU+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODEucy5lamIyMD1DSEtKMjg4MVc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8aG9tZT4gKEVKQiAyLjA6IDcuMTAuMSkuCi1DSEtKMjg4Mi5zLmVqYjIwPUNIS0oyODgyVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxsb2NhbD4gKEVKQiAyLjA6IDcuMTAuMSkuCi1DSEtKMjg4My5zLmVqYjIwPUNIS0oyODgzVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxyZW1vdGU+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODQucy5lamIyMD1DSEtKMjg4NFc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgPGxvY2FsLWhvbWU+IG9yIGEgPGhvbWU+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODUucy5lamIyMD1DSEtKMjg4NVc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgPGxvY2FsPiBvciBhIDxyZW1vdGU+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODAuYy5lamIyMD1DSEtKMjg4MFc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWwtaG9tZT4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4MS5jLmVqYjIwPUNIS0oyODgxVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxob21lPiAoRUpCIDIuMDogMTAuNi4xKS4KLUNIS0oyODgyLmMuZWpiMjA9Q0hLSjI4ODJXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsPiAoRUpCIDIuMDogMTAuNi4xKS4KLUNIS0oyODgzLmMuZWpiMjA9Q0hLSjI4ODNXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPHJlbW90ZT4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4NC5jLmVqYjIwPUNIS0oyODg0VzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWwtaG9tZT4gb3IgYSA8aG9tZT4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4NS5jLmVqYjIwPUNIS0oyODg1VzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWw+IG9yIGEgPHJlbW90ZT4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4MC5iLmVqYjIwPUNIS0oyODgwVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxsb2NhbC1ob21lPiAoRUpCIDIuMDogMTIuMi4xKS4KLUNIS0oyODgxLmIuZWpiMjA9Q0hLSjI4ODFXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGhvbWU+IChFSkIgMi4wOiAxMi4yLjEpLgotQ0hLSjI4ODIuYi5lamIyMD1DSEtKMjg4Mlc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWw+IChFSkIgMi4wOiAxMi4yLjEpLgotQ0hLSjI4ODMuYi5lamIyMD1DSEtKMjg4M1c6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8cmVtb3RlPiAoRUpCIDIuMDogMTIuMi4xKS4KLUNIS0oyODg0LmIuZWpiMjA9Q0hLSjI4ODRXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbC1ob21lPiBvciBhIDxob21lPiAoRUpCIDIuMDogMTIuMi4xKS4KLUNIS0oyODg1LmIuZWpiMjA9Q0hLSjI4ODVXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbD4gb3IgYSA8cmVtb3RlPiAoRUpCIDIuMDogMTIuMi4xKS4KLQotQ0hLSjI4MTMuZWpiMjA9Q0hLSjI4MTNJOiA8ZWpiLW5hbWU+IHswfSBtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIChFSkIgMi4wOiAxMC4zLjEzLCAxMS4yLjYuMSkuCi1DSEtKMjgxOS5lamIyMD1DSEtKMjgxOUk6IDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gezB9IG11c3QgYmUgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIgKEVKQiAyLjA6IDEwLjMuMTMsIDEwLjYuMTQsIDExLjIuNi4xKS4KLUNIS0oyODU0LmVqYjIwPUNIS0oyODU0RTogPGFic3RyYWN0LXNjaGVtYS1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyLnhtbCBmaWxlIChFSkIgMi4wOiAxMC4zLjEzLCAxMC42LjE0LCAxMS4yLjIpLgotQ0hLSjI4NTguZWpiMjA9Q0hLSjI4NThXOiA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4NTkuZWpiMjA9Q0hLSjI4NTlXOiBSZXNlcnZlZCBpZGVudGlmaWVyIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiA8ZWpiLW5hbWU+IChFSkIgMi4wOiAxMC42LjE0LCAxMS4yLjYuMSkuCi1DSEtKMjg2MC5lamIyMD1DSEtKMjg2MFc6IFJlc2VydmVkIGlkZW50aWZpZXIgezB9IGNhbm5vdCBiZSB1c2VkIGFzIGFuIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gKEVKQiAyLjA6IDEwLjYuMTQsIDExLjIuNi4xKS4KLQotQ0hLSjI4NjEuZWpiMjA9Q0hLSjI4NjFJOiA8Y21wLWZpZWxkPiB7MH0gbXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBhbmQgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgKEVKQiAyLjA6IDEwLjMuMSwgMTEuMi42LjEpLgotQ0hLSjI4NTcuZWpiMjA9Q0hLSjI4NTdJOiA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBhbmQgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgKEVKQiAyLjA6IDEwLjMuMSwgMTEuMi42LjEpLgotCi1DSEtKMjg2Mi5lamIyMD1DSEtKMjg2Mkk6IDxjbXAtZmllbGQ+IHswfSBtdXN0IGhhdmUgYSBzZXQgbWV0aG9kIChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjg2My5lamIyMD1DSEtKMjg2M0k6IDxjbXAtZmllbGQ+IHswfSBtdXN0IGhhdmUgYSBnZXQgbWV0aG9kIChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjg2NC5lamIyMD1DSEtKMjg2NEk6IDxjbXItZmllbGQ+IHswfSBtdXN0IGhhdmUgYSBzZXQgbWV0aG9kIChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjg2NS5lamIyMD1DSEtKMjg2NUk6IDxjbXItZmllbGQ+IHswfSBtdXN0IGhhdmUgYSBnZXQgbWV0aG9kIChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjg1NS5lamIyMD1DSEtKMjg1NUk6IDxjbXAtZmllbGQ+IHswfSBtdXN0IGJlIGEgSmF2YSBwcmltaXRpdmUgb3IgYSBKYXZhIHNlcmlhbGl6YWJsZSB0eXBlIChFSkIgMi4wOiAxMC4zLjEpLgotQ0hLSjI4NTYuZWpiMjA9Q0hLSjI4NTZJOiA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSB0aGUgezF9IHR5cGUgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDEwLjMuMSkuCi0KLUNIS0oyODE1LmVqYjIwPUNIS0oyODE1VzogRGVwZW5kZW50IHZhbHVlIGNsYXNzIHswfSBjYW5ub3QgYmUgYSA8Y21yLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4zKS4KLQotQ0hLSjI4MTYuZWpiMjA9Q0hLSjI4MTZJOiA8ZWpiLXJlbGF0aW9uLW5hbWU+IG11c3QgYmUgdW5pcXVlIGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMsIDIyLjUpLgotQ0hLSjI4MTcuZWpiMjA9Q0hLSjI4MTdJOiA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+IG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiA8ZWpiLXJlbGF0aW9uPiAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzLCAyMi41KS4KLUNIS0oyODE4LmVqYjIwPUNIS0oyODE4STogVGhlIHZhbHVlIG9mIHRoZSA8bXVsdGlwbGljaXR5PiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJPbmUiIG9yICJNYW55IiAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzLCAyMi41KS4KLUNIS0oyODIxLmVqYjIwPUNIS0oyODIxSTogPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4gaW4gcm9sZSB7MH0gbXVzdCByZWZlciB0byBhbiBleGlzdGluZyBDTVAgYmVhbiAoRUpCIDIuMDogMTAuMy4yLCAyMi41KS4KLUNIS0oyODQ4LmVqYjIwPUNIS0oyODQ4STogPGNhc2NhZGUtZGVsZXRlPiBtdXN0IGJlIHVzZWQgd2l0aCBhIDxtdWx0aXBsaWNpdHk+IG9mICJPbmUiIChFSkIgMi4wOiAxMC4zLjQuMiwgMjIuNSkuCi1DSEtKMjg2Ni5lamIyMD1DSEtKMjg2Nkk6IDxjbXItZmllbGQ+IHswfSBtdXN0IGJlIGRlZmluZWQgb24gezF9IChFSkIgMi4wOiAxMC4zLjIsIDIyLjUpLgotQ0hLSjI4NjcuZWpiMjA9Q0hLSjI4NjdJOiBUaGlzIGJlYW4gY2FuIGhhdmUgb25seSB1bmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRvIG90aGVyIGJlYW5zIChFSkIgMi4wOiAxMC4zLjIpLgotQ0hLSjI4NjguZWpiMjA9Q0hLSjI4NjhJOiBUaGUgdmFsdWUgb2YgdGhlIDxjbXItZmllbGQtdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiamF2YS51dGlsLkNvbGxlY3Rpb24iIG9yICJqYXZhLnV0aWwuU2V0IiAoRUpCIDIuMDogMTAuMy4xMywgMjIuNSkuCi1DSEtKMjg2OS5lamIyMD1DSEtKMjg2OUk6IEF0IGxlYXN0IG9uZSA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPiBtdXN0IGRlZmluZSBhIDxjbXItZmllbGQ+IChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMsIDIyLjUpLgotQ0hLSjI4NzAuZWpiMjA9Q0hLSjI4NzBJOiA8ZWpiLW5hbWU+IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC4zLjEzKS4KLUNIS0oyODcxLmVqYjIwPUNIS0oyODcxSTogPGVqYi1uYW1lPiB7MH0gbXVzdCByZWZlciB0byBhIENNUCBiZWFuIChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMpLgotCi1DSEtKMjg3Mi5lamIyMD1DSEtKMjg3MkU6IFRoZSB2YWx1ZSBvZiB0aGUgPGNtcC12ZXJzaW9uPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICIxLngiIG9yICIyLngiIChFSkIgMi4wOiAyMi41KS4KLUNIS0oyODczLmVqYjIwPUNIS0oyODczVzogTWlncmF0ZSB0aGlzIGJlYW4ncyBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBDTVAgQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcuCi1DSEtKMjg3NC5lamIyMD1DSEtKMjg3NFc6IE1pZ3JhdGUgdGhpcyBFSkIgbW9kdWxlJ3MgZGVmYXVsdCBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZy4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIDJUQzogRG8gbm90IHRyYW5zbGF0ZSBhbnl0aGluZyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24uIFRoZXNlIHN0cmluZ3MKLSMgICAgICBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgSWdub3JlIHRoZXNlIG1lc3NhZ2VzIGZvciBub3c7IHRoZSBFSkIgUUwgdmFsaWRhdG9yIG1heSB0YWtlIGNhcmUgb2YgdGhpcy4KLSMgSWYgbm90LCBhZGQgdGhpcyB2YWxpZGF0aW9uIGludG8gdGhlIEVKQkphclZSdWxlIGNsYXNzLgotIwotIwotIyBJZGVudGlmaWNhdGlvbiB2YXJpYWJsZXMKLSMKLSMgSVdBRDQ5MjcuZWpiMjA9SVdBRDQ5MjdXOiBJZGVudGlmaWNhdGlvbiB2YXJpYWJsZSB7MH0gbXVzdCBiZSBkZWNsYXJlZCBpbiB0aGUgRlJPTSBjbGF1c2UgKEVKQiAyLjA6IDExLjIuNi4yKS4KLSMgSVdBRDQ5MjguZWpiMjA9SVdBRDQ5MjhXOiBSZXNlcnZlZCBpZGVudGlmaWVyIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSAoRUpCIDIuMDogMTEuMi42LjIpLgotIyBJV0FENDkyOS5lamIyMD1JV0FENDkyOVc6IDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gezB9IGNhbm5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIChFSkIgMi4wOiAxMS4yLjYuMikuCi0jIElXQUQ0OTMwLmVqYjIwPUlXQUQ0OTMwVzogPGVqYi1uYW1lPiB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmljYXRpb24gdmFyaWFibGUgKEVKQiAyLjA6IDExLjIuNi4yKS4KLQotIwotIyBxdWVyeSBzdGF0ZW1lbnQKLSMKLSMgSVdBRDQ5MTguZWpiMjA9SVdBRDQ5MThXOiBUaGlzIHF1ZXJ5IG11c3QgY29udGFpbiBhIFNFTEVDVCBjbGF1c2UgKEVKQiAyLjA6IDExLjEpLgotIyBJV0FENDkxOS5lamIyMD1JV0FENDkxOVc6IFRoaXMgcXVlcnkgbXVzdCBjb250YWluIGEgRlJPTSBjbGF1c2UgKEVKQiAyLjA6IDExLjEpLgotIyBJV0FENDkyMC5lamIyMD1JV0FENDkyMFc6IFRoaXMgcXVlcnkgaGFzIGEgc3ludGF4IGVycm9yIChFSkIgMi4wOiAxMS4yKS4KLSMKLQotCi0jIElXQUQ0ODA4LmVqYjIwPUlXQUQ0ODA4VzogVGhpcyBiZWFuIG11c3QgdXNlIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIChFSkIgMi4wOiAxNy4zLjEsIDE3LjMuMykuCi0jIElXQUQ0ODA5LmVqYjIwPUlXQUQ0ODA5VzogU3BlY2lmeSBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBmb3IgdGhpcyBtZXRob2QgKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0ODEwLmVqYjIwPUlXQUQ0ODEwVzogQSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgbXVzdCBub3QgZXhpc3QgZm9yIHRoaXMgbWV0aG9kIChFSkIgMi4wOiAxNy40LjEpLgotCi0jIElXQUQ0ODExLmVqYjIwPUlXQUQ0ODExVzogQXQgbGVhc3Qgb25lIDxtZXRob2Q+IG11c3QgZXhpc3QgaW4gYSA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPiAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ5MDAuZWpiMjA9SVdBRDQ5MDBXOiBUaGlzIDxjb250YWluZXItdHJhbnNhY3Rpb24+IG11c3QgcmVmZXJlbmNlIG9ubHkgb25lIGJlYW4gKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0OTAxLmVqYjIwPUlXQUQ0OTAxVzogezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDE3LjQuMSkKLSMgSVdBRDQ4MTUuZWpiMjA9SVdBRDQ4MTVXOiBObyBtZXRob2RzIG9uIHswfSBtYXRjaCB0aGlzIDxtZXRob2Q+IChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDgxNy5lamIyMD1JV0FENDgxN1c6IDx0cmFucy1hdHRyaWJ1dGU+IGlzIHVua25vd24gKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0ODE4LmVqYjIwPUlXQUQ0ODE4VzogT25seSBvbmUgU3R5bGUgMSA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPiBtYXkgZXhpc3QgZm9yIHswfSAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ4MTkuZWpiMjA9SVdBRDQ4MTlXOiBPbmx5IG9uZSBTdHlsZSAyIDxjb250YWluZXItdHJhbnNhY3Rpb24+IG1heSBleGlzdCBmb3IgezB9IChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDgyMC5lamIyMD1JV0FENDgyMFc6IEF0IGxlYXN0IG9uZSA8bWV0aG9kLXBhcmFtPiBtdXN0IGV4aXN0IGluIGEgPG1ldGhvZC1wYXJhbXM+LgotCi0jIElXQUQ0ODIxLmVqYjIwPUlXQUQ0ODIxVzogPGVudi1lbnRyeS12YWx1ZT4gbXVzdCBiZSBhIHswfSAoRUpCIDIuMDogMjAuMi4xLjIsIDIyLjUpLgotIyBJV0FENDgyMi5lamIyMD1JV0FENDgyMlc6IDxlbnYtZW50cnktbmFtZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMi4xLjIsIDIyLjUpLgotIyBJV0FENDgyMy5lamIyMD1JV0FENDgyM1c6IDxlbnYtZW50cnktdHlwZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMi4xLjIsIDIyLjUpLgotIyBJV0FENDgyNC5lamIyMD1JV0FENDgyNFc6IDxlbnYtZW50cnktbmFtZT4gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHswfSAoRUpCIDIuMDogMjAuMi4xLjIpLgotIyBJV0FENDgyNS5lamIyMD1JV0FENDgyNVc6IDxlbnYtZW50cnktdHlwZT4gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgKEVKQiAyLjA6IDIwLjIuMS4yLCAyMi41KS4KLSMgSVdBRDQ4MjYuZWpiMjA9SVdBRDQ4MjZXOiA8ZW52LWVudHJ5LXZhbHVlPiBtdXN0IGJlIGEgU3RyaW5nIG9yIGEgY2hhcmFjdGVyIChFSkIgMi4wOiAyMC4yLjEuMikuCi0KLSMgSVdBRDQ4MjguZWpiMjA9SVdBRDQ4MjhXOiBDb252ZW50aW9uYWxseSB0aGlzIHJlZmVyZW5jZSBpcyBsb2NhdGVkIGluIHRoZSAiZWpiIiBzdWJjb250ZXh0IChFSkIgMi4wOiAyMC4zLjEuMSwgMjIuNSkuCi0jIElXQUQ0ODI5LmVqYjIwPUlXQUQ0ODI5VzogVGhpcyA8ZW52LWVudHJ5PiBzaG91bGQgYmUgaW4gYW4gPGVqYi1yZWY+IChFSkIgMi4wOiAyMC4zLjEuMikuCi0jIElXQUQ0ODMwLmVqYjIwPUlXQUQ0ODMwVzogVGhpcyA8ZW52LWVudHJ5PiBzaG91bGQgYmUgaW4gYW4gPGVqYi1sb2NhbC1yZWY+IChFSkIgMi4wOiAyMC4zLjEuMikuCi0jIElXQUQ0ODMxLmVqYjIwPUlXQUQ0ODMxVzogPGVqYi1yZWYtdHlwZT4gbXVzdCBiZSB7MH0gKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDgzMi5lamIyMD1JV0FENDgzMlc6IDxlamItcmVmPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzMuZWpiMjA9SVdBRDQ4MzNXOiA8ZWpiLWxvY2FsLXJlZj4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODM0LmVqYjIwPUlXQUQ0ODM0VzogPGhvbWU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDgzNS5lamIyMD1JV0FENDgzNVc6IDxsb2NhbC1ob21lPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzYuZWpiMjA9SVdBRDQ4MzZXOiA8cmVtb3RlPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzcuZWpiMjA9SVdBRDQ4MzdXOiA8bG9jYWwtcmVtb3RlPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzguZWpiMjA9SVdBRDQ4MzhXOiA8ZWpiLXJlZj4gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHswfSAoRUpCIDIuMDogMjAuMy4xLjIpLgotIyBJV0FENDgzOS5lamIyMD1JV0FENDgzOVc6IDxlamItbG9jYWwtcmVmPiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gezB9IChFSkIgMi4wOiAyMC4zLjEuMikuCi0jIElXQUQ0ODQwLmVqYjIwPUlXQUQ0ODQwVzogPGhvbWU+IHswfSBpcyBub3QgdXNlZCBieSBiZWFuIHsxfSAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODQxLmVqYjIwPUlXQUQ0ODQxVzogPHJlbW90ZT4gezB9IGlzIG5vdCB1c2VkIGJ5IGJlYW4gezF9IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4NDIuZWpiMjA9SVdBRDQ4NDJXOiA8ZWpiLWxpbms+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjMuMS4yKS4KLQotIyBJV0FENDg0My5lamIyMD1JV0FENDg0M1c6IFRoaXMgPGVudi1lbnRyeT4gbXVzdCBiZSBhIDxyZXNvdXJjZS1yZWY+IChFSkIgMi4wOiAyMC40LjEuMikuCi0jIElXQUQ0ODQ0LmVqYjIwPUlXQUQ0ODQ0VzogPHJlcy1yZWYtbmFtZT4gc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSAiamF2YTpjb20vZW52LyIgc3RyaW5nIChFSkIgMi4wOiAyMC40LjEuMikuCi0jIElXQUQ0ODQ1LmVqYjIwPUlXQUQ0ODQ1VzogPHJlcy1hdXRoPiBtdXN0IGJlICJBcHBsaWNhdGlvbiIgb3IgIkNvbnRhaW5lciIgKEVKQiAyLjA6IDIwLjQuMS4yKS4KLSMgSVdBRDQ4NDYuZWpiMjA9SVdBRDQ4NDZXOiA8cmVzLXNoYXJpbmctc2NvcGU+IG11c3QgYmUgIlNoYXJlYWJsZSIgb3IgIlVuc2hhcmVhYmxlIiAoRUpCIDIuMDogMjAuNC4xLjIpLgotIyBJV0FENDg0Ny5lamIyMD1JV0FENDg0N1c6IDxyZXNvdXJjZS1yZWY+IG11c3QgYmUgdW5pcXVlIGluIGJlYW4gezB9IChFSkIgMi4wOiAyMC40LjEuMikuCi0KLSMgSVdBRDQ4NDguZWpiMjA9SVdBRDQ4NDhXOiBDb252ZW50aW9uYWxseSB0aGlzIGlzIGxvY2F0ZWQgaW4gdGhlICJqYXZhOmNvbXAvZW52L2pkYmMiIHN1YmNvbnRleHQgKEVKQiAyLjA6IDIwLjQuMS4zLCAyMC41LjEuMSkuCi0jIElXQUQ0ODQ5LmVqYjIwPUlXQUQ0ODQ5VzogQ29udmVudGlvbmFsbHkgdGhpcyBpcyBsb2NhdGVkIGluIHRoZSAiamF2YTpjb21wL2Vudi9qbXMiIHN1YmNvbnRleHQgKEVKQiAyLjA6IDIwLjQuMS4zLCAyMC41LjEuMSkuCi0jIElXQUQ0ODUwLmVqYjIwPUlXQUQ0ODUwVzogQ29udmVudGlvbmFsbHkgdGhpcyBpcyBsb2NhdGVkIGluIHRoZSAiamF2YTpjb21wL2Vudi9tYWlsIiBzdWJjb250ZXh0IChFSkIgMi4wOiAyMC40LjEuMywgMjAuNS4xLjEpLgotIyBJV0FENDg1MS5lamIyMD1JV0FENDg1MVc6IENvbnZlbnRpb25hbGx5IHRoaXMgaXMgbG9jYXRlZCBpbiB0aGUgImphdmE6Y29tcC9lbnYvdXJsIiBzdWJjb250ZXh0IChFSkIgMi4wOiAyMC40LjEuMywgMjAuNS4xLjEpLgotCi0jIElXQUQ0ODUyLmVqYjIwPUlXQUQ0ODUyVzogVGhpcyA8ZW52LWVudHJ5PiBtdXN0IGJlIGEgPHJlc291cmNlLWVudi1yZWY+IChFSkIgMi4wOiAyMC41LjEuMikuCi0jIElXQUQ0ODUzLmVqYjIwPUlXQUQ0ODUzVzogPHJlc291cmNlLWVudi1yZWYtbmFtZT4gc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSAiamF2YTpjb21wL2VudiIgc3RyaW5nIChFSkIgMi4wOiAyMC41LjEuMikuCi0jIElXQUQ0ODU0LmVqYjIwPUlXQUQ0ODU0VzogQSBKTVMgRGVzdGluYXRpb24gdmFsdWUgbXVzdCBiZSBlaXRoZXIgamF2YXguam1zLlF1ZXVlIG9yIGphdmF4Lmptcy5Ub3BpYyAoRUpCIDIuMDogMjAuNS4xLjIpLgotIyBJV0FENDg1NS5lamIyMD1JV0FENDg1NVc6IDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+IG11c3QgYmUgdW5pcXVlIGluIGJlYW4gezB9IChFSkIgMi4wOiAyMC41LjEuMikuCi0KLSMgSVdBRDQ4NTYuZWpiMjA9SVdBRDQ4NTZXOiBBIDxyb2xlLW5hbWU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIxLjIuNS4zKS4KLSMgSVdBRDQ4NTcuZWpiMjA9SVdBRDQ4NTdXOiA8cm9sZS1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIGJlYW4gezF9IChFSkIgMi4wOiAyMS4yLjUuMykuCi0jIElXQUQ0ODU4LmVqYjIwPUlXQUQ0ODU4VzogQSA8cm9sZS1uYW1lPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMS4zLjEpLgotIyBJV0FENDg1OS5lamIyMD1JV0FENDg1OVc6IDxyb2xlLW5hbWU+IHswfSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYmVhbiB7MX0gKEVKQiAyLjA6IDIxLjMuMSkuCi0jIElXQUQ0ODYwLmVqYjIwPUlXQUQ0ODYwVzogU2VjdXJpdHkgcm9sZXMgbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMy4xKS4KLQotIyBJV0FENDkzMS5lamIyMD1JV0FENDkzMVc6IEF0IGxlYXN0IG9uZSA8bWV0aG9kPiBtdXN0IGV4aXN0IGluIGEgPG1ldGhvZC1wZXJtaXNzaW9uPiAoRUpCIDIuMDogMjEuMy4yKS4KLSMgSVdBRDQ5MzIuZWpiMjA9SVdBRDQ5MzJXOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMy4yKSAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ5MzMuZWpiMjA9SVdBRDQ5MzNXOiBObyBtZXRob2RzIG9uIHswfSBtYXRjaCB0aGlzIDxtZXRob2Q+IChFSkIgMi4wOiAyMS4zLjIpLgotIyBJV0FENDkzNC5lamIyMD1JV0FENDkzNFc6IEF0IGxlYXN0IG9uZSA8bWV0aG9kLXBhcmFtPiBtdXN0IGV4aXN0IGluIGEgPG1ldGhvZC1wYXJhbXM+LgotCi0jIElXQUQ0ODY2LmVqYjIwPUlXQUQ0ODY2VzogQSA8cm9sZS1saW5rPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMS4zLjMpLgotIyBJV0FENDg2Ny5lamIyMD1JV0FENDg2N1c6IFRoaXMgPHJvbGUtbGluaz4gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDIxLjMuMykuCi0jIElXQUQ0ODY4LmVqYjIwPUlXQUQ0ODY4VzogezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIxLjMuMykuCi0KLSMgSVdBRDQ4NjkuZWpiMjA9SVdBRDQ4NjlXOiA8c2VjdXJpdHktaWRlbnRpdHk+IG11c3QgYmUgZWl0aGVyICJ1c2UtY2FsbGVyLWlkZW50aXR5IiBvciAicnVuLWFzIiAoRUpCIDIuMDogMjEuMy40KS4KLSMgSVdBRDQ4NzAuZWpiMjA9SVdBRDQ4NzBXOiA8c2VjdXJpdHktaWRlbnRpdHk+IG11c3QgYmUgInJ1bi1hcyIgKEVKQiAyLjA6IDIxLjMuNCkuCi0jIElXQUQ0ODcxLmVqYjIwPUlXQUQ0ODcxVzogU2VjdXJpdHkgcm9sZSB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMy40LjEpLgotCi0jIElXQUQ0ODc1LmVqYjIwPUlXQUQ0ODc1VzogPHNlc3Npb24tdHlwZT4gbXVzdCBiZSBlaXRoZXIgIlN0YXRlZnVsIiBvciAiU3RhdGVsZXNzIiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi0jIElXQUQ0ODc2LmVqYjIwPUlXQUQ0ODc2VzogPHRyYW5zYWN0aW9uLXR5cGU+IG11c3QgYmUgZWl0aGVyICJCZWFuIiBvciAiQ29udGFpbmVyIiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi0jIElXQUQ0ODc3LmVqYjIwPUlXQUQ0ODc3VzogPHBlcnNpc3RlbmNlLXR5cGU+IG11c3QgYmUgZWl0aGVyICJCZWFuIiBvciAiQ29udGFpbmVyIiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi0jIElXQUQ0ODc5LmVqYjIwPUlXQUQ0ODc5VzogQXQgbGVhc3Qgb25lIDxjbXAtZmllbGQ+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotCi0jIElXQUQ0ODgwLmVqYjIwPUlXQUQ0ODgwVzogPGFja25vd2xlZGdlLW1vZGU+IG11c3QgYmUgZWl0aGVyICJBdXRvLWFja25vd2xlZGdlIiBvciAiRHVwcy1vay1hY2tub3dsZWRnZSIgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4MS5lamIyMD1JV0FENDg4MVc6IDxjYXNjYWRlLWRlbGV0ZT4gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4Mi5lamIyMD1JV0FENDg4Mlc6IDxjbXAtdmVyc2lvbj4gbXVzdCBiZSBlaXRoZXIgIjEueCIgb3IgIjIueCIgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4My5lamIyMD1JV0FENDg4M1c6IDxjbXItZmllbGQtbmFtZT4gbXVzdCBleGlzdCBvbiB7MH0gKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4NC5lamIyMD1JV0FENDg4NFc6IDxjbXItZmllbGQtdHlwZT4gbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIHswfSAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODg1LmVqYjIwPUlXQUQ0ODg1VzogPGNtci1maWVsZC10eXBlPiBtdXN0IGJlIGVpdGhlciBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBqYXZhLnV0aWwuU2V0IChFSkIgMi4wOiAyMi41KS4KLQotIyBJV0FENDg4Ni5lamIyMD1JV0FENDg4Nlc6IDxjbXItZmllbGQtbmFtZT4gbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODg3LmVqYjIwPUlXQUQ0ODg3VzogPGRlc3RpbmF0aW9uLXR5cGU+IG11c3QgYmUgZWl0aGVyIGphdmF4Lmptcy5RdWV1ZSBvciBqYXZheC5qbXMuVG9waWMgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4OS5lamIyMD1JV0FENDg4OVc6IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4OTAuZWpiMjA9SVdBRDQ4OTBXOiA8ZWpiLXJlZi1uYW1lPiBtdXN0IGJlIHVuaXF1ZSBpbiBiZWFuIHswfSAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODkxLmVqYjIwPUlXQUQ0ODkxVzogPGVqYi1yZWYtdHlwZT4gbXVzdCBiZSAiRW50aXR5IiBvciAiU2Vzc2lvbiIgKEVKQiAyLjA6IDIyLjUpLgotCi0jIElXQUQ0ODYyLmVqYjIwPUlXQUQ0ODYyVzogPHJlc3VsdC10eXBlLW1hcHBpbmc+IG11c3QgYmUgIlJlbW90ZSIgKEVKQiAyLjA6IDEwLjUuNykuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIDJUQzogZW5kIG9mIG1lc3NhZ2VzIHdoaWNoIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIGVuZCBvZiBtZXNzYWdlcyBmb3IgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbgotIwotCi0jCi0jIGVuZCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0jCi0KLSMKLSMgRW5kIEVKQiBWYWxpZGF0aW9uIHN0cmluZ3MKLSMKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTBmNGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZXJlZnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNUaGlzIHByb3BlcnRpZXMgZmlsZSBob2xkIGFsbCB0aGUgZXh0ZXJuYWxpc2VkIHN0cmluZ3MgZm9yIGVUb29scyBKMkVFIFZhbGlkYXRpb24gcHJvamVjdAotIyBWYWxpZGF0aW9uIHByb2plY3QKLSMKLSMgTWVzc2FnZXMgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGF0OgotIyAgICAgaHR0cDovL2hhbnkuYXVzdGluLmlibS5jb20vbWVzc2FnZXMvaW5kZXguaHRtbAotIwotIyBCcmllZmx5OgotIyAgICAgTUVTU0FHRV9JRD08Q29tcG9uZW50UHJlZml4PjxNZXNzYWdlTnVtYmVyPjxUeXBlQ29kZT46IDxNZXNzYWdlVGV4dD4KLSMKLSMgVGhlIHByZWZpeCBmb3IgdGhpcyBjb21wb25lbnQgaXM6Ci0jICAgICBDSEtKIChJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24pCi0jCi0jIE5vdGUgdGhlICI6ICIgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIHR5cGUgY29kZSBhbmQgdGhlIG1lc3NhZ2UgdGV4dC4KLSMKLSMgOkJlZ2luOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpCZWdpbjoKLSNDT01QT05FTlRQUkVGSVggQ0hLSgotI0NPTVBPTkVOVE5BTUVGT1IgQ0hLSiBJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24KLSNDTVZDUEFUSE5BTUUgbmNmL3NyYy9qYXZhL2NvbS9pYm0vd2Vic3BoZXJlL3ZhbGlkYXRpb24vZXJlZnZhbGlkYXRpb24ucHJvcGVydGllcwotIyA6RW5kOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpFbmQ6Ci0jCi0jIDE0LU9jdG9iZXItMjAwMToKLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRVJFRk5BTUU9Q0hLSjMwMDlFOiBJbiBtb2R1bGUgezF9LCAnJ2VqYi1yZWYtbmFtZScnIGVsZW1lbnQgaW4gIGVqYi1yZWY6IHswfSBpcyBpbnZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfSU5WQUxJRF9FUkVGVFlQRT1DSEtKMzAxMEU6IEluIG1vZHVsZSB7MX0sICcnZWpiLXJlZi10eXBlJycgZWxlbWVudCBpbiBlamItcmVmOiB7MH0gaXMgaW52YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEU9Q0hLSjMwMTRFOiBJbiBtb2R1bGUgezF9LCAnJ2VqYi1yZWYtdHlwZScnIGVsZW1lbnQgaW4gZWpiLXJlZjogezB9IGlzIG1pc3NpbmcuCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUU9Q0hLSjMwMTFFOiBJbiBtb2R1bGUgezF9LCBIb21lIGludGVyZmFjZSBpcyBtaXNzaW5nIGZyb20gZWpiLXJlZjogezB9IGVsZW1lbnQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9NSVNTSU5HX0VSRUZSRU1PVEU9Q0hLSjMwMTJFOiBJbiBtb2R1bGUgezF9LCBSZW1vdGUgaW50ZXJmYWNlIGlzIG1pc3NpbmcgZnJvbSBlamItcmVmOiB7MH0gZWxlbWVudC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRUpCX1JPTEU9Q0hLSjI4MjdXOiAnJ3NlY3VyaXR5LXJvbGUtcmVmJycgZWxlbWVudCB7MH0gZGVmaW5lcyB0aGUgJydyb2xlLWxpbmsnJyBlbGVtZW50IGJ1dCBubyAnJ3NlY3VyaXR5LXJvbGUnJyBlbGVtZW50cyBpbiB0aGUgYXBwbGljYXRpb24gZGVzY3JpcHRvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0RVUExJQ0FURV9SRVNSRUY9Q0hLSjMwMTNFOiBEdXBsaWNhdGUgJydyZXNvdXJjZS1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyBuZXcgc3RyaW5nIGFkZGVkIGZvciB2ZXJzaW9uIDUgV1NBRAotVU5SRVNPTFZFRF9FSkJfUkVGX1dBUk5fPUlXQUUwMDM0VyBFSkIgbGluayBlbGVtZW50IHswfSBpcyB1bnJlc29sdmFibGUgaW4gbW9kdWxlIHsxfSBhbmQgRUFSIHsyfS4KLQotRVJST1JfRUFSX0RVUExJQ0FURV9TRVJWSUNFUkVGPUNIS0ozMDE1RTogRHVwbGljYXRlICcnc2VydmljZS1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLUVSUk9SX0VBUl9EVVBMSUNBVEVfU0VDVVJJVFlST0xFUkVGPUNIS0ozMDE2RTogRHVwbGljYXRlICcnc2VjdXJpdHkgcm9sZS1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLUVSUk9SX0VBUl9EVVBMSUNBVEVfRUpCUkVGPUNIS0ozMDE3RTogRHVwbGljYXRlICcnZWpiLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUY9Q0hLSjMwMThFOiBEdXBsaWNhdGUgJydyZXNvdXJjZSBlbnZpcm9ubWVudC1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLUVSUk9SX0VBUl9EVVBMSUNBVEVfTUVTU1NBR0VERVNUSU5BVElPTlJFRj1DSEtKMzAxOUU6IER1cGxpY2F0ZSAnJ21lc3NhZ2UgZGVzdGluYXRpb24tcmVmJycgZWxlbWVudCBuYW1lZCB7MH0uCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQk1QSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUJNUEhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmIyZjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQk1QSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUJNUEhvbWVWUnVsZSBleHRlbmRzIEFFbnRpdHlIb21lVlJ1bGUgewotCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVNYXRjaGluZ1JldHVyblR5cGVNYXRjaGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgaG9tZU1ldGhvZCwgTWV0aG9kIGJlYW5NZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJaWYoKG1ldGhvZFR5cGUgJiBGSU5EKSAhPSBGSU5EKSB7Ci0JCQlzdXBlci52YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXModmMsIGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBiZWFuTWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlKYXZhSGVscGVycyBob21lUmV0VHlwZSA9IGhvbWVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJSmF2YUhlbHBlcnMgYmVhblJldFR5cGUgPSBiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oaG9tZVJldFR5cGUsIGJlYW5SZXRUeXBlKSkgewotCQkJCS8vIGVtaXQgdGhlIGVycm9yIG9ubHkgaWYgaXQncyBhIG11bHRpLWZpbmRlci4gU2luZ2xlLWZpbmRlcnMgYXJlIHN1cHBvc2VkIHRvIGhhdmUgZGlmZmVyZW50IHJldHVybiB0eXBlcyBvbiB0aGUgaG9tZSAmIGJlYW4gY2xhc3MuCi0JCQkJYm9vbGVhbiBob21lUmV0VHlwZUlzUmVtb3RlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oaG9tZVJldFR5cGUsIGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCQkJCWJvb2xlYW4gaG9tZVJldFR5cGVJc0xvY2FsID0gIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGhvbWVSZXRUeXBlLCBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkpOwotCQkJCWJvb2xlYW4gYmVhblJldFR5cGVJc0tleSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW5SZXRUeXBlLCAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCkpOwotCQkJCWlmKCEoKGhvbWVSZXRUeXBlSXNSZW1vdGUgfHwgaG9tZVJldFR5cGVJc0xvY2FsKSAmJiBiZWFuUmV0VHlwZUlzS2V5KSkgewotCQkJCQlTdHJpbmcgcmV0VHlwZU5hbWUgPSBudWxsOwotCQkJCQlpZihiZWFuUmV0VHlwZUlzS2V5KSB7Ci0JCQkJCQlpZigoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQkJCQkJcmV0VHlwZU5hbWUgPSAoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9SRU1PVEUgOiBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpLmdldEphdmFOYW1lKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXRUeXBlTmFtZSA9IChiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfTE9DQUwgOiBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkuZ2V0SmF2YU5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldFR5cGVOYW1lID0gKGJlYW5SZXRUeXBlID09IG51bGwpID8gIj8iIDogYmVhblJldFR5cGUuZ2V0SmF2YU5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgaG9tZU1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgcmV0VHlwZU5hbWV9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQmVhbkNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2Yjc5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUJlYW5DbGFzc1ZSdWxlIGV4dGVuZHMgQVR5cGVWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGxvbmdbXSBCQVNFX1RZUEVTID0gbmV3IGxvbmdbXXtJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUfTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFkgPSBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORzsgLy8gRGVwcmVjYXRlZCB1c2Ugb2YgUmVtb3RlRXhjZXB0aW9uLgotCQotCXB1YmxpYyBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gQkFTRV9UWVBFUzsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRFamJDbGFzcygpOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIEhFTFBFUjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighZm9sbG93QWJzdHJhY3RSdWxlcyhjbGF6eikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighZm9sbG93UHVibGljUnVsZXMoY2xhenopKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKCFmb2xsb3dGaW5hbFJ1bGVzKGNsYXp6KSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRSZW1vdGVIb21lTWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzBdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0TG9jYWxIb21lTWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzFdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0UmVtb3RlQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzJdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0TG9jYWxDb21wb25lbnRNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbM107Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRCZWFuQ2xhc3NNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbNF07Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIEEgYmVhbiBjbGFzcyBuZWVkcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMnIGV4dGVuZGVkIG1ldGhvZHM6Ci0JCS8vICAgIDEuIHJlbW90ZSBob21lCi0JCS8vICAgIDIuIGxvY2FsIGhvbWUKLQkJLy8gICAgMy4gcmVtb3RlIGNvbXBvbmVudAotCQkvLyAgICA0LiBsb2NhbCBjb21wb25lbnQKLQkJLy8gICAgNS4gYmVhbiBjbGFzcyAod2hlbiBzZWFyY2hpbmcgZm9yIGEgbWF0Y2hpbmcgZWpiUG9zdENyZWF0ZSBtZXRob2QpLgotCQkvLyBJZiBhIHBhcnRpY3VsYXIgYmVhbiBkb2Vzbid0IHVzZSBhIHJlbW90ZSB2aWV3IG9yIGxvY2FsIHZpZXcsCi0JCS8vIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIGFycmF5IHdpbGwgYmUgbnVsbC4gCi0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFs1XTsKLQkJSmF2YUNsYXNzIHJlbW90ZUhvbWUgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJaWYocmVtb3RlSG9tZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMF0gPSByZW1vdGVIb21lLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzBdID0gbnVsbDsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGxvY2FsSG9tZSA9IGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCWlmKGxvY2FsSG9tZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMV0gPSBsb2NhbEhvbWUuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMV0gPSBudWxsOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgcmVtb3RlQ29tcG9uZW50ID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJaWYocmVtb3RlQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdFsyXSA9IHJlbW90ZUNvbXBvbmVudC5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFsyXSA9IG51bGw7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBsb2NhbENvbXBvbmVudCA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJaWYobG9jYWxDb21wb25lbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0WzNdID0gbG9jYWxDb21wb25lbnQuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbM10gPSBudWxsOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlpZihiZWFuQ2xhc3MgIT0gbnVsbCkgewotCQkJcmVzdWx0WzRdID0gYmVhbkNsYXNzLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzRdID0gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgYmVhbiBjbGFzcycgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvdWxkQmVGaW5hbChKYXZhQ2xhc3MgY2xhenopOwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eik7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvdWxkQmVBYnN0cmFjdChKYXZhQ2xhc3MgY2xhenopOwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHNob3VsZFZhbGlkYXRlVHJhbnNpZW50RmllbGQoKTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZU5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nRWpiSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNZXRob2QgbWV0aG9kKSB7Ci0JCS8vIFNlY3Rpb24gbnVtYmVyIHN0YXRpbmcgdGhpcyBuYW1lIGNvbnZlbnRpb24/Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJLy8gU3RyaXAgdGhlICJlamJIb21lIiBvZmYsIHN0cmlwIG9mZiB0aGUgbmV4dCBjaGFyYWN0ZXIsIGFuZCByZXBsYWNlIHRoYXQgY2hhcmFjdGVyIHdpdGggYSBsb3dlcmNhc2UgdmVyc2lvbiBvZiB0aGF0IGNoYXJhY3RlcgotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWV0aG9kTmFtZS5jaGFyQXQoMCkpKTsKLQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg4KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0VqYkNyZWF0ZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNZXRob2QgbWV0aG9kKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfQyk7Ci0JCS8vIFN0cmlwIHRoZSAiZWpiQyIgb2ZmIG9mICJjcmVhdGUiIGFuZCByZXBsYWNlIHdpdGggImMiCi0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoNCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0VqYlBvc3RDcmVhdGVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0MpOwotCQkvLyBTdHJpcCB0aGUgImVqYlBvc3RDIiBvZmYgb2YgImNyZWF0ZSIgYW5kIHJlcGxhY2Ugd2l0aCAiYyIKLQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg4KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0VqYkZpbmRNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0YpOwotCQkvLyBTdHJpcCB0aGUgImVqYkYiIG9mZiBvZiAiZWpiRmluZCIgYW5kIHJlcGxhY2Ugd2l0aCAiZiIKLQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg0KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0J1c2luZXNzTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JfQotCQotCS8qCi0JICogVGhlIGdpdmVuIG1ldGhvZCBpcyBub3Qgc3VwcG9zZWQgdG8gaGF2ZSBhIG1hdGNoaW5nIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gbnVsbDsgLy8gbm90IHN1cHBvc2VkIHRvIGhhdmUgYSBtYXRjaGluZyBtZXRob2QKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBmb2xsb3dGaW5hbFJ1bGVzKEphdmFDbGFzcyBjbGF6eikgewotCQlpZihzaG91bGRCZUZpbmFsKGNsYXp6KSkgewotCQkJcmV0dXJuIGNsYXp6LmlzRmluYWwoKTsKLQkJfQotCQlyZXR1cm4gIWNsYXp6LmlzRmluYWwoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93UHVibGljUnVsZXMoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCWlmKHNob3VsZEJlUHVibGljKGNsYXp6KSkgewotCQkJcmV0dXJuIGNsYXp6LmlzUHVibGljKCk7Ci0JCX0KLQkJcmV0dXJuICFjbGF6ei5pc1B1YmxpYygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBmb2xsb3dBYnN0cmFjdFJ1bGVzKEphdmFDbGFzcyBjbGF6eikgewotCQlpZihzaG91bGRCZUFic3RyYWN0KGNsYXp6KSkgewotCQkJcmV0dXJuIGNsYXp6LmlzQWJzdHJhY3QoKTsKLQkJfQotCQlyZXR1cm4gIWNsYXp6LmlzQWJzdHJhY3QoKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDIxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQyMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCUphdmFIZWxwZXJzIHJldFR5cGUgPSBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKGJlYW4sIG1ldGhvZCk7Ci0JCWlmKChyZXRUeXBlID09IG51bGwpIHx8ICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20obWV0aG9kLmdldFJldHVyblR5cGUoKSwgcmV0VHlwZSkpKSB7Ci0JCQlTdHJpbmcgcmV0VHlwZU5hbWUgPSAocmV0VHlwZSA9PSBudWxsKSA/IGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKGJlYW4sIG1ldGhvZCkgOiByZXRUeXBlLmdldEphdmFOYW1lKCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117cmV0VHlwZU5hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQl2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdHJ1ZSk7Ci0KLQkJaWYodmFsaWRhdGVFamJDcmVhdGVNZXRob2RFeGNlcHRpb25zKCkpIHsKLQkJCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYkNyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFamJDcmVhdGVNZXRob2RFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZihtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZihtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDI4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYoIW1ldGhvZC5pc1ZvaWQoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA1X2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZighZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVFamJIb21lTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQzMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQl2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdHJ1ZSk7Ci0KLQkJaWYoIWZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJIb21lLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyAiZWpiSG9tZSIgaXMgNyBjaGFyYWN0ZXJzCi0JCS8vIG1ldGhvZCB3aWxsIGZvbGxvdyB0aGUgY29udmVudGlvbiwgImVqYkhvbWUiICsgQ2hhci50b1VwcGVyKDApICsgc3Vic3RyaW5nKDEpLCBzbyByZXZlcnNlIHRoYXQgY29udmVudGlvbiBoZXJlCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1ldGhvZC5nZXROYW1lKCkuY2hhckF0KDcpKSk7IC8vIHB1dCB0aGUgY2hhcmFjdGVyIGJhY2sgaW50byBsb3dlci1jYXNlCi0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoOCkpOyAvLyBzdWJzdHJpbmcgc3RhcnRzIGF0IHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nICJlamJIb21lIiBhbmQgdGhlIGZpcnN0IGNoYXJhY3RlciAtLSBzdWJzdHJpbmcgaXMgMCBpbmRleGVkCi0JCVN0cmluZyBtZXRob2RUb01hdGNoTmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkKLQkJTWV0aG9kIG1hdGNoaW5nUmVtb3RlSG9tZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2RUb01hdGNoTmFtZSwgZ2V0UmVtb3RlSG9tZU1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihtYXRjaGluZ1JlbW90ZUhvbWVNZXRob2QgIT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlNZXRob2QgbWF0Y2hpbmdMb2NhbEhvbWVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kVG9NYXRjaE5hbWUsIGdldExvY2FsSG9tZU1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihtYXRjaGluZ0xvY2FsSG9tZU1ldGhvZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQzMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttZXRob2RUb01hdGNoTmFtZX0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDA0OCA9IEJ1c2luZXNzIG1ldGhvZHMgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIi4gUmVhZCBzZWN0aW9uIDcuMTAuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwMSA9IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIi4gUmVhZCBzZWN0aW9uIDEwLjYuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMxNyA9IFRoZSBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiBSZWFkIHNlY3Rpb24gMTIuMi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MTEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQwNDkgPSBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDcuMTAuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwMiA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTAuNi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MzE4ID0gVGhlIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDEyLjIuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDA1MCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiBSZWFkIHNlY3Rpb24gNy4xMC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjAzID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxMC42Ljggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMTkgPSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiBSZWFkIHNlY3Rpb24gMTIuMi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ0MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDA1MSA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gUmVhZCBzZWN0aW9uIDcuMTAuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwNCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gUmVhZCBzZWN0aW9uIDEwLjYuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMyMCA9IFRoZSBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTIuMi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQwNTIgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIFJNSS1JSU9QIHR5cGUuIFJlYWQgc2VjdGlvbiA3LjEwLjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyMDUgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIFJNSS1JSU9QIHR5cGUuIFJlYWQgc2VjdGlvbiAxMC42Ljggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMjEgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgZm9yIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTIuMi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCXZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0cnVlKTsKLQkJCi0JCS8vIElXQUQ0MDUzID0gVGhpcyBtZXRob2QgY2Fubm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDcuMTAuNCwgMTguMy44LCAxOC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjA2ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTAuNi44LCAxOC4zLjgsIDE4LjYgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMjIgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMi4yLjcsIDE4LjMuOCwgMTguNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2J1cywgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCksIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZU1hdGNoaW5nQ29tcG9uZW50TWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJSZW1vdmVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDQwMiA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTUuNy41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDkyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0NDAzID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxNS43LjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDkzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0NDA0ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTUuNy41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0OTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkKLQkJLy8gSVdBRDQ0MDUgPSBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiBSZWFkIHNlY3Rpb24gMTUuNy41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFtZXRob2QuaXNWb2lkKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNV9lamJSZW1vdmUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgSmF2YUNsYXNzLCBGaWVsZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZEV4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDAyNCA9IEEgdHJhbnNpZW50IGZpZWxkIHNob3VsZCBub3QgYmUgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gNy40LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQwMjUgPSBUcmFuc2llbnQgZmllbGRzIGFyZSBkaXNjb3VyYWdlZC4gUmVhZCBzZWN0aW9uIDcuNC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MTE1ID0gezB9IG11c3Qgbm90IGJlIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4gUmVhZCBzZWN0aW9uIDEwLjMuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDI1OSA9IDxjbXAtZmllbGQ+IGZpZWxkIG11c3QgYmUgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTEuMi4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjYwID0gPGNtci1maWVsZD4gZmllbGQgbXVzdCBiZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiAxMS4yLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpKSB7Ci0JCQl2YWxpZGF0ZVRyYW5zaWVudEZpZWxkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlVHJhbnNpZW50RmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gQnkgZGVmYXVsdCBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyBsb25nIGdldEZpZWxkVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7Ci0JCWlmKGZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybiBFWENMVURFRF9GSUVMRDsKLQkJfQotCQllbHNlIGlmKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkgewotCQkJcmV0dXJuIFNFUklBTFZFUlNJT05VSUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gT1RIRVJfRklFTEQ7Ci0JCX0JCi0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ01ldGhvZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIEphdmFDbGFzcyBtYXRjaGluZ0NsYXp6LCBNZXRob2QgbWF0Y2hpbmdNZXRob2QpIHsKLQkJLy8gRXZlcnkgZXhjZXB0aW9uIHRocm93biBvbiB0aGUgYmVhbiBjbGFzcycgbWV0aG9kIG11c3QgYmUgdGhyb3duIG9uIHRoZSBjb21wb25lbnQvaG9tZSBtZXRob2QKLQkJLyogRG9uJ3QgY2hlY2sgZm9yIHRoaXMgaGVyZSAtIGxldCB0aGUgaG9tZSAmIGNvbXBvbmVudCBkbyBpdC4KLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtZXRob2QsIG1hdGNoaW5nTWV0aG9kKTsKLQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCX0KLQkJKi8KLQkJCi0JCS8vIEV2ZXJ5IGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIGNvbXBvbmVudC9ob21lIG1ldGhvZCBzaG91bGQgYmUgdGhyb3duIG9yIHRoZXJlIG1heSBiZSBjb21waWxlIGVycm9ycwotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRTdWJ0eXBlRXhjZXB0aW9ucyhiZWFuLCBtYXRjaGluZ01ldGhvZCwgbWV0aG9kKTsKLQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcyllaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQ1NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtleGNlcHRpb24uZ2V0SmF2YU5hbWUoKSwgbWF0Y2hpbmdDbGF6ei5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdIb21lTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJTWV0aG9kIHJlbW90ZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyksIGdldFJlbW90ZUhvbWVNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYocmVtb3RlTWV0aG9kICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSwgcmVtb3RlTWV0aG9kKTsKLQkJfQotCQkKLQkJTWV0aG9kIGxvY2FsTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKSwgZ2V0TG9jYWxIb21lTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKGxvY2FsTWV0aG9kICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpLCBsb2NhbE1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0NvbXBvbmVudE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCU1ldGhvZCByZW1vdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgZ2V0UmVtb3RlQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKHJlbW90ZU1ldGhvZCAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0ZU1hdGNoaW5nTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSwgcmVtb3RlTWV0aG9kKTsKLQkJfQotCQkKLQkJTWV0aG9kIGxvY2FsTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIG1ldGhvZC5nZXROYW1lKCksIGdldExvY2FsQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKGxvY2FsTWV0aG9kICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCksIGxvY2FsTWV0aG9kKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNFamJPYmplY3QpIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGVycHJpc2VCZWFuIHN1cGVydHlwZSA9IGdldFN1cGVyVHlwZShiZWFuKTsKLQkJSmF2YUNsYXNzIHBhcmVudEVqYk9iamVjdCA9IG51bGw7Ci0JCWlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewotCQkJcGFyZW50RWpiT2JqZWN0ID0gc3VwZXJ0eXBlLmdldEVqYkNsYXNzKCk7Ci0KLQkJCS8vIEVKQk9iamVjdCBhIFhjaGlsZCBvZiBwYXJlbnQgRUpCT2JqZWN0IChYID0gY2hpbGQsIGdyYW5kY2hpbGQsIGdyZWF0LWdyYW5kY2hpbGQsIGV0Yy4pCi0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0aGlzRWpiT2JqZWN0KTsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocGFyZW50RWpiT2JqZWN0KTsKLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHRoaXNFamJPYmplY3QsIHBhcmVudEVqYk9iamVjdCkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IHRoaXNFamJPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpLCBwYXJlbnRFamJPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzRWpiT2JqZWN0LCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7Ci0JCS8vIG11c3Qgbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbgotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmRvZXNOb3RUaHJvd1JlbW90ZUV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ01QSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNNUEhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDA1M2JkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ01QSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUNNUEhvbWVWUnVsZSBleHRlbmRzIEFFbnRpdHlIb21lVlJ1bGUgewotCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQotCQkvLyBDaGVjayB0aGF0IHRoaXMgbWV0aG9kIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwKLQkJLy8gZmluZEJ5UHJpbWFyeUtleSBkb2VzIG5vdCBuZWVkIGEgcXVlcnkgZWxlbWVudCAoMTAuNS42KQotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcyk7Ci0JCWlmKChtZXRob2RUeXBlICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkRCWVBSSU1BUllLRVkpID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSU5EQllQUklNQVJZS0VZKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc29jaWF0ZWRXaXRoUXVlcnkoY21wLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0OTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmaW5kTWF0Y2hpbmdNZXRob2QobG9uZyBtZXRob2RUeXBlKSB7Ci0JCWlmKChtZXRob2RUeXBlICYgRklORCkgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZmluZE1hdGNoaW5nTWV0aG9kKG1ldGhvZFR5cGUpOwotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLmVqYi5lamIyMC5ydWxlcy5pbXBsLkFIb21lVlJ1bGUjcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZU9yQ29sbGVjdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIE1ldGhvZCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlT3JDb2xsZWN0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYocmV0dXJuc0NvbXBvbmVudEludGVyZmFjZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlKYXZhSGVscGVycyByZXR1cm5QYXJtID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxDb2xsZWN0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKTsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0dXJuUGFybSwgamF2YVV0aWxDb2xsZWN0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBob21lTWV0aG9kLCBNZXRob2QgYmVhbk1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJaWYoKG1ldGhvZFR5cGUgJiBGSU5EKSAhPSBGSU5EKSB7Ci0JCQlzdXBlci52YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXModmMsIGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBiZWFuTWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJfQotCQkvLyBkbyBub3QgdmFsaWRhdGUgdGhlIHJldHVybiB0eXBlIG9mIGZpbmQgbWV0aG9kcyBiZWNhdXNlIHRoZXJlIHNob3VsZCBub3QgYmUgYW4gaW1wbGVtZW50YXRpb24gb24gdGhlIGJlYW4gY2xhc3MKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MGVkNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFDb21wb25lbnRWUnVsZSBleHRlbmRzIEFJbnRlcmZhY2VUeXBlVlJ1bGUgewotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZigoaXNSZW1vdGUoKSAmIFJFTU9URSkgPT0gUkVNT1RFKSB7Ci0JCQlyZXR1cm4gKChFbnRlcnByaXNlQmVhbilwYXJlbnQpLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiBCVVNJTkVTUzsKLQl9Ci0JCi0JcHVibGljIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIWZvbGxvd1JNSV9JSU9QSW5oZXJpdGFuY2VSdWxlcyhiZWFuLCBjbGF6eikpIHsKLQkJCS8vIElXQUQ0MDU3ID0gezB9IG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gUmVhZCBzZWN0aW9uIDcuMTAuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQyMTAgPSB7MH0gbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzLiBSZWFkIHNlY3Rpb24gMTAuNi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDMyNiA9IHswfSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMuIFJlYWQgc2VjdGlvbiAxMi4yLjggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOyAvLyBjaGVjayBhcHBsaWNhdGlvbiBleGNlcHRpb25zCi0JCQotCQlpZihpc0VKQkludGVyZmFjZU1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkvLyBJV0FENDAyMSA9IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyLiBSZWFkIHNlY3Rpb24gNi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDExMCA9IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyLiBSZWFkIHNlY3Rpb24gOS45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDExMiA9IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyLiBSZWFkIHNlY3Rpb24gOS4xMCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDY5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlNZXRob2QgbWF0Y2ggPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgZ2V0QmVhbkNsYXNzTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKG1hdGNoID09IG51bGwpIHsKLQkJCS8vIElXQUQ0MDU4ID0gezB9IG11c3QgZXhpc3Qgb24gezF9LiBSZWFkIHNlY3Rpb24gNy4xMC41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljaWF0aW9uLgotCQkJLy8gSVdBRDQwNzAgPSB7MH0gbXVzdCBleGlzdCBvbiB7MX0uIFJlYWQgc2VjdGlvbiA3LjEwLjcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MzI3ID0gezB9IG11c3QgZXhpc3Qgb24gezF9LiBSZWFkIHNlY3Rpb24gMTIuMi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDM1NCA9IHswfSBtdXN0IGV4aXN0IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDEyLjIuMTAgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MjExID0gezB9IG11c3QgZXhpc3Qgb24gezF9LiBSZWFkIHNlY3Rpb24gMTAuNi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDIyNyA9IHswfSBtdXN0IGV4aXN0IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDEwLjYuMTEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMjMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSwgYmVhbi5nZXRFamJDbGFzcygpLmdldEphdmFOYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20obWV0aG9kLmdldFJldHVyblR5cGUoKSwgbWF0Y2guZ2V0UmV0dXJuVHlwZSgpKSkgewotCQkJCS8vIElXQUQ0MjEyID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHNhbWUgdHlwZSBhcyB7MH0uIFJlYWQgc2VjdGlvbiAxMC42Ljkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkvLyBJV0FENDIyOCA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBzYW1lIHR5cGUgYXMgezB9LiBSZWFkIHNlY3Rpb24gMTAuNi4xMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCS8vIElXQUQ0MzI4ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHNhbWUgdHlwZSBhcyB7MH0gb24gezF9LiBSZWFkIHNlY3Rpb24gMTIuMi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJLy8gSVdBRDQzNTUgPSBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0uIFJlYWQgc2VjdGlvbiAxMi4yLjEwIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDcwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttYXRjaC5nZXRSZXR1cm5UeXBlKCkuZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQkKLQkJCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldEV4Y2VwdGlvbnMoYmVhbiwgbWF0Y2gsIG1ldGhvZCk7Ci0JCQlJdGVyYXRvciBlaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpZWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117ZXhjZXB0aW9uLmdldEphdmFOYW1lKCksIG1hdGNoLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQkvLyBJV0FENDA1NiA9IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gNy4xMC41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDA2OSA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDcuMTAuNywgMTguMy44LCAxOC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDMyNSA9IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTIuMi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDM1MyA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEyLjIuMTAsIDE4LjMuOCwgMTguNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQyMDkgPSBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEwLjYuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2J1cywgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCksIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQwNTUgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgZm9yIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gNy4xMC41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjA4ID0gezB9IG11c3QgYmUgYSBsZWdhbCB0eXBlIGZvciBSTUktSUlPUC4gUmVhZCBzZWN0aW9uIDEwLjYuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMyNCA9IHswfSBtdXN0IGJlIGEgbGVnYWwgdHlwZSBmb3IgUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiAxMi4yLjggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJdmFsaWRhdGVSTUlfSUlPUFR5cGVSdWxlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRydWUpOwotCQkKLQkJSmF2YUhlbHBlcnMgb2UgPSBnZXRPdmVyRXhwb3NlZExvY2FsVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJaWYob2UgIT0gbnVsbCkgewotCQkJLy8gSVdBRDQwNTkgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gNy4xMC41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDEwNyA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiA5LjcuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQzMzAgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTIuMi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDEyOCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiAxMC4zLjEsIDEwLjMuMTAuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDcyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde29lLmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyB0aGlzQ29tcG9uZW50KSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRDb21wb25lbnQgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCXBhcmVudENvbXBvbmVudCA9IGdldENvbXBvbmVudEludGVyZmFjZShzdXBlcnR5cGUpOwotCi0JCQlpZihwYXJlbnRDb21wb25lbnQgPT0gbnVsbCkgewotCQkJCS8vIGNoaWxkIHVzZXMgZWl0aGVyIGxvY2FsLCBvciByZW1vdGUsIGJ1dCBub3QgYm90aCBpbnRlcmZhY2VzCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBDb21wb25lbnQgYSBYY2hpbGQgb2YgcGFyZW50IENvbXBvbmVudAotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodGhpc0NvbXBvbmVudCk7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHBhcmVudENvbXBvbmVudCk7Ci0JCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0aGlzQ29tcG9uZW50LCBwYXJlbnRDb21wb25lbnQpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyB0aGlzQ29tcG9uZW50LmdldFF1YWxpZmllZE5hbWUoKSwgcGFyZW50Q29tcG9uZW50LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpc0NvbXBvbmVudCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkKLS8vCQl2YWxpZGF0ZUFwcGVuZGl4Qih2Yywgc3VwZXJ0eXBlLCBwYXJlbnRDb21wb25lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5QmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5QmVhbkNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0ODUwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBRW50aXR5QmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBQmVhbkNsYXNzVlJ1bGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtaXNzaW5nTWV0aG9kVGVtcGxhdGUgPSAiezB9KHsxfSkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkKLQkJdmFsaWRhdGVNYXRjaGluZ0VqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG1hdGNoaW5nTWV0aG9kTmFtZSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUgKyBtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg5KTsgLy8gImVqYkNyZWF0ZSIgaXMgOSBjaGFyYWN0ZXJzIGxvbmcsIHNvIHN0cmlwIG9mZiBjaGFyYWN0ZXJzIDAuLjggaW5jbHVzaXZlCi0JCU1ldGhvZCBlamJQb3N0Q3JlYXRlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIG1hdGNoaW5nTWV0aG9kTmFtZSwgZ2V0QmVhbkNsYXNzTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKGVqYlBvc3RDcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1pc3NpbmdNZXRob2QgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChtaXNzaW5nTWV0aG9kVGVtcGxhdGUsIG5ldyBTdHJpbmdbXXttYXRjaGluZ01ldGhvZE5hbWUsIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRQYXJtc0FzU3RyaW5nKG1ldGhvZCl9KTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJQb3N0Q3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttaXNzaW5nTWV0aG9kfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5SG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NDJmYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFFbnRpdHlIb21lVlJ1bGUgZXh0ZW5kcyBBSG9tZVZSdWxlIHsKLQkvKioKLQkgKiBJZiB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIGlzbid0IGxpc3RlZCBpbiB0aGUgS05PV05fTUVUSE9EUywgd2hhdCB0eXBlIG9mIG1ldGhvZCBpcyBpdAotCSAqIGNvbnNpZGVyZWQgdG8gYmU/Ci0JICovCi0JcHVibGljIGxvbmcgZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiBIT01FOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlKYXZhQ2xhc3Mga2V5ID0gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQlKYXZhUGFyYW1ldGVyW10gcGFybXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCWlmKChwYXJtcy5sZW5ndGggIT0gMSkgfHwgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShrZXksIHBhcm1zWzBdLmdldEphdmFUeXBlKCkpKSkgewotCQkJU3RyaW5nIGtleU5hbWUgPSAoa2V5ID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1BSSU1BUllfS0VZIDoga2V5LmdldEphdmFOYW1lKCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117a2V5TmFtZX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZm9sbG93c0ZpbmRlckV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5mb2xsb3dzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkpKSB7Ci0JCQl2YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQkJaWYoIXJldHVybnNDb21wb25lbnRJbnRlcmZhY2UodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKSB7Ci0JCQkJSmF2YUNsYXNzIGNvbXBvbmVudEludGVyZmFjZSA9IGdldENvbXBvbmVudEludGVyZmFjZShiZWFuKTsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKLQkJCQlpZihjb21wb25lbnRJbnRlcmZhY2UgIT0gbnVsbCkgewotCQkJCQljbGFzc05hbWUgPSBjb21wb25lbnRJbnRlcmZhY2UuZ2V0SmF2YU5hbWUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCQkJCWNsYXNzTmFtZSA9IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9SRU1PVEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljbGFzc05hbWUgPSBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfTE9DQUw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtjbGFzc05hbWV9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYoIXJldHVybnNDb21wb25lbnRJbnRlcmZhY2VPckNvbGxlY3Rpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQwMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtnZXRDb21wb25lbnRJbnRlcmZhY2UoYmVhbikuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUhvbWVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gSVdBRDQzNTAgPSBUaGUgcmV0dXJuIHR5cGUgbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgezB9LiBSZWFkIHNlY3Rpb24gMTIuMi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIFRoZSBhYm92ZSBjaGVjayBpcyBkb25lIGluIHRoZSAidmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpIG1ldGhvZC4KLQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0ZJTkQpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSBpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfUkVNT1ZFKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDY0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjYWI5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBSG9tZVZSdWxlIGV4dGVuZHMgQUludGVyZmFjZVR5cGVWUnVsZSB7Ci0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmKChpc1JlbW90ZSgpICYgUkVNT1RFKSA9PSBSRU1PVEUpIHsKLQkJCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0SG9tZUludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIEJ5IGRlZmF1bHQsIGRvIG5vdGhpbmcuCi0JCS8vIExldCB0aGUgZW50aXR5IHJ1bGVzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBhbmQgdGhlIHNlc3Npb24gZG9uJ3QgZG8gYW55dGhpbmcKLQkJLy8gYmVjYXVzZSB2YWxpZGF0ZU1ldGhvZE11c3ROb3RFeGlzdCBkb2VzIHdoYXQgdGhlIHNlc3Npb25zIG5lZWQuCQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZm9sbG93c0NyZWF0ZUV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gewotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0NyZWF0ZUV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMZWdhbFJNSV9JSU9QSW5oZXJpdGFuY2UoY2xhenopKSB7Ci0JCQkvLyBJV0FENDMzNCA9IHswfSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMuIFJlYWQgc2VjdGlvbiAxMi4yLjkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MjE3ID0gezB9IG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gUmVhZCBzZWN0aW9uIDEwLjYuMTAgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MDYyID0gezB9IG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gUmVhZCBzZWN0aW9uIDcuMTAuNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDYxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7IC8vIGNoZWNrIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMKLQkJCi0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCVN0cmluZyBuYW1lT2ZNZXRob2RUb0ZpbmQgPSBtZXRob2QuZ2V0TmFtZSgpOwotCQlib29sZWFuIHZhbGlkYXRlUmV0dXJuVHlwZU1hdGNoZXMgPSBmYWxzZTsKLQkJaWYoKG1ldGhvZFR5cGUgJiBDUkVBVEUpID09IENSRUFURSkgewotCQkJdmFsaWRhdGVDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQkJCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkMpOwotCQkJLy8gU3RyaXAgdGhlICJjIiBvZmYgb2YgImNyZWF0ZSIgYW5kIHJlcGxhY2Ugd2l0aCAiZWpiQyIKLQkJCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoMSkpOwotCQkJbmFtZU9mTWV0aG9kVG9GaW5kID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEZJTkQpID09IEZJTkQpIHsKLQkJCXZhbGlkYXRlRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkYpOwotCQkJLy8gU3RyaXAgdGhlICJmIiBvZmYgb2YgImZpbmQiIGFuZCByZXBsYWNlIHdpdGggImVqYkYiCi0JCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDEpKTsKLQkJCW5hbWVPZk1ldGhvZFRvRmluZCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCi0JCQl2YWxpZGF0ZVJldHVyblR5cGVNYXRjaGVzID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgSE9NRSkgPT0gSE9NRSkgewotCQkJLy8gcmVtb3ZlIGlzIGEgc3BlY2lhbCBtZXRob2QuIFNlZSA5LjUuMyBmb3IgYW4gZXhhbXBsZQotCQotCQkJdmFsaWRhdGVIb21lTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJCQotCQkJLy8gU2VjdGlvbiBudW1iZXIgc3RhdGluZyB0aGlzIG5hbWUgY29udmVudGlvbj8KLQkJCVN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCSE9NRSk7Ci0JCQlidWZmZXIuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShtZXRob2ROYW1lLmNoYXJBdCgwKSkpOwotCQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZygxKSk7Ci0JCQluYW1lT2ZNZXRob2RUb0ZpbmQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQotCQkJdmFsaWRhdGVSZXR1cm5UeXBlTWF0Y2hlcyA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2Qgc2hvdWxkbid0IGJlIGhlcmUuIEFUeXBlVlJ1bGUgd2lsbCBjYXRjaC4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIWZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXRob2RUeXBlIG1UeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQlpZihtVHlwZSA9PSBudWxsKSB7Ci0JCQkJLy8gc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJBSG9tZVZSdWxlIC0gdmFsaWRhdGUgbWV0aG9kIHdoaWNoIG11c3Qgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgiTWV0aG9kIHR5cGUgaXMgbnVsbDogIiArIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKSArICI6OiIgKyBtZXRob2QuZ2V0TmFtZSgpICk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgbVR5cGUuZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSwgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCksIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQl2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgKChtZXRob2RUeXBlICYgRklORCkgIT0gRklORCkpOyAvLyBkbyBub3QgY2hlY2sgdGhhdCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kIG1ldGhvZCBpcyBzZXJpYWxpemFibGUuIElmIGl0J3MgQ29sbGVjdGlvbiBvciBTZXQgaXQgd29uJ3QgYmUgc2VyaWFsaXphYmxlLCBhbmQgaWYgaXQgZG9lc24ndCByZXR1cm4gQ29sbGVjdGlvbiwgU2V0LCBvciB0aGUgY29tcG9uZW50IGludGVyZmFjZSB0aGVuIHRoZSByZXR1cm4gdHlwZSB3aWxsIGJlIGZsYWdnZWQuCi0JCQotCQlKYXZhSGVscGVycyBsb2NhbCA9IGdldE92ZXJFeHBvc2VkTG9jYWxUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQlpZihsb2NhbCAhPSBudWxsKSB7Ci0JCQkvLyBJV0FENDAyMyA9IHswfSBjYW5ub3QgYmUgYW4gYXJndW1lbnQgb3IgcmVzdWx0IHR5cGUuIFJlYWQgc2VjdGlvbiA2LjcuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQyMjUgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTAuNi4xMCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQzNTEgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTIuMi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bG9jYWwuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZihmaW5kTWF0Y2hpbmdNZXRob2QobWV0aG9kVHlwZSkpIHsKLQkJCXZhbGlkYXRlTWF0Y2hpbmdCZWFuTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuYW1lT2ZNZXRob2RUb0ZpbmQsIHZhbGlkYXRlUmV0dXJuVHlwZU1hdGNoZXMsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBmaW5kTWF0Y2hpbmdNZXRob2QobG9uZyBtZXRob2RUeXBlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQmVhbk1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIG5hbWVPZk1ldGhvZFRvRmluZCwgYm9vbGVhbiB2YWxpZGF0ZVJldHVyblR5cGVNYXRjaGVzLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlNZXRob2QgbWF0Y2ggPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbmFtZU9mTWV0aG9kVG9GaW5kLCBnZXRCZWFuQ2xhc3NNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYobWF0Y2ggPT0gbnVsbCkgewotCQkJSU1ldGhvZFR5cGUgbVR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCWlmKG1UeXBlID09IG51bGwpIHsKLQkJCQkvLyBvb3BzCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkFIb21lVlJ1bGUgLSB2YWxpZGF0ZSBtZXRob2QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJNZXRob2QgdHlwZSBpcyBudWxsOiAiICsgYmVhbi5nZXROYW1lKCkgKyAiOjoiICsgY2xhenouZ2V0SmF2YU5hbWUoKSArICI6OiIgKyBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCQkJU3RyaW5nIGJlYW5DbGFzc05hbWUgPSAoYmVhbkNsYXNzID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX0JFQU5fQ0xBU1MgOiBiZWFuQ2xhc3MuZ2V0SmF2YU5hbWUoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIG1UeXBlLmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bmFtZU9mTWV0aG9kVG9GaW5kLCBiZWFuQ2xhc3NOYW1lfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmKHZhbGlkYXRlUmV0dXJuVHlwZU1hdGNoZXMpIHsKLQkJCQl2YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1hdGNoLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCQl9Ci0KLQkJCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldEV4Y2VwdGlvbnMoYmVhbiwgbWF0Y2gsIG1ldGhvZCk7Ci0JCQlJdGVyYXRvciBlaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpZWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117ZXhjZXB0aW9uLmdldEphdmFOYW1lKCksIG1hdGNoLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ1JldHVyblR5cGVNYXRjaGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgaG9tZU1ldGhvZCwgTWV0aG9kIGJlYW5NZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRNZXRob2QpIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGhvbWVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG5ldyBTdHJpbmdbXXtiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIWZvbGxvd3NDcmVhdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFyZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJSmF2YUNsYXNzIGNvbXBvbmVudEludGVyZmFjZSA9IGdldENvbXBvbmVudEludGVyZmFjZShiZWFuKTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotCQkJaWYoY29tcG9uZW50SW50ZXJmYWNlICE9IG51bGwpIHsKLQkJCQljbGFzc05hbWUgPSBjb21wb25lbnRJbnRlcmZhY2UuZ2V0SmF2YU5hbWUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCQkJY2xhc3NOYW1lID0gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNsYXNzTmFtZSA9IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9MT0NBTDsKLQkJCQl9Ci0JCQl9Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDAyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtjbGFzc05hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVIb21lTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIElXQUQ0MzUwID0gVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIHswfS4gUmVhZCBzZWN0aW9uIDEyLjIuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBUaGUgYWJvdmUgY2hlY2sgaXMgZG9uZSBpbiB0aGUgInZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSBtZXRob2QuCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gewotCQlKYXZhQ2xhc3MgY29tcG9uZW50SW50ZXJmYWNlID0gZ2V0Q29tcG9uZW50SW50ZXJmYWNlKGJlYW4pOwotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20obWV0aG9kLmdldFJldHVyblR5cGUoKSwgY29tcG9uZW50SW50ZXJmYWNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZU9yQ29sbGVjdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKHJldHVybnNDb21wb25lbnRJbnRlcmZhY2UodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSmF2YUhlbHBlcnMgcmV0dXJuUGFybSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCUphdmFIZWxwZXJzIGphdmFVdGlsRW51bWVyYXRpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0VOVU1FUkFUSU9OLCBiZWFuKTsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0dXJuUGFybSwgamF2YVV0aWxFbnVtZXJhdGlvbikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlKYXZhSGVscGVycyBqYXZhVXRpbENvbGxlY3Rpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5QYXJtLCBqYXZhVXRpbENvbGxlY3Rpb24pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNIb21lKSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQkKLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkvLyBiZWFuIGhhcyBubyBzdXBlcnR5cGUKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRIb21lID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayB0aGlzIENNUCdzIHN1cGVydHlwZQotCQkJcGFyZW50SG9tZSA9IGdldEhvbWVJbnRlcmZhY2Uoc3VwZXJ0eXBlKTsKLQotCQkJaWYocGFyZW50SG9tZSA9PSBudWxsKSB7Ci0JCQkJLy8gY2hpbGQgdXNlcyBlaXRoZXIgbG9jYWwsIG9yIHJlbW90ZSwgYnV0IG5vdCBib3RoIGludGVyZmFjZXMKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCS8vIEhvbWUgYSBYY2hpbGQgb2YgcGFyZW50IEhvbWUKLQkJCS8vIEluIG91ciBFSkIgY29tcG9uZW50IGluaGVyaXRhbmNlIHN0cnVjdHVyZSwgd2hpbGUgaXQgaXMgbGVnYWwgZm9yCi0JCQkvLyBhIGhvbWUgdG8gaW5oZXJpdCBmcm9tIGFub3RoZXIgaG9tZSwgKHNlY3Rpb24gQi4yKSwgaXQgaXMgbm90IGxlZ2FsCi0JCQkvLyBmb3IgV1NBIGNvbXBvbmVudCBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuIAotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodGhpc0hvbWUpOwotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShwYXJlbnRIb21lKTsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc0hvbWUsIHBhcmVudEhvbWUpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyB0aGlzSG9tZS5nZXRRdWFsaWZpZWROYW1lKCksIHBhcmVudEhvbWUuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzSG9tZSwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkKLS8vCQl2YWxpZGF0ZUFwcGVuZGl4Qih2Yywgc3VwZXJ0eXBlLCBwYXJlbnRIb21lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUludGVyZmFjZVR5cGVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FJbnRlcmZhY2VUeXBlVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkMGMxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUludGVyZmFjZVR5cGVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotCi0vKgotICogVGhpcyBjbGFzcyBpcyBhIGhhY2sgYXJvdW5kIHRoZSBKYXZhIGxhY2sgb2Ygc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0gKiBBbGwgaWYgc3RhdGVtZW50cyB3aGljaCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgd291bGQgbm9ybWFsbHkgcmVwbGFjZQotICogYXJlIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUludGVyZmFjZVR5cGVWUnVsZSBleHRlbmRzIEFUeXBlVlJ1bGUgaW1wbGVtZW50cyBJRUpCSW50ZXJmYWNlVHlwZSB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldEJlYW5DbGFzc01ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFswXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBBIGhvbWUgb3IgY29tcG9uZW50IGNsYXNzIG5lZWRzIHRoZSBmb2xsb3dpbmcgY2xhc3NlcycgZXh0ZW5kZWQgbWV0aG9kczoKLQkJLy8gICAgMS4gYmVhbiBjbGFzcwotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlpZihiZWFuQ2xhc3MgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOwotCQl9Ci0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFsxXTsKLQkJcmVzdWx0WzBdID0gYmVhbkNsYXNzLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBob21lIG9yIGNvbXBvbmVudCdzIGZpZWxkIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcwotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlQXBwbGljYXRpb25FeGNlcHRpb25SdWxlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRUpCSW50ZXJmYWNlTWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlsb25nW10gc3VwZXJUeXBlcyA9IGdldFN1cGVydHlwZXMoKTsKLQkJZm9yKGludCBpPTA7IGk8c3VwZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYoQ2xhc3NVdGlsaXR5LmdldFV0aWxpdHkoKS5pc0NsYXNzVHlwZShiZWFuLCBtZXRob2QuZ2V0SmF2YUNsYXNzKCksIHN1cGVyVHlwZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0T3ZlckV4cG9zZWRMb2NhbFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCS8vIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgbWV0aG9kIGRvZXNuJ3QgZXhwb3NlIGFueSBvZiB0aGUgbG9jYWwgdHlwZXMgb2YgdGhlIGJlYW4KLQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJCWlmKHBhcm1zICE9IG51bGwpIHsKLQkJCQlmb3IoaW50IGk9MDsgaTxwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCQlKYXZhUGFyYW1ldGVyIHBhcm0gPSBwYXJtc1tpXTsKLQkJCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTG9jYWxUeXBlKGJlYW4sIHBhcm0uZ2V0SmF2YVR5cGUoKSkpIHsKLQkJCQkJCXJldHVybiBwYXJtLmdldEphdmFUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIE5vdyBjaGVjayB0aGUgcmV0dXJuIHR5cGUKLQkJCUphdmFIZWxwZXJzIHBhcm0gPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTG9jYWxUeXBlKGJlYW4sIHBhcm0pKSB7Ci0JCQkJcmV0dXJuIHBhcm07Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRVhDTFVERURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZihmaWVsZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCkpIHsKLQkJCXJldHVybiBTRVJJQUxWRVJTSU9OVUlEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE9USEVSX0ZJRUxEOwotCQl9CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uUnVsZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBNZXNzYWdlTGltaXRFeGNlcHRpb24gIHsKLQkJTGlzdCBleGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gSVdBRDQ0MTkgPSB7MH0gbXVzdCBiZSBhIHN1YmNsYXNzIG9mIGphdmEubGFuZy5FeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxOC4xLjEsIDE4LjIuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIGphdmFMYW5nRXhjZXB0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19FWENFUFRJT04sIGJlYW4pOwotCQkJSmF2YUhlbHBlcnMgamF2YUxhbmdSdW50aW1lRXhjZXB0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19SVU5USU1FRVhDRVBUSU9OLCBiZWFuKTsKLQkJCQotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBcHBsaWNhdGlvbkV4Y2VwdGlvbihleGNlcHRpb24sIGJlYW4pKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oZXhjZXB0aW9uLCBqYXZhTGFuZ0V4Y2VwdGlvbikpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDA0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2V4Y2VwdGlvbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCi0JCQkJCS8vIG5vIHBvaW50IGNoZWNraW5nIHRoZSByZXN0Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBJV0FENDQyMCA9IHswfSBtdXN0IG5vdCBiZSBhIHN1YmNsYXNzIG9mIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTguMS4xLCAxOC4yLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShleGNlcHRpb24sIGphdmFMYW5nUnVudGltZUV4Y2VwdGlvbikpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDE2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2V4Y2VwdGlvbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJLy8gdmMuYWRkTWVzc2FnZSgiQ2Fubm90IHZhbGlkYXRlIGV4Y2VwdGlvbnMgYmVjYXVzZSB0aGUgezB9IHR5cGUgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4iKTsKLQkJCS8vIERvbid0IGFkZCBhbnkgbWVzc2FnZSBvdGhlciB0aGFuIHRoZSAiY2Fubm90IHZhbGlkYXRlIiBtZXNzYWdlLgotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FLZXlDbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUtleUNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxMzRiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUtleUNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFLZXlDbGFzc1ZSdWxlIGV4dGVuZHMgQVR5cGVWUnVsZSB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBsb25nW10gQkFTRV9UWVBFUyA9IG5ldyBsb25nW117SVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVH07Ci0JCi0JcHVibGljIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBCQVNFX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEga2V5IGNsYXNzJyBtZXRob2QgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzIAotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGtleSBjbGFzcycgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIENIS0oyMTA4ID0gezB9IG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gOS44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIENIS0oyMjQxID0gezB9IG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTAuNi4xMyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBDSEtKMjM3NiA9IHswfSBtdXN0IGJlIGEgbGVnYWwgVmFsdWUgVHlwZSBpbiBSTUktSUlPUC4gUmVhZCBzZWN0aW9uIDEyLjIuMTIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIGNsYXp6KSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0RmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVYQ0xVREVEX0ZJRUxEOwotCQl9Ci0JCWVsc2UgaWYoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSB7Ci0JCQlyZXR1cm4gU0VSSUFMVkVSU0lPTlVJRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBPVEhFUl9GSUVMRDsKLQkJfQkKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiBOT19NRVRIT0RTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gewotCQkvLyBEb2Vzbid0IG1hdHRlciBpZiB0aGUga2V5IGNsYXNzIHRocm93cyBSZW1vdGVFeGNlcHRpb24gb3Igbm90Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2U2ODJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlIGV4dGVuZHMgQUJlYW5DbGFzc1ZSdWxlIHsKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZVRyYW5zaWVudEZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKGZpZWxkLmlzVHJhbnNpZW50KCkpIHsKLQkJCS8vIElXQUQ0MDI1ID0gVHJhbnNpZW50IGZpZWxkcyBhcmUgZGlzY291cmFnZWQuIFJlYWQgc2VjdGlvbiA3LjQuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDUzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQotCQkJSmF2YUhlbHBlcnMgamF2YXhFamJTZXNzaW9uQ29udGV4dCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTkNPTlRFWFQsIGJlYW4pOwotCQkJSmF2YUhlbHBlcnMgamF2YXhUcmFuc2FjdGlvblVzZXJ0cmFuc2FjdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9UUkFOU0FDVElPTl9VU0VSVFJBTlNBQ1RJT04sIGJlYW4pOwotCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpLCBqYXZheEVqYlNlc3Npb25Db250ZXh0KSB8fAotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSwgamF2YXhUcmFuc2FjdGlvblVzZXJ0cmFuc2FjdGlvbikgfHwKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMb2NhbFR5cGUoYmVhbiwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpKSB8fAotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0pORElOYW1pbmdDb250ZXh0KGZpZWxkKSkKLQkJCXsKLQkJCQkvLyBJV0FENDAyNCA9IEEgdHJhbnNpZW50IGZpZWxkIHNob3VsZCBub3QgYmUgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gNy40LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwkJCi0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTllZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU2Vzc2lvbkhvbWVWUnVsZSBleHRlbmRzIEFIb21lVlJ1bGUgewotCS8qKgotCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QgaXNuJ3QgbGlzdGVkIGluIHRoZSBLTk9XTl9NRVRIT0RTLCB3aGF0IHR5cGUgb2YgbWV0aG9kIGlzIGl0Ci0JICogY29uc2lkZXJlZCB0byBiZT8KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpIHsKLQkJLy8gSWYgaXQncyBub3QgYSBjcmVhdGUgbWV0aG9kLCB0aGVuIGl0IHNob3VsZG4ndCBiZSB0aGVyZS4KLQkJcmV0dXJuIEVYQ0xVREVEX01FVEhPRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVN0YXRlbGVzc0hvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTdGF0ZWxlc3NIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3ZTNlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVN0YXRlbGVzc0hvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFTdGF0ZWxlc3NIb21lVlJ1bGUgZXh0ZW5kcyBBU2Vzc2lvbkhvbWVWUnVsZSB7Ci0JcHVibGljIHZvaWQgdmFsaWRhdGVDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBUaGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgY3JlYXRlKCkgbWV0aG9kLgotCQlpZigobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCAhPSAwKSB8fCAoIUlNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VwZXIudmFsaWRhdGVDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FUeXBlVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVHlwZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODAxYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FUeXBlVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFUeXBlVlJ1bGUgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgaW1wbGVtZW50cyBJQ2xhc3NWUnVsZSwgSUVKQlR5cGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19GSUVMRFMgPSAwOwotCi0JcHJpdmF0ZSBsb25nIF9tZXRob2RMaXN0ID0gTk9fTUVUSE9EUzsKLQlwcml2YXRlIGxvbmcgX2ZpZWxkTGlzdCA9IE5PX0ZJRUxEUzsKLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2Yy5zdWJ0YXNrKElFSkJWYWxpZGF0b3JDb25zdGFudHMuU1RBVFVTX1ZBTElEQVRJTkcsIG5ldyBTdHJpbmdbXXsoKEphdmFDbGFzcykgdGFyZ2V0KS5nZXRKYXZhTmFtZSgpfSk7Ci0KLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldFRleHQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOjp2YWxpZGF0ZSgiICsgdGFyZ2V0UGFyZW50ICsgIiwgIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIHRhcmdldFBhcmVudDsKLQkJCUphdmFDbGFzcyBjbGF6eiA9IChKYXZhQ2xhc3MpIHRhcmdldDsKLQotCQkJdHJ5IHsKLQkJCQkvL2NsZWFuIHVwIG9sZCByZWZsZWN0aW9uIGVycm9yIG9uIHRoZSBjbGF6eiB0aGF0IGlzIGdldHRpbmcgdmFsaWRhdGVkCi0JCQkJdmMucmVtb3ZlTWVzc2FnZXMoY2xhenopOwotCQkJCS8vIENoZWNrIHRoYXQgYWxsIG9mIHRoZSB0eXBlcyBpbiB0aGUgYmVhbiByZWZsZWN0ZWQgY29ycmVjdGx5LAotCQkJCS8vIGFuZCB0aGF0IHRoZSB0eXBlcycgcGFyZW50cyByZWZsZWN0ZWQgY29ycmVjdGx5IHRvby4KLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgY2xhenopOwotCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJCXJlZmxlY3Rpb25FcnJvcih2YywgYmVhbiwgY2xhenopOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1VubmFtZWRQYWNrYWdlKGNsYXp6LmdldEphdmFQYWNrYWdlKCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJCUxpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0ID0gZ2V0TWV0aG9kc0V4dGVuZGVkKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBjbGF6ei5saXN0TWV0aG9kRXh0ZW5kZWQoKSwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJCUxpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3QgPSBnZXRGaWVsZHNFeHRlbmRlZCh2YywgYmVhbiwgY2xhenopOwotCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgY2xhenoubGlzdEZpZWxkRXh0ZW5kZWQoKSwgZmllbGRzRXh0ZW5kZWRMaXN0KTsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQkJdmFsaWRhdGVTdXBlcnR5cGVzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJCXZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlyZWZsZWN0aW9uRXJyb3IodmMsIGJlYW4sIGNsYXp6KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyByZW1vdmUgYW55IGV4aXN0aW5nIG1lc3NhZ2VzIHNpbmNlIHRoZXkgbWF5IGJlIGZhdWx0eQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkW10gZmllbGRzLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJRmllbGQgZmllbGQgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJCWZpZWxkID0gZmllbGRzW2ldOwotCQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUgZmllbGRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldFRleHQoIkEgZmllbGQgaXMgbnVsbCBvbiAiICsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIGZpZWxkcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUZXh0KCJWYWxpZGF0aW5nIGZpZWxkICIgKyBmaWVsZC5nZXROYW1lKCkgKyAib24gY2xhenogIiArIGNsYXp6ICsgIiBhbmQgaXNWYWxpZCByZXR1cm5zICIgKyBpc1ZhbGlkKGJlYW4sIGNsYXp6LCBmaWVsZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGlzVmFsaWQoYmVhbiwgY2xhenosIGZpZWxkKSkgewotCQkJCQkJcmVnaXN0ZXIodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZmllbGRzRXh0ZW5kZWRMaXN0cyk7Ci0JCQkJCQl2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGZpZWxkLCBmaWVsZHNFeHRlbmRlZExpc3RzKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlZmxlY3Rpb25XYXJuaW5nKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGUpOwotCQkJCX0KLQkJCX0KLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyByZW1vdmUgYW55IGV4aXN0aW5nIG1lc3NhZ2VzIHNpbmNlIHRoZXkgbWF5IGJlIGZhdWx0eQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1ZhbGlkKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzT3duZWRCeUJhc2UoYmVhbiwgbWV0aG9kKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuICgoZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cykgJiBFWENMVURFRF9NRVRIT0QpICE9IEVYQ0xVREVEX01FVEhPRCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNPd25lZEJ5QmFzZShFbnRlcnByaXNlQmVhbiBiZWFuLCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlsb25nW10gYmFzZVR5cGVzID0gZ2V0QmFzZVR5cGVzKCk7Ci0JCWlmIChiYXNlVHlwZXMgPT0gbnVsbCkgewotCQkJLy8gbm8gcGFyZW50cwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChDbGFzc1V0aWxpdHkuZ2V0VXRpbGl0eSgpLmlzQ2xhc3NUeXBlKGJlYW4sIGZpZWxkLmdldEphdmFDbGFzcygpLCBiYXNlVHlwZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzT3duZWRCeUJhc2UoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJbG9uZ1tdIGJhc2VUeXBlcyA9IGdldEJhc2VUeXBlcygpOwotCQlpZiAoYmFzZVR5cGVzID09IG51bGwpIHsKLQkJCS8vIG5vIHBhcmVudHMKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmFzZVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoQ2xhc3NVdGlsaXR5LmdldFV0aWxpdHkoKS5pc0NsYXNzVHlwZShiZWFuLCBtZXRob2QuZ2V0SmF2YUNsYXNzKCksIGJhc2VUeXBlc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNWYWxpZChFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzT3duZWRCeUJhc2UoYmVhbiwgZmllbGQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gKChnZXRGaWVsZFR5cGUoYmVhbiwgY2xhenosIGZpZWxkKSAmIEVYQ0xVREVEX0ZJRUxEKSAhPSBFWENMVURFRF9GSUVMRCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZFtdIG1ldGhvZHMsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJCW1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCS8vIE5vIHBvaW50IGFkZGluZyBhIHZhbGlkYXRpb24gbWVzc2FnZSwgYmVjYXVzZSB0aGUgdXNlciBjYW4ndCBkbyBhbnl0aGluZy4KLQkJCQkJLy8gTG9nIHRoaXMgY29uZGl0aW9uLgotCQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIG1ldGhvZHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGV4dCgiT24gIiArIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKSArICIsIHRoZXJlIGlzIGEgbnVsbCBtZXRob2QuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIG1ldGhvZHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGV4dCgiVmFsaWRhdGluZyBtZXRob2QgIiArIG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkgKyAiIG9uIGNsYXp6ICIgKyBjbGF6eiArICIgYW5kIGlzVmFsaWQgcmV0dXJucyAiICsgaXNWYWxpZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGlzVmFsaWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpKSB7Ci0JCQkJCQlyZWdpc3Rlcih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkJCQkJaWYgKGlzTWV0aG9kQWxsb3dlZFRvRXhpc3QoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpKSB7Ci0JCQkJCQkJdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdmFsaWRhdGVNZXRob2RXaGljaE11c3ROb3RFeGlzdCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCFpc093bmVkQnlCYXNlKGJlYW4sIG1ldGhvZCkpIHsKLQkJCQkJCQlpZiAoKE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcykgJiBFWENMVURFRF9NRVRIT0QpID09IEVYQ0xVREVEX01FVEhPRCkgewotCQkJCQkJCQkvLyB1bmlkZW50aWZpZWQgbWV0aG9kIGV4Y2x1ZGVkCi0JCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttZXRob2QuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJcmVmbGVjdGlvbldhcm5pbmcodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIGUpOwotCQkJCX0KLQotCQkJfQotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIHJlbW92ZSBhbnkgZXhpc3RpbmcgbWVzc2FnZXMgc2luY2UgdGhleSBtYXkgYmUgZmF1bHR5Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlZ2lzdGVyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCV9maWVsZExpc3QgPSAoX2ZpZWxkTGlzdCB8IGdldEZpZWxkVHlwZShiZWFuLCBjbGF6eiwgZmllbGQpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0Q29uc3RydWN0b3IobG9uZyBtZXRob2RUeXBlKSB7Ci0JCXJldHVybiAoKG1ldGhvZFR5cGUgJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNKSA9PSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZG9lc1B1YmxpY0RlZmF1bHRDb25zdHJ1Y3RvckV4aXN0KCkgewotCQlpZiAoKF9tZXRob2RMaXN0ICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTSkgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdENvbnN0cnVjdG9ySW5zZXJ0ZWRCeUNvbXBpbGVyKCkgewotCQkvLyBJZiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBub3QgaW4gdGhlIGxpc3QsIGFuZCBpZiB0aGVyZSBhcmUgbm8gY29uc3RydWN0b3JzLAotCQkvLyB0aGUgSmF2YSBjb21waWxlciB3aWxsIGluc2VydCBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JCWlmICgoX21ldGhvZExpc3QgJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1IpID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DT05TVFJVQ1RPUikgewotCQkJLy8gVGhlcmUgaXMgYSBjb25zdHJ1Y3Rvciwgc28gcmV0dXJuIGZhbHNlLgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNNZXRob2RBbGxvd2VkVG9FeGlzdChFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlsb25nW10gbWV0aG9kcyA9IGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpOwotCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlsb25nIG1ldGhvZFR5cGUgPSBtZXRob2RzW2ldOwotCQkJCWxvbmcgZXhpc3RpbmdNZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCQlpZiAoKGV4aXN0aW5nTWV0aG9kVHlwZSAmIG1ldGhvZFR5cGUpID09IG1ldGhvZFR5cGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmdbXSBtZXRob2RzID0gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCk7Ci0JCWlmIChtZXRob2RzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCWxvbmcgbWV0aG9kVHlwZSA9IG1ldGhvZHNbaV07Ci0JCQkJYm9vbGVhbiBlbWl0V2FybmluZyA9IGZhbHNlOwotCQkJCWlmIChpc0RlZmF1bHRDb25zdHJ1Y3RvcihtZXRob2RUeXBlKSkgewotCQkJCQlpZiAoIWRvZXNQdWJsaWNEZWZhdWx0Q29uc3RydWN0b3JFeGlzdCgpICYmICFpc0RlZmF1bHRDb25zdHJ1Y3Rvckluc2VydGVkQnlDb21waWxlcigpKSB7Ci0JCQkJCQllbWl0V2FybmluZyA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQllbWl0V2FybmluZyA9ICFleGlzdHMobWV0aG9kVHlwZSk7Ci0JCQkJfQotCi0JCQkJaWYgKGVtaXRXYXJuaW5nKSB7Ci0JCQkJCS8vIElXQUQ0MDQxID0gVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBubwotCQkJCQkvLyBwYXJhbWV0ZXJzLiBSZWFkIHNlY3Rpb24gNy4xMC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MTQyID0gezB9IG11c3QgZXhpc3QuIFJlYWQgc2VjdGlvbiAxMC41LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQxNzMgPSB7MH0gbXVzdCBleGlzdC4gUmVhZCBzZWN0aW9uIDEwLjYuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDI3MSA9IHswfSBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTIuMS40LjEgb2YgdGhlIEVKQiAyLjAKLQkJCQkJLy8gc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQyOTAgPSB7MH0gbXVzdCBleGlzdC4gUmVhZCBzZWN0aW9uIDEyLjIuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDM4OCA9IHswfSBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTUuNy4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCUlNZXRob2RUeXBlIG1UeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShtZXRob2RUeXBlKTsKLQkJCQkJaWYgKG1UeXBlID09IG51bGwpIHsKLQkJCQkJCS8vIHVtbW1tLi4uLm9vcHMuIFRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgaGFwcGVuLgotCQkJCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIG1ldGhvZHMgd2hpY2ggbXVzdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZW50cnkuc2V0VGV4dCgiTWV0aG9kIHR5cGUgaXMgbnVsbDogIiArIG1ldGhvZFR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIG1UeXBlLmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXXttVHlwZS5nZXRNZXRob2ROYW1lKGJlYW4sIGNsYXp6LCBudWxsKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWV0aG9kV2hpY2hNdXN0Tm90RXhpc3QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlNZXRob2RUeXBlIG1UeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCWlmIChtVHlwZSA9PSBudWxsKSB7Ci0JCQkvLyB3aGF0IGhhcHBlbmVkPwotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIG1ldGhvZCB3aGljaCBtdXN0IG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgiTWV0aG9kIHR5cGUgaXMgbnVsbDogIiArIE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0KLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtVHlwZS5nZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21UeXBlLmdldE1ldGhvZE5hbWUoYmVhbiwgY2xhenosIG1ldGhvZCl9LCB0aGlzKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgbG9uZ1tdIGdldEJhc2VUeXBlcygpOwotCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKTsgLy8gaXMgYSBtaXNzaW5nIChvciBwcmVzZW50KQotCQkJCQkJCQkJCQkJCQkJIC8vIFJlbW90ZUV4Y2VwdGlvbiBhIHdhcm5pbmcgb3IgYW4KLQkJCQkJCQkJCQkJCQkJCSAvLyBlcnJvcj8gU2VlIElMb2NhbFR5cGUgYW5kCi0JCQkJCQkJCQkJCQkJCQkgLy8gSVJlbW90ZVR5cGUuCi0KLQlwdWJsaWMgZmluYWwgbG9uZyBnZXRNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRVhDTFVERURfTUVUSE9EOwotCQl9Ci0JCWxvbmcgaWQgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcyk7Ci0JCWlmICgoaWQgJiBDTElOSVQpID09IENMSU5JVCkgewotCQkJcmV0dXJuIEVYQ0xVREVEX01FVEhPRDsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgcmVnaXN0ZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJX21ldGhvZExpc3QgPSAoX21ldGhvZExpc3QgfCBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcykpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlU3VwZXJ0eXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlU2hvdWxkQmVTdXBlclR5cGVzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCXZhbGlkYXRlU2hvdWxkTm90QmVTdXBlclR5cGVzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZjCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gY2xhenoKLQkgKiBAdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2hvdWxkTm90QmVTdXBlclR5cGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJbG9uZ1tdIHR5cGVzOwotCQkvLyBUZXN0IGZvciB0eXBlcyB3aGljaCBjYW4gYmUgc3VwZXJ0eXBlcywgdGhvdWdoIGl0J3MgZWl0aGVyIG5vdCByZWNvbW1lbmRlZCBvciBzaG91bGQgYmUKLQkJLy8gY29kZWQgd2l0aCBjYXV0aW9uCi0JCXR5cGVzID0gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCk7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSmF2YUhlbHBlcnMgc3VwZXJUeXBlID0gQ2xhc3NVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRTdXBlcnR5cGUoYmVhbiwgdHlwZXNbaV0pOwotCQkJCWlmIChzdXBlclR5cGUgPT0gbnVsbCkgewotCQkJCQkvLyBubyBzdXBlcnR5cGUKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBzdXBlclR5cGUpKSB7Ci0JCQkJCS8vIElXQUQ0MTc5ID0gQmVjYXVzZSB0aGlzIGNsYXNzIGltcGxlbWVudHMgezB9LCAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEKLQkJCQkJLy8gbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdC4gUmVhZCBzZWN0aW9uIDEwLjYuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDI5MiA9IEJlY2F1c2UgezB9IGltcGxlbWVudHMgezF9LCAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kCi0JCQkJCS8vIGFyZ3VtZW50IG9yIHJlc3VsdC4gUmVhZCBzZWN0aW9uIDEyLjIuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDA0MyA9IEJlY2F1c2UgezB9IGltcGxlbWVudHMgezF9LCAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kCi0JCQkJCS8vIGFyZ3VtZW50IG9yIHJlc3VsdC4gUmVhZCBzZWN0aW9uIDcuMTAuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNob3VsZEJlU3VwZXJUeXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWxvbmdbXSB0eXBlcyA9IGdldFN1cGVydHlwZXMoKTsKLQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKYXZhSGVscGVycyBzdXBlclR5cGUgPSBDbGFzc1V0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldFN1cGVydHlwZShiZWFuLCB0eXBlc1tpXSk7Ci0JCQkJaWYgKHN1cGVyVHlwZSA9PSBudWxsKSB7Ci0JCQkJCS8vIG5vIHN1cGVydHlwZQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBzdXBlclR5cGUpKSB7Ci0JCQkJCS8vIElXQUQ0MDI2ID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBqYXZheC5lamIuU2Vzc2lvbkJlYW4uIFJlYWQgc2VjdGlvbgotCQkJCQkvLyA3LjUuMSwgNy4xMC4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0Mzc5ID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBqYXZheC5lamIuTWVzc2FnZURyaXZlbkJlYW4uIFJlYWQKLQkJCQkJLy8gc2VjdGlvbiAxNS40LjEsIDE1LjcuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDM4MCA9IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lci4gUmVhZCBzZWN0aW9uCi0JCQkJCS8vIDE1LjQuMSwgMTUuNy4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MTcwID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBqYXZhLmVqYi5FbnRpdHlCZWFuLiBSZWFkIHNlY3Rpb24gMTAuNi4yCi0JCQkJCS8vIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0Mjg2ID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBqYXZhLmVqYi5FbnRpdHlCZWFuLiBSZWFkIHNlY3Rpb24gMTIuMi4yCi0JCQkJCS8vIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXXtzdXBlclR5cGUuZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQlfbWV0aG9kTGlzdCA9IE5PX01FVEhPRFM7Ci0JCV9maWVsZExpc3QgPSBOT19GSUVMRFM7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbkVycm9yKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tde2NsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZmxlY3Rpb25XYXJuaW5nKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgdGhyb3dzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiB7Ci0JCXZjLnJlbW92ZU1lc3NhZ2VzKGZpZWxkKTsKLQkJdmMucmVtb3ZlTWVzc2FnZXMoY2xhenosIGZpZWxkLmdldE5hbWUoKSk7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBnZXRSZWZsZWN0aW9uV2FybmluZyh2YywgZXhjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZmxlY3Rpb25XYXJuaW5nKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIHsKLQkJdmMucmVtb3ZlTWVzc2FnZXMobWV0aG9kKTsKLQkJdmMucmVtb3ZlTWVzc2FnZXMoY2xhenosIG1ldGhvZC5nZXRTaWduYXR1cmUoKSk7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBnZXRSZWZsZWN0aW9uV2FybmluZyh2YywgZXhjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSU1lc3NhZ2UgZ2V0UmVmbGVjdGlvbldhcm5pbmcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEVPYmplY3QgZmllbGRPck1ldGhvZCkgewotCQlpZiAoZXhjID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGJhZENsYXp6ID0gZXhjLmdldEphdmFDbGFzcygpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSAoYmFkQ2xhenogPT0gbnVsbCkgPyAiPyIgOiBiYWRDbGF6ei5nZXRRdWFsaWZpZWROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0KLQkJaWYgKGZpZWxkT3JNZXRob2QgaW5zdGFuY2VvZiBGaWVsZCkgewotCQkJU3RyaW5nIG5hbWUgPSAoKEZpZWxkKSBmaWVsZE9yTWV0aG9kKS5nZXROYW1lKCk7Ci0JCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIChGaWVsZCkgZmllbGRPck1ldGhvZCwgbmV3IFN0cmluZ1tde25hbWUsIHR5cGVOYW1lfSwgdGhpcyk7Ci0JCX0gZWxzZSBpZiAoZmllbGRPck1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZCkgewotCQkJU3RyaW5nIG5hbWUgPSAoKE1ldGhvZCkgZmllbGRPck1ldGhvZCkuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpOwotCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCAoTWV0aG9kKSBmaWVsZE9yTWV0aG9kLCBuZXcgU3RyaW5nW117bmFtZSwgdHlwZU5hbWV9LCB0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBuYW1lID0gKChYTUlSZXNvdXJjZSkgZmllbGRPck1ldGhvZC5lUmVzb3VyY2UoKSkuZ2V0SUQoZmllbGRPck1ldGhvZCk7Ci0JCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXXtuYW1lLCB0eXBlTmFtZX0sIHRoaXMpOwotCQl9Ci0JCWlmIChiYWRDbGF6eiA9PSBudWxsKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoImdldE1lc3NhZ2VJZChJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgYm9vbGVhbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoIkludmFsaWRJbnB1dEV4Y2VwdGlvbiB0aHJvd24gb24gdW5rbm93biBjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCi0KLQlwdWJsaWMgZmluYWwgSmF2YUNsYXNzIGdldENvbXBvbmVudEludGVyZmFjZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmICgoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQlyZXR1cm4gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJfQotCQlyZXR1cm4gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGV4aXN0cyhsb25nIG1ldGhvZFR5cGUpIHsKLQkJcmV0dXJuICgoX21ldGhvZExpc3QgJiBtZXRob2RUeXBlKSA9PSBtZXRob2RUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSmF2YUNsYXNzIGdldEhvbWVJbnRlcmZhY2UoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJcmV0dXJuIGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiBiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gewotCQlpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJLy8gbXVzdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24gb3Igb25lIG9mIGl0cyBwYXJlbnRzIChJT0V4Y2VwdGlvbiBvciBFeGNlcHRpb24pCi0JCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c1JlbW90ZUV4Y2VwdGlvbk9yUGFyZW50KGJlYW4sIG1ldGhvZCk7Ci0JCX0gZWxzZSBpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5MT0NBTCkgPT0gSUVKQlR5cGUuTE9DQUwpIHsKLQkJCS8vIG11c3Qgbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbgotCQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5kb2VzTm90VGhyb3dSZW1vdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0LCBib29sZWFuIGNoZWNrUmV0dXJuVHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIHsKLQkJaWYgKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IHBhcm1zW2ldOwotCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUFR5cGUoYmVhbiwgcGFybS5nZXRKYXZhVHlwZSgpKSkgewotCQkJCQlJTWV0aG9kVHlwZSBtdCA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcyk7Ci0JCQkJCWlmIChtdCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBsb2cKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgbXQuZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtwYXJtLmdldEphdmFUeXBlKCkuZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOyAvLyBDYW4ndAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHVzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG5hbWUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGZpZWxkLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGJlY2F1c2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB3aGVuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gaXQncwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHJldHVybgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHR5cGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG1ldGhvZCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBpdCdzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gY29uZnVzaW5nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdG8KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBzZWUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyAicmVzdWx0IgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGFzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gbmFtZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gZmllbGQuCi0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2hlY2tSZXR1cm5UeXBlKSB7Ci0JCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMZWdhbFJNSV9JSU9QVHlwZShiZWFuLCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgewotCQkJCQlJTWV0aG9kVHlwZSBtdCA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcyk7Ci0JCQkJCWlmIChtdCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBsb2cKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgbXQuZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCl9LCB0aGlzKTsgLy8gQ2FuJ3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdXNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBuYW1lCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBmaWVsZCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gYmVjYXVzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB3aGVuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGl0J3MKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHJldHVybgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0eXBlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBtZXRob2QsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGl0J3MKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gY29uZnVzaW5nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHNlZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyAicmVzdWx0IgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBhcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gbmFtZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gZmllbGQuCi0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjawotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93Uk1JX0lJT1BJbmhlcml0YW5jZVJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQlpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BJbmhlcml0YW5jZShjbGF6eik7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZXJpYWxWZXJzaW9uVUlEKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQkvKgotCQkgKiBGb3Igbm93LCBkbyBub3RoaW5nLiBJbiBmdXR1cmUsIGNoZWNrIGlmIHRoZSBmaWVsZCBpcyBwdWJsaWMgJiBzdGF0aWM/Ci0JCSAqLwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOTkxYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogUGVyZm9ybXMgdmFsaWRhdGlvbiBjb21tb24gdG8gc2Vzc2lvbiBhbmQgZW50aXR5IGJlYW5zLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRlQmVhbiBleHRlbmRzIEFWYWxpZGF0ZUVKQiB7Ci0JcHJvdGVjdGVkIEhhc2hTZXQgY29tcG9uZW50UGFyZW50cyA9IG51bGw7IC8vIFRoZSBKYXZhQ2xhc3MgaW5zdGFuY2VzIHdoaWNoIGFyZSBwYXJlbnRzIG9mIHRoaXMgSmF2YUNsYXNzIGluc3RhbmNlLCBpZiB0aGlzIEphdmFDbGFzcyBpbnN0YW5jZSBpcyBwYXJ0IG9mIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkKLQlwdWJsaWMgQVZhbGlkYXRlQmVhbigpIHsKLQkJY29tcG9uZW50UGFyZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQljb21wb25lbnRQYXJlbnRzLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29tcG9uZW50UGFyZW50cyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCWlmIChzdXBlcnR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGhpcyBDTVAncyBzdXBlcnR5cGUKLQkJSmF2YUNsYXNzIHRoaXNFamJPYmplY3QgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCUphdmFDbGFzcyBwYXJlbnRFamJPYmplY3QgPSBzdXBlcnR5cGUuZ2V0RWpiQ2xhc3MoKTsKLQotCQkvLyBFSkJPYmplY3QgYSBYY2hpbGQgb2YgcGFyZW50IEVKQk9iamVjdCAoWCA9IGNoaWxkLCBncmFuZGNoaWxkLCBncmVhdC1ncmFuZGNoaWxkLCBldGMuKQotCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc0VqYk9iamVjdCwgcGFyZW50RWpiT2JqZWN0KSkgewotCQkJY29tcG9uZW50UGFyZW50cy5hZGQocGFyZW50RWpiT2JqZWN0KTsKLQkJfQotCQlidWlsZENvbXBvbmVudFBhcmVudHMoc3VwZXJ0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRFamJDbGFzcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0UmVtb3RlSG9tZU1ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFswXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldFJlbW90ZUNvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFsxXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldEJlYW5DbGFzc01ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFsyXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gQSBiZWFuIGNsYXNzIG5lZWRzIHRoZSBmb2xsb3dpbmcgY2xhc3NlcycgZXh0ZW5kZWQgbWV0aG9kczoKLQkJLy8gICAgMS4gaG9tZQotCQkvLyAgICAyLiByZW1vdGUKLQkJLy8gICAgMy4gYmVhbiBjbGFzcyAod2hlbiBzZWFyY2hpbmcgZm9yIGEgbWF0Y2hpbmcgZWpiUG9zdENyZWF0ZSBtZXRob2QpLgotCQkvLyBJZiBhIHBhcnRpY3VsYXIgYmVhbiBkb2Vzbid0IHVzZSBhIHJlbW90ZSB2aWV3IG9yIGxvY2FsIHZpZXcsCi0JCS8vIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIGFycmF5IHdpbGwgYmUgbnVsbC4gCi0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFszXTsKLQkJSmF2YUNsYXNzIHJlbW90ZUhvbWUgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJaWYocmVtb3RlSG9tZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMF0gPSByZW1vdGVIb21lLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzBdID0gbnVsbDsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIHJlbW90ZUNvbXBvbmVudCA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCWlmKHJlbW90ZUNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMV0gPSByZW1vdGVDb21wb25lbnQuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMV0gPSBudWxsOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlpZihiZWFuQ2xhc3MgIT0gbnVsbCkgewotCQkJcmVzdWx0WzJdID0gYmVhbkNsYXNzLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzJdID0gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgYmVhbiBjbGFzcycgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQkKLQkvKioKLQkgKiBGb3IgdGhlIGNoZWNrIHRoYXQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgaGFzIGEgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvbiB0aGUgaG9tZSwKLQkgKiB0aGlzIG1ldGhvZCwgZ2l2ZW4gdGhlIGJlYW4gbWV0aG9kLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhvbWUgbWV0aG9kLgotCSAqCi0JICogNi4xMC42IFNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCSAqICAgICB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLQkgKiAgICAgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCSAqICAgICBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkgKi4uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICovCi0JcHVibGljIGZpbmFsIE1ldGhvZCBnZXRNYXRjaGluZ0hvbWVDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKYXZhQ2xhc3MgaG9tZUludGYgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGhvbWVJbnRmKTsKLQotCQkvLyBjaGVjayBvbmx5IHRoZSBjdXJyZW50IGNsYXNzLCBub3QgdGhlIHBhcmVudHMgaW4gdGhpcyBjYXNlLgotCQkvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UgaGllcmFyY2h5IHRlc3RzLgotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSwgaG9tZUludGYuZ2V0TWV0aG9kcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogRm9yIHRoZSBjaGVjayB0aGF0IHRoZSBlamJDcmVhdGUgbWV0aG9kIGhhcyBhIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGhvbWUsCi0JICogdGhpcyBtZXRob2QsIGdpdmVuIHRoZSBiZWFuIG1ldGhvZCwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBob21lIG1ldGhvZC4KLQkgKgotCSAqIDYuMTAuNiBTZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkgKiAgICAgdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkgKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICouLi4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkgKiAgICAgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkgKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWF0Y2hpbmdIb21lQ3JlYXRlTWV0aG9kRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy4gdGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGhvbWVJbnRmID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lSW50Zik7Ci0KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChob21lSW50ZiwgbWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhcmVudCB3aGljaCB0aGUgYmVhbiBtdXN0IGltcGxlbWVudC4KLQkgKiBGb3IgZW50aXR5IGJlYW5zLCBpdCdzIGphdmF4LmVqYi5FbnRpdHlCZWFuLgotCSAqIEZvciBzZXNzaW9uIGJlYW5zLCBpdCdzIGphdmF4LmVqYi5TZXNzaW9uQmVhbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhcmVudE5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBwYXNzZWQgaW4gaXMgYSBidXNpbmVzcyBtZXRob2QuCi0JICoKLQkgKiBBbHRob3VnaCB0aGUgRUpCIDEuMSBzcGVjIGltcGxpZXMgdGhhdCBhbGwgbm9uLWZyYW1ld29yayBtZXRob2RzIGFyZSBidXNpbmVzcyBtZXRob2RzLAotCSAqIGRldmVsb3BlcnMgbWF5IGNyZWF0ZSBtZXRob2RzIG9uIHRoZSBiZWFuIHdoaWNoIGFyZSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFRoaXMKLQkgKiBtZXRob2QgKGlzQnVzaW5lc3NNZXRob2QpIHNlcGFyYXRlcyB0aGUgImludGVybmFsIGhlbHBlciIgbWV0aG9kcyBmcm9tIHRoZSBidXNpbmVzcwotCSAqIG1ldGhvZHMgYnkgY2hlY2tpbmcgaWYgYSBjb3JyZXNwb25kaW5nIG1ldGhvZCBleGlzdHMgb24gdGhlIHJlbW90ZSBpbnRlcmZhY2UuIElmIGl0Ci0JICogZG9lcywgY29uc2lkZXIgdGhpcyBhIGJ1c2luZXNzIG1ldGhvZC4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCdXNpbmVzc01ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCi0JCWlmIChpc0ZyYW1ld29ya01ldGhvZChuYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIENoZWNrIGlmIHRoZXJlJ3MgYSBtYXRjaGluZyBtZXRob2Qgb24gdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUphdmFDbGFzcyByZW1vdGVJbnRlcmZhY2UgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlSW50ZXJmYWNlKTsKLQkJTWV0aG9kIHJlbW90ZUludGVyZmFjZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChyZW1vdGVJbnRlcmZhY2UsIG5hbWUsIG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKSk7Ci0JCWlmICgocmVtb3RlSW50ZXJmYWNlTWV0aG9kID09IG51bGwpIHx8IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNFSkJPYmplY3RNZXRob2QoYmVhbiwgcmVtb3RlSW50ZXJmYWNlTWV0aG9kKSkpIHsKLQkJCS8vIG5vIG1hdGNoaW5nIG1ldGhvZAotCQkJLy8gZmlsdGVyIG91dCBtZXRob2RzIGZyb20gamF2YXguZWpiLkVKQk9iamVjdAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgcGFzc2VkIGluIGlzIGluaGVyaXRlZCBmcm9tIGEgcGFyZW50IGluIGEKLQkgKiBjb21wb25lbnQgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcG9uZW50SW5oZXJpdGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChjb21wb25lbnRQYXJlbnRzID09IG51bGwpIHsKLQkJCS8vIE5vdCBwYXJ0IG9mIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIChjb21wb25lbnRQYXJlbnRzLmNvbnRhaW5zKG1ldGguZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRnJhbWV3b3JrTWV0aG9kKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJBQ1RJVkFURSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBBU1NJVkFURSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlJFTU9WRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkZJTkQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQT1NUQ1JFQVRFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGNhbiwgYW5kIHNob3VsZCwgYmUgdmFsaWRhdGVkLgotCSAqIEZpbHRlciBvdXQgZmF1bHR5IGZpZWxkcyAoaS5lLiwgbnVsbCksIGFuZCBmaWVsZHMgd2hpY2gKLQkgKiBiZWxvbmcgdG8gdGhlIGJhc2UgdHlwZSwgd2hhdGV2ZXIgdGhhdCBpcy4gKGUuZy4gamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChzdXBlci5pc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGZpZWxkc0V4dGVuZGVkTGlzdCkpIHsKLQkJCS8vIGV4Y2x1ZGUgcm9vdCBvYmplY3QgbWV0aG9kcwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0phdmFMYW5nT2JqZWN0RmllbGQoYmVhbiwgZmllbGQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGNhbiwgYW5kIHNob3VsZCwgYmUgdmFsaWRhdGVkLgotCSAqIEZpbHRlciBvdXQgZmF1bHR5IG1ldGhvZHMgKGkuZS4sIG51bGwpLCBhbmQgbWV0aG9kcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKHN1cGVyLmlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpKSB7Ci0JCQkvLyBleGNsdWRlIHJvb3Qgb2JqZWN0IG1ldGhvZHMKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNKYXZhTGFuZ09iamVjdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkgewotCQkJCXJldHVybiBpc1ZhbGlkRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpKSB7Ci0JCQkJcmV0dXJuIGlzVmFsaWRFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBwYXNzZWQgaW4gaXMgbm90IGluaGVyaXRlZCAKLQkgKiBmcm9tIGEgcGFyZW50IGluIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgb3IgaXMgaW5oZXJpdGVkLAotCSAqIGJ1dCBpcyBhbHNvIGRlZmluZWQgb24gdGhpcyBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGV4Y2x1ZGUgZWpiQ3JlYXRlIG1ldGhvZHMgd2hpY2ggYXJlIGluaGVyaXRlZAotCSAqIGZyb20gYSBwYXJlbnQgaW4gYSBjb21wb25lbnQgaW5oZXJpdGFuY2UgaGllcmFyY2h5LCBhbmQgYXJlIG5vdAotCSAqIGV4cG9zZWQgYW55d2hlcmUgb24gdGhpcyBiZWFuIGNsYXNzIGluc3RhbmNlIGl0c2VsZi4gKGkuZS4sIGluaGVyaXRlZCwKLQkgKiBidXQgbmV2ZXIgdXNlZC4pIFNpbmNlIHdlIGdlbmVyYXRlIHRoZSBjb2RlIGZvciB0aGVzZSBtZXRob2RzLCB3ZQotCSAqIHNob3VsZCBub3QgZmxhZyB0aGVtIGFzIHdhcm5pbmdzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzVmFsaWRFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRoLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQlib29sZWFuIGlzQ29tcCA9IGlzQ29tcG9uZW50SW5oZXJpdGVkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aCk7Ci0JCWlmIChpc0NvbXApIHsKLQkJCU1ldGhvZCBob21lTWV0aCA9IGdldE1hdGNoaW5nSG9tZUNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGgsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJCWlmIChob21lTWV0aCA9PSBudWxsKSB7Ci0JCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCQotCS8qKgotCSAqIDE4LjEuMiBQcm9ncmFtbWluZyByZXN0cmljdGlvbnMKLQkgKi4uLgotCSAqICAgIC0gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSByZWFkL3dyaXRlIHN0YXRpYyBmaWVsZHMuIFVzaW5nIHJlYWQtb25seSBzdGF0aWMgZmllbGRzIGlzCi0JICogICBhbGxvd2VkLiBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHN0YXRpYyBmaWVsZHMgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBiZQotCSAqICAgZGVjbGFyZWQgYXMgZmluYWwuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy9zdXBlci5wcmltVmFsaWRhdGUoZWpiTWV0aG9kKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCXZhbGlkYXRlU3RhdGljRmllbGQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JfQotCQotCS8qKgotCSAqIDYuMTAuNCBCdXNpbmVzcyBtZXRob2RzCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBidXNpbmVzcyBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0JICogCQktIFRoZSBtZXRob2QgbmFtZXMgY2FuIGJlIGFyYml0cmFyeSwgYnV0IHRoZXkgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgY2FsbGJhY2sgbWV0aG9kcyB1c2VkIGJ5IHRoZSBFSkIgYXJjaGl0ZWN0dXJlLgotCSAqCi0JICogOS4yLjYgQnVzaW5lc3MgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGRlZmluZSB6ZXJvIG9yIG1vcmUgYnVzaW5lc3MgbWV0aG9kcyB3aG9zZSBzaWduYXR1cmVzIAotCSAqICAgICBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAgICAgICAgLSBUaGUgbWV0aG9kIG5hbWVzIGNhbiBiZSBhcmJpdHJhcnksIGJ1dCB0aGV5IG11c3Qgbm90IHN0YXJ0IHdpdGggJ2VqYicgdG8gCi0JICogICAgICAgICAgYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0JCWlmIChtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkIpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDExLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFNlY3Rpb24gNi4xMC41IChzZXNzaW9uKSwgOS4yLjcgKGVudGl0eSksIGRlY2xhcmUgdGhhdCBhbGwgZXhjZXB0aW9ucyBkZWNsYXJlZAotCQkvLyBvbiB0aGUgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mCi0JCS8vIHRoZSBtYXRjaGluZyBjcmVhdGUgb2YgdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQkJSmF2YUNsYXNzIHJlbW90ZSA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZW1vdGUpOwotCi0JCU1ldGhvZCByZW1vdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQocmVtb3RlLCBtZXRob2QsIG1ldGhvZC5nZXROYW1lKCkpOwotCQlpZiAocmVtb3RlTWV0aG9kID09IG51bGwpIHsKLQkJCS8vIFRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQ7IHVubGVzcyB0aGUgbWV0aG9kIGV4aXN0cyBvbiB0aGUgcmVtb3RlLCB0aGlzIGJlYW4gbWV0aG9kIGlzbid0IGEgYnVzaW5lc3MgbWV0aG9kLgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgcmVtb3RlTWV0aG9kKTsKLQkJaWYgKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MzIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgcmVtb3RlLmdldFF1YWxpZmllZE5hbWUoKSwgZXhjLmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpLCByZW1vdGVNZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiA2LjEwLjIgU2Vzc2lvbiBiZWFuIGNsYXNzCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3Igc2Vzc2lvbiBiZWFuIGNsYXNzOgotCSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuU2Vzc2lvbkJlYW4gCi0JICogICAgICAgIGludGVyZmFjZS4KLQkgKiAJCS0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgCi0JICogICAgICAgIGJlIGFic3RyYWN0LgotCSAqIAkJLSBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIHNlc3Npb24gYmVhbidzIAotCSAqICAgICAgICByZW1vdGUgaW50ZXJmYWNlIFs0XSAuCi0JICogCQktIElmIHRoZSBjbGFzcyBpcyBhIHN0YXRlZnVsIHNlc3Npb24gYmVhbiwgaXQgbWF5IG9wdGlvbmFsbHkgaW1wbGVtZW50IAotCSAqICAgICAgICB0aGUgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCSAqIAkJLSBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBoYXZlIHN1cGVyY2xhc3NlcyBhbmQvb3Igc3VwZXJpbnRlcmZhY2VzLiBJZiB0aGUgCi0JICogICAgICAgIHNlc3Npb24gYmVhbiBoYXMgc3VwZXJjbGFzc2VzLCB0aGVuIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMsIAotCSAqICAgICAgICB0aGUgbWV0aG9kcyBvZiB0aGUgU2Vzc2lvbkJlYW4gaW50ZXJmYWNlLCBhbmQgdGhlIG1ldGhvZHMgb2YgdGhlIG9wdGlvbmFsIAotCSAqICAgICAgICBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZSBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLCAKLQkgKiAgICAgICAgb3IgaW4gYW55IG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0JICoKLQkgKi4uLgotCSAqIDkuMi4yIEVudGVycHJpc2UgYmVhbiBjbGFzcwotCSAqICAgLSBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciBhbiBlbnRpdHkgYmVhbiBjbGFzczoKLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50LCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCB0aGUgamF2YXguZWpiLkVudGl0eUJlYW4gaW50ZXJmYWNlLgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGFzIHB1YmxpYyBhbmQgbXVzdCBub3QgYmUgYWJzdHJhY3QuCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IG5vdCBiZSBkZWZpbmVkIGFzIGZpbmFsLgotCSAqLi4uCi0JICogICAtIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIFs5XS4gCi0JICogICAgIElmIHRoZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UsIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgbm8tb3AgCi0JICogICAgIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBqYXZheC5lamIuRUpCT2JqZWN0IGludGVyZmFjZS4gVGhlIGNvbnRhaW5lciAKLQkgKiAgICAgd2lsbCBuZXZlciBpbnZva2UgdGhlc2UgbWV0aG9kcyBvbiB0aGUgYmVhbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KLQkgKiAgIC0gQSBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBtZXRob2RzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIAotCSAqICAgICBkZWZpbmluZyB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgYWJzdHJhY3QuCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgYW5kIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlLCBhbmQgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgYXMgZGVzY3JpYmVkIAotCSAqICAgICBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gCi0JICogICAgIElmIHRoZSBlbnRpdHkgYmVhbiBoYXMgc3VwZXJjbGFzc2VzLCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIAotCSAqICAgICBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcywgdGhlIGZpbmRlciBtZXRob2RzLCBhbmQgdGhlCi0JICogICAgIG1ldGhvZHMgb2YgdGhlIEVudGl0eUJlYW4gaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgCi0JICogICAgIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIGlzIGFsbG93ZWQgdG8gaW1wbGVtZW50IG90aGVyIG1ldGhvZHMgKGZvciAKLQkgKiAgICAgZXhhbXBsZSBoZWxwZXIgbWV0aG9kcyBpbnZva2VkIGludGVybmFsbHkgYnkgdGhlIGJ1c2luZXNzIG1ldGhvZHMpIAotCSAqICAgICBpbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyByZXF1aXJlZCBieSB0aGUgRUpCIHNwZWNpZmljYXRpb24uCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlidWlsZENvbXBvbmVudFBhcmVudHMoYmVhbik7Ci0KLQkJLy8gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50LCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCB0aGUgamF2YXguZWpiLkVudGl0eUJlYW4gKGZvciBlbnRpdHkgYmVhbnMpLCAKLQkJLy8gb3IgdGhlIGphdmF4LmVqYi5TZXNzaW9uQmVhbiAoZm9yIHNlc3Npb24gYmVhbnMpLCBpbnRlcmZhY2UuCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oY2xhenosIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGdldFBhcmVudE5hbWUoKSwgYmVhbikpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMTMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpLCBnZXRQYXJlbnROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBGb3IgYm90aCBlbnRpdHkgYW5kIHNlc3Npb24gYmVhbnMsIHRoZSBjbGFzcyBtdXN0IGJlIHB1YmxpYy4KLQkJaWYgKCFjbGF6ei5pc1B1YmxpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBGb3IgYm90aCBlbnRpdHkgYW5kIHNlc3Npb24gYmVhbnMsIHRoZSBjbGFzcyBtdXN0IG5vdCBiZSBhYnN0cmFjdC4KLQkJaWYgKGNsYXp6LmlzQWJzdHJhY3QoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gRm9yIGJvdGggZW50aXR5IGFuZCBzZXNzaW9uIGJlYW5zLCB0aGUgY2xhc3MgbXVzdCBub3QgYmUgZmluYWwuCi0JCWlmIChjbGF6ei5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNVbm5hbWVkUGFja2FnZShjbGF6ei5nZXRKYXZhUGFja2FnZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIDkuMi4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0JICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiQ3JlYXRlLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgICAgIC0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZS4KLQkgKiAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkgKiAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCSAqICAgICAgICAgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCSAqICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgdG8gdGhyb3cgdGhlIAotCSAqICAgICAgICAgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyAKLQkgKiAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICAgICAgdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKiAgIC0gVGhlIGVudGl0eSBvYmplY3QgY3JlYXRlZCBieSB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgYSB1bmlxdWUgcHJpbWFyeSBrZXkuIAotCSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHByaW1hcnkga2V5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIHByaW1hcnkga2V5cyBvZiBhbGwgCi0JICogICAgIHRoZSBleGlzdGluZyBlbnRpdHkgb2JqZWN0cyB3aXRoaW4gdGhlIHNhbWUgaG9tZS4gVGhlIGVqYkNyZWF0ZSBtZXRob2Qgc2hvdWxkIAotCSAqICAgICB0aHJvdyB0aGUgRHVwbGljYXRlS2V5RXhjZXB0aW9uIG9uIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGVudGl0eSBvYmplY3Qgd2l0aCAKLQkgKiAgICAgYSBkdXBsaWNhdGUgcHJpbWFyeSBrZXkuIEhvd2V2ZXIsIGl0IGlzIGxlZ2FsIHRvIHJldXNlIHRoZSBwcmltYXJ5IGtleSBvZiBhCi0JICogICAgIHByZXZpb3VzbHkgcmVtb3ZlZCBlbnRpdHkgb2JqZWN0LgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICouLi4KLQkgKgotCSAqIDkuNC4yIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZQotCSAqLi4uCi0JICogICAtIFRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHByaW1hcnkga2V5IGNsYXNzIHR5cGUuIAotCSAqICAgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgc2hvdWxkIGJlIGNvZGVkIHRvIHJldHVybiBhIG51bGwuIAotCSAqICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaWdub3JlZCBieSB0aGUgQ29udGFpbmVyLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2RfaG9tZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIG1ldGhvZCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCBtdXN0IGhhdmUgYWxyZWFkeSB0ZXN0ZWQgdGhhdCB0aGUgbWV0aG9kIG5hbWUgaXMgZWpiQ3JlYXRlLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU1ldGhvZCBjcmVhdGVNZXRob2QgPSBnZXRNYXRjaGluZ0hvbWVDcmVhdGVNZXRob2RFeHRlbmRlZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCWlmIChjcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJLy8gQ2FuJ3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMgb2YgYSBtZXRob2Qgd2hpY2ggZG9lc24ndCBleGlzdC4KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFdoZXRoZXIgdGhpcyBpcyBmcm9tIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIG9yIG5vdCwgaWYgdGhlIG1ldGhvZCBleGlzdHMgb24gdGhlCi0JCS8vIGhvbWUsIGNoZWNrIHRoYXQgdGhlIG1ldGhvZCBmb2xsb3dzIHRoZSBzcGVjLgotCi0JCS8vIFNlY3Rpb24gNi4xMC42IChzZXNzaW9uKSwgOS4yLjggKGVudGl0eSksIGRlY2xhcmUgdGhhdCBhbGwgZXhjZXB0aW9ucyBkZWNsYXJlZAotCQkvLyBvbiB0aGUgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mCi0JCS8vIHRoZSBtYXRjaGluZyBjcmVhdGUgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgY3JlYXRlTWV0aG9kKTsKLQkJaWYgKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MjAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgZXhjLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlSGVscGVyTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU5vUmVtb3RlRXhjZXB0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBTdHJpbmcgbWVzc2FnZVByZWZpeCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24iIGFib3ZlCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5kb2VzTm90VGhyb3dSZW1vdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtZXNzYWdlUHJlZml4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogMTguMS4yIFByb2dyYW1taW5nIHJlc3RyaWN0aW9ucwotCSAqLi4uCi0JICogICAgLSBBbiBlbnRlcnByaXNlIEJlYW4gbXVzdCBub3QgdXNlIHJlYWQvd3JpdGUgc3RhdGljIGZpZWxkcy4gVXNpbmcgcmVhZC1vbmx5IHN0YXRpYyBmaWVsZHMgaXMKLQkgKiAgIGFsbG93ZWQuIFRoZXJlZm9yZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc3RhdGljIGZpZWxkcyBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIGJlCi0JICogICBkZWNsYXJlZCBhcyBmaW5hbC4KLQkgKi4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU3RhdGljRmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEFuIGVudGVycHJpc2UgQmVhbiBtdXN0IG5vdCB1c2UgcmVhZC93cml0ZSBzdGF0aWMgZmllbGRzLiBVc2luZyByZWFkLW9ubHkgc3RhdGljIGZpZWxkcyBpcwotCQkvLyBhbGxvd2VkLiBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHN0YXRpYyBmaWVsZHMgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBiZQotCQkvLyBkZWNsYXJlZCBhcyBmaW5hbC4KLQkJaWYgKGZpZWxkLmlzU3RhdGljKCkgJiYgIWZpZWxkLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMjAwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ01ldGhvZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIEphdmFDbGFzcyBtYXRjaGluZ0NsYXp6LCBNZXRob2QgbWF0Y2hpbmdNZXRob2QpIHsKLQkJLy8gRXZlcnkgZXhjZXB0aW9uIHRocm93biBvbiB0aGUgYmVhbiBjbGFzcycgbWV0aG9kIG11c3QgYmUgdGhyb3duIG9uIHRoZSBjb21wb25lbnQvaG9tZSBtZXRob2QKLQkJLyogRG9uJ3QgY2hlY2sgZm9yIHRoaXMgaGVyZSAtIGxldCB0aGUgaG9tZSAmIGNvbXBvbmVudCBkbyBpdC4KLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtZXRob2QsIG1hdGNoaW5nTWV0aG9kKTsKLQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCX0KLQkJKi8KLQkJCi0JCS8vIEV2ZXJ5IGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIGNvbXBvbmVudC9ob21lIG1ldGhvZCBzaG91bGQgYmUgdGhyb3duIG9yIHRoZXJlIG1heSBiZSBjb21waWxlIGVycm9ycwotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRTdWJ0eXBlRXhjZXB0aW9ucyhiZWFuLCBtYXRjaGluZ01ldGhvZCwgbWV0aG9kKTsKLQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcyllaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQ1NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtleGNlcHRpb24uZ2V0SmF2YU5hbWUoKSwgbWF0Y2hpbmdDbGF6ei5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNFamJPYmplY3QpIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGVycHJpc2VCZWFuIHN1cGVydHlwZSA9IGdldFN1cGVyVHlwZShiZWFuKTsKLQkJSmF2YUNsYXNzIHBhcmVudEVqYk9iamVjdCA9IG51bGw7Ci0JCWlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewotCQkJcGFyZW50RWpiT2JqZWN0ID0gc3VwZXJ0eXBlLmdldEVqYkNsYXNzKCk7Ci0KLQkJCS8vIEVKQk9iamVjdCBhIFhjaGlsZCBvZiBwYXJlbnQgRUpCT2JqZWN0IChYID0gY2hpbGQsIGdyYW5kY2hpbGQsIGdyZWF0LWdyYW5kY2hpbGQsIGV0Yy4pCi0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0aGlzRWpiT2JqZWN0KTsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocGFyZW50RWpiT2JqZWN0KTsKLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHRoaXNFamJPYmplY3QsIHBhcmVudEVqYk9iamVjdCkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IHRoaXNFamJPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpLCBwYXJlbnRFamJPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzRWpiT2JqZWN0LCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCQotLy8JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBzdXBlcnR5cGUsIHBhcmVudEVqYk9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVKQi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVKQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg4NjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFSkIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb247Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxLzUvMDEgMTE6NTE6MDkgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVFSkIgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgewotCXByaXZhdGUgTGlzdCByb2xlTWV0aG9kTmFtZXM7Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCWlmKHJvbGVNZXRob2ROYW1lcyAhPSBudWxsKSB7Ci0JCQlyb2xlTWV0aG9kTmFtZXMuY2xlYXIoKTsKLQkJCXJvbGVNZXRob2ROYW1lcyA9IG51bGw7IC8vIGluIHRoaXMgY2FzZSwgY2xlYXJpbmcgdGhlIGxpc3QgaXNuJ3QgZW5vdWdoLCBiZWNhdXNlIGl0IGlzIGxlZ2FsIHRvIGhhdmUgemVybyByb2xlIG5hbWVzLiBNdXN0IGJlIG51bGwgb3Igd2UnbGwga2VlcCB0cnlpbmcgdG8gcmVsb2FkIHRoZSByb2xlIG5hbWVzIGp1c3QgYmVjYXVzZSB0aGVyZSBhcmUgemVybyByb2xlIG5hbWVzLgotCQl9Ci0JfQotCQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOS81LzIwMDEgMTI6MzY6MzkgUE0pCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFJvbGVNZXRob2ROYW1lcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJdHJ5IHsKLQkJCWlmIChyb2xlTWV0aG9kTmFtZXMgPT0gbnVsbCAmJiBiZWFuICE9IG51bGwpIHsKLQkJCQlyb2xlTWV0aG9kTmFtZXMgPSBnZXRSb2xlTWV0aG9kTmFtZXNFeHRlbmRlZChiZWFuKTsKLQkJCX0KLQkJCXJldHVybiByb2xlTWV0aG9kTmFtZXM7Ci0JCX0KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVSLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTGlzdCBhUm9sZU1ldGhvZE5hbWVzID0gZ2V0Um9sZU1ldGhvZE5hbWVzKHZjLCBiZWFuKTsKLQkJaWYoYVJvbGVNZXRob2ROYW1lcyAhPSBudWxsICYmICFhUm9sZU1ldGhvZE5hbWVzLmlzRW1wdHkoKSkKLQkJICByZXR1cm4gYVJvbGVNZXRob2ROYW1lcy5jb250YWlucyhtZXRob2QuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgZmllbGRzIChpLmUuLCBudWxsKSwgYW5kIGZpZWxkcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBmb2xsb3dpbmcgY2FsbCBjaGVja3MgaWYgdGhlIHR5cGUgcmVmbGVjdGVkIHByb3Blcmx5Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCkpOwotCi0JCWlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGNhbiwgYW5kIHNob3VsZCwgYmUgdmFsaWRhdGVkLgotCSAqIEZpbHRlciBvdXQgZmF1bHR5IG1ldGhvZHMgKGkuZS4sIG51bGwpLCBhbmQgbWV0aG9kcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWN0dWFsbHkgZG9lcyB0aGUgdmFsaWRhdGlvbi4gU2luY2UgbWFueSBvZiB0aGUgY2xhc3NlcyBkbwotCSAqIG5vdCB2YWxpZGF0ZSBmaWVsZHMgbm93LCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgYSBuby1vcCBzbyB0aGF0IHRoZQotCSAqIGNsYXNzZXMgY29tcGlsZS4gCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIHRoZSBhY3R1YWwgY2hlY2tpbmcgKGlmIGVqYk1ldGhvZCBleGlzdHMpLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eik7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eik7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbkVycm9yKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIHsKLQkJdmMucmVtb3ZlTWVzc2FnZXMoY2xhenopOwotCQotCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW117Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZmxlY3Rpb25XYXJuaW5nKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJLy8gT25lIG9mIHR3byBjYXNlcyB3aGVyZSB3ZSBjYXJlIGlmIHRoZSB0eXBlIGlzIG9uIHRoaXMgY2xhc3Mgb3Igbm90IChpLmUuLCBub3QgbGVhdmluZyBpdCB1cCB0byBNZXNzYWdlVXRpbGl0eSkKLQkJU3RyaW5nW10gbXNnUGFybSA9IG51bGw7Ci0JCVN0cmluZyBqYXZhQ2xhc3NOYW1lID0gKGUuZ2V0SmF2YUNsYXNzKCkgPT0gbnVsbCkgPyAiPyIgOiBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkub25DbGFzcyhjbGF6eiwgZmllbGQpKSB7Ci0JCQltc2dQYXJtID0gbmV3IFN0cmluZ1tdIHtTdHJpbmcudmFsdWVPZihmaWVsZC5nZXROYW1lKCkpLCBTdHJpbmcudmFsdWVPZihqYXZhQ2xhc3NOYW1lKX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQltc2dQYXJtID0gbmV3IFN0cmluZ1tdIHtqYXZhQ2xhc3NOYW1lfTsgLy8gTWVzc2FnZVV0aWxpdHkgd2lsbCBzdWJzdGl0dXRlIGluIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotCQl9Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIG1zZ1Bhcm0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWZsZWN0aW9uV2FybmluZyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJLy8gT25lIG9mIHR3byBjYXNlcyB3aGVyZSB3ZSBjYXJlIGlmIHRoZSB0eXBlIGlzIG9uIHRoaXMgY2xhc3Mgb3Igbm90IChpLmUuLCBub3QgbGVhdmluZyBpdCB1cCB0byBNZXNzYWdlVXRpbGl0eSkKLQkJU3RyaW5nW10gbXNnUGFybSA9IG51bGw7Ci0JCVN0cmluZyBqYXZhQ2xhc3NOYW1lID0gKGUuZ2V0SmF2YUNsYXNzKCkgPT0gbnVsbCkgPyAiPyIgOiBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkub25DbGFzcyhjbGF6eiwgbWV0aG9kKSkgewotCQkJbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7bWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSwgamF2YUNsYXNzTmFtZX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQltc2dQYXJtID0gbmV3IFN0cmluZ1tdIHtqYXZhQ2xhc3NOYW1lfTsgLy8gTWVzc2FnZVV0aWxpdHkgd2lsbCBzdWJzdGl0dXRlIGluIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotCQl9Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKXRhcmdldFBhcmVudDsKLQkJSmF2YUNsYXNzIGNsYXp6ID0gKEphdmFDbGFzcyl0YXJnZXQ7Ci0JCQotCQl0cnkgewotCQkJLy8gY2hlY2sgaWYgYWxsIG9mIHRoZSB0eXBlcyBpbiB0aGUgYmVhbiByZWZsZWN0ZWQgcHJvcGVybHkKLQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBjbGF6eik7Ci0JCQkKLQkJCXZjLnN1YnRhc2soSUVKQlZhbGlkYXRvckNvbnN0YW50cy5TVEFUVVNfVkFMSURBVElORywgbmV3IFN0cmluZ1tde2NsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0pOwotCQkJdmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCQkJdmFsaWRhdGVNZXRob2RzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQl2YWxpZGF0ZUZpZWxkcyh2YywgYmVhbiwgY2xhenopOwotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZWZsZWN0aW9uRXJyb3IodmMsIGJlYW4sIGNsYXp6KTsKLQkJCXJldHVybjsKLQkJfQotCQljYXRjaChNZXNzYWdlTGltaXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHRvIGF2b2lkIHZhbGlkYXRpbmcgYSBGaWVsZCBtb3JlCi0JICogdGhhbiBvbmNlLiAgVGhpcyBpcyBub3QgdXNlZCBmb3IgY2hlY2tpbmcgdGhlIGV4aXN0ZW5jZSBvZiBhIGZpZWxkLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChpc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGZpZWxkc0V4dGVuZGVkTGlzdCkpIHsKLQkJCXByaW1WYWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHRvIGF2b2lkIHZhbGlkYXRpbmcgYSBNZXRob2QgbW9yZQotCSAqIHRoYW4gb25jZS4gIFRoaXMgaXMgbm90IHVzZWQgZm9yIGNoZWNraW5nIHRoZSBleGlzdGVuY2Ugb2YgYSBtZXRob2QuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpKSB7Ci0JCQlwcmltVmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQl9Ci0JfQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpKSB7Ci0JCQlwcmltVmFsaWRhdGVFeGlzdGVuY2UodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVGaWVsZHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopICB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBXaGVuZXZlciBsb29waW5nIG92ZXIgYW4gZW50aXJlIGxpc3QsIGFsd2F5cyB1c2UgYW4gCi0JCS8vIGl0ZXJhdG9yIGluc3RlYWQgb2YgYSBmb3IgbG9vcCwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIAotCQkvLyBJZiB0aGUgbGlzdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGxpbmtlZCBsaXN0LCBmb3IgZXhhbXBsZSwKLQkJLy8gdGhlIGdldChpKSBjYWxsIGNhbiB0YWtlICBhIGxvbmcgdGltZS4gCi0JCUxpc3QgZmllbGRzID0gY2xhenouZ2V0RmllbGRzRXh0ZW5kZWQoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWVsZHMuaXRlcmF0b3IoKTsKLQkJRmllbGQgZmllbGQgPSBudWxsOwotCQlMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0ID0gZ2V0RmllbGRzRXh0ZW5kZWQodmMsIGJlYW4sIGNsYXp6KTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCWZpZWxkID0gKEZpZWxkKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiQVZhbGlkYXRlRUpCLnZhbGlkYXRlRmllbGRzKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJBIGZpZWxkIGlzIG51bGwgb24gIiArIGNsYXp6KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGZpZWxkLCBmaWVsZHNFeHRlbmRlZExpc3QpOwotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVmbGVjdGlvbldhcm5pbmcodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZSk7Ci0JCQl9Ci0JCX0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIG1ldGhvZCBpcyBSTUkgbGVnYWwuCi0JICogVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogZm9yIFJNSS9JSU9QLCBhbmQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFdpdGhvdXRFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gbWV0aG9kIGlzIFJNSSBsZWdhbC4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiBmb3IgUk1JL0lJT1AsIGFuZCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSmF2YVBhcmFtZXRlcltdIGFyZ3MgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMZWdhbFJNSV9JSU9QVHlwZShiZWFuLCBhcmdzW2ldLmdldEphdmFUeXBlKCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2FyZ3NbaV0uZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gbWV0aG9kIGlzIFJNSSBsZWdhbC4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiBmb3IgUk1JL0lJT1AsIGFuZCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTGVnYWxSTUlNZXRob2RFeGNlcHRpb25zKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c1JlbW90ZUV4Y2VwdGlvbk9yUGFyZW50KGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117SVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URUVYQ0VQVElPTn0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gbWV0aG9kIGlzIFJNSSBsZWdhbCwgYnV0IGRvZXNuJ3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMuCi0JICogVGhpcyBtZWFucyB0aGF0IHRoZSBtZXRob2QncyBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqIGZvciBSTUkvSUlPUC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kUmV0dXJuVHlwZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMZWdhbFJNSV9JSU9QVHlwZShiZWFuLCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBtZXRob2QgaXMgUk1JIGxlZ2FsLCBidXQgZG9lc24ndCBjaGVjayB0aGUgZXhjZXB0aW9ucy4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1ldGhvZCdzIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogZm9yIFJNSS9JSU9QLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTGVnYWxSTUlNZXRob2RXaXRob3V0RXhjZXB0aW9ucyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kUmV0dXJuVHlwZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIEZpbmFsIGNoZWNrIHRvIHNlZSBpZiByZXF1aXJlZCBtZXRob2RzIHdlcmUgZGV0ZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb247Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVNZXRob2RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSAgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gV2hlbmV2ZXIgbG9vcGluZyBvdmVyIGFuIGVudGlyZSBsaXN0LCBhbHdheXMgdXNlIGFuIAotCQkvLyBpdGVyYXRvciBpbnN0ZWFkIG9mIGEgZm9yIGxvb3AsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiAKLQkJLy8gSWYgdGhlIGxpc3QgaXMgYW4gaW5zdGFuY2Ugb2YgYSBsaW5rZWQgbGlzdCwgZm9yIGV4YW1wbGUsCi0JCS8vIHRoZSBnZXQoaSkgY2FsbCBjYW4gdGFrZSAgYSBsb25nIHRpbWUuIAotCQlNZXRob2RbXSBlamJNZXRob2RzID0gY2xhenoubGlzdE1ldGhvZEV4dGVuZGVkKCk7Ci0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCA9IGdldE1ldGhvZHNFeHRlbmRlZCh2YywgYmVhbiwgY2xhenopOwotCQlmb3IoaW50IGk9MDsgaTxlamJNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJbWV0aG9kID0gZWpiTWV0aG9kc1tpXTsKLQkJCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJCS8vIE5vIHBvaW50IGFkZGluZyBhIHZhbGlkYXRpb24gbWVzc2FnZSwgYmVjYXVzZSB0aGUgdXNlciBjYW4ndCBkbyBhbnl0aGluZy4KLQkJCQkvLyBMb2cgdGhpcyBjb25kaXRpb24uCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJBVmFsaWRhdGVFSkIudmFsaWRhdGVNZXRob2RzKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJPbiAiICsgY2xhenogKyAiLCB0aGVyZSBpcyBhIG51bGwgbWV0aG9kLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRlRXhpc3RlbmNlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJCQl2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZWZsZWN0aW9uV2FybmluZyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgZSk7Ci0JCQl9Ci0JCX0KLQkJdmFsaWRhdGVNZXRob2RFeGlzdHModmMsIGJlYW4sIGNsYXp6KTsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5QmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkNTE4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKi8KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgZW50aXR5IGJlYW4gY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHBhcmFncmFwaCBpcyB0YWtlbiBmcm9tCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqIDkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBIDk0MzAzLCBVLlMuQS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICoKLSAqIEFsbCA5LjIuWCBzZWN0aW9ucyBkZXNjcmliZSBCTVAgcmVxdWlyZW1lbnRzLgotICogSWYgYSBDTVAgcmVxdWlyZW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gdGhlc2UsIHRoZW4gdGhlIGRpZmZlcmVuY2VzIGFyZQotICogZG9jdW1lbnRlZCBpbiA5LjQuWCBzZWN0aW9ucy4KLSAqCi0gKiA5LjEuNS4xIEVudGl0eSBiZWFuIGluc3RhbmNlJ3MgdmlldzogLi4uIFRoZSBlbnRpdHkgQmVhbiBQcm92aWRlciBpcyByZXNwb25zaWJsZQotICogICAgZm9yIGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzOi4uLgotICoKLSAqIDkuMi4yIEVudGVycHJpc2UgYmVhbiBjbGFzcwotICogICAtIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIGFuIGVudGl0eSBiZWFuIGNsYXNzOgotICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5FbnRpdHlCZWFuIGludGVyZmFjZS4KLSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGFzIHB1YmxpYyBhbmQgbXVzdCBub3QgYmUgYWJzdHJhY3QuCi0gKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZmluYWwuCi0gKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLgotICogICAgICAtIFRoZSBjbGFzcyBtdXN0IG5vdCBkZWZpbmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLgotICogICAtIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIFs5XS4gCi0gKiAgICAgSWYgdGhlIGNsYXNzIGltcGxlbWVudHMgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSwgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBuby1vcCAKLSAqICAgICBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuIFRoZSBjb250YWluZXIgCi0gKiAgICAgd2lsbCBuZXZlciBpbnZva2UgdGhlc2UgbWV0aG9kcyBvbiB0aGUgYmVhbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KLSAqICAgLSBBIG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgCi0gKiAgICAgZGVmaW5pbmcgdGhlIGVudGl0eSBiZWFuIGNsYXNzIGFzIGFic3RyYWN0LgotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgYW5kIHRoZSAKLSAqICAgICBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUsIGFuZCBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBhcyBkZXNjcmliZWQgCi0gKiAgICAgbGF0ZXIgaW4gdGhpcyBzZWN0aW9uLgotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gCi0gKiAgICAgSWYgdGhlIGVudGl0eSBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgCi0gKiAgICAgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMsIHRoZSBmaW5kZXIgbWV0aG9kcywgYW5kIHRoZQotICogICAgIG1ldGhvZHMgb2YgdGhlIEVudGl0eUJlYW4gaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgCi0gKiAgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBpcyBhbGxvd2VkIHRvIGltcGxlbWVudCBvdGhlciBtZXRob2RzIChmb3IgCi0gKiAgICAgZXhhbXBsZSBoZWxwZXIgbWV0aG9kcyBpbnZva2VkIGludGVybmFsbHkgYnkgdGhlIGJ1c2luZXNzIG1ldGhvZHMpIAotICogICAgIGluIGFkZGl0aW9uIHRvIHRoZSBtZXRob2RzIHJlcXVpcmVkIGJ5IHRoZSBFSkIgc3BlY2lmaWNhdGlvbi4KLSAqCi0gKiA5LjIuMyBlamJDcmVhdGUgbWV0aG9kcwotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0gKiAgICAgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0gKiAgICAgICAtIFRoZSBtZXRob2QgbmFtZSBtdXN0IGJlIGVqYkNyZWF0ZS4KLSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0gKiAgICAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGUuCi0gKiAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLSAqICAgICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0gKiAgICAgICAgIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLSAqICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgdG8gdGhyb3cgdGhlIAotICogICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotICogICAgICAgICBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotICogICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotICogICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICogICAtIFRoZSBlbnRpdHkgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIGEgdW5pcXVlIHByaW1hcnkga2V5LiAKLSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHByaW1hcnkga2V5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIHByaW1hcnkga2V5cyBvZiBhbGwgCi0gKiAgICAgdGhlIGV4aXN0aW5nIGVudGl0eSBvYmplY3RzIHdpdGhpbiB0aGUgc2FtZSBob21lLiBUaGUgZWpiQ3JlYXRlIG1ldGhvZCBzaG91bGQgCi0gKiAgICAgdGhyb3cgdGhlIER1cGxpY2F0ZUtleUV4Y2VwdGlvbiBvbiBhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhbiBlbnRpdHkgb2JqZWN0IHdpdGggCi0gKiAgICAgYSBkdXBsaWNhdGUgcHJpbWFyeSBrZXkuIEhvd2V2ZXIsIGl0IGlzIGxlZ2FsIHRvIHJldXNlIHRoZSBwcmltYXJ5IGtleSBvZiBhCi0gKiAgICAgcHJldmlvdXNseSByZW1vdmVkIGVudGl0eSBvYmplY3QuCi0gKgotICogOS4yLjQgZWpiUG9zdENyZWF0ZSBtZXRob2RzCi0gKiAgIC0gRm9yIGVhY2ggZWpiQ3JlYXRlKC4uLikgbWV0aG9kLCB0aGUgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBtYXRjaGluZyAKLSAqICAgICBlamJQb3N0Q3JlYXRlKC4uLikgbWV0aG9kLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICogICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiUG9zdENyZWF0ZS4KLSAqICAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0gKiAgICAgICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLSAqICAgICAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0gKiAgICAgICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50cyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSguLi4pIG1ldGhvZC4KLSAqICAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLSAqICAgICAgICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCB0byB0aHJvdyB0aGUgCi0gKiAgICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb250byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEKLSAqICAgICAgICAgIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLSAqICAgICAgICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0gKgotICogOS4yLjUgZWpiRmluZCBtZXRob2RzCi0gKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBhbHNvIGRlZmluZSBhZGRpdGlvbmFsIGVqYkZpbmQ8TUVUSE9EPiguLi4pIGZpbmRlciBtZXRob2RzLgotICogICAtIFRoZSBzaWduYXR1cmVzIG9mIHRoZSBmaW5kZXIgbWV0aG9kcyBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICogICAtIEEgZmluZGVyIG1ldGhvZCBuYW1lIG11c3Qgc3RhcnQgd2l0aCB0aGUgcHJlZml4ICJlamJGaW5kIiAKLSAqICAgICAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotICogICAtIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLSAqICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLSAqICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotICogICAtIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLSAqICAgICBvciBhIGNvbGxlY3Rpb24gb2YgcHJpbWFyeSBrZXlzIChzZWUgU2VjdGlvbiBTdWJzZWN0aW9uIDkuMS44KS4KLSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCBpbmNsdWRpbmcgCi0gKiAgICAgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uCi0gKiAgIC0gRXZlcnkgZW50aXR5IGJlYW4gbXVzdCBkZWZpbmUgdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiBUaGUgcmVzdWx0IHR5cGUgZm9yIAotICogICAgIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0gKiAgICAgYmUgYSBzaW5nbGUtb2JqZWN0IGZpbmRlcikuCi0gKiAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGZpbmRlciBtZXRob2RzIHRvIHRocm93IHRoZSAKLSAqICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLSAqICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0gKiAgICAgc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLSAqICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICoKLSAqIDkuMi42IEJ1c2luZXNzIG1ldGhvZHMKLSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGRlZmluZSB6ZXJvIG9yIG1vcmUgYnVzaW5lc3MgbWV0aG9kcyB3aG9zZSBzaWduYXR1cmVzIAotICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotICogICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICdlamInIHRvIAotICogICAgICAgICAgYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLSAqICAgICAgICAtIFRoZSBidXNpbmVzcyBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0gKiAgICAgICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLSAqICAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLSAqICAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMuCi0gKiAgICAgICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgYnVzaW5lc3MgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0gKiAgICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotICogICAgICAgICAgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiAKLSAqICAgICAgICAgIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0gKiAgICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICouLi4KLSAqIDkuMi45IEVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MKLSAqLi4uCi0gKiAgLSBUaGUgcHJpbWFyeSBrZXkgdHlwZSBtdXN0IGJlIGEgbGVnYWwgVmFsdWUgVHlwZSBpbiBSTUktSUlPUC4KLSAqLi4uCi0gKgotICogOS40LjEgQ29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0gKi4uLgotICogICAtIFRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGVuc3VyZSB0aGF0IGFuIGVudGl0eSBiZWFuIGNhbiBiZSBkZXBsb3llZCBpbiBhbnkgCi0gKiAgICAgY29tcGxpYW50IGNvbnRhaW5lci4KLSAqICAgICAgICAtIFRoZSBCZWFuIFByb3ZpZGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdHlwZXMgCi0gKiAgICAgICAgICBhc3NpZ25lZCB0byB0aGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIGFyZSByZXN0cmljdGVkIHRvIHRoZSBmb2xsb3dpbmc6IAotICogICAgICAgICAgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBwcmltaXRpdmUgdHlwZXMsIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgCi0gKiAgICAgICAgICBzZXJpYWxpemFibGUgdHlwZXMsIGFuZCByZWZlcmVuY2VzIG9mIGVudGVycHJpc2UgYmVhbnMnIHJlbW90ZSBvciBob21lIAotICogICAgICAgICAgaW50ZXJmYWNlcy4KLSAqICAgICAgICAtIFRoZSBDb250YWluZXIgUHJvdmlkZXIgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCB1c2UgSmF2YSBwcm9ncmFtbWluZyAKLSAqICAgICAgICAgIGxhbmd1YWdlIFNlcmlhbGl6YXRpb24gdG8gc3RvcmUgdGhlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcyBpbiB0aGUgZGF0YWJhc2UuIAotICogICAgICAgICAgSWYgdGhlIGNvbnRhaW5lciBjaG9vc2VzIGEgZGlmZmVyZW50IGFwcHJvYWNoLCB0aGUgZWZmZWN0IHNob3VsZCBiZSBlcXVpdmFsZW50IAotICogICAgICAgICAgdG8gdGhhdCBvZiBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIFNlcmlhbGl6YXRpb24uIFRoZSBDb250YWluZXIgbXVzdCBhbHNvIGJlIAotICogICAgICAgICAgY2FwYWJsZSBvZiBwZXJzaXN0aW5nIHJlZmVyZW5jZXMgdG8gZW50ZXJwcmlzZSBiZWFucycgcmVtb3RlIGFuZCBob21lIGludGVyZmFjZXMgCi0gKiAgICAgICAgICAoZm9yIGV4YW1wbGUsIGJ5IHN0b3JpbmcgdGhlaXIgaGFuZGxlIG9yIHByaW1hcnkga2V5KS4KLSAqLi4uCi0gKgotICogOS40LjIgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlCi0gKi4uLgotICogICAtIFRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHByaW1hcnkga2V5IGNsYXNzIHR5cGUuIAotICogICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZWpiQ3JlYXRlKC4uLikgbWV0aG9kcyBzaG91bGQgYmUgY29kZWQgdG8gcmV0dXJuIGEgbnVsbC4gCi0gKiAgICAgVGhlIHJldHVybmVkIHZhbHVlIGlzIGlnbm9yZWQgYnkgdGhlIENvbnRhaW5lci4KLSAqLi4uCi0gKgotICogOS40LjYgZmluZGVyIG1ldGhvZHMKLSAqICAgLSBUaGUgZW50aXR5IEJlYW4gUHJvdmlkZXIgZG9lcyBub3Qgd3JpdGUgdGhlIGZpbmRlciAoZWpiRmluZDxNRVRIT0Q+KC4uLikpIG1ldGhvZHMuCi0gKi4uLgotICogOS40LjcgcHJpbWFyeSBrZXkgdHlwZQotICogICAtIFRoZSBjb250YWluZXIgbXVzdCBiZSBhYmxlIHRvIG1hbmlwdWxhdGUgdGhlIHByaW1hcnkga2V5IHR5cGUuIFRoZXJlZm9yZSwgCi0gKiAgICAgdGhlIHByaW1hcnkga2V5IHR5cGUgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UgCi0gKiAgICAgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGluIHRoaXMgc3Vic2VjdGlvbiwgaW4gYWRkaXRpb24gdG8gdGhvc2Ugc3BlY2lmaWVkIGluIAotICogICAgIFN1YnNlY3Rpb24gOS4yLjkuCi0gKgotICogICAgIFRoZXJlIGFyZSB0d28gd2F5cyB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY2xhc3MgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2U6Ci0gKiAgICAgICAgLSBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gYSBzaW5nbGUgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzLgotICogICAgICAgIC0gUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcyBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuCi0gKiAgICAgVGhlIHNlY29uZCBtZXRob2QgaXMgbmVjZXNzYXJ5IGZvciBpbXBsZW1lbnRpbmcgY29tcG91bmQga2V5cywgYW5kIHRoZSBmaXJzdCBtZXRob2QgaXMgY29udmVuaWVudCBmb3IKLSAqICAgICBzaW5nbGUtZmllbGQga2V5cy4gV2l0aG91dCB0aGUgZmlyc3QgbWV0aG9kLCBzaW1wbGUgdHlwZXMgc3VjaCBhcyBTdHJpbmcgd291bGQgaGF2ZSB0byBiZSB3cmFwcGVkIGluIGEKLSAqICAgICB1c2VyLWRlZmluZWQgY2xhc3MuCi0gKiAKLSAqICAgICA5LjQuNy4xIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBhIHNpbmdsZSBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MKLSAqICAgICBUaGUgQmVhbiBQcm92aWRlciB1c2VzIHRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byBzcGVjaWZ5IHRoZQotICogICAgIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkIG9mIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBwcmltYXJ5IGtleS4gVGhlIGZpZWxkJ3MgdHlwZSBtdXN0IGJlCi0gKiAgICAgdGhlIHByaW1hcnkga2V5IHR5cGUuCi0gKgotICogICAgIDkuNC43LjIgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcyBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MKLSAqICAgICBUaGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZCBtdXN0IGhhdmUgYSBwdWJsaWMgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXJzLgotICogICAgIEFsbCBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotICogICAgIFRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiB0aGUgY29udGFpbmVyLW1hbmFnZWQKLSAqICAgICBmaWVsZHMuIChUaGlzIGFsbG93cyB0aGUgY29udGFpbmVyIHRvIGV4dHJhY3QgdGhlIHByaW1hcnkga2V5IGZpZWxkcyBmcm9tIGFuIGluc3RhbmNlJ3MgY29udGFpbmVyLW1hbmFnZWQKLSAqICAgICBmaWVsZHMsIGFuZCB2aWNlIHZlcnNhLikKLSAqCi0gKiAgICAgOS40LjcuMyBTcGVjaWFsIGNhc2U6IFVua25vd24gcHJpbWFyeSBrZXkgY2xhc3MKLSAqICAgICBJbiBzcGVjaWFsIHNpdHVhdGlvbnMsIHRoZSBlbnRpdHkgQmVhbiBQcm92aWRlciBtYXkgY2hvb3NlIG5vdCB0byBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBjbGFzcyBmb3IgYW4KLSAqICAgICBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiBUaGlzIGNhc2UgdXN1YWxseSBoYXBwZW5zIHdoZW4gdGhlIGVudGl0eSBiZWFuIGRvZXMKLSAqICAgICBub3QgaGF2ZSBhIG5hdHVyYWwgcHJpbWFyeSBrZXksIGFuZCB0aGUgQmVhbiBQcm92aWRlciB3YW50cyB0byBhbGxvdyB0aGUgRGVwbG95ZXIgdG8gc2VsZWN0IHRoZSBwcmltYXJ5Ci0gKiAgICAga2V5IGZpZWxkcyBhdCBkZXBsb3ltZW50IHRpbWUuIFRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGUgd2lsbCB1c3VhbGx5IGJlIGRlcml2ZWQgZnJvbSB0aGUgcHJpbWFyeQotICogICAgIGtleSB0eXBlIHVzZWQgYnkgdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugc3lzdGVtIHRoYXQgc3RvcmVzIHRoZSBlbnRpdHkgb2JqZWN0cy4gVGhlIHByaW1hcnkga2V5Ci0gKiAgICAgdXNlZCBieSB0aGUgZGF0YWJhc2Ugc3lzdGVtIG1heSBub3QgYmUga25vd24gdG8gdGhlIEJlYW4gUHJvdmlkZXIuCi0gKiAgICAgV2hlbiBkZWZpbmluZyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4sIHRoZSBEZXBsb3llciBtYXkgc29tZXRpbWVzIG5lZWQgdG8gc3ViY2xhc3MKLSAqICAgICB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdG8gYWRkIGFkZGl0aW9uYWwgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzICh0aGlzIHR5cGljYWxseSBoYXBwZW5zIGZvciBlbnRpdHkgYmVhbnMKLSAqICAgICB0aGF0IGRvIG5vdCBoYXZlIGEgbmF0dXJhbCBwcmltYXJ5IGtleSwgYW5kIHRoZSBwcmltYXJ5IGtleXMgYXJlIHN5c3RlbS1nZW5lcmF0ZWQgYnkgdGhlIHVuZGVybHlpbmcKLSAqICAgICBkYXRhYmFzZSBzeXN0ZW0gdGhhdCBzdG9yZXMgdGhlIGVudGl0eSBvYmplY3RzKS4KLSAqICAgICBJbiB0aGlzIHNwZWNpYWwgY2FzZSwgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IG9mIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzCi0gKiAgICAgamF2YS5sYW5nLk9iamVjdCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgb2YgZWpiQ3JlYXRlKCkgbXVzdCBiZSBkZWNsYXJlZCBhcwotICogICAgIGphdmEubGFuZy5PYmplY3QuIFRoZSBCZWFuIFByb3ZpZGVyIG11c3Qgc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaW4gdGhlIGRlcGxveW1lbnQKLSAqICAgICBkZXNjcmlwdG9yIGFzIG9mIHRoZSB0eXBlIGphdmEubGFuZy5PYmplY3QuCi0gKiAgICAgVGhlIHByaW1hcnkga2V5IGNsYXNzIGlzIHNwZWNpZmllZCBhdCBkZXBsb3ltZW50IHRpbWUgaW4gdGhlIHNpdHVhdGlvbnMgd2hlbiB0aGUgQmVhbiBQcm92aWRlciBkZXZlbG9wcwotICogICAgIGFuIGVudGl0eSBiZWFuIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIG11bHRpcGxlIGJhY2stZW5kcyB0aGF0IHByb3ZpZGUgcGVyc2lzdGVuY2UsIGFuZCB3aGVuCi0gKiAgICAgdGhlc2UgbXVsdGlwbGUgYmFjay1lbmRzIHJlcXVpcmUgZGlmZmVyZW50IHByaW1hcnkga2V5IHN0cnVjdHVyZXMuCi0gKiAgICAgVXNlIG9mIGVudGl0eSBiZWFucyB3aXRoIGEgZGVmZXJyZWQgcHJpbWFyeSBrZXkgdHlwZSBzcGVjaWZpY2F0aW9uIGxpbWl0cyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHByb2dyYW1taW5nCi0gKiAgICAgbW9kZWwsIGJlY2F1c2UgdGhlIGNsaWVudHMgd3JpdHRlbiBwcmlvciB0byBkZXBsb3ltZW50IG9mIHRoZSBlbnRpdHkgYmVhbiBtYXkgbm90IHVzZSwgaW4gZ2VuZXJhbCwKLSAqICAgICB0aGUgbWV0aG9kcyB0aGF0IHJlbHkgb24gdGhlIGtub3dsZWRnZSBvZiB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLSAqICAgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBtZXRob2RzIG11c3QgYmUgZG9uZSBjYXJlZnVsbHkuIEZvciBleGFtcGxlLCB0aGUgbWV0aC1vZHMKLSAqICAgICBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20gRW50aXR5Q29udGV4dC5nZXRQcmltYXJ5S2V5KCksIGJlY2F1c2UKLSAqICAgICB0aGUgcmV0dXJuIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgRGVwbG95ZXIgYWZ0ZXIgdGhlIEVKQiBjbGFzcyBoYXMgYmVlbiB3cml0dGVuLgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZUVudGl0eUJlYW4gZXh0ZW5kcyBBVmFsaWRhdGVCZWFuIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBWF9FSkJfRU5USVRZQkVBTiA9ICJqYXZheC5lamIuRW50aXR5QmVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBTRVRFTlRJVFlDT05URVhUID0gInNldEVudGl0eUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5TRVRFTlRJVFlDT05URVhUID0gInVuc2V0RW50aXR5Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFSkJMT0FEID0gImVqYkxvYWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCU1RPUkUgPSAiZWpiU3RvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQVhfRUpCX0VOVElUWUNPTlRFWFQgPSAiamF2YXguZWpiLkVudGl0eUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGhhc1ZhbGlkQ29uc3RydWN0b3IgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzQUNvbnN0cnVjdG9yID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc1NldEVudGl0eUNvbnRleHQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzVW5zZXRFbnRpdHlDb250ZXh0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0VqYkFjdGl2YXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0VqYlBhc3NpdmF0ZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNFamJSZW1vdmUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRWpiTG9hZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNFamJTdG9yZSA9IGZhbHNlOwotCi0JLyoqCi0JICogR2l2ZW4gYSBiZWFuJ3MgZWpiRmluZCBtZXRob2QsIHJldHVybiB0aGUgbWF0Y2hpbmcgZmluZCBtZXRob2QgZnJvbQotCSAqIHRoZSBob21lLCBpZiBpdCBleGlzdHMuIElmIG5vdCwgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRNYXRjaGluZ0hvbWVGaW5kTWV0aG9kRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpLCBtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRklORCk7Ci0JfQotCS8qKgotCSAqIGdldFBhcmVudE5hbWUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCQlyZXR1cm4gSkFWQVhfRUpCX0VOVElUWUJFQU47Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRnJhbWV3b3JrTWV0aG9kKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChzdXBlci5pc0ZyYW1ld29ya01ldGhvZChuYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gY2hlY2sgZm9yIGVudGl0eS1zcGVjaWZpYyBtZXRob2RzCi0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkxPQUQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJTVE9SRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9VTlNFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIG1ldGhvZHMgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIGZvbGxvdyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbiwKLQkgKiBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gbWlzc2luZyByZXF1aXJlZCBtZXRob2RzLgotCSAqCi0JICogOS4yLjIgRW50ZXJwcmlzZSBiZWFuIGNsYXNzCi0JICouLi4KLQkgKiAgIC0gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgYW4gZW50aXR5IGJlYW4gY2xhc3M6Ci0JICouLi4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBub3QgZGVmaW5lIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4KLQkgKi4uLgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1c2luZXNzIG1ldGhvZHMsIGFuZCB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSwgYW5kIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGFzIGRlc2NyaWJlZCAKLQkgKiAgICAgbGF0ZXIgaW4gdGhpcyBzZWN0aW9uLgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIAotCSAqICAgICBJZiB0aGUgZW50aXR5IGJlYW4gaGFzIHN1cGVyY2xhc3NlcywgdGhlIGJ1c2luZXNzIG1ldGhvZHMsIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMsIHRoZSBmaW5kZXIgbWV0aG9kcywgYW5kIHRoZQotCSAqICAgICBtZXRob2RzIG9mIHRoZSBFbnRpdHlCZWFuIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIAotCSAqICAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3IgaW4gYW55IG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBpcyBhbGxvd2VkIHRvIGltcGxlbWVudCBvdGhlciBtZXRob2RzIChmb3IgCi0JICogICAgIGV4YW1wbGUgaGVscGVyIG1ldGhvZHMgaW52b2tlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidXNpbmVzcyBtZXRob2RzKSAKLQkgKiAgICAgaW4gYWRkaXRpb24gdG8gdGhlIG1ldGhvZHMgcmVxdWlyZWQgYnkgdGhlIEVKQiBzcGVjaWZpY2F0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci5wcmltVmFsaWRhdGUoZWpiTWV0aG9kKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCVN0cmluZyBuYW1lID0gZWpiTWV0aG9kLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSkpCi0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpKQotCQkJdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKQotCQkJdmFsaWRhdGVGaW5hbGl6ZSh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCWVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkZJTkQpKQotCQkJdmFsaWRhdGVFamJGaW5kTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZSBpZiAoaXNCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCkpCi0JCQl2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZQotCQkJdmFsaWRhdGVIZWxwZXJNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlTdHJpbmcgbmFtZSA9IGVqYk1ldGhvZC5nZXROYW1lKCk7Ci0JCWlmICghaGFzU2V0RW50aXR5Q29udGV4dCAmJiBuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9TRVRFTlRJVFlDT05URVhUKSkgewotCQkJSmF2YVBhcmFtZXRlcltdIHBhcmFtcyA9IGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJCWlmIChwYXJhbXMubGVuZ3RoID09IDEpIHsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocGFyYW1zWzBdLmdldEphdmFUeXBlKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQ09OVEVYVCwgYmVhbikpKSB7Ci0JCQkJCWhhc1NldEVudGl0eUNvbnRleHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzVW5zZXRFbnRpdHlDb250ZXh0ICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1VOU0VURU5USVRZQ09OVEVYVCkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNVbnNldEVudGl0eUNvbnRleHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNFamJBY3RpdmF0ZSAmJiBuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJBQ1RJVkFURSkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNFamJBY3RpdmF0ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIWhhc0VqYlBhc3NpdmF0ZSAmJiBuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQQVNTSVZBVEUpKSB7Ci0JCQlpZiAoZWpiTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJaGFzRWpiUGFzc2l2YXRlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzRWpiUmVtb3ZlICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlJFTU9WRSkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNFamJSZW1vdmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNFamJMb2FkICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkxPQUQpKSB7Ci0JCQlpZiAoZWpiTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJaGFzRWpiTG9hZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIWhhc0VqYlN0b3JlICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlNUT1JFKSkgewotCQkJaWYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCWhhc0VqYlN0b3JlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzVmFsaWRDb25zdHJ1Y3RvciAmJiBlamJNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQloYXNBQ29uc3RydWN0b3IgPSB0cnVlOwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhlamJNZXRob2QpICYmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApKSB7Ci0JCQkJaGFzVmFsaWRDb25zdHJ1Y3RvciA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JfQotCQotCS8qKgotCSAqIDkuMi42IEJ1c2luZXNzIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGJ1c2luZXNzIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyAKLQkgKiAgICAgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0JICogICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICdlamInIHRvIAotCSAqICAgICAgICAgIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0JICogICAgICAgIC0gVGhlIGJ1c2luZXNzIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgICAgICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAgICAgICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JICogICAgICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucy4KLQkgKiAgICAgICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgYnVzaW5lc3MgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JICogICAgICAgICAgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyAKLQkgKiAgICAgICAgICBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotCSAqICAgICAgICAgIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JICogICAgICAgICAgdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlzdXBlci52YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsgLy8gbWFrZSBzdXJlIHRoYXQgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICdlamInCi0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2J1cywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTBfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDlfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFdpdGhvdXRFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLgotCQkvLyBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgYnVzaW5lc3MgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JCS8vIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgCi0JCS8vIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JCS8vIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JCS8vIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24iIGFib3ZlCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfYnVzKTsKLQl9Ci0JCi0JLyoqCi0JICogOS4yLjIgRW50ZXJwcmlzZSBiZWFuIGNsYXNzCi0JICogICAtIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIGFuIGVudGl0eSBiZWFuIGNsYXNzOgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuRW50aXR5QmVhbiBpbnRlcmZhY2UuCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGJlIGRlZmluZWQgYXMgcHVibGljIGFuZCBtdXN0IG5vdCBiZSBhYnN0cmFjdC4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZmluYWwuCi0JICouLi4KLQkgKiAgIC0gVGhlIGNsYXNzIG1heSwgYnV0IGlzIG5vdCByZXF1aXJlZCB0bywgaW1wbGVtZW50IHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgWzldLiAKLQkgKiAgICAgSWYgdGhlIGNsYXNzIGltcGxlbWVudHMgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSwgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBuby1vcCAKLQkgKiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGphdmF4LmVqYi5FSkJPYmplY3QgaW50ZXJmYWNlLiBUaGUgY29udGFpbmVyIAotCSAqICAgICB3aWxsIG5ldmVyIGludm9rZSB0aGVzZSBtZXRob2RzIG9uIHRoZSBiZWFuIGluc3RhbmNlcyBhdCBydW50aW1lLgotCSAqICAgLSBBIG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgCi0JICogICAgIGRlZmluaW5nIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBhcyBhYnN0cmFjdC4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBidXNpbmVzcyBtZXRob2RzLCBhbmQgdGhlIAotCSAqICAgICBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUsIGFuZCBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBhcyBkZXNjcmliZWQgCi0JICogICAgIGxhdGVyIGluIHRoaXMgc2VjdGlvbi4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBoYXZlIHN1cGVyY2xhc3NlcyBhbmQvb3Igc3VwZXJpbnRlcmZhY2VzLiAKLQkgKiAgICAgSWYgdGhlIGVudGl0eSBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzLCB0aGUgZmluZGVyIG1ldGhvZHMsIGFuZCB0aGUKLQkgKiAgICAgbWV0aG9kcyBvZiB0aGUgRW50aXR5QmVhbiBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGluIHRoZSAKLQkgKiAgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgaXMgYWxsb3dlZCB0byBpbXBsZW1lbnQgb3RoZXIgbWV0aG9kcyAoZm9yIAotCSAqICAgICBleGFtcGxlIGhlbHBlciBtZXRob2RzIGludm9rZWQgaW50ZXJuYWxseSBieSB0aGUgYnVzaW5lc3MgbWV0aG9kcykgCi0JICogICAgIGluIGFkZGl0aW9uIHRvIHRoZSBtZXRob2RzIHJlcXVpcmVkIGJ5IHRoZSBFSkIgc3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQWxsIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBWYWxpZGF0ZUJlYW4uCi0JCXN1cGVyLnZhbGlkYXRlQ2xhc3ModmMsIGJlYW4sIGNsYXp6KTsKLQotCQkvLyBQbHVzLCBjaGVjayB0aGF0IGF0IGxlYXN0IG9uZSBmaWVsZCBleGlzdHMgb24gdGhlIGJlYW4uCi0JCXZlcmlmeUZpZWxkRXhpc3RzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIDkuMi4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0JICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiQ3JlYXRlLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgICAgIC0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZS4KLQkgKiAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkgKiAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCSAqICAgICAgICAgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCSAqICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgdG8gdGhyb3cgdGhlIAotCSAqICAgICAgICAgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyAKLQkgKiAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICAgICAgdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKiAgIC0gVGhlIGVudGl0eSBvYmplY3QgY3JlYXRlZCBieSB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgYSB1bmlxdWUgcHJpbWFyeSBrZXkuIAotCSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHByaW1hcnkga2V5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIHByaW1hcnkga2V5cyBvZiBhbGwgCi0JICogICAgIHRoZSBleGlzdGluZyBlbnRpdHkgb2JqZWN0cyB3aXRoaW4gdGhlIHNhbWUgaG9tZS4gVGhlIGVqYkNyZWF0ZSBtZXRob2Qgc2hvdWxkIAotCSAqICAgICB0aHJvdyB0aGUgRHVwbGljYXRlS2V5RXhjZXB0aW9uIG9uIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGVudGl0eSBvYmplY3Qgd2l0aCAKLQkgKiAgICAgYSBkdXBsaWNhdGUgcHJpbWFyeSBrZXkuIEhvd2V2ZXIsIGl0IGlzIGxlZ2FsIHRvIHJldXNlIHRoZSBwcmltYXJ5IGtleSBvZiBhCi0JICogICAgIHByZXZpb3VzbHkgcmVtb3ZlZCBlbnRpdHkgb2JqZWN0LgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICouLi4KLQkgKgotCSAqIDkuNC4yIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZQotCSAqLi4uCi0JICogICAtIFRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHByaW1hcnkga2V5IGNsYXNzIHR5cGUuIAotCSAqICAgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgc2hvdWxkIGJlIGNvZGVkIHRvIHJldHVybiBhIG51bGwuIAotCSAqICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaWdub3JlZCBieSB0aGUgQ29udGFpbmVyLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IHRlc3RlZCB0aGF0IHRoZSBtZXRob2QgbmFtZSBpcyBlamJDcmVhdGUuCi0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDhfZWpiQ3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMF9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCQkvLyBCdXQgaWYgdGhlIGJlYW4gdXNlcyBqYXZhLmxhbmcuT2JqZWN0IGZvciBhIGtleSwgZG9uJ3QgY2hlY2sgaWYgaXQncyBzZXJpYWxpemFibGUuCi0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoYmVhbikpIHsKLQkJCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFdpdGhvdXRFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQkKLQkJCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGU7IHVubGVzcyB0aGlzIGlzCi0JCS8vIGEgQ01QLCBhbmQgYW4gdW5rb253biBwcmltYXJ5IGtleSBjbGFzcyBpcyB1c2VkLiBSZWFkIHNlY3Rpb24gOS40LjcuMy4KLQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2Rfa2V5RGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCAKLQkJLy8gaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQkvLyBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgdG8gdGhyb3cgCi0JCS8vIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLQkJLy8gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSAKLQkJLy8gYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciAKLQkJLy8gamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIAotCQkvLyBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfZWpiQ3JlYXRlKTsKLQotCQkvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhIG1hdGNoaW5nIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvciB0aGlzIGVqYkNyZWF0ZSBtZXRob2QuCi0JCU1ldGhvZCBlamJQb3N0Q3JlYXRlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGNsYXp6LCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQT1NUQ1JFQVRFLCBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkpOwotCQlpZiAoZWpiUG9zdENyZWF0ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBDaGVjayBmb3IgYSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9uIHRoZSBob21lLCBhbmQgdGhhdCB0aGUgZXhjZXB0aW9ucyBvbgotCQkvLyB0aGlzIG1ldGhvZCBhcmUgYSBzdWJzZXQgb2YgdGhlIGV4Y2VwdGlvbnMgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBvbiB0aGUgaG9tZS4KLQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2RfaG9tZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIDkuMi4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0JICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiQ3JlYXRlLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgICAgIC0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZS4KLQkgKiAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkgKiAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCSAqICAgICAgICAgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCSAqICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgdG8gdGhyb3cgdGhlIAotCSAqICAgICAgICAgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyAKLQkgKiAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICAgICAgdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKiAgIC0gVGhlIGVudGl0eSBvYmplY3QgY3JlYXRlZCBieSB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgYSB1bmlxdWUgcHJpbWFyeSBrZXkuIAotCSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHByaW1hcnkga2V5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIHByaW1hcnkga2V5cyBvZiBhbGwgCi0JICogICAgIHRoZSBleGlzdGluZyBlbnRpdHkgb2JqZWN0cyB3aXRoaW4gdGhlIHNhbWUgaG9tZS4gVGhlIGVqYkNyZWF0ZSBtZXRob2Qgc2hvdWxkIAotCSAqICAgICB0aHJvdyB0aGUgRHVwbGljYXRlS2V5RXhjZXB0aW9uIG9uIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGVudGl0eSBvYmplY3Qgd2l0aCAKLQkgKiAgICAgYSBkdXBsaWNhdGUgcHJpbWFyeSBrZXkuIEhvd2V2ZXIsIGl0IGlzIGxlZ2FsIHRvIHJldXNlIHRoZSBwcmltYXJ5IGtleSBvZiBhCi0JICogICAgIHByZXZpb3VzbHkgcmVtb3ZlZCBlbnRpdHkgb2JqZWN0LgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICouLi4KLQkgKgotCSAqIDkuNC4yIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZQotCSAqLi4uCi0JICogICAtIFRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHByaW1hcnkga2V5IGNsYXNzIHR5cGUuIAotCSAqICAgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgc2hvdWxkIGJlIGNvZGVkIHRvIHJldHVybiBhIG51bGwuIAotCSAqICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaWdub3JlZCBieSB0aGUgQ29udGFpbmVyLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2Rfa2V5RGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IHRlc3RlZCB0aGF0IHRoZSBtZXRob2QgbmFtZSBpcyBlamJDcmVhdGUuCi0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBVbmtub3duIHByaW1hcnkga2V5IGNsYXNzIChzZWN0aW9uIDkuNC43LjMpIGlzIGFsc28gdmFsaWRhdGVkIGJ5IHRoaXMKLQkJLy8gY2hlY2ssIGJlY2F1c2UgdGhlIHByaW1hcnkga2V5IG11c3QgYmUgb2YgdHlwZSBqYXZhLmxhbmcuT2JqZWN0LCBhbmQKLQkJLy8gdGhlIGVqYkNyZWF0ZSBtdXN0IHJldHVybiBqYXZhLmxhbmcuT2JqZWN0LgotCQlKYXZhSGVscGVycyBwcmltYXJ5S2V5ID0gbnVsbDsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShiZWFuKSkgewotCQkJcHJpbWFyeUtleSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBiZWFuKTsKLQkJfQotCQllbHNlIHsKLQkJCXByaW1hcnlLZXkgPSAoKEVudGl0eSkgYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQl9Ci0KLQkJLy8gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZS4KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJSmF2YUhlbHBlcnMgcGFybVR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocGFybVR5cGUsIHByaW1hcnlLZXkpKSB7Ci0JCQkvLyBpZiB0aGUgcGFyYW1ldGVyIHR5cGUgaXMgamF2YS5sYW5nLk9iamVjdCwgY291bGQgYmUgc2VjdGlvbiA5LjQuNy4zCi0JCQlTdHJpbmcga2V5TmFtZSA9IChwcmltYXJ5S2V5ID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1BSSU1BUllfS0VZIDogcHJpbWFyeUtleS5nZXRKYXZhTmFtZSgpOwotCQkJU3RyaW5nW10gbXNnUGFybSA9IHtrZXlOYW1lfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA5LjIuNSBlamJGaW5kIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBhbHNvIGRlZmluZSBhZGRpdGlvbmFsIGVqYkZpbmQ8TUVUSE9EPiguLi4pIGZpbmRlciBtZXRob2RzLgotCSAqICAgLSBUaGUgc2lnbmF0dXJlcyBvZiB0aGUgZmluZGVyIG1ldGhvZHMgbXVzdCBmb2xsb3cgdGhlIGZvbGxvd2luZyBydWxlczoKLQkgKiAgIC0gQSBmaW5kZXIgbWV0aG9kIG5hbWUgbXVzdCBzdGFydCB3aXRoIHRoZSBwcmVmaXggImVqYkZpbmQiIAotCSAqICAgICAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotCSAqICAgLSBBIGZpbmRlciBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSwgCi0JICogICAgIG9yIGEgY29sbGVjdGlvbiBvZiBwcmltYXJ5IGtleXMgKHNlZSBTZWN0aW9uIFN1YnNlY3Rpb24gOS4xLjgpLgotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCBpbmNsdWRpbmcgCi0JICogICAgIHRoZSBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLgotCSAqICAgLSBFdmVyeSBlbnRpdHkgYmVhbiBtdXN0IGRlZmluZSB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIFRoZSByZXN1bHQgdHlwZSBmb3IgCi0JICogICAgIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0JICogICAgIGJlIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLgotCSAqICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZmluZGVyIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotCSAqICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLQkgKiAgICAgVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotCSAqICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqCi0JICogOS40LjYgZmluZGVyIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBCZWFuIFByb3ZpZGVyIGRvZXMgbm90IHdyaXRlIHRoZSBmaW5kZXIgKGVqYkZpbmQ8TUVUSE9EPiguLi4pKSBtZXRob2RzLgotCSAqCi0JICogOS40LjcuMyAoQ01QKSBTcGVjaWFsIGNhc2U6IFVua25vd24gcHJpbWFyeSBrZXkgY2xhc3MuCi0JICogICAtIEluIHRoaXMgc3BlY2lhbCBjYXNlLCB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgb2YgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIAotCSAqICAgICBtdXN0IGJlIGRlY2xhcmVkIGFzIGphdmEubGFuZy5PYmplY3QsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIG9mIGVqYkNyZWF0ZSgpIG11c3QgCi0JICogICAgIGJlIGRlY2xhcmVkIGFzIGphdmEubGFuZy5PYmplY3QuIFRoZSBCZWFuIFByb3ZpZGVyIG11c3Qgc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgCi0JICogICAgIGNsYXNzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXMgb2YgdGhlIHR5cGUgamF2YS5sYW5nLk9iamVjdC4KLQkgKiAgKFRoaXMgZG9lcyBub3QgbmVlZCB0byBiZSB2YWxpZGF0ZWQgZGlyZWN0bHksIHNpbmNlIENNUHMgZG9uJ3QgaW1wbGVtZW50IGZpbmRlciBtZXRob2RzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFRoaXMgbWV0aG9kIGlzIGEgbm8tb3Agc28gdGhhdCB0aGUgZGVwZW5kZW5jeSBjbGFzc2VzIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50IGl0LgotCQkvLyAoVGhpcyBtZXRob2Qgd2lsbCBuZXZlciBiZSBjYWxsZWQgaW4gYSBkZXBlbmRlbmN5IGNsYXNzLikKLQl9Ci0JCi0JLyoqCi0JICogOS4yLjUgZWpiRmluZCBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgYWxzbyBkZWZpbmUgYWRkaXRpb25hbCBlamJGaW5kPE1FVEhPRD4oLi4uKSBmaW5kZXIgbWV0aG9kcy4KLQkgKiAgIC0gVGhlIHNpZ25hdHVyZXMgb2YgdGhlIGZpbmRlciBtZXRob2RzIG11c3QgZm9sbG93IHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0JICogICAtIEEgZmluZGVyIG1ldGhvZCBuYW1lIG11c3Qgc3RhcnQgd2l0aCB0aGUgcHJlZml4ICJlamJGaW5kIiAKLQkgKiAgICAgKGUuZy4gZWpiRmluZEJ5UHJpbWFyeUtleSwgZWpiRmluZExhcmdlQWNjb3VudHMsIGVqYkZpbmRMYXRlU2hpcG1lbnRzKS4KLQkgKiAgIC0gQSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudCB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkgKiAgIC0gVGhlIHJldHVybiB0eXBlIG9mIGEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGUsIAotCSAqICAgICBvciBhIGNvbGxlY3Rpb24gb2YgcHJpbWFyeSBrZXlzIChzZWUgU2VjdGlvbiBTdWJzZWN0aW9uIDkuMS44KS4KLQkgKiAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgaW5jbHVkaW5nIAotCSAqICAgICB0aGUgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbi4KLQkgKiAgIC0gRXZlcnkgZW50aXR5IGJlYW4gbXVzdCBkZWZpbmUgdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiBUaGUgcmVzdWx0IHR5cGUgZm9yIAotCSAqICAgICB0aGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBwcmltYXJ5IGtleSB0eXBlIChpLmUuIHRoZSBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBtdXN0IAotCSAqICAgICBiZSBhIHNpbmdsZS1vYmplY3QgZmluZGVyKS4KLQkgKiAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGZpbmRlciBtZXRob2RzIHRvIHRocm93IHRoZSAKLQkgKiAgICAgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gCi0JICogICAgIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiAKLQkgKiAgICAgc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQkgKiAgICAgdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKgotCSAqIDkuNC42IGZpbmRlciBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgQmVhbiBQcm92aWRlciBkb2VzIG5vdCB3cml0ZSB0aGUgZmluZGVyIChlamJGaW5kPE1FVEhPRD4oLi4uKSkgbWV0aG9kcy4KLQkgKgotCSAqIDkuNC43LjMgKENNUCkgU3BlY2lhbCBjYXNlOiBVbmtub3duIHByaW1hcnkga2V5IGNsYXNzLgotCSAqICAgLSBJbiB0aGlzIHNwZWNpYWwgY2FzZSwgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IG9mIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCAKLQkgKiAgICAgbXVzdCBiZSBkZWNsYXJlZCBhcyBqYXZhLmxhbmcuT2JqZWN0LCBhbmQgdGhlIHJldHVybiB2YWx1ZSBvZiBlamJDcmVhdGUoKSBtdXN0IAotCSAqICAgICBiZSBkZWNsYXJlZCBhcyBqYXZhLmxhbmcuT2JqZWN0LiBUaGUgQmVhbiBQcm92aWRlciBtdXN0IHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IAotCSAqICAgICBjbGFzcyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFzIG9mIHRoZSB0eXBlIGphdmEubGFuZy5PYmplY3QuCi0JICogIChUaGlzIGRvZXMgbm90IG5lZWQgdG8gYmUgdmFsaWRhdGVkIGRpcmVjdGx5LCBzaW5jZSBDTVBzIGRvbid0IGltcGxlbWVudCBmaW5kZXIgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkZpbmRNZXRob2RfaG9tZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JCS8vIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCQkvLyB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JCS8vIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCQkvLyBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JCUphdmFDbGFzcyBob21lID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lKTsKLQotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRiArIG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDQpOyAvLyBlLmcuIGlmIHRoZSBob21lIG1ldGhvZCBpcyBuYW1lZCBmaW5kWCwgdGhlbiB0aGUgYmVhbiBtZXRob2Qgd2lsbCBiZSBuYW1lZCBlamJGaW5kWAotCQlNZXRob2QgaG9tZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChob21lLCBtZXRob2QsIG1ldGhvZE5hbWUpOwotCQlpZiAoaG9tZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBUaGVuIHRoaXMgbWV0aG9kIHNob3VsZG4ndCBoYXZlIGJlZW4gY2FsbGVkOyB1bmxlc3MgdGhlIG1ldGhvZCBleGlzdHMgb24gdGhlIHJlbW90ZSwgdGhpcyBiZWFuIG1ldGhvZCBpc24ndCBhIGJ1c2luZXNzIG1ldGhvZC4KLQkJCXJldHVybjsKLQkJfQotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgaG9tZU1ldGhvZCk7Ci0JCWlmIChleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZXhjLmdldFF1YWxpZmllZE5hbWUoKSwgaG9tZS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQyMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCBmb2xsb3dzIHRoZSBFSkIgMS4xLiBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogOS4yLjQgZWpiUG9zdENyZWF0ZSBtZXRob2RzCi0JICogLSBGb3IgZWFjaCBlamJDcmVhdGUoLi4uKSBtZXRob2QsIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIG1hdGNoaW5nIAotCSAqICAgZWpiUG9zdENyZWF0ZSguLi4pIG1ldGhvZCwgdXNpbmcgdGhlIGZvbGxvd2luZyBydWxlczoKLQkgKiAgICAtIFRoZSBtZXRob2QgbmFtZSBtdXN0IGJlIGVqYlBvc3RDcmVhdGUuCi0JICogICAgLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAgLSBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB2b2lkLgotCSAqICAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnRzIG9mIHRoZSBtYXRjaGluZyAKLQkgKiAgICAgIGVqYkNyZWF0ZSguLi4pIG1ldGhvZC4KLQkgKiAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCSAqICAgICAgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCSAqICAgICAgQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIHRvIHRocm93IAotCSAqICAgICAgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCSAqICAgICAgVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSAKLQkgKiAgICAgIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgCi0JICogICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgCi0JICogICAgICBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JICouLi4KLQkqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaGFzIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYlBvc3RDcmVhdGUuCi0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDhfZWpiUG9zdENyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTBfZWpiUG9zdENyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA5X2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB2b2lkLgotCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCVN0cmluZyByZXR1cm5UeXBlTmFtZSA9ICgocGFybVR5cGUgPT0gbnVsbCkgPyAiIiA6IHBhcm1UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFyZXR1cm5UeXBlTmFtZS5lcXVhbHMoSVR5cGVDb25zdGFudHMuVk9JRCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCAKLQkJLy8gaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQkvLyBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgdG8gdGhyb3cgCi0JCS8vIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLQkJLy8gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSAKLQkJLy8gYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciAKLQkJLy8gamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIAotCQkvLyBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZSk7Ci0KLQkJLy8gVmVyaWZ5IHRoYXQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGhhcyBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QuCi0JCU1ldGhvZCBlamJDcmVhdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSwgbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpKTsKLQkJaWYgKGVqYkNyZWF0ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMjgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2RfaG9tZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCBmb2xsb3dzIHRoZSBFSkIgMS4xLiBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogOS4yLjQgZWpiUG9zdENyZWF0ZSBtZXRob2RzCi0JICogLSBGb3IgZWFjaCBlamJDcmVhdGUoLi4uKSBtZXRob2QsIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIG1hdGNoaW5nIAotCSAqICAgZWpiUG9zdENyZWF0ZSguLi4pIG1ldGhvZCwgdXNpbmcgdGhlIGZvbGxvd2luZyBydWxlczoKLQkgKiAgICAtIFRoZSBtZXRob2QgbmFtZSBtdXN0IGJlIGVqYlBvc3RDcmVhdGUuCi0JICogICAgLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAgLSBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB2b2lkLgotCSAqICAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnRzIG9mIHRoZSBtYXRjaGluZyAKLQkgKiAgICAgIGVqYkNyZWF0ZSguLi4pIG1ldGhvZC4KLQkgKiAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCSAqICAgICAgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCSAqICAgICAgQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIHRvIHRocm93IAotCSAqICAgICAgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCSAqICAgICAgVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSAKLQkgKiAgICAgIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgCi0JICogICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgCi0JICogICAgICBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JICouLi4KLQkqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZF9ob21lRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IHRlc3RlZCB0aGF0IHRoZSBtZXRob2QgbmFtZSBpcyBlamJQb3N0Q3JlYXRlLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUphdmFDbGFzcyBob21lSW50ZiA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgaG9tZUludGYpOwotCi0JCU1ldGhvZCBjcmVhdGVNZXRob2QgPSBnZXRNYXRjaGluZ0hvbWVDcmVhdGVNZXRob2RFeHRlbmRlZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCWlmIChjcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJLy8gSWYgdGhlIGVqYkNyZWF0ZSBtZXRob2QgaXMgaW5oZXJpdGVkIGZyb20gYSBjb21wb25lbnQgcGFyZW50LCBpdCBpcyBsaWtlbHkKLQkJCS8vIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY3JlYXRlIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgaG9tZS4KLQkJCS8vIFNpbmNlIG91ciB0b29scyBnZW5lcmF0ZSB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlIGNvZGUsIHN1cHByZXNzIHRoaXMgd2FybmluZy4KLQotCQkJLy8gZWpiQ3JlYXRlIG1ldGhvZHMgd2hpY2ggYXJlIGluaGVyaXRlZCB2aWEgY29tcG9uZW50IGluaGVyaXRhbmNlLCBidXQgZG8gbm90Ci0JCQkvLyBoYXZlIGEgbWV0aG9kIG9uIHRoZWlyIGltbWVkaWF0ZSBob21lLCBhcmUgZmlsdGVyZWQgb3V0IHZpYSB0aGUgaXNWYWxpZChNZXRob2QpIG1ldGhvZC4KLQotCQkJLy8gVGhlIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kIGNoZWNrcyBmb3IgYSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kLCBidXQganVzdCBpbgotCQkJLy8gY2FzZSB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBpcyBtaXNzaW5nLCBjaGVjayBmb3IgaXQgaGVyZSB0b28uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMjksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBob21lSW50Zi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0KLQkJCS8vIENhbid0IGNoZWNrIHRoZSBleGNlcHRpb25zIG9mIGEgbWV0aG9kIHdoaWNoIGRvZXNuJ3QgZXhpc3QuCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBXaGV0aGVyIHRoaXMgaXMgZnJvbSBhIGNvbXBvbmVudCBpbmhlcml0YW5jZSBvciBub3QsIGlmIHRoZSBtZXRob2QgZXhpc3RzIG9uIHRoZQotCQkvLyBob21lLCBjaGVjayB0aGF0IHRoZSBtZXRob2QgZm9sbG93cyB0aGUgc3BlYy4KLQotCQkvLyBTZWN0aW9uIDYuMTAuNiAoc2Vzc2lvbiksIDkuMi44IChlbnRpdHkpLCBkZWNsYXJlIHRoYXQgYWxsIGV4Y2VwdGlvbnMgZGVjbGFyZWQKLQkJLy8gb24gdGhlIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZgotCQkvLyB0aGUgbWF0Y2hpbmcgY3JlYXRlIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtZXRob2QsIGNyZWF0ZU1ldGhvZCk7Ci0JCWlmIChleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZXhjLmdldFF1YWxpZmllZE5hbWUoKSwgaG9tZUludGYuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MjAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA5LjIuMiBFbnRlcnByaXNlIGJlYW4gY2xhc3MKLQkgKi4uLgotCSAqICAgLSBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciBhbiBlbnRpdHkgYmVhbiBjbGFzczoKLQkgKi4uLgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBub3QgZGVmaW5lIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4KLQkgKi4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmluYWxpemUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBJZiBpdCdzICJmaW5hbGl6ZSgpIiwgdGhlIGVqYiBiZWFuIHNob3VsZG4ndCBoYXZlIHRoZSBtZXRob2QuCi0JCWlmIChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCS8vIFRoaXMgaXMgYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IsIGJlY2F1c2UgRUpCIDEuMCBhbGxvd2VkIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZCB0byBiZSBjYWxsZWQuIEVKQiAxLjEgKHNlY3Rpb24gNi4xMC4yKSBzcGVjaWZpY2FsbHkgcHJvaGliaXRzIGl0LgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDkuMi4yIEVudGVycHJpc2UgYmVhbiBjbGFzcwotCSAqLi4uCi0JICogICAtIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIGFuIGVudGl0eSBiZWFuIGNsYXNzOgotCSAqLi4uCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4KLQkgKi4uLgotCSAqCi0JICogRUpCIHNwZWMgMS4xLCBwLiAxMDUgZXhwbGFpbnMgd2h5IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIGZvciBhdCBsZWFzdCBvbmUgZWpiQ3JlYXRlIG1ldGhvZC4KLQkgKiAgICBbNl0gQW4gZW50aXR5IGVudGVycHJpc2UgQmVhbiBoYXMgbm8gZWpiQ3JlYXRlKC4uLikgYW5kIGVqYlBvc3RDcmVhdGUoLi4uKSAKLQkgKiAgICBtZXRob2RzIGlmIGl0IGRvZXMgbm90IGRlZmluZSBhbnkgY3JlYXRlIG1ldGhvZHMgaW4gaXRzIGhvbWUgaW50ZXJmYWNlLiAKLQkgKiAgICBTdWNoIGFuIGVudGl0eSBlbnRlcnByaXNlIEJlYW4gZG9lcyBub3QgYWxsb3cgdGhlIGNsaWVudHMgdG8gY3JlYXRlIG5ldyAKLQkgKiAgICBFSkIgb2JqZWN0cy4gVGhlIGVudGVycHJpc2UgQmVhbiByZXN0cmljdHMgdGhlIGNsaWVudHMgdG8gYWNjZXNzaW5nIGVudGl0aWVzIAotCSAqICAgIHRoYXQgd2VyZSBjcmVhdGVkIHRocm91Z2ggZGlyZWN0IGRhdGFiYXNlIGluc2VydHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmdbXSBtb2RlbE9iamVjdE5hbWUgPSBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQlpZiAoIWhhc1ZhbGlkQ29uc3RydWN0b3IgJiYgaGFzQUNvbnN0cnVjdG9yKSB7Ci0JCQkvLyBJZiBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIGFyZ3VtZW50cyBkb2VzIG5vdCBleGlzdCBleHBsaWNpdGx5LAotCQkJLy8gSmF2YSB3aWxsIGluc2VydCBvbmUgYXMgbG9uZyBhcyB0aGVyZSBhcmUgbm8gY29uc3RydWN0b3JzIGRlZmluZWQgaW4gdGhlCi0JCQkvLyBjbGFzcy4gSWYgdGhlcmUgaXMgYSBjb25zdHJ1Y3RvciwgSmF2YSBkb2VzIG5vdCBpbnNlcnQgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDA2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtb2RlbE9iamVjdE5hbWUsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzU2V0RW50aXR5Q29udGV4dCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzVW5zZXRFbnRpdHlDb250ZXh0KSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNFamJBY3RpdmF0ZSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDM1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzRWpiUGFzc2l2YXRlKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNFamJSZW1vdmUpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0VqYkxvYWQpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0VqYlN0b3JlKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIGZpZWxkIGV4aXN0cyBvbiB0aGUgYmVhbiBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2ZXJpZnlGaWVsZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQkJaGFzVmFsaWRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCQloYXNBQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJaGFzU2V0RW50aXR5Q29udGV4dCA9IGZhbHNlOwotCQloYXNVbnNldEVudGl0eUNvbnRleHQgPSBmYWxzZTsKLQkJaGFzRWpiQWN0aXZhdGUgPSBmYWxzZTsKLQkJaGFzRWpiUGFzc2l2YXRlID0gZmFsc2U7Ci0JCWhhc0VqYlJlbW92ZSA9IGZhbHNlOwotCQloYXNFamJMb2FkID0gZmFsc2U7Ci0JCWhhc0VqYlN0b3JlID0gZmFsc2U7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUhvbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlIb21lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDY2YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUhvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKi8KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkgaG9tZSBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0gKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLSAqICAgLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCSG9tZSBpbnRlcmZhY2UuCi0gKiAgIC0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS1JSU9QLiAKLSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIGZvciAKLSAqICAgICBSTUktSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgaXMgYWxsb3dlZCB0byBoYXZlIHN1cGVyaW50ZXJmYWNlcy4gVXNlIG9mIGludGVyZmFjZSAKLSAqICAgICBpbmhlcml0YW5jZSBpcyBzdWJqZWN0IHRvIHRoZSBSTUktSUlPUCBydWxlcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgcmVtb3RlIGludGVyZmFjZXMuCi0gKiAgIC0gRWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICAgLSBBIGNyZWF0ZSBtZXRob2QuCi0gKiAgICAgIC0gQSBmaW5kZXIgbWV0aG9kLgotICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0gKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4KLSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0gKiAgIC0gVGhlIHRocm93cyBjbGF1c2Ugb2YgYSBjcmVhdGUgbWV0aG9kIG11c3QgaW5jbHVkZSB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLSAqICAgLSBFYWNoIGZpbmRlciBtZXRob2QgbXVzdCBiZSBuYW1lZCAiZmluZDxNRVRIT0Q+IiAoZS5nLiBmaW5kTGFyZ2VBY2NvdW50cyksIGFuZCBpdAotICogICAgIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyAKLSAqICAgICAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0gKiAgICAgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgbWF5IGJlIGRpZmZlcmVudC4pCi0gKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgCi0gKiAgICAgaW50ZXJmYWNlIHR5cGUgKGZvciBhIHNpbmdsZS1vYmplY3QgZmluZGVyKSwgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKGZvciBhIAotICogICAgIG11bHRpLW9iamVjdCBmaW5kZXIpLgotICogICAtIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0gKiAgICAgYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLSAqICAgICBhcyB0aGUgbWV0aG9kIGFyZ3VtZW50LgotICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLSAqICAgICBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kIAotICogICAgIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0gKiAgIC0gVGhlIHRocm93cyBjbGF1c2Ugb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgaW5jbHVkZSB0aGUgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbi4gCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVFbnRpdHlIb21lIGV4dGVuZHMgQVZhbGlkYXRlSG9tZSB7Ci0JcHJpdmF0ZSBIYXNoU2V0IGZpbmRCeVBLTWV0aG9kcyA9IG51bGw7Ci0KLQlwdWJsaWMgQVZhbGlkYXRlRW50aXR5SG9tZSgpIHsKLQkJZmluZEJ5UEtNZXRob2RzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJZmluZEJ5UEtNZXRob2RzLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gTmVlZCB0byB0cmFjayBudW1iZXIgb2YgZmluZEJ5UHJpbWFyeUtleSBtZXRob2RzIGZvciB0aGUKLQkJLy8gdmFsaWRhdGVNZXRob2RFeGlzdHMoKSBjaGVja3MuIERvIG5vdCBjaGVjayBvbmx5IHRoZSBjdXJyZW50Ci0JCS8vIGNsYXNzLCBvciBhIGZpbmRCeVByaW1hcnlLZXkgd2hpY2ggaXMgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgaW50ZXJmYWNlCi0JCS8vIHdpbGwgbm90IGJlIGRldGVjdGVkLgotCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCWZpbmRCeVBLTWV0aG9kcy5hZGQobWV0aG9kKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCByZXR1cm5zIHRoZSByZW1vdGUgaW50ZXJmYWNlLAotCSAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaW5nbGVPYmplY3RGaW5kZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIFRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBpcyBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4KLQkJSmF2YUNsYXNzIHJlbW90ZUludGYgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlSW50Zik7Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCByZW1vdGVJbnRmKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBpcyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hlY2tzIHRoYXQgdGhlIGVudGl0eSBob21lJ3MgbWV0aG9kcyBjb21wbHkgd2l0aCB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqLi4uCi0JICogICAtIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUktSUlPUC4gCi0JICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgZm9yIAotCSAqICAgICBSTUktSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKi4uLgotCSAqICAgLSBFYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lIGludGVyZmFjZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCSAqICAgICAgLSBBIGNyZWF0ZSBtZXRob2QuCi0JICogICAgICAtIEEgZmluZGVyIG1ldGhvZC4KLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkgKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkgKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkgKiAgIC0gVGhlIHRocm93cyBjbGF1c2Ugb2YgYSBjcmVhdGUgbWV0aG9kIG11c3QgaW5jbHVkZSB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkgKiAgIC0gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkgKiAgICAgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCSAqICAgICAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JICogICAgIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgZmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSAKLQkgKiAgICAgaW50ZXJmYWNlIHR5cGUgKGZvciBhIHNpbmdsZS1vYmplY3QgZmluZGVyKSwgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKGZvciBhIAotCSAqICAgICBtdWx0aS1vYmplY3QgZmluZGVyKS4KLQkgKiAgIC0gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYWx3YXlzIGluY2x1ZGUgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLCB3aGljaCBpcyAKLQkgKiAgICAgYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLQkgKiAgICAgYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCSAqICAgICBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kIAotCSAqICAgICBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBpbmNsdWRlIHRoZSBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBoaU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy8gc3VwZXIucHJpbVZhbGlkYXRlKGhpTWV0aG9kKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCVN0cmluZyBuYW1lID0gaGlNZXRob2QuZ2V0TmFtZSgpOwotCi0JCS8vIEVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JCS8vICAgLSBBIGNyZWF0ZSBtZXRob2QuCi0JCS8vICAgLSBBIGZpbmRlciBtZXRob2QuCi0JCWlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUpKQotCQkJdmFsaWRhdGVDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBoaU1ldGhvZCk7Ci0JCWVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0ZJTkQpKQotCQkJdmFsaWRhdGVGaW5kTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgaGlNZXRob2QpOwotCQllbHNlIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgaGlNZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCWlmIChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5EQllQUklNQVJZS0VZLmVxdWFscyhlamJNZXRob2QuZ2V0TmFtZSgpKSkKLQkJCWluY3JlbWVudEZpbmRCeVByaW1hcnlLZXlDb3VudCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQkhvbWUgaW50ZXJmYWNlLgotCSAqLi4uCi0JICogICAtIFRoZSBob21lIGludGVyZmFjZSBpcyBhbGxvd2VkIHRvIGhhdmUgc3VwZXJpbnRlcmZhY2VzLiBVc2Ugb2YgaW50ZXJmYWNlIAotCSAqICAgICBpbmhlcml0YW5jZSBpcyBzdWJqZWN0IHRvIHRoZSBSTUktSUlPUCBydWxlcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgcmVtb3RlIGludGVyZmFjZXMuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCQkvLyBUaGUgc3VwZXJjbGFzcyBjaGVja3MgdGhhdCB0aGUgaG9tZSBleHRlbmRzIGphdmF4LmVqYi5FSkJIb21lLAotCQkvLyBhbmQgdGhhdCB0aGUgaW50ZXJmYWNlIGluaGVyaXRhbmNlIGNvbXBsaWVzIHdpdGggUk1JLUlJT1AgcnVsZXMuCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBjcmVhdGUgbWV0aG9kIG9uIHRoZSBlbnRpdHkgaG9tZSBmb2xsb3dzIHRoZSBFSkIgMS4xLiBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSB0eXBlLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkgKiAgICAgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkgKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JCS8vIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JCS8vCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JCS8vIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCQkvLyB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JCS8vIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCQkvLyBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JCXZhbGlkYXRlQ3JlYXRlTWV0aG9kX2JlYW5EZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIHJldHVybiB0eXBlIGZvciBhIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIHR5cGUuCi0JCXZhbGlkYXRlQ3JlYXRlTWV0aG9kX3JlbW90ZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gVGhlIHRocm93cyBjbGF1c2Ugb2YgYSBjcmVhdGUgbWV0aG9kIG11c3QgaW5jbHVkZSB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzQ3JlYXRlRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCkpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfQ1JFQVRFRVhDRVBUSU9OIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS1JSU9QLiAKLQkJLy8gVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyBmb3IgCi0JCS8vIFJNSS1JSU9QLCBhbmQgdGhhdCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgY3JlYXRlIG1ldGhvZCBvbiB0aGUgZW50aXR5IGhvbWUgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkgKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkgKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZF9iZWFuRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JCS8vIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JCXN1cGVyLnZhbGlkYXRlQ3JlYXRlTWV0aG9kX2JlYW5EZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JCS8vIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCQkvLyB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JCS8vIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCQkvLyBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JCXZhbGlkYXRlTWF0Y2hpbmdCZWFuUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIEluIGFkZGl0aW9uIHRvIHJlZ3VsYXIgZmluZCBydWxlcywgZmluZEJ5UHJpbWFyeUtleSBuZWVkcyB0byBmb2xsb3cgc29tZSBvdGhlciBydWxlcy4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKi4uLgotCSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAotCSAqICAgICBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIAotCSAqICAgICBhcyB0aGUgbWV0aG9kIGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZF9rZXlEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gaGFzVmFsaWRGQlBLTWV0aG9kID0gZmFsc2U7Ci0JCUVudGl0eSBlbnRpdHlCZWFuID0gKEVudGl0eSkgYmVhbjsgLy8gYmVhbiBpcyBjaGVja2VkIGZvciBudWxsIGluIEFWYWxpZGF0ZUVKQi52YWxpZGF0ZSgpIG1ldGhvZCwgc28gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgaXQgaGVyZS4KLQkJSmF2YUNsYXNzIGtleUNsYXNzID0gZW50aXR5QmVhbi5nZXRQcmltYXJ5S2V5KCk7Ci0JCQotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwga2V5Q2xhc3MpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCS8vIFRoaXMgY2hlY2sgYWxzbyB2YWxpZGF0ZXMgY2FzZSA5LjQuNy4zIChDTVAgdW5rbm93biBwcmltYXJ5IGtleSBjbGFzcywKLQkJLy8gd2hpY2ggbXVzdCBiZSBkZWNsYXJlZCBhcyBqYXZhLmxhbmcuT2JqZWN0LikKLQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlpZiAocGFybXMubGVuZ3RoID09IDEpIHsKLQkJCUphdmFIZWxwZXJzIHR5cGUgPSBwYXJtc1swXS5nZXRKYXZhVHlwZSgpOwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUsIGtleUNsYXNzKSkgewotCQkJCS8vIGNoZWNrIHRoYXQgaXQncyBhIHNpbmdsZS1vYmplY3QgZmluZGVyCi0JCQkJaWYgKGlzU2luZ2xlT2JqZWN0RmluZGVyKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJCQloYXNWYWxpZEZCUEtNZXRob2QgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNoZWNrIGlmIGl0J3MgamF2YS5sYW5nLk9iamVjdC4gSWYgaXQgaXMsIHRoaXMgY291bGQgYmUgYSBjYXNlIG9mIDkuNC43LjMuCi0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1NhbWVUeXBlKHR5cGUsIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBlbnRpdHlCZWFuKSkpIHsKLQkJCQkJaGFzVmFsaWRGQlBLTWV0aG9kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWhhc1ZhbGlkRkJQS01ldGhvZCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsga2V5Q2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEluIGFkZGl0aW9uIHRvIHJlZ3VsYXIgZmluZCBydWxlcywgZmluZEJ5UHJpbWFyeUtleSBuZWVkcyB0byBmb2xsb3cgc29tZSBvdGhlciBydWxlcy4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKi4uLgotCSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAotCSAqICAgICBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIAotCSAqICAgICBhcyB0aGUgbWV0aG9kIGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZF9yZW1vdGVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAoIWlzU2luZ2xlT2JqZWN0RmluZGVyKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJU3RyaW5nIHJlbW90ZUludGZOYW1lID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKS5nZXROYW1lKCk7IC8vIENhbiBhc3N1bWUgdGhhdCByZW1vdGUgaW50ZXJmYWNlIGlzbid0IG51bGwsIG9yIGlzU2luZ2xlT2JqZWN0RmluZGVyIHdvdWxkIGhhdmUgdGhyb3duIGFuIEludmFsaWRJbnB1dEV4Y2VwdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyByZW1vdGVJbnRmTmFtZSB9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGZpbmRlciBtZXRob2Qgb24gdGhlIGVudGl0eSBob21lIGNsYXNzIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKi4uLgotCSAqICAgLSBFYWNoIGZpbmRlciBtZXRob2QgbXVzdCBiZSBuYW1lZCAiZmluZDxNRVRIT0Q+IiAoZS5nLiBmaW5kTGFyZ2VBY2NvdW50cyksIGFuZCBpdAotCSAqICAgICBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0JICogICAgIChlLmcuIGVqYkZpbmRMYXJnZUFjY291bnRzKS4gVGhlIG1hdGNoaW5nIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBoYXZlIHRoZSAKLQkgKiAgICAgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgbWF5IGJlIGRpZmZlcmVudC4pCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIAotCSAqICAgICBpbnRlcmZhY2UgdHlwZSAoZm9yIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLCBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoZm9yIGEgCi0JICogICAgIG11bHRpLW9iamVjdCBmaW5kZXIpLgotCSAqLi4uCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLQkgKiAgICAgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZCAKLQkgKiAgICAgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkgKiAgIC0gVGhlIHRocm93cyBjbGF1c2Ugb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgaW5jbHVkZSB0aGUgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbi4gCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgZmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSAKLQkJLy8gaW50ZXJmYWNlIHR5cGUgKGZvciBhIHNpbmdsZS1vYmplY3QgZmluZGVyKSwgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKGZvciBhIAotCQkvLyBtdWx0aS1vYmplY3QgZmluZGVyKS4KLQkJLy8KLQkJLy8gV2hldGhlciBvciBub3QgdGhlIHBhcmFtZXRlciBpcyBhIHR5cGUgb3IgYW4gYXJyYXkgb2YgdHlwZXMsIHRoZSBmb2xsb3dpbmcKLQkJLy8gY2FsbCB3aWxsIHJldHVybiB0aGUgYmFzZSB0eXBlLiBpLmUuLCBpZiBpdCdzIGFuIGFycmF5IG9mICJNeUNsYXNzIiwKLQkJLy8gdGhlIHJldHVyblR5cGVOYW1lIHdpbGwgYmUgc2V0IHRvICJNeUNsYXNzIiwgbm90IGFuIGFycmF5IHR5cGUuCi0JCXZhbGlkYXRlRmluZE1ldGhvZF9yZW1vdGVEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgZmluZGVyIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uIAotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NGaW5kZXJFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9GSU5ERVJFWENFUFRJT04gfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAotCQkvLyBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIAotCQkvLyBhcyB0aGUgbWV0aG9kIGFyZ3VtZW50LgotCQlib29sZWFuIHZhbGlkYXRlUk1JUGFyYW1ldGVycyA9IHRydWU7IC8vIHNob3VsZCB0aGUgcGFyYW1ldGVycyBiZSB2YWxpZGF0ZWQgdG8gc2VlIGlmIHRoZXkgZm9sbG93IFJNSS1JSU9QIHJ1bGVzPwotCQlib29sZWFuIHZhbGlkYXRlUk1JUmV0VHlwZSA9IHRydWU7IC8vIHNob3VsZCB0aGUgcmV0dXJuIHR5cGUgYmUgdmFsaWRhdGVkIHRvIHNlZSBpZiBpdCBmb2xsb3dzIFJNSS1JSU9QIHJ1bGVzPwotCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCS8vIC0gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYWx3YXlzIGluY2x1ZGUgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLCB3aGljaCBpcyAKLQkJCS8vIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JCQkvLyBhcyB0aGUgbWV0aG9kIGFyZ3VtZW50LgotCQkJLy8KLQkJCS8vIFRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBpcyBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4KLQkJCS8vIFRoZSBjYWxsIHRvIHZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZF9yZW1vdGVEZXAgaXMgZG9uZSBpbgotCQkJLy8gdmFsaWRhdGVGaW5kTWV0aG9kX3JlbW90ZURlcChtZXRob2QpOwotCQkJLy92YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2RfcmVtb3RlRGVwKG1ldGhvZCk7Ci0KLQkJCS8vIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBhcyB0aGUgbWV0aG9kIGFyZ3VtZW50LgotCQkJdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kX2tleURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoYmVhbikpIHsKLQkJCQl2YWxpZGF0ZVJNSVBhcmFtZXRlcnMgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQkJCQkKLQkJLy8gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS1JSU9QLiAKLQkJLy8gVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyBmb3IgCi0JCS8vIFJNSS1JSU9QLCBhbmQgdGhhdCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCQkvLyBIb3dldmVyLCB0aGUgcmV0dXJuIHR5cGUgb2YgIkVudW1lcmF0aW9uIiBvciAiQ29sbGVjdGlvbiIgaXMgZXhlbXB0ZWQgZnJvbSB0aGlzCi0JCS8vIGNoZWNrLCBiZWNhdXNlIHRoZSBzcGVjIHN0YXRlcywgaW4gOS4xLjguMiwgdGhhdCBFbnVtZXJhdGlvbiBvciBDb2xsZWN0aW9uIG11c3QgYmUgcmV0dXJuZWQKLQkJLy8gZm9yIG11bHRpLW9iamVjdCBmaW5kZXJzLgotCQlKYXZhSGVscGVycyByZXRUeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJdmFsaWRhdGVSTUlSZXRUeXBlID0gISgoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0VHlwZSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9FTlVNRVJBVElPTiwgYmVhbikpKSB8fCAKLQkJCQkJCQkJKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldFR5cGUsIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTiwgYmVhbikpKSk7Ci0JCQotCQlpZih2YWxpZGF0ZVJNSVBhcmFtZXRlcnMpIHsKLQkJCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCQotCQlpZih2YWxpZGF0ZVJNSVJldFR5cGUpIHsKLQkJCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RSZXR1cm5UeXBlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQkKLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZmluZGVyIG1ldGhvZCBvbiB0aGUgZW50aXR5IGhvbWUgY2xhc3MgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqLi4uCi0JICogICAtIEVhY2ggZmluZGVyIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJmaW5kPE1FVEhPRD4iIChlLmcuIGZpbmRMYXJnZUFjY291bnRzKSwgYW5kIGl0Ci0JICogICAgIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyAKLQkgKiAgICAgKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotCSAqICAgICBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXkgYmUgZGlmZmVyZW50LikKLQkgKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgCi0JICogICAgIGludGVyZmFjZSB0eXBlIChmb3IgYSBzaW5nbGUtb2JqZWN0IGZpbmRlciksIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChmb3IgYSAKLQkgKiAgICAgbXVsdGktb2JqZWN0IGZpbmRlcikuCi0JICouLi4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCSAqICAgICBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kIAotCSAqICAgICBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBpbmNsdWRlIHRoZSBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbmRNZXRob2RfcmVtb3RlRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgZmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSAKLQkJLy8gaW50ZXJmYWNlIHR5cGUgKGZvciBhIHNpbmdsZS1vYmplY3QgZmluZGVyKSwgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKGZvciBhIAotCQkvLyBtdWx0aS1vYmplY3QgZmluZGVyKS4KLQkJLy8KLQkJLy8gV2hldGhlciBvciBub3QgdGhlIHBhcmFtZXRlciBpcyBhIHR5cGUgb3IgYW4gYXJyYXkgb2YgdHlwZXMsIHRoZSBmb2xsb3dpbmcKLQkJLy8gY2FsbCB3aWxsIHJldHVybiB0aGUgYmFzZSB0eXBlLiBpLmUuLCBpZiBpdCdzIGFuIGFycmF5IG9mICJNeUNsYXNzIiwKLQkJLy8gdGhlIHJldHVyblR5cGVOYW1lIHdpbGwgYmUgc2V0IHRvICJNeUNsYXNzIiwgbm90IGFuIGFycmF5IHR5cGUuCi0JCUphdmFDbGFzcyByZW1vdGVJbnRmID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZUludGYpOwotCi0JCS8vIFBlcmZvcm0gdGhpcyBjaGVjayBmb3IgYWxsIGZpbmRlcnMgYnV0IHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4KLQkJLy8gVGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSByZW1vdGUgaW50ZXJmYWNlLCBiZWNhdXNlIHRoZSBtZXRob2QgaXMKLQkJLy8gYSBzaW5nbGUtb2JqZWN0IGZpbmRlciBtZXRob2Q7IGJ1dCBvdGhlciBmaW5kZXJzIG1heSByZXR1cm4gYSBDb2xsZWN0aW9uIG9yIEVudW1lcmF0aW9uLgotCQlpZiAoIW1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkpKSB7Ci0JCQlKYXZhSGVscGVycyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCQotCQkJaWYgKCEgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihyZXR1cm5UeXBlLCBiZWFuKSB8fCAKLQkJCSAgICAgICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUVudW1lcmF0aW9uKHJldHVyblR5cGUsIGJlYW4pIHx8IAotCQkJICAgICAgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblR5cGUsIHJlbW90ZUludGYpKSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IHJlbW90ZUludGYuZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDAzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCS8vIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JCS8vIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JCS8vIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5EQllQUklNQVJZS0VZKSkgewotCQkJdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kX3JlbW90ZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQmVhbkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJc3VwZXIudmFsaWRhdGVNYXRjaGluZ0JlYW5DcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlNZXRob2QgZWpiQ3JlYXRlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW5DbGFzcywgbWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpOwotCQlpZiAoZWpiQ3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgcmVwb3J0ZWQgaW4gc3VwZXIKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZmluZGVyIG1ldGhvZCBvbiB0aGUgZW50aXR5IGhvbWUgY2xhc3MgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGZpbmRlciBtZXRob2QgbXVzdCBiZSBuYW1lZCAiZmluZDxNRVRIT0Q+IiAoZS5nLiBmaW5kTGFyZ2VBY2NvdW50cyksIGFuZCBpdAotCSAqICAgICBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0JICogICAgIChlLmcuIGVqYkZpbmRMYXJnZUFjY291bnRzKS4gVGhlIG1hdGNoaW5nIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBoYXZlIHRoZSAKLQkgKiAgICAgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgbWF5IGJlIGRpZmZlcmVudC4pCi0JICouLi4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCSAqICAgICBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kIAotCSAqICAgICBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0JlYW5GaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgaG9tZU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJaWYgKGhvbWVNZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkJLy8gbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCQkvLyAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JCS8vIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCQlTdHJpbmcgZmluZE1ldGhvZE5hbWUgPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkYgKyAoaG9tZU1ldGhvZC5nZXROYW1lKCkpLnN1YnN0cmluZygxKTsgLy8gZS5nLiBpZiB0aGUgaG9tZSBtZXRob2QgaXMgbmFtZWQgZmluZFgsIHRoZW4gdGhlIGJlYW4gbWV0aG9kIHdpbGwgYmUgbmFtZWQgZWpiRmluZFgKLQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbkNsYXNzKTsKLQotCQlNZXRob2QgYmVhbk1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChiZWFuQ2xhc3MsIGhvbWVNZXRob2QsIGZpbmRNZXRob2ROYW1lKTsKLQkJaWYgKGJlYW5NZXRob2QgPT0gbnVsbCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDMwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBuZXcgU3RyaW5nW10geyBiZWFuQ2xhc3MuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQ2hlY2sgaWYgcmV0dXJuIHR5cGVzIG1hdGNoCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCUphdmFIZWxwZXJzIGhvbWVSZXRUeXBlID0gaG9tZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCUphdmFIZWxwZXJzIGJlYW5SZXRUeXBlID0gYmVhbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oaG9tZVJldFR5cGUsIGJlYW5SZXRUeXBlKSkgewotCQkJLy8gZW1pdCB0aGUgZXJyb3Igb25seSBpZiBpdCdzIGEgbXVsdGktZmluZGVyLiBTaW5nbGUtZmluZGVycyBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzIG9uIHRoZSBob21lICYgYmVhbiBjbGFzcy4KLQkJCWJvb2xlYW4gaG9tZVJldFR5cGVJc1JlbW90ZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGhvbWVSZXRUeXBlLCBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpKTsKLQkJCWJvb2xlYW4gYmVhblJldFR5cGVJc0tleSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW5SZXRUeXBlLCAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCkpOwotCQkJaWYoIShob21lUmV0VHlwZUlzUmVtb3RlICYmIGJlYW5SZXRUeXBlSXNLZXkpKSB7Ci0JCQkJSmF2YUhlbHBlcnMgcmV0VHlwZSA9IChiZWFuUmV0VHlwZUlzS2V5KSA/IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkgOiBiZWFuUmV0VHlwZTsgLy8gaWYgdGhlIGJlYW4gY2xhc3MgcmV0dXJucyBhIGtleSwgdGhlIGhvbWUgbXVzdCByZXR1cm4gdGhlIHJlbW90ZTsgaWYgdGhlIGJlYW4gY2xhc3MgcmV0dXJucyBhIENvbGwvRW51bSwgdGhlIGhvbWUgbXVzdCByZXR1cm4gdGhlIHNhbWUKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG5ldyBTdHJpbmdbXSB7IHJldFR5cGUuZ2V0SmF2YU5hbWUoKSwgYmVhbkNsYXNzLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJGaW5kIG1ldGhvZCBvZiB0aGUgCi0JCS8vIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGZpbmQKLQkJLy8gbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJLyoKLQkJLy8gRG9uJ3QgY2hlY2sgZm9yIHRoZSBleGNlcHRpb25zIGhlcmUgLSBsZXQgdGhlIGJlYW4gY2xhc3MgZG8gaXQuIFdoZW4gdGhlIGhvbWUKLQkJLy8gY2hhbmdlcywgYSAiZGVwZW5kZW50IiB2YWxpZGF0aW9uIG9mIHRoZSBiZWFuJ3MgY2hlY2tzIHNob3VsZCBiZSBkb25lIGF1dG9tYXRpY2FsbHkuCi0JCS8vIElmIGl0IGlzIGNoZWNrZWQgaW4gdGhpcyBtZXRob2QgYXMgd2VsbCwgdGhlcmUgYXJlIGR1cGxpY2F0ZSBtZXNzYWdlcyBvbiB0aGUgdGFzayBsaXN0LgotCQlIYXNoU2V0IGV4Y2VwdGlvbnMgPSBnZXROb3RTdWJzZXRFeGNlcHRpb25zKGhvbWVNZXRob2QsIGJlYW5NZXRob2QpOwotCQlpZihleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkVKQl9NRVRIT0RfVEhST1dfTk9USElfRVhDRVAsIG1zZ1Bhcm0sIGJlYW5NZXRob2QsIEVKQl9CRUFOX0dST1VQKTsKLQkJCX0KLQkJfQkKLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGVudGl0eSBob21lIGhhcyBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBvbiB0aGUgYmVhbi4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqLi4uCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQmVhblBvc3RDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBob21lTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlpZiAoaG9tZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JCS8vIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuQ2xhc3MpOwotCi0JCU1ldGhvZCBiZWFuTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW5DbGFzcywgaG9tZU1ldGhvZCwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUE9TVENSRUFURSk7Ci0JCWlmIChiZWFuTWV0aG9kID09IG51bGwpIHsKLQkJCS8vIExldCB0aGUgYmVhbiBjbGFzcyByZXBvcnQgdGhpcyBtZXNzYWdlLiBPdGhlcndpc2UsIHdoZW4gdGhlIGJlYW4gY2xhc3MgcmVwb3J0cyBpdCwgdGhpcyBtZXNzYWdlIGxvb2tzIGxpa2UgYSBkdXBsaWNhdGUuCi0JCQkvKgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDMxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG5ldyBTdHJpbmdbXSB7IGJlYW5DbGFzcy5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkqLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkJLy8gYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JCS8vIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkJLy8gKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JCS8vIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkJLyoKLQkJLy8gRG9uJ3QgY2hlY2sgZm9yIHRoZSBleGNlcHRpb25zIGhlcmUgLSBsZXQgdGhlIGJlYW4gY2xhc3MgZG8gaXQuIFdoZW4gdGhlIGhvbWUKLQkJLy8gY2hhbmdlcywgYSAiZGVwZW5kZW50IiB2YWxpZGF0aW9uIG9mIHRoZSBiZWFuJ3MgY2hlY2tzIHNob3VsZCBiZSBkb25lIGF1dG9tYXRpY2FsbHkuCi0JCS8vIElmIGl0IGlzIGNoZWNrZWQgaW4gdGhpcyBtZXRob2QgYXMgd2VsbCwgdGhlcmUgYXJlIGR1cGxpY2F0ZSBtZXNzYWdlcyBvbiB0aGUgdGFzayBsaXN0LgotCQlIYXNoU2V0IGV4Y2VwdGlvbnMgPSBnZXROb3RTdWJzZXRFeGNlcHRpb25zKGhvbWVNZXRob2QsIGJlYW5NZXRob2QpOwotCQlpZihleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkVKQl9NRVRIT0RfVEhST1dfTk9USElfRVhDRVAsIG1zZ1Bhcm0sIGJlYW5NZXRob2QsIEVKQl9CRUFOX0dST1VQKTsKLQkJCX0KLQkJfQotCQkqLwotCX0KLQkKLQkvKioKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JICogICAgIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JICogICAgIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyAtIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JCS8vIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JCS8vIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCWlmIChmaW5kQnlQS01ldGhvZHMuc2l6ZSgpID09IDApIHsKLQkJCS8vIG11c3QgaGF2ZSBvbmUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAxMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCS8qCi0JCS8vIE5vdCBzdXJlIGlmIHRoaXMgY2hlY2sgaXMgdXNlZnVsIG9yIG5vdCwgYmVjYXVzZSBpdCBpcyBsZWdhbCBmb3IgYSBjaGlsZCBob21lIHRvIGRlY2xhcmUgYSBmaW5kQnlQcmltYXJ5S2V5LAotCQkvLyBhbmQgYWxzbyBmb3IgYSBwYXJlbnQgaG9tZSB0byBkZWNsYXJlIGEgZmluZEJ5UHJpbWFyeUtleS4KLQkJZWxzZSBpZiAoIGZpbmRCeVBLTWV0aG9kcy5zaXplKCkgPiAxICkgewotCQkJLy8gaWYgdGhlIGhvbWUgaW50ZXJmYWNlIGhhcyBtdWx0aXBsZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZHMgKGltcGxpZWQgYnkgOS4yLjgpCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpbmRCeVBLTWV0aG9kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX0hBU19NVUxUSVBMRV9QS19NRVRIT0RTLCAoTWV0aG9kKWl0ZXJhdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlSG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1OWMxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlSG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgaG9tZSBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiA2LjggU3RhdGVsZXNzIHNlc3Npb24gYmVhbnMKLSAqLi4uCi0gKiBUaGUgaG9tZSBpbnRlcmZhY2Ugb2YgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIG11c3QgaGF2ZSBvbmUgY3JlYXRlIAotICogbWV0aG9kIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgCi0gKiBpbnRlcmZhY2UuIFRoZXJlIGNhbiBiZSBubyBvdGhlciBjcmVhdGUgbWV0aG9kcyBpbiB0aGUgaG9tZSBpbnRlcmZhY2UuIAotICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0gKiBubyBhcmd1bWVudHMuCi0gKi4uLgotICoKLSAqIDYuMTAuNiBTZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZQotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotICogICAtIFRoZSBpbnRlcmZhY2UgbXVzdCBleHRlbmQgdGhlIGphdmF4LmVqYi5FSkJIb21lIGludGVyZmFjZS4KLSAqICAgLSBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JL0lJT1AuIAotICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotICogICAgIGZvciBSTUkvSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgaXMgYWxsb3dlZCB0byBoYXZlIHN1cGVyaW50ZXJmYWNlcy4gVXNlIG9mIGludGVyZmFjZSAKLSAqICAgICBpbmhlcml0YW5jZSBpcyBzdWJqZWN0IHRvIHRoZSBSTUkvSUlPUCBydWxlcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgCi0gKiAgICAgcmVtb3RlIGludGVyZmFjZXMuCi0gKiAgIC0gQSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZSBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBjcmVhdGUoLi4uKSBtZXRob2RzLgotICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgCi0gKiAgICAgdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLSAqICAgICBpbnRlcmZhY2UgdHlwZS4KLSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJDcmVhdGUgbWV0aG9kIAotICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLSAqICAgICBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLSAqLi4uCi0gKgotICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0gKiAgIC0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQkhvbWUgaW50ZXJmYWNlLgotICogICAtIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUktSUlPUC4gCi0gKiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyBmb3IgCi0gKiAgICAgUk1JLUlJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0gKiAgIC0gVGhlIGhvbWUgaW50ZXJmYWNlIGlzIGFsbG93ZWQgdG8gaGF2ZSBzdXBlcmludGVyZmFjZXMuIFVzZSBvZiBpbnRlcmZhY2UgCi0gKiAgICAgaW5oZXJpdGFuY2UgaXMgc3ViamVjdCB0byB0aGUgUk1JLUlJT1AgcnVsZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHJlbW90ZSBpbnRlcmZhY2VzLgotICogICAtIEVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgIC0gQSBjcmVhdGUgbWV0aG9kLgotICogICAgICAtIEEgZmluZGVyIG1ldGhvZC4KLSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0gKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIHR5cGUuCi0gKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0gKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0gKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0gKiAgIC0gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLSAqICAgICBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0gKiAgICAgKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotICogICAgIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIAotICogICAgIGludGVyZmFjZSB0eXBlIChmb3IgYSBzaW5nbGUtb2JqZWN0IGZpbmRlciksIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChmb3IgYSAKLSAqICAgICBtdWx0aS1vYmplY3QgZmluZGVyKS4KLSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAotICogICAgIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0gKiAgICAgYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJGaW5kIG1ldGhvZCBvZiB0aGUgCi0gKiAgICAgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZCAKLSAqICAgICBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgZmluZGVyIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRlSG9tZSBleHRlbmRzIEFWYWxpZGF0ZUVKQiB7Ci0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0SG9tZUludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIEEgaG9tZSBvciBjb21wb25lbnQgY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgotCQkvLyAgICAxLiBiZWFuIGNsYXNzCi0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFsxXTsKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYoYmVhbkNsYXNzID09IG51bGwpIHsKLQkJCXJlc3VsdFswXSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMF0gPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgaG9tZSBvciBjb21wb25lbnQncyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgdGhlIGNoZWNrIHRoYXQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgaGFzIGEgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvbiB0aGUgaG9tZSwKLQkgKiB0aGlzIG1ldGhvZCwgZ2l2ZW4gdGhlIGJlYW4gbWV0aG9kLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhvbWUgbWV0aG9kLgotCSAqCi0JICogNi4xMC42IFNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCSAqICAgICB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLQkgKiAgICAgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCSAqICAgICBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkgKi4uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRNYXRjaGluZ0JlYW5FamJDcmVhdGVNZXRob2RFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoYmVhbi5nZXRFamJDbGFzcygpLCBtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoc3VwZXIuaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCS8vIEV4Y2x1ZGUgcm9vdCByZW1vdGUgaW50ZXJmYWNlIG1ldGhvZHMKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNFSkJIb21lTWV0aG9kKGJlYW4sIG1ldGhvZCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNDbGluaXRNZXRob2QoYmVhbiwgbWV0aG9kKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogNi4xMC42IFNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCSG9tZSBpbnRlcmZhY2UuCi0JICouLi4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQkhvbWUgaW50ZXJmYWNlLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gaG9tZSBpbnRlcmZhY2UgbXVzdCBiZSBhbiBpbnRlcmZhY2UKLQkJaWYgKCFjbGF6ei5pc0ludGVyZmFjZSgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIGhvbWUgaW50ZXJmYWNlIG11c3QgaW5oZXJpdCBqYXZheC5lamIuRUpCSG9tZS5jbGFzcwotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkhPTUUsIGJlYW4pKSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJIT01FIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVW5uYW1lZFBhY2thZ2UoY2xhenouZ2V0SmF2YVBhY2thZ2UoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwNDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgYmVhbiwgY2xhenopOwotCX0KLQkKLQkvKioKLQkgKiA2LjggU3RhdGVsZXNzIHNlc3Npb24gYmVhbnMKLQkgKi4uLgotCSAqIFRoZSBob21lIGludGVyZmFjZSBvZiBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4gbXVzdCBoYXZlIG9uZSBjcmVhdGUgCi0JICogbWV0aG9kIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgCi0JICogaW50ZXJmYWNlLiBUaGVyZSBjYW4gYmUgbm8gb3RoZXIgY3JlYXRlIG1ldGhvZHMgaW4gdGhlIGhvbWUgaW50ZXJmYWNlLiAKLQkgKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgc2luZ2xlIGVqYkNyZWF0ZSBtZXRob2QgdGhhdCB0YWtlcyAKLQkgKiBubyBhcmd1bWVudHMuCi0JICouLi4KLQkgKgotCSAqIDYuMTAuNiBTZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLiAKLQkgKiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogICAgIGZvciBSTUkvSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKiAgIC0gQSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZSBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBjcmVhdGUoLi4uKSBtZXRob2RzLgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCSAqICAgICB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIAotCSAqICAgICBpbnRlcmZhY2UgdHlwZS4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLQkgKiAgICAgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCSAqICAgICBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkgKiAgIC0gVGhlIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kX2JlYW5EZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgCi0JCS8vIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIAotCQkvLyAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJDcmVhdGUgbWV0aG9kIAotCQkvLyBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0JCS8vIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkJdmFsaWRhdGVNYXRjaGluZ0JlYW5DcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiA2LjggU3RhdGVsZXNzIHNlc3Npb24gYmVhbnMKLQkgKi4uLgotCSAqIFRoZSBob21lIGludGVyZmFjZSBvZiBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4gbXVzdCBoYXZlIG9uZSBjcmVhdGUgCi0JICogbWV0aG9kIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgCi0JICogaW50ZXJmYWNlLiBUaGVyZSBjYW4gYmUgbm8gb3RoZXIgY3JlYXRlIG1ldGhvZHMgaW4gdGhlIGhvbWUgaW50ZXJmYWNlLiAKLQkgKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgc2luZ2xlIGVqYkNyZWF0ZSBtZXRob2QgdGhhdCB0YWtlcyAKLQkgKiBubyBhcmd1bWVudHMuCi0JICouLi4KLQkgKgotCSAqIDYuMTAuNiBTZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLiAKLQkgKiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogICAgIGZvciBSTUkvSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKiAgIC0gQSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZSBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBjcmVhdGUoLi4uKSBtZXRob2RzLgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCSAqICAgICB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIAotCSAqICAgICBpbnRlcmZhY2UgdHlwZS4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLQkgKiAgICAgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCSAqICAgICBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkgKiAgIC0gVGhlIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JICoKLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiAgICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAuLi4KLQkgKiAgICBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4KLQkgKiAuLi4KLQkgKiBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgZmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgdHlwZSAoZm9yIGEKLQkgKiBzaW5nbGUtb2JqZWN0IGZpbmRlciksIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChmb3IgYSBtdWx0aS1vYmplY3QgZmluZGVyKS4KLQkgKi4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kX3JlbW90ZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSmF2YUNsYXNzIHJlbW90ZUludGYgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlSW50Zik7Ci0KLQkJLy8gVGhlIHJldHVybiB0eXBlIGZvciBhIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSB0aGUgcmVtb3RlIGludGVyZmFjZSB0eXBlLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHJlbW90ZUludGYpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDAyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgcmVtb3RlSW50Zi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogNi4xMC42IFNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCSAqICAgICB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKi4uLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJDcmVhdGUgbWV0aG9kIAotCSAqICAgICBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0JICogICAgIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqLi4uCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKi4uLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkgKiAgICAgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkgKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdCZWFuQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkJLy8gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW5DbGFzcyk7Ci0KLQkJTWV0aG9kIGVqYkNyZWF0ZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChiZWFuQ2xhc3MsIG1ldGhvZCwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKTsKLQkJaWYgKGVqYkNyZWF0ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgYmVhbkNsYXNzLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFNlY3Rpb24gNi4xMC42IChzZXNzaW9uKSwgOS4yLjggKGVudGl0eSksIGRlY2xhcmUgdGhhdCBhbGwgZXhjZXB0aW9ucyBkZWNsYXJlZAotCQkvLyBvbiB0aGUgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mCi0JCS8vIHRoZSBtYXRjaGluZyBjcmVhdGUgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQkvKgotCQkvLyBEb24ndCBjaGVjayBmb3IgdGhlIGV4Y2VwdGlvbnMgaGVyZSAtIGxldCB0aGUgYmVhbiBjbGFzcyBkbyBpdC4gV2hlbiB0aGUgaG9tZQotCQkvLyBjaGFuZ2VzLCBhICJkZXBlbmRlbnQiIHZhbGlkYXRpb24gb2YgdGhlIGJlYW4ncyBjaGVja3Mgc2hvdWxkIGJlIGRvbmUgYXV0b21hdGljYWxseS4KLQkJLy8gSWYgaXQgaXMgY2hlY2tlZCBpbiB0aGlzIG1ldGhvZCBhcyB3ZWxsLCB0aGVyZSBhcmUgZHVwbGljYXRlIG1lc3NhZ2VzIG9uIHRoZSB0YXNrIGxpc3QuCi0JCUhhc2hTZXQgZXhjZXB0aW9ucyA9IGdldE5vdFN1YnNldEV4Y2VwdGlvbnMobWV0aG9kLCBlamJDcmVhdGVNZXRob2QpOwotCQlpZihleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkVKQl9NRVRIT0RfVEhST1dfTk9USElfRVhDRVAsIG1zZ1Bhcm0sIGVqYkNyZWF0ZU1ldGhvZCwgRUpCX0hPTUVfR1JPVVApOyAvLyBzaW5jZSB3ZSdyZSBhZGRpbmcgdGhlIG1lc3NhZ2UgdG8gdGhlIGJlYW4gY2xhc3MsIHdlIG5lZWQgdG8gbWFyayBpdCBsaWtlIHRoZSBiZWFuIGNsYXNzIHdvdWxkOyBpLmUuLCBhIGhvbWUtZGVwZW5kZW50IG1lc3NhZ2UKLQkJCX0KLQkJfQotCQkqLwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyB0aGlzSG9tZSkgewotCQkvLyBUaGUgSmF2YSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgbXVzdCBtYXRjaCB0aGUgRUpCIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KLQkJLy8gZS5nLiBpZiBFSkIgQiBpcyBhIGNoaWxkIG9mIEVKQiBBLCB0aGVuIGNsYXNzIEIgbXVzdCBiZSBhIGNoaWxkIG9mIGNsYXNzIEEuCi0JCS8vIEIgY291bGQgYmUgYSBncmFuZGNoaWxkIChvciBncmVhdC1ncmFuZGNoaWxkIG9yIC4uLikgb2YgQS4KLQkJCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJLy8gYmVhbiBoYXMgbm8gc3VwZXJ0eXBlCi0JCQlyZXR1cm47Ci0JCX0KLQkJRW50ZXJwcmlzZUJlYW4Jc3VwZXJ0eXBlID0gZ2V0U3VwZXJUeXBlKGJlYW4pOwotCQlKYXZhQ2xhc3MgcGFyZW50SG9tZSA9IG51bGw7Ci0JCWlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewotCQkJLy8gY2hlY2sgdGhpcyBDTVAncyBzdXBlcnR5cGUKLQkJCXBhcmVudEhvbWUgPSBzdXBlcnR5cGUuZ2V0SG9tZUludGVyZmFjZSgpOwotCi0JCQkvLyBIb21lIGEgWGNoaWxkIG9mIHBhcmVudCBIb21lCi0JCQkvLyBJbiBvdXIgRUpCIGNvbXBvbmVudCBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUsIHdoaWxlIGl0IGlzIGxlZ2FsIGZvcgotCQkJLy8gYSBob21lIHRvIGluaGVyaXQgZnJvbSBhbm90aGVyIGhvbWUsIChzZWN0aW9uIEIuMiksIGl0IGlzIG5vdCBsZWdhbAotCQkJLy8gZm9yIFdTQSBjb21wb25lbnQgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLiAKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHRoaXNIb21lKTsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocGFyZW50SG9tZSk7Ci0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHRoaXNIb21lLCBwYXJlbnRIb21lKSkgewotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0gbmV3IFN0cmluZ1tdIHsgdGhpc0hvbWUuZ2V0UXVhbGlmaWVkTmFtZSgpLCBwYXJlbnRIb21lLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpc0hvbWUsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBiZWFuLmdldE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlS2V5Q2xhc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVLZXlDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGI5NzUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVLZXlDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkga2V5IGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIDkuMi45IEVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MKLSAqICAtIFRoZSBCZWFuIFByb3ZpZGVyIG11c3Qgc3BlY2lmeSBhIHByaW1hcnkga2V5IGNsYXNzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiAgLSBUaGUgcHJpbWFyeSBrZXkgdHlwZSBtdXN0IGJlIGEgbGVnYWwgVmFsdWUgVHlwZSBpbiBSTUktSUlPUC4KLSAqICAtIFRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgc3VpdGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhhc2hDb2RlKCkgYW5kIAotICogICAgZXF1YWxzKE9iamVjdCBvdGhlcikgbWV0aG9kcyB0byBzaW1wbGlmeSB0aGUgbWFuYWdlbWVudCBvZiB0aGUgcHJpbWFyeSBrZXlzIAotICogICAgYnkgY2xpZW50IGNvZGUuCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZUtleUNsYXNzIGV4dGVuZHMgQVZhbGlkYXRlRUpCIHsKLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAoKEVudGl0eSkgcGFyZW50KS5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGtleSBjbGFzcycgbWV0aG9kIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcyAKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBrZXkgY2xhc3MnIGZpZWxkIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcwotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoc3VwZXIuaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCS8vIGV4Y2x1ZGUgcm9vdCBvYmplY3QgbWV0aG9kcwotCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNKYXZhTGFuZ09iamVjdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiA5LjIuOSBFbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzCi0JICogIC0gVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY2xhc3MgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gKGNoZWNrZWQgYnkgdGhlIE1PRiBtb2RlbCkKLQkgKiAgLSBUaGUgcHJpbWFyeSBrZXkgdHlwZSBtdXN0IGJlIGEgbGVnYWwgVmFsdWUgVHlwZSBpbiBSTUktSUlPUC4gKGZvciBrZXkgZmllbGRzLCBjaGVja2VkIGluIHRoZSBWYWxpZGF0ZUVudGl0eUJlYW4gY2xhc3MpCi0JICogIC0gVGhlIGNsYXNzIG11c3QgcHJvdmlkZSBzdWl0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGFzaENvZGUoKSBhbmQgCi0JICogICAgZXF1YWxzKE9iamVjdCBvdGhlcikgbWV0aG9kcyB0byBzaW1wbGlmeSB0aGUgbWFuYWdlbWVudCBvZiB0aGUgcHJpbWFyeSBrZXlzIAotCSAqICAgIGJ5IGNsaWVudCBjb2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCXZhbGlkYXRlTGVnYWxSTUlUeXBlKHZjLCBiZWFuLCBjbGF6eik7Ci0KLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1VubmFtZWRQYWNrYWdlKGNsYXp6LmdldEphdmFQYWNrYWdlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gY2xhc3MgaXMgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLgotCSAqCi0JICogSmF2YSBSZW1vdGUgTWV0aG9kSW52b2NhdGlvbgotCSAqIFNwZWNpZmljYXRpb24KLQkgKgotCSAqIFJldmlzaW9uIDEuNywgSmF2YSAyIFNESywgU3RhbmRhcmQgRWRpdGlvbiwgdjEuMy4wLCBEZWNlbWJlciAxOTk5Ci0JICoKLQkgKiAyLjYgUGFyYW1ldGVyIFBhc3NpbmcgaW4gUmVtb3RlIE1ldGhvZCBJbnZvY2F0aW9uCi0JICogICBBbiBhcmd1bWVudCB0bywgb3IgYSByZXR1cm4gdmFsdWUgZnJvbSwgYSByZW1vdGUgb2JqZWN0IGNhbiBiZSBhbnkgb2JqZWN0IHRoYXQKLQkgKiAgIGlzIHNlcmlhbGl6YWJsZS4gVGhpcyBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMsIHJlbW90ZSBvYmplY3RzLCBhbmQgbm9uLXJlbW90ZQotCSAqICAgb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgamF2YS5pby5TZXJpYWxpemFibGUgaW50ZXJmYWNlLiBGb3IgbW9yZQotCSAqICAgZGV0YWlscyBvbiBob3cgdG8gbWFrZSBjbGFzc2VzIHNlcmlhbGl6YWJsZSwgc2VlIHRoZSBKYXZhIE9iamVjdCBTZXJpYWxpemF0aW9uCi0JICogICBTcGVjaWZpY2F0aW9uLiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUxlZ2FsUk1JVHlwZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGNsYXp6KTsKLQotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIGNsYXp6KSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogOS4yLjkgRW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcwotCSAqICAtIFRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgc3VpdGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhhc2hDb2RlKCkgYW5kIAotCSAqICAgIGVxdWFscyhPYmplY3Qgb3RoZXIpIG1ldGhvZHMgdG8gc2ltcGxpZnkgdGhlIG1hbmFnZW1lbnQgb2YgdGhlIHByaW1hcnkga2V5cyAKLQkgKiAgICBieSBjbGllbnQgY29kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgc3VpdGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhhc2hDb2RlKCkgYW5kIAotCQkvLyBlcXVhbHMoT2JqZWN0IG90aGVyKSBtZXRob2RzIHRvIHNpbXBsaWZ5IHRoZSBtYW5hZ2VtZW50IG9mIHRoZSBwcmltYXJ5IGtleXMgCi0JCS8vIGJ5IGNsaWVudCBjb2RlLgotCQlNZXRob2QgaGFzaENvZGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0hBU0hDT0RFLCBuZXcgSmF2YUhlbHBlcnNbMF0pOwotCQlpZiAoKGhhc2hDb2RlTWV0aG9kID09IG51bGwpIHx8IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0phdmFMYW5nT2JqZWN0TWV0aG9kKGJlYW4sIGhhc2hDb2RlTWV0aG9kKSkgewotCQkJLy8gRUpCIDEuMCBkaWQgbm90IHJlcXVpcmUgdGhpcyBtZXRob2QsIHNvIHRoaXMgaXMgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gZXJyb3IuCi0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCksIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0RTSUdOQVRVUkVfSEFTSENPREV9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDAxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCU1ldGhvZCBlcXVhbHNNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VRVUFMUywgbmV3IEphdmFIZWxwZXJzW117VmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QsIGJlYW4pfSk7Ci0JCWlmICgoZXF1YWxzTWV0aG9kID09IG51bGwpIHx8IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNKYXZhTGFuZ09iamVjdE1ldGhvZChiZWFuLCBlcXVhbHNNZXRob2QpKSkgewotCQkJLy8gRUpCIDEuMCBkaWQgbm90IHJlcXVpcmUgdGhpcyBtZXRob2QsIHNvIHRoaXMgaXMgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gZXJyb3IuCi0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCksIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0RTSUdOQVRVUkVfRVFVQUxTIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlUmVtb3RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlUmVtb3RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOTBjNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZVJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgcmVtb3RlIGludGVyZmFjZSBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICogVGhlIGNoZWNrcyBmb3IgYSBzZXNzaW9uIHJlbW90ZSBpbnRlcmZhY2UgYW5kIGFuIGVudGl0eSByZW1vdGUgaW50ZXJmYWNlIGFyZSB0aGUgc2FtZQotICogaW4gRUpCIDEuMS4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHBhcmFncmFwaCBpcyB0YWtlbiBmcm9tCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqIDkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBIDk0MzAzLCBVLlMuQS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogNi4xMC41IFNlc3Npb24gYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UKLSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlOgotICoJCS0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuCi0gKgkJLSBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JL0lJT1AuCi0gKiAgICAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0gKiAgICAgICAgZm9yIFJNSS9JSU9QLCBhbmQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLSAqCQktIFRoZSByZW1vdGUgaW50ZXJmYWNlIGlzIGFsbG93ZWQgdG8gaGF2ZSBzdXBlcmludGVyZmFjZXMuIFVzZSBvZiBpbnRlcmZhY2UKLSAqICAgICAgICBpbmhlcml0YW5jZSBpcyBzdWJqZWN0IHRvIHRoZSBSTUkvSUlPUCBydWxlcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgcmVtb3RlIGludGVyZmFjZXMuCi0gKgkJLSBGb3IgZWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSwgdGhlcmUgbXVzdCBiZSBhIG1hdGNoaW5nCi0gKiAgICAgICAgbWV0aG9kIGluIHRoZSBzZXNzaW9uIGJlYW4ncyBjbGFzcy4gCi0gKgkJCS0gVGhlIG1hdGNoaW5nIG1ldGhvZCBtdXN0IGhhdmU6Ci0gKgkJCQktIFRoZSBzYW1lIG5hbWUuCi0gKgkJCQktIFRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLCBhbmQgdGhlIHNhbWUgcmV0dXJuIHR5cGUuCi0gKgkJCQktIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyAKLSAqICAgICAgICAgICAgICAgIG1ldGhvZCBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIAotICogICAgICAgICAgICAgICAgY2xhdXNlIG9mIHRoZSBtZXRob2Qgb2YgdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0gKgotICogOS4yLjcgRW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlCi0gKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlOgotICogCQktIFRoZSBpbnRlcmZhY2UgbXVzdCBleHRlbmQgdGhlIGphdmF4LmVqYi5FSkJPYmplY3QgaW50ZXJmYWNlLgotICogCQktIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUktSUlPUC4gCi0gKiAJCSAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSB2YWxpZCB0eXBlcyBmb3IgUk1JLUlJT1AsIAotICogCQkgIGFuZCB0aGVpciB0aHJvd3MgY2xhdXNlcyBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLSAqIAkJLSBUaGUgcmVtb3RlIGludGVyZmFjZSBpcyBhbGxvd2VkIHRvIGhhdmUgc3VwZXJpbnRlcmZhY2VzLiBVc2Ugb2YgaW50ZXJmYWNlIGluaGVyaXRhbmNlIAotICoJCSAgaXMgc3ViamVjdCB0byB0aGUgUk1JLUlJT1AgcnVsZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHJlbW90ZSBpbnRlcmZhY2VzLiAKLSAqIAkJLSBGb3IgZWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSwgdGhlcmUgbXVzdCBiZSBhIG1hdGNoaW5nIG1ldGhvZCAKLSAqCQkgIGluIHRoZSBlbnRpdHkgYmVhbidzIGNsYXNzLiBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgaGF2ZToKLSAqIAkJCS0gVGhlIHNhbWUgbmFtZS4KLSAqCQkJLSBUaGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMsIGFuZCB0aGUgc2FtZSByZXR1cm4gdHlwZS4KLSAqCQkJLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIAotICoJCQkgIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIAotICoJCQkgIHRoZSBtZXRob2Qgb2YgdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVSZW1vdGUgZXh0ZW5kcyBBVmFsaWRhdGVFSkIgewotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gKChFbnRlcnByaXNlQmVhbilwYXJlbnQpLmdldFJlbW90ZUludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSAgewotCQkvLyBBIGhvbWUgb3IgY29tcG9uZW50IGNsYXNzIG5lZWRzIHRoZSBmb2xsb3dpbmcgY2xhc3NlcycgZXh0ZW5kZWQgbWV0aG9kczoKLQkJLy8gICAgMS4gYmVhbiBjbGFzcwotCQlMaXN0W10gcmVzdWx0ID0gbmV3IExpc3RbMV07Ci0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCWlmKGJlYW5DbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXN1bHRbMF0gPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzBdID0gYmVhbkNsYXNzLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGhvbWUgb3IgY29tcG9uZW50J3MgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBjYW4sIGFuZCBzaG91bGQsIGJlIHZhbGlkYXRlZC4KLQkgKiBGaWx0ZXIgb3V0IGZhdWx0eSBtZXRob2RzIChpLmUuLCBudWxsKSwgYW5kIG1ldGhvZHMgd2hpY2gKLQkgKiBiZWxvbmcgdG8gdGhlIGJhc2UgdHlwZSwgd2hhdGV2ZXIgdGhhdCBpcy4gKGUuZy4gamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChzdXBlci5pc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KSkgewotCQkJLy8gRXhjbHVkZSByb290IHJlbW90ZSBpbnRlcmZhY2UgbWV0aG9kcyAKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNFSkJPYmplY3RNZXRob2QoYmVhbiwgbWV0aG9kKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGlzRWpiUmVsYXRpb25zaGlwUm9sZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNDbGluaXRNZXRob2QoYmVhbiwgbWV0aG9kKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhlIHJlbW90ZSBpbnRlcmZhY2UncyBtZXRob2RzIGFnYWluc3QgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKiAKLQkgKiA2LjEwLjUgU2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZQotCSAqIC4uLgotCSAqCQktIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUkvSUlPUC4KLQkgKiAgICAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogICAgICAgIGZvciBSTUkvSUlPUCwgYW5kIHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICogLi4uCi0JICoJCS0gRm9yIGVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZwotCSAqICAgICAgICBtZXRob2QgaW4gdGhlIHNlc3Npb24gYmVhbidzIGNsYXNzLiAKLQkgKgkJCS0gVGhlIG1hdGNoaW5nIG1ldGhvZCBtdXN0IGhhdmU6Ci0JICoJCQkJLSBUaGUgc2FtZSBuYW1lLgotCSAqCQkJCS0gVGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMsIGFuZCB0aGUgc2FtZSByZXR1cm4gdHlwZS4KLQkgKgkJCQktIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyAKLQkgKiAgICAgICAgICAgICAgICBtZXRob2Qgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyAKLQkgKiAgICAgICAgICAgICAgICBjbGF1c2Ugb2YgdGhlIG1ldGhvZCBvZiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLQkgKiAuLi4KLQkgKiA5LjIuNyBFbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UKLQkgKiAuLi4KLQkgKiAJCS0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS1JSU9QLiAKLQkgKiAJCSAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSB2YWxpZCB0eXBlcyBmb3IgUk1JLUlJT1AsIAotCSAqIAkJICBhbmQgdGhlaXIgdGhyb3dzIGNsYXVzZXMgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICogLi4uCi0JICogCQktIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcgbWV0aG9kIAotCSAqCQkgIGluIHRoZSBlbnRpdHkgYmVhbidzIGNsYXNzLiBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgaGF2ZToKLQkgKiAJCQktIFRoZSBzYW1lIG5hbWUuCi0JICoJCQktIFRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cywgYW5kIHRoZSBzYW1lIHJldHVybiB0eXBlLgotCSAqCQkJLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIAotCSAqCQkJICBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiAKLQkgKgkJCSAgdGhlIG1ldGhvZCBvZiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLQkgKiAuLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCByaU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy8gc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UocmlNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgcmlNZXRob2QpOwotCi0JCS8vIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcKLQkJLy8gbWV0aG9kIGluIHRoZSBzZXNzaW9uIGJlYW4ncyBjbGFzcy4gCi0JCXZhbGlkYXRlTWV0aG9kX2JlYW5EZXAodmMsIGJlYW4sIGNsYXp6LCByaU1ldGhvZCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UoZWpiTWV0aG9kKTsKLQotCQkvL1RoZXJlIGFyZSBubyByZXF1aXJlZCBtZXRob2RzLgotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGF0IHRoZSByZW1vdGUgaW50ZXJmYWNlIGNsYXNzIGRlZmluaXRpb24gZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqCi0JICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotCSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLQkgKiBWZXJzaW9uOiAxLjEKLQkgKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLQkgKiBSZWxlYXNlOiAxMi8xNy85OQotCSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLQkgKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0JICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQkgKgotCSAqIDYuMTAuNSBTZXNzaW9uIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBpbnRlcmZhY2U6Ci0JICoJCS0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuCi0JICogLi4uCi0JICoJCS0gVGhlIHJlbW90ZSBpbnRlcmZhY2UgaXMgYWxsb3dlZCB0byBoYXZlIHN1cGVyaW50ZXJmYWNlcy4gVXNlIG9mIGludGVyZmFjZQotCSAqICAgICAgICBpbmhlcml0YW5jZSBpcyBzdWJqZWN0IHRvIHRoZSBSTUkvSUlPUCBydWxlcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgcmVtb3RlIGludGVyZmFjZXMuCi0JICogLi4uCi0JICogOS4yLjcgRW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZToKLQkgKiAJCS0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuCi0JICogLi4uCi0JICogCQktIFRoZSByZW1vdGUgaW50ZXJmYWNlIGlzIGFsbG93ZWQgdG8gaGF2ZSBzdXBlcmludGVyZmFjZXMuIFVzZSBvZiBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgCi0JICoJCSAgaXMgc3ViamVjdCB0byB0aGUgUk1JLUlJT1AgcnVsZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHJlbW90ZSBpbnRlcmZhY2VzLgotCSAqIC4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIEl0IG11c3QgYmUgYW4gaW50ZXJmYWNlLCBub3QgYSBjbGFzcy4KLQkJaWYgKCFjbGF6ei5pc0ludGVyZmFjZSgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBpbnRlcmZhY2UgbXVzdCBleHRlbmQgdGhlIGphdmF4LmVqYi5FSkJPYmplY3QgaW50ZXJmYWNlLgotCQlKYXZhSGVscGVycyBqYXZheEVqYk9iamVjdCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCT0JKRUNULCBiZWFuKTsKLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShjbGF6eiwgamF2YXhFamJPYmplY3QpKSB7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQk9CSkVDVCB9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1VubmFtZWRQYWNrYWdlKGNsYXp6LmdldEphdmFQYWNrYWdlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIDYuMTAuNQotCSAqIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcgCi0JICogbWV0aG9kIGluIHRoZSBzZXNzaW9uIGJlYW4ncyBjbGFzcy4gVGhlIG1hdGNoaW5nIG1ldGhvZCBtdXN0IGhhdmU6Ci0JICogICAtIFRoZSBzYW1lIG5hbWUuCi0JICogICAtIFRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLCBhbmQgdGhlIHNhbWUgcmV0dXJuIHR5cGUuCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgCi0JICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkgKiAgICAgbWV0aG9kIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCSAqCi0JICogOS4yLjcKLQkgKiBGb3IgZWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSwgdGhlcmUgbXVzdCBiZSBhIG1hdGNoaW5nIAotCSAqIG1ldGhvZCBpbiB0aGUgZW50aXR5IGJlYW4ncyBjbGFzcy4gVGhlIG1hdGNoaW5nIG1ldGhvZCBtdXN0IGhhdmU6Ci0JICogICAtIFRoZSBzYW1lIG5hbWUuCi0JICogICAtIFRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cywgYW5kIHRoZSBzYW1lIHJldHVybiB0eXBlLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIAotCSAqICAgICBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiAKLQkgKiAgICAgdGhlIG1ldGhvZCBvZiB0aGUgcmVtb3RlIGludGVyZmFjZS4gCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0JlYW5NZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCByZW1vdGVNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAocmVtb3RlTWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuQ2xhc3MpOwotCi0JCU1ldGhvZCBiZWFuTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW5DbGFzcywgcmVtb3RlTWV0aG9kLCByZW1vdGVNZXRob2QuZ2V0TmFtZSgpKTsKLQkJaWYgKGJlYW5NZXRob2QgPT0gbnVsbCkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgYmVhbkNsYXNzLmdldE5hbWUoKX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDIzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCByZW1vdGVNZXRob2QsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShyZW1vdGVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSk7Ci0KLQkJdHJ5IHsKLQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKSkpOwotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJLy8gTGV0IHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBiZWFuIGNsYXNzIHJlcG9ydCB0aGUgcmVmbGVjdGlvbiB3YXJuaW5nLgotCQkJLy8gRG9uJ3QgZG8gYW55IHZhbGlkYXRpb24gYmFzZWQgb24gdGhhdCBtZXRob2QuCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDaGVjayBpZiByZXR1cm4gdHlwZXMgbWF0Y2gKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZW1vdGVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgcmVtb3RlTWV0aG9kLCBuZXcgU3RyaW5nW10geyBiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpLCBiZWFuQ2xhc3MuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQotCQkvLyBTZWN0aW9uIDYuMTAuNSAoc2Vzc2lvbiksIDkuMi43IChlbnRpdHkpLCBkZWNsYXJlIHRoYXQgYWxsIGV4Y2VwdGlvbnMgZGVjbGFyZWQKLQkJLy8gb24gdGhlIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZgotCQkvLyB0aGUgbWF0Y2hpbmcgY3JlYXRlIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCQkvKgotCQkvLyBEb24ndCBjaGVjayBmb3IgdGhlIGV4Y2VwdGlvbnMgaGVyZSAtIGxldCB0aGUgYmVhbiBjbGFzcyBkbyBpdC4gV2hlbiB0aGUgcmVtb3RlCi0JCS8vIGNoYW5nZXMsIGEgImRlcGVuZGVudCIgdmFsaWRhdGlvbiBvZiB0aGUgYmVhbidzIGNoZWNrcyBzaG91bGQgYmUgZG9uZSBhdXRvbWF0aWNhbGx5LgotCQkvLyBJZiBpdCBpcyBjaGVja2VkIGluIHRoaXMgbWV0aG9kIGFzIHdlbGwsIHRoZXJlIGFyZSBkdXBsaWNhdGUgbWVzc2FnZXMgb24gdGhlIHRhc2sgbGlzdC4KLQkJSGFzaFNldCBleGNlcHRpb25zID0gZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhyZW1vdGVNZXRob2QsIGJlYW5NZXRob2QpOwotCQlpZihleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkVKQl9NRVRIT0RfVEhST1dfTk9UUklfRVhDRVAsIG1zZ1Bhcm0sIGJlYW5NZXRob2QsIEVKQl9CRUFOX0dST1VQKTsKLQkJCX0KLQkJfQkKLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhlIHJlbW90ZSBpbnRlcmZhY2UncyBtZXRob2RzIGFnYWluc3QgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKiAKLQkgKiA2LjEwLjUgU2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZQotCSAqIC4uLgotCSAqCQktIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUkvSUlPUC4KLQkgKiAgICAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogICAgICAgIGZvciBSTUkvSUlPUCwgYW5kIHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICogLi4uCi0JICoJCS0gRm9yIGVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZwotCSAqICAgICAgICBtZXRob2QgaW4gdGhlIHNlc3Npb24gYmVhbidzIGNsYXNzLiAKLQkgKgkJCS0gVGhlIG1hdGNoaW5nIG1ldGhvZCBtdXN0IGhhdmU6Ci0JICoJCQkJLSBUaGUgc2FtZSBuYW1lLgotCSAqCQkJCS0gVGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMsIGFuZCB0aGUgc2FtZSByZXR1cm4gdHlwZS4KLQkgKgkJCQktIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyAKLQkgKiAgICAgICAgICAgICAgICBtZXRob2Qgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyAKLQkgKiAgICAgICAgICAgICAgICBjbGF1c2Ugb2YgdGhlIG1ldGhvZCBvZiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLQkgKiAuLi4KLQkgKiA5LjIuNyBFbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UKLQkgKiAuLi4KLQkgKiAJCS0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS1JSU9QLiAKLQkgKiAJCSAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSB2YWxpZCB0eXBlcyBmb3IgUk1JLUlJT1AsIAotCSAqIAkJICBhbmQgdGhlaXIgdGhyb3dzIGNsYXVzZXMgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICogLi4uCi0JICogCQktIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcgbWV0aG9kIAotCSAqCQkgIGluIHRoZSBlbnRpdHkgYmVhbidzIGNsYXNzLiBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgaGF2ZToKLQkgKiAJCQktIFRoZSBzYW1lIG5hbWUuCi0JICoJCQktIFRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cywgYW5kIHRoZSBzYW1lIHJldHVybiB0eXBlLgotCSAqCQkJLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIAotCSAqCQkJICBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiAKLQkgKgkJCSAgdGhlIG1ldGhvZCBvZiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLQkgKiAuLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZF9iZWFuRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgcmlNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkvLyBGb3IgZWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSwgdGhlcmUgbXVzdCBiZSBhIG1hdGNoaW5nCi0JCS8vIG1ldGhvZCBpbiB0aGUgc2Vzc2lvbiBiZWFuJ3MgY2xhc3MuIAotCQl2YWxpZGF0ZU1hdGNoaW5nQmVhbk1ldGhvZCh2YywgYmVhbiwgY2xhenosIHJpTWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogRmluYWwgY2hlY2sgdG8gc2VlIGlmIHJlcXVpcmVkIG1ldGhvZHMgd2VyZSBkZXRlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vVGhlcmUgYXJlIG5vIHJlcXVpcmVkIG1ldGhvZHMuCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcHBlbmRpeEIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgdGhpc1JlbW90ZSkgewotCQkvLyBUaGUgSmF2YSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgbXVzdCBtYXRjaCB0aGUgRUpCIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KLQkJLy8gZS5nLiBpZiBFSkIgQiBpcyBhIGNoaWxkIG9mIEVKQiBBLCB0aGVuIGNsYXNzIEIgbXVzdCBiZSBhIGNoaWxkIG9mIGNsYXNzIEEuCi0JCS8vIEIgY291bGQgYmUgYSBncmFuZGNoaWxkIChvciBncmVhdC1ncmFuZGNoaWxkIG9yIC4uLikgb2YgQS4KLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW50ZXJwcmlzZUJlYW4gc3VwZXJ0eXBlID0gZ2V0U3VwZXJUeXBlKGJlYW4pOwotCQlKYXZhQ2xhc3MgcGFyZW50UmVtb3RlID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRSZW1vdGUgPSBzdXBlcnR5cGUuZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0KLQkJCS8vIFJlbW90ZSBhIFhjaGlsZCBvZiBwYXJlbnQgUmVtb3RlCi0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0aGlzUmVtb3RlKTsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocGFyZW50UmVtb3RlKTsKLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHRoaXNSZW1vdGUsIHBhcmVudFJlbW90ZSkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IHRoaXNSZW1vdGUuZ2V0UXVhbGlmaWVkTmFtZSgpLCBwYXJlbnRSZW1vdGUuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzUmVtb3RlLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0aW9uUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0aW9uUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTkwNTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGlvblJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5FamJNb2R1bGVFeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSVZhbGlkYXRpb25SdWxlIHsKLQotICAgIHByaXZhdGUgU2V0IF9kZXBlbmRlbnRzID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgbW9kSGVscGVyID0gbnVsbDsKLQotICAgIC8qCi0gICAgICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjYWRkRGVwZW5kZW50KElWYWxpZGF0aW9uUnVsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmRlbnQoSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLSAgICAgICAgaWYgKHJ1bGUgPT0gbnVsbCkgeyByZXR1cm47IH0KLQotICAgICAgICBpZiAoX2RlcGVuZGVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgX2RlcGVuZGVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgX2RlcGVuZGVudHMuYWRkKHJ1bGUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjZ2V0RGVwZW5kZW50cygpCi0gICAgICovCi0gICAgcHVibGljIFNldCBnZXREZXBlbmRlbnRzKCkgewotICAgICAgICByZXR1cm4gX2RlcGVuZGVudHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBnZXRFamJFeHRlbnNpb25IZWxwZXIoT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIElFSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5JTlNUQU5DRS5nZXRFSkJNb2R1bGVFeHRlbnNpb24oY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIEVudGVycHJpc2VCZWFuCi0gICAgICogQHJldHVybiBFbnRlcnByaXNlQmVhbiByZXR1cm4gdGhlIHN1cGVyIHR5cGUgb2YgYW4gRW50ZXJwcmlzZUJlYW4gYnkKLSAgICAgKiAgICAgICAgIGxvYWRpbmcgdGhlIGV4dG5lbnNpb24gcGx1Z2luIGlmIGV4dGVuc2lvbiBwbHVnaW4gZmFpbHMgdG8gbG9hZAotICAgICAqICAgICAgICAgcmV0dXJuIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgRW50ZXJwcmlzZUJlYW4gZ2V0U3VwZXJUeXBlKEVudGVycHJpc2VCZWFuIGVudGVycHJpc2VCZWFuKSB7Ci0gICAgICAgIEVudGVycHJpc2VCZWFuIHN1cGVyVHlwZSA9IG51bGw7Ci0gICAgICAgIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBhTW9kSGVscGVyID0gZ2V0RWpiRXh0ZW5zaW9uSGVscGVyKGVudGVycHJpc2VCZWFuKTsKLSAgICAgICAgaWYgKGFNb2RIZWxwZXIgIT0gbnVsbCkgc3VwZXJUeXBlID0gYU1vZEhlbHBlci5nZXRTdXBlclR5cGUoZW50ZXJwcmlzZUJlYW4pOwotICAgICAgICByZXR1cm4gc3VwZXJUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBFbnRlcnByaXNlQmVhbgotICAgICAqIEByZXR1cm4gU3RyaW5nIC0gc3VwZXIgdHlwZSBmaWxlIG5hbWUgcmV0dXJuIHRoZSBzdXBlciB0eXBlIGZpbGUgb2YgYW4KLSAgICAgKiAgICAgICAgIEVudGVycHJpc2VCZWFuIGJ5IGxvYWRpbmcgdGhlIGV4dG5lbnNpb24gcGx1Z2luIGlmIGV4dGVuc2lvbgotICAgICAqICAgICAgICAgcGx1Z2luIGZhaWxzIHRvIGxvYWQgcmV0dXJuIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVKQkluaGVyaXRhbmNlRmlsZU5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBzdXBlclR5cGVGaWxlTmFtZSA9IG51bGw7Ci0gICAgICAgIC8vIFRPRE8gTURFIFJldmlzaXQgdGhpcyBhZnRlciB0aGUgZHJvcAotICAgICAgICBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgYU1vZEhlbHBlciA9IGdldEVqYkV4dGVuc2lvbkhlbHBlcihudWxsKTsKLSAgICAgICAgaWYgKGFNb2RIZWxwZXIgIT0gbnVsbCkgc3VwZXJUeXBlRmlsZU5hbWUgPSBhTW9kSGVscGVyLmdldEVKQkluaGVyaXRhbmNlRmlsZU5hbWUoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyVHlwZUZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBFbnRlcnByaXNlQmVhbgotICAgICAqIEByZXR1cm4gTGlzdCAtIGV4dGVuZGVkIHJvbGUgbmFtZXMgcmV0dXJuIHRoZSBleHRlbmRlZCByb2xlIG1ldGhvZCBuYW1lCi0gICAgICogICAgICAgICBvZiBhbiBFbnRlcnByaXNlQmVhbiBieSBsb2FkaW5nIHRoZSBleHRuZW5zaW9uIHBsdWdpbiBpZgotICAgICAqICAgICAgICAgZXh0ZW5zaW9uIHBsdWdpbiBmYWlscyB0byBsb2FkIHJldHVybiBudWxsCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIExpc3QgZ2V0Um9sZU1ldGhvZE5hbWVzRXh0ZW5kZWQoRW50ZXJwcmlzZUJlYW4gZW50ZXJwcmlzZUJlYW4pIHsKLSAgICAgICAgTGlzdCByb2xlTmFtZUV4dGVuZGVkID0gbnVsbDsKLSAgICAgICAgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGFNb2RIZWxwZXIgPSBnZXRFamJFeHRlbnNpb25IZWxwZXIoZW50ZXJwcmlzZUJlYW4pOwotICAgICAgICBpZiAoYU1vZEhlbHBlciAhPSBudWxsICYmIGVudGVycHJpc2VCZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKQotICAgICAgICAgICAgICAgIHJvbGVOYW1lRXh0ZW5kZWQgPSBhTW9kSGVscGVyLmdldFJvbGVNZXRob2ROYW1lc0V4dGVuZGVkKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBlbnRlcnByaXNlQmVhbik7Ci0gICAgICAgIHJldHVybiByb2xlTmFtZUV4dGVuZGVkOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGFsbG9jYXRlIG5vdGhpbmcuCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwb3N0VmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3N0VmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBCeSBkZWZhdWx0LCBhc3N1bWUgdGhhdCBub3RoaW5nIHdhcyBhbGxvY2F0ZWQgaW4gcHJlVmFsaWRhdGUuCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGFzc3VtZSB0aGF0IG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVzZXQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Fic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MDRkMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Fic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIEVKQiBWYWxpZGF0aW9uIHJ1bGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkoKSB7Ci0JCS8vRGVmYXVsdAotICAgIH0KLQotICAgIHByb3RlY3RlZCBIYXNoTWFwIF9ydWxlTGlzdCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0gICAgCWlmKHJ1bGUgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCQotICAgIAkvLyBTaW5jZSB3ZSBkb24ndCBwdXQgYSBsb2NrIG9uIHRoZSBydWxlIHdoZW4gaXQncyBjaGVja2VkIG91dCB2aWEgZ2V0UnVsZShPYmplY3QpLAotICAgIAkvLyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gb3RoZXIgdGhhbiByZXNldCB0aGUgcnVsZSB0byBwcmVwYXJlIGl0IGZvciByZXVzZS4KLSAgICAJcnVsZS5yZXNldCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJdGVyYXRvciBhZGREZXBlbmRlbnRSdWxlVG9SdWxlTGlzdCgpIHsKLSAgICAJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcnVsZUxpc3QudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCQlJVmFsaWRhdGlvblJ1bGUgcnVsZSA9IChJVmFsaWRhdGlvblJ1bGUpaXRlcmF0b3IubmV4dCgpOwotICAgIAkJT2JqZWN0W10gaWRzID0gcnVsZS5nZXREZXBlbmRzT24oKTsKLSAgICAJCWlmKGlkcyA9PSBudWxsKSB7Ci0gICAgCQkJY29udGludWU7Ci0gICAgCQl9Ci0gICAgCQkKLSAgICAJCWZvcihpbnQgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykgewotICAgIAkJCUlWYWxpZGF0aW9uUnVsZSBkUnVsZSA9IChJVmFsaWRhdGlvblJ1bGUpX3J1bGVMaXN0LmdldChpZHNbaV0pOwotICAgIAkJCWlmKGRSdWxlICE9IG51bGwpIHsKLSAgICAJCQkJZFJ1bGUuYWRkRGVwZW5kZW50KHJ1bGUpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAlyZXR1cm4gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nQWxsRGVwZW5kZW50UnVsZXMoKSB7Ci0gICAgCUl0ZXJhdG9yIGl0ZXJhdG9yOwotICAgIAlMb2dnZXIgbG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0gICAgCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotICAgIAkJaXRlcmF0b3IgPSBfcnVsZUxpc3QudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAJCUl0ZXJhdG9yIGRlcEl0ZXJhdG9yID0gbnVsbDsKLSAgICAJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgIAkJCUlWYWxpZGF0aW9uUnVsZSBydWxlID0gKElWYWxpZGF0aW9uUnVsZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgCQkJU2V0IGRlcGVuZGVudHMgPSBydWxlLmdldERlcGVuZGVudHMoKTsKLSAgICAJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIAkJCWJ1ZmZlci5hcHBlbmQoImxpc3Qgb2YgZGVwZW5kZW50cyBmb3IgcnVsZToiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCWJ1ZmZlci5hcHBlbmQocnVsZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCWlmKGRlcGVuZGVudHMgIT0gbnVsbCkgewotICAgIAkJCQlkZXBJdGVyYXRvciA9IGRlcGVuZGVudHMuaXRlcmF0b3IoKTsKLSAgICAJCQkJd2hpbGUoZGVwSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCQkJCQlJVmFsaWRhdGlvblJ1bGUgZFJ1bGUgPSAoSVZhbGlkYXRpb25SdWxlKWRlcEl0ZXJhdG9yLm5leHQoKTsKLSAgICAJCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQkJCWJ1ZmZlci5hcHBlbmQoZFJ1bGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIAkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExvZ2dlciBnZXRNc2dMb2dnZXIoKTsKLQotICAgIHByb3RlY3RlZCBFSkJKYXIgZ2V0RUpCSmFyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YykgewotICAgIAlyZXR1cm4gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGlkZW50aWZpZWQgSVZhbGlkYXRpb25SdWxlLgotICAgICAqIElmIHRoZSBydWxlaWQgaXMgbm90IHJlZ2lzdGVyZWQsIG9yIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotICAgICAqIGluc3RhbnRpYXRpbmcgdGhlIElWYWxpZGF0aW9uUnVsZSwgdGhlbiBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHVibGljIElWYWxpZGF0aW9uUnVsZSBnZXRSdWxlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHJ1bGVJZCkgewotICAgIAkvLyBUbyBhdm9pZCBsb2FkaW5nIGEgcnVsZSB1bnRpbCBpdCBpcyBuZWVkZWQsIGludGlhbGl6ZQotICAgIAkvLyB0aGUgbGlzdCB3aXRoIGEgcnVsZSBpZCBhcyB0aGUga2V5LCBhbmQgYSBTdHJpbmcgY2xhc3MgbmFtZQotICAgIAkvLyBhcyBhIHZhbHVlLiBXaGVuIGEgcnVsZSBpcyBsb2FkZWQsIGlmIHRoZSB2YWx1ZSBpcyBhIFN0cmluZywKLSAgICAJLy8gdGhlbiB0aGUgSVZhbGlkYXRpb25SdWxlIGhhcyBub3QgYmVlbiBpbnN0YW50aWF0ZWQuIENyZWF0ZSBhbgotICAgIAkvLyBpbnN0YW5jZSBhbmQgc3RvcmUgdGhhdCBpbiBwbGFjZSBvZiB0aGUgU3RyaW5nLiBJZiB0aGUgdmFsdWUKLSAgICAJLy8gaXMgYWxyZWFkeSBhbiBJVmFsaWRhdGlvblJ1bGUgaW5zdGFuY2UsIHJldHVybiBpdC4KLSAgICAJCi0gICAgCU9iamVjdCBydWxlID0gX3J1bGVMaXN0LmdldChydWxlSWQpOwotICAgIAlpZihydWxlID09IG51bGwpIHsKLSAgICAJCS8vIE5vIHN1Y2ggcnVsZUlkIHJlZ2lzdGVyZWQuCi0gICAgCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0gICAgCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0gICAgCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlIGZyb20gcnVsZUlkOiAiICsgcnVsZUlkKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJfQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJCi0gICAgCXJldHVybiAoSVZhbGlkYXRpb25SdWxlKXJ1bGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Fic3RyYWN0RUpCVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5ZDcwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyNCwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb247Ci0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVKQlZhbGlkYXRvciBleHRlbmRzIEoyRUVWYWxpZGF0b3IgewotCXByb3RlY3RlZCBNYXAgX3ZhbGlkYXRlZCA9IG51bGw7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEVKQlZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJX3ZhbGlkYXRlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdSdWxlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHJ1bGVJZCkgewotCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgcnVsZUlkICsgIiA9IG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKHZjKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB7Ci0JCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZSh2YywgbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEludGVybmFsRXJyb3JNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgVGhyb3dhYmxlIGV4YykgewotCQlJTWVzc2FnZSBtc3NnID0gdmMuZ2V0TWVzc2FnZSgpOwotCQltc3NnLnNldElkKGludGVybmFsRXJyb3JNZXNzYWdlKCkpOwotCQl2Yy5hZGRNZXNzYWdlKG1zc2cpOwotCQlpZihleGMgIT0gbnVsbCkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgTWFwIHJlbW92ZU9sZE1lc3NhZ2VzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YyxNYXAgdGFyZ2V0cykgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJaWYodmMuZ2V0VVJJcygpID09IG51bGwpIHsKLQkJCQkvLyBGdWxsIHZhbGlkYXRpb24KLQkJCQl2Yy5yZW1vdmVBbGxNZXNzYWdlcygpOyAvLyBSZW1vdmUgbWVzc2FnZXMgZnJvbSB0aGUgRUpCSmFyLgotCQkJCXZjLmxvYWRNb2RlbChyZW1vdmVPbGRNZXNzYWdlc1N0cmluZygpLCBuZXcgT2JqZWN0W117dmMuZ2V0UmVwb3J0ZXIoKSwgbnVsbH0pOyAvLyBSZW1vdmUgbWVzc2FnZXMgZnJvbSBhbnkgRUpCIGNsaWVudCBKQVIgZmlsZXMgb3IgSmF2YSBVdGlsaXR5IEpBUiBmaWxlcy4KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXByZVJlbW92ZU9sZE1lc3NhZ2VzKHZjLHRhcmdldHMpOyAvLyBHZXQgdGhlIGxpc3Qgb2YgdGFyZ2V0cyB0byBiZSB2YWxpZGF0ZWQsIGFuZCByZW1vdmUgbWVzc2FnZXMgZnJvbSBhbGwgb2YgdGhlbS4KLQotCQkJLy8gUmVtb3ZlIHRoZSBtZXNzYWdlcyBmcm9tIGFsbCBvZiB0aGUgY2hhbmdlZCBmaWxlcyBhbmQgdGhlaXIgZGVwZW5kZW50cy4KLQkJCXZjLmxvYWRNb2RlbChyZW1vdmVPbGRNZXNzYWdlc1N0cmluZygpLCBuZXcgT2JqZWN0W117dmMuZ2V0UmVwb3J0ZXIoKSwgdGFyZ2V0c30pOwotCQkJcmV0dXJuIHRhcmdldHM7Ci0JCX0KLQkvKioKLQkgKiBAcGFyYW0gdmMKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiBAcGFyYW0gdGFyZ2V0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByZVJlbW92ZU9sZE1lc3NhZ2VzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YyxNYXAgdGFyZ2V0cykgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQl9Ci0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVtb3ZlT2xkTWVzc2FnZXNTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkqIEByZXR1cm4KLQkqLwotCXByaXZhdGUgU3RyaW5nIGludGVybmFsRXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5JVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5JSGVscGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLklSZXBvcnRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5JRmlsZURlbHRhW10pCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCQlzdXBlci52YWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgcnVuKElWYWxpZGF0aW9uUnVsZSBydWxlLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgCWlmKGlzVmFsaWRhdGVkKHJ1bGUuZ2V0SWQoKSwgdGFyZ2V0UGFyZW50LCB0YXJnZXQpKSB7Ci0gICAgCQkvLyBXaGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgZnVsbCBvciBpbmNyZW1lbnRhbCBydW4sIGRvbid0IHJldmFsaWRhdGUgdGhpcyB0YXJnZXQKLSAgICAJCS8vIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkLiAoZS5nLiBpZiBhIGNsYXNzIGlzIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBiZWFuLAotICAgIAkJLy8gYW5kIHNheSBvbmUgYmVhbiBpcyBzdGF0ZWxlc3MgYW5kIG9uZSBpcyBzdGF0ZWZ1bCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBhYm91dCB0aGUKLSAgICAJCS8vIGJlYW5zIGFyZSBpZGVudGljYWwsIGRvbid0IHZhbGlkYXRlIHRoYXQgY2xhc3MgYWdhaW4uKQotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCQotICAgIAl0cnkgewotICAgIAkJcnVsZS5wcmVWYWxpZGF0ZShnZXRWYWxpZGF0aW9uQ29udGV4dCgpLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0gICAgCQlydWxlLnZhbGlkYXRlKGdldFZhbGlkYXRpb25Db250ZXh0KCksIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLSAgICAJCXJ1bGUucG9zdFZhbGlkYXRlKGdldFZhbGlkYXRpb25Db250ZXh0KCksIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLSAgICAJfQotICAgIAljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGV4YykgewotICAgIAkJLy8gQ2xlYW4gdXAgdGhlIG1lc3NhZ2VzIHdoaWNoIGFyZSBvbiB0aGUgdGFzayBsaXN0PyBPciBpcyBpdCBuaWNlciB0byBsZWF2ZSB0aGVtIGJlaGluZD8KLSAgICAJfQotICAgIAljYXRjaChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAJCXRocm93IGU7Ci0gICAgCX0KLSAgICAJY2F0Y2goTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLSAgICAJCXRocm93IGU7Ci0gICAgCX0KLSAgICAJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotICAgIAkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSwgZXhjKTsKLSAgICAJfQotICAgIAlmaW5hbGx5IHsKLSAgICAJCXNldFZhbGlkYXRlZChydWxlLmdldElkKCksIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLSAgICAJCXJlbGVhc2VSdWxlcyhydWxlKTsKLSAgICAJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBydWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVsZWFzZVJ1bGVzKElWYWxpZGF0aW9uUnVsZSBydWxlKTsgCi0KLSAgICBwcml2YXRlIElFSkJWYWxpZGF0aW9uQ29udGV4dCBfdmMgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIElFSkJWYWxpZGF0aW9uQ29udGV4dCBnZXRWYWxpZGF0aW9uQ29udGV4dCgpIHsKLSAgICAJcmV0dXJuIF92YzsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VmFsaWRhdGlvbkNvbnRleHQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB7Ci0gICAgCV92YyA9IHZjOwotICAgIH0KLQkKLQkvKioKLQkgKiAgVGhpcyBjbGFzcyBpcyBwdWJsaWMgb25seSBmb3IgdGhlIEVKQkhlbHBlci4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgVGFyZ2V0T2JqZWN0IHsKLQkJcHJpdmF0ZSBPYmplY3QgX3BhcmVudCA9IG51bGw7Ci0JCXByaXZhdGUgT2JqZWN0IF90YXJnZXQgPSBudWxsOwotCQkKLQkJcHVibGljIFRhcmdldE9iamVjdCgpIHsKLQkJCS8vRGVmYXVsdAotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldFBhcmVudCgpIHsKLQkJCXJldHVybiBfcGFyZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldCgpIHsKLQkJCXJldHVybiBfdGFyZ2V0OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRQYXJlbnQoT2JqZWN0IHRwKSB7Ci0JCQlfcGFyZW50ID0gdHA7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFRhcmdldChPYmplY3QgdCkgewotCQkJX3RhcmdldCA9IHQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpbnQgcGFyZW50ID0gKGdldFRhcmdldFBhcmVudCgpID09IG51bGwpID8gMCA6IGdldFRhcmdldFBhcmVudCgpLmhhc2hDb2RlKCk7Ci0JCQlpbnQgdGFyZ2V0ID0gKGdldFRhcmdldCgpID09IG51bGwpID8gMCA6IGdldFRhcmdldCgpLmhhc2hDb2RlKCk7Ci0JCQlyZXR1cm4gcGFyZW50ICsgdGFyZ2V0OwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmKG8gPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYodGhpcyA9PSBvKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWlmKCEobyBpbnN0YW5jZW9mIFRhcmdldE9iamVjdCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCU9iamVjdCB0aGlzUGFyZW50ID0gdGhpcy5nZXRUYXJnZXRQYXJlbnQoKTsKLQkJCU9iamVjdCBvUGFyZW50ID0gKChUYXJnZXRPYmplY3QpbykuZ2V0VGFyZ2V0UGFyZW50KCk7Ci0JCQlPYmplY3QgdGhpc1RhcmdldCA9IHRoaXMuZ2V0VGFyZ2V0KCk7Ci0JCQlPYmplY3Qgb1RhcmdldCA9ICgoVGFyZ2V0T2JqZWN0KW8pLmdldFRhcmdldCgpOwotCQkJCi0JCQlpZigodGhpc1BhcmVudCA9PSBudWxsKSAmJiAob1BhcmVudCA9PSBudWxsKSkgewotCQkJCS8vIGNoZWNrIHRhcmdldAotCQkJfQotCQkJZWxzZSBpZigodGhpc1BhcmVudCAhPSBudWxsKSAmJiAob1BhcmVudCAhPSBudWxsKSkgewotCQkJCWlmKHRoaXNQYXJlbnQuZXF1YWxzKG9QYXJlbnQpKSB7Ci0JCQkJCS8vIGNoZWNrIHRhcmdldAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYoKHRoaXNUYXJnZXQgPT0gbnVsbCkgJiYgKG9UYXJnZXQgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYoKHRoaXNUYXJnZXQgIT0gbnVsbCkgJiYgKG9UYXJnZXQgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gKHRoaXNUYXJnZXQuZXF1YWxzKG9UYXJnZXQpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGVkKE9iamVjdCBrZXksIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHsKLSAgICAJU2V0IGRvbmUgPSBudWxsOwotICAgIAlpZihfdmFsaWRhdGVkLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAJCWRvbmUgPSAoU2V0KV92YWxpZGF0ZWQuZ2V0KGtleSk7Ci0gICAgCX0KLSAgICAJZWxzZSB7Ci0gICAgCQlkb25lID0gbmV3IEhhc2hTZXQoKTsKLSAgICAJfQotICAgIAkKLSAgICAJZG9uZS5hZGQoZ2V0VGFyZ2V0T2JqZWN0UG9vbCgpLmdldFRhcmdldE9iamVjdCh0YXJnZXRQYXJlbnQsIHRhcmdldCkpOwotICAgIAlfdmFsaWRhdGVkLnB1dChrZXksIGRvbmUpOwotICAgIH0KLQotCi0JcHJvdGVjdGVkIGNsYXNzIFRhcmdldE9iamVjdFBvb2wgewotCQlwcml2YXRlIGludCBfZ3Jvd1NpemUgPSAwOwotCQlwcml2YXRlIFZlY3RvciBfcG9vbCA9IG51bGw7Ci0JCQotCQlwdWJsaWMgVGFyZ2V0T2JqZWN0UG9vbChpbnQgaW5pdGlhbFNpemUpIHsKLQkJCV9ncm93U2l6ZSA9IGluaXRpYWxTaXplOwotCQkJX3Bvb2wgPSBuZXcgVmVjdG9yKGluaXRpYWxTaXplLCBfZ3Jvd1NpemUpOwotCQkJZ3JvdygpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgZ3JvdygpIHsKLQkJCWZvcihpbnQgaT0wOyBpPF9ncm93U2l6ZTsgaSsrKSB7Ci0JCQkJX3Bvb2wuYWRkKG5ldyBUYXJnZXRPYmplY3QoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBUYXJnZXRPYmplY3QgZ2V0VGFyZ2V0T2JqZWN0KE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHsKLQkJCWlmKF9wb29sLnNpemUoKSA8PSAwKSB7Ci0JCQkJZ3JvdygpOwotCQkJfQotCQkJVGFyZ2V0T2JqZWN0IG9iaiA9IChUYXJnZXRPYmplY3QpX3Bvb2wucmVtb3ZlKDApOwotCQkJb2JqLnNldFRhcmdldFBhcmVudCh0YXJnZXRQYXJlbnQpOwotCQkJb2JqLnNldFRhcmdldCh0YXJnZXQpOwotCQkJcmV0dXJuIG9iajsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVsZWFzZShUYXJnZXRPYmplY3Qgb2JqKSB7Ci0JCQlvYmouc2V0VGFyZ2V0UGFyZW50KG51bGwpOwotCQkJb2JqLnNldFRhcmdldChudWxsKTsKLQkJCV9wb29sLmFkZChvYmopOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBUYXJnZXRPYmplY3RQb29sIGdldFRhcmdldE9iamVjdFBvb2woKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGVkKE9iamVjdCBrZXksIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHsKLSAgICAJaWYoIV92YWxpZGF0ZWQuY29udGFpbnNLZXkoa2V5KSkgewotICAgIAkJcmV0dXJuIGZhbHNlOwotICAgIAl9Ci0gICAgCi0gICAgCi0gICAgCVNldCBkb25lID0gKFNldClfdmFsaWRhdGVkLmdldChrZXkpOwotICAgIAlUYXJnZXRPYmplY3QgdGVtcCA9IGdldFRhcmdldE9iamVjdFBvb2woKS5nZXRUYXJnZXRPYmplY3QodGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotICAgIAl0cnkgewotICAgIAkJaWYoZG9uZS5jb250YWlucyh0ZW1wKSkgewotICAgIAkJCXJldHVybiB0cnVlOwotICAgIAkJfQotICAgIAkJCi0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCX0KLSAgICAJZmluYWxseSB7Ci0gICAgCQlnZXRUYXJnZXRPYmplY3RQb29sKCkucmVsZWFzZSh0ZW1wKTsKLSAgICAJfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotICAgIAlJdGVyYXRvciBpdGVyYXRvciA9IF92YWxpZGF0ZWQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCQlTZXQgZG9uZSA9IChTZXQpX3ZhbGlkYXRlZC5nZXQoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAJCUl0ZXJhdG9yIHRvSXRlcmF0b3IgPSBkb25lLml0ZXJhdG9yKCk7Ci0gICAgCQl3aGlsZSh0b0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgIAkJCVRhcmdldE9iamVjdCB0byA9IChUYXJnZXRPYmplY3QpdG9JdGVyYXRvci5uZXh0KCk7Ci0gICAgCQkJZ2V0VGFyZ2V0T2JqZWN0UG9vbCgpLnJlbGVhc2UodG8pOwotICAgIAkJfQotICAgIAkJZG9uZS5jbGVhcigpOwotICAgIAl9Ci0gICAgCV92YWxpZGF0ZWQuY2xlYXIoKTsKLSAgICAJc2V0VmFsaWRhdGlvbkNvbnRleHQobnVsbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzNiNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50TWVzc2FnZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvOS8yMDAxIDExOjQ5OjQ3IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ2xpZW50TWVzc2FnZUNvbnN0YW50cyBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uSjJFRU1lc3NhZ2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9NT0RFTF9OQU1FID0gIkFQUExJQ0FUSU9OQ0xJRU5UX1ZBTElEQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9ERCA9ICJJTlZBTElEX0REIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VKQl9SRUZTID0gIkVSUk9SX0VKQl9SRUZTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OQ0xJRU5UX1ZBTElEQVRPUl9JRCA9ICJBUFBMSUNBVElPTkNMSUVOVF9WQUxJREFUT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQVBQQ0xJRU5UX0lOVkFMSURfQVBQQ0xJRU5UX0ZJTEUgPSAiRVJST1JfQVBQTElDQVRJT05DTElFTlRfSU5WQUxJRF9BUFBDTElFTlRfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0FQUENMSUVOVF9NSVNTSU5HX1VSSSA9ICJNRVNTQUdFX0FQUENMSUVOVF9NSVNTSU5HX1VSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9BUFBDTElFTlRfVkFMSURBVElPTl9GQUlMRUQgPSAiRVJST1JfQVBQQ0xJRU5UX1ZBTElEQVRJT05fRkFJTEVEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9ERF9QQVJTRV9MSU5FQ09MID0gIkFQUENMSUVOVF9ERF9QQVJTRV9MSU5FQ09MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9ERF9QQVJTRV9MSU5FID0gIkFQUENMSUVOVF9ERF9QQVJTRV9MSU5FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9ERF9DQU5OT1RfT1BFTl9ERCA9ICJBUFBDTElFTlRfRERfQ0FOTk9UX09QRU5fREQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0REX1BBUlNFX05PSU5GTyA9ICJBUFBDTElFTlRfRERfUEFSU0VfTk9JTkZPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9EVVBfUkVTX0VOVl9SRUZfRVJST1JfID0gIkFQUENMSUVOVF9EVVBfUkVTX0VOVl9SRUZfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9EVVBfRUpCX1JFRl9FUlJPUl8gPSAiQVBQQ0xJRU5UX0RVUF9FSkJfUkVGX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfTUFJTl9DTEFTU19FUlJPUl8gPSAiQVBQQ0xJRU5UX01BSU5fQ0xBU1NfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxY2Y4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlZhbGlkYXRlWG1sQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLQotCi0vKioKLSAqIFZhbGlkYXRlcyB0aGUgYXBwbGljYXRpbi1jbGllbnQueG1sCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uQ2xpZW50TWVzc2FnZUNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlOwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnRERDsKLQkKLQkvKioKLSAJICogQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLSAJICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0vLyBBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvcgotCQotCS8qKgotIAkgKiA8cD5BbnN3ZXIgdGhlIGlkIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggaXMKLSAJICogdXNlZCBieSB0aGUgcmVjZWl2ZXIuPC9wPgotIAkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotCQlyZXR1cm4gQVBMSUNBVElPTkNMSUVOVF9DQVRFR09SWTsKLQl9Ly8gZ2V0QmFzZU5hbWUKLQkKLQkvKioKLQkgKiAgWE1MIFZhbGlkYXRvciBub3cgaGFuZGxlcyB2YWxpZGF0aW9uIG9mIERlcGxveW1lbnQgRGVzY3JpcHRvcgotCSAqIAotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCSAgdmFsaWRhdGVNYWluQ2xhc3NJbk1hbmlmZXN0KCk7Ci0JfS8vIHZhbGlkYXRlCi0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1haW5DbGFzc0luTWFuaWZlc3QoKSB7Ci0KLQkJaWYgKGFwcENsaWVudEZpbGUgIT0gbnVsbCAmJiBhcHBDbGllbnRGaWxlLmdldE1hbmlmZXN0KCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1haW5DbGFzcyA9IGFwcENsaWVudEZpbGUuZ2V0TWFuaWZlc3QoKS5nZXRNYWluQ2xhc3MoKTsKLQkJCWlmIChtYWluQ2xhc3MgPT0gbnVsbCB8fCBtYWluQ2xhc3MubGVuZ3RoKCkgPT0gMCkgewotCQkJCU9iamVjdCB0YXJnZXQgPSBnZXRNYW5pZmVzdFRhcmdldCgpOwotCQkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIEFQUENMSUVOVF9NQUlOX0NMQVNTX0VSUk9SXywgbmV3IFN0cmluZ1swXSwgdGFyZ2V0KTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRNYW5pZmVzdFRhcmdldCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIERvZXMgdGhlIHZhbGlkYXRpb24uCi0JICogCi0JICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikKLQkgIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkgIHN1cGVyLnZhbGlkYXRlKGluSGVscGVyLCBpblJlcG9ydGVyKTsKLQkgIHRyeSB7Ci0JCXNldEFwcENsaWVudEZpbGUoIChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIGluSGVscGVyLmxvYWRNb2RlbChBUFBDTElFTlRfTU9ERUxfTkFNRSkgKTsKLQkJaWYgKCBhcHBDbGllbnRGaWxlICE9IG51bGwgKSB7Ci0JCSAgc2V0QXBwQ2xpZW50REQoIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSApOwotCQkgIHZhbGlkYXRlKCk7Ci0JCX0gZWxzZSB7Ci0JCSAgSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFUlJPUl9BUFBDTElFTlRfSU5WQUxJRF9BUFBDTElFTlRfRklMRSk7Ci0JCSAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2cpOwotCQl9Ly8gaWYKLQkgIH0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJICB0aHJvdyBleDsKLQkgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfQVBQQ0xJRU5UX1ZBTElEQVRJT05fRkFJTEVEKTsKLQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2csIGUpOwotCSAgfS8vIHRyeSAKLQl9Ly8gdmFsaWRhdGUKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWxpZGF0ZSB4bWwgY29tbWFuZC4KLQkgKiAKLQkgKiBAcmV0dXJuIENvbW1hbmQKLQkgKi8JCi0JcHVibGljIENvbW1hbmQgY3JlYXRlVmFsaWRhdGVYTUxDb21tYW5kKCkgewotCQlDb21tYW5kIGNtZCA9IG5ldyBWYWxpZGF0ZVhtbENvbW1hbmQoYXBwQ2xpZW50RmlsZSk7Ci0JCXJldHVybiBjbWQ7Ci0JfS8vIGNyZWF0ZVZhbGlkYXRlWE1MQ29tbWFuZAotCQotCS8qKgotCSAqIEdldHMgdGhlIGFwcENsaWVudEZpbGUuCi0JICogCi0JICogQHJldHVybiBBcHBsaWNhdGlvbkNsaWVudEZpbGUKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGdldEFwcENsaWVudEZpbGUoKSB7Ci0JCXJldHVybiBhcHBDbGllbnRGaWxlOwotCX0vLyBnZXRBcHBDbGllbnRGaWxlCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBhcHBDbGllbnRGaWxlLgotCSAqIAotCSAqIEBwYXJhbSBBcHBsaWNhdG9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlIC0gVGhlIGFwcENsaWVudEZpbGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwQ2xpZW50RmlsZShBcHBsaWNhdGlvbkNsaWVudEZpbGUgYXBwQ2xpZW50RmlsZSkgewotCQl0aGlzLmFwcENsaWVudEZpbGUgPSBhcHBDbGllbnRGaWxlOwotCX0vLyBzZXRBcHBDbGllbnRGaWxlCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBhcHBDbGllbnRERC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50Ci0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcENsaWVudEREKCkgewotCQlyZXR1cm4gYXBwQ2xpZW50REQ7Ci0JfS8vIGdldEFwcENsaWVudERECi0KLQkvKioKLQkgKiBTZXRzIHRoZSBhcHBDbGllbnRERC4KLQkgKiAKLQkgKiBAcGFyYW0gQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50REQgLSBUaGUgYXBwQ2xpZW50REQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwQ2xpZW50REQoQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50REQpIHsKLQkJdGhpcy5hcHBDbGllbnRERCA9IGFwcENsaWVudEREOwotCX0vLyBzZXRBcHBDbGllbnRERAotCi19Ly8gQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBCZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOGViOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJNUEJlYW5DbGFzc1ZSdWxlIGV4dGVuZHMgQUVudGl0eUJlYW5DbGFzc1ZSdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmJiIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VOVElUWUJFQU59OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG5ldyBsb25nW117TE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRSwgUkVNT1RFX0NPTVBPTkVOVF9JTlRFUkZBQ0V9OwotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfQUJTVFJBQ1QgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0ZJTkFMID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9QVUJMSUMgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtDT05TVFJVQ1RPUl9OT1BBUk0sIEVKQkZJTkRCWVBSSU1BUllLRVksIFNFVEVOVElUWUNPTlRFWFQsIFVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTSwgRUpCTE9BRF9OT1BBUk0sIEVKQlNUT1JFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RklOQUxJWkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ09OU1RSVUNUT1JfTk9QQVJNLCBDT05TVFJVQ1RPUiwgRUpCQ1JFQVRFLCBFSkJQT1NUQ1JFQVRFLCBFSkJIT01FLCBGSU5BTElaRV9OT1BBUk0sIEVKQkZJTkRCWVBSSU1BUllLRVksIEVKQkZJTkQsIFNFVEVOVElUWUNPTlRFWFQsIFVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTSwgRUpCTE9BRF9OT1BBUk0sIEVKQlNUT1JFX05PUEFSTSwgRklOQUxJWkVfTk9QQVJNLCBCVVNJTkVTU307Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNSwgbmV3IFN0cmluZ1tde0NIS0oyMDE1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY29uc3RyLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY29uc3RyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQ3JlYXRlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiRmluZEJ5UHJpbWFyeUtleSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXkrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfc2V0RW50aXR5Q29udGV4dCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkFjdGl2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQWN0aXZhdGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJQYXNzaXZhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJQYXNzaXZhdGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJSZW1vdmUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJMb2FkLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiTG9hZCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlN0b3JlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiU3RvcmUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJTZWxlY3QsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJTZWxlY3QrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiRmluZCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJQb3N0Q3JlYXRlK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzK1NQRUN9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA3LCBuZXcgU3RyaW5nW117Q0hLSjI0MDcrQkVYVCwgQ0hLSjI0MDcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMSwgbmV3IFN0cmluZ1tde0NIS0oyNDExK0JFWFQsIENIS0oyNDExK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNytCRVhULCBDSEtKMjQyNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyOCwgbmV3IFN0cmluZ1tde0NIS0oyNDI4K0JFWFQsIENIS0oyNDI4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMCtCRVhULCBDSEtKMjQzMCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMSwgbmV3IFN0cmluZ1tde0NIS0oyNDMxK0JFWFQsIENIS0oyNDMxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDM5LCBuZXcgU3RyaW5nW117Q0hLSjI0MzkrQkVYVCwgQ0hLSjI0MzkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MSwgbmV3IFN0cmluZ1tde0NIS0oyNDQxK0JFWFQsIENIS0oyNDQxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQyLCBuZXcgU3RyaW5nW117Q0hLSjI0NDIrQkVYVCwgQ0hLSjI0NDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MytCRVhULCBDSEtKMjQ0MytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU2LCBuZXcgU3RyaW5nW117Q0hLSjI0NTYrT05fQkFTRSwgQ0hLSjI0NTYrT05fVEhJU30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NywgbmV3IFN0cmluZ1tde0NIS0oyNDU3K0JFWFQsIENIS0oyNDU3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU4LCBuZXcgU3RyaW5nW117Q0hLSjI0NTgrQkVYVCwgQ0hLSjI0NTgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTksIG5ldyBTdHJpbmdbXXtDSEtKMjQ1OStCRVhULCBDSEtKMjQ1OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc4LCBuZXcgU3RyaW5nW117Q0hLSjI0NzgrQkVYVCwgQ0hLSjI0NzgrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MiwgbmV3IFN0cmluZ1tde0NIS0oyNDkyK0JFWFQsIENIS0oyNDkyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkzLCBuZXcgU3RyaW5nW117Q0hLSjI0OTMrQkVYVCwgQ0hLSjI0OTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NCtCRVhULCBDSEtKMjQ5NCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwM19lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI1MDNfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJIb21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiSG9tZStCRVhULCBDSEtKMjUwM19lamJIb21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19lamJGaW5kK0JFWFQsIENIS0oyNTAzX2VqYkZpbmQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDVfZWpiUmVtb3ZlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA1X2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNTA1X2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpIHsKLQkJcmV0dXJuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7Ci0JfQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBORUlUSEVSOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotCS8qCi0JICogQHNlZSBBQmVhbkNsYXNzVlJ1bGUjZm9sbG93RWpiQ3JlYXRlUmV0dXJuVHlwZVJ1bGVzKE1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZU5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgewotCQlKYXZhSGVscGVycyByZXRUeXBlID0gZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShiZWFuLCBtZXRob2QpOwotCQlpZihyZXRUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVk7Ci0JCX0KLQkJcmV0dXJuIHJldFR5cGUuZ2V0SmF2YU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJGSU5EKSA9PSBFSkJGSU5EKSB7Ci0JCQl2YWxpZGF0ZUVqYkZpbmRNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCSE9NRSkgPT0gRUpCSE9NRSkgewotCQkJdmFsaWRhdGVFamJIb21lTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXZhbGlkYXRlRWpiUmVtb3ZlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQl2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4gTGV0IHRoZSB2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3ROb3RFeGlzdAotCQkJLy8gdGFrZSBjYXJlIG9mIGl0LgotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJDcmVhdGVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJQb3N0Q3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCRklORCkgPT0gRUpCRklORCkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiRmluZE1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQkhPTUUpID09IEVKQkhPTUUpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYkhvbWVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJSRU1PVkVfTk9QQVJNKSA9PSBFSkJSRU1PVkVfTk9QQVJNKSB7Ci0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEJVU0lORVNTKSA9PSBCVVNJTkVTUykgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nQnVzaW5lc3NNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIGlzbid0IHN1cHBvc2VkIHRvIGJlIGhlcmUuCi0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyAjIGVqYkZpbmQgbWV0aG9kcwotCQkvLyBJV0FENDUwMiA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IG9uIHRoaXMgY2xhc3MuIFJlYWQgc2VjdGlvbiAxMC41LjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQ1MDcgPSBUaGUgY29udGFpbmVyIHByb3ZpZGVzIHRoZSBlamJGaW5kIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4gUmVhZCBzZWN0aW9uIDEwLjYuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBjb3ZlcmVkIGJ5IHRoZSAibXVzdCBub3QgZXhpc3QiIGNvZGU/Ci0JCQotCQkvLyBJV0FENDMwNSA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTIuMi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDU3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkKLQkJLy8gSVdBRDQzMDYgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gUmVhZCBzZWN0aW9uIDEyLjIuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZihtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0MzA3ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTIuMi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0MzA4ID0gezB9IG11c3QgYmUgYSBsZWdhbCB0eXBlIGZvciBSTUktSUlPUC4gUmVhZCBzZWN0aW9uIDEyLjIuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQl2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgZmFsc2UpOyAvLyBkbyBub3QgY2hlY2sgaWYgdGhlIHJldHVybiB0eXBlIGlzIHNlcmlhbGl6YWJsZQotCQkKLQkJLy8gSVdBRDQzMDkgPSBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YuIFJlYWQgc2VjdGlvbiAxMi4yLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMTIgPSBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0uIFJlYWQgc2VjdGlvbiAxMi4yLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJSmF2YUhlbHBlcnMgcmV0VHlwZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpOwotCQlKYXZhSGVscGVycyBrZXkgPSAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCWlmKCEoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb21FbnVtZXJhdGlvbihyZXRUeXBlLCBiZWFuKSB8fAotCQkJICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUNvbGxlY3Rpb24ocmV0VHlwZSwgYmVhbikgfHwKLQkJCSAgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0VHlwZSwga2V5KQotCQkgICApKSB7Ci0JCSAgIAlTdHJpbmcga2V5TmFtZSA9IChrZXkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVkgOiBrZXkuZ2V0SmF2YU5hbWUoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117a2V5TmFtZX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5mb2xsb3dzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQkvLyBJV0FENDI4NSA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmF4LmVqYi5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEyLjEuOC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDE2OCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTAuNS44LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQzMTAgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMi4yLjUsIDE4LjMuOCwgMTguNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYkZpbmQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QS2V5Q2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEtleUNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3NWQwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QS2V5Q2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QS2V5Q2xhc3NWUnVsZSBleHRlbmRzIEFLZXlDbGFzc1ZSdWxlIGltcGxlbWVudHMgSUVKQlR5cGUsIElSZW1vdGVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIua2IiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117SEFTSENPREVfTk9QQVJNLCBFUVVBTFN9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIEhBU0hDT0RFX05PUEFSTSwgRVFVQUxTLCBDT05TVFJVQ1RPUiwgQ09OU1RSVUNUT1JfTk9QQVJNfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jb25zdHIsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jb25zdHIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9oYXNoQ29kZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2hhc2hDb2RlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZXF1YWxzLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZXF1YWxzK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxOSwgbmV3IFN0cmluZ1tde0NIS0oyMDE5K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJLy8gS2V5IG1ldGhvZHMgYXJlIG5vdCBjaGVja2VkIGZvciBSZW1vdGVFeGNlcHRpb24sIGJ1dCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIFZSdWxlcy4uLgotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gKChFbnRpdHkpcGFyZW50KS5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJQ2xhc3NWUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIE1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBwYXJlbnQsIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gRG8gbm90IHBlcmZvcm0gYW55IHZhbGlkYXRpb24gb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyAob3RoZXIgdGhhbiB0aGUKLQkJLy8gdmFsaWRhdGlvbiBwZXJmb3JtZWQgaW4gQUtleUNsYXNzVlJ1bGUncyBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBoYXNoQ29kZSgpCi0JCS8vIGFuZCBlcXVhbHMoT2JqZWN0KQotCX0KLQotCS8qCi0JICogQHNlZSBJQ2xhc3NWUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIEZpZWxkKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIERvIG5vdCBwZXJmb3JtIGFueSB2YWxpZGF0aW9uIG9uIHRoZSBmaWVsZHMgb2YgdGhlIEJNUCBrZXkgY2xhc3MKLQkJbG9uZyBmaWVsZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRGaWVsZFR5cGVJZChiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQlpZigoZmllbGRUeXBlICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQpID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEKSB7Ci0JCQl2YWxpZGF0ZVNlcmlhbFZlcnNpb25VSUQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUExvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhZjA1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QTG9jYWxDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJTG9jYWxUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmJsYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1R9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklUfTsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JIAotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjZ2V0RGVwZW5kc09uKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNnZXRNZXNzYWdlSWRzKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUExvY2FsSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyNDE5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJNUExvY2FsSG9tZVZSdWxlIGV4dGVuZHMgQUJNUEhvbWVWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElFSkJUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTEhPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXSB7IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1MgfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5ibGgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXSB7IEpBVkFYX0VKQl9FSkJMT0NBTEhPTUUgfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXSB7IEZJTkRCWVBSSU1BUllLRVksIEZJTkQgfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW10ge0NMSU5JVCwgQ1JFQVRFLCBGSU5EQllQUklNQVJZS0VZLCBGSU5ELCBIT01FIH07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW10ge0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5LCBuZXcgU3RyaW5nW10ge0NIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXkrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZmluZCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0MDIrQkVYVCwgQ0hLSjI0MDIrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAzLCBuZXcgU3RyaW5nW10geyBDSEtKMjQwMytCRVhULCBDSEtKMjQwMytNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjIsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDYyK0JFWFQsIENIS0oyNDYyK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MywgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0NjMrQkVYVCwgQ0hLSjI0NjMrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY0LCBuZXcgU3RyaW5nW10geyBDSEtKMjQ2NCtCRVhULCBDSEtKMjQ2NCtNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDY1K0JFWFQsIENIS0oyNDY1K01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW10geyBDSEtKMjQ2NytCRVhULCBDSEtKMjQ2NytNRVhUIH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NSwgbmV3IFN0cmluZ1tde0NIS0oyNDc1K0JFWFQsIENIS0oyNDc1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc3LCBuZXcgU3RyaW5nW10geyBDSEtKMjQ3NytCRVhULCBDSEtKMjQ3NytNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OCtCRVhULCBDSEtKMjQ3OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OSwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0NzkrQkVYVCwgQ0hLSjI0NzkrTUVYVCB9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZmluZCtCRVhULCBDSEtKMjUwMF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19maW5kLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwM19maW5kK0JFWFQsIENIS0oyNTAzX2ZpbmQrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2hvbWUsIG5ldyBTdHJpbmdbXSB7IENIS0oyNTAzX2hvbWUrQkVYVCwgQ0hLSjI1MDNfaG9tZStNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9maW5kLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwNF9maW5kK0JFWFQsIENIS0oyNTA0X2ZpbmQrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2hvbWUsIG5ldyBTdHJpbmdbXSB7IENIS0oyNTA0X2hvbWUrQkVYVCwgQ0hLSjI1MDRfaG9tZStNRVhUIH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY3MTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QUmVtb3RlQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUNvbXBvbmVudFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuYnJjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQk9CSkVDVH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVH07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9idXNpbmVzcytCRVhULCBDSEtKMjUwMF9idXNpbmVzcytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTMzOTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJNUFJlbW90ZUhvbWVWUnVsZSBleHRlbmRzIEFCTVBIb21lVlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmJyaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJIT01FfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117RklOREJZUFJJTUFSWUtFWSwgRklORH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFLCBGSU5EQllQUklNQVJZS0VZLCBGSU5ELCBIT01FfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZmluZEJ5UHJpbWFyeUtleStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9maW5kK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAyLCBuZXcgU3RyaW5nW117Q0hLSjI0MDIrQkVYVCwgQ0hLSjI0MDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMytCRVhULCBDSEtKMjQwMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MStCRVhULCBDSEtKMjQ2MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MiwgbmV3IFN0cmluZ1tde0NIS0oyNDYyK0JFWFQsIENIS0oyNDYyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYzLCBuZXcgU3RyaW5nW117Q0hLSjI0NjMrQkVYVCwgQ0hLSjI0NjMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NCtCRVhULCBDSEtKMjQ2NCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NSwgbmV3IFN0cmluZ1tde0NIS0oyNDY1K0JFWFQsIENIS0oyNDY1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY2LCBuZXcgU3RyaW5nW117Q0hLSjI0NjYrQkVYVCwgQ0hLSjI0NjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NytCRVhULCBDSEtKMjQ2NytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc1LCBuZXcgU3RyaW5nW117Q0hLSjI0NzUrQkVYVCwgQ0hLSjI0NzUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NytCRVhULCBDSEtKMjQ3NytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OCwgbmV3IFN0cmluZ1tde0NIS0oyNDc4K0JFWFQsIENIS0oyNDc4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc5LCBuZXcgU3RyaW5nW117Q0hLSjI0NzkrQkVYVCwgQ0hLSjI0NzkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9maW5kK0JFWFQsIENIS0oyNTAwX2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2hvbWUrQkVYVCwgQ0hLSjI1MDBfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19maW5kK0JFWFQsIENIS0oyNTAzX2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2hvbWUrQkVYVCwgQ0hLSjI1MDNfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9maW5kK0JFWFQsIENIS0oyNTA0X2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2hvbWUrQkVYVCwgQ0hLSjI1MDRfaG9tZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBCZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZDE0OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBCZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFFbnRpdHlCZWFuQ2xhc3NWUnVsZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5jYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FTlRJVFlCRUFOfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0xPQ0FMX0NPTVBPTkVOVF9JTlRFUkZBQ0UsIFJFTU9URV9DT01QT05FTlRfSU5URVJGQUNFfTsKLQkKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0FCU1RSQUNUID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0ZJTkFMID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9QVUJMSUMgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtDT05TVFJVQ1RPUl9OT1BBUk0sIFNFVEVOVElUWUNPTlRFWFQsIFVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTSwgRUpCTE9BRF9OT1BBUk0sIEVKQlNUT1JFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RUpCRklORCwgRklOQUxJWkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ09OU1RSVUNUT1JfTk9QQVJNLCBDT05TVFJVQ1RPUiwgRUpCQ1JFQVRFLCBFSkJQT1NUQ1JFQVRFLCBFSkJIT01FLCBGSU5BTElaRV9OT1BBUk0sIEVKQkZJTkQsIEFDQ0VTU09SLCBFSkJGSU5EQllQUklNQVJZS0VZLCBTRVRFTlRJVFlDT05URVhULCBVTlNFVEVOVElUWUNPTlRFWFRfTk9QQVJNLCBFSkJBQ1RJVkFURV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQkxPQURfTk9QQVJNLCBFSkJTVE9SRV9OT1BBUk0sIEVKQlNFTEVDVCwgRklOQUxJWkVfTk9QQVJNLCBCVVNJTkVTU307Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkvLyBBZGQgdGhlc2UgY2hlY2tzIGluIHRoZSBjb2RlIGxhdGVyCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4MSwgbmV3IFN0cmluZ1tde0NIS0oyNDgxK0JFWFQsIENIS0oyNDgxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDgyLCBuZXcgU3RyaW5nW117Q0hLSjI0ODIrQkVYVCwgQ0hLSjI0ODIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4MytCRVhULCBDSEtKMjQ4MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4NCwgbmV3IFN0cmluZ1tde0NIS0oyNDg0K0JFWFQsIENIS0oyNDg0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg5LCBuZXcgU3RyaW5nW117Q0hLSjI0ODkrQkVYVCwgQ0hLSjI0ODkrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjIwNStCRVhULCBDSEtKMjIwNStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNiwgbmV3IFN0cmluZ1tde0NIS0oyMjA2K0JFWFQsIENIS0oyMjA2K01FWFR9KTsKLQkJLy8gZW5kIGFkZCBsYXRlcgotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2FjYywgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2FjYytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkNyZWF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXksIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJGaW5kQnlQcmltYXJ5S2V5K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfc2V0RW50aXR5Q29udGV4dCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX3NldEVudGl0eUNvbnRleHQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF91bnNldEVudGl0eUNvbnRleHQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF91bnNldEVudGl0eUNvbnRleHQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJBY3RpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkFjdGl2YXRlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUGFzc2l2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUGFzc2l2YXRlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUmVtb3ZlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiTG9hZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkxvYWQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJTdG9yZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlN0b3JlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiU2VsZWN0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiU2VsZWN0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkZpbmQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUG9zdENyZWF0ZStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMSwgbmV3IFN0cmluZ1tde0NIS0oyNDExK0JFWFQsIENIS0oyNDExK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNytCRVhULCBDSEtKMjQyNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyOCwgbmV3IFN0cmluZ1tde0NIS0oyNDI4K0JFWFQsIENIS0oyNDI4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMwLCBuZXcgU3RyaW5nW117Q0hLSjI0MzArQkVYVCwgQ0hLSjI0MzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MStCRVhULCBDSEtKMjQ0MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MiwgbmV3IFN0cmluZ1tde0NIS0oyNDQyK0JFWFQsIENIS0oyNDQyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQzLCBuZXcgU3RyaW5nW117Q0hLSjI0NDMrQkVYVCwgQ0hLSjI0NDMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDksIG5ldyBTdHJpbmdbXXtDSEtKMjQ0OStCRVhULCBDSEtKMjQ0OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDUwLCBuZXcgU3RyaW5nW117Q0hLSjI0NTArQkVYVCwgQ0hLSjI0NTArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NCtCRVhULCBDSEtKMjQ1NCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NiwgbmV3IFN0cmluZ1tde0NIS0oyNDU2K09OX0JBU0UsIENIS0oyNDU2K09OX1RISVN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OCwgbmV3IFN0cmluZ1tde0NIS0oyNDc4K0JFWFQsIENIS0oyNDc4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4MCtCRVhULCBDSEtKMjQ4MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4NSwgbmV3IFN0cmluZ1tde0NIS0oyNDg1K0JFWFQsIENIS0oyNDg1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg2LCBuZXcgU3RyaW5nW117Q0hLSjI0ODYrQkVYVCwgQ0hLSjI0ODYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4NytCRVhULCBDSEtKMjQ4NytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4OCwgbmV3IFN0cmluZ1tde0NIS0oyNDg4K0JFWFQsIENIS0oyNDg4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MitCRVhULCBDSEtKMjQ5MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MywgbmV3IFN0cmluZ1tde0NIS0oyNDkzK0JFWFQsIENIS0oyNDkzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk0LCBuZXcgU3RyaW5nW117Q0hLSjI0OTQrQkVYVCwgQ0hLSjI0OTQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NitCRVhULCBDSEtKMjQ5NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NywgbmV3IFN0cmluZ1tde0NIS0oyNDk3K0JFWFQsIENIS0oyNDk3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiSG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkhvbWUrQkVYVCwgQ0hLSjI1MDBfZWpiSG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9maW5hbGl6ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2ZpbmFsaXplK0JFWFQsIENIS0oyNTAyX2ZpbmFsaXplK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9lamJGaW5kK0JFWFQsIENIS0oyNTAyX2VqYkZpbmQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwM19lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI1MDNfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJIb21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiSG9tZStCRVhULCBDSEtKMjUwM19lamJIb21lK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDVfZWpiUmVtb3ZlK01FWFR9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpIHsKLQkJcmV0dXJuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlQWJzdHJhY3QoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfQUJTVFJBQ1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlRmluYWwoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfRklOQUw7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX1BVQkxJQzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gTkVJVEhFUjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgY21wKTsKLQkJCX0KLQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMuLi4uCi0JCQkJLy8gbGV0IHRoaXMgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IChnZXRQcmltYXJ5S2V5KCkpCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCUphdmFIZWxwZXJzIHJldFR5cGUgPSBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKGJlYW4sIG1ldGhvZCk7Ci0JCWlmKHJldFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9QUklNQVJZX0tFWTsKLQkJfQotCQlyZXR1cm4gcmV0VHlwZS5nZXRKYXZhTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW47Ci0JCQotCQkvLyAxMC4zLjEsIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbnQgZmllbGRzIGFuZCBjb250YWluZXItbWFuYWdlZCByZWxhdGlvbnNoaXAgCi0JCS8vIGZpZWxkcyBtdXN0ICpub3QqIGJlIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzLiAKLQkJTGlzdCBjbXJGaWVsZHMgPSBjbXAuZ2V0Q01SRmllbGRzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY21yRmllbGRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQ01SRmllbGQgY21yRmllbGQgPSAoQ01SRmllbGQpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoKGNtckZpZWxkICE9IG51bGwpICYmICghY21yRmllbGQuaXNEZXJpdmVkKCkpKSB7Ci0JCQkJdmFsaWRhdGVDbXJGaWVsZCh2YywgY21wLCBjbGF6eiwgY21yRmllbGQpOwotCQkJfQotCQl9Ci0JCQotCQlMaXN0IGNtcEZpZWxkcyA9IGNtcC5nZXRGaWx0ZXJlZEZlYXR1cmVzKExvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLnNpbmdsZXRvbigpKTsKLQkJaWYoY21wRmllbGRzICE9IG51bGwgJiYgIWNtcEZpZWxkcy5pc0VtcHR5KCkpIHsKLQkJaXRlcmF0b3IgPSBjbXBGaWVsZHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDTVBBdHRyaWJ1dGUgY21wRmllbGQgPSAoQ01QQXR0cmlidXRlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKChjbXBGaWVsZCAhPSBudWxsKSAmJiAoIWNtcEZpZWxkLmlzRGVyaXZlZCgpKSkgewotCQkJCXZhbGlkYXRlQ21wRmllbGQodmMsIGNtcCwgY2xhenosIGNtcEZpZWxkKTsKLQkJCX0KLQkJICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NDcmVhdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDk3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlRWpiU2VsZWN0TWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHBhcmVudCwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vICMgZWpiU2VsZWN0PE1FVEhPRD4gY2hlY2tzCi0JCS8vIElXQUQ0MTU0ID0gezB9IG11c3QgZXhpc3QuIFJlYWQgc2VjdGlvbiAxMC41LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQ1MDIgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCBvbiB0aGlzIGNsYXNzLiBSZWFkIHNlY3Rpb24gMTAuNS41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MTk3ID0gQW4gZWpiU2VsZWN0IG1ldGhvZCBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTAuNi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQotCQlKYXZhSGVscGVycyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxDb2xsZWN0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKTsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblR5cGUsIGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSkgJiYKLQkJCSFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5UeXBlLCBqYXZhVXRpbENvbGxlY3Rpb24pICkgewotCQkJLy8gSVdBRDQxNjAgPSBUeXBlIHswfSBjYW5ub3QgYmUgcmV0dXJuZWQgYnkgYSBzZWxlY3QgbWV0aG9kLiBSZWFkIHNlY3Rpb24gMTAuNS43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0ODYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJlbnQsIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0MTk4ID0gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiAxMC42Ljcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ4NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcmVudCwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFtZXRob2QuaXNBYnN0cmFjdCgpKSB7Ci0JCQkvLyBJV0FENDE5OSA9IFRoaXMgbWV0aG9kIG11c3QgYmUgYWJzdHJhY3QuIFJlYWQgc2VjdGlvbiAxMC42Ljcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTU4ID0gezB9IG11c3QgYmUgYWJzdHJhY3QuIFJlYWQgc2VjdGlvbiAxMC41Ljcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ4NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcmVudCwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzRmluZGVyRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0MjAwID0gVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTAuNi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0ODgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJlbnQsIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmZvbGxvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0Mjg1ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YXguZWpiLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTIuMS44LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTY4ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMC41LjguNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFyZW50LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gQ2hlY2sgbWV0aG9kIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwuCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc29jaWF0ZWRXaXRoUXVlcnkoY21wLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0OTYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJlbnQsIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbXBGaWVsZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBKYXZhQ2xhc3MgY2xhenosIENNUEF0dHJpYnV0ZSBhdHRyaWIpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgZmllbGROYW1lID0gYXR0cmliLmdldE5hbWUoKTsKLQkJaWYoKGZpZWxkTmFtZSA9PSBudWxsKSB8fCAoZmllbGROYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGxldCB0aGUgRUpCSmFyVlJ1bGUgcmVwb3J0IHRoaXMKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIUNoYXJhY3Rlci5pc0xvd2VyQ2FzZShmaWVsZE5hbWUuY2hhckF0KDApKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDgwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgY21wLCBjbGF6eiwgYXR0cmliLmdldEZpZWxkKCksIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gU2VjdGlvbiAxMC44LjMKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1Vua25vd25QcmltYXJ5S2V5KGF0dHJpYikpIHsKLQkJCUphdmFDbGFzcyBlamJDbGFzcyA9IGNtcC5nZXRFamJDbGFzcygpOwotCQkJTWV0aG9kIGdldE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChlamJDbGFzcywgYXR0cmliLmdldEdldHRlck5hbWUoKSwgbmV3IEphdmFIZWxwZXJzWzBdLCBhdHRyaWIuZ2V0VHlwZSgpKTsKLQkJCWlmKGdldE1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2FjYywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBjbXAsIGNsYXp6LCBuZXcgU3RyaW5nW117YXR0cmliLmdldEdldHRlck5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWxpZGF0ZUNNUEFjY2Vzc29yTWV0aG9kKHZjLCBjbXAsIGNsYXp6LCBnZXRNZXRob2QsIGF0dHJpYik7Ci0JCQl9Ci0JCQkKLQkJCUphdmFIZWxwZXJzW10gc2V0TWV0aG9kUGFybXMgPSBuZXcgSmF2YUhlbHBlcnNbXXthdHRyaWIuZ2V0VHlwZSgpfTsKLQkJCU1ldGhvZCBzZXRNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoZWpiQ2xhc3MsIGF0dHJpYi5nZXRTZXR0ZXJOYW1lKCksIHNldE1ldGhvZFBhcm1zKTsKLQkJCWlmKHNldE1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIHNldHRlck5hbWUgPSBhdHRyaWIuZ2V0U2V0dGVyTmFtZSgpICsgIigiICsgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFBhcm1zQXNTdHJpbmcoc2V0TWV0aG9kUGFybXMpICsgIikiOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2FjYywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBjbXAsIGNsYXp6LCBuZXcgU3RyaW5nW117c2V0dGVyTmFtZX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWxpZGF0ZUNNUEFjY2Vzc29yTWV0aG9kKHZjLCBjbXAsIGNsYXp6LCBzZXRNZXRob2QsIGF0dHJpYik7Ci0JCQl9Ci0JCX0KLQotCQlGaWVsZCBmaWVsZCA9IGF0dHJpYi5nZXRGaWVsZCgpOwotCQlpZiAoKGZpZWxkICE9IG51bGwpICYmIChjbGF6ei5nZXRGaWVsZEV4dGVuZGVkKGF0dHJpYi5nZXROYW1lKCkpICE9IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBjbXAsIGNsYXp6LCBmaWVsZCwgbmV3IFN0cmluZ1tde2F0dHJpYi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNtckZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAsIEphdmFDbGFzcyBjbGF6eiwgQ01SRmllbGQgY21yRmllbGQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgZmllbGROYW1lID0gY21yRmllbGQuZ2V0TmFtZSgpOwotCQlpZigoZmllbGROYW1lID09IG51bGwpIHx8IChmaWVsZE5hbWUuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gbGV0IHRoZSBFSkJKYXJWUnVsZSByZXBvcnQgdGhpcwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZighQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGZpZWxkTmFtZS5jaGFyQXQoMCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0ODAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBjbXAsIGNsYXp6LCBjbXJGaWVsZC5nZXRGaWVsZCgpLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBlamJDbGFzcyA9IGNtcC5nZXRFamJDbGFzcygpOwotCQlKYXZhSGVscGVycyBsb2NhbFR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Q01SRmllbGRUeXBlKHZjLCBjbXAsIGNsYXp6LCBjbXJGaWVsZCk7Ci0JCWlmKGxvY2FsVHlwZSA9PSBudWxsKSB7Ci0JCQkvLyB1c2VyIG1hZGUgYSBtaXN0YWtlIGluIGVqYi1qYXIueG1sIGJ5IHRyeWluZyB0byBjcmVhdGUgYSByZWxhdGlvbgotCQkJLy8gdG8gYSBDTVAgd2hpY2ggZG9lc24ndCBoYXZlIGEgbG9jYWwgaW50ZXJmYWNlLgotCQkJLy8gRG9uJ3QgcmVwb3J0IGFuIGVycm9yIGhlcmU7IGxldCB0aGUgREQgdmFsaWRhdGlvbiByZXBvcnQgdGhlIGVycm9yLgotCQkJcmV0dXJuOwotCQl9Ci0JCU1ldGhvZCBnZXRNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoZWpiQ2xhc3MsIGNtckZpZWxkLmdldEdldHRlck5hbWUoKSwgbmV3IEphdmFIZWxwZXJzWzBdLCBsb2NhbFR5cGUpOwotCQlpZihnZXRNZXRob2QgPT0gbnVsbCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2FjYywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBjbXAsIGNsYXp6LCBuZXcgU3RyaW5nW117Y21yRmllbGQuZ2V0R2V0dGVyTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRhdGVDTVJBY2Nlc3Nvck1ldGhvZCh2YywgY21wLCBjbGF6eiwgZ2V0TWV0aG9kLCBjbXJGaWVsZCk7Ci0JCX0KLQkJCi0JCUphdmFIZWxwZXJzW10gc2V0TWV0aG9kUGFybXMgPSBuZXcgSmF2YUhlbHBlcnNbXXtsb2NhbFR5cGV9OwotCQlNZXRob2Qgc2V0TWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGVqYkNsYXNzLCBjbXJGaWVsZC5nZXRTZXR0ZXJOYW1lKCksIHNldE1ldGhvZFBhcm1zKTsKLQkJaWYoc2V0TWV0aG9kID09IG51bGwpIHsKLQkJCVN0cmluZyBzZXR0ZXJOYW1lID0gY21yRmllbGQuZ2V0U2V0dGVyTmFtZSgpICsgIigiICsgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFBhcm1zQXNTdHJpbmcoc2V0TWV0aG9kUGFybXMpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9hY2MsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgY21wLCBjbGF6eiwgbmV3IFN0cmluZ1tde3NldHRlck5hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZGF0ZUNNUkFjY2Vzc29yTWV0aG9kKHZjLCBjbXAsIGNsYXp6LCBzZXRNZXRob2QsIGNtckZpZWxkKTsKLQkJfQotCQkKLQkJRmllbGQgZmllbGQgPSBjbXJGaWVsZC5nZXRGaWVsZCgpOwotCQlpZiAoKGZpZWxkICE9IG51bGwpICYmIChjbGF6ei5nZXRGaWVsZEV4dGVuZGVkKGNtckZpZWxkLmdldE5hbWUoKSkgIT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGNtcCwgY2xhenosIGZpZWxkLCBuZXcgU3RyaW5nW117Y21yRmllbGQuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ01SQWNjZXNzb3JNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIENNUkZpZWxkIGZpZWxkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCQkgCi0JCWlmKCFtZXRob2QuaXNBYnN0cmFjdCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDTVBBY2Nlc3Nvck1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgQ01QQXR0cmlidXRlIGZpZWxkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCQkgCi0JCWlmKCFtZXRob2QuaXNBYnN0cmFjdCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJIT01FKSA9PSBFSkJIT01FKSB7Ci0JCQl2YWxpZGF0ZUVqYkhvbWVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJdmFsaWRhdGVFamJSZW1vdmVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBBQ0NFU1NPUikgPT0gQUNDRVNTT1IpIHsKLQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgaW4gdGhlIHZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eikgbWV0aG9kCi0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEJVU0lORVNTKSA9PSBCVVNJTkVTUykgewotCQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIGlzbid0IHN1cHBvc2VkIHRvIGJlIGhlcmUuIExldCB0aGUgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QKLQkJCS8vIHRha2UgY2FyZSBvZiBpdC4KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiQ3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQkhPTUUpID09IEVKQkhPTUUpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYkhvbWVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJSRU1PVkVfTk9QQVJNKSA9PSBFSkJSRU1PVkVfTk9QQVJNKSB7Ci0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEFDQ0VTU09SKSA9PSBBQ0NFU1NPUikgewotCQkJLy8gVGhpcyBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBpbiB0aGUgdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KSBtZXRob2QKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdCdXNpbmVzc01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4gCi0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QS2V5Q2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEtleUNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlNWJkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QS2V5Q2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBLZXlDbGFzc1ZSdWxlIGV4dGVuZHMgQUtleUNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJRUpCVHlwZSwgSVJlbW90ZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIua2MiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0hBU0hDT0RFX05PUEFSTSwgRVFVQUxTLCBDT05TVFJVQ1RPUl9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIEhBU0hDT0RFX05PUEFSTSwgRVFVQUxTLCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SfTsKLQotCXByaXZhdGUgU2V0IF9rZXlGaWVsZHMgPSBudWxsOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jb25zdHIsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jb25zdHIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9oYXNoQ29kZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2hhc2hDb2RlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZXF1YWxzLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZXF1YWxzK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTksIG5ldyBTdHJpbmdbXXtDSEtKMjAxOStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjIwNStCRVhULCBDSEtKMjIwNStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNiwgbmV3IFN0cmluZ1tde0NIS0oyMjA2K0JFWFQsIENIS0oyMjA2K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjksIG5ldyBTdHJpbmdbXXtDSEtKMjgyOStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJLy8gS2V5IG1ldGhvZHMgYXJlIG5vdCBjaGVja2VkIGZvciBSZW1vdGVFeGNlcHRpb24sIGJ1dCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIFZSdWxlcy4uLgotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KXBhcmVudDsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleShjbXApKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZG8gbm90IHZhbGlkYXRlIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5Ci0JCX0KLQkJCi0JCXJldHVybiBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCX0KLQkKLQotCS8qCi0JICogQHNlZSBJQ2xhc3NWUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIE1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkby4KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopOwotCi0JCS8vIElXQUQ0MjUxID0gVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDEwLjguMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighY2xhenouaXNQdWJsaWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAyMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJLy8gcHJpbWFyeSBrZXkgbXVzdCBtYXAgdG8gYXQgbGVhc3Qgb25lIGZpZWxkIG9uIHRoZSBiZWFuIAotCQkJLy8gQnV0IGlmIGl0J3MgYW4gdW5rbm93biBrZXksIHRoZXJlJ3Mgbm8gcG9pbnQgY2hlY2tpbmcgamF2YS5sYW5nLk9iamVjdAotCQkJTGlzdCBwcmltS2V5RmllbGRzID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCWlmICgocHJpbUtleUZpZWxkcyA9PSBudWxsKSB8fCAocHJpbUtleUZpZWxkcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7IC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHByaW1hcnlLZXkpLCBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIGNhbGxlZCBpbiB0aGUgdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvciBtZXRob2QKLQkJCQlTdHJpbmcgYmVhbk5hbWUgPSAoY21wLmdldE5hbWUoKSA9PSBudWxsKSA/ICJudWxsIiA6IGNtcC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGNtcCwgcHJpbWFyeUtleSwgbmV3IFN0cmluZ1tdIHsgcHJpbWFyeUtleS5nZXROYW1lKCksIGJlYW5OYW1lIH0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNldCBnZXRLZXlGaWVsZHMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYoX2tleUZpZWxkcyA9PSBudWxsKSB7Ci0JCQkvLyBLbm93IHRoYXQgdGhlIHRyYXZlcnNhbCBvZiB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGlzIGRvbmUgc2VxdWVudGlhbGx5LgotCQkJLy8gaS5lLiwgdGhhdCBhIGNsYXNzIGlzIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gb25lIGJlYW4gYXQgYXQgdGltZS4KLQkJCS8vIFRodXMsIHdlIGNhbiBjYWNoZSB0aGUga2V5IGZpZWxkIGluZm9ybWF0aW9uIHRvIHNwZWVkIHVwIHN1YnNlcXVlbnQgY2FsbHMuCi0JCQlMaXN0IGZpZWxkcyA9IGNtcC5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOwotCQkJX2tleUZpZWxkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDTVBBdHRyaWJ1dGUgYXR0cmliID0gKENNUEF0dHJpYnV0ZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJX2tleUZpZWxkcy5hZGQoYXR0cmliLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9rZXlGaWVsZHM7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJQ2xhc3NWUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIEZpZWxkKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgZmllbGRUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0RmllbGRUeXBlSWQoYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJaWYoKGZpZWxkVHlwZSAmIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEKSA9PSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuU0VSSUFMVkVSU0lPTlVJRCkgewotCQkJdmFsaWRhdGVTZXJpYWxWZXJzaW9uVUlEKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gSVdBRDQyNTMgPSBUaGlzIGZpZWxkIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTAuOC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKGZpZWxkKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIyMDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQkKLQkJCVNldCBrZXlGaWVsZHMgPSBnZXRLZXlGaWVsZHMoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbik7Ci0JCQlpZigha2V5RmllbGRzLmNvbnRhaW5zKGZpZWxkLmdldE5hbWUoKSkpIHsKLQkJCQkvLyBJV0FENDI1NCA9IFRoaXMgZmllbGQgaXMgbm90IGEgPGNtcC1maWVsZD4uIFJlYWQgc2VjdGlvbiAxMC44LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMjA2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCWlmKF9rZXlGaWVsZHMgIT0gbnVsbCkgewotCQkJX2tleUZpZWxkcy5jbGVhcigpOwotCQkJX2tleUZpZWxkcyA9IG51bGw7IC8vIGluIHRoaXMgY2FzZSwgY2xlYXJpbmcgdGhlIFNldCBpc24ndCBlbm91Z2guCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUExvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjYWNlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ01QTG9jYWxDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElDb21wb25lbnRUeXBlLCBJTG9jYWxUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuY2xjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0VKQlNFTEVDVH07Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgRUpCU0VMRUNUfTsgLy8gTXVzdCBrbm93IEVKQlNFTEVDVCB0byBjaGVjayB0aGF0IGl0J3Mgbm90IGV4cG9zZWQgb24gdGhpcyBpbnRlcmZhY2UKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NCwgbmV3IFN0cmluZ1tde0NIS0oyNDc0K0JFWFQsIENIS0oyNDc0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2VqYlNlbGVjdCwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2VqYlNlbGVjdCtCRVhULCBDSEtKMjUwMl9lamJTZWxlY3QrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbEhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUExvY2FsSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YWVlMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUExvY2FsSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBMb2NhbEhvbWVWUnVsZSBleHRlbmRzIEFDTVBIb21lVlJ1bGUgaW1wbGVtZW50cyBJTG9jYWxUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCRVhUfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuY2xoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkxPQ0FMSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkRCWVBSSU1BUllLRVksIEZJTkR9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0VKQlNFTEVDVH07Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFLCBGSU5EQllQUklNQVJZS0VZLCBGSU5ELCBIT01FLCBFSkJTRUxFQ1R9OyAvLyBNdXN0IGtub3cgRUpCU0VMRUNUIHRvIGNoZWNrIHRoYXQgaXQncyBub3QgZXhwb3NlZCBvbiB0aGlzIGludGVyZmFjZQotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXksIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmQrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYyLCBuZXcgU3RyaW5nW117Q0hLSjI0NjIrQkVYVCwgQ0hLSjI0NjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MytCRVhULCBDSEtKMjQ2MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NCwgbmV3IFN0cmluZ1tde0NIS0oyNDY0K0JFWFQsIENIS0oyNDY0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NStCRVhULCBDSEtKMjQ3NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NywgbmV3IFN0cmluZ1tde0NIS0oyNDc3K0JFWFQsIENIS0oyNDc3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc4LCBuZXcgU3RyaW5nW117Q0hLSjI0NzgrQkVYVCwgQ0hLSjI0NzgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzksIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OStCRVhULCBDSEtKMjQ3OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk1LCBuZXcgU3RyaW5nW117Q0hLSjI0OTUrQkVYVCwgQ0hLSjI0OTUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2ZpbmQrQkVYVCwgQ0hLSjI1MDBfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9lamJTZWxlY3QsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9lamJTZWxlY3QrQkVYVCwgQ0hLSjI1MDJfZWpiU2VsZWN0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2ZpbmQrQkVYVCwgQ0hLSjI1MDNfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfaG9tZStCRVhULCBDSEtKMjUwM19ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2ZpbmQrQkVYVCwgQ0hLSjI1MDRfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfaG9tZStCRVhULCBDSEtKMjUwNF9ob21lK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUFJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkZjAwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ01QUmVtb3RlQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUNvbXBvbmVudFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX1JFTU9URTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuY3JjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQk9CSkVDVH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0VKQlNFTEVDVH07Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgRUpCU0VMRUNUfTsgLy8gTXVzdCBrbm93IEVKQlNFTEVDVCB0byBjaGVjayB0aGF0IGl0J3Mgbm90IGV4cG9zZWQgb24gdGhpcyBpbnRlcmZhY2UKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OCtCRVhULCBDSEtKMjQ2OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OSwgbmV3IFN0cmluZ1tde0NIS0oyNDY5K0JFWFQsIENIS0oyNDY5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MCtCRVhULCBDSEtKMjQ3MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MSwgbmV3IFN0cmluZ1tde0NIS0oyNDcxK0JFWFQsIENIS0oyNDcxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcyLCBuZXcgU3RyaW5nW117Q0hLSjI0NzIrQkVYVCwgQ0hLSjI0NzIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MytCRVhULCBDSEtKMjQ3MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NCwgbmV3IFN0cmluZ1tde0NIS0oyNDc0K0JFWFQsIENIS0oyNDc0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9idXNpbmVzcytCRVhULCBDSEtKMjUwMF9idXNpbmVzcytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZWpiU2VsZWN0LCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZWpiU2VsZWN0K0JFWFQsIENIS0oyNTAyX2VqYlNlbGVjdCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW47Ci0JCQotCQkvLyAxMC4zLjEsIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbnQgZmllbGRzIGFuZCBjb250YWluZXItbWFuYWdlZCByZWxhdGlvbnNoaXAgCi0JCS8vIGZpZWxkcyBtdXN0ICpub3QqIGJlIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzLiAKLQkJTGlzdCBjbXJGaWVsZHMgPSBjbXAuZ2V0Q01SRmllbGRzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY21yRmllbGRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQ01SRmllbGQgY21yRmllbGQgPSAoQ01SRmllbGQpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoKGNtckZpZWxkICE9IG51bGwpICYmICghY21yRmllbGQuaXNEZXJpdmVkKCkpKSB7Ci0KLQkJCQlKYXZhSGVscGVycyBsb2NhbFR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Q01SRmllbGRUeXBlKHZjLCBjbXAsIGNsYXp6LCBjbXJGaWVsZCk7Ci0JCQkJaWYobG9jYWxUeXBlID09IG51bGwpIHsKLQkJCQkJLy8gdXNlciBtYWRlIGEgbWlzdGFrZSBpbiBlamItamFyLnhtbCBieSB0cnlpbmcgdG8gY3JlYXRlIGEgcmVsYXRpb24KLQkJCQkJLy8gdG8gYSBDTVAgd2hpY2ggZG9lc24ndCBoYXZlIGEgbG9jYWwgaW50ZXJmYWNlLgotCQkJCQkvLyBEb24ndCByZXBvcnQgYW4gZXJyb3IgaGVyZTsgbGV0IHRoZSBERCB2YWxpZGF0aW9uIHJlcG9ydCB0aGUgZXJyb3IuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCS8vIENhbm5vdCBleHBvc2UgZ2V0L3NldCBtZXRob2RzIG9mIENNUiBmaWVsZHMgb24gdGhlIHJlbW90ZSBob21lIG9yIGludGVyZmFjZQotCQkJCU1ldGhvZCByZW1vdGVHZXRNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIGNtckZpZWxkLmdldEdldHRlck5hbWUoKSwgbmV3IEphdmFIZWxwZXJzWzBdLCBsb2NhbFR5cGUpOwotCQkJCWlmKHJlbW90ZUdldE1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3MywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGNtcCwgY2xhenosIHJlbW90ZUdldE1ldGhvZCwgbmV3IFN0cmluZ1tde2NtckZpZWxkLmdldEdldHRlck5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQotCQkJCUphdmFIZWxwZXJzW10gc2V0TWV0aG9kUGFybXMgPSBuZXcgSmF2YUhlbHBlcnNbXXtsb2NhbFR5cGV9OwotCQkJCU1ldGhvZCByZW1vdGVTZXRNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIGNtckZpZWxkLmdldFNldHRlck5hbWUoKSwgc2V0TWV0aG9kUGFybXMpOwotCQkJCWlmKHJlbW90ZVNldE1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzZXR0ZXJOYW1lID0gY21yRmllbGQuZ2V0U2V0dGVyTmFtZSgpICsgIigiICsgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFBhcm1zQXNTdHJpbmcoc2V0TWV0aG9kUGFybXMpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDczLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBjbGF6eiwgcmVtb3RlU2V0TWV0aG9kLCBuZXcgU3RyaW5nW117c2V0dGVyTmFtZX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGVjMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUFJlbW90ZUhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ01QUmVtb3RlSG9tZVZSdWxlIGV4dGVuZHMgQUNNUEhvbWVWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VKQkVYVH07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmNyaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkhPTUV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtGSU5EQllQUklNQVJZS0VZLCBGSU5EfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtFSkJTRUxFQ1R9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENSRUFURSwgRklOREJZUFJJTUFSWUtFWSwgRklORCwgSE9NRSwgRUpCU0VMRUNUfTsgLy8gTXVzdCBrbm93IEVKQlNFTEVDVCB0byBjaGVjayB0aGF0IGl0J3Mgbm90IGV4cG9zZWQgb24gdGhpcyBpbnRlcmZhY2UKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZmluZEJ5UHJpbWFyeUtleStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9maW5kK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAyLCBuZXcgU3RyaW5nW117Q0hLSjI0MDIrQkVYVCwgQ0hLSjI0MDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMytCRVhULCBDSEtKMjQwMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MStCRVhULCBDSEtKMjQ2MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MiwgbmV3IFN0cmluZ1tde0NIS0oyNDYyK0JFWFQsIENIS0oyNDYyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYzLCBuZXcgU3RyaW5nW117Q0hLSjI0NjMrQkVYVCwgQ0hLSjI0NjMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NCtCRVhULCBDSEtKMjQ2NCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NSwgbmV3IFN0cmluZ1tde0NIS0oyNDY1K0JFWFQsIENIS0oyNDY1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY2LCBuZXcgU3RyaW5nW117Q0hLSjI0NjYrQkVYVCwgQ0hLSjI0NjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NytCRVhULCBDSEtKMjQ2NytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc1LCBuZXcgU3RyaW5nW117Q0hLSjI0NzUrQkVYVCwgQ0hLSjI0NzUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NytCRVhULCBDSEtKMjQ3NytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OCwgbmV3IFN0cmluZ1tde0NIS0oyNDc4K0JFWFQsIENIS0oyNDc4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc5LCBuZXcgU3RyaW5nW117Q0hLSjI0NzkrQkVYVCwgQ0hLSjI0NzkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NSwgbmV3IFN0cmluZ1tde0NIS0oyNDk1K0JFWFQsIENIS0oyNDk1K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2hvbWUrQkVYVCwgQ0hLSjI1MDBfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9maW5kK0JFWFQsIENIS0oyNTAwX2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZWpiU2VsZWN0LCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZWpiU2VsZWN0K0JFWFQsIENIS0oyNTAyX2VqYlNlbGVjdCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19maW5kK0JFWFQsIENIS0oyNTAzX2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2hvbWUrQkVYVCwgQ0hLSjI1MDNfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9maW5kK0JFWFQsIENIS0oyNTA0X2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2hvbWUrQkVYVCwgQ0hLSjI1MDRfaG9tZStNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ2xhc3NVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ2xhc3NVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDIyM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NsYXNzVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NVdGlsaXR5IHsKLQlwdWJsaWMgc3RhdGljIGxvbmcgc3VwZXJ0eXBlX2NvdW50ZXIgPSAweDE7IC8vIHVzZWQgYnkgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLmphdmEKLQlwcml2YXRlIGxvbmdbXSBfY2xhc3NUeXBlSW5kZXg7Ci0JcHJpdmF0ZSBBQ2xhc3NUeXBlW10gX2NsYXNzTmFtZXM7Ci0JCi0JcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBBQ2xhc3NUeXBlIHsKLQkJcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb247Ci0JCXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldElkKCk7Ci0KLQkJcHVibGljIEphdmFIZWxwZXJzIGdldENsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGdldE5hbWUoYmVhbiksIGJlYW4pOwotCQl9Ci0JCQotCQkvKioKLQkJICogSXMgdGhpcyBjbGFzcyB0eXBlIGVxdWFsIHRvIHRoZSBjbGF6eiBwYXJhbWV0ZXIuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJCWlmKGNsYXp6ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUphdmFIZWxwZXJzIHRoaXNDbGFzcyA9IGdldENsYXNzKGJlYW4pOwotCQkJaWYodGhpc0NsYXNzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBjbGF6ei5lcXVhbHModGhpc0NsYXNzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDbGFzc1V0aWxpdHkgX2luc3QgPSBudWxsOwotCQotCXByaXZhdGUgQ2xhc3NVdGlsaXR5KCkgewotCQlidWlsZFR5cGVMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ2xhc3NVdGlsaXR5IGdldFV0aWxpdHkoKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IENsYXNzVXRpbGl0eSgpOwotCQl9Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2xhenogaXMgdGhlIHNhbWUgYXMgdGhlIGNsYXNzLCBpZGVudGlmaWVkIGJ5IHRoZSAidHlwZSIKLQkgKiBwYXJhbWV0ZXIsIGluIHRoZSBiZWFuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xhc3NUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgbG9uZyB0eXBlKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJQUNsYXNzVHlwZSBjdCA9IGdldENsYXNzVHlwZSh0eXBlKTsKLQkJaWYoY3QgPT0gbnVsbCkgewotCQkJLy8gVW5rbm93biB0eXBlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBjdC5lcXVhbHMoYmVhbiwgY2xhenopOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIGxvbmcgdHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUFDbGFzc1R5cGUgY3QgPSBnZXRDbGFzc1R5cGUodHlwZSk7Ci0JCWlmKGN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gY3QuZ2V0TmFtZShiZWFuKTsKLQl9Ci0KLQlwdWJsaWMgQUNsYXNzVHlwZSBnZXRDbGFzc1R5cGUobG9uZyB0eXBlKSB7Ci0JCWludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goX2NsYXNzVHlwZUluZGV4LCB0eXBlKTsKLQkJaWYoaW5kZXggPiBfY2xhc3NOYW1lcy5sZW5ndGgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihfY2xhc3NOYW1lc1tpbmRleF0uZ2V0SWQoKSAhPSB0eXBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIF9jbGFzc05hbWVzW2luZGV4XTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0U3VwZXJ0eXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIGxvbmcgdHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUFDbGFzc1R5cGUgY3QgPSBnZXRDbGFzc1R5cGUodHlwZSk7Ci0JCWlmKGN0ID09IG51bGwpIHsKLQkJCS8vIE5vIHN1cGVydHlwZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBjdC5nZXRDbGFzcyhiZWFuKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHlwZUxpc3QoKSB7Ci0JCWludCB0eXBlQ291bnQgPSAxMjsgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGlkZW50aWZpYWJsZSBjbGFzc2VzIGluIElUeXBlQ29uc3RhbnRzCi0JCV9jbGFzc1R5cGVJbmRleCA9IG5ldyBsb25nW3R5cGVDb3VudF07Ci0JCV9jbGFzc05hbWVzID0gbmV3IEFDbGFzc1R5cGVbdHlwZUNvdW50XTsKLQkJaW50IGNvdW50ID0gMDsKLQkJCi0JCS8vIFRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgbG9uZ1tdIGlzIGVxdWFsIHRvIHRoZQotCQkvLyBpbmRleCBvZiB0aGUgSU1ldGhvZFR5cGUgaW4gdGhlIElNZXRob2RUeXBlW10uIEJ5IHVzaW5nCi0JCS8vIHRoaXMgdGVjaG5pcXVlIGluc3RlYWQgb2YgYSBIYXNoTWFwLCB3ZSBkb24ndCBuZWVkIHRvCi0JCS8vIGNyZWF0ZSBhbiBJbnRlZ2VyIGV2ZXJ5IHRpbWUgd2UgbmVlZCB0byBsb2NhdGUgdGhlIAotCQkvLyBJTWV0aG9kVHlwZS4KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkxPQ0FMX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCUphdmFIZWxwZXJzIGNsYXp6ID0gZ2V0Q2xhc3MoYmVhbik7Ci0JCQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkxPQ0FMX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBKYXZhSGVscGVycyBnZXRDbGFzcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpKSkgewotCQkJCQlKYXZhQ2xhc3MgcmVzdWx0ID0gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpOwotCQkJCQl0cnkgewotCQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQkKLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLlJFTU9URV9DT01QT05FTlRfSU5URVJGQUNFOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlKYXZhSGVscGVycyBjbGF6eiA9IGdldENsYXNzKGJlYW4pOwotCQkJCWlmKGNsYXp6ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5SRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRTsKLQkJCX0KLQkJCQotCQkJcHVibGljIEphdmFIZWxwZXJzIGdldENsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlpZihiZWFuID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCQotCQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpKSkgewotCQkJCQlKYXZhQ2xhc3MgcmVzdWx0ID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZXN1bHQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRU5USVRZQkVBTjsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQkVBTjsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FTlRJVFlCRUFOOwotCQkJfQotCQl9OwotCQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRTsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCTE9DQUxIT01FOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRTsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVDsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkhPTUU7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCSE9NRTsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQk9CSkVDVDsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCT0JKRUNUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQk9CSkVDVDsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVDsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVDsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTjsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTjsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUjsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUjsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX1NFU1NJT05CRUFOOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQkVBTjsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9TRVNTSU9OQkVBTjsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT047Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT047Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTjsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3Rvck1lc3NhZ2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwZDQ4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotLyoqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cyBleHRlbmRzIEoyRUVNZXNzYWdlQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFXzFfMyA9ICIxLjAiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfMV80ID0gIjEuNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfTU9ERUxfTkFNRSA9ICJDT05ORUNUT1JfVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8gPSAiQ09OTkVDVE9SX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0lOVkFMSURfQ09OTkVDVE9SX0ZJTEUgPSAiRVJST1JfSU5WQUxJRF9DT05ORUNUT1JfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9DT05ORUNUT1JfVkFMSURBVElPTl9GQUlMRUQgPSAiRVJST1JfQ09OTkVDVE9SX1ZBTElEQVRJT05fRkFJTEVEIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3RvclZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3RvclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI0NTk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Db25uZWN0b3JWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JWYWxpZGF0b3IgZXh0ZW5kcyBKMkVFVmFsaWRhdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIFJBUkZpbGUgcmFyRmlsZTsKLQlwcm90ZWN0ZWQgQ29ubmVjdG9yIGNvbm5lY3RvckREOwotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uSjJFRVZhbGlkYXRvciNnZXRCYXNlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlTmFtZSgpIHsKLQkJcmV0dXJuICJyYXJ2YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbm5lY3RvckRELgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yREQoKSB7Ci0JCXJldHVybiBjb25uZWN0b3JERDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29ubmVjdG9yREQgVGhlIGNvbm5lY3RvckREIHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb25uZWN0b3JERChDb25uZWN0b3IgY29ubmVjdG9yREQpIHsKLQkJdGhpcy5jb25uZWN0b3JERCA9IGNvbm5lY3RvckREOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmFyRmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgUkFSRmlsZSBnZXRSYXJGaWxlKCkgewotCQlyZXR1cm4gcmFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmFyRmlsZSBUaGUgcmFyRmlsZSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmFyRmlsZShSQVJGaWxlIHJhckZpbGUpIHsKLQkJdGhpcy5yYXJGaWxlID0gcmFyRmlsZTsKLQl9Ci0JCQotCS8qKgotCSAqIERvZXMgdGhlIHZhbGlkYXRpb24uCi0JICogCi0JICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZShpbkhlbHBlciwgaW5SZXBvcnRlcik7Ci0JCQotCQkvLyBGaXJzdCByZW1vdmUgYWxsIHByZXZpb3VzIG1zZy4gZm9yIHRoaXMgcHJvamVjdAotCQlfcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgbnVsbCk7IC8vIE5vdGUgdGhlIFdhckhlbHBlciB3aWxsIHJldHVybiB3ZWIueG1sIHdpdGggYSBudWxsIG9iamVjdCBhcyB3ZWxsCi0JCi0JCXRyeSB7Ci0JCQlzZXRSYXJGaWxlKChSQVJGaWxlKSBpbkhlbHBlci5sb2FkTW9kZWwoQ09OTkVDVE9SX01PREVMX05BTUUpKTsKLQkJCWlmIChyYXJGaWxlICE9IG51bGwpIHsKLQkJCQlzZXRDb25uZWN0b3JERCggcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICk7Ci0JCQkJLy92YWxpZGF0ZUoyRUUxNERvY1R5cGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFUlJPUl9JTlZBTElEX0NPTk5FQ1RPUl9GSUxFKTsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZyk7Ci0JCQl9Ci0JCi0JCX0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IGV4OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFUlJPUl9DT05ORUNUT1JfVkFMSURBVElPTl9GQUlMRUQpOwotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2csIGUpOwotCQl9CQkKLQl9CQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKMkVFMTREb2NUeXBlKCkgewotCQotCQlpZiAoIGdldENvbm5lY3RvckREKCkuZ2V0VmVyc2lvbklEKCkgPCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEKSB7Ci0JCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotCQkJcGFyYW1zWzBdID0gRE9DVFlQRV8xXzQ7Ci0JCQkvL3BhcmFtc1sxXSA9IGhlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkJcGFyYW1zWzJdID0gRE9DVFlQRV8xXzM7Ci0JCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8sIHBhcmFtcyk7Ci0JCX0gZWxzZSBpZiAoZ2V0Q29ubmVjdG9yREQoKS5nZXRWZXJzaW9uSUQoKSAhPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEKSB7Ci0JCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotCQkJcGFyYW1zWzBdID0gRE9DVFlQRV8xXzM7Ci0JCQkvL3BhcmFtc1sxXSA9IGhlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkJcGFyYW1zWzJdID0gRE9DVFlQRV8xXzQ7Ci0JCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8sIHBhcmFtcyk7Ci0JCX0vLyBpZgotCX0vLyB2YWxpZGF0ZURvY1R5cGVWc05hdHVyZQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0R1cGxpY2F0ZXNUYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0R1cGxpY2F0ZXNUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQ5OGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9EdXBsaWNhdGVzVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBJbiBzb21lIHBsYWNlcyBpbiB0aGUgY29kZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGZpbmQgb3V0IGlmIHRoZXJlCi0gKiBhcmUgZHVwbGljYXRlcyBpbiBhIGxpc3QsIGFuZCBpZiB0aGVyZSBhcmUsIHRvIHJlZ2lzdGVyIGEgdmFsaWRhdGlvbgotICogbWVzc2FnZSBhZ2FpbnN0IHRoZSBkdXBsaWNhdGVzLiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gbWFrZSBmaW5kaW5nCi0gKiB0aGUgZHVwbGljYXRlcyBlYXNpZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBEdXBsaWNhdGVzVGFibGUgZXh0ZW5kcyBqYXZhLnV0aWwuSGFzaE1hcCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFVOSVFVRSA9IEJvb2xlYW4uRkFMU0U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIERVUExJQ0FURSA9IEJvb2xlYW4uVFJVRTsKLQlwcm90ZWN0ZWQgTWFwIF9kdXBsaWNhdGVzID0gbnVsbDsKLQotCS8qKgotCSAqIEFkZCBhbiBvYmplY3QgdG8gdGhpcyB0YWJsZTsgaWYgdGhlIG9iamVjdCBpcyBhIGR1cGxpY2F0ZSwgaXQgd2lsbCBiZQotCSAqIG1hcmtlZCB0byBhIGR1cGxpY2F0ZSBpbnN0ZWFkIG9mIGJlaW5nIGFkZGVkIHR3aWNlIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG8pIHsKLQkJLy8gQnVpbGQgdXAgaGFzaHRhYmxlIHRvIGNoZWNrIGZvciBkdXBsaWNhdGUgZWxlbWVudHMuCi0JCU9iamVjdCBrZXkgPSBnZXQobyk7Ci0JCWlmIChrZXkgPT0gbnVsbCkgewotCQkJcHV0KG8sIFVOSVFVRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYXZlRHVwbGljYXRlKG8pOwotCQkJcHV0KG8sIERVUExJQ0FURSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRHVwbGljYXRlKE9iamVjdCBvKSB7Ci0JCS8vIFRoZSBnaXZlbiBvYmplY3QgaGFzIGJlZW4gbWFya2VkIGEgZHVwbGljYXRlLgotCQkvLyBHaXZlbiB0aGF0IHRoZSBIYXNoTWFwIGNhbiBzdG9yZSBvbmx5IG9uZSBvYmplY3Qgd2l0aCB0aGUga2V5LCAKLQkJLy8gZHVwbGljYXRlcyBhcmUgb3ZlcndyaXR0ZW4uIFRoaXMgbWV0aG9kIHN0b3JlcyB0aGUgZHVwbGljYXRlcwotCQkvLyBlbHNld2hlcmUgaW4gYSBMaXN0LgotCQlpZiAoX2R1cGxpY2F0ZXMgPT0gbnVsbCkgewotCQkJX2R1cGxpY2F0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJTGlzdCBkdXBMaXN0ID0gKExpc3QpIF9kdXBsaWNhdGVzLmdldChvKTsKLQkJaWYgKGR1cExpc3QgPT0gbnVsbCkgewotCQkJZHVwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCWR1cExpc3QuYWRkKG8pOwotCQlfZHVwbGljYXRlcy5wdXQobywgZHVwTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgaW4gdGhpcyB0YWJsZSwgcmV0dXJuIHRydWU7IGVsc2UsIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0R1cGxpY2F0ZXMoKSB7Ci0JCXJldHVybiBjb250YWluc1ZhbHVlKERVUExJQ0FURSk7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSB1bmlxdWUgZWxlbWVudHMgaW4gdGhpcyB0YWJsZSwgcmV0dXJuIHRydWU7IGVsc2UsIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1VuaXF1ZXMoKSB7Ci0JCXJldHVybiBjb250YWluc1ZhbHVlKFVOSVFVRSk7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGluIHRoaXMgdGFibGUsIHJldHVybiBhIHNldCBvZiB0aGUgZHVwbGljYXRlcy4KLQkgKiBPdGhlcndpc2UsIHJldHVybiBhbiBlbXB0eSBzZXQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RHVwbGljYXRlcygpIHsKLQkJaWYgKCFjb250YWluc0R1cGxpY2F0ZXMoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQkvLyBFbHNlLCBnZXQgdGhlIGR1cGxpY2F0ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0Ci0JCXJldHVybiBnZXRFbGVtZW50cyhEVVBMSUNBVEUpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgZHVwbGljYXRlcyBpbiB0aGlzIHRhYmxlLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBkdXBsaWNhdGVzLgotCSAqIE90aGVyd2lzZSwgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEVsZW1lbnRzKEJvb2xlYW4gdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCS8vIEVsc2UsIGdldCB0aGUgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QKLQkJU2V0IGtleXMgPSBrZXlTZXQoKTsKLQkJaWYgKGtleXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGtleXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGdldChrZXkpOwotCQkJaWYgKHZhbHVlID09IHR5cGUpIHsKLQkJCQllbGVtZW50cy5hZGQoa2V5KTsKLQkJCX0KLQkJfQotCi0JCWlmICh0eXBlID09IERVUExJQ0FURSkgewotCQkJLy8gQWxzbyBhZGQgdGhlIGVsZW1lbnRzIGZyb20gdGhlICJkdXBsaWNhdGVzIiBsaXN0LgotCQkJaWYgKF9kdXBsaWNhdGVzICE9IG51bGwpIHsKLQkJCQlpdGVyYXRvciA9IF9kdXBsaWNhdGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlMaXN0IGR1cExpc3QgPSAoTGlzdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQllbGVtZW50cy5hZGRBbGwoZHVwTGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgdW5pcXVlIGVsZW1lbnRzIGluIHRoaXMgdGFibGUsIHJldHVybiBhIHNldCBvZiB0aGUgdW5pcXVlIGVsZW1lbnRzLgotCSAqIE90aGVyd2lzZSwgcmV0dXJuIGFuIGVtcHR5IHNldC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRVbmlxdWVzKCkgewotCQlpZiAoIWNvbnRhaW5zVW5pcXVlcygpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCS8vIEVsc2UsIGdldCB0aGUgdW5pcXVlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QKLQkJcmV0dXJuIGdldEVsZW1lbnRzKFVOSVFVRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXN1cGVyLmNsZWFyKCk7Ci0JCWlmKF9kdXBsaWNhdGVzICE9IG51bGwpIHsKLQkJCV9kdXBsaWNhdGVzLmNsZWFyKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUFSTWVzc2FnZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VBUk1lc3NhZ2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiZTBiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUFSTWVzc2FnZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi0KLS8qKgotICogTWVzc2FnZSBrZXkgY29uc3RhbnRzIGZvciBXQVIgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBFQVJNZXNzYWdlQ29uc3RhbnRzIGV4dGVuZHMgSjJFRU1lc3NhZ2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9WQUxJREFUT1JfSUQgPSAiRUFSX1ZBTElEQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfTU9ERUxfTkFNRSA9ICJFQVJfVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfVkFMSURBVElPTl9GQUlMRUQgPSAiRVJST1JfRUFSX1ZBTElEQVRJT05fRkFJTEVEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9JTlZBTElEX0VBUl9GSUxFID0gIkVSUk9SX0VBUl9JTlZBTElEX0VBUl9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVMgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0VBUl9OT19NT0RVTEVfVVJJID0gIk1FU1NBR0VfRUFSX05PX01PRFVMRV9VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9FQVJfTUlTU0lOR19VUkkgPSAiTUVTU0FHRV9FQVJfTUlTU0lOR19VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0REX1BBUlNFX0xJTkVDT0wgPSAiRUFSX0REX1BBUlNFX0xJTkVDT0wiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0REX1BBUlNFX0xJTkVDT0wgPSAiTU9EVUxFX0REX1BBUlNFX0xJTkVDT0xfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9ERF9QQVJTRV9OT0lORk8gPSAiTU9EVUxFX0REX1BBUlNFX05PSU5GT19FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0REX1BBUlNFX0xJTkUgPSAiTU9EVUxFX0REX1BBUlNFX0xJTkVfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9ERF9QQVJTRV9MSU5FID0gIkVBUl9ERF9QQVJTRV9MSU5FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9ERF9DQU5OT1RfT1BFTl9ERCA9ICJFQVJfRERfQ0FOTk9UX09QRU5fREQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0REX1BBUlNFX05PSU5GTyA9ICJFQVJfRERfUEFSU0VfTk9JTkZPIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfRUFSX0RVUExJQ0FURV9VUklfRVJST1JfID0gIk1FU1NBR0VfRUFSX0RVUExJQ0FURV9VUklfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfSU5WQUxJRF9BTFRfRERfV0FSTl8gPSAiTUVTU0FHRV9JTlZBTElEX0FMVF9ERF9XQVJOXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0VNUFRZX0FMVF9ERF9FUlJPUl8gPSAiTUVTU0FHRV9FTVBUWV9BTFRfRERfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOUkVTT0xWRURfRUpCX1JFRl9XQVJOXz0gIlVOUkVTT0xWRURfRUpCX1JFRl9XQVJOXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9SRUFESU5HX01BTklGRVNUX0VSUk9SXyA9ICJFUlJPUl9SRUFESU5HX01BTklGRVNUX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9MSU5FX0VYQ0VFRFNfTEVOR1RIX0VSUk9SXyA9ICJNQU5JRkVTVF9MSU5FX0VYQ0VFRFNfTEVOR1RIX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9MSU5FX0VORF9FUlJPUl8gPSAiTUFOSUZFU1RfTElORV9FTkRfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfRUFSX0RVUElDQVRFX1JPT1RDT05URVhUX0VSUk9SXyA9ICJNRVNTQUdFX0VBUl9EVVBJQ0FURV9ST09UQ09OVEVYVF9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0NPTlRBSU5TX1NQQUNFU19FUlJPUl8gPSAiVVJJX0NPTlRBSU5TX1NQQUNFU19FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9JTkNPTVBBVElCTEVfU1BFQ19XQVJOSU5HXyA9ICJNRVNTQUdFX0lOQ09NUEFUSUJMRV9TUEVDX1dBUk5JTkdfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9CRUFOX0VKQl9MSU5LX0lOVEVGQUNFX01JU01BVENIX0VSUk9SXyA9ICJFSkJfQkVBTl9FSkJfTElOS19JTlRFRkFDRV9NSVNNQVRDSF9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1JfVUlfID0iRUFSX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1JfVUlfIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkV4dDIwVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJFeHQyMFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1M2Y1ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkV4dDIwVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb247Ci0KLS8qKgotICogVmFsaWRhdGUgdGhlIFdlYlNwaGVyZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBub24tc3BlYyBmZWF0dXJlcywgc3VjaAotICogYXMgY29tcG9uZW50IGluaGVyaXRhbmNlLgotICovCi1wdWJsaWMgY2xhc3MgRUpCRXh0MjBWUnVsZSBleHRlbmRzIEFWYWxpZGF0aW9uUnVsZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfTUVTU0FHRV9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCSkFSfTsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDYsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0OSwgbmV3IFN0cmluZ1tde0NIS0oyODQ5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODUyLCBuZXcgU3RyaW5nW117Q0hLSjI4NTJ9KTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VKQkVYVDsKLQl9Ci0JCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBiZWFuIGNvbXBvbmVudHMgKGhvbWUgaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlLCBiZWFuIGNsYXNzLCBhbmQgcHJpbWFyeQotCSAqIGtleSkgY2FuIGFsbCBiZSBmb3VuZCBhbmQgcmVmbGVjdGVkLCByZXR1cm4gdHJ1ZS4gTGV0IHRoZSBERFZhbGlkYXRvcgotCSAqIHJlcG9ydCB0aGUgZXJyb3IgbWVzc2FnZSBhZ2FpbnN0IHRoZSBiZWFuIGlmIG9uZSBvZiB0aGVzZSB0eXBlcyBkb2Vzbid0IHJlZmxlY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYXJlQmVhbkNvbXBvbmVudHNSZWZsZWN0ZWQoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHRoZSBiZWFuIGlzIG51bGwsIGJlY2F1c2UgdGhpcyBtZXRob2Qgd2lsbAotCQkvLyBub3QgYmUgY2FsbGVkIGlmIGl0IGlzLgotCQl0cnkgewotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoYmVhbiBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW4pIHsKLQkJCS8vIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHJlc3QKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0hvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCkpKSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJSmF2YUNsYXNzIHByaW1hcnlLZXkgPSAoKEVudGl0eSkgYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQkJdHJ5IHsKLQkJCQlpZigoKEVudGl0eSliZWFuKS5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1ByaW1hcnlLZXkoKSkpIHsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHByaW1hcnlLZXkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldFRleHQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOjp2YWxpZGF0ZSgiICsgdGFyZ2V0UGFyZW50ICsgIiwgIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQl9Ci0JCQotCQlFSkJKYXIgZWpiSmFyID0gbnVsbDsKLQkJaWYodGFyZ2V0UGFyZW50ID09IG51bGwpIHsKLQkJCWVqYkphciA9IChFSkJKYXIpdGFyZ2V0OwotCQkJdmFsaWRhdGUodmMsIGVqYkphcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBydW5uaW5nIGFzIGEgZGVwZW5kZW50Ci0JCQllamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGFyZ2V0UGFyZW50OwotCQkJdmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbnRlcnByaXNlQmVhbnMuaXRlcmF0b3IoKTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYmVhbiA9IChFbnRlcnByaXNlQmVhbilpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihiZWFuID09IG51bGwpIHsKLQkJCQkvLyBJZiBiZWFuIGlzbid0IHZhbGlkLCBkb24ndCBwZXJmb3JtIGFueSBvZiB0aGUgb3RoZXIKLQkJCQkvLyB2YWxpZGF0aW9uIGNoZWNrcyBvbiBpdC4gTGV0IEREVmFsaWRhdG9yIG91dHB1dCB0aGUgZXJyb3IgbWVzc2FnZS4KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gQ2hlY2sgaWYgdGhlIGNsYXNzIGV4aXN0cywgZXRjLgotCQkJaWYoIWFyZUJlYW5Db21wb25lbnRzUmVmbGVjdGVkKGJlYW4pKSB7Ci0JCQkJLy8gU29tZXRoaW5nIGRpZG4ndCByZWZsZWN0IHByb3Blcmx5LCBzbyBkb24ndCBjb250aW51ZSB3aXRoIHRoZQotCQkJCS8vIHJlc3Qgb2YgdGhlIGNoZWNrcy4gU29tZSBtZXRhZGF0YSB3aWxsIGJlIG5vbnNlbnNlLgotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gQ29tcG9uZW50IGluaGVyaXRhbmNlIGlzIG5vdyBjaGVja2VkIGluIGVhY2ggVlJ1bGUgaW5zdGVhZCBvZiBoZXJlLgotCQkJLy8gVGhpcyB3YXMgbmVjZXNzYXJ5IGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uOyBpZiBvbmUgY2xhc3MgY2hhbmdlZAotCQkJLy8gaW4gdGhlIGJlYW4sIGFuZCB0aGUgYmVhbiB3YXMgYSBtZW1iZXIgb2YgY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGVuCi0JCQkvLyBtZXNzYWdlcyB3ZXJlIGFkZGVkIG11bHRpcGxlIHRpbWVzIG9udG8gdGhlIGNsYXNzZXMgd2hpY2ggaGFkIG5vdCBjaGFuZ2VkLgotCQkJLy8gSW4gb3JkZXIgdG8gYXZvaWQgbXVsdGlwbGUgbWVzc2FnZXMsIG9ubHkgdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZSBvZgotCQkJLy8gdGhlIGNsYXNzIHdoaWNoIGNoYW5nZWQgc2hvdWxkIGJlIHJldmFsaWRhdGVkIHdoZW4gdGhlIGNsYXNzIGNoYW5nZXMuCi0JCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgZWpiSmFyLCBiZWFuKTsgLy8gdmFsaWRhdGUgdGhlIGtleSBjbGFzcyBzaW5jZSB0aGF0IG1lc3NhZ2UgaXMgcmVnaXN0ZXJlZCBhZ2FpbnN0IGVqYi1qYXIueG1sCi0JCX0KLQkJY2F0Y2goTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCS8qIHVucmVhY2hhYmxlIGNhdGNoIGJsb2NrCi0JCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBJZiB0aGVyZSdzIGEgcHJvYmxlbSwgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JDb25zdGFudHMuQ0hLSjI4NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW117QXJjaGl2ZUNvbnN0YW50cy5FSkJKQVJfRVhURU5TSU9OU19TSE9SVF9OQU1FLCBiZWFuTmFtZX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJLy8gSWYgdGhlcmUncyBhIHByb2JsZW0sIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBiZWFuLgotCQkJU3RyaW5nIHN1cGVyVHlwZU5hbWUgPSBnZXRFSkJJbmhlcml0YW5jZUZpbGVOYW1lKCk7Ci0JCQlpZihzdXBlclR5cGVOYW1lID09IG51bGwpCi0JCQkgIHN1cGVyVHlwZU5hbWUgPSAidW5rbm93biBzdXBlciB0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXXtzdXBlclR5cGVOYW1lLCBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmKCFiZWFuLmlzRW50aXR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlKYXZhQ2xhc3MgdGhpc0tleSA9ICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJRW50ZXJwcmlzZUJlYW4gc3VwZXJ0eXBlID0gZ2V0U3VwZXJUeXBlKGJlYW4pOwotCQlKYXZhQ2xhc3MgcGFyZW50S2V5ID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayB0aGlzIENNUCdzIHN1cGVydHlwZQotCQkJLy8gS2V5IGEgWGNoaWxkIG9mIHBhcmVudCBLZXkKLQkJCS8vIEluIFdTQSBFSkIgY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgcm9vdCBFSkIgbXVzdCBkZWZpbmUgdGhlIGtleS4KLQkJCS8vIFRoZSBrZXkgaXMgdGhlIHNhbWUgZm9yIGFsbCBjaGlsZCBFSkJzLgotCQkJaWYgKHN1cGVydHlwZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXBhcmVudEtleSA9ICgoRW50aXR5KSBzdXBlcnR5cGUpLmdldFByaW1hcnlLZXkoKTsKLQotCQkJCWlmICgodGhpc0tleSA9PSBudWxsKSB8fCAocGFyZW50S2V5ID09IG51bGwpIHx8ICF0aGlzS2V5LmVxdWFscyhwYXJlbnRLZXkpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyBiZWFuLmdldE5hbWUoKSwgcGFyZW50S2V5LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotLy8JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBzdXBlcnR5cGUsIHBhcmVudEtleSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjExVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJKYXIxMVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzg1MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjExVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVqYi1qYXIueG1sIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIDE1LjIuNS4zIERlY2xhcmF0aW9uIG9mIHNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZWQgZnJvbSB0aGUgYmVhbidzIGNvZGUKLSAqIFRoZSBCZWFuIFByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNsYXJpbmcgaW4gdGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ktbWVudAotICogZGVzY3JpcHRvciBhbGwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZXMgdXNlZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuIERlY2xhcmluZyB0aGUgc2VjdXJpdHkgcm9sZXMKLSAqIHJlZmVyZW5jZXMgaW4gdGhlIGNvZGUgYWxsb3dzIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgb3IgRGVwbG95ZXIgdG8gbGluayB0aGUgbmFtZXMgb2YgdGhlIHNlY3VyaXR5Ci0gKiByb2xlcyB1c2VkIGluIHRoZSBjb2RlIHRvIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGZvciBhbiBhc3NlbWJsZWQgYXBwbGljYXRpb24gdGhyb3VnaCB0aGUgc2VjdS1yaXR5LQotICogcm9sZSBlbGVtZW50cy4KLSAqIFRoZSBCZWFuIFByb3ZpZGVyIG11c3QgZGVjbGFyZSBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlZCBpbiB0aGUgY29kZSB1c2luZyB0aGUgc2VjdS1yaXR5LQotICogcm9sZS1yZWYgZWxlbWVudCBhcyBmb2xsb3dzOgotICogICAgICBEZWNsYXJlIHRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSByb2xlIHVzaW5nIHRoZSByb2xlLW5hbWUgZWxlbWVudC4gVGhlIG5hbWUgbXVzdCBiZSB0aGUKLSAqIHNlY3VyaXR5IHJvbGUgbmFtZSB0aGF0IGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIGlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlLU5hbWUpCi0gKiBtZXRob2QuCi0gKiAgICAgIE9wdGlvbmFsOiBQcm92aWRlIGEgZGVzY3JpcHRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgaW4gdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQuCi0gKiBBIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlLCBpbmNsdWRpbmcgdGhlIG5hbWUgZGVmaW5lZCBieSB0aGUgcm9sZS1uYW1lIGVsZW1lbnQsIGlzIHNjb3BlZCB0byB0aGUgc2VzLXNpb24KLSAqIG9yIGVudGl0eSBiZWFuIGVsZW1lbnQgd2hvc2UgZGVjbGFyYXRpb24gY29udGFpbnMgdGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQuCi0gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IGFuIGVudGVycHJpc2UgYmVhbidzIHJlZmVyZW5jZXMgdG8gc2VjdXJpdHkgcm9sZXMgYXJlIGRlY2xhcmVkIGluCi0gKiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogICAgLi4uCi0gKiAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLSAqICAgICAgIC4uLgotICogICAgICAgPGVudGl0eT4KLSAqICAgICAgICAgIDxlamItbmFtZT5BYXJkdmFya1BheXJvbGw8L2VqYi1uYW1lPgotICogICAgICAgICAgPGVqYi1jbGFzcz5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsQmVhbjwvZWpiLWNsYXNzPgotICogICAgICAgICAgLi4uCi0gKiAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gKiAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICAgICAgVGhpcyBzZWN1cml0eSByb2xlIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICBlbXBsb3llZXMgb2YgdGhlIHBheXJvbGwgZGVwYXJ0bWVudCB3aG8gYXJlCi0gKiAgICAgICAgICAgICAgICAgYWxsb3dlZCB0byB1cGRhdGUgZW1wbG95ZWVzJyBzYWxhcmllcy4KLSAqICAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICA8cm9sZS1uYW1lPnBheXJvbGw8L3JvbGUtbmFtZT4KLSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgIDwvZW50aXR5PgotICogICAgICAgLi4uCi0gKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0gKiAgICAuLi4KLSAqCi0gKiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFib3ZlIGluZGljYXRlcyB0aGF0IHRoZSBlbnRlcnByaXNlIGJlYW4gQWFyZHZhcmtQYXlyb2xsIG1ha2VzIHRoZQotICogc2VjdXJpdHkgY2hlY2sgdXNpbmcgaXNDYWxsZXJJblJvbGUoInBheXJvbGwiKSBpbiBpdHMgYnVzaW5lc3MgbWV0aG9kLgotICoKLSAqCi0gKiAxNS4zLjMgTGlua2luZyBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMgdG8gc2VjdXJpdHkgcm9sZXMKLSAqIElmIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgZGVmaW5lcyB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBoZQotICogb3Igc2hlIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGxpbmtpbmcgYWxsIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMgZGVjbGFyZWQgaW4gdGhlIHNlY3Utcml0eS0KLSAqIHJvbGUtcmVmIGVsZW1lbnRzIHRvIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotICogVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBsaW5rcyBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHRvIGEgc2VjdXJpdHkgcm9sZSB1c2luZyB0aGUgcm9sZS1saW5rCi0gKiBlbGVtZW50LiBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluCi0gKiBhIHNlY3VyaXR5LXJvbGUgZWxlbWVudC4KLSAqIEEgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB1c2VkIGV2ZW4gaWYgdGhlIHZhbHVlIG9mIHJvbGUtbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgb2YgdGhlCi0gKiByb2xlLWxpbmsgcmVmZXJlbmNlLgotICogVGhlIGZvbGxvd2luZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZXhhbXBsZSBzaG93cyBob3cgdG8gbGluayB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgbmFtZWQKLSAqIHBheXJvbGwgdG8gdGhlIHNlY3VyaXR5IHJvbGUgbmFtZWQgcGF5cm9sbC1kZXBhcnRtZW50LgotICogICAgLi4uCi0gKiAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLSAqICAgICAgIC4uLgotICogICAgICAgPGVudGl0eT4KLSAqICAgICAgICAgIDxlamItbmFtZT5BYXJkdmFya1BheXJvbGw8L2VqYi1uYW1lPgotICogICAgICAgICAgPGVqYi1jbGFzcz5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsQmVhbjwvZWpiLWNsYXNzPgotICogICAgICAgICAgLi4uCi0gKiAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gKiAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICAgICBUaGlzIHJvbGUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZQotICogICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQuCi0gKiAgICAgICAgICAgICAgICBNZW1iZXJzIG9mIHRoaXMgcm9sZSBoYXZlIGFjY2VzcyB0bwotICogICAgICAgICAgICAgICAgYW55b25lJ3MgcGF5cm9sbCByZWNvcmQuCi0gKgotICogICAgICAgICAgICAgICAgVGhlIHJvbGUgaGFzIGJlZW4gbGlua2VkIHRvIHRoZQotICogICAgICAgICAgICAgICAgcGF5cm9sbC1kZXBhcnRtZW50IHJvbGUuCi0gKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgPHJvbGUtbmFtZT5wYXlyb2xsPC9yb2xlLW5hbWU+Ci0gKiAgICAgICAgICAgICA8cm9sZS1saW5rPnBheXJvbGwtZGVwYXJ0bWVudDwvcm9sZS1saW5rPgotICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgIC4uLgotICogICAgICAgPC9lbnRpdHk+Ci0gKiAgICAgICAuLi4KLSAqICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAqICAgIC4uLgotICovCi1wdWJsaWMgY2xhc3MgRUpCSmFyMTFWUnVsZSBleHRlbmRzIEFWYWxpZGF0aW9uUnVsZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgRHVwbGljYXRlc1RhYmxlIF9lamJOYW1lID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VKQkpBUjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9FSkJFWFR9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxNCArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjUsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI2LCBuZXcgU3RyaW5nW117Q0hLSjI4MjYgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQyLCBuZXcgU3RyaW5nW117Q0hLSjI4NDIgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0MywgbmV3IFN0cmluZ1tde0NIS0oyODQzICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDQsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ1LCBuZXcgU3RyaW5nW117Q0hLSjI4NDUgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NiwgbmV3IFN0cmluZ1tde0NIS0oyODQ2ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDcsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NyArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTAsIG5ldyBTdHJpbmdbXXtDSEtKMjg1MCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODUyLCBuZXcgU3RyaW5nW117Q0hLSjI4NTJ9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NzUsIG5ldyBTdHJpbmdbXXtDSEtKMjg3NSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4OTUsIG5ldyBTdHJpbmdbXXtDSEtKMjg5NSArIFNQRUN9KTsKLQl9Ci0JCi0JcHVibGljIEVKQkphcjExVlJ1bGUoKSB7Ci0JCV9lamJOYW1lID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDE1LjMuMSBTZWN1cml0eSByb2xlcwotCSAqIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgY2FuIGRlZmluZSBvbmUgb3IgbW9yZSBzZWN1cml0eSByb2xlcyBpbiAKLQkgKiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIHRoZW4gYXNzaWducyAKLQkgKiBncm91cHMgb2YgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucycgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMKLQkgKiB0byB0aGUgc2VjdXJpdHkgcm9sZXMgdG8gZGVmaW5lIHRoZSBzZWN1cml0eSB2aWV3IG9mIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBCZWNhdXNlIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgZG9lcyBub3QsIGluIGdlbmVyYWwsIGtub3cgdGhlIAotCSAqIHNlY3VyaXR5IGVudmlyb25tZW50IG9mIHRoZSBvcGVyYXRpb25hbCBlbnZpcm9ubWVudCwgdGhlIHNlY3VyaXR5IAotCSAqIHJvbGVzIGFyZSBtZWFudCB0byBiZSBsb2dpY2FsIHJvbGVzIChvciBhY3RvcnMpLCBlYWNoIHJlcHJlc2VudGluZyAKLQkgKiBhIHR5cGUgb2YgdXNlciB0aGF0IHNob3VsZCBoYXZlIHRoZSBzYW1lIGFjY2VzcyByaWdodHMgdG8gdGhlIAotCSAqIGFwcGxpY2F0aW9uLiBUaGUgRGVwbG95ZXIgdGhlbiBhc3NpZ25zIHVzZXIgZ3JvdXBzIGFuZC9vciB1c2VyIAotCSAqIGFjY291bnRzIGRlZmluZWQgaW4gdGhlIG9wZXJhdGlvbmFsIGVudmlyb25tZW50IHRvIHRoZSBzZWN1cml0eSByb2xlcyAKLQkgKiBkZWZpbmVkIGJ5IHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIuCi0JICogICAgRGVmaW5pbmcgdGhlIHNlY3VyaXR5IHJvbGVzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgWzE3XQotCSAqIGZvciB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyLiAgVGhlaXIgb21pc3Npb24gaW4gdGhlIGRlcGxveW1lbnQgCi0JICogZGVzY3JpcHRvciBtZWFucyB0aGF0IHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgY2hvc2Ugbm90IHRvIHBhc3MgYW55IAotCSAqIHNlY3VyaXR5IGRlcGxveW1lbnQgcmVsYXRlZCBpbnN0cnVjdGlvbnMgdG8gdGhlIERlcGxveWVyIGluIHRoZSAKLQkgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgaXMgcmVzcG9uc2libGUgZm9yIAotCSAqIHRoZSBmb2xsb3dpbmc6Ci0JICogICAgLSBEZWZpbmUgZWFjaCBzZWN1cml0eSByb2xlIHVzaW5nIGEgc2VjdXJpdHktcm9sZSBlbGVtZW50LgotCSAqICAgIC0gVXNlIHRoZSByb2xlLW5hbWUgZWxlbWVudCB0byBkZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHJvbGUuCi0JICogICAgLSBPcHRpb25hbGx5LCB1c2UgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8gcHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIAotCSAqICAgICAgYSBzZWN1cml0eSByb2xlLgotCSAqIFRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGJ5IHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIGFyZSBzY29wZWQgdG8gCi0JICogdGhlIGVqYi1qYXIgZmlsZSBsZXZlbCwgYW5kIGFwcGx5IHRvIGFsbCB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgCi0JICogZWpiLWphciBmaWxlLgotCSAqIFsxN10gSWYgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBkb2VzIG5vdCBkZWZpbmUgc2VjdXJpdHkgcm9sZXMgaW4gdGhlIAotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdGhlIERlcGxveWVyIHdpbGwgaGF2ZSB0byBkZWZpbmUgc2VjdXJpdHkKLQkgKiByb2xlcyBhdCBkZXBsb3ltZW50IHRpbWUuCi0JICouLi4KLQkqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXNzZW1ibHlEZXNjcmlwdG9yRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBWYWxpZGF0ZSB0aGUgc2VjdXJpdHkgcm9sZXMsIGlmIHRoZXkncmUgZGVmaW5lZCBpbiB0aGUgYXNzZW1ibHktZGVzY3JpcHRvci4KLQkJaWYgKGVqYkphciA9PSBudWxsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHZhbGlkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKioKLQkJICogTmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZHVwbGljYXRlIHJvbGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIFNlY3VyaXR5Um9sZSBpbnN0YW5jZS4KLQkJICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JCSAqCi0JCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIFNlY3VyaXR5Um9sIGluc3RhbmNlIHNvIHRoYXQgdGhlIHdyYXBwZXIncwotCQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCQkgKi8KLQkJY2xhc3MgUm9sZVdyYXBwZXIgewotCQkJcHJpdmF0ZSBTZWN1cml0eVJvbGUgX3JvbGUgPSBudWxsOwotCi0JCQlwdWJsaWMgUm9sZVdyYXBwZXIoU2VjdXJpdHlSb2xlIHJvbGUpIHsKLQkJCQlfcm9sZSA9IHJvbGU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJCWlmIChvIGluc3RhbmNlb2YgUm9sZVdyYXBwZXIpIHsKLQkJCQkJUm9sZVdyYXBwZXIgb3RoZXIgPSAoUm9sZVdyYXBwZXIpIG87Ci0JCQkJCXJldHVybiBfcm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscyhvdGhlci5nZXRSb2xlKCkuZ2V0Um9sZU5hbWUoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFNlY3VyaXR5Um9sZSBnZXRSb2xlKCkgewotCQkJCXJldHVybiBfcm9sZTsKLQkJCX0KLQkJfQotCi0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBlamJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWlmIChhc3NlbWJseURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJLy8gbm90aGluZyB0byB2YWxpZGF0ZQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCByb2xlcyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCWlmIChyb2xlcyAhPSBudWxsKSB7Ci0JCQlEdXBsaWNhdGVzVGFibGUgcm9sZU5hbWVzID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQkJU2VjdXJpdHlSb2xlIHJvbGUgPSBudWxsOwotCQkJSXRlcmF0b3Igcm9sZUl0ID0gcm9sZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChyb2xlSXQuaGFzTmV4dCgpKSB7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCQkvLyBDaGVjayB0aGF0IHRoZSByb2xlLW5hbWUgZWxlbWVudCBoYXMgYmVlbiBzZXQKLQkJCQlyb2xlID0gKFNlY3VyaXR5Um9sZSkgcm9sZUl0Lm5leHQoKTsKLQkJCQlpZiAocm9sZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHJvbGUtbmFtZSBub3Qgc2V0Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlamJKYXIsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIGlmICgoIXJvbGUuZUlzU2V0KENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpKSkgfHwgKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJvbGUtbmFtZSBub3Qgc2V0Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByb2xlLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIEJ1aWxkIHVwIGhhc2h0YWJsZSB0byBjaGVjayBmb3IgZHVwbGljYXRlIHJvbGUtbmFtZXMuCi0JCQkJCXJvbGVOYW1lcy5hZGQobmV3IFJvbGVXcmFwcGVyKHJvbGUpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSByb2xlLW5hbWVzLiAoMTUuMy4xKQotCQkJaWYgKHJvbGVOYW1lcy5jb250YWluc0R1cGxpY2F0ZXMoKSkgewotCQkJCUxpc3QgZHVwbGljYXRlcyA9IHJvbGVOYW1lcy5nZXREdXBsaWNhdGVzKCk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkdXBsaWNhdGVzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgKChSb2xlV3JhcHBlcikgaXRlcmF0b3IubmV4dCgpKS5nZXRSb2xlKCksIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCXJvbGVOYW1lcy5jbGVhcigpOwotCQl9Ci0KLQkJTGlzdCBtZXRoVHJhbnMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0JCU1ldGhvZFRyYW5zYWN0aW9uIG10ID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtZXRoVHJhbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJdHJ5IHsKLQkJCQltdCA9IChNZXRob2RUcmFuc2FjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVSLCBleGMpOwotCQkJCX0KLQkJCQltdCA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChtdCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJERFZhbGlkYXRvci52YWxpZGF0ZUFzc2VtYmx5RGVzY3JpcHRvckVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJtdCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYm9vbGVhbiBoYXNWYWxpZE1ldGhvZCA9IHZhbGlkYXRlTWV0aG9kRWxlbWVudHModmMsIGVqYkphciwgbXQuZ2V0TWV0aG9kRWxlbWVudHMoKSk7Ci0JCQlpZiAoIWhhc1ZhbGlkTWV0aG9kKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIG10LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJTGlzdCBtZXRob2RQZXJtaXNzaW9ucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RQZXJtaXNzaW9ucygpOwotCQlpdGVyYXRvciA9IG1ldGhvZFBlcm1pc3Npb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1ldGhvZFBlcm1pc3Npb24gbXAgPSAoTWV0aG9kUGVybWlzc2lvbikgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlib29sZWFuIGhhc1ZhbGlkTWV0aG9kID0gdmFsaWRhdGVNZXRob2RFbGVtZW50cyh2YywgZWpiSmFyLCBtcC5nZXRNZXRob2RFbGVtZW50cygpKTsKLQkJCWlmICghaGFzVmFsaWRNZXRob2QpIHsKLQkJCQkvLyAxNS4zLjIsIHAuIDIyOSwgYSA8bWV0aG9kLXBlcm1pc3Npb24+IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbWV0aG9kIGxpc3RlZCAoYW5kIHRoYXQgbWV0aG9kIG11c3QgYmUgZm91bmQpCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIG1wLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQkvLyBhdCBsZWFzdCBvbmUgc2VjdXJpdHktcm9sZSBtdXN0IGJlIGRlZmluZWQKLQkJCUxpc3QgbXByb2xlcyA9IG1wLmdldFJvbGVzKCk7Ci0JCQlpZiAoKG1wcm9sZXMgPT0gbnVsbCkgfHwgKG1wcm9sZXMuc2l6ZSgpID09IDApKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIG1wLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvciBpcyBjYWxsZWQgaWYgdGhlIEVKQkphciBjb3VsZCBsb2FkLCB3aGljaCBtZWFucwotCSAqIHRoYXQgdGhlIHN5bnRheCBvZiB0aGUgSkFSIGlzIChtb3N0bHkpIGNvcnJlY3QuCi0JICoKLQkgKiBFSkIgc3BlYyAxLjEsIHNlY3Rpb24gQy40LCAiQWRkZWQgdGhlIHJlcXVpcmVtZW50IGZvciB0aGUgQmVhbiBQcm92aWRlciB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlCi0JICogZW50ZXJwcmlzZSBiZWFuIHVzZXMgYSBiZWFuLW1hbmFnZWQgb3IgY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24uIgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcikgdGFyZ2V0OwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbnRlcnByaXNlQmVhbnMuaXRlcmF0b3IoKTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JCVN0cmluZyBiZWFuTmFtZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRyeSB7Ci0JCQkJYmVhbiA9IChFbnRlcnByaXNlQmVhbikgaXRlcmF0b3IubmV4dCgpOwotCQkJCXJlZ2lzdGVyKHZjLCBlamJKYXIsIGJlYW4pOwotCi0JCQkJT2JqZWN0IGlkID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9FTlRFUlBSSVNFQkVBTjsKLQkJCQlJVmFsaWRhdGlvblJ1bGUgdlJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQlpZiAodlJ1bGUgPT0gbnVsbCkgewotCQkJCQkvLyBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGJ5IHRoZSBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSwgc28ganVzdAotCQkJCQkvLyBuZWVkIHRvIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0aGUgdGFzayBsaXN0LgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJdlJ1bGUucHJlVmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJCXZSdWxlLnZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCQkJCQl2UnVsZS5wb3N0VmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJfQotCQkJCWNhdGNoIChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGV4YykgewotCQkJCQkvLyBDbGVhbiB1cCB0aGUgbWVzc2FnZXMgd2hpY2ggYXJlIG9uIHRoZSB0YXNrIGxpc3Q/IE9yIGlzIGl0IG5pY2VyIHRvIGxlYXZlIHRoZW0gYmVoaW5kPwotCQkJCX0KLQkJCQljYXRjaChNZXNzYWdlTGltaXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCXRocm93IGV4YzsKLQkJCQl9Ci0JCQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKHZjLCBleGMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5yZWxlYXNlKHZSdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCWNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQkvLyBJZiB0aGVyZSdzIGEgcHJvYmxlbSwgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4uCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIGJlYW5OYW1lIH0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFNpbmNlIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yIGlzIG5vdCBzcGVjaWZpYyB0byBhIGJlYW4sIHZhbGlkYXRlIGl0IG9uY2UsIGFmdGVyIGFsbCBiZWFuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCi0JCXZhbGlkYXRlQXNzZW1ibHlEZXNjcmlwdG9yRWxlbWVudCh2YywgZWpiSmFyKTsKLQkJdmFsaWRhdGVVbmlxdWVFamJOYW1lcyh2YywgZWpiSmFyKTsKLQkJdmFsaWRhdGVDbGllbnRKQVIodmMsIGVqYkphcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQlfZWpiTmFtZS5jbGVhcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gVG8gY2hlY2sgaWYgZXZlcnkgYmVhbiBuYW1lIGlzIHVuaXF1ZSwgbmVlZCB0byBidWlsZCBhIGxpc3QKLQkJX2VqYk5hbWUuYWRkKG5ldyBFamJOYW1lV3JhcHBlcihiZWFuKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEludGVybmFsRXJyb3JNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgVGhyb3dhYmxlIGV4YykgewotCQlJTWVzc2FnZSBtc3NnID0gdmMuZ2V0TWVzc2FnZSgpOwotCQltc3NnLnNldElkKElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTAwKTsKLQkJdmMuYWRkTWVzc2FnZShtc3NnKTsKLQotCQlpZihleGMgIT0gbnVsbCkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVVuaXF1ZUVqYk5hbWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlMaXN0IG5hbWVzID0gX2VqYk5hbWUuZ2V0RHVwbGljYXRlcygpOwotCQlpZihuYW1lcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRWpiTmFtZVdyYXBwZXIgd3JhcHBlciA9IChFamJOYW1lV3JhcHBlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODk1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgd3JhcHBlci5nZXRCZWFuKCksIG5ldyBTdHJpbmdbXXt3cmFwcGVyLmdldEJlYW4oKS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNsaWVudEpBUihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJU3RyaW5nIGNsaWVudEpBUk5hbWUgPSBlamJKYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCWlmKGNsaWVudEpBUk5hbWUgPT0gbnVsbCkgewotCQkJLy8gTm8gY2xpZW50IEpBUiBzcGVjaWZpZWQ7IGV2ZXJ5dGhpbmcncyBva2F5LgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlCb29sZWFuIGV4aXN0cyA9IChCb29sZWFuKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX0NMSUVOVEpBUiwgbmV3IE9iamVjdFtde2NsaWVudEpBUk5hbWV9KTsKLQkJaWYoZXhpc3RzID09IG51bGwpIHsKLQkJCS8vIEhlbHBlciBkb2Vzbid0IHN1cHBvcnQgbG9hZCBtb2RlbC4gV0FTPwotCQkJLy8gQ2FuJ3QgcGVyZm9ybSB0aGlzIGNoZWNrLCBzbyBqdXN0IHJldHVybi4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIWV4aXN0cy5ib29sZWFuVmFsdWUoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg3NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBlamJKYXIsIG5ldyBTdHJpbmdbXXtjbGllbnRKQVJOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQm90aCBzZWN0aW9uIDExLjQuMSBhbmQgMTUuMy4yIG5lZWQgdGhlIDxtZXRob2Q+IGVsZW1lbnQuIEFsc28gcmVmZXIKLQkgKiB0byAxNi41IGZvciBzeW50YXguCi0JICoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIG1ldGhvZHMgcmVmZXJlbmNlZCBieSB0aGlzIGxpc3Qgb2YgCi0JICogTWV0aG9kRWxlbWVudCBjYW4gYmUgZm91bmQuCi0JKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgTGlzdCBlbGVtZW50cykgewotCQlpZiAoKGVsZW1lbnRzID09IG51bGwpIHx8IChlbGVtZW50cy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IGVsZW1lbnQuZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLQkJCWlmIChiZWFuID09IG51bGwpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkvLyBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIG1ldGhvZHMgb24gdGhlIGhvbWUgb3IgcmVtb3RlIGludGVyZmFjZSBpZiB0aGVyZScKLQkJCQkvLyBiZWVuIGEgcHJvYmxlbSBsb2NhdGluZyBvciByZWZsZWN0aW5nIHRob3NlIHR5cGVzCi0JCQkJYm9vbGVhbiByZWZsZWN0ZWQgPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQlyZWZsZWN0ZWQgPSBmYWxzZTsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IChlLmdldEphdmFDbGFzcygpID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX0hPTUUgOiBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgY2xhc3NOYW1lIH07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJcmVmbGVjdGVkID0gZmFsc2U7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9SRU1PVEUgOiBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgY2xhc3NOYW1lIH07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYocmVmbGVjdGVkKSB7Ci0JCQkJCS8vIFRoZSAiZWxlbWVudC5nZXRNZXRob2RzKCkiIGhhcyBhIG51bGwgcG9pbnRlciBleGNlcHRpb24gd2hlbiBpdCBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGUgbWV0aG9kcyBmcm9tIHRoZSBob21lL3JlbW90ZSBpbnRlcmZhY2UsCi0JCQkJCS8vIGlmIGVpdGhlciBvZiB0aGUgaW50ZXJmYWNlcyBkb24ndCBleGlzdC4KLQkJCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQotCQkJCQlNZXRob2RbXSBtZXRob2RzID0gZWxlbWVudC5nZXRNZXRob2RzKCk7IC8vIGdldCBhbGwgbWV0aG9kcyB3aGljaCB3aWxsIGJlIHJldHJpZXZlZCBmb3IgdGhlIGdpdmVuIG1ldGhvZC1wZXJtaXNzaW9uCi0JCQkJCWJvb2xlYW4gaGFzTWV0aG9kcyA9ICgobWV0aG9kcyAhPSBudWxsKSAmJiAobWV0aG9kcy5sZW5ndGggPiAwKSk7Ci0KLQkJCQkJaWYgKCFoYXNNZXRob2RzKSB7Ci0JCQkJCQkvLyB3YXJuaW5nCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQloYXNWYWxpZE1ldGhvZCA9IHRydWU7IC8vIGEgPG1ldGhvZC1wZXJtaXNzaW9uPiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1ldGhvZCAoMTUuMy4yLCBwLjIyOSkKLQkJCQkJCWlmIChuYW1lLmVxdWFscygiKiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlMaXN0IHBhcmFtcyA9IGVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0JCQkJCQkJaWYgKChwYXJhbXMgIT0gbnVsbCkgJiYgKHBhcmFtcy5zaXplKCkgPiAwKSkgewotCQkJCQkJCQkvLyB3YXJuaW5nCi0JCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBlcnJvcgotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGhhc1ZhbGlkTWV0aG9kOwotCX0KLQkKLQkvKioKLQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgRUpCIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlLgotCSAqIChXaXRob3V0IHRoZSBpbnN0YW5jZSwgd2UgY2Fubm90IGdldCBsaW5lIG51bWJlcnMuKQotCSAqCi0JICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCSAqLwotCWNsYXNzIEVqYk5hbWVXcmFwcGVyIHsKLQkJcHJpdmF0ZSBFbnRlcnByaXNlQmVhbiBfYmVhbiA9IG51bGw7Ci0KLQkJcHVibGljIEVqYk5hbWVXcmFwcGVyKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCV9iZWFuID0gYmVhbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBFamJOYW1lV3JhcHBlcikgewotCQkJCUVqYk5hbWVXcmFwcGVyIG90aGVyID0gKEVqYk5hbWVXcmFwcGVyKW87Ci0JCQkJaWYoKF9iZWFuLmdldE5hbWUoKSA9PSBudWxsKSAmJiAob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihfYmVhbi5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIF9iZWFuLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZigoZ2V0QmVhbigpICE9IG51bGwpICYmIChnZXRCZWFuKCkuZ2V0TmFtZSgpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGdldEJlYW4oKS5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGVycHJpc2VCZWFuIGdldEJlYW4oKSB7Ci0JCQlyZXR1cm4gX2JlYW47Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMjBWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjIwVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlMzI0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMjBWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJKYXIyMFZSdWxlIGV4dGVuZHMgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCXByaXZhdGUgRHVwbGljYXRlc1RhYmxlIF9lamJOYW1lID0gbnVsbDsKLQlwcml2YXRlIER1cGxpY2F0ZXNUYWJsZSBfYXNOYW1lID0gbnVsbDsKLQlwcml2YXRlIER1cGxpY2F0ZXNUYWJsZSBfcmVsYXRpb25zaGlwTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBEdXBsaWNhdGVzVGFibGUgX3JlbGF0aW9uc2hpcFJvbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfTUVTU0FHRV9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCRVhUfTsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDBfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMF9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMF9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDBfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMl9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAyX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAyX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMl9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAzX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDNfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDNfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAzX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDRfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNF9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNF9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDRfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNV9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA1X05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA1X1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNV9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA2LCBuZXcgU3RyaW5nW117Q0hLSjI4MDYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwOCwgbmV3IFN0cmluZ1tde0NIS0oyODA4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA5LCBuZXcgU3RyaW5nW117Q0hLSjI4MDkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTBfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMF9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMF9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTBfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMV9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODExX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODE0LCBuZXcgU3RyaW5nW117Q0hLSjI4MTQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjgxNitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxNywgbmV3IFN0cmluZ1tde0NIS0oyODE3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODE4LCBuZXcgU3RyaW5nW117Q0hLSjI4MTgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjAsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMSwgbmV3IFN0cmluZ1tde0NIS0oyODIxK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIyLCBuZXcgU3RyaW5nW117Q0hLSjI4MjIrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNCwgbmV3IFN0cmluZ1tde0NIS0oyODI0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI1LCBuZXcgU3RyaW5nW117Q0hLSjI4MjUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjYsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNywgbmV3IFN0cmluZ1tde0NIS0oyODI3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI4LCBuZXcgU3RyaW5nW117Q0hLSjI4MjgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjksIG5ldyBTdHJpbmdbXXtDSEtKMjgyOStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMCwgbmV3IFN0cmluZ1tde0NIS0oyODMwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMxLCBuZXcgU3RyaW5nW117Q0hLSjI4MzErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzIsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMywgbmV3IFN0cmluZ1tde0NIS0oyODMzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM0LCBuZXcgU3RyaW5nW117Q0hLSjI4MzQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzUsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNiwgbmV3IFN0cmluZ1tde0NIS0oyODM2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM3LCBuZXcgU3RyaW5nW117Q0hLSjI4MzcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzgsIG5ldyBTdHJpbmdbXXtDSEtKMjgzOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzOSwgbmV3IFN0cmluZ1tde0NIS0oyODM5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQxLCBuZXcgU3RyaW5nW117Q0hLSjI4NDErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDIsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0MywgbmV3IFN0cmluZ1tde0NIS0oyODQzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ0LCBuZXcgU3RyaW5nW117Q0hLSjI4NDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDUsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NiwgbmV3IFN0cmluZ1tde0NIS0oyODQ2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ3LCBuZXcgU3RyaW5nW117Q0hLSjI4NDcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDgsIG5ldyBTdHJpbmdbXXtDSEtKMjg0OCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1MCwgbmV3IFN0cmluZ1tde0NIS0oyODUwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU0LCBuZXcgU3RyaW5nW117Q0hLSjI4NTQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTUsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NiwgbmV3IFN0cmluZ1tde0NIS0oyODU2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU3LCBuZXcgU3RyaW5nW117Q0hLSjI4NTcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTgsIG5ldyBTdHJpbmdbXXtDSEtKMjg1OCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1OSwgbmV3IFN0cmluZ1tde0NIS0oyODU5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODYwLCBuZXcgU3RyaW5nW117Q0hLSjI4NjArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjg2NitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg2NywgbmV3IFN0cmluZ1tde0NIS0oyODY3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODY4LCBuZXcgU3RyaW5nW117Q0hLSjI4NjgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NjksIG5ldyBTdHJpbmdbXXtDSEtKMjg2OStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg3MSwgbmV3IFN0cmluZ1tde0NIS0oyODcxK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODcyLCBuZXcgU3RyaW5nW117Q0hLSjI4NzIrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NzMsIG5ldyBTdHJpbmdbXXtDSEtKMjg3MytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg3NCwgbmV3IFN0cmluZ1tde0NIS0oyODc0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODc1LCBuZXcgU3RyaW5nW117Q0hLSjI4NzUgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg5NSwgbmV3IFN0cmluZ1tde0NIS0oyODk1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODUyLCBuZXcgU3RyaW5nW117Q0hLSjI4NTJ9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIEVKQkphcjIwVlJ1bGUoKSB7Ci0JCV9lamJOYW1lID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQlfYXNOYW1lID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQlfcmVsYXRpb25zaGlwTmFtZSA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQkJX3JlbGF0aW9uc2hpcFJvbGVOYW1lID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQkvLyBFSkJKYXIgZG9lc24ndCBkZXBlbmQgb24gYW55dGhpbmcgZWxzZQotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJKQVI7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCS8vIFNpbmNlIHRoaXMgcnVsZSBkb2Vzbid0IGRlcGVuZCBvbiBhbm90aGVyIHJ1bGUsIHRoaXMKLQkJLy8gbWV0aG9kICh3aGljaCBpcyBjYWxsZWQgb24gYSBkZXBlbmRlbnQgcnVsZSkgd2lsbCBuZXZlcgotCQkvLyBiZSBjYWxsZWQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQlfZWpiTmFtZS5jbGVhcigpOwotCQlfYXNOYW1lLmNsZWFyKCk7Ci0JCV9yZWxhdGlvbnNoaXBOYW1lLmNsZWFyKCk7Ci0JCV9yZWxhdGlvbnNoaXBSb2xlTmFtZS5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEludGVybmFsRXJyb3JNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgVGhyb3dhYmxlIGV4YykgewotCQlJTWVzc2FnZSBtc3NnID0gdmMuZ2V0TWVzc2FnZSgpOwotCQltc3NnLnNldElkKElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTAwKTsKLQkJdmMuYWRkTWVzc2FnZShtc3NnKTsKLQotCQlpZihleGMgIT0gbnVsbCkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2dNaXNzaW5nUnVsZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBydWxlSWQpIHsKLQkJbG9nKHZjLCBydWxlSWQgKyAiID0gbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKHZjLCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkJKYXIyMFZSdWxlIC0gdmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGV4dChnZXRDbGFzcygpLmdldE5hbWUoKSArICI6OnZhbGlkYXRlKCIgKyB0YXJnZXRQYXJlbnQgKyAiLCAiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCX0KLQkJCi0JCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKSB0YXJnZXQ7Ci0JCUxpc3QgYmVhbnMgPSBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYmVhbnMuaXRlcmF0b3IoKTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRyeSB7Ci0JCQkJYmVhbiA9IChFbnRlcnByaXNlQmVhbikgaXRlcmF0b3IubmV4dCgpOwotCi0JCQkJcmVnaXN0ZXIodmMsIGVqYkphciwgYmVhbik7Ci0JCi0JCQkJT2JqZWN0IGlkID0gbnVsbDsJCQkKLQkJCQlzd2l0Y2goYmVhbi5nZXRWZXJzaW9uSUQoKSkgewotCQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ6Ci0JCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDoKLQkJCQkJCWlkID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9FTlRFUlBSSVNFQkVBTjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDogCi0JCQkJCQlpZCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRU5URVJQUklTRUJFQU47Ci0JCQkJCQlicmVhazsgCi0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQkvLyBXaGF0IHZlcnNpb24gaXMgaXQgdGhlbj8KLQkJCQkJCWlmKGJlYW4gaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KSB7Ci0JCQkJCQkJdmFsaWRhdGVDTVBWZXJzaW9uRWxlbWVudCh2YywgZWpiSmFyLCAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGxvZwotCQkJCQkJCWxvZyh2YywgIiFiZWFuLmlzVmVyc2lvbjFfWCgpICYmICFiZWFuLmlzVmVyc2lvbjJfWCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0JCQkJIAotCQkJCQotCQkJCUlWYWxpZGF0aW9uUnVsZSB2UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCWlmKHZSdWxlID09IG51bGwpIHsKLQkJCQkJbG9nTWlzc2luZ1J1bGUodmMsIGlkKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCXZSdWxlLnByZVZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCQkJCQl2UnVsZS52YWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCQkJdlJ1bGUucG9zdFZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCQkJCX0KLQkJCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGV4YykgewotCQkJCQkvLyBDbGVhbiB1cCB0aGUgbWVzc2FnZXMgd2hpY2ggYXJlIG9uIHRoZSB0YXNrIGxpc3Q/IE9yIGlzIGl0IG5pY2VyIHRvIGxlYXZlIHRoZW0gYmVoaW5kPwotCQkJCQl0aHJvdyBleGM7Ci0JCQkJfQotCQkJCWNhdGNoKE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKHZjLCBleGMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5yZWxlYXNlKHZSdWxlKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQljYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gc29tZXRoaW5nIGdvZXMgd3JvbmcsIGp1c3QgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIGJlYW4uZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgYmVhbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFNpbmNlIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yIGlzIG5vdCBzcGVjaWZpYyB0byBhIGJlYW4sIHZhbGlkYXRlIGl0IG9uY2UsIGFmdGVyIGFsbCBiZWFuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCi0JCXZhbGlkYXRlQXNzZW1ibHlEZXNjcmlwdG9yRWxlbWVudCh2YywgZWpiSmFyKTsKLQkJLy9UT0RPIFRoZSBEYXRhc291cmNlIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGJ5IHRoZSBleHRlbnNpb25zCi0JCXZhbGlkYXRlVW5pcXVlRWpiTmFtZXModmMsIGVqYkphcik7Ci0JCXZhbGlkYXRlVW5pcXVlQWJzdHJhY3RTY2hlbWFOYW1lcyh2YywgZWpiSmFyKTsKLQkJdmFsaWRhdGVSZWxhdGlvbnNoaXBzKHZjLCBlamJKYXIpOwotCQl2YWxpZGF0ZUNsaWVudEpBUih2YywgZWpiSmFyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIFRvIGNoZWNrIGlmIGV2ZXJ5IGJlYW4gbmFtZSBpcyB1bmlxdWUsIG5lZWQgdG8gYnVpbGQgYSBsaXN0Ci0JCV9lamJOYW1lLmFkZChuZXcgRWpiTmFtZVdyYXBwZXIoYmVhbikpOwotCQkKLQkJaWYoKGJlYW4gaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KSAmJiBiZWFuLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsKLQkJCS8vIFRvIGNoZWNrIGlmIGV2ZXJ5IGJlYW4gbmFtZSBpcyB1bmlxdWUsIG5lZWQgdG8gYnVpbGQgYSBsaXN0Ci0JCQlfYXNOYW1lLmFkZChuZXcgQVNOYW1lV3JhcHBlcigoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNNUFZlcnNpb25FbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYoY21wLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKSkpIHsKLQkJCVN0cmluZyB2ZXJzaW9uID0gY21wLmdldFZlcnNpb24oKTsKLQkJCWlmKCEgKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1guZXF1YWxzKHZlcnNpb24pIHx8IENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1guZXF1YWxzKHZlcnNpb24pKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg3MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBjbXAsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JCQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFZhbGlkYXRlIHRoZSBzZWN1cml0eSByb2xlcywgaWYgdGhleSdyZSBkZWZpbmVkIGluIHRoZSBhc3NlbWJseS1kZXNjcmlwdG9yLgotCQlpZiAoZWpiSmFyID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gdmFsaWRhdGUKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qKgotCQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcm9sZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkJICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgU2VjdXJpdHlSb2xlIGluc3RhbmNlLgotCQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkJICoKLQkJICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgU2VjdXJpdHlSb2wgaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JCSAqLwotCQljbGFzcyBSb2xlV3JhcHBlciB7Ci0JCQlwcml2YXRlIFNlY3VyaXR5Um9sZSBfcm9sZSA9IG51bGw7Ci0KLQkJCXB1YmxpYyBSb2xlV3JhcHBlcihTZWN1cml0eVJvbGUgcm9sZSkgewotCQkJCV9yb2xlID0gcm9sZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSb2xlV3JhcHBlcikgewotCQkJCQlSb2xlV3JhcHBlciBvdGhlciA9IChSb2xlV3JhcHBlcikgbzsKLQkJCQkJcmV0dXJuIF9yb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKG90aGVyLmdldFJvbGUoKS5nZXRSb2xlTmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU2VjdXJpdHlSb2xlIGdldFJvbGUoKSB7Ci0JCQkJcmV0dXJuIF9yb2xlOwotCQkJfQotCQl9Ci0KLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJaWYgKGFzc2VtYmx5RGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHZhbGlkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHJvbGVzID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJaWYgKHJvbGVzICE9IG51bGwpIHsKLQkJCUR1cGxpY2F0ZXNUYWJsZSByb2xlTmFtZXMgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCQlTZWN1cml0eVJvbGUgcm9sZSA9IG51bGw7Ci0JCQlJdGVyYXRvciByb2xlSXQgPSByb2xlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHJvbGVJdC5oYXNOZXh0KCkpIHsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJCS8vIENoZWNrIHRoYXQgdGhlIHJvbGUtbmFtZSBlbGVtZW50IGhhcyBiZWVuIHNldAotCQkJCXJvbGUgPSAoU2VjdXJpdHlSb2xlKSByb2xlSXQubmV4dCgpOwotCQkJCWlmICgocm9sZSA9PSBudWxsKSB8fCAoIXJvbGUuZUlzU2V0KENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpKSkgfHwgKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJvbGUtbmFtZSBub3Qgc2V0Ci0JCQkJCWlmKHJvbGUgPT0gbnVsbCkgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJvbGUsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBhc3NlbWJseURlc2NyaXB0b3IsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQnVpbGQgdXAgaGFzaHRhYmxlIHRvIGNoZWNrIGZvciBkdXBsaWNhdGUgcm9sZS1uYW1lcy4KLQkJCQkJcm9sZU5hbWVzLmFkZChuZXcgUm9sZVdyYXBwZXIocm9sZSkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlIHJvbGUtbmFtZXMuICgxNS4zLjEpCi0JCQlpZiAocm9sZU5hbWVzLmNvbnRhaW5zRHVwbGljYXRlcygpKSB7Ci0JCQkJTGlzdCBkdXBsaWNhdGVzID0gcm9sZU5hbWVzLmdldER1cGxpY2F0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGR1cGxpY2F0ZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCAoKFJvbGVXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCkpLmdldFJvbGUoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJcm9sZU5hbWVzLmNsZWFyKCk7Ci0JCX0KLQotCQlMaXN0IG1ldGhUcmFucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQkJTWV0aG9kVHJhbnNhY3Rpb24gbXQgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1ldGhUcmFucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQl0cnkgewotCQkJCW10ID0gKE1ldGhvZFRyYW5zYWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQkJfQotCQkJCW10ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKG10ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQkphcjIwVlJ1bGUudmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgibXQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKHZjLCBlamJKYXIsIG10LmdldE1ldGhvZEVsZW1lbnRzKCkpOwotCQkJaWYgKCFoYXNWYWxpZE1ldGhvZCkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBtdCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgbWV0aG9kUGVybWlzc2lvbnMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLQkJaXRlcmF0b3IgPSBtZXRob2RQZXJtaXNzaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2RQZXJtaXNzaW9uIG1wID0gKE1ldGhvZFBlcm1pc3Npb24pIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJYm9vbGVhbiBoYXNWYWxpZE1ldGhvZCA9IHZhbGlkYXRlTWV0aG9kRWxlbWVudHModmMsIGVqYkphciwgbXAuZ2V0TWV0aG9kRWxlbWVudHMoKSk7Ci0JCQlpZiAoIWhhc1ZhbGlkTWV0aG9kKSB7Ci0JCQkJLy8gMTUuMy4yLCBwLiAyMjksIGEgPG1ldGhvZC1wZXJtaXNzaW9uPiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1ldGhvZCBsaXN0ZWQgKGFuZCB0aGF0IG1ldGhvZCBtdXN0IGJlIGZvdW5kKQotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBtcCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQotCQkJLy8gYXQgbGVhc3Qgb25lIHNlY3VyaXR5LXJvbGUgbXVzdCBiZSBkZWZpbmVkCi0JCQlMaXN0IG1wcm9sZXMgPSBtcC5nZXRSb2xlcygpOwotCQkJaWYgKCgobXByb2xlcyA9PSBudWxsKSB8fCAobXByb2xlcy5zaXplKCkgPT0gMCkpICYmICghbXAuaXNTZXRVbmNoZWNrZWQoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXAsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVVuaXF1ZUFic3RyYWN0U2NoZW1hTmFtZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCUxpc3QgbmFtZXMgPSBfYXNOYW1lLmdldER1cGxpY2F0ZXMoKTsKLQkJaWYobmFtZXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUFTTmFtZVdyYXBwZXIgd3JhcHBlciA9IChBU05hbWVXcmFwcGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg1NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCB3cmFwcGVyLmdldEJlYW4oKSwgbmV3IFN0cmluZ1tde3dyYXBwZXIuZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVW5pcXVlRWpiTmFtZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCUxpc3QgbmFtZXMgPSBfZWpiTmFtZS5nZXREdXBsaWNhdGVzKCk7Ci0JCWlmKG5hbWVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFamJOYW1lV3JhcHBlciB3cmFwcGVyID0gKEVqYk5hbWVXcmFwcGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4OTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCB3cmFwcGVyLmdldEJlYW4oKSwgbmV3IFN0cmluZ1tde3dyYXBwZXIuZ2V0QmVhbigpLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVsYXRpb25zaGlwcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJUmVsYXRpb25zaGlwcyByZWxhdGlvbnNoaXBzID0gZWpiSmFyLmdldFJlbGF0aW9uc2hpcExpc3QoKTsKLQkJaWYocmVsYXRpb25zaGlwcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgZWpiUmVsYXRpb25MaXN0ID0gcmVsYXRpb25zaGlwcy5nZXRFamJSZWxhdGlvbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJSZWxhdGlvbkxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFSkJSZWxhdGlvbiByZWxhdGlvbiA9IChFSkJSZWxhdGlvbilpdGVyYXRvci5uZXh0KCk7Ci0JCQkKLQkJCV9yZWxhdGlvbnNoaXBOYW1lLmFkZChuZXcgRUpCUmVsYXRpb25OYW1lV3JhcHBlcihyZWxhdGlvbikpOwotCQkJCi0JCQlib29sZWFuIGF0TGVhc3RPbmVDbXJGaWVsZEV4aXN0cyA9IGZhbHNlOwotCQkJTGlzdCByb2xlcyA9IHJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JCQlJdGVyYXRvciByb2xlSXRlcmF0b3IgPSByb2xlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUocm9sZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IChFSkJSZWxhdGlvbnNoaXBSb2xlKXJvbGVJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJX3JlbGF0aW9uc2hpcFJvbGVOYW1lLmFkZChuZXcgRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyKHJvbGUpKTsKLQotCQkJCWJvb2xlYW4gdmFsaWRNdWx0aXBsaWNpdHkgPSByb2xlLmlzU2V0TXVsdGlwbGljaXR5KCk7Ci0JCQkJaWYoIXZhbGlkTXVsdGlwbGljaXR5KSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgxOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJvbGUsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkKLQkJCQkvLyAxMC4zLjQuMiAKLQkJCQkvLyBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCQkJCS8vIGVsZW1lbnQgY29udGFpbmVkIGluIGFuIGVqYi1yZWxhdGlvbiBlbGVtZW50IGlmIHRoZSAqb3RoZXIqIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCQkJCS8vIGVsZW1lbnQgaW4gdGhlIHNhbWUgZWpiLXJlbGF0aW9uIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLQkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlIG9wcG9zaXRlUm9sZSA9IHJvbGUuZ2V0T3Bwb3NpdGUoKTsKLQkJCQlpZihyb2xlLmlzU2V0Q2FzY2FkZURlbGV0ZSgpKSB7Ci0JCQkJCWJvb2xlYW4gaXNPdGhlck11bHRpcGxpY2l0eU9uZSA9ICgob3Bwb3NpdGVSb2xlLmlzU2V0TXVsdGlwbGljaXR5KCkpICYmIChvcHBvc2l0ZVJvbGUuZ2V0TXVsdGlwbGljaXR5KCkuZ2V0VmFsdWUoKSA9PSBNdWx0aXBsaWNpdHlLaW5kLk9ORSkpOwotCQkJCQlpZighaXNPdGhlck11bHRpcGxpY2l0eU9uZSkgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODQ4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCUNNUkZpZWxkIGNtckZpZWxkID0gcm9sZS5nZXRDbXJGaWVsZCgpOwotCQkJCWlmKGNtckZpZWxkICE9IG51bGwpIHsKLQkJCQkJYXRMZWFzdE9uZUNtckZpZWxkRXhpc3RzID0gdHJ1ZTsKLQkJCQkJaWYoY21yRmllbGQuZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENNUkZpZWxkX0NvbGxlY3Rpb25UeXBlKCkpKSB7Ci0JCQkJCQlTdHJpbmcgY21yRmllbGRUeXBlID0gY21yRmllbGQuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCk7Ci0JCQkJCQlpZigoIUlUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTi5lcXVhbHMoY21yRmllbGRUeXBlKSkgJiYKLQkJCQkJCQkoIUlUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfU0VULmVxdWFscyhjbXJGaWVsZFR5cGUpKSkgewotCQkJCQkJCS8vIENIS0oyODY4OiBUaGUgdmFsdWUgb2YgdGhlIDxjbXItZmllbGQtdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiamF2YS51dGlsLkNvbGxlY3Rpb24iIG9yICJqYXZhLnV0aWwuU2V0IiAoRUpCIDIuMDogMTAuMy4xMywgMjIuNSkuCi0JCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODY4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgdGhpcyk7Ci0JCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlSb2xlU291cmNlIHNvdXJjZVJvbGVTb3VyY2UgPSByb2xlLmdldFNvdXJjZSgpOwotCQkJCWlmKHNvdXJjZVJvbGVTb3VyY2UgPT0gbnVsbCkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MjEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByb2xlLCBuZXcgU3RyaW5nW117cm9sZS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJRW50aXR5IHNvdXJjZUVudGl0eSA9IHNvdXJjZVJvbGVTb3VyY2UuZ2V0RW50aXR5QmVhbigpOwotCQkJCWlmKHNvdXJjZUVudGl0eSA9PSBudWxsKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgyMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJvbGUsIG5ldyBTdHJpbmdbXXtyb2xlLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIGlmKHNvdXJjZUVudGl0eS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQkvLyBDSEtKMjg2NjogPGNtci1maWVsZD4gezB9IG11c3QgYmUgZGVmaW5lZCBvbiB7MX0gKEVKQiAyLjA6IDIyLjUpLgotCQkJCQlpZihjbXJGaWVsZCAhPSBudWxsKSB7Ci0JCQkJCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KXNvdXJjZUVudGl0eTsKLQkJCQkJCUxpc3QgY21yRmllbGRzID0gY21wLmdldENNUkZpZWxkcygpOwotCQkJCQkJYm9vbGVhbiBmb3VuZF9jbXJGaWVsZCA9IGZhbHNlOwotCQkJCQkJaWYoKGNtckZpZWxkcyAhPSBudWxsKSAmJiAoY21yRmllbGRzLnNpemUoKSA+IDApKSB7Ci0JCQkJCQkJZm91bmRfY21yRmllbGQgPSBjbXJGaWVsZHMuY29udGFpbnMoY21yRmllbGQpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZighZm91bmRfY21yRmllbGQpIHsKLQkJCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByb2xlLCBuZXcgU3RyaW5nW117Y21yRmllbGQuZ2V0TmFtZSgpLCBzb3VyY2VFbnRpdHkuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQ0hLSjI4NzE6IDxlamItbmFtZT4gezB9IG11c3QgcmVmZXIgdG8gYSBDTVAgYmVhbiAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzKS4KLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODcxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgbmV3IFN0cmluZ1tde3NvdXJjZUVudGl0eS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJUm9sZVNvdXJjZSBvcHBvc2l0ZVJvbGVTb3VyY2UgPSBvcHBvc2l0ZVJvbGUuZ2V0U291cmNlKCk7Ci0JCQkJaWYob3Bwb3NpdGVSb2xlU291cmNlID09IG51bGwpIHsKLQkJCQkJLy8gRG8gbm90IGVtaXQgYW4gZXJyb3IgbWVzc2FnZSAtIHdoZW4gd2UgaXRlcmF0ZSB0byB0aGUgcm9sZSB3aGVyZQotCQkJCQkvLyB0aGlzIGlzIHRoZSBzb3VyY2UsIHRoaXMgZXJyb3Igd2lsbCBiZSBkZXRlY3RlZC4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJRW50aXR5IHRhcmdldEVudGl0eSA9IG9wcG9zaXRlUm9sZVNvdXJjZS5nZXRFbnRpdHlCZWFuKCk7Ci0JCQkJaWYodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKLQkJCQkJLy8gRG8gbm90IGVtaXQgYW4gZXJyb3IgbWVzc2FnZSAtIHdoZW4gd2UgaXRlcmF0ZSB0byB0aGUgcm9sZSB3aGVyZQotCQkJCQkvLyB0aGlzIGlzIHRoZSBzb3VyY2UsIHRoaXMgZXJyb3Igd2lsbCBiZSBkZXRlY3RlZC4KLQkJCQl9Ci0JCQkJZWxzZSBpZih0YXJnZXRFbnRpdHkuZ2V0TG9jYWxJbnRlcmZhY2UoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIERvZXMgdGhlIHRhcmdldCBvZiB0aGlzIHJvbGUgaGF2ZSBhIGxvY2FsIGludGVyZmFjZT8KLQkJCQkJLy8gQ0hLSjI4Njc6IFRoaXMgYmVhbiBjYW4gaGF2ZSBvbmx5IHVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgYmVhbnMgKEVKQiAyLjA6IDEwLjMuMikuCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg2NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIG9wcG9zaXRlUm9sZSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBWZXJpZnkgdW5pcXVlIHJvbGUgbmFtZXMgd2l0aGluIHRoZSA8ZWpiLXJlbGF0aW9uPgotCQkJdmFsaWRhdGVVbmlxdWVSZWxhdGlvbnNoaXBSb2xlTmFtZXModmMsIGVqYkphcik7Ci0JCQlfcmVsYXRpb25zaGlwUm9sZU5hbWUuY2xlYXIoKTsKLQkJCQotCQkJaWYoIWF0TGVhc3RPbmVDbXJGaWVsZEV4aXN0cykgewotCQkJCS8vIENIS0oyODY5STogQXQgbGVhc3Qgb25lIDxlamItcmVsYXRpb25zaGlwLXJvbGU+IG11c3QgZGVmaW5lIGEgPGNtci1maWVsZD4gKEVKQiAyLjA6IDEwLjMuMiwgMTAuMy4xMywgMjIuNSkuCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODY5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcmVsYXRpb24sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXZhbGlkYXRlVW5pcXVlUmVsYXRpb25OYW1lcyh2YywgZWpiSmFyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVVbmlxdWVSZWxhdGlvbk5hbWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlMaXN0IG5hbWVzID0gX3JlbGF0aW9uc2hpcE5hbWUuZ2V0RHVwbGljYXRlcygpOwotCQlpZihuYW1lcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRUpCUmVsYXRpb25OYW1lV3JhcHBlciB3cmFwcGVyID0gKEVKQlJlbGF0aW9uTmFtZVdyYXBwZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODE2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgd3JhcHBlci5nZXRSZWxhdGlvbigpLCBuZXcgU3RyaW5nW117d3JhcHBlci5nZXRSZWxhdGlvbigpLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVVuaXF1ZVJlbGF0aW9uc2hpcFJvbGVOYW1lcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJTGlzdCBuYW1lcyA9IF9yZWxhdGlvbnNoaXBSb2xlTmFtZS5nZXREdXBsaWNhdGVzKCk7Ci0JCWlmKG5hbWVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIgd3JhcHBlciA9IChFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODE3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgd3JhcHBlci5nZXRSZWxhdGlvbnNoaXBSb2xlKCksIG5ldyBTdHJpbmdbXXt3cmFwcGVyLmdldFJlbGF0aW9uc2hpcFJvbGUoKS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQm90aCBzZWN0aW9uIDExLjQuMSBhbmQgMTUuMy4yIG5lZWQgdGhlIDxtZXRob2Q+IGVsZW1lbnQuIEFsc28gcmVmZXIKLQkgKiB0byAxNi41IGZvciBzeW50YXguCi0JICoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIG1ldGhvZHMgcmVmZXJlbmNlZCBieSB0aGlzIGxpc3Qgb2YgCi0JICogTWV0aG9kRWxlbWVudCBjYW4gYmUgZm91bmQuCi0JKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgTGlzdCBlbGVtZW50cykgewotCQlpZiAoKGVsZW1lbnRzID09IG51bGwpIHx8IChlbGVtZW50cy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IGVsZW1lbnQuZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLQkJCWlmIChiZWFuID09IG51bGwpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCi0JCQkJTWV0aG9kW10gbWV0aG9kcyA9IGVsZW1lbnQuZ2V0TWV0aG9kcygpOyAvLyBnZXQgYWxsIG1ldGhvZHMgd2hpY2ggd2lsbCBiZSByZXRyaWV2ZWQgZm9yIHRoZSBnaXZlbiBtZXRob2QtcGVybWlzc2lvbgotCQkJCWJvb2xlYW4gaGFzTWV0aG9kcyA9ICgobWV0aG9kcyAhPSBudWxsKSAmJiAobWV0aG9kcy5sZW5ndGggPiAwKSk7Ci0KLQkJCQlpZiAoIWhhc01ldGhvZHMpIHsKLQkJCQkJLy8gd2FybmluZwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWhhc1ZhbGlkTWV0aG9kID0gdHJ1ZTsgLy8gYSA8bWV0aG9kLXBlcm1pc3Npb24+IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbWV0aG9kICgxNS4zLjIsIHAuMjI5KQotCQkJCQlpZiAobmFtZS5lcXVhbHMoIioiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlMaXN0IHBhcmFtcyA9IGVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0JCQkJCQlpZiAoKHBhcmFtcyAhPSBudWxsKSAmJiAocGFyYW1zLnNpemUoKSA+IDApKSB7Ci0JCQkJCQkJLy8gd2FybmluZwotCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZXJyb3IKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBoYXNWYWxpZE1ldGhvZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNsaWVudEpBUihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJU3RyaW5nIGNsaWVudEpBUk5hbWUgPSBlamJKYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCWlmKGNsaWVudEpBUk5hbWUgPT0gbnVsbCkgewotCQkJLy8gTm8gY2xpZW50IEpBUiBzcGVjaWZpZWQ7IGV2ZXJ5dGhpbmcncyBva2F5LgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlCb29sZWFuIGV4aXN0cyA9IChCb29sZWFuKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX0NMSUVOVEpBUiwgbmV3IE9iamVjdFtde2NsaWVudEpBUk5hbWV9KTsKLQkJaWYoZXhpc3RzID09IG51bGwpIHsKLQkJCS8vIEhlbHBlciBkb2Vzbid0IHN1cHBvcnQgbG9hZCBtb2RlbC4gV0FTPwotCQkJLy8gQ2FuJ3QgcGVyZm9ybSB0aGlzIGNoZWNrLCBzbyBqdXN0IHJldHVybi4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIWV4aXN0cy5ib29sZWFuVmFsdWUoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg3NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBlamJKYXIsIG5ldyBTdHJpbmdbXXtjbGllbnRKQVJOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCWNsYXNzIEFTTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgX2JlYW4gPSBudWxsOwotCi0JCXB1YmxpYyBBU05hbWVXcmFwcGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbikgewotCQkJX2JlYW4gPSBiZWFuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEFTTmFtZVdyYXBwZXIpIHsKLQkJCQlBU05hbWVXcmFwcGVyIG90aGVyID0gKEFTTmFtZVdyYXBwZXIpbzsKLQkJCQlpZigoX2JlYW4uZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgPT0gbnVsbCkgJiYgKG90aGVyLmdldEJlYW4oKS5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihfYmVhbi5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihvdGhlci5nZXRCZWFuKCkuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBfYmVhbi5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZigoZ2V0QmVhbigpICE9IG51bGwpICYmIChnZXRCZWFuKCkuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQkJfQotCi0JCXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldEJlYW4oKSB7Ci0JCQlyZXR1cm4gX2JlYW47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgRUpCIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlLgotCSAqIChXaXRob3V0IHRoZSBpbnN0YW5jZSwgd2UgY2Fubm90IGdldCBsaW5lIG51bWJlcnMuKQotCSAqCi0JICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCSAqLwotCWNsYXNzIEVqYk5hbWVXcmFwcGVyIHsKLQkJcHJpdmF0ZSBFbnRlcnByaXNlQmVhbiBfYmVhbiA9IG51bGw7Ci0KLQkJcHVibGljIEVqYk5hbWVXcmFwcGVyKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCV9iZWFuID0gYmVhbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBFamJOYW1lV3JhcHBlcikgewotCQkJCUVqYk5hbWVXcmFwcGVyIG90aGVyID0gKEVqYk5hbWVXcmFwcGVyKW87Ci0JCQkJaWYoKF9iZWFuLmdldE5hbWUoKSA9PSBudWxsKSAmJiAob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihfYmVhbi5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIF9iZWFuLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZigoZ2V0QmVhbigpICE9IG51bGwpICYmIChnZXRCZWFuKCkuZ2V0TmFtZSgpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGdldEJlYW4oKS5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGVycHJpc2VCZWFuIGdldEJlYW4oKSB7Ci0JCQlyZXR1cm4gX2JlYW47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcmVsYXRpb24gbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2UuCi0JICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JICoKLQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JICovCi0JY2xhc3MgRUpCUmVsYXRpb25OYW1lV3JhcHBlciB7Ci0JCXByaXZhdGUgRUpCUmVsYXRpb24gX3JlbGF0aW9uID0gbnVsbDsKLQotCQlwdWJsaWMgRUpCUmVsYXRpb25OYW1lV3JhcHBlcihFSkJSZWxhdGlvbiByZWwpIHsKLQkJCV9yZWxhdGlvbiA9IHJlbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBFSkJSZWxhdGlvbk5hbWVXcmFwcGVyKSB7Ci0JCQkJRUpCUmVsYXRpb25OYW1lV3JhcHBlciBvdGhlciA9IChFSkJSZWxhdGlvbk5hbWVXcmFwcGVyKW87Ci0JCQkJaWYoKF9yZWxhdGlvbi5nZXROYW1lKCkgPT0gbnVsbCkgJiYgKG90aGVyLmdldFJlbGF0aW9uKCkuZ2V0TmFtZSgpID09IG51bGwpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmKF9yZWxhdGlvbi5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYob3RoZXIuZ2V0UmVsYXRpb24oKS5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBfcmVsYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXRSZWxhdGlvbigpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZigoZ2V0UmVsYXRpb24oKSAhPSBudWxsKSAmJiAoZ2V0UmVsYXRpb24oKS5nZXROYW1lKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb24oKS5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIEVKQlJlbGF0aW9uIGdldFJlbGF0aW9uKCkgewotCQkJcmV0dXJuIF9yZWxhdGlvbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSByZWxhdGlvbiBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkgKiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGR1cGxpY2F0ZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZS4KLQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkgKgotCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlIHNvIHRoYXQgdGhlIHdyYXBwZXIncwotCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JICogc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJlZiBmcm9tIHRoZSBkdXBsaWNhdGUgbmFtZS4KLQkgKi8KLQljbGFzcyBFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIEVKQlJlbGF0aW9uc2hpcFJvbGUgX3JlbGF0aW9uc2hpcFJvbGUgPSBudWxsOwotCi0JCXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIoRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlKSB7Ci0JCQlfcmVsYXRpb25zaGlwUm9sZSA9IHJvbGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyKSB7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyIG90aGVyID0gKEVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlcilvOwotCQkJCWlmKChfcmVsYXRpb25zaGlwUm9sZS5nZXRSb2xlTmFtZSgpID09IG51bGwpICYmIChvdGhlci5nZXRSZWxhdGlvbnNoaXBSb2xlKCkuZ2V0Um9sZU5hbWUoKSA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihfcmVsYXRpb25zaGlwUm9sZS5nZXRSb2xlTmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmKG90aGVyLmdldFJlbGF0aW9uc2hpcFJvbGUoKS5nZXRSb2xlTmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gX3JlbGF0aW9uc2hpcFJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaWYoKGdldFJlbGF0aW9uc2hpcFJvbGUoKSAhPSBudWxsKSAmJiAoZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0UmVsYXRpb25zaGlwUm9sZSgpIHsKLQkJCXJldHVybiBfcmVsYXRpb25zaGlwUm9sZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDk2ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb247Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgRUpCVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50cyBJRUpCVmFsaWRhdGlvbkNvbnRleHQgewotCXByaXZhdGUgSVZhbGlkYXRvciBfdmFsaWRhdG9yID0gbnVsbDsKLQlwcml2YXRlIElWYWxpZGF0aW9uQ29udGV4dCBfaGVscGVyID0gbnVsbDsKLQlwcml2YXRlIElSZXBvcnRlciBfcmVwb3J0ZXIgPSBudWxsOwotCXByaXZhdGUgTG9nRW50cnkgbG9nRW50cnkgPSBudWxsOwotLy8JcHJpdmF0ZSBJTWVzc2FnZSBfbWVzc2FnZSA9IG51bGw7Ci0JCi0JcHVibGljIEVKQlZhbGlkYXRpb25Db250ZXh0KElWYWxpZGF0b3IgdiwgSVZhbGlkYXRpb25Db250ZXh0IGgsIElSZXBvcnRlciByKSB7Ci0JCXNldFZhbGlkYXRvcih2KTsKLQkJc2V0SGVscGVyKGgpOwotCQlzZXRSZXBvcnRlcihyKTsKLQl9Ci0JCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElWYWxpZGF0b3IgdikgewotCQlfdmFsaWRhdG9yID0gdjsKLQl9Ci0JCi0JcHVibGljIElWYWxpZGF0aW9uQ29udGV4dCBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiBfaGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoSVZhbGlkYXRpb25Db250ZXh0IGgpIHsKLQkJX2hlbHBlciA9IGg7Ci0JfQotCQotCXB1YmxpYyBJUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoKSB7Ci0JCXJldHVybiBfcmVwb3J0ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKElSZXBvcnRlciByKSB7Ci0JCV9yZXBvcnRlciA9IHI7Ci0JfQotCQotIAkvKgotIAkgKiBSZXR1cm5zIGFuIGVtcHR5IE1lc3NhZ2Ugd2hpY2ggY2FuIGJlIHJldXNlZC4KLSAJICovCi0gCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotIAkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7Ci0gCQltZXNzYWdlLnNldEJ1bmRsZU5hbWUoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSk7Ci0gCQlyZXR1cm4gbWVzc2FnZTsKLSAJCS8qCi0gCQlpZihfbWVzc2FnZSA9PSBudWxsKSB7Ci0gCQkJX21lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOwotIAkJfQotIAkJCi0gCQlyZXNldChfbWVzc2FnZSk7Ci0gCQlfbWVzc2FnZS5zZXRCdW5kbGVOYW1lKElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUpOwotIAkJCi0JCXJldHVybiBfbWVzc2FnZTsKLQkJKi8KLQl9Ci0JCi0JCS8qKgotCSAqIElmLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYW4gSU1lc3NhZ2UgaXMgcmV1c2VkIGluc3RlYWQgb2YgY3JlYXRpbmcKLQkgKiBhIG5ldyBvbmUgZWFjaCB0aW1lLCB0aGlzIG1ldGhvZCByZXNldHMgdGhlIGludGVybmFsIGZpZWxkcyB0byB0aGUgZGVmYXVsdC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmVhbGx5IGJlIG9uIHRoZSBJTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGJ1dAotCSAqIHRoaXMnbGwgZG8gZm9yIG5vdy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldChJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCW1lc3NhZ2Uuc2V0SWQobnVsbCk7Ci0JCW1lc3NhZ2Uuc2V0UGFyYW1zKG51bGwpOwotCQltZXNzYWdlLnNldFNldmVyaXR5KE1lc3NhZ2VGaWx0ZXIuQU5ZX1NFVkVSSVRZKTsKLQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QobnVsbCk7Ci0JCW1lc3NhZ2Uuc2V0QnVuZGxlTmFtZShudWxsKTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUobnVsbCk7Ci0JCW1lc3NhZ2Uuc2V0TGluZU5vKElNZXNzYWdlLkxJTkVOT19VTlNFVCk7Ci0JCW1lc3NhZ2Uuc2V0T2Zmc2V0KElNZXNzYWdlLk9GRlNFVF9VTlNFVCk7Ci0JCW1lc3NhZ2Uuc2V0TGVuZ3RoKElNZXNzYWdlLk9GRlNFVF9VTlNFVCk7Ci0JfQotCQotCQotCQotCXB1YmxpYyBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCkgewotCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcihJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkoyRUVfQ09SRV9QTFVHSU4pOwotCX0KLQkKLQlwdWJsaWMgTG9nRW50cnkgZ2V0TG9nRW50cnkoKSB7Ci0JICAgIGlmKGxvZ0VudHJ5ID09IG51bGwpCi0JICAgICAgICBsb2dFbnRyeSA9IG5ldyBMb2dFbnRyeShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FKTsKLQkJcmV0dXJuIGxvZ0VudHJ5OwotCX0KLQotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIGdldEhlbHBlcigpLmxvYWRNb2RlbChzeW1ib2xpY05hbWUpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lLCBPYmplY3RbXSBwYXJtcykgewotCQlyZXR1cm4gZ2V0SGVscGVyKCkubG9hZE1vZGVsKHN5bWJvbGljTmFtZSwgcGFybXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcygpIHsKLQkJZ2V0UmVwb3J0ZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyhnZXRWYWxpZGF0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VzKE9iamVjdCB0YXJnZXQpIHsKLQkJZ2V0UmVwb3J0ZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyhnZXRWYWxpZGF0b3IoKSwgdGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZXMoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwSWRlbnRpZmllcikgewotCQlnZXRSZXBvcnRlcigpLnJlbW92ZU1lc3NhZ2VTdWJzZXQoZ2V0VmFsaWRhdG9yKCksIHRhcmdldCwgZ3JvdXBJZGVudGlmaWVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIHsKLQkJaWYobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZ2V0UmVwb3J0ZXIoKS5hZGRNZXNzYWdlKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQpIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQpOwotCQlnZXRSZXBvcnRlcigpLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMpIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQscGFybXMpOwotCQlnZXRSZXBvcnRlcigpLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSAgbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQsbnVsbCx0YXJnZXQpOwotCQlnZXRSZXBvcnRlcigpLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXQpIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQlJTWVzc2FnZSBtZXNzYWdlID0gIG5ldyBNZXNzYWdlKElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUsc2V2ZXJpdHksbWVzc2FnZUlkLHBhcm1zLHRhcmdldCk7Ci0JCWdldFJlcG9ydGVyKCkuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9ICBuZXcgTWVzc2FnZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FLHNldmVyaXR5LG1lc3NhZ2VJZCxudWxsLHRhcmdldCxncm91cE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUpIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQscGFybXMsdGFyZ2V0LGdyb3VwTmFtZSk7Ci0JCWdldFJlcG9ydGVyKCkuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVybWluYXRlSWZDYW5jZWxsZWQoKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7Ci0JCWlmKGdldFJlcG9ydGVyKCkuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN1YnRhc2soU3RyaW5nIG1lc3NhZ2VJZCkgewotCQlzdWJ0YXNrKG1lc3NhZ2VJZCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN1YnRhc2soU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMpIHsKLQkJaWYoKG1lc3NhZ2VJZCA9PSBudWxsKSB8fCAobWVzc2FnZUlkLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlJTWVzc2FnZSBtZXNzYWdlID0gZ2V0TWVzc2FnZSgpOwotCQltZXNzYWdlLnNldElkKG1lc3NhZ2VJZCk7Ci0JCW1lc3NhZ2Uuc2V0UGFyYW1zKHBhcm1zKTsKLQkJZ2V0UmVwb3J0ZXIoKS5kaXNwbGF5U3VidGFzayhnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFVSSXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyYmY2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotLyoqCi0gKiBDb3JlIEVKQiBWYWxpZGF0aW9uIHJ1bGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIExvZ2dlciBsb2dnZXIgPSBudWxsOwotCQotCXB1YmxpYyBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkoKSB7Ci0JCWNyZWF0ZVJ1bGVMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0JcHJvdGVjdGVkIExvZ2dlciBnZXRNc2dMb2dnZXIoKXsKLQkgICAgaWYobG9nZ2VyID09IG51bGwpCi0JICAgICAgICBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKElFSkJWYWxpZGF0b3JDb25zdGFudHMuSjJFRV9DT1JFX1BMVUdJTik7Ci0JICAgIHJldHVybiBsb2dnZXI7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVSdWxlTGlzdCgpIHsKLQkJX3J1bGVMaXN0ID0gbmV3IEhhc2hNYXAoKTsKLQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRUpCSkFSLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FSkJKYXIxMVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCSkFSLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FSkJKYXIyMFZSdWxlKCkpOwotCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRU5URVJQUklTRUJFQU4sIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkVudGVycHJpc2VCZWFuMTFWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VOVEVSUFJJU0VCRUFOLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FbnRlcnByaXNlQmVhbjIwVlJ1bGUoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlU2Vzc2lvbkJlYW4oKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX1JFTU9URSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVTZXNzaW9uUmVtb3RlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9IT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZVNlc3Npb25Ib21lKCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVsZXNzU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9IT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUwsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlZnVsU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlZnVsU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWZ1bFNlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlKCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQ01QQmVhbigpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQ01QUmVtb3RlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZUNNUEtleSgpKTsKLQkJCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5DTVBCZWFuQ2xhc3NWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNNUFJlbW90ZUNvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNNUFJlbW90ZUhvbWVWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTCwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQ01QTG9jYWxDb21wb25lbnRWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTEhPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNNUExvY2FsSG9tZVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5DTVBLZXlDbGFzc1ZSdWxlKCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQk1QQmVhbigpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQk1QUmVtb3RlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQk1QSG9tZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9LRVlDTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVCTVBLZXkoKSk7Ci0KLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkJNUEJlYW5DbGFzc1ZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQk1QUmVtb3RlQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQk1QUmVtb3RlSG9tZVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5CTVBMb2NhbENvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQk1QTG9jYWxIb21lVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkJNUEtleUNsYXNzVlJ1bGUoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfTUVTU0FHRV9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLk1lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZSgpKTsKLQkJCi0JCWFkZERlcGVuZGVudFJ1bGVUb1J1bGVMaXN0KCk7Ci0JCWxvZ0FsbERlcGVuZGVudFJ1bGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBJRmlsZURlbHRhIHJlcHJlc2VudHMgYSBzdGF0aWMgbG9hZCBtb2RlbCAoaS5lLiwgdGhlIGZpbGUgbmFtZSBpcyBhbHdheXMgdGhlIHNhbWUpLAotCSAqIHRoZW4gcmV0dXJuIHRoZSBJbnRlZ2VyIHdoaWNoIGxvYWRzIHRoYXQgbW9kZWwuIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgIE9iamVjdCBnZXRSdWxlSWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYoZmlsZU5hbWUgPT0gbnVsbCkgewotCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChhTG9nZ2VyICE9IG51bGwgJiYgYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGUgZnJvbSBmaWxlTmFtZTogIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlFSkJKYXIgZWpiSmFyID0gZ2V0RUpCSmFyKHZjKTsKLQotCQlpZihmaWxlTmFtZS5lbmRzV2l0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FKSkgewotCQkJaWYoZWpiSmFyLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpIHsKLQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9FSkJKQVI7Ci0JCQl9Ci0JCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJKQVI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7IC8vIG11c3QgYmUgYSBKYXZhQ2xhc3MKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIElGaWxlRGVsdGEgcmVwcmVzZW50cyBhIGR5bmFtaWMgbG9hZCBtb2RlbCAoaS5lLiwgdGhlIGZpbGUgbmFtZSBjYW4gYmUgY2hhbmdlZCBieSB0aGUKLQkgKiB1c2VyKSwgdGhlbiByZXR1cm4gdGhlIEludGVnZXIgd2hpY2ggbG9hZHMgdGhhdCBtb2RlbC4gUmV0dXJuIG51bGwgaWYgbm8gc3VjaCBtb2RlbCBleGlzdHMuCi0JICovCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRSdWxlSWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBKYXZhQ2xhc3MgY2xhenosIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gUmV0dXJuIHRoZSBydWxlIGlkIHdoaWNoIHdpbGwgdmFsaWRhdGUgdGhlIEphdmFDbGFzcyBhcyB0aGUgCi0JCS8vIHR5cGUgd2hpY2ggaXQgaXMgdXNlZCBhcyBieSB0aGUgRW50ZXJwcmlzZUJlYW4uCi0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAoYmVhbiA9PSBudWxsKSkgewotCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChhTG9nZ2VyICE9IG51bGwgJiYgYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGUgYmVjYXVzZSBlaXRoZXIgYmVhbiAoIiArIGJlYW4gKyAiKSBvciBjbGFzcyAoIiArIGNsYXp6ICsgIikgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkICAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJYm9vbGVhbiBpc1N0YXRlbGVzc1Nlc3Npb24gPSAoYmVhbi5pc1Nlc3Npb24oKSAmJiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTdGF0ZWxlc3MoYmVhbikpOwotCQlib29sZWFuIGlzU3RhdGVmdWxTZXNzaW9uID0gKGJlYW4uaXNTZXNzaW9uKCkgJiYgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU3RhdGVmdWwoYmVhbikpOwotCQkKLQkJaWYoYmVhbi5nZXRWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB7Ci0JCQlpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRFamJDbGFzcygpKSkgewotCQkJCWlmKGlzU3RhdGVsZXNzU2Vzc2lvbikgewotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIGlmKGlzU3RhdGVmdWxTZXNzaW9uKSB7Ci0JCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1M7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzTWVzc2FnZURyaXZlbigpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX01FU1NBR0VfQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIgIT0gbnVsbCAmJiBhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldEVqYkNsYXNzKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNsYXp6LmVxdWFscyhiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpKSkgewotCQkJCWlmKGlzU3RhdGVsZXNzU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXNTdGF0ZWZ1bFNlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJaWYoaXNTdGF0ZWxlc3NTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXNTdGF0ZWZ1bFNlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJaWYoaXNTdGF0ZWxlc3NTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihpc1N0YXRlZnVsU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTEhPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNsYXp6LmVxdWFscyhiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkpKSB7Ci0JCQkJaWYoaXNTdGF0ZWxlc3NTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMOwotCQkJCX0KLQkJCQllbHNlIGlmKGlzU3RhdGVmdWxTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUw7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUw7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMl9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihiZWFuIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJaWYoY2xhenouZXF1YWxzKCgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSkpIHsKLQkJCQkJaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQkJCQkJLy8gSWYgaXQncyBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSwgaXQncyBleGVtcHQgZnJvbSB0aGVzZSBjaGVja3MuCi0JCQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1M7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSAmJiBjbGF6ei5lcXVhbHMoKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgaWYoYmVhbi5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEKSB7Ci0JCQlpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRFamJDbGFzcygpKSkgewotCQkJCWlmKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0RWpiQ2xhc3MoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQlpZihiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKSkgewotCQkJCWlmKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9IT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24xX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoYmVhbiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCWlmKGNsYXp6LmVxdWFscygoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCkpKSB7Ci0JCQkJCWlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJCQkJCS8vIElmIGl0J3MgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIGl0J3MgZXhlbXB0IGZyb20gdGhlc2UgY2hlY2tzLgotCQkJCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleShjbXApKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9LRVlDTEFTUzsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgY2xhenouZXF1YWxzKCgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6ICFiZWFuLmlzVmVyc2lvbjFfWCgpICYmICFiZWFuLmlzVmVyc2lvbjJfWCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTg1ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVKQlZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRUpCVmFsaWRhdG9yIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBUYXJnZXRPYmplY3RQb29sIF90YXJnZXRPYmplY3RQb29sU2luZ2xldG9uID0gbnVsbDsKLQlwcml2YXRlIExvZ0VudHJ5IGxvZ0VudHJ5ID0gbnVsbDsKLQkKLQkKLQlwdWJsaWMgRUpCVmFsaWRhdG9yKCkgewotCQlfaW5zdCA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRUpCVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIF9pbnN0OwotCX0KLQkKLQlwcml2YXRlIExvZ0VudHJ5IGdldExvZ0VudHJ5KCl7Ci0JICAgIGlmKGxvZ0VudHJ5ID09IG51bGwpCi0JICAgICAgICBsb2dFbnRyeSA9IG5ldyBMb2dFbnRyeShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FKTsKLQkgICAgcmV0dXJuIGxvZ0VudHJ5OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotCQlyZXR1cm4gImVqYnZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRvciN2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQsIElSZXBvcnRlciwgSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKElFSkJWYWxpZGF0b3JDb25zdGFudHMuSjJFRV9DT1JFX1BMVUdJTik7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJTG9nRW50cnkgZW50cnkgPSBnZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQlZhbGlkYXRvcjo6dmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGV4dCgidmFsaWRhdGUgdG9vayAiICsgKGVuZCAtIHN0YXJ0KSArICIgbWlsbGlzZWNvbmRzLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGVudHJ5KTsKLQkJfQotCQl0cnkgewotCQkJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMgPSBuZXcgRUpCVmFsaWRhdGlvbkNvbnRleHQodGhpcywgaGVscGVyLCByZXBvcnRlcik7Ci0JCQlzZXRWYWxpZGF0aW9uQ29udGV4dCh2Yyk7Ci0JCQlpZiAoaXNGdWxsVmFsaWRhdGUodmMpKSB7Ci0JCQkJZnVsbFZhbGlkYXRlKHZjKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5jcmVtZW50YWxWYWxpZGF0ZSh2Yyk7Ci0JCQl9Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBnZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkJWYWxpZGF0b3I6OnZhbGlkYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJ2YWxpZGF0ZSB0b29rICIgKyAoZW5kIC0gc3RhcnQpICsgIiBtaWxsaXNlY29uZHMuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGVudHJ5KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaGVscGVyTWFwICE9IG51bGwpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaGVscGVyTWFwLmNsZWFyKCk7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmhlbHBlck1hcCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGdWxsVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB7Ci0JCVN0cmluZ1tdIGZpbGVVUklzID0gdmMuZ2V0VVJJcygpOwotCQlpZihmaWxlVVJJcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZihmaWxlVVJJcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWZvcihpbnQgaT0wOyBpPGZpbGVVUklzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdXJpID0gZmlsZVVSSXNbaV07Ci0JCQlpZih1cmkuZW5kc1dpdGgoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW5EZXBlbmRlbnRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgSVZhbGlkYXRpb25SdWxlIHJ1bGUsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gSWYgYSBjbGFzcyBpcyBiZWluZyBydW4gb25seSBiZWNhdXNlIGl0IGRlcGVuZHMgb24gYSBydWxlIHdoaWNoIGhhcyBjaGFuZ2VkLAotCQkvLyBpLmUuLCBpdCdzIGEgZGVwZW5kZW50LCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gcnVuIGl0cyBkZXBlbmRlbnRzIGJlY2F1c2UgdGhlCi0JCS8vIGNsYXNzIGl0c2VsZiBoYXNuJ3QgY2hhbmdlZC4KLQkJU2V0IGRlcGVuZGVudHMgPSBydWxlLmdldERlcGVuZGVudHMoKTsKLQkJaWYoZGVwZW5kZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVZhbGlkYXRpb25SdWxlIGRSdWxlID0gKElWYWxpZGF0aW9uUnVsZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGRSdWxlVGFyZ2V0ID0gZFJ1bGUuZ2V0VGFyZ2V0KHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQkJCQlpZihkUnVsZVRhcmdldCAhPSBudWxsKSB7Ci0JCQkJCXJ1bihkUnVsZSwgdGFyZ2V0UGFyZW50LCBkUnVsZVRhcmdldCk7IC8vIGZhbHNlPW5vdCBmdWxsIHZhbGlkYXRpb24KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCWNhdGNoKE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uQ29udGV4dCgpLCBleGMpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5yZWxlYXNlKHJ1bGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgaW50ZXJuYWxFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwMDsKLQl9Ci0JCi0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ1J1bGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgcnVsZUlkKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBydWxlSWQgKyAiID0gbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcmVSZW1vdmVPbGRNZXNzYWdlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1hcCB0YXJnZXRzKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUxpc3QgdmFsaWRhdGVkQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXRyeSB7CQotCQkJU3RyaW5nW10gdXJpcyA9IHZjLmdldFVSSXMoKTsKLQkJCWZvcihpbnQgaT0wOyBpPHVyaXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdXJpSW5zdCA9IHVyaXNbaV07Ci0JCQkJaWYoKHVyaUluc3QgPT0gbnVsbCkgfHwgKHVyaUluc3QubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCU9iamVjdCBpZCA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZUlkKHZjLCB1cmlJbnN0KTsKLQkJCQlpZihpZCA9PSBudWxsKSB7Ci0JCQkJCU9iamVjdFtdIGNsYXp6QW5kQmVhbiA9IChPYmplY3RbXSl2Yy5sb2FkTW9kZWwodXJpSW5zdCwgbnVsbCk7IC8vIERvbid0IG5lZWQgYSBzZWNvbmQgcGFyYW1ldGVyLCBidXQgY2FuJ3QgY2FzdCBhIFJlZk9iamVjdCB0byBhbiBPYmplY3RbXSwgc28gdXNlIHRoZSBzZWNvbmQgbG9hZCBtZXRob2QuCi0JCQkJCWlmKGNsYXp6QW5kQmVhbiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQkJCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gSW4gdGhlIGNsYXp6QW5kQmVhbiBvYmplY3QgYXJyYXksIHRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgSmF2YUNsYXNzLAotCQkJCQkvLyBhbmQgdGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMgYXJlIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZXMgd2hpY2ggCi0JCQkJCS8vIHVzZSB0aGUgSmF2YUNsYXNzLgotCQkJCQlKYXZhQ2xhc3MgY2xhenogPSAoSmF2YUNsYXNzKWNsYXp6QW5kQmVhblswXTsKLQkJCQkJTGlzdCBiZWFucyA9IChMaXN0KWNsYXp6QW5kQmVhblsxXTsKLQotCQkJCQkvLyBUaGUgdmFsaWRhdGVkQ2xhc3Mgc2V0IGtlZXBzIHRyYWNrIG9mIEphdmFDbGFzc2VzIAotCQkJCQkvLyB0aGF0IGhhdmUgY2hhbmdlZCwgYW5kIHRoaXMgc2V0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIAotCQkJCQkvLyB3aG9zZSBjaGlsZHJlbiBuZWVkIHRvIGJlIGZvdW5kIGFuZCB2YWxpZGF0ZWQuIAotCQkJCQkvLyBWYWxpZGF0aW9uIGlzIHBlcmZvcm1lZCBhZnRlciBhbGwgb2YgdGhlIGNoYW5nZWQgZmlsZXMgCi0JCQkJCS8vIGFyZSB2YWxpZGF0ZWQgc28gdGhhdCBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIGFsbCBvZgotCQkJCQkvLyB0aGUgY2hhbmdlZCBmaWxlcyBjYW4gYmUgc2VhcmNoZWQgZm9yIGF0IG9uY2UuIFNlYXJjaGluZwotCQkJCQkvLyBvbmNlIG9uIGEgZ3JvdXAgcHJvZHVjZXMgcGVyZm9ybWFuY2Ugc2F2aW5ncyBiZWNhdXNlCi0JCQkJCS8vIHRoZSB0eXBlIGhpZXJhcmNoeSBtZXRob2QgdGFrZXMgYSBub24tdHJpdmlhbCBhbW91bnQKLQkJCQkJLy8gb2YgdGltZSB3aGVuIHRoZXJlJ3MgYSBsYXJnZSBncm91cCBvZiBkZWx0YXMuCi0JCQkJCXZhbGlkYXRlZENsYXNzZXMuYWRkKGNsYXp6KTsKLQotCQkJCQlpZigoYmVhbnMgPT0gbnVsbCkgfHwgKGJlYW5zLnNpemUoKSA9PSAwKSkgewotCQkJCQkJLy8gVGhlIEphdmFDbGFzcyBpdHNlbGYgaXMgbm90IHBhcnQgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLCBidXQgb25lIG9mIGl0cyBjaGlsZHJlbiBtYXkgYmUuCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGJlYW5zLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZCA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZUlkKHZjLCBjbGF6eiwgYmVhbik7Ci0JCQotCQkJCQkJCUlWYWxpZGF0aW9uUnVsZSBjbGF6elJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQkJCQlpZihjbGF6elJ1bGUgPT0gbnVsbCkgewotCQkJCQkJCQkvLyBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGJ5IHRoZSBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSAoaWYgaXQncwotCQkJCQkJCQkvLyBhbiBlcnJvciAtIHRoaXMgaXMgZXhwZWN0ZWQgaWYgdGhlIGtleSBpcyBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSkuCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCi0JCQkJCQkJc2V0VmFsaWRhdGVkKGNsYXp6UnVsZS5nZXRJZCgpLCBiZWFuLCBjbGF6eik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0JCQkJCWlmKGVqYkphciA9PSBudWxsKSB7Ci0JCQkJCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSVZhbGlkYXRpb25SdWxlIGVqYkV4dFJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQkJaWYoZWpiRXh0UnVsZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGJ5IHRoZSBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSwgc28ganVzdAotCQkJCQkJLy8gbmVlZCB0byBhZGQgIkNhbm5vdCB2YWxpZGF0ZSIgdG8gdGhlIHRhc2sgbGlzdC4KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlzZXRWYWxpZGF0ZWQoZWpiRXh0UnVsZS5nZXRJZCgpLCBudWxsLCBlamJKYXIpOwotCQkJCX0KLQkJCX0gLy8gZW5kIGZvcgotCQkJCi0JCQkvLyBBbHdheXMgdmFsaWRhdGUgZWpiLWphci54bWwsIGJlY2F1c2UgYSBjaGFuZ2UgdG8gb25lIG9mIHRoZSBmaWxlcyBpdCByZWZlcmVuY2VzCi0JCQkvLyBtYXkgbWVhbiB0aGF0IGl0IG5lZWRzIHRvIGJlIHJldmFsaWRhdGVkLgkKLQkJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJCWlmKGVqYkphciAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUpOwotCQkJCWlmKGlkID09IG51bGwpIHsKLQkJCQkJLy8gTG9nLCBhZGQgIkNhbm5vdCB2YWxpZGF0ZSIgdG8gdGFzayBsaXN0LCBhbmQgcmV0dXJuLgotCQkJCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVZhbGlkYXRpb25SdWxlIGVqYkphclJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQkJaWYoZWpiSmFyUnVsZSA9PSBudWxsKSB7Ci0JCQkJCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJCQl9Ci0JCQkJCXNldFZhbGlkYXRlZChlamJKYXJSdWxlLmdldElkKCksIG51bGwsIGVqYkphcik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZih2YWxpZGF0ZWRDbGFzc2VzLnNpemUoKSA+IDApIHsKLQkJCQkvLyBDaGVjayB0aGUgY2hpbGRyZW4gb2YgdGhlIGNoYW5nZWQgY2xhc3Nlcy4KLQkJCQkvLyBUaGlzIGNoZWNrIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGRlcGVuZGVudHMsIGJlY2F1c2UKLQkJCQkvLyB0aGUgZGVwZW5kZW50cyBvZiB0aGUgY2hpbGRyZW4gY2xhc3NlcyBtdXN0IGJlIGNoZWNrZWQKLQkJCQkvLyBhcyB3ZWxsLgotCi0JCQkJLy8gQ2xhc3MgbmV2ZXIgdmFsaWRhdGVkIGJlZm9yZSwgc28gY2hlY2sgaXRzIGNoaWxkcmVuCi0JCQkJZm9yIChpbnQgdkMgPSAwOyB2Qzx2YWxpZGF0ZWRDbGFzc2VzLnNpemUoKTsgdkMrKykgewotCQkJCQlMaXN0IGJlYW5zID0gKExpc3QpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkIsIG5ldyBPYmplY3RbXXt2YWxpZGF0ZWRDbGFzc2VzLmdldCh2Qyl9KTsKLQkJCQkJaWYoKGJlYW5zID09IG51bGwpIHx8IChiZWFucy5zaXplKCkgPT0gMCkpIHsKLQkJCQkJCS8vIFRoZSBjbGFzcyBpcyBub3QgYSBtZW1iZXIgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJU2V0IHJvb3RWYWxpZGF0ZWRDbGFzcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCXJvb3RWYWxpZGF0ZWRDbGFzcy5hZGQodmFsaWRhdGVkQ2xhc3Nlcy5nZXQodkMpKTsKLQkJCQkJSmF2YUNsYXNzW10gY2hpbGRyZW4gPSAoSmF2YUNsYXNzW10pdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5DSElMRFJFTiwgbmV3IE9iamVjdFtde3ZjLmdldFJlcG9ydGVyKCksIHJvb3RWYWxpZGF0ZWRDbGFzc30pOwotCQkJCQlpZigoY2hpbGRyZW4gIT0gbnVsbCkgJiYgKGNoaWxkcmVuLmxlbmd0aCA+IDApKSB7Ci0JCQkJCQlJdGVyYXRvciBiY2l0ZXJhdG9yID0gbnVsbDsKLQkJCQkJCU9iamVjdCBpZCA9IG51bGw7Ci0JCQkJCQlmb3IoaW50IGM9MDsgYzxjaGlsZHJlbi5sZW5ndGg7IGMrKykgewotCQkJCQkJCUphdmFDbGFzcyBjaGlsZCA9IGNoaWxkcmVuW2NdOwotCQkJCQkJCWJlYW5zID0gKExpc3QpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkIsIG5ldyBPYmplY3RbXXtjaGlsZH0pOwotCQkJCQkJCS8vIFRoZSBjaGlsZCBpcyBub3QgYSBtZW1iZXIgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLgotCQkJCQkJCWlmKChiZWFucyA9PSBudWxsKSB8fCAoYmVhbnMuc2l6ZSgpID09IDApKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQliY2l0ZXJhdG9yID0gYmVhbnMuaXRlcmF0b3IoKTsKLQkJCQkJCQl3aGlsZShiY2l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKWJjaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZCA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZUlkKHZjLCBjaGlsZCwgYmVhbik7Ci0JCQkJCQkJCUlWYWxpZGF0aW9uUnVsZSBjbGF6elJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQkJCQkJLy8gVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGxvZ2dlZCBieSB0aGUgQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnksIHNvIGp1c3QgbmVlZCB0byBhZGQgIkNhbm5vdCB2YWxpZGF0ZSIgdG8gdGhlIHRhc2sgbGlzdC4KLQkJCQkJCQkJaWYoY2xhenpSdWxlID09IG51bGwpCi0JCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQkJc2V0VmFsaWRhdGVkKGNsYXp6UnVsZS5nZXRJZCgpLCBiZWFuLCBjaGlsZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXZhbGlkYXRlZENsYXNzZXMuY2xlYXIoKTsgLy8gRG9uJ3QgbmVlZCB0aGlzIGNhY2hlIGFueSBtb3JlOyBmcmVlIHRoZSBtZW1vcnkuCi0JCQl9Ci0JCQkKLQkJCS8vIE5vdywgdmFsaWRhdGUgdGhlIGRlcGVuZGVudHMuCi0JCQl0YXJnZXRzLnB1dEFsbChfdmFsaWRhdGVkKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFyZ2V0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGlkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCUlWYWxpZGF0aW9uUnVsZSBydWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7Ci0JCQkJaWYocnVsZSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlTZXQgY29udGV4dHMgPSAoU2V0KXRhcmdldHMuZ2V0KGlkKTsKLQkJCQlpZihjb250ZXh0cyA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlJdGVyYXRvciBjSXRlcmF0b3IgPSBjb250ZXh0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJVGFyZ2V0T2JqZWN0IHRvID0gKFRhcmdldE9iamVjdCljSXRlcmF0b3IubmV4dCgpOwotCQkJCQlPYmplY3QgdGFyZ2V0UGFyZW50ID0gdG8uZ2V0VGFyZ2V0UGFyZW50KCk7Ci0JCQkJCU9iamVjdCB0YXJnZXQgPSB0by5nZXRUYXJnZXQoKTsKLQkJCQkJU2V0IGRlcGVuZGVudHMgPSBydWxlLmdldERlcGVuZGVudHMoKTsKLQkJCQkJaWYoZGVwZW5kZW50cyA9PSBudWxsKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSXRlcmF0b3IgZEl0ZXJhdG9yID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZShkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlWYWxpZGF0aW9uUnVsZSBkUnVsZSA9IChJVmFsaWRhdGlvblJ1bGUpZEl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgZFJ1bGVUYXJnZXQgPSBkUnVsZS5nZXRUYXJnZXQodGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQkJCQkJCWlmKGRSdWxlVGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJCQkJc2V0VmFsaWRhdGVkKGRSdWxlLmdldElkKCksIHRhcmdldFBhcmVudCwgZFJ1bGVUYXJnZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChNZXNzYWdlTGltaXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSwgZXhjKTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCUVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkucmVsZWFzZShydWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIE5vIG1hdHRlciB3aGF0LCBjbGVhciB0aGUgdGVtcG9yYXJ5IGNhY2hlcy4KLQkJCXRhcmdldHMuY2xlYXIoKTsKLQkJCXZhbGlkYXRlZENsYXNzZXMuY2xlYXIoKTsKLQkJCQotCQkJLy8gTm93IHB1dCB0aGUgInZhbGlkYXRlZCIgcmVzdWx0cyBpbiAiZG9uZSIsIGJlY2F1c2UgdGhleSB3ZXJlbid0Ci0JCQkvLyByZWFsbHkgdmFsaWRhdGVkOyBpdCB3YXMganVzdCBhIHRyYWNraW5nIG1lY2hhbmlzbS4KLQkJCXRhcmdldHMucHV0QWxsKF92YWxpZGF0ZWQpOwotCQkJX3ZhbGlkYXRlZC5jbGVhcigpOyAvLyBDbGVhciB0aGUgInZhbGlkYXRlZCIgY2FjaGUgYmVjYXVzZSB0aGUgdGFyZ2V0cyB3ZXJlbid0IHJlYWxseSB2YWxpZGF0ZWQ7IHRoZXkgd2VyZSBqdXN0IHRyYWNrZWQuCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdmVPbGRNZXNzYWdlc1N0cmluZygpIHsKLQkJcmV0dXJuIEVKQlZhbGlkYXRvck1vZGVsRW51bS5SRU1PVkVfT0xEX01FU1NBR0VTOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmdWxsVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJlbW92ZU9sZE1lc3NhZ2VzKHZjLG51bGwpOyAvLyBudWxsID09IG5vIElGaWxlRGVsdGEsIG51bGwgPSBkb24ndCB0cmFjayB0YXJnZXRzCi0JCQotCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0JCWlmKGVqYkphciA9PSBudWxsKSB7Ci0JCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQkvLyBFSkJQcm9qZWN0UmVzb3VyY2VzIHdpbGwgYWxyZWFkeSBoYXZlIGxvZ2dlZCB0aGUgcHJvYmxlbS4KLQkJCQotCQkJSU1lc3NhZ2UgbXNzZyA9IHZjLmdldE1lc3NhZ2UoKTsKLQkJCW1zc2cuc2V0SWQoSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDUpOwotCQkJdmMuYWRkTWVzc2FnZShtc3NnKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IGlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUpOwotCQlpZihpZCA9PSBudWxsKSB7Ci0JCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQlsb2dNaXNzaW5nUnVsZSh2YywgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVZhbGlkYXRpb25SdWxlIGVqYkphclJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJaWYoZWpiSmFyUnVsZSA9PSBudWxsKSB7Ci0JCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXJ1bihlamJKYXJSdWxlLCBudWxsLCBlamJKYXIpOyAvLyB0cnVlPSBmdWxsIHZhbGlkYXRpb24KLQotCQlMaXN0IGJlYW5zID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGJlYW5zLml0ZXJhdG9yKCk7Ci0JCWlkID0gbnVsbDsKLQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4paXRlcmF0b3IubmV4dCgpOwotCQkJSmF2YUNsYXNzW10gY2xhc3NlcyA9IGdldEphdmFDbGFzcyhiZWFuKTsKLQkJCWZvcihpbnQgaT0wOyBpPGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKYXZhQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQkJCWlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIGNsYXp6LCBiZWFuKTsKLQkJCi0JCQkJSVZhbGlkYXRpb25SdWxlIGNsYXp6UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCWlmKGNsYXp6UnVsZSA9PSBudWxsKSB7Ci0JCQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYnkgdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IChpZiBpdCdzCi0JCQkJCS8vIGFuIGVycm9yIC0gdGhpcyBpcyBleHBlY3RlZCBpZiB0aGUga2V5IGlzIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5KS4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkKLQkJCQlydW4oY2xhenpSdWxlLCBiZWFuLCBjbGF6eik7IC8vIHRydWUgPSBmdWxsIHZhbGlkYXRpb24KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNsYXNzW10gZ2V0SmF2YUNsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJSmF2YUNsYXNzW10gY2xhc3NlcyA9IG5ldyBKYXZhQ2xhc3NbNl07Ci0JCQotCQlKYXZhQ2xhc3MgZWpiQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCWlmKChlamJDbGFzcyAhPSBudWxsKSAmJiAoZWpiQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkpIHsKLQkJCWNsYXNzZXNbY291bnQrK10gPSBlamJDbGFzczsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIHJlbW90ZUNsYXNzID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJaWYoKHJlbW90ZUNsYXNzICE9IG51bGwpICYmIChyZW1vdGVDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSkgewotCQkJY2xhc3Nlc1tjb3VudCsrXSA9IHJlbW90ZUNsYXNzOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgbG9jYWxDbGFzcyA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJaWYoKGxvY2FsQ2xhc3MgIT0gbnVsbCkgJiYgKGxvY2FsQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkpIHsKLQkJCWNsYXNzZXNbY291bnQrK10gPSBsb2NhbENsYXNzOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgaG9tZUNsYXNzID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCWlmKChob21lQ2xhc3MgIT0gbnVsbCkgJiYgKGhvbWVDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSkgewotCQkJY2xhc3Nlc1tjb3VudCsrXSA9IGhvbWVDbGFzczsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGxvY2FsSG9tZUNsYXNzID0gYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQkJaWYoKGxvY2FsSG9tZUNsYXNzICE9IG51bGwpICYmIChsb2NhbEhvbWVDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSkgewotCQkJY2xhc3Nlc1tjb3VudCsrXSA9IGxvY2FsSG9tZUNsYXNzOwotCQl9Ci0JCQotCQlpZihiZWFuIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlKYXZhQ2xhc3Mga2V5ID0gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQkJaWYoKGtleSAhPSBudWxsKSAmJiAoa2V5LmlzRXhpc3RpbmdUeXBlKCkpKSB7Ci0JCQkJY2xhc3Nlc1tjb3VudCsrXSA9IGtleTsKLQkJCX0KLQkJfQotCi0JCWlmKGNvdW50ID09IDYpIHsKLQkJCXJldHVybiBjbGFzc2VzOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3NbXSByZXN1bHQgPSBuZXcgSmF2YUNsYXNzW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShjbGFzc2VzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRhbFZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YykgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlNYXAgdGFyZ2V0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRyeSB7Ci0JCQlyZW1vdmVPbGRNZXNzYWdlcyh2Yyx0YXJnZXRzKTsKLQkJCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXJnZXRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgaWQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSVZhbGlkYXRpb25SdWxlIHJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQlpZihydWxlID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCVNldCBjb250ZXh0cyA9IChTZXQpdGFyZ2V0cy5nZXQoaWQpOwotCQkJCWlmKGNvbnRleHRzID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCUl0ZXJhdG9yIGNJdGVyYXRvciA9IGNvbnRleHRzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoY0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlUYXJnZXRPYmplY3QgdG8gPSAoVGFyZ2V0T2JqZWN0KWNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCXJ1bihydWxlLCB0by5nZXRUYXJnZXRQYXJlbnQoKSwgdG8uZ2V0VGFyZ2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRhcmdldHMuY2xlYXIoKTsKLQkJCXRhcmdldHMgPSBudWxsOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUYXJnZXRPYmplY3RQb29sIGdldFRhcmdldE9iamVjdFBvb2woKSB7Ci0JCWlmKF90YXJnZXRPYmplY3RQb29sU2luZ2xldG9uID09IG51bGwpIHsKLQkJCV90YXJnZXRPYmplY3RQb29sU2luZ2xldG9uID0gbmV3IFRhcmdldE9iamVjdFBvb2woMTAwKTsKLQkJfQotCQlyZXR1cm4gX3RhcmdldE9iamVjdFBvb2xTaW5nbGV0b247Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudmFsaWRhdGlvbi5BYnN0cmFjdEVKQlZhbGlkYXRvciNyZWxlYXNlUnVsZXMob3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudmFsaWRhdGlvbi5lamIuSVZhbGlkYXRpb25SdWxlKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlbGVhc2VSdWxlcyhJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotICAgICAgICBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLnJlbGVhc2UocnVsZSk7Ci0gICAgICAgIAotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0b3JNb2RlbEVudW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0b3JNb2RlbEVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0ODI0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yTW9kZWxFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lcyBvZiB0aGUgbW9kZWxzIHdoaWNoIHRoZQotICogRUpCVmFsaWRhdG9yIG5lZWRzLCBhbmQgdGhlIElWYWxpZGF0aW9uQ29udGV4dCB0aGF0IGlzIHVzZWQgaW4gdGhlIEVKQlZhbGlkYXRvcidzCi0gKiB2YWxpZGF0ZSBtZXRob2QgbXVzdCBzdXBwb3J0IHRoZXNlIHN5bWJvbGljIG5hbWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQlZhbGlkYXRvck1vZGVsRW51bSB7Ci0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCX01PREVMID0gIkVKQl9NT0RFTCI7IC8vIHJldHVybiBhbiBFSkJKYXIgb2JqZWN0IC8vJE5PTi1OTFMtMSQKLQkgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFSkJfRklMRSA9ICJFSkJfRklMRSI7IC8vIHJldHVybiBhIE1vZHVsZUZpbGUgb2JqZWN0IChlaXRoZXIgRUpCSmFyRmlsZSBvciBFQVJGaWxlKSAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCID0gIkVKQiI7IC8vIEdpdmVuIGEgSmF2YUNsYXNzIGluc3RhbmNlLCByZXR1cm4gYSBqYXZhLnV0aWwuTGlzdCBvZiBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZXMgdGhhdCB1c2UgdGhhdCBKYXZhQ2xhc3MgYXMgcGFydCBvZiB0aGUgYmVhbi4gLy8kTk9OLU5MUy0xJAotCSAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENISUxEUkVOID0gImNoaWxkcmVuIjsgLy8gR2l2ZW4gYSBKYXZhQ2xhc3MgaW5zdGFuY2UsIHJldHVybiBhIEphdmFDbGFzc1tdIG9mIHRoZSBKYXZhQ2xhc3NlcyB0aGF0IGluaGVyaXQgb3IgZXh0ZW5kIHRoZSBpbnN0YW5jZS4gLy8kTk9OLU5MUy0xJAotCSAgIC8vVGhlIEVKQl9CSU5ESU5HIHN5bWJvbHMgaXMgV0FTIHNwZWNpZmljIGFuZCBuZWVkIHRvIGJlIG1vdmVkIHRvIFdBUyBFeHQgbGF5ZXIKLQkgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFSkJfQklORElORyA9ICJFSkJfQklORElORyI7IC8vIHJldHVybiB0aGUgRUpCSmFyQmluZGluZyBmb3IgdGhlIEVKQkphciAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCX0NMSUVOVEpBUiA9ICJFSkJfQ0xJRU5USkFSIjsgLy8gSWYgdGhlIEVKQiB1c2VzIGEgY2xpZW50IEpBUiwgZ2l2ZW4gdGhlIG5hbWUgb2YgdGhlIEpBUiwgdGhpcyBtZXRob2QgcmV0dXJucyBhIEJvb2xlYW4uVFJVRSBpZiB0aGUgY2xpZW50IEpBUiBjYW4gYmUgZm91bmQgYW5kIGxvYWRlZCBzdWNjZXNzZnVsbHkuIElmIGl0IGNhbid0IGJlIGZvdW5kIGFuZCBsb2FkZWQsIHJldHVybiBCb29sZWFuLkZBTFNFLiAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX09MRF9NRVNTQUdFUyA9ICJSRU1PVkVfT0xEX01FU1NBR0VTIjsgLy8gUmVtb3ZlIGFsbCBNZXNzYWdlcyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGdpdmVuIE9iamVjdHMgaW4gdGhlIGFycmF5LiAvLyROT04tTkxTLTEkCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzYjk0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRWFyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5WYWxpZGF0ZVhtbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5Ob01vZHVsZUZpbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzYvMjAwMCAxMTowODo1NSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEVhclZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIEVBUk1lc3NhZ2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19SRUZfR1JPVVBfTkFNRSA9ICJSRVNfUkVGX0dST1VQX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX0VOVl9SRUZfR1JPVVBfTkFNRSA9ICJSRVNfRU5WX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUkVGX0dST1VQX05BTUUgPSAiU0VSVklDRV9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUkVGX0dST1VQX05BTUUgPSAiRUpCX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ19ST0xFX1JFRl9HUk9VUF9OQU1FID0gIlNFQ19ST0xFX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfUkVGX0dST1VQX05BTUUgPSAiTUVTU0FHRV9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgRUFSRmlsZSBlYXJGaWxlOwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbiBhcHBERDsKLQkKLQkvKioKLQkgKiBSZWxhdGlvbnNoaXBNYXBWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRWFyVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0vLyBFYXJWYWxpZGF0b3IKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbGlkYXRlWE1MIGNvbW1hbmQuCi0JICogCi0JICogQHJldHVybiBDb21tYW5kCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlVmFsaWRhdGVYTUxDb21tYW5kKCkgewotCQlDb21tYW5kIGNtZCA9IG5ldyBWYWxpZGF0ZVhtbENvbW1hbmQoZWFyRmlsZSk7Ci0JCXJldHVybiBjbWQ7Ci0JfS8vIGNyZWF0ZVZhbGlkYXRlWE1MQ29tbWFuZAotCQotCS8qKgotCSAqIDxwPkFuc3dlciB0aGUgaWQgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB3aGljaCBpcwotCSAqIHVzZWQgYnkgdGhlIHJlY2VpdmVyLjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0JCXJldHVybiBFQVJfQ0FURUdPUlk7Ci0JfS8vIGdldEJhc2VOYW1lCi0JCi0JLyoqCi0JICogWE1MIFZhbGlkYXRpb24gbm93IGhhbmRsZXMgdmFsaWRhdGlvbiBvZiBEZXBsb3ltZW50IERlc2NyaXB0b3IKLQkgKiAKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkgIHZhbGlkYXRlTW9kdWxlcyhhcHBERC5nZXRNb2R1bGVzKCkpOwotCSAgdmFsaWRhdGVTZWN1cml0eSgpOwotCSAgdmFsaWRhdGVSZWZzKCk7Ci0JICB2YWxpZGF0ZVdlYkNvbnRleHRzKCk7Ci0JICB2YWxpZGF0ZVNwZWNMZXZlbCgpOwotCX0vLyB2YWxpZGF0ZQotCQotCS8qKgotCSAqIERvZXMgdGhlIHZhbGlkYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWluUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0JCXN1cGVyLnZhbGlkYXRlKGluSGVscGVyLCBpblJlcG9ydGVyKTsKLQkJdHJ5IHsKLQkJCWVhckZpbGUgPSAoRUFSRmlsZSkgX2hlbHBlci5sb2FkTW9kZWwoRUFSX01PREVMX05BTUUpOwotCQkJaWYgKGVhckZpbGUgIT0gbnVsbCkgewotCQkJCWFwcEREID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCWlmIChhcHBERCAhPSBudWxsICYmIGFwcERELmVSZXNvdXJjZSgpICE9IG51bGwgJiYgYXBwREQuZVJlc291cmNlKCkuaXNMb2FkZWQoKSkKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQllbHNlIHsKLQkJCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFQVJfRERfQ0FOTk9UX09QRU5fREQsIG5ldyBTdHJpbmdbXSB7IGdldFJlc291cmNlTmFtZSgpfSk7Ci0JCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfRUFSX0lOVkFMSURfRUFSX0ZJTEUsIG5ldyBTdHJpbmdbXSB7IGdldFJlc291cmNlTmFtZSgpfSk7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2cpOwotCQkJfSAvLyBpZgotCQl9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZ1tdIHBhcmFtID0gbmV3IFN0cmluZ1sxXTsKLQkJCWlmIChlYXJGaWxlICE9IG51bGwpCi0JCQkJcGFyYW1bMF0gPSBlYXJGaWxlLmdldE5hbWUoKTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRUFSX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1JfVUlfLCBwYXJhbSk7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZywgZSk7Ci0JCX0gLy8gdHJ5IAotCX0gLy8gdmFsaWRhdGUKLQotCQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgewotCQlyZXR1cm4gZWFyRmlsZS5nZXRVUkkoKTsKLQl9Ly8gZ2V0UmVzb3VyY2VOYW1lCi0JCi0JLyoqCi0JICogdmFsaWRhdGUgZm9yIGR1cGxpY2F0ZXMgaW4gRUFSIFJvbGVzCi0JICogCi0JICogQHBhcmFtIEVMaXN0IGVhclJvbGVMaXN0IC0gTGlzdCBvZiBlYXIgcm9sZXMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFYXJSb2xlcyhFTGlzdCBlYXJSb2xlTGlzdCkgewotCQlTZXQgcyA9IG5ldyBIYXNoU2V0KGVhclJvbGVMaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUm9sZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUgPSAoU2VjdXJpdHlSb2xlKSBlYXJSb2xlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoIShzLmFkZChzZWN1cml0eVJvbGUuZ2V0Um9sZU5hbWUoKSkpKSB7Ci0JCQkJU3RyaW5nIHJvbGVOYW1lID0gc2VjdXJpdHlSb2xlLmdldFJvbGVOYW1lKCk7Ci0JCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJhbXNbMF0gPSByb2xlTmFtZTsKLQkJCQlhZGRXYXJuaW5nKGdldEJhc2VOYW1lKCksIEVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVMsIHBhcmFtcywgYXBwREQgKTsKLQkJCX0vLyBpZgotCQl9Ly8gZm9yCi0JfS8vIHZhbGlkYXRlRWFyUm9sZXMKLQkKLQkvKioKLQkgKiB2YWxpZGF0ZVJlZnMoV2ViQXBwKSAtIHZhbGlkYXRlIEVKQiAgcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBFamJSZWYgZXJlZiAtIEFuIGVqYiByZWYuCi0JICogQHBhcmFtIFN0aW5nIHVyaSAtIFRoZSB1cmkgb2YgdGhlIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVKQlJlZk1hbmRhdG9yeUVsZW1lbnRzKExpc3QgZWpiUmVmcywgU3RyaW5nIHVyaSkgewotCSBmb3IoaW50IGkgPSAwOyBpIDwgZWpiUmVmcy5zaXplKCk7IGkrKykgewotCSAgRWpiUmVmIGVyZWYgPSAoRWpiUmVmKSBlamJSZWZzLmdldChpKTsKLQkgIFN0cmluZyByZWZOYW1lID0gZXJlZi5nZXROYW1lKCk7Ci0JICBTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzJdOwotCSAgcGFyYW1zWzBdID0gcmVmTmFtZTsKLQkgIHBhcmFtc1sxXSA9IHVyaTsKLQkgIAotCSAgaWYgKChlcmVmLmdldE5hbWUoKS50cmltKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQlhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZOQU1FLCBwYXJhbXMpOwotCSAgfS8vIGlmCi0JICBpZiAoZXJlZi5pc1NldFR5cGUoKSkKLQkgICAge2lmKGVyZWYuZ2V0VHlwZSgpID09IG51bGwgKSAKLQkJICBhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9JTlZBTElEX0VSRUZUWVBFLCBwYXJhbXMpO30KLQkgIGVsc2UgCi0JICAJIGFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEUsIHBhcmFtcyk7Ci0JICAvLyBpZgotCSAgaWYgKChlcmVmLmdldEhvbWUoKSA9PSBudWxsKSB8fCAoZXJlZi5nZXRIb21lKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCWFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUsIHBhcmFtcyk7Ci0JICB9Ly8gaWYKLQkgIGlmICgoZXJlZi5nZXRSZW1vdGUoKSA9PSBudWxsKSB8fCAoZXJlZi5nZXRSZW1vdGUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFLCBwYXJhbXMpOwotCSAgfQotCSB9Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmUgdGhlIGVqYiBpbnRlcmZhY2VzIHRvIGNoZWNrIGlmIHRoZXkgYXJlIHNpbWlsYXIuCi0JICogCi0JICogQHBhcmFtIEVqYlJlZiBlcmVmIC0gVGhlIGVqYiByZWZlcmVuY2UuCi0JICogQHBhcmFtIEVudGVycHJpc2VCZWFuIGVqYiAtIFRoZSBlbnRlcnByaXNlIGJlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbWlsYXJFSkJJbnRlcmZhY2UoRWpiUmVmIGVyZWYsIEVudGVycHJpc2VCZWFuIGVqYikgewotCQkKLQkJaWYoIGVyZWYuaXNMb2NhbCgpICkgewotCQkJaWYoIGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkgPT0gbnVsbCB8fAotCQkJCWVqYi5nZXRMb2NhbEludGVyZmFjZU5hbWUoKSA9PSBudWxsIHx8IAotCQkJCSgoRUpCTG9jYWxSZWYpZXJlZikuZ2V0TG9jYWxIb21lKCkgPT0gbnVsbCAgfHwgCi0JCQkJKChFSkJMb2NhbFJlZillcmVmKS5nZXRMb2NhbCgpID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfS8vIGlmCi0JCQkKLQkJCWJvb2xlYW4gaXNIb21lTG9jYWxPayA9IGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkuZXF1YWxzKCgoRUpCTG9jYWxSZWYpZXJlZikuZ2V0TG9jYWxIb21lKCkpOwotCQkJYm9vbGVhbiBpc1JlbW90ZUxvY2FsT2sgPSAgZWpiLmdldExvY2FsSW50ZXJmYWNlTmFtZSgpLmVxdWFscygoKEVKQkxvY2FsUmVmKWVyZWYpLmdldExvY2FsKCkpOwotCQkgCXJldHVybiBpc0hvbWVMb2NhbE9rICYmIGlzUmVtb3RlTG9jYWxPazsKLQkJfS8vIGlmCi0JCQotCQlpZiggZWpiLmdldEhvbWVJbnRlcmZhY2VOYW1lKCkgPT0gbnVsbCB8fAotCQkJZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKSA9PSBudWxsIHx8IAotCQkJZXJlZi5nZXRIb21lKCkgPT0gbnVsbCAgfHwgCi0JCQllcmVmLmdldFJlbW90ZSgpID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0vLyBpZgotCQkKLQkJYm9vbGVhbiBpc0hvbWVPayA9IGVqYi5nZXRIb21lSW50ZXJmYWNlTmFtZSgpLmVxdWFscyggZXJlZi5nZXRIb21lKCkgKTsKLQkJYm9vbGVhbiBpc1JlbW90ZU9rID0gZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKS5lcXVhbHMoIGVyZWYuZ2V0UmVtb3RlKCkgKTsKLQkJCi0JCXJldHVybiBpc0hvbWVPayAmJiBpc1JlbW90ZU9rOwotCX0vLyBpc1NpbWlsYXJFSkJJbnRlcmZhY2UKLQkJCi0JLyoqCi0JICogdmFsaWRhdGUgZm9yIGR1cGxpY2F0ZXMgaW4gRUFSIFJvbGVzCi0JICogCi0JICogQHBhcmFtIExpc3QgZWpiUmVmcyAtIExpc3Qgb2YgZWpiIHJlZnMuCi0JICogQHBhcmFtIFN0cmluZyB1cmkgLSBUaGUgdXJpIG9mIHRoZSBtb2R1bGUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFSkJSZWZzKExpc3QgZWpiUmVmcywgU3RyaW5nIHVyaSkgewotCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBlamJSZWZzLnNpemUoKTsgaSsrKSB7Ci0JICAJICBFamJSZWYgZXJlZiA9IChFamJSZWYpIGVqYlJlZnMuZ2V0KGkpOwotCQkgIGlmKCBlcmVmICE9IG51bGwgJiYgZXJlZi5nZXRMaW5rKCkgIT0gbnVsbCAmJiBlcmVmLmdldExpbmsoKS5sZW5ndGgoKSA+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+PiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCXJldHVybiB0ZW1wOwotCQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjM2E2MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgzLzkvMjAwMSAzOjM0OjM5IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IsIEoyRUVNZXNzYWdlQ29uc3RhbnRzIHsKLSAgcHJvdGVjdGVkIElSZXBvcnRlciBfcmVwb3J0ZXI7Ci0gIHByb3RlY3RlZCBJVmFsaWRhdGlvbkNvbnRleHQgX2hlbHBlcjsKLQotCXB1YmxpYyBKMkVFVmFsaWRhdG9yKCkKLQl7Ci0gIAkgICAgaW5pdGlhbGl6ZSgpOwotCX0KLS8qKgotICogPHA+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+Y2hhbmdlZEZpbGVzPC9jb2RlPiBpcyBhbiBhcnJheSBvZiBmaWxlIG5hbWVzIHdoaWNoIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB2YWxpZGF0aW9uLiAKLSAqIElmIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4gaXMgbnVsbCwgb3IgaWYgaXQgaXMgYW4gZW1wdHkgYXJyYXksIHRoZW4gYSBmdWxsIGJ1aWxkCi0gKiBpcyBwZXJmb3JtZWQuIE90aGVyd2lzZSwgdmFsaWRhdGlvbiBvbiBqdXN0IHRoZSBmaWxlcyBsaXN0ZWQgaW4gdGhlIFZlY3RvciBpcyBwZXJmb3JtZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBpbkhlbHBlciwgSVJlcG9ydGVyIGluUmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQotICBfaGVscGVyID0gaW5IZWxwZXI7Ci0gIF9yZXBvcnRlciA9IGluUmVwb3J0ZXI7Ci0gIGlmICgoaW5IZWxwZXIgPT0gbnVsbCkgfHwgKGluUmVwb3J0ZXIgPT0gbnVsbCkpIHsKLQlyZXR1cm47Ci0gIH0KLX0KLS8qKgotICAgKiBWYWxpZGF0ZSBFSkIgcmVmZXJlbmNlcy4KLSAgICovCi1wcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUVKQlJlZk1hbmFkYXRvcnlFbGVtZW50cyhFamJSZWYgZXJlZiwgU3RyaW5nIG93bmVyTmFtZSkgewotCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1syXTsKLQlwYXJtc1swXSA9IGVyZWYuZ2V0TmFtZSgpOwotCXBhcm1zWzFdID0gb3duZXJOYW1lOwotCQotCWlmICgoZXJlZi5nZXROYW1lKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGTkFNRSwgcGFybXMsIGVyZWYpOwotCWlmIChlcmVmLmlzU2V0VHlwZSgpKSB7Ci0JCWlmIChlcmVmLmdldFR5cGUoKSA9PSBudWxsKQotCQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfSU5WQUxJRF9FUkVGVFlQRSwgcGFybXMpOwotCX0gZWxzZQotCQlhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZUWVBFLCBwYXJtcyk7Ci0JCQotCVN0cmluZyByZWZIb21lID0gZXJlZi5nZXRIb21lKCk7Ci0JaWYgKChyZWZIb21lID09IG51bGwpIHx8IChyZWZIb21lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGSE9NRSwgcGFybXMsIGVyZWYpOwotCQkKLQlpZiAoKGVyZWYuZ2V0UmVtb3RlKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0UmVtb3RlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKQotCQlhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZSRU1PVEUsIHBhcm1zLCBlcmVmKTsKLX0KLS8qKgotICAgKiBWYWxpZGF0ZSBmb3IgZHVwbGljYXRlcyBpbiBFQVIgUm9sZXMuCi0gICAqLwotcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZXNvdXJjZVJlZnMoTGlzdCByZXNvdXJjZVJlZnMpIHsKLQotICBpbnQgbnVtUmVmcyA9IHJlc291cmNlUmVmcy5zaXplKCk7Ci0gIFNldCByZWZTZXQgPSBuZXcgSGFzaFNldChudW1SZWZzKTsKLQotICBmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgbnVtUmVmczsgcmVmTm8rKykgewotCVN0cmluZyByZWZOYW1lID0gKChSZXNvdXJjZVJlZkltcGwpIChyZXNvdXJjZVJlZnMuZ2V0KHJlZk5vKSkpLmdldE5hbWUoKTsKLQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JcGFybXNbMF0gPSByZWZOYW1lOwotCWlmICghKHJlZlNldC5hZGQocmVmTmFtZSkpKQotCSAgYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX0RVUExJQ0FURV9SRVNSRUYsIHBhcm1zLCByZXNvdXJjZVJlZnMuZ2V0KHJlZk5vKSk7Ci0gIH0KLX0KLS8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZXhpc3RhbmNlIG9mIFdlYiBSb2xlcyB3aXRoaW4gdGhlIEVBUiBSb2xlcyBhbmQKLSAgICogZHVwbGljYXRlcyBpbiBXZWIgUm9sZXMuCi0gICAqLwotcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVXRUJSb2xlc1dpdGhFQVJSb2xlcyhFTGlzdCBlYXJSb2xlTGlzdCwgRUxpc3Qgd2FyUm9sZXMpIHsKLSAgaW50IG51bVJvbGVzID0gd2FyUm9sZXMuc2l6ZSgpOwotCi0gIC8vIFRGQiBUaGlzIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGEgJ3NtYWxsJyBsaXN0IG9mIHdhclJvbGVzLgotICAvLyBJZiAnd2FyUm9sZXMnIGdldHMgdG9vIGJpZyB0aGVuIGFub3RoZXIgaW1wbGVtZW50YXRpb24KLSAgLy8gd2lsbCBiZSBuZWNlc3NhcnkuCi0KLSAgZm9yIChpbnQgcm9sZU5vID0gMDsgcm9sZU5vIDwgbnVtUm9sZXM7IHJvbGVObysrKSB7Ci0JU2VjdXJpdHlSb2xlSW1wbCBuZXh0Um9sZSA9IChTZWN1cml0eVJvbGVJbXBsKSAod2FyUm9sZXMuZ2V0KHJvbGVObykpOwotCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQlwYXJtc1swXSA9IG5leHRSb2xlLmdldFJvbGVOYW1lKCk7Ci0JaWYgKCEoZWFyUm9sZUxpc3QuY29udGFpbnMobmV4dFJvbGUpKSkKLQkgIGFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRSwgcGFybXMsIG5leHRSb2xlKTsKLSAgfQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzE1NGMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXNzYWdlRHJpdmVuQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFCZWFuQ2xhc3NWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX01FU1NBR0VfQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5tYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOLCBKQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0FCU1RSQUNUID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgSVNfUkVNT1RFID0gTkVJVEhFUjsKLQkKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0ZJTkFMID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9QVUJMSUMgPSB0cnVlOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtPTk1FU1NBR0UsIENPTlNUUlVDVE9SX05PUEFSTSwgRUpCQ1JFQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RklOQUxJWkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgT05NRVNTQUdFLCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEVfTk9QQVJNLCBFSkJDUkVBVEUsIEVKQlJFTU9WRV9OT1BBUk0sIEZJTkFMSVpFX05PUEFSTX07Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX29uTWVzc2FnZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX29uTWVzc2FnZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkNyZWF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX3NldEVudGl0eUNvbnRleHQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQWN0aXZhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJBY3RpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkxvYWQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJMb2FkK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiU3RvcmUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJTdG9yZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjEwMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNywgbmV3IFN0cmluZ1tde0NIS0oyNDI3K0JFWFQsIENIS0oyNDI3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI4LCBuZXcgU3RyaW5nW117Q0hLSjI0MjgrQkVYVCwgQ0hLSjI0MjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0NStCRVhULCBDSEtKMjQ0NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0NiwgbmV3IFN0cmluZ1tde0NIS0oyNDQ2K0JFWFQsIENIS0oyNDQ2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQ3LCBuZXcgU3RyaW5nW117Q0hLSjI0NDcrQkVYVCwgQ0hLSjI0NDcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDFfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDFfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAxX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDFfZWpiUmVtb3ZlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAxX29uTWVzc2FnZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAxX29uTWVzc2FnZStCRVhULCBDSEtKMjUwMV9vbk1lc3NhZ2UrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MiwgbmV3IFN0cmluZ1tde0NIS0oyNDkyK0JFWFQsIENIS0oyNDkyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkzLCBuZXcgU3RyaW5nW117Q0hLSjI0OTMrQkVYVCwgQ0hLSjI0OTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NCtCRVhULCBDSEtKMjQ5NCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19vbk1lc3NhZ2UsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19vbk1lc3NhZ2UrQkVYVCwgQ0hLSjI1MDNfb25NZXNzYWdlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUmVtb3ZlK0JFWFQsIENIS0oyNTA1X2VqYlJlbW92ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9vbk1lc3NhZ2UsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9vbk1lc3NhZ2UrQkVYVCwgQ0hLSjI1MDVfb25NZXNzYWdlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93RWpiQ3JlYXRlUmV0dXJuVHlwZVJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIG1ldGhvZC5pc1ZvaWQoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLlZPSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgT05NRVNTQUdFKSA9PSBPTk1FU1NBR0UpIHsKLQkJCXZhbGlkYXRlT25NZXNzYWdlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXZhbGlkYXRlRWpiUmVtb3ZlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0FwcGxpY2F0aW9uRXhjZXB0aW9uKG1ldGhvZCwgYmVhbikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMV9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJSZW1vdmVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzQXBwbGljYXRpb25FeGNlcHRpb24obWV0aG9kLCBiZWFuKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAxX2VqYlJlbW92ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kRXhjZXB0aW9ucygpIHsKLQkJLy8gRG9uJ3QgY2hlY2sgZm9yIENyZWF0ZUV4Y2VwdGlvbgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNob3VsZEJlU3VwZXJUeXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHx8IChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpKXsJCQotCQkJSmF2YUNsYXNzIGpjbGFzcyA9ICgoTWVzc2FnZURyaXZlbiliZWFuKS5nZXRNZXNzYWdpbmdUeXBlKCk7Ci0JCQlpZiggamNsYXNzICE9IG51bGwgKXsKLQkJCQlpZiAoamNsYXNzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFTElTVEVORVIpKXsKLQkJCQkJc3VwZXIudmFsaWRhdGVTaG91bGRCZVN1cGVyVHlwZXModmMsYmVhbixjbGF6eik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uZWpiLmVqYjIwcnVsZXMuaW1wbC5BVHlwZVZSdWxlI3ZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4sIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotICAgIAlpZigoYmVhbi5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB8fCAoYmVhbi5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEKSl7CQkKLQkJCUphdmFDbGFzcyBqY2xhc3MgPSAoKE1lc3NhZ2VEcml2ZW4pYmVhbikuZ2V0TWVzc2FnaW5nVHlwZSgpOwotCQkJaWYoIGpjbGFzcyAhPSBudWxsICl7Ci0JCQkJaWYgKGpjbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSKSl7Ci0JCQkJICAgIHN1cGVyLnZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAKLSAgICB9Ci0JcHVibGljIHZvaWQgdmFsaWRhdGVPbk1lc3NhZ2VNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDM5NiA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTUuNy40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk3ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxNS43LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk4ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTUuNy40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk5ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gUmVhZCBzZWN0aW9uIDE1LjcuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDQwMCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuIFJlYWQgc2VjdGlvbiAxNS43LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIW1ldGhvZC5pc1ZvaWQoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA1X29uTWVzc2FnZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0FwcGxpY2F0aW9uRXhjZXB0aW9uKG1ldGhvZCwgYmVhbikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMV9vbk1lc3NhZ2UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfb25NZXNzYWdlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjYmY5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlVXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fTUVTU0FHRV9JRCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZVV0aWxpdHkgaW5zdCA9IG51bGw7Ci0KLQlwcml2YXRlIE1lc3NhZ2VVdGlsaXR5KCkgewotCQkvL0RlZmF1bHQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlVXRpbGl0eSBnZXRVdGlsaXR5KCkgewotCQlpZihpbnN0ID09IG51bGwpIHsKLQkJCWluc3QgPSBuZXcgTWVzc2FnZVV0aWxpdHkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBOYW1lKE9iamVjdCB0YXJnZXRQYXJlbnQpIHsKLQkJaWYodGFyZ2V0UGFyZW50ID09IG51bGwpIHsKLQkJCS8vIE5vIGNvbnRleHQgdG8gYXNzb2NpYXRlIHRoZSBtZXNzYWdlIHdpdGgKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvLyBTbyBmYXIsIHRoZSBvbmx5IHRhcmdldCBwYXJlbnQgd2hpY2ggaXMgdXNlZCBhcyBhIGdyb3VwIG5hbWUgaXMgdGhlIEVudGVycHJpc2VCZWFuCi0JCWlmKHRhcmdldFBhcmVudCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSB7Ci0JCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKXRhcmdldFBhcmVudDsKLQkJCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlpZihiZWFuLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGJlYW4uZ2V0TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuICgoWE1JUmVzb3VyY2UpYmVhbi5lUmVzb3VyY2UoKSkuZ2V0SUQoYmVhbik7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1lc3NhZ2VJZChPYmplY3QgbWVzc2FnZU51bWJlciwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYobWVzc2FnZU51bWJlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTk9fTUVTU0FHRV9JRDsKLQkJfQotCQkKLQkJTWFwIGlkcyA9IHJ1bGUuZ2V0TWVzc2FnZUlkcygpOwotCQlpZigoaWRzID09IG51bGwpIHx8IChpZHMuc2l6ZSgpID09IDApKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZU51bWJlci50b1N0cmluZygpOwotCQl9Ci0JCQotCQlpbnQgaW5kZXggPSAtMTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSAoU3RyaW5nW10paWRzLmdldChtZXNzYWdlTnVtYmVyKTsKLQkJaWYocmVzdWx0ID09IG51bGwpIHsKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSBpZihyZXN1bHQubGVuZ3RoID09IDEpIHsKLQkJCWlmKHJlc3VsdFswXS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbWVzc2FnZU51bWJlci50b1N0cmluZygpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdFswXTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIEJ5IGNvbnZlbnRpb24sIHRoaXMgaXMgdGhlIG9yZGVyIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBTdHJpbmdbXQotCQkJaWYoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJCWluZGV4ID0gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCWluZGV4ID0gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQlpbmRleCA9IDI7Ci0JCQl9Ci0JCQllbHNlIGlmKGJlYW4uaXNNZXNzYWdlRHJpdmVuKCkpIHsKLQkJCQlpbmRleCA9IDM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3aGF0IHRoZSBoZWNrIGlzIGl0PwotCQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCi0JCQlpZigocmVzdWx0Lmxlbmd0aCA8PSBpbmRleCkgfHwgKHJlc3VsdFtpbmRleF0uZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiByZXN1bHRbaW5kZXhdOwotCQl9Ci0JfQotCQotCS8qCi0JICogVXNlIHRoaXMgbWV0aG9kIHdoZW4gdGhlIG1lc3NhZ2UgaXMgbm90IHJlZ2lzdGVyZWQgb24gYSBtZXRob2QuCi0JICovCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWVzc2FnZUlkKE9iamVjdCBtZXNzYWdlTnVtYmVyLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihtZXNzYWdlTnVtYmVyID09IG51bGwpIHsKLQkJCXJldHVybiBOT19NRVNTQUdFX0lEOwotCQl9Ci0JCQotCQlNYXAgaWRzID0gcnVsZS5nZXRNZXNzYWdlSWRzKCk7Ci0JCWlmKChpZHMgPT0gbnVsbCkgfHwgKGlkcy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHJlc3VsdCA9IChTdHJpbmdbXSlpZHMuZ2V0KG1lc3NhZ2VOdW1iZXIpOwotCQlpZigocmVzdWx0ID09IG51bGwpIHx8IChyZXN1bHQubGVuZ3RoID09IDApIHx8IChyZXN1bHRbMF0uZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQkKLQkvKgotCSAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIHRoZSBtZXNzYWdlIGlzIHJlZ2lzdGVyZWQgb24gYSBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlSWQoT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIElWYWxpZGF0aW9uUnVsZSBydWxlLCBib29sZWFuIGlzTWV0aG9kT25DbGFzcykgewotCQlpZihtZXNzYWdlTnVtYmVyID09IG51bGwpIHsKLQkJCXJldHVybiBOT19NRVNTQUdFX0lEOwotCQl9Ci0JCQotCQlNYXAgaWRzID0gcnVsZS5nZXRNZXNzYWdlSWRzKCk7Ci0JCWlmKChpZHMgPT0gbnVsbCkgfHwgKGlkcy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIG1lc3NhZ2VzID0gKFN0cmluZ1tdKWlkcy5nZXQobWVzc2FnZU51bWJlcik7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZihtZXNzYWdlcyAhPSBudWxsKSB7Ci0JCQlpZihpc01ldGhvZE9uQ2xhc3MgJiYgbWVzc2FnZXMubGVuZ3RoID09IDIpIHsKLQkJCQlyZXN1bHQgPSBtZXNzYWdlc1sxXTsKLQkJCX0KLQkJCWVsc2UgaWYgKG1lc3NhZ2VzLmxlbmd0aCA+PSAxKSB7Ci0JCQkJcmVzdWx0ID0gbWVzc2FnZXNbMF07Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbWVzc2FnZU51bWJlci50b1N0cmluZygpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIGludCBzZXZlcml0eSwgU3RyaW5nIGlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gdmMuZ2V0TWVzc2FnZSgpOwotCQltZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQkJbWVzc2FnZS5zZXRJZChpZCk7Ci0JCW1lc3NhZ2Uuc2V0UGFyYW1zKHBhcm1zKTsKLQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QodGFyZ2V0KTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotCS8qKiAKLQkgKiBGb3IgdXNlIG9ubHkgYnkgdGhlIEREIFZSdWxlcy4KLQkgKi8KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQkphciB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIFNlY3VyaXR5Um9sZSB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIFNlY3VyaXR5Um9sZVJlZiB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIE1ldGhvZEVsZW1lbnQgdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBNZXRob2RUcmFuc2FjdGlvbiB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIE1ldGhvZFBlcm1pc3Npb24gdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFSkJSZWxhdGlvbnNoaXBSb2xlIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQlJlbGF0aW9uIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgQXNzZW1ibHlEZXNjcmlwdG9yIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCS8qKiAKLQkgKiBGb3IgdXNlIG9ubHkgYnkgdGhlIEREIFZSdWxlcy4KLQkgKi8KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQkphciB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgTWV0aG9kRWxlbWVudCB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRUpCUmVsYXRpb25zaGlwUm9sZSB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgU2VjdXJpdHlSb2xlUmVmIHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFSkJSZWxhdGlvbiB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgT2JqZWN0IHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmdbXSBwYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBwYXJtcywgdGFyZ2V0LCBnZXRHcm91cE5hbWUoYmVhbikpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIGJlYW4sIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCBiZWFuLCBnZXRHcm91cE5hbWUoYmVhbikpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBiZWFuLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIGJlYW4sIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgY2xhenosIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIFN0cmluZ1tdIGFkZGl0aW9uYWxQYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBhZGRpdGlvbmFsUGFybXMsIGNsYXp6LCBnZXRHcm91cE5hbWUoYmVhbikpOwotCX0KLQkKLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgYmVhbiwgY2xhenosIHJ1bGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIG51bGwsIGNsYXp6LCBtZXRob2QsIG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBtZXRob2QpLCBnZXRHcm91cE5hbWUoYmVhbiksIHJ1bGUpOwotCX0KLQkJCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIFN0cmluZ1tdIGFkZGl0aW9uYWxQYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgYmVhbiwgY2xhenosIGFkZGl0aW9uYWxQYXJtcywgcnVsZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgYWRkaXRpb25hbFBhcm1zLCBjbGF6eiwgbWV0aG9kLCBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkub25DbGFzcyhjbGF6eiwgbWV0aG9kKSwgZ2V0R3JvdXBOYW1lKGJlYW4pLCBydWxlKTsKLQl9Ci0JCQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBiZWFuLCBjbGF6eiwgcnVsZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgbnVsbCwgY2xhenosIGZpZWxkLCBmaWVsZC5nZXROYW1lKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBmaWVsZCksIGdldEdyb3VwTmFtZShiZWFuKSwgcnVsZSk7Ci0JfQotCQkKLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIFN0cmluZ1tdIGFkZGl0aW9uYWxQYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBiZWFuLCBjbGF6eiwgYWRkaXRpb25hbFBhcm1zLCBydWxlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBhZGRpdGlvbmFsUGFybXMsIGNsYXp6LCBmaWVsZCwgZmllbGQuZ2V0TmFtZSgpLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkub25DbGFzcyhjbGF6eiwgZmllbGQpLCBnZXRHcm91cE5hbWUoYmVhbiksIHJ1bGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIFN0cmluZ1tdIGFkZGl0aW9uYWxQYXJtcywgSmF2YUNsYXNzIGNsYXp6LCBFT2JqZWN0IGZpZWxkT3JNZXRob2QsIFN0cmluZyBmaWVsZE9yTWV0aG9kTmFtZSwgYm9vbGVhbiBpc01ldGhvZE9uQ2xhc3MsIFN0cmluZyBncm91cE5hbWUsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCWlmKGZpZWxkT3JNZXRob2QgPT0gbnVsbCkgewotCQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgYWRkaXRpb25hbFBhcm1zLCBjbGF6eiwgZ3JvdXBOYW1lKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gcGFybXMgPSBudWxsOwotCQlFT2JqZWN0IHRhcmdldCA9IG51bGw7Ci0JCWlmKGlzTWV0aG9kT25DbGFzcykgewotCQkJLy8gbGVhdmUgcGFybXMgbnVsbCBzaW5jZSBubyBwYXJtcyBhcmUgbmVlZGVkCi0JCQl0YXJnZXQgPSBmaWVsZE9yTWV0aG9kOwotCQkJcGFybXMgPSBhZGRpdGlvbmFsUGFybXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihhZGRpdGlvbmFsUGFybXMgPT0gbnVsbCkgewotCQkJCXBhcm1zID0gbmV3IFN0cmluZ1tde2ZpZWxkT3JNZXRob2ROYW1lfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcm1zID0gbmV3IFN0cmluZ1thZGRpdGlvbmFsUGFybXMubGVuZ3RoICsgMV07Ci0JCQkJcGFybXNbMF0gPSBmaWVsZE9yTWV0aG9kTmFtZTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFkZGl0aW9uYWxQYXJtcywgMCwgcGFybXMsIDEsIGFkZGl0aW9uYWxQYXJtcy5sZW5ndGgpOwotCQkJfQotCQkJdGFyZ2V0ID0gY2xheno7Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSwgaXNNZXRob2RPbkNsYXNzKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgZ3JvdXBOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWV0aG9kVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01ldGhvZFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0MDhiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWV0aG9kVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZFV0aWxpdHkgewotCXByaXZhdGUgc3RhdGljIE1ldGhvZFV0aWxpdHkgX2luc3QgPSBudWxsOwotCXByaXZhdGUgbG9uZ1tdIF9tZXRob2RUeXBlSW5kZXg7Ci0JcHJpdmF0ZSBJTWV0aG9kVHlwZVtdIF9tZXRob2RUeXBlczsKLQlwcml2YXRlIGxvbmdbXSBfZmllbGRUeXBlSW5kZXg7Ci0JcHJpdmF0ZSBJRmllbGRUeXBlW10gX2ZpZWxkVHlwZXM7Ci0JCi0JcHJpdmF0ZSBNZXRob2RVdGlsaXR5KCkgewotCQlidWlsZFR5cGVMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kVXRpbGl0eSBnZXRVdGlsaXR5KCkgewotCQlpZihfaW5zdCA9PSBudWxsKSB7Ci0JCQlfaW5zdCA9IG5ldyBNZXRob2RVdGlsaXR5KCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQkKLQlwcm90ZWN0ZWQgSU1ldGhvZFR5cGVbXSBnZXRNZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIF9tZXRob2RUeXBlczsKLQl9Ci0KLQlwdWJsaWMgSUZpZWxkVHlwZSBnZXRGaWVsZFR5cGUobG9uZyB0eXBlKSB7Ci0JCWludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goX2ZpZWxkVHlwZUluZGV4LCB0eXBlKTsKLQkJaWYoaW5kZXggPiBfZmllbGRUeXBlcy5sZW5ndGgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihfZmllbGRUeXBlc1tpbmRleF0uZ2V0SWQoKSAhPSB0eXBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIF9maWVsZFR5cGVzW2luZGV4XTsKLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFR5cGUgZ2V0TWV0aG9kVHlwZShsb25nIHR5cGUpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChfbWV0aG9kVHlwZUluZGV4LCB0eXBlKTsKLQkJaWYoaW5kZXggPiBfbWV0aG9kVHlwZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYoaW5kZXggPCAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYoX21ldGhvZFR5cGVzW2luZGV4XS5nZXRJZCgpICE9IHR5cGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gX21ldGhvZFR5cGVzW2luZGV4XTsKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0TWV0aG9kVHlwZUlkKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzLCBJRUpCVHlwZSBydWxlKSB7Ci0JCUlNZXRob2RUeXBlIG1UeXBlID0gZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgcnVsZSk7Ci0JCWlmKG1UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBydWxlLmdldERlZmF1bHRNZXRob2RUeXBlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBtVHlwZS5nZXRJZCgpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldEZpZWxkVHlwZUlkKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIElFSkJUeXBlIHJ1bGUpIHsKLQkJSUZpZWxkVHlwZSBtVHlwZSA9IGdldEZpZWxkVHlwZShiZWFuLCBjbGF6eiwgZmllbGQsIHJ1bGUpOwotCQlpZihtVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVYQ0xVREVEX0ZJRUxEOwotCQl9Ci0JCQotCQlyZXR1cm4gbVR5cGUuZ2V0SWQoKTsKLQl9Ci0JCi0JcHVibGljIElGaWVsZFR5cGUgZ2V0RmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIElFSkJUeXBlIHJ1bGUpIHsKLQkJSUZpZWxkVHlwZVtdIGtub3duRmllbGRUeXBlcyA9IF9maWVsZFR5cGVzOwotCQlpZihrbm93bkZpZWxkVHlwZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWZvcihpbnQgaT0wOyBpPGtub3duRmllbGRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJSUZpZWxkVHlwZSBtdCA9IGtub3duRmllbGRUeXBlc1tpXTsKLQkJCWlmKG10ID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYobXQuaXNGaWVsZFR5cGUoYmVhbiwgY2xhenosIGZpZWxkKSkgewotCQkJCXJldHVybiBtdDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gSWYgaXQncyBub3Qgb25lIG9mIHRoZSByZWNvZ25pemVkIG1ldGhvZHMsIHdoaWNoIGR5bmFtaWNhbGx5LW5hbWVkCi0JCS8vIG1ldGhvZCB0eXBlIGlzIGl0PwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElNZXRob2RUeXBlIGdldE1ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMsIElFSkJUeXBlIHJ1bGUpIHsKLQkJbG9uZ1tdIGtub3duTWV0aG9kVHlwZXMgPSBydWxlLmdldEtub3duTWV0aG9kVHlwZXMoKTsKLQkJaWYoa25vd25NZXRob2RUeXBlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8a25vd25NZXRob2RUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJSU1ldGhvZFR5cGUgbXQgPSBnZXRNZXRob2RUeXBlKGtub3duTWV0aG9kVHlwZXNbaV0pOwotCQkJaWYobXQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihtdC5pc0RlZmF1bHRUeXBlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYobXQuaXNNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgewotCQkJCXJldHVybiBtdDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gSWYgaXQncyBub3Qgb25lIG9mIHRoZSByZWNvZ25pemVkIG1ldGhvZHMsIHdoaWNoIGR5bmFtaWNhbGx5LW5hbWVkCi0JCS8vIG1ldGhvZCB0eXBlIGlzIGl0PwotCQlyZXR1cm4gZ2V0TWV0aG9kVHlwZShydWxlLmdldERlZmF1bHRNZXRob2RUeXBlKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUeXBlTGlzdCgpIHsKLQkJaW50IHR5cGVDb3VudCA9IDI5OyAvLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgaWRlbnRpZmlhYmxlIG1ldGhvZHMgaW4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzCi0JCV9tZXRob2RUeXBlSW5kZXggPSBuZXcgbG9uZ1t0eXBlQ291bnRdOwotCQlfbWV0aG9kVHlwZXMgPSBuZXcgSU1ldGhvZFR5cGVbdHlwZUNvdW50XTsKLQkJaW50IGNvdW50ID0gMDsKLQkJCi0JCWludCBmaWVsZFR5cGVDb3VudCA9IDE7IC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBpZGVudGlmaWFibGUgZmllbGRzIGluIElNZXRob2RBbmRGaWVsZENvbnN0YW50cwotCQlfZmllbGRUeXBlSW5kZXggPSBuZXcgbG9uZ1tmaWVsZFR5cGVDb3VudF07Ci0JCV9maWVsZFR5cGVzID0gbmV3IElGaWVsZFR5cGVbZmllbGRUeXBlQ291bnRdOwotCQlpbnQgZmllbGRDb3VudCA9IDA7Ci0JCQotCQkvLyBUaGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIGxvbmdbXSBpcyBlcXVhbCB0byB0aGUKLQkJLy8gaW5kZXggb2YgdGhlIElNZXRob2RUeXBlIGluIHRoZSBJTWV0aG9kVHlwZVtdLiBCeSB1c2luZwotCQkvLyB0aGlzIHRlY2huaXF1ZSBpbnN0ZWFkIG9mIGEgSGFzaE1hcCwgd2UgZG9uJ3QgbmVlZCB0bwotCQkvLyBjcmVhdGUgYW4gSW50ZWdlciBldmVyeSB0aW1lIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSAKLQkJLy8gSU1ldGhvZFR5cGUuCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkFDQ0VTU09SOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkFDQ0VTU09SOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyB0aGlzIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGNhbGxlZCAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2FjYzsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBleGlzdHMKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQUNDRVNTT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkFDQ0VTU09SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkFDQ0VTU09SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkFDQ0VTU09SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQlVTSU5FU1M7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQlVTSU5FU1M7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCS8vIE5ldmVyIGNoZWNrIHRvIHNlZSBpZiBhIGJ1c2luZXNzIG1ldGhvZCBpcyBtaXNzaW5nCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkJVU0lORVNTOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIGEgYnVzaW5lc3MgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQlVTSU5FU1M6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfYnVzOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9idXNpbmVzczsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfYnVzaW5lc3M7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJLy8gSXQncyBhIGJ1c2luZXNzIG1ldGhvZCBpZiBpdCdzIGV4cG9zZWQgb24gdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UuCi0JCQkJLy8gSEFDSyAuLi4gZGVwZW5kcyBvbiB0aGUgZmFjdCB0aGF0IEFCZWFuQ2xhc3NWUnVsZSwgYW5kIGl0cyBzdWJ0eXBlcywgYXJlIHRoZSBvbmx5IGNsYXNzZXMgdGhhdCB3aWxsIGV2ZXIgaGF2ZSBhIEJVU0lORVNTIG1ldGhvZC4KLQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgQUJlYW5DbGFzc1ZSdWxlLmdldFJlbW90ZUNvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2QuZ2V0TmFtZSgpLCBBQmVhbkNsYXNzVlJ1bGUuZ2V0UmVtb3RlQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gaW50ZXJuYWwgaGVscGVyIG1ldGhvZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DTElOSVQ7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ0xJTklUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjbGluaXQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCS8vIE5ldmVyIGNoZWNrIHRvIHNlZSBpZiA8Y2xpbml0PiBpcyBtaXNzaW5nCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ0xJTklUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDTElOSVQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoIjxjbGluaXQ+IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQkJCi0JCS8vIEJlIGNhcmVmdWwgdG8ga2VlcCB0aGUgb3JkZXIgb2YgdGhlc2UgZGVjbGFyYXRpb25zIHRoZSBzYW1lIGFzIHRoZXkgYXJlIGluIAotCQkvLyBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuIEVhY2ggbWV0aG9kIHR5cGUgaXMgYW4gYXNjZW5kaW5nIG51bWJlciwgYW5kIGlmIHRoZXkKLQkJLy8gZ28gb3V0IG9mIG9yZGVyLCB0aGUgYmluYXJ5IHNlYXJjaCBjYW4ndCBmaW5kIHRoZSBtZXRob2QgdHlwZS4KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1I7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1I7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gY2xhenouZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9jb25zdHI7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ09OU1RSVUNUT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiBjbGF6ei5nZXROYW1lKCkgKyAiKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2NvbnN0cjsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDT05TVFJVQ1RPUl9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDT05TVFJVQ1RPUl9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ09OU1RSVUNUT1JfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJLy8gVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBubyBwYXJhbWV0ZXJzLiBSZWFkIHNlY3Rpb24gNy4xMC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQkJCQlpZihtZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DUkVBVEU7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ1JFQVRFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjcmVhdGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2NyZWF0ZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9jcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2NyZWF0ZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ1JFQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DUkVBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjcmVhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfY3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNSRUFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2NyZWF0ZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCQUNUSVZBVEVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkFDVElWQVRFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiQWN0aXZhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQWN0aXZhdGU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQUNUSVZBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJBQ1RJVkFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQUNUSVZBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkFDVElWQVRFX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJBQ1RJVkFURSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkNSRUFURTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJDUkVBVEU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImVqYkNyZWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQ3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkNSRUFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9lamJDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCQ1JFQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJDUkVBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJDcmVhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQ3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkNSRUFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiQ3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQ1JFQVRFX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJDUkVBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpKSB7Ci0JCQkJCWlmKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJGSU5EOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkZJTkQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYkZpbmQiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJGaW5kOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZWpiRmluZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYkZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJGSU5EOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfZWpiRmluZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkZJTkQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkZJTkRCWVBSSU1BUllLRVk7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCRklOREJZUFJJTUFSWUtFWTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJlamJGaW5kQnlQcmltYXJ5S2V5KCIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHBrTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYoYmVhbiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCQlKYXZhQ2xhc3MgcGsgPSAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQkJCXBrTmFtZSA9ICgocGsgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVkgOiBway5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKHBrTmFtZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXk7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCRklOREJZUFJJTUFSWUtFWTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJGaW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCRklOREJZUFJJTUFSWUtFWTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJGSU5EQllQUklNQVJZS0VZOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkJGSU5EKSkgewotCQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJGSU5EQllQUklNQVJZS0VZKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJIT01FOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYkhvbWUiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJIb21lOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkhPTUU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiSG9tZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkhPTUU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9lamJIb21lOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCSE9NRSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCTE9BRF9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCTE9BRF9OT1BBUk07Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImVqYkxvYWQoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiTG9hZDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJMT0FEOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJMT0FEOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkxPQUQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCTE9BRDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJMT0FEKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUEFTU0lWQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJQQVNTSVZBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJQYXNzaXZhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiUGFzc2l2YXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBBU1NJVkFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUEFTU0lWQVRFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBBU1NJVkFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJQQVNTSVZBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUEFTU0lWQVRFKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUE9TVENSRUFURTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJQT1NUQ1JFQVRFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJQb3N0Q3JlYXRlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQkvLyBDYW4gb25seSBkeW5hbWljYWxseSBjaGVjayBpZiBlamJQb3N0Q3JlYXRlIGlzIG1pc3NpbmcsIAotCQkJCS8vIGJhc2VkIG9uIHdoYXQgdHlwZSBvZiBlamJDcmVhdGUgbWV0aG9kcyBleGlzdC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUE9TVENSRUFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBPU1RDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYlBvc3RDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJQT1NUQ1JFQVRFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBPU1RDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlJFTU9WRV9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUkVNT1ZFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiUmVtb3ZlKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlJlbW92ZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJSRU1PVkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlJFTU9WRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJSRU1PVkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUkVNT1ZFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlJFTU9WRSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlNFTEVDVDsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJTRUxFQ1Q7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYlNlbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlNlbGVjdDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZWpiU2VsZWN0OwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNFTEVDVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJTRUxFQ1Q6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCU0VMRUNUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQlNFTEVDVCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCU1RPUkVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlNUT1JFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiU3RvcmUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiU3RvcmU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCU1RPUkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlNUT1JFKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRVFVQUxTOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVRVUFMUzsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZXF1YWxzKE9iamVjdCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VxdWFsczsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFUVVBTFM6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVRVUFMUzo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFUVVBTFM6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRVFVQUxTOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FUVVBTFMpKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUphdmFIZWxwZXJzIG9iamVjdCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBiZWFuKTsKLQkJCQkJCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IHBhcm1bMF0uZ2V0SmF2YVR5cGUoKTsKLQkJCQkJCQkKLQkJCQkJCQlpZihvYmplY3QuZXF1YWxzKHBhcm1UeXBlKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkQ7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklORDsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAiZmluZCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2ZpbmQ7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklORDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19maW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSU5EQllQUklNQVJZS0VZOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkRCWVBSSU1BUllLRVk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImZpbmRCeVByaW1hcnlLZXkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXk7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19maW5kOwotCQkJfSAKLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9maW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkgewotCQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklOQUxJWkVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkFMSVpFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZmluYWxpemUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJLy8gTmV2ZXIgY2hlY2sgdG8gc2VlIGlmIGZpbmFsaXplIGlzIG1pc3NpbmcKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZmluYWxpemU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKSB7Ci0JCQkJCWlmKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0wKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkhBU0hDT0RFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5IQVNIQ09ERV9OT1BBUk07Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImhhc2hDb2RlKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2hhc2hDb2RlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkhBU0hDT0RFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9IQVNIQ09ERSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5IT01FOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImhvbWUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2hvbWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiSE9NRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19ob21lOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2hvbWU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2hvbWU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5PTk1FU1NBR0U7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuT05NRVNTQUdFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJvbk1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX29uTWVzc2FnZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJPTk1FU1NBR0U6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIk9OTUVTU0FHRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJPTk1FU1NBR0U6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiT05NRVNTQUdFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX09OTUVTU0FHRSkpIHsKLQkJCQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtcy5sZW5ndGggPT0gMSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlKYXZhSGVscGVycyBqbXNNZXNzYWdlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFLCBiZWFuKTsKLQkJCQkJCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IHBhcm1zWzBdLmdldEphdmFUeXBlKCk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYoam1zTWVzc2FnZS5lcXVhbHMocGFybVR5cGUpKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuU0VURU5USVRZQ09OVEVYVDsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVRFTlRJVFlDT05URVhUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJzZXRFbnRpdHlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0OwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiU0VURU5USVRZQ09OVEVYVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJTRVRFTlRJVFlDT05URVhUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUphdmFIZWxwZXJzIGVudGl0eUNvbnRleHQgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VOVElUWUNPTlRFWFQsIGJlYW4pOwotCQkJCQkJCUphdmFIZWxwZXJzIHBhcm1UeXBlID0gcGFybVswXS5nZXRKYXZhVHlwZSgpOwotCQkJCQkJCQotCQkJCQkJCWlmKGVudGl0eUNvbnRleHQuZXF1YWxzKHBhcm1UeXBlKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAidW5zZXRFbnRpdHlDb250ZXh0KCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJVTlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlVOU0VURU5USVRZQ09OVEVYVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJVTlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiVU5TRVRFTlRJVFlDT05URVhUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1VOU0VURU5USVRZQ09OVEVYVCkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9maWVsZFR5cGVJbmRleFtmaWVsZENvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEOwotCQlfZmllbGRUeXBlc1tmaWVsZENvdW50KytdID0gbmV3IElGaWVsZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKLQkJCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vUm9sZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1JvbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0NDZhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vUm9sZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBjb3B5IG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5jb2RlZ2VuLmhlbHBlcnMuUm9sZUhlbHBlci4KLSAqIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5jb2RlZ2VuLmhlbHBlcnMuUm9sZUhlbHBlciBjYW5ub3QgYmUgdXNlZAotICogZGlyZWN0bHkgYnkgdGhlIEVKQiBWYWxpZGF0b3IgKHRvIGNhbGN1bGF0ZSByb2xlIG1ldGhvZCBuYW1lcykgYmVjYXVzZQotICogaXQgdXNlcyBjbGFzc2VzIHdoaWNoIGFyZSBub3QgdXNlZCBieSBXZWJTcGhlcmUuIFVudGlsIHRoZSBsb25nLXRlcm0KLSAqIGZpeCBjYW4gYmUgcHV0IGluLCB0aGlzIGNsYXNzIHdpbGwgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIFJvbGVIZWxwZXIgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0dFVFRFUl9OQU1FX1BBVFRFUk4gPSAiZ2V0ezB9S2V5IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVEVSX05BTUVfUEFUVEVSTiA9ICJwcml2YXRlU2V0ezB9S2V5IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0dFVFRFUl9OQU1FX1BBVFRFUk4gPSAiZ2V0ezB9TGluayI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX05BTUVfUFJFRklYID0gImFkZCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUVEVSX05BTUVfUFJFRklYID0gImdldCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9OQU1FX1BSRUZJWCA9ICJyZW1vdmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09OREFSWV9BRERfTkFNRV9QUkVGSVggPSAic2Vjb25kYXJ5QWRkIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfUkVNT1ZFX05BTUVfUFJFRklYID0gInNlY29uZGFyeVJlbW92ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1NFVFRFUl9OQU1FX1BSRUZJWCA9ICJzZWNvbmRhcnlTZXQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRFUl9OQU1FX1BSRUZJWCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RIZWxwZXI7Ci0vKioKLSAqIFJvbGVIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFJvbGVIZWxwZXIoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogQ29sbGVjdCB0aGUgbmFtZXMgb2YgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBiZWFuIGNsYXNzCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHJvbGUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0Um9sZU1ldGhvZE5hbWVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUsIExpc3QgYUxpc3QpIHsKLQlpZiAoYVJvbGUgPT0gbnVsbCB8fCBhTGlzdCA9PSBudWxsKSByZXR1cm47Ci0JYUxpc3QuYWRkKGdldExpbmtHZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JaWYgKGFSb2xlLmlzRm9yd2FyZCgpKSB7Ci0JCWFMaXN0LmFkZChnZXRLZXlHZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCWFMaXN0LmFkZChnZXRLZXlTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JfQotCWlmIChhUm9sZS5pc05hdmlnYWJsZSgpKQotCQlhTGlzdC5hZGQoZ2V0R2V0dGVyTmFtZShhUm9sZSkpOwotCWlmICghaXNNYW55KGFSb2xlKSkgewotCQl0cnkgewotCQkJaWYoYVJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpLmlzS2V5KCkpCi0JCQkJCWFMaXN0LmFkZChnZXRTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCQkJaWYgKCFhUm9sZS5pc0tleSgpKSB7Ci0JCQkJCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJLy8gSWYgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBjYXVnaHQsIGFzc3VtZSB0aGF0IHRoZSByb2xlIGlzbid0IGEga2V5LgotCQkJLy8gSnVzdCBjb250aW51ZS4KLQkJfQotCX0gZWxzZSB7Ci0JCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlBZGROYW1lKGFSb2xlKSk7Ci0JCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlSZW1vdmVOYW1lKGFSb2xlKSk7Ci0JCWlmIChhUm9sZS5pc05hdmlnYWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmKGFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkgIT0gbnVsbCkgewotCQkJCQlpZiAoIWFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNLZXkoKSkgewotCQkJCQkJYUxpc3QuYWRkKGdldEFkZE5hbWUoYVJvbGUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIElmIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLCBqdXN0IGFzc3VtZSB0aGF0IHRoZSBvcHBvc2l0ZSBpc24ndCBhIGtleS4KLQkJCX0KLQkJCWlmIChhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpICE9IG51bGwgJiYgIWFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNSZXF1aXJlZCgpKQotCQkJCWFMaXN0LmFkZChnZXRSZW1vdmVOYW1lKGFSb2xlKSk7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFJldHVybiBhU3RyaW5nIHdoZXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgdXBwZXJjYXNlZC4KLSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlyc3RBc1VwcGVyY2FzZShTdHJpbmcgYVN0cmluZykgewotCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+MCAmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGFTdHJpbmcuY2hhckF0KDApKSkgewotCQljaGFyW10gY2hhcnMgPSBhU3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoYXJzWzBdKTsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoYXJzKTsKLQl9Ci0JcmV0dXJuIGFTdHJpbmc7Ci19Ci1wcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZ1tdIHJlcGxhY2VtZW50cykgewotCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgcmVwbGFjZW1lbnRzKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBhZGQgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAiYWRke2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogYWRkRGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWRkTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIEFERF9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBnZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAiZ2V0e2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogZ2V0RGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIEdFVFRFUl9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBrZXkgZ2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgImdldHthUm9sZSBuYW1lfUtleSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIGdldERlcGFydG1lbnRLZXkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleUdldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3JtYXQoS0VZX0dFVFRFUl9OQU1FX1BBVFRFUk4sIG5ldyBTdHJpbmdbXXthcmd9KTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBrZXkgc2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInByaXZhdGVTZXR7YVJvbGUgbmFtZX1LZXkiLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBwcml2YXRlU2V0RGVwYXJ0bWVudEtleS4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0S2V5U2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIGZvcm1hdChLRVlfU0VUVEVSX05BTUVfUEFUVEVSTiwgbmV3IFN0cmluZ1tde2FyZ30pOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGxpbmsgZ2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgImdldHthUm9sZSBuYW1lfUxpbmsiLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBnZXREZXBhcnRtZW50TGluay4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGlua0dldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3JtYXQoTElOS19HRVRURVJfTkFNRV9QQVRURVJOLCBuZXcgU3RyaW5nW117YXJnfSk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgcmVtb3ZlIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInJlbW92ZXthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHJlbW92ZURlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbW92ZU5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBSRU1PVkVfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2Vjb25kYXJ5IGFkZCBtZXRob2QgbmFtZSBmb3IgQGFSb2xlLgotICogSXQgd2lsbCBiZSBpbiB0aGUgZm9ybWF0ICJzZWNvbmRhcnlBZGR7YVJvbGUgbmFtZX0iLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBzZWNvbmRhcnlBZGREZXBhcnRtZW50LgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWNvbmRhcnlBZGROYW1lKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLQlpZiAoYVJvbGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JU3RyaW5nIGFyZyA9IGZpcnN0QXNVcHBlcmNhc2UoYVJvbGUuZ2V0TmFtZSgpKTsKLQlyZXR1cm4gU0VDT05EQVJZX0FERF9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBzZWNvbmRhcnkgcmVtb3ZlIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInNlY29uZGFyeVJlbW92ZXthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHNlY29uZGFyeVJlbW92ZURlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlY29uZGFyeVJlbW92ZU5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBTRUNPTkRBUllfUkVNT1ZFX05BTUVfUFJFRklYICsgYXJnOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHNlY29uZGFyeSBzZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAic2Vjb25kYXJ5U2V0e2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogc2Vjb25kYXJ5U2V0RGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2Vjb25kYXJ5U2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIFNFQ09OREFSWV9TRVRURVJfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInNldHthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHNldERlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBTRVRURVJfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBtdWx0aXBsaWNpdHkgaXMgbWFueS4KLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFueShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JcmV0dXJuIGFSb2xlICE9IG51bGwgJiYgYVJvbGUuaXNNYW55KCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQxZjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEV9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNTR0lEID0gIi5zZmIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfU0VTU0lPTkJFQU59OwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG5ldyBsb25nW117TE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRSwgUkVNT1RFX0NPTVBPTkVOVF9JTlRFUkZBQ0V9OwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfQUJTVFJBQ1QgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0ZJTkFMID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9QVUJMSUMgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEID0gdHJ1ZTsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0VKQkNSRUFURSwgQ09OU1RSVUNUT1JfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtGSU5BTElaRV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEUsIEVKQkNSRUFURV9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRklOQUxJWkVfTk9QQVJNLCBCVVNJTkVTU307Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDNJLCBuZXcgU3RyaW5nW117Q0hLSjIwMDNJK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNSwgbmV3IFN0cmluZ1tde0NIS0oyMDE1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY29uc3RyLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY29uc3RyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQ3JlYXRlICsgU01TU0dJRCArIFNQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzdGF0ZWZ1bCBtZXNzYWdlIGRpZmZlcnMgZnJvbSBzdGF0ZWxlc3MgbWVzc2FnZSkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjEwMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMStCRVhULCBDSEtKMjQyMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMiwgbmV3IFN0cmluZ1tde0NIS0oyNDIyK0JFWFQsIENIS0oyNDIyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIzLCBuZXcgU3RyaW5nW117Q0hLSjI0MjMrQkVYVCwgQ0hLSjI0MjMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjQsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNCtCRVhULCBDSEtKMjQyNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNiwgbmV3IFN0cmluZ1tde0NIS0oyNDI2K0JFWFQsIENIS0oyNDI2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI3LCBuZXcgU3RyaW5nW117Q0hLSjI0MjcrQkVYVCwgQ0hLSjI0MjcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQyOCtCRVhULCBDSEtKMjQyOCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMxLCBuZXcgU3RyaW5nW117Q0hLSjI0MzErQkVYVCwgQ0hLSjI0MzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzksIG5ldyBTdHJpbmdbXXtDSEtKMjQzOStCRVhULCBDSEtKMjQzOStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQxLCBuZXcgU3RyaW5nW117Q0hLSjI0NDErQkVYVCwgQ0hLSjI0NDErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MitCRVhULCBDSEtKMjQ0MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MywgbmV3IFN0cmluZ1tde0NIS0oyNDQzK0JFWFQsIENIS0oyNDQzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1MitCRVhULCBDSEtKMjQ1MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1MywgbmV3IFN0cmluZ1tde0NIS0oyNDUzK0JFWFQsIENIS0oyNDUzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU2LCBuZXcgU3RyaW5nW117Q0hLSjI0NTYrT05fQkFTRSwgQ0hLSjI0NTYrT05fVEhJU30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkzLCBuZXcgU3RyaW5nW117Q0hLSjI0OTMrQkVYVCwgQ0hLSjI0OTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NCtCRVhULCBDSEtKMjQ5NCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9idXNpbmVzcytCRVhULCBDSEtKMjUwMF9idXNpbmVzcytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9maW5hbGl6ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2ZpbmFsaXplK0JFWFQsIENIS0oyNTAyX2ZpbmFsaXplK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDNfZWpiQ3JlYXRlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUmVtb3ZlK0JFWFQsIENIS0oyNTA1X2VqYlJlbW92ZStNRVhUfSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZFZhbGlkYXRlVHJhbnNpZW50RmllbGQoKSB7Ci0JCXJldHVybiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIE5FSVRIRVI7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuVk9JRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJdmFsaWRhdGVFamJSZW1vdmVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiQ3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdCdXNpbmVzc01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4gCi0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuZWpiLmVqYjIwLnJ1bGVzLklDbGFzc1ZSdWxlI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5lamIuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0JCVNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKWJlYW47Ci0JCWJvb2xlYW4gaXNCZWFuTWFuYWdlZFN0YXRlZnVsID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHJhbnNhY3Rpb25UeXBlRWxlbWVudChzZXNzaW9uKSAmJiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNCZWFuTWFuYWdlZFNlc3Npb24oc2Vzc2lvbikgJiYgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU3RhdGVmdWwoc2Vzc2lvbikpOwotCi0JCWlmIChpc0JlYW5NYW5hZ2VkU3RhdGVmdWwpIHsKLQkJCS8qCi0JCQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkJCSAqLi4uCi0JCQkgKiBPbmx5IGEgc3RhdGVmdWwgU2Vzc2lvbiBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gbWF5IAotCQkJICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkJCSAqLi4uCi0JCQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIFNlc3Npb24gYmVhbiB3aXRoIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiB0byByZWx5IG9uIHRoZSAKLQkJCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCQkJICoga25vd3Mgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYWJvdXQgdG8gYmUgY29tbWl0dGVkIGFuZCBpdCBrbm93cyB0aGUgb3V0Y29tZSBvZiB0aGUgCi0JCQkgKiB0cmFuc2FjdGlvbiBjb21taXQuCi0JCQkgKi4uLgotCQkJICovCi0JCQl0cnkgewotCQkJCUphdmFIZWxwZXJzIHNzID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKTsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oYmVhbi5nZXRFamJDbGFzcygpLCBzcykpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0ksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBiZWFuLmdldEVqYkNsYXNzKCksIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRRdWFsaWZpZWROYW1lKGJlYW4uZ2V0RWpiQ2xhc3MoKSksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRRdWFsaWZpZWROYW1lKGUuZ2V0SmF2YUNsYXNzKCkpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGEzMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJTG9jYWxUeXBlLCBJQ29tcG9uZW50VHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2xjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25Mb2NhbEhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NmQwYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWZ1bFNlc3Npb25Mb2NhbEhvbWVWUnVsZSBleHRlbmRzIEFTZXNzaW9uSG9tZVZSdWxlIGltcGxlbWVudHMgSUxvY2FsVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNsaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRk1TU0dJRCA9ICIuc2ZsaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJMT0NBTEhPTUV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NSRUFURX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEV9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NyZWF0ZStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK1NGTVNTR0lEK09OX0JBU0UrU1BFQywgQ0hLSjI0MDIrU0ZNU1NHSUQrT05fVEhJUytTUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoZGlmZiBzdHJpbmcgdGhhbiBzdGF0ZWxlc3MgYmVhbikKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMiwgbmV3IFN0cmluZ1tde0NIS0oyNTAyK0JFWFQsIENIS0oyNTAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfY3JlYXRlK0JFWFQsIENIS0oyNTA0X2NyZWF0ZStNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3ZDM4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlZnVsU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSVJlbW90ZVR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc3JjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCT0JKRUNUfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklUfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfYnVzaW5lc3MrQkVYVCwgQ0hLSjI1MDBfYnVzaW5lc3MrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMDM0MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlIGV4dGVuZHMgQVNlc3Npb25Ib21lVlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zcmgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNGTVNTR0lEID0gIi5zZnJoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkhPTUV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtDUkVBVEV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jcmVhdGUrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitTRk1TU0dJRCtPTl9CQVNFK1NQRUMsIENIS0oyNDAyK1NGTVNTR0lEK09OX1RISVMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyLCBuZXcgU3RyaW5nW117Q0hLSjI1MDIrQkVYVCwgQ0hLSjI1MDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGM2MzIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2IiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU1NHSUQgPSAiLnNzYiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9TRVNTSU9OQkVBTn07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtMT0NBTF9DT01QT05FTlRfSU5URVJGQUNFLCBSRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtFSkJDUkVBVEVfTk9QQVJNLCBDT05TVFJVQ1RPUl9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkFMSVpFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENPTlNUUlVDVE9SX05PUEFSTSwgRUpCQ1JFQVRFX05PUEFSTSwgQ09OU1RSVUNUT1IsIEVKQlJFTU9WRV9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRklOQUxJWkVfTk9QQVJNLCBCVVNJTkVTU307Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0FCU1RSQUNUID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9GSU5BTCA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfUFVCTElDID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRCA9IHRydWU7Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDNFLCBuZXcgU3RyaW5nW117Q0hLSjIwMDNFK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNSwgbmV3IFN0cmluZ1tde0NIS0oyMDE1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY29uc3RyLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY29uc3RyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQ3JlYXRlK1NNU1NHSUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUmVtb3ZlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUGFzc2l2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUGFzc2l2YXRlK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzK1NQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMSwgbmV3IFN0cmluZ1tde0NIS0oyNDExK0JFWFQsIENIS0oyNDExK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNytCRVhULCBDSEtKMjQyNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyOCwgbmV3IFN0cmluZ1tde0NIS0oyNDI4K0JFWFQsIENIS0oyNDI4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MStCRVhULCBDSEtKMjQ0MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MiwgbmV3IFN0cmluZ1tde0NIS0oyNDQyK0JFWFQsIENIS0oyNDQyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQzLCBuZXcgU3RyaW5nW117Q0hLSjI0NDMrQkVYVCwgQ0hLSjI0NDMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1MiwgbmV3IFN0cmluZ1tde0NIS0oyNDUyK0JFWFQsIENIS0oyNDUyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDUzLCBuZXcgU3RyaW5nW117Q0hLSjI0NTMrQkVYVCwgQ0hLSjI0NTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NitTTVNTR0lEICsgT05fQkFTRStTUEVDLCBDSEtKMjQ3NitTTVNTR0lEK09OX1RISVMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MitCRVhULCBDSEtKMjQ5MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MywgbmV3IFN0cmluZ1tde0NIS0oyNDkzK0JFWFQsIENIS0oyNDkzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk0LCBuZXcgU3RyaW5nW117Q0hLSjI0OTQrQkVYVCwgQ0hLSjI0OTQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfYnVzaW5lc3MrQkVYVCwgQ0hLSjI1MDBfYnVzaW5lc3MrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZmluYWxpemUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9maW5hbGl6ZStCRVhULCBDSEtKMjUwMl9maW5hbGl6ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAzX2VqYkNyZWF0ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA1X2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlJlbW92ZStCRVhULCBDSEtKMjUwNV9lamJSZW1vdmUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZFZhbGlkYXRlVHJhbnNpZW50RmllbGQoKSB7Ci0JCXJldHVybiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIE5FSVRIRVI7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLlZPSUQsIGJlYW4pOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZU5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBJVHlwZUNvbnN0YW50cy5WT0lEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJSRU1PVkVfTk9QQVJNKSA9PSBFSkJSRU1PVkVfTk9QQVJNKSB7Ci0JCQl2YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEJVU0lORVNTKSA9PSBCVVNJTkVTUykgewotCQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIGlzbid0IHN1cHBvc2VkIHRvIGJlIGhlcmUuIExldCB0aGUgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QKLQkJCS8vIHRha2UgY2FyZSBvZiBpdC4KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJDcmVhdGVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJQb3N0Q3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0J1c2luZXNzTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiAKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggIT0gMCkgfHwgKCFJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLnZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLmVqYi5lamIyMC5ydWxlcy5JQ2xhc3NWUnVsZSN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuZWpiLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVudGVycHJpc2VCZWFuLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0JCS8qCi0JCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCQkgKi4uLgotCQkgKiBPbmx5IGEgc3RhdGVmdWwgU2Vzc2lvbiBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gbWF5IAotCQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCQkgKi4uLgotCQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIFNlc3Npb24gYmVhbiB3aXRoIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiB0byByZWx5IG9uIHRoZSAKLQkJICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JCSAqIGtub3dzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCBhbmQgaXQga25vd3MgdGhlIG91dGNvbWUgb2YgdGhlIAotCQkgKiB0cmFuc2FjdGlvbiBjb21taXQuCi0JCSAqLi4uCi0JCSAqLwotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgc3MgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04sIGJlYW4pOwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0RWpiQ2xhc3MoKSwgc3MpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFF1YWxpZmllZE5hbWUoYmVhbi5nZXRFamJDbGFzcygpKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFF1YWxpZmllZE5hbWUoZS5nZXRKYXZhQ2xhc3MoKSl9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjYzNkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSUxvY2FsVHlwZSwgSUNvbXBvbmVudFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2xjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiODNiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUgZXh0ZW5kcyBBU3RhdGVsZXNzSG9tZVZSdWxlIGltcGxlbWVudHMgSUxvY2FsVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2xoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU1NHSUQgPSAiLnNzbGgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJMT0NBTEhPTUV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtDUkVBVEVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENSRUFURV9OT1BBUk0sIENSRUFURSwgRklOQUxJWkVfTk9QQVJNfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jcmVhdGUrU01TU0dJRCtTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitTTVNTR0lEK09OX0JBU0UrU1BFQywgQ0hLSjI0MDIrU01TU0dJRCtPTl9USElTK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NiwgbmV3IFN0cmluZ1tde0NIS0oyNDc2K0JFWFQsIENIS0oyNDc2K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMitCRVhULCBDSEtKMjUwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmZDZmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUNvbXBvbmVudFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNyYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQk9CSkVDVH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVH07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9idXNpbmVzcytCRVhULCBDSEtKMjUwMF9idXNpbmVzcytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjViMTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlIGV4dGVuZHMgQVN0YXRlbGVzc0hvbWVWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc3JoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU1NHSUQgPSAiLnNzcmgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJIT01FfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117Q1JFQVRFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEVfTk9QQVJNLCBDUkVBVEUsIEZJTkFMSVpFX05PUEFSTX07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NyZWF0ZStTTVNTR0lEK1NQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK1NNU1NHSUQrT05fQkFTRStTUEVDLCBDSEtKMjQwMitTTVNTR0lEK09OX1RISVMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc2LCBuZXcgU3RyaW5nW117Q0hLSjI0NzYrQkVYVCwgQ0hLSjI0NzYrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2hvbWUrQkVYVCwgQ0hLSjI1MDBfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMiwgbmV3IFN0cmluZ1tde0NIS0oyNTAyK0JFWFQsIENIS0oyNTAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfY3JlYXRlK0JFWFQsIENIS0oyNTA0X2NyZWF0ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjODUyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBiZWFuIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqCi0gKiBBbGwgOS4yLlggc2VjdGlvbnMgZGVzY3JpYmUgQk1QIHJlcXVpcmVtZW50cy4KLSAqIElmIGEgQ01QIHJlcXVpcmVtZW50IGlzIGRpZmZlcmVudCB0aGFuIHRoZXNlLCB0aGVuIHRoZSBkaWZmZXJlbmNlcyBhcmUKLSAqIGRvY3VtZW50ZWQgaW4gOS40Llggc2VjdGlvbnMuCi0gKgotICoKLSAqIDkuMi4yIEVudGVycHJpc2UgYmVhbiBjbGFzcwotICogICAtIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIGFuIGVudGl0eSBiZWFuIGNsYXNzOgotICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5FbnRpdHlCZWFuIGludGVyZmFjZS4KLSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGFzIHB1YmxpYyBhbmQgbXVzdCBub3QgYmUgYWJzdHJhY3QuCi0gKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZmluYWwuCi0gKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLgotICogICAgICAtIFRoZSBjbGFzcyBtdXN0IG5vdCBkZWZpbmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLgotICogICAtIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIFs5XS4gCi0gKiAgICAgSWYgdGhlIGNsYXNzIGltcGxlbWVudHMgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSwgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBuby1vcCAKLSAqICAgICBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuIFRoZSBjb250YWluZXIgCi0gKiAgICAgd2lsbCBuZXZlciBpbnZva2UgdGhlc2UgbWV0aG9kcyBvbiB0aGUgYmVhbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KLSAqICAgLSBBIG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgCi0gKiAgICAgZGVmaW5pbmcgdGhlIGVudGl0eSBiZWFuIGNsYXNzIGFzIGFic3RyYWN0LgotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgYW5kIHRoZSAKLSAqICAgICBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUsIGFuZCBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBhcyBkZXNjcmliZWQgCi0gKiAgICAgbGF0ZXIgaW4gdGhpcyBzZWN0aW9uLgotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gCi0gKiAgICAgSWYgdGhlIGVudGl0eSBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgCi0gKiAgICAgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMsIHRoZSBmaW5kZXIgbWV0aG9kcywgYW5kIHRoZQotICogICAgIG1ldGhvZHMgb2YgdGhlIEVudGl0eUJlYW4gaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgCi0gKiAgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBpcyBhbGxvd2VkIHRvIGltcGxlbWVudCBvdGhlciBtZXRob2RzIChmb3IgCi0gKiAgICAgZXhhbXBsZSBoZWxwZXIgbWV0aG9kcyBpbnZva2VkIGludGVybmFsbHkgYnkgdGhlIGJ1c2luZXNzIG1ldGhvZHMpIAotICogICAgIGluIGFkZGl0aW9uIHRvIHRoZSBtZXRob2RzIHJlcXVpcmVkIGJ5IHRoZSBFSkIgc3BlY2lmaWNhdGlvbi4KLSAqCi0gKiA5LjIuMyBlamJDcmVhdGUgbWV0aG9kcwotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0gKiAgICAgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0gKiAgICAgICAtIFRoZSBtZXRob2QgbmFtZSBtdXN0IGJlIGVqYkNyZWF0ZS4KLSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0gKiAgICAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGUuCi0gKiAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLSAqICAgICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0gKiAgICAgICAgIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLSAqICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgdG8gdGhyb3cgdGhlIAotICogICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotICogICAgICAgICBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotICogICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotICogICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICogICAtIFRoZSBlbnRpdHkgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIGEgdW5pcXVlIHByaW1hcnkga2V5LiAKLSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHByaW1hcnkga2V5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIHByaW1hcnkga2V5cyBvZiBhbGwgCi0gKiAgICAgdGhlIGV4aXN0aW5nIGVudGl0eSBvYmplY3RzIHdpdGhpbiB0aGUgc2FtZSBob21lLiBUaGUgZWpiQ3JlYXRlIG1ldGhvZCBzaG91bGQgCi0gKiAgICAgdGhyb3cgdGhlIER1cGxpY2F0ZUtleUV4Y2VwdGlvbiBvbiBhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhbiBlbnRpdHkgb2JqZWN0IHdpdGggCi0gKiAgICAgYSBkdXBsaWNhdGUgcHJpbWFyeSBrZXkuIEhvd2V2ZXIsIGl0IGlzIGxlZ2FsIHRvIHJldXNlIHRoZSBwcmltYXJ5IGtleSBvZiBhCi0gKiAgICAgcHJldmlvdXNseSByZW1vdmVkIGVudGl0eSBvYmplY3QuCi0gKgotICogOS4yLjQgZWpiUG9zdENyZWF0ZSBtZXRob2RzCi0gKiAgIC0gRm9yIGVhY2ggZWpiQ3JlYXRlKC4uLikgbWV0aG9kLCB0aGUgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBtYXRjaGluZyAKLSAqICAgICBlamJQb3N0Q3JlYXRlKC4uLikgbWV0aG9kLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICogICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiUG9zdENyZWF0ZS4KLSAqICAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0gKiAgICAgICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLSAqICAgICAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0gKiAgICAgICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50cyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSguLi4pIG1ldGhvZC4KLSAqICAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLSAqICAgICAgICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCB0byB0aHJvdyB0aGUgCi0gKiAgICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb250byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEKLSAqICAgICAgICAgIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLSAqICAgICAgICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0gKgotICogOS4yLjUgZWpiRmluZCBtZXRob2RzCi0gKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBhbHNvIGRlZmluZSBhZGRpdGlvbmFsIGVqYkZpbmQ8TUVUSE9EPiguLi4pIGZpbmRlciBtZXRob2RzLgotICogICAtIFRoZSBzaWduYXR1cmVzIG9mIHRoZSBmaW5kZXIgbWV0aG9kcyBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICogICAtIEEgZmluZGVyIG1ldGhvZCBuYW1lIG11c3Qgc3RhcnQgd2l0aCB0aGUgcHJlZml4ICJlamJGaW5kIiAKLSAqICAgICAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotICogICAtIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLSAqICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLSAqICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotICogICAtIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLSAqICAgICBvciBhIGNvbGxlY3Rpb24gb2YgcHJpbWFyeSBrZXlzIChzZWUgU2VjdGlvbiBTdWJzZWN0aW9uIDkuMS44KS4KLSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCBpbmNsdWRpbmcgCi0gKiAgICAgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uCi0gKiAgIC0gRXZlcnkgZW50aXR5IGJlYW4gbXVzdCBkZWZpbmUgdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiBUaGUgcmVzdWx0IHR5cGUgZm9yIAotICogICAgIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0gKiAgICAgYmUgYSBzaW5nbGUtb2JqZWN0IGZpbmRlcikuCi0gKiAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGZpbmRlciBtZXRob2RzIHRvIHRocm93IHRoZSAKLSAqICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLSAqICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0gKiAgICAgc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLSAqICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICoKLSAqIDkuMi42IEJ1c2luZXNzIG1ldGhvZHMKLSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGRlZmluZSB6ZXJvIG9yIG1vcmUgYnVzaW5lc3MgbWV0aG9kcyB3aG9zZSBzaWduYXR1cmVzIAotICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotICogICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoIGVqYiB0byAKLSAqICAgICAgICAgIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0gKiAgICAgICAgLSBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotICogICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0gKiAgICAgICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0gKiAgICAgICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLgotICogICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotICogICAgICAgICAgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyAKLSAqICAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0gKiAgICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotICogICAgICAgICAgdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLSAqLi4uCi0gKiA5LjIuOSBFbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzCi0gKi4uLgotICogIC0gVGhlIHByaW1hcnkga2V5IHR5cGUgbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AuCi0gKi4uLgotICogMTguMS4yIFByb2dyYW1taW5nIHJlc3RyaWN0aW9ucwotICogIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHByb2dyYW1taW5nIHJlc3RyaWN0aW9ucyB0aGF0IGEgQmVhbiBQcm92aWRlciBtdXN0IGZvbGxvdyB0byBlbnN1cmUgdGhhdCB0aGUKLSAqICBlbnRlcnByaXNlIGJlYW4gaXMgcG9ydGFibGUgYW5kIGNhbiBiZSBkZXBsb3llZCBpbiBhbnkgY29tcGxpYW50IEVKQiBDb250YWluZXIuIFRoZSByZXN0cmljdGlvbnMgYXBwbHkKLSAqICB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1c2luZXNzIG1ldGhvZHMuIFNlY3Rpb24gMTguMiwgd2hpY2ggZGVzY3JpYmVzIHRoZSBDb250YWluZXIncyB2aWV3IG9mCi0gKiAgdGhlc2UgcmVzdHJpY3Rpb25zLCBkZWZpbmVzIHRoZSBwcm9ncmFtbWluZyBlbnZpcm9ubWVudCB0aGF0IGFsbCBFSkIgQ29udGFpbmVycyBtdXN0IHByb3ZpZGUuCi0gKgotICogIC0gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSByZWFkL3dyaXRlIHN0YXRpYyBmaWVsZHMuIFVzaW5nIHJlYWQtb25seSBzdGF0aWMgZmllbGRzIGlzCi0gKiAgICBhbGxvd2VkLiBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHN0YXRpYyBmaWVsZHMgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBiZQotICogICAgZGVjbGFyZWQgYXMgZmluYWwuCi0gKi4uLgotICogIC0gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSB0aHJlYWQgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgdG8gc3luY2hyb25pemUgZXhlY3V0aW9uIG9mCi0gKiAgICBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKi4uLgotICogIC0gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSB0aGUgQVdUIGZ1bmN0aW9uYWxpdHkgdG8gYXR0ZW1wdCB0byBvdXRwdXQgaW5mb3JtYXRpb24gdG8gYQotICogICAgZGlzcGxheSwgb3IgdG8gaW5wdXQgaW5mb3JtYXRpb24gZnJvbSBhIGtleWJvYXJkLgotICouLi4KLSAqICAtIEFuIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCB1c2UgdGhlIGphdmEuaW8gcGFja2FnZSB0byBhdHRlbXB0IHRvIGFjY2VzcyBmaWxlcyBhbmQgZGlyZWN0by1yaWVzCi0gKiAgICBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKi4uLgotICogIC0gQW4gZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gbGlzdGVuIG9uIGEgc29ja2V0LCBhY2NlcHQgY29ubmVjdGlvbnMgb24gYSBzb2NrZXQsIG9yCi0gKiAgICB1c2UgYSBzb2NrZXQgZm9yIG11bHRpY2FzdC4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gcXVlcnkgYSBjbGFzcyB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlY2xhcmVkCi0gKiAgICBtZW1iZXJzIHRoYXQgYXJlIG5vdCBvdGhlcndpc2UgYWNjZXNzaWJsZSB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGJlY2F1c2Ugb2YgdGhlIHNlY3VyaXR5IHJ1bGVzCi0gKiAgICBvZiB0aGUgSmF2YSBsYW5ndWFnZS4gVGhlIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCBhdHRlbXB0IHRvIHVzZSB0aGUgUmVmbGVjdGlvbiBBUEkgdG8gYWNjZXNzCi0gKiAgICBpbmZvcm1hdGlvbiB0aGF0IHRoZSBzZWN1cml0eSBydWxlcyBvZiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBtYWtlIHVuYXZhaWxhYmxlLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBjcmVhdGUgYSBjbGFzcyBsb2FkZXI7IG9idGFpbiB0aGUgY3VycmVudCBjbGFzcyBsb2FkZXI7Ci0gKiAgICBzZXQgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyOyBzZXQgc2VjdXJpdHkgbWFuYWdlcjsgY3JlYXRlIGEgbmV3IHNlY3VyaXR5IG1hbmFnZXI7IHN0b3AgdGhlCi0gKiAgICBKVk07IG9yIGNoYW5nZSB0aGUgaW5wdXQsIG91dHB1dCwgYW5kIGVycm9yIHN0cmVhbXMuCi0gKi4uLgotICogIC0gVGhlIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCBhdHRlbXB0IHRvIHNldCB0aGUgc29ja2V0IGZhY3RvcnkgdXNlZCBieSBTZXJ2ZXJTb2NrZXQsIFNvY2tldCwgb3IKLSAqICAgIHRoZSBzdHJlYW0gaGFuZGxlciBmYWN0b3J5IHVzZWQgYnkgVVJMLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBtYW5hZ2UgdGhyZWFkcy4gVGhlIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCBhdHRlbXB0Ci0gKiAgICB0byBzdGFydCwgc3RvcCwgc3VzcGVuZCwgb3IgcmVzdW1lIGEgdGhyZWFkOyBvciB0byBjaGFuZ2UgYSB0aHJlYWQncyBwcmlvcml0eSBvciBuYW1lLiBUaGUgZW50ZXItcHJpc2UKLSAqICAgIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBtYW5hZ2UgdGhyZWFkIGdyb3Vwcy4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gZGlyZWN0bHkgcmVhZCBvciB3cml0ZSBhIGZpbGUgZGVzY3JpcHRvci4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gb2J0YWluIHRoZSBzZWN1cml0eSBwb2xpY3kgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhcgotICogICAgY29kZSBzb3VyY2UuCi0gKi4uLgotICogIC0gVGhlIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCBhdHRlbXB0IHRvIGxvYWQgYSBuYXRpdmUgbGlicmFyeS4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gZ2FpbiBhY2Nlc3MgdG8gcGFja2FnZXMgYW5kIGNsYXNzZXMgdGhhdCB0aGUgdXN1YWwgcnVsZXMKLSAqICAgIG9mIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIG1ha2UgdW5hdmFpbGFibGUgdG8gdGhlIGVudGVycHJpc2UgYmVhbi4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gZGVmaW5lIGEgY2xhc3MgaW4gYSBwYWNrYWdlLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBhY2Nlc3Mgb3IgbW9kaWZ5IHRoZSBzZWN1cml0eSBjb25maWd1cmF0aW9uIG9iamVjdHMKLSAqICAgIChQb2xpY3ksIFNlY3VyaXR5LCBQcm92aWRlciwgU2lnbmVyLCBhbmQgSWRlbnRpdHkpLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byB1c2UgdGhlIHN1YmNsYXNzIGFuZCBvYmplY3Qgc3Vic3RpdHV0aW9uIGZlYXR1cmVzIG9mIHRoZQotICogICAgSmF2YSBTZXJpYWxpemF0aW9uIFByb3RvY29sLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBwYXNzIHRoaXMgYXMgYW4gYXJndW1lbnQgb3IgbWV0aG9kIHJlc3VsdC4gVGhlCi0gKiAgICBlbnRlcnByaXNlIGJlYW4gbXVzdCBwYXNzIHRoZSByZXN1bHQgb2YgU2Vzc2lvbkNvbnRleHQuZ2V0RUpCT2JqZWN0KCkgb3IgRW50aXR5Q29udGV4dC4KLSAqICAgIGdldEVKQk9iamVjdCgpIGluc3RlYWQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBCZWFuIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5QmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmViIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfS0VZQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlib29sZWFuIGhhc1BLTWV0aG9kID0gZmFsc2U7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAyLCBuZXcgU3RyaW5nW117Q0hLSjIwMDIrQkVYVCwgQ0hLSjIwMDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDYsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA3LCBuZXcgU3RyaW5nW117Q0hLSjIwMDcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwOSwgbmV3IFN0cmluZ1tde0NIS0oyMDA5K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjgsIG5ldyBTdHJpbmdbXXtDSEtKMjAyOCtCRVhULCBDSEtKMjAyOCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyOSwgbmV3IFN0cmluZ1tde0NIS0oyMDI5K0JFWFQsIENIS0oyMDI5K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzMywgbmV3IFN0cmluZ1tde0NIS0oyMDMzK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzQsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM1LCBuZXcgU3RyaW5nW117Q0hLSjIwMzUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzNiwgbmV3IFN0cmluZ1tde0NIS0oyMDM2K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzcsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM4LCBuZXcgU3RyaW5nW117Q0hLSjIwMzgrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzOSwgbmV3IFN0cmluZ1tde0NIS0oyMDM5K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMCwgbmV3IFN0cmluZ1tde0NIS0oyMjAwK09OX0JBU0UrU1BFQywgQ0hLSjIyMDArT05fVEhJUytTUEVDfSk7IC8vIENIS0oyMjAwIGlzIGEgc3BlY2lhbCBjYXNlLiBJdCdzIHNoYXJlZCBieSBhbGwgYmVhbiB0eXBlcy4KLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9idXMrQkVYVCwgQ0hLSjI0MDBfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYkZpbmQrQkVYVCwgQ0hLSjI0MDBfZWpiRmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwMF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA2LCBuZXcgU3RyaW5nW117Q0hLSjI0MDYrQkVYVCwgQ0hLSjI0MDYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNytCRVhULCBDSEtKMjQwNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOF9idXMrQkVYVCwgQ0hLSjI0MDhfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2VqYkZpbmQrQkVYVCwgQ0hLSjI0MDhfZWpiRmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiRmluZCtCRVhULCBDSEtKMjQwOV9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiRmluZCtCRVhULCBDSEtKMjQxMF9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxOCwgbmV3IFN0cmluZ1tde0NIS0oyNDE4K0JFWFQsIENIS0oyNDE4K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMCwgbmV3IFN0cmluZ1tde0NIS0oyNDIwK0JFWFQsIENIS0oyNDIwK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMiwgbmV3IFN0cmluZ1tde0NIS0oyNDMyK0JFWFQsIENIS0oyNDMyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NiwgbmV3IFN0cmluZ1tde0NIS0oyNDU2K09OX0JBU0UsIENIS0oyNDU2K09OX1RISVN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWhhc1BLTWV0aG9kID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci5wcmltVmFsaWRhdGVFeGlzdGVuY2UodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCi0JCS8vIEJNUHMgbXVzdCBpbXBsZW1lbnQgZWpiRmluZEJ5UHJpbWFyeUtleS4gSWYgaXQgaXNuJ3QgaW1wbGVtZW50ZWQsIHZhbGlkYXRlTWV0aG9kRXhpc3RzKCkgd2lsbAotCQkvLyBvdXRwdXQgYW4gZXJyb3IuIChoYXNQS01ldGhvZCA9IHRydWUgaW1wbGllcyBpbXBsZW1lbnRlZCwgb3RoZXJ3aXNlIG5vdCBpbXBsZW1lbnRlZCkKLQkJaWYgKCFoYXNQS01ldGhvZCAmJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJGSU5EQllQUklNQVJZS0VZLmVxdWFscyhlamJNZXRob2QuZ2V0TmFtZSgpKSkgewotCQkJaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCX0KLQkKLQkvKioKLQkgKiA5LjIuNiBCdXNpbmVzcyBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBidXNpbmVzcyBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0JICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgbmFtZXMgY2FuIGJlIGFyYml0cmFyeSwgYnV0IHRoZXkgbXVzdCBub3Qgc3RhcnQgd2l0aCAnZWpiJyB0byAKLQkgKiAgICAgICAgICBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgY2FsbGJhY2sgbWV0aG9kcyB1c2VkIGJ5IHRoZSBFSkIgYXJjaGl0ZWN0dXJlLgotCSAqICAgICAgICAtIFRoZSBidXNpbmVzcyBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAgICAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCSAqICAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMuCi0JICogICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotCSAqICAgICAgICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgCi0JICogICAgICAgICAgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiAKLQkgKiAgICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICAgICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFBlcmZvcm0gY29tbW9uIEJNUC9DTVAgYnVzaW5lc3MgbWV0aG9kIGNoZWNrcwotCQlzdXBlci52YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBObyBzcGVjaWZpYyBCTVAgYnVzaW5lc3MgbWV0aG9kIGNoZWNrcy4KLQkJLy8gQWxsIG9mIHRoZSBwb2ludHMgaW4gOS4yLjYgYXJlIGNvbW1vbiB0byBib3RoIEJNUHMgJiBDTVBzLgotCX0KLQkKLQkvKioKLQkgKiA5LjIuMiBFbnRlcnByaXNlIGJlYW4gY2xhc3MKLQkgKiAgIC0gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgYW4gZW50aXR5IGJlYW4gY2xhc3M6Ci0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5FbnRpdHlCZWFuIGludGVyZmFjZS4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMgYW5kIG11c3Qgbm90IGJlIGFic3RyYWN0LgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyBmaW5hbC4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBub3QgZGVmaW5lIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4KLQkgKiAgIC0gVGhlIGNsYXNzIG1heSwgYnV0IGlzIG5vdCByZXF1aXJlZCB0bywgaW1wbGVtZW50IHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgWzldLiAKLQkgKiAgICAgSWYgdGhlIGNsYXNzIGltcGxlbWVudHMgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSwgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBuby1vcCAKLQkgKiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGphdmF4LmVqYi5FSkJPYmplY3QgaW50ZXJmYWNlLiBUaGUgY29udGFpbmVyIAotCSAqICAgICB3aWxsIG5ldmVyIGludm9rZSB0aGVzZSBtZXRob2RzIG9uIHRoZSBiZWFuIGluc3RhbmNlcyBhdCBydW50aW1lLgotCSAqICAgLSBBIG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgCi0JICogICAgIGRlZmluaW5nIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBhcyBhYnN0cmFjdC4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBidXNpbmVzcyBtZXRob2RzLCBhbmQgdGhlIAotCSAqICAgICBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUsIGFuZCBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBhcyBkZXNjcmliZWQgCi0JICogICAgIGxhdGVyIGluIHRoaXMgc2VjdGlvbi4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBoYXZlIHN1cGVyY2xhc3NlcyBhbmQvb3Igc3VwZXJpbnRlcmZhY2VzLiAKLQkgKiAgICAgSWYgdGhlIGVudGl0eSBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzLCB0aGUgZmluZGVyIG1ldGhvZHMsIGFuZCB0aGUKLQkgKiAgICAgbWV0aG9kcyBvZiB0aGUgRW50aXR5QmVhbiBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGluIHRoZSAKLQkgKiAgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgaXMgYWxsb3dlZCB0byBpbXBsZW1lbnQgb3RoZXIgbWV0aG9kcyAoZm9yIAotCSAqICAgICBleGFtcGxlIGhlbHBlciBtZXRob2RzIGludm9rZWQgaW50ZXJuYWxseSBieSB0aGUgYnVzaW5lc3MgbWV0aG9kcykgCi0JICogICAgIGluIGFkZGl0aW9uIHRvIHRoZSBtZXRob2RzIHJlcXVpcmVkIGJ5IHRoZSBFSkIgc3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQWxsIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSB0aGUgcGFyZW50LgotCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIDkuMi41IGVqYkZpbmQgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGFsc28gZGVmaW5lIGFkZGl0aW9uYWwgZWpiRmluZDxNRVRIT0Q+KC4uLikgZmluZGVyIG1ldGhvZHMuCi0JICogICAtIFRoZSBzaWduYXR1cmVzIG9mIHRoZSBmaW5kZXIgbWV0aG9kcyBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotCSAqICAgLSBBIGZpbmRlciBtZXRob2QgbmFtZSBtdXN0IHN0YXJ0IHdpdGggdGhlIHByZWZpeCAiZWpiRmluZCIgCi0JICogICAgIChlLmcuIGVqYkZpbmRCeVByaW1hcnlLZXksIGVqYkZpbmRMYXJnZUFjY291bnRzLCBlamJGaW5kTGF0ZVNoaXBtZW50cykuCi0JICogICAtIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAtIFRoZSBtZXRob2QgYXJndW1lbnQgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLQkgKiAgICAgb3IgYSBjb2xsZWN0aW9uIG9mIHByaW1hcnkga2V5cyAoc2VlIFNlY3Rpb24gU3Vic2VjdGlvbiA5LjEuOCkuCi0JICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIGluY2x1ZGluZyAKLQkgKiAgICAgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uCi0JICogICAtIEV2ZXJ5IGVudGl0eSBiZWFuIG11c3QgZGVmaW5lIHRoZSBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4gVGhlIHJlc3VsdCB0eXBlIGZvciAKLQkgKiAgICAgdGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgcHJpbWFyeSBrZXkgdHlwZSAoaS5lLiB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QgbXVzdCAKLQkgKiAgICAgYmUgYSBzaW5nbGUtb2JqZWN0IGZpbmRlcikuCi0JICogICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBmaW5kZXIgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JICogICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCSAqICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JICogICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQSBmaW5kZXIgbWV0aG9kIG5hbWUgbXVzdCBzdGFydCB3aXRoIHRoZSBwcmVmaXggImVqYkZpbmQiIAotCQkvLyAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBhYm92ZSBjaGVjay4KLQotCQkvLyBFdmVyeSBlbnRpdHkgYmVhbiBtdXN0IGRlZmluZSB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIFRoZSByZXN1bHQgdHlwZSBmb3IgCi0JCS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0JCS8vIGJlIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2VqYkZpbmQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEwX2VqYkZpbmQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9lamJGaW5kLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnQgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLQkJLy8gb3IgYSBjb2xsZWN0aW9uIG9mIHByaW1hcnkga2V5cyAoc2VlIFNlY3Rpb24gU3Vic2VjdGlvbiA5LjEuOCkuCi0JCXZhbGlkYXRlRWpiRmluZE1ldGhvZF9rZXkodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBmaW5kZXIgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JCS8vIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCQkvLyBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JCS8vIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JCS8vIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfZWpiRmluZCk7Ci0KLQkJdmFsaWRhdGVFamJGaW5kTWV0aG9kX2hvbWVEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiA5LjIuNSBlamJGaW5kIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBhbHNvIGRlZmluZSBhZGRpdGlvbmFsIGVqYkZpbmQ8TUVUSE9EPiguLi4pIGZpbmRlciBtZXRob2RzLgotCSAqICAgLSBUaGUgc2lnbmF0dXJlcyBvZiB0aGUgZmluZGVyIG1ldGhvZHMgbXVzdCBmb2xsb3cgdGhlIGZvbGxvd2luZyBydWxlczoKLQkgKiAgIC0gQSBmaW5kZXIgbWV0aG9kIG5hbWUgbXVzdCBzdGFydCB3aXRoIHRoZSBwcmVmaXggImVqYkZpbmQiIAotCSAqICAgICAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotCSAqICAgLSBBIGZpbmRlciBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSwgCi0JICogICAgIG9yIGEgY29sbGVjdGlvbiBvZiBwcmltYXJ5IGtleXMgKHNlZSBTZWN0aW9uIFN1YnNlY3Rpb24gOS4xLjgpLgotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCBpbmNsdWRpbmcgCi0JICogICAgIHRoZSBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLgotCSAqICAgLSBFdmVyeSBlbnRpdHkgYmVhbiBtdXN0IGRlZmluZSB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIFRoZSByZXN1bHQgdHlwZSBmb3IgCi0JICogICAgIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0JICogICAgIGJlIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLgotCSAqICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZmluZGVyIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotCSAqICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLQkgKiAgICAgVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotCSAqICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiRmluZE1ldGhvZF9rZXkoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSwgCi0JCS8vIG9yIGEgY29sbGVjdGlvbiBvZiBwcmltYXJ5IGtleXMgKHNlZSBTZWN0aW9uIFN1YnNlY3Rpb24gOS4xLjgpLgotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCi0JCUphdmFDbGFzcyBwcmltYXJ5S2V5ID0gKChFbnRpdHkpIGJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHByaW1hcnlLZXkpOwotCi0JCWlmKCAhKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblR5cGUsIHByaW1hcnlLZXkpIHx8Ci0JCQkgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihyZXR1cm5UeXBlLCBiZWFuKSB8fAotCQkJICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUVudW1lcmF0aW9uKHJldHVyblR5cGUsIGJlYW4pCi0JCSAgICkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBwcmltYXJ5S2V5LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDkuMi40IGVqYlBvc3RDcmVhdGUgbWV0aG9kcwotCSAqIC0gRm9yIGVhY2ggZWpiQ3JlYXRlKC4uLikgbWV0aG9kLCB0aGUgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBtYXRjaGluZyAKLQkgKiAgIGVqYlBvc3RDcmVhdGUoLi4uKSBtZXRob2QsIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0JICogICAgLSBUaGUgbWV0aG9kIG5hbWUgbXVzdCBiZSBlamJQb3N0Q3JlYXRlLgotCSAqICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgIC0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLQkgKiAgICAtIFRoZSBtZXRob2QgYXJndW1lbnRzIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbWF0Y2hpbmcgCi0JICogICAgICBlamJDcmVhdGUoLi4uKSBtZXRob2QuCi0JICogICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCAKLQkgKiAgICAgIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkgKiAgICAgIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCB0byB0aHJvdyAKLQkgKiAgICAgIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLQkgKiAgICAgIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgCi0JICogICAgICBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIAotCSAqICAgICAgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIAotCSAqICAgICAgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLi4uCi0JKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBQZXJmb3JtIGNvbW1vbiBCTVAvQ01QIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGNoZWNrcwotCQlzdXBlci52YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIE5vIHNwZWNpZmljIEJNUCBlamJQb3N0Q3JlYXRlIG1ldGhvZCBjaGVja3MuCi0JCS8vIEFsbCBvZiB0aGUgcG9pbnRzIGluIDkuMi40IGFyZSBjb21tb24gdG8gYm90aCBCTVBzICYgQ01Qcy4KLQl9Ci0JCi0JLyoqCi0JICogOS4yLjUgZWpiRmluZCBtZXRob2RzCi0JICouLi4KLQkgKiAgIC0gRXZlcnkgZW50aXR5IGJlYW4gbXVzdCBkZWZpbmUgdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiBUaGUgcmVzdWx0IHR5cGUgZm9yIAotCSAqICAgICB0aGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBwcmltYXJ5IGtleSB0eXBlIChpLmUuIHRoZSBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBtdXN0IAotCSAqICAgICBiZSBhIHNpbmdsZS1vYmplY3QgZmluZGVyKS4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVNZXRob2RFeGlzdHModmMsIGJlYW4sIGNsYXp6KTsKLQotCQlpZiAoIWhhc1BLTWV0aG9kKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2ZXJpZnlGaWVsZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8qCi0JCS8vIFBsdXMsIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIGZpZWxkIGV4aXN0cyBvbiB0aGUgYmVhbi4KLQkJTGlzdCBmaWVsZHMgPSBnZXRGaWVsZHMoKTsKLQkJaWYoKGZpZWxkcyA9PSBudWxsKSB8fCAoZmllbGRzLnNpemUoKSA9PSAwKSkgewotCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX0JNUF9OT0ZJRUxEUywgbmV3IFN0cmluZ1tdIHtnZXRNb2RlbE9iamVjdE5hbWUoKX0sIGdldE1vZGVsT2JqZWN0KCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCSovCi0JfQotCQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQkJaGFzUEtNZXRob2QgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEhvbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3NmM0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBIb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBiZWFuIG1hbmFnZWQgZW50aXR5IGhvbWUgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHBhcmFncmFwaCBpcyB0YWtlbiBmcm9tCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqIDkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBIDk0MzAzLCBVLlMuQS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0gKiAgIC0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQkhvbWUgaW50ZXJmYWNlLgotICogICAtIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUktSUlPUC4gCi0gKiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyBmb3IgCi0gKiAgICAgUk1JLUlJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0gKiAgIC0gVGhlIGhvbWUgaW50ZXJmYWNlIGlzIGFsbG93ZWQgdG8gaGF2ZSBzdXBlcmludGVyZmFjZXMuIFVzZSBvZiBpbnRlcmZhY2UgCi0gKiAgICAgaW5oZXJpdGFuY2UgaXMgc3ViamVjdCB0byB0aGUgUk1JLUlJT1AgcnVsZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHJlbW90ZSBpbnRlcmZhY2VzLgotICogICAtIEVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgIC0gQSBjcmVhdGUgbWV0aG9kLgotICogICAgICAtIEEgZmluZGVyIG1ldGhvZC4KLSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0gKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIHR5cGUuCi0gKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0gKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0gKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0gKiAgIC0gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLSAqICAgICBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0gKiAgICAgKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotICogICAgIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIAotICogICAgIGludGVyZmFjZSB0eXBlIChmb3IgYSBzaW5nbGUtb2JqZWN0IGZpbmRlciksIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChmb3IgYSAKLSAqICAgICBtdWx0aS1vYmplY3QgZmluZGVyKS4KLSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAotICogICAgIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0gKiAgICAgYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJGaW5kIG1ldGhvZCBvZiB0aGUgCi0gKiAgICAgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZCAKLSAqICAgICBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgZmluZGVyIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uIAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBIb21lIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5SG9tZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmVoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNSwgbmV3IFN0cmluZ1tde0NIS0oyMDA1K0JFWFQsIENIS0oyMDA1K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMSwgbmV3IFN0cmluZ1tde0NIS0oyMDExK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTIsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDI2LCBuZXcgU3RyaW5nW117Q0hLSjIwMjYrQkVYVCwgQ0hLSjIwMjYrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDMwLCBuZXcgU3RyaW5nW117Q0hLSjIwMzArQkVYVCwgQ0hLSjIwMzArTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA1LCBuZXcgU3RyaW5nW117Q0hLSjI0MDUrQkVYVCwgQ0hLSjI0MDUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNSwgbmV3IFN0cmluZ1tde0NIS0oyNDE1K0JFWFQsIENIS0oyNDE1K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCS8qKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkgKiAgICAgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCSAqICAgICAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JICogICAgIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCSAqLi4uCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLQkgKiAgICAgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZCAKLQkgKiAgICAgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgdmVyaWZ5TWF0Y2hpbmdCZWFuRmluZE1ldGhvZCBjaGVja3MgZm9yIHRoZSB0d28gZm9sbG93aW5nIHJlcXVpcmVtZW50czoKLQkJLy8gCi0JCS8vIEVhY2ggZmluZGVyIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJmaW5kPE1FVEhPRD4iIChlLmcuIGZpbmRMYXJnZUFjY291bnRzKSwgYW5kIGl0Ci0JCS8vIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyAKLQkJLy8gKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotCQkvLyBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXkgYmUgZGlmZmVyZW50LikKLQkJLy8gCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLQkJLy8gZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZAotCQkvLyBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQl2YWxpZGF0ZUZpbmRNZXRob2RfYmVhbkRlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGZpbmRlciBtZXRob2QgbXVzdCBiZSBuYW1lZCAiZmluZDxNRVRIT0Q+IiAoZS5nLiBmaW5kTGFyZ2VBY2NvdW50cyksIGFuZCBpdAotCSAqICAgICBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0JICogICAgIChlLmcuIGVqYkZpbmRMYXJnZUFjY291bnRzKS4gVGhlIG1hdGNoaW5nIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBoYXZlIHRoZSAKLQkgKiAgICAgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgbWF5IGJlIGRpZmZlcmVudC4pCi0JICouLi4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCSAqICAgICBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kIAotCSAqICAgICBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kX2JlYW5EZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZSB2ZXJpZnlNYXRjaGluZ0JlYW5GaW5kTWV0aG9kIGNoZWNrcyBmb3IgdGhlIHR3byBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOgotCQkvLyAKLQkJLy8gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkJLy8gbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCQkvLyAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JCS8vIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCQkvLyAKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCQkvLyBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kCi0JCS8vIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCXZhbGlkYXRlTWF0Y2hpbmdCZWFuRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBLZXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc5NWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIFZhbGlkYXRlIGEgQk1QIGtleS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQk1QS2V5IGV4dGVuZHMgQVZhbGlkYXRlS2V5Q2xhc3MgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDEsIG5ldyBTdHJpbmdbXXtDSEtKMjAwMStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTksIG5ldyBTdHJpbmdbXXtDSEtKMjAxOStFWFR9KTsKLQotLy9Eb24ndCB1c2UgdGhhdCBBVmFsaWRhdGVFSkIgbWV0aG9kCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitFWFR9KTsKLS8vRG9uJ3QgdXNlIHRoYXQgQVZhbGlkYXRlRUpCIG1ldGhvZAkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrRVhUfSk7Ci0vL0Rvbid0IHVzZSB0aGF0IEFWYWxpZGF0ZUVKQiBtZXRob2QJCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWN0dWFsbHkgZG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7Ci0KLQkJLy9Ob3RoaW5nIHRvIGRvLgotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBSZW1vdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUFJlbW90ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ2NDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUFJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIFZhbGlkYXRlcyB0aGUgcmVtb3RlIGludGVyZmFjZSBvZiBhIEJNUCBiZWFuLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBSZW1vdGUgZXh0ZW5kcyBBVmFsaWRhdGVSZW1vdGUgIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuZXIiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEyLCBuZXcgU3RyaW5nW117Q0hLSjIwMTIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitCRVhULCBDSEtKMjQxMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMywgbmV3IFN0cmluZ1tde0NIS0oyNDEzK0JFWFQsIENIS0oyNDEzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE0LCBuZXcgU3RyaW5nW117Q0hLSjI0MTQrQkVYVCwgQ0hLSjI0MTQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNStCRVhULCBDSEtKMjQxNStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4Y2JmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkgYmVhbiBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKgotICogQWxsIDkuMi5YIHNlY3Rpb25zIGRlc2NyaWJlIEJNUCByZXF1aXJlbWVudHMuCi0gKiBJZiBhIENNUCByZXF1aXJlbWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGVzZSwgdGhlbiB0aGUgZGlmZmVyZW5jZXMgYXJlCi0gKiBkb2N1bWVudGVkIGluIDkuNC5YIHNlY3Rpb25zLgotICoKLSAqCi0gKiA5LjQuMSBDb250YWluZXItbWFuYWdlZCBmaWVsZHMKLSAqLi4uCi0gKiBUaGUgZmllbGRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgcHVibGljLCBhbmQgbXVzdCBub3QgYmUgCi0gKiBkZWZpbmVkIGFzIHRyYW5zaWVudC4KLSAqLi4uCi0gKiAgIC0gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZW5zdXJlIHRoYXQgYW4gZW50aXR5IGJlYW4gY2FuIGJlIGRlcGxveWVkIGluIGFueSAKLSAqICAgICBjb21wbGlhbnQgY29udGFpbmVyLgotICogICAgICAgIC0gVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSB0eXBlcyAKLSAqICAgICAgICAgIGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZzogCi0gKiAgICAgICAgICBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHByaW1pdGl2ZSB0eXBlcywgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSAKLSAqICAgICAgICAgIHNlcmlhbGl6YWJsZSB0eXBlcywgYW5kIHJlZmVyZW5jZXMgb2YgZW50ZXJwcmlzZSBiZWFucycgcmVtb3RlIG9yIGhvbWUgCi0gKiAgICAgICAgICBpbnRlcmZhY2VzLgotICogICAgICAgIC0gVGhlIENvbnRhaW5lciBQcm92aWRlciBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIHVzZSBKYXZhIHByb2dyYW1taW5nIAotICogICAgICAgICAgbGFuZ3VhZ2UgU2VyaWFsaXphdGlvbiB0byBzdG9yZSB0aGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIGluIHRoZSBkYXRhYmFzZS4gCi0gKiAgICAgICAgICBJZiB0aGUgY29udGFpbmVyIGNob29zZXMgYSBkaWZmZXJlbnQgYXBwcm9hY2gsIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGVxdWl2YWxlbnQgCi0gKiAgICAgICAgICB0byB0aGF0IG9mIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgU2VyaWFsaXphdGlvbi4gVGhlIENvbnRhaW5lciBtdXN0IGFsc28gYmUgCi0gKiAgICAgICAgICBjYXBhYmxlIG9mIHBlcnNpc3RpbmcgcmVmZXJlbmNlcyB0byBlbnRlcnByaXNlIGJlYW5zJyByZW1vdGUgYW5kIGhvbWUgaW50ZXJmYWNlcyAKLSAqICAgICAgICAgIChmb3IgZXhhbXBsZSwgYnkgc3RvcmluZyB0aGVpciBoYW5kbGUgb3IgcHJpbWFyeSBrZXkpLgotICouLi4KLSAqCi0gKiA5LjQuMiBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUKLSAqLi4uCi0gKiAgIC0gVGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIHRvIHJldHVybiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgdHlwZS4gCi0gKiAgICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHNob3VsZCBiZSBjb2RlZCB0byByZXR1cm4gYSBudWxsLiAKLSAqICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaWdub3JlZCBieSB0aGUgQ29udGFpbmVyLgotICouLi4KLSAqCi0gKiA5LjQuNiBmaW5kZXIgbWV0aG9kcwotICogICAtIFRoZSBlbnRpdHkgQmVhbiBQcm92aWRlciBkb2VzIG5vdCB3cml0ZSB0aGUgZmluZGVyIChlamJGaW5kPE1FVEhPRD4oLi4uKSkgbWV0aG9kcy4KLSAqLi4uCi0gKiA5LjQuNyBwcmltYXJ5IGtleSB0eXBlCi0gKiAgIC0gVGhlIGNvbnRhaW5lciBtdXN0IGJlIGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gVGhlcmVmb3JlLCAKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZSBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSAKLSAqICAgICBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgaW4gdGhpcyBzdWJzZWN0aW9uLCBpbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQgaW4gCi0gKiAgICAgU3Vic2VjdGlvbiA5LjIuOS4KLSAqCi0gKiAgICAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjbGFzcyBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZToKLSAqICAgICAgICAtIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBhIHNpbmdsZSBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuCi0gKiAgICAgICAgLSBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcy4KLSAqICAgICBUaGUgc2Vjb25kIG1ldGhvZCBpcyBuZWNlc3NhcnkgZm9yIGltcGxlbWVudGluZyBjb21wb3VuZCBrZXlzLCBhbmQgdGhlIGZpcnN0IG1ldGhvZCBpcyBjb252ZW5pZW50IGZvcgotICogICAgIHNpbmdsZS1maWVsZCBrZXlzLiBXaXRob3V0IHRoZSBmaXJzdCBtZXRob2QsIHNpbXBsZSB0eXBlcyBzdWNoIGFzIFN0cmluZyB3b3VsZCBoYXZlIHRvIGJlIHdyYXBwZWQgaW4gYQotICogICAgIHVzZXItZGVmaW5lZCBjbGFzcy4KLSAqIAotICogICAgIDkuNC43LjEgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBCZWFuIFByb3ZpZGVyIHVzZXMgdGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIHNwZWNpZnkgdGhlCi0gKiAgICAgY29udGFpbmVyLW1hbmFnZWQgZmllbGQgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkga2V5LiBUaGUgZmllbGQncyB0eXBlIG11c3QgYmUKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLSAqCi0gKiAgICAgOS40LjcuMiBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0gKiAgICAgQWxsIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0gKiAgICAgVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHRoZSBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcy4gKFRoaXMgYWxsb3dzIHRoZSBjb250YWluZXIgdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZyb20gYW4gaW5zdGFuY2UncyBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotICoKLSAqICAgICA5LjQuNy4zIFNwZWNpYWwgY2FzZTogVW5rbm93biBwcmltYXJ5IGtleSBjbGFzcwotICogICAgIEluIHNwZWNpYWwgc2l0dWF0aW9ucywgdGhlIGVudGl0eSBCZWFuIFByb3ZpZGVyIG1heSBjaG9vc2Ugbm90IHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IGNsYXNzIGZvciBhbgotICogICAgIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIFRoaXMgY2FzZSB1c3VhbGx5IGhhcHBlbnMgd2hlbiB0aGUgZW50aXR5IGJlYW4gZG9lcwotICogICAgIG5vdCBoYXZlIGEgbmF0dXJhbCBwcmltYXJ5IGtleSwgYW5kIHRoZSBCZWFuIFByb3ZpZGVyIHdhbnRzIHRvIGFsbG93IHRoZSBEZXBsb3llciB0byBzZWxlY3QgdGhlIHByaW1hcnkKLSAqICAgICBrZXkgZmllbGRzIGF0IGRlcGxveW1lbnQgdGltZS4gVGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSB3aWxsIHVzdWFsbHkgYmUgZGVyaXZlZCBmcm9tIHRoZSBwcmltYXJ5Ci0gKiAgICAga2V5IHR5cGUgdXNlZCBieSB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBzeXN0ZW0gdGhhdCBzdG9yZXMgdGhlIGVudGl0eSBvYmplY3RzLiBUaGUgcHJpbWFyeSBrZXkKLSAqICAgICB1c2VkIGJ5IHRoZSBkYXRhYmFzZSBzeXN0ZW0gbWF5IG5vdCBiZSBrbm93biB0byB0aGUgQmVhbiBQcm92aWRlci4KLSAqICAgICBXaGVuIGRlZmluaW5nIHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIGVudGVycHJpc2UgYmVhbiwgdGhlIERlcGxveWVyIG1heSBzb21ldGltZXMgbmVlZCB0byBzdWJjbGFzcwotICogICAgIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0byBhZGQgYWRkaXRpb25hbCBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgKHRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgZm9yIGVudGl0eSBiZWFucwotICogICAgIHRoYXQgZG8gbm90IGhhdmUgYSBuYXR1cmFsIHByaW1hcnkga2V5LCBhbmQgdGhlIHByaW1hcnkga2V5cyBhcmUgc3lzdGVtLWdlbmVyYXRlZCBieSB0aGUgdW5kZXJseWluZwotICogICAgIGRhdGFiYXNlIHN5c3RlbSB0aGF0IHN0b3JlcyB0aGUgZW50aXR5IG9iamVjdHMpLgotICogICAgIEluIHRoaXMgc3BlY2lhbCBjYXNlLCB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgb2YgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMKLSAqICAgICBqYXZhLmxhbmcuT2JqZWN0LCBhbmQgdGhlIHJldHVybiB2YWx1ZSBvZiBlamJDcmVhdGUoKSBtdXN0IGJlIGRlY2xhcmVkIGFzCi0gKiAgICAgamF2YS5sYW5nLk9iamVjdC4gVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpbiB0aGUgZGVwbG95bWVudAotICogICAgIGRlc2NyaXB0b3IgYXMgb2YgdGhlIHR5cGUgamF2YS5sYW5nLk9iamVjdC4KLSAqICAgICBUaGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMgc3BlY2lmaWVkIGF0IGRlcGxveW1lbnQgdGltZSBpbiB0aGUgc2l0dWF0aW9ucyB3aGVuIHRoZSBCZWFuIFByb3ZpZGVyIGRldmVsb3BzCi0gKiAgICAgYW4gZW50aXR5IGJlYW4gdGhhdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgYmFjay1lbmRzIHRoYXQgcHJvdmlkZSBwZXJzaXN0ZW5jZSwgYW5kIHdoZW4KLSAqICAgICB0aGVzZSBtdWx0aXBsZSBiYWNrLWVuZHMgcmVxdWlyZSBkaWZmZXJlbnQgcHJpbWFyeSBrZXkgc3RydWN0dXJlcy4KLSAqICAgICBVc2Ugb2YgZW50aXR5IGJlYW5zIHdpdGggYSBkZWZlcnJlZCBwcmltYXJ5IGtleSB0eXBlIHNwZWNpZmljYXRpb24gbGltaXRzIHRoZSBjbGllbnQgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcKLSAqICAgICBtb2RlbCwgYmVjYXVzZSB0aGUgY2xpZW50cyB3cml0dGVuIHByaW9yIHRvIGRlcGxveW1lbnQgb2YgdGhlIGVudGl0eSBiZWFuIG1heSBub3QgdXNlLCBpbiBnZW5lcmFsLAotICogICAgIHRoZSBtZXRob2RzIHRoYXQgcmVseSBvbiB0aGUga25vd2xlZGdlIG9mIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotICogICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG1ldGhvZHMgbXVzdCBiZSBkb25lIGNhcmVmdWxseS4gRm9yIGV4YW1wbGUsIHRoZSBtZXRoLW9kcwotICogICAgIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBFbnRpdHlDb250ZXh0LmdldFByaW1hcnlLZXkoKSwgYmVjYXVzZQotICogICAgIHRoZSByZXR1cm4gdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBEZXBsb3llciBhZnRlciB0aGUgRUpCIGNsYXNzIGhhcyBiZWVuIHdyaXR0ZW4uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVDTVBCZWFuIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5QmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgTGlzdCBfY29udGFpbmVyTWFuYWdlZEZpZWxkcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDIsIG5ldyBTdHJpbmdbXXtDSEtKMjAwMitCRVhULCBDSEtKMjAwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNCwgbmV3IFN0cmluZ1tde0NIS0oyMDA0K0JFWFQsIENIS0oyMDA0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA2LCBuZXcgU3RyaW5nW117Q0hLSjIwMDYrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNywgbmV3IFN0cmluZ1tde0NIS0oyMDA3K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjgsIG5ldyBTdHJpbmdbXXtDSEtKMjAyOCtCRVhULCBDSEtKMjAyOCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyOSwgbmV3IFN0cmluZ1tde0NIS0oyMDI5K0JFWFQsIENIS0oyMDI5K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzMiwgbmV3IFN0cmluZ1tde0NIS0oyMDMyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzMsIG5ldyBTdHJpbmdbXXtDSEtKMjAzMytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM0LCBuZXcgU3RyaW5nW117Q0hLSjIwMzQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzNSwgbmV3IFN0cmluZ1tde0NIS0oyMDM1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzYsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM3LCBuZXcgU3RyaW5nW117Q0hLSjIwMzcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzOCwgbmV3IFN0cmluZ1tde0NIS0oyMDM4K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzksIG5ldyBTdHJpbmdbXXtDSEtKMjAzOStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDAsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMCtPTl9CQVNFK1NQRUMsIENIS0oyMjAwK09OX1RISVMrU1BFQ30pOyAvLyBDSEtKMjIwMCBpcyBhIHNwZWNpYWwgY2FzZS4gSXQncyBzaGFyZWQgYnkgYWxsIGJlYW4gdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMSwgbmV3IFN0cmluZ1tde0NIS0oyMjAxK0JFWFQsIENIS0oyMjAxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjAyLCBuZXcgU3RyaW5nW117Q0hLSjIyMDIrQkVYVCwgQ0hLSjIyMDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMytCRVhULCBDSEtKMjIwMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNywgbmV3IFN0cmluZ1tde0NIS0oyMjA3K0VYVCwgQ0hLSjIyMDcrRVhUfSk7IC8vIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgbWVzc2FnZSBpZCBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBtZXRob2QgaXMgaW5oZXJpdGVkCi0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfYnVzK0JFWFQsIENIS0oyNDAwX2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJGaW5kK0JFWFQsIENIS0oyNDAwX2VqYkZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNiwgbmV3IFN0cmluZ1tde0NIS0oyNDA2K0JFWFQsIENIS0oyNDA2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2J1cytCRVhULCBDSEtKMjQwOF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA4X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiRmluZCtCRVhULCBDSEtKMjQwOV9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiRmluZCtCRVhULCBDSEtKMjQxMF9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxOCwgbmV3IFN0cmluZ1tde0NIS0oyNDE4K0JFWFQsIENIS0oyNDE4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIwLCBuZXcgU3RyaW5nW117Q0hLSjI0MjArQkVYVCwgQ0hLSjI0MjArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMitCRVhULCBDSEtKMjQzMitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9jb250YWluZXJNYW5hZ2VkRmllbGRzID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgewotCQlyZXR1cm4gX2NvbnRhaW5lck1hbmFnZWRGaWVsZHM7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc0NvbnRhaW5lck1hbmFnZWRGaWVsZCgpIHsKLQkJcmV0dXJuIChnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgIT0gbnVsbCAmJiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkuc2l6ZSgpID4gMCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgIT0gbnVsbCAmJiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkuY29udGFpbnMoZmllbGQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogOS40LjEgQ29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICouLi4KLQkgKiBUaGUgZmllbGRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgcHVibGljLCBhbmQgbXVzdCBub3QgYmUgCi0JICogZGVmaW5lZCBhcyB0cmFuc2llbnQuCi0JICouLi4KLQkgKiAgIC0gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZW5zdXJlIHRoYXQgYW4gZW50aXR5IGJlYW4gY2FuIGJlIGRlcGxveWVkIGluIGFueSAKLQkgKiAgICAgY29tcGxpYW50IGNvbnRhaW5lci4KLQkgKiAgICAgICAgLSBUaGUgQmVhbiBQcm92aWRlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHR5cGVzIAotCSAqICAgICAgICAgIGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZzogCi0JICogICAgICAgICAgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBwcmltaXRpdmUgdHlwZXMsIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgCi0JICogICAgICAgICAgc2VyaWFsaXphYmxlIHR5cGVzLCBhbmQgcmVmZXJlbmNlcyBvZiBlbnRlcnByaXNlIGJlYW5zJyByZW1vdGUgb3IgaG9tZSAKLQkgKiAgICAgICAgICBpbnRlcmZhY2VzLgotCSAqLi4uCi0JICoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEhvbWVfaG9tZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGhvbWVJbnRmID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lSW50Zik7Ci0KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSwgaG9tZUludGYpOwotCX0KLQkKLQkvKioKLQkgKiA5LjQuMSBDb250YWluZXItbWFuYWdlZCBmaWVsZHMKLQkgKi4uLgotCSAqIFRoZSBmaWVsZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBhcyBwdWJsaWMsIGFuZCBtdXN0IG5vdCBiZSAKLQkgKiBkZWZpbmVkIGFzIHRyYW5zaWVudC4KLQkgKi4uLgotCSAqICAgLSBUaGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBlbnN1cmUgdGhhdCBhbiBlbnRpdHkgYmVhbiBjYW4gYmUgZGVwbG95ZWQgaW4gYW55IAotCSAqICAgICBjb21wbGlhbnQgY29udGFpbmVyLgotCSAqICAgICAgICAtIFRoZSBCZWFuIFByb3ZpZGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdHlwZXMgCi0JICogICAgICAgICAgYXNzaWduZWQgdG8gdGhlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcyBhcmUgcmVzdHJpY3RlZCB0byB0aGUgZm9sbG93aW5nOiAKLQkgKiAgICAgICAgICBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHByaW1pdGl2ZSB0eXBlcywgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSAKLQkgKiAgICAgICAgICBzZXJpYWxpemFibGUgdHlwZXMsIGFuZCByZWZlcmVuY2VzIG9mIGVudGVycHJpc2UgYmVhbnMnIHJlbW90ZSBvciBob21lIAotCSAqICAgICAgICAgIGludGVyZmFjZXMuCi0JICouLi4KLQkgKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBpcyB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRSZW1vdGVfcmVtb3RlRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlKYXZhQ2xhc3MgcmVtb3RlSW50ZiA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZW1vdGVJbnRmKTsKLQotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpLCByZW1vdGVJbnRmKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGxvYWRDb250YWluZXJNYW5hZ2VkRmllbGRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIFRoZSB2YWxpZGF0aW9uIGluIHRoaXMgY2xhc3MsIG9mIHRoZSBmaWVsZHMsIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZQotCQkvLyBjb250YWluZXItbWFuYWdlZCBmaWVsZHMsIG5vdCB0aGUgZmllbGRzIG9mIHRoaXMgY2xhc3MgZGlyZWN0bHkuCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJTGlzdCBmaWVsZHMgPSBudWxsOwotCQl0cnkgewotCQkJTGlzdCBjbXBBdHRyaWJ1dGVzID0gKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQkJaWYgKGNtcEF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhY21wQXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKLQkJCQlmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KGNtcEF0dHJpYnV0ZXMuc2l6ZSgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNtcEF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspCi0JCQkJCWZpZWxkcy5hZGQoKChDTVBBdHRyaWJ1dGUpIGNtcEF0dHJpYnV0ZXMuZ2V0KGkpKS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZXhjKTsKLQkJCX0KLQkJCWZpZWxkcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiAxOC4xLjIgUHJvZ3JhbW1pbmcgcmVzdHJpY3Rpb25zCi0JICouLi4KLQkgKiAgICAtIEFuIGVudGVycHJpc2UgQmVhbiBtdXN0IG5vdCB1c2UgcmVhZC93cml0ZSBzdGF0aWMgZmllbGRzLiBVc2luZyByZWFkLW9ubHkgc3RhdGljIGZpZWxkcyBpcwotCSAqICAgYWxsb3dlZC4gVGhlcmVmb3JlLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzdGF0aWMgZmllbGRzIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY2xhc3MgYmUKLQkgKiAgIGRlY2xhcmVkIGFzIGZpbmFsLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByaW1WYWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCXZhbGlkYXRlQ29udGFpbmVyTWFuYWdlZEZpZWxkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCX0KLQkKLQkvKioKLQkgKiA5LjIuNiBCdXNpbmVzcyBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBidXNpbmVzcyBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0JICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgbmFtZXMgY2FuIGJlIGFyYml0cmFyeSwgYnV0IHRoZXkgbXVzdCBub3Qgc3RhcnQgd2l0aCBlamIgdG8gCi0JICogICAgICAgICAgYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLQkgKiAgICAgICAgLSBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkgKiAgICAgICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLgotCSAqICAgICAgICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSAKLQkgKiAgICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotCSAqICAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgICAgICAgc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQkgKiAgICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBQZXJmb3JtIGNvbW1vbiBCTVAvQ01QIGJ1c2luZXNzIG1ldGhvZCBjaGVja3MKLQkJaWYgKCFpc0VqYlJlbGF0aW9uc2hpcFJvbGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKQotCQkJc3VwZXIudmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gTm8gc3BlY2lmaWMgQ01QIGJ1c2luZXNzIG1ldGhvZCBjaGVja3MuCi0JCS8vIEFsbCBvZiB0aGUgcG9pbnRzIGluIDkuMi42IGFyZSBjb21tb24gdG8gYm90aCBCTVBzICYgQ01Qcy4KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01ldGhvZE5vUmVtb3RlRXhjZXB0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKCFpc0VqYlJlbGF0aW9uc2hpcFJvbGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKQotCQkJc3VwZXIudmFsaWRhdGVCdXNpbmVzc01ldGhvZE5vUmVtb3RlRXhjZXB0aW9uKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsgLy8gRUpCIDIuMCBhZGRlZCAidGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBhYm92ZSIKLQl9Ci0JCi0JLyoqCi0JICogOS4yLjIgRW50ZXJwcmlzZSBiZWFuIGNsYXNzCi0JICogICAtIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIGFuIGVudGl0eSBiZWFuIGNsYXNzOgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuRW50aXR5QmVhbiBpbnRlcmZhY2UuCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGJlIGRlZmluZWQgYXMgcHVibGljIGFuZCBtdXN0IG5vdCBiZSBhYnN0cmFjdC4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZmluYWwuCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGRlZmluZSB0aGUgZmluYWxpemUoKSBtZXRob2QuCi0JICogICAtIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIFs5XS4gCi0JICogICAgIElmIHRoZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UsIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgbm8tb3AgCi0JICogICAgIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBqYXZheC5lamIuRUpCT2JqZWN0IGludGVyZmFjZS4gVGhlIGNvbnRhaW5lciAKLQkgKiAgICAgd2lsbCBuZXZlciBpbnZva2UgdGhlc2UgbWV0aG9kcyBvbiB0aGUgYmVhbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KLQkgKiAgIC0gQSBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBtZXRob2RzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIAotCSAqICAgICBkZWZpbmluZyB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgYWJzdHJhY3QuCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgYW5kIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlLCBhbmQgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgYXMgZGVzY3JpYmVkIAotCSAqICAgICBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gCi0JICogICAgIElmIHRoZSBlbnRpdHkgYmVhbiBoYXMgc3VwZXJjbGFzc2VzLCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIAotCSAqICAgICBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcywgdGhlIGZpbmRlciBtZXRob2RzLCBhbmQgdGhlCi0JICogICAgIG1ldGhvZHMgb2YgdGhlIEVudGl0eUJlYW4gaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgCi0JICogICAgIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIGlzIGFsbG93ZWQgdG8gaW1wbGVtZW50IG90aGVyIG1ldGhvZHMgKGZvciAKLQkgKiAgICAgZXhhbXBsZSBoZWxwZXIgbWV0aG9kcyBpbnZva2VkIGludGVybmFsbHkgYnkgdGhlIGJ1c2luZXNzIG1ldGhvZHMpIAotCSAqICAgICBpbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyByZXF1aXJlZCBieSB0aGUgRUpCIHNwZWNpZmljYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEFsbCBvZiB0aGUgYWJvdmUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgdGhlIHBhcmVudC4KLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCi0JCXZhbGlkYXRlUHJpbWl0aXZlUHJpbWFyeUtleSh2YywgYmVhbiwgY2xhenopOyAvLyBpZiB0aGlzIGNsYXNzIHVzZXMgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIHRoZSB0eXBlIG9mIHRoZSBrZXkgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQKLQl9Ci0JCi0JLyoqCi0JICogOS40LjEgQ29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICouLi4KLQkgKiBUaGUgZmllbGRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgcHVibGljLCBhbmQgbXVzdCBub3QgYmUgCi0JICogZGVmaW5lZCBhcyB0cmFuc2llbnQuCi0JICouLi4KLQkgKiAgIC0gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZW5zdXJlIHRoYXQgYW4gZW50aXR5IGJlYW4gY2FuIGJlIGRlcGxveWVkIGluIGFueSAKLQkgKiAgICAgY29tcGxpYW50IGNvbnRhaW5lci4KLQkgKiAgICAgICAgLSBUaGUgQmVhbiBQcm92aWRlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHR5cGVzIAotCSAqICAgICAgICAgIGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZzogCi0JICogICAgICAgICAgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBwcmltaXRpdmUgdHlwZXMsIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgCi0JICogICAgICAgICAgc2VyaWFsaXphYmxlIHR5cGVzLCBhbmQgcmVmZXJlbmNlcyBvZiBlbnRlcnByaXNlIGJlYW5zJyByZW1vdGUgb3IgaG9tZSAKLQkgKiAgICAgICAgICBpbnRlcmZhY2VzLgotCSAqLi4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb250YWluZXJNYW5hZ2VkRmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29udGFpbmVyTWFuYWdlZEZpZWxkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpKSB7Ci0JCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMoZmllbGQpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMjAzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQotCQkJaWYgKGZpZWxkLmlzVHJhbnNpZW50KCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIyMDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQkvLyBDaGVjayBpZiBpdCdzIGEgcmVmZXJlbmNlIHRvIHRoZSBob21lIG9yIHJlbW90ZSBpbnRlcmZhY2UuCi0JCQl2YWxpZGF0ZUNvbnRhaW5lck1hbmFnZWRGaWVsZF9kZXBlbmRlbnQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogOS40LjEgQ29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICouLi4KLQkgKiBUaGUgZmllbGRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgcHVibGljLCBhbmQgbXVzdCBub3QgYmUgCi0JICogZGVmaW5lZCBhcyB0cmFuc2llbnQuCi0JICouLi4KLQkgKiAgIC0gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZW5zdXJlIHRoYXQgYW4gZW50aXR5IGJlYW4gY2FuIGJlIGRlcGxveWVkIGluIGFueSAKLQkgKiAgICAgY29tcGxpYW50IGNvbnRhaW5lci4KLQkgKiAgICAgICAgLSBUaGUgQmVhbiBQcm92aWRlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHR5cGVzIAotCSAqICAgICAgICAgIGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZzogCi0JICogICAgICAgICAgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBwcmltaXRpdmUgdHlwZXMsIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgCi0JICogICAgICAgICAgc2VyaWFsaXphYmxlIHR5cGVzLCBhbmQgcmVmZXJlbmNlcyBvZiBlbnRlcnByaXNlIGJlYW5zJyByZW1vdGUgb3IgaG9tZSAKLQkgKiAgICAgICAgICBpbnRlcmZhY2VzLgotCSAqLi4uCi0JICoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgZWl0aGVyIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLCAKLQkgKiBvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb250YWluZXJNYW5hZ2VkRmllbGRfZGVwZW5kZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlKYXZhSGVscGVycyBmaWVsZFR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCk7Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTZXJpYWxpemFibGUoZmllbGRUeXBlLCBiZWFuKSkgewotCQkJLy8gSWYgaXQgd2VyZSBwcmltaXRpdmUsIGl0IHdvdWxkIGJlIHNlcmlhbGl6YWJsZSwgc28gdHdvIGNoZWNrcyB3ZXJlIGRvbmUgaW4gdGhhdCBvbmUgbGluZSBvZiBjb2RlLgotCQkJLy8gCi0JCQkvLyBDaGVjayBpZiBpdCdzIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgb3IgaG9tZSBpbnRlcmZhY2UKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQlpZiAoIShpc0NvbnRhaW5lck1hbmFnZWRIb21lX2hvbWVEZXAodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCkpIHx8IChpc0NvbnRhaW5lck1hbmFnZWRSZW1vdGVfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjIwMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA5LjQuNiBmaW5kZXIgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IEJlYW4gUHJvdmlkZXIgZG9lcyBub3Qgd3JpdGUgdGhlIGZpbmRlciAoZWpiRmluZDxNRVRIT0Q+KC4uLikpIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQkvLyBPbmx5IEJNUHMgaW1wbGVtZW50IGZpbmRlciBtZXRob2RzLgotCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvbGxvd3MgdGhlIEVKQiAxLjEuIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiA5LjIuNCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMKLQkgKiAtIEZvciBlYWNoIGVqYkNyZWF0ZSguLi4pIG1ldGhvZCwgdGhlIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgbWF0Y2hpbmcgCi0JICogICBlamJQb3N0Q3JlYXRlKC4uLikgbWV0aG9kLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotCSAqICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiUG9zdENyZWF0ZS4KLQkgKiAgICAtIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0JICogICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50cyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1hdGNoaW5nIAotCSAqICAgICAgZWpiQ3JlYXRlKC4uLikgbWV0aG9kLgotCSAqICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0JICogICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JICogICAgICBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgdG8gdGhyb3cgCi0JICogICAgICB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gCi0JICogICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIAotCSAqICAgICAgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciAKLQkgKiAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSAKLQkgKiAgICAgIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKi4uLgotCSAqIDkuNC4yIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZQotCSAqLi4uCi0JICogICAtIFRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHByaW1hcnkga2V5IGNsYXNzIHR5cGUuIAotCSAqICAgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgc2hvdWxkIGJlIGNvZGVkIHRvIHJldHVybiBhIG51bGwuIAotCSAqICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaWdub3JlZCBieSB0aGUgQ29udGFpbmVyLgotCSAqLi4uCi0JKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBQZXJmb3JtIGNvbW1vbiBCTVAvQ01QIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGNoZWNrcwotCQlzdXBlci52YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIE5vIHNwZWNpZmljIENNUCBlamJQb3N0Q3JlYXRlTWV0aG9kIGNoZWNrcy4KLQkJLy8gQWxsIG9mIHRoZSBwb2ludHMgaW4gOS4yLjQgYXJlIGNvbW1vbiB0byBib3RoIEJNUHMgJiBDTVBzLgotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByaW1pdGl2ZVByaW1hcnlLZXkoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOyAvLyBiZWFuIGlzIGNoZWNrZWQgZm9yIG51bGwgaW4gQVZhbGlkYXRlRUpCLnZhbGlkYXRlKCkgbWV0aG9kLCBzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBpdCBoZXJlLgotCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCS8vIHByaW1pdGl2ZSBwcmltYXJ5IGtleQotCi0JCQkvLyBwcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gYSBzaW5nbGUgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzCi0JCQkvLyBUaGUgZmllbGQncyB0eXBlIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUuCi0JCQlDTVBBdHRyaWJ1dGUga2V5QXR0cmlidXRlID0gY21wLmdldFByaW1LZXlGaWVsZCgpOwotCQkJRmllbGQga2V5RmllbGQgPSAoa2V5QXR0cmlidXRlID09IG51bGwpID8gbnVsbCA6IGtleUF0dHJpYnV0ZS5nZXRGaWVsZCgpOwotCQkJSmF2YUNsYXNzIHByaW1hcnlLZXkgPSBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCQkJaWYgKChrZXlGaWVsZCA9PSBudWxsKSB8fCAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oKEphdmFIZWxwZXJzKWtleUZpZWxkLmdldEVUeXBlKCksIHByaW1hcnlLZXkpKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsga2V5QXR0cmlidXRlLmdldE5hbWUoKSwgcHJpbWFyeUtleS5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjIwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwga2V5RmllbGQsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgZmllbGQgZXhpc3RzIG9uIHRoZSBiZWFuLgotCSAqLwotCXB1YmxpYyB2b2lkIHZlcmlmeUZpZWxkRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKCFoYXNDb250YWluZXJNYW5hZ2VkRmllbGQoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDMyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0JCV9jb250YWluZXJNYW5hZ2VkRmllbGRzID0gbG9hZENvbnRhaW5lck1hbmFnZWRGaWVsZHModmMsIChFbnRlcnByaXNlQmVhbil0YXJnZXRQYXJlbnQsIChKYXZhQ2xhc3MpdGFyZ2V0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEtleS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOGI2YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBiZWFuIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqCi0gKiBBbGwgOS4yLlggc2VjdGlvbnMgZGVzY3JpYmUgQk1QIHJlcXVpcmVtZW50cy4gKEFuZCB0aGUgYnVsayBvZiB0aG9zZQotICogYXJlIGltcGxlbWVudGVkIGluIFZhbGlkYXRlS2V5Q2xhc3MuKQotICogSWYgYSBDTVAgcmVxdWlyZW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gdGhlc2UsIHRoZW4gdGhlIGRpZmZlcmVuY2VzIGFyZQotICogZG9jdW1lbnRlZCBpbiA5LjQuWCBzZWN0aW9ucy4KLSAqCi0gKiA5LjQuNyBwcmltYXJ5IGtleSB0eXBlCi0gKiAgIC0gVGhlIGNvbnRhaW5lciBtdXN0IGJlIGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gVGhlcmVmb3JlLCAKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZSBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSAKLSAqICAgICBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgaW4gdGhpcyBzdWJzZWN0aW9uLCBpbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQgaW4gCi0gKiAgICAgU3Vic2VjdGlvbiA5LjIuOS4KLSAqCi0gKiAgICAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjbGFzcyBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZToKLSAqICAgICAgICAtIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBhIHNpbmdsZSBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuCi0gKiAgICAgICAgLSBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcy4KLSAqICAgICBUaGUgc2Vjb25kIG1ldGhvZCBpcyBuZWNlc3NhcnkgZm9yIGltcGxlbWVudGluZyBjb21wb3VuZCBrZXlzLCBhbmQgdGhlIGZpcnN0IG1ldGhvZCBpcyBjb252ZW5pZW50IGZvcgotICogICAgIHNpbmdsZS1maWVsZCBrZXlzLiBXaXRob3V0IHRoZSBmaXJzdCBtZXRob2QsIHNpbXBsZSB0eXBlcyBzdWNoIGFzIFN0cmluZyB3b3VsZCBoYXZlIHRvIGJlIHdyYXBwZWQgaW4gYQotICogICAgIHVzZXItZGVmaW5lZCBjbGFzcy4KLSAqIAotICogICAgIDkuNC43LjEgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBCZWFuIFByb3ZpZGVyIHVzZXMgdGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIHNwZWNpZnkgdGhlCi0gKiAgICAgY29udGFpbmVyLW1hbmFnZWQgZmllbGQgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkga2V5LiBUaGUgZmllbGQncyB0eXBlIG11c3QgYmUKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLSAqCi0gKiAgICAgOS40LjcuMiBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0gKiAgICAgQWxsIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0gKiAgICAgVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHRoZSBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcy4gKFRoaXMgYWxsb3dzIHRoZSBjb250YWluZXIgdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZyb20gYW4gaW5zdGFuY2UncyBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotICouLi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQ01QS2V5IGV4dGVuZHMgQVZhbGlkYXRlS2V5Q2xhc3MgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gaGFzQUNvbnN0cnVjdG9yID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgU2V0IF9iZWFuRmllbGROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAxLCBuZXcgU3RyaW5nW117Q0hLSjIwMDErRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE5LCBuZXcgU3RyaW5nW117Q0hLSjIwMTkrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIwLCBuZXcgU3RyaW5nW117Q0hLSjIwMjArRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMSwgbmV3IFN0cmluZ1tde0NIS0oyMDIxK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNSwgbmV3IFN0cmluZ1tde0NIS0oyMjA1K0JFWFQsIENIS0oyMjA1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjA2LCBuZXcgU3RyaW5nW117Q0hLSjIyMDYrQkVYVCwgQ0hLSjIyMDYrTUVYVH0pOyAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIGlkIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgbWV0aG9kIGlzIGluaGVyaXRlZCBvciBub3QKLQkJCi0vL0FWYWxpZGF0ZUVKQiBtZXRob2Qgbm90IHVzZWQJCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLS8vQVZhbGlkYXRlRUpCIG1ldGhvZCBub3QgdXNlZAkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotLy9BVmFsaWRhdGVFSkIgbWV0aG9kIG5vdCB1c2VkCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjksIG5ldyBTdHJpbmdbXXtDSEtKMjgyOSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9iZWFuRmllbGROYW1lcy5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpcGFyZW50OwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyBkbyBub3QgdmFsaWRhdGUgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkKLQkJfQotCQkKLQkJcmV0dXJuIGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQkvKgotCSAqIDkuNC43LjEgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotCSAqICAgICBUaGUgQmVhbiBQcm92aWRlciB1c2VzIHRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byBzcGVjaWZ5IHRoZQotCSAqICAgICBjb250YWluZXItbWFuYWdlZCBmaWVsZCBvZiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb250YWlucyB0aGUgcHJpbWFyeSBrZXkuIFRoZSBmaWVsZCdzIHR5cGUgbXVzdCBiZQotCSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQkgKgotCSAqIDkuNC43LjIgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcyBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MKLQkgKiAgICAgVGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQgbXVzdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycy4KLQkgKiAgICAgQWxsIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgIFRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiB0aGUgY29udGFpbmVyLW1hbmFnZWQKLQkgKiAgICAgZmllbGRzLiAoVGhpcyBhbGxvd3MgdGhlIGNvbnRhaW5lciB0byBleHRyYWN0IHRoZSBwcmltYXJ5IGtleSBmaWVsZHMgZnJvbSBhbiBpbnN0YW5jZSdzIGNvbnRhaW5lci1tYW5hZ2VkCi0JICogICAgIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1aWxkRmllbGROYW1lTGlzdChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBCdWlsZCB1cCB0aGUgbGlzdCBvZiBmaWVsZCBuYW1lcyB0byBiZSB1c2VkIGluIHRoZSBmaWVsZCB2YWxpZGF0aW9uLgotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCWlmIChjbXAgPT0gbnVsbCkgewotCQkJLy8gTGV0IHRoZSBjbGFzcyB2YWxpZGF0aW9uIHRocm93IHRoZSBleGNlcHRpb24KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleShjbXApKSB7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBudWxsOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIFRoZXNlIGFyZSBkaWZmZXJlbnQgZmllbGRzIHRoYW4gdGhlIG9uZXMgdmFsaWRhdGVkIGJ5IHRoaXMKLQkJCQkJLy8gdmFsSW1wbCBjbGFzcywgc28gZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBkdXBsaWNhdGUgcmVmbGVjdGlvbgotCQkJCQkvLyB3YXJuaW5ncyBsb2dnZWQgYWdhaW5zdCB0aGUgc2FtZSBvYmplY3QuCi0JCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShhdHRyaWJ1dGUuZ2V0VHlwZSgpKTsKLQkJCQkJX2JlYW5GaWVsZE5hbWVzLmFkZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vVE9ETyAoRGFuKSBDaGFuZ2UgdG8gdXNlIHRoZSBhdHRyaWJ1dGUgZGlyZWN0bHkgYW5kIG5vdCB0aGUgZmllbGQuCi0JCQkJCXJlZmxlY3Rpb25XYXJuaW5nKHZjLCBiZWFuLCBjbGF6eiAsIGF0dHJpYnV0ZS5nZXRGaWVsZCgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWN0dWFsbHkgZG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKgotCSAqIDkuNC43LjIgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcyBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MKLQkgKiAgICAgVGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQgbXVzdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycy4KLQkgKiAgICAgQWxsIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgIFRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiB0aGUgY29udGFpbmVyLW1hbmFnZWQKLQkgKiAgICAgZmllbGRzLiAoVGhpcyBhbGxvd3MgdGhlIGNvbnRhaW5lciB0byBleHRyYWN0IHRoZSBwcmltYXJ5IGtleSBmaWVsZHMgZnJvbSBhbiBpbnN0YW5jZSdzIGNvbnRhaW5lci1tYW5hZ2VkCi0JICogICAgIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBBbGwgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMoZmllbGQpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMjA1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgdGhlIGNvbnRhaW5lci1tYW5hZ2VkCi0JCS8vIGZpZWxkcy4gKFRoaXMgYWxsb3dzIHRoZSBjb250YWluZXIgdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZyb20gYW4gaW5zdGFuY2UncyBjb250YWluZXItbWFuYWdlZAotCQkvLyBmaWVsZHMsIGFuZCB2aWNlIHZlcnNhLikKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBpZiBjbXAgaXMgbnVsbCwgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBieSB2YWxpZGF0ZUZpZWxkcygpLAotCQkvLyBhbmQgdmFsaWRhdGVGaWVsZHMoKSB3b24ndCBjYWxsIHRoaXMgbWV0aG9kIGlmIHRoZSBiZWFuIGlzIG51bGwuCi0KLQkJaWYgKCFfYmVhbkZpZWxkTmFtZXMuY29udGFpbnMoZmllbGQuZ2V0TmFtZSgpKSkgewotCQkJSmF2YUNsYXNzIGVqYkNsYXNzID0gY21wLmdldEVqYkNsYXNzKCk7Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoZWpiQ2xhc3MpOwotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgY21wLmdldE5hbWUoKSwgY21wLmdldEVqYkNsYXNzKCkuZ2V0TmFtZSgpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIyMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy8gc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7Ci0KLQkJLy9Ob3RoaW5nIHRvIGRvLgotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCWlmIChlamJNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkvLyBUaGVzZSBib29sZWFucyBhcmUgdXNlZCBpbiB0aGUgdmFsaWRhdGVNZXRob2RFeGlzdHMoKSBjaGVja3MuCi0JCQloYXNBQ29uc3RydWN0b3IgPSB0cnVlOwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhlamJNZXRob2QpICYmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApKSB7Ci0JCQkJaGFzRGVmYXVsdENvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA5LjQuNy4yIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzCi0JICogICAgIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0JICogICAgIEFsbCBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgICBUaGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgdGhlIGNvbnRhaW5lci1tYW5hZ2VkCi0JICogICAgIGZpZWxkcy4gKFRoaXMgYWxsb3dzIHRoZSBjb250YWluZXIgdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZyb20gYW4gaW5zdGFuY2UncyBjb250YWluZXItbWFuYWdlZAotCSAqICAgICBmaWVsZHMsIGFuZCB2aWNlIHZlcnNhLikKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljCi0JCWlmICghY2xhenouaXNQdWJsaWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDIwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlidWlsZEZpZWxkTmFtZUxpc3QodmMsIGJlYW4sIGNsYXp6KTsKLQotCQkvLyBEb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgZm9yIGNtcCBrZXkgYXR0cmlidXRlcyBpZiBpdCdzIG5vdCBhIHZhbGlkIHByaW0ga2V5IGZpZWxkLgotCQkvLyBwcmltYXJ5IGtleSBtdXN0IG1hcCB0byBhdCBsZWFzdCBvbmUgZmllbGQgb24gdGhlIGJlYW4gCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJLy8gcHJpbWFyeSBrZXkgbXVzdCBtYXAgdG8gYXQgbGVhc3Qgb25lIGZpZWxkIG9uIHRoZSBiZWFuIAotCQkJLy8gQnV0IGlmIGl0J3MgYW4gdW5rbm93biBrZXksIHRoZXJlJ3Mgbm8gcG9pbnQgY2hlY2tpbmcgamF2YS5sYW5nLk9iamVjdAotCQkJTGlzdCBwcmltS2V5RmllbGRzID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCWlmICgocHJpbUtleUZpZWxkcyA9PSBudWxsKSB8fCAocHJpbUtleUZpZWxkcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7IC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgTU9GSGVscGVyLmlzVmFsaWRUeXBlKHByaW1hcnlLZXkpLCBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIGNhbGxlZCBpbiB0aGUgdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvciBtZXRob2QKLQkJCQlTdHJpbmcgYmVhbk5hbWUgPSAoY21wLmdldE5hbWUoKSA9PSBudWxsKSA/ICJudWxsIiA6IGNtcC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHByaW1hcnlLZXksIG5ldyBTdHJpbmdbXSB7IHByaW1hcnlLZXkuZ2V0TmFtZSgpLCBiZWFuTmFtZSB9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqICA5LjQuNy4yIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzCi0JICogICAgIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZU1ldGhvZEV4aXN0cyh2YywgYmVhbiwgY2xhenopOwotCi0JCS8vIElmIHRoZSBjbGFzcyBoYXMgbm8gY29uc3RydWN0b3JzIGRlZmluZWQsIEphdmEgaW5zZXJ0cyBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIGFyZ3VtZW50cy4KLQkJLy8gQnV0IGlmIHRoZSBjbGFzcyBoYXMgYXQgbGVhc3Qgb25lIGNvbnN0cnVjdG9yIGRlZmluZWQsIEphdmEgd2lsbCBub3QgaW5zZXJ0IGEgY29uc3RydWN0b3IuCi0JCWlmICghaGFzRGVmYXVsdENvbnN0cnVjdG9yICYmIGhhc0FDb25zdHJ1Y3RvcikgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDIxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNBQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJaGFzRGVmYXVsdENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QUmVtb3RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBSZW1vdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1ZWQ5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBSZW1vdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBWYWxpZGF0ZXMgdGhlIHJlbW90ZSBpbnRlcmZhY2Ugb2YgYSBDTVAgYmVhbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQ01QUmVtb3RlIGV4dGVuZHMgQVZhbGlkYXRlUmVtb3RlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuZXIiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTIsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNSwgbmV3IFN0cmluZ1tde0NIS0oyNDE1K0JFWFQsIENIS0oyNDE1K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25CZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGMyOTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBTZXNzaW9uIGhvbWUgaW50ZXJmYWNlIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotICouLi4KLSAqIFRoZSBob21lIGludGVyZmFjZSBvZiBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4gbXVzdCBoYXZlIG9uZSBjcmVhdGUgCi0gKiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0gKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgc2luZ2xlIGVqYkNyZWF0ZSBtZXRob2QgdGhhdCB0YWtlcyAKLSAqIG5vIGFyZ3VtZW50cy4KLSAqLi4uCi0gKgotICogNi4xMC4yIFNlc3Npb24gYmVhbiBjbGFzcwotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3Igc2Vzc2lvbiBiZWFuIGNsYXNzOgotICogCQktIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5TZXNzaW9uQmVhbiAKLSAqICAgICAgICBpbnRlcmZhY2UuCi0gKiAJCS0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgCi0gKiAgICAgICAgYmUgYWJzdHJhY3QuCi0gKiAJCS0gVGhlIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIHBhcmFtZXRlcnMuIFRoZSAKLSAqICAgICAgICBDb250YWluZXIgdXNlcyB0aGlzIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4KLSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBub3QgZGVmaW5lIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4KLSAqIAkJLSBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIHNlc3Npb24gYmVhbidzIAotICogICAgICAgIHJlbW90ZSBpbnRlcmZhY2UgWzRdIC4KLSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgYW5kIHRoZSBlamJDcmVhdGUgbWV0aG9kcy4KLSAqIAkJLSBJZiB0aGUgY2xhc3MgaXMgYSBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4sIGl0IG1heSBvcHRpb25hbGx5IGltcGxlbWVudCAKLSAqICAgICAgICB0aGUgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotICogCQktIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIElmIHRoZSAKLSAqICAgICAgICBzZXNzaW9uIGJlYW4gaGFzIHN1cGVyY2xhc3NlcywgdGhlbiB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIGVqYkNyZWF0ZSBtZXRob2RzLCAKLSAqICAgICAgICB0aGUgbWV0aG9kcyBvZiB0aGUgU2Vzc2lvbkJlYW4gaW50ZXJmYWNlLCBhbmQgdGhlIG1ldGhvZHMgb2YgdGhlIG9wdGlvbmFsIAotICogICAgICAgIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlIG1heSBiZSBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MsIAotICogICAgICAgIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotICogCQktIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgaXMgYWxsb3dlZCB0byBpbXBsZW1lbnQgb3RoZXIgbWV0aG9kcyAoZm9yIGV4YW1wbGUgCi0gKiAgICAgICAgaGVscGVyIG1ldGhvZHMgaW52b2tlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidXNpbmVzcyBtZXRob2RzKSBpbiBhZGRpdGlvbiB0byAKLSAqICAgICAgICB0aGUgbWV0aG9kcyByZXF1aXJlZCBieSB0aGUgRUpCIHNwZWNpZmljYXRpb24uCi0gKgotICoJCVs0XSBJZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGRvZXMgaW1wbGVtZW50IHRoZSByZW1vdGUgaW50ZXJmYWNlLCBjYXJlIG11c3QgCi0gKiAgICAgICAgICBiZSB0YWtlbiB0byBhdm9pZCBwYXNzaW5nIG9mIHRoaXMgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0LiBUaGlzIAotICogICAgICAgICAgcG90ZW50aWFsIGVycm9yIGNhbiBiZSBhdm9pZGVkIGJ5IGNob29zaW5nIG5vdCB0byBpbXBsZW1lbnQgdGhlIHJlbW90ZSAKLSAqICAgICAgICAgIGludGVyZmFjZSBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLgotICoKLSAqIDYuMTAuMyBlamJDcmVhdGUgbWV0aG9kcwotICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdAotICogZm9sbG93IHRoZXNlIHJ1bGVzOgotICogCQktIFRoZSBtZXRob2QgbmFtZSBtdXN0IGJlIGVqYkNyZWF0ZS4KLSAqIAkJLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotICogCQktIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotICogCQktIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0gKiAJCS0gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0gKiAJCS0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gZXhjZXB0aW9ucywgcG9zc2libHkgCi0gKiAgICAgICAgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLiAKLSAqIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJDcmVhdGUgbWV0aG9kIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0gKiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgCi0gKiBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gCi0gKiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICoKLSAqIDYuMTAuNCBCdXNpbmVzcyBtZXRob2RzCi0gKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGJ1c2luZXNzIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLSAqIAkJLSBUaGUgbWV0aG9kIG5hbWVzIGNhbiBiZSBhcmJpdHJhcnksIGJ1dCB0aGV5IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLSAqIAkJLSBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotICogCQktIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotICogCQktIFRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIGZvciBhIG1ldGhvZCBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUkvSUlPUC4KLSAqIAkJLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBleGNlcHRpb25zLgotICogQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAKLSAqIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQKLSAqIGVudGVycHJpc2UgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBSdW50aW1lRXhjZXB0aW9uIHRvCi0gKiBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVTZXNzaW9uQmVhbiBleHRlbmRzIEFWYWxpZGF0ZUJlYW4gaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNBQ29uc3RydWN0b3IgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9IGZhbHNlOwotCXByaXZhdGUgU2V0IGNyZWF0ZU1ldGhvZHMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2IiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEV9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAzSSwgbmV3IFN0cmluZ1tde0NIS0oyMDAzSSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAzRSwgbmV3IFN0cmluZ1tde0NIS0oyMDAzRSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDYsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA3LCBuZXcgU3RyaW5nW117Q0hLSjIwMDcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwOCwgbmV3IFN0cmluZ1tde0NIS0oyMDA4K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMywgbmV3IFN0cmluZ1tde0NIS0oyMDEzK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTQsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE1LCBuZXcgU3RyaW5nW117Q0hLSjIwMTUrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIyLCBuZXcgU3RyaW5nW117Q0hLSjIwMjIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyNSwgbmV3IFN0cmluZ1tde0NIS0oyMDI1K0JFWFQsIENIS0oyMDI1K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDAsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMCtPTl9CQVNFK1NQRUMsIENIS0oyMjAwK09OX1RISVMrU1BFQ30pOyAvLyBDSEtKMjIwMCBpcyBhIHNwZWNpYWwgY2FzZS4gSXQncyBzaGFyZWQgYnkgYWxsIGJlYW4gdHlwZXMuCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2J1cytCRVhULCBDSEtKMjQwMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMSwgbmV3IFN0cmluZ1tde0NIS0oyNDAxK0JFWFQsIENIS0oyNDAxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2J1cytCRVhULCBDSEtKMjQwOF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA4X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9idXMrQkVYVCwgQ0hLSjI0MDlfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwOV9lamJDcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9idXMrQkVYVCwgQ0hLSjI0MTBfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjQxMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIwLCBuZXcgU3RyaW5nW117Q0hLSjI0MjArQkVYVCwgQ0hLSjI0MjArTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMiwgbmV3IFN0cmluZ1tde0NIS0oyNDMyK0JFWFQsIENIS0oyNDMyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NiwgbmV3IFN0cmluZ1tde0NIS0oyNDU2K09OX0JBU0UsIENIS0oyNDU2K09OX1RISVN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJY3JlYXRlTWV0aG9kcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0ZVNlc3Npb25CZWFuKCkgewotCQljcmVhdGVNZXRob2RzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQkVBTjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ3JlYXRlTWV0aG9kKCkgewotCQlpZiAoaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9PSB0cnVlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChjcmVhdGVNZXRob2RzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluY3JlbWVudENyZWF0ZU1ldGhvZENvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApICYmICghaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCkpIHsKLQkJCWhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gYWRkIGl0IHRvIHRoZSBsaXN0LCBmb3IgcmVwb3J0aW5nIGV4dHJhbmVvdXMgY3JlYXRlIG1ldGhvZHMsIGZvciBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucyAoc2VjdGlvbiA2LjgpCi0JCQljcmVhdGVNZXRob2RzLmFkZChtZXRob2QpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGcmFtZXdvcmtNZXRob2QoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHN1cGVyLmlzRnJhbWV3b3JrTWV0aG9kKG5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGNoZWNrIGZvciBzZXNzaW9uLXNwZWNpZmljIG1ldGhvZHMKLQkJaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVFNFU1NJT05DT05URVhUKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgYW5kIGJ1c2luZXNzIG1ldGhvZHMgZm9sbG93IHRoZSBFSkIgMS4xIHNwZWMuCi0JICoKLQkgKgotCSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotCSAqLi4uCi0JICogVGhlIGhvbWUgaW50ZXJmYWNlIG9mIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbiBtdXN0IGhhdmUgb25lIGNyZWF0ZSAKLQkgKiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkgKiBpbnRlcmZhY2UuIFRoZXJlIGNhbiBiZSBubyBvdGhlciBjcmVhdGUgbWV0aG9kcyBpbiB0aGUgaG9tZSBpbnRlcmZhY2UuIAotCSAqIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBzaW5nbGUgZWpiQ3JlYXRlIG1ldGhvZCB0aGF0IHRha2VzIAotCSAqIG5vIGFyZ3VtZW50cy4KLQkgKi4uLgotCSAqCi0JICogNi4xMC4yIFNlc3Npb24gYmVhbiBjbGFzcwotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHNlc3Npb24gYmVhbiBjbGFzczoKLQkgKiAuLi4KLQkgKiAJCS0gVGhlIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIHBhcmFtZXRlcnMuIFRoZSAKLQkgKiAgICAgICAgQ29udGFpbmVyIHVzZXMgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JICogCQktIFRoZSBjbGFzcyBtdXN0IG5vdCBkZWZpbmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLgotCSAqIC4uLgotCSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgYW5kIHRoZSBlamJDcmVhdGUgbWV0aG9kcy4KLQkgKiAuLi4KLQkgKiAJCS0gVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBpcyBhbGxvd2VkIHRvIGltcGxlbWVudCBvdGhlciBtZXRob2RzIChmb3IgZXhhbXBsZSAKLQkgKiAgICAgICAgaGVscGVyIG1ldGhvZHMgaW52b2tlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidXNpbmVzcyBtZXRob2RzKSBpbiBhZGRpdGlvbiB0byAKLQkgKiAgICAgICAgdGhlIG1ldGhvZHMgcmVxdWlyZWQgYnkgdGhlIEVKQiBzcGVjaWZpY2F0aW9uLgotCSAqIC4uLgotCSAqCi0JICogNi4xMC4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdAotCSAqIGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAJCS0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiQ3JlYXRlLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAJCS0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLQkgKiAJCS0gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JICogCQktIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMsIHBvc3NpYmx5IAotCSAqICAgICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotCSAqIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJDcmVhdGUgbWV0aG9kIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JICogdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIAotCSAqIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgUnVudGltZUV4Y2VwdGlvbiAKLQkgKiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqCi0JICogNi4xMC40IEJ1c2luZXNzIG1ldGhvZHMKLQkgKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGJ1c2luZXNzIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAJCS0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0JICogCQktIFRoZSBidXNpbmVzcyBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogCQktIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqIAkJLSBUaGUgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBmb3IgYSBtZXRob2QgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JICogCQktIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuCi0JICogQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAKLQkgKiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50Ci0JICogZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gdG8KLQkgKiBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy8gc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlTdHJpbmcgbmFtZSA9IGVqYk1ldGhvZC5nZXROYW1lKCk7Ci0JCWlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpKSB7Ci0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKSB7Ci0JCQl2YWxpZGF0ZUZpbmFsaXplTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCQllbHNlIGlmIChlamJNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQl2YWxpZGF0ZUNvbnN0cnVjdG9yKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCQllbHNlIGlmIChpc0J1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKSkgewotCQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZiAoIWlzRnJhbWV3b3JrTWV0aG9kKG5hbWUpKSB7Ci0JCQl2YWxpZGF0ZUhlbHBlck1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7Ci0KLQkJaWYgKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURS5lcXVhbHMoZWpiTWV0aG9kLmdldE5hbWUoKSkpCi0JCQlpbmNyZW1lbnRDcmVhdGVNZXRob2RDb3VudCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCWVsc2UgaWYgKGVqYk1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpCi0JCQl2YWxpZGF0ZUNvbnN0cnVjdG9yKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSBzdXBwbGllZCBidXNpbmVzcyBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjIHJ1bGVzLgotCSAqCi0JICogNi4xMC40IEJ1c2luZXNzIG1ldGhvZHMKLQkgKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGJ1c2luZXNzIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAJCS0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0JICogCQktIFRoZSBidXNpbmVzcyBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogCQktIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqIAkJLSBUaGUgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBmb3IgYSBtZXRob2QgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JICogCQktIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuCi0JICogQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAKLQkgKiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50Ci0JICogZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gdG8KLQkgKiBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCXN1cGVyLnZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOyAvLyBjaGVjayBtZXRob2QgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICdlamInCQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RXaXRob3V0RXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gVGhlIHJlc3Qgb2YgdGhlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoZSB2YWxpZGF0ZU1ldGhvZCBtZXRob2QuCi0JCXZhbGlkYXRlQnVzaW5lc3NNb2RpZmllcnNBbmRFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGRlZmluaXRpb24gZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqCi0JICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotCSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLQkgKiBWZXJzaW9uOiAxLjEKLQkgKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLQkgKiBSZWxlYXNlOiAxMi8xNy85OQotCSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLQkgKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0JICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQkgKgotCSAqIDYuMTAuMiBTZXNzaW9uIGJlYW4gY2xhc3MKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciBzZXNzaW9uIGJlYW4gY2xhc3M6Ci0JICogCQktIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5TZXNzaW9uQmVhbiAKLQkgKiAgICAgICAgaW50ZXJmYWNlLgotCSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGFzIHB1YmxpYywgbXVzdCBub3QgYmUgZmluYWwsIGFuZCBtdXN0IG5vdCAKLQkgKiAgICAgICAgYmUgYWJzdHJhY3QuCi0JICogCQktIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgc2Vzc2lvbiBiZWFuJ3MgCi0JICogICAgICAgIHJlbW90ZSBpbnRlcmZhY2UgWzRdIC4KLQkgKiAJCS0gSWYgdGhlIGNsYXNzIGlzIGEgc3RhdGVmdWwgc2Vzc2lvbiBiZWFuLCBpdCBtYXkgb3B0aW9uYWxseSBpbXBsZW1lbnQgCi0JICogICAgICAgIHRoZSBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0JICogCQktIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIElmIHRoZSAKLQkgKiAgICAgICAgc2Vzc2lvbiBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZW4gdGhlIGJ1c2luZXNzIG1ldGhvZHMsIHRoZSBlamJDcmVhdGUgbWV0aG9kcywgCi0JICogICAgICAgIHRoZSBtZXRob2RzIG9mIHRoZSBTZXNzaW9uQmVhbiBpbnRlcmZhY2UsIGFuZCB0aGUgbWV0aG9kcyBvZiB0aGUgb3B0aW9uYWwgCi0JICogICAgICAgIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlIG1heSBiZSBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MsIAotCSAqICAgICAgICBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkgKgotCSAqCQlbNF0gSWYgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBkb2VzIGltcGxlbWVudCB0aGUgcmVtb3RlIGludGVyZmFjZSwgY2FyZSBtdXN0IAotCSAqICAgICAgICAgIGJlIHRha2VuIHRvIGF2b2lkIHBhc3Npbmcgb2YgdGhpcyBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQuIFRoaXMgCi0JICogICAgICAgICAgcG90ZW50aWFsIGVycm9yIGNhbiBiZSBhdm9pZGVkIGJ5IGNob29zaW5nIG5vdCB0byBpbXBsZW1lbnQgdGhlIHJlbW90ZSAKLQkgKiAgICAgICAgICBpbnRlcmZhY2UgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCQkvLyBzdXBlci52YWxpZGF0ZUNsYXNzKCkgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBjaGVja3M6Ci0JCS8vIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuU2Vzc2lvbkJlYW4gCi0JCS8vICAgICAgICBpbnRlcmZhY2UuCi0JCS8vICAgCS0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgCi0JCS8vICAgICAgICBiZSBhYnN0cmFjdC4KLQotCQkvLyBJZiB0aGUgY2xhc3MgaXMgYSBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4sIGl0IG1heSBvcHRpb25hbGx5IGltcGxlbWVudCAKLQkJLy8gdGhlIGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQotCQlTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbiliZWFuOwotCQlib29sZWFuIGlzU3RhdGVsZXNzID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU3RhdGVsZXNzKGJlYW4pOwotCQlib29sZWFuIGlzQmVhbk1hbmFnZWRTdGF0ZWZ1bCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNCZWFuTWFuYWdlZFNlc3Npb24oc2Vzc2lvbikgJiYgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU3RhdGVmdWwoc2Vzc2lvbikpOwotCi0JCWlmIChpc1N0YXRlbGVzcykgewotCQkJLyoKLQkJCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCQkJICouLi4KLQkJCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JCQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCQkJICouLi4KLQkJCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCQkJICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JCQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkJCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkJCSAqLi4uCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0RWpiQ2xhc3MoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgYmVhbkNsYXNzTmFtZSA9IChiZWFuLmdldEVqYkNsYXNzKCkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfQkVBTl9DTEFTUyA6IGJlYW4uZ2V0RWpiQ2xhc3MoKS5nZXRKYXZhTmFtZSgpOwotCQkJCVN0cmluZyBlQ2xhc3MgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTiA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKTsgLy8gU2luY2Ugb25seSBnZXRUeXBlIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIHRoaXMgY2Fubm90IGhhdmUgYmVlbiB0aHJvd24gYmVjYXVzZSBvZiB0aGUgYmVhbiBjbGFzcwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGJlYW5DbGFzc05hbWUsIGVDbGFzcyB9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzQmVhbk1hbmFnZWRTdGF0ZWZ1bCkgewotCQkJLyoKLQkJCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCQkJICouLi4KLQkJCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JCQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCQkJICouLi4KLQkJCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCQkJICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JCQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkJCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkJCSAqLi4uCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0RWpiQ2xhc3MoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0ksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBiZWFuLmdldEVqYkNsYXNzKCksIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGJlYW4uZ2V0RWpiQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCS8vIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIElmIHRoZSAKLQkJLy8gc2Vzc2lvbiBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZW4gdGhlIGJ1c2luZXNzIG1ldGhvZHMsIHRoZSBlamJDcmVhdGUgbWV0aG9kcywgCi0JCS8vIHRoZSBtZXRob2RzIG9mIHRoZSBTZXNzaW9uQmVhbiBpbnRlcmZhY2UsIGFuZCB0aGUgbWV0aG9kcyBvZiB0aGUgb3B0aW9uYWwgCi0JCS8vIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlIG1heSBiZSBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MsIAotCQkvLyBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkJLy8gIC0gdGhpcyBpcyB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBFSkIgTU9GIG1vZGVsLiBXaGVuIGFza2VkIGlmIGEgSmF2YUNsYXNzIGhhcyBhIG1ldGhvZCwKLQkJLy8gICAgdGhlIG1vZGVsIGNoZWNrcyB0aGUgY2xhc3MnIHBhcmVudHMgdG9vLgotCi0JCS8vIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgc2Vzc2lvbiBiZWFuJ3MgCi0JCS8vIHJlbW90ZSBpbnRlcmZhY2UgWzRdIC4KLQkJLy8gWzRdIElmIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgZG9lcyBpbXBsZW1lbnQgdGhlIHJlbW90ZSBpbnRlcmZhY2UsIGNhcmUgbXVzdCAKLQkJLy8gYmUgdGFrZW4gdG8gYXZvaWQgcGFzc2luZyBvZiB0aGlzIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdC4gVGhpcyAKLQkJLy8gcG90ZW50aWFsIGVycm9yIGNhbiBiZSBhdm9pZGVkIGJ5IGNob29zaW5nIG5vdCB0byBpbXBsZW1lbnQgdGhlIHJlbW90ZSAKLQkJLy8gaW50ZXJmYWNlIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JCXZhbGlkYXRlQ2xhc3NfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoYXQgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBkZWZpbml0aW9uIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKgotCSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLQkgKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0JICogVmVyc2lvbjogMS4xCi0JICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0JICogUmVsZWFzZTogMTIvMTcvOTkKLQkgKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0JICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotCSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0JICoKLQkgKiA2LjEwLjIgU2Vzc2lvbiBiZWFuIGNsYXNzCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3Igc2Vzc2lvbiBiZWFuIGNsYXNzOgotCSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuU2Vzc2lvbkJlYW4gCi0JICogICAgICAgIGludGVyZmFjZS4KLQkgKiAJCS0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgCi0JICogICAgICAgIGJlIGFic3RyYWN0LgotCSAqIAkJLSBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIHNlc3Npb24gYmVhbidzIAotCSAqICAgICAgICByZW1vdGUgaW50ZXJmYWNlIFs0XSAuCi0JICogCQktIElmIHRoZSBjbGFzcyBpcyBhIHN0YXRlZnVsIHNlc3Npb24gYmVhbiwgaXQgbWF5IG9wdGlvbmFsbHkgaW1wbGVtZW50IAotCSAqICAgICAgICB0aGUgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCSAqIAkJLSBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBoYXZlIHN1cGVyY2xhc3NlcyBhbmQvb3Igc3VwZXJpbnRlcmZhY2VzLiBJZiB0aGUgCi0JICogICAgICAgIHNlc3Npb24gYmVhbiBoYXMgc3VwZXJjbGFzc2VzLCB0aGVuIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMsIAotCSAqICAgICAgICB0aGUgbWV0aG9kcyBvZiB0aGUgU2Vzc2lvbkJlYW4gaW50ZXJmYWNlLCBhbmQgdGhlIG1ldGhvZHMgb2YgdGhlIG9wdGlvbmFsIAotCSAqICAgICAgICBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZSBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLCAKLQkgKiAgICAgICAgb3IgaW4gYW55IG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0JICoKLQkgKgkJWzRdIElmIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgZG9lcyBpbXBsZW1lbnQgdGhlIHJlbW90ZSBpbnRlcmZhY2UsIGNhcmUgbXVzdCAKLQkgKiAgICAgICAgICBiZSB0YWtlbiB0byBhdm9pZCBwYXNzaW5nIG9mIHRoaXMgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0LiBUaGlzIAotCSAqICAgICAgICAgIHBvdGVudGlhbCBlcnJvciBjYW4gYmUgYXZvaWRlZCBieSBjaG9vc2luZyBub3QgdG8gaW1wbGVtZW50IHRoZSByZW1vdGUgCi0JICogICAgICAgICAgaW50ZXJmYWNlIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzc19yZW1vdGVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkvLyBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIHNlc3Npb24gYmVhbidzIAotCQkvLyByZW1vdGUgaW50ZXJmYWNlIFs0XSAuCi0JCS8vIFs0XSBJZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGRvZXMgaW1wbGVtZW50IHRoZSByZW1vdGUgaW50ZXJmYWNlLCBjYXJlIG11c3QgCi0JCS8vIGJlIHRha2VuIHRvIGF2b2lkIHBhc3Npbmcgb2YgdGhpcyBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQuIFRoaXMgCi0JCS8vIHBvdGVudGlhbCBlcnJvciBjYW4gYmUgYXZvaWRlZCBieSBjaG9vc2luZyBub3QgdG8gaW1wbGVtZW50IHRoZSByZW1vdGUgCi0JCS8vIGludGVyZmFjZSBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLgotCQlKYXZhQ2xhc3MgcmVtb3RlID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZSk7Ci0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShjbGF6eiwgcmVtb3RlKSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHtjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCksIHJlbW90ZS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnN0cnVjdG9yKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaGFzQUNvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJaWYgKCFoYXNWYWxpZENvbnN0cnVjdG9yICYmIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpICYmIChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApKSB7Ci0JCQloYXNWYWxpZENvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIHN1cHBsaWVkIGVqYkNyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjIHJ1bGVzLgotCSAqCi0JICogNi4xMC4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdAotCSAqIGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAJCS0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiQ3JlYXRlLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAJCS0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLQkgKiAJCS0gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JICogCQktIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMsIHBvc3NpYmx5IAotCSAqICAgICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotCSAqIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJDcmVhdGUgbWV0aG9kIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JICogdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIAotCSAqIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgUnVudGltZUV4Y2VwdGlvbiAKLQkgKiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IHRlc3RlZCB0aGF0IHRoZSBtZXRob2QgbmFtZSBpcyBlamJDcmVhdGUuCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLQkJSmF2YUhlbHBlcnMgcGFybVR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSAoKHBhcm1UeXBlID09IG51bGwpID8gIiIgOiBwYXJtVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKCFyZXR1cm5UeXBlTmFtZS5lcXVhbHMoSVR5cGVDb25zdGFudHMuVk9JRCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10ge2NsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnRzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS9JSU9QLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kQXJndW1lbnRzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQl2YWxpZGF0ZUVqYkNyZWF0ZU1vZGlmaWVyc0FuZEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kX2hvbWVEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKi4uLgotCSAqIDYuMTAuMiBTZXNzaW9uIGJlYW4gY2xhc3MKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciBzZXNzaW9uIGJlYW4gY2xhc3M6Ci0JICogLi4uCi0JICogCQktIFRoZSBjbGFzcyBtdXN0IG5vdCBkZWZpbmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLgotCSAqIC4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmluYWxpemVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBUaGlzIGlzIGEgd2FybmluZywgbm90IGFuIGVycm9yLCBiZWNhdXNlIEVKQiAxLjAgYWxsb3dlZCB0aGUgZmluYWxpemUoKSBtZXRob2QgdG8gYmUgY2FsbGVkLiBFSkIgMS4xIChzZWN0aW9uIDYuMTAuMikgc3BlY2lmaWNhbGx5IHByb2hpYml0cyBpdC4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotCSAqLi4uCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JICogbm8gYXJndW1lbnRzLgotCSAqLi4uCi0JICogNi4xMC4yIFNlc3Npb24gYmVhbiBjbGFzcwotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHNlc3Npb24gYmVhbiBjbGFzczoKLQkgKiAuLi4KLQkgKiAJCS0gVGhlIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIHBhcmFtZXRlcnMuIFRoZSAKLQkgKiAgICAgICAgQ29udGFpbmVyIHVzZXMgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JICogLi4uCi0JICogNi4xMC4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdAotCSAqIGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKi4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nW10gbW9kZWxPYmplY3ROYW1lID0gbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJaWYgKCFoYXNWYWxpZENvbnN0cnVjdG9yICYmIGhhc0FDb25zdHJ1Y3RvcikgewotCQkJLy8gSWYgYSBwdWJsaWMgY29uc3RydWN0b3Igd2l0aCBubyBhcmd1bWVudHMgZG9lcyBub3QgZXhpc3QgZXhwbGljaXRseSwKLQkJCS8vIEphdmEgd2lsbCBpbnNlcnQgb25lIGFzIGxvbmcgYXMgdGhlcmUgYXJlIG5vIGNvbnN0cnVjdG9ycyBkZWZpbmVkIGluIHRoZQotCQkJLy8gY2xhc3MuIElmIHRoZXJlIGlzIGEgY29uc3RydWN0b3IsIEphdmEgZG9lcyBub3QgaW5zZXJ0IGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbW9kZWxPYmplY3ROYW1lLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0NyZWF0ZU1ldGhvZCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JCS8vIG5vIGFyZ3VtZW50cy4KLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlbGVzcyhiZWFuKSAmJiAoY3JlYXRlTWV0aG9kcy5zaXplKCkgPiAwKSkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjcmVhdGVNZXRob2RzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDI1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCAoTWV0aG9kKSBpdGVyYXRvci5uZXh0KCksIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIHN1cHBsaWVkIG1ldGhvZCBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWMgcnVsZXMuCi0JICoKLQkgKiBlamJDcmVhdGUgYW5kIGJ1c2luZXNzIG1ldGhvZHMgZm9sbG93IHNvbWUgb2YgdGhlIHNhbWUgcnVsZXMuIFRoaXMgbWV0aG9kIGNoZWNrcyB0aG9zZSBydWxlcy4KLQkgKiAoUGFydCBvZiBzZWN0aW9ucyA2LjEwLjMgYW5kIDYuMTAuNCkKLQkgKgotCSAqIAkJLSBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAJCS0gVGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgZm9yIGEgbWV0aG9kIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS9JSU9QLgotCSAqIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JICogdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudAotCSAqIGVudGVycHJpc2UgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBSdW50aW1lRXhjZXB0aW9uIHRvCi0JICogaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTW9kaWZpZXJzQW5kRXhjZXB0aW9ucyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24iIGFib3ZlCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDhfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMF9idXMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9idXMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gZXhjZXB0aW9ucywgcG9zc2libHkgCi0JCS8vIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4gCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JCS8vIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQKLQkJLy8gZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gdG8KLQkJLy8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkJdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMF9idXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTW9kaWZpZXJzQW5kRXhjZXB0aW9ucyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24iIGFib3ZlCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDhfZWpiQ3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMF9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gZXhjZXB0aW9ucywgcG9zc2libHkgCi0JCS8vIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4gCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JCS8vIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQKLQkJLy8gZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gdG8KLQkJLy8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkJdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMF9lamJDcmVhdGUpOwotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0JCWhhc1ZhbGlkQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJaGFzQUNvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCWhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25Ib21lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWIyODlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25Ib21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBTZXNzaW9uIGhvbWUgaW50ZXJmYWNlIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotICouLi4KLSAqIFRoZSBob21lIGludGVyZmFjZSBvZiBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4gbXVzdCBoYXZlIG9uZSBjcmVhdGUgCi0gKiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0gKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgc2luZ2xlIGVqYkNyZWF0ZSBtZXRob2QgdGhhdCB0YWtlcyAKLSAqIG5vIGFyZ3VtZW50cy4KLSAqLi4uCi0gKgotICogNi4xMC42IFNlc3Npb24gYmVhbnMgaG9tZSBpbnRlcmZhY2UKLSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZToKLSAqICAgLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCSG9tZSBpbnRlcmZhY2UuCi0gKiAgIC0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLiAKLSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLSAqICAgICBmb3IgUk1JL0lJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0gKiAgIC0gVGhlIGhvbWUgaW50ZXJmYWNlIGlzIGFsbG93ZWQgdG8gaGF2ZSBzdXBlcmludGVyZmFjZXMuIFVzZSBvZiBpbnRlcmZhY2UgCi0gKiAgICAgaW5oZXJpdGFuY2UgaXMgc3ViamVjdCB0byB0aGUgUk1JL0lJT1AgcnVsZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIAotICogICAgIHJlbW90ZSBpbnRlcmZhY2VzLgotICogICAtIEEgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlKC4uLikgbWV0aG9kcy4KLSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotICogICAgIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0gKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgCi0gKiAgICAgaW50ZXJmYWNlIHR5cGUuCi0gKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLSAqICAgICBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0gKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0gKiAgIC0gVGhlIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVTZXNzaW9uSG9tZSBleHRlbmRzIEFWYWxpZGF0ZUhvbWUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9IGZhbHNlOwotCXByaXZhdGUgU2V0IGNyZWF0ZU1ldGhvZHMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2giOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEV9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNStCRVhULCBDSEtKMjAwNStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMCwgbmV3IFN0cmluZ1tde0NIS0oyMDEwK0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDExLCBuZXcgU3RyaW5nW117Q0hLSjIwMTErRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMiwgbmV3IFN0cmluZ1tde0NIS0oyMDEyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjQsIG5ldyBTdHJpbmdbXXtDSEtKMjAyNCtCRVhULCBDSEtKMjAyNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyNiwgbmV3IFN0cmluZ1tde0NIS0oyMDI2K0JFWFQsIENIS0oyMDI2K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK0JFWFQsIENIS0oyNDAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDMrQkVYVCwgQ0hLSjI0MDMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNStCRVhULCBDSEtKMjQwNStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEyLCBuZXcgU3RyaW5nW117Q0hLSjI0MTIrQkVYVCwgQ0hLSjI0MTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMytCRVhULCBDSEtKMjQxMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0JFWFQsIENIS0oyNDE0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE1LCBuZXcgU3RyaW5nW117Q0hLSjI0MTUrQkVYVCwgQ0hLSjI0MTUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTksIG5ldyBTdHJpbmdbXXtDSEtKMjQxOStCRVhULCBDSEtKMjQxOStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJY3JlYXRlTWV0aG9kcy5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdGVTZXNzaW9uSG9tZSgpIHsKLQkJY3JlYXRlTWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ3JlYXRlTWV0aG9kKCkgewotCQlpZiAoaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9PSB0cnVlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChjcmVhdGVNZXRob2RzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluY3JlbWVudENyZWF0ZU1ldGhvZENvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApICYmICghaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCkpIHsKLQkJCWhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gYWRkIGl0IHRvIHRoZSBsaXN0LCBmb3IgcmVwb3J0aW5nIGV4dHJhbmVvdXMgY3JlYXRlIG1ldGhvZHMsIGZvciBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucyAoc2VjdGlvbiA2LjgpCi0JCQljcmVhdGVNZXRob2RzLmFkZChtZXRob2QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdGhlIHNlc3Npb24gaG9tZSBpbnRlcmZhY2UncyBtZXRob2RzIGZvbGxvdyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqIAotCSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLQkgKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0JICogVmVyc2lvbjogMS4xCi0JICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0JICogUmVsZWFzZTogMTIvMTcvOTkKLQkgKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0JICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotCSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0JICogCi0JICogNi44IFN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zCi0JICouLi4KLQkgKiBUaGUgaG9tZSBpbnRlcmZhY2Ugb2YgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIG11c3QgaGF2ZSBvbmUgY3JlYXRlIAotCSAqIG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIAotCSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JICogbm8gYXJndW1lbnRzLgotCSAqLi4uCi0JICoKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogLi4uCi0JICogICAtIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUkvSUlPUC4gCi0JICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqICAgICBmb3IgUk1JL0lJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICogLi4uCi0JICogICAtIEEgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlKC4uLikgbWV0aG9kcy4KLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkgKiAgICAgdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkgKiAgICAgaW50ZXJmYWNlIHR5cGUuCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkgKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCSAqIC4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhpTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvLyBzdXBlci5wcmltVmFsaWRhdGUoaGlNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBoaU1ldGhvZC5nZXROYW1lKCk7Ci0JCS8vIEhvbWUgaW50ZXJmYWNlIHNob3VsZCBvbmx5IGRlY2xhcmUgY3JlYXRlIG1ldGhvZHMKLQkJaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSkpIHsKLQkJCXZhbGlkYXRlQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgaGlNZXRob2QpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gSG9tZSBpbnRlcmZhY2Ugc2hvdWxkIG9ubHkgZGVjbGFyZSBjcmVhdGUgbWV0aG9kcwotCQkJLy8gKE5vIG1ldGhvZHMgb3RoZXIgdGhhbiBjcmVhdGUgbWV0aG9kcyBhcmUgbGlzdGVkIGluIHNlY3Rpb24gNi4xMC42LAotCQkJLy8gYnV0IG90aGVyIHNlY3Rpb25zIG9mIHRoZSBzcGVjLCBlLmcuIDkuMi4yLCBleHBsaWNpdGx5IGxpc3QgZWFjaCB0eXBlCi0JCQkvLyBvZiBtZXRob2Qgd2hpY2ggY2FuIGJlIG9uIGEgY2xhc3MvaW50ZXJmYWNlLikKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgaGlNZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UoZWpiTWV0aG9kKTsKLQotCQlpZiAoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFLmVxdWFscyhlamJNZXRob2QuZ2V0TmFtZSgpKSkKLQkJCWluY3JlbWVudENyZWF0ZU1ldGhvZENvdW50KHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgc2Vzc2lvbiBob21lIGNsYXNzIGRlZmluaXRpb24gZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqCi0JICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotCSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLQkgKiBWZXJzaW9uOiAxLjEKLQkgKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLQkgKiBSZWxlYXNlOiAxMi8xNy85OQotCSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLQkgKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0JICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQkgKgotCSAqIDYuMTAuNiBTZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQkhvbWUgaW50ZXJmYWNlLgotCSAqIC4uLgotCSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgaXMgYWxsb3dlZCB0byBoYXZlIHN1cGVyaW50ZXJmYWNlcy4gVXNlIG9mIGludGVyZmFjZSAKLQkgKiAgICAgaW5oZXJpdGFuY2UgaXMgc3ViamVjdCB0byB0aGUgUk1JL0lJT1AgcnVsZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIAotCSAqICAgICByZW1vdGUgaW50ZXJmYWNlcy4KLQkgKiAuLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJLy8gQm90aCBvZiB0aGUgYWJvdmUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgdGhlIFZhbGlkYXRlSG9tZSBjbGFzcydzIHZhbGlkYXRlQ2xhc3MgbWV0aG9kLgotCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCi0JLyoqCi0JICogNi44IFN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zCi0JICouLi4KLQkgKiBUaGUgaG9tZSBpbnRlcmZhY2Ugb2YgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIG11c3QgaGF2ZSBvbmUgY3JlYXRlIAotCSAqIG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIAotCSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JICogbm8gYXJndW1lbnRzLgotCSAqLi4uCi0JICoKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUkvSUlPUC4gCi0JICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqICAgICBmb3IgUk1JL0lJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICogICAtIEEgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlKC4uLikgbWV0aG9kcy4KLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkgKiAgICAgdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkgKiAgICAgaW50ZXJmYWNlIHR5cGUuCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkgKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLiAKLQkJLy8gVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JCS8vIGZvciBSTUkvSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkJLy8gdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JCS8vIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JCS8vIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkJLy8gbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQl2YWxpZGF0ZUNyZWF0ZU1ldGhvZF9iZWFuRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzQ3JlYXRlRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCkpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfQ1JFQVRFRVhDRVBUSU9OIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gUGVyZm9ybSB0aGUgY2hlY2tzIHdoaWNoIGRlcGVuZCBvbiBhbm90aGVyIGNsYXNzIGluIHRoZSBlbnRlcnByaXNlIGJlYW4uCi0JCXZhbGlkYXRlQ3JlYXRlTWV0aG9kX3JlbW90ZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogNi44IFN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zCi0JICouLi4KLQkgKiBUaGUgaG9tZSBpbnRlcmZhY2Ugb2YgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIG11c3QgaGF2ZSBvbmUgY3JlYXRlIAotCSAqIG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIAotCSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JICogbm8gYXJndW1lbnRzLgotCSAqLi4uCi0JICoKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEEgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlKC4uLikgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZ1tdIG1vZGVsT2JqZWN0TmFtZSA9IG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX07Ci0KLQkJLy8gQSBzZXNzaW9uIGJlYW4ncyBob21lIG11c3QgZGVmaW5lIG9uZSBvciBtb3JlIGNyZWF0ZSBtZXRob2RzLgotCQlpZiAoIWhhc0NyZWF0ZU1ldGhvZCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIGhvbWUgaW50ZXJmYWNlIG9mIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbiBtdXN0IGhhdmUgb25lIGNyZWF0ZSAKLQkJLy8gbWV0aG9kIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgCi0JCS8vIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTdGF0ZWxlc3MoYmVhbikgJiYgKGNyZWF0ZU1ldGhvZHMuc2l6ZSgpID4gMCkpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY3JlYXRlTWV0aG9kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgKE1ldGhvZCkgaXRlcmF0b3IubmV4dCgpLCBtb2RlbE9iamVjdE5hbWUsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID0gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uUmVtb3RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uUmVtb3RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MjIwNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvblJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0KLS8qKgotICogVmFsaWRhdGVzIHRoZSByZW1vdGUgaW50ZXJmYWNlIG9mIGEgU2Vzc2lvbiBiZWFuLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVTZXNzaW9uUmVtb3RlIGV4dGVuZHMgQVZhbGlkYXRlUmVtb3RlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc3IiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fUkVNT1RFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMiwgbmV3IFN0cmluZ1tde0NIS0oyMDEyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEyLCBuZXcgU3RyaW5nW117Q0hLSjI0MTIrQkVYVCwgQ0hLSjI0MTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMytCRVhULCBDSEtKMjQxMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0JFWFQsIENIS0oyNDE0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE1LCBuZXcgU3RyaW5nW117Q0hLSjI0MTUrQkVYVCwgQ0hLSjI0MTUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjkyMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLS8qKgotICogVGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZiB0aGUgdXNlciBjYW5jZWxzIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JcHVibGljIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWEwNmFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUnVsZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkxvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25SdWxlVXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyBsb25nIG1ldGhvZF9hbmRfZmllbGRfY291bnRlciA9IDB4MTsgLy8gdXNlZCBieSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuamF2YQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIF9yZXNlcnZlZFdvcmRzID0gbmV3IFN0cmluZ1tdeyJTRUxFQ1QiLCAiRlJPTSIsICJXSEVSRSIsICJESVNUSU5DVCIsICJPQkpFQ1QiLCAiTlVMTCIsICJUUlVFIiwgIkZBTFNFIiwgIk5PVCIsICJBTkQiLCAiT1IiLCAiQkVUV0VFTiIsICJMSUtFIiwgIklOIiwgIkFTIiwgIlVOS05PV04iLCAiRU1QVFkiLCAiTUVNQkVSIiwgIk9GIiwgIklTIn07IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJCAvLyROT04tTkxTLTExJCAvLyROT04tTkxTLTEyJCAvLyROT04tTkxTLTEzJCAvLyROT04tTkxTLTE0JCAvLyROT04tTkxTLTE1JCAvLyROT04tTkxTLTE2JCAvLyROT04tTkxTLTE3JCAvLyROT04tTkxTLTE4JCAvLyROT04tTkxTLTE5JCAvLyROT04tTkxTLTIwJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQSA9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIExvZ0VudHJ5IGxvZ0VudHJ5ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgaGVscGVyTWFwID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBIYXNoU2V0IGNvbW1vbkNsYXNzTmFtZXMgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgSmF2YUNsYXNzIGdldENNUkZpZWxkVHlwZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgQ01SRmllbGQgZmllbGQpIHsKLQkJQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlID0gZmllbGQuZ2V0Um9sZSgpOwotCQlpZighcm9sZS5pc01hbnkoKSkgewotCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSByb2xlLmdldFR5cGVFbnRpdHkoKTsKLQkJCWlmKGNtcCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCUphdmFDbGFzcyBsb2NhbCA9IGNtcC5nZXRMb2NhbEludGVyZmFjZSgpOwotCQkJLy8gSWYgdGhlIHVzZXIgaGFzIG1hZGUgYSBtaXN0YWtlIGluIGVqYi1qYXIueG1sLCBhbmQgdGhleSBhcmUgdHJ5aW5nIHRvIG1ha2UKLQkJCS8vIGEgcmVsYXRpb25zaGlwIHRvIGEgY21wIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBsb2NhbCBpbnRlcmZhY2UsIGFuIEludmFsaWRJbnB1dEV4Y2VwdGlvbgotCQkJLy8gd2lsbCBiZSB0aHJvd24uIExldCB0aGUgREQgdmFsaWRhdGlvbiBjYXRjaCB0aGF0IGVycm9yOyBqdXN0IHJldHVybgotCQkJLy8gd2hlbiB0aGlzIGhhcHBlbnMuCi0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShjbXAsIGxvY2FsKTsKLQkJCX0KLQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gbG9jYWw7Ci0JCX0KLQkJCS8vIDxjbXItZmllbGQtdHlwZT4gaXMgZWl0aGVyIGEgamF2YS51dGlsLkNvbGxlY3Rpb24gb3IgYSBqYXZhLnV0aWwuU2V0IChwLiA0NjQpCi0JCQlyZXR1cm4gZmllbGQuZ2V0Q29sbGVjdGlvblR5cGUoKTsKLQl9Ci0KLQkKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBmb2xsb3dzRmluZGVyRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzRmluZGVyRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGZvbGxvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlKYXZhSGVscGVycyBqYXZhVXRpbEVudW1lcmF0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9FTlVNRVJBVElPTiwgYmVhbik7Ci0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGphdmFVdGlsRW51bWVyYXRpb24pKSB7Ci0JCQkvLyBPbmx5IHNpbmdsZSBvYmplY3QgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBtYXkgdGhyb3cgdGhpcyBleGNlcHRpb24KLQkJCXJldHVybiAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCk7Ci0JCX0KLQkJCi0JCUphdmFIZWxwZXJzIGphdmFVdGlsQ29sbGVjdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTiwgYmVhbik7Ci0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGphdmFVdGlsQ29sbGVjdGlvbikpIHsKLQkJCS8vIE9ubHkgc2luZ2xlIG9iamVjdCBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIG1heSB0aHJvdyB0aGlzIGV4Y2VwdGlvbgotCQkJcmV0dXJuICFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oYmVhbiwgbWV0aG9kKTsKLQkJfQotCQkKLQkJLy8gSXQncyBhIHNpbmdsZSBmaW5kZXIvc2VsZWN0IG1ldGhvZCwgc28gaXQgY2FuIHRocm93IHRoZSBleGNlcHRpb24sIHRob3VnaCBpdCBpcyBub3QgcmVxdWlyZWQgdG8uCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIElmIGl0IGV4aXN0cywgcmV0dXJuIHRoZSBNZXRob2QgZnJvbSB0aGUgbWV0aG9kIGxpc3Qgd2hpY2ggaGFzIHRoZSBnaXZlbgotCSAqIG5hbWUgYW5kIHBhcmFtZXRlciB0eXBlcyAoaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFycmF5IGVsZW1lbnRzKS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgZHVwbGljYXRlIG9mIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZywgU3RyaW5nW10pLgotCSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgY29kZSB3YXMgZHVwbGljYXRlZCBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgdGhlCi0JICogSmF2YVBhcmFtZXRlcltdIGludG8gYSBTdHJpbmdbXS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBuYW1lLCBKYXZhUGFyYW1ldGVyW10gcGFyYW1ldGVyVHlwZXMsIExpc3QgbWV0aG9kTGlzdCkgewotCQlpZihtZXRob2RMaXN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJSmF2YVBhcmFtZXRlcltdIHBhcmFtcyA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtZXRob2RMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbWV0aG9kID0gKE1ldGhvZClpdGVyYXRvci5uZXh0KCk7Ci0JCQkKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXBhcmFtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJCQkKLQkJCQlpZiAocGFyYW1zLmxlbmd0aCA9PSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGgpIHsKLQkJCQkJZm91bmQgPSB0cnVlOyAvL01heWJlOyB3ZSBuZWVkIG1vcmUgaW5mbwotCQkJCQkKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCS8vaWYgYW55IG9uZSBvZiB0aGUgcGFyYW1ldGVycyBkb2Vzbid0IG1hdGNoIHRoZW4gZmxpcCBiYWNrIHRvIGZhbHNlCi0JCQkJCQlKYXZhSGVscGVycyBwYXJtID0gKChKYXZhSGVscGVycylwYXJhbXNbal0uZ2V0RVR5cGUoKSk7Ci0JCQkJCQlKYXZhSGVscGVycyB0eXBlID0gKChKYXZhSGVscGVycylwYXJhbWV0ZXJUeXBlc1tqXS5nZXRFVHlwZSgpKTsKLQkJCQkJCWlmKCFpc1NhbWVUeXBlKHBhcm0sIHR5cGUpKSB7Ci0JCQkJCQkJZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBuYW1lLCBKYXZhSGVscGVyc1tdIHBhcmFtZXRlclR5cGVzLCBMaXN0IG1ldGhvZExpc3QpIHsKLQkJaWYobWV0aG9kTGlzdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUphdmFQYXJhbWV0ZXJbXSBwYXJhbXMgPSBudWxsOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlwYXJhbXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCQkJCi0JCQkJaWYgKHBhcmFtcy5sZW5ndGggPT0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsgLy9NYXliZTsgd2UgbmVlZCBtb3JlIGluZm8KLQkJCQkJCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkvL2lmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgZG9lc24ndCBtYXRjaCB0aGVuIGZsaXAgYmFjayB0byBmYWxzZQotCQkJCQkJSmF2YUhlbHBlcnMgcGFybSA9ICgoSmF2YUhlbHBlcnMpcGFyYW1zW2pdLmdldEVUeXBlKCkpOwotCQkJCQkJSmF2YUhlbHBlcnMgdHlwZSA9IHBhcmFtZXRlclR5cGVzW2pdOwotCQkJCQkJaWYoIWlzU2FtZVR5cGUocGFybSwgdHlwZSkpIHsKLQkJCQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoZm91bmQpIHsKLQkJCQkJCXJldHVybiBtZXRob2Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEZyb20gSmF2YUNsYXNzIGNsYXp6LCByZXR1cm4gYSBtZXRob2QsIG5hbWVkIG1ldGhvZE5hbWVUb0ZpbmQsCi0JICogd2hpY2ggaGFzIGV4YWN0bHkgdGhlIHNhbWUgYXJndW1lbnRzIGFzIG1ldGhvZFRvTWF0Y2guCi0JICoKLQkgKiBJZiBubyBtZXRob2QgZXhpc3RzIHdpdGggdGhhdCBuYW1lIGFuZCBhcmd1bWVudCBsaXN0LCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0aGUgZXhjZXB0aW9ucyBvciByZXR1cm4gdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoTWV0aG9kIG1ldGhvZFRvTWF0Y2gsIFN0cmluZyBtZXRob2ROYW1lVG9GaW5kLCBMaXN0IG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJaWYobWV0aG9kc0V4dGVuZGVkTGlzdCA9PSBudWxsKSB7Ci0JCQkvLyBJdCBpcyBub3QgaW52YWxpZCB0byBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYSBudWxsIExpc3QuIEEgbnVsbCBMaXN0Ci0JCQkvLyBtZWFucyB0aGF0IGEgdHlwZSB3aG9zZSBtZXRob2RzIG5lZWQgdG8gYmUgc2VhcmNoZWQgZG9lc24ndCBleGlzdCwKLQkJCS8vIHN1Y2ggYXMgc2VhcmNoaW5nIGEgbG9jYWwgdmlldywgYnV0IHRoZSBiZWFuIGhhcyBvbmx5IGEgcmVtb3RlIHZpZXcuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0TWV0aG9kKG1ldGhvZE5hbWVUb0ZpbmQsIG1ldGhvZFRvTWF0Y2gubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCksIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCX0KLQkKLQkvKioKLQkgKiBGcm9tIEphdmFDbGFzcyBjbGF6eiwgcmV0dXJuIGEgbWV0aG9kLCBuYW1lZCBtZXRob2ROYW1lVG9GaW5kLAotCSAqIHdoaWNoIGhhcyBleGFjdGx5IHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBtZXRob2RUb01hdGNoLgotCSAqCi0JICogSWYgbm8gbWV0aG9kIGV4aXN0cyB3aXRoIHRoYXQgbmFtZSBhbmQgYXJndW1lbnQgbGlzdCwgcmV0dXJuIG51bGwuCi0JICogCi0JICogVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMgb3IgcmV0dXJuIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kRXh0ZW5kZWQoSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kVG9NYXRjaCwgU3RyaW5nIG1ldGhvZE5hbWVUb0ZpbmQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoKGNsYXp6ID09IG51bGwpIHx8IChtZXRob2RUb01hdGNoID09IG51bGwpIHx8IChtZXRob2ROYW1lVG9GaW5kID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBnZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgbWV0aG9kTmFtZVRvRmluZCwgbWV0aG9kVG9NYXRjaC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqCi0JICogVGhpcyBtZXRob2QgaXMgYSBkdXBsaWNhdGUgb2YgZ2V0TWV0aG9kRXh0ZW5kZWQoU3RyaW5nLCBTdHJpbmdbXSkuCi0JICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSBjb2RlIHdhcyBkdXBsaWNhdGVkIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUKLQkgKiBKYXZhUGFyYW1ldGVyW10gaW50byBhIFN0cmluZ1tdLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKEphdmFDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsIEphdmFQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlpZiAoY2xhenouaXNJbnRlcmZhY2UoKSkgewotCQkJLy8gQ2hlY2sgdGhlIGN1cnJlbnQgY2xhc3MgZmlyc3QuIElmIHRoZSBtZXRob2QgaGFzIGJlZW4gb3ZlcnJpZGVuLAotCQkJLy8gZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHBhcmVudCdzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCdzLgotCQkJcmV0dXJuIGdldE1ldGhvZEludGVyZmFjZUV4dGVuZGVkKGNsYXp6LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJLy8gQ2hlY2sgdGhlIGN1cnJlbnQgY2xhc3MgZmlyc3QuIElmIHRoZSBtZXRob2QgaGFzIGJlZW4gb3ZlcnJpZGVuLAotCQkvLyBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgcGFyZW50J3MgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNoaWxkJ3MuCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSBudWxsOwotCQlkbyB7Ci0JCQltZXRob2RzID0gY2xhenouZ2V0TWV0aG9kcygpOwotCQkJbWV0aG9kID0gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBtZXRob2RzKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0KLQkJCS8vIGVsc2UsIHNlYXJjaCB0aGUgcGFyZW50CQotCQkJY2xhenogPSBjbGF6ei5nZXRTdXBlcnR5cGUoKTsKLQkJfQotCQl3aGlsZSAoKG1ldGhvZCA9PSBudWxsKSAmJiAoY2xhenogIT0gbnVsbCkpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgZHVwbGljYXRlIG9mIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZywgSmF2YVBhcmFtZXRlcltdKS4KLQkgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIGNvZGUgd2FzIGR1cGxpY2F0ZWQgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZQotCSAqIEphdmFIZWxwZXJzW10gaW50byBhIEphdmFQYXJhbWV0ZXJbXS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhSGVscGVyc1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgZHVwbGljYXRlIG9mIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZywgSmF2YVBhcmFtZXRlcltdKS4KLQkgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIGNvZGUgd2FzIGR1cGxpY2F0ZWQgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZQotCSAqIEphdmFIZWxwZXJzW10gaW50byBhIEphdmFQYXJhbWV0ZXJbXS4KLQkgKiAKLQkgKiBJZiByZXRUeXBlIGlzIG51bGwgaXQgbWVhbnMgdGhhdCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hlY2tlZC4KLQkgKiBPdGhlcndpc2UsIGNoZWNrIHRoYXQgdGhlIHJldHVybiB0eXBlIG1hdGNoZXMgdG9vLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKEphdmFDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsIEphdmFIZWxwZXJzW10gcGFyYW1ldGVyVHlwZXMsIEphdmFIZWxwZXJzIHJldFR5cGUpIHsKLQkJaWYgKGNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKLQkJCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJCXJldHVybiBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChjbGF6eiwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJLy8gZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHBhcmVudCdzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCdzLgotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gbnVsbDsKLQkJZG8gewotCQkJbWV0aG9kcyA9IGNsYXp6LmdldE1ldGhvZHMoKTsKLQkJCW1ldGhvZCA9IGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgbWV0aG9kcyk7Ci0JCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCQlpZihyZXRUeXBlICE9IG51bGwpIHsKLQkJCQkJSmF2YUhlbHBlcnMgbWV0aFJldFR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCQlpZihpc0Fzc2lnbmFibGVGcm9tKG1ldGhSZXRUeXBlLCByZXRUeXBlKSkgewotCQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGVsc2UsIHNlYXJjaCB0aGUgcGFyZW50CQotCQkJY2xhenogPSBjbGF6ei5nZXRTdXBlcnR5cGUoKTsKLQkJfQotCQl3aGlsZSAoKG1ldGhvZCA9PSBudWxsKSAmJiAoY2xhenogIT0gbnVsbCkpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgZHVwbGljYXRlIG9mIGdldE1ldGhvZEludGVyZmFjZUV4dGVuZGVkKFN0cmluZywgU3RyaW5nW10sIEphdmFDbGFzcykuCi0JICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSBjb2RlIHdhcyBkdXBsaWNhdGVkIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUKLQkgKiBKYXZhUGFyYW1ldGVyW10gaW50byBhIFN0cmluZ1tdLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZEludGVyZmFjZUV4dGVuZGVkKEphdmFDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsIEphdmFQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlpZiAoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBDaGVjayB0aGUgY3VycmVudCBjbGFzcyBmaXJzdC4gSWYgdGhlIG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4sCi0JCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgY2xhenouZ2V0TWV0aG9kcygpKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWV0aG9kOwotCQl9Ci0JCS8vIGNoZWNrIHBhcmVudHMKLQkJTGlzdCBjbGFzc2VzVG9DaGVjayA9IGNsYXp6LmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCUl0ZXJhdG9yIGNsYXp6SXRlcmF0b3IgPSBjbGFzc2VzVG9DaGVjay5pdGVyYXRvcigpOwotCQl3aGlsZSAoY2xhenpJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWNsYXp6ID0gKEphdmFDbGFzcykgY2xhenpJdGVyYXRvci5uZXh0KCk7Ci0JCQltZXRob2QgPSBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChjbGF6eiwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhSGVscGVyc1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCWlmIChjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJLy8gZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHBhcmVudCdzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCdzLgotCQlNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBjbGF6ei5nZXRNZXRob2RzKCkpOwotCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJLy8gY2hlY2sgcGFyZW50cwotCQlMaXN0IGNsYXNzZXNUb0NoZWNrID0gY2xhenouZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJSXRlcmF0b3IgY2xhenpJdGVyYXRvciA9IGNsYXNzZXNUb0NoZWNrLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjbGF6ekl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJY2xhenogPSAoSmF2YUNsYXNzKSBjbGF6ekl0ZXJhdG9yLm5leHQoKTsKLQkJCW1ldGhvZCA9IGdldE1ldGhvZEludGVyZmFjZUV4dGVuZGVkKGNsYXp6LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBleGNlcHRpb25zIHRocm93biBieSBtZXRob2QgYnV0IG5vdCBtZXRob2RUb01hdGNoLgotCSAqIElmIHRoZXJlIGFyZSBubyBzdWNoIGV4Y2VwdGlvbnMsIHJldHVybiBudWxsLiAoQ2hlY2sgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucwotCSAqIGluIHRoZSBtZXRob2QgZm9yIGVhY2ggZXhjZXB0aW9uLCBvciBhIHBhcmVudCBvZiB0aGUgZXhjZXB0aW9uLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNldCBnZXROb3RTdWJzZXRFeGNlcHRpb25zKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QsIE1ldGhvZCBtZXRob2RUb01hdGNoKSB7Ci0JCWlmKChtZXRob2RUb01hdGNoID09IG51bGwpIHx8IChtZXRob2QgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQkJCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgbWV0aG9kIG9mIHRoZSAKLQkJLy8gZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgCi0JCS8vIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCS8vCi0JCS8vIFNlY3Rpb24gMTIuMi4yCi0JCS8vIFsxNV0gQSBjaGVja2VkIGV4Y2VwdGlvbiBpcyBvbmUgdGhhdCBpcyBub3QgYSBzdWJjbGFzcyBvZiBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCQkvLyAiTm90ZSB0aGF0IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uLAotCQkvLyBhbmQgdGhlcmVmb3JlIGl0IGRvZXMgbm90IGhhdmUgdG8gYmUgbGlzdGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlcyBvZiB0aGUgYnVzaW5lc3MKLQkJLy8gbWV0aG9kcy4iCi0JCUhhc2hTZXQgZXhjZXB0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgbWV0aFRvTWF0Y2hFeGNlcHRpb25zID0gbWV0aG9kVG9NYXRjaC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQlMaXN0IGZvdW5kTWV0aEV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBmb3VuZE1ldGhFeGNlcHRpb25zLnNpemUoKTsgaSsrICkgewotCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpZm91bmRNZXRoRXhjZXB0aW9ucy5nZXQoaSk7Ci0JCQlpZiAoICFpc1J1bnRpbWVFeGNlcHRpb24oZXhjLCBiZWFuKSAmJiAhaXNSZW1vdGVFeGNlcHRpb24oZXhjLCBiZWFuKSAmJiAhaXNFeGNlcHRpb25Jbkxpc3QoZXhjLCBtZXRoVG9NYXRjaEV4Y2VwdGlvbnMpICkgewotCQkJCWV4Y2VwdGlvbnMuYWRkKGV4Yyk7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIGV4Y2VwdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgZXhjZXB0aW9ucyB0aHJvd24gYnkgbWV0aG9kIGJ1dCBub3QgbWV0aG9kVG9NYXRjaC4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gc3VjaCBleGNlcHRpb25zLCByZXR1cm4gbnVsbC4gKENoZWNrIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMKLQkgKiBpbiB0aGUgbWV0aG9kIGZvciBlYWNoIGV4Y2VwdGlvbiwgb3IgYSBjaGlsZCBvZiB0aGUgZXhjZXB0aW9uLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNldCBnZXROb3RTdWJzZXRTdWJ0eXBlRXhjZXB0aW9ucyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kLCBNZXRob2QgbWV0aG9kVG9NYXRjaCkgewotCQlpZigobWV0aG9kVG9NYXRjaCA9PSBudWxsKSB8fCAobWV0aG9kID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQl9Ci0JCQotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhIG1ldGhvZCBvZiB0aGUgCi0JCS8vIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIAotCQkvLyBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQkvLwotCQkvLyBTZWN0aW9uIDEyLjIuMgotCQkvLyBbMTVdIEEgY2hlY2tlZCBleGNlcHRpb24gaXMgb25lIHRoYXQgaXMgbm90IGEgc3ViY2xhc3Mgb2YgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQkJLy8gIk5vdGUgdGhhdCB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBpcyBhIHN1YmNsYXNzIG9mIHRoZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiwKLQkJLy8gYW5kIHRoZXJlZm9yZSBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIGxpc3RlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZXMgb2YgdGhlIGJ1c2luZXNzCi0JCS8vIG1ldGhvZHMuIgotCQlIYXNoU2V0IGV4Y2VwdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IG1ldGhUb01hdGNoRXhjZXB0aW9ucyA9IG1ldGhvZFRvTWF0Y2guZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJTGlzdCBmb3VuZE1ldGhFeGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgZm91bmRNZXRoRXhjZXB0aW9ucy5zaXplKCk7IGkrKyApIHsKLQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKWZvdW5kTWV0aEV4Y2VwdGlvbnMuZ2V0KGkpOwotCQkJaWYgKCAhaXNSdW50aW1lRXhjZXB0aW9uKGV4YywgYmVhbikgJiYgIWlzUmVtb3RlRXhjZXB0aW9uKGV4YywgYmVhbikgJiYgIWlzU3VidHlwZUV4Y2VwdGlvbkluTGlzdChleGMsIG1ldGhUb01hdGNoRXhjZXB0aW9ucykgKSB7Ci0JCQkJZXhjZXB0aW9ucy5hZGQoZXhjKTsKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gZXhjZXB0aW9uczsKLQl9Ci0JCi0JLyoqCi0JICogCUV4Y2x1ZGUgcm9vdCBob21lIGludGVyZmFjZSBtZXRob2RzIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VKQkhvbWVNZXRob2QoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gaXNTYW1lVHlwZShiZWFuLCBtZXRob2QuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpLCBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkhPTUUpOwotCX0KLQkKLQkvKioKLQkgKiAJRXhjbHVkZSByb290IHJlbW90ZSBpbnRlcmZhY2UgbWV0aG9kcyAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFSkJPYmplY3RNZXRob2QoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gaXNTYW1lVHlwZShiZWFuLCBtZXRob2QuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpLCBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQk9CSkVDVCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBleGNlcHRpb24sIG9yIGEgcGFyZW50IG9mIHRoZSBleGNlcHRpb24sIGlzIGluIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0V4Y2VwdGlvbkluTGlzdChKYXZhQ2xhc3MgZXhjLCBMaXN0IGV4Y2VwdGlvbkxpc3QpIHsKLQkgICAgICAgaWYoKGV4YyA9PSBudWxsKSB8fCAoZXhjZXB0aW9uTGlzdCA9PSBudWxsKSkgewotCSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICB9Ci0JICAgICAgIAotCSAgICAgICBpZighZXhjLmlzRXhpc3RpbmdUeXBlKCkpIHsKLQkgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgfQotCSAgICAgICAKLQkgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25MaXN0Lml0ZXJhdG9yKCk7Ci0JICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCSAgICAgICAgICAgICAgSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCSAgICAgICAgICAgICAgaWYoaXNBc3NpZ25hYmxlRnJvbShleGMsIGV4Y2VwdGlvbikpIHsKLQkgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHJlZmxlY3Rpb24gcHJvYmxlbSwgZG8gbm90IHN3YWxsb3cgdGhlIGV4Y2VwdGlvbiBvciBhCi0JICAgICAgICAgICAgICAgICAgICAgLy8gZmF1bHR5IG1lc3NhZ2UgbWF5IGFwcGVhci4gKGkuZS4sICJleGMiIGlzIG5vdCB0aHJvd24gYnkgImZvbyIgd2hlbiBpdAotCSAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWxseSBpcyBidXQgb25lIG9mIGZvbydzIGV4Y2VwdGlvbnMgd2Fzbid0IHJlZmxlY3RlZC4KLQkgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgICAgICAgICAgIH0KLQkgICAgICAgfQotCSAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBleGNlcHRpb24sIG9yIGEgY2hpbGQgb2YgdGhlIGV4Y2VwdGlvbiwgaXMgaW4gdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucy4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU3VidHlwZUV4Y2VwdGlvbkluTGlzdChKYXZhQ2xhc3MgZXhjLCBMaXN0IGV4Y2VwdGlvbkxpc3QpIHsKLQkgICAgICAgaWYoKGV4YyA9PSBudWxsKSB8fCAoZXhjZXB0aW9uTGlzdCA9PSBudWxsKSkgewotCSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICB9Ci0JICAgICAgIAotCSAgICAgICBpZighZXhjLmlzRXhpc3RpbmdUeXBlKCkpIHsKLQkgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgfQotCSAgICAgICAKLQkgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25MaXN0Lml0ZXJhdG9yKCk7Ci0JICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCSAgICAgICAgICAgICAgSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCSAgICAgICAgICAgICAgaWYoaXNBc3NpZ25hYmxlRnJvbShleGNlcHRpb24sIGV4YykpIHsKLQkgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHJlZmxlY3Rpb24gcHJvYmxlbSwgZG8gbm90IHN3YWxsb3cgdGhlIGV4Y2VwdGlvbiBvciBhCi0JICAgICAgICAgICAgICAgICAgICAgLy8gZmF1bHR5IG1lc3NhZ2UgbWF5IGFwcGVhci4gKGkuZS4sICJleGMiIGlzIG5vdCB0aHJvd24gYnkgImZvbyIgd2hlbiBpdAotCSAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWxseSBpcyBidXQgb25lIG9mIGZvbydzIGV4Y2VwdGlvbnMgd2Fzbid0IHJlZmxlY3RlZC4KLQkgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgICAgICAgICAgIH0KLQkgICAgICAgfQotCSAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT2Z0ZW4sIGZvciB2YWxpZGF0aW9uIG1lc3NhZ2VzLCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIGNvbnRhaW5zCi0JICogdGhlIG5hbWUgb2YgYSBjbGFzcy4gQnV0LCBzb21ldGltZXMsIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgaXMKLQkgKiBiZWluZyBnZW5lcmF0ZWQgYmVjYXVzZSBhIGNsYXNzIGlzIG51bGwgd2hlbiBpdCBzaG91bGRuJ3QgYmUuCi0JICogVGhpcyBtZXRob2QgaXMgYSBoZWxwZXIgbWV0aG9kIHdoaWNoIG1ha2VzIHRoZSBjb25zdHJ1Y3Rpb24gb2YKLQkgKiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIGEgbGl0dGxlIGxlc3MgY2x1dHRlcmVkIChpLmUuLCBpbnN0ZWFkCi0JICogb2YgY2hlY2tpbmcgaWYgdGhlIGNsYXNzIGlzIG51bGwgYmVmb3JlIGNvbnN0cnVjdGluZyB0aGUKLQkgKiBtZXNzYWdlLCBqdXN0IGNhbGwgdGhpcyBtZXRob2QuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoSmF2YUhlbHBlcnMgaGVscGVyKSB7Ci0JCWlmKGhlbHBlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaGVscGVyLmdldEphdmFOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QncyBwYXJhbWV0ZXJzIGluIGEgZGlzcGxheWFibGUgZm9ybWF0LiBlLmcuLCBpZgotCSAqIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzICJwdWJsaWMgSW50ZWdlciBmb28oU3RyaW5nIGEsIFN0cmluZyBiLCBTdHJpbmcgYykiCi0JICogdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zICJTdHJpbmcsIFN0cmluZywgU3RyaW5nIi4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UGFybXNBc1N0cmluZyhNZXRob2QgbWV0aG9kKSB7Ci0JCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmV0dXJuIGdldFBhcm1zQXNTdHJpbmcobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIGluIGEgZGlzcGxheWFibGUgZm9ybWF0LiAKLQkgKiBAc2VlIGdldFBhcm1zQXNTdHJpbmcoTWV0aG9kKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFBhcm1zQXNTdHJpbmcoSmF2YVBhcmFtZXRlcltdIHBhcm0pIHsKLQkJaWYocGFybS5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcihpbnQgaT0wOyBpPHBhcm0ubGVuZ3RoOyBpKyspIHsKLQkJCUphdmFIZWxwZXJzIHR5cGUgPSBwYXJtW2ldLmdldEphdmFUeXBlKCk7Ci0JCQlidWZmZXIuYXBwZW5kKCgodHlwZSA9PSBudWxsKSA/ICJudWxsIiA6IHR5cGUuZ2V0SmF2YU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKENPTU1BKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnN1YnN0cmluZygwLCBidWZmZXIubGVuZ3RoKCkgLSAyKTsgLy8gc2luY2UgIkNPTU1BIiBpcyAyIGNoYXIgbG9uZywgYW5kIHRoZSBsYXN0IENPTU1BIGlzbid0IG5lZWRlZCBhdCB0aGUgZW5kLCByZXR1cm4gZXZlcnl0aGluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBsYXN0IENPTU1BCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIGluIGEgZGlzcGxheWFibGUgZm9ybWF0LiAKLQkgKiBAc2VlIGdldFBhcm1zQXNTdHJpbmcoTWV0aG9kKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFBhcm1zQXNTdHJpbmcoSmF2YUhlbHBlcnNbXSBwYXJtKSB7Ci0JCWlmKHBhcm0ubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IoaW50IGk9MDsgaTxwYXJtLmxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhSGVscGVycyB0eXBlID0gcGFybVtpXTsKLQkJCWJ1ZmZlci5hcHBlbmQoKCh0eXBlID09IG51bGwpID8gIm51bGwiIDogdHlwZS5nZXRKYXZhTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUEpOwotCQl9Ci0JCXJldHVybiBidWZmZXIuc3Vic3RyaW5nKDAsIGJ1ZmZlci5sZW5ndGgoKSAtIDIpOyAvLyBzaW5jZSAiQ09NTUEiIGlzIDIgY2hhciBsb25nLCBhbmQgdGhlIGxhc3QgQ09NTUEgaXNuJ3QgbmVlZGVkIGF0IHRoZSBlbmQsIHJldHVybiBldmVyeXRoaW5nIHVwIHRvIGJ1dCBleGNsdWRpbmcgdGhlIGxhc3QgQ09NTUEKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdHlwZSwgZS5nLiAiY29tLmlibS5mb28uTXlGb28iCi0JICogSWYgdGhlIHR5cGUgaXMgYW4gYXJyYXksIHRoZSBhcnJheSB0eXBlIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogZS5nLiBpZiB0aGUgdHlwZSBpcyBqYXZhLmxhbmcuU3RyaW5nW10sIGphdmEubGFuZy5TdHJpbmdbXSB3aWxsCi0JICogYmUgcmV0dXJuZWQsIG5vdCB0aGUgamF2YS5sYW5nLlN0cmluZyB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0VHlwZShFQ2xhc3NpZmllciBjbGFzc2lmaWVyKSB7Ci0JCWlmKGNsYXNzaWZpZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQkJSmF2YUhlbHBlcnMgdHlwZSA9ICgoSmF2YUhlbHBlcnMpY2xhc3NpZmllcik7Ci0JCi0JCXJldHVybiB0eXBlOwotCX0KLQotCSAvKioKLSAgICAgKiBqYXZhQ2xhc3NOYW1lIG11c3QgYmUgZnVsbHkgcXVhbGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRUeXBlKFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBFbnRlcnByaXNlQmVhbiBlamIpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoKGphdmFDbGFzc05hbWUgPT0gbnVsbCkgfHwgKGphdmFDbGFzc05hbWUuZXF1YWxzKCIiKSB8fCAoZWpiID09IG51bGwpKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOwotCi0JCVJlc291cmNlIHJlc291cmNlID0gZWpiLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSmF2YUhlbHBlcnMgaGVscGVyID0gbnVsbDsKLQkJaWYoY29tbW9uQ2xhc3NOYW1lcyA9PSBudWxsIHx8IGNvbW1vbkNsYXNzTmFtZXMuaXNFbXB0eSgpKSB7Ci0JCQlpbml0aWFsaXplQ29tbW9uQ2xhc3NOYW1lcygpOwotCQl9Ci0JCWlmIChjb21tb25DbGFzc05hbWVzLmNvbnRhaW5zKGphdmFDbGFzc05hbWUpKSB7Ci0JCQlpZiAoaGVscGVyTWFwID09IG51bGwpCi0JCQkJaGVscGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVJlc291cmNlU2V0IHJTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJT2JqZWN0IG9iaiA9IGhlbHBlck1hcC5nZXQoamF2YUNsYXNzTmFtZSk7Ci0JCQlpZiAob2JqICE9IG51bGwpIAotCQkJCXJldHVybiAoSmF2YUhlbHBlcnMpIG9iajsKLQkJCSBlbHNlIHsKLQkJCQloZWxwZXIgPSBnZXRUeXBlKGphdmFDbGFzc05hbWUsclNldCk7Ci0JCQkJaGVscGVyTWFwLnB1dChqYXZhQ2xhc3NOYW1lLCBoZWxwZXIpOwotCQkJfQotCQl9IGVsc2UKLQkJCWhlbHBlciA9IGdldFR5cGUoamF2YUNsYXNzTmFtZSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUNvbW1vbkNsYXNzTmFtZXMoKSB7Ci0JCWlmKGNvbW1vbkNsYXNzTmFtZXMgPT0gbnVsbCkKLQkJCWNvbW1vbkNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQljb21tb25DbGFzc05hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9JT19JT0VYQ0VQVElPTik7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0lPX1NFUklBTElaQUJMRSk7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUKTsKLQkJY29tbW9uQ2xhc3NOYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19FWENFUFRJT04pOwotCQljb21tb25DbGFzc05hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04pOwotCQljb21tb25DbGFzc05hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFKTsKLQkJY29tbW9uQ2xhc3NOYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URUVYQ0VQVElPTik7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTik7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfRU5VTUVSQVRJT04pOwotCQljb21tb25DbGFzc05hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX1NFVCk7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfQ1JFQVRFRVhDRVBUSU9OKTsKLQkJY29tbW9uQ2xhc3NOYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FTlRJVFlCRUFOKTsKLQkJY29tbW9uQ2xhc3NOYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJFWENFUFRJT04pOwotCQljb21tb25DbGFzc05hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkhPTUUpOwotCQljb21tb25DbGFzc05hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRSk7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCT0JKRUNUKTsKLQkJY29tbW9uQ2xhc3NOYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVCk7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQ09OVEVYVCk7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRklOREVSRVhDRVBUSU9OKTsKLQkJY29tbW9uQ2xhc3NOYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTik7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfT0JKRUNUTk9URk9VTkRFWENFUFRJT04pOwotCQljb21tb25DbGFzc05hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05CRUFOKTsKLQkJY29tbW9uQ2xhc3NOYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQ09OVEVYVCk7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTik7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRSk7Ci0JCWNvbW1vbkNsYXNzTmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSKTsKLQkJY29tbW9uQ2xhc3NOYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX1RSQU5TQUNUSU9OX1VTRVJUUkFOU0FDVElPTik7Ci0JfQotCQotCS8qKgotCSAqIGphdmFDbGFzc05hbWUgbXVzdCBiZSBmdWxseSBxdWFsaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFIZWxwZXJzIGdldFR5cGUoU3RyaW5nIGphdmFDbGFzc05hbWUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFR5cGUoamF2YUNsYXNzTmFtZSwgcmVzb3VyY2VTZXQsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBqYXZhQ2xhc3NOYW1lIG11c3QgYmUgZnVsbHkgcXVhbGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRUeXBlKFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgYm9vbGVhbiB0aHJvd0V4Y0lmTm90VmFsaWQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZigoamF2YUNsYXNzTmFtZSA9PSBudWxsKSAgfHwgKGphdmFDbGFzc05hbWUuZXF1YWxzKCIiKSB8fCAocmVzb3VyY2VTZXQgPT0gbnVsbCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlciBhTG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKFN0cmluZywgUmVzb3VyY2VTZXQsIGJvb2xlYW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGV4dCA9ICJpbnZhbGlkIHBhcmFtZXRlcjsgamF2YUNsYXNzTmFtZSA9IHswfSBhbmQgcmVzb3VyY2VTZXQgPSB7MX0iOwotCQkJCS8vZW50cnkuc2V0VGV4dCgiaW52YWxpZCBwYXJhbWV0ZXI7IGphdmFDbGFzc05hbWUgPSB7MH0gYW5kIHJlc291cmNlU2V0ID0gezF9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvL2VudHJ5LnNldFRva2VucyhuZXcgU3RyaW5nW117amF2YUNsYXNzTmFtZSwgU3RyaW5nLnZhbHVlT2YocmVzb3VyY2VTZXQpfSk7Ci0JCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsCi0JCQkJCQkgbmV3IFN0cmluZ1tde2phdmFDbGFzc05hbWUsIFN0cmluZy52YWx1ZU9mKHJlc291cmNlU2V0KX0pOwotCQkJCWVudHJ5LnNldFRleHQocmVzdWx0KTsKLQkJCQkKLQkJCQllbnRyeS5hcHBlbmRTdGFja1RyYWNlKCk7Ci0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQotCQkvLyBJZiB0aGUgY2xhc3MgZG9lc24ndCBleGlzdCwgaXQgd2lsbCBiZSByZWZsZWN0ZWQKLQkJSmF2YUhlbHBlcnMgaGVscGVyID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGphdmFDbGFzc05hbWUsIHJlc291cmNlU2V0KTsKLQkJaWYodGhyb3dFeGNJZk5vdFZhbGlkKSB7Ci0JCQlpc1ZhbGlkVHlwZShoZWxwZXIpOyAvLyBjaGVjayB0aGF0IHRoZSB0eXBlIGhhcyBiZWVuIHJlZmxlY3RlZCBwcm9wZXJseQotCQl9Ci0JCQotCQlyZXR1cm4gaGVscGVyOwotCX0KLQkKLQkvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nRW50cnkgZ2V0TG9nRW50cnkoKSB7Ci0JCWlmKGxvZ0VudHJ5ID09IG51bGwpIHsKLQkJICAgIGxvZ0VudHJ5ID0gbmV3IExvZ0VudHJ5KElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUpOwotCQl9Ci0JCWxvZ0VudHJ5LnJlc2V0KCk7IC8vIHJlc2V0IHRoZSB2YWx1ZXMgc28gdGhhdCB3ZSdyZSBub3QgbG9nZ2luZyBzdGFsZSBkYXRhCi0JCXJldHVybiBsb2dFbnRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLSAgICAgICAgaWYobG9nZ2VyID09IG51bGwpCi0gICAgICAgICAgICBsb2dnZXIgPSBKMkVFQ29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLSAgICAgICAgcmV0dXJuIGxvZ2dlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFIZWxwZXJzIGdldFR5cGUoRmllbGQgZmllbGQpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiAoSmF2YUhlbHBlcnMpZmllbGQuZ2V0RVR5cGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIEphdmFDbGFzcyBwYXNzZWQgaW4gaGFzIHRoZSBNZXRob2QgZGVmaW5lZAotCSAqIG9uIGl0LiBSZXR1cm4gZmFsc2UgaWYgdGhlIE1ldGhvZCBpcyBkZWZpbmVkIG9uIGEgc3VwZXJ0eXBlIG9yIAotCSAqIGlzIG5vdCBkZWZpbmVkIG9uIHRoZSBjbGFzcyBhdCBhbGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIG9uQ2xhc3MoSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAobWV0aG9kID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBjbGF6ei5lcXVhbHMobWV0aG9kLmdldEphdmFDbGFzcygpKTsgCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBKYXZhQ2xhc3MgcGFzc2VkIGluIGhhcyB0aGUgRmllbGQgZGVmaW5lZAotCSAqIG9uIGl0LiBSZXR1cm4gZmFsc2UgaWYgdGhlIEZpZWxkIGlzIGRlZmluZWQgb24gYSBzdXBlcnR5cGUgb3IgCi0JICogaXMgbm90IGRlZmluZWQgb24gdGhlIGNsYXNzIGF0IGFsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gb25DbGFzcyhKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7Ci0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAoZmllbGQgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIGNsYXp6LmVxdWFscyhmaWVsZC5nZXRKYXZhQ2xhc3MoKSk7IAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkV4Y2VwdGlvbihKYXZhQ2xhc3MgZXhjZXB0aW9uLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGV4Y2VwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIEV4ZW1wdCBFSkJFeGNlcHRpb24gZnJvbSB0aGUgYXBwbGljYXRpb24gZXhjZXB0aW9uIGNoZWNrIGJlY2F1c2UgaXQnbGwgZHJpdmUgdXNlcnMgY3JhenkgdG8gc2VlIAotCQkvLyBpdCBmbGFnZ2VkIGFzIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4KLQkJdHJ5IHsKLQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1NhbWVUeXBlKGV4Y2VwdGlvbiwgZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkVYQ0VQVElPTiwgYmVhbikpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2dnZWQgaW4gZ2V0VHlwZSgpCi0JCQkvLyBpZiBFSkJFeGNlcHRpb24gY2FuJ3QgYmUgZm91bmQsIHRoZW4gdGhlcmUncyBwcm9iYWJseSBhIHN5c3RlbSBKQVIgbWlzc2luZwotCQl9Ci0JCQotCQkvLyAxOC4xLjEgQXBwbGljYXRpb24gZXhjZXB0aW9ucwotCQkvLyBBbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gaXMgYW4gZXhjZXB0aW9uIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYSBtZXRob2Qgb2YgdGhlIGVudGVycHJpc2UKLQkJLy8gQmVhbidzIGhvbWUgYW5kIGNvbXBvbmVudCBpbnRlcmZhY2VzLCBvdGhlciB0aGFuIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JCXJldHVybiAhaXNSZW1vdGVFeGNlcHRpb24oZXhjZXB0aW9uLCBiZWFuKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUmVtb3RlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyBqYXZhUm1pUmVtb3RlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URSwgYmVhbik7Ci0JCQlpZihpc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBqYXZhUm1pUmVtb3RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUmVzZXJ2ZWRXb3JkKFN0cmluZyBuYW1lKSB7Ci0JCWlmKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlTdHJpbmcgdXBwZXJOYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQlmb3IoaW50IGk9MDsgaTxfcmVzZXJ2ZWRXb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJaWYodXBwZXJOYW1lLmVxdWFscyhfcmVzZXJ2ZWRXb3Jkc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1J1bnRpbWVFeGNlcHRpb24oSmF2YUNsYXNzIGNsYXp6LCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGNsYXp6ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIHJ1bnRpbWVFeGMgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTiwgYmVhbik7Ci0JCQlyZXR1cm4gaXNFeGNlcHRpb24oY2xhenosIHJ1bnRpbWVFeGMuZ2V0V3JhcHBlcigpKTsKLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1JlbW90ZUV4Y2VwdGlvbihKYXZhQ2xhc3MgY2xhenosIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgcmVtb3RlRXhjID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OLCBiZWFuKTsKLQkJCXJldHVybiBpc0V4Y2VwdGlvbihjbGF6eiwgcmVtb3RlRXhjLmdldFdyYXBwZXIoKSk7Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjbGF6eiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNFeGNlcHRpb24oSmF2YUNsYXNzIGNsYXp6LCBKYXZhQ2xhc3MgZXhjZXB0aW9uKSB7Ci0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAoZXhjZXB0aW9uID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBleGNlcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBlaXRoZXIgamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yIGEgdHlwZSB3aGljaCBpbmhlcml0cy9leHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9uLgotCSAqIFRoZSBiZWFuIGlzIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgamF2YS51dGlsLkNvbGxlY3Rpb24gdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbUNvbGxlY3Rpb24oSmF2YUhlbHBlcnMgdHlwZSwgRW50ZXJwcmlzZUJlYW4gYmVhbikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUphdmFIZWxwZXJzIGphdmFVdGlsQ29sbGVjdGlvbiA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKTsKLQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20odHlwZSwgamF2YVV0aWxDb2xsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgZWl0aGVyIGphdmEudXRpbC5FbnVtZXJhdGlvbiwgb3IgYSB0eXBlIHdoaWNoIGluaGVyaXRzL2V4dGVuZHMgamF2YS51dGlsLkVudW1lcmF0aW9uLgotCSAqIFRoZSBiZWFuIGlzIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgamF2YS51dGlsLkVudW1lcmF0aW9uIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXNzaWduYWJsZUZyb21FbnVtZXJhdGlvbihKYXZhSGVscGVycyB0eXBlLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxFbnVtZXJhdGlvbiA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9FTlVNRVJBVElPTiwgYmVhbik7Ci0JCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKHR5cGUsIGphdmFVdGlsRW51bWVyYXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBlaXRoZXIgamF2YS51dGlsLlNldCwgb3IgYSB0eXBlIHdoaWNoIGluaGVyaXRzL2V4dGVuZHMgamF2YS51dGlsLlNldC4KLQkgKiBUaGUgYmVhbiBpcyBuZWVkZWQgdG8gcmV0cmlldmUgdGhlIGphdmEudXRpbC5TZXQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbVNldChKYXZhSGVscGVycyB0eXBlLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxTZXQgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfU0VULCBiZWFuKTsKLQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20odHlwZSwgamF2YVV0aWxTZXQpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgZWl0aGVyIHRoZSBjb21wYXJlIHR5cGUsIG9yIGluaGVyaXRzL2V4dGVuZHMgdGhlIGNvbXBhcmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShKYXZhSGVscGVycyB0eXBlLCBKYXZhSGVscGVycyBjb21wYXJlVHlwZSkgewotCQlpZigodHlwZSA9PSBudWxsKSB8fCAoY29tcGFyZVR5cGUgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlpZih0eXBlLmlzUHJpbWl0aXZlKCkgfHwgY29tcGFyZVR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJaWYodHlwZS5pc1ByaW1pdGl2ZSgpICYmIGNvbXBhcmVUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQlyZXR1cm4gdHlwZS5nZXRQcmltaXRpdmUoKS5lcXVhbHMoY29tcGFyZVR5cGUuZ2V0UHJpbWl0aXZlKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYodHlwZS5pc0FycmF5KCkgJiYgY29tcGFyZVR5cGUuaXNBcnJheSgpKSB7Ci0JCQlKYXZhQ2xhc3MgY2xhc3NUeXBlID0gdHlwZS5nZXRXcmFwcGVyKCk7Ci0JCQlKYXZhQ2xhc3MgY2xhc3NDb21wYXJlVHlwZSA9IGNvbXBhcmVUeXBlLmdldFdyYXBwZXIoKTsKLQkJCWlmKChjbGFzc1R5cGUgPT0gbnVsbCkgfHwgKGNvbXBhcmVUeXBlID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJSmF2YUhlbHBlcnMgZmluYWxUeXBlID0gKChBcnJheVR5cGUpY2xhc3NUeXBlKS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJCUphdmFIZWxwZXJzIGZpbmFsQ29tcGFyZVR5cGUgPSAoKEFycmF5VHlwZSljbGFzc0NvbXBhcmVUeXBlKS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKGZpbmFsVHlwZSwgZmluYWxDb21wYXJlVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gY29tcGFyZVR5cGUuZ2V0V3JhcHBlcigpLmlzQXNzaWduYWJsZUZyb20odHlwZS5nZXRXcmFwcGVyKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCBpcyBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0Fzc29jaWF0ZWRXaXRoUXVlcnkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAsIE1ldGhvZCBtZXRob2QpIHsKLQkJLy8gQ2hlY2sgbWV0aG9kIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwuCi0JCUxpc3QgcXVlcmllcyA9IGNtcC5nZXRRdWVyaWVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcXVlcmllcy5pdGVyYXRvcigpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUXVlcnkgcXVlcnkgPSAoUXVlcnkpaXRlcmF0b3IubmV4dCgpOwotCQkJUXVlcnlNZXRob2QgcXVlcnlNZXRob2QgPSBxdWVyeS5nZXRRdWVyeU1ldGhvZCgpOwotCQkJaWYocXVlcnlNZXRob2QgPT0gbnVsbCkgewotCQkJCS8vIExldCB0aGUgRUpCSmFyVlJ1bGUgcmVwb3J0IHRoaXMKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYoKHF1ZXJ5TWV0aG9kLmdldE5hbWUoKSA9PSBudWxsKSB8fCBxdWVyeU1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gTGV0IHRoZSBFSkJKYXJWUnVsZSByZXBvcnQgdGhpcwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihxdWVyeU1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0JlYW5NYW5hZ2VkU2Vzc2lvbihFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihiZWFuLmlzRW50aXR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gKCgoU2Vzc2lvbiliZWFuKS5nZXRUcmFuc2FjdGlvblR5cGUoKS5nZXRWYWx1ZSgpID09IFRyYW5zYWN0aW9uVHlwZS5CRUFOKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2QgaXMgdGhlIHN0YXRpYyBpbml0aWFsaXplciB1c2VkIGZvciBpbnRlcmZhY2VzICgiPGNsaW5pdD4iKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsaW5pdE1ldGhvZChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCI8Y2xpbml0PiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSk5ESU5hbWluZ0NvbnRleHQoRmllbGQgZmllbGQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBpcyBkZWZpbmVkIG9uIGphdmEubGFuZy5PYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUxhbmdPYmplY3RGaWVsZChFbnRlcnByaXNlQmVhbiBiZWFuLCBGaWVsZCBmaWVsZCkgewotCQlyZXR1cm4gaXNTYW1lVHlwZShiZWFuLCBmaWVsZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCksIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBkZWZpbmVkIG9uIG5hbWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc093bmVkQnkoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNTYW1lVHlwZShiZWFuLCBtZXRob2QuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpLCBjbGFzc05hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBjbGFzcyBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZWQgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2FtZVR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIG93bmVyLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyBoZWxwZXIgPSBnZXRUeXBlKGNsYXNzTmFtZSwgYmVhbik7Ci0JCQlpZihoZWxwZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJSmF2YUNsYXNzIG9iamVjdCA9IGhlbHBlci5nZXRXcmFwcGVyKCk7Ci0JCQkKLQkJCXJldHVybiBpc1NhbWVUeXBlKG93bmVyLCBvYmplY3QpOwotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgZ2l2ZW4gY2xhc3MgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NhbWVUeXBlKEphdmFIZWxwZXJzIG93bmVyLCBKYXZhSGVscGVycyBvYmplY3QpIHsKLQkJaWYob3duZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihvYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihvd25lci5pc1ByaW1pdGl2ZSgpICYmIG9iamVjdC5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkvLyBCb3RoIGFyZSBKYXZhRGF0YVR5cGUKLQkJCXJldHVybiBvd25lci5nZXRQcmltaXRpdmUoKS5lcXVhbHMob2JqZWN0LmdldFByaW1pdGl2ZSgpKTsKLQkJfQotCQllbHNlIGlmKG93bmVyLmlzQXJyYXkoKSAmJiBvYmplY3QuaXNBcnJheSgpKSB7Ci0JCQkvLyBCb3RoIGFyZSBBcnJheVR5cGUKLQkJCUFycmF5VHlwZSBvd25lckFycmF5ID0gKEFycmF5VHlwZSlvd25lcjsKLQkJCUFycmF5VHlwZSBvYmplY3RBcnJheSA9IChBcnJheVR5cGUpb2JqZWN0OwotCQkJcmV0dXJuIGlzU2FtZVR5cGUob3duZXJBcnJheS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKSwgb2JqZWN0QXJyYXkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCkpOwotCQl9Ci0JCWVsc2UgaWYoKG93bmVyLmdldFdyYXBwZXIoKSAhPSBudWxsKSAmJiAob2JqZWN0LmdldFdyYXBwZXIoKSAhPSBudWxsKSkgewotCQkJLy8gQm90aCBhcmUgSmF2YUNsYXNzCi0JCQlyZXR1cm4gb3duZXIuZ2V0V3JhcHBlcigpLmVxdWFscyhvYmplY3QuZ2V0V3JhcHBlcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG1pc21hdGNoaW5nIEphdmFIZWxwZXJzIHR5cGUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGRlZmluZWQgb24gamF2YS5sYW5nLk9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhTGFuZ09iamVjdE1ldGhvZChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBpc1NhbWVUeXBlKGJlYW4sIG1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCksIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTGVnYWxSTUlfSUlPUEluaGVyaXRhbmNlKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTGVnYWxSTUlfSUlPUFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUhlbHBlcnMgaGVscGVyKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYoaGVscGVyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gaXNTZXJpYWxpemFibGUoaGVscGVyLCBiZWFuKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTG9jYWxUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFIZWxwZXJzIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCWlmKGlzU2FtZVR5cGUodHlwZSwgZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgYmVhbikpKSB7Ci0JCQkJLy8gSWYgdGhlcmUncyBhbiB1bmRlZmluZWQgcHJpbWFyeSBrZXkgKGphdmEubGFuZy5PYmplY3QpLCBkb24ndCBmbGFnIGl0IGFzIGEgbG9jYWwgdHlwZS4KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIExldCB0aGUgREQgdmFsaWRhdGlvbiByZXBvcnQgdGhpcy4KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoaXNBc3NpZ25hYmxlRnJvbShiZWFuLmdldExvY2FsSW50ZXJmYWNlKCksIHR5cGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYoaXNBc3NpZ25hYmxlRnJvbShiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpLCB0eXBlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCS8vIEJpdCBvZiBhIHBlcmZvcm1hbmNlIGhhY2sgaGVyZS4KLQkJLy8gRG9uJ3Qgd2FudCB0byBsb2FkIGFuZCBwYXJzZSB0aGUgZW50aXJlIEVKQkphciBqdXN0IHRvIGNoZWNrIGlmCi0JCS8vIHRoaXMgdHlwZSBpcyBsb2NhbCwgc28gYXNzdW1lIHRoYXQgaWYgdGhlIGV4dGVuZHMgCi0JCS8vIGphdmF4LmVqYi5FSkJMb2NhbEhvbWUgb3IgamF2YXguZWpiLkVKQkxvY2FsT2JqZWN0LCB0aGVuIGl0J3MgbG9jYWwuCi0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyBlamJMb2NhbEhvbWUgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCTE9DQUxIT01FLCBiZWFuKTsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oZWpiTG9jYWxIb21lLCB0eXBlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIGlnbm9yZSBhbmQgdHJ5IG90aGVyIHR5cGUKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIGVqYkxvY2FsT2JqZWN0ID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNULCBiZWFuKTsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oZWpiTG9jYWxPYmplY3QsIHR5cGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlc1Vua25vd25QcmltYXJ5S2V5KEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJcmV0dXJuIHVzZXNVbmtub3duUHJpbWFyeUtleSgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VzVW5rbm93blByaW1hcnlLZXkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYoY21wID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWlmKGlzU2FtZVR5cGUoY21wLmdldFByaW1hcnlLZXkoKSwgZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgY21wKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJLy8gSWYgamF2YS5sYW5nLk9iamVjdCBjYW4ndCBiZSBmb3VuZCwgdGhlcmUncyBiaWdnZXIgcHJvYmxlbXMgdGhhbiB2YWxpZGF0aW5nCi0JCQkvLyBpdCBtaXN0YWtlbmx5Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZihjbXAuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJTGlzdCBjbXBGaWVsZHMgPSBjbXAuZ2V0RmlsdGVyZWRGZWF0dXJlcyhMb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5zaW5nbGV0b24oKSk7Ci0JCQlpZihjbXBGaWVsZHMgIT0gbnVsbCAmJiAhY21wRmllbGRzLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjbXBGaWVsZHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUNNUEF0dHJpYnV0ZSBhdHRyaWIgPSAoQ01QQXR0cmlidXRlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihpc1Vua25vd25QcmltYXJ5S2V5KGF0dHJpYikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkgIH0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1VuaWRpcmVjdGlvbmFsUmVsYXRpb25zaGlwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlKSB7Ci0JCS8vIFBhZ2UgMTMxIG9mIEVKQiAyLjA6Ci0JCS8vIEEgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGlzIGltcGxlbWVudGVkIHdpdGggYSBjbXItZmllbGQgb24gdGhlIGVudGl0eSBiZWFuIGluc3RhbmNlIGZyb20gd2hpY2gKLQkJLy8gbmF2aWdhdGlvbiBjYW4gdGFrZSBwbGFjZSwgYW5kIG5vIHJlbGF0ZWQgY21yLWZpZWxkIG9uIHRoZSBlbnRpdHkgYmVhbiBpbnN0YW5jZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlCi0JCS8vIHJlbGF0aW9uc2hpcC4gVW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBhcmUgdHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgQmVhbiBQcm92aWRlciB3aXNoZXMgdG8gcmVzdHJpY3QKLQkJLy8gdGhlIHZpc2liaWxpdHkgb2YgYSByZWxhdGlvbnNoaXAuCi0JCUVudGl0eSBzb3VyY2VFbnRpdHkgPSByb2xlLmdldFNvdXJjZSgpLmdldEVudGl0eUJlYW4oKTsKLQkJaWYoc291cmNlRW50aXR5ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIXNvdXJjZUVudGl0eS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlDTVJGaWVsZCBzb3VyY2VDTVJGaWVsZCA9IHJvbGUuZ2V0Q21yRmllbGQoKTsKLQkJaWYoc291cmNlQ01SRmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlFSkJSZWxhdGlvbnNoaXBSb2xlIG9wcG9zaXRlID0gcm9sZS5nZXRPcHBvc2l0ZSgpOwotCQlpZihvcHBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUNNUkZpZWxkIG9wcG9zaXRlQ01SRmllbGQgPSBvcHBvc2l0ZS5nZXRDbXJGaWVsZCgpOwotCQlpZihvcHBvc2l0ZUNNUkZpZWxkICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JCQotCX0KLQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNVbmtub3duUHJpbWFyeUtleShDTVBBdHRyaWJ1dGUgYXR0cmliKSB7Ci0JCWlmKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIFNlY3Rpb24gMTAuOC4zCi0JCS8vIEJ5IGRlZmluaXRpb24sIHRoZSBkZXBsb3llcidzIGdlbmVyYXRlZCBDTVAgZmllbGQncyBuYW1lIGlzIGRlZmluZWQgaW4gdGhlIAotCQkvLyBDb250YWluZXJNYW5hZ2VkRW50aXR5LldBU19HRU5FUkFURURfU1RSSU5HX0ZJRUxEIGNvbnN0YW50LgotCQlyZXR1cm4gQ29udGFpbmVyTWFuYWdlZEVudGl0eS5XQVNfR0VORVJBVEVEX1NUUklOR19GSUVMRC5lcXVhbHMoYXR0cmliLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ByaW1pdGl2ZVByaW1hcnlLZXkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYoY21wID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlpZigoY21wLmdldFByaW1LZXlGaWVsZCgpICE9IG51bGwpICYmICFjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZUlzUHJveHkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaWMoRmllbGQgZmllbGQpIHsKLQkJaWYgKCBmaWVsZCA9PSBudWxsICkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCA9PSBmaWVsZC5nZXRKYXZhVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaWMoIE1ldGhvZCBtZXRob2QgKSB7Ci0JCWlmICggbWV0aG9kID09IG51bGwgKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMID09IG1ldGhvZC5nZXRKYXZhVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gQ2xhc3MgdHlwZSBpcyBzZXJpYWxpemFibGUuCi0JICoKLQkgKiBSTUkgMS4zIHNwZWNpZmljYXRpb24KLQkgKiAyLjYgUGFyYW1ldGVyIFBhc3NpbmcgaW4gUmVtb3RlIE1ldGhvZCBJbnZvY2F0aW9uCi0JICogQW4gYXJndW1lbnQgdG8sIG9yIGEgcmV0dXJuIHZhbHVlIGZyb20sIGEgcmVtb3RlIG9iamVjdCBjYW4gYmUgYW55IG9iamVjdCB0aGF0Ci0JICogaXMgc2VyaWFsaXphYmxlLiBUaGlzIGluY2x1ZGVzIHByaW1pdGl2ZSB0eXBlcywgcmVtb3RlIG9iamVjdHMsIGFuZCBub24tcmVtb3RlCi0JICogb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgamF2YS5pby5TZXJpYWxpemFibGUgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1NlcmlhbGl6YWJsZShKYXZhSGVscGVycyBjbCwgRW50ZXJwcmlzZUJlYW4gYmVhbikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKGNsID09IG51bGwpIHsKLQkJCS8vIGFzc3VtZSBpdCdzIHZvaWQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCi0JCS8vIENoZWNrIGlmIHRoZSB0eXBlIHJlZmxlY3RlZCBwcm9wZXJseQotCQlpc1ZhbGlkVHlwZShjbCk7Ci0JCQotCQlpZiAoIGNsLmlzUHJpbWl0aXZlKCkgKSB7Ci0JCQkvLyBKYXZhSGVscGVycyBpcyBhIEphdmFEYXRhVHlwZQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZihjbC5pc0FycmF5KCkpIHsKLQkJCUFycmF5VHlwZSBhcnJheSA9IChBcnJheVR5cGUpY2w7Ci0JCQlpZihhcnJheS5pc1ByaW1pdGl2ZUFycmF5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCS8vIGVsc2UsIG5vdCBwcmltaXRpdmUsIHNvIGNoZWNrIGl0cyBjb250ZW50cwotCQkJY2wgPSBhcnJheS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQotCQlKYXZhSGVscGVycyByZW1vdGUgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1JNSV9SRU1PVEUsIGJlYW4pOwotCQlpZihpc0Fzc2lnbmFibGVGcm9tKGNsLCByZW1vdGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSmF2YUhlbHBlcnMgc2VyaWFsID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9JT19TRVJJQUxJWkFCTEUsIGJlYW4pOwotCQlyZXR1cm4gaXNBc3NpZ25hYmxlRnJvbShjbCwgc2VyaWFsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU3RhdGVmdWwoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJcmV0dXJuICgoKFNlc3Npb24pYmVhbikuZ2V0U2Vzc2lvblR5cGUoKS5nZXRWYWx1ZSgpID09IFNlc3Npb25UeXBlLlNUQVRFRlVMKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU3RhdGVsZXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCXJldHVybiAoKChTZXNzaW9uKWJlYW4pLmdldFNlc3Npb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBTZXNzaW9uVHlwZS5TVEFURUxFU1MpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5uYW1lZFBhY2thZ2UoSmF2YVBhY2thZ2UgcGtnKSB7Ci0JCWlmKHBrZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJU3RyaW5nIHBrZ05hbWUgPSBwa2cuZ2V0TmFtZSgpOwotCQlyZXR1cm4gKChwa2dOYW1lID09IG51bGwpIHx8IChwa2dOYW1lLmVxdWFscygiIikpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZEphdmFJZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7Ci0JCWlmKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQljaGFyW10gbmFtZUNoYXIgPSBuYW1lLnRvQ2hhckFycmF5KCk7Ci0JCWlmKG5hbWVDaGFyLmxlbmd0aCA8IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQobmFtZUNoYXJbMF0pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYm9vbGVhbiBpc1ZhbGlkSmF2YUlkZW50aWZpZXIgPSB0cnVlOwotCQlmb3IoaW50IGk9MTsgaTxuYW1lQ2hhci5sZW5ndGg7IGkrKykgewotCQkJaWYoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChuYW1lQ2hhcltpXSkpIHsKLQkJCQlpc1ZhbGlkSmF2YUlkZW50aWZpZXIgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNWYWxpZEphdmFJZGVudGlmaWVyOwotCX0KLQkKLQkvKioKLQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkgKi4uLgotCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkgKi4uLgotCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCSAqIGtub3dzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCBhbmQgaXQga25vd3MgdGhlIG91dGNvbWUgb2YgdGhlIAotCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkU2Vzc2lvblR5cGVFbGVtZW50KFNlc3Npb24gc2Vzc2lvbikgewotCQlpZihzZXNzaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gY2hlY2sgc3ludGF4Ci0JCWlmKCFzZXNzaW9uLmlzU2V0U2Vzc2lvblR5cGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihzZXNzaW9uLmdldFNlc3Npb25UeXBlKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihzZXNzaW9uLmdldFNlc3Npb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBTZXNzaW9uVHlwZS5TVEFURUZVTCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmKHNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKS5nZXRWYWx1ZSgpID09IFNlc3Npb25UeXBlLlNUQVRFTEVTUykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZFRyYW5zYWN0aW9uVHlwZUVsZW1lbnQoU2Vzc2lvbiBzZXNzaW9uQmVhbikgewotCQlpZihzZXNzaW9uQmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKCFzZXNzaW9uQmVhbi5pc1NldFRyYW5zYWN0aW9uVHlwZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKHNlc3Npb25CZWFuLmdldFRyYW5zYWN0aW9uVHlwZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoc2Vzc2lvbkJlYW4uZ2V0VHJhbnNhY3Rpb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBUcmFuc2FjdGlvblR5cGUuQkVBTikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmKHNlc3Npb25CZWFuLmdldFRyYW5zYWN0aW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gVHJhbnNhY3Rpb25UeXBlLkNPTlRBSU5FUikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkKLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHR5cGUgaXMgbm90IHJlZmxlY3RlZCBwcm9wZXJseSwgdGhyb3cgYW4gSW52YWxpZElucHV0RXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBpc1ZhbGlkVHlwZShKYXZhSGVscGVycyB0eXBlKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYodHlwZSA9PSBudWxsKSB7Ci0JCQkvLyBDaGVhdGluZyBoZXJlLiBTaG91bGQgdGVjaG5pY2FsbHkgYWNjZXNzIHRoZSBNc2dMb2dnZXIgZnJvbSB0aGUgSUVKQlZhbGlkYXRpb25Db250ZXh0Ci0JCQkvLyB0eXBlLCBidXQgd2hlbiBJIHN0YXJ0ZWQgY2hhbmdpbmcgdGhpcyBtZXRob2QgYW5kIHRoZSBpc1ZhbGlkVHlwZUhpZXJhcmNoeSBtZXRob2QsCi0JCQkvLyBJIGVuZGVkIHVwIGNoYW5naW5nIDQyIGZpbGVzIGJlY2F1c2UgdGhlc2UgdHdvIG1ldGhvZHMgYXJlIGNhbGxlZCBkaXJlY3RseSBvcgotCQkJLy8gaW5kaXJlY3RseSBmcm9tIGFsbW9zdCBldmVyeXdoZXJlLiBUaGF0IHdhcyB0b28gbXVjaCBjaGFuZ2UsIHNvIEkgY2hlYXRlZC4KLQkJCUxvZ2dlciBhTG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgidHlwZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5hcHBlbmRTdGFja1RyYWNlKCk7Ci0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQotCQlpZih0eXBlLmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgdHlwZSByZWZsZWN0ZWQgcHJvcGVybHkuIElmIHRoZXJlJ3MgYW55IGNvbXBpbGUgZXJyb3JzLCBvciByZWZlcmVuY2VzIHRvIHVucmVzb2x2ZWQKLQkJCS8vIGNsYXNzZXMsIGNhbiBvdXRwdXQgc29tZSBtaXN0YWtlbiBlcnJvciBtZXNzYWdlcy4KLQkJCS8vIGUuZy4gY2xhc3MgaXMgbm90IHNlcmlhbGl6YWJsZQotCQkJSmF2YUNsYXNzIHdyYXBwZXIgPSB0eXBlLmdldFdyYXBwZXIoKTsKLQkJCWlmKHR5cGUuaXNBcnJheSgpKSB7Ci0JCQkJQXJyYXlUeXBlIGFycmF5ID0gKEFycmF5VHlwZSl0eXBlOwotCQkJCWlzVmFsaWRUeXBlKGFycmF5LmdldEZpbmFsQ29tcG9uZW50VHlwZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKCF3cmFwcGVyLmlzRXhpc3RpbmdUeXBlKCkpIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldFRleHQoIiF3cmFwcGVyLmlzRXhpc3RpbmdUeXBlKCk7IHR5cGUgaXMgIiArIHdyYXBwZXIuZ2V0SmF2YU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCQl9Ci0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24od3JhcHBlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSB0eXBlIGlzIG5vdCByZWZsZWN0ZWQgcHJvcGVybHksIHRocm93IGFuIEludmFsaWRJbnB1dEV4Y2VwdGlvbi4KLQkgKiBUaGlzIG1ldGhvZCwgdW5saWtlIGlzVmFsaWRUeXBlLCBhbHNvIGNoZWNrcyBldmVyeSBpbnRlcmZhY2UgYW5kIGNsYXNzCi0JICogcGFyZW50IG9mIHRoZSBwYXNzZWQtaW4gdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgaXNWYWxpZFR5cGVIaWVyYXJjaHkoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUhlbHBlcnMgdHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKHR5cGUgPT0gbnVsbCkgewotCQkJLy8gQ2hlYXRpbmcgaGVyZS4gU2hvdWxkIHRlY2huaWNhbGx5IGFjY2VzcyB0aGUgTXNnTG9nZ2VyIGZyb20gdGhlIElFSkJWYWxpZGF0aW9uQ29udGV4dAotCQkJLy8gdHlwZSwgYnV0IHdoZW4gSSBzdGFydGVkIGNoYW5naW5nIHRoaXMgbWV0aG9kIGFuZCB0aGUgaXNWYWxpZFR5cGUgbWV0aG9kLAotCQkJLy8gSSBlbmRlZCB1cCBjaGFuZ2luZyA0MiBmaWxlcyBiZWNhdXNlIHRoZXNlIHR3byBtZXRob2RzIGFyZSBjYWxsZWQgZGlyZWN0bHkgb3IKLQkJCS8vIGluZGlyZWN0bHkgZnJvbSBhbG1vc3QgZXZlcnl3aGVyZS4gVGhhdCB3YXMgdG9vIG11Y2ggY2hhbmdlLCBzbyBJIGNoZWF0ZWQuCi0JCQlMb2dnZXIgYUxvZ2dlciA9IGdldE1zZ0xvZ2dlcigpOwotCQkJaWYoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBnZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoInR5cGUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuYXBwZW5kU3RhY2tUcmFjZSgpOwotCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQkKLQkJLy8gRmlyc3QsIGNoZWNrIHRoaXMgaGVscGVyIGl0c2VsZi4KLQkJaXNWYWxpZFR5cGUodHlwZSk7Ci0JCUphdmFIZWxwZXJzIGphdmFMYW5nT2JqZWN0ID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgYmVhbik7Ci0JCWlmKGlzU2FtZVR5cGUodHlwZSwgamF2YUxhbmdPYmplY3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIElmIHRoaXMgaGVscGVyIGV4aXN0cywgYW5kIGlzIG5vdCBqYXZhLmxhbmcuT2JqZWN0LCB0aGVuIGNoZWNrIGV2ZXJ5IHN1cGVydHlwZS4KLQkJSmF2YUNsYXNzIGNsYXNzVHlwZSA9IHR5cGUuZ2V0V3JhcHBlcigpOwotCQlpZihjbGFzc1R5cGUgPT0gbnVsbCkgewotCQkJTG9nZ2VyIGFMb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJ0eXBlLmdldFdyYXBwZXIoKSByZXR1cm5zIG51bGw7IHR5cGUgaXMgIiArIHR5cGUuZ2V0SmF2YU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJfQotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOwotCQl9Ci0JCi0JCS8vIENoZWNrIHRoZSBzdXBlcmNsYXNzLiBTaW5jZSB0eXBlIGlzIG5vdCBqYXZhLmxhbmcuT2JqZWN0LCB0aGVyZSBpcyBhdCBsZWFzdAotCQkvLyB0aGUgamF2YS5sYW5nLk9iamVjdCBzdXBlcmNsYXNzLgotCQlpZighY2xhc3NUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLQkJCUphdmFDbGFzcyBzdXBlclR5cGUgPSBjbGFzc1R5cGUuZ2V0U3VwZXJ0eXBlKCk7Ci0JCQlpc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBzdXBlclR5cGUpOwotCQl9Ci0JCi0JCS8vIENoZWNrIHRoZSBzdXBlcmludGVyZmFjZXMsIGlmIHRoZXkgZXhpc3QuCi0JCUxpc3Qgc3VwZXJJbnRlcmZhY2VzID0gY2xhc3NUeXBlLmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCWlmKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHN1cGVySW50ZXJmYWNlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIHN1cGVySW50ZiA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCWlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHN1cGVySW50Zik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUk1JIDEuMyBwYWdlIDYgc2VjdGlvbiAyLjQuMSwgCi0JICogICAgQSByZW1vdGUgbWV0aG9kIGRlY2xhcmF0aW9uIG11c3QgaW5jbHVkZSB0aGUgZXhjZXB0aW9uIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAob3Igb25lCi0JICogICAgb2YgaXRzIHVwc2VyY2xhc3NlcyBzdWNoIGFzIGphdmEuaW8uSU9FeGNlcHRpb24gb3IgamF2YS5sYW5nLkV4Y2VwdGlvbikgaW4gaXRzIHRocm93cwotCSAqICAgIGNsYXVzZSwgaW4gYWRkaXRpb24gdG8gYW55IGFwcGxpY2F0aW9uLXNwZWNpZmljIGV4Y2VwdGlvbnMgKG5vdGUgdGhhdCBhcHBsaWNhdGlvbiAKLQkgKiAgICBzcGVjaWZpYyBleGNlcHRpb25zIGRvIG5vdCBoYXZlIHRvIGV4dGVuZCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NSZW1vdGVFeGNlcHRpb25PclBhcmVudChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRocm93c0V4Y2VwdGlvbk9yUGFyZW50KGJlYW4sIG1ldGhvZCwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URUVYQ0VQVElPTik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGNoZWNrcyBpZiBSZW1vdGVFeGNlcHRpb24gKGV4YWN0bHksIG5vdCBFeGNlcHRpb24gb3IgSU9FeGNlcHRpb24pCi0JICogaXMgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkb2VzTm90VGhyb3dSZW1vdGVFeGNlcHRpb24oRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAhdGhyb3dzRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URUVYQ0VQVElPTik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRocm93c0V4Y2VwdGlvbihiZWFuLCBtZXRob2QsIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfT0JKRUNUTk9URk9VTkRFWENFUFRJT04pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzRmluZGVyRXhjZXB0aW9uKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhyb3dzRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9GSU5ERVJFWENFUFRJT04pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzQ3JlYXRlRXhjZXB0aW9uKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhyb3dzRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9DUkVBVEVFWENFUFRJT04pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzQXBwbGljYXRpb25FeGNlcHRpb24oTWV0aG9kIG1ldGhvZCwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlMaXN0IGV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJaWYoZXhjZXB0aW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBDSEtKMjQxOSA9IHswfSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgamF2YS5sYW5nLkV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDE4LjEuMSwgMTguMi4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJaWYoaXNBcHBsaWNhdGlvbkV4Y2VwdGlvbihleGNlcHRpb24sIGJlYW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2QgdGhyb3dzIHRoZSBuYW1lZCBleGNlcHRpb24gb3IgYSBjbGFzcyB3aGljaCBleHRlbmRzIHRoZSBuYW1lZCBleGNlcHRpb24uCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NFeGNlcHRpb24oRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGV4Y2VwdGlvbk5hbWUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlMaXN0IGV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCUphdmFDbGFzcyBleGNlcHRpb24gPSBnZXRUeXBlKGV4Y2VwdGlvbk5hbWUsIGJlYW4pLmdldFdyYXBwZXIoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihpc0Fzc2lnbmFibGVGcm9tKGV4YywgZXhjZXB0aW9uKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lZCBleGNlcHRpb24sIGFuIGV4Y2VwdGlvbiB3aGljaCBleHRlbmRzIHRoZSBuYW1lZCBleGNlcHRpb24sIG9yIG9uZSBvZiB0aGUgcGFyZW50cyBvZiB0aGUgbmFtZWQgZXhjZXB0aW9uIChlLmcuIGphdmEubGFuZy5FeGNlcHRpb24pLgotCSAqIFVzZSB0aGlzIG1ldGhvZCBpZiBpdCBuZWVkcyB0byBiZSBkZXRlY3RlZCB0aGF0IGFuIGV4Y2VwdGlvbiBjYW4gYmUgdGhyb3duIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIHNvbWV0aGluZyBnZW5lcmljIGxpa2UgamF2YS5sYW5nLkV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzRXhjZXB0aW9uT3JQYXJlbnQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGV4Y2VwdGlvbk5hbWUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gZ2V0VHlwZShleGNlcHRpb25OYW1lLCBiZWFuKS5nZXRXcmFwcGVyKCk7Ci0KLQkJTGlzdCBleGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oZXhjLCBleGNlcHRpb24pKSB7Ci0JCQkJLy8gQXNzaWduYWJsZSBmcm9tIHRoZSBuYW1lZCBleGNlcHRpb24sIGUuZy4gUmVtb3RlRXhjZXB0aW9uIG9yIGEgY2hpbGQgb2YgUmVtb3RlRXhjZXB0aW9uCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oZXhjZXB0aW9uLCBleGMpKSB7Ci0JCQkJLy8gVGhlIG5hbWVkIGV4Y2VwdGlvbiBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIG1ldGhvZCBleGNlcHRpb24sIGUuZy4gamF2YS5sYW5nLkV4Y2VwdGlvbgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VzQ29sbGVjdGlvbkNsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYoKGJlYW4gPT0gbnVsbCkgfHwgKG1ldGhvZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlKYXZhUGFyYW1ldGVyW10gcGFybXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCWlmKHBhcm1zICE9IG51bGwpIHsKLQkJCWZvcihpbnQgaT0wOyBpPHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSmF2YVBhcmFtZXRlciBwYXJtID0gcGFybXNbaV07Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoaXNBc3NpZ25hYmxlRnJvbUNvbGxlY3Rpb24ocGFybS5nZXRKYXZhVHlwZSgpLCBiZWFuKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlIGFuZCB0ZXN0IG5leHQgcGFybQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIE5vdyBjaGVjayB0aGUgcmV0dXJuIHR5cGUKLQkJdHJ5IHsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb21Db2xsZWN0aW9uKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGJlYW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VzTG9jYWxUeXBlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmKChiZWFuID09IG51bGwpIHx8IChtZXRob2QgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlpZihwYXJtcyAhPSBudWxsKSB7Ci0JCQlmb3IoaW50IGk9MDsgaTxwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IHBhcm1zW2ldOwotCQkJCWlmKGlzTG9jYWxUeXBlKGJlYW4sIHBhcm0uZ2V0SmF2YVR5cGUoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gTm93IGNoZWNrIHRoZSByZXR1cm4gdHlwZQotCQlpZihpc0xvY2FsVHlwZShiZWFuLCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSTWVzc2FnZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dBUk1lc3NhZ2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyYzAwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSTWVzc2FnZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi0KLS8qKgotICogTWVzc2FnZSBrZXkgY29uc3RhbnRzIGZvciBXQVIgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBXQVJNZXNzYWdlQ29uc3RhbnRzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5KMkVFTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX1ZBTElEQVRPUl9JRCA9ICJXQVJfVkFMSURBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9NT0RFTF9OQU1FID0gIldBUl9WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRCA9ICJFUlJPUl9XQVJfVkFMSURBVElPTl9GQUlMRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TTUFMTF9JQ09OID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU01BTExfSUNPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0xBUkdFX0lDT04gPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9MQVJHRV9JQ09OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX1NFUlZMRVRfTUFQUElORyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX0pTUCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfSlNQIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19UTEQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1RMRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0VMQ09NRV9GSUxFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XRUxDT01FX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVVJMIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9NQVBQSU5HID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX01BUFBJTkciIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX1NFUlZMRVQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfU0VSVkxFVCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FSkJfUkVGIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlkgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlkiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlkgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRSIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUUiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSFRUUF9DTUQiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9UUkFOU1BPUlQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1RSQU5TUE9SVCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0pTUEZJTEVfUkVGID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRiIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1dFTENPTUVfRklMRSA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0UgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0UiIDsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfQVVUSF9NRVRIT0QgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0FVVEhfTUVUSE9EIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JR05PUkVfRk9STV9MT0dJTiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lHTk9SRV9GT1JNX0xPR0lOIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIyIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIzIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIyID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMiIgOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjMiIDsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9GSUxURVIgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRklMVEVSIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkcgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkciIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVMgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfVU5DT05UQUlORURfTU9EVUxFX0ZJTEVfRVhDRVBUSU9OID0gIkVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSU5WQUxJRF9XQVJfRklMRSA9ICJFUlJPUl9JTlZBTElEX1dBUl9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9QQVJTRV9MSU5FQ09MID0gIldBUl9ERF9QQVJTRV9MSU5FQ09MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9QQVJTRV9MSU5FID0gIldBUl9ERF9QQVJTRV9MSU5FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9DQU5OT1RfT1BFTl9ERCA9ICJXQVJfRERfQ0FOTk9UX09QRU5fREQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0REX1BBUlNFX05PSU5GTyA9ICJXQVJfRERfUEFSU0VfTk9JTkZPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9JTlZBTElEX0NPTlRFWFRfUk9PVCA9ICJFUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1JFU19TSEFSSU5HX1NDT1BFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9SRVNfU0hBUklOR19TQ09QRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRU5WX0VOVFJZID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FTlZfRU5UUlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX0NPREUJID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9DT0RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XTFBfUFJPSkVDVCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0xQX1BST0pFQ1QiOyAvLyROT04tTkxTLTEkCQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVhDRVBUSU9OX1RZUEUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VYQ0VQVElPTl9UWVBFIjsgLy8kTk9OLU5MUy0xJAkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9DT05GTElDVElOR19XTFBfUFJPSkVDVCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0NPTkZMSUNUSU5HX1dMUF9QUk9KRUNUIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FSkJfUkVGX1RZUEUiOyAgLy8kTk9OLU5MUy0xJAotCS8vSjJFRSAxNCBNZXNzYWdlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOID0gIk1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCQotCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjdlMWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIndhcnZhbGlkYXRpb24iKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzLCBpbnQgeCkgewotCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV2FyVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV2FyVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTRhMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dhclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRUpCTG9jYWxSZWZJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVHJhbnNwb3J0R3VhcmFudGVlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4ubmxzLlJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFdhclZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIFdBUk1lc3NhZ2VDb25zdGFudHMgewotICBwcm90ZWN0ZWQgV0FSRmlsZSB3YXJGaWxlOwotICBwcm90ZWN0ZWQgV2ViQXBwIHdlYkREOwotICBwcml2YXRlICAgSGFzaHRhYmxlIGh0dHBNZXRob2RzID0gbnVsbCA7Ci0KLSAgLy8gT3B0aW9uYWwgY2hpbGQgdmFsaWRhdG9ycwotICAvL3Byb3RlY3RlZCBXZWJFeHRWYWxpZGF0b3Igd2ViRXh0VmFsaWRhdG9yOwotICAvL3Byb3RlY3RlZCBXZWJCbmRWYWxpZGF0b3Igd2ViQm5kVmFsaWRhdG9yOwotCi0KLQkvKioKLQkgKiBSZWxhdGlvbnNoaXBNYXBWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV2FyVmFsaWRhdG9yKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotLyoqCi0gKiBXaWxsIGNvbnN0cnVjdCBhIEhhc2hUYWJsZSBvZiByb2xlcywgYW5kIGNoZWNrIGZvciBkdXBsaWNhdGVzIAotICogYW5kIG51bGwgZW50cmllcwotICogQHJldHVybiBqYXZhLnV0aWwuSGFzaHRhYmxlCi0gKiBAcGFyYW0gcm9sZXMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ci0gKi8KLXB1YmxpYyBIYXNodGFibGUgZ2V0QW5kVmFsaWRhdGVTZWN1cml0eVJvbGVzKEVMaXN0IHJvbGVzKSB7Ci0KLQlIYXNodGFibGUgc2VjUm9sZXMgPSBuZXcgSGFzaHRhYmxlKCkgOwotCWlmIChyb2xlcy5pc0VtcHR5KCkpIHJldHVybiAoc2VjUm9sZXMpIDsKLQotCUl0ZXJhdG9yIHNSb2xlcyAgPSByb2xlcy5pdGVyYXRvcigpIDsKLQkKLQl3aGlsZSAoc1JvbGVzLmhhc05leHQoKSkgewotCSAgU2VjdXJpdHlSb2xlIHJvbGUgPSAoU2VjdXJpdHlSb2xlKSBzUm9sZXMubmV4dCgpIDsKLQkJCi0KLQkgIFN0cmluZyBuYW1lID0gcm9sZS5nZXRSb2xlTmFtZSgpIDsKLQkgIGlmIChuYW1lICE9IG51bGwpCi0JCQkgbmFtZSA9IG5hbWUudHJpbSgpIDsKLQkgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJICBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCSAgcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib2ZfVHlwZV9TZWN1cml0eV9Sb2xlX05hbWVfNiIpIDsgLy8kTk9OLU5MUy0xJAotCQkgIGFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMscm9sZSk7Ci0JCSAgY29udGludWUgOyAgICAgICAgICAKLQkgIH0KLQkgIGlmIChzZWNSb2xlcy5nZXQobmFtZSkhPW51bGwpIHsgICAvLyBDaGVjayBmb3IgZHVwcwotCi0JCSAgU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkgIHBhcm1zWzBdID0gbmFtZSA7Ci0JCSAgYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcyxyb2xlKTsKLQkJICBjb250aW51ZSA7Ci0JICB9Ci0JICBzZWNSb2xlcy5wdXQobmFtZSwiWWVhIikgOyAgICAgIC8vJE5PTi1OTFMtMSQKLQl9IAotCQotCQotCXJldHVybiBzZWNSb2xlczsKLX0KLS8qKgotICogPHA+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+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPmNvbS5pYm0uZXRvb2xzLmN0Yy5qYXZhcHJvamVjdG5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiNGZmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFdUUCBKQ0EgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnBsdWdpbi5KQ0FVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogLiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWksCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3Iud29ya2JlbmNoCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3Byb3BlcnR5X2ZpbGVzL2pjYV91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWFlNDEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3Byb3BlcnR5X2ZpbGVzL2pjYV91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotMD1GYWlsZWQgdG8gZmluZCB0aGUgaW1hZ2UgInswfSIuCi0xPU5ldyBDb25uZWN0b3IgUHJvamVjdAotMj1KMkMgdmVyc2lvbjoKLTM9Q29ubmVjdG9yIFByb2plY3QKLTQ9Q3JlYXRlIGEgc3RhbmRhbG9uZSBDb25uZWN0b3IgbW9kdWxlIG9yIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuCi01PUltcG9ydCBhIENvbm5lY3RvciBtb2R1bGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KLTY9Q29ubmVjdG9yIEltcG9ydAotNz1Db25uZWN0b3IgZmlsZToKLTg9Q29ubmVjdG9yIG1vZHVsZToKLTk9Q29ubmVjdG9yIEV4cG9ydAotMTA9RXhwb3J0IENvbm5lY3RvciBtb2R1bGUgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotY29ubmVjdG9yLmV4cG9ydC5hY3Rpb24ubGFiZWxfdWlfPUV4cG9ydCBSQVIgRmlsZS4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmNkdHByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2R0cHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzODhiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2R0cHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlLWNkdCB2ZXJzaW9uPSIyLjAiPz4NCi0NCi08Y2R0cHJvamVjdD4NCi08ZGF0YT4NCi08aXRlbSBpZD0iY2R0X2luZGV4ZXIiPg0KLTxpbmRleEVuYWJsZWQgaW5kZXhWYWx1ZT0idHJ1ZSIvPg0KLTwvaXRlbT4NCi08L2RhdGE+DQotPC9jZHRwcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjRkYzVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImoyZWUtbmF2aWdhdG9yLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjYTRhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWoyZWUtbmF2aWdhdG9yLmphcgotQGRvdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1NmQxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYzNjM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLkoyRUVOYXZpZ2F0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQbHVnaW4ucHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC53b3JraW5nc2V0cwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci52aWV3cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdCwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuamR0LnVpLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5qYXZhLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkMGI3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGNvbS5pYm0ud3RwLmoyZWUudWkubmF2aWdhdG9yLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gY29tLmlibS53dHAuajJlZS51aS5uYXZpZ2F0b3IvCi1zb3VyY2UuLiA9IGoyZWUtbmF2aWdhdG9yLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvSjJFRVBlcnNwZWN0aXZlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL0oyRUVQZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NTY1NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvSjJFRVBlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY4NDI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvY29ubmVjdG9yZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzYWYzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Vhcmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWIzZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9lamJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGFkYjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYjI2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjgzMzAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTY2N2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzBiMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2Q0MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmYjNkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDg1OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTkyMDFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWpiamFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWpiamFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NGI0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2VqYmphci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjI1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjMDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlODZhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlYzZiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQwOWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkYTIyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpicHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWM2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhY2Q0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF9kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2NsaWVudF9hcHBfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYxY2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTc3YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZWpiX21vZHVsZV9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNTBkNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VudGVycHJpc2VfYXBwX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VudGVycHJpc2VfYXBwX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMTljNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlOTYxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDdmYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0b3Jfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzFmOGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZTc2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnByb2plY3Rfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyYWExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYXBwY2xpZW50X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTUzOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2Vhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzI3ZmE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lamJqYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lamJqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjYTc5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfcmFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfcmFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDdmMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUxMjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9hcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxYTMxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzU0ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTIzNTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5ZGZmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfcmFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDI3NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2NGUyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2pjdV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvamN1X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTczYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvamN1X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zZXJ2bGV0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NlcnZsZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFiZWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NlcnZsZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2Vzc2lvbkJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2I4YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2Vzc2lvbkJlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkY2IzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zcnZjZV9lbGVtX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0ZDM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2Vic2VydmljZWRlc2MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2Vic2VydmljZWRlc2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dzZGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODFhODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRU1GTW9kZWxNYW5hZ2VyIHsKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXI7Ci0JcHVibGljIGFic3RyYWN0IE9iamVjdFtdIGdldE1vZGVscygpOwotCXB1YmxpYyBmaW5hbCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JcHVibGljIGZpbmFsIEVNRlJvb3RPYmplY3RQcm92aWRlciBnZXRFTUZSb290T2JqZWN0UHJvdmlkZXIoKXsKLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQlwdWJsaWMgRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgYVByb3ZpZGVyKSB7Ci0JCXByb2plY3QgPSBhUHJvamVjdDsKLQkJcHJvdmlkZXIgPSBhUHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhZmZlY3RlZFByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0KSB7Ci0JCXByb3ZpZGVyLm5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwb3NlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwM2ZmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBFTUZNb2RlbE1hbmFnZXIgY3JlYXRlRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IHByb2plY3QsIEVNRlJvb3RPYmplY3RQcm92aWRlciBwcm92aWRlcikgewotCQlib29sZWFuIGZsZXhpYmxlID0gIChNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCkgIT0gbnVsbCk7Ci0JCUVNRk1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCQlpZiAoZmxleGlibGUpCi0JCQltb2RlbE1hbmFnZXIgPSBuZXcgRmxleGlibGVFTUZNb2RlbE1hbmFnZXIocHJvamVjdCxwcm92aWRlcik7Ci0JCWVsc2UKLQkJCW1vZGVsTWFuYWdlciA9IG5ldyBOb25GbGV4aWJsZUVNRk1vZGVsTWFuYWdlcihwcm9qZWN0LHByb3ZpZGVyKTsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZSb290T2JqZWN0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjI1OGJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZSb290T2JqZWN0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRU1GUm9vdE9iamVjdE1hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLQotCi0JcHJpdmF0ZSBmaW5hbCBNYXAgcHJvamVjdEVkaXRNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgZmluYWwgTWFwIHByb2plY3RSb290T2JqZWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciB7Ci0JCXZvaWQgb25SZWZyZXNoKE9iamVjdCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVNRlJvb3RPYmplY3RNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHByb2plY3RFZGl0TW9kZWxzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLQkJT2JqZWN0W10ga2V5cyA9IHByb2plY3RFZGl0TW9kZWxzLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBwcm9qZWN0RWRpdE1vZGVscy5yZW1vdmUoa2V5c1tpXSk7Ci0JCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJvb3RPYmplY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJT2JqZWN0IHJvb3RPYmplY3QgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHByb2plY3RSb290T2JqZWN0cykgewotCQkJcm9vdE9iamVjdCA9IHByb2plY3RSb290T2JqZWN0cy5nZXQocHJvamVjdCk7Ci0KLQkJCWlmIChyb290T2JqZWN0ID09IG51bGwgfHwgKChFT2JqZWN0KSByb290T2JqZWN0KS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEVkaXRNb2RlbEZvclByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXJvb3RPYmplY3QgPSBlZGl0TW9kZWwuZ2V0UHJpbWFyeVJvb3RPYmplY3QoKTsKLQkJCQkJcHJvamVjdFJvb3RPYmplY3RzLnB1dChwcm9qZWN0LCByb290T2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RPYmplY3Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHByb2plY3RFZGl0TW9kZWxzKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBwcm9qZWN0RWRpdE1vZGVscy5nZXQocHJvamVjdCk7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAoZWRpdE1vZGVsID09IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlhcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGFydGlmYWN0RWRpdC5nZXRBZGFwdGVyKEVkaXRNb2RlbC5jbGFzcyk7Ci0JCQkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQllZGl0TW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCQkJYWRkTWFwcGluZyhwcm9qZWN0LCBlZGl0TW9kZWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0IT1udWxsKQotCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZyhJUHJvamVjdCBwcm9qZWN0LCBFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCXByb2plY3RFZGl0TW9kZWxzLnB1dChwcm9qZWN0LCBlZGl0TW9kZWwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXIjZWRpdE1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gYW5FdmVudC5nZXRFZGl0TW9kZWwoKS5nZXRQcm9qZWN0KCk7Ci0JCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSA6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiB7Ci0JCQkJT2JqZWN0IG9sZFJvb3RPYmplY3QgPSBwcm9qZWN0Um9vdE9iamVjdHMucmVtb3ZlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJaWYgKG9sZFJvb3RPYmplY3QgIT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlNBVkUgOiB7Ci0JCQkJT2JqZWN0IG9sZFJvb3RPYmplY3QgPSBwcm9qZWN0Um9vdE9iamVjdHMuZ2V0KGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJaWYgKG9sZFJvb3RPYmplY3QgPT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFIDoKLQkJCQlkaXNwb3NlQ2FjaGUoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgbGlzdGVuZXJzLnNpemUoKTsgKyt4KSB7Ci0JCQlJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciByZWZyZXNoSGFuZGxlciA9IChJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcikgbGlzdGVuZXJzLmdldCh4KTsKLQkJCXJlZnJlc2hIYW5kbGVyLm9uUmVmcmVzaChhUHJvamVjdCk7Ci0JCX0KLQotCX0KLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCi0JCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbHRhLmFjY2VwdChFTUZSb290T2JqZWN0TWFuYWdlci50aGlzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBzd3RlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHN3dGUpOwotCQkJfSBjYXRjaCAoU1dURXJyb3Igc3d0ZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihzd3RlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJYm9vbGVhbiBwcm9qZWN0T3BlblN0YXRlQ2hhbmdlZCA9ICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApOwotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwgcHJvamVjdE9wZW5TdGF0ZUNoYW5nZWQpCi0JCQkJCQlkaXNwb3NlQ2FjaGUoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlQ2FjaGUoSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0KSB7Ci0JCXN5bmNocm9uaXplZCAocHJvamVjdEVkaXRNb2RlbHMpIHsKLQkJCXByb2plY3RSb290T2JqZWN0cy5yZW1vdmUoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSRU1PVklORyBlZGl0IG1vZGVsOiAiICsgYWZmZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcHJvamVjdEVkaXRNb2RlbHMucmVtb3ZlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUkVNT1ZFRCBlZGl0IG1vZGVsICIgKyBhZmZlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJCWVkaXRNb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUkVMRUFTRUQgZWRpdCBtb2RlbCAiICsgYWZmZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGdldExpc3RlbmVycygpKSB7Ci0JCQlpZiAoYUxpc3RlbmVyICE9IG51bGwgJiYgIWdldExpc3RlbmVycygpLmNvbnRhaW5zKGFMaXN0ZW5lcikpCi0JCQkJZ2V0TGlzdGVuZXJzKCkuYWRkKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJbGlzdGVuZXJzLnJlbW92ZShhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6NDI6NTggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzk3NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVNRlJvb3RPYmplY3RQcm92aWRlciBpbXBsZW1lbnRzICBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yewotCXByaXZhdGUgZmluYWwgSGFzaE1hcCBlbWZNb2RlbENhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGZpbmFsIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgewotCQl2b2lkIG9uUmVmcmVzaChPYmplY3QgZWxlbWVudCk7Ci0JfQotCQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRU1GUm9vdE9iamVjdFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldE1vZGVscyhJUHJvamVjdCBwcm9qZWN0KXsKLQkJdHJ5IHsKLQkJRU1GTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IChFTUZNb2RlbE1hbmFnZXIpIGVtZk1vZGVsQ2FjaGUuZ2V0KHByb2plY3QpOwotCQlpZiAobW9kZWxNYW5hZ2VyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoZW1mTW9kZWxDYWNoZSkgewotCQkJCW1vZGVsTWFuYWdlcj0gRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5jcmVhdGVFTUZNb2RlbE1hbmFnZXIocHJvamVjdCx0aGlzKSA7Ci0JCQkJZW1mTW9kZWxDYWNoZS5wdXQocHJvamVjdCxtb2RlbE1hbmFnZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy9leC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0KLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KEVNRlJvb3RPYmplY3RQcm92aWRlci50aGlzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBzd3RlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHN3dGUpOwotCQkJfSBjYXRjaCAoU1dURXJyb3Igc3d0ZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihzd3RlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlib29sZWFuIHByb2plY3RPcGVuU3RhdGVDaGFuZ2VkID0gKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCk7Ci0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fCBwcm9qZWN0T3BlblN0YXRlQ2hhbmdlZCkgewotCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQlkaXNwb3NlKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgcmV0dXJuOwotCQlFTUZNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gKEVNRk1vZGVsTWFuYWdlcikgZW1mTW9kZWxDYWNoZS5yZW1vdmUocHJvamVjdCk7Ci0JCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJbW9kZWxNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJRU1GTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCU9iamVjdFtdIGtleXMgPSBlbWZNb2RlbENhY2hlLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQltb2RlbE1hbmFnZXIgPSAoRU1GTW9kZWxNYW5hZ2VyKSBlbWZNb2RlbENhY2hlLnJlbW92ZShrZXlzW2ldKTsKLQkJCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1vZGVsTWFuYWdlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVByb2plY3QgYVByb2plY3QpIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBsaXN0ZW5lcnMuc2l6ZSgpOyArK3gpIHsKLQkJCUlSZWZyZXNoSGFuZGxlckxpc3RlbmVyIHJlZnJlc2hIYW5kbGVyID0gKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyKSBsaXN0ZW5lcnMuZ2V0KHgpOwotCQkJcmVmcmVzaEhhbmRsZXIub25SZWZyZXNoKGFQcm9qZWN0KTsKLQkJfQotCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlZnJlc2hIYW5kbGVyTGlzdGVuZXIoSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAoZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWlmIChhTGlzdGVuZXIgIT0gbnVsbCAmJiAhZ2V0TGlzdGVuZXJzKCkuY29udGFpbnMoYUxpc3RlbmVyKSkKLQkJCQlnZXRMaXN0ZW5lcnMoKS5hZGQoYUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIoSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgNDo0Mjo1OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0ZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MGUxNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0ZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBGbGV4aWJsZUVNRk1vZGVsTWFuYWdlciBleHRlbmRzIEVNRk1vZGVsTWFuYWdlciBpbXBsZW1lbnRzIEVkaXRNb2RlbExpc3RlbmVyewotCi0JcHJpdmF0ZSBMaXN0IHJvb3RPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVCA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0IGFydGlmYWN0RWRpdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmU7Ci0JcHJpdmF0ZSBmaW5hbCBNYXAgYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0ID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgRmxleGlibGVFTUZNb2RlbE1hbmFnZXIoSVByb2plY3QgYVByb2plY3QsIEVNRlJvb3RPYmplY3RQcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihhUHJvamVjdCxwcm92aWRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNnZXRNb2RlbHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRNb2RlbHMoKSB7Ci0JCXRyeSB7Ci0JCQotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCWlmICggcHJvamVjdD09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuIEVNUFRZX09CSkVDVDsKLQkJCQotCQkJc3luY2hyb25pemVkIChyb290T2JqZWN0cykgewotCQkJCWlmICghaXNWYWxpZChyb290T2JqZWN0cykpIHsKLQkJCQkJcm9vdE9iamVjdHMgPSBnZXRSb290T2JqZWN0cygpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZiAocm9vdE9iamVjdHMgIT0gbnVsbCkgewotCQkJIHJldHVybiByb290T2JqZWN0cy50b0FycmF5KCkgOwotCQl9Ci0JCXJldHVybiBFTVBUWV9PQkpFQ1Q7Ci0JCQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKExpc3Qgcm9vdE9iamVjdHMpIHsKLQkJaWYgKHJvb3RPYmplY3RzID09IG51bGwgfHwgcm9vdE9iamVjdHMuc2l6ZSgpPT0wKSAKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgeD0wOyB4PCByb290T2JqZWN0cy5zaXplKCk7ICsreCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHJvb3RPYmplY3RzLmdldCh4KTsKLQkJCWlmIChlT2JqZWN0ICE9IG51bGwgJiYgZU9iamVjdC5lUmVzb3VyY2UoKSA9PSBudWxsKSAKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRSb290T2JqZWN0cygpIHsKLQkgIAkgIExpc3QgYXJ0aWZhY3RzID0gZ2V0QXJ0aWZhY3RFZGl0cygpOwotCSAgCSAgTGlzdCBmbGV4aWJsZU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAJICBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkgIAkgIEVPYmplY3QgY29udGVudE1vZGVsUm9vdCA9IG51bGw7Ci0JICAJICBmb3IgKGludCB4PTA7IHg8IGFydGlmYWN0cy5zaXplKCk7ICsreCkgewotCSAgCSAgCSBhcnRpZmFjdEVkaXQgPSAoQXJ0aWZhY3RFZGl0KWFydGlmYWN0cy5nZXQoeCk7Ci0JICAJICAgICBjb250ZW50TW9kZWxSb290ID0gYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJCSBpZiAoY29udGVudE1vZGVsUm9vdCAhPSBudWxsKSB7Ci0JCSAgCSAgICAgZmxleGlibGVPYmplY3RzLmFkZChjb250ZW50TW9kZWxSb290KTsKLQkJICAJICAgICBhcnRpZmFjdEVkaXRUb1Jvb3RPYmplY3QucHV0KGFydGlmYWN0RWRpdCxjb250ZW50TW9kZWxSb290KTsKLQkJCSB9Ci0JICAJICB9Ci0JICAJICByZXR1cm4gZmxleGlibGVPYmplY3RzOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRBcnRpZmFjdEVkaXRzKCkgewotCQkKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGFydGlmYWN0RWRpdHMpIHsKLQkJCWlmIChhcnRpZmFjdEVkaXRzLnNpemUoKSA9PTAgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IGdldE1vZHVsZUNvcmUoKTsKLQkJCQlXb3JrYmVuY2hDb21wb25lbnRbXSB3b3JrQmVuY2hNb2R1bGVzID0gbW9kdWxlQ29yZS5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7IAotCQkJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya0JlbmNoTW9kdWxlcy5sZW5ndGg7IGkrKykgewotCSAgICAgICAgICAgICAgICAgV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IHdvcmtCZW5jaE1vZHVsZXNbaV07Ci0JICAgICAgICAgICAgICAgICBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkgICAgICAgICAgICAgICAgIHRyeXsKLQkgICAgICAgICAgICAgICAgICAJICAgYXJ0aWZhY3RFZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCSAgICAgICAgICAgICAgICAgICBpZihhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkgICAgICAgICAgICAgICAgICAgCWFydGlmYWN0RWRpdHMuYWRkKGFydGlmYWN0RWRpdCk7Ci0JCQkgICAgICAgICAgICAgICAgYXJ0aWZhY3RFZGl0LmFkZExpc3RlbmVyKHRoaXMpOwotCQkgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgfSAgY2F0Y2goRXhjZXB0aW9uIGUpewotCSAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCSAgICAgICAgICAgICAgICAgfSAKLQkJCSAgICB9Ci0JCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0czsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVFZGl0IGdldE1vZHVsZUNvcmUoKSB7Ci0JCWlmIChtb2R1bGVDb3JlID09IG51bGwpIHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZUNvcmU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYXJ0aWZhY3RFZGl0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCB4PTA7IHg8IGFydGlmYWN0RWRpdHMuc2l6ZSgpOyArK3gpIHsKLQkJCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKEFydGlmYWN0RWRpdClhcnRpZmFjdEVkaXRzLmdldCh4KTsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKQotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCUlQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCA9IGFuRXZlbnQuZ2V0RWRpdE1vZGVsKCkuZ2V0UHJvamVjdCgpOwotCQkKLQkJc3dpdGNoIChhbkV2ZW50LmdldEV2ZW50Q29kZSgpKSB7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlVOTE9BREVEX1JFU09VUkNFIDoKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSA6IHsKLQkJCQlPYmplY3Qgb2xkUm9vdE9iamVjdCA9IHJlbW92ZVJvb3RPYmplY3QoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ICE9IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuU0FWRSA6IHsKLQkJCQlPYmplY3Qgb2xkUm9vdE9iamVjdCA9IGdldFJvb3RPYmplY3QoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ID09IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6Ci0JCQkJCWRpc3Bvc2UoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JfQotCi0JCi0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSb290T2JqZWN0KEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdChlZGl0TW9kZWwscHJvamVjdCk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5nZXQoYXJ0aWZhY3RFZGl0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCByZW1vdmVSb290T2JqZWN0KEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdChlZGl0TW9kZWwscHJvamVjdCk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0LnJlbW92ZShhcnRpZmFjdEVkaXQpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEBwYXJhbSBlZGl0TW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcG9zZSggRWRpdE1vZGVsIGVkaXRNb2RlbCwgSVByb2plY3QgcHJvamVjdCkgewotCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gZ2V0QXJ0aWZhY3RFZGl0KGVkaXRNb2RlbCxwcm9qZWN0KTsKLQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQlhcnRpZmFjdEVkaXQucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQlhcnRpZmFjdEVkaXRzLnJlbW92ZShhcnRpZmFjdEVkaXQpOwotCQkJYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0LnJlbW92ZShhcnRpZmFjdEVkaXQpOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXQoRWRpdE1vZGVsIGVkaXRNb2RlbCwgSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoYXJ0aWZhY3RFZGl0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCB4PTA7IHg8YXJ0aWZhY3RFZGl0cy5zaXplKCk7ICsreCkgewotCQkJCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoQXJ0aWZhY3RFZGl0KWFydGlmYWN0RWRpdHMuZ2V0KHgpOwotCQkJCWlmIChhcnRpZmFjdEVkaXQuaGFzRWRpdE1vZGVsKGVkaXRNb2RlbCkpIAotCQkJCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVOYXZpZ2F0b3JDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRU5hdmlnYXRvckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjc3Y2VkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRU5hdmlnYXRvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdWwgNywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRU5hdmlnYXRvckNvbnN0YW50cyB7Ci0KLQlTdHJpbmcgVklFV0VSX0lEID0gIm9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQV29ya2luZ1NldENvbW1vbk5hdmlnYXRvciI7Ly8kTk9OLU5MUy0xJCAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVXaXphcmRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRVdpemFyZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzRhNjk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRVdpemFyZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkVKQkNvbXBvbmVudENyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkVKQkNvbXBvbmVudEV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5FSkJDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgQ3JlYXRpb24gSURzIGFyZSB1c2VkIGZvciBhY3Rpdml0eSBmaWx0ZXJpbmcgYW5kIGFzIHN1Y2ggYXJlIGRlY2xhcmVkIG9uIHRoZSBpbmRpdmlkdWFsCi0gKiB3aXphcmRzLiBBbGwgb3RoZXIgSURzIG11c3QgYmUgbWFpbnRhaW5lZCB0byBzdGF5IGluIHN5bmMgd2l0aCB0aGUgdmFsdWVzIGZvdW5kIGluIHRoZSBwbHVnaW4ueG1sCi0gKiBmaWxlcyBvZiB0aGUgcmVzcGVjdGl2ZSBtb2R1bGUgVUkgcGx1Z2lucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRVdpemFyZENvbnN0YW50cyB7Ci0KLQlTdHJpbmcgTkVXX0VBUl9QUk9KRUNUX1dJWkFSRF9JRCA9IEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLQotCVN0cmluZyBORVdfQVBQQ0xJRU5UX1BST0pFQ1RfV0laQVJEX0lEID0gQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQuV0laQVJEX0lEOwotCi0JU3RyaW5nIE5FV19KQ0FfUFJPSkVDVF9XSVpBUkRfSUQgPSBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0KLQlTdHJpbmcgTkVXX0VKQl9QUk9KRUNUX1dJWkFSRF9JRCA9IEVKQkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLQotCVN0cmluZyBORVdfV0VCX1BST0pFQ1RfV0laQVJEX0lEID0gV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuV0laQVJEX0lEOwotCi0JU3RyaW5nIE5FV19FTlRFUlBSSVNFX0JFQU5fV0laQVJEX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi51aS51dGlsLmNyZWF0ZUVKQldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJTVBPUlRfRUFSX1dJWkFSRF9JRCA9IEVBUkNvbXBvbmVudEltcG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgSU1QT1JUX0FQUENMSUVOVF9XSVpBUkRfSUQgPSBBcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIElNUE9SVF9DT05ORUNUT1JfV0laQVJEX0lEID0gQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBJTVBPUlRfRU5URVJQUklTRV9CRUFOX1dJWkFSRF9JRCA9IEVKQkNvbXBvbmVudEltcG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgSU1QT1JUX1dFQl9NT0RVTEVfV0laQVJEX0lEID0gV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBJTVBPUlRfVVRJTElUWV9KQVJfV0laQVJEX0lEID0gSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIEVYUE9SVF9FQVJfV0laQVJEX0lEID0gRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBFWFBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9JRCA9IEFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgRVhQT1JUX0NPTk5FQ1RPUl9XSVpBUkRfSUQgPSBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIEVYUE9SVF9FTlRFUlBSSVNFX0JFQU5fV0laQVJEX0lEID0gRUpCQ29tcG9uZW50RXhwb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBFWFBPUlRfV0VCX01PRFVMRV9XSVpBUkRfSUQgPSBXZWJDb21wb25lbnRFeHBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQWN0aW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzZDk5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUFjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5KMkVFUmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuT3BlbkoyRUVSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXdzLklDb21tb25BY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3cy5OYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSjJFRUFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uQWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tbW9uQWN0aW9uUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJVmlld1BhcnQgdmlld1BhcnQ7Ci0KLQlwcml2YXRlIE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24gb3BlbkFjdGlvbjsKLQotCXByaXZhdGUgSjJFRVJlbmFtZUFjdGlvbiByZW5hbWVBY3Rpb247Ci0KLQkvL3ByaXZhdGUgV1RQT3B0aW9uYWxPcGVyYXRpb25BY3Rpb24gZ2VuZXJpY0RlbGV0ZTsKLQkvL1RPRE8gYWRkIGJhY2sgZ2VuZXJpYyBkZWxldGUKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSjJFRUFjdGlvblByb3ZpZGVyKCkgewotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmFjdGlvbnMuSUNvbW1vbkFjdGlvblByb3ZpZGVyI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50U2VydmljZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCBhVmlld1BhcnQsIFN0cnVjdHVyZWRWaWV3ZXIgYVZpZXdlciwgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgYUNvbnRlbnRTZXJ2aWNlKSB7Ci0JCXZpZXdQYXJ0ID0gYVZpZXdQYXJ0OwotCi0JCW9wZW5BY3Rpb24gPSBuZXcgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbigpOwotCQlyZW5hbWVBY3Rpb24gPSBuZXcgSjJFRVJlbmFtZUFjdGlvbih2aWV3UGFydC5nZXRWaWV3U2l0ZSgpLCB2aWV3UGFydC5nZXRWaWV3U2l0ZSgpLmdldFNoZWxsKCkpOwotLy8KLS8vCQlnZW5lcmljRGVsZXRlID0gbmV3IFdUUE9wdGlvbmFsT3BlcmF0aW9uQWN0aW9uKFdUUEdlbmVyaWNBY3Rpb25JZHMuREVMRVRFLCBXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfZGVsZXRlKTsgLy8kTk9OLU5MUy0xJAotLy8JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLS8vCQlnZW5lcmljRGVsZXRlLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0vLwkJZ2VuZXJpY0RlbGV0ZS5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFX0RJU0FCTEVEKSk7Ci0vLwkJZ2VuZXJpY0RlbGV0ZS5zZXRXb3JrYmVuY2hTaXRlKHZpZXdQYXJ0LmdldFZpZXdTaXRlKCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNzZXRBY3Rpb25Db250ZXh0KG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25Db250ZXh0KEFjdGlvbkNvbnRleHQgYUNvbnRleHQpIHsKLQkJaWYgKGFDb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYUNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJcmVuYW1lQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQotCQkJT2JqZWN0W10gYXJyYXkgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJaWYgKGlzVXRpbGl0eUphcnMoYXJyYXkpKSB7Ci0JCQkJSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgdXRpbGl0eUphckl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJTGlzdCBuZXdTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQl1dGlsaXR5SmFySXRlbVByb3ZpZGVyID0gKEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKSBhcnJheVtpXTsKLQkJCQkJbmV3U2VsZWN0aW9uLmFkZEFsbCh1dGlsaXR5SmFySXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKG51bGwpKTsKLQkJCQl9Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKTsKLQkJCX0KLQkJCS8vZ2VuZXJpY0RlbGV0ZS5zZWxlY3Rpb25DaGFuZ2VkKGdlbmVyaWNEZWxldGUsIHNlbGVjdGlvbik7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjZmlsbEFjdGlvbkJhcnMob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgdGhlQWN0aW9uQmFycykgewotLy8JCWlmIChnZW5lcmljRGVsZXRlLmlzRW5hYmxlZCgpKQotLy8JCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwgZ2VuZXJpY0RlbGV0ZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjZmlsbENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBhTWVudSkgewotCQlib29sZWFuIGFjdGlvbnNBZGRlZCA9IGZhbHNlOwotCS8qCWlmIChyZW5hbWVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCWFNZW51LmFwcGVuZFRvR3JvdXAoSUNvbW1vbk1lbnVDb25zdGFudHMuQ09NTU9OX01FTlVfRURJVF9BQ1RJT05TLCByZW5hbWVBY3Rpb24pOwotCQkJYWN0aW9uc0FkZGVkID0gdHJ1ZTsKLQkJfQotCQlpZiAoZ2VuZXJpY0RlbGV0ZS5pc0VuYWJsZWQoKSkgewotCQkJYU1lbnUuYXBwZW5kVG9Hcm91cChJQ29tbW9uTWVudUNvbnN0YW50cy5DT01NT05fTUVOVV9FRElUX0FDVElPTlMsIGdlbmVyaWNEZWxldGUpOwotCQkJYWN0aW9uc0FkZGVkID0gdHJ1ZTsKLQkJfSovCi0JCXJldHVybiBhY3Rpb25zQWRkZWQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVXRpbGl0eUphcnMoT2JqZWN0W10gaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXRlbXNbaV0gPT0gbnVsbCB8fCBpdGVtc1tpXS5nZXRDbGFzcygpICE9IEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmNsYXNzKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb21wYXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhMDdkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNQotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQlwcml2YXRlIEoyRUVWaWV3ZXJTb3J0ZXIgajJlZVZpZXdTb3J0ZXIgPSBuZXcgSjJFRVZpZXdlclNvcnRlcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciBwcm92aWRlckhlbHBlckxlZnRBcmcgPSBudWxsOwotCQlKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIgcHJvdmlkZXJIZWxwZXJSaWdodEFyZyA9IG51bGw7Ci0KLQkJaWYgKG8xIGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcHJvdmlkZXJIZWxwZXJMZWZ0QXJnID0gKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgbzE7Ci0JCWlmIChvMiBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXByb3ZpZGVySGVscGVyUmlnaHRBcmcgPSAoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBvMjsKLQotCi0JCS8qIGlmIGJvdGggYXJndW1lbnRzIGFyZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXJzICovCi0JCWlmIChwcm92aWRlckhlbHBlckxlZnRBcmcgIT0gbnVsbCAmJiBwcm92aWRlckhlbHBlclJpZ2h0QXJnICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvdmlkZXJIZWxwZXJMZWZ0QXJnLmdldFRleHQoKS5jb21wYXJlVG8ocHJvdmlkZXJIZWxwZXJSaWdodEFyZy5nZXRUZXh0KCkpOwotCQkvKiBpZiBleGFjdGx5IG9uZSBvZiB0aGUgYXJndW1lbnRzIGFyZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXJzICovCi0JCWVsc2UgaWYgKHByb3ZpZGVySGVscGVyTGVmdEFyZyAhPSBudWxsICYmIG8yIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSBpZiAocHJvdmlkZXJIZWxwZXJSaWdodEFyZyAhPSBudWxsICYmIG8xIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiBqMmVlVmlld1NvcnRlci5jb21wYXJlKG51bGwsIG8xLCBvMik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgSjJFRUNvbXBhcmF0b3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYWIwYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5wcm92aWRlcnMuQ29tbW9uQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkJlYW5DbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1ldGhvZHNQcm92aWRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZSb290T2JqZWN0UHJvdmlkZXIuSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5EeW5hbWljQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlld3MuQWRhcHRhYmlsaXR5VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3cy5Db21tb25WaWV3ZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCi0JcHJpdmF0ZSBmaW5hbCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcm9vdE9iamVjdFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIE1ldGhvZHNQcm92aWRlckRlbGVnYXRlIGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdmlld2VySWQgPSBudWxsOwotCVZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJvb3RPYmplY3RQcm92aWRlciA9IG5ldyBFTUZSb290T2JqZWN0UHJvdmlkZXIoKTsKLQkJcm9vdE9iamVjdFByb3ZpZGVyLmFkZFJlZnJlc2hIYW5kbGVyTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFQ29udGVudFByb3ZpZGVyKFN0cmluZyBhVmlld2VySWQpIHsKLQkJcm9vdE9iamVjdFByb3ZpZGVyID0gbmV3IEVNRlJvb3RPYmplY3RQcm92aWRlcigpOwotCQl1cGRhdGVDb250ZW50UHJvdmlkZXJzKGFWaWV3ZXJJZCk7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5hZGRSZWZyZXNoSGFuZGxlckxpc3RlbmVyKHRoaXMpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBhbklucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oYW5JbnB1dEVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGFQYXJlbnRFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCB8fCBhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBhUGFyZW50RWxlbWVudCkuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gcm9vdE9iamVjdHMgPSAocm9vdE9iamVjdFByb3ZpZGVyICE9IG51bGwpID8gcm9vdE9iamVjdFByb3ZpZGVyLmdldE1vZGVscyhwcm9qZWN0KSA6IG51bGw7Ci0JCQkJaWYgKHJvb3RPYmplY3RzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgeD0wOyB4PCByb290T2JqZWN0cy5sZW5ndGggOyArK3gpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChyb290T2JqZWN0c1t4XSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihhUGFyZW50RWxlbWVudCkpCi0JCQlyZXR1cm4gZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oYVBhcmVudEVsZW1lbnQpOwotCQllbHNlIC8qIGlmIChpc0VNRkVkaXRPYmplY3QoYVBhcmVudEVsZW1lbnQpKSAqL3sKLQkJCU9iamVjdFtdIHNpYmxpbmdzID0gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oYVBhcmVudEVsZW1lbnQpOwotCQkJaWYgKHNpYmxpbmdzICE9IG51bGwpCi0JCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qoc2libGluZ3MpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihvYmplY3QpKQotCQkJcmV0dXJuIGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmdldFBhcmVudChvYmplY3QpOwotCQlPYmplY3QgcGFyZW50ID0gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBCZWFuQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXBhcmVudCA9ICgoQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIpIG9iamVjdCkuZ2V0RWpiKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcGFyZW50ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBvYmplY3QpOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5yZW1vdmVSZWZyZXNoSGFuZGxlckxpc3RlbmVyKHRoaXMpOwotCQlkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5kaXNwb3NlKCk7Ci0JCWRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmRpc3Bvc2UoKTsKLQotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihlbGVtZW50KSkKLQkJCXJldHVybiBkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQkJLyogZWxzZSBpZiAoaXNFTUZFZGl0T2JqZWN0KGVsZW1lbnQpKSAqLwotCQlyZXR1cm4gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3QgYW5PbGRJbnB1dCwgT2JqZWN0IGFOZXdJbnB1dCkgewotCQlTdHJpbmcgbmV3Vmlld2VySWQgPSBudWxsOwotCQl2aWV3ZXIgPSBhVmlld2VyOwotCQlpZiAoYVZpZXdlciBpbnN0YW5jZW9mIENvbW1vblZpZXdlcikKLQkJCW5ld1ZpZXdlcklkID0gKChDb21tb25WaWV3ZXIpIGFWaWV3ZXIpLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuZ2V0Vmlld2VySWQoKTsKLQotCQlpZiAobmV3Vmlld2VySWQgIT0gbnVsbCAmJiAodmlld2VySWQgPT0gbnVsbCB8fCAhdmlld2VySWQuZXF1YWxzKG5ld1ZpZXdlcklkKSkpCi0JCQl1cGRhdGVDb250ZW50UHJvdmlkZXJzKG5ld1ZpZXdlcklkKTsKLQotCQlkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5pbnB1dENoYW5nZWQoYVZpZXdlciwgYW5PbGRJbnB1dCwgYU5ld0lucHV0KTsKLQkJZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuaW5wdXRDaGFuZ2VkKGFWaWV3ZXIsIGFuT2xkSW5wdXQsIGFOZXdJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZpZXdlcklkMgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50UHJvdmlkZXJzKFN0cmluZyBhVmlld2VySWQpIHsKLQotCQkvKiBEaXNwb3NlIG9mIHRoZSBleGlzdGluZyBjb250ZW50IHByb3ZpZGVycyAqLwotCQlpZiAoZGVsZWdhdGVDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5kaXNwb3NlKCk7Ci0KLQkJLyogQ3JlYXRlIG5ldyBjb250ZW50IHByb3ZpZGVycyB1c2luZyB0aGUgbmV3IHZpZXdlciBpZCAqLwotCQlEeW5hbWljQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KGFWaWV3ZXJJZCk7Ci0JCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyID0gbmV3IENvbW1vbkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIgPSBuZXcgTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUoYWRhcHRlckZhY3RvcnkpOwotCi0JCS8qIFJlbWVtYmVyIHRoZSB2aWV3ZXIgaWQgKi8KLQkJdmlld2VySWQgPSBhVmlld2VySWQ7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZSb290T2JqZWN0TWFuYWdlci5JUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciNvblJlZnJlc2goamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvblJlZnJlc2goZmluYWwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBDcmVhdGUgYW5kIHNjaGVkdWxlIGEgVUkgSm9iIHRvIHVwZGF0ZSB0aGUgTmF2aWdhdG9yIENvbnRlbnQgVmlld2VyICovCi0JCQkJSm9iIGpvYiA9IG5ldyBVSUpvYigiVXBkYXRlIHRoZSBOYXZpZ2F0b3IgQ29udGVudCBWaWV3ZXIgSm9iIikgeyAvLyROT04tTkxTLTEkCi0JCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNjaGVkdWxpbmdSdWxlKQotCQkJCQlqb2Iuc2V0UnVsZSgoSVNjaGVkdWxpbmdSdWxlKWVsZW1lbnQpOwotCQkJCWVsc2UgIHsKLQkJCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSAoSVNjaGVkdWxpbmdSdWxlKUFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihlbGVtZW50LElTY2hlZHVsaW5nUnVsZS5jbGFzcyk7Ci0JCQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQkJCWpvYi5zZXRSdWxlKHJ1bGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQkKLQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0ZTNhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXdzLklDb21tb25MYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkxhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZGVsZWdhdGVMYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVMYWJlbFByb3ZpZGVyKFN0cmluZyBhVmlld2VySWQpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShhVmlld2VySWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKG5ldyBEeW5hbWljQWRhcHRlckZhY3RvcnkoYVZpZXdlcklkKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5leHRlbnNpb25zLklDb21tb25MYWJlbFByb3ZpZGVyI2dldERlc2NyaXB0aW9uKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgYW5FbGVtZW50KSB7Ci0JCWlmIChhbkVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgYW5FbGVtZW50OwotCQkJaWYgKENvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoZU9iaiwgdHJ1ZSAvKiBpbmNsdWRlIGVhcnMgKi8pKSB7Ci0JCQkJSVByb2plY3QgcGFyZW50ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVPYmopOwotCQkJCVN0cmluZyBwYXRoID0gbmV3IFBhdGgoZU9iai5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQkJaW50IHN0YXJ0SW5kZXggPSBwYXRoLmluZGV4T2YocGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJcmV0dXJuIC0xID09IHN0YXJ0SW5kZXggPyBwYXRoIDogcGF0aC5zdWJzdHJpbmcoc3RhcnRJbmRleCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmVxdWFscyhvYmopOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZCgpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpCi0JCQlyZXR1cm4gKChKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcmV0dXJuICgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBpZCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmlzTGFiZWxQcm9wZXJ0eShvYmplY3QsIGlkKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTGFiZWxQcm92aWRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTmF2aWdhdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTmF2aWdhdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1M2NjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFVmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmU1YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRVZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRVZpZXdlclNvcnRlci4KLQkgKi8KLQlwdWJsaWMgSjJFRVZpZXdlclNvcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHNlZSBWaWV3ZXJTb3J0ZXIjY29tcGFyZShWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpZiAoc2hvdWxkU29ydChlMSwgZTIpKQotCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudGVycHJpc2VCZWFuKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW47Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIENvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3Qobyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU29ydChPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlyZXR1cm4gKGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KGUxKSAmJiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChlMikpIHx8IChpc0VudGVycHJpc2VCZWFuKGUxKSAmJiBpc0VudGVycHJpc2VCZWFuKGUyKSkgfHwgKChlMSBpbnN0YW5jZW9mIElGaWxlKSAmJiAoZTIgaW5zdGFuY2VvZiBJRmlsZSkpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL05vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwN2M2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIgZXh0ZW5kcyBFTUZNb2RlbE1hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lcnsKLQotCXByaXZhdGUgRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQlwcml2YXRlIE9iamVjdCByb290T2JqZWN0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVCA9IG5ldyBPYmplY3RbMF07Ci0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIHByb3ZpZGVyCi0JICovCi0JcHVibGljIE5vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIoYVByb2plY3QsIHByb3ZpZGVyKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNnZXRNb2RlbHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRNb2RlbHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsIHx8ICFnZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gRU1QVFlfT0JKRUNUOwotCQkKLQkJLy9zeW5jaHJvbml6ZWQgKHJvb3RPYmplY3QpIHsKLQkJCWlmIChyb290T2JqZWN0ID09IG51bGwgfHwgKChFT2JqZWN0KSByb290T2JqZWN0KS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEVkaXRNb2RlbCgpOwotCQkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJCQlyb290T2JqZWN0ID0gZWRpdE1vZGVsLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCQkJfQotCQkJfQotCQkvL30KLQkJaWYgKHJvb3RPYmplY3Q9PW51bGwpIAotCQkJcmV0dXJuIEVNUFRZX09CSkVDVDsKLQkJZWxzZSB7Ci0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCW9iamVjdHNbMF0gPSByb290T2JqZWN0OwotCQkJcmV0dXJuIG9iamVjdHM7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRU1GTW9kZWxNYW5hZ2VyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJZWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQllZGl0TW9kZWwgPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXIjZWRpdE1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gYW5FdmVudC5nZXRFZGl0TW9kZWwoKS5nZXRQcm9qZWN0KCk7Ci0JCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSA6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiAKLQkJCQlpZiAocm9vdE9iamVjdCAhPSBudWxsKXsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkgICAgIH0KLQkJCQlicmVhazsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuU0FWRSA6IHsKLQkJCQlpZiAocm9vdE9iamVjdCA9PSBudWxsKQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFIDoKLQkJCQkJZGlzcG9zZSgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JfQotCQotCQotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWwoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vVE9ETyBmaXggdXAKLQkJLy9zeW5jaHJvbml6ZWQgKGVkaXRNb2RlbCkgewotLy8JCQlpZiAoZWRpdE1vZGVsID09IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotLy8JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldEVkaXRNb2RlbEZvclByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsKLS8vCQkJCUoyRUVOYXR1cmUgbmF0dXJlID0gSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZShwcm9qZWN0KTsKLS8vCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotLy8JCQkJCWVkaXRNb2RlbCA9IG5hdHVyZS5nZXRKMkVFRWRpdE1vZGVsRm9yUmVhZCh0aGlzKTsKLS8vCQkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLS8vCQkJCQkJZWRpdE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQkvL30KLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUNhY2hlKElQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCkgewotCQkvL3N5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQkJZWRpdE1vZGVsID0gbnVsbDsKLQkJCX0KLQkJLy99Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkRXh0ZXJuYWxVdGlsaXR5SmFyRHJvcEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRFeHRlcm5hbFV0aWxpdHlKYXJEcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDRhZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRFeHRlcm5hbFV0aWxpdHlKYXJEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC53b3JrYmVuY2guUmVzb3VyY2VEcm9wQWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZXJuYWxVdGlsaXR5SmFyRHJvcEFjdGlvbiBleHRlbmRzIFJlc291cmNlRHJvcEFjdGlvbiB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5uYXZpZ2F0b3IuZG5kLlJlc291cmNlRHJvcEFjdGlvbiN2YWxpZGF0ZURyb3Aob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGludCwgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEcm9wKENvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCS8vVE9ETyByZWRvIHdpdGggY29tcG9uZW50cwotLy8JCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotLy8JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKSB7Ci0vLwkJCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSAoU3RyaW5nW10pIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlclR5cGUpOwotLy8JCQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotLy8JCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCi0vLwkJCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotLy8JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspCi0vLwkJCQkJCWlmICghKHJlc3VsdCA9IHNvdXJjZU5hbWVzWzBdLmVuZHNXaXRoKCIuamFyIikpKWJyZWFrOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJcmV0dXJuIHJlc3VsdDsKLS8vCQkJCX0KLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRNb2R1bGVEcm9wQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZE1vZHVsZURyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiNjU5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZE1vZHVsZURyb3BBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRkTW9kdWxlRHJvcEFjdGlvbiBleHRlbmRzIEFkZFByb2plY3RUb0VhckRyb3BBY3Rpb24gewotCi0JcHVibGljIEFkZE1vZHVsZURyb3BBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQcm9qZWN0VG9BZGQoSVByb2plY3QgcHJvamVjdFRvQWRkLCBpbnQgZWFyVmVyc2lvbikgewotCQkvL1RPRE8gZml4IHVwIHRvIHVzZSBjb21wb25lbnRzCi0vLwkJSjJFRU5hdHVyZSBtb2R1bGVOYXR1cmUgPSBKMkVFTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lKHByb2plY3RUb0FkZCk7Ci0vLwkJaWYgKG51bGwgPT0gbW9kdWxlTmF0dXJlIHx8IG1vZHVsZU5hdHVyZS5nZXROYXR1cmVJRCgpLmVxdWFscyhJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkgfHwgbW9kdWxlTmF0dXJlLmdldEoyRUVWZXJzaW9uKCkgPiBlYXJWZXJzaW9uKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbChJUHJvamVjdCBlYXJQcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9BZGQpIHsKLQkJLy9UT0RPIGZpeCB1cCB0byB1c2UgY29tcG9uZW50cwotLy8JCXJldHVybiBBZGRNb2R1bGVUb0VBUkRhdGFNb2RlbC5jcmVhdGVBZGRUb0VBUkRhdGFNb2RlbChudWxsLG51bGwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZFByb2plY3RUb0VhckRyb3BBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkUHJvamVjdFRvRWFyRHJvcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzkzNTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkUHJvamVjdFRvRWFyRHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFkYXB0YWJpbGl0eVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5kbmQuSURyb3BWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZG5kLk5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRkUHJvamVjdFRvRWFyRHJvcEFjdGlvbiBleHRlbmRzIE5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElEcm9wVmFsaWRhdG9yIHsKLQotCXB1YmxpYyBBZGRQcm9qZWN0VG9FYXJEcm9wQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChDb21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciBkcm9wQWRhcHRlciwgT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vVE9ETyBzd2l0Y2ggdG8gY29tcG9uZW50cwotLy8JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkgfHwgUGx1Z2luVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotLy8JCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0vLwkJCWlmIChudWxsID09IGVhclByb2plY3QgfHwgIWVhclByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJaW50IGVhclZlcnNpb24gPSBlYXJOYXR1cmUuZ2V0QXBwbGljYXRpb24oKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0vLwotLy8JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZWxlY3Rpb24oKTsKLS8vCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotLy8JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCQlPYmplY3Qga2V5ID0gbmV3IE9iamVjdCgpOwotLy8JCQlFQVJFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLS8vCQkJdHJ5IHsKLS8vCQkJCWVkaXRNb2RlbCA9IGVhck5hdHVyZS5nZXRFYXJFZGl0TW9kZWxGb3JSZWFkKGtleSk7Ci0vLwkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLS8vCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLS8vCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLS8vCQkJCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihuZXh0LCBJUHJvamVjdC5jbGFzcyk7Ci0vLwkJCQkJaWYgKG51bGwgPT0gcHJvamVjdFRvQWRkIHx8ICFwcm9qZWN0VG9BZGQuaXNBY2Nlc3NpYmxlKCkpIHsKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJCX0KLS8vCi0vLwkJCQkJaWYgKCF2YWxpZGF0ZVByb2plY3RUb0FkZChwcm9qZWN0VG9BZGQsIGVhclZlcnNpb24pKSB7Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQl9Ci0vLwotLy8JCQkJCWlmIChlZGl0TW9kZWwuaGFzTWFwcGluZ1RvUHJvamVjdChwcm9qZWN0VG9BZGQpKSB7Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0gZmluYWxseSB7Ci0vLwkJCQlpZiAobnVsbCAhPSBlZGl0TW9kZWwpIHsKLS8vCQkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2VzcyhrZXkpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCXJldHVybiB0cnVlOwotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gdmFsaWRhdGVQcm9qZWN0VG9BZGQoSVByb2plY3QgcHJvamVjdFRvQWRkLCBpbnQgZWFyVmVyc2lvbik7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoSVByb2plY3QgZWFyUHJvamVjdCwgSVByb2plY3QgcHJvamVjdFRvQWRkKTsKLQotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJLy9kZWZhdWx0IG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBydW4oT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHRhcmdldCkgewotCQlpZiAoc291cmNlIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQlyZXR1cm4gcnVuKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc291cmNlLCAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcih0YXJnZXQsIElQcm9qZWN0LmNsYXNzKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBydW4oQ29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIsIE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIHJ1bihzb3VyY2UsIHRhcmdldCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVByb2plY3QgZWFyUHJvamVjdCkgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCBlYXJQcm9qZWN0ID09IG51bGwgfHwgIWVhclByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChJdGVyYXRvciBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgc291cmNlT2JqZWN0ID0gc2VsZWN0aW9uSXRlcmF0b3IubmV4dCgpOwotCi0JCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihzb3VyY2VPYmplY3QsIElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChwcm9qZWN0VG9BZGQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0RGF0YU1vZGVsKGVhclByb2plY3QsIHByb2plY3RUb0FkZCk7Ci0JCQkJCWRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU5hdmlnYXRvclBsdWdpbi5sb2coZS50b1N0cmluZygpKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkVXRpbGl0eUphckRyb3BBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkVXRpbGl0eUphckRyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhNWU0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZFV0aWxpdHlKYXJEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biA5LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLlNlcnZlclRhcmdldFVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRkVXRpbGl0eUphckRyb3BBY3Rpb24gZXh0ZW5kcyBBZGRQcm9qZWN0VG9FYXJEcm9wQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRVdGlsaXR5SmFyRHJvcEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByb2plY3RUb0FkZChJUHJvamVjdCBwcm9qZWN0VG9BZGQsIGludCBlYXJWZXJzaW9uKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvamVjdFRvQWRkLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbChJUHJvamVjdCBlYXJQcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9BZGQpIHsKLQkJLy9UT0RPIG1pZ3JhdGUgdG8gQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0JCWJvb2xlYW4gc3luY1NlcnZlclRhcmdldCA9IFNlcnZlclRhcmdldFVJSGVscGVyLnNldE1vZHVsZVNlcnZlclRhcmdldElmTmVjZXNzYXJ5KGVhclByb2plY3QsIHByb2plY3RUb0FkZCwgZ2V0U2hlbGwoKSk7Ci0vLwkJZGF0YU1vZGVsID0gQWRkVXRpbGl0eVByb2plY3RUb0VBUkRhdGFNb2RlbC5jcmVhdGVBZGRUb0VBUkRhdGFNb2RlbChlYXJQcm9qZWN0LmdldE5hbWUoKSwgcHJvamVjdFRvQWRkKTsKLS8vCQlkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEFkZEFyY2hpdmVUb0VBUkRhdGFNb2RlbC5TWU5DX1RBUkdFVF9SVU5USU1FLCBzeW5jU2VydmVyVGFyZ2V0KTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0oyRUVJbXBvcnREcm9wQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0oyRUVJbXBvcnREcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Yjc4NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9KMkVFSW1wb3J0RHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDYsIDIwMDQKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5JbXBvcnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWRhcHRhYmlsaXR5VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5kbmQuQ29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZG5kLklEcm9wVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmRuZC5OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEoyRUVJbXBvcnREcm9wQWN0aW9uIGV4dGVuZHMgTmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSURyb3BWYWxpZGF0b3IgewotCXByaXZhdGUgQXJjaGl2ZU9wdGlvbnMgcmVhZE9ubHlBcmNoaXZlT3B0aW9uczsKLQotCXB1YmxpYyBKMkVFSW1wb3J0RHJvcEFjdGlvbigpIHsKLQkJcmVhZE9ubHlBcmNoaXZlT3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlyZWFkT25seUFyY2hpdmVPcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZpbGVFeGlzdHNPbkRpc2soU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsICYmIGZpbGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVOYW1lKTsKLQkJCXJldHVybiBmaWxlLmV4aXN0cygpICYmICFmaWxlLmlzRGlyZWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChDb21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciBkcm9wQWRhcHRlciwgT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpIHsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gKFN0cmluZ1tdKSBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5uYXRpdmVUb0phdmEodHJhbnNmZXJUeXBlKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsIHx8IHNvdXJjZU5hbWVzLmxlbmd0aCAhPSAxKSB7IC8vb25seSBoYW5kbGUgb25lIGZpbGUgZm9yIG5vdwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVN0cmluZyBmaWxlTmFtZSA9IHNvdXJjZU5hbWVzWzBdOwotCQkJaWYgKCEoZmlsZU5hbWUuZW5kc1dpdGgoIi5lYXIiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCIud2FyIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi5yYXIiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghZmlsZUV4aXN0c09uRGlzayhmaWxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbnQgYXJjaGl2ZVR5cGUgPSBJbXBvcnRVdGlsLlVOS05PV047Ci0JCQlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCQkJdHJ5IHsKLS8vCQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLS8vCQkJCWFyY2hpdmVUeXBlID0gSW1wb3J0VXRpbC5nZXRBcmNoaXZlVHlwZShhcmNoaXZlKTsKLS8vCQkJCVN0cmluZ1tdIHBvc3NpYmxlTmF0dXJlcyA9IG51bGw7Ci0vLwkJCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0vLwkJCQkJY2FzZSBJbXBvcnRVdGlsLkVBUkZJTEUgOgotLy8JCQkJCQlwb3NzaWJsZU5hdHVyZXMgPSBuZXcgU3RyaW5nW117SUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuRUpCSkFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCwgSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuQ0xJRU5USkFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCwgSUFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRH07Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLS8vCQkJCQkJcG9zc2libGVOYXR1cmVzID0gbmV3IFN0cmluZ1tde0lFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lELCBJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEfTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJY2FzZSBJbXBvcnRVdGlsLlJBUkZJTEUgOgotLy8JCQkJCQlwb3NzaWJsZU5hdHVyZXMgPSBuZXcgU3RyaW5nW117SUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQsIElDb25uZWN0b3JOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEfTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJZGVmYXVsdCA6Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCX0KLS8vCi0vLwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0JCQkJLy9UT0RPIGZpeCB1cCB0byB1c2UgY29tcG9uZW50cyBhbmQgYXJ0aWZhY3QgZWRpdHMKLS8vCQkJCWlmIChudWxsICE9IHByb2plY3QpIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlib29sZWFuIGZvdW5kTmF0dXJlID0gZmFsc2U7Ci0vLwkJCQkJCWZvciAoaW50IGkgPSAwOyAhZm91bmROYXR1cmUgJiYgaSA8IHBvc3NpYmxlTmF0dXJlcy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKHBvc3NpYmxlTmF0dXJlc1tpXSkpIHsKLS8vCQkJCQkJCQlmb3VuZE5hdHVyZSA9IHRydWU7Ci0vLwkJCQkJCQkJSjJFRU5hdHVyZSBuYXR1cmUgPSAoSjJFRU5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUocG9zc2libGVOYXR1cmVzW2ldKTsKLS8vCQkJCQkJCQlpbnQgcHJvamVjdEoyRUVWZXJzaW9uID0gbmF0dXJlLmdldEoyRUVWZXJzaW9uKCk7Ci0vLwkJCQkJCQkJaW50IGFyY2hpdmVNb2R1bGVWZXJzaW9uID0gQXJjaGl2ZVV0aWwuZ2V0RmFzdFNwZWNWZXJzaW9uKChNb2R1bGVGaWxlKSBhcmNoaXZlKTsKLS8vCQkJCQkJCQlib29sZWFuIGZhaWwgPSBmYWxzZTsKLS8vCQkJCQkJCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0vLwkJCQkJCQkJCWNhc2UgSW1wb3J0VXRpbC5FQVJGSUxFIDoKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLkNMSUVOVEpBUkZJTEUgOgotLy8JCQkJCQkJCQkJaWYgKHByb2plY3RKMkVFVmVyc2lvbiA8IGFyY2hpdmVNb2R1bGVWZXJzaW9uKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9Ci0vLwkJCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLkVKQkpBUkZJTEUgOgotLy8JCQkJCQkJCQkJaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0gZWxzZSBpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIGFyY2hpdmVNb2R1bGVWZXJzaW9uID4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotLy8JCQkJCQkJCQkJCWZhaWwgPSB0cnVlOwotLy8JCQkJCQkJCQkJfQotLy8JCQkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLS8vCQkJCQkJCQkJCWlmIChwcm9qZWN0SjJFRVZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgJiYgYXJjaGl2ZU1vZHVsZVZlcnNpb24gPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9IGVsc2UgaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCQljYXNlIEltcG9ydFV0aWwuUkFSRklMRSA6Ci0vLwkJCQkJCQkJCQlpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9IGVsc2UgaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCQlpZiAoZmFpbCkgewotLy8JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCWlmICghZm91bmROYXR1cmUpIHsKLS8vCQkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQkJfQotLy8JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJfQotLy8JCQkJfQotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG51bGwgIT0gYXJjaGl2ZSAmJiBhcmNoaXZlLmlzT3BlbigpKSB7Ci0JCQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLk5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKENvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBPYmplY3Qgc291cmNlLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCVRyYW5zZmVyRGF0YSBjdXJyZW50VHJhbnNmZXIgPSBkcm9wQWRhcHRlci5nZXRDdXJyZW50VHJhbnNmZXIoKTsKLQkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShjdXJyZW50VHJhbnNmZXIpKSB7Ci0JCQlmaW5hbCBTdHJpbmdbXSBmaWxlTmFtZXMgPSAoU3RyaW5nW10pIHNvdXJjZTsKLQkJCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVOYW1lc1swXTsKLQkJCURhdGFNb2RlbFdpemFyZCB3aXphcmQgPSBudWxsOwotCQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBudWxsOwotCi0JCQlpbnQgYXJjaGl2ZVR5cGUgPSBJbXBvcnRVdGlsLlVOS05PV047Ci0JCQlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlhcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShmaWxlTmFtZSk7Ci0JCQkJYXJjaGl2ZVR5cGUgPSBJbXBvcnRVdGlsLmdldEFyY2hpdmVUeXBlKGFyY2hpdmUpOwotCQkJCXN3aXRjaCAoYXJjaGl2ZVR5cGUpIHsKLQkJCQkJY2FzZSBJbXBvcnRVdGlsLkVBUkZJTEUgOgotCQkJCQkJZGF0YU1vZGVsID0gbnVsbDsvL25ldyBFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEltcG9ydFV0aWwuRUpCSkFSRklMRSA6Ci0JCQkJCQlkYXRhTW9kZWwgPSBudWxsOy8vbmV3IEVKQk1vZHVsZUltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW1wb3J0VXRpbC5DTElFTlRKQVJGSUxFIDoKLQkJCQkJCWRhdGFNb2RlbCA9IG51bGw7Ly9uZXcgQXBwQ2xpZW50TW9kdWxlSW1wb3J0RGF0YU1vZGVsKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbXBvcnRVdGlsLldBUkZJTEUgOgotCQkJCQkJZGF0YU1vZGVsID0gbnVsbDsvL25ldyBXZWJNb2R1bGVJbXBvcnREYXRhTW9kZWwoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEltcG9ydFV0aWwuUkFSRklMRSA6Ci0JCQkJCQlkYXRhTW9kZWwgPSBudWxsOy8vbmV3IENvbm5lY3Rvck1vZHVsZUltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChudWxsICE9IGFyY2hpdmUgJiYgYXJjaGl2ZS5pc09wZW4oKSkgewotCQkJCQlhcmNoaXZlLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZmlsZU5hbWUpOwotCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0JCQlpZiAobnVsbCAhPSBwcm9qZWN0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGFyY2hpdmVUeXBlID09IEltcG9ydFV0aWwuRUFSRklMRSApIHsKLQkJCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotCQkJCQkJZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJc3dpdGNoIChhcmNoaXZlVHlwZSkgewotCQkJCWNhc2UgSW1wb3J0VXRpbC5FQVJGSUxFIDoKLQkJCQkJd2l6YXJkID0gbnVsbDsvL25ldyBFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnRXaXphcmQoKEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCkgZGF0YU1vZGVsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbXBvcnRVdGlsLkVKQkpBUkZJTEUgOgotCQkJCQl3aXphcmQgPSBudWxsOy8vbmV3IEVKQk1vZHVsZUltcG9ydFdpemFyZCgoRUpCTW9kdWxlSW1wb3J0RGF0YU1vZGVsKSBkYXRhTW9kZWwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcG9ydFV0aWwuQ0xJRU5USkFSRklMRSA6Ci0JCQkJCXdpemFyZCA9IG51bGw7Ly9uZXcgQXBwQ2xpZW50TW9kdWxlSW1wb3J0V2l6YXJkKChBcHBDbGllbnRNb2R1bGVJbXBvcnREYXRhTW9kZWwpIGRhdGFNb2RlbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLQkJCQkJd2l6YXJkID0gbnVsbDsvL25ldyBXZWJNb2R1bGVJbXBvcnRXaXphcmQoKFdlYk1vZHVsZUltcG9ydERhdGFNb2RlbCkgZGF0YU1vZGVsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbXBvcnRVdGlsLlJBUkZJTEUgOgotCQkJCQl3aXphcmQgPSBudWxsOy8vbmV3IENvbm5lY3Rvck1vZHVsZUltcG9ydFdpemFyZCgoQ29ubmVjdG9yTW9kdWxlSW1wb3J0RGF0YU1vZGVsKSBkYXRhTW9kZWwpOwotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKG51bGwgIT0gd2l6YXJkKSB7Ci0JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Nb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Nb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmU4OTMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTW9kdWxlSWRlbnRpZmllclNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BZGFwdGFiaWxpdHlVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmRuZC5JU2VyaWFsaXplcjsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplciBpbXBsZW1lbnRzIElTZXJpYWxpemVyIHsKLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLklTZXJpYWxpemVyI3RvQnl0ZUFycmF5KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheShPYmplY3QgZGF0YSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIoZGF0YSwgSVByb2plY3QuY2xhc3MpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpLmdldEJ5dGVzKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLklTZXJpYWxpemVyI2Zyb21CeXRlQXJyYXkoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSkgewotCQlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcoZGF0YSk7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9wbHVnaW4vSjJFRU5hdmlnYXRvclBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3BsdWdpbi9KMkVFTmF2aWdhdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDQ3ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3BsdWdpbi9KMkVFTmF2aWdhdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRU5hdmlnYXRvclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBKMkVFTmF2aWdhdG9yUGx1Z2luIHBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEoyRUVOYXZpZ2F0b3JQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSjJFRU5hdmlnYXRvclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3dvcmtpbmdzZXRzL0NvbXBvbmVudFdvcmtpbmdTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5N2JjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucnVudGltZS5JbnRlcm5hbFBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5BYnN0cmFjdFdvcmtpbmdTZXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnVpLndvcmtpbmdzZXRzLklDb21tb25Xb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuV29ya2luZ1NldERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuV29ya2luZ1NldFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRXb3JraW5nU2V0ICAgaW1wbGVtZW50cyBJQ29tbW9uV29ya2luZ1NldCxJQWN0aW9uRmlsdGVyewotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWV9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwud29ya2luZ3NldHMuQ29tcG9uZW50V29ya2luZ1NldEZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFX0lEID0gImNvbXBvbmVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QQUdFX0lEID0gImVkaXRQYWdlSWQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1dPUktJTkdfU0VUX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5Db21wb25lbnRXb3JraW5nU2V0UGFnZSI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGVsZW1lbnRzOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWRpdFBhZ2VJZDsKLQotICAgIHByaXZhdGUgSU1lbWVudG8gd29ya2luZ1NldE1lbWVudG87Ci0gICAgCi0gICAgcHJpdmF0ZSBJV29ya2luZ1NldE1hbmFnZXIgbWFuYWdlcjsKLQkKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlSWQ7Ci0gICAgICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfSUQgPSAidHlwZUlkIjsgLy8kTk9OLU5MUy0xJAotCSAgICAKLQkKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdvcmtpbmcgc2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgd29ya2luZyBzZXQuIFNob3VsZCBub3QgaGF2ZSAKLSAgICAgKiAJbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlLgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBjb250ZW50IG9mIHRoZSBuZXcgd29ya2luZyBzZXQuIAotICAgICAqIAlNYXkgYmUgZW1wdHkgYnV0IG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldChTdHJpbmcgYU5hbWUsIElBZGFwdGFibGVbXSBlbGVtZW50cykgewotCSAgIG5hbWUgPSBhTmFtZTsKLQkgICBpbnRlcm5hbFNldEVsZW1lbnRzKGVsZW1lbnRzKTsKLQkgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdvcmtpbmcgc2V0IGZyb20gYSBtZW1lbnRvLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgd29ya2luZyBzZXQuIFNob3VsZCBub3QgaGF2ZSAKLSAgICAgKiAJbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlLgotICAgICAqIEBwYXJhbSBtZW1lbnRvIHBlcnNpc3RlbmNlIG1lbWVudG8gY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgIAotICAgICAqIAl0aGUgd29ya2luZyBzZXQuCi0gICAgICovCi0gICAgQ29tcG9uZW50V29ya2luZ1NldChTdHJpbmcgYU5hbWUsIFN0cmluZyBhVHlwZUlkLCBJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgCW5hbWUgPSBhTmFtZTsKLSAgICAgICAgdHlwZUlkID0gYVR5cGVJZDsKLSAgICAgICAgd29ya2luZ1NldE1lbWVudG8gPSBtZW1lbnRvOwotCQlpbnRlcm5hbFNldEVsZW1lbnRzKG5ldyBJQWRhcHRhYmxlWzBdKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcjIKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldChDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBhRGVzY3JpcHRvcikgewotCQluYW1lID0gYURlc2NyaXB0b3IuZ2V0TGFiZWwoKTsKLQkJdHlwZUlkID0gYURlc2NyaXB0b3IuZ2V0VHlwZUlkKCk7Ci0JCWVkaXRQYWdlSWQgPSBhRGVzY3JpcHRvci5nZXRJZCgpOwotCQlpbnRlcm5hbFNldEVsZW1lbnRzKG5ldyBJQWRhcHRhYmxlWzBdKTsKLQl9Ci0KLQkvKioKLSAgICAgKiBUZXN0cyB0aGUgcmVjZWl2ZXIgYW5kIHRoZSBvYmplY3QgZm9yIGVxdWFsaXR5Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCBvYmplY3QgdG8gY29tcGFyZSB0aGUgcmVjZWl2ZXIgdG8KLSAgICAgKiBAcmV0dXJuIHRydWU9dGhlIG9iamVjdCBlcXVhbHMgdGhlIHJlY2VpdmVyLCB0aGUgbmFtZSBpcyB0aGUgc2FtZS4KLSAgICAgKiAJZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29tcG9uZW50V29ya2luZ1NldCkgewotICAgICAgICAgICAgQ29tcG9uZW50V29ya2luZ1NldCB3b3JraW5nU2V0ID0gKENvbXBvbmVudFdvcmtpbmdTZXQpIG9iamVjdDsKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RQYWdlSWQgPSB3b3JraW5nU2V0LmdldElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFnZUlkID0gZ2V0SWQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gcGFnZUlkRXF1YWwgPSAob2JqZWN0UGFnZUlkID09IG51bGwgJiYgcGFnZUlkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHx8IChvYmplY3RQYWdlSWQgIT0gbnVsbCAmJiBvYmplY3RQYWdlSWQuZXF1YWxzKHBhZ2VJZCkpOwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdFR5cGVJZCA9IHdvcmtpbmdTZXQuZ2V0VHlwZUlkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gZ2V0VHlwZUlkKCk7Ci0gICAgICAgICAgICBib29sZWFuIHR5cGVJZEVxdWFsID0gKG9iamVjdFR5cGVJZCA9PSBudWxsICYmIHR5cGVJZCA9PSBudWxsKQotICAgICAgICAgICAgfHwgKG9iamVjdFR5cGVJZCAhPSBudWxsICYmIG9iamVjdFR5cGVJZC5lcXVhbHModHlwZUlkKSk7Ci0gICAgICAgICAgICByZXR1cm4gd29ya2luZ1NldC5nZXROYW1lKCkuZXF1YWxzKGdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgd29ya2luZ1NldC5nZXRFbGVtZW50c0FycmF5KCkuZXF1YWxzKGdldEVsZW1lbnRzQXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgcGFnZUlkRXF1YWwKLQkJCQkJJiYgdHlwZUlkRXF1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlXb3JraW5nU2V0UmVnaXN0cnkgcmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtpbmdTZXRSZWdpc3RyeSgpOwotCQlTdHJpbmcgaWQ9IGdldElkKCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlXb3JraW5nU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yPSByZWdpc3RyeS5nZXRXb3JraW5nU2V0RGVzY3JpcHRvcihpZCk7Ci0JCWlmIChkZXNjcmlwdG9yID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBkZXNjcmlwdG9yLmlzRWRpdGFibGUoKTsKLQl9Ci0vLyAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWNlaXZlciBpZiB0aGUgcmVxdWVzdGVkIHR5cGUgaXMgZWl0aGVyIElXb3JraW5nU2V0IAotICAgICAqIG9yIElQZXJzaXN0YWJsZUVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgdGhlIHJlcXVlc3RlZCB0eXBlCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIgaWYgdGhlIHJlcXVlc3RlZCB0eXBlIGlzIGVpdGhlciBJV29ya2luZ1NldCAKLSAgICAgKiAJb3IgSVBlcnNpc3RhYmxlRWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICBpZiAoYWRhcHRlciA9PSBJV29ya2luZ1NldC5jbGFzcwotICAgICAgICAgICAgICAgIHx8IGFkYXB0ZXIgPT0gSVBlcnNpc3RhYmxlRWxlbWVudC5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQkJcmV0dXJuIEludGVybmFsUGxhdGZvcm0uZ2V0RGVmYXVsdCgpLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldAotICAgICAqLwotICAgIHB1YmxpYyBJQWRhcHRhYmxlW10gZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gZ2V0RWxlbWVudHNBcnJheSgpOwotICAgICAgICByZXR1cm4gKElBZGFwdGFibGVbXSkgbGlzdC50b0FycmF5KG5ldyBJQWRhcHRhYmxlW2xpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudHMgYXJyYXkgbGlzdC4gTGF6aWx5IHJlc3RvcmVzIHRoZSBlbGVtZW50cyBmcm9tCi0gICAgICogcGVyc2lzdGVuY2UgbWVtZW50by4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudHMgYXJyYXkgbGlzdAotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGdldEVsZW1lbnRzQXJyYXkoKSB7Ci0gICAgICAgIGlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN0b3JlV29ya2luZ1NldCgpOwotICAgICAgICAgICAgd29ya2luZ1NldE1lbWVudG8gPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiBGQUNUT1JZX0lEOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAJaWYgKGVkaXRQYWdlSWQgPT0gbnVsbCkKLSAgICAJCWVkaXRQYWdlSWQgPSBDT01QT05FTlRfV09SS0lOR19TRVRfSUQ7Ci0gICAgICAgIHJldHVybiBlZGl0UGFnZUlkOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQKLSAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaENvZGUgPSBuYW1lLmhhc2hDb2RlKCkgJiB0eXBlSWQuaGFzaENvZGUoKTsKLQotICAgICAgICBpZiAoZWRpdFBhZ2VJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoYXNoQ29kZSAmPSBlZGl0UGFnZUlkLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2hDb2RlOwotICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjcmVhdGVzIHRoZSB3b3JraW5nIHNldCBlbGVtZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSBtZW1lbnRvLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlV29ya2luZ1NldCgpIHsKLSAgICAJLy91cGRhdGVFbGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudHMgSVBlcnNpc3RhYmxlRWxlbWVudC4KLSAgICAgKiBQZXJzaXN0IHRoZSB3b3JraW5nIHNldCBuYW1lIGFuZCB3b3JraW5nIHNldCBjb250ZW50cy4gCi0gICAgICogVGhlIGNvbnRlbnRzIGhhcyB0byBiZSBlaXRoZXIgSVBlcnNpc3RhYmxlRWxlbWVudHMgb3IgcHJvdmlkZSAKLSAgICAgKiBhZGFwdGVycyBmb3IgaXQgdG8gYmUgcGVyc2lzdGVudC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQjc2F2ZVN0YXRlKElNZW1lbnRvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIGlmICh3b3JraW5nU2V0TWVtZW50byAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBqdXN0IHJlLXNhdmUgdGhlIHByZXZpb3VzIG1lbWVudG8gaWYgdGhlIHdvcmtpbmcgc2V0IGhhcyAKLSAgICAgICAgICAgIC8vIG5vdCBiZWVuIHJlc3RvcmVkCi0gICAgICAgICAgICBtZW1lbnRvLnB1dE1lbWVudG8od29ya2luZ1NldE1lbWVudG8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtZW50by5wdXRTdHJpbmcoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfTkFNRSwgZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIG1lbWVudG8ucHV0U3RyaW5nKElXb3JrYmVuY2hDb25zdGFudHMuVEFHX0VESVRfUEFHRV9JRCwgZ2V0SWQoKSk7Ci0gICAgICAgICAgICBtZW1lbnRvLnB1dFN0cmluZyhUQUdfVFlQRV9JRCx0eXBlSWQpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKElBZGFwdGFibGVbXSBuZXdFbGVtZW50cykgewotICAgICAgICBpbnRlcm5hbFNldEVsZW1lbnRzKG5ld0VsZW1lbnRzKTsKLSAgICAgICAgZmlyZVdvcmtpbmdTZXRDaGFuZ2VkKElXb3JraW5nU2V0TWFuYWdlci5DSEFOR0VfV09SS0lOR19TRVRfQ09OVEVOVF9DSEFOR0UsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGVsZW1lbnRzIHRvIHN0b3JlIGluIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIHRvIHN0b3JlIGEgY29weSBvZiBpbiB0aGUgCi0gICAgICogCXJlY2VpdmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbFNldEVsZW1lbnRzKElBZGFwdGFibGVbXSBuZXdFbGVtZW50cykgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKG5ld0VsZW1lbnRzLAotICAgICAgICAgICAgICAgICJXb3JraW5nIHNldCBlbGVtZW50cyBhcnJheSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QobmV3RWxlbWVudHMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZWxlbWVudHMuYWRkKG5ld0VsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLS8vCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgcGFnZUlkKSB7Ci0gICAgICAgIGVkaXRQYWdlSWQgPSBwYWdlSWQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwobmV3TmFtZSwgIldvcmtpbmcgc2V0IG5hbWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBuYW1lID0gbmV3TmFtZTsKLSAgICAgICAgZmlyZVdvcmtpbmdTZXRDaGFuZ2VkKElXb3JraW5nU2V0TWFuYWdlci5DSEFOR0VfV09SS0lOR19TRVRfTkFNRV9DSEFOR0UsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KElXb3JraW5nU2V0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCUFzc2VydC5pc1RydWUodGhpcy5tYW5hZ2VyID09IG51bGwsICJBIHdvcmtpbmcgc2V0IGNhbiBvbmx5IGJlIGNvbm5lY3RlZCB0byBvbmUgbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0gICAgCXRoaXMubWFuYWdlcj0gbWFuYWdlcjsKLSAgICB9Ci0gICAgCi0gICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotICAgIAl0aGlzLm1hbmFnZXI9IG51bGw7Ci0JCQotICAgICAgfQotICAKLSAgCi0JcHJpdmF0ZSB2b2lkIGZpcmVXb3JraW5nU2V0Q2hhbmdlZChTdHJpbmcgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSkgewotICAgIAlBYnN0cmFjdFdvcmtpbmdTZXRNYW5hZ2VyIHJlY2VpdmVyPSBtYW5hZ2VyICE9IG51bGwKLQkJCT8gKEFic3RyYWN0V29ya2luZ1NldE1hbmFnZXIpbWFuYWdlcgotCQkJOiAoQWJzdHJhY3RXb3JraW5nU2V0TWFuYWdlcilXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCk7Ci0JCXJlY2VpdmVyLndvcmtpbmdTZXRDaGFuZ2VkKHRoaXMsIHByb3BlcnR5LCBvbGRWYWx1ZSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIAotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2UoKSB7Ci0gICAgCUNvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeSByZWdpc3RyeSA9IENvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJCi0JCWRlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXRXb3JraW5nU2V0RGVzY3JpcHRvcihnZXRJZCgpLCB0eXBlSWQpOwotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvci5nZXRJY29uKCk7Ci0JIAkgICAgCi0gICAgfQotCSAKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0JCi0KLQotCQotCi0JcHVibGljIGJvb2xlYW4gdGVzdEF0dHJpYnV0ZShPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChDT01QT05FTlRfVFlQRV9JRC5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gZ2V0VHlwZUlkKCkuZXF1YWxzKHZhbHVlKTsKLQkJaWYgKEVESVRfUEFHRV9JRC5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gZ2V0SWQoKS5lcXVhbHModmFsdWUpOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCQkKLQl9Ci0KLQkKLQkKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Q0OGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciB7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTEFCRUwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX01PRFVMRV9UWVBFID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JcHJpdmF0ZSBTdHJpbmcgaWQgOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsIDsKLQlwcml2YXRlIFN0cmluZyBpY29uOwotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCQotCS8qKgotCSAqIEBwYXJhbSBhbkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWdFbGVtZW50KSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uewotCQlzdXBlcigpOwotCQljb25maWdFbGVtZW50ID0gYUNvbmZpZ0VsZW1lbnQ7Ci0JCWluaXQoKTsKLQl9Ci0KLQl2b2lkIGluaXQoKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQkJbGFiZWwgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTEFCRUwpOwotCQlpZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCXR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9NT0RVTEVfVFlQRSk7Ci0JCWljb24gPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUNPTik7Ci0JCQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgV29ya2JlbmNoRXhjZXB0aW9uKCJNaXNzaW5nIGF0dHJpYnV0ZTogIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJQVRUX0lEICsgIiBpbiBjb21tb24gd29ya2luZyBzZXQgZXh0ZW5zaW9uOiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29uZmlnRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOwotCQl9Ci0KLQkJaWYgKGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IFdvcmtiZW5jaEV4Y2VwdGlvbigiTWlzc2luZyBhdHRyaWJ1dGU6ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCUFUVF9MQUJFTCArICIgaW4gY29tbW9uIHdvcmtpbmcgc2V0IGV4dGVuc2lvbjogIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsKLQkJfQotCi0JCWlmICh0eXBlSWQgPT0gbnVsbCB8fCB0eXBlSWQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IFdvcmtiZW5jaEV4Y2VwdGlvbigiTWlzc2luZyBhdHRyaWJ1dGU6ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCUFUVF9NT0RVTEVfVFlQRSArICIgaW4gY29tbW9uIHdvcmtpbmcgc2V0IGV4dGVuc2lvbjogIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gdHlwZUlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIHBhZ2UncyBpY29uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGFnZSdzIGljb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEljb24oKSB7Ci0gICAgICAgIGlmIChpY29uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0gICAgICAgIFN0cmluZyBleHRlbmRpbmdQbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihleHRlbmRpbmdQbHVnaW5JZCwKLSAgICAgICAgICAgICAgICBpY29uKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbgotCSAqIAotCSAqLwotLy8JcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLS8vCSAgICAJQnVuZGxlIGJ1bmRsZT0gUGxhdGZvcm0uZ2V0QnVuZGxlKGNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkpOwotLy8JICAgIAlpZiAoIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUgKQotLy8JICAgIAkJYnVuZGxlLnN0YXJ0KCk7Ci0vLwkgICAgCQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3dvcmtpbmdzZXRzL0NvbXBvbmVudFdvcmtpbmdTZXRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlOTFhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFdvcmtpbmdTZXRGYWN0b3J5IGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRXb3JraW5nU2V0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgSUFkYXB0YWJsZSBjcmVhdGVFbGVtZW50KElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgU3RyaW5nIHdvcmtpbmdTZXROYW1lID0gbWVtZW50by5nZXRTdHJpbmcoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfTkFNRSk7Ci0gICAgICAgIFN0cmluZyB0eXBlSWQgPSBtZW1lbnRvLmdldFN0cmluZyhDb21wb25lbnRXb3JraW5nU2V0LlRBR19UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIHdvcmtpbmdTZXRFZGl0UGFnZUlkID0gbWVtZW50bwotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfRURJVF9QQUdFX0lEKTsKLQotICAgICAgICBpZiAod29ya2luZ1NldE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIENvbXBvbmVudFdvcmtpbmdTZXQgd29ya2luZ1NldCA9IG5ldyBDb21wb25lbnRXb3JraW5nU2V0KHdvcmtpbmdTZXROYW1lLCB0eXBlSWQsIG1lbWVudG8pOwotICAgICAgICBpZiAod29ya2luZ1NldEVkaXRQYWdlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgd29ya2luZ1NldC5zZXRJZCh3b3JraW5nU2V0RWRpdFBhZ2VJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB3b3JraW5nIHNldHMgY3JlYXRlZCB3aXRoIGJ1aWxkcyAyMDAyMDQxOCBhbmQgMjAwMjA0MTkgd2lsbCBub3QKLSAgICAgICAgICAgIC8vIGhhdmUgYW4gZWRpdCBwYWdlIGlkLiBmaXggdGhpcyBhdXRvbWF0aWNhbGx5LgotICAgICAgICAgICAgd29ya2luZ1NldC5zZXRJZChDb21wb25lbnRXb3JraW5nU2V0LkNPTVBPTkVOVF9XT1JLSU5HX1NFVF9JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd29ya2luZ1NldDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlYTgwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC53b3JraW5nc2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5JQ29tbW9uV29ya2luZ1NldFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRXb3JraW5nU2V0UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tbW9uV29ya2luZ1NldFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeSBDT01QT05FTlRfV09SS0lOR19TRVRfUkVHSVNUUlkgPSBDb21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlib29sZWFuIGJJbml0aWFsaXplZCA9IGZhbHNlOwotCUxpc3Qgd29ya2luZ1NldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbXBvbmVudFdvcmtpbmdTZXRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5JV29ya2luZ1NldFByb3ZpZGVyI2dldFdvcmtpbmdTZXRzKCkKLQkgKi8KLQlwdWJsaWMgSVdvcmtpbmdTZXRbXSBnZXRXb3JraW5nU2V0cygpIHsKLQkJaWYgKCFiSW5pdGlhbGl6ZWQpIHsKLQkJICAgIC8vd29ya2luZ1NldHMuY2xlYXIoKTsKLQkJCXN5bmNocm9uaXplZCAod29ya2luZ1NldHMpIHsKLQkJCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvcltdIHNldCA9IENPTVBPTkVOVF9XT1JLSU5HX1NFVF9SRUdJU1RSWS5nZXRDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvcnMoKTsKLQkJCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJCQlJV29ya2luZ1NldCB3b3JraW5nU2V0ID0gbnVsbDsKLQkJCQlmb3IgKGludCB4PTA7IHg8c2V0Lmxlbmd0aDsrKyB4KSB7Ci0JCQkJCWRlc2NyaXB0b3IgPSBzZXRbeF07Ci0JCQkJCXdvcmtpbmdTZXQ9ICBuZXcgQ29tcG9uZW50V29ya2luZ1NldChkZXNjcmlwdG9yKTsgCi0JCQkJCXdvcmtpbmdTZXRzLmFkZCh3b3JraW5nU2V0KTsKLQkJCQkJYkluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCQl9CQotCQkJfQotCQl9Ci0JCQotCQlJV29ya2luZ1NldFtdIHdzID0gbmV3IElXb3JraW5nU2V0W3dvcmtpbmdTZXRzLnNpemUoKV07Ci0JCXJldHVybiAoSVdvcmtpbmdTZXRbXSl3b3JraW5nU2V0cy50b0FycmF5KHdzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5JV29ya2luZ1NldFByb3ZpZGVyI2luaXQob3JnLmVjbGlwc2UuanN0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudWkud29ya2luZ3NldHMuV29ya2luZ1NldE1vZGVsKQotCSAqLwotLy8JcHVibGljIHZvaWQgaW5pdChXb3JraW5nU2V0TW9kZWwgd29ya2luZ1NldE1vZGVsKSB7Ci0vLwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0vLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljMmEyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIzLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwud29ya2luZ3NldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLkoyRUVOYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5Xb3JrYmVuY2hOYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZXh0ZW5zaW9ucy5SZWdpc3RyeVJlYWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fREVTQ1JJUFRPUlMgPSBuZXcgU3RyaW5nWzBdOwotCXByaXZhdGUgTGlzdCBjb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJbmV3IENvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCXN5bmNocm9uaXplZCAoSU5TVEFOQ0UpIHsKLQkJCWlmICghaXNJbml0aWFsaXplZCkgewotCQkJCUlOU1RBTkNFLmluaXQoKTsKLQkJCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhRGVzYwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcihDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBhRGVzYykgewotCQlpZiAoYURlc2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3luY2hyb25pemVkIChjb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMpIHsKLQkJCWJvb2xlYW4gYlZhbHVlID0gY29tbW9uV29ya2luZ1NldERlc2NyaXB0b3JzLmNvbnRhaW5zKGFEZXNjKTsKLQkJCWlmIChiVmFsdWUgPT0gZmFsc2UpIHsKLQkJCQljb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMuYWRkKGFEZXNjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3JbXSBnZXRDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvcnMoKSB7Ci0JCUNvbXBvbmVudFdvcmtpbmdTZXREZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3JbY29tbW9uV29ya2luZ1NldERlc2NyaXB0b3JzLnNpemUoKV07Ci0JCXJldHVybiAoQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3JbXSljb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMudG9BcnJheShkZXNjcmlwdG9ycyk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0lkKFN0cmluZyBpZCkgewotCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJZm9yIChpbnQgeD0wOyB4PCBjb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMuc2l6ZSgpOyArK3gpIHsKLQkJCWRlc2NyaXB0b3IgPSAoQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3IpY29tbW9uV29ya2luZ1NldERlc2NyaXB0b3JzLmdldCh4KTsKLQkJCWlmIChkZXNjcmlwdG9yLmdldElkKCkuZXF1YWxzKGlkKSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQljbGFzcyBDb21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9XT1JLSU5HX1NFVCA9ICJjb21wb25lbnRXb3JraW5nU2V0IjsgLy8kTk9OLU5MUy0xJAotCi0KLQkJQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5UmVhZGVyKCkgewotCQkJc3VwZXIoSjJFRU5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIENPTVBPTkVOVF9XT1JLSU5HX1NFVCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmV4dGVuc2lvbnMuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBhbkVsZW1lbnQpIHsKLQkJCWlmIChDT01QT05FTlRfV09SS0lOR19TRVQuZXF1YWxzKGFuRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYWRkQ29tbW9uV29ya2luZ1NldERlc2NyaXB0b3IobmV3IENvbXBvbmVudFdvcmtpbmdTZXREZXNjcmlwdG9yKGFuRWxlbWVudCkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotCQkJCQkvLwkgbG9nIGFuIGVycm9yIHNpbmNlIGl0cyBub3Qgc2FmZSB0byBvcGVuIGEgZGlhbG9nIGhlcmUKLQkJCQkJV29ya2JlbmNoTmF2aWdhdG9yUGx1Z2luLmxvZygiVW5hYmxlIHRvIGNyZWF0ZSBjb21tb24gd29ya2luZyBzZXQgZGVzY3JpcHRvci4iLCBlLmdldFN0YXR1cygpKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRQYWdlSWQKLQkgKiBAcGFyYW0gdHlwZUlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBnZXRXb3JraW5nU2V0RGVzY3JpcHRvcihTdHJpbmcgZWRpdFBhZ2VJZCwgU3RyaW5nIHR5cGVJZCkgewotCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZ2V0Q29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3JzKCk7Ci0JCUNvbXBvbmVudFdvcmtpbmdTZXREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlmb3IgKGludCB4PTA7IHg8IGRlc2NyaXB0b3JzLmxlbmd0aCA7ICsreCkgewotCQkJZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW3hdOwotCQkJaWYgKGRlc2NyaXB0b3IuZ2V0SWQoKS5lcXVhbHMoZWRpdFBhZ2VJZCkgCi0JCQkJCSYmIGRlc2NyaXB0b3IuZ2V0VHlwZUlkKCkuZXF1YWxzKHR5cGVJZCkpCi0JCQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldFVwZGF0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0VXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGI2OTVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0VXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXRVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRXb3JraW5nU2V0VXBkYXRlciBpbXBsZW1lbnRzIElXb3JraW5nU2V0VXBkYXRlciwKLQkJSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIvKiwgSVJlc291cmNlRGVsdGFWaXNpdG9yKi8gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkNvbXBvbmVudFdvcmtpbmdTZXRQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgTGlzdCBmV29ya2luZ1NldHM7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIHByb2plY3RTdHJ1Y3R1cmVFZGl0czsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFdvcmtpbmdTZXREZWx0YSB7Ci0JCXByaXZhdGUgSVdvcmtpbmdTZXQgZldvcmtpbmdTZXQ7Ci0JCXByaXZhdGUgTGlzdCBmRWxlbWVudHM7Ci0JCXByaXZhdGUgYm9vbGVhbiBmQ2hhbmdlZDsKLQkJcHVibGljIFdvcmtpbmdTZXREZWx0YShJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCQlmV29ya2luZ1NldD0gd29ya2luZ1NldDsKLQkJCWZFbGVtZW50cz0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKSkpOwotCQl9Ci0JCQotCQlwdWJsaWMgSVdvcmtpbmdTZXQgZ2V0V29ya2luZ1NldCgpIHsKLQkJCXJldHVybiBmV29ya2luZ1NldDsKLQkJfQotCQkKLQkJcHVibGljIGludCBpbmRleE9mKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZkVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZCggT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXN5bmNocm9uaXplZCAoZldvcmtpbmdTZXQpIHsKLQkJCQlpZiAoaW5kZXhPZihlbGVtZW50KSA9PS0xKSB7Ci0JCQkJCWZFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCWZDaGFuZ2VkPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQlpZiAoZkVsZW1lbnRzLnJlbW92ZShpbmRleCkgIT0gbnVsbCkgewotCQkJCWZDaGFuZ2VkPSB0cnVlOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0JCQlpZiAoZkNoYW5nZWQpIHsKLQkJCQlmV29ya2luZ1NldC5zZXRFbGVtZW50cygoSUFkYXB0YWJsZVtdKWZFbGVtZW50cy50b0FycmF5KG5ldyBJQWRhcHRhYmxlW2ZFbGVtZW50cy5zaXplKCldKSk7Ci0JCQl9Ci0JCX0KLQkgfQotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRXb3JraW5nU2V0VXBkYXRlcigpIHsKLQkJc3VwZXIoKTsKLQkJZldvcmtpbmdTZXRzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0VXBkYXRlciNhZGQob3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkKElXb3JraW5nU2V0IHdvcmtpbmdTZXQpIHsKLQkJLy9jaGVja0VsZW1lbnRFeGlzdGVuY2Uod29ya2luZ1NldCk7Ci0JCXN5bmNocm9uaXplZCAoZldvcmtpbmdTZXRzKSB7Ci0JCQkKLQkJCXVwZGF0ZUVsZW1lbnRzKHdvcmtpbmdTZXQpOwotCQkJZldvcmtpbmdTZXRzLmFkZCh3b3JraW5nU2V0KTsKLQkJfQotCi0JfQotCQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdHlwZUlkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc01vZHVsZVR5cGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJZCkgewotCQlib29sZWFuIGJSZXR1cm4gPSBmYWxzZTsKLQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc1Byb2plY3RPZlR5cGUocHJvamVjdCx0eXBlSWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBiUmV0dXJuOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0VXBkYXRlciNyZW1vdmUob3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKElXb3JraW5nU2V0IHdvcmtpbmdTZXQpIHsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCXN5bmNocm9uaXplZChmV29ya2luZ1NldHMpIHsKLQkJCXJlc3VsdD0gZldvcmtpbmdTZXRzLnJlbW92ZSh3b3JraW5nU2V0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0VXBkYXRlciNjb250YWlucyhvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCXN5bmNocm9uaXplZChmV29ya2luZ1NldHMpIHsKLQkJCXJldHVybiBmV29ya2luZ1NldHMuY29udGFpbnMod29ya2luZ1NldCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldFVwZGF0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3luY2hyb25pemVkKGZXb3JraW5nU2V0cykgewotCQkJZldvcmtpbmdTZXRzLmNsZWFyKCk7Ci0JCX0KLQkJZGlzcG9zZVN0cnVjdHVyZUVkaXRzKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkKLSAJICAgIElSZXNvdXJjZURlbHRhIGRlbHRhPSBldmVudC5nZXREZWx0YSgpOwotIAkgICAgaWYgKGRlbHRhID09IG51bGwpIHJldHVybjsKLQkJSVJlc291cmNlRGVsdGFbXSBhZmZlY3RlZENoaWxkcmVuPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLkFEREVEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQsIElSZXNvdXJjZS5QUk9KRUNUKTsKLQkJaWYgKGFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGE9IGFmZmVjdGVkQ2hpbGRyZW5baV07Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQotCQkJCUlXb3JraW5nU2V0W10gd29ya2luZ1NldHM7Ci0JCQkJc3luY2hyb25pemVkKGZXb3JraW5nU2V0cykgewotCQkJCQl3b3JraW5nU2V0cz0gKElXb3JraW5nU2V0W10pZldvcmtpbmdTZXRzLnRvQXJyYXkobmV3IElXb3JraW5nU2V0W2ZXb3JraW5nU2V0cy5zaXplKCldKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgdz0gMDsgdyA8IHdvcmtpbmdTZXRzLmxlbmd0aDsgdysrKSB7Ci0JCQkJCVdvcmtpbmdTZXREZWx0YSB3b3JraW5nU2V0RGVsdGE9IG5ldyBXb3JraW5nU2V0RGVsdGEod29ya2luZ1NldHNbd10pOwotCQkJCQlwcm9jZXNzUmVzb3VyY2VEZWx0YSh3b3JraW5nU2V0RGVsdGEscHJvamVjdERlbHRhLCBwcm9qZWN0KTsKLQkJCQkJd29ya2luZ1NldERlbHRhLnByb2Nlc3MoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Jlc291cmNlRGVsdGEoV29ya2luZ1NldERlbHRhIHJlc3VsdCwgSVJlc291cmNlRGVsdGEgYURlbHRhLCBJUHJvamVjdCBhUHJvamVjdCkgewotCQkvL0lSZXNvdXJjZSByZXNvdXJjZT0gYURlbHRhLmdldFJlc291cmNlKCk7Ci0JCQotCQlpbnQgaW5kZXg9IHJlc3VsdC5pbmRleE9mKGFQcm9qZWN0KTsKLQkJaW50IGtpbmQ9IGFEZWx0YS5nZXRLaW5kKCk7Ci0JCWludCBmbGFncz0gYURlbHRhLmdldEZsYWdzKCk7Ci0JCQotCQkKLQkJc3dpdGNoIChhRGVsdGEuZ2V0S2luZCgpKSB7Ci0JCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJIGlmIChpbmRleCAhPSAtMSkgewotCQkJCSAJcmVzdWx0LnJlbW92ZShpbmRleCkgOwotCQkJCSB9Ci0JCQkJIGRpc3Bvc2VTdHJ1Y3R1cmVFZGl0cyhhUHJvamVjdCk7Ci0JCQkJIGJyZWFrOwotCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDogewotCQkJCSBDb21wb25lbnRXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSAoQ29tcG9uZW50V29ya2luZ1NldCkgcmVzdWx0LmdldFdvcmtpbmdTZXQoKTsKLQkJCQkgaWYgKGNvbnRhaW5zTW9kdWxlVHlwZShhUHJvamVjdCx3b3JraW5nU2V0LmdldFR5cGVJZCgpKSkgewotCQkJCSAJaWYgKGluZGV4ID09IC0xKQotCQkJCSAJCXJlc3VsdC5hZGQoYVByb2plY3QpOwotCQkJCSB9Ci0JCQkJIGJyZWFrOwotCQl9Ci0JCQotCQkKLQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCS8vIGJvb2xlYW4gbmF0dXJlTWF5SGF2ZUNoYW5nZWQgPSAoKGFEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pICE9IDApICYmICgoYURlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSA9PSAwKTsKLQkJCWJvb2xlYW4gcHJvamVjdE9wZW5TdGF0ZUNoYW5nZWQgPSAoKGFEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCk7Ci0JCQlpZiAoLypuYXR1cmVNYXlIYXZlQ2hhbmdlZCB8fCovIHByb2plY3RPcGVuU3RhdGVDaGFuZ2VkKSB7Ci0JCQkJaWYgKGFQcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCUNvbXBvbmVudFdvcmtpbmdTZXQgd29ya2luZ1NldCA9IChDb21wb25lbnRXb3JraW5nU2V0KSByZXN1bHQuZ2V0V29ya2luZ1NldCgpOwotCQkJCQkgaWYgKGNvbnRhaW5zTW9kdWxlVHlwZShhUHJvamVjdCx3b3JraW5nU2V0LmdldFR5cGVJZCgpKSkgewotCQkJCQkJcmVzdWx0LmFkZChhUHJvamVjdCk7Ci0JCQkJCSB9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCSAJcmVzdWx0LnJlbW92ZShpbmRleCkgOwotCQkJCQkgfQotCQkJCQlkaXNwb3NlU3RydWN0dXJlRWRpdHMoYVByb2plY3QpOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQkgQ29tcG9uZW50V29ya2luZ1NldCB3b3JraW5nU2V0ID0gKENvbXBvbmVudFdvcmtpbmdTZXQpIHJlc3VsdC5nZXRXb3JraW5nU2V0KCk7Ci0JCQkJIGlmIChjb250YWluc01vZHVsZVR5cGUoYVByb2plY3Qsd29ya2luZ1NldC5nZXRUeXBlSWQoKSkpIHsKLQkJCQkgCWlmIChpbmRleCA9PSAtMSkKLQkJCQkgCQlyZXN1bHQuYWRkKGFQcm9qZWN0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkgCWlmIChpbmRleCAhPSAtMSkgewotCQkJCSAJCXJlc3VsdC5yZW1vdmUoaW5kZXgpIDsKLQkJCQkgCX0KLQkJCQkgfQotCQkJCSBicmVhazsJCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVFbGVtZW50cyhJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCWlmICh3b3JraW5nU2V0IGluc3RhbmNlb2YgQ29tcG9uZW50V29ya2luZ1NldCkgewotCQkJQ29tcG9uZW50V29ya2luZ1NldCBjb21wb25lbnRXb3JraW5nU2V0ID0gKENvbXBvbmVudFdvcmtpbmdTZXQpIHdvcmtpbmdTZXQ7Ci0JCQlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChjb250YWluc01vZHVsZVR5cGUocHJvamVjdHNbaV0sY29tcG9uZW50V29ya2luZ1NldC5nZXRUeXBlSWQoKSkpIHsKLQkJCQkJCXJlc3VsdC5hZGQocHJvamVjdHNbaV0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJfQotCQkJY29tcG9uZW50V29ya2luZ1NldC5zZXRFbGVtZW50cygoSUFkYXB0YWJsZVtdKXJlc3VsdC50b0FycmF5KG5ldyBJQWRhcHRhYmxlW3Jlc3VsdC5zaXplKCldKSk7Ci0JCX0KLQl9Ci0KLQkKLQkgcHJpdmF0ZSB2b2lkIGRpc3Bvc2VTdHJ1Y3R1cmVFZGl0cygpIHsKLQkJCVNldCBrZXlzID0gZ2V0UHJvamVjdFN0cnVjdHVyZUVkaXRzKCkua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlQcm9qZWN0IHByb2ogPSAoSVByb2plY3QpIGl0ZXIubmV4dCgpOwotCQkJCVN0cnVjdHVyZUVkaXQgc2UgPShTdHJ1Y3R1cmVFZGl0KWdldFByb2plY3RTdHJ1Y3R1cmVFZGl0cygpLmdldChwcm9qKTsKLQkJCQlpZiAoc2UgIT0gbnVsbCkKLQkJCQkJc2UuZGlzcG9zZSgpOwotCQkJCQotCQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VTdHJ1Y3R1cmVFZGl0cyhJUHJvamVjdCBhUHJvamVjdCkgewotCQlTdHJ1Y3R1cmVFZGl0IHNlID0oU3RydWN0dXJlRWRpdClnZXRQcm9qZWN0U3RydWN0dXJlRWRpdHMoKS5nZXQoYVByb2plY3QpOwotCQlpZiAoc2UgIT0gbnVsbCkKLQkJCXNlLmRpc3Bvc2UoKTsKLQkJZ2V0UHJvamVjdFN0cnVjdHVyZUVkaXRzKCkucmVtb3ZlKGFQcm9qZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGdldFByb2plY3RTdHJ1Y3R1cmVFZGl0cygpIHsKLQkJaWYgKHByb2plY3RTdHJ1Y3R1cmVFZGl0cyAhPSBudWxsKSAKLQkJCXJldHVybiBwcm9qZWN0U3RydWN0dXJlRWRpdHM7Ci0JCSAKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJICAgaWYgKHByb2plY3RTdHJ1Y3R1cmVFZGl0cyA9PSBudWxsKQotCQkJIHByb2plY3RTdHJ1Y3R1cmVFZGl0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RTdHJ1Y3R1cmVFZGl0czsKLQkJCi0JfQotCQotCXB1YmxpYyBTdHJ1Y3R1cmVFZGl0IGdldFN0cnVjdHVyZUVkaXQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJaWYgKGdldFByb2plY3RTdHJ1Y3R1cmVFZGl0cygpLmdldChhUHJvamVjdCkgPT0gbnVsbCkKLQkJCWdldFByb2plY3RTdHJ1Y3R1cmVFZGl0cygpLnB1dChhUHJvamVjdCxTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGFQcm9qZWN0KSk7Ci0JCXJldHVybiAoU3RydWN0dXJlRWRpdClnZXRQcm9qZWN0U3RydWN0dXJlRWRpdHMoKS5nZXQoYVByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMGJkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBsdWdpbi5uYW1lPUoyRUUgRXh0ZW5zaW9ucyB0byBDb21tb24gTmF2aWdhdG9yCi1QbHVnaW4ucHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1QbHVnaW4uZGVzY3JpcHRpb249Q29udGFpbnMgSjJFRSBFeHRlbnNpb25zIGJ1aWx0IG9uIHRoZSBDb21tb24gTmF2aWdhdG9yIEZyYW1ld29yawotajJlZT1KMkVFCi1qMmVlLnZpZXdfdWlfPVByb2plY3QgRXhwbG9yZXIgCi1qMmVlLmNhdGVnb3J5X3VpXz1KMkVFCi1FbnRlcnByaXNlX0FwcGxpY2F0aW9ucz1FbnRlcnByaXNlIEFwcGxpY2F0aW9ucwotQXBwbGljYXRpb25fQ2xpZW50X1Byb2plY3RzPUFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0cwotQ29ubmVjdG9yX1Byb2plY3RzPUNvbm5lY3RvciBQcm9qZWN0cwotRUpCX1Byb2plY3RzPUVKQiBQcm9qZWN0cwotV2ViX1Byb2plY3RzPUR5bmFtaWMgV2ViIFByb2plY3RzCi1PdGhlcl9Qcm9qZWN0cz1PdGhlciBQcm9qZWN0cwotSjJFRV9BZGRfTW9kdWxlPUoyRUUgQWRkIE1vZHVsZQotQWRkc19KMkVFX21vZHVsZXNfdG9fRUFSX3Byb2plY3RzPUFkZHMgSjJFRSBtb2R1bGVzIHRvIEVBUiBwcm9qZWN0cwotSjJFRV9BZGRfVXRpbGl0eV9KYXI9SjJFRSBBZGQgVXRpbGl0eSBKYXIKLUFkZHNfVXRpbGl0eV9KYXJzX3RvX0VBUl9wcm9qZWN0cz1BZGRzIFV0aWxpdHkgSmFycyB0byBFQVIgcHJvamVjdHMKLUoyRUVfVXRpbGl0eV9KYXJfSW1wb3J0PUoyRUUgVXRpbGl0eSBKYXIgSW1wb3J0Ci1JbXBvcnRfYV9qYXJfZmlsZV9VSV89SW1wb3J0IGEgamFyIGZpbGUgaW50byBhbiBFQVIgcHJvamVjdCBhcyBhIEoyRUUgVXRpbGl0eSBKYXIKLUoyRUVfSW1wb3J0PUoyRUUgSW1wb3J0Ci1KMkVFX0lNUE9SVF9NRVNTQUdFPUltcG9ydHMgSjJFRSBhcnRpZmFjdHM6IEVBUnMsIEVKQiBKYXJzLCBBcHBsaWNhdGlvbiBDbGllbnQgSmFycywgUkFScyBhbmQgV0FScwotCi0KLWV4dGVuc2lvbi5qMmVlLm5hbWU9SjJFRSBEZXBsb3ltZW50IERlc2NyaXB0b3JzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMTMzMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzMDQ1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogV1RQIEoyRUUgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogLiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi51aSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsaWVudC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXIuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubGlzdGVuZXJzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBlcnNwZWN0aXZlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlciwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5qZHQudWksCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2Uud3N0LndlYiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuZGVidWcudWksCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5hbm5vdGF0aW9uLm1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjNjA0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IGoyZWVfdWkvLFwKLSAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zLzIwX2NtcGJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvMjBfY21wYmVhbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNmZThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvMjBfY21wYmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hZG93bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fkb3duLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlNzA4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fkb3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2ODQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fycm93X2Rvd24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hcnJvd19kb3duLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0NTVjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fycm93X2Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hcnJvd3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hcnJvd3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTA2MzIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYXJyb3dwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY2FzY2FkZV9sZWZ0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY2FzY2FkZV9sZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4ZTc2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nhc2NhZGVfbGVmdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nhc2NhZGVfbGVmdDIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jYXNjYWRlX2xlZnQyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzMTA1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nhc2NhZGVfbGVmdDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jYXNjYWRlX3JpZ2h0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY2FzY2FkZV9yaWdodC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2I2MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jYXNjYWRlX3JpZ2h0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY21wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY21wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlZDFmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2NtcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkM2FmM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9kZWFkZW5kLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZGVhZGVuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjYxOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9kZWFkZW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyLXdpei1iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXItd2l6LWJhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWU3NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXItd2l6LWJhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhci13aXotaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhci13aXotaWNvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDA5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXItd2l6LWljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJmYTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlYjNlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhcmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYWRiM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lamJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFiMjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2VqYl9jbGllbnRfcmVtb3ZlX2FjdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODIzMjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiODk0NWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2NsY2wxNi9lamJfZGVwbG95X2FjdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2V4cG9ydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4MzMwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2NjdmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9lamJjbGllbnRqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2VqYmNsaWVudGphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTY1ZTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2VqYmNsaWVudGphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3MGIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZDQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZiM2Q0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkODU5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTIwMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWpiamFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lamJqYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0YjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lamJqYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMjVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmMwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U4NmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVjNmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDA5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2RhMjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhYzZiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3JlX2V4ZWN1dGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvcmVfZXhlY3V0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTQzYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvcmVfZXhlY3V0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9qMmVlX3BlcnNwZWN0aXZlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfcGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFjZDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWNkNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9kbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2VqYl9jbGllbnRfcmVtb3ZlX2FjdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhhMGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9kbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NTczODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2RsY2wxNi9lamJfZGVwbG95X2FjdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzEzX2Vhcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzEzX2Vhcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI5YjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8xM19lYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8yMV9jbXBiZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMjFfY21wYmVhbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTgzNWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8yMV9jbXBiZWFuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMjFfZWpiX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMjFfZWpiX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3M2JhNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzIxX2VqYl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzIxX2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzIxX2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGFlMDUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8yMV9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYW5ub3RhdGlvbl9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWMxZDJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzE0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ4MzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNF9kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNF9kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQwOGFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTRfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9leHR3ZWJzZXJ2aWNlaXRlbXByb3ZpZGVyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXh0d2Vic2VydmljZWl0ZW1wcm92aWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNjNmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9leHR3ZWJzZXJ2aWNlaXRlbXByb3ZpZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE3NTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsX2hvbWVfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkNjA5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2ZmViZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcmVtb3RlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzZTM5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcmVtb3RlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L3NlcnZpY2VfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0NjY2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViU2VydmljZUl0ZW1Qcm92aWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViU2VydmljZXNGb2xkZXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlc0ZvbGRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjMwMzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlc0ZvbGRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF8xNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwXzE0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmOTE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwXzE0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvYW5ub3RhdGlvbl9iZWFuX292ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Fubm90YXRpb25fYmVhbl9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3Nzc1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvYW5ub3RhdGlvbl9iZWFuX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Fubm90YXRpb25fcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzFkMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Fubm90YXRpb25fcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYxY2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTc3YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Nvbm5lY3Rvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Rpc19hbm5vdGF0aW9uX2JlYW5fb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZGlzX2Fubm90YXRpb25fYmVhbl9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFjNDk4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZGlzX2Fubm90YXRpb25fYmVhbl9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZWpiX21vZHVsZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUwZDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZW50ZXJwcmlzZV9hcHBfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzE5YzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2V4dGVybmFsV2ViU2VydmljZU92ZXJsYXlfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9leHRlcm5hbFdlYlNlcnZpY2VPdmVybGF5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZmY0MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2V4dGVybmFsV2ViU2VydmljZU92ZXJsYXlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODM4MGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE3NTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2tleV9pbnRlcmZfb3YuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2tleV9pbnRlcmZfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDcwNDQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9rZXlfaW50ZXJmX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzgyNzM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQ2MDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2xvY2FsX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaW50ZXJmYWNlX292ZXJsYXlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlMTY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaW50ZXJmYWNlX292ZXJsYXlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2ZmViZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvcmVtb3RlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvcmVtb3RlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YzljYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9yZW1vdGVfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2UzOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmljZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YwNjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQ2NjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTk2MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkX21lc3NfZGVzdF93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkX21lc3NfZGVzdF93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NDFjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF9tZXNzX2Rlc3Rfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF93ZWJfc2VydmljZV9oYW5kbGVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF93ZWJfc2VydmljZV9oYW5kbGVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmE5OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRfd2ViX3NlcnZpY2VfaGFuZGxlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRhdXRob3JpdHljb250cmFpbnRzX3dpel8uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRhdXRob3JpdHljb250cmFpbnRzX3dpel8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWMwZmZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkYXV0aG9yaXR5Y29udHJhaW50c193aXpfLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkY21wZmlsZWRfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGNtcGZpbGVkX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzkzMjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkY21wZmlsZWRfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGNvbnRleHRwYXJhbWV0ZXJfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGNvbnRleHRwYXJhbWV0ZXJfd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTdlMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRjb250ZXh0cGFyYW1ldGVyX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRlbnZpcmVudHJ5X3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRlbnZpcmVudHJ5X3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTNhYjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZW52aXJlbnRyeV93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXJyb3Jjb2RlZXJyb3Jfd2l6X2Jhbi5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXJyb3Jjb2RlZXJyb3Jfd2l6X2Jhbi5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViOWVmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGVycm9yY29kZWVycm9yX3dpel9iYW4uZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGV4Y2VwdGlvbmVycm9ycGFnZV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXhjZXB0aW9uZXJyb3JwYWdlX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTJkMmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXhjZXB0aW9uZXJyb3JwYWdlX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRmaWx0ZXJtYXBwaW5nX3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRmaWx0ZXJtYXBwaW5nX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUzMDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZmlsdGVybWFwcGluZ193aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkaGFuZGxlcnNvYXBoZWFkZXJfd2l6X2JhLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkaGFuZGxlcnNvYXBoZWFkZXJfd2l6X2JhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5YzNlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGhhbmRsZXJzb2FwaGVhZGVyX3dpel9iYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGpzcHByb3Bncm9wdV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkanNwcHJvcGdyb3B1X3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjRmZTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkanNwcHJvcGdyb3B1X3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRsb2NlbmNvZGluZ21hcF93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkbG9jZW5jb2RpbmdtYXBfd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTNlMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRsb2NlbmNvZGluZ21hcF93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkbWltZW1hcHBpbmdfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZG1pbWVtYXBwaW5nX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjg1NmE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkbWltZW1hcHBpbmdfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHNlcnZsZXRtYXBwaW5nX3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRzZXJ2bGV0bWFwcGluZ193aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyMGM1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHNlcnZsZXRtYXBwaW5nX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR0YWdsaWJyZWZfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHRhZ2xpYnJlZl93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzOGI1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHRhZ2xpYnJlZl93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2ViU2VjdXJpdHljb250cmFpbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2ViU2VjdXJpdHljb250cmFpbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5N2Q4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlYlNlY3VyaXR5Y29udHJhaW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlYnJlc2NvbGxlY3Rpb25fd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlYnJlc2NvbGxlY3Rpb25fd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmU2ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR3ZWJyZXNjb2xsZWN0aW9uX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR3ZWJzZWN1cml0eXJvbGVyZWZfd2l6X2IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR3ZWJzZWN1cml0eXJvbGVyZWZfd2l6X2IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWI0YjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2Vic2VjdXJpdHlyb2xlcmVmX3dpel9iLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2VsY29tZXBhZ2Vfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlbGNvbWVwYWdlX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY1MGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2VsY29tZXBhZ2Vfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkN2ZhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0aW9uX21pZ3JhdGlvbl93aXphcmRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdGlvbl9taWdyYXRpb25fd2l6YXJkX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZWNiYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0aW9uX21pZ3JhdGlvbl93aXphcmRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzFmOGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZTc2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJjbGllbnRqYXJfd2l6YmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZWpiY2xpZW50amFyX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWRhNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJjbGllbnRqYXJfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZWpicHJvamVjdF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmFhMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE1Mzk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyN2ZhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2VqYmphcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2E3OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ3ZjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1MTI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MWEzMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9jbGFzc19maWxlX3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfY2xhc3NfZmlsZV93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiMWUzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9jbGFzc19maWxlX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3NTRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjM1MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlkZmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0Mjc0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW5pdF9wYXJhbV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW5pdF9wYXJhbV93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiNmRmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2luaXRfcGFyYW1fd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL21kYl8yXzFfam1zX2NyZWF0aW9uX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL21kYl8yXzFfam1zX2NyZWF0aW9uX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjFkNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9tZGJfMl8xX2ptc19jcmVhdGlvbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9tZGJfMl8xX25vbl9qbXNfY3JlYXRpb25fd2kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9tZGJfMl8xX25vbl9qbXNfY3JlYXRpb25fd2kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWIxZDVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vbWRiXzJfMV9ub25fam1zX2NyZWF0aW9uX3dpLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3c2VydmxldF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdzZXJ2bGV0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0N2U1N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdzZXJ2bGV0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3ZlcnNpb25taWdyYXRlM193aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi92ZXJzaW9ubWlncmF0ZTNfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3MmJmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3ZlcnNpb25taWdyYXRlM193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjRlMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vd2ViX2xpYnJhcnlfcHJvamVjdF93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vd2ViX2xpYnJhcnlfcHJvamVjdF93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YTQxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYl9saWJyYXJ5X3Byb2plY3Rfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2phcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9qYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMTVkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2phcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9qY3Vfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvamN1X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTczYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9qY3Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMva2V5X2ludGVyZl9vdi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2tleV9pbnRlcmZfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDcwNDQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMva2V5X2ludGVyZl9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2xlZnRfYXJyb3cuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9sZWZ0X2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjMzgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2xlZnRfYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9yaWdodF9hcnJvdy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3JpZ2h0X2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzZTM1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3JpZ2h0X2Fycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2VydmxldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3NlcnZsZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFiZWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2VydmxldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2I4YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9zZXNzaW9uQmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9zaG93ZXJyX3Rzay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nob3dlcnJfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjNjA2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nob3dlcnJfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2hvd3dhcm5fdHNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2hvd3dhcm5fdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwMDllOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nob3d3YXJuX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc3J2Y2VfZWxlbV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRjYjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc3J2Y2VfZWxlbV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy91dGlsLXdpei1iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy91dGlsLXdpei1iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjkzYzlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvdXRpbC13aXotYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvdXRpbC13aXotaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3V0aWwtd2l6LWljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDM4YjIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvdXRpbC13aXotaWNvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGQzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy93ZWJzZXJ2aWNlZGVzYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvd3NkbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dzZGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vdWkvSmF2YUluc2VydGlvbk9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL3VpL0phdmFJbnNlcnRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzYjBkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vdWkvSmF2YUluc2VydGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24udWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uSmF2YUluc2VydGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEphdmFJbnNlcnRpb25PcGVyYXRpb24gaW1wbGVtZW50cyBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEphdmFJbnNlcnRpb25IZWxwZXIgaW5zZXJ0aW9uSGVscGVyOwotCXByb3RlY3RlZCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQ7Ci0JcHJvdGVjdGVkIElEb2N1bWVudCBkb2N1bWVudDsKLQlwcm90ZWN0ZWQgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKYXZhSW5zZXJ0aW9uT3BlcmF0aW9uKEphdmFJbnNlcnRpb25IZWxwZXIgaW5zZXJ0aW9uSGVscGVyLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQsIElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmluc2VydGlvbkhlbHBlciA9IGluc2VydGlvbkhlbHBlcjsKLQkJdGhpcy5lZGl0b3JJbnB1dCA9IGVkaXRvcklucHV0OwotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCXRoaXMudGV4dFNlbGVjdGlvbiA9IHRleHRTZWxlY3Rpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yQXJnKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yQXJnOwotCQlpbnNlcnRDb2RlU25pcHBldCgpOwotCQlwcm9jZXNzSmF2YUhlbHBlcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRDb2RlU25pcHBldCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nID0gaW5zZXJ0aW9uSGVscGVyLmdldEluc2VydGlvblN0cmluZygpOwotCQlpZiAocmVwbGFjZW1lbnRTdHJpbmcgPT0gbnVsbCB8fCByZXBsYWNlbWVudFN0cmluZy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAodGV4dFNlbGVjdGlvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIHRleHQgc2VsZWN0aW9uIGZvciBpbnNlcnRpbmcgdGV4dC4iKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpLCByZXBsYWNlbWVudFN0cmluZyk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JCWludCBzdGFydCA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCk7Ci0JCWludCBsaW5lcyA9IGRvY3VtZW50LmNvbXB1dGVOdW1iZXJPZkxpbmVzKHJlcGxhY2VtZW50U3RyaW5nKSArIDE7Ci0JCWZvcm1hdChkb2N1bWVudCwgc3RhcnQsIGxpbmVzLCAwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUhlbHBlcigpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFVSS5nZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRXb3JraW5nQ29weShlZGl0b3JJbnB1dCk7Ci0JCWlmIChjdSAhPSBudWxsKSB7Ci0JCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdHlwZSA9IGN1LmdldFR5cGVzKClbMF07Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGluc2VydGlvbkhlbHBlci5oYXNGaWVsZHMoKSkKLQkJCQkJY3JlYXRlRmllbGRzKHR5cGUsIGluc2VydGlvbkhlbHBlci5nZXRGaWVsZHMoKSk7Ci0JCQkJaWYgKGluc2VydGlvbkhlbHBlci5oYXNNZXRob2RzKCkpCi0JCQkJCWNyZWF0ZU1ldGhvZHModHlwZSwgaW5zZXJ0aW9uSGVscGVyLmdldE1ldGhvZHMoKSk7Ci0JCQkJaWYgKGluc2VydGlvbkhlbHBlci5oYXNJbXBvcnRzKCkpCi0JCQkJCWNyZWF0ZUltcG9ydHMoY3UsIGluc2VydGlvbkhlbHBlci5nZXRJbXBvcnRTdGF0ZW1lbnRzKCkpOwotCQkJCWV4ZWN1dGVFeHRlbmRlZE9wZXJhdGlvbnMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZUV4dGVuZGVkT3BlcmF0aW9ucygpIHsKLQkJTGlzdCBvcHMgPSBpbnNlcnRpb25IZWxwZXIuZ2V0RXh0ZW5kZWRPcGVyYXRpb25zKCk7Ci0JCWlmIChvcHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0JCQkJZXhlY3V0ZWRFeHRlbmRlZE9wZXJhdGlvbigoSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpIG9wcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlZEV4dGVuZGVkT3BlcmF0aW9uKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbikgewotCQl0cnkgewotCQkJb3BlcmF0aW9uLnJ1bihudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlsb2cubG9nKCJFeGVjdXRpbmcgZXh0ZW5kZWQgb3BlcmF0aW9uIGZhaWxlZDogICIgKyBvcGVyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQlsb2cubG9nKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRzKElUeXBlIGFUeXBlLCBMaXN0IGZpZWxkcykgewotCQlJRE9NRmllbGQgZmllbGQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQlmaWVsZCA9IChJRE9NRmllbGQpIGZpZWxkcy5nZXQoaSk7Ci0JCQlpZiAoIWFUeXBlLmdldEZpZWxkKGZpZWxkLmdldE5hbWUoKSkuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlhVHlwZS5jcmVhdGVGaWVsZChmb3JtYXQoZmllbGQuZ2V0Q29udGVudHMoKSwgMSwgdHJ1ZSksIG51bGwsIHRydWUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNZXRob2RzKElUeXBlIGFUeXBlLCBMaXN0IG1ldGhvZHMpIHsKLQkJSURPTU1ldGhvZCBtZXRob2Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKElET01NZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKCFhVHlwZS5nZXRNZXRob2QobWV0aG9kLmdldE5hbWUoKSwgZ2V0UGFyYW1hdGVyVHlwZVNpZ25hdHVyZXMobWV0aG9kKSkuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlhVHlwZS5jcmVhdGVNZXRob2QoZm9ybWF0KG1ldGhvZC5nZXRDb250ZW50cygpLCAxLCB0cnVlKSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUltcG9ydHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgTGlzdCBpbXBvcnRzKSB7Ci0JCVN0cmluZyBpbXBvcnRTdG10OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMuc2l6ZSgpOyBpKyspIHsKLQkJCWltcG9ydFN0bXQgPSAoU3RyaW5nKSBpbXBvcnRzLmdldChpKTsKLQkJCWlmICghY3UuZ2V0SW1wb3J0KGltcG9ydFN0bXQpLmV4aXN0cygpICYmICFpbXBvcnRTdG10LnN0YXJ0c1dpdGgoImphdmEubGFuZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQljdS5jcmVhdGVJbXBvcnQoaW1wb3J0U3RtdCwgbnVsbCwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZm9ybWF0KFN0cmluZyBjb250ZW50cywgaW50IGluZGVudCwgYm9vbGVhbiBlbnN1cmVFbmRMaW5lUmV0dXJuKSB7Ci0JCURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudChjb250ZW50cyk7Ci0JCWludCBsaW5lcyA9IGRvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCWZvcm1hdChkb2MsIDAsIGxpbmVzIC0gMSwgaW5kZW50KTsKLQkJU3RyaW5nIHJlc3VsdCA9IGRvYy5nZXQoKTsKLQkJaWYgKGVuc3VyZUVuZExpbmVSZXR1cm4pCi0JCQlyZXN1bHQgPSBlbnN1cmVMaW5lUmV0dXJuKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0KElEb2N1bWVudCBkb2N1bWVudEFyZywgaW50IHN0YXJ0TGluZSwgaW50IGxpbmVzLCBpbnQgaW5kZW50KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgZW5kID0gZG9jdW1lbnRBcmcuZ2V0TGluZU9mZnNldChzdGFydExpbmUgKyBsaW5lcyk7Ci0JCQlpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnRMaW5lOwotCQkJQ29kZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVDb2RlRm9ybWF0dGVyKG51bGwpOwotCQkJVGV4dEVkaXQgZWRpdCA9IGZvcm1hdHRlci5mb3JtYXQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIGRvY3VtZW50QXJnLmdldCgpLCBzdGFydExpbmUsIGxlbmd0aCwgaW5kZW50LCBudWxsKTsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQllZGl0LmFwcGx5KGRvY3VtZW50QXJnKTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlsb2cubG9nKCJGYWlsZWQgdG8gZm9ybWF0IHRleHQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvZy5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFN0cmluZyhTdHJpbmcgcGF0dGVybiwgU3RyaW5nW10gYXJndW1lbnRzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmd1bWVudHMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlbnN1cmVMaW5lUmV0dXJuKFN0cmluZyBhU3RyaW5nKSB7Ci0JCWlmICghYVN0cmluZy5lbmRzV2l0aChORVdfTElORSkpCi0JCQlyZXR1cm4gYVN0cmluZyArIE5FV19MSU5FOwotCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFyYW1hdGVyVHlwZVNpZ25hdHVyZXMoSURPTU1ldGhvZCBhTWV0aG9kKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZ1tdIHBhcm1zID0gYU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlpZiAocGFybXMgIT0gbnVsbCkgewotCQkJaWYgKHBhcm1zLmxlbmd0aCA9PSAwKQotCQkJCXJlc3VsdCA9IHBhcm1zOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IG5ldyBTdHJpbmdbcGFybXMubGVuZ3RoXTsKLQkJCWJvb2xlYW4gaXNSZXNvbHZlZCA9IGZhbHNlOwotCQkJU3RyaW5nIHBhcm07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFybSA9IHBhcm1zW2ldOwotCQkJCWlzUmVzb2x2ZWQgPSBwYXJtLmluZGV4T2YoJy4nKSA+IDA7Ci0JCQkJcmVzdWx0W2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUocGFybSwgaXNSZXNvbHZlZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL3VpL1dUUFVJV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vdWkvV1RQVUlXb3JraW5nQ29weU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5ZDVjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vdWkvV1RQVUlXb3JraW5nQ29weU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24udWk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuSUNvbXBpbGF0aW9uVW5pdERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuSW50ZXJuYWxDbGFzc0ZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVdvcmtpbmdDb3B5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5XVFBXb3JraW5nQ29weU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI1LzIwMDEgNzowNTozNiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgV1RQVUlXb3JraW5nQ29weU1hbmFnZXIgZXh0ZW5kcyBXVFBXb3JraW5nQ29weU1hbmFnZXIgewotCXByaXZhdGUgSVdvcmtpbmdDb3B5TWFuYWdlciBqYXZhV29ya2luZ0NvcHlNYW5hZ2VyOwotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdERvY3VtZW50UHJvdmlkZXIgY3VEb2N1bWVudFByb3ZpZGVyOwotCXByaXZhdGUgSGFzaE1hcCBlZGl0b3JJbnB1dHM7Ci0JcHJpdmF0ZSBDb3JlRXhjZXB0aW9uIGxhc3RFcnJvcjsKLQotCS8qKgotCSAqIFdUUFVJV29ya2luZ0NvcHlNYW5hZ2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdUUFVJV29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQljdURvY3VtZW50UHJvdmlkZXIgPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb21waWxhdGlvblVuaXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWphdmFXb3JraW5nQ29weU1hbmFnZXIgPSBKYXZhVUkuZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0Nvbm5lY3QoZmluYWwgSUVkaXRvcklucHV0IGlucHV0LCBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQlsYXN0RXJyb3IgPSBudWxsOwotCQkJZC5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJY29ubmVjdChpbnB1dCwgY3UpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWxhc3RFcnJvciA9IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBlbHNlCi0JCQljb25uZWN0KGlucHV0LCBjdSk7Ci0JCWlmIChsYXN0RXJyb3IgIT0gbnVsbCkKLQkJCXRocm93IGxhc3RFcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiBDb25uZWN0IHRoZSBDb21waWxhdGlvblVuaXREb2N1bWVudFByb3ZpZGVyIHRvIHRoZQotCSAqIAotCSAqIEBpbnB1dCBhbmQgY29ubmVjdCB0aGUgYW5ub3RhdGlvbiBtb2RlbCBmcm9tIHRoZSBwcm92aWRlciB0byB0aGUgSURvY3VtZW50IG9mIHRoZQotCSAqIEBpbnB1dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25uZWN0KElFZGl0b3JJbnB1dCBpbnB1dCwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJamF2YVdvcmtpbmdDb3B5TWFuYWdlci5jb25uZWN0KGlucHV0KTsKLQkJCWdldEVkaXRvcklucHV0cygpLnB1dChjdSwgaW5wdXQpOwotCQkJSURvY3VtZW50IGRvYyA9IGN1RG9jdW1lbnRQcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7Ci0JCQljdURvY3VtZW50UHJvdmlkZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKGlucHV0KS5jb25uZWN0KGRvYyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXZlcnRXb3JraW5nQ29waWVzKCkgewotCQlpZiAoZ2V0RWRpdG9ySW5wdXRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IGdldEVkaXRvcklucHV0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJaW5wdXQgPSAoSUVkaXRvcklucHV0KSBpdC5uZXh0KCk7Ci0JCQlyZXZlcnQoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzb25uZWN0IHRoZSBDb21waWxhdGlvblVuaXREb2N1bWVudFByb3ZpZGVyIGZyb20gdGhlCi0JICogCi0JICogQGlucHV0IGFuZCBkaXNjb25uZWN0IHRoZSBhbm5vdGF0aW9uIG1vZGVsIGZyb20gdGhlIHByb3ZpZGVyIGZyb20gdGhlIElEb2N1bWVudCBvZiB0aGUKLQkgKiBAaW5wdXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzY29ubmVjdChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSURvY3VtZW50IGRvYyA9IGN1RG9jdW1lbnRQcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7Ci0JCWN1RG9jdW1lbnRQcm92aWRlci5nZXRBbm5vdGF0aW9uTW9kZWwoaW5wdXQpLmRpc2Nvbm5lY3QoZG9jKTsKLQkJamF2YVdvcmtpbmdDb3B5TWFuYWdlci5kaXNjb25uZWN0KGlucHV0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXZlcnQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXRyeSB7Ci0JCQljdURvY3VtZW50UHJvdmlkZXIucmVzZXREb2N1bWVudChpbnB1dCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCUlEb2N1bWVudCBkb2MgPSBjdURvY3VtZW50UHJvdmlkZXIuZ2V0RG9jdW1lbnQoaW5wdXQpOwotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gY3VEb2N1bWVudFByb3ZpZGVyLmdldEFubm90YXRpb25Nb2RlbChpbnB1dCk7Ci0KLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwpIHsKLQkJCUFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsIG1hcmtlck1vZGVsID0gKEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsKSBtb2RlbDsKLQkJCW1hcmtlck1vZGVsLnJlc2V0TWFya2VycygpOwotCQl9Ci0JCW1vZGVsLmRpc2Nvbm5lY3QoZG9jKTsKLQkJamF2YVdvcmtpbmdDb3B5TWFuYWdlci5kaXNjb25uZWN0KGlucHV0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNjb25uZWN0RWRpdG9ySW5wdXRzKCkgewotCQlJdGVyYXRvciBpdCA9IGdldEVkaXRvcklucHV0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJaW5wdXQgPSAoSUVkaXRvcklucHV0KSBpdC5uZXh0KCk7Ci0JCQlkaXNjb25uZWN0KGlucHV0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2NhcmRFeGlzdGluZ0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChnZXRFZGl0b3JJbnB1dHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSUVkaXRvcklucHV0IGlucHV0OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlpbnB1dCA9IChJRWRpdG9ySW5wdXQpIGl0Lm5leHQoKTsKLQkJCWRpc2Nvbm5lY3QoaW5wdXQpOwotCQl9Ci0JfQotCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlTZXQgYVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gbnVsbDsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNEaXJ0eSh1bml0KSkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlID0gdW5pdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCQkJYVNldC5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhU2V0OwotCX0KLQotCXByb3RlY3RlZCBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBwcmltR2V0RWRpdG9ySW5wdXQoY3UpOwotCQlpZiAoaW5wdXQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbnB1dCA9IGdldEVkaXRvcklucHV0KChJSmF2YUVsZW1lbnQpIGN1KTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JcHJvdGVjdGVkIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dChJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6IHsKLQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotCQkJCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKQotCQkJCQkJY3UgPSBjdS5nZXRQcmltYXJ5KCk7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGN1LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJCQkJcmV0dXJuIG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKLQkJCQkJcmV0dXJuIG5ldyBJbnRlcm5hbENsYXNzRmlsZUVkaXRvcklucHV0KChJQ2xhc3NGaWxlKSBlbGVtZW50KTsKLQkJCX0KLQkJCWVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMjUvMjAwMSA3OjMwOjIwIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkhhc2hNYXAKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkhhc2hNYXAgZ2V0RWRpdG9ySW5wdXRzKCkgewotCQlpZiAoZWRpdG9ySW5wdXRzID09IG51bGwpCi0JCQllZGl0b3JJbnB1dHMgPSBuZXcgSGFzaE1hcCgyMCk7Ci0JCXJldHVybiBlZGl0b3JJbnB1dHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGVuY29kZWQgaW4gdGhlIGdpdmVuIGVkaXRvcgotCSAqIGlucHV0LiBEb2VzIG5vdCBjb25uZWN0IHRoZSBlZGl0IG1vZGVsIHRvIHRoZSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjdSA9PSBudWxsIHx8IGN1LmlzV29ya2luZ0NvcHkoKSkgewotCQkJcmV0dXJuIGN1OwotCQl9Ci0JCUlDb21waWxhdGlvblVuaXQgbmV3Q1UgPSBzdXBlci5nZXRFeGlzdGluZ1dvcmtpbmdDb3B5KGN1KTsKLQkJaWYgKG5ld0NVICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3Q1U7Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KGN1KTsKLQkJcmV0dXJuIGphdmFXb3JraW5nQ29weU1hbmFnZXIuZ2V0V29ya2luZ0NvcHkoZWRpdG9ySW5wdXQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSwgYm9vbGVhbiBmb3JOZXdDVSkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZvck5ld0NVKQotCQkJcmV0dXJuIHN1cGVyLmdldFdvcmtpbmdDb3B5KGN1LCBmb3JOZXdDVSk7Ci0JCXJldHVybiBwcmltR2V0V29ya2luZ0NvcHkoY3UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoY3UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSURvY3VtZW50UHJvdmlkZXIgcCA9IGN1RG9jdW1lbnRQcm92aWRlcjsKLQkJcmV0dXJuIHAgPT0gbnVsbCA/IGZhbHNlIDogcC5jYW5TYXZlRG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoY3UpKTsKLQl9Ci0KLQkvKioKLQkgKiBtdXN0U2F2ZURvY3VtZW50IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJSXRlcmF0b3IgaXQgPSBnZXRFZGl0b3JJbnB1dHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWlmIChjdURvY3VtZW50UHJvdmlkZXIubXVzdFNhdmVEb2N1bWVudChpdC5uZXh0KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltRGlzcG9zZSgpIHsKLQkJc3VwZXIucHJpbURpc3Bvc2UoKTsKLQkJZGlzY2FyZEV4aXN0aW5nQ29tcGlsYXRpb25Vbml0cygpOwotCQllZGl0b3JJbnB1dHMgPSBudWxsOwotCQlqYXZhV29ya2luZ0NvcHlNYW5hZ2VyID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUmV2ZXJ0KCkgewotCQlzdXBlci5wcmltUmV2ZXJ0KCk7Ci0JCXJldmVydFdvcmtpbmdDb3BpZXMoKTsKLQkJZWRpdG9ySW5wdXRzID0gbnVsbDsKLQkJamF2YVdvcmtpbmdDb3B5TWFuYWdlciA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElFZGl0b3JJbnB1dCBwcmltR2V0RWRpdG9ySW5wdXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gKElFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXRzKCkuZ2V0KGN1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZWRpdG9yCi0JICogaW5wdXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgcHJpbUdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGN1ID09IG51bGwpIHsKLQkJCXJldHVybiBjdTsKLQkJfQotCQlJQ29tcGlsYXRpb25Vbml0IHByaW1hcnkgPSBjdS5nZXRQcmltYXJ5KCk7Ci0JCUlDb21waWxhdGlvblVuaXQgbmV3Q1UgPSBnZXROZXdDb21waWxhdGlvblVuaXRXb3JraW5nQ29weShwcmltYXJ5KTsKLQkJaWYgKG5ld0NVICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3Q1U7Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IHByaW1HZXRFZGl0b3JJbnB1dChwcmltYXJ5KTsKLQkJaWYgKGVkaXRvcklucHV0ID09IG51bGwpIHsKLQkJCWVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoY3UpOwotCQkJc3luY0Nvbm5lY3QoZWRpdG9ySW5wdXQsIGN1KTsKLQkJfQotCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKQotCQkJcmV0dXJuIGN1OwotCQlyZXR1cm4gamF2YVdvcmtpbmdDb3B5TWFuYWdlci5nZXRXb3JraW5nQ29weShlZGl0b3JJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVNhdmVDb21waWxhdGlvblVuaXRzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwZXIucHJpbVNhdmVDb21waWxhdGlvblVuaXRzKG51bGwpOwotCQlzYXZlRXhpc3RpbmdDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1TYXZlRG9jdW1lbnQoSUVkaXRvcklucHV0IGlucHV0LCBJRG9jdW1lbnQgZG9jLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWN1RG9jdW1lbnRQcm92aWRlci5zYXZlRG9jdW1lbnQobW9uaXRvciwgaW5wdXQsIGRvYywgdHJ1ZSk7IC8vIG92ZXJ3cml0ZSBpZiBuZWVkZWQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKCFpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoZXgpKQotCQkJCXRocm93IGV4OwotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUkVTT1VSQ0VfQ0xBU1MpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFIHx8ICFyZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkpCi0JCQkJdGhyb3cgZXg7Ci0KLQkJCWlmIChnZXRTYXZlSGFuZGxlcigpLnNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZSgoSUZpbGUpIHJlc291cmNlKSkKLQkJCQljdURvY3VtZW50UHJvdmlkZXIuc2F2ZURvY3VtZW50KG1vbml0b3IsIGlucHV0LCBkb2MsIGZhbHNlKTsKLQkJCWVsc2UKLQkJCQl0aHJvdyBleDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEb2N1bWVudChJRWRpdG9ySW5wdXQgaW5wdXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJRG9jdW1lbnQgZG9jID0gY3VEb2N1bWVudFByb3ZpZGVyLmdldERvY3VtZW50KGlucHV0KTsKLQkJYm9vbGVhbiBjYW5TYXZlID0gY3VEb2N1bWVudFByb3ZpZGVyLmNhblNhdmVEb2N1bWVudChpbnB1dCk7Ci0JCXRyeSB7Ci0JCQlpZiAoY2FuU2F2ZSkgewotCQkJCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IGphdmFXb3JraW5nQ29weU1hbmFnZXIuZ2V0V29ya2luZ0NvcHkoaW5wdXQpOwotCQkJCXN5bmNocm9uaXplZCAodW5pdCkgewotCQkJCQljdURvY3VtZW50UHJvdmlkZXIuYWJvdXRUb0NoYW5nZShpbnB1dCk7Ci0JCQkJCXByaW1TYXZlRG9jdW1lbnQoaW5wdXQsIGRvYywgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdUUENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWxlZEV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjYW5TYXZlKQotCQkJCWN1RG9jdW1lbnRQcm92aWRlci5jaGFuZ2VkKGlucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVFeGlzdGluZ0NvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZ2V0RWRpdG9ySW5wdXRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlpZiAoIXZhbGlkYXRlU3RhdGUoKSkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCS8vCUlDb21waWxhdGlvblVuaXQgY3U7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dDsKLQkJdHJ5IHsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQkvLwkJCWN1ID0gKElDb21waWxhdGlvblVuaXQpIGVudHJ5LmdldEtleSgpOwotCQkJCWlucHV0ID0gKElFZGl0b3JJbnB1dCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl0cnkgewotCQkJCQlzYXZlRG9jdW1lbnQoaW5wdXQsIG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWRpc2Nvbm5lY3QoaW5wdXQpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWdldEVkaXRvcklucHV0cygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxsIHZhbGlkYXRlRWRpdCBmb3IgYWxsIHJlYWQgb25seSBJRmlsZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIFdvcmtpbmdDb3B5LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVN0YXRlKCkgewotCQlMaXN0IHJlYWRPbmx5RmlsZXMgPSBnZXRSZWFkT25seU1vZGlmaWVkRmlsZXMoKTsKLQkJaWYgKHJlYWRPbmx5RmlsZXMgIT0gbnVsbCAmJiAhcmVhZE9ubHlGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbcmVhZE9ubHlGaWxlcy5zaXplKCldOwotCQkJcmVhZE9ubHlGaWxlcy50b0FycmF5KGZpbGVzKTsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCU9iamVjdCBjdHggPSB3aW4gPT0gbnVsbCA/IG51bGwgOiB3aW4uZ2V0U2hlbGwoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgY3R4KTsKLQkJCXJldHVybiBzdGF0dXMuaXNPSygpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSZWFkT25seU1vZGlmaWVkRmlsZXMoKSB7Ci0JCUxpc3QgcmVhZE9ubHlGaWxlcyA9IG51bGw7Ci0JCUlGaWxlIHJlYWRPbmx5RmlsZSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCS8vCUlDb21waWxhdGlvblVuaXQgY3U7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dDsKLQkJSURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdiA9IGN1RG9jdW1lbnRQcm92aWRlcjsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVhZE9ubHlGaWxlID0gbnVsbDsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJLy8JCWN1ID0gKElDb21waWxhdGlvblVuaXQpIGVudHJ5LmdldEtleSgpOwotCQkJaW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKGRvY1Byb3YuY2FuU2F2ZURvY3VtZW50KGlucHV0KSkKLQkJCQlyZWFkT25seUZpbGUgPSBnZXRSZWFkT25seUZpbGUoaW5wdXQpOwotCQkJaWYgKHJlYWRPbmx5RmlsZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlYWRPbmx5RmlsZXMgPT0gbnVsbCkKLQkJCQkJcmVhZE9ubHlGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZWFkT25seUZpbGVzLmFkZChyZWFkT25seUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWFkT25seUZpbGVzOwotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0UmVhZE9ubHlGaWxlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZpbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLQkJCUlGaWxlIGZpbGUgPSBmaW5wdXQuZ2V0RmlsZSgpOwotCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKQotCQkJCXJldHVybiBmaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IHByaW1HZXRFZGl0b3JJbnB1dChjdSk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKQotCQkJZGlzY29ubmVjdChpbnB1dCk7Ci0JCWdldEVkaXRvcklucHV0cygpLnJlbW92ZShjdSk7Ci0JCXN1cGVyLmFkZERlbGV0ZWRDb21waWxhdGlvblVuaXQoY3UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guSUoyRUVXb3JraW5nQ29weU1hbmFnZXIjaGFzV29ya2luZ0NvcGllcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzV29ya2luZ0NvcGllcygpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc1dvcmtpbmdDb3BpZXMoKSB8fCAoZWRpdG9ySW5wdXRzICE9IG51bGwgJiYgIWVkaXRvcklucHV0cy5pc0VtcHR5KCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0FkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzBmMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0FkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQnVpbGRQYXRoRGlhbG9nQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyLCBJQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGV4dCBjb21wb25lbnROYW1lVGV4dDsKLQlwcm90ZWN0ZWQgTGFiZWwgYXZhaWxhYmxlTW9kdWxlczsKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyOwotCXByb3RlY3RlZCBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBleHRlcm5hbEphckJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZFZhcmlhYmxlQnV0dG9uOwotCXByb3RlY3RlZCBDb21wb3NpdGUgYnV0dG9uQ29sdW1uOwotCi0JcHJvdGVjdGVkIExpc3QgajJlZUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIExpc3QgamF2YVByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgT0tfU1RBVFVTID0gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZS4KLQkgKi8KLQlwdWJsaWMgQWRkTW9kdWxlc3RvRUFSUHJvcGVydGllc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCi0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWlmIChlYXJDb21wb25lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCWNyZWF0ZVByb2plY3RMYWJlbHNHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVMaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkJcmVmcmVzaCgpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCi0JCWlmIChNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKQotCQkJCQllYXJDb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0TGFiZWxzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBsYWJlbHNHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYWJlbHNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGFiZWxzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobGFiZWxzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdF9uYW1lX19VSV8iKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvamVjdCBuYW1lOiIKLQotCQljb21wb25lbnROYW1lVGV4dCA9IG5ldyBUZXh0KGxhYmVsc0dyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljb21wb25lbnROYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWNvbXBvbmVudE5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbXBvbmVudE5hbWVUZXh0LnNldFRleHQocHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBsaXN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ0RhdGEuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQotCQlhdmFpbGFibGVNb2R1bGVzID0gbmV3IExhYmVsKGxpc3RHcm91cCwgU1dULk5PTkUpOwotCQlnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJYXZhaWxhYmxlTW9kdWxlcy5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBVkFJTEFCTEVfSjJFRV9DT01QT05FTlRTIikpOyAvLyROT04tTkxTLTEkID0gIkF2YWlsYWJsZSBkZXBlbmRlbnQgSkFSczoiCi0JCWF2YWlsYWJsZU1vZHVsZXMuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWNyZWF0ZVRhYmxlQ29tcG9zaXRlKGxpc3RHcm91cCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJTnVsbFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJYWRkTW9kdWxlc1RvRUFSKG1vbml0b3IpOwotCQlyZW1vdmVNb2R1bGVzRnJvbUVBUihtb25pdG9yKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IG5ld0oyRUVNb2R1bGVzVG9BZGQoKXsKLQkJTGlzdCBuZXdDb21wcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGoyZWVDb21wb25lbnRMaXN0ICE9IG51bGwgJiYgIWoyZWVDb21wb25lbnRMaXN0LmlzRW1wdHkoKSl7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGoyZWVDb21wb25lbnRMaXN0LnNpemUoKTsgaSsrKXsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBoYW5kbGUgPSAoSVZpcnR1YWxDb21wb25lbnQpajJlZUNvbXBvbmVudExpc3QuZ2V0KGkpOwotCQkJCWlmKCAhaW5FQVJBbHJlYWR5KGhhbmRsZSkpCi0JCQkJCW5ld0NvbXBzLmFkZChoYW5kbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdDb21wczsKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIGFkZE1vZHVsZXNUb0VBUihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVN0YXR1cyBzdGF0ID0gT0tfU1RBVFVTOwotCQl0cnkgewotCQkJaWYoIGVhckNvbXBvbmVudCAhPSBudWxsICl7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3SjJFRU1vZHVsZXNUb0FkZCgpOwkJCQkKLQkJCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQotCQkJCQlkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgZWFyQ29tcG9uZW50KTsJCQkJCQotCQkJCQlkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBsaXN0KTsKLQkJCQkJc3RhdCA9IGRtLnZhbGlkYXRlUHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCQkJCWlmIChzdGF0ICE9IE9LX1NUQVRVUykKLQkJCQkJCXJldHVybiBzdGF0OwotCQkJCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCFqYXZhUHJvamVjdHNMaXN0LmlzRW1wdHkoKSkgewotCQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFQcm9qZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUlQcm9qZWN0IHByb2ogPSAoSVByb2plY3QpIGphdmFQcm9qZWN0c0xpc3QuZ2V0KGkpOwotCQkJCQkJSURhdGFNb2RlbCBtaWdyYXRpb25kbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQkJbWlncmF0aW9uZG0uc2V0UHJvcGVydHkoSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2ouZ2V0TmFtZSgpKTsKLQkJCQkJCW1pZ3JhdGlvbmRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQotCQotCQkJCQkJSURhdGFNb2RlbCByZWZkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQlMaXN0IHRhcmdldENvbXBMaXN0ID0gKExpc3QpIHJlZmRtLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Y29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvaik7Ci0JCQkJCQl0YXJnZXRDb21wTGlzdC5hZGQodGFyZ2V0Y29tcG9uZW50KTsKLQkKLQkJCQkJCXJlZmRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wb25lbnQpOwotCQkJCQkJcmVmZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgdGFyZ2V0Q29tcExpc3QpOwotCQkJCQkJcmVmZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJCQlqMmVlQ29tcG9uZW50TGlzdC5hZGQodGFyZ2V0Y29tcG9uZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgcmVtb3ZlTW9kdWxlc0Zyb21FQVIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlTdGF0dXMgc3RhdCA9IE9LX1NUQVRVUzsKLQkJaWYoIGVhckNvbXBvbmVudCAhPSBudWxsICYmIGoyZWVDb21wb25lbnRMaXN0ICE9IG51bGwpewotCQkJTGlzdCBsaXN0ID0gZ2V0Q29tcG9uZW50c1RvUmVtb3ZlKCk7Ci0JCQlpZiggIWxpc3QuaXNFbXB0eSgpKXsKLQkJCQl0cnkgewotCQkJCQlSZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3BlcmF0aW9uIG9wID0gcmVtb3ZlQ29tcG9uZW50RnJvbUVBUk9wZXJhdGlvbihlYXJDb21wb25lbnQsIGxpc3QpOwotCQkJCQlvcC5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0OwotCX0JCQotCQotCXByb3RlY3RlZCAgUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbk9wZXJhdGlvbiByZW1vdmVDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXBvbmVudCwgTGlzdCB0YXJnZXRDb21wb25lbnRzSGFuZGxlcykgewotCQlJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHNvdXJjZUNvbXBvbmVudCk7Ci0JCUxpc3QgbW9kSGFuZGxlc0xpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCW1vZEhhbmRsZXNMaXN0LmFkZEFsbCh0YXJnZXRDb21wb25lbnRzSGFuZGxlcyk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIG1vZEhhbmRsZXNMaXN0KTsKLQkJcmV0dXJuIG5ldyBSZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q29tcG9uZW50c1RvUmVtb3ZlKCl7Ci0JCS8vajJlZUNvbXBvbmVudExpc3QgPSBnZXRDaGVja2VkSjJFRUVsZW1lbnRzQXNMaXN0KCk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYoIGVhckNvbXBvbmVudCAhPSBudWxsICYmIGxpc3QgIT0gbnVsbCApewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBvbGRyZWZzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkcmVmcy5sZW5ndGg7IGorKykgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG9sZHJlZnNbal07Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgaGFuZGxlID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiggIWoyZWVDb21wb25lbnRMaXN0LmNvbnRhaW5zKGhhbmRsZSkpewotCQkJCQlsaXN0LmFkZChoYW5kbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsJCQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHNlbGVjdEFsbEJ1dHRvbikKLQkJCWhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRlc2VsZWN0QWxsQnV0dG9uKQotCQkJaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCWVsc2UgaWYoZXZlbnQud2lkZ2V0ID09IGV4dGVybmFsSmFyQnV0dG9uKQotCQkJaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKTsKLQkJZWxzZSBpZihldmVudC53aWRnZXQgPT0gYWRkVmFyaWFibGVCdXR0b24pCi0JCQloYW5kbGVTZWxlY3RWYXJpYWJsZUJ1dHRvbigpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJajJlZUNvbXBvbmVudExpc3QgPSBnZXRDaGVja2VkSjJFRUVsZW1lbnRzQXNMaXN0KCk7Ci0JCWphdmFQcm9qZWN0c0xpc3QgPSBnZXRDaGVja2VkSmF2YVByb2plY3RzQXNMaXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpIHsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJajJlZUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWphdmFQcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpewotCQlJUGF0aFtdIHNlbGVjdGVkPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlRXh0ZXJuYWxKQVJFbnRyaWVzKGdldFNoZWxsKCkpOwotCi0JCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQkKLQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoIGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCksIHR5cGUgKwotCQkJCQkJCXNlbGVjdGVkW2ldLnRvU3RyaW5nKCkpOwotCQkJCQotCQkJCUFycmF5TGlzdCB2bGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIG9sZHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkcmVmcy5sZW5ndGg7IGorKykgewotCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBvbGRyZWZzW2pdOwotCQkJCQl2bGlzdC5hZGQocmVmKTsKLQkJCQl9CQkKLQkJCQotCQkJCS8vVG8gZG86IGNoZWNrIGlmIGFyY2hpdmUgY29tcG9uZW50IGFscmVhZHkgZXhpc3RzCi0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2UoIGVhckNvbXBvbmVudCwgYXJjaGl2ZSApOwotCQkJCXZsaXN0LmFkZChyZWYpOwkKLQkJCQkKLQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBuZXcgSVZpcnR1YWxSZWZlcmVuY2Vbdmxpc3Quc2l6ZSgpXTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHZsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHRtcHJlZiA9IChJVmlydHVhbFJlZmVyZW5jZSkgdmxpc3QuZ2V0KGopOwotCQkJCQlyZWZzW2pdID0gdG1wcmVmOwotCQkJCX0JCQkJCi0JCQkJZWFyQ29tcG9uZW50LnNldFJlZmVyZW5jZXMocmVmcyk7Ci0JCQkJLy9qMmVlQ29tcG9uZW50TGlzdC5hZGQoYXJjaGl2ZS5nZXRQcm9qZWN0KCkpOwotCQkJCWoyZWVDb21wb25lbnRMaXN0LmFkZChhcmNoaXZlKTsKLQkJCX0KLQkJCXJlZnJlc2goKTsKLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0VmFyaWFibGVCdXR0b24oKXsKLQkJSVBhdGggZXhpc3RpbmdQYXRoW10gPSBuZXcgUGF0aFswXTsKLQkJSVBhdGhbXSBwYXRocyA9ICBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlVmFyaWFibGVFbnRyaWVzKGdldFNoZWxsKCksIGV4aXN0aW5nUGF0aCk7Ci0JCQotCQlpZiAocGF0aHMgIT0gbnVsbCkgewotCQkJcmVmcmVzaCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCUlQYXRoIHJlc29sdmVkUGF0aD0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgocGF0aHNbaV0pOwotCi0JCQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHJlc29sdmVkUGF0aC50b09TU3RyaW5nKCkpOwotCQkJCWlmKCBmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpewotCQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LlZBUkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCQkKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZSA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudCggZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSwgdHlwZSArCi0JCQkJCQkJCXBhdGhzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkKLQkJCQkJQXJyYXlMaXN0IHZsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIG9sZHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG9sZHJlZnNbal07Ci0JCQkJCQl2bGlzdC5hZGQocmVmKTsKLQkJCQkJfQkJCi0JCQkJCi0JCQkJCS8vVG8gZG86IGNoZWNrIGlmIGFyY2hpdmUgY29tcG9uZW50IGFscmVhZHkgZXhpc3RzCi0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKCBlYXJDb21wb25lbnQsIGFyY2hpdmUgKTsKLQkJCQkJdmxpc3QuYWRkKHJlZik7CQotCQkJCQkKLQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW3ZsaXN0LnNpemUoKV07Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdmxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHRtcHJlZiA9IChJVmlydHVhbFJlZmVyZW5jZSkgdmxpc3QuZ2V0KGopOwotCQkJCQkJcmVmc1tqXSA9IHRtcHJlZjsKLQkJCQkJfQkJCQkKLQkJCQkJZWFyQ29tcG9uZW50LnNldFJlZmVyZW5jZXMocmVmcyk7Ci0JCQkJCWoyZWVDb21wb25lbnRMaXN0LmFkZChhcmNoaXZlKTsKLQkJCQl9ZWxzZXsKLQkJCQkJLy9kaXNwbGF5IGVycm9yCi0JCQkJfQotCQkJfQotCQkJcmVmcmVzaCgpOwotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWZpbGxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlVGFibGUocGFyZW50KTsKLQkJY3JlYXRlQnV0dG9uQ29sdW1uKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uQ29sdW1uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYnV0dG9uQ29sdW1uID0gY3JlYXRlQnV0dG9uQ29sdW1uQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlidXR0b25Db2x1bW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY3JlYXRlUHVzaEJ1dHRvbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQdXNoQnV0dG9ucygpIHsKLQkJc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihTRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihERV9TRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCWV4dGVybmFsSmFyQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVhURVJOQUxfSkFSIikpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVmFyaWFibGVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBRERWQVJJQUJMRSIpKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYUJ1dHRvbiA9IHByaW1DcmVhdGVQdXNoQnV0dG9uKGxhYmVsLCBidXR0b25Db2x1bW4pOwotCQlhQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlhQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gYUJ1dHRvbjsKLQl9Ci0KLQlwdWJsaWMgQnV0dG9uIHByaW1DcmVhdGVQdXNoQnV0dG9uKFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIGFCdXR0b25Db2x1bW4pIHsKLQkJQnV0dG9uIGFCdXR0b24gPSBuZXcgQnV0dG9uKGFCdXR0b25Db2x1bW4sIFNXVC5QVVNIKTsKLQkJYUJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGFCdXR0b247Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYUJ1dHRvbkNvbHVtbiA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYUJ1dHRvbkNvbHVtbi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlhQnV0dG9uQ29sdW1uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBhQnV0dG9uQ29sdW1uOwotCX0KLQotCXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyID0gY3JlYXRlYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlcihwYXJlbnQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZ2QpOwotCi0JCWlmIChlYXJDb21wb25lbnQgIT0gbnVsbCkgewotCQkJaW50IGoyZWVWZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQoZWFyQ29tcG9uZW50KTsKLQkJCUF2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEF2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyKGVhckNvbXBvbmVudCwgajJlZVZlcnNpb24pOwotCQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJCQotCQkJYWRkVGFibGVMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlTGlzdGVuZXJzKCkgewotCQlhZGRDaGVja1N0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWoyZWVDb21wb25lbnRMaXN0ID0gZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpOwotCQkJCWphdmFQcm9qZWN0c0xpc3QgPSBnZXRDaGVja2VkSmF2YVByb2plY3RzQXNMaXN0KCk7Ci0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldENvbXBvbmVudHNJbkVhcigpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZzW10gPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IoIGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKyspewotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKLQkJCWxpc3QuYWRkKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNvbXBvbmVudEhhbmRsZQotCSAqIEByZXR1cm4KLQkgKiBAZGVzY3JpcHRpb24gIHJldHVybnMgdHJ1ZSBpcyBhIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBFQVIgYXMgYSBkZXBlbmRlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbkVBUkFscmVhZHkoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KXsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmc1tdID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZm9yKCBpbnQgaT0wOyBpPCByZWZzLmxlbmd0aDsgaSsrKXsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQlpZiAgKCByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmVxdWFscyggY29tcG9uZW50ICkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0JCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlMaXN0IGxpc3Q7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKQotCQkJbGlzdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWVsc2UgewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCkgewotCQkJCQlsaXN0LmFkZChlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldENoZWNrZWRKYXZhUHJvamVjdHNBc0xpc3QoKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJTGlzdCBsaXN0OwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkKLQkJCWxpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQllbHNlIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJbGlzdC5hZGQoZWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVhdmFpbGFibGVDb21wb25lbnRzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW50IGZsYWdzID0gU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSTsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIGZsYWdzKTsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlciA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlKTsKLQotCQkvLyBzZXQgdXAgdGFibGUgbGF5b3V0Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldFNvcnRlcihudWxsKTsKLQotCQkvLyB0YWJsZSBjb2x1bW5zCi0JCVRhYmxlQ29sdW1uIGZpbGVOYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMCk7Ci0JCWZpbGVOYW1lQ29sdW1uLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkpBUi9Nb2R1bGVfVUlfIikpOyAvLyROT04tTkxTLTEkCi0JCWZpbGVOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiBwcm9qZWN0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMSk7Ci0JCXByb2plY3RDb2x1bW4uc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdF9VSV8iKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvamVjdCIKLQkJcHJvamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmxheW91dCh0YWJsZSwgdHJ1ZSk7Ci0JCXJldHVybiBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyOwotCi0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQlJV29ya3NwYWNlUm9vdCBpbnB1dCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWludCBudW1saW5lcyA9IE1hdGgubWluKDEwLCBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUhlaWdodCgpICogbnVtbGluZXM7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IGF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0W10gY29tcHMgPSBnZXRDb21wb25lbnRzSW5FYXIoKTsKLQkJCi0JCWZvciggaW50IGk9MDsgaTwgaXRlbXMubGVuZ3RoOyBpKysgKXsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlbXNbaV0uZ2V0RGF0YSgpOwotCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCl7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudCllbGVtZW50OwotCQkJCWZvciggaW50IGo9MDsgajwgY29tcHMubGVuZ3RoOyBqKysgKXsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdGVtcGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpY29tcHNbal07Ci0JCQkJCWlmKCBjb21wLmVxdWFscyh0ZW1wY29tcCkpewotCQkJCQkJbGlzdC5hZGQoY29tcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQotCQl9Ci0JCQotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhsaXN0LnRvQXJyYXkoKSk7Ci0JCUdyaWREYXRhIGJ0bmRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJYnV0dG9uQ29sdW1uLnNldExheW91dERhdGEoYnRuZGF0YSk7Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0F2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4MTZlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHJpdmF0ZSBpbnQgajJlZVZlcnNpb247Ci0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQ7Ci0KLQlwdWJsaWMgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIoSVZpcnR1YWxDb21wb25lbnQgYUVhckNvbXBvbmVudCwgaW50IGoyZWVWZXJzaW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuajJlZVZlcnNpb24gPSBqMmVlVmVyc2lvbjsKLQkJZWFyQ29tcG9uZW50ID0gYUVhckNvbXBvbmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbXB0eSA9IG5ldyBPYmplY3RbMF07Ci0JCWlmICghKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSkKLQkJCXJldHVybiBlbXB0eTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9ICgoSVdvcmtzcGFjZVJvb3QpIGlucHV0RWxlbWVudCkuZ2V0UHJvamVjdHMoKTsKLQkJaWYgKHByb2plY3RzID09IG51bGwgfHwgcHJvamVjdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gZW1wdHk7Ci0JCUxpc3QgdmFsaWRDb21wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJLy8gZ2V0IGZsZXhpYmxlIHByb2plY3QKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCWlmKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KSB8fAotCQkJCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpIHx8Ci0JCQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpIHx8Ci0JCQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkgfHwKLQkJCQkJCUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QocHJvamVjdCkgKXsKLQkJCQkJaW50IGNvbXBKMkVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KGNvbXBvbmVudCk7Ci0JCQkJCWlmKCBjb21wSjJFRVZlcnNpb24gPD0gajJlZVZlcnNpb24pCi0JCQkJCQkvL3ZhbGlkQ29tcExpc3QuYWRkKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJdmFsaWRDb21wTGlzdC5hZGQoY29tcG9uZW50KTsKLQkJCQl9ZWxzZSBpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpewotCQkJCQkvL2ZpbmQgdGhlIEFyY2hpdmVDb21wb25lbnQKLQkJCQkJaWYoIGNvbXBvbmVudC5lcXVhbHMoIGVhckNvbXBvbmVudCApKXsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gbmV3cmVmcyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCQlmb3IoIGludCBrPTA7IGs8IG5ld3JlZnMubGVuZ3RoOyBrKysgKXsKLQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZSB0bXByZWYgPSBuZXdyZWZzW2tdOwotCQkJCQkJCS8vSVZpcnR1YWxDb21wb25lbnQgZW5jbG9zaW5nY29tcCA9IHRtcHJlZi5nZXRFbmNsb3NpbmdDb21wb25lbnQoKTsKLQkJCQkJCQkvL2Jvb2xlYW4gaXNCaW5hcnkgPSBlbmNsb3Npbmdjb21wLmlzQmluYXJ5KCk7Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZGNvbXAgPSB0bXByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwkJCi0JCQkJCQkJYm9vbGVhbiBpc0JpbmFyeSA9IHJlZmVyZW5jZWRjb21wLmlzQmluYXJ5KCk7Ci0JCQkJCQkJaWYoIGlzQmluYXJ5ICl7Ci0JCQkJCQkJCXZhbGlkQ29tcExpc3QuYWRkKHJlZmVyZW5jZWRjb21wKTsKLQkJCQkJCQkJLy92YWxpZENvbXBMaXN0LmFkZChyZWZlcmVuY2VkY29tcC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCQkvL0lQYXRoIHBhdGggPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0UmVzb2x2ZWRQYXRoRm9yQXJjaGl2ZUNvbXBvbmVudChuYW1lKTsKLQkJCQkJCQl9CQotCQkJCQkJfQkKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXRyeSB7Ci0JCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgcHJvamVjdC5oYXNOYXR1cmUoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZhbGlkQ29tcExpc3QuYWRkKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZENvbXBMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudCllbGVtZW50OwotCQkJaWYoIGNvbHVtbkluZGV4ID09IDAgKQotCQkJCXJldHVybiBjb21wLmdldE5hbWUoKTsKLQkJCWlmKCBjb2x1bW5JbmRleCA9PSAxICApCi0JCQkJcmV0dXJuIGNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KXsKLQkJCXJldHVybiAoKElQcm9qZWN0KWVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQkJCi0JCXJldHVybiBudWxsOwotCX0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0NsYXNzcGF0aFRhYmxlTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0NsYXNzcGF0aFRhYmxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjMwYWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9DbGFzc3BhdGhUYWJsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQ2xhc3NQYXRoU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQ2xhc3NwYXRoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ2xhc3NwYXRoTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubGlzdGVuZXJzLklWYWxpZGF0ZUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXZhaWxhYmxlSmFyc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIENsYXNzcGF0aFRhYmxlTWFuYWdlciBpbXBsZW1lbnRzIExpc3RlbmVyLCBJQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHVzZUNsaWVudEpBUnNCdG47Ci0JcHJvdGVjdGVkIEJ1dHRvbiB1c2VTZXJ2ZXJKQVJzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gdXNlQW55SkFSc0J0bjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHVwQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZG93bkJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uOwotCXByb3RlY3RlZCBJQ2xhc3NwYXRoVGFibGVPd25lciBvd25lcjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1dHRvbkNvbHVtbjsKLQlwcm90ZWN0ZWQgQ2xhc3NwYXRoTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgYXZhaWxhYmxlSkFSc1ZpZXdlcjsKLQlwcm90ZWN0ZWQgSVZhbGlkYXRlRWRpdExpc3RlbmVyIHZhbGlkYXRlRWRpdExpc3RlbmVyOwotCXByb3RlY3RlZCBib29sZWFuIGlzV0xQRW50cnk7Ci0JcHJvdGVjdGVkIEdyb3VwIHJhZGlvR3JvdXA7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHk7Ci0JcHJvdGVjdGVkIEF2YWlsYWJsZUphcnNQcm92aWRlciBhdmFpbGFibGVKYXJzUHJvdmlkZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBleHRlcm5hbEphckJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZFZhcmlhYmxlQnV0dG9uOwkKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCdXR0b25CYXJNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGhUYWJsZU1hbmFnZXIoSUNsYXNzcGF0aFRhYmxlT3duZXIgb3duZXIsIENsYXNzcGF0aE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NwYXRoVGFibGVNYW5hZ2VyKElDbGFzc3BhdGhUYWJsZU93bmVyIG93bmVyLCBDbGFzc3BhdGhNb2RlbCBtb2RlbCwgSVZhbGlkYXRlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnZhbGlkYXRlRWRpdExpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCXB1YmxpYyB2b2lkIGZpbGxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljcmVhdGVSYWRpb0dyb3VwKHBhcmVudCk7Ci0JCWNyZWF0ZVRhYmxlKHBhcmVudCk7Ci0JCWNyZWF0ZUJ1dHRvbkNvbHVtbihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaWxsV0xQQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlVGFibGUocGFyZW50KTsKLQkJY3JlYXRlV0xQQnV0dG9uQ29sdW1uKHBhcmVudCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRUpCQ2xpZW50RGVmYXVsdHMoKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWJvb2xlYW4gc2hvdWxkVXNlU2VydmVySkFScyA9IGZhbHNlOwotCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCk7IAotCQlpbnQgZmlsdGVyTGV2ZWw7Ci0JCWJvb2xlYW4gZWpiU2VsZWN0ZWQgPSBzZWxlY3Rpb24uaXNBbnlFSkJKYXJTZWxlY3RlZCgpOwotCQlib29sZWFuIGNsaWVudFNlbGVjdGVkID0gc2VsZWN0aW9uLmlzQW55RUpCQ2xpZW50SkFSU2VsZWN0ZWQoKTsKLQkJaWYgKGVqYlNlbGVjdGVkICYmIGNsaWVudFNlbGVjdGVkKQotCQkJZmlsdGVyTGV2ZWwgPSBDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX05PTkU7Ci0JCWVsc2UgaWYgKHNob3VsZFVzZVNlcnZlckpBUnMpIHsKLQkJCWlmIChjbGllbnRTZWxlY3RlZCkKLQkJCQlmaWx0ZXJMZXZlbCA9IENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfTk9ORTsKLQkJCWVsc2UKLQkJCQlmaWx0ZXJMZXZlbCA9IENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfRUpCX0NMSUVOVF9KQVJTOwotCQl9IGVsc2UgewotCQkJaWYgKGVqYlNlbGVjdGVkKQotCQkJCWZpbHRlckxldmVsID0gQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9OT05FOwotCQkJZWxzZQotCQkJCWZpbHRlckxldmVsID0gQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfU0VSVkVSX0pBUlM7Ci0JCX0KLQkJaW5pdEZpbHRlckxldmVsKGZpbHRlckxldmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRGaWx0ZXJMZXZlbChpbnQgZmlsdGVyTGV2ZWwpIHsKLQkJbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCkuc2V0RmlsdGVyTGV2ZWwoZmlsdGVyTGV2ZWwpOwotCQlzd2l0Y2ggKGZpbHRlckxldmVsKSB7Ci0JCQljYXNlIChDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX05PTkUpIDoKLQkJCQl1c2VBbnlKQVJzQnRuLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl1c2VDbGllbnRKQVJzQnRuLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJdXNlU2VydmVySkFSc0J0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfQ0xJRU5UX0pBUlMpIDoKLQkJCQl1c2VBbnlKQVJzQnRuLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJdXNlQ2xpZW50SkFSc0J0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXVzZVNlcnZlckpBUnNCdG4uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfU0VSVkVSX0pBUlMpIDoKLQkJCQl1c2VBbnlKQVJzQnRuLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJdXNlQ2xpZW50SkFSc0J0bi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJdXNlU2VydmVySkFSc0J0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJhZGlvR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyYWRpb0dyb3VwID0gb3duZXIuY3JlYXRlR3JvdXAocGFyZW50KTsKLQkJcmFkaW9Hcm91cC5zZXRUZXh0KEVKQl9DTElFTlRfUkFESU9fVUlfKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlyYWRpb0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlyYWRpb0dyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQl1c2VTZXJ2ZXJKQVJzQnRuID0gY3JlYXRlUmFkaW9CdXR0b24oVVNFX0VKQl9TRVJWRVJfSkFSc19VSV8sIHJhZGlvR3JvdXApOwotCQl1c2VDbGllbnRKQVJzQnRuID0gY3JlYXRlUmFkaW9CdXR0b24oVVNFX0VKQl9DTElFTlRfSkFSc19VSV8sIHJhZGlvR3JvdXApOwotCQl1c2VBbnlKQVJzQnRuCSA9IGNyZWF0ZVJhZGlvQnV0dG9uKFVTRV9CT1RIX1VJXywgcmFkaW9Hcm91cCk7Ci0JCWluaXRpYWxpemVFSkJDbGllbnREZWZhdWx0cygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25Db2x1bW4oQ29tcG9zaXRlIHBhcmVudCkgewotCQlidXR0b25Db2x1bW4gPSBvd25lci5jcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUocGFyZW50KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljcmVhdGVQdXNoQnV0dG9ucygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVXTFBCdXR0b25Db2x1bW4oQ29tcG9zaXRlIHBhcmVudCkgewotCQlidXR0b25Db2x1bW4gPSBvd25lci5jcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUocGFyZW50KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljcmVhdGVXTFBQdXNoQnV0dG9ucygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIgPSBvd25lci5jcmVhdGVBdmFpbGFibGVKQVJzVmlld2VyKHBhcmVudCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWF2YWlsYWJsZUphcnNQcm92aWRlciA9IG5ldyBBdmFpbGFibGVKYXJzUHJvdmlkZXIoKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYXZhaWxhYmxlSmFyc1Byb3ZpZGVyKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGF2YWlsYWJsZUphcnNQcm92aWRlcik7Ci0JCWFkZFRhYmxlTGlzdGVuZXJzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdMUFB1c2hCdXR0b25zKCkgewotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKFNFTEVDVF9BTExfQlVUVE9OKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKERFX1NFTEVDVF9BTExfQlVUVE9OKTsKLQkJZXh0ZXJuYWxKYXJCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFWFRFUk5BTF9KQVIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkVmFyaWFibGVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBRERWQVJJQUJMRSIpKTsvLyROT04tTkxTLTEkCQkJCi0JCWlmIChpc1JlYWRPbmx5KCkpIHsKLQkJCXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZXh0ZXJuYWxKYXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlhZGRWYXJpYWJsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSAKLQl9Ci0JCQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHVzaEJ1dHRvbnMoKSB7Ci0JCXVwQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihVUF9CVVRUT04pOwotCQlkb3duQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihET1dOX0JVVFRPTik7Ci0JCXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oU0VMRUNUX0FMTF9CVVRUT04pOwotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oREVfU0VMRUNUX0FMTF9CVVRUT04pOwotCQlpZiAoaXNSZWFkT25seSgpKSB7Ci0JCQl1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWRvd25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSAKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlV2ViTGliUHVzaEJ1dHRvbnMoKSB7Ci0JCXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oU0VMRUNUX0FMTF9CVVRUT04pOwotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oREVfU0VMRUNUX0FMTF9CVVRUT04pOwotCQlleHRlcm5hbEphckJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVYVEVSTkFMX0pBUiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRWYXJpYWJsZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFERFZBUklBQkxFIikpOy8vJE5PTi1OTFMtMSQJCQkKLQkJaWYgKGlzUmVhZE9ubHkoKSkgewotCQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gCi0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYUJ1dHRvbiA9IG93bmVyLnByaW1DcmVhdGVQdXNoQnV0dG9uKGxhYmVsLCBidXR0b25Db2x1bW4pOwotCQlhQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlhQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gYUJ1dHRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihTdHJpbmcgbGFiZWwsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGFCdXR0b24gPSBvd25lci5wcmltQ3JlYXRlUmFkaW9CdXR0b24obGFiZWwsIHBhcmVudCk7Ci0JCWFCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCXJldHVybiBhQnV0dG9uOwotCX0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gdXBCdXR0b24pCi0JCQl1cEJ1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBkb3duQnV0dG9uKQotCQkJZG93bkJ1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBzZWxlY3RBbGxCdXR0b24pCi0JCQlzZWxlY3RBbGxCdXR0b25TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVzZWxlY3RBbGxCdXR0b24pCi0JCQlkZXNlbGVjdEFsbEJ1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSB1c2VTZXJ2ZXJKQVJzQnRuKQotCQkJaGFuZGxlU2VydmVySkFSc0J1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSB1c2VDbGllbnRKQVJzQnRuKQotCQkJaGFuZGxlQ2xpZW50SkFSc0J1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSB1c2VBbnlKQVJzQnRuKQotCQkJaGFuZGxlQW55SkFSc0J1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYoZXZlbnQud2lkZ2V0ID09IGV4dGVybmFsSmFyQnV0dG9uKQotCQkJaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKTsKLQkJZWxzZSBpZihldmVudC53aWRnZXQgPT0gYWRkVmFyaWFibGVCdXR0b24pCi0JCQloYW5kbGVTZWxlY3RWYXJpYWJsZUJ1dHRvbigpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpewotCQkgLy9vd25lci5oYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpOwotCQlpZiggb3duZXIgaW5zdGFuY2VvZiBXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UgKXsKLQkJCVdlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSBwYWdlID0gKFdlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSlvd25lcjsKLQkJCXBhZ2UuaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKTsKLQkJfSAKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdFZhcmlhYmxlQnV0dG9uKCl7Ci0JCS8vb3duZXIuaGFuZGxlU2VsZWN0VmFyaWFibGVCdXR0b24oKTsKLQkJaWYoIG93bmVyIGluc3RhbmNlb2YgV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlICl7Ci0JCQlXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UgcGFnZSA9IChXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2Upb3duZXI7Ci0JCQlwYWdlLmhhbmRsZVNlbGVjdFZhcmlhYmxlQnV0dG9uKCk7Ci0JCX0gCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlcnZlckpBUnNCdXR0b25TZWxlY3RlZCgpIHsKLQkJbW9kZWwuc2VsZWN0RmlsdGVyTGV2ZWwoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfQ0xJRU5UX0pBUlMpOwotCQlyZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNsaWVudEpBUnNCdXR0b25TZWxlY3RlZCgpIHsKLQkJbW9kZWwuc2VsZWN0RmlsdGVyTGV2ZWwoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfU0VSVkVSX0pBUlMpOwotCQlyZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFueUpBUnNCdXR0b25TZWxlY3RlZCgpIHsKLQkJbW9kZWwuc2VsZWN0RmlsdGVyTGV2ZWwoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9OT05FKTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRhdGVFZGl0KCkgewotCQlyZXR1cm4gdmFsaWRhdGVFZGl0TGlzdGVuZXIudmFsaWRhdGVTdGF0ZSgpLmlzT0soKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZXNlbGVjdEFsbEJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoIXZhbGlkYXRhdGVFZGl0KCkpCi0JCQlyZXR1cm47Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCW1vZGVsLnNldEFsbENsYXNzcGF0aEVsZW1lbnRzU2VsZWN0ZWQoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdEFsbEJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoIXZhbGlkYXRhdGVFZGl0KCkpCi0JCQlyZXR1cm47Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJbW9kZWwuc2V0QWxsQ2xhc3NwYXRoRWxlbWVudHNTZWxlY3RlZChBcnJheXMuYXNMaXN0KGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpLCB0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U2VsZWN0aW9uQXNMaXN0KCkgewotCQlyZXR1cm4gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG93bkJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoIXZhbGlkYXRhdGVFZGl0KCkpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLm1vdmVEb3duKGdldFNlbGVjdGlvbkFzTGlzdCgpKTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCWlmICghdmFsaWRhdGF0ZUVkaXQoKSkKLQkJCXJldHVybjsKLQkJbW9kZWwubW92ZVVwKGdldFNlbGVjdGlvbkFzTGlzdCgpKTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogVXBkYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBhbGwgYnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbkVuYWJsZW1lbnRzKCkgewotCQlpbnRbXSBpbmRpY2VzID0gYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQkJaWYgKHVwQnV0dG9uICE9IG51bGwgJiYgZG93bkJ1dHRvbiAhPSBudWxsKSB7Ci0JCQl1cEJ1dHRvbi5zZXRFbmFibGVkKGNhbk1vdmVVcChpbmRpY2VzKSk7Ci0JCQlkb3duQnV0dG9uLnNldEVuYWJsZWQoY2FuTW92ZURvd24oaW5kaWNlcywgYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Nb3ZlVXAoaW50W10gaW5kaWNlcykgewotCQlyZXR1cm4gY2FuTW92ZShpbmRpY2VzLCAwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Nb3ZlRG93bihpbnRbXSBpbmRpY2VzLCBpbnQgaXRlbUNvdW50KSB7Ci0JCXJldHVybiBjYW5Nb3ZlKGluZGljZXMsIGl0ZW1Db3VudCAtIDEpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbk1vdmUoaW50W10gaW5kaWNlcywgaW50IHJlZmVyZW5jZUluZGV4KSB7Ci0JCWludCBsZW5ndGggPSBpbmRpY2VzLmxlbmd0aDsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaW5kaWNlc1tpXSA9PSByZWZlcmVuY2VJbmRleCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlTGlzdGVuZXJzKCkgewotCQlhZGRDaGVja1N0YXRlTGlzdGVuZXIoKTsKLQkJYWRkU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWF2YWlsYWJsZUpBUkNoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXZhaWxhYmxlSkFSQ2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QobW9kZWwuZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKSAmJiAoaXNSZWFkT25seSgpIHx8ICF2YWxpZGF0YXRlRWRpdCgpIHx8IChpc015Q2xpZW50SkFSKGV2ZW50KSAmJiAhZXZlbnQuZ2V0Q2hlY2tlZCgpKSkpIHsKLQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0Q2hlY2tlZChldmVudC5nZXRFbGVtZW50KCksICFldmVudC5nZXRDaGVja2VkKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCW1vZGVsLnNldFNlbGVjdGlvbihlbGVtZW50LCBldmVudC5nZXRDaGVja2VkKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNNeUNsaWVudEpBUihDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCWlmKGdldENsYXNzcGF0aFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoU2VsZWN0aW9uKCkuaXNNeUNsaWVudEpBUihlbGVtZW50KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdGFibGVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJaWYgKCFpc1JlYWRPbmx5KCkpCi0JCQl1cGRhdGVCdXR0b25FbmFibGVtZW50cygpOwotCX0KLQotCXByb3RlY3RlZCBDbGFzc1BhdGhTZWxlY3Rpb24gZ2V0Q2xhc3NwYXRoU2VsZWN0aW9uKCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBtb2RlbC5nZXRTZWxlY3RlZEVBUkNvbXBvbmVudCgpID09IG51bGwgJiYgIShKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YW5kYWxvbmVQcm9qZWN0KG1vZGVsLmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoQ2hlY2tlZEl0ZW1zKCkgewotCQlpZiAoZ2V0Q2xhc3NwYXRoU2VsZWN0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJamF2YS51dGlsLkxpc3QgZWxlbWVudHMgPSBnZXRDbGFzc3BhdGhTZWxlY3Rpb24oKS5nZXRDbGFzc3BhdGhFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpOwotCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIGVsZW1lbnQuaXNTZWxlY3RlZCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWlmICghaXNXTFBFbnRyeSgpICYmICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YW5kYWxvbmVQcm9qZWN0KG1vZGVsLmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSkpIHsKLQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0SW5wdXQoZ2V0Q2xhc3NwYXRoU2VsZWN0aW9uKCkpOwotCQkJbW9kZWwuc2V0V0xQTW9kZWwoZmFsc2UpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJaW50IG51bWxpbmVzID0gTWF0aC5taW4oMTAsIGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSk7Ci0JCQlkYXRhLmhlaWdodEhpbnQgPSBhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUhlaWdodCgpICogbnVtbGluZXM7Ci0JCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXJlZnJlc2hDaGVja2VkSXRlbXMoKTsKLQkJCXVwZGF0ZUJ1dHRvbkVuYWJsZW1lbnRzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldElucHV0KG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKSk7Ci0JCQltb2RlbC5zZXRXTFBNb2RlbCh0cnVlKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWludCBudW1saW5lcyA9IE1hdGgubWluKDEwLCBhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkpOwotCQkJZGF0YS5oZWlnaHRIaW50ID0gYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1IZWlnaHQoKSAqIG51bWxpbmVzOwotCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlyZWZyZXNoV0xQQ2hlY2tlZEl0ZW1zKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hXTFBDaGVja2VkSXRlbXMoKSB7Ci0JCWlmIChhdmFpbGFibGVKQVJzVmlld2VyLmdldElucHV0KCkgIT0gbnVsbCkgewotCQkJamF2YS51dGlsLkxpc3QgZWxlbWVudHMgPSAoKENsYXNzUGF0aFNlbGVjdGlvbikgYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRJbnB1dCgpKS5nZXRDbGFzc3BhdGhFbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBlbGVtZW50cy5nZXQoaSk7Ci0JCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIGVsZW1lbnQuaXNTZWxlY3RlZCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGVsLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIENsYXNzcGF0aE1vZGVsCi0JICovCi0JcHVibGljIENsYXNzcGF0aE1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kZWwuCi0JICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChDbGFzc3BhdGhNb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCWluaXRpYWxpemVFSkJDbGllbnREZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlYWRPbmx5LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlYWRPbmx5LgotCSAqIEBwYXJhbSByZWFkT25seSBUaGUgcmVhZE9ubHkgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQl0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXTFBFbnRyeSgpIHsKLQkJcmV0dXJuIGlzV0xQRW50cnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V0xQRW50cnkoYm9vbGVhbiBpc1dMUEVudHJ5KSB7Ci0JCXRoaXMuaXNXTFBFbnRyeSA9IGlzV0xQRW50cnk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNsYXNzcGF0aFRhYmxlT3duZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JQ2xhc3NwYXRoVGFibGVPd25lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFlNzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JQ2xhc3NwYXRoVGFibGVPd25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDbGFzc3BhdGhUYWJsZU93bmVyIHsKLQlCdXR0b24gcHJpbUNyZWF0ZVB1c2hCdXR0b24oU3RyaW5nIGxhYmVsLCBDb21wb3NpdGUgYnV0dG9uQ29sdW1uKTsKLQlCdXR0b24gcHJpbUNyZWF0ZVJhZGlvQnV0dG9uKFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIHBhcmVudCk7Ci0JQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVBdmFpbGFibGVKQVJzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpOwotCUNvbXBvc2l0ZSBjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCk7Ci0JLy9CdXR0b24gY3JlYXRlSGlkZUVKQkNsaWVudEpBUnNCdXR0b24oQ29tcG9zaXRlIHBhcmVudCk7IFRoaXMgbWV0aG9kIGlzIG5ldmVyIHVzZWQgaGVuY2UgY29tbWV0aW5nIGl0IG91dCAtIHZrYgotCUdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3N2NlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cyB7Ci0JU3RyaW5nIFVQX0JVVFRPTiA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVcF8xIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRE9XTl9CVVRUT04gPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRG93bl8yIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0VMRUNUX0FMTF9CVVRUT04gPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VsZWN0X0FsbF8zIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVfU0VMRUNUX0FMTF9CVVRUT04gPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGVzZWxlY3RfQWxsXzQiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19USVRMRSA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNBVkVfTUFOSUZFU1RfV0lUSF9FUlJPUiA9TWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNBVkVfTUFOSUZFU1RfV0lUSF9FUlJPUiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfRURJVE9SID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfRURJVE9SIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9QUk9QX1BBR0UgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9QUk9QX1BBR0UiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNQU5JRkVTVF9QUk9CTEVNXzEgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTUFOSUZFU1RfUFJPQkxFTV8xIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFOSUZFU1RfUFJPQkxFTV8yID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk1BTklGRVNUX1BST0JMRU1fMiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BTklGRVNUX1BST0JMRU1fMyA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNQU5JRkVTVF9QUk9CTEVNXzMiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNQU5JRkVTVF9QUk9CTEVNXzQgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTUFOSUZFU1RfUFJPQkxFTV80Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVESVJFQ1RfVEVYVF9FRElUT1JfVUlfID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJFRElSRUNUX1RFWFRfRURJVE9SX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEVKQl9DTElFTlRfUkFESU9fVUlfCQk9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFSkJfQ0xJRU5UX1JBRElPX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVTRV9FSkJfU0VSVkVSX0pBUnNfVUlfIAk9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVU0VfRUpCX1NFUlZFUl9KQVJzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVTRV9FSkJfQ0xJRU5UX0pBUnNfVUlfIAk9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVU0VfRUpCX0NMSUVOVF9KQVJzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVTRV9CT1RIX1VJXwkJCQk9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVU0VfQk9USF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVEZXBlbmRlbmNpZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRURlcGVuZGVuY2llc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkZDBlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRURlcGVuZGVuY2llc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi1wdWJsaWMgY2xhc3MgSjJFRURlcGVuZGVuY2llc1BhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCQotCXB1YmxpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEoyRUVEZXBlbmRlbmNpZXNQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGNyZWF0ZUxhYmVsc0NvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMYWJlbHNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgbGFiZWxzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGFiZWxzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxhYmVsc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGxhYmVsc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVBUl9Nb2R1bGVzIikpOyAvLyROT04tTkxTLTEkCi0JCWZpbGxEZXNjcmlwdGlvbihsYWJlbHNHcm91cCwgTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVBUl9Nb2R1bGVzX0Rlc2MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGxhYmVsc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkoyRUVfTW9kdWxlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlmaWxsRGVzY3JpcHRpb24obGFiZWxzR3JvdXAsIE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJKMkVFX01vZHVsZXNfRGVzYyIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwobGFiZWxzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV2ViX0xpYnJhcmllcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlmaWxsRGVzY3JpcHRpb24obGFiZWxzR3JvdXAsIE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJfTGlicmFyaWVzX0Rlc2MiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxEZXNjcmlwdGlvbihDb21wb3NpdGUgYywgU3RyaW5nIHMpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTU7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDE1OwotCQlkYXRhLndpZHRoSGludCA9IDI1MDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gNzA7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGMsIFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGV4dC5zZXRUZXh0TGltaXQoODApOwotCQl0ZXh0LnNldFNpemUoMzAwLCAxMjApOwotCQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJdGV4dC5zZXRUZXh0KHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVQcm9wZXJ0aWVzQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVByb3BlcnRpZXNDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmYjNlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVByb3BlcnRpZXNDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDgsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBKMkVFUHJvcGVydGllc0NvbnN0YW50cyB7Ci0JLy9KMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSW1wb3J0X0NsYXNzZXMiKTsKLQlwdWJsaWMgU3RyaW5nIEoyRUVfTEVWRUwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRV9MZXZlbCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKMkVFXzEyID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVfMTIiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSjJFRV8xMl9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFXzEyX0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEoyRUVfMTMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRV8xMyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKMkVFXzEzX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVfMTNfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSjJFRV8xNF9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFXzE0X0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVKQl9MRVZFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFSkJfTEVWRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRUpCXzExID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVKQl8xMSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFSkJfMTFfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUpCXzExX0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVKQl8yMCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFSkJfMjAiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRUpCXzIwX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVKQl8yMF9ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFSkJfMjFfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUpCXzIxX0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RPUl9MRVZFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDT05ORUNUT1JfTEVWRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVE9SXzEwID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTk5FQ1RPUl8xMCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUT1JfMTUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ09OTkVDVE9SXzE1Iik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RPUl8xMF9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDT05ORUNUT1JfMTBfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVE9SXzE1X0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTk5FQ1RPUl8xNV9ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfTEVWRUwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV0VCX0xFVkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl8yMl9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXRUJfMjJfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VCXzIzX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIldFQl8yM19ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfMjRfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV0VCXzI0X0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFQUF9DTElFTlRfTEVWRUwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQVBQX0NMSUVOVF9MRVZFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBBUFBfQ0xJRU5UXzEyX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFQUF9DTElFTlRfMTJfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQVBQX0NMSUVOVF8xM19ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBUFBfQ0xJRU5UXzEzX0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFQUF9DTElFTlRfMTRfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQVBQX0NMSUVOVF8xNF9ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfQ09OVEVYVF9ST09UID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIldFQl9DT05URVhUX1JPT1QiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VCX0NPTlRFTlRfRk9MREVSX05BTUUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV0VCX0NPTlRFTlRfRk9MREVSX05BTUUiKTsgLy8kTk9OLU5MUy0xJAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0pBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0pBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTExMTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KQVJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmNvbXBvbmVudGNvcmUudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc1BhdGhTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc3BhdGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ2xhc3NwYXRoTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aE1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuVXBkYXRlSmF2YUJ1aWxkUGF0aE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5saXN0ZW5lcnMuSVZhbGlkYXRlRWRpdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmxpc3RlbmVycy5WYWxpZGF0ZUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSUNsYXNzcGF0aFRhYmxlT3duZXIsIExpc3RlbmVyLCBDbGFzc3BhdGhNb2RlbExpc3RlbmVyLCBJQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cyB7Ci0KLSAgICBwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcm90ZWN0ZWQgSU9FeGNlcHRpb24gY2F1Z2h0TWFuaWZlc3RFeGNlcHRpb247Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEaXJ0eTsKLSAgICBwcm90ZWN0ZWQgVGV4dCBjbGFzc1BhdGhUZXh0OwotICAgIHByb3RlY3RlZCBUZXh0IGNvbXBvbmVudE5hbWVUZXh0OwotICAgIHByb3RlY3RlZCBDbGFzc3BhdGhNb2RlbCBtb2RlbDsKLSAgICBwcm90ZWN0ZWQgQ0NvbWJvIGF2YWlsYWJsZUFwcHNDb21ibzsKLSAgICBwcm90ZWN0ZWQgQ2xhc3NwYXRoVGFibGVNYW5hZ2VyIHRhYmxlTWFuYWdlcjsKLSAgICBwcm90ZWN0ZWQgSVZhbGlkYXRlRWRpdExpc3RlbmVyIHZhbGlkYXRlRWRpdExpc3RlbmVyOwotICAgIHByb3RlY3RlZCBMYWJlbCBtYW5pZmVzdExhYmVsOwotICAgIHByb3RlY3RlZCBMYWJlbCBlbnRlcnByaXNlQXBwbGljYXRpb25MYWJlbDsKLSAgICBwcm90ZWN0ZWQgTGFiZWwgYXZhaWxhYmxlRGVwZW5kZW50SmFyczsKLSAgCi0KLSAgICAvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLgotCSAqLwotICAgIHB1YmxpYyBKQVJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgbW9kZWwgPSBuZXcgQ2xhc3NwYXRoTW9kZWwobnVsbCk7Ci0gICAgICAgIG1vZGVsLnNldFByb2plY3QocHJvamVjdCk7Ci0gICAgICAgIGlmKCBtb2RlbC5nZXRDb21wb25lbnQoKSAhPSBudWxsICl7Ci0JICAgICAgICBtb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkgICAgICAgIHVwZGF0ZU1vZGVsTWFuaWZlc3QoKTsKLQkgICAgICAgIGluaXRpYWxpemVWYWxpZGF0ZUVkaXRMaXN0ZW5lcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgCXN1cGVyLmRpc3Bvc2UoKTsKLSAgICAJaWYobW9kZWwuZWFyQXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLSAgICAJCW1vZGVsLmVhckFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0gICAgCQltb2RlbC5lYXJBcnRpZmFjdEVkaXQgPSBudWxsOwotICAgIAl9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1vZGVsTWFuaWZlc3QoKSB7Ci0gICAgICAgIGlmIChKZW1Qcm9qZWN0VXRpbGl0aWVzLmlzQmluYXJ5UHJvamVjdChwcm9qZWN0KSB8fCBtb2RlbC5nZXRBdmFpbGFibGVFQVJDb21wb25lbnRzKCkubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIElDb250YWluZXIgcm9vdCA9IG51bGw7Ci0gICAgICAgIElGaWxlIG1hbmlmZXN0RmlsZSA9IG51bGw7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpCi0gICAgICAgICAgICByb290ID0gcHJvamVjdDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcm9vdCA9IEplbVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlRm9sZGVyT3JGaXJzdChwcm9qZWN0LCBudWxsKTsKLQotICAgICAgICBpZiAocm9vdCAhPSBudWxsKQotICAgICAgICAgICAgbWFuaWZlc3RGaWxlID0gcm9vdC5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0KLSAgICAgICAgaWYgKG1hbmlmZXN0RmlsZSA9PSBudWxsIHx8ICFtYW5pZmVzdEZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW4gPSBtYW5pZmVzdEZpbGUuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgICAgIEFyY2hpdmVNYW5pZmVzdCBtZiA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKG5ldyBNYW5pZmVzdChpbikpOwotICAgICAgICAgICAgbW9kZWwucHJpbVNldE1hbmlmZXN0KG1mKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0gICAgICAgICAgICBtb2RlbC5wcmltU2V0TWFuaWZlc3QobmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGlveCk7Ci0gICAgICAgICAgICBtb2RlbC5wcmltU2V0TWFuaWZlc3QobmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoKSk7Ci0gICAgICAgICAgICBjYXVnaHRNYW5pZmVzdEV4Y2VwdGlvbiA9IGlveDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB3ZVRyaWVkKSB7Ci0gICAgICAgICAgICAgICAgCS8vSWdub3JlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRlRWRpdExpc3RlbmVyKCkgewotICAgICAgICB2YWxpZGF0ZUVkaXRMaXN0ZW5lciA9IG5ldyBWYWxpZGF0ZUVkaXRMaXN0ZW5lcihudWxsLCBtb2RlbCk7Ci0gICAgICAgIHZhbGlkYXRlRWRpdExpc3RlbmVyLnNldFNoZWxsKGdldFNoZWxsKCkpOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgaWYgKHZpc2libGUgJiYgY2F1Z2h0TWFuaWZlc3RFeGNlcHRpb24gIT0gbnVsbCAmJiAhbW9kZWwuaXNEaXJ0eSgpKQotICAgICAgICAgICAgTWFuaWZlc3RFcnJvclByb21wdGVyLnNob3dNYW5pZmVzdEV4Y2VwdGlvbihnZXRTaGVsbCgpLCBFUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19NRVNTQUdFX1BST1BfUEFHRSwgZmFsc2UsIGNhdWdodE1hbmlmZXN0RXhjZXB0aW9uKTsKLQotICAgIH0KLQotICAgIC8qKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKQotCSAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVCYXNpY0NvbXBvc2l0ZShwYXJlbnQpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBpZiggbW9kZWwuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCApeyAgICAgICAgCi0JICAgICAgICBpZighaXNWYWxpZENvbXBvbmVudCgpKQotCSAgICAgICAgCXJldHVybiBjb21wb3NpdGU7Ci0JICAgICAgICBjcmVhdGVQcm9qZWN0TGFiZWxzR3JvdXAoY29tcG9zaXRlKTsKLQkgICAgICAgIGNyZWF0ZUxpc3RHcm91cChjb21wb3NpdGUpOwotCSAgICAgICAgY3JlYXRlVGV4dEdyb3VwKGNvbXBvc2l0ZSk7Ci0JICAgICAgICByZWZyZXNoKCk7Ci0gICAgCX0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNvbXAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVCYXNpY0NvbXBvc2l0ZShDb21wb3NpdGUgY29tcCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZENvbXBvbmVudCgpIHsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkgewotCQkJdGhpcy5zZXRFcnJvck1lc3NhZ2UoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVBUl9Nb2R1bGVfRGVwX0Vycm9yIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGFuZGFsb25lUHJvamVjdChtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpICkgewotCQkJdGhpcy5zZXRFcnJvck1lc3NhZ2UoQ2xhc3NwYXRoTW9kZWwuTk9fRUFSX01FU1NBR0UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3RMYWJlbHNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGxhYmVsc0dyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxhYmVsc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlsYWJlbHNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChsYWJlbHNHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQcm9qZWN0X25hbWVfX1VJXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9qZWN0IG5hbWU6IgotCi0JCWNvbXBvbmVudE5hbWVUZXh0ID0gbmV3IFRleHQobGFiZWxzR3JvdXAsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNvbXBvbmVudE5hbWVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJY29tcG9uZW50TmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY29tcG9uZW50TmFtZVRleHQuc2V0VGV4dChwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQotCQljcmVhdGVFbnRlcnByaXNlQXBwc0NvbnRyb2xzKGxhYmVsc0dyb3VwKTsKLQotCX0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVFbnRlcnByaXNlQXBwc0NvbnRyb2xzKENvbXBvc2l0ZSBsYWJlbHNHcm91cCkgewotCi0JCWVudGVycHJpc2VBcHBsaWNhdGlvbkxhYmVsID0gbmV3IExhYmVsKGxhYmVsc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWVudGVycHJpc2VBcHBsaWNhdGlvbkxhYmVsLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVBUl9Qcm9qZWN0X05hbWVfX1VJX19VSV8iKSk7IC8vJE5PTi1OTFMtMSQgPSAiRUFSIHByb2plY3QgbmFtZToiCi0KLQkJYXZhaWxhYmxlQXBwc0NvbWJvID0gbmV3IENDb21ibyhsYWJlbHNHcm91cCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlhdmFpbGFibGVBcHBzQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJYXZhaWxhYmxlQXBwc0NvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCi0JfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBsaXN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxpc3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ0RhdGEuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0gICAgICAgIGxpc3RHcm91cC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQotICAgICAgICBhdmFpbGFibGVEZXBlbmRlbnRKYXJzID0gbmV3IExhYmVsKGxpc3RHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLSAgICAgICAgYXZhaWxhYmxlRGVwZW5kZW50SmFycy5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBdmFpbGFibGVfZGVwZW5kZW50X0pBUnNfX1VJXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJBdmFpbGFibGUgZGVwZW5kZW50IEpBUnM6IgotICAgICAgICBhdmFpbGFibGVEZXBlbmRlbnRKYXJzLnNldExheW91dERhdGEoZ0RhdGEpOwotICAgICAgICBjcmVhdGVUYWJsZUNvbXBvc2l0ZShsaXN0R3JvdXApOwotICAgIH0KLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb24udWkuY2xhc3NwYXRoLklDbGFzc3BhdGhUYWJsZU93bmVyI2NyZWF0ZUdyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLSAgICBwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVRleHRHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIHRleHRHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQl0ZXh0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRleHRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQotCQljcmVhdGVDbGFzc1BhdGhUZXh0KHRleHRHcm91cCk7Ci0KLQl9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDbGFzc1BhdGhUZXh0KENvbXBvc2l0ZSB0ZXh0R3JvdXApIHsKLSAgICAJCi0gICAgCW1hbmlmZXN0TGFiZWwgPSBuZXcgTGFiZWwodGV4dEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hbmlmZXN0TGFiZWwuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTWFuaWZlc3RfQ2xhc3MtUGF0aF9fVUlfIikpOyAvLyROT04tTkxTLTEkID0gIk1hbmlmZXN0IENsYXNzLVBhdGg6IgotCQkKLSAgICAgICAgY2xhc3NQYXRoVGV4dCA9IG5ldyBUZXh0KHRleHRHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKLSAgICAgICAgR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ0RhdGEud2lkdGhIaW50ID0gNDAwOwotICAgICAgICBnRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotICAgICAgICBjbGFzc1BhdGhUZXh0LnNldExheW91dERhdGEoZ0RhdGEpOwotICAgICAgICBjbGFzc1BhdGhUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ0RhdGEpOwotICAgICAgICB0YWJsZU1hbmFnZXIgPSBuZXcgQ2xhc3NwYXRoVGFibGVNYW5hZ2VyKHRoaXMsIG1vZGVsLCB2YWxpZGF0ZUVkaXRMaXN0ZW5lcik7Ci0gICAgICAgIHRhYmxlTWFuYWdlci5zZXRSZWFkT25seShpc1JlYWRPbmx5KCkpOwotICAgICAgICB0YWJsZU1hbmFnZXIuZmlsbENvbXBvc2l0ZShjb21wb3NpdGUpOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBzZWUgSUNsYXNzcGF0aFRhYmxlT3duZXIjY3JlYXRlQXZhaWxhYmxlSkFSc1ZpZXdlcihDb21wb3NpdGUpCi0JICovCi0gICAgcHVibGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlQXZhaWxhYmxlSkFSc1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGludCBmbGFncyA9IFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEk7Ci0KLSAgICAgICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LGZsYWdzKTsKLSAgICAgICAgQ2hlY2tib3hUYWJsZVZpZXdlciBhdmFpbGFibGVKQVJzVmlld2VyID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIodGFibGUpOwotCi0gICAgICAgIC8vIHNldCB1cCB0YWJsZSBsYXlvdXQKLSAgICAgICAgVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dCgpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDIwMCwgdHJ1ZSkpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDIwMCwgdHJ1ZSkpOwotICAgICAgICB0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotICAgICAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIGF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0U29ydGVyKG51bGwpOwotCi0gICAgICAgIC8vIHRhYmxlIGNvbHVtbnMKLSAgICAgICAgVGFibGVDb2x1bW4gZmlsZU5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAwKTsKLSAgICAgICAgZmlsZU5hbWVDb2x1bW4uc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSkFSL01vZHVsZV9VSV8iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlsZU5hbWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIHByb2plY3RDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAxKTsKLSAgICAgICAgcHJvamVjdENvbHVtbi5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQcm9qZWN0X1VJXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9qZWN0IgotICAgICAgICBwcm9qZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQubGF5b3V0KHRhYmxlLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIGF2YWlsYWJsZUpBUnNWaWV3ZXI7Ci0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAc2VlIElDbGFzc3BhdGhUYWJsZU93bmVyI2NyZWF0ZUJ1dHRvbkNvbHVtbkNvbXBvc2l0ZShDb21wb3NpdGUpCi0JICovCi0gICAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgYnV0dG9uQ29sdW1uID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBidXR0b25Db2x1bW4uc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgICAgYnV0dG9uQ29sdW1uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiBidXR0b25Db2x1bW47Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHNlZSBJQ2xhc3NwYXRoVGFibGVPd25lcgotCSAqLwotICAgIHB1YmxpYyBCdXR0b24gcHJpbUNyZWF0ZVB1c2hCdXR0b24oU3RyaW5nIGxhYmVsLCBDb21wb3NpdGUgYnV0dG9uQ29sdW1uKSB7Ci0gICAgICAgIEJ1dHRvbiBhQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db2x1bW4sIFNXVC5QVVNIKTsKLSAgICAgICAgYUJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICAgICAgcmV0dXJuIGFCdXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHNlZSBJQ2xhc3NwYXRoVGFibGVPd25lcgotCSAqLwotICAgIHB1YmxpYyBCdXR0b24gcHJpbUNyZWF0ZVJhZGlvQnV0dG9uKFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gYUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgICAgICBhQnV0dG9uLnNldFRleHQobGFiZWwpOwotICAgICAgICByZXR1cm4gYUJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC53aWRnZXQgPT0gYXZhaWxhYmxlQXBwc0NvbWJvKQotICAgICAgICAgICAgYXZhaWxhYmxlQXBwc1NlbGVjdGVkKGV2ZW50KTsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIHZvaWQgYXZhaWxhYmxlQXBwc1NlbGVjdGVkKEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGludCBpbmRleCA9IGF2YWlsYWJsZUFwcHNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBtb2RlbC5zZWxlY3RFQVIoaW5kZXgpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUFwcHMoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50W10gY29tcG9uZW50cyA9IG1vZGVsLmdldEF2YWlsYWJsZUVBUkNvbXBvbmVudHMoKTsKLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tjb21wb25lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFsdWVzW2ldID0gY29tcG9uZW50c1tpXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChhdmFpbGFibGVBcHBzQ29tYm8gIT0gbnVsbCkgewotCQkJYXZhaWxhYmxlQXBwc0NvbWJvLnNldEl0ZW1zKHZhbHVlcyk7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBzZWxlY3RlZCA9IG1vZGVsLmdldFNlbGVjdGVkRUFSQ29tcG9uZW50KCk7Ci0JCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJCWludCBpbmRleCA9IEFycmF5cy5hc0xpc3QoY29tcG9uZW50cykuaW5kZXhPZihzZWxlY3RlZCk7Ci0JCQkJYXZhaWxhYmxlQXBwc0NvbWJvLnNlbGVjdChpbmRleCk7Ci0JCQl9IGVsc2UKLQkJCQlhdmFpbGFibGVBcHBzQ29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJfQotCX0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2goKSB7Ci0JCXBvcHVsYXRlQXBwcygpOwotCQl0YWJsZU1hbmFnZXIucmVmcmVzaCgpOwotCQlyZWZyZXNoVGV4dCgpOwotCX0KLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hUZXh0KCkgewotCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsID0gbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCk7Ci0JCWlmKCBzZWwgIT0gbnVsbCAmJiBjbGFzc1BhdGhUZXh0ICE9IG51bGwgKQotCQkJY2xhc3NQYXRoVGV4dC5zZXRUZXh0KHNlbCA9PSBudWxsID8gIiIgOiBzZWwudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLSAgICAvKioKLQkgKiBAc2VlIENsYXNzcGF0aE1vZGVsTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKENsYXNzcGF0aE1vZGVsRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKENsYXNzcGF0aE1vZGVsRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGlmIChldnQuZ2V0RXZlbnRUeXBlKCkgPT0gQ2xhc3NwYXRoTW9kZWxFdmVudC5DTEFTU19QQVRIX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIGlzRGlydHkgPSB0cnVlOwotICAgICAgICAgICAgcmVmcmVzaFRleHQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChldnQuZ2V0RXZlbnRUeXBlKCkgPT0gQ2xhc3NwYXRoTW9kZWxFdmVudC5FQVJfUFJPSkVDVF9DSEFOR0VEKQotICAgICAgICAgICAgdGFibGVNYW5hZ2VyLnJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICBtb2RlbC5yZXNldENsYXNzUGF0aFNlbGVjdGlvbigpOwotICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgIGlzRGlydHkgPSBmYWxzZTsKLSAgICAgICAgbW9kZWwuZGlzcG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotICAgIAltb2RlbC5kaXNwb3NlKCk7Ci0gICAgCXJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHNlZSBJUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkgCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgICAgICBpZiAoIWlzRGlydHkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY29tcG9zZWQgPSBuZXcgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oY3JlYXRlTWFuaWZlc3RPcGVyYXRpb24oKSk7Ci0gICAgICAgIGNvbXBvc2VkLmFkZFJ1bm5hYmxlKGNyZWF0ZUJ1aWxkUGF0aE9wZXJhdGlvbigpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSkucnVuKHRydWUsIHRydWUsIGNvbXBvc2VkKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX2ludGVybmFsX2Vycm9yX29jY3VycmVkX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gdGl0bGU7Ci0gICAgICAgICAgICBpZiAoZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCAmJiBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtc2cgPSBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih0aGlzLmdldFNoZWxsKCksIHRpdGxlLCBtc2cpOwotICAgICAgICAgICAgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGNhbmNlbGxlZAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAJbW9kZWwuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlzRGlydHkgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotLy8gICAgcHJpdmF0ZSBib29sZWFuIHJ1bldMUE9wKFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkKSB7Ci0vLyAgICAJdHJ5IHsKLS8vCQkJaWYgKGNvbXBvc2VkICE9IG51bGwpCi0vLwkJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpLnJ1bih0cnVlLCB0cnVlLCBjb21wb3NlZCk7Ci0vLwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQlTdHJpbmcgdGl0bGUgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQW5faW50ZXJuYWxfZXJyb3Jfb2NjdXJyZWRfRVJST1JfIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJU3RyaW5nIG1zZyA9IHRpdGxlOwotLy8JCQlpZiAoZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCAmJiBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLS8vCQkJCW1zZyA9IGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLS8vCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IodGhpcy5nZXRTaGVsbCgpLCB0aXRsZSwgbXNnKTsKLS8vCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vIGNhbmNlbGxlZAotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JCXJldHVybiB0cnVlOwotLy8gICAgfQotCi0JcHJvdGVjdGVkIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNyZWF0ZUNvbXBvbmVudERlcGVuZGVuY3lPcGVyYXRpb25zKCkgewotCQlXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBjb21wb3NlZE9wID0gbnVsbDsKLQkJTGlzdCBzZWxlY3RlZCA9IGdldFNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpLmdldENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0JCUxpc3QgdW5zZWxlY3RlZCA9IGdldFVuU2VsZWN0ZWRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKTsKLQkJCi0JCUxpc3QgdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQuc2l6ZSgpOyBpKyspIHsKLQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBzZWxlY3RlZC5nZXQoaSk7Ci0JCQlJUHJvamVjdCBlbGVtZW50UHJvamVjdCA9IGVsZW1lbnQuZ2V0UHJvamVjdCgpOwotCQkJaWYoIGVsZW1lbnRQcm9qZWN0ICE9IG51bGwgKXsKLQkJCQlJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWxlbWVudFByb2plY3QpOwotCQkJCXRhcmdldENvbXBvbmVudHNIYW5kbGVzLmFkZCh0YXJnZXRDb21wKTsKLQkJCX0KLQkJfQotCQlpZiAoIXRhcmdldENvbXBvbmVudHNIYW5kbGVzLmlzRW1wdHkoKSkgewotCQkJY29tcG9zZWRPcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbigpOwotCQkJY29tcG9zZWRPcC5hZGRSdW5uYWJsZShXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhDb21wb25lbnRVdGlsaXRpZXMuY3JlYXRlV0xQUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKG1vZGVsLmdldENvbXBvbmVudCgpLCB0YXJnZXRDb21wb25lbnRzSGFuZGxlcykpKTsKLQkJfQotCQl0YXJnZXRDb21wb25lbnRzSGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bnNlbGVjdGVkLnNpemUoKTsgaSsrKSB7Ci0JCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgdW5zZWxlY3RlZC5nZXQoaSk7Ci0JCQlJUHJvamVjdCBlbGVtZW50UHJvamVjdCA9IGVsZW1lbnQuZ2V0UHJvamVjdCgpOwotCQkJaWYoIGVsZW1lbnRQcm9qZWN0ICE9IG51bGwgKXsKLQkJCQlpZiAoTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChlbGVtZW50UHJvamVjdCkpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVsZW1lbnRQcm9qZWN0KTsKLQkJCQkJdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMuYWRkKHRhcmdldENvbXApOwotCQkJCX0KLQkJCX1lbHNlewotCQkJCVVSSSBhcmNoaXZlVVJJID0gZWxlbWVudC5nZXRBcmNoaXZlVVJJKCk7Ci0JCQkJaWYoIGFyY2hpdmVVUkkgIT0gbnVsbCAmJiAhYXJjaGl2ZVVSSS5lcXVhbHMoIiIpICl7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHR5cGUgPSBNb2R1bGVVUklVdGlsLmdldEFyY2hpdmVUeXBlKGFyY2hpdmVVUkkpOwotCQkJCQkJU3RyaW5nIHRtcG5hbWUgPSBNb2R1bGVVUklVdGlsLmdldEFyY2hpdmVOYW1lKGFyY2hpdmVVUkkpOwotCQkJCQkJbmFtZSA9IHR5cGUgKyBJUGF0aC5TRVBBUkFUT1IgKyB0bXBuYW1lOwotCQkJCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQkJaWYoICFuYW1lLmVxdWFscygiIikpeyAvLyROT04tTkxTLTEkCi0JCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRSZWZlcmVuY2UobmFtZSk7Ci0JCQkJCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCXRhcmdldENvbXBvbmVudHNIYW5kbGVzLmFkZChyZWZlcmVuY2VkKTsKLQkJCQkJfQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCF0YXJnZXRDb21wb25lbnRzSGFuZGxlcy5pc0VtcHR5KCkpIHsKLQkJCWlmKGNvbXBvc2VkT3AgPT0gbnVsbCkKLQkJCQljb21wb3NlZE9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCk7Ci0JCQljb21wb3NlZE9wLmFkZFJ1bm5hYmxlKFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKENvbXBvbmVudFV0aWxpdGllcy5yZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24obW9kZWwuZ2V0Q29tcG9uZW50KCksIHRhcmdldENvbXBvbmVudHNIYW5kbGVzKSkpOwotCQl9Ci0JCXJldHVybiBjb21wb3NlZE9wOwotCX0KLQkKLQlwcm90ZWN0ZWQgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY3JlYXRlRmxleFByb2plY3RPcGVyYXRpb25zKCkgewotCQlXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBjb21wb3NlZE9wID0gbnVsbDsKLQkJdHJ5IHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gdGFibGVNYW5hZ2VyLmF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGVsZW1lbnRzW2ldOwotCQkJCUlQcm9qZWN0IGVsZW1lbnRQcm9qZWN0ID0gZWxlbWVudC5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKCBlbGVtZW50UHJvamVjdCAhPSBudWxsICYmICFlbGVtZW50UHJvamVjdC5oYXNOYXR1cmUoSU1vZHVsZUNvbnN0YW50cy5NT0RVTEVfTkFUVVJFX0lEKSkgewotCQkJCQlpZihjb21wb3NlZE9wID09IG51bGwpCi0JCQkJCQljb21wb3NlZE9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCk7Ci0JCQkJCWNvbXBvc2VkT3AuYWRkUnVubmFibGUoV1RQVUlQbHVnaW4uZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoSjJFRVByb2plY3RVdGlsaXRpZXMuY3JlYXRlRmxleEphdmFQcm9qZWN0Rm9yUHJvamVjdE9wZXJhdGlvbihlbGVtZW50UHJvamVjdCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gY29tcG9zZWRPcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBjcmVhdGVCdWlsZFBhdGhPcGVyYXRpb24oKSB7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0gICAgICAgIHJldHVybiBXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhuZXcgVXBkYXRlSmF2YUJ1aWxkUGF0aE9wZXJhdGlvbihqYXZhUHJvamVjdCxnZXRTZWxlY3RlZENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKSkpOwotICAgIH0KLQkKLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGNyZWF0ZVdMUEJ1aWxkUGF0aE9wZXJhdGlvbigpIHsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKG5ldyBVcGRhdGVKYXZhQnVpbGRQYXRoT3BlcmF0aW9uKGphdmFQcm9qZWN0LGdldFNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpLGdldFVuU2VsZWN0ZWRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkpKTsKLSAgICB9Ci0JCi0JcHJvdGVjdGVkIENsYXNzUGF0aFNlbGVjdGlvbiBnZXRVblNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpIHsKLQkJQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLQkJT2JqZWN0W10gY2hlY2tlZEVsZW1lbnRzID0gdGFibGVNYW5hZ2VyLmF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCUxpc3QgbW9kZWxFbGVtZW50cyA9IG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKS5nZXRDbGFzc3BhdGhFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCUxpc3QgY2hlY2tlZEVsZW1lbnRzTGlzdCA9IEFycmF5cy5hc0xpc3QoY2hlY2tlZEVsZW1lbnRzKTsKLQkJCWlmICghY2hlY2tlZEVsZW1lbnRzTGlzdC5jb250YWlucyhtb2RlbEVsZW1lbnRzLmdldChpKSkpIHsKLQkJCQlzZWxlY3Rpb24uZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKS5hZGQobW9kZWxFbGVtZW50cy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCQotICAgIAotICAgIHByaXZhdGUgQ2xhc3NQYXRoU2VsZWN0aW9uIGdldFNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpIHsKLSAgICAJCUNsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQ2xhc3NQYXRoU2VsZWN0aW9uKCk7Ci0gICAgCQlPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSB0YWJsZU1hbmFnZXIuYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLSAgICAJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGVja2VkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAJCQlzZWxlY3Rpb24uZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKS5hZGQoY2hlY2tlZEVsZW1lbnRzW2ldKTsKLSAgICAJCX0KLSAgICAJCXJldHVybiBzZWxlY3Rpb247Ci0JfQotICAgIAotICAgIHByb3RlY3RlZCBVcGRhdGVNYW5pZmVzdE9wZXJhdGlvbiBjcmVhdGVNYW5pZmVzdE9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVNYW5pZmVzdE9wZXJhdGlvbihwcm9qZWN0LmdldE5hbWUoKSwgbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCkudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLSAgICAgICAgcmV0dXJuIEplbVByb2plY3RVdGlsaXRpZXMuaXNCaW5hcnlQcm9qZWN0KHByb2plY3QpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NYW5pZmVzdEVycm9yUHJvbXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NYW5pZmVzdEVycm9yUHJvbXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4YjEyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvTWFuaWZlc3RFcnJvclByb21wdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RFcnJvclByb21wdGVyIGltcGxlbWVudHMgSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbmlmZXN0RXJyb3JQcm9tcHRlci4KLQkgKi8KLQlwcml2YXRlIE1hbmlmZXN0RXJyb3JQcm9tcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dNYW5pZmVzdEV4Y2VwdGlvbihTaGVsbCBzaGVsbCwgU3RyaW5nIGJhc2VNZXNzYWdlLCBib29sZWFuIGluY2x1ZGVDYW5jZWwsIFRocm93YWJsZSBjYXVnaHQpIHsKLQkJU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzZU1lc3NhZ2UpOwotCQltc2cuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQoTUFOSUZFU1RfUFJPQkxFTV8xKTsKLQkJbXNnLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQltc2cuYXBwZW5kKE1BTklGRVNUX1BST0JMRU1fMik7Ci0JCW1zZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZChNQU5JRkVTVF9QUk9CTEVNXzMpOwotCQltc2cuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQoTUFOSUZFU1RfUFJPQkxFTV80KTsKLQkJcmV0dXJuIEVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwKLQkJICAgRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfVElUTEUsCi0JCSAgIG1zZy50b1N0cmluZygpLAotCQkgICBjYXVnaHQsCi0JCSAgIDAsIGluY2x1ZGVDYW5jZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzI4MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJtYW5pZmVzdF91aSIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZT0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCQkKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IAotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCXRyeSB7cmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7cmV0dXJuIGdldFN0cmluZyhrZXkpO30KLQotfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzLCBpbnQgeCkgewotCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTUxMDMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuV0ZUV3JhcHBlZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0TmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzUGF0aFZhbHVlOwotCXByb3RlY3RlZCBib29sZWFuIHJlcGxhY2U7Ci0vKioKLSAqIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBVcGRhdGVNYW5pZmVzdE9wZXJhdGlvbihTdHJpbmcgYVByb2plY3ROYW1lLCBTdHJpbmcgYVNwYWNlRGVsaW1pdGVkUGF0aCwgYm9vbGVhbiByZXBsYWNlSW5zdGVhZE9mTWVyZ2UpIHsKLQlzdXBlcigpOwotCXByb2plY3ROYW1lID0gYVByb2plY3ROYW1lOwotCWNsYXNzUGF0aFZhbHVlID0gYVNwYWNlRGVsaW1pdGVkUGF0aDsKLQlyZXBsYWNlID0gcmVwbGFjZUluc3RlYWRPZk1lcmdlOwotfQotcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JcmV0dXJuIEoyRUVQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotfQotLyoqCi0gKiBSdW5zIHRoaXMgb3BlcmF0aW9uLiAgUHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yLgotICogVGhpcyBtZXRob2QgaXMgdXN1YWxseSBpbnZva2VkIGJ5IGFuIDxjb2RlPklSdW5uYWJsZUNvbnRleHQ8L2NvZGU+J3MgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QsCi0gKiB3aGljaCBzdXBwbGllcyB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4KLSAqIEEgcmVxdWVzdCB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaG9ub3JlZCBhbmQgYWNrbm93bGVkZ2VkIAotICogYnkgdGhyb3dpbmcgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+LgotICoKLSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlCi0gKiAgIHJlcXVlc3RzIGZvciBjYW5jZWxhdGlvbgotICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSBydW4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sCi0gKiAJaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkKLSAqICB3cmFwcGVkIGluIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+IGJ5IHRoZSBjYWxsaW5nIGNvbnRleHQKLSAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBkZXRlY3RzIGEgcmVxdWVzdCB0byBjYW5jZWwsIAotICogIHVzaW5nIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcgCi0gKiAgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+Ci0gKgotICogQHNlZSBJUnVubmFibGVDb250ZXh0I3J1bgotICovCi1wdWJsaWMgdm9pZCBydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQlJUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOwotCXRyeSB7Ci0JCUFyY2hpdmVNYW5pZmVzdCBtZiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdChwKTsKLQkJaWYgKG1mID09IG51bGwpCi0JCQltZiA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKCk7Ci0JCW1mLmFkZFZlcnNpb25JZk5lY2Vzc2FyeSgpOwotCQlpZiAocmVwbGFjZSkKLQkJCW1mLnNldENsYXNzUGF0aChjbGFzc1BhdGhWYWx1ZSk7Ci0JCWVsc2UKLQkJCW1mLm1lcmdlQ2xhc3NQYXRoKEFyY2hpdmVVdGlsLmdldFRva2VucyhjbGFzc1BhdGhWYWx1ZSkpOwotCQlKMkVFUHJvamVjdFV0aWxpdGllcy53cml0ZU1hbmlmZXN0KHAsIG1mKTsKLQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCXRocm93IG5ldyBXRlRXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjEwZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQnVpbGRQYXRoRGlhbG9nQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc1BhdGhTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc3BhdGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DbGFzc3BhdGhNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLlVwZGF0ZUphdmFCdWlsZFBhdGhPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIGV4dGVuZHMgSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIGltcGxlbWVudHMgSUNsYXNzcGF0aFRhYmxlT3duZXIsIExpc3RlbmVyLCBDbGFzc3BhdGhNb2RlbExpc3RlbmVyIHsKLQotCXB1YmxpYyBXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKQotCSAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQmFzaWNDb21wb3NpdGUocGFyZW50KTsKLQkJaWYoIG1vZGVsLmdldENvbXBvbmVudCgpICE9IG51bGwgKXsKLQkJCWlmICghaXNWYWxpZFdlYk1vZHVsZSgpKQotCQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCQljcmVhdGVQcm9qZWN0TGFiZWxzR3JvdXAoY29tcG9zaXRlKTsKLQkJCWNyZWF0ZUxpc3RHcm91cChjb21wb3NpdGUpOwotCQkJaGFuZGxlV0xQU3VwcG9ydCgpOwotCQkJbW9kZWwuc2V0V0xQTW9kZWwodHJ1ZSk7Ci0JCQlzZXRFbmFibGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdExhYmVsc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgbGFiZWxzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGFiZWxzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxhYmVsc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGxhYmVsc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb2plY3RfbmFtZV9fVUlfIikpOyAvLyROT04tTkxTLTEkID0gIlByb2plY3QgbmFtZToiCi0KLQkJY29tcG9uZW50TmFtZVRleHQgPSBuZXcgVGV4dChsYWJlbHNHcm91cCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29tcG9uZW50TmFtZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQljb21wb25lbnROYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb21wb25lbnROYW1lVGV4dC5zZXRUZXh0KHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGlzdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGxpc3RHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgbGlzdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTsKLSAgICAgICAgbGlzdEdyb3VwLnNldExheW91dERhdGEoZ0RhdGEpOwotCi0gICAgICAgIGF2YWlsYWJsZURlcGVuZGVudEphcnMgPSBuZXcgTGFiZWwobGlzdEdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotICAgICAgICBhdmFpbGFibGVEZXBlbmRlbnRKYXJzLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkF2YWlsYWJsZV9kZXBlbmRlbnRfSkFSc19fVUlfIikpOyAvLyROT04tTkxTLTEkID0gIkF2YWlsYWJsZSBkZXBlbmRlbnQgSkFSczoiCi0gICAgICAgIGF2YWlsYWJsZURlcGVuZGVudEphcnMuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0gICAgICAgIGNyZWF0ZVRhYmxlQ29tcG9zaXRlKGxpc3RHcm91cCk7Ci0gICAgfQotICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ0RhdGEpOwotICAgICAgICB0YWJsZU1hbmFnZXIgPSBuZXcgQ2xhc3NwYXRoVGFibGVNYW5hZ2VyKHRoaXMsIG1vZGVsLCB2YWxpZGF0ZUVkaXRMaXN0ZW5lcik7Ci0gICAgICAgIHRhYmxlTWFuYWdlci5zZXRSZWFkT25seShpc1JlYWRPbmx5KCkpOwotICAgICAgICB0YWJsZU1hbmFnZXIuZmlsbFdMUENvbXBvc2l0ZShjb21wb3NpdGUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKCkgewotCQlpZiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCXRoaXMuc2V0RXJyb3JNZXNzYWdlKE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJfTGliX0Vycm9yIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldEVuYWJsZW1lbnQoKSB7Ci0JCWlmICh0YWJsZU1hbmFnZXIuYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCkubGVuZ3RoID09IDApIHsKLQkJCXRhYmxlTWFuYWdlci5zZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0YWJsZU1hbmFnZXIuZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0YWJsZU1hbmFnZXIuc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl0YWJsZU1hbmFnZXIuZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQkKLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlV0xQU3VwcG9ydCgpIHsKLQkJCXRhYmxlTWFuYWdlci5zZXRXTFBFbnRyeSh0cnVlKTsKLQkJCWF2YWlsYWJsZURlcGVuZGVudEphcnMuc2V0VGV4dCgiU2VsZWN0IHV0aWxpdHkgcHJvamVjdHMgdG8gYWRkIGFzIFdlYiBMaWJyYXJ5IHByb2plY3RzIHRvIHRoZSB3ZWIgbW9kdWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRhYmxlTWFuYWdlci5yZWZyZXNoKCk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJaWYoIG1vZGVsLmdldENvbXBvbmVudCgpID09IG51bGwgfHwgIWlzVmFsaWRXZWJNb2R1bGUoKSl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gY3JlYXRlZEZsZXhQcm9qZWN0cyA9IHJ1bldMUE9wKGNyZWF0ZUZsZXhQcm9qZWN0T3BlcmF0aW9ucygpKTsKLQkJCWJvb2xlYW4gY3JlYXRlZENvbXBvbmVudERlcGVuZGVuY3kgPSBmYWxzZTsKLQkJCWlmIChjcmVhdGVkRmxleFByb2plY3RzKQotCQkJCWNyZWF0ZWRDb21wb25lbnREZXBlbmRlbmN5ID0gcnVuV0xQT3AoY3JlYXRlQ29tcG9uZW50RGVwZW5kZW5jeU9wZXJhdGlvbnMoKSk7Ci0JCQlib29sZWFuIGNyZWF0ZWRCdWlsZFBhdGhTZXR0aW5ncyA9IGZhbHNlOwotCQkJaWYgKGNyZWF0ZWRDb21wb25lbnREZXBlbmRlbmN5KSB7Ci0JCQkJV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY29tcG9zZWRPcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbigpOwotCQkJCWNvbXBvc2VkT3AuYWRkUnVubmFibGUoY3JlYXRlV0xQQnVpbGRQYXRoT3BlcmF0aW9uKCkpOwotCQkJCWNyZWF0ZWRCdWlsZFBhdGhTZXR0aW5ncyA9IHJ1bldMUE9wKGNvbXBvc2VkT3ApOwotCQkJfQotCQkJcmV0dXJuIGNyZWF0ZWRCdWlsZFBhdGhTZXR0aW5nczsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZGVsLmRpc3Bvc2UoKTsKLQkJfQotCX0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gcnVuV0xQT3AoV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY29tcG9zZWQpIHsKLSAgICAJdHJ5IHsKLQkJCWlmIChjb21wb3NlZCAhPSBudWxsKQotCQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSkucnVuKHRydWUsIHRydWUsIGNvbXBvc2VkKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJU3RyaW5nIHRpdGxlID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX2ludGVybmFsX2Vycm9yX29jY3VycmVkX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbXNnID0gdGl0bGU7Ci0JCQlpZiAoZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCAmJiBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCQltc2cgPSBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih0aGlzLmdldFNoZWxsKCksIHRpdGxlLCBtc2cpOwotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNhbmNlbGxlZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotICAgIH0KLQlwdWJsaWMgdm9pZCBoYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpewotCQkKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpewotCQkJCi0JCQlJUGF0aFtdIHNlbGVjdGVkPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlRXh0ZXJuYWxKQVJFbnRyaWVzKGdldFNoZWxsKCkpOwotCQotCQkJaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQkJCi0JCQkJCVN0cmluZyB0eXBlID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUgKyBJUGF0aC5TRVBBUkFUT1I7Ci0vLwkJCQkJU3RyaW5nIG5hbWUgPSBzZWxlY3RlZFtpXS50b1N0cmluZygpOwotCQkJCQkKLS8vCQkJCQlqYXZhLmlvLkZpbGUgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUobmFtZSk7CQkJCQkKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZSA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudCggbW9kZWwuZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLCB0eXBlICsKLQkJCQkJCQkJc2VsZWN0ZWRbaV0udG9TdHJpbmcoKSk7Ci0JCQkJCQotCQkJCQlBcnJheUxpc3Qgdmxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gb2xkcmVmcyA9IG1vZGVsLmdldENvbXBvbmVudCgpLmdldFJlZmVyZW5jZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRyZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBvbGRyZWZzW2pdOwotCQkJCQkJdmxpc3QuYWRkKHJlZik7Ci0JCQkJCX0JCQotCQkJCQotCQkJCQkvL1RvIGRvOiBjaGVjayBpZiBhcmNoaXZlIGNvbXBvbmVudCBhbHJlYWR5IGV4aXN0cwotCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZSggbW9kZWwuZ2V0Q29tcG9uZW50KCksIGFyY2hpdmUsIG5ldyBQYXRoKCIvV0VCLUlORi9saWIiKSApOyAvLyROT04tTkxTLTEkCi0JCQkJCXZsaXN0LmFkZChyZWYpOwkKLQkJCQkJCi0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IG5ldyBJVmlydHVhbFJlZmVyZW5jZVt2bGlzdC5zaXplKCldOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHZsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCQlJVmlydHVhbFJlZmVyZW5jZSB0bXByZWYgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIHZsaXN0LmdldChqKTsKLQkJCQkJCXJlZnNbal0gPSB0bXByZWY7Ci0JCQkJCX0JCQkJCi0JCQkJCW1vZGVsLmdldENvbXBvbmVudCgpLnNldFJlZmVyZW5jZXMocmVmcyk7Ci0KLQkJCQkJCi0JCQkJCS8vQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlQ2xhc3NQYXRoRWxlbWVudChhcmNoaXZlLCBmaWxlLmdldE5hbWUoKSk7Ci0JCQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUNsYXNzUGF0aEVsZW1lbnQoYXJjaGl2ZSwgYXJjaGl2ZS5nZXROYW1lKCkpOwotCQkJCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gY3JlYXRlQ2xhc3NQYXRoU2VsZWN0aW9uRm9yRXh0ZXJuYWxKYXIoZWxlbWVudCk7Ci0JCQkJCWNyZWF0ZUJ1aWxkUGF0aE9wZXJhdGlvbkZvckV4dGVybmFsSmFyKHNlbGVjdGlvbik7Ci0JCQkJCQotCQkJICAgICAgICBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBjb21wb3NlZCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihjcmVhdGVCdWlsZFBhdGhPcGVyYXRpb25Gb3JFeHRlcm5hbEphcihzZWxlY3Rpb24pKTsKLQkJCSAgICAgICAgdHJ5IHsKLQkJCSAgICAgICAgICAgIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSkucnVuKHRydWUsIHRydWUsIGNvbXBvc2VkKTsKLQkJCSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX2ludGVybmFsX2Vycm9yX29jY3VycmVkX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkCi0JCQkgICAgICAgICAgICBTdHJpbmcgbXNnID0gdGl0bGU7Ci0JCQkgICAgICAgICAgICBpZiAoZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCAmJiBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCSAgICAgICAgICAgICAgICBtc2cgPSBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0JCQkgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih0aGlzLmdldFNoZWxsKCksIHRpdGxlLCBtc2cpOwotCQkJICAgICAgICAgICAgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkgICAgICAgICAgICAKLQkJCSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJICAgICAgICAgICAgLy8gY2FuY2VsbGVkCi0KLQkJCSAgICAgICAgfQotCQkJCQltb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCi0JCQkJcmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVTZWxlY3RWYXJpYWJsZUJ1dHRvbigpewotCQkKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpewotCQkJSVBhdGggZXhpc3RpbmdQYXRoW10gPSBuZXcgUGF0aFswXTsKLQkJCUlQYXRoW10gcGF0aHMgPSAgQnVpbGRQYXRoRGlhbG9nQWNjZXNzLmNob29zZVZhcmlhYmxlRW50cmllcyhnZXRTaGVsbCgpLCBleGlzdGluZ1BhdGgpOwotCQkJCi0JCQlpZiAocGF0aHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVBhdGggcmVzb2x2ZWRQYXRoPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChwYXRoc1tpXSk7Ci0JCi0JCQkJCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShyZXNvbHZlZFBhdGgudG9PU1N0cmluZygpKTsKLQkJCQkJaWYoIGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5leGlzdHMoKSl7Ci0JCQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LlZBUkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCQkJCi0JCQkJCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KCBtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCksIHR5cGUgKwotCQkJCQkJCQkJcGF0aHNbaV0udG9TdHJpbmcoKSk7Ci0JCQkJCQkKLQkJCQkJCUFycmF5TGlzdCB2bGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gb2xkcmVmcyA9IG1vZGVsLmdldENvbXBvbmVudCgpLmdldFJlZmVyZW5jZXMoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkcmVmcy5sZW5ndGg7IGorKykgewotCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG9sZHJlZnNbal07Ci0JCQkJCQkJdmxpc3QuYWRkKHJlZik7Ci0JCQkJCQl9CQkKLQkJCQkJCi0JCQkJCQkvL1RvIGRvOiBjaGVjayBpZiBhcmNoaXZlIGNvbXBvbmVudCBhbHJlYWR5IGV4aXN0cwotCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2UoIG1vZGVsLmdldENvbXBvbmVudCgpLCBhcmNoaXZlLCBuZXcgUGF0aCgiL1dFQi1JTkYvbGliIikgKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmxpc3QuYWRkKHJlZik7CQotCQkJCQkJCi0JCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBuZXcgSVZpcnR1YWxSZWZlcmVuY2Vbdmxpc3Quc2l6ZSgpXTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdmxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZSB0bXByZWYgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIHZsaXN0LmdldChqKTsKLQkJCQkJCQlyZWZzW2pdID0gdG1wcmVmOwotCQkJCQkJfQkJCQkKLQkJCQkJCW1vZGVsLmdldENvbXBvbmVudCgpLnNldFJlZmVyZW5jZXMocmVmcyk7Ci0JCQkJCQkKLQkJCQkJCS8vQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlQ2xhc3NQYXRoRWxlbWVudChhcmNoaXZlLCBmaWxlLmdldE5hbWUoKSk7Ci0JCQkJCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVDbGFzc1BhdGhFbGVtZW50KGFyY2hpdmUsIGFyY2hpdmUuZ2V0TmFtZSgpKTsKLQkJCQkJCQotCQkJCQkJQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGNyZWF0ZUNsYXNzUGF0aFNlbGVjdGlvbkZvckV4dGVybmFsSmFyKGVsZW1lbnQpOwotCQkJCQkJY3JlYXRlQnVpbGRQYXRoT3BlcmF0aW9uRm9yRXh0ZXJuYWxKYXIoc2VsZWN0aW9uKTsKLQkJCQkJCQotCQkJCSAgICAgICAgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY29tcG9zZWQgPSBuZXcgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oY3JlYXRlQnVpbGRQYXRoT3BlcmF0aW9uRm9yRXh0ZXJuYWxKYXIoc2VsZWN0aW9uKSk7Ci0JCQkJICAgICAgICB0cnkgewotCQkJCSAgICAgICAgICAgIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSkucnVuKHRydWUsIHRydWUsIGNvbXBvc2VkKTsKLQkJCQkgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCQkgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQW5faW50ZXJuYWxfZXJyb3Jfb2NjdXJyZWRfRVJST1JfIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkgICAgICAgICAgICBTdHJpbmcgbXNnID0gdGl0bGU7Ci0JCQkJICAgICAgICAgICAgaWYgKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwgJiYgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0JCQkJICAgICAgICAgICAgICAgIG1zZyA9IGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLQkJCQkgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih0aGlzLmdldFNoZWxsKCksIHRpdGxlLCBtc2cpOwotCQkJCSAgICAgICAgICAgIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCSAgICAgICAgICAgIAotCQkJCSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCSAgICAgICAgICAgIC8vIGNhbmNlbGxlZAotCi0JCQkJICAgICAgICB9Ci0JCQkJCQltb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7CQkJCQkJCi0KLQkJCQkJfWVsc2V7Ci0JCQkJCQkvL2Rpc3BsYXkgZXJyb3IKLQkJCQkJfQotCi0JCQkJfQotCQkJCXJlZnJlc2goKTsKLQkJCX0JCi0JCX0JCi0JfQkKLQkKLQkgICAgcHJpdmF0ZSBDbGFzc3BhdGhFbGVtZW50IGNyZWF0ZUNsYXNzUGF0aEVsZW1lbnQoSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZUNvbXAsCi0JCQkJU3RyaW5nIHVucmVzb2x2ZWROYW1lICkgewotCQkKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoTW9kdWxlVVJJVXRpbC5nZXRIYW5kbGVTdHJpbmcoYXJjaGl2ZUNvbXApKTsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gbmV3IENsYXNzcGF0aEVsZW1lbnQodXJpKTsKLQkJZWxlbWVudC5zZXRWYWxpZChmYWxzZSk7Ci0JCWVsZW1lbnQuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0UmVsYXRpdmVUZXh0KHVucmVzb2x2ZWROYW1lKTsKLQkJZWxlbWVudC5zZXRUZXh0KHVucmVzb2x2ZWROYW1lKTsKLQkJZWxlbWVudC5zZXRFYXJQcm9qZWN0KG51bGwpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9CQotCQotCXByaXZhdGUgQ2xhc3NQYXRoU2VsZWN0aW9uIGNyZWF0ZUNsYXNzUGF0aFNlbGVjdGlvbkZvckV4dGVybmFsSmFyKENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCl7Ci0JCUNsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQ2xhc3NQYXRoU2VsZWN0aW9uKCk7Ci0JCXNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50cygpLmFkZChlbGVtZW50KTsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9CQotCQotCXByb3RlY3RlZCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgY3JlYXRlQnVpbGRQYXRoT3BlcmF0aW9uRm9yRXh0ZXJuYWxKYXIoQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCSAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCSAgICByZXR1cm4gV1RQVUlQbHVnaW4uZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MobmV3IFVwZGF0ZUphdmFCdWlsZFBhdGhPcGVyYXRpb24oamF2YVByb2plY3QsIHNlbGVjdGlvbikpOwotCX0gICAgCi0JCi0vLwlwcml2YXRlIHZvaWQgZW5hYmxlRXh0ZXJuYWxKYXJDb250cm9scyhib29sZWFuIGIpIHsKLS8vCQl0YWJsZU1hbmFnZXIuZXh0ZXJuYWxKYXJCdXR0b24uc2V0VmlzaWJsZShiKTsKLS8vCQl0YWJsZU1hbmFnZXIuYWRkVmFyaWFibGVCdXR0b24uc2V0VmlzaWJsZShiKTsKLS8vCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2VmYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gewotCQotCXByb3RlY3RlZCBMaXN0IGZSdW5uYWJsZXM7Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJc3VwZXIocnVsZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgb3BlcmF0aW9uIHdoaWNoIHdpbGwgZGVsZWdhdGUgaXRzIHdvcmsgdG8gdGhlIGdpdmVuIHJ1bm5hYmxlLgotCSAqLwotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIExpc3QgbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKHJ1bGUpOwotCQlmUnVubmFibGVzID0gbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihMaXN0IG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzcykgewotCQlzdXBlcigpOwotCQlmUnVubmFibGVzID0gbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgb3BlcmF0aW9uIHdoaWNoIHdpbGwgZGVsZWdhdGUgaXRzIHdvcmsgdG8gdGhlIGdpdmVuIHJ1bm5hYmxlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogICAgICAgICAgICB0aGUgcnVubmFibGUgdG8gZGVsZWdhdGUgdG8gd2hlbiB0aGlzIG9wZXJhdGlvbiBpcyBleGVjdXRlZAotCSAqLwotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmVzdGVkT3ApIHsKLQkJc3VwZXIoKTsKLQkJZ2V0UnVubmFibGVzKCkuYWRkKG5lc3RlZE9wKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRSdW5uYWJsZShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmVzdGVkT3ApIHsKLQkJcmV0dXJuIGdldFJ1bm5hYmxlcygpLmFkZChuZXN0ZWRPcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWludCBzaXplID0gZlJ1bm5hYmxlcy5zaXplKCk7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBzaXplKTsvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlJ1bm5hYmxlcy5zaXplKCk7IGkrKykgewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gKElSdW5uYWJsZVdpdGhQcm9ncmVzcykgZlJ1bm5hYmxlcy5nZXQoaSk7Ci0JCQlvcC5ydW4obmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFJ1bm5hYmxlcygpIHsKLQkJaWYgKGZSdW5uYWJsZXMgPT0gbnVsbCkKLQkJCWZSdW5uYWJsZXMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlyZXR1cm4gZlJ1bm5hYmxlczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZThkMGI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dzTXVsdGlTZWxlY3QgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX09DQ1VSUkVEX1RJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVSUk9SX09DQ1VSUkVEX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVJST1JfT0NDVVJSRURfTUVTU0FHRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEVkaXRNb2R1bGVEZXBlbmRlbmN5QWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0QWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQXBwbGljYWJsZSBvbmx5IHdoZW4gdGhpcyBhY3Rpb24gZG9lcyBub3QgYWxsb3cgbXVsdGkgc2VsZWN0Ci0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KGdldFNlbGVjdGVkRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9qZWN0cygpIHsKLQkJaWYgKChzZWxlY3Rpb24gPT0gbnVsbCkgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCUl0ZXJhdG9yIGl0ID0gc3RydWN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KGl0Lm5leHQoKSk7Ci0JCQlpZiAocCAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGQocCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdChPYmplY3QgZWxlbWVudCkgewotCi0JCWlmIChpc1N1cHBvcnRlZEFjdGlvbihlbGVtZW50KSkKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoKEVPYmplY3QpIGVsZW1lbnQpOwotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCXJldHVybiAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkgewotCQlpZiAoKHNlbGVjdGlvbiA9PSBudWxsKSB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlzZWxlY3Rpb24gPSBKMkVFVUlQbHVnaW4uZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCQl9Ci0JCXJldHVybiAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQl9Ci0KLQkvKgotCSAqIE9ubHkgcmV0dXJuIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIGl0ZW0gc2VsZWN0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGVkRWxlbWVudCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQlyZXR1cm4gc2VsID09IG51bGwgPyBudWxsIDogc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IGdldFdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQkvKioKLQkgKiBDYW4gdGhlIHJlY2VpdmVyIGJlIGV4ZWN1dGVkIGZvcgotCSAqIAotCSAqIEBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNTdXBwb3J0ZWRBY3Rpb24oT2JqZWN0IGVsZW1lbnQpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjcHJpbVJ1bihTaGVsbCl9Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihJUHJvamVjdCBwcm9qZWN0LCBTaGVsbCBzaGVsbCkgewotCQkvL0RlcHJlY2F0ZWQKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIGluc3RlYWQgb2Yge0BsaW5rICNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pfQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQkJcHJpbVJ1bihnZXRQcm9qZWN0KCksIHNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZGVsZWdhdGluZyBhY3Rpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8KLQkgKiBkbyB0aGUgYWN0dWFsIHdvcmsuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHRoZSBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uIGFjdGlvbikgewotCi0JCVNoZWxsIHNoZWxsID0gZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJc2V0QWN0aW9uU3RhdGVGcm9tUHJvamVjdHMoYWN0aW9uKTsKLQkJaWYgKCFhY3Rpb24uaXNFbmFibGVkKCkpCi0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIklORk9STUFUSU9OX1VJXyIpLCBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ0hPU0VOX09QX05PVF9BVkFJTEFCTEUiKSk7IC8vJE5PTi1OTFMtMiQgPSAiVGhlIGNob3NlbiBvcGVyYXRpb24gaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuIiAvLyROT04tTkxTLTEkID0gIkluZm9ybWF0aW9uIgotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJcHJpbVJ1bihzaGVsbCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5FcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIEVSUk9SX09DQ1VSUkVEX1RJVExFLCBFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFLCB0LCAwLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCi0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUgdGhhdCB0aGUgc2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2ggaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogSW1wbGVtZW50ZXJzIGNhbiB1c2UgdGhpcyBvcHBvcnR1bml0eSB0byBjaGFuZ2UgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgYWN0aW9uIG9yIHRvIG1vZGlmeQotCSAqIG90aGVyIHByZXNlbnRhdGlvbiBwcm9wZXJ0aWVzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgYWN0aW9uCi0JICogQHBhcmFtIGFTZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0QWN0aW9uU3RhdGUoYWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY3Rpb25TdGF0ZShJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWxsb3dzTXVsdGlTZWxlY3QpCi0JCQlzZXRBY3Rpb25TdGF0ZUZvck11bHRpU2VsZWN0KGFjdGlvbik7Ci0JCWVsc2UKLQkJCXNldEFjdGlvblN0YXRlRm9yU2luZ2xlU2VsZWN0KGFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uU3RhdGVGb3JTaW5nbGVTZWxlY3QoSUFjdGlvbiBhY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQlpZiAoc2VsID09IG51bGwgfHwgc2VsLnNpemUoKSAhPSAxKSB7Ci0JCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0QWN0aW9uU3RhdGVGcm9tUHJvamVjdHMoYWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY3Rpb25TdGF0ZUZvck11bHRpU2VsZWN0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCXNldEFjdGlvblN0YXRlRnJvbVByb2plY3RzKGFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uU3RhdGVGcm9tUHJvamVjdHMoSUFjdGlvbiBhY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQlib29sZWFuIGFsbE9rID0gZmFsc2U7Ci0JCWlmIChzZWwgIT0gbnVsbCAmJiAhc2VsLmlzRW1wdHkoKSkgewotCQkJYWxsT2sgPSB0cnVlOwotCQkJSXRlcmF0b3IgaXQgPSBzZWwuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChvKTsKLQkJCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCWFsbE9rID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChhbGxPayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWxsb3dzTXVsdGlTZWxlY3QuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWxsb3dzTXVsdGlTZWxlY3QoKSB7Ci0JCXJldHVybiBhbGxvd3NNdWx0aVNlbGVjdDsKLQl9Ci0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFsbG93c011bHRpU2VsZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhbGxvd3NNdWx0aVNlbGVjdAotCSAqICAgICAgICAgICAgVGhlIGFsbG93c011bHRpU2VsZWN0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93c011bHRpU2VsZWN0KGJvb2xlYW4gYWxsb3dzTXVsdGlTZWxlY3QpIHsKLQkJdGhpcy5hbGxvd3NNdWx0aVNlbGVjdCA9IGFsbG93c011bHRpU2VsZWN0OwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RBY3Rpb25XaXRoRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0QWN0aW9uV2l0aERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmNlM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RBY3Rpb25XaXRoRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY3Rpb25XaXRoRGVsZWdhdGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUFjdGlvbkRlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogRWRpdE1vZHVsZURlcGVuZGVuY3lBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEFjdGlvbldpdGhEZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoIiIpOy8vJE5PTi1OTFMtMSQKLQkJaW5pdExhYmVsKCk7Ci0JCWluaXREZWxlZ2F0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJQWN0aW9uRGVsZWdhdGUgY3JlYXRlRGVsZWdhdGUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TGFiZWwoKTsKLQotCXByb3RlY3RlZCB2b2lkIGluaXREZWxlZ2F0ZSgpIHsKLQkJZGVsZWdhdGUgPSBjcmVhdGVEZWxlZ2F0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRMYWJlbCgpIHsKLQkJc2V0VGV4dChnZXRMYWJlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWRlbGVnYXRlLnJ1bih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoaXMgYWN0aW9uIGluIHJlc3BvbnNlIHRvIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0byByZWFjdCB0byBzZWxlY3Rpb24gY2hhbmdlczsgaG93ZXZlciwgaWYgdGhlCi0JICogc3VwZXIgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgb3ZlcnJpZGluZyBtZXRob2QgbXVzdCBhbHNvIHJldHVybgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgdGhlIG5ldyBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgc2VsZWN0aW9uLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgc2VsZWN0aW9uKTsKLQkJcmV0dXJuIHRoaXMuaXNFbmFibGVkKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTkxN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotLyoqCi0gKiBBY3Rpb24gZm9yIG9wZW5pbmcgYSBKMkVFIHJlc291cmNlIGZyb20gdGhlIEoyRUUgbmF2aWdhdG9yLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcGVuQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUyIHsKLQkvLyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElFZGl0b3JEZXNjcmlwdG9yIGN1cnJlbnREZXNjcmlwdG9yOwotCXByb3RlY3RlZCBPYmplY3Qgc3JjT2JqZWN0OwotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3BlbkFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGZpbmRFZGl0b3JEZXNjcmlwdG9yKFN0cmluZyBpZCkgewotCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCXJldHVybiByZWdpc3RyeS5maW5kRWRpdG9yKGlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBdHRyaWJ1dGVzRnJvbURlc2NyaXB0b3IoKSB7Ci0JCWlmIChjdXJyZW50RGVzY3JpcHRvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzZXRUZXh0KGN1cnJlbnREZXNjcmlwdG9yLmdldExhYmVsKCkpOwotCQlzZXRUb29sVGlwVGV4dChjdXJyZW50RGVzY3JpcHRvci5nZXRMYWJlbCgpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGN1cnJlbnREZXNjcmlwdG9yLmdldEltYWdlRGVzY3JpcHRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RydWN0dXJlZCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLQkgKiB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZAotCSAqIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4gSWYgdGhlIHN1cGVyIG1ldGhvZAotCSAqIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuCi0JICogCi0JICogQHBhcmFtIHNlbAotCSAqICAgICAgICAgICAgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7Ci0JCXNyY09iamVjdCA9IG51bGw7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChzLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0Rpc3Bvc2UKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjaW5pdChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vaW5pdAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bldpdGhFdmVudChldmVudCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcnVuKCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFRPRE8gSEFDSyEKLQkJdXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFiNmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLldvcmtiZW5jaEFjdGl2aXR5SGVscGVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uIHsKLQkvLyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElXb3JrYmVuY2ggZldvcmtiZW5jaDsKLQotCXByaXZhdGUgQ2xhc3NbXSBmQWN0aXZhdGVkT25UeXBlczsKLQotCXByaXZhdGUgYm9vbGVhbiBmQWNjZXB0RW1wdHlTZWxlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uKCkgewotCQkvL0RlZmF1bHQgY29uc3RydWN0b3IKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIENsYXNzW10gYWN0aXZhdGVkT25UeXBlcywgYm9vbGVhbiBhY2NlcHRFbXB0eVNlbGVjdGlvbikgewotCQlzdXBlcihsYWJlbCk7Ci0JCWZXb3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCWZBY3RpdmF0ZWRPblR5cGVzID0gYWN0aXZhdGVkT25UeXBlczsKLQkJZkFjY2VwdEVtcHR5U2VsZWN0aW9uID0gYWNjZXB0RW1wdHlTZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIEFic3RyYWN0T3BlbldpemFyZEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGFjY2VwdEVtcHR5U2VsZWN0aW9uKSB7Ci0JCXRoaXMod29ya2JlbmNoLCBsYWJlbCwgbnVsbCwgYWNjZXB0RW1wdHlTZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkFjdGlvbkJlQWRkZWQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZBY2NlcHRFbXB0eVNlbGVjdGlvbjsKLQkJfQotCQlpZiAoZkFjdGl2YXRlZE9uVHlwZXMgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJcmV0dXJuIGlzRW5hYmxlZCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgc3BlY2lmaWMgV2l6YXJkICh0byBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzKQotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBXaXphcmQgY3JlYXRlV2l6YXJkKCk7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCXJldHVybiAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIGZXb3JrYmVuY2g7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZChJdGVyYXRvciBpdGVyKSB7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFpc09mQWNjZXB0ZWRUeXBlKG9iaikgfHwgIXNob3VsZEFjY2VwdEVsZW1lbnQob2JqKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNPZkFjY2VwdGVkVHlwZShPYmplY3Qgb2JqKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkFjdGl2YXRlZE9uVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmQWN0aXZhdGVkT25UeXBlc1tpXS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUZXh0KCkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX0xCTCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVzZXIgaGFzIGludm9rZWQgdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlXaXphcmQgd2l6YXJkID0gY3JlYXRlV2l6YXJkKCk7Ci0JCWlmICh3aXphcmQgaW5zdGFuY2VvZiBJV29ya2JlbmNoV2l6YXJkKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBudWxsOwotCQkJaWYgKG51bGwgIT0gZ2V0Q3VycmVudFNlbGVjdGlvbigpKQotCQkJCXNlbCA9IGdldEN1cnJlbnRTZWxlY3Rpb24oKTsKLQkJCWVsc2UKLQkJCQlzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQkJKChJV29ya2JlbmNoV2l6YXJkKSB3aXphcmQpLmluaXQoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKSwgc2VsKTsKLQkJfQotCQlpZiAoV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuYWxsb3dVc2VPZihudWxsLHdpemFyZCkpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJU3RyaW5nIHRleHQgPSBnZXREaWFsb2dUZXh0KCk7Ci0JCQlpZiAobnVsbCAhPSB0ZXh0KSB7Ci0JCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0ZXh0KTsKLQkJCX0KLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXb3JrYmVuY2goSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBjYW4gYmUgb3ZlcnJpZGRlbiB0byBhZGQgbW9yZSBjaGVja3Mgb2JqIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSBhY2NlcHRlZAotCSAqIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWNjZXB0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODdkMjJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCXByb3RlY3RlZCBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24oKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgQ2xhc3NbXSBhY3RpdmF0ZWRPblR5cGVzLCBib29sZWFuIGFjY2VwdEVtcHR5U2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaCwgbGFiZWwsIG51bGwsIGFjY2VwdEVtcHR5U2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gYWNjZXB0RW1wdHlTZWxlY3Rpb24pIHsKLQkJc3VwZXIod29ya2JlbmNoLCBsYWJlbCwgbnVsbCwgYWNjZXB0RW1wdHlTZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uI2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nLgotCQlzZXRXb3JrYmVuY2gobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24jaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc2V0V29ya2JlbmNoKHdpbmRvdy5nZXRXb3JrYmVuY2goKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQWN0aW9uRGVsZWdhdGUjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nLiBBY3Rpb24gZG9lc24ndCBkZXBlbmQgb24gc2VsZWN0aW9uLgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODBlNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVJST1JfT0NDVVJSRURfVElUTEUgPSAiISEhIUVycm9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX09DQ1VSUkVEX01FU1NBR0UgPSAiISFAISFFcnJvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZ2V0V29ya2JlbmNoV2luZG93KCkgewotCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldFBsdWdpbldvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTaGVsbCBzaGVsbCA9IGdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCWlmIChudWxsID09IHNlbGVjdGlvbikgewotCQkJSVNlbGVjdGlvbiBhdXRvc2VsZWN0aW9uID0gZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGF1dG9zZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQl0aGlzLnNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYXV0b3NlbGVjdGlvbjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlwcmltUnVuKHNoZWxsKTsKLQkJCXRoaXMuc2VsZWN0aW9uID0gbnVsbDsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgRVJST1JfT0NDVVJSRURfVElUTEUsIEVSUk9SX09DQ1VSUkVEX01FU1NBR0UsIHQsIDAsIGZhbHNlKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCk7Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2Rpc3Bvc2UKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjaW5pdChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vaW5pdAotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgYVNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0lKMkVFVUlDb250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9JSjJFRVVJQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjE0MzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0lKMkVFVUlDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS82LzIwMDEgMTI6MjM6MDIgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRVVJQ29udGV4dElkcyB7Ci0JLy8gTmV3IGNyZWF0aW9uIHdpemFyZHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRUFSX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVBUl9ORVdfRUFSX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRUFSX0FERF9NT0RVTEVTX1BBR0UgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ORVdfRUFSX0FERF9NT0RVTEVTX1BBR0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VBUl9DT01QX1BBR0UgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ORVdfRUFSX0NPTVBfUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfTkVXX01PRFVMRV9QUk9KRUNUU19QQUdFID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUFSX05FV19NT0RVTEVfUFJPSkVDVFNfUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQVBQQ0xJRU5UX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkFQUENMSUVOVF9ORVdfQVBQQ0xJRU5UX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRUpCX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKQl9ORVdfRUpCX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRUpCX1dJWkFSRF9QMiA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKQl9ORVdfRUpCX1dJWkFSRF9QQUdFMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRUpCX1dJWkFSRF9QMyA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKQl9ORVdfRUpCX1dJWkFSRF9QQUdFMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ09OTkVDVE9SX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkpDQV9ORVdJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSkFWQV9DT01QT05FTlRfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuTkVXX0pBVkFfQ09NUE9ORU5UX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSkFWQV9DTEFTU19PUFRJT05fV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuTkVXX0pBVkFfQ0xBU1NfT1BUSU9OX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEltcG9ydCwgZXhwb3J0IHdpemFyZHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfRUFSX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVBUl9JTVBPUlRfRUFSX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfRUFSX1dJWkFSRF9QMiA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVBUl9JTVBPUlRfRUFSX1dJWkFSRF9QQUdFMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfRUFSX1dJWkFSRF9QMyA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVBUl9JTVBPUlRfRUFSX1dJWkFSRF9QQUdFMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkFQUENMSUVOVF9JTVBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfRUpCX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKQl9JTVBPUlRfRUpCX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfUkFSX1dJWkFSRF9QQUdFID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuSU1QT1JUX1JBUl9XSVpBUkRfUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVVRJTElUWV9KQVJfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuSU1QT1JUX1VUSUxJVFlfSkFSX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVVRJTElUWV9KQVJfV0laQVJEX1AyID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuSU1QT1JUX1VUSUxJVFlfSkFSX1dJWkFSRF9QQUdFMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfQ0xBU1NfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuSU1QT1JUX0NMQVNTX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfQ0xBU1NfV0laQVJEX1AyID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuSU1QT1JUX0NMQVNTX1dJWkFSRF9QQUdFMiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9FQVJfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUFSX0VYUE9SVF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX0FQUENMSUVOVF9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5BUFBDTElFTlRfRVhQT1JUX0FQUENMSUVOVF9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX0VKQl9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FSkJfRVhQT1JUX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9SQVJfV0laQVJEX1BBR0UgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FWFBPUlRfUkFSX1dJWkFSRF9QQUdFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZGlhbG9ncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVBVEVfRUFSX0RJQUxPR18xID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIubmF2bTIwMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRUFURV9NT0RVTEVfRElBTE9HXzEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5uYXZtMjAxMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfRUFSX0RJQUxPR18xID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIubmF2bTMwMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX01PRFVMRV9ESUFMT0dfMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm5hdm0zMDEwIjsgLy8kTk9OLU5MUy0xJAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSW1wb3J0Q2xhc3Nlc0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSW1wb3J0Q2xhc3Nlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWM1NjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0ltcG9ydENsYXNzZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5DbGFzc2VzSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRDbGFzc2VzQWN0aW9uIGV4dGVuZHMgV1RQQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJbXBvcnRfQ2xhc3NlcyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSW1wb3J0Q2xhc3Nlc0FjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5CYXNlQWN0aW9uI3ByaW1SdW4ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFNlbGVjdGlvbigpLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJQ2xhc3Nlc0ltcG9ydFdpemFyZCB3aXphcmQgPSBuZXcgQ2xhc3Nlc0ltcG9ydFdpemFyZChwcm9qZWN0KTsKLQotCi0JCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQl3aXphcmQuc2V0RGlhbG9nU2V0dGluZ3MoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNTUwLCA1NTApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZWxldGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzMTQ3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuY29tcG9uZW50Y29yZS51dGlsLkVKQkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZWxldGUuRGVsZXRlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkRlbGV0ZUVBUkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkRlbGV0ZU1vZHVsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkoyRUVEZWxldGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFRGVsZXRlVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkNvbW1vbkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkRlbGV0ZVJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEoyRUVEZWxldGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBpbXBsZW1lbnRzIEoyRUVEZWxldGVVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0JLy9Vc2VkIGZvciBFQVIgZGVsZXRlCi0JcHJvdGVjdGVkIFNldCByZWZlcmVuY2VkUHJvamVjdHM7Ci0JcHJvdGVjdGVkIExpc3QgcHJvamVjdHM7Ci0JcHJvdGVjdGVkIERlbGV0ZU9wdGlvbnMgb3B0aW9uczsKLQkvLyBhZGRlZCBmb3IgSVJlZmFjdG9yaW5nQWN0aW9uIGJlaGF2aW9yCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0KLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERlbGV0ZU1vZHVsZUFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBKMkVFRGVsZXRlQWN0aW9uKElXb3JrYmVuY2hTaXRlIHNpdGUsIFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihzaXRlKTsKLQkJc2V0VGV4dChERUxFVEUpOwotCQlzaGVsbCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgSjJFRURlbGV0ZUFjdGlvbihJV29ya2JlbmNoU2l0ZSBzaXRlLCBJU2VsZWN0aW9uUHJvdmlkZXIgbmV3UHJvdmlkZXIpIHsKLQkJc3VwZXIoc2l0ZSk7Ci0JCXNldFRleHQoREVMRVRFKTsKLQkJc2hlbGwgPSBKMkVFVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJcHJvdmlkZXIgPSBuZXdQcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLQkJcmVmZXJlbmNlZFByb2plY3RzID0gbnVsbDsKLQkJcHJvamVjdHMgPSBudWxsOwotCQlvcHRpb25zID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNTZWxlY3Rpb25BcHBsaWNhYmxlKCkgJiYgaXNTZWxlY3Rpb25Tb21lSjJFRSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdXBkYXRlKHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3Rpb25BcHBsaWNhYmxlKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCFpc0oyRUVNb2R1bGUobykgJiYgIWlzQXBwbGljYXRpb24obykgJiYgIWlzUHJvamVjdE9ySmF2YVByb2plY3QobykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uU29tZUoyRUUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJSXRlcmF0b3IgaXQgPSBzZWwuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNKMkVFTW9kdWxlKG8pIHx8IGlzQXBwbGljYXRpb24obykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3Rpb25BbGxERFJvb3RzKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCFpc0oyRUVNb2R1bGUobykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uQWxsQXBwbGljYXRpb25zKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCFpc0FwcGxpY2F0aW9uKG8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0oyRUVNb2R1bGUoT2JqZWN0IG8pIHsKLQkJLy9UT0RPIHN3aXRjaCB0byB2aXJ0dWFsIGNvbXAKLS8vCQlpZiAobyBpbnN0YW5jZW9mIFdvcmtiZW5jaENvbXBvbmVudCkgewotLy8JCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gKFdvcmtiZW5jaENvbXBvbmVudCkgbzsKLS8vCQkJU3RyaW5nIG1vZHVsZVR5cGUgPSBtb2R1bGUuZ2V0Q29tcG9uZW50VHlwZSgpLmdldENvbXBvbmVudFR5cGVJZCgpOwotLy8JCQkvL1RPRE8gbmVlZCB0byBhZGQgY29ubmVjdG9yLCBhcHAgY2xpZW50LCBlYXIsIGVqYiBjbGllbnQKLS8vCQkJcmV0dXJuIG1vZHVsZVR5cGUuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUpIHx8IG1vZHVsZVR5cGUuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpOwotLy8JCX0KLQkJcmV0dXJuIENvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QobywgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYXRpb24oT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgQXBwbGljYXRpb24pIHx8IGlzSjJFRUFwcGxpY2F0aW9uUHJvamVjdChvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Byb2plY3RPckphdmFQcm9qZWN0KE9iamVjdCBvKSB7Ci0JCXJldHVybiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB8fCAobyBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvamVjdHMoKSB7Ci0JCWlmIChwcm9qZWN0cyA9PSBudWxsKSB7Ci0JCQlwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KQotCQkJCQlvID0gKChJSmF2YVByb2plY3QpIG8pLmdldFByb2plY3QoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCXByb2plY3RzLmFkZChvKTsKLQkJCQkJYWRkRUpCQ2xpZW50UHJvamVjdElmTmVjZXNzYXJ5KChJUHJvamVjdCkgbywgcHJvamVjdHMpOwotCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgbzsKLQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChvYmopOwotCQkJCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2plY3Rfc2hvdWxkX25vdF9iZV9udWxsXzFfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJCWFkZEVKQkNsaWVudFByb2plY3RJZk5lY2Vzc2FyeShwcm9qZWN0LCBwcm9qZWN0cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vbi1wcm9qZWN0X2luX3NlbGVjdGlvbl8yX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGxvY2FsUHJvamVjdHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRUpCQ2xpZW50UHJvamVjdElmTmVjZXNzYXJ5KElQcm9qZWN0IHByb2plY3QsIExpc3QgbG9jYWxQcm9qZWN0cykgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCWlmIChlZGl0ICE9IG51bGwgJiYgZWRpdC5oYXNFSkJDbGllbnRKQVJQcm9qZWN0KCkpCi0JCQlsb2NhbFByb2plY3RzLmFkZChlZGl0LmdldEVKQkNsaWVudEphck1vZHVsZSgpLmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJSjJFRURlbGV0ZURpYWxvZyBkbGcgPSBudWxsOwotCQkJaWYgKGlzU2VsZWN0aW9uQWxsQXBwbGljYXRpb25zKCkpCi0JCQkJZGxnID0gbmV3IERlbGV0ZUVBUkRpYWxvZyhzaGVsbCwgZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkpOwotCQkJZWxzZSBpZiAoaXNTZWxlY3Rpb25BbGxERFJvb3RzKCkpCi0JCQkJZGxnID0gbmV3IERlbGV0ZU1vZHVsZURpYWxvZyhzaGVsbCk7Ci0JCQllbHNlIHsKLQkJCQlpZiAoY29uZmlybVN0YW5kYXJkRGVsZXRlKCkpCi0JCQkJCXJ1blJlc291cmNlRGVsZXRlQWN0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlkbGcub3BlbigpOwotCQkJaWYgKGRsZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCQlvcHRpb25zID0gZGxnLmdldERlbGV0ZU9wdGlvbnMoKTsKLQkJCWlmIChvcHRpb25zICE9IG51bGwpCi0JCQkJb3B0aW9ucy5zZXRTZWxlY3RlZFByb2plY3RzKGdldFByb2plY3RzKCkpOwotCQkJZWxzZQotCQkJCXJldHVybjsKLQkJCWlmICghKGVuc3VyZUVkaXRvcnNTYXZlZCgpICYmIHZhbGlkYXRlU3RhdGUoKSkpCi0JCQkJcmV0dXJuOwotCQkJZGVsZXRlUHJvamVjdHNJZk5lY2Vzc2FyeSgpOwotCQkJZGVsZXRlTWV0YWRhdGFJZk5lY2Vzc2FyeSgpOwotCQkJcHJlc2VudFN0YXR1c0lmTmVjY2Vzc2FyeSgpOwotCQl9IGZpbmFsbHkgewotCQkJcmVzZXQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlbnN1cmVFZGl0b3JzU2F2ZWQoKSB7Ci0JCXJldHVybiBDb21tb25FZGl0b3JVdGlsaXR5LnByb21wdFRvU2F2ZUFsbERpcnR5RWRpdG9ycygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1TdGFuZGFyZERlbGV0ZSgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIERFTEVURV9QUk9KRUNUUywgQ1VTVE9NX0RFTEVURV9NSVhfTUFUQ0gpOwotCX0KLQotCXByb3RlY3RlZCBTZXQgZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlpZiAocmVmZXJlbmNlZFByb2plY3RzID09IG51bGwpCi0JCQljb21wdXRlUmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCXJldHVybiByZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJLy9UT0RPIGZpeCB1cCB0byB1c2UgY29tcG9uZW50cwotLy8JCWdldFByb2plY3RzKCk7Ci0vLwkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3RzLmdldChpKTsKLS8vCQkJRUFSTmF0dXJlUnVudGltZSBydW50aW1lID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpOwotLy8JCQlpZiAocnVudGltZSA9PSBudWxsKQotLy8JCQkJY29udGludWU7Ci0vLwkJCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlyZWZlcmVuY2VkUHJvamVjdHMuYWRkQWxsKGVkaXRNb2RlbC5nZXRNb2R1bGVNYXBwZWRQcm9qZWN0cygpKTsKLS8vCQkJfSBmaW5hbGx5IHsKLS8vCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotLy8JcHJvdGVjdGVkIERlbGV0ZU1vZHVsZU9wZXJhdGlvbiBnZXREZWxldGVNb2R1bGVPcGVyYXRpb24oKSB7Ci0vLwkJaWYgKGRlbGV0ZU1vZHVsZU9wZXJhdGlvbiA9PSBudWxsKQotLy8JCQlkZWxldGVNb2R1bGVPcGVyYXRpb24gPSBuZXcgRGVsZXRlTW9kdWxlT3BlcmF0aW9uKG9wdGlvbnMpOwotLy8JCXJldHVybiBkZWxldGVNb2R1bGVPcGVyYXRpb247Ci0vLwl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVNZXRhZGF0YUlmTmVjZXNzYXJ5KCkgewotCQlpZiAoIXNob3VsZERlbGV0ZU1ldGFEYXRhKCkpCi0JCQlyZXR1cm47Ci0KLS8vCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhnZXREZWxldGVNb2R1bGVPcGVyYXRpb24oKSk7Ci0vLwkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIG1vbml0b3JEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJbW9uaXRvckRpYWxvZy5ydW4oZmFsc2UsIGZhbHNlLCBydW5uYWJsZSk7Ci0vLwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vSWdub3JlCi0vLwkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZU1ldGFEYXRhKCkgewotCQlpZiAoZGVsZXRlUHJvamVjdHNGYWlsZWRPckNhbmNlbGxlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcHJpbVNob3VsZERlbGV0ZU1ldGFEYXRhKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbVNob3VsZERlbGV0ZU1ldGFEYXRhKCkgewotCQlyZXR1cm4gb3B0aW9ucyAhPSBudWxsICYmIChvcHRpb25zLnNob3VsZERlbGV0ZU1vZHVsZXMoKSB8fCBvcHRpb25zLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVQcm9qZWN0c0ZhaWxlZE9yQ2FuY2VsbGVkKCkgewotCQlpZiAob3B0aW9ucyA9PSBudWxsIHx8ICFvcHRpb25zLnNob3VsZERlbGV0ZVByb2plY3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBkZWxldGVkUHJvamVjdHNFeGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZWRQcm9qZWN0c0V4aXN0KCkgewotCQlMaXN0IGRlbGV0ZWRQcm9qZWN0cyA9IG9wdGlvbnMuZ2V0QWxsUHJvamVjdHNUb0RlbGV0ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbGV0ZWRQcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZGVsZXRlZFByb2plY3RzLmdldChpKTsKLQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVQcm9qZWN0c0lmTmVjZXNzYXJ5KCkgewotCQlpZiAob3B0aW9ucy5zaG91bGREZWxldGVQcm9qZWN0cygpKQotCQkJcnVuUmVzb3VyY2VEZWxldGVBY3Rpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5SZXNvdXJjZURlbGV0ZUFjdGlvbigpIHsKLQkJRGVsZXRlUmVzb3VyY2VBY3Rpb24gYWN0aW9uID0gbmV3IERlbGV0ZVJlc291cmNlQWN0aW9uKHNoZWxsKTsKLQkJTGlzdCBsb2NhbFByb2plY3RzID0gbnVsbDsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkKLQkJCWxvY2FsUHJvamVjdHMgPSBnZXRQcm9qZWN0cygpOwotCQllbHNlCi0JCQlsb2NhbFByb2plY3RzID0gb3B0aW9ucy5nZXRBbGxQcm9qZWN0c1RvRGVsZXRlKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbG9jYWxQcm9qZWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXAuZXhpc3RzKCkpCi0JCQkJaXQucmVtb3ZlKCk7Ci0JCX0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obG9jYWxQcm9qZWN0cyk7Ci0JCWFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbCk7Ci0JCWFjdGlvbi5ydW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKElTdGF0dXMuRVJST1IsIERFTEVURV9FUlJPUiwgZSk7Ci0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgREVMRVRFX0VSUk9SLCBERUxFVEVfTk9UX0NPTVBMRVRFRCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGFjdGlvbidzIGVuYWJsZSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIHRoZSB1c2VkIHNlbGVjdGlvbgotCSAqIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCi0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0oyRUVBcHBsaWNhdGlvblByb2plY3QoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgbzsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWRGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJc2V0RW5hYmxlZChnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXNldEVuYWJsZWRGcm9tU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJZWxzZQotCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU3RhdGUoKSB7Ci0JCS8vIFRPRE8gRml4IHZhbGlkYXRlU3RhdGUKLQkJLy8JCWlmICghcHJpbVNob3VsZERlbGV0ZU1ldGFEYXRhKCkpCi0JCS8vCQkJcmV0dXJuIHRydWU7Ci0JCS8vCQkKLQkJLy8JCUlWYWxpZGF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWYWxpZGF0ZUVkaXRMaXN0ZW5lcihudWxsLAotCQkvLyBnZXREZWxldGVNb2R1bGVPcGVyYXRpb24oKS5nZXREZWxldGVFZGl0TW9kZWwoKSk7Ci0JCS8vCQlsaXN0ZW5lci5zZXRTaGVsbChzaGVsbCk7Ci0JCS8vCQlyZXR1cm4gbGlzdGVuZXIudmFsaWRhdGVTdGF0ZSgpLmlzT0soKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlc2VudFN0YXR1c0lmTmVjY2Vzc2FyeSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotLy8JCWlmIChkZWxldGVNb2R1bGVPcGVyYXRpb24gIT0gbnVsbCkKLS8vCQkJc3RhdHVzID0gZGVsZXRlTW9kdWxlT3BlcmF0aW9uLmdldFN0YXR1cygpOwotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuOwotCi0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzLCBJU3RhdHVzLkVSUk9SKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlbGV0ZU1vZHVsZUFjdGlvblBvcHVsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlbGV0ZU1vZHVsZUFjdGlvblBvcHVsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjhhYTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZWxldGVNb2R1bGVBY3Rpb25Qb3B1bGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDE2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVEZWxldGVNb2R1bGVBY3Rpb25Qb3B1bGF0b3Igey8vaW1wbGVtZW50cyBXVFBPcGVyYXRpb25EYXRhTW9kZWxVSUNyZWF0b3IgewotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb24udWkuV1RQT3BlcmF0aW9uRGF0YU1vZGVsVUlDcmVhdG9yI2NyZWF0ZURhdGFNb2RlbChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChTdHJpbmcgZXh0ZW5kZWRPcGVyYXRpb25JZCwgU3RyaW5nIG9wZXJhdGlvbkNsYXNzLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIElXb3JrYmVuY2hTaXRlIHNpdGUpIHsKLQkJLy9UT0RPIGZpeCB1cAotLy8JCUoyRUVEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IEoyRUVEZWxldGVBY3Rpb24oc2l0ZSwgKElTZWxlY3Rpb25Qcm92aWRlcikgbnVsbCk7Ci0vLwkJV1RQT3BlcmF0aW9uRGF0YU1vZGVsIGRhdGFNb2RlbCA9IElBY3Rpb25XVFBPcGVyYXRpb25EYXRhTW9kZWwuY3JlYXRlRGF0YU1vZGVsKGRlbGV0ZUFjdGlvbiwgc2VsZWN0aW9uLCBzaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCksIHNpdGUuZ2V0U2hlbGwoKSk7Ci0vLwkJcmV0dXJuIGRhdGFNb2RlbDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZXBsb3lBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZXBsb3lBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2ZWRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVwbG95QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMzAsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95LkRlcGxveWVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95LkoyRUVEZXBsb3lPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRURlcGxveUFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwudWkuYWN0aW9ucy5CYXNlQWN0aW9uI3ByaW1SdW4ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCi0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJSjJFRURlcGxveU9wZXJhdGlvbiBvcCA9IG5ldyBKMkVFRGVwbG95T3BlcmF0aW9uKHNlbGVjdGlvbi50b0FycmF5KCkpOwotCQkJLy9JUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhvcCk7Ci0JCQkvL0oyRUVEZXBsb3lTdGF0dXNEaWFsb2cgZGlhbG9nID0gbmV3Ci0JCQkvLyBKMkVFRGVwbG95U3RhdHVzRGlhbG9nKHNoZWxsLG9wLmdldE11bHRpU3RhdHVzKCkpOwotCQkJdHJ5IHsKLQkJCQlvcC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQkJLy9UT0RPIGZpeCB1cCBqb2Igc2NoZWR1bGVyPwotLy8JCQlXVFBPcGVyYXRpb25Kb2JBZGFwdGVyIGpvYkFkYXB0ZXIgPSBuZXcgV1RQT3BlcmF0aW9uSm9iQWRhcHRlcihvcCk7Ci0vLwkJCWpvYkFkYXB0ZXIuc2V0TmFtZShKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSjJFRURlcGxveU9wZXJhdGlvbl9VSV8wIikpOy8vJE5PTi1OTFMtMSQKLS8vCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotLy8JCQlJUHJvZ3Jlc3NTZXJ2aWNlIHByb2dyZXNzU2VydmljZSA9IHdvcmtiZW5jaC5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLS8vCQkJam9iQWRhcHRlci5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotLy8JCQlwcm9ncmVzc1NlcnZpY2Uuc2hvd0luRGlhbG9nKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBqb2JBZGFwdGVyKTsKLS8vCQkJam9iQWRhcHRlci5zY2hlZHVsZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSjJFRURlcGxveUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgYVNlbGVjdGlvbik7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2lzRW5hYmxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCi0JCXRyeSB7Ci0JCQlEZXBsb3llclJlZ2lzdHJ5IHJlZyA9IERlcGxveWVyUmVnaXN0cnkuaW5zdGFuY2UoKTsKLQotCQkJTGlzdCBtb2R1bGVzID0gRGVwbG95ZXJSZWdpc3RyeS5nZXRTZWxlY3RlZE1vZHVsZXMoc2VsZWN0aW9uLnRvQXJyYXkoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFT2JqZWN0IG1vZHVsZSA9IChFT2JqZWN0KSBtb2R1bGVzLmdldChpKTsKLQkJCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG1vZHVsZSk7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvaikuZ2V0UnVudGltZVRhcmdldCgpOwotCQkJCWlmIChwcm9qID09IG51bGwgfHwgcnVudGltZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJTGlzdCB2aXNpdG9ycyA9IHJlZy5nZXREZXBsb3lNb2R1bGVFeHRlbnNpb25zKG1vZHVsZSwgcnVudGltZSk7Ci0JCQkJaWYgKCF2aXNpdG9ycy5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVwbG95IEFjdGlvbiByZWNvdmVyaW5nIGZyb20gcHJvYmxlbSB2ZXJpZnlpbmcgZW5hYmxlbWVudC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRU1vZHVsZVJlbmFtZUNoYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRU1vZHVsZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGE3MGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVNb2R1bGVSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFUmVuYW1lVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZW5hbWUuUmVuYW1lT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLQotLyoqCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVNb2R1bGVSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZTsKLQlwcml2YXRlIElQcm9qZWN0IHRhcmdldDsKLQlwcml2YXRlIGJvb2xlYW4gcmVuYW1lRGVwZW5kZW5jaWVzOwotCi0JcHVibGljIEoyRUVNb2R1bGVSZW5hbWVDaGFuZ2UoSVByb2plY3QgdGFyZ2V0LCBTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiByZW5hbWVEZXBlbmRlbmNpZXMpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMucmVuYW1lRGVwZW5kZW5jaWVzID0gcmVuYW1lRGVwZW5kZW5jaWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEoyRUVSZW5hbWVVSUNvbnN0YW50cy5SRU5BTUVfTU9EVUxFUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaXNWYWxpZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKFN0YXR1cy5PS19TVEFUVVMpOwotCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI3BlcmZvcm0ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQl0cnkgewotCi0vLwkJCVJlbmFtZU1vZHVsZU9wZXJhdGlvbiByZW5hbWVPcCA9IG5ldyBSZW5hbWVNb2R1bGVPcGVyYXRpb24oZ2V0UmVuYW1lT3B0aW9ucygpKTsKLS8vCQkJcmVuYW1lT3AucnVuKHBtKTsKLQotCQkJLy9TdHJpbmcgY29udGV4dFJvb3QgPSBnZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwotCQkJLy8gVE9ETyBmaXggdXAgcmVuYW1lIGFuZCBjb250ZXh0IHJvb3Qgb3BlcmF0aW9ucwotCQkJLy9pZiAod2ViTmF0dXJlICE9IG51bGwpIHsKLQkJCQkvL25ldyBVcGRhdGVXZWJDb250ZXh0Um9vdE1ldGFkYXRhT3BlcmF0aW9uKG5ld1RhcmdldCwgd2ViTmF0dXJlLmdldENvbnRleHRSb290KCkpLnJ1bihwbSk7Ci0vLwkJCWlmKGNvbnRleHRSb290LmVxdWFscygiIikgPT0gZmFsc2UpeyAvLyROT04tTkxTLTEkCi0vLwkJCQluZXcgVXBkYXRlV2ViQ29udGV4dFJvb3RNZXRhZGF0YU9wZXJhdGlvbih0YXJnZXQsIGNvbnRleHRSb290KS5ydW4ocG0pOwotLy8JCQl9IGVsc2UgaWYgKEoyRUVOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWUodGFyZ2V0KSA9PSBudWxsKQotLy8JCQkJbmV3IFJlbmFtZVV0aWxpdHlKYXJNZXRhZGF0YU9wZXJhdGlvbih0YXJnZXQsIG5ld1RhcmdldCkucnVuKHBtKTsKLS8vCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLS8vCQkJLy9JZ25vcmUKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vSWdub3JlCi0vLwkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJDb250ZXh0Um9vdCgpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQl0cnl7Ci0JCQl3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQodGFyZ2V0KTsKLSAgICAgICAJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0gICAgICAgCQkJcmV0dXJuIHdlYkVkaXQuZ2V0U2VydmVyQ29udGV4dFJvb3QoKTsJCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwgKQotCQkJCXdlYkVkaXQuZGlzcG9zZSgpOwotCQl9CQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBSZW5hbWVPcHRpb25zIGdldFJlbmFtZU9wdGlvbnMoKSB7Ci0JCVJlbmFtZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBSZW5hbWVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0TmV3TmFtZSh0aGlzLm5ld05hbWUpOwotCQlvcHRpb25zLnNldFNlbGVjdGVkUHJvamVjdHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0aGlzLnRhcmdldCkpOwotCQkvLyBUT0RPIGNoZWNrIG1vZHVsZSB0eXBlIGZvciBFQVIgdHlwZQotCQkvL29wdGlvbnMuc2V0SXNFQVJSZW5hbWUoRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHRoaXMudGFyZ2V0KSAhPSBudWxsKTsKLQkJb3B0aW9ucy5zZXRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXModGhpcy5yZW5hbWVEZXBlbmRlbmNpZXMpOwotCQlvcHRpb25zLnNldFJlbmFtZU1vZHVsZXModHJ1ZSk7Ci0JCW9wdGlvbnMuc2V0UmVuYW1lUHJvamVjdHMoZmFsc2UpOwotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNnZXRNb2RpZmllZEVsZW1lbnQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOTg1OWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFUmVuYW1lRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuSjJFRVJlbmFtZVVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuUmVuYW1lTW9kdWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5Db21tb25FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlbmFtZS5SZW5hbWVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZW5hbWVSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgSjJFRVJlbmFtZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQkvL1VzZWQgZm9yIEVBUiByZW5hbWUKLQlwcm90ZWN0ZWQgU2V0IHJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgTGlzdCBtb2R1bGVzOwotCXByb3RlY3RlZCBSZW5hbWVPcHRpb25zIG9wdGlvbnM7Ci0JLy8gYWRkZWQgZm9yIElSZWZhY3RvcmluZ0FjdGlvbiBiZWhhdmlvcgotCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotLy8JcHJvdGVjdGVkIFJlbmFtZU1vZHVsZU9wZXJhdGlvbiByZW5hbWVNb2R1bGVPcGVyYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJlbmFtZU1vZHVsZUFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBKMkVFUmVuYW1lQWN0aW9uKElXb3JrYmVuY2hTaXRlIHNpdGUsIFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihzaXRlKTsKLQkJc2V0VGV4dChSRU5BTUUpOwotCQlzaGVsbCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgSjJFRVJlbmFtZUFjdGlvbihJV29ya2JlbmNoU2l0ZSBzaXRlLCBJU2VsZWN0aW9uUHJvdmlkZXIgbmV3UHJvdmlkZXIpIHsKLQkJc3VwZXIoc2l0ZSk7Ci0JCXNldFRleHQoUkVOQU1FKTsKLQkJc2hlbGwgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCXByb3ZpZGVyID0gbmV3UHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0vLwkJaWYgKHJlbmFtZU1vZHVsZU9wZXJhdGlvbiAhPSBudWxsKSB7Ci0vLwkJCXJlbmFtZU1vZHVsZU9wZXJhdGlvbi5yZWxlYXNlKCk7Ci0vLwkJCXJlbmFtZU1vZHVsZU9wZXJhdGlvbiA9IG51bGw7Ci0vLwkJfQotCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBudWxsOwotCQltb2R1bGVzID0gbnVsbDsKLQkJb3B0aW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiN1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci51cGRhdGUoc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXNldEVuYWJsZWRGcm9tU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJZWxzZQotCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWRGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbi50b0xpc3QoKS5zaXplKCkgIT0gMSkgewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRFbmFibGVkKGdldEVuYWJsZVN0YXRlQmFzZWRPblNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldEVuYWJsZVN0YXRlQmFzZWRPblNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpc1NlbGVjdGlvbkFsbEREUm9vdHMoKSB8fCBpc1NlbGVjdGlvbkFsbEFwcGxpY2F0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uQWxsRERSb290cygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlJdGVyYXRvciBpdCA9IHNlbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCS8vVE9ETyBjaGVjayBmb3IgajJlZSB3b3JrYmVuY2ggbW9kdWxlIHNlbGVjdGlvbgotCQkJaWYgKCFDb21tb25VdGlsLmlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG8sIGZhbHNlKSAvKiYmICFpc0oyRUVQcm9qZWN0KG8pKi8pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uQWxsQXBwbGljYXRpb25zKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCEobyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKSAmJiAhaXNKMkVFQXBwbGljYXRpb25Qcm9qZWN0KG8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZHVsZXMoKSB7Ci0JCWlmIChtb2R1bGVzID09IG51bGwpIHsKLQkJCW1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IG51bGw7Ci0JCQlPYmplY3QgbyA9IG51bGw7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFdvcmtiZW5jaENvbXBvbmVudCkgewotCQkJCQltb2R1bGVzLmFkZChvKTsKLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIG87Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qob2JqKTsKLQkJCQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJCQkJVVJJIHVyaSA9IG9iai5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gbW9kdWxlQ29yZS5maW5kUmVzb3VyY2VzQnlTb3VyY2VQYXRoKHVyaSk7Ci0JCQkJCQlmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJbW9kdWxlID0gcmVzb3VyY2VzW2ldLmdldENvbXBvbmVudCgpOwotCQkJCQkJCWlmIChtb2R1bGUgIT1udWxsKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUHJvamVjdF9zaG91bGRfbm90X2JlX251bGxfMV9FUlJPUl8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0JCQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJCQkJLy9JZ25vcmUKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChtb2R1bGVDb3JlICE9bnVsbCkKLQkJCQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJOb24tcHJvamVjdF9pbl9zZWxlY3Rpb25fMl9FUlJPUl8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJTGlzdCBsb2NhbE1vZHVsZXMgPSBnZXRNb2R1bGVzKCk7Ci0JCQlpZiAobG9jYWxNb2R1bGVzLnNpemUoKSAhPSAxKQotCQkJCXJldHVybjsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBsb2NhbE1vZHVsZXMuZ2V0KDApOwotCQkJSjJFRVJlbmFtZURpYWxvZyBkbGcgPSBudWxsOwotCi0JCQkvLyBpZiBhbGwgd2UgYXJlIGRvaW5nIGlzIHJlbmFtaW5nIGFuIEVBUiwgbGV0IHRoZSBiYXNlIHBsYXRmb3JtIGRvIGl0Ci0JCQlpZiAoaXNTZWxlY3Rpb25BbGxBcHBsaWNhdGlvbnMoKSkgewotCQkJCVJlbmFtZVJlc291cmNlQWN0aW9uIGFjdGlvbiA9IG5ldyBSZW5hbWVSZXNvdXJjZUFjdGlvbihzaGVsbCk7Ci0JCQkJYWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kdWxlKSk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgY29udGV4dFJvb3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCS8vVE9ETyBhZGQgY29udGV4dCByb290IHRvIHRoZSBtb2R1bGUgbW9kZWwKLQkJCQkvL2NvbnRleHRSb290ID0gbW9kdWxlLmdldFNlcnZlckNvbnRleHRSb290KCk7Ci0JCQkJZGxnID0gbmV3IFJlbmFtZU1vZHVsZURpYWxvZyhzaGVsbCwgbW9kdWxlLmdldE5hbWUoKSwgY29udGV4dFJvb3QpOwotCQkJCWRsZy5vcGVuKCk7Ci0JCQkJaWYgKGRsZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJb3B0aW9ucyA9IGRsZy5nZXRSZW5hbWVPcHRpb25zKCk7Ci0JCQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkKLQkJCQkJb3B0aW9ucy5zZXRTZWxlY3RlZFByb2plY3RzKGxvY2FsTW9kdWxlcyk7Ci0KLQkJCQlpZiAoIShlbnN1cmVFZGl0b3JzU2F2ZWQoKSAmJiB2YWxpZGF0ZVN0YXRlKCkpKQotCQkJCQlyZXR1cm47Ci0JCQkJcmVuYW1lUHJvamVjdHNJZk5lY2Vzc2FyeSgpOwotCQkJCXJlbmFtZU1ldGFkYXRhSWZOZWNlc3NhcnkoKTsKLQkJCQlwcmVzZW50U3RhdHVzSWZOZWNjZXNzYXJ5KCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXNldCgpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gZW5zdXJlRWRpdG9yc1NhdmVkKCkgewotCQlyZXR1cm4gQ29tbW9uRWRpdG9yVXRpbGl0eS5wcm9tcHRUb1NhdmVBbGxEaXJ0eUVkaXRvcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2V0IGdldFJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJaWYgKHJlZmVyZW5jZWRQcm9qZWN0cyA9PSBudWxsKQotCQkJY29tcHV0ZVJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQlyZXR1cm4gcmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWdldE1vZHVsZXMoKTsKLQkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkvL1dvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBtb2R1bGVzLmdldChpKTsKLQkJCS8vVE9ETyBmaXggdXAgY29kZSBoZXJlIGZvciBtb2R1bGVzIGluc3RlYWQgb2YgcHJvamVjdHMKLS8vCQkJRUFSTmF0dXJlUnVudGltZSBydW50aW1lID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpOwotLy8JCQlpZiAocnVudGltZSA9PSBudWxsKQotLy8JCQkJY29udGludWU7Ci0vLwkJCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlyZWZlcmVuY2VkUHJvamVjdHMuYWRkQWxsKGVkaXRNb2RlbC5nZXRNb2R1bGVNYXBwZWRQcm9qZWN0cygpKTsKLS8vCQkJfSBmaW5hbGx5IHsKLS8vCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW5hbWVNZXRhZGF0YUlmTmVjZXNzYXJ5KCkgewotCQlpZiAoIXNob3VsZFJlbmFtZU1ldGFEYXRhKCkpCi0JCQlyZXR1cm47Ci0vLwkJUmVuYW1lTW9kdWxlT3BlcmF0aW9uIG9wID0gZ2V0UmVuYW1lTW9kdWxlT3BlcmF0aW9uKCk7Ci0vLwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gV1RQVUlQbHVnaW4uZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3Mob3ApOwotLy8JCVByb2dyZXNzTW9uaXRvckRpYWxvZyBtb25pdG9yRGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0vLwotLy8JCXRyeSB7Ci0vLwkJCW1vbml0b3JEaWFsb2cucnVuKGZhbHNlLCBmYWxzZSwgcnVubmFibGUpOwotLy8JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotLy8JCQloYW5kbGVFeGNlcHRpb24oZSk7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8JCQkvL0lnbm9yZQotLy8JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZW5hbWVNZXRhRGF0YSgpIHsKLQkJaWYgKHJlbmFtZVByb2plY3RzRmFpbGVkT3JDYW5jZWxsZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gcHJpbVNob3VsZFJlbmFtZU1ldGFEYXRhKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVuYW1lUHJvamVjdHNGYWlsZWRPckNhbmNlbGxlZCgpIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCB8fCAhb3B0aW9ucy5zaG91bGRSZW5hbWVQcm9qZWN0cygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcmVuYW1lZFByb2plY3RzRXhpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW5hbWVkUHJvamVjdHNFeGlzdCgpIHsKLQkJTGlzdCByZW5hbWVkUHJvamVjdHMgPSBvcHRpb25zLmdldEFsbFByb2plY3RzVG9SZW5hbWUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW5hbWVkUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlbmFtZWRQcm9qZWN0cy5nZXQoaSk7Ci0JCQlpZiAocHJvamVjdC5leGlzdHMoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVuYW1lUHJvamVjdHNJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCB8fCAhb3B0aW9ucy5zaG91bGRSZW5hbWVQcm9qZWN0cygpKQotCQkJcmV0dXJuOwotCQlKMkVFUmVuYW1lUmVzb3VyY2VBY3Rpb24gYWN0aW9uID0gbmV3IEoyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbihzaGVsbCk7Ci0JCWFjdGlvbi5zZXROZXdOYW1lKG9wdGlvbnMuZ2V0TmV3TmFtZSgpKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3B0aW9ucy5nZXRBbGxQcm9qZWN0c1RvUmVuYW1lKCkpOwotCQlhY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWwpOwotCQlhY3Rpb24ucnVuKCk7Ci0KLQkJLy8gb25seSB3ZWIgcHJvamVjdHMgc2hvdWxkIGhhdmUgYSBjb250ZXh0IHJvb3QKLQkJU3RyaW5nIG5ld0NvbnRleHRSb290ID0gb3B0aW9ucy5nZXROZXdDb250ZXh0Um9vdCgpOwotCQlpZiAobmV3Q29udGV4dFJvb3QgIT0gbnVsbCAmJiBvcHRpb25zLnNob3VsZFJlbmFtZVByb2plY3RzKCkpIHsKLQkJCS8vV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IChXb3JrYmVuY2hDb21wb25lbnQpIGdldE1vZHVsZXMoKS5nZXQoMCk7Ci0JCQl0cnkgewotCQkJCS8vIFRPRE8gYWRkIHNlcnZlciBjb250ZXh0IHJvb3QgdG8gdGhlIG1vZHVsZSBtb2RlbAotCQkJCS8vbW9kdWxlLnNldFNlcnZlckNvbnRleHRSb290KG5ld0NvbnRleHRSb290KTsJCSAgICAgICAgICAgICAgIAkJCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKElTdGF0dXMuRVJST1IsIFJFTkFNRV9FUlJPUiwgZSk7Ci0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgUkVOQU1FX0VSUk9SLCBSRU5BTUVfTk9UX0NPTVBMRVRFRCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGFjdGlvbidzIGVuYWJsZSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIHRoZSB1c2VkIHNlbGVjdGlvbgotCSAqIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCXN1cGVyLnVwZGF0ZShzZWxlY3Rpb24pOwotCQl9IGVsc2UgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKMkVFQXBwbGljYXRpb25Qcm9qZWN0KE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG87Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVN0YXRlKCkgewotCQlpZiAoIXByaW1TaG91bGRSZW5hbWVNZXRhRGF0YSgpKQotCQkJcmV0dXJuIHRydWU7Ci0KLS8vCQlJVmFsaWRhdGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmFsaWRhdGVFZGl0TGlzdGVuZXIobnVsbCwgZ2V0UmVuYW1lTW9kdWxlT3BlcmF0aW9uKCkuZ2V0UmVuYW1lRWRpdE1vZGVsKCkpOwotLy8JCWxpc3RlbmVyLnNldFNoZWxsKHNoZWxsKTsKLS8vCQlyZXR1cm4gbGlzdGVuZXIudmFsaWRhdGVTdGF0ZSgpLmlzT0soKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByaW1TaG91bGRSZW5hbWVNZXRhRGF0YSgpIHsKLQkJcmV0dXJuIG9wdGlvbnMgIT0gbnVsbCAmJiAob3B0aW9ucy5zaG91bGRSZW5hbWVNb2R1bGVzKCkgfHwgb3B0aW9ucy5zaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JfQotCi0vLwlwcm90ZWN0ZWQgUmVuYW1lTW9kdWxlT3BlcmF0aW9uIGdldFJlbmFtZU1vZHVsZU9wZXJhdGlvbigpIHsKLS8vCQlpZiAocmVuYW1lTW9kdWxlT3BlcmF0aW9uID09IG51bGwpIHsKLS8vCQkJcmVuYW1lTW9kdWxlT3BlcmF0aW9uID0gbmV3IFJlbmFtZU1vZHVsZU9wZXJhdGlvbihvcHRpb25zKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHJlbmFtZU1vZHVsZU9wZXJhdGlvbjsKLS8vCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXNlbnRTdGF0dXNJZk5lY2Nlc3NhcnkoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQotLy8JCWlmIChyZW5hbWVNb2R1bGVPcGVyYXRpb24gIT0gbnVsbCkgewotLy8JCQlzdGF0dXMgPSByZW5hbWVNb2R1bGVPcGVyYXRpb24uZ2V0U3RhdHVzKCk7Ci0vLwkJfQotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuOwotCi0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzLCBJU3RhdHVzLkVSUk9SKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjOWRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDI2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFUmVuYW1lVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWRhcHRhYmlsaXR5VXRpbGl0eTsKLQotCi0vKioKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0KLQlwdWJsaWMgSjJFRVJlbmFtZVBhcnRpY2lwYW50KCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgQWRhcHRhYmlsaXR5VXRpbGl0eS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQUk9KRUNUX0NMQVNTKTsKLQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlPYmplY3RbXSB0YXJnZXRFbGVtZW50cyA9IGdldFByb2Nlc3NvcigpLmdldEVsZW1lbnRzKCk7Ci0JCWlmICh0YXJnZXRFbGVtZW50cyA9PSBudWxsIHx8IHRhcmdldEVsZW1lbnRzLmxlbmd0aCAhPSAxKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcih0YXJnZXRFbGVtZW50c1swXSwgSVBST0pFQ1RfQ0xBU1MpOwotCQkKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSjJFRU1vZHVsZVJlbmFtZUNoYW5nZShwcm9qZWN0LCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCksIGdldEFyZ3VtZW50cygpLmdldFVwZGF0ZVJlZmVyZW5jZXMoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSjJFRVJlbmFtZVVJQ29uc3RhbnRzLlJFTkFNRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKFN0YXR1cy5PS19TVEFUVVMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lUmVzb3VyY2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI3ZTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZW5hbWVSZXNvdXJjZUFjdGlvbjsKLQotcHVibGljIGNsYXNzIEoyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbiBleHRlbmRzIFJlbmFtZVJlc291cmNlQWN0aW9uIHsKLQlTdHJpbmcgbmV3TmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbi4gVXNpbmcgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseSB3aWxsIHJlbmFtZSB1c2luZyBhIGRpYWxvZyAoaWYKLQkgKiBuZWNlc3NhcnkpIHJhdGhlciB0aGFuIHRoZSBpbmxpbmUgZWRpdG9yIG9mIGEgUmVzb3VyY2VOYXZpZ2F0b3IuIE5vdGUgdGhhdCBhIHJlbmFtZSBoYXBwZW5zCi0JICogb24gb25lIGFuZCBvbmx5IG9uZSByZXNvdXJjZSBhdCBhIHRpbWUuCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogICAgICAgICAgICB0aGUgc2hlbGwgZm9yIGFueSBkaWFsb2dzCi0JICovCi0JcHVibGljIEoyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbihTaGVsbCBzaGVsbCkgewotCQlzdXBlcihzaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXcgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUgdGFyZ2V0IHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnlOZXdSZXNvdXJjZU5hbWUoZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVN0cmluZyByZXRWYWwgPSBudWxsOwotCi0JCWlmIChuZXdOYW1lID09IG51bGwgfHwgbmV3TmFtZS5sZW5ndGgoKSA8IDEpIHsKLQkJCXJldFZhbCA9IHN1cGVyLnF1ZXJ5TmV3UmVzb3VyY2VOYW1lKHJlc291cmNlKTsKLQkJfSBlbHNlIHsKLQkJCXJldFZhbCA9IG5ld05hbWU7Ci0JCX0KLQotCQlyZXR1cm4gcmV0VmFsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5ld05hbWUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkgewotCQlyZXR1cm4gbmV3TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuZXdOYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICogICAgICAgICAgICBUaGUgbmV3TmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlc291cmNlT3Blbkxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVzb3VyY2VPcGVuTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmY2MwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVzb3VyY2VPcGVuTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JT3Blbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuT3BlbkV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFUmVzb3VyY2VPcGVuTGlzdGVuZXIgaW1wbGVtZW50cyBJT3Blbkxpc3RlbmVyewotCi0JIHByaXZhdGUgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbiBhY3Rpb247Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JT3Blbkxpc3RlbmVyI29wZW4ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5PcGVuRXZlbnQpCi0JICovCi0JCi0JcHVibGljIHZvaWQgb3BlbihPcGVuRXZlbnQgYW5FdmVudCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGFuRXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkgICAKLQkJICAgIGlmIChnZXRBY3Rpb24oKS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikpCi0JCSAgICAJYWN0aW9uLnJ1bigpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24gZ2V0QWN0aW9uKCkgewotCQlpZiAoYWN0aW9uID09IG51bGwpIAotCQkJYWN0aW9uID0gbmV3IE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24oKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0FwcENsaWVudENvbXBvbmVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3QXBwQ2xpZW50Q29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDU1OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3QXBwQ2xpZW50Q29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotcHVibGljIGNsYXNzIE5ld0FwcENsaWVudENvbXBvbmVudEFjdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbiB7Ci0KLQkvLyBUT0RPIE1ERSAwMi0yOCBGaW5kIGNvcnJlY3QgbGFiZWwKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJOZXdBcHBsQ2xpZW50TW9kdWxlQWN0aW9uX1VJXzAiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gIm5ld19hcHBjbGllbnRwcm9qZWN0X3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBOZXdBcHBDbGllbnRDb21wb25lbnRBY3Rpb24oKSB7Ci0JCXNldFRleHQoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXB1YmxpYyBOZXdBcHBDbGllbnRDb21wb25lbnRBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgQ2xhc3NbXSBhY2NlcHRlZFR5cGVzKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaCwgbGFiZWwsIGFjY2VwdGVkVHlwZXMsIGZhbHNlKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKLQkJcmV0dXJuIG5ldyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFjY2VwdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsgLyogTmV3R3JvdXAuaXNPbkJ1aWxkUGF0aChvYmopICYmICFOZXdHcm91cC5pc0luQXJjaGl2ZShvYmopOyAqLwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nVGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0VBUkNvbXBvbmVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3RUFSQ29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTc0MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3RUFSQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi1wdWJsaWMgY2xhc3MgTmV3RUFSQ29tcG9uZW50QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uIHsKLQkvLyBUT0RPIE1ERSAwMi0yOCBGaW5kIGNvcnJlY3QgbGFiZWwKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJOZXdFQVJNb2R1bGVBY3Rpb25fVUlfMCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAibmV3ZWFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBOZXdFQVJDb21wb25lbnRBY3Rpb24oKSB7Ci0JCXNldFRleHQoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXB1YmxpYyBOZXdFQVJDb21wb25lbnRBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgQ2xhc3NbXSBhY2NlcHRlZFR5cGVzKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaCwgbGFiZWwsIGFjY2VwdGVkVHlwZXMsIGZhbHNlKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKLQkJcmV0dXJuIG5ldyBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFjY2VwdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsgLyogTmV3R3JvdXAuaXNPbkJ1aWxkUGF0aChvYmopICYmICFOZXdHcm91cC5pc0luQXJjaGl2ZShvYmopOyAqLwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nVGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KMkVFUmVzb3VyY2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KMkVFUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzY2I3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSjJFRVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5jb21wb25lbnRjb3JlLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVFZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogQWN0aW9uIGZvciBvcGVuaW5nIGEgSjJFRSByZXNvdXJjZSBmcm9tIHRoZSBKMkVFIG5hdmlnYXRvci4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5BY3Rpb24gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLnVpLmFjdGlvbnMuT3BlbkoyRUVSZXNvdXJjZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIudWkuamF2YS5FbnRlcnByaXNlQmVhbkphdmFFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9KQVZBX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qZHQudWkuQ29tcGlsYXRpb25Vbml0RWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgamF2YUVkaXRvckRlc2NyaXB0b3I7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBiYXNlSmF2YUVkaXRvckRlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotCSAqLwotCXB1YmxpYyBPcGVuSjJFRVJlc291cmNlQWN0aW9uKCkgewotCQlzdXBlcigiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3Rpb24gSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgZ2V0SmF2YUVkaXRvckRlc2NyaXB0b3IoKSB7Ci0JCWlmIChqYXZhRWRpdG9yRGVzY3JpcHRvciA9PSBudWxsKQotCQkJamF2YUVkaXRvckRlc2NyaXB0b3IgPSBmaW5kRWRpdG9yRGVzY3JpcHRvcihKQVZBX0VESVRPUl9JRCk7Ci0JCXJldHVybiBqYXZhRWRpdG9yRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGdldEJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvcigpIHsKLQkJaWYgKGJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvciA9PSBudWxsKQotCQkJYmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yID0gZmluZEVkaXRvckRlc2NyaXB0b3IoQkFTRV9KQVZBX0VESVRPUl9JRCk7Ci0JCXJldHVybiBiYXNlSmF2YUVkaXRvckRlc2NyaXB0b3I7Ci0JfQotCQotCS8qKgotCSAqIG9wZW4gdGhlIGFwcHJvcHJpYXRlIGVkaXRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BcHByb3ByaWF0ZUVkaXRvcihJUmVzb3VyY2UgcikgewotCQlpZiAociA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWVkaXRvciA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KChJRmlsZSkgciksIGN1cnJlbnREZXNjcmlwdG9yLmdldElkKCkpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpCi0JCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSBlZGl0b3IpLnNlbGVjdFJldmVhbChnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IocGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUHJvYmxlbXNfT3BlbmluZ19FZGl0b3JfRVJST1JfIiksIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ibGVtcyBPcGVuaW5nIEVkaXRvciIKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKCFpc0VuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIHsKLQkJCSgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBzcmNPYmplY3QpLm9wZW5JbkVkaXRvcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IHJvID0gKEVPYmplY3QpIHNyY09iamVjdDsKLQkJCUlQcm9qZWN0IHAgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qocm8pOwotCQkJaWYgKHJvIGluc3RhbmNlb2YgQmVhbkxpbmspIHsKLQkJCQlvcGVuQmVhbkxpbmtJbkphdmFFZGl0b3IoKEJlYW5MaW5rKSBybywgcCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3Qpc3JjT2JqZWN0KSk7Ci0JCX0KLQkJZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2UpCi0JCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoUmVzb3VyY2Upc3JjT2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSB3b3JrYmVuY2guIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0JICogdG8gcmVhY3QgdG8gdGhlIGNoYW5nZS4gUmV0dXJucyB0cnVlIGlmIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgc2VsZWN0aW9uLCBhbmQKLQkgKiBmYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogV2hlbiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCB0aGUgc3VwZXIgbWV0aG9kIG11c3QgYWx3YXlzIGJlIGludm9rZWQuIElmIHRoZSBzdXBlciBtZXRob2QKLQkgKiByZXR1cm5zIGZhbHNlLCB0aGlzIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuIGZhbHNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWwgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGlzIGlzIG9uZSBvZiB0aGUgc2VsZWN0aW9ucyB3ZSBjYW4gaGFuZGxlLAotCQkvLyB0aGVuIHNldCB0aGUgc291cmNlIG9iamVjdCBhcyBpcy4gVGhlIHJ1bigpIHdpbGwgZG8gdGhlIGhhcmQgc3R1ZmYuCi0JCU9iamVjdCBvYmogPSBzLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCWN1cnJlbnREZXNjcmlwdG9yID0gZ2V0SmF2YUVkaXRvckRlc2NyaXB0b3IoKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQmVhbkxpbmspCi0JCQljdXJyZW50RGVzY3JpcHRvciA9IGdldEJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvcigpOwkKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3Qpb2JqKTsKLQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwgY29udGVudFR5cGUpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoUmVzb3VyY2Upb2JqKTsKLQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwgY29udGVudFR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJY3VycmVudERlc2NyaXB0b3IgPSBudWxsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXNldEF0dHJpYnV0ZXNGcm9tRGVzY3JpcHRvcigpOwotCQlzcmNPYmplY3QgPSBvYmo7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbGluawotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuQmVhbkxpbmtJbkphdmFFZGl0b3IoQmVhbkxpbmsgbGluaywgSVByb2plY3QgcCkgewotCQlTdHJpbmcgbGlua05hbWUgPSBudWxsOwotCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kQ29tcG9uZW50KGxpbmspOwotCQkvLyBIYW5kbGUgRUpCIExpbmsgY2FzZQotCQlpZiAobGluayBpbnN0YW5jZW9mIEVKQkxpbmspIHsKLQkJCWxpbmtOYW1lID0gKChFSkJMaW5rKSBsaW5rKS5nZXRFamJMaW5rKCk7Ci0JCQlFSkJBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYXJ0aWZhY3RFZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCQkJRUpCSmFyIGVqYkphciA9IGFydGlmYWN0RWRpdC5nZXRFSkJKYXIoKTsKLQkJCQlpZiAoZWpiSmFyID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFuTmFtZWQobGlua05hbWUpOwotCQkJCWlmIChiZWFuID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlqYXZhQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChhcnRpZmFjdEVkaXQhPW51bGwpCi0JCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gSGFuZGxlIFNlcnZsZXQgTGluayBjYXNlCi0JCWVsc2UgewotCQkJbGlua05hbWUgPSAoKFNlcnZsZXRMaW5rKSBsaW5rKS5nZXRTZXJ2bGV0TGluaygpOwotCQkJV2ViQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWFydGlmYWN0RWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQkJCVdlYkFwcCB3ZWJBcHAgPSBhcnRpZmFjdEVkaXQuZ2V0V2ViQXBwKCk7Ci0JCQlpZiAod2ViQXBwID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJU2VydmxldCBzZXJ2bGV0ID0gd2ViQXBwLmdldFNlcnZsZXROYW1lZChsaW5rTmFtZSk7Ci0JCQlpZiAoc2VydmxldCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWphdmFDbGFzcyA9IHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChhcnRpZmFjdEVkaXQhPW51bGwpCi0JCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gT3BlbiBqYXZhIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgb2JqZWN0cyBhc3NvY2lhdGVkIGphdmEgZmlsZQotCQl0cnkgewotCQkJSjJFRUVkaXRvclV0aWxpdHkub3BlbkluRWRpdG9yKGphdmFDbGFzcywgcCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjYW50T3BlbikgewotCQkJY2FudE9wZW4ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRSb290T2JqZWN0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgcmVmT2JqID0gKEVPYmplY3QpIG9iajsKLQkJCXdoaWxlIChyZWZPYmogIT0gbnVsbCAmJiByZWZPYmouZUNvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJcmVmT2JqID0gcmVmT2JqLmVDb250YWluZXIoKTsKLQkJCXJldHVybiByZWZPYmo7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL1dUUEJhc2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL1dUUEJhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwZGNjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9XVFBCYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVsIDcsIDIwMDQKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1RQQmFzZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZTIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFUlJPUl9PQ0NVUlJFRF9USVRMRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFUlJPUl9PQ0NVUlJFRF9USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX09DQ1VSUkVEX01FU1NBR0UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVJST1JfT0NDVVJSRURfTUVTU0FHRSIpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IGdldFdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXRQbHVnaW5Xb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU2hlbGwgc2hlbGwgPSBnZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlpZiAobnVsbCA9PSBzZWxlY3Rpb24pIHsKLQkJCUlTZWxlY3Rpb24gYXV0b3NlbGVjdGlvbiA9IGdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChhdXRvc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkJdGhpcy5zZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGF1dG9zZWxlY3Rpb247Ci0JCX0KLQotCQl0cnkgewotCQkJcHJpbVJ1bihzaGVsbCk7Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IG51bGw7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIEVSUk9SX09DQ1VSUkVEX1RJVExFLCBFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFLCB0LCAwLCBmYWxzZSk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNpbml0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJLy9pbml0Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhU2VsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJcnVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL1dvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMWI5MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIEFuIG9wZXJhdGlvbiB3aGljaCBkZWxlZ2F0ZXMgaXRzIHdvcmsgdG8gYSBydW5uYWJsZSB0aGF0IG1vZGlmaWVzIHRoZSB3b3Jrc3BhY2UuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBleHRlbmRzIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgTGlzdCBmUnVubmFibGVzOwotCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCXN1cGVyKHJ1bGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgb3BlcmF0aW9uIHdoaWNoIHdpbGwgZGVsZWdhdGUgaXRzIHdvcmsgdG8gdGhlIGdpdmVuIHJ1bm5hYmxlLgotCSAqLwotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIExpc3QgbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKHJ1bGUpOwotCQlmUnVubmFibGVzID0gbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihMaXN0IG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzcykgewotCQlzdXBlcigpOwotCQlmUnVubmFibGVzID0gbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgb3BlcmF0aW9uIHdoaWNoIHdpbGwgZGVsZWdhdGUgaXRzIHdvcmsgdG8gdGhlIGdpdmVuIHJ1bm5hYmxlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogICAgICAgICAgICB0aGUgcnVubmFibGUgdG8gZGVsZWdhdGUgdG8gd2hlbiB0aGlzIG9wZXJhdGlvbiBpcyBleGVjdXRlZAotCSAqLwotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmVzdGVkT3ApIHsKLQkJc3VwZXIoKTsKLQkJZ2V0UnVubmFibGVzKCkuYWRkKG5lc3RlZE9wKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRSdW5uYWJsZShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmVzdGVkT3ApIHsKLQkJcmV0dXJuIGdldFJ1bm5hYmxlcygpLmFkZChuZXN0ZWRPcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWludCBzaXplID0gZlJ1bm5hYmxlcy5zaXplKCk7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBzaXplKTsvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlJ1bm5hYmxlcy5zaXplKCk7IGkrKykgewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gKElSdW5uYWJsZVdpdGhQcm9ncmVzcykgZlJ1bm5hYmxlcy5nZXQoaSk7Ci0JCQlvcC5ydW4obmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFJ1bm5hYmxlcygpIHsKLQkJaWYgKGZSdW5uYWJsZXMgPT0gbnVsbCkKLQkJCWZSdW5uYWJsZXMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlyZXR1cm4gZlJ1bm5hYmxlczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0FwcENsaWVudEFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0FwcENsaWVudEFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjEwZmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGllbnQvYWN0aW9ucy9BcHBDbGllbnRBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xpZW50LmFjdGlvbnM7Ci0KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJhcHBjbGllbnRhcmNoaXZldWkiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGllbnQvYWN0aW9ucy9FeHBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0V4cG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTMwNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0V4cG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xpZW50LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlc2NyaXB0b3IoKS5nZXRSZXNvdXJjZVN0cmluZygiJWNsaWVudC5leHBvcnQuYWN0aW9uLmxhYmVsX3VpXyIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiYXBwY2xpZW50X2V4cG9ydF93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQkJQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQoKTsKLQkJSjJFRVVJUGx1Z2luIHBsdWdpbiA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXdpemFyZC5pbml0KHBsdWdpbi5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGllbnQvYWN0aW9ucy9JbXBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0ltcG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MWU4YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0ltcG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xpZW50LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBBcHBDbGllbnRBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBcHBsaWNhdGlvbl9DbGllbnRfSW1wb3J0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiYXBwY2xpZW50X2ltcG9ydF93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSW1wb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQotCQlBcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQgd2l6YXJkID0gbmV3IEFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCgpOwotCi0JCUoyRUVVSVBsdWdpbiBwbHVnaW4gPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JCXdpemFyZC5pbml0KHBsdWdpbi5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0KLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdE92ZXJyaWRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RPdmVycmlkZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1NjRmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdE92ZXJyaWRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFic3RyYWN0T3ZlcnJpZGVhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDcvMDEgMTA6NTY6MDggQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3ZlcnJpZGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEFic3RyYWN0T3ZlcnJpZGVhYmxlQ29tbWFuZCBvdmVycmlkYWJsZTsKLQlwcml2YXRlIEoyRUVDbGlwYm9hcmQgajJlZUNsaXBib2FyZDsKLQotCS8qKgotCSAqIEFic3RyYWN0T3ZlcnJpZGVDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0T3ZlcnJpZGVDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE92ZXJyaWRlQ29tbWFuZChBYnN0cmFjdE92ZXJyaWRlYWJsZUNvbW1hbmQgY29tbWFuZCkgewotCQlzdXBlcihjb21tYW5kLmdldExhYmVsKCksIGNvbW1hbmQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCXNldE92ZXJyaWRhYmxlKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCkgJiYgb3ZlcnJpZGFibGUuZG9DYW5FeGVjdXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIG92ZXJyaWRhYmxlLmRvQ2FuVW5kbygpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIG92ZXJyaWRhYmxlLmRvR2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RG9tYWluKCkgewotCQlyZXR1cm4gZ2V0T3ZlcnJpZGFibGUoKS5nZXREb21haW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxMToxOToyNyBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmNvbW1hbmQuSjJFRUNsaXBib2FyZAotCSAqLwotCXB1YmxpYyBKMkVFQ2xpcGJvYXJkIGdldEoyZWVDbGlwYm9hcmQoKSB7Ci0JCXJldHVybiBqMmVlQ2xpcGJvYXJkOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDEwOjU4OjMzIEFNKQotCSAqIAotCSAqIEByZXR1cm4gQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kCi0JICovCi0JcHVibGljIEFic3RyYWN0T3ZlcnJpZGVhYmxlQ29tbWFuZCBnZXRPdmVycmlkYWJsZSgpIHsKLQkJcmV0dXJuIG92ZXJyaWRhYmxlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIGdldEoyZWVDbGlwYm9hcmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxMToxOToyNyBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SjJlZUNsaXBib2FyZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuY29tbWFuZC5KMkVFQ2xpcGJvYXJkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SjJlZUNsaXBib2FyZChKMkVFQ2xpcGJvYXJkIG5ld0oyZWVDbGlwYm9hcmQpIHsKLQkJajJlZUNsaXBib2FyZCA9IG5ld0oyZWVDbGlwYm9hcmQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDcvMDEgMTA6NTg6MzMgQU0pCi0JICogCi0JICogQHBhcmFtIEFic3RyYWN0T3ZlcnJpZGVhYmxlQ29tbWFuZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE92ZXJyaWRhYmxlKEFic3RyYWN0T3ZlcnJpZGVhYmxlQ29tbWFuZCBuZXdPdmVycmlkYWJsZSkgewotCQlvdmVycmlkYWJsZSA9IG5ld092ZXJyaWRhYmxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ2xpcGJvYXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ2xpcGJvYXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMWM0MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNsaXBib2FyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotcHVibGljIGNsYXNzIEoyRUVDbGlwYm9hcmQgZXh0ZW5kcyBBcnJheUxpc3QgewotCXByaXZhdGUgTWFwIGJpbmRpbmdzOwotCXByaXZhdGUgTWFwIGV4dGVuc2lvbnM7Ci0KLQkvKioKLQkgKiBKMkVFQ2xpcGJvYXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEoyRUVDbGlwYm9hcmQoQ29sbGVjdGlvbiBkZWZhdWx0Q2xpcGJvYXJkKSB7Ci0JCXN1cGVyKGRlZmF1bHRDbGlwYm9hcmQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5hZGRBbGwoYyk7Ci0JCWlmIChyZXN1bHQgJiYgKGMgaW5zdGFuY2VvZiBKMkVFQ2xpcGJvYXJkKSkKLQkJCWFkZEFsbEV4dHJhKChKMkVFQ2xpcGJvYXJkKSBjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbGxFeHRyYShKMkVFQ2xpcGJvYXJkIGMpIHsKLQkJZ2V0QmluZGluZ3MoKS5wdXRBbGwoYy5nZXRCaW5kaW5ncygpKTsKLQkJZ2V0RXh0ZW5zaW9ucygpLnB1dEFsbChjLmdldEV4dGVuc2lvbnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmluZGluZyhFT2JqZWN0IGJvdW5kT2JqZWN0LCBFT2JqZWN0IGJpbmRpbmcpIHsKLQkJZ2V0QmluZGluZ3MoKS5wdXQoYm91bmRPYmplY3QsIGJpbmRpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVuc2lvbihFT2JqZWN0IGV4dGVuZGVkT2JqZWN0LCBFT2JqZWN0IGV4dGVuc2lvbikgewotCQlnZXRFeHRlbnNpb25zKCkucHV0KGV4dGVuZGVkT2JqZWN0LCBleHRlbnNpb24pOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldEJpbmRpbmcoRU9iamVjdCBvKSB7Ci0JCXJldHVybiAoRU9iamVjdCkgZ2V0QmluZGluZ3MoKS5nZXQobyk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRCaW5kaW5ncygpIHsKLQkJaWYgKGJpbmRpbmdzID09IG51bGwpCi0JCQliaW5kaW5ncyA9IG5ldyBIYXNoTWFwKDEwKTsKLQkJcmV0dXJuIGJpbmRpbmdzOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldEV4dGVuc2lvbihFT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRFeHRlbnNpb25zKCkuZ2V0KG8pOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0RXh0ZW5zaW9ucygpIHsKLQkJaWYgKGV4dGVuc2lvbnMgPT0gbnVsbCkKLQkJCWV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgxMCk7Ci0JCXJldHVybiBleHRlbnNpb25zOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0JpbmRpbmdzKCkgewotCQlyZXR1cm4gYmluZGluZ3MgIT0gbnVsbCAmJiAhYmluZGluZ3MuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0V4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBleHRlbnNpb25zICE9IG51bGwgJiYgIWV4dGVuc2lvbnMuaXNFbXB0eSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29tcG91bmRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29tcG91bmRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMTAzYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvbXBvdW5kQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzEzLzAxIDEwOjI3OjE2IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQ29tcG91bmRDb21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIHsKLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihjb21tYW5kTGlzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0TWVyZ2VkQWZmZWN0ZWRPYmplY3RzQ29sbGVjdGlvbigpIHsKLQkJSjJFRUNsaXBib2FyZCByZXN1bHQgPSBuZXcgSjJFRUNsaXBib2FyZChuZXcgQXJyYXlMaXN0KCkpOwotCi0JCWZvciAoSXRlcmF0b3IgY29tbWFuZHMgPSBjb21tYW5kTGlzdC5pdGVyYXRvcigpOyBjb21tYW5kcy5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZHMubmV4dCgpOwotCQkJcmVzdWx0LmFkZEFsbChjb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0TWVyZ2VkUmVzdWx0Q29sbGVjdGlvbigpIHsKLQkJSjJFRUNsaXBib2FyZCByZXN1bHQgPSBuZXcgSjJFRUNsaXBib2FyZChuZXcgQXJyYXlMaXN0KCkpOwotCi0JCWZvciAoSXRlcmF0b3IgY29tbWFuZHMgPSBjb21tYW5kTGlzdC5pdGVyYXRvcigpOyBjb21tYW5kcy5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZHMubmV4dCgpOwotCQkJcmVzdWx0LmFkZEFsbChjb21tYW5kLmdldFJlc3VsdCgpKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWUyYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkNvcHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVDb3B5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJvdGVjdGVkIEVPYmplY3Qgb2JqZWN0VG9Db3B5OwotCXByb3RlY3RlZCBFT2JqZWN0IGJpbmRpbmdUb0NvcHk7Ci0JcHJvdGVjdGVkIEVPYmplY3QgZXh0ZW5zaW9uVG9Db3B5OwotCXByb3RlY3RlZCBKMkVFQ2xpcGJvYXJkIHJlc3VsdDsKLQlwcm90ZWN0ZWQgRXRvb2xzQ29weVV0aWxpdHkgY29weVV0aWw7Ci0KLQlwdWJsaWMgSjJFRUNvcHlDb21tYW5kKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGJpbmRpbmcsIEVPYmplY3QgZXh0ZW5zaW9uLCBFdG9vbHNDb3B5VXRpbGl0eSBjb3B5VXRpbGl0eSkgewotCQlvYmplY3RUb0NvcHkgPSBvYmplY3Q7Ci0JCWJpbmRpbmdUb0NvcHkgPSBiaW5kaW5nOwotCQlleHRlbnNpb25Ub0NvcHkgPSBleHRlbnNpb247Ci0JCWNvcHlVdGlsID0gY29weVV0aWxpdHk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHBlcmZvcm0gdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZyBleGVjdXRlCi0JICogd2hlbiBjYW5FeGVjdXRlIHJldHVybnMgZmFsc2UsIG9yIHdoZW4gY2FuRXhlY3V0ZSBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlDb3B5R3JvdXAgZ3JvdXAgPSBuZXcgQ29weUdyb3VwKCk7Ci0KLQkJZ3JvdXAuYWRkKG9iamVjdFRvQ29weSk7Ci0KLQkJaWYgKGJpbmRpbmdUb0NvcHkgIT0gbnVsbCkKLQkJCWdyb3VwLmFkZChiaW5kaW5nVG9Db3B5KTsKLQkJaWYgKGV4dGVuc2lvblRvQ29weSAhPSBudWxsKQotCQkJZ3JvdXAuYWRkKGV4dGVuc2lvblRvQ29weSk7Ci0JCWNvcHlVdGlsLmNvcHkoZ3JvdXApOwotCQlFT2JqZWN0IGNvcHkgPSBjb3B5VXRpbC5nZXRDb3B5KG9iamVjdFRvQ29weSk7Ci0JCXJlc3VsdCA9IG5ldyBKMkVFQ2xpcGJvYXJkKENvbGxlY3Rpb25zLnNpbmdsZXRvbihjb3B5KSk7Ci0KLQkJaWYgKGJpbmRpbmdUb0NvcHkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hZGRCaW5kaW5nKGNvcHksIGNvcHlVdGlsLmdldENvcHkoYmluZGluZ1RvQ29weSkpOwotCQlpZiAoZXh0ZW5zaW9uVG9Db3B5ICE9IG51bGwpCi0JCQlyZXN1bHQuYWRkRXh0ZW5zaW9uKGNvcHksIGNvcHlVdGlsLmdldENvcHkoZXh0ZW5zaW9uVG9Db3B5KSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgYWdhaW4gcGVyZm9ybSB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byByZWRvIHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyByZWRvIGJlZm9yZSB1bmRvIGlzIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZgotCSAqIHlvdSBpbXBsZW1lbnQgcmVkbyB0byBjYWxsIGV4ZWN1dGUgdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgdG8gYnkgdGhhdAotCSAqIGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy9yZWRvCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5RnJvbUNsaXBib2FyZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5RnJvbUNsaXBib2FyZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5ZDE5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRVVJRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQ29weUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8xMS8wMSA4OjQ1OjIxIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEoyRUVVSUVkaXRpbmdEb21haW4gZG9tYWluOwotCXByaXZhdGUgSjJFRUNsaXBib2FyZCByZXN1bHQ7Ci0JcHJpdmF0ZSBFdG9vbHNDb3B5VXRpbGl0eSBjb3B5VXRpbDsKLQotCXB1YmxpYyBKMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kKEoyRUVVSUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQlkb21haW4gPSBlZGl0aW5nRG9tYWluOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHBlcmZvcm0gdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZyBleGVjdXRlCi0JICogd2hlbiBjYW5FeGVjdXRlIHJldHVybnMgZmFsc2UsIG9yIHdoZW4gY2FuRXhlY3V0ZSBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZiAoY29weVV0aWwgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29weVV0aWwgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKLQkJSjJFRUNsaXBib2FyZCBjbGlwYm9hcmQgPSBkb21haW4uZ2V0SjJFRUNsaXBib2FyZCgpOwotCQlyZXN1bHQgPSBuZXcgSjJFRUNsaXBib2FyZChuZXcgQXJyYXlMaXN0KDApKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwYm9hcmQuc2l6ZSgpOyBpKyspIHsKLQkJCUNvcHlHcm91cCBncm91cCA9IG5ldyBDb3B5R3JvdXAoKTsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBjbGlwYm9hcmQuZ2V0KGkpOwotCQkJZ3JvdXAuYWRkKG8pOwotCQkJRU9iamVjdCBibmQgPSBjbGlwYm9hcmQuZ2V0QmluZGluZyhvKTsKLQkJCWlmIChibmQgIT0gbnVsbCkKLQkJCQlncm91cC5hZGQoYm5kKTsKLQkJCUVPYmplY3QgZXh0ID0gY2xpcGJvYXJkLmdldEV4dGVuc2lvbihvKTsKLQkJCWlmIChleHQgIT0gbnVsbCkKLQkJCQlncm91cC5hZGQoZXh0KTsKLQkJCWNvcHlVdGlsLmNvcHkoZ3JvdXApOwotCQkJRU9iamVjdCBjb3B5ID0gY29weVV0aWwuZ2V0Q29weShvKTsKLQkJCXJlc3VsdC5hZGQoY29weSk7Ci0JCQlpZiAoYm5kICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZEJpbmRpbmcoY29weSwgY29weVV0aWwuZ2V0Q29weShibmQpKTsKLQkJCWlmIChleHQgIT0gbnVsbCkKLQkJCQlyZXN1bHQuYWRkRXh0ZW5zaW9uKGNvcHksIGNvcHlVdGlsLmdldENvcHkoZXh0KSk7Ci0JCX0KLQkJLy9SZXNldCB0aGUgdXRpbCBzbyByZWRvIHdpbGwgYWN0dWFsbCByZWRvCi0JCWNvcHlVdGlsID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBhZ2FpbiBwZXJmb3JtIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIHJlZG8gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIHJlZG8gYmVmb3JlIHVuZG8gaXMgY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmCi0JICogeW91IGltcGxlbWVudCByZWRvIHRvIGNhbGwgZXhlY3V0ZSB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCB0byBieSB0aGF0Ci0JICogZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJcmVzdWx0ID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFmYTNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlUb0NsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kIGV4dGVuZHMgQ29weVRvQ2xpcGJvYXJkQ29tbWFuZCB7Ci0JLy9UaGUgY29sbGVjdGlvbiBvZiBzb3VyY2Ugb2JqZWN0cywgd2l0aCBiaW5kaW5ncyBhbmQgZXh0ZW5zaW9ucywgaWYgYW55IGV4aXN0Ci0JcHJvdGVjdGVkIEoyRUVDbGlwYm9hcmQgZXh0ZW5kZWRTb3VyY2VPYmplY3RzOwotCXByb3RlY3RlZCBib29sZWFuIG9ubHlSZWZPYmplY3RzID0gdHJ1ZTsKLQotCXB1YmxpYyBKMkVFQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKENvcHlUb0NsaXBib2FyZENvbW1hbmQgY21kKSB7Ci0JCXN1cGVyKGNtZC5nZXREb21haW4oKSwgY21kLmdldFNvdXJjZU9iamVjdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29weUNvbW1hbmQoKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgSjJFRUNvbXBvdW5kQ29tbWFuZChDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQlJdGVyYXRvciBpdCA9IGV4dGVuZGVkU291cmNlT2JqZWN0cy5pdGVyYXRvcigpOwotCQlFdG9vbHNDb3B5VXRpbGl0eSBjb3B5VXRpbCA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICghKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSkgewotCQkJCWNtZC5hcHBlbmQoVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRSk7Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3QgciA9IChFT2JqZWN0KSBvOwotCQkJCWNtZC5hcHBlbmQobmV3IEoyRUVDb3B5Q29tbWFuZChyLCBleHRlbmRlZFNvdXJjZU9iamVjdHMuZ2V0QmluZGluZyhyKSwgZXh0ZW5kZWRTb3VyY2VPYmplY3RzLmdldEV4dGVuc2lvbihyKSwgY29weVV0aWwpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY21kLnVud3JhcCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXByZXBhcmVTb3VyY2VPYmplY3RzKCk7Ci0JCWlmICghb25seVJlZk9iamVjdHMpIHsKLQkJCWNvcHlDb21tYW5kID0gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCXJldHVybiBjb3B5Q29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQotCQlpZiAoIWV4dGVuZGVkU291cmNlT2JqZWN0cy5oYXNCaW5kaW5ncygpICYmICFleHRlbmRlZFNvdXJjZU9iamVjdHMuaGFzRXh0ZW5zaW9ucygpKQotCQkJcmV0dXJuIHN1cGVyLnByZXBhcmUoKTsKLQotCQljb3B5Q29tbWFuZCA9IGNyZWF0ZUNvcHlDb21tYW5kKCk7Ci0JCXJldHVybiBjb3B5Q29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVNvdXJjZU9iamVjdHMoKSB7Ci0JCWV4dGVuZGVkU291cmNlT2JqZWN0cyA9IG5ldyBKMkVFQ2xpcGJvYXJkKGdldFNvdXJjZU9iamVjdHMoKSk7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0U291cmNlT2JqZWN0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJLy8JCQlFT2JqZWN0IHIgPSAoRU9iamVjdCkgbzsKLQkJCQkvLyBUT0RPIHN3aXRjaCB0byBhZGFwdGFibGUgY29tbWFuZHMKLQkJCQkvLwkJCUVPYmplY3QgYm5kID0gQmluZGluZ0FuZEV4dGVuc2lvbkhlbHBlci5nZXRCaW5kaW5nKHIpOwotCQkJCS8vCQkJRU9iamVjdCBleHQgPSBCaW5kaW5nQW5kRXh0ZW5zaW9uSGVscGVyLmdldEV4dGVuc2lvbihyKTsKLQkJCQkvLwkJCWlmIChibmQgIT0gbnVsbCkKLQkJCQkvLwkJCQlleHRlbmRlZFNvdXJjZU9iamVjdHMuYWRkQmluZGluZyhyLCBibmQpOwotCQkJCS8vCQkJaWYgKGV4dCAhPSBudWxsKQotCQkJCS8vCQkJCWV4dGVuZGVkU291cmNlT2JqZWN0cy5hZGRFeHRlbnNpb24ociwgZXh0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9SaWdodCBub3cgd2UgY2FuIG9ubHkgaGFuZGxlIHJlZiBvYmplY3RzIGluIHRoZSB0cmVlCi0JCQkJb25seVJlZk9iamVjdHMgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRjYzVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5TdHJpY3RDb21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5JRFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRVVJRWRpdGluZ0RvbWFpbjsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZCBleHRlbmRzIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgewotCXByaXZhdGUgSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZCBjb3B5Q29tbWFuZDsKLQlwcml2YXRlIENvbW1hbmQgYWRkQmluZGluZ3NDb21tYW5kOwotCXByaXZhdGUgQ29tbWFuZCBhZGRFeHRlbnNpb25zQ29tbWFuZDsKLQotCXB1YmxpYyBKMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgcCkgewotCQlzdXBlcihwLmdldERvbWFpbigpLCBwLmdldE93bmVyKCksIHAuZ2V0RmVhdHVyZSgpLCBwLmdldEluZGV4KCksIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXN1cGVyLmRvRXhlY3V0ZSgpOwotCQlleGVjdXRlQWRkQmluZGluZ3MoKTsKLQkJZXhlY3V0ZUFkZEV4dGVuc2lvbnMoKTsKLQkJSjJFRUNsaXBib2FyZCByZXN1bHQgPSAoSjJFRUNsaXBib2FyZCkgZG9HZXRSZXN1bHQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyBpKyspIHsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSByZXN1bHQuZ2V0KGkpOwotCQkJaWYgKHJlc3VsdC5nZXRCaW5kaW5nKG8pICE9IG51bGwgfHwgcmVzdWx0LmdldEV4dGVuc2lvbihvKSAhPSBudWxsKQotCQkJCUlEVXRpbGl0eS5zZXREZWZhdWx0SUQobywgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBkb0dldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIGNvcHlDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0UmVzdWx0KCkgewotCQlyZXR1cm4gY29weUNvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9SZWRvKCkgewotCQlzdXBlci5kb1JlZG8oKTsKLQkJaWYgKGFkZEJpbmRpbmdzQ29tbWFuZCAhPSBudWxsKQotCQkJYWRkQmluZGluZ3NDb21tYW5kLnJlZG8oKTsKLQkJaWYgKGFkZEV4dGVuc2lvbnNDb21tYW5kICE9IG51bGwpCi0JCQlhZGRFeHRlbnNpb25zQ29tbWFuZC5yZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9VbmRvKCkgewotCQlzdXBlci5kb1VuZG8oKTsKLQkJaWYgKGFkZEJpbmRpbmdzQ29tbWFuZCAhPSBudWxsKQotCQkJYWRkQmluZGluZ3NDb21tYW5kLnVuZG8oKTsKLQkJaWYgKGFkZEV4dGVuc2lvbnNDb21tYW5kICE9IG51bGwpCi0JCQlhZGRFeHRlbnNpb25zQ29tbWFuZC51bmRvKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUFkZEJpbmRpbmdzKCkgewotCQlpZiAoYWRkQmluZGluZ3NDb21tYW5kICE9IG51bGwgJiYgYWRkQmluZGluZ3NDb21tYW5kLmNhbkV4ZWN1dGUoKSkKLQkJCWFkZEJpbmRpbmdzQ29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUFkZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChhZGRFeHRlbnNpb25zQ29tbWFuZCAhPSBudWxsICYmIGFkZEV4dGVuc2lvbnNDb21tYW5kLmNhbkV4ZWN1dGUoKSkKLQkJCWFkZEV4dGVuc2lvbnNDb21tYW5kLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgSjJFRUNsaXBib2FyZCBnZXRDb3BpZWRDbGlwb2FyZCgpIHsKLQkJcmV0dXJuIChKMkVFQ2xpcGJvYXJkKSBjb3B5Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSjJFRUNsaXBib2FyZCBnZXRKMkVFQ2xpcGJvYXJkKCkgewotCQlyZXR1cm4gKEoyRUVDbGlwYm9hcmQpIGRvbWFpbi5nZXRDbGlwYm9hcmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlpZiAoZ2V0SjJFRUNsaXBib2FyZCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNvbW1hbmQgPSBuZXcgU3RyaWN0Q29tcG91bmRDb21tYW5kKCk7Ci0KLQkJY29weUNvbW1hbmQgPSBuZXcgSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZCgoSjJFRVVJRWRpdGluZ0RvbWFpbikgZG9tYWluKTsKLQkJY29tbWFuZC5hcHBlbmQoY29weUNvbW1hbmQpOwotCi0JCWNvbW1hbmQuYXBwZW5kKG5ldyBDb21tYW5kV3JhcHBlcigpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7Ci0JCQkJQ29tbWFuZCBhZGRDb21tYW5kID0gQWRkQ29tbWFuZC5jcmVhdGUoZ2V0RG9tYWluKCksIGdldE93bmVyKCksIGdldEZlYXR1cmUoKSwgY29weUNvbW1hbmQuZ2V0UmVzdWx0KCksIGdldEluZGV4KCkpOwotCQkJCXJldHVybiBhZGRDb21tYW5kOwotCQkJfQotCQl9KTsKLQkJcHJlcGFyZUJpbmRpbmdDb21tYW5kKGNvcHlDb21tYW5kKTsKLQkJcHJlcGFyZUV4dGVuc2lvbkNvbW1hbmQoY29weUNvbW1hbmQpOwotCi0JCWJvb2xlYW4gcmVzdWx0OwotCQlpZiAob3B0aW1pemUpIHsKLQkJCS8vIFRoaXMgd2lsbCBkZXRlcm1pbmUgY2FuRXhlY3V0ZSBhcyBlZmZpY2llbnRseSBhcyBwb3NzaWJsZS4KLQkJCS8vCi0JCQlyZXN1bHQgPSBvcHRpbWl6ZWRDYW5FeGVjdXRlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGlzIHdpbGwgYWN0dWFsbHkgZXhlY3V0ZSB0aGUgY29weSBjb21tYW5kIGluIG9yZGVyIHRvIGNoZWNrIGlmIHRoZSBhZGQgY2FuIGV4ZWN1dGUuCi0JCQkvLwotCQkJcmVzdWx0ID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVCaW5kaW5nQ29tbWFuZChmaW5hbCBKMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCkgewotCQlpZiAoIWdldEoyRUVDbGlwYm9hcmQoKS5oYXNCaW5kaW5ncygpKQotCQkJcmV0dXJuOwotCQkvL1RPRE8gbWFrZSBhZGFwdGFibGUgY29tbWFuZAotCQkvLwlhZGRCaW5kaW5nc0NvbW1hbmQgPSBuZXcgQ29tbWFuZFdyYXBwZXIoKSB7Ci0JCS8vCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDb21tYW5kKCkgewotCQkvLwkJCU9iamVjdCBiaW5kaW5nT3duZXIgPSBCaW5kaW5nQW5kRXh0ZW5zaW9uSGVscGVyLmdldEJpbmRpbmdBZGRPd25lcigoRU9iamVjdClnZXRPd25lcigpKTsKLQkJLy8JCQlDb2xsZWN0aW9uIGJpbmRpbmdzQ29waWVzID0gZ2V0Q29waWVkQ2xpcG9hcmQoKS5nZXRCaW5kaW5ncygpLnZhbHVlcygpOwotCQkvLwkJCUNvbW1hbmQgYWRkQ29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGdldERvbWFpbigpLCBiaW5kaW5nT3duZXIsIG51bGwsIGJpbmRpbmdzQ29waWVzLAotCQkvLyBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLQkJLy8JCQlyZXR1cm4gYWRkQ29tbWFuZDsKLQkJLy8JCX0KLQkJLy8JfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRXh0ZW5zaW9uQ29tbWFuZChmaW5hbCBKMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCkgewotCQlpZiAoIWdldEoyRUVDbGlwYm9hcmQoKS5oYXNFeHRlbnNpb25zKCkpCi0JCQlyZXR1cm47Ci0JCS8vIFRPRE8gbWFrZSBhZGFwdGFibGUgY29tbWFuZAotCQkvLwlhZGRFeHRlbnNpb25zQ29tbWFuZCA9IG5ldyBDb21tYW5kV3JhcHBlcigpIHsKLQkJLy8JCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7Ci0JCS8vCQkJT2JqZWN0IGV4dGVuc2lvbk93bmVyID0KLQkJLy8gQmluZGluZ0FuZEV4dGVuc2lvbkhlbHBlci5nZXRFeHRlbnNpb25BZGRPd25lcigoRU9iamVjdClnZXRPd25lcigpKTsKLQkJLy8JCQlDb2xsZWN0aW9uIGV4dGVuc2lvbnNDb3BpZXMgPSBnZXRDb3BpZWRDbGlwb2FyZCgpLmdldEV4dGVuc2lvbnMoKS52YWx1ZXMoKTsKLQkJLy8JCQlDb21tYW5kIGFkZENvbW1hbmQgPSBBZGRDb21tYW5kLmNyZWF0ZShnZXREb21haW4oKSwgZXh0ZW5zaW9uT3duZXIsIG51bGwsCi0JCS8vIGV4dGVuc2lvbnNDb3BpZXMsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotCQkvLwkJCXJldHVybiBhZGRDb21tYW5kOwotCQkvLwkJfQotCQkvLwl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUmVtb3ZlT3ZlcnJpZGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUmVtb3ZlT3ZlcnJpZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjEwMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDEwOjQ0OjAyIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFUmVtb3ZlT3ZlcnJpZGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RPdmVycmlkZUNvbW1hbmQgewotCXByaXZhdGUgUmVtb3ZlQ29tbWFuZCBiaW5kaW5nc1JlbW92ZUNvbW1hbmQ7Ci0JcHJpdmF0ZSBSZW1vdmVDb21tYW5kIGV4dGVuc2lvbnNSZW1vdmVDb21tYW5kOwotCXByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQkvKioKLQkgKiBKMkVFUmVtb3ZlT3ZlcnJpZGVDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEoyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEoyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQoUmVtb3ZlQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCX0KLQotCXByb3RlY3RlZCBSZW1vdmVDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlyZXR1cm4gKFJlbW92ZUNvbW1hbmQpIFJlbW92ZUNvbW1hbmQuY3JlYXRlKGdldERvbWFpbigpLCBlbGVtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHBlcmZvcm0gdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZyBleGVjdXRlCi0JICogd2hlbiBjYW5FeGVjdXRlIHJldHVybnMgZmFsc2UsIG9yIHdoZW4gY2FuRXhlY3V0ZSBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvKgotCQkgKiBGb3IgZWFjaCBvYmplY3QgYmVpbmcgcmVtb3ZlZCwgY2hlY2sgaWYgaXQgaGFzIGEgYmluZGluZywgYW5kIGFuIGV4dGVuc2lvbiBNYWtlCi0JCSAqIGNvbGxlY3Rpb25zIG9mIHRoZXNlLCBtYWtlIGEgY29tbWFuZCBwYXJhbWV0ZXIgZm9yIGVhY2ggY29sbGVjdGlvbiwgYW4gaW5zdGFudGlhdGUgYQotCQkgKiByZW1vdmUgY29tbWFuZAotCQkgKi8KLQotCQlDb2xsZWN0aW9uIG9iamVjdHMgPSBnZXRSZW1vdmVDb21tYW5kKCkuZ2V0Q29sbGVjdGlvbigpOwotCQlMaXN0IGJpbmRpbmdzID0gbmV3IEFycmF5TGlzdChvYmplY3RzLnNpemUoKSk7Ci0JCUxpc3QgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3Qob2JqZWN0cy5zaXplKCkpOwotCQlJdGVyYXRvciBpdCA9IG9iamVjdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKQotCQkJCXJlc291cmNlU2V0ID0gby5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJLy8gVE9ETyBtYWtlIGNvbW1hbmQgYWRhcHRhYmxlCi0JCQkvLwkJRU9iamVjdCBiaW5kaW5nID0gQmluZGluZ0FuZEV4dGVuc2lvbkhlbHBlci5nZXRCaW5kaW5nKG8pOwotCQkJLy8JCWlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCS8vCQkJYmluZGluZ3MuYWRkKGJpbmRpbmcpOwotCQkJLy8JCQlnZXRKMmVlQ2xpcGJvYXJkKCkuYWRkQmluZGluZyhvLCBiaW5kaW5nKTsKLQkJCS8vCQl9Ci0JCQkvLwkJRU9iamVjdCBleHRlbnNpb24gPSBCaW5kaW5nQW5kRXh0ZW5zaW9uSGVscGVyLmdldEV4dGVuc2lvbihvKTsKLQkJCS8vCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCS8vCQkJZXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKLQkJCS8vCQkJZ2V0SjJlZUNsaXBib2FyZCgpLmFkZEV4dGVuc2lvbihvLCBleHRlbnNpb24pOwotCQkJLy8JCX0KLQkJfQotCQlpZiAoIWJpbmRpbmdzLmlzRW1wdHkoKSkKLQkJCXNldEJpbmRpbmdzUmVtb3ZlQ29tbWFuZChjcmVhdGVSZW1vdmVDb21tYW5kKGJpbmRpbmdzKSk7Ci0KLQkJaWYgKCFleHRlbnNpb25zLmlzRW1wdHkoKSkKLQkJCXNldEV4dGVuc2lvbnNSZW1vdmVDb21tYW5kKGNyZWF0ZVJlbW92ZUNvbW1hbmQoZXh0ZW5zaW9ucykpOwotCi0JCWV4ZWN1dGVBbGxDaGlsZHJlbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVBbGxDaGlsZHJlbigpIHsKLQkJZXhlY3V0ZU5lc3RlZChiaW5kaW5nc1JlbW92ZUNvbW1hbmQpOwotCQlleGVjdXRlTmVzdGVkKGV4dGVuc2lvbnNSZW1vdmVDb21tYW5kKTsKLQkJZ2V0T3ZlcnJpZGFibGUoKS5kb0V4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlTmVzdGVkKFJlbW92ZUNvbW1hbmQgY21kKSB7Ci0JCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuZG9DYW5FeGVjdXRlKCkpIHsKLQkJCWNtZC5kb0V4ZWN1dGUoKTsKLQkJCS8vCQlDb2xsZWN0aW9uIHJlc3VsdCA9IGNtZC5nZXRSZXN1bHQoKTsKLQkJCS8vVE9ETwotCQkJLy8JCUJpbmRpbmdBbmRFeHRlbnNpb25IZWxwZXIucmVzb2x2ZUFsbFByb3hpZXMocmVzdWx0LCByZXNvdXJjZVNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxOjMyOjQ0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gUmVtb3ZlQ29tbWFuZAotCSAqLwotCXByb3RlY3RlZCBSZW1vdmVDb21tYW5kIGdldEJpbmRpbmdzUmVtb3ZlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIGJpbmRpbmdzUmVtb3ZlQ29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxOjMyOjQ0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gUmVtb3ZlQ29tbWFuZAotCSAqLwotCXByb3RlY3RlZCBSZW1vdmVDb21tYW5kIGdldEV4dGVuc2lvbnNSZW1vdmVDb21tYW5kKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQ7Ci0JfQotCi0JcHVibGljIFJlbW92ZUNvbW1hbmQgZ2V0UmVtb3ZlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIChSZW1vdmVDb21tYW5kKSBnZXRPdmVycmlkYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXNldEoyZWVDbGlwYm9hcmQobmV3IEoyRUVDbGlwYm9hcmQoZ2V0UmVtb3ZlQ29tbWFuZCgpLmdldENvbGxlY3Rpb24oKSkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgYWdhaW4gcGVyZm9ybSB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byByZWRvIHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyByZWRvIGJlZm9yZSB1bmRvIGlzIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZgotCSAqIHlvdSBpbXBsZW1lbnQgcmVkbyB0byBjYWxsIGV4ZWN1dGUgdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgdG8gYnkgdGhhdAotCSAqIGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZUFsbENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDcvMDEgMTozMjo0NCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3QmluZGluZ3NSZW1vdmVDb21tYW5kCi0JICogICAgICAgICAgICBSZW1vdmVDb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmluZGluZ3NSZW1vdmVDb21tYW5kKFJlbW92ZUNvbW1hbmQgbmV3QmluZGluZ3NSZW1vdmVDb21tYW5kKSB7Ci0JCWJpbmRpbmdzUmVtb3ZlQ29tbWFuZCA9IG5ld0JpbmRpbmdzUmVtb3ZlQ29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxOjMyOjQ0IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHRlbnNpb25zUmVtb3ZlQ29tbWFuZAotCSAqICAgICAgICAgICAgUmVtb3ZlQ29tbWFuZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4dGVuc2lvbnNSZW1vdmVDb21tYW5kKFJlbW92ZUNvbW1hbmQgbmV3RXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQpIHsKLQkJZXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQgPSBuZXdFeHRlbnNpb25zUmVtb3ZlQ29tbWFuZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlnZXRSZW1vdmVDb21tYW5kKCkuZG9VbmRvKCk7Ci0JCXVuZG9OZXN0ZWQoYmluZGluZ3NSZW1vdmVDb21tYW5kKTsKLQkJdW5kb05lc3RlZChleHRlbnNpb25zUmVtb3ZlQ29tbWFuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5kb05lc3RlZChSZW1vdmVDb21tYW5kIGNtZCkgewotCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmRvQ2FuVW5kbygpKQotCQkJY21kLmRvVW5kbygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGY4MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuU3RyaWN0Q29tcG91bmRDb21tYW5kOwotCi0KLQotLyoqCi0gKiBPdmVycmlkZGVuIHRvIHByb3ZpZGUgYW4gYWNjZXNzb3IgdG8gdGhlIHBlc3NpbWlzdGljIGZpZWxkLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIGNhc2Ugb2YKLSAqIHVuZG8vcmVkbyBwYXN0ZS4gV2UgbmVlZCB0aGUgbmVzdGVkIGNvcHkgY29tbW1hbmQgaW4gdGhlIHBhc3RlIGNvbW1hbmQgdG8gcmVkbyBpdHNlbGYgd2hlbiB0aGUKLSAqIHBhc3RlIGNvbW1hbmQgaXMgY29waWVkLCBvdGhlcndpc2Ugd2UgcnVuIGludG8gc2VkIGV4Y2VwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgZXh0ZW5kcyBTdHJpY3RDb21wb3VuZENvbW1hbmQgewotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kKGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQoYm9vbGVhbiBwZXNzaW1pc3RpYykgewotCQlzdXBlcigpOwotCQlzZXRJc1Blc3Npc21pc3RpYyhwZXNzaW1pc3RpYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNQZXNzaXNtaXN0aWMoYm9vbGVhbiBhQm9vbCkgewotCQlpc1Blc3NpbWlzdGljID0gYUJvb2w7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlMzY0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgIHsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHtJTGF1bmNoYWJsZS5jbGFzcyB9OwotCX0KLQotCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZUFkYXB0ZXJVdGlsLmdldE1vZHVsZU9iamVjdChvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VNb2R1bGVBcnRpZmFjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VNb2R1bGVBcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQ0YjdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlTW9kdWxlQXJ0aWZhY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyMSwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci0KLS8qKgotICogQGF1dGhvciBibGFuY2V0dAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVudGVycHJpc2VNb2R1bGVBcnRpZmFjdCBpbXBsZW1lbnRzIElNb2R1bGVBcnRpZmFjdCB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0I2dldE1vZHVsZSgpCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSU1vZHVsZUFydGlmYWN0LmNsYXNzLCBJTGF1bmNoYWJsZS5jbGFzcyB9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVEZXBsb3lhYmxlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KMkVFRGVwbG95YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGYxODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVEZXBsb3lhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyMSwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRURlcGxveWFibGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCUlNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCA9IG51bGw7Ci0vKgkJaWYgKGFkYXB0ZXJUeXBlID09IElNb2R1bGVBcnRpZmFjdC5jbGFzcyApIHsKLQkJCQotCQkJaWYgKG1vZHVsZUFydGlmYWN0ID09IG51bGwgJiYgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5oYXNBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwgIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5kZXBsb3lhYmxlcy5XZWJNb2R1bGVBcnRpZmFjdCIpKSB7Ci0JCQkJbW9kdWxlQXJ0aWZhY3QgPSAoSU1vZHVsZUFydGlmYWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwgIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5kZXBsb3lhYmxlcy5XZWJNb2R1bGVBcnRpZmFjdCIpOwotCQkJfQotCQkJaWYgKG1vZHVsZUFydGlmYWN0ID09IG51bGwgJiYgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5oYXNBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwgIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5JRUpCTW9kdWxlQXJ0aWZhY3QiKSkgewotCQkJCW1vZHVsZUFydGlmYWN0ID0gKElNb2R1bGVBcnRpZmFjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcihhZGFwdGFibGVPYmplY3QsICJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuZGVwbG95YWJsZXMuSUVKQk1vZHVsZUFydGlmYWN0Iik7Ci0JCQl9Ci0JCQlpZiAobW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmhhc0FkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZU1vZHVsZUFydGlmYWN0IikpIHsKLQkJCQltb2R1bGVBcnRpZmFjdCA9IChJTW9kdWxlQXJ0aWZhY3QpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZU1vZHVsZUFydGlmYWN0Iik7Ci0JCQl9Ci0JCQlpZiAobW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmhhc0FkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCAib3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5JU3RhdGljV2ViTW9kdWxlQXJ0aWZhY3QiKSkgewotCQkJCW1vZHVsZUFydGlmYWN0ID0gKElNb2R1bGVBcnRpZmFjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcihhZGFwdGFibGVPYmplY3QsICJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLklTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdCIpOwotCQkJfQotCQl9Ki8KLQkJcmV0dXJuIG1vZHVsZUFydGlmYWN0OwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117SU1vZHVsZUFydGlmYWN0LmNsYXNzLCBJTGF1bmNoYWJsZS5jbGFzc307Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZUVBUkNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlRUFSQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZGZkZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlRUFSQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVsZXRlLkRlbGV0ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRGVsZXRlRUFSQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSjJFRURlbGV0ZVVJQ29uc3RhbnRzLCBMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgRGVsZXRlRUFSRGlhbG9nIGRpYWxvZzsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUFwcFByb2plY3RzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlUmVmUHJvamVjdHNCdG47Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRldGFpbHNCdG47Ci0JcHJvdGVjdGVkIERlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUgbW9kdWxlUmVmc0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciBwcm9qZWN0c0xpc3Q7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTWFwIHJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgV29ya2JlbmNoTGFiZWxQcm92aWRlciB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWxldGVFQVJDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBEZWxldGVFQVJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgRGVsZXRlRUFSRGlhbG9nIGRpYWxvZywgaW50IHN0eWxlLCBTZXQgcmVmZXJlbmNlZFByb2plY3RzKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLmRpYWxvZyA9IGRpYWxvZzsKLQkJaW5pdFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZlcmVuY2VkUHJvamVjdHMpOwotCQlhZGRDaGlsZHJlbigpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0cyB3aGljaCB0aGUgdXNlciBoYXMgY2hvc2VuIHRvIGFsc28gZGVsZXRlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlpZiAoZGVsZXRlQXBwUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJamF2YS51dGlsLkxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkUHJvamVjdHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbGVtZW50ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIGlzU2VsZWN0ZWQgPSAoKEJvb2xlYW4pIGVsZW1lbnQuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQlpZiAoaXNTZWxlY3RlZCkKLQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQuZ2V0S2V5KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFRGVsZXRlRGlhbG9nI2NyZWF0ZURlbGV0ZU9wdGlvbnMoKQotCSAqLwotCXB1YmxpYyBEZWxldGVPcHRpb25zIGNyZWF0ZURlbGV0ZU9wdGlvbnMoKSB7Ci0JCURlbGV0ZU9wdGlvbnMgb3B0cyA9IG5ldyBEZWxldGVPcHRpb25zKCk7Ci0JCW9wdHMuc2V0SXNFQVJEZWxldGUodHJ1ZSk7Ci0JCW9wdHMuc2V0RGVsZXRlUHJvamVjdHModHJ1ZSk7Ci0JCW9wdHMuc2V0RGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzKG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzKCkpOwotCQlvcHRzLnNldERlbGV0ZU1vZHVsZXMobW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGREZWxldGVNb2R1bGVzKCkpOwotCQlvcHRzLnNldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKGdldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKCkpOwotCQlyZXR1cm4gb3B0czsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFJlZmVyZW5jZWRQcm9qZWN0cyhTZXQgcHJvamVjdHMpIHsKLQkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBpdGVyLm5leHQoKTsKLQkJCXJlZmVyZW5jZWRQcm9qZWN0cy5wdXQocHJvamVjdCwgQm9vbGVhbi5UUlVFKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKCkgewotCQlzZXRMYXlvdXQoKTsKLQkJYWRkUmFkaW9Db21wb3NpdGUoKTsKLQkJbW9kdWxlUmVmc0NvbXBvc2l0ZSA9IG5ldyBEZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FLCB0cnVlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCS8vc2V0dXAgZGVmYXVsdHMKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGF5b3V0KCkgewotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMTsKLQkJc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSYWRpb0NvbXBvc2l0ZSgpIHsKLQkJcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDI7Ci0JCXJhZGlvQ29tcG9zaXRlLnNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXJhZGlvQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uc2V0VGV4dChERUxFVEVfRUFSX1BST0pFQ1RTKTsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZGVsZXRlUmVmUHJvamVjdHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlkZWxldGVSZWZQcm9qZWN0c0J0bi5zZXRUZXh0KERFTEVURV9SRUZFUkVOQ0VEX1BST0pFQ1RTKTsKLQkJZGVsZXRlUmVmUHJvamVjdHNCdG4uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlkZXRhaWxzQnRuID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlkZXRhaWxzQnRuLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQlkZXRhaWxzQnRuLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWRldGFpbHNCdG4uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWRldGFpbHNCdG4uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IGRlbGV0ZUFwcFByb2plY3RzQnRuKQotCQkJZGVsZXRlQXBwUHJvamVjdHNCdG5TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVsZXRlUmVmUHJvamVjdHNCdG4pCi0JCQlkZWxldGVSZWZQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBkZXRhaWxzQnRuKQotCQkJZGV0YWlsc0J0blNlbGVjdGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlQXBwUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKGRlbGV0ZUFwcFByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpZiAobGlzdENyZWF0ZWQpCi0JCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJCWRldGFpbHNCdG4uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKSB7Ci0JCWlmIChkZWxldGVSZWZQcm9qZWN0c0J0bi5nZXRTZWxlY3Rpb24oKSkgewotCQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKHRydWUpOwotCQkJbW9kdWxlUmVmc0NvbXBvc2l0ZS5zZXRCdXR0b25zRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBwcmVzc2luZyB0aGUgZGV0YWlscwotCSAqIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpIHsKLQkJUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQlQb2ludCBvbGRTaXplID0gZGlhbG9nLmdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlpZiAobGlzdENyZWF0ZWQpIHsKLQkJCXByb2plY3RzTGlzdC5nZXRDb250cm9sKCkuZGlzcG9zZSgpOwotCQkJbGlzdENyZWF0ZWQgPSBmYWxzZTsKLQkJCWRldGFpbHNCdG4uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVEcm9wRG93bkxpc3QoKTsKLQkJCWRldGFpbHNCdG4uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0JCX0KLQotCQlQb2ludCBuZXdTaXplID0gZGlhbG9nLmdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlnZXRTaGVsbCgpLnNldFNpemUobmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55ICsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEcm9wRG93bkxpc3QoKSB7Ci0JCS8vIGNyZWF0ZSB0aGUgbGlzdAotCQlwcm9qZWN0c0xpc3QgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChyYWRpb0NvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXByb2plY3RzTGlzdC5zZXRMYWJlbFByb3ZpZGVyKGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXByb2plY3RzTGlzdC5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsvKnZpZXdlcnNvcnRlciovfSk7Ci0JCXByb2plY3RzTGlzdC5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCS8vIGZpbGwgdGhlIGxpc3QKLQkJcG9wdWxhdGVMaXN0KCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHByb2plY3RzTGlzdC5nZXRUYWJsZSgpLmdldEl0ZW1IZWlnaHQoKSAqIHJlZmVyZW5jZWRQcm9qZWN0cy5zaXplKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcHJvamVjdHNMaXN0LmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlsaXN0Q3JlYXRlZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaXN0KCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkUHJvamVjdHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJcHJvamVjdHNMaXN0LmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQlib29sZWFuIGNoZWNrZWQgPSAoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWQoZW50cnkuZ2V0S2V5KCksIGNoZWNrZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGV0YWlsc0J0blNlbGVjdGVkKCkgewotCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJcmVmZXJlbmNlZFByb2plY3RzLnB1dChldmVudC5nZXRFbGVtZW50KCksIG5ldyBCb29sZWFuKGV2ZW50LmdldENoZWNrZWQoKSkpOwotCX0KLQotCXByb3RlY3RlZCBJVGFibGVMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy9kaXNwb3NlCi0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIHdvcmtiZW5jaExhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoT2JqZWN0LCBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIHdvcmtiZW5jaExhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVFQVJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZUVBUkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDZkOTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZUVBUkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVFQVJEaWFsb2cgZXh0ZW5kcyBKMkVFRGVsZXRlRGlhbG9nIHsKLQlwcm90ZWN0ZWQgRGVsZXRlRUFSQ29tcG9zaXRlIGRlbGV0ZUNvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgU2V0IHJlZmVyZW5jZWRQcm9qZWN0czsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWxldGVFQVJEaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICovCi0JcHVibGljIERlbGV0ZUVBUkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU2V0IHJlZmVyZW5jZWRQcm9qZWN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgREVMRVRFX0VBUl9PUFRJT05TKTsKLQkJdGhpcy5yZWZlcmVuY2VkUHJvamVjdHMgPSByZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIE1lc3NhZ2VEaWFsb2cjY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSjJFRVVJQ29udGV4dElkcy5ERUxFQVRFX0VBUl9ESUFMT0dfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsZXRlQ29tcG9zaXRlID0gbmV3IERlbGV0ZUVBUkNvbXBvc2l0ZShwYXJlbnQsIHRoaXMsIFNXVC5OT05FLCByZWZlcmVuY2VkUHJvamVjdHMpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlkZWxldGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGRlbGV0ZUNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVEZWxldGVEaWFsb2cjY3JlYXRlRGVsZXRlT3B0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRGVsZXRlT3B0aW9ucygpIHsKLQkJZGVsZXRlT3B0aW9ucyA9IGRlbGV0ZUNvbXBvc2l0ZS5jcmVhdGVEZWxldGVPcHRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2dldENvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRzKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVNb2R1bGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkYTQwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVNb2R1bGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlTW9kdWxlQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSjJFRURlbGV0ZVVJQ29uc3RhbnRzLCBMaXN0ZW5lciB7Ci0KLQkvLwlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZVByb2plY3RzQ2hlY2tCb3g7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVBcHBQcm9qZWN0c0J0bjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZVJlZlByb2plY3RzQnRuOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcmFkaW9Db21wb3NpdGU7Ci0JcHJvdGVjdGVkIERlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUgbW9kdWxlUmVmc0NvbXBvc2l0ZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERlbGV0ZU1vZHVsZUNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIERlbGV0ZU1vZHVsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCWFkZENoaWxkcmVuKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJYWRkRGVsZXRlUHJvamVjdHNHcm91cCgpOwotCQlhZGREZWxldGVNb2R1bGVSZWZzQ29tcG9zaXRlKCk7Ci0JCS8vc2V0IGRlZmF1bHQgdmFsdWVzCi0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG5TZWxlY3RlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlbGV0ZVByb2plY3RzR3JvdXAoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJhZGlvQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMjsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0KGxheSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0bi5zZXRUZXh0KERFTEVURV9QUk9KRUNUU19PTkxZKTsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZGVsZXRlUmVmUHJvamVjdHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlkZWxldGVSZWZQcm9qZWN0c0J0bi5zZXRUZXh0KERFTEVURV9QUk9KRUNUX1JFRkVSRU5DRVMpOwotCQlkZWxldGVSZWZQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGVsZXRlUmVmUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlTW9kdWxlUmVmc0NvbXBvc2l0ZSgpIHsKLQkJbW9kdWxlUmVmc0NvbXBvc2l0ZSA9IG5ldyBEZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FLCBmYWxzZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJbW9kdWxlUmVmc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VwYXJhdG9yKCkgewotCQlMYWJlbCBzZXAgPSBuZXcgTGFiZWwodGhpcywgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzZXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxldGVQcm9qZWN0cygpIHsKLQkJLy8JCXJldHVybiBkZWxldGVQcm9qZWN0c0NoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQkvLyB0aGUgcHJvamVjdCBzaG91bGQgYmUgZGVsZXRlZCwgc2luY2UgZGVsZXRlIHdhcyB0aGUgc2VsZWN0ZWQgYWN0aW9uCi0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzKCkgewotCQlyZXR1cm4gbW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxldGVNb2R1bGVzKCkgewotCQlyZXR1cm4gbW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGREZWxldGVNb2R1bGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IGRlbGV0ZUFwcFByb2plY3RzQnRuKQotCQkJZGVsZXRlQXBwUHJvamVjdHNCdG5TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVsZXRlUmVmUHJvamVjdHNCdG4pCi0JCQlkZWxldGVSZWZQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlQXBwUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKGRlbGV0ZUFwcFByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKSB7Ci0JCWlmIChkZWxldGVSZWZQcm9qZWN0c0J0bi5nZXRTZWxlY3Rpb24oKSkgewotCQkJbW9kdWxlUmVmc0NvbXBvc2l0ZS5zZXRCdXR0b25zRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVNb2R1bGVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2IwZjBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVsZXRlLkRlbGV0ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIERlbGV0ZU1vZHVsZURpYWxvZyBleHRlbmRzIEoyRUVEZWxldGVEaWFsb2cgaW1wbGVtZW50cyBKMkVFRGVsZXRlVUlDb25zdGFudHMgewotCi0JcHJvdGVjdGVkIERlbGV0ZU1vZHVsZUNvbXBvc2l0ZSBkZWxldGVDb21wb3NpdGU7Ci0KLQlwdWJsaWMgRGVsZXRlTW9kdWxlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBERUxFVEVfTU9EVUxFX09QVElPTlMpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUoyRUVVSUNvbnRleHRJZHMuREVMRUFURV9NT0RVTEVfRElBTE9HXzEpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZUNvbXBvc2l0ZSA9IG5ldyBEZWxldGVNb2R1bGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCWRlbGV0ZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gZGVsZXRlQ29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlbGV0ZU9wdGlvbnMoKSB7Ci0JCWRlbGV0ZU9wdGlvbnMgPSBuZXcgRGVsZXRlT3B0aW9ucygpOwotCQlkZWxldGVPcHRpb25zLnNldERlbGV0ZVByb2plY3RzKGRlbGV0ZUNvbXBvc2l0ZS5zaG91bGREZWxldGVQcm9qZWN0cygpKTsKLQkJZGVsZXRlT3B0aW9ucy5zZXREZWxldGVNb2R1bGVzKGRlbGV0ZUNvbXBvc2l0ZS5zaG91bGREZWxldGVNb2R1bGVzKCkpOwotCQlkZWxldGVPcHRpb25zLnNldERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcyhkZWxldGVDb21wb3NpdGUuc2hvdWxkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzKCkpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MzE4OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSjJFRURlbGV0ZVVJQ29uc3RhbnRzLCBMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZU1vZHVsZXNDaGVja2JveDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94OwotCXByb3RlY3RlZCBib29sZWFuIGlzRUFSRGVsZXRlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBEZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgYm9vbGVhbiBpc0VBUkRlbGV0ZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5pc0VBUkRlbGV0ZSA9IGlzRUFSRGVsZXRlOwotCQlhZGRDaGlsZHJlbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKCkgewotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMTsKLQkJc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlhZGREZWxldGVNb2R1bGVzQ2hlY2tib3goKTsKLQkJYWRkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveCgpIHsKLQkJZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0JCWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldFRleHQoREVMRVRFX01PRFVMRV9ERVBFTkRFTkNJRVMpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlTW9kdWxlc0NoZWNrYm94KCkgewotCQlkZWxldGVNb2R1bGVzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0JCVN0cmluZyBsYWJlbCA9IGlzRUFSRGVsZXRlID8gREVMRVRFX01PRFVMRVNfT1RIRVIgOiBERUxFVEVfTU9EVUxFUzsKLQkJZGVsZXRlTW9kdWxlc0NoZWNrYm94LnNldFRleHQobGFiZWwpOwotCQlkZWxldGVNb2R1bGVzQ2hlY2tib3guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzKCkgewotCQlyZXR1cm4gZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsZXRlTW9kdWxlcygpIHsKLQkJcmV0dXJuIGRlbGV0ZU1vZHVsZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdXR0b25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKGVuYWJsZWQpOwotCQlkZWxldGVNb2R1bGVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKGVuYWJsZWQpOwotCQlkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlkZWxldGVNb2R1bGVzQ2hlY2tib3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gZGVsZXRlTW9kdWxlc0NoZWNrYm94ICYmIGRlbGV0ZU1vZHVsZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKSAmJiAhZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpCi0JCQlkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9GaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjOTMyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9GaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZkV4dGVuc2lvbnM7Ci0JLyoqCi0JICogRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgU2hlbGwKLQkgKiBAcGFyZW50IGV4dGVuc2lvbnMgU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQl0aGlzKHBhcmVudCwgbnVsbCwgbnVsbCwgZXh0ZW5zaW9ucywgZmFsc2UpOwotCX0KLQkvKioKLQkgKiBGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBTaGVsbAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgU3RyaW5nCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIFN0cmluZwotCSAqIEBwYXJlbnQgZXh0ZW5zaW9ucyBTdHJpbmdbXQotCSAqIEBwYXJhbSBhbGxvd011bHRpcGxlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGV4dGVuc2lvbnMsIGJvb2xlYW4gYWxsb3dNdWx0aXBsZSkgewotCQlzdXBlcihwYXJlbnQsIG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7Ci0KLQkJc2V0VGl0bGUodGl0bGUpOwotCQlpZiAodGl0bGUgPT0gbnVsbCkKLQkJCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJGaWxlX1NlbGVjdGlvbl9VSV8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCW1lc3NhZ2UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiU2VsZWN0X2FfZmlsZV9fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJc2V0QWxsb3dNdWx0aXBsZSh0cnVlKTsKLQkJc2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJYWRkRmlsdGVyKG5ldyBUeXBlZEZpbGVWaWV3ZXJGaWx0ZXIoZXh0ZW5zaW9ucykpOwotCQlzZXRWYWxpZGF0b3IobmV3IFR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcihuZXcgQ2xhc3NbXXtJRmlsZS5jbGFzc30sIGFsbG93TXVsdGlwbGUpKTsKLQotCX0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGZFeHRlbnNpb25zOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25zKFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJZkV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHAoU3RyaW5nIGhlbHBDb2RlKSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5nZXRQYXJlbnRTaGVsbCgpLCBoZWxwQ29kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVsZXRlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVsZXRlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTdmMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlbGV0ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlbGV0ZS5EZWxldGVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFRGVsZXRlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyBpbXBsZW1lbnRzIEoyRUVEZWxldGVVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgRGVsZXRlT3B0aW9ucyBkZWxldGVPcHRpb25zOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVEZWxldGVEaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlSW1hZ2UKLQkgKiBAcGFyYW0gZGlhbG9nTWVzc2FnZQotCSAqIEBwYXJhbSBkaWFsb2dJbWFnZVR5cGUKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogQHBhcmFtIGRlZmF1bHRJbmRleAotCSAqLwotCXB1YmxpYyBKMkVFRGVsZXRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBudWxsLCBERUxFVEVfRElBTE9HX01FU1NBR0UsIFFVRVNUSU9OLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9LCAwKTsKLQl9Ci0KLQlwdWJsaWMgRGVsZXRlT3B0aW9ucyBnZXREZWxldGVPcHRpb25zKCkgewotCQlyZXR1cm4gZGVsZXRlT3B0aW9uczsKLQl9Ci0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZURlbGV0ZU9wdGlvbnMoKTsKLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSAwKQotCQkJY3JlYXRlRGVsZXRlT3B0aW9ucygpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVsZXRlVUlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZWxldGVVSUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWU3NDRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZWxldGVVSUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVEZWxldGVVSUNvbnN0YW50cyB7Ci0JU3RyaW5nIERFTEVURSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZWxldGVfMSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9QUk9KRUNUUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZWxldGVfc2VsZWN0ZWRfcHJvamVjdChzKV8yIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX01PRFVMRVMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVtb3ZlX21vZHVsZShzKV9mcm9tX2FsbF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uc18zIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX01PRFVMRVNfT1RIRVIgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVtb3ZlX21vZHVsZShzKV9mcm9tX2FsbF9vdGhlcl9FbnRlcnByaXNlX0FwcGxpY2F0aW9uc180Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX01PRFVMRV9ERVBFTkRFTkNJRVMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVtb3ZlX21vZHVsZV9kZXBlbmRlbmNpZXNfcmVmZXJlbmNpbmdfc2VsZWN0ZWRfcHJvamVjdChzKV81Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX01PRFVMRV9PUFRJT05TID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV9Nb2R1bGVfT3B0aW9uc182Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX0VBUl9PUFRJT05TID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX09wdGlvbnNfNyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9OT1RfQ09NUExFVEVEID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV9jb3VsZF9ub3RfYmVfY29tcGxldGVkXzgiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfRVJST1IgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX2Vycm9yXzkiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfRElBTE9HX01FU1NBR0UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV2hhdF93b3VsZF95b3VfbGlrZV90b19kZWxldGVfXzEwIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX0VBUl9QUk9KRUNUUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZWxldGVfc2VsZWN0ZWRfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9wcm9qZWN0KHMpX29ubHlfMTEiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfUkVGRVJFTkNFRF9QUk9KRUNUUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBbHNvX2RlbGV0ZV9tb2R1bGVfYW5kX3V0aWxpdHlfSmF2YV9wcm9qZWN0c18xMiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9QUk9KRUNUU19PTkxZID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV9zZWxlY3RlZF9wcm9qZWN0KHMpX29ubHlfMTMiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfUFJPSkVDVF9SRUZFUkVOQ0VTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFsc29fZGVsZXRlX3JlZmVyZW5jZXNfdG9fc2VsZWN0ZWRfcHJvamVjdChzKV8xNCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENVU1RPTV9ERUxFVEVfTUlYX01BVENIID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNVU1RPTV9ERUxFVEVfTUlYX01BVENIX1VJXyIpOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVN0YXR1c0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVN0YXR1c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDRhMGIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZXBsb3lTdGF0dXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBzYWdhcndhbAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVEZXBsb3lTdGF0dXNEaWFsb2cgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JEaWFsb2cgaW1wbGVtZW50cyBKMkVFRGVwbG95VUlDb25zdGFudHMgewotCi0JLyoqCi0JICogUmVzZXJ2ZSByb29tIGZvciB0aGlzIG1hbnkgbGlzdCBpdGVtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9JVEVNX0NPVU5UID0gNzsKLQlwcml2YXRlIGludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JcHVibGljIENvbG9yIERFU0NfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7Ci0JLyoqCi0JICogVGhlIERldGFpbHMgYnV0dG9uLgotCSAqLwotCXByaXZhdGUgQnV0dG9uIGRldGFpbHNCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgU1dUIGxpc3QgY29udHJvbCB0aGF0IGRpc3BsYXlzIHRoZSBlcnJvciBkZXRhaWxzLgotCSAqLwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVycm9yIGRldGFpbHMgdmlld2VyIGlzIGN1cnJlbnRseSBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0ZXh0Q3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogTGlzdCBvZiB0aGUgbWFpbiBlcnJvciBvYmplY3QncyBkZXRhaWxlZCBlcnJvcnMgKGVsZW1lbnQgdHlwZToKLQkgKiA8Y29kZT5KMkVFTWlncmF0aW9uU3RhdHVzPC9jb2RlPikuCi0JICovCi0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBzdGF0dXNMaXN0OwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBKMkVFRGVwbG95U3RhdHVzRGlhbG9nKFNoZWxsIHBhcmVudCwgTGlzdCBzdGF0dXMpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuQk9SREVSIHwgU1dULlRJVExFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7IC8vIG5vCi0JCXN0YXR1c0xpc3QgPSBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGp1c3QgYWZ0ZXIgdGhlIG9wZXJhdGlvbiBpcyBydW4uIERlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGRlY3JlbWVudCB0aGUgbmVzdGluZyBkZXB0aCwKLQkgKiBhbmQgY2xvc2UgdGhlIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGxhbm5lZGZvciAzLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFJ1bigpIHsKLQkJZGVjcmVtZW50TmVzdGluZ0RlcHRoKCk7Ci0JCWNsZWFyQ3Vyc29ycygpOwotCQljYW5jZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJZGV0YWlsc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQljb21wdXRlU2V2ZXJpdHkoKTsKLQkJc2V0RGVwbG95bWVudFN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RGVwbG95bWVudFN0YXR1cygpIHsKLQkJc2V0TWVzc2FnZU9yRGVmYXVsdCgpOwotCQlpbWFnZUxhYmVsLnNldEltYWdlKGdldEltYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1lc3NhZ2VPckRlZmF1bHQoKSB7Ci0JCXN3aXRjaCAoZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQltZXNzYWdlID0gREVQTE9ZX0VSUk9SU19SRVBPUlQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJbWVzc2FnZSA9IERFUExPWV9XQVJOSU5HU19SRVBPUlQ7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQltZXNzYWdlID0gREVQTE9ZX1NVQ0NFU1NfUkVQT1JUOwotCQkJCWJyZWFrOwotCQl9Ci0JCXNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYW5jZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDYW5jZWxCdXR0b24ocGFyZW50KTsKLQkJY2FuY2VsLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNhbmNlbCBidXR0b24KLQkJY3JlYXRlQ2FuY2VsQnV0dG9uKHBhcmVudCk7Ci0JCWRldGFpbHNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLCBmYWxzZSk7Ci0JCWRldGFpbHNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIEhhbmRsZXMgdGhlIHByZXNzaW5nIG9mIHRoZSBPayBvciBEZXRhaWxzIGJ1dHRvbiBpbgotCSAqIHRoaXMgZGlhbG9nLiBJZiB0aGUgT2sgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gY2xvc2UgdGhpcyBkaWFsb2cuIElmIHRoZSBEZXRhaWxzIGJ1dHRvbiB3YXMKLQkgKiBwcmVzc2VkIHRoZW4gdG9nZ2xlIHRoZSBkaXNwbGF5aW5nIG9mIHRoZSBlcnJvciBkZXRhaWxzIGFyZWEuIE5vdGUgdGhhdCB0aGUgRGV0YWlscyBidXR0b24KLQkgKiB3aWxsIG9ubHkgYmUgdmlzaWJsZSBpZiB0aGUgZXJyb3IgYmVpbmcgZGlzcGxheWVkIHNwZWNpZmllcyBjaGlsZCBkZXRhaWxzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7Ci0JCWlmIChpZCA9PSBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpIHsgLy8gd2FzIHRoZSBkZXRhaWxzIGJ1dHRvbiBwcmVzc2VkPwotCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfSBlbHNlIHsKLQkJCWxvZ1N0YXR1cygpOwotCQkJc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nI2dldEltYWdlKCkKLQkgKi8KLQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlzd2l0Y2ggKGdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5FUlJPUiA6Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0RXJyb3JJbWFnZSgpOwotCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotCQkJCXJldHVybiB0aGlzLmdldFdhcm5pbmdJbWFnZSgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0SW5mb0ltYWdlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVEcm9wRG93blRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGxpc3QKLQkJdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5NVUxUSSk7Ci0JCS8vIGZpbGwgdGhlIGxpc3QKLQkJcG9wdWxhdGVUZXh0KHRleHQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiBMSVNUX0lURU1fQ09VTlQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGV4dENyZWF0ZWQgPSB0cnVlOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nU3RhdHVzKCkgewotCQlJdGVyYXRvciBhZW51bSA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQobWVzc2FnZSk7Ci0JCXdoaWxlIChhZW51bS5oYXNOZXh0KCkpIHsKLQkJCUlTdGF0dXMgY2hpbGRTdGF0dXMgPSAoSVN0YXR1cykgYWVudW0ubmV4dCgpOwotCQkJcG9wdWxhdGVUZXh0KHNiLCBjaGlsZFN0YXR1cywgMCk7Ci0JCX0KLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0luZm8oc2IudG9TdHJpbmcoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGxpc3QgdXNpbmcgdGhpcyBlcnJvciBkaWFsb2cncyBzdGF0dXMgb2JqZWN0LiBUaGlzIHdhbGtzIHRoZSBjaGlsZCBzdGF0aSBvZiB0aGUKLQkgKiBzdGF0dXMgb2JqZWN0IGFuZCBkaXNwbGF5cyB0aGVtIGluIGEgbGlzdC4gVGhlIGZvcm1hdCBmb3IgZWFjaCBlbnRyeSBpcyBzdGF0dXNfcGF0aCA6Ci0JICogc3RhdHVzX21lc3NhZ2UgSWYgdGhlIHN0YXR1cydzIHBhdGggd2FzIG51bGwgdGhlbiBpdCAoYW5kIHRoZSBjb2xvbikgYXJlIG9taXR0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGV4dChUZXh0IHNvbWVUZXh0KSB7Ci0JCUl0ZXJhdG9yIGFlbnVtID0gc3RhdHVzTGlzdC5pdGVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXdoaWxlIChhZW51bS5oYXNOZXh0KCkpIHsKLQkJCUlTdGF0dXMgY2hpbGRTdGF0dXMgPSAoSVN0YXR1cykgYWVudW0ubmV4dCgpOwotCQkJLy9zYi5hcHBlbmQoIkRlcGxveW1lbnQgcmVzdWx0cyBmb3IgIiArIGNoaWxkU3RhdHVzLik7Ci0JCQlwb3B1bGF0ZVRleHQoc2IsIGNoaWxkU3RhdHVzLCAwKTsKLQkJfQotCQlzb21lVGV4dC5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGV4dChTdHJpbmdCdWZmZXIgc2IsIElTdGF0dXMgc3RhdHVzLCBpbnQgbmVzdGluZykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykgewotCQkJc2IuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2IuYXBwZW5kKGdldE1lc3NhZ2VGb3JEaXNwbGF5KHN0YXR1cykpOwotCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlwb3B1bGF0ZVRleHQoc2IsIGNoaWxkcmVuW2ldLCBuZXN0aW5nICsgMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgcHJlc3NpbmcgdGhlIGRldGFpbHMKLQkgKiBidXR0b24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJaWYgKHRleHRDcmVhdGVkKSB7Ci0JCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCXRleHRDcmVhdGVkID0gZmFsc2U7Ci0JCQlkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJdGV4dCA9IGNyZWF0ZURyb3BEb3duVGV4dCgoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLQkJCWRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0JCQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCXRleHQuc2V0QmFja2dyb3VuZChERVNDX0NPTE9SKTsKLQkJfQotCi0JCVBvaW50IG5ld1NpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJZ2V0U2hlbGwoKS5zZXRTaXplKG5ldyBQb2ludCh3aW5kb3dTaXplLngsIHdpbmRvd1NpemUueSArIChuZXdTaXplLnkgLSBvbGRTaXplLnkpKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlRm9yRGlzcGxheShJU3RhdHVzIHN0YXR1cykgewotCQlTdHJpbmcgbWVzc2FnZVN0cmluZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXJldHVybiBtZXNzYWdlU3RyaW5nOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZXZlcml0eVRleHQoSVN0YXR1cyBzdGF0dXMpIHsKLQkJc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQlyZXR1cm4gRVJST1JfVEVYVDsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQlyZXR1cm4gV0FSTklOR19URVhUOwotCQkJY2FzZSBJU3RhdHVzLklORk8gOgotCQkJCXJldHVybiBJTkZPX1RFWFQ7Ci0JCQljYXNlIElTdGF0dXMuT0sgOgotCQkJCXJldHVybiBPS19URVhUOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldikgewotCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCXJldHVybjsKLQkJaWYgKHNldiA9PSBJU3RhdHVzLkVSUk9SKQotCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQllbHNlIGlmIChzZXYgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVNldmVyaXR5KCkgewotCQlJdGVyYXRvciBhZW51bSA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFlbnVtLmhhc05leHQoKSkgewotCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IChJU3RhdHVzKSBhZW51bS5uZXh0KCk7Ci0JCQlzZXRTZXZlcml0eShjaGlsZFN0YXR1cy5nZXRTZXZlcml0eSgpKTsKLQkJCWlmIChnZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJcmV0dXJuIGdldFNldmVyaXR5KCk7Ci0JCQljb21wdXRlU2V2ZXJpdHkoY2hpbGRTdGF0dXMpOwotCQkJaWYgKGdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQlnZXRTZXZlcml0eSgpOwotCQl9Ci0JCXJldHVybiBnZXRTZXZlcml0eSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wdXRlU2V2ZXJpdHkoSVN0YXR1cyBzdGF0dXMpIHsKLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWNvbXB1dGVTZXZlcml0eShjaGlsZHJlbltpXSk7Ci0JCQlpZiAoZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChERVBMT1lfRElBTE9HX1RJVExFKTsKLQkJLy9zaGVsbC5zZXRTaXplKDYwMCwyMDApOyBkb24ndCBzZXQgdGhlIHNpemUgdGhpcyBicmVha3MgdGhlIGRpYWxvZyBmb3IgbGludXguCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJc2V0TWVzc2FnZShERVBMT1lNRU5UX0lOX1BST0dSRVNTKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGxhYmVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlU3RyaW5nKSB7Ci0JCS8vbXVzdCBub3Qgc2V0IG51bGwgdGV4dCBpbiBhIGxhYmVsCi0JCW1lc3NhZ2UgPSBtZXNzYWdlU3RyaW5nID09IG51bGwgPyAiIiA6IG1lc3NhZ2VTdHJpbmc7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1lc3NhZ2VMYWJlbCA9PSBudWxsIHx8IG1lc3NhZ2VMYWJlbC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZXBsb3lVSUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVVJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTM1ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVVJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRURlcGxveVVJQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9URVhUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9FUlJPUl9URVhUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX1RFWFQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX1dBUk5JTkdfVEVYVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19URVhUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9JTkZPX1RFWFQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9LX1RFWFQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX09LX1RFWFQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWU1FTlRfSU5fUFJPR1JFU1MgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZTUVOVF9JTl9QUk9HUkVTUyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZX1NVQ0NFU1NfUkVQT1JUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9TVUNDRVNTX1JFUE9SVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZX1dBUk5JTkdTX1JFUE9SVCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfV0FSTklOR1NfUkVQT1JUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfRVJST1JTX1JFUE9SVCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfRVJST1JTX1JFUE9SVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZX0RJQUxPR19USVRMRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfRElBTE9HX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2JmMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRVJlbmFtZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlbmFtZS5SZW5hbWVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFUmVuYW1lRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgUmVuYW1lT3B0aW9ucyByZW5hbWVPcHRpb25zOwotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVudE5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVSZW5hbWVEaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlSW1hZ2UKLQkgKiBAcGFyYW0gZGlhbG9nTWVzc2FnZQotCSAqIEBwYXJhbSBkaWFsb2dJbWFnZVR5cGUKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogQHBhcmFtIGRlZmF1bHRJbmRleAotCSAqLwotCXB1YmxpYyBKMkVFUmVuYW1lRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbnVsbCwgUkVOQU1FX0RJQUxPR19NRVNTQUdFLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7Ci0JCWN1cnJlbnROYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgUmVuYW1lT3B0aW9ucyBnZXRSZW5hbWVPcHRpb25zKCkgewotCQlyZXR1cm4gcmVuYW1lT3B0aW9uczsKLQl9Ci0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZVJlbmFtZU9wdGlvbnMoKTsKLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSAwKQotCQkJY3JlYXRlUmVuYW1lT3B0aW9ucygpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRVJlbmFtZVVJQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lVUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhNTc0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lVUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotcHVibGljIGludGVyZmFjZSBKMkVFUmVuYW1lVUlDb25zdGFudHMgewotCVN0cmluZyBSRU5BTUUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lXzEiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX3NlbGVjdGVkX3Byb2plY3RfMiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9NT0RVTEVTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9tb2R1bGVfaW5fYWxsX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzMiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfTU9EVUxFU19PVEhFUiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfbW9kdWxlX2luX2FsbF9vdGhlcl9FbnRlcnByaXNlX0FwcGxpY2F0aW9uc180Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX01PRFVMRV9ERVBFTkRFTkNJRVMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX21vZHVsZV9kZXBlbmRlbmNpZXNfcmVmZXJlbmNpbmdfc2VsZWN0ZWRfcHJvamVjdF81Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX01PRFVMRV9PUFRJT05TID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9Nb2R1bGVfT3B0aW9uc182Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX0VBUl9PUFRJT05TID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX09wdGlvbnNfNyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9OT1RfQ09NUExFVEVEID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9jb3VsZF9ub3RfYmVfY29tcGxldGVkXzgiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfRVJST1IgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX2Vycm9yXzkiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfRElBTE9HX01FU1NBR0UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV2hhdF93b3VsZF95b3VfbGlrZV90b19yZW5hbWVfdGhpc190b19fMTAiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfQ09OVEVYVF9ST09UID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbnRleHRfUm9vdF9fMTEiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfRUFSX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9zZWxlY3RlZF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX3Byb2plY3Rfb25seV8xMiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9SRUZFUkVOQ0VEX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFsc29fcmVuYW1lX21vZHVsZV9hbmRfdXRpbGl0eV9KYXZhX3Byb2plY3RzXzEzIik7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9MaXN0TWVzc2FnZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvTGlzdE1lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwOGIxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9MaXN0TWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDExOjI4OjI0IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TWVzc2FnZURpYWxvZyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGxpc3RJdGVtczsKLQlwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCi0JLyoqCi0JICogRUpCU2VsZWN0aXZlSW1wb3J0RGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZUltYWdlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKLQkgKiBAcGFyYW0gZGlhbG9nTWVzc2FnZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkaWFsb2dJbWFnZVR5cGUKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqIEBwYXJhbSBkZWZhdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBMaXN0TWVzc2FnZURpYWxvZyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZGlhbG9nVGl0bGVJbWFnZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIGludCBkaWFsb2dJbWFnZVR5cGUsIGphdmEubGFuZy5TdHJpbmdbXSBkaWFsb2dCdXR0b25MYWJlbHMsIGludCBkZWZhdWx0SW5kZXgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0TWVzc2FnZURpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0JICogQHBhcmFtIGRpYWxvZ01lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nSW1hZ2VUeXBlCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTGlzdE1lc3NhZ2VEaWFsb2cob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBqYXZhLmxhbmcuU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4LCBTdHJpbmdbXSBuYW1lcykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ1RpdGxlSW1hZ2UsIGRpYWxvZ01lc3NhZ2UsIGRpYWxvZ0ltYWdlVHlwZSwgZGlhbG9nQnV0dG9uTGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCQlsaXN0SXRlbXMgPSBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiBhbiBhcmVhIG9mIHRoZSBkaWFsb2cgd2hpY2ggYXBwZWFycyBiZWxvdyB0aGUgbWVzc2FnZSBhbmQKLQkgKiBhYm92ZSB0aGUgYnV0dG9uIGJhci4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gU3ViY2xhc3NlcwotCSAqIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHRoZQotCSAqICAgICAgICAgICAgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBjdXN0b20gYXJlYQotCSAqIEByZXR1cm4gdGhlIGN1c3RvbSBhcmVhIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCAwKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAobGlzdEl0ZW1zICE9IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgTGlzdChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWxpc3Quc2V0SXRlbXMobGlzdEl0ZW1zKTsKLQkJfQotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHNpbXBsZSBjb25maXJtIChPSy9DYW5jZWwpIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5Db25maXJtKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyBPSwotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgZXJyb3IgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FcnJvcihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgRVJST1IsIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyBvayBpcyB0aGUKLQkJLy8gZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkluZm9ybWF0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBJTkZPUk1BVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBpdGVtcyk7Ci0JCS8vIG9rIGlzIHRoZSBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHNpbXBsZSBZZXMvTm8gcXVlc3Rpb24gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBwcmVzc2VzIHRoZSBPSyBidXR0b24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlblF1ZXN0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyB5ZXMKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIHdhcm5pbmcgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5XYXJuaW5nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBXQVJOSU5HLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gb2sgaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVFQVJDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTBhMThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlbmFtZS5SZW5hbWVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLQotcHVibGljIGNsYXNzIFJlbmFtZUVBUkNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cywgTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiByZW5hbWVBcHBQcm9qZWN0c0J0bjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbmFtZVJlZlByb2plY3RzQnRuOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcmFkaW9Db21wb3NpdGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXRhaWxzQnRuOwotCXByb3RlY3RlZCBSZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlIG1vZHVsZVJlZnNDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgcHJvamVjdHNMaXN0OwotCXByb3RlY3RlZCBib29sZWFuIGxpc3RDcmVhdGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIE1hcCByZWZlcmVuY2VkUHJvamVjdHM7Ci0JcHJvdGVjdGVkIFdvcmtiZW5jaExhYmVsUHJvdmlkZXIgd29ya2JlbmNoTGFiZWxQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVuYW1lRUFSQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgUmVuYW1lRUFSQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU2V0IHJlZmVyZW5jZWRQcm9qZWN0cykgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJaW5pdFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZlcmVuY2VkUHJvamVjdHMpOwotCQlhZGRDaGlsZHJlbigpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0cyB3aGljaCB0aGUgdXNlciBoYXMgY2hvc2VuIHRvIGFsc28gcmVuYW1lCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlpZiAocmVuYW1lQXBwUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJamF2YS51dGlsLkxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkUHJvamVjdHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbGVtZW50ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIGlzU2VsZWN0ZWQgPSAoKEJvb2xlYW4pIGVsZW1lbnQuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQlpZiAoaXNTZWxlY3RlZCkKLQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQuZ2V0S2V5KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFUmVuYW1lRGlhbG9nI2NyZWF0ZVJlbmFtZU9wdGlvbnMoKQotCSAqLwotCXB1YmxpYyBSZW5hbWVPcHRpb25zIGNyZWF0ZVJlbmFtZU9wdGlvbnMoKSB7Ci0JCVJlbmFtZU9wdGlvbnMgb3B0cyA9IG5ldyBSZW5hbWVPcHRpb25zKCk7Ci0JCW9wdHMuc2V0SXNFQVJSZW5hbWUodHJ1ZSk7Ci0JCW9wdHMuc2V0UmVuYW1lUHJvamVjdHModHJ1ZSk7Ci0JCW9wdHMuc2V0UmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKCkpOwotCQlvcHRzLnNldFJlbmFtZU1vZHVsZXMobW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVzKCkpOwotCQlvcHRzLnNldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKGdldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKCkpOwotCQlyZXR1cm4gb3B0czsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFJlZmVyZW5jZWRQcm9qZWN0cyhTZXQgcHJvamVjdHMpIHsKLQkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBpdGVyLm5leHQoKTsKLQkJCXJlZmVyZW5jZWRQcm9qZWN0cy5wdXQocHJvamVjdCwgQm9vbGVhbi5UUlVFKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKCkgewotCQlzZXRMYXlvdXQoKTsKLQkJYWRkUmFkaW9Db21wb3NpdGUoKTsKLQkJbW9kdWxlUmVmc0NvbXBvc2l0ZSA9IG5ldyBSZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FLCB0cnVlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGF5b3V0KCkgewotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMTsKLQkJc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSYWRpb0NvbXBvc2l0ZSgpIHsKLQkJcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDI7Ci0JCXJhZGlvQ29tcG9zaXRlLnNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXJhZGlvQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJlbmFtZUFwcFByb2plY3RzQnRuID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJcmVuYW1lQXBwUHJvamVjdHNCdG4uc2V0VGV4dChSRU5BTUVfRUFSX1BST0pFQ1RTKTsKLQkJcmVuYW1lQXBwUHJvamVjdHNCdG4uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXJlbmFtZUFwcFByb2plY3RzQnRuLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmVuYW1lUmVmUHJvamVjdHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlyZW5hbWVSZWZQcm9qZWN0c0J0bi5zZXRUZXh0KFJFTkFNRV9SRUZFUkVOQ0VEX1BST0pFQ1RTKTsKLQkJcmVuYW1lUmVmUHJvamVjdHNCdG4uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCXJlbmFtZVJlZlByb2plY3RzQnRuLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlkZXRhaWxzQnRuID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlkZXRhaWxzQnRuLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQlkZXRhaWxzQnRuLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWRldGFpbHNCdG4uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWRldGFpbHNCdG4uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHJlbmFtZUFwcFByb2plY3RzQnRuKQotCQkJcmVuYW1lQXBwUHJvamVjdHNCdG5TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gcmVuYW1lUmVmUHJvamVjdHNCdG4pCi0JCQlyZW5hbWVSZWZQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBkZXRhaWxzQnRuKQotCQkJZGV0YWlsc0J0blNlbGVjdGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVuYW1lQXBwUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKHJlbmFtZUFwcFByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpZiAobGlzdENyZWF0ZWQpCi0JCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJCWRldGFpbHNCdG4uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbmFtZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKSB7Ci0JCWlmIChyZW5hbWVSZWZQcm9qZWN0c0J0bi5nZXRTZWxlY3Rpb24oKSkgewotCQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKHRydWUpOwotCQkJbW9kdWxlUmVmc0NvbXBvc2l0ZS5zZXRCdXR0b25zRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBwcmVzc2luZyB0aGUgZGV0YWlscwotCSAqIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpIHsKLQkJUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQlQb2ludCBvbGRTaXplID0gZ2V0UGFyZW50KCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlpZiAobGlzdENyZWF0ZWQpIHsKLQkJCXByb2plY3RzTGlzdC5nZXRDb250cm9sKCkuZGlzcG9zZSgpOwotCQkJbGlzdENyZWF0ZWQgPSBmYWxzZTsKLQkJCWRldGFpbHNCdG4uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVEcm9wRG93bkxpc3QoKTsKLQkJCWRldGFpbHNCdG4uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0JCX0KLQotCQlQb2ludCBuZXdTaXplID0gZ2V0UGFyZW50KCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlnZXRTaGVsbCgpLnNldFNpemUobmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55ICsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEcm9wRG93bkxpc3QoKSB7Ci0JCS8vIGNyZWF0ZSB0aGUgbGlzdAotCQlwcm9qZWN0c0xpc3QgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChyYWRpb0NvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXByb2plY3RzTGlzdC5zZXRMYWJlbFByb3ZpZGVyKGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXByb2plY3RzTGlzdC5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsvKnZpZXdlcnNvcnRlciovfSk7Ci0JCXByb2plY3RzTGlzdC5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCS8vIGZpbGwgdGhlIGxpc3QKLQkJcG9wdWxhdGVMaXN0KCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBwcm9qZWN0c0xpc3QuZ2V0VGFibGUoKS5nZXRJdGVtSGVpZ2h0KCkgKiByZWZlcmVuY2VkUHJvamVjdHMuc2l6ZSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXByb2plY3RzTGlzdC5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbGlzdENyZWF0ZWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlzdCgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZFByb2plY3RzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCXByb2plY3RzTGlzdC5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJYm9vbGVhbiBjaGVja2VkID0gKChCb29sZWFuKSBlbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCXByb2plY3RzTGlzdC5zZXRDaGVja2VkKGVudHJ5LmdldEtleSgpLCBjaGVja2VkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRldGFpbHNCdG5TZWxlY3RlZCgpIHsKLQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXJlZmVyZW5jZWRQcm9qZWN0cy5wdXQoZXZlbnQuZ2V0RWxlbWVudCgpLCBuZXcgQm9vbGVhbihldmVudC5nZXRDaGVja2VkKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRhYmxlTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vZGlzcG9zZQotCQkJfQotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KE9iamVjdCwgaW50KQotCQkJICovCi0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lRUFSRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVFQVJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiZDU0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVFQVJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lRUFSRGlhbG9nIGV4dGVuZHMgSjJFRVJlbmFtZURpYWxvZyB7Ci0JcHJvdGVjdGVkIFJlbmFtZUVBUkNvbXBvc2l0ZSByZW5hbWVDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIFNldCByZWZlcmVuY2VkUHJvamVjdHM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVuYW1lRUFSRGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqLwotCXB1YmxpYyBSZW5hbWVFQVJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFNldCByZWZlcmVuY2VkUHJvamVjdHMsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBSRU5BTUVfRUFSX09QVElPTlMsIG5hbWUpOwotCQl0aGlzLnJlZmVyZW5jZWRQcm9qZWN0cyA9IHJlZmVyZW5jZWRQcm9qZWN0czsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgTWVzc2FnZURpYWxvZyNjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLlJFTkFNRV9FQVJfRElBTE9HXzEpOyAvLyROT04tTkxTLTEkCi0JCXJlbmFtZUNvbXBvc2l0ZSA9IG5ldyBSZW5hbWVFQVJDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSwgcmVmZXJlbmNlZFByb2plY3RzKTsKLQkJLy8JCXJlbmFtZUNvbXBvc2l0ZS5zZXROZXdOYW1lKGN1cnJlbnROYW1lKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcmVuYW1lQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiByZW5hbWVDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFUmVuYW1lRGlhbG9nI2NyZWF0ZVJlbmFtZU9wdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVJlbmFtZU9wdGlvbnMoKSB7Ci0JCXJlbmFtZU9wdGlvbnMgPSByZW5hbWVDb21wb3NpdGUuY3JlYXRlUmVuYW1lT3B0aW9ucygpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZU1vZHVsZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MjNmY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFJlbmFtZU1vZHVsZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cywgTGlzdGVuZXIgewotCi0JLy8gcHJvdGVjdGVkIEJ1dHRvbiByZW5hbWVQcm9qZWN0c0NoZWNrQm94OwotCXByb3RlY3RlZCBSZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlIG1vZHVsZVJlZnNDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIFRleHQgbmV3TmFtZVRleHQgPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IG5ld0NvbnRleHRSb290VGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIExhYmVsIG5ld0NvbnRleHRSb290TGFiZWwgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkTmFtZSA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBPS0J1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIExhYmVsIHN0YXR1c01lc3NhZ2VMYWJlbCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVuYW1lTW9kdWxlQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgUmVuYW1lTW9kdWxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJYWRkUmVuYW1lUHJvamVjdHNHcm91cCgpOwotCQlhZGRTZXBhcmF0b3IoKTsKLQkJYWRkUmVuYW1lTW9kdWxlUmVmc0NvbXBvc2l0ZSgpOwotCQkvL0FkZCBpbiBhIGxhYmVsIGZvciBzdGF0dXMgbWVzc2FnZXMgaWYgcmVxdWlyZWQKLQkJc3RhdHVzTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRGb250KHRoaXMuZ2V0Rm9udCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW5hbWVQcm9qZWN0c0dyb3VwKCkgewotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQluZXdOYW1lVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQluZXdOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5ld0NvbnRleHRSb290TGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQluZXdDb250ZXh0Um9vdExhYmVsLnNldFRleHQoUkVOQU1FX0NPTlRFWFRfUk9PVCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbmV3Q29udGV4dFJvb3RMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5ld0NvbnRleHRSb290VGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCW5ld0NvbnRleHRSb290VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8qCi0JCSAqIHJlbmFtZVByb2plY3RzQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0JCSAqIHJlbmFtZVByb2plY3RzQ2hlY2tCb3guc2V0VGV4dChSRU5BTUVfUFJPSkVDVFMpOwotCQkgKiByZW5hbWVQcm9qZWN0c0NoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJICogcmVuYW1lUHJvamVjdHNDaGVja0JveC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsgZGF0YSA9IG5ldwotCQkgKiBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOyBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJICogcmVuYW1lUHJvamVjdHNDaGVja0JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkgKi8KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW5hbWVNb2R1bGVSZWZzQ29tcG9zaXRlKCkgewotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXBhcmF0b3IoKSB7Ci0JCUxhYmVsIHNlcCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5hbWVQcm9qZWN0cygpIHsKLQkJLy8gIHJldHVybiByZW5hbWVQcm9qZWN0c0NoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQkvLyBhbHdheXMgcmVuYW1lIHRoZSBwcm9qZWN0Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmFtZU1vZHVsZURlcGVuZGVuY2llcygpIHsKLQkJcmV0dXJuIG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuYW1lTW9kdWxlcygpIHsKLQkJcmV0dXJuIG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkUmVuYW1lTW9kdWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBuZXdOYW1lVGV4dCAmJiBPS0J1dHRvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IG5ld05hbWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQlPS0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQcm9qZWN0IG5ld1Byb2plY3QgPSByb290LmdldFByb2plY3QobmV3TmFtZSk7Ci0JCQlpZiAobmV3UHJvamVjdC5leGlzdHMoKSkgewotCQkJCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKEpGYWNlQ29sb3JzLmdldEVycm9yVGV4dChzdGF0dXNNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpKSk7Ci0JCQkJU3RyaW5nW10gbmFtZXMgPSB7bmV3TmFtZX07Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2plY3RfYWxyZWFkeV9leGlzdHMuIiksIG5hbWVzKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlPS0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQlPS0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkKLQotCXsKLQkJcmV0dXJuIG5ld05hbWVUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCW9sZE5hbWUgPSBuZXdOYW1lOwotCQluZXdOYW1lVGV4dC5zZXRUZXh0KG5ld05hbWUpOwotCQluZXdOYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJbmV3TmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdDb250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIG5ld0NvbnRleHRSb290VGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3Q29udGV4dFJvb3QoU3RyaW5nIG5ld0NvbnRleHRSb290KSB7Ci0JCWlmIChuZXdDb250ZXh0Um9vdCAhPSBudWxsICYmIG5ld0NvbnRleHRSb290Lmxlbmd0aCgpID4gMSkgewotCQkJbmV3Q29udGV4dFJvb3RUZXh0LnNldFRleHQobmV3Q29udGV4dFJvb3QpOwotCQl9IGVsc2UgewotCQkJbmV3Q29udGV4dFJvb3RMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCW5ld0NvbnRleHRSb290VGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIE9LQnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBPS0J1dHRvbgotCSAqICAgICAgICAgICAgVGhlIE9LQnV0dG9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9LQnV0dG9uKEJ1dHRvbiBvS0J1dHRvbikgewotCQlPS0J1dHRvbiA9IG9LQnV0dG9uOwotCQlPS0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0OWRkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlbmFtZS5SZW5hbWVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lTW9kdWxlRGlhbG9nIGV4dGVuZHMgSjJFRVJlbmFtZURpYWxvZyBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgUmVuYW1lTW9kdWxlQ29tcG9zaXRlIHJlbmFtZUNvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHRSb290ID0gbnVsbDsKLQotCXB1YmxpYyBSZW5hbWVNb2R1bGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBuYW1lLCBTdHJpbmcgb2xkQ29udGV4dFJvb3QpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIFJFTkFNRV9NT0RVTEVfT1BUSU9OUywgbmFtZSk7Ci0JCWNvbnRleHRSb290ID0gb2xkQ29udGV4dFJvb3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSjJFRVVJQ29udGV4dElkcy5SRU5BTUVfTU9EVUxFX0RJQUxPR18xKTsgLy8kTk9OLU5MUy0xJAotCQlyZW5hbWVDb21wb3NpdGUgPSBuZXcgUmVuYW1lTW9kdWxlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlyZW5hbWVDb21wb3NpdGUuc2V0TmV3TmFtZShjdXJyZW50TmFtZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZW5hbWVDb21wb3NpdGUuc2V0TmV3Q29udGV4dFJvb3QoY29udGV4dFJvb3QpOwotCQlyZXR1cm4gcmVuYW1lQ29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVJlbmFtZU9wdGlvbnMoKSB7Ci0JCXJlbmFtZU9wdGlvbnMgPSBuZXcgUmVuYW1lT3B0aW9ucygpOwotCQlyZW5hbWVPcHRpb25zLnNldFJlbmFtZVByb2plY3RzKHJlbmFtZUNvbXBvc2l0ZS5zaG91bGRSZW5hbWVQcm9qZWN0cygpKTsKLQkJcmVuYW1lT3B0aW9ucy5zZXRSZW5hbWVNb2R1bGVzKHJlbmFtZUNvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVzKCkpOwotCQlyZW5hbWVPcHRpb25zLnNldFJlbmFtZU1vZHVsZURlcGVuZGVuY2llcyhyZW5hbWVDb21wb3NpdGUuc2hvdWxkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKCkpOwotCQlyZW5hbWVPcHRpb25zLnNldE5ld05hbWUocmVuYW1lQ29tcG9zaXRlLmdldE5ld05hbWUoKSk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0TmV3Q29udGV4dFJvb3QocmVuYW1lQ29tcG9zaXRlLmdldE5ld0NvbnRleHRSb290KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gT0tCdXR0b24gPSBudWxsOwotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JCU9LQnV0dG9uID0gZ2V0QnV0dG9uKDApOwotCQlyZW5hbWVDb21wb3NpdGUuc2V0T0tCdXR0b24oT0tCdXR0b24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTRhYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzLCBMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbmFtZU1vZHVsZXNDaGVja2JveDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94OwotCXByb3RlY3RlZCBib29sZWFuIGlzRUFSUmVuYW1lOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBSZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgYm9vbGVhbiBpc0VBUlJlbmFtZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5pc0VBUlJlbmFtZSA9IGlzRUFSUmVuYW1lOwotCQlhZGRDaGlsZHJlbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKCkgewotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMTsKLQkJc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJYWRkUmVuYW1lTW9kdWxlc0NoZWNrYm94KCk7Ci0JCWFkZFJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3goKSB7Ci0JCXJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94ID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOwotCQlyZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldFRleHQoUkVOQU1FX01PRFVMRV9ERVBFTkRFTkNJRVMpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVuYW1lTW9kdWxlc0NoZWNrYm94KCkgewotCQlyZW5hbWVNb2R1bGVzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0JCXJlbmFtZU1vZHVsZXNDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCVN0cmluZyBsYWJlbCA9IGlzRUFSUmVuYW1lID8gUkVOQU1FX01PRFVMRVNfT1RIRVIgOiBSRU5BTUVfTU9EVUxFUzsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94LnNldFRleHQobGFiZWwpOwotCQlyZW5hbWVNb2R1bGVzQ2hlY2tib3guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKCkgewotCQlyZXR1cm4gcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuYW1lTW9kdWxlcygpIHsKLQkJcmV0dXJuIHJlbmFtZU1vZHVsZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdXR0b25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKGVuYWJsZWQpOwotCQlyZW5hbWVNb2R1bGVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKGVuYWJsZWQpOwotCQlyZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlyZW5hbWVNb2R1bGVzQ2hlY2tib3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gcmVuYW1lTW9kdWxlc0NoZWNrYm94ICYmIHJlbmFtZU1vZHVsZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKSAmJiAhcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHdvQXJyYXlRdWlja1NvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHdvQXJyYXlRdWlja1NvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWViNzY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R3b0FycmF5UXVpY2tTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIFF1aWNrIHNvcnQgdG8gc29ydCBrZXktdmFsdWUgcGFpcnMuIFRoZSBrZXlzIGFuZCBhcnJheXMgYXJlIHNwZWNpZmllZCBpbgotICogc2VwYXJhdGUgYXJyYXlzLgotICogCi0gKiBAcGxhbm5lZGZvciAyLjAKLSAqLwotcHVibGljIGNsYXNzIFR3b0FycmF5UXVpY2tTb3J0ZXIgewotCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGZDb21wYXJhdG9yOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb21wYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RyaW5nQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZUNhc2U7Ci0KLQkJU3RyaW5nQ29tcGFyYXRvcihib29sZWFuIGlnbm9yZUNhc2UpIHsKLQkJCWZJZ25vcmVDYXNlID0gaWdub3JlQ2FzZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQlyZXR1cm4gZklnbm9yZUNhc2UgPyAoKFN0cmluZykgbGVmdCkuY29tcGFyZVRvSWdub3JlQ2FzZSgoU3RyaW5nKSByaWdodCkgOiAoKFN0cmluZykgbGVmdCkuY29tcGFyZVRvKChTdHJpbmcpIHJpZ2h0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzb3J0ZXIgd2l0aCBkZWZhdWx0IHN0cmluZyBjb21wYXJhdG9yLiBUaGUga2V5cyBhcmUgYXNzdW1lZCB0bwotCSAqIGJlIHN0cmluZ3MuCi0JICogCi0JICogQHBhcmFtIGlnbm9yZUNhc2UKLQkgKiAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIHNvcnRpbmcgaXMgY2FzZSBzZW5zaXRpdmUgb3Igbm90LgotCSAqLwotCXB1YmxpYyBUd29BcnJheVF1aWNrU29ydGVyKGJvb2xlYW4gaWdub3JlQ2FzZSkgewotCQlmQ29tcGFyYXRvciA9IG5ldyBTdHJpbmdDb21wYXJhdG9yKGlnbm9yZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzb3J0ZXIgd2l0aCBhIGNvbXBhcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGNvbXBhcmF0b3IKLQkgKiAgICAgICAgICAgIHRoZSBjb21wYXJhdG9yIHRvIG9yZGVyIHRoZSBlbGVtZW50cy4gVGhlIGNvbXBhcmF0b3IgbXVzdCBub3QKLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUd29BcnJheVF1aWNrU29ydGVyKENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotCQlmQ29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogU29ydHMga2V5cyBhbmQgdmFsdWVzIGluIHBhcmFsbGVsLgotCSAqIAotCSAqIEBwYXJhbSBrZXlzCi0JICogICAgICAgICAgICB0aGUga2V5cyB0byB1c2UgZm9yIHNvcnRpbmcuCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleXMuCi0JICovCi0JcHVibGljIHZvaWQgc29ydChPYmplY3RbXSBrZXlzLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaWYgKChrZXlzID09IG51bGwpIHx8ICh2YWx1ZXMgPT0gbnVsbCkpIHsKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJFaXRoZXIga2V5cyBvciB2YWx1ZXMgaW4gbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoa2V5cy5sZW5ndGggPD0gMSkKLQkJCXJldHVybjsKLQotCQlpbnRlcm5hbFNvcnQoa2V5cywgdmFsdWVzLCAwLCBrZXlzLmxlbmd0aCAtIDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFNvcnQoT2JqZWN0W10ga2V5cywgT2JqZWN0W10gdmFsdWVzLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7Ci0JCWludCBvcmlnaW5hbF9sZWZ0ID0gbGVmdDsKLQkJaW50IG9yaWdpbmFsX3JpZ2h0ID0gcmlnaHQ7Ci0KLQkJT2JqZWN0IG1pZCA9IGtleXNbKGxlZnQgKyByaWdodCkgLyAyXTsKLQkJZG8gewotCQkJd2hpbGUgKGZDb21wYXJhdG9yLmNvbXBhcmUoa2V5c1tsZWZ0XSwgbWlkKSA8IDApCi0JCQkJbGVmdCsrOwotCi0JCQl3aGlsZSAoZkNvbXBhcmF0b3IuY29tcGFyZShtaWQsIGtleXNbcmlnaHRdKSA8IDApCi0JCQkJcmlnaHQtLTsKLQotCQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKLQkJCQlzd2FwKGtleXMsIGxlZnQsIHJpZ2h0KTsKLQkJCQlzd2FwKHZhbHVlcywgbGVmdCwgcmlnaHQpOwotCQkJCWxlZnQrKzsKLQkJCQlyaWdodC0tOwotCQkJfQotCQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKLQotCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KQotCQkJaW50ZXJuYWxTb3J0KGtleXMsIHZhbHVlcywgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOwotCi0JCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpCi0JCQlpbnRlcm5hbFNvcnQoa2V5cywgdmFsdWVzLCBsZWZ0LCBvcmlnaW5hbF9yaWdodCk7Ci0JfQotCi0JLyoKLQkgKiBTd2FwcyB4W2FdIHdpdGggeFtiXS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHN3YXAoT2JqZWN0IHhbXSwgaW50IGEsIGludCBiKSB7Ci0JCU9iamVjdCB0ID0geFthXTsKLQkJeFthXSA9IHhbYl07Ci0JCXhbYl0gPSB0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R5cGVKYXZhU2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R5cGVKYXZhU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwMTIwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlSmF2YVNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGRlcml2ZWQgZnJvbSBKYXZhU2VhcmNoU2NvcGUgYXMgdGhhdCBjbGFzcyBkaWQgbm90IGhhdmUgYQotICogcHJvdmlzaW9uIHRvIGV4Y2x1ZGUgY2xhc3NwYXRoIGVudHJpZXMgdGhhdCBhcmUgbm90IGV4cG9ydGVkIEEgSmF2YS1zcGVjaWZpYwotICogc2NvcGUgZm9yIHNlYXJjaGluZyByZWxhdGl2ZSB0byBvbmUgb3IgbW9yZSBqYXZhIGVsZW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgVHlwZUphdmFTZWFyY2hTY29wZSBpbXBsZW1lbnRzIElKYXZhU2VhcmNoU2NvcGUgewotCi0JcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5ID0gdHJ1ZTsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGVsZW1lbnRzOwotCi0JLyoKLQkgKiBUaGUgcGF0aHMgb2YgdGhlIHJlc291cmNlcyBpbiB0aGlzIHNlYXJjaCBzY29wZSAob3IgdGhlIGNsYXNzcGF0aAotCSAqIGVudHJpZXMnIHBhdGhzIGlmIHRoZSByZXNvdXJjZXMgYXJlIHByb2plY3RzKQotCSAqLwotCXByaXZhdGUgSVBhdGhbXSBwYXRoczsKLQlwcml2YXRlIGJvb2xlYW5bXSBwYXRoV2l0aFN1YkZvbGRlcnM7Ci0JcHJpdmF0ZSBpbnQgcGF0aHNDb3VudDsKLQotCXByaXZhdGUgSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnM7Ci0KLQlwdWJsaWMgVHlwZUphdmFTZWFyY2hTY29wZSgpIHsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0KLQkJLy8gZGlzYWJsZWQgZm9yIG5vdyBhcyB0aGlzIGNvdWxkIGJlIGV4cGVuc2l2ZQotCQkvLyBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1lbWJlclNjb3BlKHRoaXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbmNsb3NpbmdQcm9qZWN0T3JKYXIoSVBhdGggcGF0aCkgewotCQlpbnQgbGVuZ3RoID0gdGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnNbaV0uZXF1YWxzKHBhdGgpKQotCQkJCXJldHVybjsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzLCAwLCB0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFycyA9IG5ldyBJUGF0aFtsZW5ndGggKyAxXSwgMCwgbGVuZ3RoKTsKLQkJdGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnNbbGVuZ3RoXSA9IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZFByb2plY3QuIFRoaXMgbWV0aG9kIGFkZHMgYWxsIHRoZSBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlCi0JICogY3VycmVudCBwcm9qZWN0IHRvIHRoZSBzZWFyY2ggc2NvcGUuCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHBhcmFtIGluY2x1ZGVzUHJlcmVxUHJvamVjdHMKLQkgKiBAcGFyYW0gdmlzaXRlZFByb2plY3RzCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9qZWN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiBpbmNsdWRlc1ByZXJlcVByb2plY3RzLCBIYXNoU2V0IHZpc2l0ZWRQcm9qZWN0cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSB8fCAhdmlzaXRlZFByb2plY3RzLmFkZChwcm9qZWN0KSkKLQkJCXJldHVybjsKLQotCQl0aGlzLmFkZEVuY2xvc2luZ1Byb2plY3RPckphcihwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotCi0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJSUphdmFNb2RlbCBtb2RlbCA9IGphdmFQcm9qZWN0LmdldEphdmFNb2RlbCgpOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCXRoaXMuYWRkKHBhdGgsIHRydWUpOwotCQkJCQl0aGlzLmFkZEVuY2xvc2luZ1Byb2plY3RPckphcihwYXRoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCQlpZiAoaW5jbHVkZXNQcmVyZXFQcm9qZWN0cykgewotCQkJCQkJdGhpcy5hZGQobW9kZWwuZ2V0SmF2YVByb2plY3QoZW50cnkuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkpLCB0cnVlLCB2aXNpdGVkUHJvamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgotCQkJCQl0aGlzLmFkZChlbnRyeS5nZXRQYXRoKCksIHRydWUpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBhZGQuIFRoaXMgbWV0aG9kIGZpbHRlcnMgb3V0IGFsbCB0aGUgY2xhc3NwYXRoIGVudHJpZXMgb2YgdGhlCi0JICogcHJvamVjdCB3aGljaCBhcmUgbm90IGV4cG9ydGVkLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqIEBwYXJhbSBpbmNsdWRlc1ByZXJlcVByb2plY3RzCi0JICogQHBhcmFtIHZpc2l0ZWRQcm9qZWN0cwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiBpbmNsdWRlc1ByZXJlcVByb2plY3RzLCBIYXNoU2V0IHZpc2l0ZWRQcm9qZWN0cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSB8fCAhdmlzaXRlZFByb2plY3RzLmFkZChwcm9qZWN0KSkKLQkJCXJldHVybjsKLQotCQl0aGlzLmFkZEVuY2xvc2luZ1Byb2plY3RPckphcihwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotCi0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJSUphdmFNb2RlbCBtb2RlbCA9IGphdmFQcm9qZWN0LmdldEphdmFNb2RlbCgpOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCWlmIChpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seSgpKSB7Ci0JCQkJaWYgKCFlbnRyeS5pc0V4cG9ydGVkKCkgJiYgZW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJdGhpcy5hZGQocGF0aCwgdHJ1ZSk7Ci0JCQkJCXRoaXMuYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKHBhdGgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6Ci0JCQkJCWlmIChpbmNsdWRlc1ByZXJlcVByb2plY3RzKSB7Ci0JCQkJCQl0aGlzLmFkZChtb2RlbC5nZXRKYXZhUHJvamVjdChlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKSksIHRydWUsIHZpc2l0ZWRQcm9qZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJCXRoaXMuYWRkKGVudHJ5LmdldFBhdGgoKSwgdHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIGFkZChJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBudWxsOwotCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCA6Ci0JCQkJLy8gYSB3b3Jrc3BhY2Ugc29wZSBzaG91bGQgYmUgdXNlZAotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKLQkJCQl0aGlzLmFkZCgoSUphdmFQcm9qZWN0KSBlbGVtZW50LCB0cnVlLCBuZXcgSGFzaFNldCgyKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgotCQkJCXJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQ7Ci0JCQkJdGhpcy5hZGQocm9vdC5nZXRQYXRoKCksIHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6Ci0JCQkJcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudC5nZXRQYXJlbnQoKTsKLQkJCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgewotCQkJCQl0aGlzLmFkZChyb290LmdldFBhdGgoKS5hcHBlbmQobmV3IFBhdGgoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpKSksIGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJdGhpcy5hZGQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gcmVtZW1iZXIgc3ViLWN1IChvciBzdWItY2xhc3MgZmlsZSkgamF2YSBlbGVtZW50cwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcikgewotCQkJCQlpZiAodGhpcy5lbGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJCQl0aGlzLmVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQl9Ci0JCQkJCXRoaXMuZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCQl0aGlzLmFkZCh0aGlzLmZ1bGxQYXRoKGVsZW1lbnQpLCB0cnVlKTsKLQotCQkJCS8vIGZpbmQgcGFja2FnZSBmcmFnbWVudCByb290IGluY2x1ZGluZyB0aGlzIGphdmEgZWxlbWVudAotCQkJCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSkgewotCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCQlyb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBwYXJlbnQ7Ci0JCQkJfQotCQl9Ci0KLQkJaWYgKHJvb3QgIT0gbnVsbCkgewotCQkJaWYgKHJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZKSB7Ci0JCQkJdGhpcy5hZGRFbmNsb3NpbmdQcm9qZWN0T3JKYXIocm9vdC5nZXRQYXRoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmFkZEVuY2xvc2luZ1Byb2plY3RPckphcihyb290LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcGF0aCB0byB0aGlzIHNlYXJjaCBzY29wZS4gUmVtZW1iZXIgaWYgc3ViZm9sZGVycyBuZWVkIHRvCi0JICogYmUgaW5jbHVkZWQgYXMgd2VsbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkKElQYXRoIHBhdGgsIGJvb2xlYW4gd2l0aFN1YkZvbGRlcnMpIHsKLQkJaWYgKHRoaXMucGF0aHMubGVuZ3RoID09IHRoaXMucGF0aHNDb3VudCkgewotCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnBhdGhzLCAwLCB0aGlzLnBhdGhzID0gbmV3IElQYXRoW3RoaXMucGF0aHNDb3VudCAqIDJdLCAwLCB0aGlzLnBhdGhzQ291bnQpOwotCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnBhdGhXaXRoU3ViRm9sZGVycywgMCwgdGhpcy5wYXRoV2l0aFN1YkZvbGRlcnMgPSBuZXcgYm9vbGVhblt0aGlzLnBhdGhzQ291bnQgKiAyXSwgMCwgdGhpcy5wYXRoc0NvdW50KTsKLQkJfQotCQl0aGlzLnBhdGhzW3RoaXMucGF0aHNDb3VudF0gPSBwYXRoOwotCQl0aGlzLnBhdGhXaXRoU3ViRm9sZGVyc1t0aGlzLnBhdGhzQ291bnQrK10gPSB3aXRoU3ViRm9sZGVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjZW5jbG9zZXMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKFN0cmluZyByZXNvdXJjZVBhdGhTdHJpbmcpIHsKLQkJSVBhdGggcmVzb3VyY2VQYXRoOwotCQlpbnQgc2VwYXJhdG9ySW5kZXggPSByZXNvdXJjZVBhdGhTdHJpbmcuaW5kZXhPZihKQVJfRklMRV9FTlRSWV9TRVBBUkFUT1IpOwotCQlpZiAoc2VwYXJhdG9ySW5kZXggIT0gLTEpIHsKLQkJCXJlc291cmNlUGF0aCA9IG5ldyBQYXRoKHJlc291cmNlUGF0aFN0cmluZy5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpKS5hcHBlbmQobmV3IFBhdGgocmVzb3VyY2VQYXRoU3RyaW5nLnN1YnN0cmluZyhzZXBhcmF0b3JJbmRleCArIDEpKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNvdXJjZVBhdGggPSBuZXcgUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcpOwotCQl9Ci0JCXJldHVybiB0aGlzLmVuY2xvc2VzKHJlc291cmNlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2VhcmNoIHNjb3BlIGVuY2xvc2VzIHRoZSBnaXZlbiBwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBlbmNsb3NlcyhJUGF0aCBwYXRoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wYXRoc0NvdW50OyBpKyspIHsKLQkJCWlmICh0aGlzLnBhdGhXaXRoU3ViRm9sZGVyc1tpXSkgewotCQkJCWlmICh0aGlzLnBhdGhzW2ldLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlJUGF0aCBzY29wZVBhdGggPSB0aGlzLnBhdGhzW2ldOwotCQkJCWlmIChzY29wZVBhdGguaXNQcmVmaXhPZihwYXRoKSAmJiAoc2NvcGVQYXRoLnNlZ21lbnRDb3VudCgpID09IHBhdGguc2VnbWVudENvdW50KCkgLSAxKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNlbmNsb3NlcyhJSmF2YUVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKHRoaXMuZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuZWxlbWVudHMuc2l6ZSgpOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlJSmF2YUVsZW1lbnQgc2NvcGVFbGVtZW50ID0gKElKYXZhRWxlbWVudCkgdGhpcy5lbGVtZW50cy5nZXQoaSk7Ci0JCQkJSUphdmFFbGVtZW50IHNlYXJjaGVkRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJd2hpbGUgKHNlYXJjaGVkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWlmIChzZWFyY2hlZEVsZW1lbnQuZXF1YWxzKHNjb3BlRWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9IAotCQkJCQlzZWFyY2hlZEVsZW1lbnQgPSBzZWFyY2hlZEVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmVuY2xvc2VzKHRoaXMuZnVsbFBhdGgoZWxlbWVudCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKQotCSAqLwotCXB1YmxpYyBJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpIHsKLQkJcmV0dXJuIHRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzOwotCX0KLQlwcml2YXRlIElQYXRoIGZ1bGxQYXRoKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50KS5nZXRQYXRoKCk7Ci0JCX0gCi0JCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOwotCQlJUGF0aCBwYXJlbnRQYXRoID0gcGFyZW50ID09IG51bGwgPyBudWxsIDogdGhpcy5mdWxsUGF0aChwYXJlbnQpOwotCQlJUGF0aCBjaGlsZFBhdGg7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJY2hpbGRQYXRoID0gbmV3IFBhdGgoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU9wZW5hYmxlKSB7Ci0JCQljaGlsZFBhdGggPSBuZXcgUGF0aChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhcmVudFBhdGg7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudFBhdGggPT0gbnVsbCA/IGNoaWxkUGF0aCA6IHBhcmVudFBhdGguYXBwZW5kKGNoaWxkUGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5wYXRocyA9IG5ldyBJUGF0aFsxXTsKLQkJdGhpcy5wYXRoV2l0aFN1YkZvbGRlcnMgPSBuZXcgYm9vbGVhblsxXTsKLQkJdGhpcy5wYXRoc0NvdW50ID0gMDsKLQkJdGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMgPSBuZXcgSVBhdGhbMF07Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seSgpIHsKLQkJcmV0dXJuIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5LgotCSAqIAotCSAqIEBwYXJhbSBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seQotCSAqICAgICAgICAgICAgVGhlIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5KGJvb2xlYW4gaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkpIHsKLQkJdGhpcy5pbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seSA9IGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5OwotCX0KLQkvKioKLQkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjaW5jbHVkZXNCaW5hcmllcygpCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjaW5jbHVkZXNDbGFzc3BhdGhzKCkKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI3NldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbikKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKSB7Ci0JCS8vRGVmYXVsdCBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI3NldEluY2x1ZGVzQ2xhc3NwYXRocyhib29sZWFuKQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZXNDbGFzc3BhdGhzKGJvb2xlYW4gaW5jbHVkZXNDbGFzc3BhdGhzKSB7Ci0JCS8vRGVmYXVsdCBub3RoaW5nCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZVNlYXJjaEVuZ2luZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZVNlYXJjaEVuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzczOWYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R5cGVTZWFyY2hFbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlU2VhcmNoRW5naW5lIGV4dGVuZHMgU2VhcmNoRW5naW5lIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUeXBlU2VhcmNoRW5naW5lLgotCSAqLwotCXB1YmxpYyBUeXBlU2VhcmNoRW5naW5lKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUeXBlU2VhcmNoRW5naW5lLgotCSAqIAotCSAqIEBwYXJhbSB3b3JraW5nQ29waWVzCi0JICovCi0JcHVibGljIFR5cGVTZWFyY2hFbmdpbmUoSUNvbXBpbGF0aW9uVW5pdFtdIHdvcmtpbmdDb3BpZXMpIHsKLQkJc3VwZXIod29ya2luZ0NvcGllcyk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNyZWF0ZUphdmFTZWFyY2hTY29wZUZvckFQcm9qZWN0LiBHaXZlbiBhIHByb2plY3QgaXQgcmV0dXJucyB0aGUKLQkgKiBzY29wZSBvZiB0aGUgY2xhc3NlcyB3aXRoaW4gdGhlIHByb2plY3QncyBzY29wZQotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VkUHJvamVjdHMKLQkgKiBAcGFyYW0gaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkKLQkgKiBAcmV0dXJuIElKYXZhU2VhcmNoU2NvcGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElKYXZhU2VhcmNoU2NvcGUgY3JlYXRlSmF2YVNlYXJjaFNjb3BlRm9yQVByb2plY3QoSUphdmFQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZWRQcm9qZWN0cywgYm9vbGVhbiBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seSkgewotCQlpZiAoIWluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5KSB7Ci0JCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnRzW10gPSBuZXcgSUphdmFFbGVtZW50W117cHJvamVjdH07Ci0JCQlyZXR1cm4gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShqYXZhRWxlbWVudHMsIGluY2x1ZGVSZWZlcmVuY2VkUHJvamVjdHMpOwotCQl9Ci0JCVR5cGVKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgVHlwZUphdmFTZWFyY2hTY29wZSgpOwotCQlzY29wZS5zZXRJbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seSh0cnVlKTsKLQkJSGFzaFNldCB2aXNpdGVkUHJvamVjdHMgPSBuZXcgSGFzaFNldCgyKTsKLQkJdHJ5IHsKLQkJCXNjb3BlLmFkZFByb2plY3QocHJvamVjdCwgaW5jbHVkZVJlZmVyZW5jZWRQcm9qZWN0cywgdmlzaXRlZFByb2plY3RzKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R5cGVkRmlsZVZpZXdlckZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZWRGaWxlVmlld2VyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmEwZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZWRGaWxlVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIFR5cGVkRmlsZVZpZXdlckZpbHRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyIHsKLQlwcml2YXRlIFN0cmluZ1tdIGZBY2NlcHRlZEV4dGVuc2lvbnM7Ci0JcHJpdmF0ZSBIYXNodGFibGUgdmlzaXRlZEVsZW1lbnRzOwotCXB1YmxpYyBUeXBlZEZpbGVWaWV3ZXJGaWx0ZXIoU3RyaW5nW10gYWNjZXB0ZWRFeHRlbnNpb25zKSB7Ci0JCWZBY2NlcHRlZEV4dGVuc2lvbnMgPSBhY2NlcHRlZEV4dGVuc2lvbnM7Ci0JCXZpc2l0ZWRFbGVtZW50cyA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoSUZpbGUuY2xhc3MuaXNJbnN0YW5jZShlbGVtZW50KSkKLQkJCXJldHVybiBpc1ZhbGlkRmlsZSgoSUZpbGUpIGVsZW1lbnQpOwotCQlpZiAoSUNvbnRhaW5lci5jbGFzcy5pc0luc3RhbmNlKGVsZW1lbnQpKQotCQkJcmV0dXJuIGlzVmFsaWRDb250YWluZXIoKElDb250YWluZXIpIGVsZW1lbnQpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qCi0JICogQSB2YWxpZCBjb250YWluZXIgaXMgb25lIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIHZhbGlkIG1lbWJlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkQ29udGFpbmVyKElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnM7Ci0JCU9iamVjdCB2YWxpZCA9IHZpc2l0ZWRFbGVtZW50cy5nZXQoY29udGFpbmVyKTsKLQkJaWYgKHZhbGlkICE9IG51bGwpCi0JCQlyZXR1cm4gKChCb29sZWFuKSB2YWxpZCkuYm9vbGVhblZhbHVlKCk7Ci0JCXRyeSB7Ci0JCQltZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpc1ZhbGlkKG1lbWJlcnNbaV0pKSB7Ci0JCQkJCXZpc2l0ZWRFbGVtZW50cy5wdXQoY29udGFpbmVyLCBCb29sZWFuLlRSVUUpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gRG8gbm90aGluZwotCQl9Ci0JCXZpc2l0ZWRFbGVtZW50cy5wdXQoY29udGFpbmVyLCBCb29sZWFuLkZBTFNFKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRmlsZShJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBleHQgPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQWNjZXB0ZWRFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZkFjY2VwdGVkRXh0ZW5zaW9uc1tpXS5lcXVhbHNJZ25vcmVDYXNlKGV4dCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGlzVmFsaWQoZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9BcmNoaXZlRUFSVUlSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9BcmNoaXZlRUFSVUlSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4MmVlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvQXJjaGl2ZUVBUlVJUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUVBUlVJUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiYXJjaGl2ZWVhcnVpIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0VBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzZDdmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuVGFibGVPYmplY3RzOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzcvMjAwMSAxMTozOToxMSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCS8qKgotCSAqIEVBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSB2aWV3ZXIgd2hlbiBpdCBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2Rpc3Bvc2UKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgd2hlbiBpdHMgaW5wdXQgaXMgc2V0IHRvIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4gVGhlIHJlc3VsdCBpcyBub3QKLQkgKiBtb2RpZmllZCBieSB0aGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dEVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBpbnB1dCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZU9iamVjdHMpCi0JCQlyZXR1cm4gKChUYWJsZU9iamVjdHMpIGlucHV0RWxlbWVudCkuZ2V0VGFibGVPYmplY3RzKCkudG9BcnJheSgpOwotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsgLy9zaG91bGQgdGhyb3cgZXhjZXB0aW9uIGluc3RlYWQKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQgaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQKLQkgKiBlbGVtZW50LgotCSAqIDxwPgotCSAqIEEgdHlwaWNhbCB1c2UgZm9yIHRoaXMgbWV0aG9kIGlzIHJlZ2lzdGVyaW5nIHRoZSBjb250ZW50IHByb3ZpZGVyIGFzIGEgbGlzdGVuZXIgdG8gY2hhbmdlcyBvbgotCSAqIHRoZSBuZXcgaW5wdXQgKHVzaW5nIG1vZGVsLXNwZWNpZmljIG1lYW5zKSwgYW5kIGRlcmVnaXN0ZXJpbmcgdGhlIHZpZXdlciBmcm9tIHRoZSBvbGQgaW5wdXQuCi0JICogSW4gcmVzcG9uc2UgdG8gdGhlc2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMsIHRoZSBjb250ZW50IHByb3ZpZGVyIHByb3BhZ2F0ZXMgdGhlIGNoYW5nZXMgdG8gdGhlCi0JICogdmlld2VyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyCi0JICogQHBhcmFtIG9sZElucHV0Ci0JICogICAgICAgICAgICB0aGUgb2xkIGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIgZGlkIG5vdCBwcmV2aW91c2x5Ci0JICogICAgICAgICAgICBoYXZlIGFuIGlucHV0Ci0JICogQHBhcmFtIG5ld0lucHV0Ci0JICogICAgICAgICAgICB0aGUgbmV3IGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIgZG9lcyBub3QgaGF2ZSBhbiBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRXhwb3J0RUFSQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRXhwb3J0RUFSQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzhkN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0V4cG9ydEVBUkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRFQVJBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0UmVzb3VyY2VTdHJpbmcoIiVlYXIuZXhwb3J0LmFjdGlvbi5kZXNjcmlwdGlvbl91aV8iKTsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiZXhwb3J0X2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRXhwb3J0RUFSQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0JCUVBUkNvbXBvbmVudEV4cG9ydFdpemFyZCB3aXphcmQgPSBuZXcgRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkKCk7Ci0JCUoyRUVVSVBsdWdpbiBwbHVnaW4gPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JCXdpemFyZC5pbml0KHBsdWdpbi5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvSW1wb3J0RUFSQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvSW1wb3J0RUFSQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzFkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0ltcG9ydEVBUkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5CYXNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0RUFSQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBBcmNoaXZlRUFSVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbXBvcnRfRUFSIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJpbXBvcnRfZWFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJbXBvcnRFQVJBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQotCQlFQVJDb21wb25lbnRJbXBvcnRXaXphcmQgd2l6YXJkID0gbmV3IEVBUkNvbXBvbmVudEltcG9ydFdpemFyZCgpOwotCi0JCUoyRUVVSVBsdWdpbiBwbHVnaW4gPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JCXdpemFyZC5pbml0KHBsdWdpbi5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0KLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvTW9kdWxlc1Byb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvTW9kdWxlc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMjQ0NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL01vZHVsZXNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXIuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc1BhdGhTZWxlY3Rpb247Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvMjIvMjAwMSAyOjI3OjI0IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVzUHJvdmlkZXIgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkvKioKLQkgKiBNb2R1bGVzUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5Ci0JICogcmVnaXN0ZXJlZC4KLQkgKiA8cD4KLQkgKiBMYWJlbCBwcm92aWRlciBsaXN0ZW5lcnMgYXJlIGluZm9ybWVkIGFib3V0IHN0YXRlIGNoYW5nZXMgdGhhdCBhZmZlY3QgdGhlIHJlbmRlcmluZyBvZiB0aGUKLQkgKiB2aWV3ZXIgdGhhdCB1c2VzIHRoaXMgbGFiZWwgcHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSB2aWV3ZXIgd2hlbiBpdCBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2Rpc3Bvc2UKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgd2hlbiBpdHMgaW5wdXQgaXMgc2V0IHRvIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4gVGhlIHJlc3VsdCBpcyBub3QKLQkgKiBtb2RpZmllZCBieSB0aGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dEVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBpbnB1dCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gKChqYXZhLnV0aWwuTGlzdCkgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhlIGltYWdlIGlzIG93bmVkIGJ5IHRoZSBsYWJlbAotCSAqIHByb3ZpZGVyIGFuZCBtdXN0IG5vdCBiZSBkaXNwb3NlZCBkaXJlY3RseS4gSW5zdGVhZCwgZGlzcG9zZSB0aGUgbGFiZWwgcHJvdmlkZXIgd2hlbiBubwotCSAqIGxvbmdlciBuZWVkZWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCBpbWFnZQotCSAqIEByZXR1cm4gdGhlIGltYWdlIHVzZWQgdG8gbGFiZWwgdGhlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXNlIGlzIG5vIGltYWdlIGZvcgotCSAqICAgICAgICAgdGhlIGdpdmVuIG9iamVjdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dAotCSAqIEByZXR1cm4gdGhlIHRleHQgc3RyaW5nIHVzZWQgdG8gbGFiZWwgdGhlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXNlIGlzIG5vIHRleHQKLQkgKiAgICAgICAgIGxhYmVsIGZvciB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKENsYXNzUGF0aFNlbGVjdGlvbikgZWxlbWVudCkuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudAotCSAqIGVsZW1lbnQuCi0JICogPHA+Ci0JICogQSB0eXBpY2FsIHVzZSBmb3IgdGhpcyBtZXRob2QgaXMgcmVnaXN0ZXJpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYXMgYSBsaXN0ZW5lciB0byBjaGFuZ2VzIG9uCi0JICogdGhlIG5ldyBpbnB1dCAodXNpbmcgbW9kZWwtc3BlY2lmaWMgbWVhbnMpLCBhbmQgZGVyZWdpc3RlcmluZyB0aGUgdmlld2VyIGZyb20gdGhlIG9sZCBpbnB1dC4KLQkgKiBJbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgdGhlIGNvbnRlbnQgcHJvdmlkZXIgcHJvcGFnYXRlcyB0aGUgY2hhbmdlcyB0byB0aGUKLQkgKiB2aWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2xkSW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkaWQgbm90IHByZXZpb3VzbHkKLQkgKiAgICAgICAgICAgIGhhdmUgYW4gaW5wdXQKLQkgKiBAcGFyYW0gbmV3SW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkb2VzIG5vdCBoYXZlIGFuIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuCi0JICogZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBhIG5vbi1zdHJ1Y3R1cmFsIHZpZXdlciB1cGRhdGUuIElmIHRoZSBwcm9wZXJ0eQotCSAqIG1lbnRpb25lZCBpbiB0aGUgdXBkYXRlIGRvZXMgbm90IGFmZmVjdCB0aGUgbGFiZWwsIHRoZW4gdGhlIHZpZXdlciBuZWVkIG5vdCB1cGRhdGUgdGhlIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQKLQkgKiAgICAgICAgIHdvdWxkIGJlIHVuYWZmZWN0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdAotCSAqIHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0Fic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjNGM3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0Fic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuRGlzcGxheVV0aWxpdHk7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBNRV9FSkJfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kRWxlbWVudF9FbnRlcnByaXNlQmVhbigpOwotCXByb3RlY3RlZCBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIEpBUl9BU1NFTUJMWV9TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIEVDT1JFX0JFQU5fTkFNRSA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCk7IC8vRU5BTUVEX0VMRU1FTlRfX05BTUUKLQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBtZUNvbXBhcmF0b3I7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSb290ID0gdHJ1ZTsKLQotCXB1YmxpYyBjbGFzcyBFSkJNZXRob2RJdGVtIHsKLQkJcHVibGljIEVPYmplY3QgcmVmT2JqZWN0OwotCQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZWpiOwotCi0JCXB1YmxpYyBFSkJNZXRob2RJdGVtKEVPYmplY3QgYVJlZk9iamVjdCwgRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJCXJlZk9iamVjdCA9IGFSZWZPYmplY3Q7Ci0JCQllamIgPSBhbkVKQjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBib29sZWFuIHJvb3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlpc1Jvb3QgPSByb290OwotCX0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldEVudGVycHJpc2VCZWFuQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIEVKQk5hbWVDb21wYXJhdG9yLnNpbmdsZXRvbigpOwotCX0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCkgewotCQlpZiAobWVDb21wYXJhdG9yID09IG51bGwpCi0JCQltZUNvbXBhcmF0b3IgPSBuZXcgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IoKTsKLQkJcmV0dXJuIG1lQ29tcGFyYXRvcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKQotCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRzKChBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSkgcGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRNZXRob2RFbGVtZW50cyhBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSBlamJJdGVtKSB7Ci0JCUVPYmplY3QgcmVmT2JqZWN0ID0gZWpiSXRlbS5yZWZPYmplY3Q7Ci0JCWlmIChyZWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQlMaXN0IGVsZW1lbnRzID0gZ2V0TWV0aG9kRWxlbWVudHMocmVmT2JqZWN0LCBlamJJdGVtLmVqYik7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IGVsZW1lbnRzLnRvQXJyYXkoKTsKLQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMSkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCUFycmF5cy5zb3J0KHJlc3VsdCwgZ2V0TWV0aG9kRWxlbWVudENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRU9iamVjdCBhUmVmT2JqZWN0LCBFbnRlcnByaXNlQmVhbiBhbkVKQik7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RW50ZXJwcmlzZUJlYW5zKEVPYmplY3QgcGFyZW50RWxlbWVudCwgTGlzdCBzb21lTWV0aG9kRWxlbWVudHMpIHsKLQkJaWYgKHNvbWVNZXRob2RFbGVtZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJU2V0IGVqYnMgPSBuZXcgSGFzaFNldCgpOwotCQlFbnRlcnByaXNlQmVhbiBlamIgPSBudWxsOwotCQlNZXRob2RFbGVtZW50IG1lID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb21lTWV0aG9kRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIHNvbWVNZXRob2RFbGVtZW50cy5nZXQoaSk7Ci0JCQllamIgPSBtZS5nZXRFbnRlcnByaXNlQmVhbigpOwotCQkJaWYgKGVqYiAhPSBudWxsKQotCQkJCWVqYnMuYWRkKGVqYik7Ci0JCX0KLQkJT2JqZWN0W10gcmVzdWx0ID0gZWpicy50b0FycmF5KCk7Ci0JCWlmIChyZXN1bHQubGVuZ3RoICE9IDEpCi0JCQlBcnJheXMuc29ydChyZXN1bHQsIGdldEVudGVycHJpc2VCZWFuQ29tcGFyYXRvcigpKTsKLQkJZWpiID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCWVqYiA9IChFbnRlcnByaXNlQmVhbikgcmVzdWx0W2ldOwotCQkJcmVzdWx0W2ldID0gbmV3IEVKQk1ldGhvZEl0ZW0ocGFyZW50RWxlbWVudCwgZWpiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKEVudGVycHJpc2VCZWFuIGVqYikgewotCQlpZiAoZWpiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVqYi5nZXRFamJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKSB7Ci0JCXJldHVybiAoVHJlZVZpZXdlcikgdmlld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hUcmVlVmlld2VyKE9iamVjdCBvYmopIHsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJRGlzcGxheVV0aWxpdHkuYXN5bmNFeGVjKGNyZWF0ZVJlZnJlc2hUcmVlUnVubmFibGUob2JqKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRyZWVWaWV3ZXIoKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJCURpc3BsYXlVdGlsaXR5LmFzeW5jRXhlYyhjcmVhdGVSZWZyZXNoVHJlZVJ1bm5hYmxlKG51bGwpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVHJlZVZpZXdlcihNZXRob2RFbGVtZW50IG1lKSB7Ci0JCXJlZnJlc2hUcmVlVmlld2VyKG1lLmVDb250YWluZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRyZWVWaWV3ZXIoTGlzdCBhTGlzdCkgewotCQlpZiAoYUxpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlyZWZyZXNoVHJlZVZpZXdlcigoTWV0aG9kRWxlbWVudCkgYUxpc3QuZ2V0KDApKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1RyZWVWaWV3ZXIoZmluYWwgTWV0aG9kRWxlbWVudCBtZSkgewotCQlpZiAodmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURpc3BsYXlVdGlsaXR5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBmaW5kTWV0aG9kSXRlbSgpIHNob3VsZCBiZSBydW4gaW4gYSBEaXNwbGF5IHRocmVhZAotCQkJCUVKQk1ldGhvZEl0ZW0gaXRlbSA9IGZpbmRNZXRob2RJdGVtKG1lKTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJCQlEaXNwbGF5VXRpbGl0eS5hc3luY0V4ZWMoY3JlYXRlQWRkSXRlbVRyZWVSdW5uYWJsZShpdGVtLCBtZSkpOwotCQkJCWVsc2UKLQkJCQkJcmVmcmVzaFRyZWVWaWV3ZXIobWUuZUNvbnRhaW5lcigpKTsKLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVHJlZVZpZXdlcihmaW5hbCBFT2JqZWN0IHBhcmVudCwgZmluYWwgTWV0aG9kRWxlbWVudCBtZSkgewotCQlpZiAodmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURpc3BsYXlVdGlsaXR5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlFbnRlcnByaXNlQmVhbiBlamIgPSBtZS5nZXRFbnRlcnByaXNlQmVhbigpOwotCQkJCUVKQk1ldGhvZEl0ZW0gaXRlbSA9IGZpbmRNZXRob2RJdGVtKGVqYiwgcGFyZW50KTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJCQlyZWZyZXNoVHJlZVZpZXdlcihpdGVtKTsKLQkJCQllbHNlCi0JCQkJCXJlZnJlc2hUcmVlVmlld2VyKChPYmplY3QpIG51bGwpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRUpCTWV0aG9kSXRlbSBmaW5kTWV0aG9kSXRlbShNZXRob2RFbGVtZW50IG1lKSB7Ci0JCXJldHVybiBmaW5kTWV0aG9kSXRlbShtZS5nZXRFbnRlcnByaXNlQmVhbigpLCBtZS5lQ29udGFpbmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBFSkJNZXRob2RJdGVtIGZpbmRNZXRob2RJdGVtKEVudGVycHJpc2VCZWFuIGVqYiwgRU9iamVjdCBwYXJlbnRNZXRob2QpIHsKLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IGdldFRyZWVWaWV3ZXIoKS5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKLQkJcmV0dXJuIGZpbmRNZXRob2RJdGVtKGVqYiwgcGFyZW50TWV0aG9kLCBpdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEVKQk1ldGhvZEl0ZW0gZmluZE1ldGhvZEl0ZW0oRW50ZXJwcmlzZUJlYW4gZWpiLCBFT2JqZWN0IHBhcmVudE1ldGhvZCwgVHJlZUl0ZW1bXSBpdGVtcykgewotCQlUcmVlSXRlbSBpdGVtID0gbnVsbDsKLQkJT2JqZWN0IGRhdGEgPSBudWxsOwotCQlFSkJNZXRob2RJdGVtIG1ldGhvZEl0ZW0gPSBudWxsLCBmb3VuZCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWl0ZW0gPSBpdGVtc1tpXTsKLQkJCWRhdGEgPSBpdGVtLmdldERhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgRUpCTWV0aG9kSXRlbSkgewotCQkJCW1ldGhvZEl0ZW0gPSAoRUpCTWV0aG9kSXRlbSkgZGF0YTsKLQkJCQlpZiAobWV0aG9kSXRlbS5lamIgPT0gZWpiICYmIG1ldGhvZEl0ZW0ucmVmT2JqZWN0ID09IHBhcmVudE1ldGhvZCkKLQkJCQkJcmV0dXJuIG1ldGhvZEl0ZW07Ci0JCQl9Ci0JCQlmb3VuZCA9IGZpbmRNZXRob2RJdGVtKGVqYiwgcGFyZW50TWV0aG9kLCBpdGVtLmdldEl0ZW1zKCkpOwotCQkJaWYgKGZvdW5kICE9IG51bGwpCi0JCQkJcmV0dXJuIGZvdW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyI25vdGlmeUNoYW5nZWQobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpT2JqZWN0LAotCSAqICAgICAgaW50LChFU3RydWN0dXJhbEZlYXR1cmUpIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIGludCkpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpZXIpIHsKLQkJaWYgKG5vdGlmaWVyLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRVNPTFZFKQotCQkJcmV0dXJuOwotCQllbHNlIGlmIChub3RpZmllci5nZXRPbGRWYWx1ZSgpIGluc3RhbmNlb2YgQ01QQXR0cmlidXRlICYmIG5vdGlmaWVyLmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSBpZiAobm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IE1FX0VKQl9TRikgewotCQkJcmVmcmVzaFRyZWVWaWV3ZXIoKE1ldGhvZEVsZW1lbnQpIG5vdGlmaWVyLmdldE5vdGlmaWVyKCkpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKG5vdGlmaWVyLmdldEZlYXR1cmUoKSA9PSBFQ09SRV9CRUFOX05BTUUpIHsKLQkJCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAoZ2V0TWV0aG9kRWxlbWVudHNSZWZlcmVuY2UoKSA9PSBub3RpZmllci5nZXRGZWF0dXJlKCkpIHsKLQkJCWlmIChub3RpZmllci5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKQotCQkJCWFkZFRvVHJlZVZpZXdlcigoTWV0aG9kRWxlbWVudCkgbm90aWZpZXIuZ2V0TmV3VmFsdWUoKSk7Ci0JCQllbHNlIGlmIChub3RpZmllci5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKQotCQkJCXJlbW92ZUZyb21UcmVlVmlld2VyKChFT2JqZWN0KSBub3RpZmllci5nZXROb3RpZmllcigpLCAoTWV0aG9kRWxlbWVudCkgbm90aWZpZXIuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAobm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IEpBUl9BU1NFTUJMWV9TRiAmJiBpc1Jvb3QpIHsKLQkJCXVwZGF0ZVRyZWVJbnB1dChub3RpZmllci5nZXROZXdWYWx1ZSgpKTsKLQkJfSBlbHNlIGlmIChub3RpZmllci5nZXRGZWF0dXJlKCkgPT0gZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKSkKLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmllcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRyZWVJbnB1dChmaW5hbCBPYmplY3QgdGFyZ2V0KSB7Ci0JCURpc3BsYXlVdGlsaXR5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQotCQkJCWdldFRyZWVWaWV3ZXIoKS5zZXRJbnB1dCh0YXJnZXQpOyAvL3Jlc2V0IHRoZSBpbnB1dAotCQkJCWdldFRyZWVWaWV3ZXIoKS5yZWZyZXNoKHRhcmdldCk7Ci0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBjcmVhdGVBZGRJdGVtVHJlZVJ1bm5hYmxlKGZpbmFsIE9iamVjdCBwYXJlbnQsIGZpbmFsIE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldFRyZWVWaWV3ZXIoKS5hZGQocGFyZW50LCBtZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBjcmVhdGVSZWZyZXNoVHJlZVJ1bm5hYmxlKGZpbmFsIE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCQkJZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2godGFyZ2V0KTsKLQkJCQllbHNlCi0JCQkJCWdldFRyZWVWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhNDJlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0JlYW5DbGFzc1Byb3ZpZGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMS8yMDAxIDEyOjI5OjQ5IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuQ2xhc3NQcm92aWRlckhlbHBlciBleHRlbmRzIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgaW1hZ2U7Ci0KLQkvKioKLQkgKiBCZWFuQ2xhc3NQcm92aWRlckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBCZWFuQ2xhc3NQcm92aWRlckhlbHBlcihFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlzdXBlcihhbkVKQik7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTEvMjAwMSAxOjUzOjA5IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiBnZXRFamIoKS5nZXRFamJDbGFzcygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpIHsKLQkJcmV0dXJuICJlamJfbW9kdWxlX292ciI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUpCX0NsYXNzX1VJXyIsIG5ldyBPYmplY3RbXXtjbGFzc05hbWV9KTsgLy8kTk9OLU5MUy0xJCA9ICJFSkIgQ2xhc3MiCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvRUpCVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9FSkJVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NTg3ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9FSkJVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLk1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBFSkJVSU1lc3NhZ2VzIGV4dGVuZHMgTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfTE9BRF9FUlJPUiA9ICIwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9QUk9KRUNUX1dJWl9USVRMRSA9ICIxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9WRVJTSU9OX0xCTCA9ICIyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9QUk9KRUNUX01BSU5fUEdfVElUTEUgPSAiMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUFJPSkVDVF9NQUlOX1BHX0RFU0MgPSAiNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfSU1QT1JUX01BSU5fUEdfREVTQyA9ICI1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9JTVBPUlRfTUFJTl9QR19USVRMRSA9ICI2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9KQVJfRklMRV9MQkwgPSAiNyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUFJPSkVDVF9MQkwgPSAiOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRVhQT1JUX01BSU5fUEdfVElUTEUgPSAiOSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRVhQT1JUX01BSU5fUEdfREVTQyA9ICIxMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ2xpZW50X1RpdGxlID0gIjExIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9DbGllbnRfRGVzYyA9ICIxMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDbGllbnRfSkFSX1VSSSA9ICIxMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQcm9qZWN0X25hbWUgPSAiMTQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUHJvamVjdF9sb2NhdGlvbiA9ICIxNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUHJvamVjdCA9ICIxNiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfQkVBTl9PTkxZID0gIjE3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERlbGV0ZV9CZWFuX0NsYXNzZXNfVUkgPSAiMTgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVsZXRlX0FjY2Vzc19CZWFuID0gIjE5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERlbGV0ZV9EZXBsb3llZF9Db2RlID0gIjIwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNlbGVjdF9BbGxfVUkgPSAiMjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVzZWxlY3RfQWxsX1VJID0gIjIyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRoZV9zZWxlY3RlZF9FbnRlcnByaXNlX0JlID0gIjIzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERlbGV0ZSA9ICIyNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDYW5ub3RfZGVsZXRlX0VudGVycHJpc2VfQiA9ICIyNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDYW5ub3RfZGVsZXRlX2JlYW4gPSAiMjYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVsZXRlX0VudGVycHJpc2VfQmVhbnMgPSAiMjciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVsZXRlX09wdGlvbnNfUXVlcnkgPSAiMjciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBFSkJVSU1lc3NhZ2VzIElOU1RBTkNFID0gbmV3IEVKQlVJTWVzc2FnZXMoKTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIEVKQlVJTWVzc2FnZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIElOU1RBTkNFLmRvR2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBJTlNUQU5DRS5kb0dldFJlc291cmNlU3RyaW5nKGtleSwgYXJncyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuTWVzc2FnZXMjaW5pdGlhbGl6ZUJ1bmRsZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJqMmVlX2VqYl91aSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9FeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9FeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGE3YjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIEVYQ0xVREVfTUVfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0RXhjbHVkZUxpc3RfTWV0aG9kRWxlbWVudHMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgQURfRUxfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgRUNPUkVfQkVBTl9OQU1FID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKTsgLy9FTkFNRURfRUxFTUVOVF9fTkFNRQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBFeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgYm9vbGVhbiByb290KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCByb290KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRXhjbHVkZXNMaXN0Q29udGVudFByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldEVudGVycHJpc2VCZWFucyhFeGNsdWRlTGlzdCBsaXN0KSB7Ci0JCUxpc3QgbWVzID0gbGlzdC5nZXRNZXRob2RFbGVtZW50cygpOwotCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKGxpc3QsIG1lcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0LCBFbnRlcnByaXNlQmVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0IGFSZWZPYmplY3QsIEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCWlmICghKGFSZWZPYmplY3QgaW5zdGFuY2VvZiBFeGNsdWRlTGlzdCkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJRXhjbHVkZUxpc3QgcGFyZW50TGlzdCA9IChFeGNsdWRlTGlzdCkgYVJlZk9iamVjdDsKLQkJaWYgKHBhcmVudExpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gcGFyZW50TGlzdC5nZXRNZXRob2RFbGVtZW50cyhhbkVKQik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlzdXBlci5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOwotCQlFeGNsdWRlTGlzdCBsaXN0ID0gbnVsbDsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVKQkphcikgewotCQkJRUpCSmFyIGphciA9IChFSkJKYXIpIGlucHV0RWxlbWVudDsKLQkJCWlmIChqYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgIT0gbnVsbCkKLQkJCQlsaXN0ID0gamFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldEV4Y2x1ZGVMaXN0KCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsKQotCQkJCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMobGlzdCk7Ci0JCX0KLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFzc2VtYmx5RGVzY3JpcHRvcikgewotCQkJbGlzdCA9ICgoQXNzZW1ibHlEZXNjcmlwdG9yKSBpbnB1dEVsZW1lbnQpLmdldEV4Y2x1ZGVMaXN0KCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsKQotCQkJCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMobGlzdCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIudWkucHJvdmlkZXJzLkFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRXhjbHVkZUxpc3QpCi0JCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKChFeGNsdWRlTGlzdCkgcGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5wcm92aWRlcnMuQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KQotCQkJcmV0dXJuICEoKEV4Y2x1ZGVMaXN0KSBlbGVtZW50KS5nZXRNZXRob2RFbGVtZW50cygpLmlzRW1wdHkoKTsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWVyKSB7Ci0JCWlmICgobm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IEVYQ0xVREVfTUVfU0YgJiYgbm90aWZpZXIuZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KSB8fCBub3RpZmllci5nZXRGZWF0dXJlKCkgPT0gRUNPUkVfQkVBTl9OQU1FKSB7Ci0JCQlpZiAobm90aWZpZXIuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFU09MVkUpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGlzUm9vdCkKLQkJCQlyZWZyZXNoVHJlZVZpZXdlcigpOwotCQkJZWxzZQotCQkJCXJlZnJlc2hUcmVlVmlld2VyKG5vdGlmaWVyLmdldE5vdGlmaWVyKCkpOwotCQl9Ci0JCWlmIChub3RpZmllci5nZXRPbGRWYWx1ZSgpIGluc3RhbmNlb2YgQ01QQXR0cmlidXRlICYmIG5vdGlmaWVyLmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vdGlmaWVyLmdldEZlYXR1cmUoKSA9PSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpIHx8IG5vdGlmaWVyLmdldEZlYXR1cmUoKSA9PSBnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpKQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIEVYQ0xVREVfTUVfU0Y7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIudWkucHJvdmlkZXJzLkFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIEFEX0VMX1NGOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVKQkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRUpCSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTkzOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRUpCSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGZvciBFSkIgZ3JvdXBzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcm91cGVkRUpCSXRlbVByb3ZpZGVyIGV4dGVuZHMgSjJFRUl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgR3JvdXBlZEVKQkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgaW1hZ2UsIHBhcmVudCwgY2hpbGRyZW4pOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTg2Y2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNhY2hpbiBQIFBhdGVsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlciBleHRlbmRzIEVKQkphckl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyIHNlc3Npb25Qcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBHcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyIGVudGl0eVByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIEdyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyIG1lc3NhZ2VQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgc2Vzc2lvblRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBlbnRpdHlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgbWVzc2FnZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT04gPSBFSkJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJHcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzAiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSBFSkJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJHcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzEiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gRUpCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8yIik7IC8vJE5PTi1OTFMtMSQKLQotCS8vCU5vcm1hbGx5IHRoZXJlIGlzIG9uZSBpbnN0YW5jZSBvZiBhbiBpdGVtIHByb3ZpZGVyIGZvciBhbGwgaW5zdGFuY2VzIG9mIHRoZSBvYmplY2N0Ci0JLy8JaW4gdGhlIHRyZWUuIFRoZSBpdGVtIHByb3ZpZGVyIHdvdWxkIGJlIHN0YXRlbGVzcy4gSG93ZXZlciwgYmVjYXVzZSB3ZSBhcmUgZG9pbmcgdHJpY2tzCi0JLy8JaGVyZSwgd2UgYXJlIGtlZXBpbmcgdHJhY2sgb2YgYWxsIGl0ZW1zIHRoaXMgcHJvdmlkZXIgbWFuYWdlcy4gVGhlIGtleSBpbiB0aGUgbWFwIGlzIHRoZQotCS8vCW9iamVjdCAoRUpCSmFyKSwgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgY2hpbGRyZW4gbm9kZXMgdGhhdCB3ZSBpbnNlcnRlZAotCi0JcHJvdGVjdGVkIE1hcCBjaGlsZHJlbiA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBib29sZWFuIHNob3dBc3NlbWJseURlc2NyaXB0b3I7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGlzcG9zaW5nOwotCi0JcHVibGljIEdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIGJvb2xlYW4gc2hvd0Fzc2VtYmx5RGVzY3JpcHRvcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuc2hvd0Fzc2VtYmx5RGVzY3JpcHRvciA9IHNob3dBc3NlbWJseURlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IGluaXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoc2hvd0Fzc2VtYmx5RGVzY3JpcHRvcikgewotCQkJaWYgKCgoRUpCSmFyKSBvYmplY3QpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZCgoKEVKQkphcikgb2JqZWN0KS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBpbml0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcikgb2JqZWN0OwotCQlMaXN0IGFsbFJvb3RCZWFucyA9IGdldEFsbFJvb3RCZWFucyhlamJKYXIpOwotCi0JCWJvb2xlYW4gaXMyMEphciA9IGlzMjBKYXIoZWpiSmFyKTsKLQotCQlMaXN0IGxvY2FsQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KDUpOwotCi0JCUxpc3QgZW50aXR5QmVhbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgc2Vzc2lvbkJlYW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG1lc3NhZ2VCZWFucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQljYXRhZ29yaXplQmVhbnMoYWxsUm9vdEJlYW5zLCBlbnRpdHlCZWFucywgc2Vzc2lvbkJlYW5zLCBtZXNzYWdlQmVhbnMpOwotCi0JCS8vRU5BQkxFIEZPUjogTk9UIFRPIFNIT1cgRU1QVFkgR1JPVVBTCi0JCS8vaWYgKHNlc3Npb25CZWFucy5zaXplKCkgPiAwKSB7Ci0JCWlmIChzZXNzaW9uVGFibGUuZ2V0KGVqYkphcikgPT0gbnVsbCkgewotCQkJLy9jcmVhdGUgbmV3IGl0ZW0gcHJvdmlkZXIgaW5zdGFuY2UKLQkJCXNlc3Npb25Qcm92aWRlciA9IG5ldyBHcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbnVsbCwgZ2V0SW1hZ2UoU0VTU0lPTiksIG9iamVjdCwgc2Vzc2lvbkJlYW5zKTsKLQkJCXNlc3Npb25UYWJsZS5wdXQoZWpiSmFyLCBzZXNzaW9uUHJvdmlkZXIpOwotCQkJbG9jYWxDaGlsZHJlbi5hZGQoc2Vzc2lvblByb3ZpZGVyKTsKLQkJfSBlbHNlIHsKLQkJCS8vdXNlIGV4aXN0aW5nIGluc3RhbmNlIGZyb20gdGFibGUKLQkJCWxvY2FsQ2hpbGRyZW4uYWRkKHNlc3Npb25UYWJsZS5nZXQoZWpiSmFyKSk7Ci0JCX0KLQkJLy99Ci0KLQkJLy9FTkFCTEUgRk9SOiBOT1QgVE8gU0hPVyBFTVBUWSBHUk9VUFMKLQkJLy9pZiAoZW50aXR5QmVhbnMuc2l6ZSgpID4gMCkgewotCQlpZiAoZW50aXR5VGFibGUuZ2V0KGVqYkphcikgPT0gbnVsbCkgewotCQkJLy9jcmVhdGUgbmV3IGl0ZW0gcHJvdmlkZXIgaW5zdGFuY2UKLQkJCWVudGl0eVByb3ZpZGVyID0gbmV3IEdyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG51bGwsIGdldEltYWdlKEVOVElUWSksIG9iamVjdCwgZW50aXR5QmVhbnMpOwotCQkJZW50aXR5VGFibGUucHV0KGVqYkphciwgZW50aXR5UHJvdmlkZXIpOwotCQkJbG9jYWxDaGlsZHJlbi5hZGQoZW50aXR5UHJvdmlkZXIpOwotCQl9IGVsc2UgewotCQkJLy91c2UgZXhpc3RpbmcgaW5zdGFuY2UgZnJvbSB0YWJsZQotCQkJbG9jYWxDaGlsZHJlbi5hZGQoZW50aXR5VGFibGUuZ2V0KGVqYkphcikpOwotCQl9Ci0JCS8vfQotCi0JCS8vRU5BQkxFIEZPUjogTk9UIFRPIFNIT1cgRU1QVFkgR1JPVVBTCi0JCS8vaWYgKGlzMjBKYXIgJiYgbWVzc2FnZUJlYW5zLnNpemUoKSA+IDApIHsKLQkJaWYgKGlzMjBKYXIpIHsKLQkJCWlmIChtZXNzYWdlVGFibGUuZ2V0KGVqYkphcikgPT0gbnVsbCkgewotCQkJCS8vY3JlYXRlIG5ldyBpdGVtIHByb3ZpZGVyIGluc3RhbmNlCi0JCQkJbWVzc2FnZVByb3ZpZGVyID0gbmV3IEdyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBudWxsLCBnZXRJbWFnZShNRVNTQUdFKSwgb2JqZWN0LCBtZXNzYWdlQmVhbnMpOwotCQkJCW1lc3NhZ2VUYWJsZS5wdXQoZWpiSmFyLCBtZXNzYWdlUHJvdmlkZXIpOwotCQkJCWxvY2FsQ2hpbGRyZW4uYWRkKG1lc3NhZ2VQcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCS8vdXNlIGV4aXN0aW5nIGluc3RhbmNlIGZyb20gdGFibGUKLQkJCQlsb2NhbENoaWxkcmVuLmFkZChtZXNzYWdlVGFibGUuZ2V0KGVqYkphcikpOwotCQkJfQotCQl9Ci0JCS8vfQotCi0JCWNoaWxkcmVuLnB1dChvYmplY3QsIGxvY2FsQ2hpbGRyZW4pOwotCi0JCXJldHVybiBsb2NhbENoaWxkcmVuOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRBbGxSb290QmVhbnMoRUpCSmFyIGVqYkphcikgewotCQlyZXR1cm4gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNhdGFnb3JpemVCZWFucyhMaXN0IGFsbFJvb3RCZWFucywgTGlzdCBlbnRpdHlCZWFucywgTGlzdCBzZXNzaW9uQmVhbnMsIExpc3QgbWVzc2FnZUJlYW5zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUm9vdEJlYW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoKChFbnRlcnByaXNlQmVhbikgYWxsUm9vdEJlYW5zLmdldChpKSkuaXNTZXNzaW9uKCkpIHsKLQkJCQlzZXNzaW9uQmVhbnMuYWRkKGFsbFJvb3RCZWFucy5nZXQoaSkpOwotCQkJfSBlbHNlIGlmICgoKEVudGVycHJpc2VCZWFuKSBhbGxSb290QmVhbnMuZ2V0KGkpKS5pc0VudGl0eSgpKSB7Ci0JCQkJZW50aXR5QmVhbnMuYWRkKGFsbFJvb3RCZWFucy5nZXQoaSkpOwotCQkJfSBlbHNlIGlmICgoKEVudGVycHJpc2VCZWFuKSBhbGxSb290QmVhbnMuZ2V0KGkpKS5pc01lc3NhZ2VEcml2ZW4oKSkgewotCQkJCW1lc3NhZ2VCZWFucy5hZGQoYWxsUm9vdEJlYW5zLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyIGdldFNlc3Npb25Ob2RlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIChHcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlcikgc2Vzc2lvblRhYmxlLmdldChvYmplY3QpOwotCX0KLQotCXN0YXRpYyBwcm90ZWN0ZWQgR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlciBnZXRFbnRpdHlOb2RlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIChHcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyKSBlbnRpdHlUYWJsZS5nZXQob2JqZWN0KTsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIEdyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyIGdldE1lc3NhZ2VOb2RlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIChHcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlcikgbWVzc2FnZVRhYmxlLmdldChvYmplY3QpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUuZXF1YWxzKFNFU1NJT04pKQotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInNlc3Npb25CZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHR5cGUuZXF1YWxzKE1FU1NBR0UpKQotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIm1lc3NhZ2VfYmVhbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmICh0eXBlLmVxdWFscyhFTlRJVFkpKQotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImVudGl0eWJlYW5fb2JqIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzMjBKYXIoRUpCSmFyIGVqYkphcikgewotCQlzd2l0Y2ggKGVqYkphci5nZXRWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8wX0lEIDoKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCA6Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEIDoKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVklOR19BREFQVEVSICYmIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpID09IHRoaXMgJiYgIWlzRGlzcG9zaW5nKSB7Ci0JCQlyZW1vdmVUYXJnZXQobm90aWZpY2F0aW9uKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCkpIHsKLQkJCUoyRUVJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBiZWFuc0NoYW5nZWQoKEVKQkphcikgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSwgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKSk7Ci0KLQkJCS8vRUpCJ3MgZ3JvdXAgaGFzIG5vdCBiZWVuIGFkZGVkIHlldCwgbmVlZCB0byBhZGQgZ3JvdXAgdG8gdHJlZSBiZWZvcmUgRUpCIGNhbiBiZSBhZGRlZAotCQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLkFERCwgbnVsbCwgZ2V0RUpCSXRlbVByb3ZpZGVyKChFbnRlcnByaXNlQmVhbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpLCAxKTsKLQkJCQlOb3RpZmljYXRpb25XcmFwcGVyIG5vdGlmaWNhdGlvbldyYXBwZXIgPSBuZXcgTm90aWZpY2F0aW9uV3JhcHBlcihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbXNnKTsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25XcmFwcGVyKTsKLQkJCQlwcm92aWRlciA9IGJlYW5zQ2hhbmdlZCgoRUpCSmFyKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpLCBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSwgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXRQb3NpdGlvbigpKTsKLQkJCX0KLQotCQkJLy9GaXJlIG5vdGlmaWNhdGlvbiBmb3IgRUpCIGFkZCBvciByZW1vdmUKLQkJCU5vdGlmaWNhdGlvbldyYXBwZXIgbm90aWZpY2F0aW9uV3JhcHBlciA9IG5ldyBOb3RpZmljYXRpb25XcmFwcGVyKHByb3ZpZGVyLCBub3RpZmljYXRpb24pOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uV3JhcHBlcik7Ci0KLQkJCS8vRU5BQkxFIEZPUjogTk9UIFRPIFNIT1cgRU1QVFkgR1JPVVBTCi0JCQkvL0lmIEdyb3VwIGlzIGVtcHR5IHJlbW92ZSB0aGUgZ3JvdXAKLQkJCS8qCi0JCQkgKiBpZiAocHJvdmlkZXIgIT0gbnVsbCAmJiBwcm92aWRlci5nZXRDaGlsZHJlbigpLnNpemUoKSA9PSAwKSB7IE5vdGlmaWNhdGlvbiBtc2cgPSBuZXcKLQkJCSAqIE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlJFTU9WRSwgcHJvdmlkZXIsIG51bGwsIDEpOyBub3RpZmljYXRpb25XcmFwcGVyID0gbmV3Ci0JCQkgKiBOb3RpZmljYXRpb25XcmFwcGVyKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBtc2cpOwotCQkJICogZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uV3JhcHBlcik7Ci0JCQkgKiAKLQkJCSAqIC8vR3JvdXAgaXMgcmVtb3ZlZCBzbyBmbHVzaCBvdXQgdGFibGUgZW50cnkgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YKLQkJCSAqIEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyKSB7IHNlc3Npb25UYWJsZS5yZW1vdmUobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJICogcHJvdmlkZXIgPSBudWxsOyB9IGVsc2UgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlcikgewotCQkJICogZW50aXR5VGFibGUucmVtb3ZlKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsgcHJvdmlkZXIgPSBudWxsOyB9IGVsc2UgaWYgKHByb3ZpZGVyCi0JCQkgKiBpbnN0YW5jZW9mIEdyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyKSB7Ci0JCQkgKiBtZXNzYWdlVGFibGUucmVtb3ZlKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsgcHJvdmlkZXIgPSBudWxsOyB9Ci0JCQkgKiAKLQkJCSAqIC8vSWYgYWxsIGdyb3VwcyBhcmUgcmVtb3ZlZCByZW1vdmUgdGhlIGV4dGVuZGVkIGNoaWxkcmVuIExpc3QgYWxsQ2hpbGRyZW4gPSBuZXcKLQkJCSAqIEFycmF5TGlzdCh0aGlzLmdldENoaWxkcmVuKChFSkJKYXIpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSk7Ci0JCQkgKiBpZihzZXNzaW9uVGFibGUuZ2V0KG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBudWxsICYmCi0JCQkgKiBlbnRpdHlUYWJsZS5nZXQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IG51bGwgJiYKLQkJCSAqIG1lc3NhZ2VUYWJsZS5nZXQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IG51bGwpIHsgZm9yKGludCBpID0gMDsgaSA8Ci0JCQkgKiBhbGxDaGlsZHJlbi5zaXplKCk7IGkrKykgeyBOb3RpZmljYXRpb24gbWVzc2FnZSA9IG5ldwotCQkJICogTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uUkVNT1ZFLCBhbGxDaGlsZHJlbi5nZXQoaSksIG51bGwsIDEpOwotCQkJICogbm90aWZpY2F0aW9uV3JhcHBlciA9IG5ldyBOb3RpZmljYXRpb25XcmFwcGVyKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBtZXNzYWdlKTsKLQkJCSAqIGZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbldyYXBwZXIpOyB9IHRoaXMuZ2V0Q2hpbGRyZW4oKEVKQkphcikKLQkJCSAqIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKS5jbGVhcigpOyB9IH0KLQkJCSAqLwotCQl9IGVsc2UgewotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEoyRUVJdGVtUHJvdmlkZXIgYmVhbnNDaGFuZ2VkKEVKQkphciBlamJKYXIsIGludCBldmVudFR5cGUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCUoyRUVJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRJdGVtUHJvdmlkZXIoZWpiSmFyLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGdyYW5kQ2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbigpOwotCi0JCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6IHsKLQkJCQkJaWYgKCFncmFuZENoaWxkcmVuLmNvbnRhaW5zKG5ld1ZhbHVlKSkKLQkJCQkJCWdyYW5kQ2hpbGRyZW4uYWRkKG5ld1ZhbHVlKTsKLQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOiB7Ci0JCQkJCWdyYW5kQ2hpbGRyZW4uYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOiB7Ci0JCQkJCWdyYW5kQ2hpbGRyZW4ucmVtb3ZlKG9sZFZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDogewotCQkJCQlncmFuZENoaWxkcmVuLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgb2xkVmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvL0dyb3VwZWRQcm92aWRlciBmb3IgbmV3IGJlYW4gZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBvbmUuCi0JCQlMaXN0IGFsbFJvb3RCZWFucyA9IGdldEFsbFJvb3RCZWFucyhlamJKYXIpOwotCi0JCQlMaXN0IGVudGl0eUJlYW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCBzZXNzaW9uQmVhbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IG1lc3NhZ2VCZWFucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJY2F0YWdvcml6ZUJlYW5zKGFsbFJvb3RCZWFucywgZW50aXR5QmVhbnMsIHNlc3Npb25CZWFucywgbWVzc2FnZUJlYW5zKTsKLQotCQkJaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU2Vzc2lvbikgewotCQkJCXNlc3Npb25Qcm92aWRlciA9IG5ldyBHcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbnVsbCwgZ2V0SW1hZ2UoU0VTU0lPTiksIGVqYkphciwgc2Vzc2lvbkJlYW5zKTsKLQkJCQlzZXNzaW9uVGFibGUucHV0KGVqYkphciwgc2Vzc2lvblByb3ZpZGVyKTsKLQkJCX0gZWxzZSBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQllbnRpdHlQcm92aWRlciA9IG5ldyBHcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBudWxsLCBnZXRJbWFnZShFTlRJVFkpLCBlamJKYXIsIGVudGl0eUJlYW5zKTsKLQkJCQllbnRpdHlUYWJsZS5wdXQoZWpiSmFyLCBlbnRpdHlQcm92aWRlcik7Ci0JCQl9IGVsc2UgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbikgewotCQkJCW1lc3NhZ2VQcm92aWRlciA9IG5ldyBHcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbnVsbCwgZ2V0SW1hZ2UoTUVTU0FHRSksIGVqYkphciwgbWVzc2FnZUJlYW5zKTsKLQkJCQltZXNzYWdlVGFibGUucHV0KGVqYkphciwgbWVzc2FnZVByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBKMkVFSXRlbVByb3ZpZGVyIGdldEVKQkphckl0ZW1Qcm92aWRlcihFSkJKYXIgZWpiSmFyLCBPYmplY3QgYmVhbikgewotCQlKMkVFSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJaWYgKGVqYkphciAhPSBudWxsICYmIGJlYW4gIT0gbnVsbCkgewotCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBTZXNzaW9uKSB7Ci0JCQkJcHJvdmlkZXIgPSBnZXRTZXNzaW9uTm9kZShlamJKYXIpOwotCQkJfSBlbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcHJvdmlkZXIgPSBnZXRFbnRpdHlOb2RlKGVqYkphcik7Ci0JCQl9IGVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuKSB7Ci0JCQkJcHJvdmlkZXIgPSBnZXRNZXNzYWdlTm9kZShlamJKYXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIEoyRUVJdGVtUHJvdmlkZXIgZ2V0RUpCSXRlbVByb3ZpZGVyKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gIT0gbnVsbCkgewotCQkJRUpCSmFyIGVqYkphciA9IGJlYW4uZ2V0RWpiSmFyKCk7Ci0JCQlyZXR1cm4gZ2V0RUpCSmFySXRlbVByb3ZpZGVyKGVqYkphciwgYmVhbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEoyRUVJdGVtUHJvdmlkZXIgZ2V0SXRlbVByb3ZpZGVyKEVKQkphciBlamJKYXIsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChuZXdWYWx1ZSAhPSBudWxsKQotCQkJcmV0dXJuIGdldEVKQkphckl0ZW1Qcm92aWRlcihlamJKYXIsIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAob2xkVmFsdWUgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRFSkJKYXJJdGVtUHJvdmlkZXIoZWpiSmFyLCBvbGRWYWx1ZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jvb3RCZWFuKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJTGlzdCBhbGxSb290QmVhbnMgPSBnZXRBbGxSb290QmVhbnMoYmVhbi5nZXRFamJKYXIoKSk7Ci0JCWlmIChhbGxSb290QmVhbnMgIT0gbnVsbCAmJiBhbGxSb290QmVhbnMuY29udGFpbnMoYmVhbikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLwlVdGlsaXR5IG1ldGhvZCBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIC0gaWYgRUpCSmFyIHJlbW92ZWQsIHJlbW92ZQotCS8vCWFsbCBlbnRpcmVzIGluIHRhYmxlIGZvciBFSkJKYXIKLQlzdGF0aWMgcHVibGljIHZvaWQgZmx1c2hPdXRUYWJsZUVudHJpZXNGb3JFSkJKYXIoRUpCSmFyIGVqYkphcikgewotCQlzZXNzaW9uVGFibGUucmVtb3ZlKGVqYkphcik7Ci0JCWVudGl0eVRhYmxlLnJlbW92ZShlamJKYXIpOwotCQltZXNzYWdlVGFibGUucmVtb3ZlKGVqYkphcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi5wcm92aWRlci5FSkJKYXJJdGVtUHJvdmlkZXIjcmVtb3ZlVGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUYXJnZXQoTm90aWZpY2F0aW9uIG5vdCkgewotCQlpZiAobm90LmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBFSkJKYXIpCi0JCQlmbHVzaE91dFRhYmxlRW50cmllc0ZvckVKQkphcigoRUpCSmFyKSBub3QuZ2V0Tm90aWZpZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlpc0Rpc3Bvc2luZyA9IHRydWU7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpc0Rpc3Bvc2luZyA9IGZhbHNlOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmI0MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNhY2hpbiBQYXRlbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcm91cGVkRUpCSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFbnRpdHlfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBHcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEVOVElUWTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzk3N2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotCi0KLS8qKgotICogQGF1dGhvciBTYWNoaW4gUGF0ZWwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyb3VwZWRFSkJJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9CRUFOUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJNZXNzYWdlX0RyaXZlbl9CZWFuc19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEdyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIE1FU1NBR0VfQkVBTlM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjMjgxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNhY2hpbiBQYXRlbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JvdXBlZEVKQkl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0JFQU5TID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlNlc3Npb25fQmVhbnNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBHcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgaW1hZ2UsIHBhcmVudCwgY2hpbGRyZW4pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBTRVNTSU9OX0JFQU5TOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0hvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Ib21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzN2FiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0hvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSAxMToyMzozMCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBpbWFnZTsKLQotCS8qKgotCSAqIEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJc3VwZXIoYW5FSkIpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgMTo1Mzo0OSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gZ2V0RWpiKCkuZ2V0SG9tZUludGVyZmFjZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpIHsKLQkJcmV0dXJuICJob21lX2ludGVyZmFjZV9vdmVybGF5X29iaiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSG9tZV9JbnRlcmZhY2VfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIkhvbWUgSW50ZXJmYWNlIgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNWYxM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFQ29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIwLzIwMDEgNjo1ODo1MSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyIHsKLQkvKioKLQkgKiBKMkVFQ29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIoRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlci5hZGRDaGlsZHJlbigoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgb2JqZWN0LCByZXN1bHQpOwotCQlyZXN1bHQuYWRkQWxsKCgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgb2JqZWN0KS5nZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoSjJFRVJlZmVyZW5jZVByb3ZpZGVySGVscGVyLmdldFJlZmVyZW5jZXMoKEVudGVycHJpc2VCZWFuKSBvYmplY3QpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUVqYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjE4MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSA3OjIwOjA3IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCS8qKgotCSAqIEoyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHl9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlBZGFwdGVyKCkgewotCQlpZiAoY29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyID0gbmV3IEoyRUVDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi5FSkJKYXJ9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkphckFkYXB0ZXIoKSB7Ci0JCWlmIChlSkJKYXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZUpCSmFySXRlbVByb3ZpZGVyID0gbmV3IEdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXIodGhpcywgdHJ1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gZUpCSmFySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIuRW50aXR5fS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbnRpdHlBZGFwdGVyKCkgewotCQlpZiAoZW50aXR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVudGl0eUl0ZW1Qcm92aWRlciA9IG5ldyBKMkVFRW50aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVudGl0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLlNlc3Npb259LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlc3Npb25BZGFwdGVyKCkgewotCQlpZiAoc2Vzc2lvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXNzaW9uSXRlbVByb3ZpZGVyID0gbmV3IEoyRUVTZXNzaW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlc3Npb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURyaXZlbkFkYXB0ZXIoKSB7Ci0JCWlmIChtZXNzYWdlRHJpdmVuSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIgPSBuZXcgSjJFRU1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUVudGl0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzN2Q0ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIwLzIwMDEgMTE6MTA6MDYgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEoyRUVFbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBFbnRpdHlJdGVtUHJvdmlkZXIgewotCS8qKgotCSAqIEoyRUVFbnRpdHlJdGVtUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEoyRUVFbnRpdHlJdGVtUHJvdmlkZXIob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW5TdXBlcihvYmplY3QpKTsKLQkJSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyLmFkZENoaWxkcmVuKChFbnRpdHkpIG9iamVjdCwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZmM0YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVFZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5PdmVybGF5SWNvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCXByaXZhdGUgRW50ZXJwcmlzZUJlYW4gZWpiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgSVJFU09VUkNFX0NMQVNTID0gSVJlc291cmNlLmNsYXNzOwotCi0JLyoqCi0JICogSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcihFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlzdXBlcigpOwotCQlzZXRFamIoYW5FSkIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDaGlsZHJlbihFbnRpdHkgZWpiLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCWFkZENoaWxkcmVuKChFbnRlcnByaXNlQmVhbikgZWpiLCBjaGlsZHJlbik7Ci0JCWlmIChlamIuZ2V0UHJpbWFyeUtleSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQobmV3IFByaW1hcnlLZXlDbGFzc1Byb3ZpZGVySGVscGVyKGVqYikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDaGlsZHJlbihFbnRlcnByaXNlQmVhbiBlamIsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQotCQlpZiAoZWpiLmdldEhvbWVJbnRlcmZhY2UoKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKG5ldyBIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoZWpiKSk7Ci0JCWlmIChlamIuZ2V0UmVtb3RlSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChuZXcgUmVtb3RlSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoZWpiKSk7Ci0JCWlmIChlamIuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChuZXcgTG9jYWxIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoZWpiKSk7Ci0JCWlmIChlamIuZ2V0TG9jYWxJbnRlcmZhY2UoKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKG5ldyBMb2NhbEludGVyZmFjZVByb3ZpZGVySGVscGVyKGVqYikpOwotCQlpZiAoZWpiLmdldEVqYkNsYXNzKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIoZWpiKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGNyZWF0ZUltYWdlKCkgewotCQlJbWFnZURlc2NyaXB0b3IgYmFzZSA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJqY3Vfb2JqIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoYmFzZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUltYWdlRGVzY3JpcHRvciBvdmVybGF5ID0gZ2V0T3ZlcmxheURlc2NyaXB0b3IoKTsKLQkJaWYgKG92ZXJsYXkgPT0gbnVsbCkKLQkJCXJldHVybiBiYXNlLmNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBuZXcgT3ZlcmxheUljb24oYmFzZSwgbmV3IEltYWdlRGVzY3JpcHRvcltdW117e292ZXJsYXl9fSkuY3JlYXRlSW1hZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgMTo0NzoyNCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4gZ2V0RWpiKCkgewotCQlyZXR1cm4gZWpiOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMC8yMDAxIDEwOjMwOjU0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gSmF2YUNsYXNzCi0JICovCi0JcHVibGljIGFic3RyYWN0IEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKLQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0T3ZlcmxheURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihnZXRPdmVybGF5S2V5KCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpOwotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0SmF2YUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzTGluZU1lc3NhZ2UoKSB7Ci0JCWlmIChnZXRKYXZhQ2xhc3MoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFR5cGVTdHJpbmcoZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAoZ2V0SmF2YUNsYXNzKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCk7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKTsKLQotCXB1YmxpYyB2b2lkIG9wZW5JbkVkaXRvcigpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRKYXZhQ2xhc3MoKSk7Ci0JCXRyeSB7Ci0JCQlKMkVFRWRpdG9yVXRpbGl0eS5vcGVuSW5FZGl0b3IoZ2V0SmF2YUNsYXNzKCksIHByb2plY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gY2FudE9wZW4pIHsKLQkJCS8vSWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgMTo0NzoyNCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RWpiCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamIob3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuIG5ld0VqYikgewotCQllamIgPSBuZXdFamI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQWRhcHRhYmxlI0Vjb3JlVXRpbC5nZXRBZGFwdGVyKGVBZGFwdGVycygpLENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyID09IElSRVNPVVJDRV9DTEFTUykKLQkJCXJldHVybiBKMkVFRWRpdG9yVXRpbGl0eS5nZXRGaWxlKGdldEphdmFDbGFzcygpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE1NTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRU1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRU1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXNzYWdlRHJpdmVuSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBKMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlblN1cGVyKG9iamVjdCkpOwotCQlKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIuYWRkQ2hpbGRyZW4oKE1lc3NhZ2VEcml2ZW4pIG9iamVjdCwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFUmVmZXJlbmNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRVJlZmVyZW5jZVByb3ZpZGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Yjg5NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFUmVmZXJlbmNlUHJvdmlkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDYsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZWZlcmVuY2VQcm92aWRlckhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0UmVmZXJlbmNlcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWJlYW4uZ2V0RWpiUmVmcygpLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwoYmVhbi5nZXRFamJSZWZzKCkpOwotCQlpZiAoIWJlYW4uZ2V0RWpiTG9jYWxSZWZzKCkuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldEVqYkxvY2FsUmVmcygpKTsKLQkJaWYgKCFiZWFuLmdldFJlc291cmNlUmVmcygpLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwoYmVhbi5nZXRSZXNvdXJjZVJlZnMoKSk7Ci0JCWlmICghYmVhbi5nZXRTZWN1cml0eVJvbGVSZWZzKCkuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldFNlY3VyaXR5Um9sZVJlZnMoKSk7Ci0JCWlmICghYmVhbi5nZXRSZXNvdXJjZUVudlJlZnMoKS5pc0VtcHR5KCkpCi0JCQlyZXN1bHQuYWRkQWxsKGJlYW4uZ2V0UmVzb3VyY2VFbnZSZWZzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRVNlc3Npb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRVNlc3Npb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0ZDI3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVTZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMC8yMDAxIDExOjEwOjQ4IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFU2Vzc2lvbkl0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5TZXNzaW9uSXRlbVByb3ZpZGVyIHsKLQkvKioKLQkgKiBKMkVFU2Vzc2lvbkl0ZW1Qcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSjJFRVNlc3Npb25JdGVtUHJvdmlkZXIob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW5TdXBlcihvYmplY3QpKTsKLQkJYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKChTZXNzaW9uKSBvYmplY3QsIHJlc3VsdCk7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlci5hZGRDaGlsZHJlbigoU2Vzc2lvbikgb2JqZWN0LCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHJlc3VsdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU2Vzc2lvbiBzZXNzaW9uLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCWlmIChzZXNzaW9uLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQgJiYgc2Vzc2lvbi5nZXRTZXJ2aWNlRW5kcG9pbnQoKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKG5ldyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm92aWRlckhlbHBlcihzZXNzaW9uKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlYTUxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0xvY2FsSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBMb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlciBleHRlbmRzIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBpbWFnZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBMb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci4KLQkgKiAKLQkgKiBAcGFyYW0gYW5FSkIKLQkgKi8KLQlwdWJsaWMgTG9jYWxIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJc3VwZXIoYW5FSkIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyI2dldEphdmFDbGFzcygpCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiBnZXRFamIoKS5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIjZ2V0T3ZlcmxheUtleSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVybGF5S2V5KCkgewotCQlyZXR1cm4gImxvY2FsX2hvbWVfaW50ZXJmYWNlX292ZXJsYXlfb2JqIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyI2dldFR5cGVTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTG9jYWxfSG9tZV9JbnRlcmZhY2VfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIkxvY2FsIEhvbWUgSW50ZXJmYWNlIjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0xvY2FsSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTlhZjJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi1wdWJsaWMgY2xhc3MgTG9jYWxJbnRlcmZhY2VQcm92aWRlckhlbHBlciBleHRlbmRzIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBpbWFnZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBMb2NhbEludGVyZmFjZVByb3ZpZGVySGVscGVyLgotCSAqIAotCSAqIEBwYXJhbSBhbkVKQgotCSAqLwotCXB1YmxpYyBMb2NhbEludGVyZmFjZVByb3ZpZGVySGVscGVyKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXN1cGVyKGFuRUpCKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIjZ2V0SmF2YUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIGdldEVqYigpLmdldExvY2FsSW50ZXJmYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIjZ2V0T3ZlcmxheUtleSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVybGF5S2V5KCkgewotCQlyZXR1cm4gImxvY2FsX2ludGVyZmFjZV9vdmVybGF5X29iaiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyI2dldFR5cGVTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTG9jYWxfSW50ZXJmYWNlX1VJXyIsIG5ldyBPYmplY3RbXXtjbGFzc05hbWV9KTsgLy8kTk9OLU5MUy0xJCA9ICJMb2NhbCBJbnRlcmZhY2UiCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDZmZGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBQRVJNSVNTSU9OX01FU19TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZEVsZW1lbnRzKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIFBFUk1JU1NJT05fTUVTX1VOQ0hFQ0tFRF9TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBQRVJNSVNTSU9OX01FU19ST0xFU19TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRNZXRob2RQZXJtaXNzaW9uX1JvbGVzKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIEFEX01QX1NGID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBNZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgYm9vbGVhbiByb290KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCByb290KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb24pCi0JCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKChNZXRob2RQZXJtaXNzaW9uKSBwYXJlbnRFbGVtZW50KTsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRFbnRlcnByaXNlQmVhbnMoTWV0aG9kUGVybWlzc2lvbiBtcCkgewotCQlMaXN0IG1lcyA9IG1wLmdldE1ldGhvZEVsZW1lbnRzKCk7Ci0JCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMobXAsIG1lcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0LCBFbnRlcnByaXNlQmVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0IGFSZWZPYmplY3QsIEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCWlmICghKGFSZWZPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlNZXRob2RQZXJtaXNzaW9uIHBhcmVudE1QID0gKE1ldGhvZFBlcm1pc3Npb24pIGFSZWZPYmplY3Q7Ci0JCWlmIChwYXJlbnRNUCA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBwYXJlbnRNUC5nZXRNZXRob2RFbGVtZW50cyhhbkVKQik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlzdXBlci5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOwotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRUpCSmFyKSB7Ci0JCQlFSkJKYXIgamFyID0gKEVKQkphcikgaW5wdXRFbGVtZW50OwotCQkJaWYgKGphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSAhPSBudWxsKQotCQkJCXJldHVybiBqYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkuZ2V0TWV0aG9kUGVybWlzc2lvbnMoKS50b0FycmF5KCk7Ci0JCX0KLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFzc2VtYmx5RGVzY3JpcHRvcikKLQkJCXJldHVybiAoKEFzc2VtYmx5RGVzY3JpcHRvcikgaW5wdXRFbGVtZW50KS5nZXRNZXRob2RQZXJtaXNzaW9ucygpLnRvQXJyYXkoKTsKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb24pCi0JCQlyZXR1cm4gISgoTWV0aG9kUGVybWlzc2lvbikgZWxlbWVudCkuZ2V0TWV0aG9kRWxlbWVudHMoKS5pc0VtcHR5KCk7Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gUEVSTUlTU0lPTl9NRVNfU0Y7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIudWkucHJvdmlkZXJzLkFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIEFEX01QX1NGOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciNub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gUEVSTUlTU0lPTl9NRVNfU0YgfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBBRF9NUF9TRikKLQkJCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpIGluc3RhbmNlb2YgQ01QQXR0cmlidXRlICYmIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IFBFUk1JU1NJT05fTUVTX1VOQ0hFQ0tFRF9TRiB8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IFBFUk1JU1NJT05fTUVTX1JPTEVTX1NGIHx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gZ2V0TWV0aG9kRWxlbWVudHNSZWZlcmVuY2UoKSB8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IGdldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkpCi0JCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwNjE2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL01ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci0KLQotcHVibGljIGNsYXNzIE1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgVFJBTlNBQ1RJT05fTUVTX1NGID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldE1ldGhvZFRyYW5zYWN0aW9uX01ldGhvZEVsZW1lbnRzKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIEFEX01UX1NGID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RUcmFuc2FjdGlvbnMoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcm9vdAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIGJvb2xlYW4gcm9vdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcm9vdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1ldGhvZFRyYW5zYXRpb25Db250ZW50UHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFRyYW5zYWN0aW9uKQotCQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucygoTWV0aG9kVHJhbnNhY3Rpb24pIHBhcmVudEVsZW1lbnQpOwotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldEVudGVycHJpc2VCZWFucyhNZXRob2RUcmFuc2FjdGlvbiBtdCkgewotCQlMaXN0IG1lcyA9IG10LmdldE1ldGhvZEVsZW1lbnRzKCk7Ci0JCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMobXQsIG1lcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0LCBFbnRlcnByaXNlQmVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0IGFSZWZPYmplY3QsIEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCWlmICghKGFSZWZPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RUcmFuc2FjdGlvbikpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTWV0aG9kVHJhbnNhY3Rpb24gcGFyZW50TVQgPSAoTWV0aG9kVHJhbnNhY3Rpb24pIGFSZWZPYmplY3Q7Ci0JCWlmIChwYXJlbnRNVCA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBwYXJlbnRNVC5nZXRNZXRob2RFbGVtZW50cyhhbkVKQik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlzdXBlci5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOwotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRUpCSmFyKSB7Ci0JCQlFSkJKYXIgamFyID0gKEVKQkphcikgaW5wdXRFbGVtZW50OwotCQkJaWYgKGphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSAhPSBudWxsKQotCQkJCXJldHVybiBqYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkuZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkudG9BcnJheSgpOwotCQl9Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBBc3NlbWJseURlc2NyaXB0b3IpCi0JCQlyZXR1cm4gKChBc3NlbWJseURlc2NyaXB0b3IpIGlucHV0RWxlbWVudCkuZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkudG9BcnJheSgpOwotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kVHJhbnNhY3Rpb24pCi0JCQlyZXR1cm4gISgoTWV0aG9kVHJhbnNhY3Rpb24pIGVsZW1lbnQpLmdldE1ldGhvZEVsZW1lbnRzKCkuaXNFbXB0eSgpOwotCQlyZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIFRSQU5TQUNUSU9OX01FU19TRjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5wcm92aWRlcnMuQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gQURfTVRfU0Y7Ci0JfQotCi0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvUHJpbWFyeUtleUNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvUHJpbWFyeUtleUNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4OTNiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1ByaW1hcnlLZXlDbGFzc1Byb3ZpZGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIxLzIwMDEgMTI6Mjg6NTUgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlDbGFzc1Byb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBpbWFnZTsKLQotCS8qKgotCSAqIFByaW1hcnlLZXlDbGFzc1Byb3ZpZGVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNscwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlDbGFzc1Byb3ZpZGVySGVscGVyKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXN1cGVyKGFuRUpCKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xMS8yMDAxIDE6NTQ6MjIgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuICgoRW50aXR5KSBnZXRFamIoKSkuZ2V0UHJpbWFyeUtleSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpIHsKLQkJcmV0dXJuICJrZXlfaW50ZXJmX292IjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJQcmltYXJ5X0tleV9DbGFzc19VSV8iLCBuZXcgT2JqZWN0W117Y2xhc3NOYW1lfSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJpbWFyeSBLZXkgQ2xhc3MiCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvUmVtb3RlSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvUmVtb3RlSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjYjc5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1JlbW90ZUludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMS8yMDAxIDEyOjI4OjEyIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdGVJbnRlcmZhY2VQcm92aWRlckhlbHBlciBleHRlbmRzIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgaW1hZ2U7Ci0KLQkvKioKLQkgKiBSZW1vdGVJbnRlcmZhY2VQcm92aWRlckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBSZW1vdGVJbnRlcmZhY2VQcm92aWRlckhlbHBlcihFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlzdXBlcihhbkVKQik7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTEvMjAwMSAxOjU1OjQ4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiBnZXRFamIoKS5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7Ci0JCXJldHVybiAicmVtb3RlX2ludGVyZmFjZV9vdmVybGF5X29iaiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVtb3RlX0ludGVyZmFjZV9VSV8iLCBuZXcgT2JqZWN0W117Y2xhc3NOYW1lfSk7IC8vJE5PTi1OTFMtMSQgPSAiUmVtb3RlIEludGVyZmFjZSIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQyYjBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdHRwCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBpbWFnZTsKLQotCS8qKgotCSAqIEBwYXJhbSBhbkVKQgotCSAqLwotCXB1YmxpYyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm92aWRlckhlbHBlcihFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlzdXBlcihhbkVKQik7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTEvMjAwMSAxOjUzOjQ5IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoKFNlc3Npb24pIGdldEVqYigpKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7Ci0JCS8vVE9ETzogREZIIHdlIG5lZWQgYW4gaWNvbgotCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiU2VydmljZV9FbmRwb2ludF9JbnRlcmZhY2VfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIkhvbWUgSW50ZXJmYWNlIgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbGlzdGVuZXJzL0lWYWxpZGF0ZUVkaXRMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2xpc3RlbmVycy9JVmFsaWRhdGVFZGl0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0NGViNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbGlzdGVuZXJzL0lWYWxpZGF0ZUVkaXRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciBleHRlbmRzIFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIsIElQYXJ0TGlzdGVuZXIsIFNoZWxsTGlzdGVuZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgYW55IGFjdGlvbiB0aGF0IGlzIGFib3V0IHRvIGVkaXQgYW55IGNvbnRlbnRzIG9mIGFueSBJRmlsZS4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHJlYWQgb25seSBJRmlsZXMgdGhhdCBhcmUgYmVpbmcgbWFuYWdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0UmVzb3VyY2VzKCkKLQkgKi8KLQlib29sZWFuIGhhc1JlYWRPbmx5RmlsZXMoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8gc2F2aW5nIHRoZSBjb250ZW50cy4gSXQgcmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZW50cwotCSAqIGNhbiBiZSBzYXZlZC4KLQkgKi8KLQlib29sZWFuIGNoZWNrU2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgU2hlbGwgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHJvbXB0IHRvIHRoZSB1c2VyLgotCSAqLwotCXZvaWQgc2V0U2hlbGwoU2hlbGwgYVNoZWxsKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbGlzdGVuZXJzL1ZhbGlkYXRlRWRpdExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbGlzdGVuZXJzL1ZhbGlkYXRlRWRpdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYmI5ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2xpc3RlbmVycy9WYWxpZGF0ZUVkaXRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkxpc3RNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZUVkaXRMaXN0ZW5lciBleHRlbmRzIFNoZWxsQWRhcHRlciBpbXBsZW1lbnRzIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgZlZhbGlkYXRvcjsKLQlwcml2YXRlIGJvb2xlYW4gZk5lZWRzU3RhdGVWYWxpZGF0aW9uID0gdHJ1ZTsKLQlwcml2YXRlIFNoZWxsIGZTaGVsbDsKLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZQYXJ0OwotCXByaXZhdGUgYm9vbGVhbiBmSGFzUmVhZE9ubHlGaWxlcyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmaXJzdFJlYWRPbmx5RmlsZUF0dGVtcHQgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBmTWVzc2FnZVVwID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0FjdGl2YXRpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzRGVhY3RpdmF0aW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVmFsaWRhdGVFZGl0SGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGVFZGl0TGlzdGVuZXIoSVdvcmtiZW5jaFBhcnQgcGFydCwgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBhVmFsaWRhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQYXJ0ID0gcGFydDsKLQkJZlZhbGlkYXRvciA9IGFWYWxpZGF0b3I7Ci0JCWlmIChwYXJ0ICE9IG51bGwpCi0JCQlwYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHRoaXMpOwotCQlpZiAoZ2V0U2hlbGwoKSAhPSBudWxsKQotCQkJZ2V0U2hlbGwoKS5hZGRTaGVsbExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJaWYgKGZTaGVsbCA9PSBudWxsKSB7Ci0JCQlpZiAoZlBhcnQgIT0gbnVsbCAmJiBmUGFydC5nZXRTaXRlKCkgIT0gbnVsbCkKLQkJCQlmU2hlbGwgPSBmUGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gZlNoZWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZhbGlkYXRlRWRpdExpc3RlbmVyI2dldFZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gZlZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciNnZXROZWVkc1N0YXRlVmFsaWRhdGlvbigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBmTmVlZHNTdGF0ZVZhbGlkYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVmFsaWRhdGVFZGl0TGlzdGVuZXIjc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZWVkc1N0YXRlVmFsaWRhdGlvbihib29sZWFuIG5lZWRzU3RhdGVWYWxpZGF0aW9uKSB7Ci0JCWZOZWVkc1N0YXRlVmFsaWRhdGlvbiA9IG5lZWRzU3RhdGVWYWxpZGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlUmVmcmVzaChMaXN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJaWYgKGluY29uc2lzdGVudEZpbGVzID09IG51bGwgfHwgaW5jb25zaXN0ZW50RmlsZXMuc2l6ZSgpID09IDApIC8vIHRoaXMgY2FzZSBzaG91bGQgbmV2ZXIKLQkJCS8vIG9jY3VyLgotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgdGl0bGUgPSBudWxsOwotCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCVN0cmluZ1tdIGZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbaW5jb25zaXN0ZW50RmlsZXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGluY29uc2lzdGVudEZpbGVzLnNpemUoKSA+IGk7IGkrKykgewotCQkJT2JqZWN0IGZpbGUgPSBpbmNvbnNpc3RlbnRGaWxlcy5nZXQoaSk7Ci0JCQlpZiAoZmlsZSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChSZXNvdXJjZSkgZmlsZSk7Ci0JCQkJZmlsZU5hbWVzW2ldID0gYUZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCQl9IGVsc2UgaWYgKGZpbGUgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlJUmVzb3VyY2UgcmVzZmlsZSA9IChJUmVzb3VyY2UpIGZpbGU7Ci0JCQkJaWYgKCFyZXNmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJZmlsZU5hbWVzW2ldID0gcmVzZmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0KLQkJdGl0bGUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSW5jb25zaXN0ZW50X0ZpbGVzXzMiKTsgLy8kTk9OLU5MUy0xJAotCQltZXNzYWdlID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlRoZV9mb2xsb3dpbmdfd29ya3NwYWNlX2ZpbGVzX2FyZV9pbmNvbnNpc3RlbnRfd2l0aF90aGVfZWRpdG9yXzQiKTsgLy8kTk9OLU5MUy0xJAotCQltZXNzYWdlICs9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJVcGRhdGVfdGhlX2VkaXRvcl93aXRoX3RoZV93b3Jrc3BhY2VfY29udGVudHNfXzUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTGlzdE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlLCBmaWxlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNnZXRWYWxpZGF0ZUVkaXRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlRWRpdENvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCA9PSBmUGFydCkgewotCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQkJaWYgKGZJc0FjdGl2YXRpbmcpCi0JCQlyZXR1cm47Ci0JCWZJc0FjdGl2YXRpbmcgPSB0cnVlOwotCQl0cnkgewotCQkJZlZhbGlkYXRvci5jaGVja0FjdGl2YXRpb24odGhpcyk7Ci0JCQl1cGRhdGVQYXJ0UmVhZE9ubHkoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciBub3cKLQkJfSBmaW5hbGx5IHsKLQkJCWZJc0FjdGl2YXRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbExpc3RlbmVyI3NoZWxsQWN0aXZhdGVkKFNoZWxsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCBldmVudCkgewotCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCA9PSBmUGFydCkKLQkJCXBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChnZXRTaGVsbCgpICE9IG51bGwpCi0JCQlnZXRTaGVsbCgpLnJlbW92ZVNoZWxsTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCA9PSBmUGFydCkgewotCQkJaWYgKGZJc0RlYWN0aXZhdGluZykKLQkJCQlyZXR1cm47Ci0JCQlmSXNEZWFjdGl2YXRpbmcgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlmVmFsaWRhdG9yLmxvc3RBY3RpdmF0aW9uKHRoaXMpOwotCQkJCXVwZGF0ZVBhcnRSZWFkT25seSgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZyBmb3Igbm93Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZJc0RlYWN0aXZhdGluZyA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZSgpIHsKLQkJaWYgKGZOZWVkc1N0YXRlVmFsaWRhdGlvbikgewotCQkJc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oZmFsc2UpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzdGF0dXMgPSBmVmFsaWRhdG9yLnZhbGlkYXRlU3RhdGUodGhpcyk7Ci0JCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24odHJ1ZSk7Ci0JCQkJCWlmICghZk1lc3NhZ2VVcCkgewotCQkJCQkJZk1lc3NhZ2VVcCA9IHRydWU7Ci0JCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRXJyb3JfY2hlY2tpbmdfb3V0X2ZpbGVzXzEwIiksIHN0YXR1cy5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlmTWVzc2FnZVVwID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZlZhbGlkYXRvci5jaGVja0FjdGl2YXRpb24odGhpcyk7Ci0JCQkJdXBkYXRlUGFydFJlYWRPbmx5KCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nIGZvciBub3cKLQkJCX0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIFJlc291cmNlU3RhdGVWYWxpZGF0b3IuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKExpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7Ci0JCWludCBzaXplID0gaW5jb25zaXN0ZW50RmlsZXMuc2l6ZSgpOwotCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZmlsZSA9IChJRmlsZSkgaW5jb25zaXN0ZW50RmlsZXMuZ2V0KGkpOwotCQkJaXRlbXNbaV0gPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gTGlzdE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldFNoZWxsKCksIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJbmNvbnNpc3RlbnRfZmlsZXNfZGV0ZWN0ZWRfMTEiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiVGhlX2ZvbGxvd2luZ19maWxlc19hcmVfaW5jb25zaXN0ZW50X3dpdGhfdGhlX2ZpbGVfc3lzdGVtLl9Eb195b3Vfd2FudF90b19zYXZlX2FuZF9vdmVyd3JpdGVfdGhlc2VfZmlsZXNfb25fdGhlX2ZpbGVfc3lzdGVtX18xMl9XQVJOXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1JlYWRPbmx5KCkgewotCQlmSGFzUmVhZE9ubHlGaWxlcyA9IGZWYWxpZGF0b3IuY2hlY2tSZWFkT25seSgpOwotCQlyZXR1cm4gZkhhc1JlYWRPbmx5RmlsZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVmFsaWRhdGVFZGl0TGlzdGVuZXIjaGFzUmVhZE9ubHlGaWxlcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVhZE9ubHlGaWxlcygpIHsKLQkJaWYgKGZpcnN0UmVhZE9ubHlGaWxlQXR0ZW1wdCkgewotCQkJY2hlY2tSZWFkT25seSgpOwotCQkJZmlyc3RSZWFkT25seUZpbGVBdHRlbXB0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZIYXNSZWFkT25seUZpbGVzOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB1cGRhdGVQYXJ0UmVhZE9ubHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFydFJlYWRPbmx5KCkgewotCQlpZiAoIWdldE5lZWRzU3RhdGVWYWxpZGF0aW9uKCkpIHsKLQkJCWNoZWNrUmVhZE9ubHkoKTsKLQkJCXNldE5lZWRzU3RhdGVWYWxpZGF0aW9uKHRydWUpOwotCQl9IGVsc2UgeyAvL1NvIHRoYXQgSjJFRVhNTEFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldCB1cGRhdGVkIGluZm8gd2hlbiBlZGl0b3IgQWN0aXZhdGVkLgotCQkJZmlyc3RSZWFkT25seUZpbGVBdHRlbXB0ID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrU2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHZhbGlkYXRlU3RhdGUoKS5pc09LKCkgJiYgZ2V0VmFsaWRhdG9yKCkuY2hlY2tTYXZlKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoZWxsKFNoZWxsIGFTaGVsbCkgewotCQlmU2hlbGwgPSBhU2hlbGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KMkVFUGVyc3BlY3RpdmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KMkVFUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2MTZiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGVyc3BlY3RpdmUvSjJFRVBlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDcsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRm9sZGVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc0NvbnN0YW50czsKLQotLyoqCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgSURfU0VSVkVSU19WSUVXID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXciOyAvLyROT04tTkxTLTEkCi0JLy9wcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBJRF9KMkVFX0hJRVJBUkNIWV9WSUVXID0gIm9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIElEX0oyRUVfSElFUkFSQ0hZX1ZJRVcgPSAib3JnLmVjbGlwc2Uud3N0Lm5hdmlnYXRvci51aS5XVFBXb3JraW5nU2V0Q29tbW9uTmF2aWdhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEX1dTVF9TTklQUEVUU19WSUVXID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMuaW50ZXJuYWwudWkuU25pcHBldHNWaWV3IjsgLy8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSURfRUpCX1BST0pFQ1RfV0laQVJEID0gIm9yZy5lY2xpcHNlLmpzdC5lamIudWkuRUpCQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEX1JBUl9QUk9KRUNUX1dJWkFSRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEX0FQUENMSUVOVF9QUk9KRUNUX1dJWkFSRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEX0VBUl9QUk9KRUNUX1dJWkFSRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEX0RZTkFNSUNfV0VCX0NPTVBPTkVOVF9XSVpBUkQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEX1NUQVRJQ19XRUJfQ09NUE9ORU5UX1dJWkFSRCA9ICJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1NFQVJDSF9WSUVXID0gIm9yZy5lY2xpcHNlLnNlYXJjaC51aS52aWV3cy5TZWFyY2hWaWV3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0NPTlNPTEVfVklFVz0gIm9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuQ29uc29sZVZpZXciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSjJFRVBlcnNwZWN0aXZlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWRlZmluZUxheW91dChsYXlvdXQpOwotCQlkZWZpbmVBY3Rpb25zKGxheW91dCk7Ci0JfQotCQotCQotCi0JcHVibGljIHZvaWQgZGVmaW5lQWN0aW9ucyhJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZEFjdGlvblNldCgib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJlZU1haW5BY3Rpb25TZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KCJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMmVlTWFpbkFjdGlvblNldDIiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KCJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMmVlTWFpbkFjdGlvblNldDMiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KCJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMmVlTWFpbkFjdGlvblNldDQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KCJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUFjdGlvblNldCIpOyAvLyROT04tTkxTLTEkCi0KLQkJbGF5b3V0LmFkZEFjdGlvblNldChJRGVidWdVSUNvbnN0YW50cy5MQVVOQ0hfQUNUSU9OX1NFVCk7Ci0JCWxheW91dC5hZGRBY3Rpb25TZXQoSURlYnVnVUlDb25zdGFudHMuREVCVUdfQUNUSU9OX1NFVCk7Ci0KLQkJbGF5b3V0LmFkZEFjdGlvblNldChJUGFnZUxheW91dC5JRF9OQVZJR0FURV9BQ1RJT05fU0VUKTsKLQotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRF9KMkVFX0hJRVJBUkNIWV9WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfU0VSVkVSU19WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfV1NUX1NOSVBQRVRTX1ZJRVcpOwotCQkKLQkJLy8gdmlld3MgLSBzZWFyY2gKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfU0VBUkNIX1ZJRVcpOwotCQkJCS8vIHZpZXdzIC0gZGVidWdnaW5nCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElEX0NPTlNPTEVfVklFVyk7Ci0KLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KElEX0RZTkFNSUNfV0VCX0NPTVBPTkVOVF9XSVpBUkQpOwotICAgICAgICBsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoSURfU1RBVElDX1dFQl9DT01QT05FTlRfV0laQVJEKTsKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KElEX0VKQl9QUk9KRUNUX1dJWkFSRCk7Ci0gICAgICAgIGxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dChJRF9SQVJfUFJPSkVDVF9XSVpBUkQpOwotICAgICAgICBsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoSURfQVBQQ0xJRU5UX1BST0pFQ1RfV0laQVJEKTsKLSAgICAgICAgbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KElEX0VBUl9QUk9KRUNUX1dJWkFSRCk7Ci0KLQkJLy8gQWRkICJuZXcgd2l6YXJkcyIKLSAgICAgICAgbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5wcm9qZWN0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5maWxlIik7Ly8kTk9OLU5MUy0xJAotCi0JCWxheW91dC5hZGRTaG93SW5QYXJ0KElEX0oyRUVfSElFUkFSQ0hZX1ZJRVcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlZmluZUxheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJLy8gRWRpdG9ycyBhcmUgcGxhY2VkIGZvciBmcmVlLgotCQlTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7Ci0KLQkJLy8gVG9wIGxlZnQuCi0JCUlGb2xkZXJMYXlvdXQgdG9wTGVmdCA9IGxheW91dC5jcmVhdGVGb2xkZXIoInRvcExlZnQiLCBJUGFnZUxheW91dC5MRUZULCAwLjI1ZiwgZWRpdG9yQXJlYSk7Ly8kTk9OLU5MUy0xJAotCQl0b3BMZWZ0LmFkZFZpZXcoSURfSjJFRV9ISUVSQVJDSFlfVklFVyk7Ci0JCXRvcExlZnQuYWRkUGxhY2Vob2xkZXIoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0JCXRvcExlZnQuYWRkUGxhY2Vob2xkZXIoSmF2YVVJLklEX1RZUEVfSElFUkFSQ0hZKTsKLQkJdG9wTGVmdC5hZGRQbGFjZWhvbGRlcihKYXZhVUkuSURfUEFDS0FHRVNfVklFVyk7Ci0KLQkJLy8gQm90dG9tIHJpZ2h0LgotCQlJRm9sZGVyTGF5b3V0IGJvdHRvbVJpZ2h0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9tUmlnaHQiLCBJUGFnZUxheW91dC5CT1RUT00sIDAuN2YsIGVkaXRvckFyZWEpOy8vJE5PTi1OTFMtMSQKLQkJYm90dG9tUmlnaHQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQlib3R0b21SaWdodC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1RBU0tfTElTVCk7Ci0JCWJvdHRvbVJpZ2h0LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPUF9TSEVFVCk7Ci0JCWJvdHRvbVJpZ2h0LmFkZFZpZXcoSURfU0VSVkVSU19WSUVXKTsKLQkJYm90dG9tUmlnaHQuYWRkVmlldyhJRF9XU1RfU05JUFBFVFNfVklFVyk7Ci0JCQotCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJRF9DT05TT0xFX1ZJRVcpOwotCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUHJvZ3Jlc3NDb25zdGFudHMuUFJPR1JFU1NfVklFV19JRCk7Ci0JCWJvdHRvbVJpZ2h0LmFkZFBsYWNlaG9sZGVyKElEX1NFQVJDSF9WSUVXKTsKLQotCQkvLyBUb3AgcmlnaHQuCi0JCUlGb2xkZXJMYXlvdXQgdG9wUmlnaHQgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJ0b3BSaWdodCIsIElQYWdlTGF5b3V0LlJJR0hULCAwLjdmLCBlZGl0b3JBcmVhKTsvLyROT04tTkxTLTEkCi0JCXRvcFJpZ2h0LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9Db21tb25FZGl0b3JVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0NvbW1vbkVkaXRvclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1OGNiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0NvbW1vbkVkaXRvclV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5FZGl0b3JNYW5hZ2VyOwotCi0KLQotcHVibGljIGNsYXNzIENvbW1vbkVkaXRvclV0aWxpdHkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBJUkVTT1VSQ0VfQ0xBU1MgPSBJUmVzb3VyY2UuY2xhc3M7Ci0KLQlwcml2YXRlIENvbW1vbkVkaXRvclV0aWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgZWRpdG9ycyB0aGF0IGhhdmUgYW4gdW5zYXZlZCBjb250ZW50LiBJZiB0aGUgaWRlbnRpY2FsIGNvbnRlbnQgaXMKLQkgKiBwcmVzZW50ZWQgaW4gbW9yZSB0aGFuIG9uZSBlZGl0b3IsIG9ubHkgb25lIG9mIHRob3NlIGVkaXRvciBwYXJ0cyBpcyBwYXJ0IG9mIHRoZSByZXN1bHQuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBhbGwgZGlydHkgZWRpdG9yIHBhcnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnRbXSBnZXREaXJ0eUVkaXRvcnMoKSB7Ci0JCXJldHVybiBnZXREaXJ0eUVkaXRvcnMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgZWRpdG9ycyB0aGF0IGhhdmUgYW4gdW5zYXZlZCBjb250ZW50LCB3aGVyZSB0aGUgY29udGVudCBpcyBpbmNsdWRlIGluCi0JICogb25lIG9mIHRoZSBwcm9qZWN0cyBpbiB0aGUgTGlzdCBwYXJhbWV0ZXIuIElmIHRoZSBpZGVudGljYWwgY29udGVudCBpcyBwcmVzZW50ZWQgaW4gbW9yZSB0aGFuCi0JICogb25lIGVkaXRvciwgb25seSBvbmUgb2YgdGhvc2UgZWRpdG9yIHBhcnRzIGlzIHBhcnQgb2YgdGhlIHJlc3VsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBkaXJ0eSBlZGl0b3IgcGFydHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydFtdIGdldERpcnR5RWRpdG9ycyhMaXN0IHByb2plY3RzKSB7Ci0JCVNldCBpbnB1dHMgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gSjJFRVVJUGx1Z2luLmdldFBsdWdpbldvcmtiZW5jaCgpOwotCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotCQkJSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgcGFnZXMubGVuZ3RoOyB4KyspIHsKLQkJCQlJRWRpdG9yUGFydFtdIGVkaXRvcnMgPSBwYWdlc1t4XS5nZXREaXJ0eUVkaXRvcnMoKTsKLQkJCQlmb3IgKGludCB6ID0gMDsgeiA8IGVkaXRvcnMubGVuZ3RoOyB6KyspIHsKLQkJCQkJSUVkaXRvclBhcnQgZXAgPSBlZGl0b3JzW3pdOwotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlcC5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoIWlucHV0cy5jb250YWlucyhpbnB1dCkgJiYgKHByb2plY3RzID09IG51bGwgfHwgaW5wdXRJblByb2plY3RzKGlucHV0LCBwcm9qZWN0cykpKSB7Ci0JCQkJCQlpbnB1dHMuYWRkKGlucHV0KTsKLQkJCQkJCXJlc3VsdC5hZGQoZXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUVkaXRvclBhcnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElFZGl0b3JQYXJ0W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5wdXRJblByb2plY3RzKElFZGl0b3JJbnB1dCBpbnB1dCwgTGlzdCBwcm9qZWN0cykgewotCQlJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUkVTT1VSQ0VfQ0xBU1MpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzID09IG51bGwgPyBudWxsIDogcmVzLmdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJaWYgKHByb2plY3QuZXF1YWxzKHByb2plY3RzLmdldChpKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRUb1NhdmVBbGxEaXJ0eUVkaXRvcnMoKSB7Ci0JCXJldHVybiBwcm9tcHRUb1NhdmVEaXJ0eUVkaXRvcnMoQXJyYXlzLmFzTGlzdChnZXREaXJ0eUVkaXRvcnMoKSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRUb1NhdmVEaXJ0eUVkaXRvcnMoTGlzdCBkaXJ0eUVkaXRvcnMpIHsKLQkJaWYgKGRpcnR5RWRpdG9ycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIEVkaXRvck1hbmFnZXIuc2F2ZUFsbChkaXJ0eUVkaXRvcnMsIHRydWUsIEoyRUVVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb21wdFRvU2F2ZURpcnR5RWRpdG9yc0luUHJvamVjdHMoTGlzdCBwcm9qZWN0cykgewotCQlyZXR1cm4gcHJvbXB0VG9TYXZlRGlydHlFZGl0b3JzKEFycmF5cy5hc0xpc3QoZ2V0RGlydHlFZGl0b3JzKHByb2plY3RzKSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0Vycm9yRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0Vycm9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YjcxMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9FcnJvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBZGRlZCBhIERldGFpbHMgYnV0dG9uIHRvIHRoZSBNZXNzYWdlRGlhbG9nIHRvIHNob3cgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZS4KLSAqIAotICogQm9ycm93ZWQgZnJvbSBhbiBlY2xpcHNlIEludGVybmFsRXJyb3JEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIEVycm9yRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0sgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0tfQ0FOQ0VMID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19ERVRBSUxTID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19DQU5DRUxfREVUQUlMUyA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUx9OwotCXByaXZhdGUgVGhyb3dhYmxlIGRldGFpbDsKLQlwcml2YXRlIGludCBkZXRhaWxCdXR0b25JRCA9IC0xOwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0JLy9Xb3JrYXJvdW5kLiBTV1QgZG9lcyBub3Qgc2VlbSB0byBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uIGlmCi0JLy90aGVyZSBpcyBub3QgY29udHJvbCB3aXRoIGZvY3VzLiBCdWc6IDE0NjY4Ci0JcHJpdmF0ZSBpbnQgZGVmYXVsdEJ1dHRvbkluZGV4ID0gMDsKLQkvKioKLQkgKiBTaXplIG9mIHRoZSB0ZXh0IGluIGxpbmVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX0xJTkVfQ09VTlQgPSAxNTsKLQotCXB1YmxpYyBFcnJvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBJbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgVGhyb3dhYmxlIGRldGFpbCwgaW50IGRpYWxvZ0ltYWdlVHlwZSwgU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JCWRlZmF1bHRCdXR0b25JbmRleCA9IGRlZmF1bHRJbmRleDsKLQkJdGhpcy5kZXRhaWwgPSBkZXRhaWw7Ci0JCW1lc3NhZ2UgPSBkaWFsb2dNZXNzYWdlOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOwotCX0KLQotCS8vV29ya2Fyb3VuZC4gU1dUIGRvZXMgbm90IHNlZW0gdG8gc2V0IHJpZ3RoIHRoZSBkZWZhdWx0IGJ1dHRvbiBpZgotCS8vdGhlcmUgaXMgbm90IGNvbnRyb2wgd2l0aCBmb2N1cy4gQnVnOiAxNDY2OAotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJY3JlYXRlKCk7Ci0JCUJ1dHRvbiBiID0gZ2V0QnV0dG9uKGRlZmF1bHRCdXR0b25JbmRleCk7Ci0JCWIuc2V0Rm9jdXMoKTsKLQkJYi5nZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24oYik7Ci0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZXRhaWwgYnV0dG9uOwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERldGFpbEJ1dHRvbihpbnQgaW5kZXgpIHsKLQkJZGV0YWlsQnV0dG9uSUQgPSBpbmRleDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gZGV0YWlsQnV0dG9uSUQpIHsKLQkJCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRSZXR1cm5Db2RlKGJ1dHRvbklkKTsKLQkJCWNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgcHJlc3NpbmcgdGhlIGRldGFpbHMKLQkgKiBidXR0b24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXRleHQuZGlzcG9zZSgpOwotCQkJdGV4dCA9IG51bGw7Ci0JCQlnZXRCdXR0b24oZGV0YWlsQnV0dG9uSUQpLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlRHJvcERvd25UZXh0KChDb21wb3NpdGUpIGdldENvbnRlbnRzKCkpOwotCQkJZ2V0QnV0dG9uKGRldGFpbEJ1dHRvbklEKS5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJfQotCQlQb2ludCBuZXdTaXplID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlnZXRTaGVsbCgpLnNldFNpemUobmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55ICsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhpcyBkaWFsb2cncyBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEcm9wRG93blRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGxpc3QKLQkJdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCS8vIHByaW50IHRoZSBzdGFja3RyYWNlIGluIHRoZSB0ZXh0IGZpZWxkCi0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCVByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGJhb3MpOwotCQkJZGV0YWlsLnByaW50U3RhY2tUcmFjZShwcyk7Ci0JCQlpZiAoKGRldGFpbCBpbnN0YW5jZW9mIFNXVEVycm9yKSAmJiAoKChTV1RFcnJvcikgZGV0YWlsKS50aHJvd2FibGUgIT0gbnVsbCkpIHsKLQkJCQlwcy5wcmludGxuKCJcbioqKiBTdGFjayB0cmFjZSBvZiBjb250YWluZWQgZXhjZXB0aW9uICoqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJKChTV1RFcnJvcikgZGV0YWlsKS50aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCX0gZWxzZSBpZiAoKGRldGFpbCBpbnN0YW5jZW9mIFNXVEV4Y2VwdGlvbikgJiYgKCgoU1dURXhjZXB0aW9uKSBkZXRhaWwpLnRocm93YWJsZSAhPSBudWxsKSkgewotCQkJCXBzLnByaW50bG4oIlxuKioqIFN0YWNrIHRyYWNlIG9mIGNvbnRhaW5lZCBleGNlcHRpb24gKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkoKFNXVEV4Y2VwdGlvbikgZGV0YWlsKS50aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCX0KLQkJCXBzLmZsdXNoKCk7Ci0JCQliYW9zLmZsdXNoKCk7Ci0JCQl0ZXh0LnNldFRleHQoYmFvcy50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiBURVhUX0xJTkVfQ09VTlQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGRldGFpbCwgaW50IGRlZmF1bHRJbmRleCwgYm9vbGVhbiBzaG93Q2FuY2VsKSB7Ci0JCVN0cmluZ1tdIGxhYmVsczsKLQkJaWYgKGRldGFpbCA9PSBudWxsKQotCQkJbGFiZWxzID0gc2hvd0NhbmNlbCA/IExBQkVMU19PS19DQU5DRUwgOiBMQUJFTFNfT0s7Ci0JCWVsc2UKLQkJCWxhYmVscyA9IHNob3dDYW5jZWwgPyBMQUJFTFNfT0tfQ0FOQ0VMX0RFVEFJTFMgOiBMQUJFTFNfT0tfREVUQUlMUzsKLQkJRXJyb3JEaWFsb2cgZGlhbG9nID0gbmV3IEVycm9yRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdAotCQkJCQkvLyB0aGUKLQkJCQkJLy8gZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cKLQkJCQkJLy8gaWNvbgotCQkJCQltZXNzYWdlLCBkZXRhaWwsIEVSUk9SLCBsYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JCWlmIChkZXRhaWwgIT0gbnVsbCkKLQkJCWRpYWxvZy5zZXREZXRhaWxCdXR0b24obGFiZWxzLmxlbmd0aCAtIDEpOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJKChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCQkvLyBjcmVhdGUgaW1hZ2UKLQkJSW1hZ2UgaW1hZ2UgPSBjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgMCk7Ci0JCQlpbWFnZS5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldEJhY2tncm91bmQoKSk7Ci0JCQlsYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUiB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQl9Ci0JCS8vIGNyZWF0ZSBtZXNzYWdlCi0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFRWRpdG9yVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFRWRpdG9yVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWRiNjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRUVkaXRvclV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhQ2xhc3NKRE9NQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFscyAtIFByb3BlcnR5IG9mIElCTSwKLSAqIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwIDE5OTksIDIwMDAKLSAqLwotCi0vKioKLSAqIEEgbnVtYmVyIG9mIHJvdXRpbmVzIGZvciB3b3JraW5nIHdpdGggSmF2YUVsZW1lbnRzIGluIGVkaXRvcnMKLSAqIAotICogVXNlICdpc09wZW5JbkVkaXRvcicgdG8gdGVzdCBpZiBhbiBlbGVtZW50IGlzIGFscmVhZHkgb3BlbiBpbiBhIGVkaXRvciBVc2UgJ29wZW5JbkVkaXRvcicgdG8KLSAqIGZvcmNlIG9wZW5pbmcgYW4gZWxlbWVudCBpbiBhIGVkaXRvciBXaXRoICdnZXRXb3JraW5nQ29weScgeW91IGdldCB0aGUgd29ya2luZyBjb3B5IChlbGVtZW50IGluCi0gKiB0aGUgZWRpdG9yKSBvZiBhbiBlbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRWRpdG9yVXRpbGl0eSB7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9KQVZBX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIudWkubWlzYy5FSkJKYXZhRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoamF2YUNsYXNzKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0Q29tcGlsYXRpb25Vbml0KGphdmFDbGFzcywgcHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhQ2xhc3MgamF2YUNsYXNzLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJaWYgKGphdmFQcm9qID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldENvbXBpbGF0aW9uVW5pdChqYXZhQ2xhc3MsIGphdmFQcm9qKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KEphdmFDbGFzcyBqYXZhQ2xhc3MsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoamF2YUNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVR5cGUgdHlwZSA9IGdldFR5cGUoamF2YUNsYXNzKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCXJldHVybiB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElUeXBlIGdldFR5cGUoSmF2YUNsYXNzIGphdmFDbGFzcykgewotCQlpZiAoamF2YUNsYXNzICE9IG51bGwpIHsKLQkJCUphdmFDbGFzc0pET01BZGFwdG9yIGFkYXB0b3IgPSAoSmF2YUNsYXNzSkRPTUFkYXB0b3IpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihqYXZhQ2xhc3MsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCWlmIChhZGFwdG9yICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0b3IuZ2V0U291cmNlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KE9iamVjdCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcmV0dXJuIG5ldyBGaWxlRWRpdG9ySW5wdXQoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdCkgaW5wdXQpKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGUpCi0JCQlyZXR1cm4gbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpIGlucHV0KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjb21wID0gZ2V0Q29tcGlsYXRpb25Vbml0KGphdmFDbGFzcyk7Ci0JCWlmIChjb21wID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gRWRpdG9yVXRpbGl0eS5nZXRFZGl0b3JJbnB1dChjb21wKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIChJRmlsZSkgaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgYVByb2plY3QpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUphdmFNb2RlbCBqYXZhTW9kZWwgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFNb2RlbCgpOwotCQlyZXR1cm4gamF2YU1vZGVsLmdldEphdmFQcm9qZWN0KGFQcm9qZWN0LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJUGFja2FnZUZyYWdtZW50IGZvciB0aGUgSmF2YVBhY2thZ2UgZm9yCi0JICogCi0JICogQGphdmFDbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KEphdmFDbGFzcyBqYXZhQ2xhc3MsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlKYXZhUGFja2FnZSBqYXZhUGFja2FnZSA9IChKYXZhUGFja2FnZSkgamF2YUNsYXNzLmVDb250YWluZXIoKTsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBqYXZhUGFja2FnZS5nZXROYW1lKCk7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFtdIHBrZ0ZyYWdzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGtnRnJhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKChwa2dGcmFnc1tpXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYWNrYWdlTmFtZSkpKQotCQkJCQkJcmV0dXJuIHBrZ0ZyYWdzW2ldOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIEphdmEgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBpZiB0aGUgZWxlbWVudCBpcyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCBvciBhIEphdmEKLQkgKiBjbGFzcyBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElFZGl0b3JQYXJ0IG9yIG51bGwgaWYgd3JvbmcgZWxlbWVudCB0eXBlIG9yIG9wZW5pbmcgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuSW5FZGl0b3IoSmF2YUNsYXNzIGphdmFDbGFzcywgSVByb2plY3QgYVByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIG9wZW5JbkVkaXRvcihqYXZhQ2xhc3MsIGdldEphdmFQcm9qZWN0KGFQcm9qZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBKYXZhIGVkaXRvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgaWYgdGhlIGVsZW1lbnQgaXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBKYXZhCi0JICogY2xhc3MgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJRWRpdG9yUGFydCBvciBudWxsIGlmIHdyb25nIGVsZW1lbnQgdHlwZSBvciBvcGVuaW5nIGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkluRWRpdG9yKEphdmFDbGFzcyBqYXZhQ2xhc3MsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoamF2YUNsYXNzID09IG51bGwgfHwgamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVHlwZSB0eXBlID0gZ2V0VHlwZShqYXZhQ2xhc3MpOwotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG9wZW5JbkVkaXRvcihnZXRDb21waWxhdGlvblVuaXQoamF2YUNsYXNzLCBqYXZhUHJvamVjdCkpOwotCQlyZXR1cm4gRWRpdG9yVXRpbGl0eS5vcGVuSW5FZGl0b3IodHlwZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBPcGVucyBhIEphdmEgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBpZiB0aGUgZWxlbWVudCBpcyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCBvciBhIEphdmEKLQkgKiBjbGFzcyBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElFZGl0b3JQYXJ0IG9yIG51bGwgaWYgd3JvbmcgZWxlbWVudCB0eXBlIG9yIG9wZW5pbmcgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuSW5FZGl0b3IoSmF2YUNsYXNzIGphdmFDbGFzcywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgZWRpdG9ySWQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIG9wZW5JbkVkaXRvcihnZXRDb21waWxhdGlvblVuaXQoamF2YUNsYXNzLCBqYXZhUHJvamVjdCksIGVkaXRvcklkKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIEphdmEgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBpZiB0aGUgZWxlbWVudCBpcyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCBvciBhIEphdmEKLQkgKiBjbGFzcyBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElFZGl0b3JQYXJ0IG9yIG51bGwgaWYgd3JvbmcgZWxlbWVudCB0eXBlIG9yIG9wZW5pbmcgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuSW5FZGl0b3IoSUNvbXBpbGF0aW9uVW5pdCBhQ29tcGlsYXRpb25Vbml0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBFZGl0b3JVdGlsaXR5Lm9wZW5JbkVkaXRvcihhQ29tcGlsYXRpb25Vbml0KTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIEphdmEgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBpZiB0aGUgZWxlbWVudCBpcyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCBvciBhIEphdmEKLQkgKiBjbGFzcyBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElFZGl0b3JQYXJ0IG9yIG51bGwgaWYgd3JvbmcgZWxlbWVudCB0eXBlIG9yIG9wZW5pbmcgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuSW5FZGl0b3IoSUNvbXBpbGF0aW9uVW5pdCBhQ29tcGlsYXRpb25Vbml0LCBTdHJpbmcgZWRpdG9ySWQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIG9wZW5JbkVkaXRvcihFZGl0b3JVdGlsaXR5LmdldEVkaXRvcklucHV0KGFDb21waWxhdGlvblVuaXQpLCBlZGl0b3JJZCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkluRWRpdG9yKElFZGl0b3JJbnB1dCBpbnB1dCwgU3RyaW5nIGVkaXRvcklEKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcCA9IEoyRUVVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocCAhPSBudWxsKQotCQkJCXJldHVybiBwLm9wZW5FZGl0b3IoaW5wdXQsIGVkaXRvcklELCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU0YWEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAzMCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqLwotcHVibGljIGNsYXNzIEoyRUVVSUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSUxBVU5DSEFCTEVfQ0xBU1MgPSBJTGF1bmNoYWJsZS5jbGFzczsKLQotCS8qKgotCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSjJFRVVJQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJaWYgKGFkYXB0ZXJUeXBlID09IElMQVVOQ0hBQkxFX0NMQVNTKQotCQkJCXJldHVybiBhZGFwdGFibGVPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0lMQVVOQ0hBQkxFX0NMQVNTfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSUNvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ4NmQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjcsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRVVJQ29udGV4dElkcyB7Ci0JLy9NaWdyYXRpb24gV2l6YXJkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlHUkFUSU9OX1dJWkFSRF9HRU5FUkFMID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIubWlncjEwMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlHUkFUSU9OX1dJWkFSRF9FQVIgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5taWdyMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUdSQVRJT05fV0laQVJEX0VKQiA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm1pZ3IxMTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JR1JBVElPTl9XSVpBUkRfQ01QID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIubWlncjE1MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlHUkFUSU9OX1dJWkFSRF9XRUIgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5taWdyMTIwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUdSQVRJT05fV0laQVJEX0FQUF9DTElFTlQgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5taWdyMTMwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUdSQVRJT05fV0laQVJEX0NPTk5FQ1RPUiA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm1pZ3IxNDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8JRGVsZXRlIEVudGVycHJpc2UgQmVhbiBEaWFsb2cKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRU5URVJQUklTRV9CRUFOX0RJQUxPRyA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmRlbGIxMDAwIjsgLy8kTk9OLU5MUy0xJAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDg2NWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLk1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFVUlNZXNzYWdlcyBleHRlbmRzIE1lc3NhZ2VzIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKMkVFVUlNZXNzYWdlcyBJTlNUQU5DRSA9IG5ldyBKMkVFVUlNZXNzYWdlcygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9MT0NfTEJMID0gIjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1JVTlRJTUVfTEJMID0gIjIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9WRVJTSU9OX0xCTCA9ICIzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0xPQURfRVJST1IgPSAiNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUFJPSkVDVF9XSVpfVElUTEUgPSAiNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUFJPSkVDVF9NQUlOX1BHX1RJVExFID0gIjYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BST0pFQ1RfTUFJTl9QR19ERVNDID0gIjciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BST0pFQ1RfTU9EVUxFU19QR19USVRMRSA9ICI4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QUk9KRUNUX01PRFVMRVNfUEdfREVTQyA9ICI5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QUk9KRUNUX01PRFVMRVNfUEdfU0VMRUNUID0gIjEwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QUk9KRUNUX01PRFVMRVNfUEdfREVTRUxFQ1QgPSAiMTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BST0pFQ1RfTU9EVUxFU19QR19ORVcgPSAiMTIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX1BST0pFQ1RfRk9SX01PRFVMRV9DUkVBVElPTiA9ICIxMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEhSRUVfRE9UU19FID0gIjE0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19USFJFRV9ET1RTX1cgPSAiMTRhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfTU9EVUxFVE9fRUFSX1BST0pFQ1QgPSAiMTUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX01PRF9TRUxfUEdfVElUTEUgPSAiMTYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX01PRF9TRUxfUEdfREVTQyA9ICIxNyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTU9EX1dJWl9USVRMRSA9ICIxOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTU9EX1NFTF9QR19ERUZfQlROID0gIjE5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfUFJPSl9MQkwgPSAiMjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1BST0pfTEJMID0gIjIxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QUk9KX0xCTCA9ICIyMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfUFJPSl9MQkwgPSAiMjMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX1BST0pFQ1RfV0laX1RJVExFID0gIjI0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfVkVSU0lPTl9MQkwgPSAiMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX1BST0pFQ1RfTUFJTl9QR19USVRMRSA9ICIyNSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfUFJPSkVDVF9NQUlOX1BHX0RFU0MgPSAiMjYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVElUTEUgPSAiMjciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9ERVNDID0gIjI4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX0FWQUlMQUJMRV9KQVJTID0gIjI5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX0NMQVNTUEFUSCA9ICIzMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9UQUJMRV9NT0RVTEUgPSAiMzEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVEFCTEVfUFJPSkVDVCA9ICIzMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTEJMID0gIjMzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfSU1QT1JUX01BSU5fUEdfREVTQyA9ICIzNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0lNUE9SVF9NQUlOX1BHX1RJVExFID0gIjM1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfSU1QT1JUX0ZJTEVfTEFCRUwgPSAiMzYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0lNUE9SVF9QUk9KRUNUX0xBQkVMID0gIjM3IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1dJWl9USVRMRSA9ICIzOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX01BSU5fUEdfREVTQyA9ICIzOSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX01BSU5fUEdfVElUTEUgPSAiNDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9GSUxFX0xBQkVMID0gIjQxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9WRVJXUklURV9SRVNPVVJDRVMgPSAiNDIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9QUk9KRUNUX1RZUEUgPSAiNDMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9QUk9KRUNUX1RZUEVfQklOQVJZID0gIjQ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfUFJPSkVDVF9UWVBFX1NPVVJDRSA9ICI0NSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1BBUlRJQUxfREVWRUxPUE1FTlQgPSAiNDYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9ERVNFTEVDVF9BTExfVVRJTF9CVVRUT04gPSAiNDgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9TRUxFQ1RfQUxMX1VUSUxfQlVUVE9OID0gIjQ3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfSkFSU19HUk9VUCA9ICI0OSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1NFTEVDVF9VVElMX0pBUlNfVE9fQkVfUFJPSkVDVFMgPSAiNTAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9QUk9KRUNUX1BHX0RFU0MgPSAiNTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9QUk9KRUNUX1BHX1RJVExFID0gIjUyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTE9DQVRJT05TX0dST1VQID0gIjUzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19QUk9KRUNUX0dST1VQX0RFU0NSSVBUSU9OID0gIjU0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9ERUZBVUxUX1JPT1RfUkFESU8gPSAiNTUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0FMVEVSTkFURV9ST09UX1JBRElPID0gIjU2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9ESVJFQ1RPUllfRExHID0gIjU3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfTW9kdWxlc19pbl9FQVIgPSAiNTgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9OZXdfUHJvamVjdF9OYW1lID0gIjU5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfRklMRU5BTUVTID0gIjYwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfUFJPSkVDVE5BTUVTID0gIjYxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfRVhQT1JUX0RFU1RJTkFUSU9OID0gIjYyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfRVhQT1JUX09WRVJXUklURV9DSEVDS0JPWCA9ICI2MyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKMkVFX0VYUE9SVF9TT1VSQ0VfQ0hFQ0tCT1ggPSAiNjQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9FWFBPUlRfTUFJTl9QR19USVRMRSA9ICI2NSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0VYUE9SVF9NQUlOX1BHX0RFU0MgPSAiNjYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1dJWl9USVRMRSA9ICI2NyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfRVhQT1JUX01BSU5fUEdfVElUTEUgPSAiNjgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0VYUE9SVF9NQUlOX1BHX0RFU0MgPSAiNjkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0VYUE9SVF9JTkNMVURFX1BST0pFQ1RfRklMRVMgPSAiNzAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0VYUE9SVF9JTkNMVURFX1BST0pFQ1RfRklMRVNfREVTQyA9ICI3MSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX0lOQ0xVREVfUFJPSkVDVCA9ICI3MiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX09WRVJXUklURV9ORVNURUQgPSAiNzQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1BST0pFQ1QgPSAiNzUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9QUk9KRUNUX0xBQkVMID0gIjc2IjsgLy8kTk9OLU5MUy0xJAotCi0JLy9zdHJpbmcgZm9yIG1pZ3JhdGlvbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX09DQ1VSUkVEX1RJVExFID0gIjc3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX09DQ1VSUkVEX01FU1NBR0UgPSAiNzgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklOQVJZX1BST0pFQ1QgPSAiNzkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0NBTk5PVF9CRV9QRVJGT1JNRURfT05fQklOX1BST0pFQ1QgPSAiODAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1JNQVRJT05fVUlfID0gIjgxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIT1NFTl9PUF9OT1RfQVZBSUxBQkxFID0gIjgyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0VKQl9DTElFTlRfSkFSID0gIjkwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9BTk5PVEFUSU9OUyA9ICI5MSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQU5OT1RBVElPTlNfU0VSVkxFVCA9ICI5OCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfQU5OT1RBVElPTlNfU1VQUE9SVCA9ICI5MiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9XU0VfTEFCRUwgPSAiOTMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9MQUJFTCA9ICI5NCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfQ1JFQVRFX01BSU4gPSAiOTUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0RFRkFVTFRfU0VTU0lPTl9CRUFOID0gIjk2IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9OQU1FID0gIjk5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9WRVJTSU9OX0xBQkVMID0gIjEwMCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfVVRJTElUWV9KQVJfTElTVEVBUl9JTVBPUlRfU0VMRUNUX1VUSUxfSkFSU19UT19CRV9QUk9KRUNUUyA9ICI5NyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRVhJQkxFX1BST0pFQ1RfV0laX1RJVExFID0gIkZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRVhJQkxFX1BST0pFQ1RfTUFJTl9QR19USVRMRSA9ICJGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZC5tYWluUGFnZS50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEVYSUJMRV9QUk9KRUNUX01BSU5fUEdfREVTQyA9ICJGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZC5tYWluUGFnZS5kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT01QT05FTlRfV0laX1RJVExFID0gIkVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT01QT05FTlRfTUFJTl9QR19USVRMRSA9ICJFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5tYWluUGFnZS50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09NUE9ORU5UX01BSU5fUEdfREVTQyA9ICJFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5tYWluUGFnZS5kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT01QT05FTlRfU0VDT05EX1BHX1RJVExFID0gIkVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnNlY29uZFBhZ2UudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NPTVBPTkVOVF9TRUNPTkRfUEdfREVTQyA9ICJFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5zZWNvbmRQYWdlLmRlc2MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0NPTVBPTkVOVF9XSVpfVElUTEUgPSAiQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0NPTVBPTkVOVF9NQUlOX1BHX1RJVExFID0gIkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9DT01QT05FTlRfTUFJTl9QR19ERVNDID0gIkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01QT05FTlRfV0laX1RJVExFID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01QT05FTlRfUEFHRV9USVRMRSA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01QT05FTlRfUEFHRV9ERVNDID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX1BBR0VfRUpCX01PRFVMRV9MQkwgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmVqYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBPTkVOVF9QQUdFX1dFQl9NT0RVTEVfTEJMID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5sYWJlbC53ZWIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01QT05FTlRfUEFHRV9KQ0FfTU9EVUxFX0xCTCA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwuamNhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX1BBR0VfQVBQQ0xJRU5UX01PRFVMRV9MQkwgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmFwcGNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBPTkVOVF9QQUdFX05FV19NT0RfU0VMX1BHX0RFRl9CVE4gPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmJ1dHRvbi5zZWxlY3QiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT0xERVJfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiRk9MREVSX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCUk9XU0VfQlVUVE9OX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkJST1dTRV9CVVRUT05fTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfUEFDS0FHRV9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX1BBQ0tBR0VfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiQ0xBU1NfTkFNRV9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJTVVBFUkNMQVNTX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IGdldFJlc291cmNlU3RyaW5nKCJDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfREVTQyA9IGdldFJlc291cmNlU3RyaW5nKCJDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19ERVNDIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19WQUxJREFUT1JfTUVTRyA9IGdldFJlc291cmNlU3RyaW5nKCJDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19WQUxJREFUT1JfTUVTRyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFID0gZ2V0UmVzb3VyY2VTdHJpbmcoIlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX0RFU0MgPSBnZXRSZXNvdXJjZVN0cmluZygiUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX0RFU0MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORSA9IGdldFJlc291cmNlU3RyaW5nKCJQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IGdldFJlc291cmNlU3RyaW5nKCJTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDID0gZ2V0UmVzb3VyY2VTdHJpbmcoIlNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19JTlRFUkZBQ0VTX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfSU5URVJGQUNFU19MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfUFVCTElDX0NIRUNLQk9YX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfUFVCTElDX0NIRUNLQk9YX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0FCU1RSQUNUX0NIRUNLQk9YX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01BSU5fQ0hFQ0tCT1hfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19NQUlOX0NIRUNLQk9YX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfQlVUVE9OX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkFERF9CVVRUT05fTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9CVVRUT04gPSBnZXRSZXNvdXJjZVN0cmluZygiUkVNT1ZFX0JVVFRPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBnZXRSZXNvdXJjZVN0cmluZygiSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVVUSUxfQ09NUE9ORU5UX1dJWl9USVRMRT0iSkFWQVVUSUxfQ09NUE9ORU5UX1dJWl9USVRMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBVVRJTElUWV9NQUlOX1BHX1RJVExFID0gIkpBVkFVVElMSVRZX01BSU5fUEdfVElUTEUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBVVRJTElUWV9NQUlOX1BHX0RFU0MgPSAiSkFWQVVUSUxJVFlfTUFJTl9QR19ERVNDIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVZBSUxBQkxFX0oyRUVfQ09NUE9ORU5UUz0iQVZBSUxBQkxFX0oyRUVfQ09NUE9ORU5UUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9KQVI9IkVYVEVSTkFMX0pBUiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFZBUklBQkxFPSJBRERWQVJJQUJMRSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRNVUxUSVBMRU1PRFVMRVM9IlNVUFBPUlRNVUxUSVBMRU1PRFVMRVMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VGT0xERVI9IlNPVVJDRUZPTERFUiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIElOU1RBTkNFLmRvR2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBJTlNUQU5DRS5kb0dldFJlc291cmNlU3RyaW5nKGtleSwgYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBKMkVFVUlNZXNzYWdlcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5NZXNzYWdlcyNpbml0aWFsaXplQnVuZGxlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImoyZWVfdWkiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJLy9JZ25vcmUKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDNhNmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LlBsYXRmb3JtVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSW1wb3J0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBKMkVFVUlQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgc3RhdGljIElQYXRoIGxvY2F0aW9uOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBKMkVFVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSjJFRVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlVUkwgdXJsID0gZ2V0SW5zdGFsbFVSTCgpOwotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaW5zdGFsbExvY2F0aW9uID0gKChQbGF0Zm9ybVVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpKS5nZXRVUkxBc0xvY2FsKCkuZ2V0RmlsZSgpOwotCQkJCWxvY2F0aW9uID0gbmV3IFBhdGgoaW5zdGFsbExvY2F0aW9uKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkluc3RhbGxfTG9jYXRpb25fRXJyb3JfIiwgbmV3IE9iamVjdFtde3VybH0pICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0SW5zdGFsbFVSTCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXJjaGl2ZURlZmF1bHRQcm9qZWN0TmFtZShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlpZiAoYW5BcmNoaXZlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IHR5cGUgPSBnZXRBcmNoaXZlVHlwZShhbkFyY2hpdmUpOwotCQlyZXR1cm4gZ2V0VHlwZURlZmF1bHRQcm9qZWN0TmFtZShhbkFyY2hpdmUuZ2V0VVJJKCksIHR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFyY2hpdmVEZWZhdWx0VXRpbFByb2plY3ROYW1lKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCWlmIChhbkFyY2hpdmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgdHlwZSA9IGdldEFyY2hpdmVUeXBlKGFuQXJjaGl2ZSk7Ci0JCXJldHVybiBnZXRUeXBlRGVmYXVsdFV0aWxQcm9qZWN0TmFtZShhbkFyY2hpdmUuZ2V0TmFtZSgpLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBcmNoaXZlRGVmYXVsdFByb2plY3ROYW1lKEFyY2hpdmUgYW5BcmNoaXZlLCBIYXNoU2V0IG1vZHVsZU5hbWVzKSB7Ci0JCWlmIChhbkFyY2hpdmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgdHlwZSA9IGdldEFyY2hpdmVUeXBlKGFuQXJjaGl2ZSk7Ci0JCXJldHVybiBnZXRUeXBlRGVmYXVsdFByb2plY3ROYW1lKGFuQXJjaGl2ZS5nZXRVUkkoKSwgdHlwZSwgbW9kdWxlTmFtZXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEFyY2hpdmVUeXBlKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCWludCB0eXBlID0gSW1wb3J0VXRpbC5VTktOT1dOOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlpZiAoYW5BcmNoaXZlLmlzRUpCSmFyRmlsZSgpKQotCQkJCQl0eXBlID0gSW1wb3J0VXRpbC5FSkJKQVJGSUxFOwotCQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc1dBUkZpbGUoKSkKLQkJCQkJdHlwZSA9IEltcG9ydFV0aWwuV0FSRklMRTsKLQkJCQllbHNlIGlmIChhbkFyY2hpdmUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkKLQkJCQkJdHlwZSA9IEltcG9ydFV0aWwuQ0xJRU5USkFSRklMRTsKLQkJCQllbHNlIGlmIChhbkFyY2hpdmUuaXNSQVJGaWxlKCkpCi0JCQkJCXR5cGUgPSBJbXBvcnRVdGlsLlJBUkZJTEU7Ci0JCQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzRUFSRmlsZSgpKQotCQkJCQl0eXBlID0gSW1wb3J0VXRpbC5FQVJGSUxFOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGFuQXJjaGl2ZSAhPSBudWxsKQotCQkJCWFuQXJjaGl2ZS5jbG9zZSgpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVEZWZhdWx0UHJvamVjdE5hbWUoU3RyaW5nIHRleHQsIGludCB0eXBlKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aCh0ZXh0KTsKLQkJdGV4dCA9IHBhdGgubWFrZVJlbGF0aXZlKCkucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0KLQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh0ZXh0KTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpKQotCQkJZXhpc3RzID0gdHJ1ZTsKLQkJaWYgKGV4aXN0cyAmJiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdLnRvTG93ZXJDYXNlKCkpID09IC0xKQotCQkJdGV4dCA9IHRleHQgKyBJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBqID0gMTsgaiA8IDEwOyBqKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCVN0cmluZyBpdGVyYXRlZFByb2plY3ROYW1lID0gdGV4dCArICgoaiA9PSAxKSA/ICIiIDogSW50ZWdlci50b1N0cmluZyhqKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyAhZm91bmQgJiYgKGkgPCBwcm9qZWN0cy5sZW5ndGgpOyBpKyspIHsKLQkJCQlpZiAoKHByb2plY3RzW2ldKS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShpdGVyYXRlZFByb2plY3ROYW1lKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkKLQkJCQlyZXR1cm4gaXRlcmF0ZWRQcm9qZWN0TmFtZTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZURlZmF1bHRQcm9qZWN0TmFtZShTdHJpbmcgdGV4dCwgaW50IHR5cGUsIEhhc2hTZXQgbW9kdWxlTmFtZXMpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHRleHQpOwotCQl0ZXh0ID0gcGF0aC5tYWtlUmVsYXRpdmUoKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQotCQlib29sZWFuIGlzVmFsaWROYW1lID0gbW9kdWxlTmFtZXMuYWRkKHRleHQpOwotCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHRleHQpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0JCQlleGlzdHMgPSB0cnVlOwotCQlpZiAoIWlzVmFsaWROYW1lIHx8IChleGlzdHMgJiYgdGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoSW1wb3J0VXRpbC5TVUZGSVhFU1t0eXBlXS50b0xvd2VyQ2FzZSgpKSA9PSAtMSkpCi0JCQl0ZXh0ID0gdGV4dCArIEltcG9ydFV0aWwuU1VGRklYRVNbdHlwZV07Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGogPSAxOyBqIDwgMTA7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJU3RyaW5nIGl0ZXJhdGVkUHJvamVjdE5hbWUgPSB0ZXh0ICsgKChqID09IDEpID8gIiIgOiBJbnRlZ2VyLnRvU3RyaW5nKGopKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiAoaSA8IHByb2plY3RzLmxlbmd0aCk7IGkrKykgewotCQkJCWlmICgocHJvamVjdHNbaV0pLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGl0ZXJhdGVkUHJvamVjdE5hbWUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKQotCQkJCXJldHVybiBpdGVyYXRlZFByb2plY3ROYW1lOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8vIHRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgYXJlIHVzZWQgYnkgd2ViIGVkaXRvcgotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGVEZWZhdWx0VXRpbFByb2plY3ROYW1lKFN0cmluZyB0ZXh0LCBpbnQgdHlwZSkgewotCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcodGV4dC5sYXN0SW5kZXhPZihqYXZhLmlvLkZpbGUuc2VwYXJhdG9yKSArIDEpOwotCQlpbnQgaSA9IHRleHQubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGkgPiAwKQotCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGkpOwotCQlpZiAodGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoSW1wb3J0VXRpbC5TVUZGSVhFU1t0eXBlXS50b0xvd2VyQ2FzZSgpKSA9PSAtMSkKLQkJCXRleHQgPSB0ZXh0ICsgSW1wb3J0VXRpbC5TVUZGSVhFU1t0eXBlXTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCVN0cmluZyBpdGVyYXRlZFByb2plY3ROYW1lID0gdGV4dCArICgoaiA9PSAwKSA/ICIiIDogSW50ZWdlci50b1N0cmluZyhqKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaSA9IDA7ICFmb3VuZCAmJiAoaSA8IHByb2plY3RzLmxlbmd0aCk7IGkrKykgewotCQkJCWlmICgocHJvamVjdHNbaV0pLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGl0ZXJhdGVkUHJvamVjdE5hbWUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKQotCQkJCXJldHVybiBpdGVyYXRlZFByb2plY3ROYW1lOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEdldCBhIC5naWYgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsIHx8IGltYWdlLmlzRGlzcG9zZWQoKSkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3Ioa2V5KTsKLQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlpbWFnZSA9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGltYWdlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJVVJMIGdpZkltYWdlVVJMID0gZ2V0SW1hZ2VVUkwoa2V5KTsKLQkJaWYgKGdpZkltYWdlVVJMICE9IG51bGwpCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChnaWZJbWFnZVVSTCk7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFVSTCBnZXRJbWFnZVVSTChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldEltYWdlVVJMKGtleSwgZ2V0QnVuZGxlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBnZXRQbHVnaW5Xb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdvcmtiZW5jaAotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBqMmVlIHBsdWdpbiBhbmQgbXVzdCBub3QgYmUgY2FsbGVkIGJ5IGFueSBvdGhlciBwbHVnaW5zLgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoIGdldFBsdWdpbldvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlQbHVnaW5JY29ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlQbHVnaW5JY29ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQwODQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJUGx1Z2luSWNvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDEwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVUlQbHVnaW5JY29ucyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIgPSAiaW1wb3J0X2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0lNUE9SVF9XSVpBUkRfQkFOTkVSID0gImltcG9ydF9yYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9JTVBPUlRfV0laQVJEX0JBTk5FUiA9ICJpbXBvcnRfZWpiamFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0lNUE9SVF9XSVpBUkRfQkFOTkVSID0gImltcG9ydF9hcHBjbGllbnRfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTVBPUlRfV0laQVJEX0JBTk5FUiA9ICJpbXBvcnRfd2FyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfV0laX0JBTk5FUiA9ICJlYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfUFJPSkVDVF9XSVpBUkRfQkFOTkVSID0gImFwcGNsaWVudF93aXoiOyAvLyROT04tTkxTLTEkCi0JLy9FSkIgSWNvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUFJPSkVDVF9XSVpBUkRfQkFOTkVSID0gImVqYnByb2plY3Rfd2l6IjsgLy8kTk9OLU5MUy0xJAotCS8vV0VCIEljb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BST0pFQ1RfV0laQVJEX0JBTk5FUiA9ICJ3YXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCS8vSkNBIEljb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX1BST0pFQ1RfV0laQVJEX0JBTk5FUiA9ICJjb25uZWN0b3Jfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfRVhQT1JUX1dJWkFSRF9CQU5ORVIgPSAiZXhwb3J0X2FwcGNsaWVudF93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0VYUE9SVF9XSVpBUkRfQkFOTkVSID0gImV4cG9ydF9lamJqYXJfb2JqIjsgLy8kTk9OLU5MUy0xJDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfRVhQT1JUX1dJWkFSRF9CQU5ORVIgPSAiZXhwb3J0X3dhcl93aXoiOyAvLyROT04tTkxTLTEkOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9FWFBPUlRfV0laQVJEX0JBTk5FUiA9ICJleHBvcnRfcmFyX3dpeiI7IC8vJE5PTi1OTFMtMSQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0VYUE9SVF9XSVpBUkRfQkFOTkVSID0gImV4cG9ydF9lYXJfd2l6IjsgLy8kTk9OLU5MUy0xJDsKLQotCS8vTWlncmF0aW9uIFdpemFyZCBJY29ucwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklOR19UQVNLID0gInNob3d3YXJuX3RzayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9CQU5ORVIgPSAiZWpiY2xpZW50amFyX3dpemJhbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JR1JBVElPTl9XSVpBUkRfQkFOTkVSID0gInZlcnNpb25taWdyYXRlM193aXoiOyAvLyROT04tTkxTLTEkCi0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVZpZXdlclNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYzg0ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVmlld2VyU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLXB1YmxpYyBjbGFzcyBKMkVFVmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFVmlld2VyU29ydGVyLgotCSAqLwotCXB1YmxpYyBKMkVFVmlld2VyU29ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0KLQkvKioKLQkgKiBAc2VlIFZpZXdlclNvcnRlciNjb21wYXJlKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWlmIChzaG91bGRTb3J0KGUxLCBlMikpCi0JCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JCXJldHVybiAwOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW50ZXJwcmlzZUJlYW4oT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChPYmplY3QgbykgewotCQlyZXR1cm4gQ29tbW9uVXRpbC5pc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTb3J0KE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCXJldHVybiAoaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoZTEpICYmIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KGUyKSkgfHwgKGlzRW50ZXJwcmlzZUJlYW4oZTEpICYmIGlzRW50ZXJwcmlzZUJlYW4oZTIpKSB8fCAoKGUxIGluc3RhbmNlb2YgSUZpbGUpICYmIChlMiBpbnN0YW5jZW9mIElGaWxlKSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL1VJUHJvamVjdFV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9VSVByb2plY3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViMTMxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL1VJUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIFVJUHJvamVjdFV0aWxpdGllcyB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBmaXJzdCBwcm9qZWN0IChyZWdhcmRsZXNzIG9mIG5hdHVyZSkgaW4gdGhlIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0U2VsZWN0ZWRQcm9qZWN0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZ2V0U2VsZWN0ZWRQcm9qZWN0KHNlbGVjdGlvbiwgKFN0cmluZykgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JICogQHBhcmFtIGV4cGVjdGVkTmF0dXJlSWQKLQkgKiAgICAgICAgICAgIFRoZSByZXF1aXJlZCBOYXR1cmUgSUQKLQkgKiBAcmV0dXJuIFRoZSBmaXJzdCBwcm9qZWN0LCBvbmx5IGlmIHRoZSBmaXJzdCBwcm9qZWN0IGhhcyB0aGUgZ2l2ZW4gbmF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRTZWxlY3RlZFByb2plY3QoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZXhwZWN0ZWROYXR1cmVJZCkgewotCi0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKS5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCU9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBvYmo7Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlcikgewotCQkJCU9iamVjdCB0ZW1wID0gKChJdGVtUHJvdmlkZXIpIG9iaikuZ2V0UGFyZW50KEVPYmplY3QuY2xhc3MpOwotCQkJCWlmICh0ZW1wICE9IG51bGwgJiYgdGVtcCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCXByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoKEVPYmplY3QpIHRlbXApOwotCQkJfQotCi0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGV4cGVjdGVkTmF0dXJlSWQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShleHBlY3RlZE5hdHVyZUlkKSkKLQkJCQkJCXJldHVybiBwcm9qZWN0OwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gcG9zc2libGVOYXR1cmVJZHMKLQkgKiAgICAgICAgICAgIEEgbGlzdCBvZiBwb3NzaWJsZSBuYXR1cmUgaWRzCi0JICogQHJldHVybiBUaGUgZmlyc3QgcHJvamVjdCBzZWxlY3RlZCwgb25seSBpZiBpdCBoYXMgQVQgTEVBU1QgT05FIG9mIHRoZSBwb3NzaWJsZSBuYXR1cmUgaWRzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRTZWxlY3RlZFByb2plY3QoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmdbXSBwb3NzaWJsZU5hdHVyZUlkcykgewotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBvYmo7Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwb3NzaWJsZU5hdHVyZUlkcyAhPSBudWxsICYmIHBvc3NpYmxlTmF0dXJlSWRzLmxlbmd0aCA+IDApIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc3NpYmxlTmF0dXJlSWRzLmxlbmd0aDsgaSsrKQotCQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKHBvc3NpYmxlTmF0dXJlSWRzW2ldKSkKLQkJCQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JICogQHJldHVybiBBbGwgc2VsZWN0ZWQgUHJvamVjdHMsIHJlZ2FyZGxlc3Mgb2YgbmF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEFsbFNlbGVjdGVkUHJvamVjdHMoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBnZXRBbGxTZWxlY3RlZFByb2plY3RzKHNlbGVjdGlvbiwgKFN0cmluZykgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JICogQHBhcmFtIGV4cGVjdGVkTmF0dXJlSWQKLQkgKiAgICAgICAgICAgIFRoZSBleHBlY3RlZCBuYXR1cmUgaWQKLQkgKiBAcmV0dXJuIEFsbCBzZWxlY3RlZCBQcm9qZWN0cyB3aGljaCBoYXZlIHRoZSBleHBlY3RlZCBuYXR1cmUgaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsU2VsZWN0ZWRQcm9qZWN0cyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZyBleHBlY3RlZE5hdHVyZUlkKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQlMaXN0IHByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3Igc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlvYmogPSBzZWxlY3Rpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBvYmo7Ci0JCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBvYmopLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCXByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoKEVPYmplY3QpIG9iaik7Ci0KLQkJCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGV4cGVjdGVkTmF0dXJlSWQgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCi0JCQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoZXhwZWN0ZWROYXR1cmVJZCkpCi0JCQkJCQkJcHJvamVjdHMuYWRkKHByb2plY3QpOwotCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy9JZ25vcmUKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlwcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQl9Ci0JCQlJUHJvamVjdFtdIGZpbmFsUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHMuc2l6ZSgpXTsKLQkJCXByb2plY3RzLnRvQXJyYXkoZmluYWxQcm9qZWN0cyk7Ci0JCQlyZXR1cm4gZmluYWxQcm9qZWN0czsKLQkJfQotCQlyZXR1cm4gbmV3IElQcm9qZWN0WzBdOwotCX0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JICogQHBhcmFtIHBvc3NpYmxlTmF0dXJlSWRzCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgcG9zc2libGUgbmF0dXJlIGlkcwotCSAqIEByZXR1cm4gQWxsIHNlbGVjdGVkIFByb2plY3RzIHdoaWNoIGhhdmUgQVQgTEVBU1QgT05FIG9mIHRoZSBnaXZlbiBuYXR1cmUgaWRzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEFsbFNlbGVjdGVkUHJvamVjdHMoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmdbXSBwb3NzaWJsZU5hdHVyZUlkcykgewotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBvYmogPSBudWxsOwotCQkJTGlzdCBwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUl0ZXJhdG9yIHNlbGVjdGlvbkl0ZXJhdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoc2VsZWN0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJb2JqID0gc2VsZWN0aW9uSXRlcmF0b3IubmV4dCgpOwotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQkJcHJvamVjdCA9IChJUHJvamVjdCkgb2JqOwotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCQlwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBvYmopOwotCi0JCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwb3NzaWJsZU5hdHVyZUlkcyAhPSBudWxsICYmIHBvc3NpYmxlTmF0dXJlSWRzLmxlbmd0aCA+IDApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGVOYXR1cmVJZHMubGVuZ3RoOyBpKyspCi0JCQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKHBvc3NpYmxlTmF0dXJlSWRzW2ldKSkKLQkJCQkJCQkJcHJvamVjdHMuYWRkKHByb2plY3QpOwotCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy9JZ25vcmUKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlwcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQl9Ci0JCQlJUHJvamVjdFtdIGZpbmFsUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHMuc2l6ZSgpXTsKLQkJCXByb2plY3RzLnRvQXJyYXkoZmluYWxQcm9qZWN0cyk7Ci0JCQlyZXR1cm4gZmluYWxQcm9qZWN0czsKLQkJfQotCQlyZXR1cm4gbmV3IElQcm9qZWN0WzBdOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhODhmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5Hcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7Ci0JcHJvdGVjdGVkIE1ldGhvZHNQcm92aWRlckRlbGVnYXRlIG1ldGhvZHNQcm92aWRlckRlbGVnYXRlOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MgPSBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3M7Ci0JcHJvdGVjdGVkIExpc3Qgcm9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBKMkVFQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEoyRUVBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCW1ldGhvZHNQcm92aWRlckRlbGVnYXRlID0gbmV3IE1ldGhvZHNQcm92aWRlckRlbGVnYXRlKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihvYmplY3QpKQotCQkJcmV0dXJuIG1ldGhvZHNQcm92aWRlckRlbGVnYXRlLmdldFBhcmVudChvYmplY3QpOwotCi0JCS8vQWRkZWQgc28gaW50ZXJuYWxFeHBhbmQoKSBpbiBBYnN0cmFjdFRyZWVWaWV3ZXIga25vd3MgdGhhdCBFSkIncyBwYXJlbnQgaXMgbm93IGluc3RhbmNlCi0JCS8vIG9mIEoyRUVJdGVtUHJvdmlkZXIKLQkJLy9yYXRoZXIgdGhhbiBFSkJKYXIgb25seSBpZiBiZWFuIGlzIHJvb3QgYmVhbgotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4gJiYgR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5pc1Jvb3RCZWFuKChFbnRlcnByaXNlQmVhbikgb2JqZWN0KSkgewotCQkJSjJFRUl0ZW1Qcm92aWRlciBwcm92aWRlciA9IEdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXIuZ2V0RUpCSXRlbVByb3ZpZGVyKChFbnRlcnByaXNlQmVhbikgb2JqZWN0KTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCi0JCS8vCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJLy8JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJLy8JCQkJcmV0dXJuIEoyRUVSb290Lmluc3RhbmNlKCkuZ3JvdXBGb3IoKEVPYmplY3QpIG9iamVjdCk7Ci0JCS8vCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFTUZFZGl0T2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHRyZWVJdGVtQ29udGVudFByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJDbGFzcyk7Ci0JCXJldHVybiB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0KLQkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihwYXJlbnRFbGVtZW50KSkKLQkJCXJldHVybiBtZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQkJZWxzZSBpZiAoaXNFTUZFZGl0T2JqZWN0KHBhcmVudEVsZW1lbnQpKQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRSb290cyhpbnB1dEVsZW1lbnQpOwotCQkvLwkJZWxzZSBpZiAoTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUucHJvdmlkZXNDb250ZW50Rm9yKGlucHV0RWxlbWVudCkpCi0JCS8vCQkJcmV0dXJuIG1ldGhvZHNQcm92aWRlckRlbGVnYXRlLmdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCS8vCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Um9vdHMoT2JqZWN0IHBhcmVudCkgewotCQlpZiAocm9vdHMuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBqMmVlR3JvdXBzID0gc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCXJvb3RzLmFkZEFsbChBcnJheXMuYXNMaXN0KGoyZWVHcm91cHMpKTsKLQkJfQotCQlyZXR1cm4gcm9vdHMudG9BcnJheSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihlbGVtZW50KSkKLQkJCXJldHVybiBtZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQkJZWxzZSBpZiAoaXNFTUZFZGl0T2JqZWN0KGVsZW1lbnQpKQotCQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZHNQcm92aWRlckRlbGVnYXRlICE9IG51bGwpCi0JCQltZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlzdXBlci5pbnB1dENoYW5nZWQoYVZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJbWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuaW5wdXRDaGFuZ2VkKGFWaWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzY4NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSAxMDo0MDo0MSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciB7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSUl0ZW1MYWJlbFByb3ZpZGVyQ2xhc3MgPSBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIFJPTEVfTkFNRV9TRiA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBST0xFU19TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRNZXRob2RQZXJtaXNzaW9uX1JvbGVzKCk7Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCBmb3IgZGVsZWdhdGlvbiB0byBnZXQgbGFiZWxzIGZvciBzZXJ2ZXIgb2JqZWN0cywgd2hpY2ggZG9uJ3QgZml0IGludG8gRU1GIGVkaXQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2JlbmNoTGFiZWxQcm92aWRlciB3YkxhYmVsUHJvdmlkZXI7Ci0KLQlwdWJsaWMgSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXdiTGFiZWxQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXJldHVybiAoKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgb2JqZWN0KS5nZXRJbWFnZSgpOwotCQllbHNlIGlmIChpc0VNRkVkaXRPYmplY3Qob2JqZWN0KSkKLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSkKLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZSgoKEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKSBvYmplY3QpLmVqYik7Ci0JCXJldHVybiB3YkxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpCi0JCQlyZXR1cm4gKChKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIG9iamVjdCkuZ2V0VGV4dCgpOwotCQllbHNlIGlmIChpc0VNRkVkaXRPYmplY3Qob2JqZWN0KSkgewotCQkJaWYgKENvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3Qob2JqZWN0KSkKLQkJCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlcGxveW1lbnRfRGVzY3JpcHRvcl9VSV8iKSArICI6ICIgKyBzdXBlci5nZXRUZXh0KG9iamVjdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dCgoKEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKSBvYmplY3QpLmVqYik7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlyZXR1cm4gKChJRmlsZSkgb2JqZWN0KS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gd2JMYWJlbFByb3ZpZGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VNRkVkaXRPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlJSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsIElJdGVtTGFiZWxQcm92aWRlckNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIjbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClPYmplY3QsCi0JICogICAgICBpbnQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoZmVhdHVyZSA9PSBST0xFX05BTUVfU0YgfHwgZmVhdHVyZSA9PSBST0xFU19TRikKLQkJCWZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MzU1Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyLkFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFTm90aWZpY2F0aW9uSW1wbDsKLQotcHVibGljIGNsYXNzIEoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0KLQlwcm90ZWN0ZWQgTWFwIGNoaWxkcmVuID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgTGlzdCByZXNvdXJjZUFkYXB0ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgbG9jYWxDaGlsZHJlbiA9IChMaXN0KSBjaGlsZHJlbi5nZXQob2JqZWN0KTsKLQkJaWYgKGxvY2FsQ2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybiBpbml0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJcmV0dXJuIGxvY2FsQ2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgaW5pdENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQXBwbGljYXRpb24gYXBwID0gKEFwcGxpY2F0aW9uKSBvYmplY3Q7Ci0JCUxpc3QgbG9jYWxDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCS8vIE1ERTogY2hhbmdlZCBnZXRQYXJlbnQob2JqZWN0KSB0byBqdXN0IGFwcAotCQlsb2NhbENoaWxkcmVuLmFkZChuZXcgTW9kdWxlc0l0ZW1Qcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpLCBudWxsLCBudWxsLCBhcHAsIGFwcC5nZXRNb2R1bGVzKCkpKTsKLQotLy8JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoYXBwKTsKLS8vCQlJVmlydHVhbENvbXBvbmVudCBlYXIgPSBDb21wb25lbnRVdGlsaXRpZXMuZmluZENvbXBvbmVudChhcHApOwotCQkvL1RPRE8gc3dpdGNoIHRvIHJldHJpZXZlIHJlZmVyZW5jZUNvbXBvbmVudHMKLS8vCQlFQVJFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLS8vCQl0cnkgewotLy8JCQlFQVJOYXR1cmVSdW50aW1lIHJ1bnRpbWUgPSBFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdCk7Ci0vLwkJCWlmIChydW50aW1lICE9IG51bGwpIHsKLS8vCQkJCWVkaXRNb2RlbCA9IHJ1bnRpbWUuZ2V0RWFyRWRpdE1vZGVsRm9yUmVhZCh0aGlzKTsKLS8vCQkJCUVBUlByb2plY3RNYXAgbWFwID0gZWRpdE1vZGVsLmdldEVBUlByb2plY3RNYXAoKTsKLS8vCQkJCWxvY2FsQ2hpbGRyZW4uYWRkKG1hcCk7Ci0vLwkJCQltYXAuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKGdldE5ld0FkYXB0ZXIoYXBwKSk7Ci0vLwkJCX0KLS8vCQl9IGZpbmFsbHkgewotLy8JCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpCi0vLwkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLS8vCQl9Ci0JCWxvY2FsQ2hpbGRyZW4uYWRkKG5ldyBKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlcihhcHAsIGdldEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMpKTsKLQotCQljaGlsZHJlbi5wdXQob2JqZWN0LCBsb2NhbENoaWxkcmVuKTsKLQkJcmV0dXJuIGxvY2FsQ2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIE1vZHVsZXNJdGVtUHJvdmlkZXIgZ2V0TW9kdWxlc05vZGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKE1vZHVsZXNJdGVtUHJvdmlkZXIpICgoTGlzdCkgZ2V0Q2hpbGRyZW4ob2JqZWN0KSkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBBZGFwdGVyI25vdGlmeUNoYW5nZWQobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpTm90aWZpZXIsCi0JICogICAgICBpbnQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRU9iamVjdCwgT2JqZWN0LCBPYmplY3QsIGludCkpCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFwcGxpY2F0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVMgOgotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WSU5HX0FEQVBURVIgJiYgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkgPT0gdGhpcykKLQkJCWNoaWxkcmVuLnJlbW92ZShub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gQXBwbGljYXRpb25GYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpKQotCQkJbW9kdWxlc0NoYW5nZWQoKEFwcGxpY2F0aW9uKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpLCBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSwgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXRQb3NpdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb2R1bGVzQ2hhbmdlZChBcHBsaWNhdGlvbiBhcHAsIGludCBldmVudFR5cGUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCU1vZHVsZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRNb2R1bGVzTm9kZShhcHApOwotCQlDb2xsZWN0aW9uIGdyYW5kQ2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbigpOwotCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDogewotCQkJCWdyYW5kQ2hpbGRyZW4uYWRkKG5ld1ZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDogewotCQkJCWdyYW5kQ2hpbGRyZW4uYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOiB7Ci0JCQkJZ3JhbmRDaGlsZHJlbi5yZW1vdmUob2xkVmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOiB7Ci0JCQkJZ3JhbmRDaGlsZHJlbi5yZW1vdmVBbGwoKENvbGxlY3Rpb24pIG9sZFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUxpc3QgYWRhcHRlcnMgPSBnZXRSZXNvdXJjZUFkYXB0ZXJzKCk7Ci0JCVJlc291cmNlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5zaXplKCk7IGkrKykgewotCQkJYWRhcHRlciA9IChSZXNvdXJjZUFkYXB0ZXIpIGFkYXB0ZXJzLmdldChpKTsKLQkJCWFkYXB0ZXIuZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQotCQlwcml2YXRlIEFwcGxpY2F0aW9uIGFwcCA9IG51bGw7Ci0KLQkJcHVibGljIFJlc291cmNlQWRhcHRlcihBcHBsaWNhdGlvbiBhcHApIHsKLQkJCXRoaXMuYXBwID0gYXBwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0KLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQgJiYgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChudWxsKSA9PSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEICYmICFyZXMuaXNMb2FkZWQoKSkgewotCQkJCUoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlci50aGlzLmNoaWxkcmVuLnJlbW92ZShhcHApOwotCQkJCXJlcy5lQWRhcHRlcnMoKS5yZW1vdmUoUmVzb3VyY2VBZGFwdGVyLnRoaXMpOwotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBKMkVFTm90aWZpY2F0aW9uSW1wbChhcHAsIE5vdGlmaWNhdGlvbi5NT1ZFLCAoT2JqZWN0KSBudWxsLCAoT2JqZWN0KSBudWxsLCAwKSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZUFkYXB0ZXIgZ2V0TmV3QWRhcHRlcihBcHBsaWNhdGlvbiBrZXkpIHsKLQkJUmVzb3VyY2VBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUmVzb3VyY2VBZGFwdGVyKGtleSk7Ci0JCWdldFJlc291cmNlQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VBZGFwdGVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZXNvdXJjZUFkYXB0ZXJzKCkgewotCQlpZiAocmVzb3VyY2VBZGFwdGVycyA9PSBudWxsKQotCQkJcmVzb3VyY2VBZGFwdGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHJlc291cmNlQWRhcHRlcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODNkMTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlci5BcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVBcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBKMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkjY3JlYXRlQXBwbGljYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFRWRpdGluZ0RvbWFpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVFZGl0aW5nRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDdiZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVFZGl0aW5nRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlUb0NsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuT3ZlcnJpZGVhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVwbGFjZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQ3VzdG9tIGVkaXRpbmcgZG9tYWluIHdoaWNoIHByb3ZpZGVzIGhvb2tzIGZvciBjcmVhdGluZyBvdmVycmlkZSBjb21tYW5kczsgc2hvdWxkIG5vdCBiZSB1c2VkCi0gKiBkaXJlY3RseSBidXQgY2FuIGJlIHN1YmNsYXNzZWQgdG8gb3ZlcnJpZGUgY29tbWFuZHMgYXMgbmVjZXNzYXJ5LiBBbGwgdGhlIG92ZXJyaWRlIG1ldGhvZHMgYnkKLSAqIGRlZmF1bHQgcmV0dXJuIG51bGwsIHNvIGEgc3ViY2xhc3MgbWF5IG92ZXJyaWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGNvbW1hbmRzLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUVkaXRpbmdEb21haW4gZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gewotCS8qKgotCSAqIEoyRUVFZGl0aW5nRG9tYWluIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIENvbW1hbmRTdGFjawotCSAqLwotCXB1YmxpYyBKMkVFRWRpdGluZ0RvbWFpbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRPdmVycmlkZUNvbW1hbmQoQWRkQ29tbWFuZCBhZGRDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChDb3B5VG9DbGlwYm9hcmRDb21tYW5kIGNvcHlUb0NsaXBib2FyZENvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgbm90IHRvIG92ZXJyaWRlIHRoaXMgY29tbWFuZDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weU92ZXJyaWRlQ29tbWFuZChDcmVhdGVDb3B5Q29tbWFuZCBjcmVhdGVDb3B5Q29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcE92ZXJyaWRlQ29tbWFuZChEcmFnQW5kRHJvcENvbW1hbmQgZHJhZ0FuZERyb3BDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5T3ZlcnJpZGVDb21tYW5kKEluaXRpYWxpemVDb3B5Q29tbWFuZCBpbml0aWFsaXplQ29weUNvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgbm90IHRvIG92ZXJyaWRlIHRoaXMgY29tbWFuZDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZU92ZXJyaWRlQ29tbWFuZChNb3ZlQ29tbWFuZCBtb3ZlQ29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVPdmVycmlkZUNvbW1hbmQoT3ZlcnJpZGVhYmxlQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJQWRkQ29tbWFuZCBhZGRDb21tYW5kID0gKEFkZENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlyZXR1cm4gY3JlYXRlQWRkT3ZlcnJpZGVDb21tYW5kKGFkZENvbW1hbmQpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQlSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoUmVtb3ZlQ29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVSZW1vdmVPdmVycmlkZUNvbW1hbmQocmVtb3ZlQ29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFNldENvbW1hbmQpIHsKLQkJCVNldENvbW1hbmQgc2V0Q29tbWFuZCA9IChTZXRDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZVNldE92ZXJyaWRlQ29tbWFuZChzZXRDb21tYW5kKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUmVwbGFjZUNvbW1hbmQpIHsKLQkJCVJlcGxhY2VDb21tYW5kIHJlcGxhY2VDb21tYW5kID0gKFJlcGxhY2VDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZVJlcGxhY2VPdmVycmlkZUNvbW1hbmQocmVwbGFjZUNvbW1hbmQpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBNb3ZlQ29tbWFuZCkgewotCQkJTW92ZUNvbW1hbmQgbW92ZUNvbW1hbmQgPSAoTW92ZUNvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlyZXR1cm4gY3JlYXRlTW92ZU92ZXJyaWRlQ29tbWFuZChtb3ZlQ29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZUNvcHlDb21tYW5kKSB7Ci0JCQlDcmVhdGVDb3B5Q29tbWFuZCBjcmVhdGVDb3B5Q29tbWFuZCA9IChDcmVhdGVDb3B5Q29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVDcmVhdGVDb3B5T3ZlcnJpZGVDb21tYW5kKGNyZWF0ZUNvcHlDb21tYW5kKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgSW5pdGlhbGl6ZUNvcHlDb21tYW5kKSB7Ci0JCQlJbml0aWFsaXplQ29weUNvbW1hbmQgaW5pdGlhbGl6ZUNvcHlDb21tYW5kID0gKEluaXRpYWxpemVDb3B5Q29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVJbml0aWFsaXplQ29weU92ZXJyaWRlQ29tbWFuZChpbml0aWFsaXplQ29weUNvbW1hbmQpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb3B5VG9DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCQlDb3B5VG9DbGlwYm9hcmRDb21tYW5kIGNvcHlUb0NsaXBib2FyZENvbW1hbmQgPSAoQ29weVRvQ2xpcGJvYXJkQ29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQoY29weVRvQ2xpcGJvYXJkQ29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgcGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCA9IChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChwYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BDb21tYW5kKSB7Ci0JCQlEcmFnQW5kRHJvcENvbW1hbmQgZHJhZ0FuZERyb3BDb21tYW5kID0gKERyYWdBbmREcm9wQ29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVEcmFnQW5kRHJvcE92ZXJyaWRlQ29tbWFuZChkcmFnQW5kRHJvcENvbW1hbmQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBwYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZU92ZXJyaWRlQ29tbWFuZChSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgbm90IHRvIG92ZXJyaWRlIHRoaXMgY29tbWFuZDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVwbGFjZU92ZXJyaWRlQ29tbWFuZChSZXBsYWNlQ29tbWFuZCByZXBsYWNlQ29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVTZXRPdmVycmlkZUNvbW1hbmQoU2V0Q29tbWFuZCBzZXRDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTI3MDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIEoyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIE1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuCi0JICovCi0JcHVibGljIEoyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZW1hcEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUVBUlByb2plY3RNYXBBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQVJQcm9qZWN0TWFwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBKMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlcih0aGlzLCBmYWxzZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVQcm92aWRlclV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFUHJvdmlkZXJVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzliYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVQcm92aWRlclV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgSjJFRVByb3ZpZGVyVXRpbGl0eSB7Ci0KLQlwcml2YXRlIEoyRUVQcm92aWRlclV0aWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlcGVuZFByb2plY3ROYW1lKEVPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbGFiZWwpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gbnVsbDsKLQkJaWYgKG9iamVjdC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UHJvamVjdChvYmplY3QuZVJlc291cmNlKCkpOwotCQkJaWYgKHByb2ogIT0gbnVsbCkKLQkJCQlwcm9qZWN0TmFtZSA9IHByb2ouZ2V0TmFtZSgpOwotCQl9Ci0KLQkJaWYgKHByb2plY3ROYW1lID09IG51bGwgfHwgcHJvamVjdE5hbWUuZXF1YWxzKGxhYmVsKSkKLQkJCXJldHVybiBsYWJlbDsKLQkJZWxzZSBpZiAobGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHByb2plY3ROYW1lOwotCQllbHNlCi0JCQlyZXR1cm4gcHJvamVjdE5hbWUgKyAiOiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVVJRWRpdGluZ0RvbWFpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVSUVkaXRpbmdEb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlNjMwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVVJRWRpdGluZ0RvbWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlUb0NsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kLkoyRUVDbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZC5KMkVFQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQuSjJFRVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kLkoyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVVSUVkaXRpbmdEb21haW4gZXh0ZW5kcyBKMkVFRWRpdGluZ0RvbWFpbiB7Ci0JLyoqCi0JICogSjJFRVVJRWRpdGluZ0RvbWFpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBDb21tYW5kU3RhY2sKLQkgKi8KLQlwdWJsaWMgSjJFRVVJRWRpdGluZ0RvbWFpbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrKTsKLQkJdHVyblRyYWNlT25JZkRlYnVnZ2luZygpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChDb3B5VG9DbGlwYm9hcmRDb21tYW5kIGNvcHlUb0NsaXBib2FyZENvbW1hbmQpIHsKLQotCQlpZiAoY29weVRvQ2xpcGJvYXJkQ29tbWFuZCBpbnN0YW5jZW9mIEoyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBKMkVFQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKGNvcHlUb0NsaXBib2FyZENvbW1hbmQpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIHBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJaWYgKHBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgaW5zdGFuY2VvZiBKMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGdldENsaXBib2FyZCgpIGluc3RhbmNlb2YgSjJFRUNsaXBib2FyZCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBKMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKHBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZU92ZXJyaWRlQ29tbWFuZChSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBKMkVFUmVtb3ZlT3ZlcnJpZGVDb21tYW5kKHJlbW92ZUNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBKMkVFQ2xpcGJvYXJkIGdldEoyRUVDbGlwYm9hcmQoKSB7Ci0JCXJldHVybiAoSjJFRUNsaXBib2FyZCkgZ2V0Q2xpcGJvYXJkKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHR1cm5UcmFjZU9uSWZEZWJ1Z2dpbmcoKSB7Ci0JCS8vQWJzdHJhY3RDb21tYW5kLlRyYWNlLmVuYWJsZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWY1MTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmNvbXBvbmVudGNvcmUudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBKMkVFSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVUSUxJVFlfSkFSUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJVdGlsaXR5X0pBUnNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBjaGlsZHJlbkxvYWRlZCA9IGZhbHNlOwotCXByaXZhdGUgQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyBKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlcihBcHBsaWNhdGlvbiBhcHAsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgcGFyZW50KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJc2V0UGFyZW50KHBhcmVudCk7Ci0JCWFwcGxpY2F0aW9uID0gYXBwOwotCQlVdGlsaXR5SmFyUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5JTlNUQU5DRS5hZGRVdGlsaXR5SmFySXRlbVByb3ZpZGVyKFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhcHBsaWNhdGlvbiksIHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJcmV0dXJuICFjaGlsZHJlbi5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oZmluYWwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIWNoaWxkcmVuTG9hZGVkKSB7Ci0JCQl0cnkgewotCQkJCWRpc2FibGVOb3RpZmljYXRpb24oKTsKLQkJCQlvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJY29tcHV0ZUNoaWxkcmVuKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZW5hYmxlTm90aWZpY2F0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJVXRpbGl0eUphclJlc291cmNlQ2hhbmdlTGlzdGVuZXIuSU5TVEFOQ0UucmVtb3ZlVXRpbGl0eUphckl0ZW1Qcm92aWRlcihQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoYXBwbGljYXRpb24pLCB0aGlzKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29tcHV0ZUNoaWxkcmVuKCkgewotCQljaGlsZHJlbkxvYWRlZCA9IHRydWU7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGVhciA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kQ29tcG9uZW50KGFwcGxpY2F0aW9uKTsKLQkJaWYgKGVhciE9bnVsbCkgewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBtb2R1bGVzID0gZWFyLmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxtb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlID0gbW9kdWxlc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYgKG1vZHVsZS5nZXRQcm9qZWN0KCkgPT0gbnVsbCB8fCAhbW9kdWxlLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gcmV0dXJuIG9ubHkgamFycyBmb3IgdXRpbGl0eSBjb21wb25lbnRzCi0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QobW9kdWxlLmdldFByb2plY3QoKSkpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhcHBsaWNhdGlvbik7Ci0JCQkJCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJLy8gd2Ugd2lsbCBhc3N1bWUgdGhlIGNvbXBvbmVudCBuYW1lIGlzIGluIHN5bmNoIHdpdGggdGhlIG1vZHVsZSB1cmkKLQkJCQkJSUZpbGUgdXRpbGl0eUphciA9IHByb2plY3QuZ2V0RmlsZShtb2R1bGUuZ2V0TmFtZSgpKyIuamFyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHV0aWxpdHlKYXIgIT1udWxsKQotCQkJCQkJY2hpbGRyZW4uYWRkKHV0aWxpdHlKYXIpOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRKYXJzKExpc3QgbGlzdCwgSVJlc291cmNlW10gbWVtYmVycykgewotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotLy8JCQlpZiAoaXNKYXJGaWxlKG1lbWJlcnNbaV0pKSB7Ci0vLwkJCQlsaXN0LmFkZChtZW1iZXJzW2ldKTsKLS8vCQkJfSBlbHNlIGlmIChtZW1iZXJzW2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0vLwkJCQl0cnkgewotLy8JCQkJCWdldEphcnMobGlzdCwgKChJRm9sZGVyKSBtZW1iZXJzW2ldKS5tZW1iZXJzKCkpOwotLy8JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBsaXN0OwotLy8JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmFyRmlsZShJUmVzb3VyY2UgbWVtYmVyKSB7Ci0JCXJldHVybiBtZW1iZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIG1lbWJlci5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBVVElMSVRZX0pBUlM7Ci0JfQotCi0JLy8gYXNzdW1lIHRoaXMgcmVzb3VyY2UgaXMgYSBqYXIgcmVzb3VyY2UKLQlwdWJsaWMgdm9pZCB1dGlsaXR5SmFyQ2hhbmdlZChJUmVzb3VyY2UgcmVzb3VyY2UsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWlmIChjaGlsZHJlbkxvYWRlZCkgewotCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCAmJiAhY2hpbGRyZW4uY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHJlc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgJiYgY2hpbGRyZW4uY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJY2hpbGRyZW4ucmVtb3ZlKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVXRpbGl0eUphclJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFV0aWxpdHlKYXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIElOU1RBTkNFID0gbmV3IFV0aWxpdHlKYXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGxpc3RlbmluZyA9IGZhbHNlOwotCQlwcml2YXRlIE1hcCBlYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwOwotCi0JCXB1YmxpYyB2b2lkIGFkZFV0aWxpdHlKYXJJdGVtUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgdXRpbGl0eUphckl0ZW1Qcm92aWRlcikgewotCQkJTGlzdCBwcm92aWRlcnMgPSBnZXRQcm92aWRlcnMocHJvamVjdCk7Ci0JCQlpZiAocHJvdmlkZXJzICE9IG51bGwpCi0JCQkJcHJvdmlkZXJzLmFkZCh1dGlsaXR5SmFySXRlbVByb3ZpZGVyKTsKLQkJCWlmICghbGlzdGVuaW5nKSB7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQkJCWxpc3RlbmluZyA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHByb2plY3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBMaXN0IGdldFByb3ZpZGVycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlMaXN0IHJlc3VsdCA9IChMaXN0KSBnZXRFYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwKCkuZ2V0KHByb2plY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHByb2plY3QgIT0gbnVsbCkKLQkJCQlnZXRFYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwKCkucHV0KHByb2plY3QsIChyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCkpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBNYXAgZ2V0RWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcCgpIHsKLQkJCWlmIChlYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwID09IG51bGwpCi0JCQkJZWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZXR1cm4gZWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgdXRpbGl0eUphckl0ZW1Qcm92aWRlcikgewotCQkJTGlzdCBwcm92aWRlcnMgPSBnZXRQcm92aWRlcnMocHJvamVjdCk7Ci0JCQlwcm92aWRlcnMucmVtb3ZlKHV0aWxpdHlKYXJJdGVtUHJvdmlkZXIpOwotCQkJaWYgKHByb3ZpZGVycy5pc0VtcHR5KCkpCi0JCQkJZ2V0RWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcCgpLnJlbW92ZShwcm9qZWN0KTsKLQotCQkJaWYgKGdldEVhclByb2plY3RzVG9VdGlsaXR5SmFyUHJvdmlkZXJNYXAoKS5pc0VtcHR5KCkpIHsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQlsaXN0ZW5pbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0cnkgewotCQkJCWV2ZW50LmdldERlbHRhKCkuYWNjZXB0KHRoaXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCXN3aXRjaCAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlyZXR1cm4gZ2V0RWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcCgpLmNvbnRhaW5zS2V5KGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOiB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWlmIChpc0phckZpbGUocmVzb3VyY2UpKSB7Ci0JCQkJCQlMaXN0IHV0aWxpdHlKYXJJdGVtUHJvdmlkZXJzID0gZ2V0UHJvdmlkZXJzKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHV0aWxpdHlKYXJJdGVtUHJvdmlkZXJzLnNpemUoKTsgaSsrKQotCQkJCQkJCSgoSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIpIHV0aWxpdHlKYXJJdGVtUHJvdmlkZXJzLmdldChpKSkudXRpbGl0eUphckNoYW5nZWQocmVzb3VyY2UsIGRlbHRhKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyID09IElSRVNPVVJDRV9DTEFTUyB8fCBhZGFwdGVyID09IElQUk9KRUNUX0NMQVNTKQotCQkJcmV0dXJuIChhcHBsaWNhdGlvbiAhPSBudWxsKSA/IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhcHBsaWNhdGlvbikgOiBudWxsOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVV0aWxpdHlKYXZhUHJvamVjdHNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNhZjc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyIGV4dGVuZHMgRUFSUHJvamVjdE1hcEl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVVElMSVRZX0pBVkFfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiVXRpbGl0eV9KYXZhX1Byb2plY3RzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVXRpbGl0eUpBUnNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVXRpbGl0eUpBUnNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGluY2x1ZGVNb2R1bGVzCi0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBib29sZWFuIGluY2x1ZGVNb2R1bGVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBpbmNsdWRlTW9kdWxlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBVVElMSVRZX0pBVkFfUFJPSkVDVFM7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01ldGhvZHNQcm92aWRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwZWFjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLk1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5NZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIgZXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIE1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyIG1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyOwotCXByb3RlY3RlZCBNZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlciBtZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlcjsKLQotCXByb3RlY3RlZCBzdGF0aWMgRU9iamVjdCBFTF9NRVRBID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEV4Y2x1ZGVMaXN0KCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFT2JqZWN0IE1QX01FVEEgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kUGVybWlzc2lvbigpOwotCXByb3RlY3RlZCBzdGF0aWMgRU9iamVjdCBNVF9NRVRBID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldE1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvdmlkZXNDb250ZW50Rm9yKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtIHx8IG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb24gfHwgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kVHJhbnNhY3Rpb24gfHwgb2JqZWN0IGluc3RhbmNlb2YgRXhjbHVkZUxpc3Q7Ci0JfQotCi0JcHVibGljIE1ldGhvZHNQcm92aWRlckRlbGVnYXRlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCWV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyID0gbmV3IEV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBmYWxzZSk7Ci0JCW1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyID0gbmV3IE1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBmYWxzZSk7Ci0JCW1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyID0gbmV3IE1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyICE9IG51bGwpCi0JCQltZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChtZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJbWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBtZXRhQ2xhc3MgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pCi0JCQltZXRhQ2xhc3MgPSAoKEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKSBvYmplY3QpLnJlZk9iamVjdC5lQ2xhc3MoKTsKLQkJZWxzZQotCQkJbWV0YUNsYXNzID0gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpOwotCi0JCWlmIChtZXRhQ2xhc3MgPT0gRUxfTUVUQSkKLQkJCXJldHVybiBleGNsdWRlTGlzdENvbnRlbnRQcm92aWRlcjsKLQkJZWxzZSBpZiAobWV0YUNsYXNzID09IE1QX01FVEEpCi0JCQlyZXR1cm4gbWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXI7Ci0JCWVsc2UgaWYgKG1ldGFDbGFzcyA9PSBNVF9NRVRBKQotCQkJcmV0dXJuIG1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCW1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCW1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyIHByb3YgPSBnZXRDb250ZW50UHJvdmlkZXIocGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiBwcm92ID09IG51bGwgPyBudWxsIDogcHJvdi5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgcHJvdiA9IGdldENvbnRlbnRQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIHByb3YgPT0gbnVsbCA/IG51bGwgOiBwcm92LmdldFBhcmVudChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCUFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciBwcm92ID0gZ2V0Q29udGVudFByb3ZpZGVyKGVsZW1lbnQpOwotCQlyZXR1cm4gcHJvdiAhPSBudWxsICYmIHByb3YuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgcHJvdiA9IGdldENvbnRlbnRQcm92aWRlcihpbnB1dEVsZW1lbnQpOwotCQlyZXR1cm4gcHJvdiA9PSBudWxsID8gbnVsbCA6IHByb3YuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZmU0YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSjJFRUl0ZW1Qcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJNb2R1bGVzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIodGV4dCwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSkgewotCQlzdXBlcih0ZXh0LCBpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKHRleHQsIGltYWdlLCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQlzdXBlcih0ZXh0LCBpbWFnZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKHRleHQsIGltYWdlLCBwYXJlbnQsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgaW1hZ2UsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlLCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIE9iamVjdCBwYXJlbnQsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlLCBwYXJlbnQsIGNoaWxkcmVuKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBBcHBsaWNhdGlvbiBnZXRQYXJlbnRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbikgZ2V0UGFyZW50KCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXIjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIgPT0gSVJFU09VUkNFX0NMQVNTIHx8IGFkYXB0ZXIgPT0gSVBST0pFQ1RfQ0xBU1MpCi0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFBhcmVudEFwcGxpY2F0aW9uKCkpOwotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBNT0RVTEVTOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS91dGlsL0Fubm90YXRpb25JY29uRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9Bbm5vdGF0aW9uSWNvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGU0ZTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS91dGlsL0Fubm90YXRpb25JY29uRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTgsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyLkFubm90YXRpb25zQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIuQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBZGQgb3ZlcmxheSBmb3IgYW5ub3RhdGVkIG9iamVjdHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25JY29uRGVjb3JhdG9yIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0lNQUdFX0RFU0NfU1RSSU5HID0gImFubm90YXRpb25fYmVhbl9vdmVybGF5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fRElTQUJMRURfSU1BR0VfREVTQ19TVFJJTkcgPSAiZGlzX2Fubm90YXRpb25fYmVhbl9vdmVybGF5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBBTk5PVEFUSU9OX0lNR19ERVNDID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKEFOTk9UQVRJT05fSU1BR0VfREVTQ19TVFJJTkcpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBBTk5PVEFUSU9OX0RJU0FCTEVEX0lNR19ERVNDID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKEFOTk9UQVRJT05fRElTQUJMRURfSU1BR0VfREVTQ19TVFJJTkcpOwotCi0JcHVibGljIEFubm90YXRpb25JY29uRGVjb3JhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBbm5vdGF0ZWRTdXBwb3J0ZWQoRU9iamVjdCB0YXJnZXQpIHsKLQkJYm9vbGVhbiBiQW5ub3RhdGlvblN1cHBvcnRlZCA9IGZhbHNlOwotCQlpZiAoQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyLklOU1RBTkNFLmlzQW5ub3RhdGVkKHRhcmdldCkpIHsKLQkJCWJBbm5vdGF0aW9uU3VwcG9ydGVkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYkFubm90YXRpb25TdXBwb3J0ZWQ7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uc0NvbnRyb2xsZXIgZ2V0Q29udHJvbGxlckZvclByb2plY3QoSVByb2plY3QgdGFyZ2V0UHJvamVjdCkgewotCQlBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY29udHJvbGxlciA9IEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVyKHRhcmdldFByb2plY3QpOwotCQlyZXR1cm4gY29udHJvbGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQlFT2JqZWN0IGVPYmplY3QgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyKSB7Ci0JCQlCZWFuQ2xhc3NQcm92aWRlckhlbHBlciBiZWFuQ2xhc3NIZWxwZXIgPSAoQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIpIGVsZW1lbnQ7Ci0JCQllT2JqZWN0ID0gYmVhbkNsYXNzSGVscGVyLmdldEVqYigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgU2VydmxldCkKLQkJCWVPYmplY3QgPSAoRU9iamVjdCkgZWxlbWVudDsKLQkJaWYgKGVPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQW5ub3RhdGVkU3VwcG9ydGVkKGVPYmplY3QpKSB7Ci0JCQlpZiAoaXNBbm5vdGF0aW9uRW5hYmxlZChlT2JqZWN0KSkgewotCQkJCWlmIChBTk5PVEFUSU9OX0lNR19ERVNDICE9IG51bGwpCi0JCQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShBTk5PVEFUSU9OX0lNR19ERVNDKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKEFOTk9UQVRJT05fRElTQUJMRURfSU1HX0RFU0MgIT0gbnVsbCkKLQkJCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KEFOTk9UQVRJT05fRElTQUJMRURfSU1HX0RFU0MpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQW5ub3RhdGlvbkVuYWJsZWQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUlGaWxlIGFubm90YXRlZFNvdXJjZSA9IG51bGw7Ci0JCS8qIHNob3J0IGNpcmN1aXQgaWYgcG9zc2libGUgKi8KLQkJaWYgKEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuaXNBbnlBbm5vdGF0aW9uc1N1cHBvcnRlZCgpKSB7Ci0JCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVPYmplY3QpOwotCQkJQW5ub3RhdGlvbnNDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyRm9yUHJvamVjdCh0YXJnZXRQcm9qZWN0KTsKLQkJCWlmIChjb250cm9sbGVyICE9IG51bGwpCi0JCQkJYW5ub3RhdGVkU291cmNlID0gY29udHJvbGxlci5nZXRFbmFibGVkQW5ub3RhdGlvbkZpbGUoZU9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIChhbm5vdGF0ZWRTb3VyY2UgIT0gbnVsbCkgPyB0cnVlIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElMYWJlbERlY29yYXRvciNkZWNvcmF0ZVRleHQoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlTmFtZSkgewotCQlpZiAoaW1hZ2VGaWxlTmFtZSAhPSBudWxsKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRmlsZU5hbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3V0aWwvQmluYXJ5UHJvamVjdFVJSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9CaW5hcnlQcm9qZWN0VUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0ZDkyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9CaW5hcnlQcm9qZWN0VUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkudXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIEJpbmFyeVByb2plY3RVSUhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfVElUTEUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQklOQVJZX1BST0pFQ1QiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFDVElPTl9DQU5OT1RfQkVfUEVSRk9STUVEX09OX0JJTl9QUk9KRUNUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCaW5hcnlQcm9qZWN0VUlIZWxwZXIuCi0JICovCi0JcHVibGljIEJpbmFyeVByb2plY3RVSUhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheUVycm9yKFNoZWxsIHBhcmVudCkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYXJlbnQsIERJQUxPR19USVRMRSwgRElBTE9HX01FU1NBR0UpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRpc3BsYXlFcnJvcklmQmluYXJ5UHJvamVjdChTaGVsbCBwYXJlbnQsIElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNCaW5hcnkgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmlzQmluYXJ5UHJvamVjdChhUHJvamVjdCk7Ci0JCWlmIChpc0JpbmFyeSkKLQkJCWRpc3BsYXlFcnJvcihwYXJlbnQpOwotCQlyZXR1cm4gaXNCaW5hcnk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkFwcEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL0oyRUVXZWJBcHBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmMTUyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkFwcEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVXZWJBcHBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJBcHBJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyIHdlYlNlcnZsZXRHcm91cDsKLQlwcml2YXRlIFdlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIgd2ViU2VydmxldE1hcHBpbmdHcm91cDsKLQlwcml2YXRlIFdlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlciB3ZWJGaWx0ZXJzR3JvdXA7Ci0JcHJpdmF0ZSBXZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIgd2ViRmlsdGVyTWFwcGluZ0dyb3VwOwotCXByaXZhdGUgV2ViUmVmZXJlbmNlc0dyb3VwSXRlbVByb3ZpZGVyIHdlYlJlZnNHcm91cDsKLQlwcml2YXRlIFdlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIgd2ViU2VjdXJpdHlHcm91cDsKLQlwcml2YXRlIEoyRUVXZWJTZXJ2aWNlQ2xpZW50RERNYW5hZ2VyIGNsaWVudE1ncjsKLQlwcml2YXRlIFdlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIgd2ViTGlzdGVuZXJHcm91cDsKLQotCS8qKgotCSAqIExpc3RlbiBhbmQgZmlyZSB1cGRhdGVzIGZvciAxLjMgd2ViIHNlcnZpY2UgY2xpZW50cwotCSAqLwotCXByaXZhdGUgY2xhc3MgSjJFRVdlYlNlcnZpY2VDbGllbnRERE1hbmFnZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEVkaXRNb2RlbExpc3RlbmVyIHsKLQkJcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHA7Ci0JCVdlYlNlcnZpY2VzQ2xpZW50IGNsaWVudDsKLQotCQlwdWJsaWMgSjJFRVdlYlNlcnZpY2VDbGllbnRERE1hbmFnZXIoV2Vha1JlZmVyZW5jZSB3ZWFrV2ViQXBwKSB7Ci0JCQl0aGlzLndlYWtXZWJBcHAgPSB3ZWFrV2ViQXBwOwotCQkJaW5pdCgpOwotCQl9Ci0KLQkJCi0KLQkJcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJCS8vIFRPRE8gZml4IHVwIG5vdGlmaWNhdGlvbgotCQkJLy8gZWRpdE1vZGVsID0gd2ViU2VydmljZU1nci5nZXRXU0VkaXRNb2RlbChQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod2ViQXBwKSk7Ci0JCQkvLyBpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCS8vIGVkaXRNb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCS8vIGlmIChlZGl0TW9kZWwuZ2V0MTNXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJLy8gY2xpZW50ID0gZWRpdE1vZGVsLmdldDEzV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZSgpLmdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQkvLyBpZiAoY2xpZW50ICE9IG51bGwpCi0JCQkvLyBjbGllbnQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lciNlZGl0TW9kZWxDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCQkvLyBUT0RPIGZpeCB1cCBub3RpZmljYXRpb24KLQkJCS8vIGlmIChlZGl0TW9kZWwgPT0gbnVsbCkKLQkJCS8vIGluaXQoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREIHx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkgfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUgfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewotCQkJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlYlNlcnZpY2VzQ2xpZW50LmNsYXNzKSA9PSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTKSB7Ci0JCQkJCU5vdGlmaWNhdGlvbldyYXBwZXIgbm90aWZpY2F0aW9uV3JhcHBlciA9IG5ldyBOb3RpZmljYXRpb25XcmFwcGVyKHdlYlJlZnNHcm91cCwgbm90aWZpY2F0aW9uKTsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uV3JhcHBlcik7Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vIFRPRE8gZml4IHVwIG5vdGlmaWNhdGlvbgotCQkJLy8gaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBlZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkvLyBpZiAoZWRpdE1vZGVsLmdldDEzV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCS8vIGNsaWVudCA9IGVkaXRNb2RlbC5nZXQxM1dlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2UoKS5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotCQkJLy8gaWYgKGNsaWVudCAhPSBudWxsKQotCQkJLy8gY2xpZW50LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSjJFRVdlYkFwcEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogaW5pdGlsYWl6ZSBsaXN0IG9mIGNoaWxkcmVuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRDaGlsZHJlbigpIHsKLQkJaWYgKGNsaWVudE1nciA9PSBudWxsKQotCQkJY2xpZW50TWdyID0gbmV3IEoyRUVXZWJTZXJ2aWNlQ2xpZW50RERNYW5hZ2VyKHdlYWtXZWJBcHApOwotCQljaGlsZHJlbi5hZGQod2ViU2VydmxldEdyb3VwID0gbmV3IFdlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotCQljaGlsZHJlbi5hZGQod2ViU2VydmxldE1hcHBpbmdHcm91cCA9IG5ldyBXZWJTZXJ2bGV0TWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKSk7Ci0JCWNoaWxkcmVuLmFkZCh3ZWJGaWx0ZXJzR3JvdXAgPSBuZXcgV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKSk7Ci0JCWNoaWxkcmVuLmFkZCh3ZWJGaWx0ZXJNYXBwaW5nR3JvdXAgPSBuZXcgV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKSk7Ci0JCWNoaWxkcmVuLmFkZCh3ZWJSZWZzR3JvdXAgPSBuZXcgV2ViUmVmZXJlbmNlc0dyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKSk7Ci0JCWNoaWxkcmVuLmFkZCh3ZWJTZWN1cml0eUdyb3VwID0gbmV3IFdlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApKTsKLQkJY2hpbGRyZW4uYWRkKHdlYkxpc3RlbmVyR3JvdXAgPSBuZXcgV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotCX0KLQotCXByb3RlY3RlZCBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHAgPSBudWxsOwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwICYmIGNoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJd2Vha1dlYkFwcCA9IG5ldyBXZWFrUmVmZXJlbmNlKG9iamVjdCk7Ci0JCQlpbml0Q2hpbGRyZW4oKTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwKQotCQkJd2Vha1dlYkFwcCA9IG5ldyBXZWFrUmVmZXJlbmNlKG9iamVjdCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gV2Ugb25seSBjYXJlIGFib3V0IGFkZHMgYW5kIHJlbW92ZXMgZm9yIHRoZSBkaWZmZXJlbnQgaXRlbSBwcm92aWRlcgotCQkvLyBncm91cHMKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREIHx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkgfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUgfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gbnVsbDsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJBcHAuY2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFMgOgotCQkJCQlub3RpZmllciA9IHdlYlNlcnZsZXRHcm91cDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyA6Ci0JCQkJCW5vdGlmaWVyID0gd2ViU2VydmxldE1hcHBpbmdHcm91cDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUyA6Ci0JCQkJCW5vdGlmaWVyID0gd2ViRmlsdGVyc0dyb3VwOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1MgOgotCQkJCQlub3RpZmllciA9IHdlYkZpbHRlck1hcHBpbmdHcm91cDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlMgOgotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VKQl9SRUZTIDoKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgOgotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTIDoKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9SRUZTIDoKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWSUNFX1JFRlMgOgotCQkJCQlub3RpZmllciA9IHdlYlJlZnNHcm91cDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMgOgotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlNUUkFJTlRTIDoKLQkJCQkJbm90aWZpZXIgPSB3ZWJTZWN1cml0eUdyb3VwOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlMgOgotCQkJCQlub3RpZmllciA9IHdlYkxpc3RlbmVyR3JvdXA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpIHsKLQkJCQlOb3RpZmljYXRpb25XcmFwcGVyIG5vdGlmaWNhdGlvbldyYXBwZXIgPSBuZXcgTm90aWZpY2F0aW9uV3JhcHBlcihub3RpZmllciwgbm90aWZpY2F0aW9uKTsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25XcmFwcGVyKTsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY2xpZW50TWdyICE9IG51bGwpCi0JCQljbGllbnRNZ3IuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9KMkVFV2ViSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9KMkVFV2ViSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2N2NlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFV2ViSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi51dGlsLldlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkjY3JlYXRlV2ViQXBwQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViQXBwQWRhcHRlcigpIHsKLQkJaWYgKHdlYkFwcEl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJd2ViQXBwSXRlbVByb3ZpZGVyID0gbmV3IEoyRUVXZWJBcHBJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiB3ZWJBcHBJdGVtUHJvdmlkZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExZmRmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVycy5XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFdlYkZpbHRlck1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSx3ZWFrV2ViQXBwKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3Qgd2ViQXBwID0gd2Vha1dlYkFwcC5nZXQoKTsKLQkJaWYobnVsbCAhPSB3ZWJBcHApewotCQkJcmV0dXJuICgoV2ViQXBwKXdlYkFwcCkuZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlcl9tYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRklMVEVSX01BUFBJTkciKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDVmMDM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVycy5XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRmlsdGVyLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIE9iamVjdCB3ZWJBcHAgPSB3ZWFrV2ViQXBwLmdldCgpOwotCSAgICBpZih3ZWJBcHAgIT0gbnVsbCl7Ci0JICAgIAlyZXN1bHQuYWRkQWxsKCgoV2ViQXBwKXdlYkFwcCkuZ2V0RmlsdGVycygpKTsKLQkgICAgfQotCQlyZXR1cm4gZ2V0U29ydGVkQ2hpbGRyZW4ocmVzdWx0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHdlYWtXZWJBcHAuZ2V0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGaWx0ZXJzXzEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliMDA1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDExLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2ViR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBKMkVFSXRlbVByb3ZpZGVyIHsKLQotCWNsYXNzIFdlYkdyb3VwQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAgICAgICAgIGlmIChvMSBpbnN0YW5jZW9mIFNlcnZsZXQpIHsKLSAgICAgICAgICAgICAgICBTZXJ2bGV0IHMxID0gKFNlcnZsZXQpbzE7Ci0gICAgICAgICAgICAgICAgU2VydmxldCBzMiA9IChTZXJ2bGV0KW8yOwotICAgICAgICAgICAgICAgIGlmIChzMS5nZXRTZXJ2bGV0TmFtZSgpICE9IG51bGwgJiYgczIuZ2V0U2VydmxldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIAlyZXR1cm4gczEuZ2V0U2VydmxldE5hbWUoKS5jb21wYXJlVG8oczIuZ2V0U2VydmxldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXIgZjEgPSAoRmlsdGVyKSBvMTsKLSAgICAgICAgICAgICAgICBGaWx0ZXIgZjIgPSAoRmlsdGVyKSBvMjsKLSAgICAgICAgICAgICAgICBpZiAoZjEuZ2V0TmFtZSgpICE9IG51bGwgJiYgZjIuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgCXJldHVybiBmMS5nZXROYW1lKCkuY29tcGFyZVRvKGYyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBMaXN0ZW5lcikgewotICAgICAgICAgICAgICAgIExpc3RlbmVyIGwxID0gKExpc3RlbmVyKSBvMTsKLSAgICAgICAgICAgICAgICBMaXN0ZW5lciBsMiA9IChMaXN0ZW5lcikgbzI7Ci0gICAgICAgICAgICAgICAgaWYgKGwxLmdldExpc3RlbmVyQ2xhc3NOYW1lKCkgIT0gbnVsbCAmJiBsMi5nZXRMaXN0ZW5lckNsYXNzTmFtZSgpICE9bnVsbCkKLSAgICAgICAgICAgICAgICAJcmV0dXJuIGwxLmdldExpc3RlbmVyQ2xhc3NOYW1lKCkuY29tcGFyZVRvKGwyLmdldExpc3RlbmVyQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgcmV0dXJuIC0xOwotICAgICAgICB9Ci0JfQotICAgIAotICAgIHByb3RlY3RlZCBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHA7Ci0gICAgCi0gICAgcHVibGljIFdlYkdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLndlYWtXZWJBcHAgPSB3ZWFrV2ViQXBwOwotCX0KLSAgICAKLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRTb3J0ZWRDaGlsZHJlbihMaXN0IHRoZUNoaWxkcmVuKSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGhlQ2hpbGRyZW4sIG5ldyBXZWJHcm91cENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiB0aGVDaGlsZHJlbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxNDEyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTEsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRmlsdGVyLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJsaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIE9iamVjdCB3ZWJBcHAgPSB3ZWFrV2ViQXBwLmdldCgpOwotCSAgICBpZih3ZWJBcHAgIT0gbnVsbCl7Ci0JICAgIAlyZXN1bHQuYWRkQWxsKCgoV2ViQXBwKXdlYkFwcCkuZ2V0TGlzdGVuZXJzKCkpOwotCSAgICB9Ci0JICAgIHJldHVybiBnZXRTb3J0ZWRDaGlsZHJlbihyZXN1bHQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkxJU1RFTkVSIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwZjgxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViUmVmZXJlbmNlc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVycy5XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlRXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlJlZmVyZW5jZXNHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdCBvYmogPSB3ZWFrV2ViQXBwLmdldCgpOwotCQlpZiAobnVsbCAhPSBvYmopIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBvYmo7Ci0JCQlpZiAoIXdlYkFwcC5nZXRFamJMb2NhbFJlZnMoKS5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbCh3ZWJBcHAuZ2V0RWpiTG9jYWxSZWZzKCkpOwotCQkJaWYgKCF3ZWJBcHAuZ2V0RWpiUmVmcygpLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRFamJSZWZzKCkpOwotCQkJaWYgKCF3ZWJBcHAuZ2V0UmVzb3VyY2VFbnZSZWZzKCkuaXNFbXB0eSgpKQotCQkJCXJlc3VsdC5hZGRBbGwod2ViQXBwLmdldFJlc291cmNlRW52UmVmcygpKTsKLQkJCWlmICghd2ViQXBwLmdldFJlc291cmNlUmVmcygpLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRSZXNvdXJjZVJlZnMoKSk7Ci0JCQlpZiAoIXdlYkFwcC5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuaXNFbXB0eSgpKQotCQkJCXJlc3VsdC5hZGRBbGwod2ViQXBwLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSk7Ci0JCQlpZiAoIXdlYkFwcC5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJCUNvbGxlY3Rpb24gc2VydmljZVJlZnMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJCQlzZXJ2aWNlUmVmcyA9IHNlcnZpY2VIZWxwZXIuZ2V0MTNTZXJ2aWNlUmVmcyh3ZWJBcHApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIHJlKSB7Ci0JCQkJc2VydmljZVJlZnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCi0JCQlpZiAoc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpKQotCQkJCXJlc3VsdC5hZGRBbGwoc2VydmljZVJlZnMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInJlc291cmNlUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJSZWZlcmVuY2VzXzEiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ODYyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgV2Vha1JlZmVyZW5jZSB3ZWFrV2ViQXBwKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB3ZWFrV2ViQXBwLmdldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VjdXJpdHlfMSIpOyAvLyROT04tTkxTLTEkIAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0IG9iaiA9IHdlYWtXZWJBcHAuZ2V0KCk7Ci0JCWlmIChudWxsICE9IG9iaikgewotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG9iajsKLQkJCWlmICghd2ViQXBwLmdldFNlY3VyaXR5Um9sZXMoKS5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbCh3ZWJBcHAuZ2V0U2VjdXJpdHlSb2xlcygpKTsKLQkJCWlmICghd2ViQXBwLmdldENvbnN0cmFpbnRzKCkuaXNFbXB0eSgpKQotCQkJCXJlc3VsdC5hZGRBbGwod2ViQXBwLmdldENvbnN0cmFpbnRzKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgic2VjdXJpdHlfcm9sZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmNhMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVycy5XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3Qgd2ViQXBwID0gd2Vha1dlYkFwcC5nZXQoKTsKLQkJaWYobnVsbCAhPSB3ZWJBcHApewotCQkJcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCl3ZWJBcHApLmdldFNlcnZsZXRzKCkpOwotCQl9Ci0JCXJldHVybiBnZXRTb3J0ZWRDaGlsZHJlbihyZXN1bHQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VydmxldCIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlcnZsZXRzXzEiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZDgxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTEsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2bGV0TWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViR3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCB3ZWJBcHAgPSB3ZWFrV2ViQXBwLmdldCgpOwotCQlpZiAobnVsbCAhPSB3ZWJBcHApIHsKLQkJCXJldHVybiAoKFdlYkFwcCkgd2ViQXBwKS5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZXJ2bGV0X21hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VydmxldF9NYXBwaW5nc18yIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0Fubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0Fubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1Nzg4OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9Bbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIuQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuYW5ub3RhdGlvbi5pbnRlcm5hbC5wcmVmZXJlbmNlcy5Bbm5vdGF0aW9uUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5hbm5vdGF0aW9uLmludGVybmFsLnByb3ZpZGVyLklBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmFubm90YXRpb24uaW50ZXJuYWwudXRpbGl0eS5Bbm5vdGF0aW9uVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwIHsKLQotCXByb3RlY3RlZCBPYmplY3QgbW9kZWw7Ci0JcHJvdGVjdGVkIE9iamVjdCBzeW5jaEhlbHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHVzZUFubm90YXRpb25zOwotCXByaXZhdGUgYm9vbGVhbiBpc0ZvckJlYW47Ci0JcHJpdmF0ZSBib29sZWFuIHVzZVNlcnZsZXRTdHJpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJUQUdTRVQgPSAiZWpiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRCZWFuRGVmYXVsdFVzZUFubm90YXRpb25zID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFByb2plY3REZWZhdWx0VXNlQW5ub3RhdGlvbnMgPSBmYWxzZTsKLQotCi0JcHJpdmF0ZSBjbGFzcyBDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChpc0ZvckJlYW4pCi0JCQkJc2hvdWxkQmVhbkRlZmF1bHRVc2VBbm5vdGF0aW9ucyA9IGJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCWVsc2UKLQkJCQlzaG91bGRQcm9qZWN0RGVmYXVsdFVzZUFubm90YXRpb25zID0gYnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyIGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IG1vZGVsLCBib29sZWFuIGZvckJlYW4pIHsKLQkJdGhpcyhwYXJlbnQsIG1vZGVsLCBmb3JCZWFuLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IG1vZGVsLCBib29sZWFuIGZvckJlYW4sIGJvb2xlYW4gdXNlU2VydmxldCkgewotCQlzdXBlcigpOwotCQlzeW5jaEhlbHBlciA9IG5ldyBEYXRhTW9kZWxTeW5jaEhlbHBlcigoSURhdGFNb2RlbCltb2RlbCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5pc0ZvckJlYW4gPSBmb3JCZWFuOwotCQl0aGlzLnVzZVNlcnZsZXRTdHJpbmcgPSB1c2VTZXJ2bGV0OwotCQkKLQkJYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIEFkZCBzZXBhcmF0b3IKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vIEFkZCBzcGFjZXIKLQkJTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnZDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QxLmhvcml6b250YWxTcGFuID0gMzsKLQkJc3BhY2VyLnNldExheW91dERhdGEoZ2QxKTsKLQkJLy8gQWRkIGFubm90YXRpb25zIGNoZWNrYm94IGFuZCBsYWJlbAotCQl1c2VBbm5vdGF0aW9ucyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlTdHJpbmcgbGFiZWxUZXh0OwotCQlpZiAodXNlU2VydmxldFN0cmluZykKLQkJCWxhYmVsVGV4dCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlVTRV9BTk5PVEFUSU9OU19TRVJWTEVUKTsKLQkJZWxzZSBpZiAoaXNGb3JCZWFuKQotCQkJbGFiZWxUZXh0ID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVVNFX0FOTk9UQVRJT05TKTsKLQkJZWxzZQotCQkJbGFiZWxUZXh0ID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQUREX0FOTk9UQVRJT05TX1NVUFBPUlQpOwotCQl1c2VBbm5vdGF0aW9ucy5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0JCSgoRGF0YU1vZGVsU3luY2hIZWxwZXIpc3luY2hIZWxwZXIpLnN5bmNoQ2hlY2tib3godXNlQW5ub3RhdGlvbnMsIElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlMsIG51bGwpOwotCQl1c2VBbm5vdGF0aW9ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXVzZUFubm90YXRpb25zLnNldExheW91dERhdGEoZ2QyKTsKLQkJLy8gSWYgZm9yIHByb2plY3QsIHNldCB0aGUgZ2xvYmFsIGFubm90YXRpb25zIHN1cHBvcnRlZAotCQlpZiAoIWlzRm9yQmVhbikKLQkJCXNldEVuYWJsZW1lbnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJKChJRGF0YU1vZGVsKW1vZGVsKS5yZW1vdmVMaXN0ZW5lcigoRGF0YU1vZGVsU3luY2hIZWxwZXIpc3luY2hIZWxwZXIpOwotCQlzeW5jaEhlbHBlciA9IG51bGw7Ci0JCW1vZGVsID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25zU3VwcG9ydGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy9UT0RPIGNsZWFuIHVwIHRvIGJlIG1vZHVsZSBiYXNlZCwgbm90IHByb2plY3QgYmFzZWQKLQkJdHJ5IHsKLQkJCS8vCQkJaWYgKGlzRm9yQmVhbikgewotCQkJLy8JCQkJQW5ub3RhdGlvbnNDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotCQkJLy8gQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5JTlNUQU5DRS5nZXRBbm5vdGF0aW9uc0NvbnRyb2xsZXIocHJvamVjdCk7Ci0JCQkvLwkJCQlyZXR1cm4gKGNvbnRyb2xsZXIgIT1udWxsICYmIGNvbnRyb2xsZXIuaXNUYWdIYW5kbGVySW5zdGFsbGVkKEVKQlRBR1NFVCkpOwotCQkJLy8JCQl9Ci0vLwkJCUoyRUVNb2R1bGVOYXR1cmUgbmF0dXJlID0gbnVsbDsKLS8vCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkKLS8vCQkJCW5hdHVyZSA9IChKMkVFTW9kdWxlTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLS8vCQkJZWxzZSBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaGFzTmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSkKLS8vCQkJCW5hdHVyZSA9IChKMkVFTW9kdWxlTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCk7Ci0vLwotLy8JCQlpZiAoIWlzRm9yQmVhbiB8fCAobmF0dXJlICE9IG51bGwgJiYgbmF0dXJlLmdldEoyRUVWZXJzaW9uKCkgPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMikpCi0JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVtZW50KElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy9UT0RPCi0JCS8vYm9vbGVhbiBpc0VuYWJsZWQgPSBpc0Fubm90YXRpb25zU3VwcG9ydGVkKHByb2plY3QpOwotCQlib29sZWFuIGlzQ29udHJvbGxlckVuYWJsZWQgPSBBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyLklOU1RBTkNFLmlzQW55QW5ub3RhdGlvbnNTdXBwb3J0ZWQoKTsKLQkJZmluYWwgU3RyaW5nIHByZWZlcnJlZCA9IEFubm90YXRpb25QcmVmZXJlbmNlU3RvcmUuZ2V0UHJvcGVydHkoQW5ub3RhdGlvblByZWZlcmVuY2VTdG9yZS5BTk5PVEFUSU9OUFJPVklERVIpOwotCQlJQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNQcm92aWRlckVuYWJsZWQgPSBmYWxzZTsKLQkJaWYgKHByZWZlcnJlZCAhPW51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYW5ub3RhdGlvblByb3ZpZGVyID0gQW5ub3RhdGlvblV0aWxpdGllcy5maW5kQW5ub3RhdGlvblByb3ZpZGVyQnlOYW1lKHByZWZlcnJlZCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsgCi0JCQkJLy9EZWZhdWx0Ci0JCQl9Ci0JCQlpZiAoYW5ub3RhdGlvblByb3ZpZGVyICE9IG51bGwgJiYgYW5ub3RhdGlvblByb3ZpZGVyLmlzVmFsaWQoKSl7Ci0JCQkJaXNQcm92aWRlckVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc2hvdWxkRW5hYmxlID0gaXNDb250cm9sbGVyRW5hYmxlZCB8fCBpc1Byb3ZpZGVyRW5hYmxlZDsKLQkJaWYgKCFzaG91bGRFbmFibGUpIHsKLQkJCSgoSURhdGFNb2RlbCltb2RlbCkuc2V0UHJvcGVydHkoSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUywgQm9vbGVhbi5GQUxTRSk7Ci0JCX0KLQkJdXNlQW5ub3RhdGlvbnMuc2V0RW5hYmxlZChzaG91bGRFbmFibGUpOwotLy8JCWlmICghaXNFbmFibGVkIHx8ICghaXNGb3JCZWFuICYmICFzaG91bGRQcm9qZWN0RGVmYXVsdFVzZUFubm90YXRpb25zKSB8fCAoaXNGb3JCZWFuICYmICFzaG91bGRCZWFuRGVmYXVsdFVzZUFubm90YXRpb25zKSkgewotLy8JCQl1c2VBbm5vdGF0aW9ucy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotLy8JCQltb2RlbC5zZXRQcm9wZXJ0eShJQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TLCBCb29sZWFuLkZBTFNFKTsKLS8vCQl9IGVsc2UgewotLy8JCQl1c2VBbm5vdGF0aW9ucy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0vLwkJCW1vZGVsLnNldFByb3BlcnR5KElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlMsIEJvb2xlYW4uVFJVRSk7Ci0vLwkJfQotCX0KLQkKLQkKLQotCXB1YmxpYyB2b2lkIHNldFVzZVNlcnZsZXQoYm9vbGVhbiBhQm9vbGVhbikgewotCQl1c2VTZXJ2bGV0U3RyaW5nID0gYUJvb2xlYW47Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZUFubm90YXRpb25zKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJaWYgKHVzZUFubm90YXRpb25zICE9IG51bGwpIHsKLQkJCXVzZUFubm90YXRpb25zLnNldFNlbGVjdGlvbihhQm9vbGVhbik7Ci0JCQkoKElEYXRhTW9kZWwpbW9kZWwpLnNldFByb3BlcnR5KElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlMsIG5ldyBCb29sZWFuKGFCb29sZWFuKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmZlMjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMiwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmNyZWF0aW9uLkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQgZXh0ZW5kcyBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgaW1wbGVtZW50cyBJRXhlY3V0YWJsZUV4dGVuc2lvbiwgSU5ld1dpemFyZCB7Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIFdpemFyZCBJRCBvZiB0aGUgRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuIFVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzIGFuZCBhY3Rpdml0aWVzIG1hbmFnZW1lbnQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9ICBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5jbGFzcy5nZXROYW1lKCk7CSAKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgCi0JICogbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubyBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgCi0JICogb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzCi0JICogYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKiogCi0JICoge0Bpbmhlcml0RG9jfSAgIAotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRpYWxvZyB3aW5kb3cgdGl0bGUgYW5kIGRlZmF1bHQgcGFnZSBpbWFnZS4gCi0JICogPC9wPiAKLQkgKiAKLQkgKiBAc2VlIEoyRUVBcnRpZmFjdENyZWF0aW9uV2l6YXJkI2RvSW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9Jbml0KCkgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBDTElFTlRfQ09NUE9ORU5UX1dJWl9USVRMRSkpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5BUFBfQ0xJRU5UX1BST0pFQ1RfV0laQVJEX0JBTk5FUikpOwotCQlwcmVGaWxsU2VsZWN0ZWRFQVJQcm9qZWN0KCk7Ci0JfSAKLQkgCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIEFkZHMgYSB7QGxpbmsgSkNBUHJvamVjdENyZWF0aW9uUGFnZX0gYXMgdGhlIHtAbGluayBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQjTUFJTl9QR30uCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCUFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZSBwYWdlMSA9IG5ldyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQkJc3VwZXIuZG9BZGRQYWdlcygpOwotCX0KLQotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICB9IAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMWMwYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMiwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgVGV4dCBjb250ZXh0Um9vdE5hbWVGaWVsZCA9IG51bGw7Ci0JcHVibGljIExhYmVsIGNvbnRleHRSb290TGFiZWwgPSBudWxsOwotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAyNTA7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cCBhbm5vdGF0aW9uc0dyb3VwOwotCQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUENMSUVOVF9DT01QT05FTlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBDTElFTlRfQ09NUE9ORU5UX01BSU5fUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuQVBQX0NMSUVOVF9QUk9KRUNUX1dJWkFSRF9CQU5ORVIpKTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLk5FV19BUFBDTElFTlRfV0laQVJEX1AxKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFTW9kdWxlQ3JlYXRpb25QYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb0FkdmFuY2VkQ29tcG9zaXRlKENvbXBvc2l0ZSBhZHZhbmNlZCkgewotCQlzdXBlci5hZGRUb0FkdmFuY2VkQ29tcG9zaXRlKGFkdmFuY2VkKTsKLQkJc3VwZXIuY3JlYXRlU291cmNlRm9sZGVyQ29tcG9zaXRlKGFkdmFuY2VkKTsKLQkJY3JlYXRlQW5ub3RhdGlvbnNHcm91cChhZHZhbmNlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvL2Fubm90YXRpb25zR3JvdXAgPSBuZXcgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAocGFyZW50LCBnZXRKMkVFTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWwoKSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoYW5ub3RhdGlvbnNHcm91cCAhPSBudWxsKQotCQkJYW5ub3RhdGlvbnNHcm91cC5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDliOWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFdpemFyZCB1c2VkIHRvIGV4cG9ydCBKMkVFIEFwcGxpY2F0aW9uIENsaWVudCBtb2R1bGUgc3RydWN0dXJlcyBmcm9tIHRoZSBFY2xpcHNlIFdvcmtiZW5jaCB0byBhCi0gKiBkZXBsb3lhYmxlIEFwcGxpY2F0aW9uIENsaWVudCBBcmNoaXZlICouamFyIGZpbGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0gICAgcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICB9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIHRoZSBmb2xsb3dpbmcgcGFnZXM6Ci0JICogPHVsPgotCSAqIDxsaT57QGxpbmsgQXBwQ2xpZW50RXhwb3J0UGFnZX1hcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNNQUlOX1BHfSkKLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBBcHBDbGllbnRFeHBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHLCBnZXRTZWxlY3Rpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkFQUF9DTElFTlRfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEltcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjZjcyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0UGFnZSBleHRlbmRzIEoyRUVNb2R1bGVJbXBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9JTVBPUlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkFQUF9DTElFTlRfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbGVJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlSW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9GSUxFX0xBQkVMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7Ci0JCXJldHVybiAiQVBQX0NMSUVOVCI7IC8vJE5PTi1OTFMtMSQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsdGVyRXhwcmVzc2lvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117IiouamFyIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdEltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9JTVBPUlRfUFJPSkVDVF9MQUJFTCk7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBnZXROZXdQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0JLy8gcmV0dXJuIGdldEFwcENsaWVudERhdGFNb2RlbCgpLmdldEoyZWVBcnRpZmFjdENyZWF0aW9uRGF0YU1vZGVsKCk7Ci0JLy8gfQotCS8vCi0JLy8gcHJpdmF0ZSBBcHBDbGllbnRNb2R1bGVJbXBvcnREYXRhTW9kZWwgZ2V0QXBwQ2xpZW50RGF0YU1vZGVsKCkgewotCS8vIHJldHVybiAoQXBwQ2xpZW50TW9kdWxlSW1wb3J0RGF0YU1vZGVsKSBtb2RlbDsKLQkvLwl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9BUFBDTElFTlRfV0laQVJEX1AxKTsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTljNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5BcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gaW1wb3J0IEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZSBzdHJ1Y3R1cmVzIGludG8gdGhlIEVjbGlwc2UgV29ya2JlbmNoIGZyb20KLSAqIGFuIGV4aXN0aW5nIEFwcGxpY2F0aW9uIENsaWVudCAqLmphciBmaWxlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubwotCSAqIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiB7QGluaGVyaXREb2N9Ci0JLy8gKgotCS8vICogPHA+Ci0JLy8gKiBSZXR1cm5zIGFuIHtAbGluayBBcHBDbGllbnRJbXBvcnRPcGVyYXRpb259dXNpbmcgdGhlIG1vZGVsIGVpdGhlciBzdXBwbGllZCBpbiB0aGUKLQkvLyAqIGNvbnN0cnVjdG9yIG9yIGNyZWF0ZWQgZnJvbSB7QGxpbmsgI2NyZWF0ZURlZmF1bHRNb2RlbCgpfS4KLQkvLyAqIDwvcD4KLQkvLyAqCi0JLy8gKiBAcmV0dXJuIFJldHVybnMgdGhlIG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBXaXphcmQgY29tcGxldGVzLgotCS8vICovCi0JLy8gcHJvdGVjdGVkIFdUUE9wZXJhdGlvbiBnZXRJbXBvcnRPcGVyYXRpb24oKSB7Ci0JLy8gcmV0dXJuIG5ldyBBcHBDbGllbnRNb2R1bGVJbXBvcnRPcGVyYXRpb24oZ2V0U3BlY2lmaWNEYXRhTW9kZWwoKSk7Ci0JLy8gfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyBhbiB7QGxpbmsgQXBwQ2xpZW50SW1wb3J0UGFnZX1hcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNNQUlOX1BHfSkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IEFwcENsaWVudENvbXBvbmVudEltcG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGlhbG9nIHdpbmRvdyB0aXRsZSBhbmQgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZG9Jbml0KCkgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5JTVBPUlRfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkFQUF9DTElFTlRfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQkJLy8gdXBkYXRlRUFSVG9Nb2RlbEZyb21TZWxlY3Rpb24oZ2V0U3BlY2lmaWNEYXRhTW9kZWwoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRU1vZHVsZUltcG9ydFdpemFyZCNnZXRNb2R1bGVWYWxpZGF0b3JTdHJpbmdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbi5VSUFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudEV4cG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50RXhwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZkNzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50RXhwb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50RXhwb3J0UGFnZSBleHRlbmRzIEoyRUVNb2R1bGVFeHBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50RXhwb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfRVhQT1JUX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9FWFBPUlRfTUFJTl9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5BUFBfQ0xJRU5UX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9QUk9KRUNUX0xBQkVMKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWx0ZXJFeHByZXNzaW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi5qYXIifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVFeHBvcnRQYWdlI2lzTWV0YVR5cGVTdXBwb3J0ZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc01ldGFUeXBlU3VwcG9ydGVkKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgQXBwbGljYXRpb25DbGllbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRVByb2plY3RDcmVhdGlvblBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuRVhQT1JUX0FQUENMSUVOVF9XSVpBUkRfUDEpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBuZW50SUQoKSB7Ci0gICAgICAgIHJldHVybiAiSlNUX0FQUENMSUVOVCI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZUoyRUVDb21wb25lbnRzQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZUoyRUVDb21wb25lbnRzQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYjQ1ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVKMkVFQ29tcG9uZW50c0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JLy9wcml2YXRlIGludCBqMmVlVmVyc2lvbjsKLQotCXB1YmxpYyBBdmFpbGFibGVKMkVFQ29tcG9uZW50c0NvbnRlbnRQcm92aWRlcihpbnQgajJlZVZlcnNpb24pIHsKLQkJc3VwZXIoKTsKLS8vCQl0aGlzLmoyZWVWZXJzaW9uID0gajJlZVZlcnNpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJT2JqZWN0W10gZW1wdHkgPSBuZXcgT2JqZWN0WzBdOwotCQlpZiAoIShpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkpCi0JCQlyZXR1cm4gZW1wdHk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSAoKElXb3Jrc3BhY2VSb290KSBpbnB1dEVsZW1lbnQpLmdldFByb2plY3RzKCk7Ci0JCWlmIChwcm9qZWN0cyA9PSBudWxsIHx8IHByb2plY3RzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGVtcHR5OwotCQlMaXN0IHZhbGlkQ29tcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIGdldCBmbGV4aWJsZSBwcm9qZWN0Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlpZihNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKXsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkgfHwKLQkJCQkJCUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0KSB8fAotCQkJCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSB8fAotCQkJCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2plY3QpIHx8Ci0JCQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHByb2plY3QpICkKLQkJCQkJdmFsaWRDb21wTGlzdC5hZGQocHJvamVjdCk7Ci0JCQl9IGVsc2UKLQkJCQl0cnkgewotCQkJCQlpZiAocHJvamVjdC5leGlzdHMoKSAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpICYmIHByb2plY3QuaGFzTmF0dXJlKCJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIikpeyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWxpZENvbXBMaXN0LmFkZChwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsaWRDb21wTGlzdC50b0FycmF5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiAoKElWaXJ0dWFsQ29tcG9uZW50KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVKYXJzUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlSmFyc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjczMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVKYXJzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzcGF0aEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5PdmVybGF5SWNvbjsKLQotCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmxlSmFyc1Byb3ZpZGVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHV0aWxJbWFnZTsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGludmFsaWRJbWFnZTsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVqYkltYWdlOwotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZWpiQ2xpZW50SW1hZ2U7Ci0KLQkvKioKLQkgKiBBdmFpbGFibGVKYXJzQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEF2YWlsYWJsZUphcnNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeQotCSAqIHJlZ2lzdGVyZWQuCi0JICogPHA+Ci0JICogTGFiZWwgcHJvdmlkZXIgbGlzdGVuZXJzIGFyZSBpbmZvcm1lZCBhYm91dCBzdGF0ZSBjaGFuZ2VzIHRoYXQgYWZmZWN0IHRoZSByZW5kZXJpbmcgb2YgdGhlCi0JICogdmlld2VyIHRoYXQgdXNlcyB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGFiZWwgcHJvdmlkZXIgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyBsYWJlbCBwcm92aWRlci4gV2hlbiBhIGxhYmVsIHByb3ZpZGVyIGlzIGF0dGFjaGVkIHRvIGEgdmlld2VyLCB0aGUgdmlld2VyCi0JICogd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGUgdmlld2VyIGlzIGJlaW5nIGNsb3NlZC4gV2hlbiBsYWJlbCBwcm92aWRlcnMgYXJlCi0JICogdXNlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIGEgdmlld2VyLCBpdCBpcyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQKLQkgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcHJvdmlkZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2Rpc3Bvc2UKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBpbWFnZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCBubwotCSAqICAgICAgICAgICAgaW5wdXQgb2JqZWN0IGlzIHNldCBpbiB0aGUgdmlld2VyCi0JICogQHBhcmFtIGNvbHVtbkluZGV4Ci0JICogICAgICAgICAgICB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY29sdW1uIGluIHdoaWNoIHRoZSBsYWJlbCBhcHBlYXJzCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA+IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ2xhc3NwYXRoRWxlbWVudCBjcCA9IChDbGFzc3BhdGhFbGVtZW50KSBlbGVtZW50OwotCQlpZiAoIWNwLmlzVmFsaWQoKSkKLQkJCXJldHVybiBnZXRJbnZhbGlkSW1hZ2UoKTsKLQotCQlzd2l0Y2ggKGNwLmdldEphclR5cGUoKSkgewotCQkJY2FzZSBDbGFzc3BhdGhFbGVtZW50LkVKQl9KQVIgOgotCQkJCXJldHVybiBnZXRFamJJbWFnZSgpOwotCQkJY2FzZSBDbGFzc3BhdGhFbGVtZW50LkVKQl9DTElFTlRfSkFSIDoKLQkJCQlyZXR1cm4gZ2V0RWpiQ2xpZW50SW1hZ2UoKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBnZXRVdGlsSW1hZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBnaXZlbiBjb2x1bW4gb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgcm93LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgbm8KLQkgKiAgICAgICAgICAgIGlucHV0IG9iamVjdCBpcyBzZXQgaW4gdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqICAgICAgICAgICAgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB3aGljaCB0aGUgbGFiZWwgYXBwZWFycwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6IHsKLQkJCQl2YWx1ZSA9ICgoQ2xhc3NwYXRoRWxlbWVudCkgZWxlbWVudCkuZ2V0VGV4dCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSAxIDoKLQkJCQl2YWx1ZSA9ICgoQ2xhc3NwYXRoRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJvamVjdE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWU7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZ2V0RWpiSW1hZ2UoKSB7Ci0JCWlmIChlamJJbWFnZSA9PSBudWxsKQotCQkJZWpiSW1hZ2UgPSBnZXRJbWFnZURlc2NyaXB0b3IoIkVKQkphciIpLmNyZWF0ZUltYWdlKCk7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZWpiSW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBnZXRFamJDbGllbnRJbWFnZSgpIHsKLQkJaWYgKGVqYkNsaWVudEltYWdlID09IG51bGwpCi0JCQllamJDbGllbnRJbWFnZSA9IGdldEltYWdlRGVzY3JpcHRvcigiZWpiY2xpZW50amFyX29iaiIpLmNyZWF0ZUltYWdlKCk7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZWpiQ2xpZW50SW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyIHdoZW4gaXRzIGlucHV0IGlzIHNldCB0byB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwgaXRlbXMgaW4gYSBsaXN0LCBldGMuIFRoZSByZXN1bHQgaXMgbm90Ci0JICogbW9kaWZpZWQgYnkgdGhlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgaW5wdXQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gKENsYXNzUGF0aFNlbGVjdGlvbikgaW5wdXRFbGVtZW50OwotCQlyZXR1cm4gZmlsdGVyKHNlbGVjdGlvbiwgc2VsZWN0aW9uLmdldEZpbHRlckxldmVsKCkpLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdAotCSAqLwotCXByaXZhdGUgTGlzdCBmaWx0ZXIoQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbiwgaW50IGZpbHRlckxldmVsKSB7Ci0JCUxpc3QgbGlzdCA9IHNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50cygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBsaXN0LmdldChpKTsKLQkJCWlmICghZWxlbWVudC5pc1NlbGVjdGVkKCkpIHsKLQkJCQlzd2l0Y2ggKGZpbHRlckxldmVsKSB7Ci0JCQkJCWNhc2UgKENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfRUpCX0NMSUVOVF9KQVJTKSA6Ci0JCQkJCQlpZiAoZWxlbWVudC5pc0VKQkNsaWVudEphcigpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfRUpCX1NFUlZFUl9KQVJTKSA6Ci0JCQkJCQlpZiAoZWxlbWVudC5pc0VKQkphcigpICYmIHNlbGVjdGlvbi5nZXRPcHBvc2l0ZUVsZW1lbnQoZWxlbWVudCkgIT0gbnVsbCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0KLQkJVVJMIGdpZkltYWdlVVJMID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShrZXkpOwotCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChnaWZJbWFnZVVSTCk7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBnZXRJbnZhbGlkSW1hZ2UoKSB7Ci0JCWlmIChpbnZhbGlkSW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2UgPSBnZXRJbWFnZURlc2NyaXB0b3IoImphcl9ub25leGlzdF9vYmoiKTsvLyROT04tTkxTLTEkCi0JCQlJbWFnZURlc2NyaXB0b3Igb3ZlcmxheSA9IGdldEltYWdlRGVzY3JpcHRvcigid2FybmluZ19jbyIpOy8vJE5PTi1OTFMtMSQKLQkJCWludmFsaWRJbWFnZSA9IG5ldyBPdmVybGF5SWNvbihiYXNlLCBuZXcgSW1hZ2VEZXNjcmlwdG9yW11bXXt7b3ZlcmxheX19KS5jcmVhdGVJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBpbnZhbGlkSW1hZ2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRVdGlsSW1hZ2UoKSB7Ci0JCWlmICh1dGlsSW1hZ2UgPT0gbnVsbCkKLQkJCXV0aWxJbWFnZSA9IGdldEltYWdlRGVzY3JpcHRvcigiamFyX29iaiIpLmNyZWF0ZUltYWdlKCk7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdXRpbEltYWdlOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudAotCSAqIGVsZW1lbnQuCi0JICogPHA+Ci0JICogQSB0eXBpY2FsIHVzZSBmb3IgdGhpcyBtZXRob2QgaXMgcmVnaXN0ZXJpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYXMgYSBsaXN0ZW5lciB0byBjaGFuZ2VzIG9uCi0JICogdGhlIG5ldyBpbnB1dCAodXNpbmcgbW9kZWwtc3BlY2lmaWMgbWVhbnMpLCBhbmQgZGVyZWdpc3RlcmluZyB0aGUgdmlld2VyIGZyb20gdGhlIG9sZCBpbnB1dC4KLQkgKiBJbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgdGhlIGNvbnRlbnQgcHJvdmlkZXIgcHJvcGFnYXRlcyB0aGUgY2hhbmdlcyB0byB0aGUKLQkgKiB2aWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2xkSW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkaWQgbm90IHByZXZpb3VzbHkKLQkgKiAgICAgICAgICAgIGhhdmUgYW4gaW5wdXQKLQkgKiBAcGFyYW0gbmV3SW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkb2VzIG5vdCBoYXZlIGFuIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuCi0JICogZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBhIG5vbi1zdHJ1Y3R1cmFsIHZpZXdlciB1cGRhdGUuIElmIHRoZSBwcm9wZXJ0eQotCSAqIG1lbnRpb25lZCBpbiB0aGUgdXBkYXRlIGRvZXMgbm90IGFmZmVjdCB0aGUgbGFiZWwsIHRoZW4gdGhlIHZpZXdlciBuZWVkIG5vdCB1cGRhdGUgdGhlIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQKLQkgKiAgICAgICAgIHdvdWxkIGJlIHVuYWZmZWN0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdAotCSAqIHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZU1vZHVsZVByb2plY3RzUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlTW9kdWxlUHJvamVjdHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODFkZTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlTW9kdWxlUHJvamVjdHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJsZU1vZHVsZVByb2plY3RzUHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIG1vZGVsOwotCi0JcHVibGljIEF2YWlsYWJsZU1vZHVsZVByb2plY3RzUHJvdmlkZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJbW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJTGlzdCB2YWxpZE1vZHVsZVByb2plY3RzID0gbnVsbDsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSB7Ci0JCQlJUHJvamVjdFtdIHByb2plY3RzID0gKChJV29ya3NwYWNlUm9vdCkgaW5wdXRFbGVtZW50KS5nZXRQcm9qZWN0cygpOwotCQkJaWYgKHByb2plY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlpbnQgajJlZVZlcnNpb24gPSBtb2RlbC5nZXRJbnRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaXNWYWxpZChwcm9qZWN0c1tpXSwgajJlZVZlcnNpb24pKSB7Ci0JCQkJCQlpZiAodmFsaWRNb2R1bGVQcm9qZWN0cyA9PSBudWxsKQotCQkJCQkJCXZhbGlkTW9kdWxlUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl2YWxpZE1vZHVsZVByb2plY3RzLmFkZChwcm9qZWN0c1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHZhbGlkTW9kdWxlUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQlyZXR1cm4gdmFsaWRNb2R1bGVQcm9qZWN0cy50b0FycmF5KCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoSVByb2plY3QgcHJvamVjdCwgaW50IGoyZWVWZXJzaW9uKSB7Ci0JCS8vbWlncmF0ZSB0byBhcnRpZmFjdCBlZGl0cwotLy8JCXRyeSB7Ci0vLwkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpCi0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCUoyRUVOYXR1cmUgajJlZU5hdHVyZSA9IEoyRUVOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWUocHJvamVjdCk7Ci0vLwkJCWlmIChqMmVlTmF0dXJlICE9IG51bGwpIHsKLS8vCQkJCXJldHVybiBqMmVlTmF0dXJlLmdldEoyRUVWZXJzaW9uKCkgPD0gajJlZVZlcnNpb247Ci0vLwkJCX0gZWxzZSBpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkvL0lnbm9yZQotLy8JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gKChJUHJvamVjdCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbW9kZWwgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVVdGlsSmFyc0FuZFdlYkxpYlByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWVhMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVVdGlsSmFyc0FuZFdlYkxpYlByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjIsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5FQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkZpbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJsZVV0aWxKYXJzQW5kV2ViTGliUHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlcigpIHsKLQkJLy9EZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVBUkZpbGUpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuZ2V0QWxsVXRpbGl0aWVzKChFQVJGaWxlKSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQotCQkJTGlzdCBmaWx0ZXJlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGFycmF5ICE9IG51bGwgJiYgYXJyYXkubGVuZ3RoICE9IDApCi0JCQkJZmlsdGVyZWRQcm9qZWN0cyA9IGZpbHRlckVKQkNsaWVudEphcnMoYXJyYXksICgoRUFSRmlsZSkgaW5wdXRFbGVtZW50KSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0KLQkJCWFycmF5ID0gZmlsdGVyZWRQcm9qZWN0cy50b0FycmF5KCk7Ci0JCQlBcnJheXMuc29ydChhcnJheSwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCXJldHVybiBnZXRDb2x1bW5UZXh0KG8xLCAwKS5jb21wYXJlVG8oZ2V0Q29sdW1uVGV4dChvMiwgMCkpOwotCQkJCX0KLQotCQkJfSk7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFycmF5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBmaWx0ZXJFSkJDbGllbnRKYXJzKE9iamVjdFtdIGFycmF5LCBFQVJGaWxlIGVhcikgewotCQlMaXN0IHV0aWxpdGllcyA9IG5ldyBBcnJheUxpc3QoYXJyYXkubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJdXRpbGl0aWVzLmFkZChhcnJheVtpXSk7Ci0JCX0KLQkJTGlzdCBlamJKYXJzID0gZWFyLmdldEVKQkphckZpbGVzKCk7Ci0JCWlmIChlamJKYXJzICE9IG51bGwpIHsKLQkJCUxpc3QgY2xpZW50TmFtZXMgPSBuZXcgQXJyYXlMaXN0KGVqYkphcnMuc2l6ZSgpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWpiSmFycy5zaXplKCk7IGorKykgewotCQkJCUVKQkphciBqYXIgPSAoKEVKQkphckZpbGUpIGVqYkphcnMuZ2V0KGopKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCWlmIChqYXIgIT0gbnVsbCkgewotCQkJCQljbGllbnROYW1lcy5hZGQoamFyLmdldEVqYkNsaWVudEphcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2xpZW50TmFtZXMgIT0gbnVsbCAmJiAhY2xpZW50TmFtZXMuaXNFbXB0eSgpKSB7Ci0JCQkJTGlzdCB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGNsaWVudE5hbWVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIGNsaWVudE5hbWVzLmdldChrKTsKLQkJCQkJZm9yIChpbnQgbCA9IDA7IGwgPCB1dGlsaXRpZXMuc2l6ZSgpOyBsKyspIHsKLQkJCQkJCUZpbGUgZmlsZSA9IChGaWxlKSB1dGlsaXRpZXMuZ2V0KGwpOwotCQkJCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpCi0JCQkJCQkJdG9SZW1vdmUuYWRkKHV0aWxpdGllcy5nZXQobCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXV0aWxpdGllcy5yZW1vdmVBbGwodG9SZW1vdmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1dGlsaXRpZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBBdmFpbGFibGVKYXJzUHJvdmlkZXIuZ2V0VXRpbEltYWdlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJRmlsZUltcGwgZmlsZSA9IChGaWxlSW1wbCkgZWxlbWVudDsKLQkJaWYgKGZpbGUuZ2V0VVJJKCkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKSkgewotCQkJU3RyaW5nIHBhcmVudFdhckZpbGVOYW1lID0gKChXQVJGaWxlKSBmaWxlLmVDb250YWluZXIoKSkuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIHBhcmVudFdhckZpbGVOYW1lICsgIiMiICsgZmlsZS5nZXRVUkkoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmaWxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvL0F1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL0F1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9BdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTgyZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjIsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJsZVV0aWxpdHlKYXJzUHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlcigpIHsKLQkJLy9kZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJLyoKLQkJICogT2JqZWN0W10gYXJyYXkgPSBFQVJJbXBvcnREYXRhTW9kZWwuZ2V0QWxsVXRpbGl0aWVzKChFQVJGaWxlKSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJICovCi0JCU9iamVjdFtdIGFycmF5ID0gZ2V0SmFyRmlsZXNGcm9tRGlyZWN0b3J5KGlucHV0RWxlbWVudCk7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJcmV0dXJuIGdldENvbHVtblRleHQobzEsIDApLmNvbXBhcmVUbyhnZXRDb2x1bW5UZXh0KG8yLCAwKSk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW5wdXRFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gZ2V0SmFyRmlsZXNGcm9tRGlyZWN0b3J5KE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQotCQlMaXN0IGNvbGxlY3RlZEphcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSURhdGFNb2RlbCkKLQkJCW1vZGVsID0gKElEYXRhTW9kZWwpIGlucHV0RWxlbWVudDsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQotCQkJU3RyaW5nIGZpbGVOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVZBSUxBQkxFX0pBUlNfRElSRUNUT1JZKTsKLQkJCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQkJaWYgKGRpcmVjdG9yeS5leGlzdHMoKSAmJiBkaXJlY3RvcnkuY2FuUmVhZCgpICYmIGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJRmlsZVtdIGF2YWlsYWJsZUZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCi0JCQkJaWYgKGF2YWlsYWJsZUZpbGVzID09IG51bGwpCi0JCQkJCXJldHVybiBuZXcgRmlsZVswXTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXZhaWxhYmxlRmlsZXMubGVuZ3RoOyBpKyspCi0JCQkJCWlmIChhdmFpbGFibGVGaWxlc1tpXSAhPSBudWxsICYmIGF2YWlsYWJsZUZpbGVzW2ldLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpKWNvbGxlY3RlZEphcnMuYWRkKGF2YWlsYWJsZUZpbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBjb2xsZWN0ZWRKYXJzLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIEF2YWlsYWJsZUphcnNQcm92aWRlci5nZXRVdGlsSW1hZ2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkvKgotCQkgKiBGaWxlSW1wbCBmaWxlID0gKEZpbGVJbXBsKSBlbGVtZW50OyBpZgotCQkgKiAoZmlsZS5nZXRVUkkoKS5zdGFydHNXaXRoKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkkpKSB7IFN0cmluZyBwYXJlbnRXYXJGaWxlTmFtZSA9Ci0JCSAqICgoV0FSRmlsZSkgZmlsZS5lQ29udGFpbmVyKCkpLmdldE5hbWUoKTsgcmV0dXJuIHBhcmVudFdhckZpbGVOYW1lICsgIiMiICsgZmlsZS5nZXRVUkkoKTsKLQkJICogLy8kTk9OLU5MUy0xJCB9IGVsc2UgcmV0dXJuIGZpbGUuZ2V0TmFtZSgpOwotCQkgKi8KLQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9DbGFzc2VzSW1wb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0NsYXNzZXNJbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzNzE3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0NsYXNzZXNJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5Db3JlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5idWlsZHBhdGhzLkNQTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotcHVibGljIGNsYXNzIENsYXNzZXNJbXBvcnRXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXB1YmxpYyBXaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UgbWFpblBhZ2UgPSBudWxsOwotCi0JcHVibGljIFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMSBwYWdlMSA9IG51bGw7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIElQYXRoIGltcG9ydGVkQ2xhc3Nlc1BhdGg7Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBmaWxlTmFtZXMgPSBudWxsOwotCi0JcHVibGljIENsYXNzZXNJbXBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENsYXNzZXNJbXBvcnRXaXphcmQoSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCi0JfQotCi0JcHVibGljIENsYXNzZXNJbXBvcnRXaXphcmQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZpbGVOYW1lLCBMaXN0IG90aGVyRmlsZU5hbWVzKSB7Ci0JCXRoaXMocHJvamVjdCk7Ci0JCXRoaXMuZmlsZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmZpbGVOYW1lcy5hZGQoZmlsZU5hbWUpOwotCQlpbnQgaSA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJU3RyaW5nIHBhcmVudERpciA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpKTsKLQkJaWYgKG90aGVyRmlsZU5hbWVzICE9IG51bGwpCi0JCQlmb3IgKGludCBqID0gb3RoZXJGaWxlTmFtZXMuc2l6ZSgpIC0gMTsgaiA+PSAwOyBqLS0pIHsKLQkJCQlpZiAob3RoZXJGaWxlTmFtZXMuZ2V0KGopICE9IG51bGwpIHsKLQkJCQkJaW50IGsgPSAoKFN0cmluZykgb3RoZXJGaWxlTmFtZXMuZ2V0KGopKS5sYXN0SW5kZXhPZihqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCQkJCWlmIChrID09IGkgJiYgcGFyZW50RGlyLmVxdWFscygoKFN0cmluZykgb3RoZXJGaWxlTmFtZXMuZ2V0KGopKS5zdWJzdHJpbmcoMCwgaykpKSB7Ci0JCQkJCQlmaWxlTmFtZXMuYWRkKG90aGVyRmlsZU5hbWVzLnJlbW92ZShqKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb2xkZXJQYXRoKElQYXRoIHBhdGgpIHsKLQkJaW1wb3J0ZWRDbGFzc2VzUGF0aCA9IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gcGFnZTEuZmluaXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlSW1wb3J0ZWRDbGFzc2VzRm9sZGVyKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCS8vQ3JlYXRlIGltcG9ydGVkX2NsYXNzZXMgZm9sZGVyIHNlbGVjdGVkIHByb2plY3QKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBhUHJvamVjdDsKLQkJSUZvbGRlciBmb2xkZXIgPSBjb250YWluZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKCJpbXBvcnRlZF9jbGFzc2VzIikpOyAvLyROT04tTkxTLTEkCi0JCWphdmFQcm9qZWN0ID0gZ2V0SUphdmFQcm9qZWN0KGFQcm9qZWN0KTsKLQotCQlJUGF0aCBpbXBvcnRlZEZvbGRlcnNDbGFzcyA9IGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCi0JCUNQTGlzdEVsZW1lbnQgZW50cnkgPSBuZXdDUExpYnJhcnlFbGVtZW50KGZvbGRlcik7Ci0JCUlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeSA9IGVudHJ5LmdldENsYXNzcGF0aEVudHJ5KCk7Ci0KLQkJSVJlc291cmNlIHJlcyA9IGVudHJ5LmdldFJlc291cmNlKCk7Ci0JCWlmICgocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgJiYgIXJlcy5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlDb3JlVXRpbGl0eS5jcmVhdGVGb2xkZXIoKElGb2xkZXIpIHJlcywgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aCArIDFdOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQluZXdDbGFzc3BhdGhbaV0gPSBjbGFzc3BhdGhFbnRyaWVzW2ldOwotCQkJfQotCQkJbmV3Q2xhc3NwYXRoW2NsYXNzcGF0aEVudHJpZXMubGVuZ3RoXSA9IG5ld0VudHJ5OwotCi0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBudWxsKTsKLQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCi0JCXNldEZvbGRlclBhdGgoaW1wb3J0ZWRGb2xkZXJzQ2xhc3MpOwotCX0KLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldElKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0SGFuZGxlKSB7Ci0JCUlKYXZhTW9kZWwgamF2YU1vZGVsID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQlyZXR1cm4gamF2YU1vZGVsLmdldEphdmFQcm9qZWN0KHByb2plY3RIYW5kbGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIENQTGlzdEVsZW1lbnQgbmV3Q1BMaWJyYXJ5RWxlbWVudChJUmVzb3VyY2UgcmVzKSB7Ci0KLQkJcmV0dXJuIG5ldyBDUExpc3RFbGVtZW50KGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlksIHJlcy5nZXRGdWxsUGF0aCgpLCByZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJbXBvcnRfQ2xhc3NfRmlsZXNfVUkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImltcG9ydF9jbGFzc19maWxlX3dpel9iYW4iKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl3b3JrYmVuY2ggPSBhV29ya2JlbmNoOwotCQlzZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlpZiAoIWFTZWxlY3Rpb24uaXNFbXB0eSgpICYmIGFTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIGFTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCWNyZWF0ZUltcG9ydGVkQ2xhc3Nlc0ZvbGRlcihwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCQltYWluUGFnZSA9IG5ldyBXaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UoImlkIiwgZmlsZU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJbWFpblBhZ2Uuc2V0V2l6YXJkKHRoaXMpOwotCQkJaWYgKGZpbGVOYW1lcyA9PSBudWxsIHx8IGZpbGVOYW1lcy5zaXplKCkgPT0gMCkKLQkJCQlhZGRQYWdlKG1haW5QYWdlKTsKLQkJCXBhZ2UxID0gbmV3IFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMSh3b3JrYmVuY2gsIHNlbGVjdGlvbiwgaW1wb3J0ZWRDbGFzc2VzUGF0aCwgZmlsZU5hbWVzKTsKLQkJCXBhZ2UxLnNldFdpemFyZCh0aGlzKTsKLQkJCWFkZFBhZ2UocGFnZTEpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRGF0YU1vZGVsQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRGF0YU1vZGVsQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlOGIyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0RhdGFNb2RlbEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFubm90YXRpb25zRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cCB7Ci0KLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbCBtb2RlbDsKLSAgICBwcm90ZWN0ZWQgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7Ci0gICAgcHJvdGVjdGVkIEJ1dHRvbiB1c2VBbm5vdGF0aW9uczsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNGb3JCZWFuOwotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VTZXJ2bGV0U3RyaW5nID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJUQUdTRVQgPSAiZWpiIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRCZWFuRGVmYXVsdFVzZUFubm90YXRpb25zID0gZmFsc2U7Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFByb2plY3REZWZhdWx0VXNlQW5ub3RhdGlvbnMgPSBmYWxzZTsKLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS5nZXRTb3VyY2UoKTsKLSAgICAgICAgICAgIGlmIChpc0ZvckJlYW4pCi0gICAgICAgICAgICAgICAgc2hvdWxkQmVhbkRlZmF1bHRVc2VBbm5vdGF0aW9ucyA9IGJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzaG91bGRQcm9qZWN0RGVmYXVsdFVzZUFubm90YXRpb25zID0gYnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyIGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YU1vZGVsQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwgYm9vbGVhbiBmb3JCZWFuLCBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jSGVscCkgewotICAgICAgICB0aGlzKHBhcmVudCwgbW9kZWwsIGZvckJlYW4sIGZhbHNlLCBzeW5jSGVscCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YU1vZGVsQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwgYm9vbGVhbiBmb3JCZWFuLCBib29sZWFuIHVzZVNlcnZsZXQsIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNIZWxwKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgdGhpcy5pc0ZvckJlYW4gPSBmb3JCZWFuOwotICAgICAgICB0aGlzLnVzZVNlcnZsZXRTdHJpbmcgPSB1c2VTZXJ2bGV0OwotICAgICAgICBzeW5jaEhlbHBlciA9IHN5bmNIZWxwOwotICAgICAgICBidWlsZENvbXBvc2l0ZXMocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnVpbGRDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gQWRkIHNlcGFyYXRvcgotICAgICAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgLy8gQWRkIHNwYWNlcgotICAgICAgICBMYWJlbCBzcGFjZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWREYXRhIGdkMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZDEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBzcGFjZXIuc2V0TGF5b3V0RGF0YShnZDEpOwotICAgICAgICAvLyBBZGQgYW5ub3RhdGlvbnMgY2hlY2tib3ggYW5kIGxhYmVsCi0gICAgICAgIHVzZUFubm90YXRpb25zID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIFN0cmluZyBsYWJlbFRleHQ7Ci0gICAgICAgIGlmICh1c2VTZXJ2bGV0U3RyaW5nKQotICAgICAgICAgICAgbGFiZWxUZXh0ID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVVNFX0FOTk9UQVRJT05TX1NFUlZMRVQpOwotICAgICAgICBlbHNlIGlmIChpc0ZvckJlYW4pCi0gICAgICAgICAgICBsYWJlbFRleHQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5VU0VfQU5OT1RBVElPTlMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsYWJlbFRleHQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BRERfQU5OT1RBVElPTlNfU1VQUE9SVCk7Ci0gICAgICAgIHVzZUFubm90YXRpb25zLnNldFRleHQobGFiZWxUZXh0KTsKLSAgICAgICAgc3luY2hIZWxwZXIuc3luY2hDaGVja2JveCh1c2VBbm5vdGF0aW9ucywgSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUywgbnVsbCk7Ci0gICAgICAgIHVzZUFubm90YXRpb25zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIpOwotICAgICAgICBHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QyLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgdXNlQW5ub3RhdGlvbnMuc2V0TGF5b3V0RGF0YShnZDIpOwotICAgICAgICAvLyBJZiBmb3IgcHJvamVjdCwgc2V0IHRoZSBnbG9iYWwgYW5ub3RhdGlvbnMgc3VwcG9ydGVkCi0gICAgICAgIGlmICghaXNGb3JCZWFuKQotICAgICAgICAgICAgc2V0RW5hYmxlbWVudChudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBtb2RlbC5yZW1vdmVMaXN0ZW5lcihzeW5jaEhlbHBlcik7Ci0gICAgICAgIHN5bmNoSGVscGVyID0gbnVsbDsKLSAgICAgICAgbW9kZWwgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbnNTdXBwb3J0ZWQoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICAvL1RPRE8gY2xlYW4gdXAgdG8gYmUgbW9kdWxlIGJhc2VkLCBub3QgcHJvamVjdCBiYXNlZAotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gICAgICAgICAgaWYgKGlzRm9yQmVhbikgewotICAgICAgICAgICAgLy8gICAgICAgICAgICAgIEFubm90YXRpb25zQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgIC8vIEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVyKHByb2plY3QpOwotICAgICAgICAgICAgLy8gICAgICAgICAgICAgIHJldHVybiAoY29udHJvbGxlciAhPW51bGwgJiYgY29udHJvbGxlci5pc1RhZ0hhbmRsZXJJbnN0YWxsZWQoRUpCVEFHU0VUKSk7Ci0gICAgICAgICAgICAvLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBKMkVFTW9kdWxlTmF0dXJlIG5hdHVyZSA9IG51bGw7Ci0vLyAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaGFzTmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpKQotLy8gICAgICAgICAgICAgIG5hdHVyZSA9IChKMkVFTW9kdWxlTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLS8vICAgICAgICAgIGVsc2UgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0Lmhhc05hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpCi0vLyAgICAgICAgICAgICAgbmF0dXJlID0gKEoyRUVNb2R1bGVOYXR1cmUpIHByb2plY3QuZ2V0TmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKTsKLS8vCi0vLyAgICAgICAgICBpZiAoIWlzRm9yQmVhbiB8fCAobmF0dXJlICE9IG51bGwgJiYgbmF0dXJlLmdldEoyRUVWZXJzaW9uKCkgPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0vLyAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlbWVudChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICAvL2Jvb2xlYW4gaXNFbmFibGVkID0gaXNBbm5vdGF0aW9uc1N1cHBvcnRlZChwcm9qZWN0KTsKLSAgICAgICAgdXNlQW5ub3RhdGlvbnMuc2V0RW5hYmxlZCh0cnVlKTsKLS8vICAgICAgaWYgKCFpc0VuYWJsZWQgfHwgKCFpc0ZvckJlYW4gJiYgIXNob3VsZFByb2plY3REZWZhdWx0VXNlQW5ub3RhdGlvbnMpIHx8IChpc0ZvckJlYW4gJiYgIXNob3VsZEJlYW5EZWZhdWx0VXNlQW5ub3RhdGlvbnMpKSB7Ci0vLyAgICAgICAgICB1c2VBbm5vdGF0aW9ucy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotLy8gICAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUywgQm9vbGVhbi5GQUxTRSk7Ci0vLyAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICB1c2VBbm5vdGF0aW9ucy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0vLyAgICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TLCBCb29sZWFuLlRSVUUpOwotLy8gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU2VydmxldChib29sZWFuIGFCb29sZWFuKSB7Ci0gICAgICAgIHVzZVNlcnZsZXRTdHJpbmcgPSBhQm9vbGVhbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXNlQW5ub3RhdGlvbnMoYm9vbGVhbiBhQm9vbGVhbikgewotICAgICAgICBpZiAodXNlQW5ub3RhdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgdXNlQW5ub3RhdGlvbnMuc2V0U2VsZWN0aW9uKGFCb29sZWFuKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFByb3BlcnR5KElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlMsIG5ldyBCb29sZWFuKGFCb29sZWFuKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDhiOTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIzLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9QRyA9ICJzZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfV0laX1RJVExFKSk7Ci0JCVN0cmluZyBpY29uUGF0aCA9ICJpY29ucy9mdWxsLyI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpOwotCQkJVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaWNvblBhdGggKyAid2l6YmFuL25ld193aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gU2hvdWxkIG5vdCBoYXBwZW4uIElnbm9yZS4KLQkJfQotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgTmV3SjJFRUNvbXBvbmVudFNlbGVjdGlvblBhZ2UoZ2V0RGF0YU1vZGVsKCksIFNFTEVDVElPTl9QRykpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKCFzdXBlci5jYW5GaW5pc2goKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBnZXREYXRhTW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVOQUJMRUQpOwotCX0KLQotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudENyZWF0aW9uU2Vjb25kUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRDcmVhdGlvblNlY29uZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmNzVmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudENyZWF0aW9uU2Vjb25kUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVBUkNvbXBvbmVudENyZWF0aW9uU2Vjb25kUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzewotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBuZXdNb2R1bGVCdXR0b247Ci0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIG1vZHVsZVByb2plY3RzVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVDaGVja2VkU3RhdGUgPSBmYWxzZTsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50Q3JlYXRpb25TZWNvbmRQYWdlKElEYXRhTW9kZWwgIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0NPTVBPTkVOVF9TRUNPTkRfUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0NPTVBPTkVOVF9TRUNPTkRfUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX1dJWl9CQU5ORVIpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHtJRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkoyRUVfUFJPSkVDVFNfTElTVH07Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIG1vZHVsZXNHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbW9kdWxlc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0VBUl9BRERfTU9EVUxFU19QQUdFKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbW9kdWxlc0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljcmVhdGVNb2R1bGVQcm9qZWN0T3B0aW9ucyhtb2R1bGVzR3JvdXApOwotCQljcmVhdGVCdXR0b25zR3JvdXAobW9kdWxlc0dyb3VwKTsKLQkJcmV0dXJuIG1vZHVsZXNHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kdWxlc0dyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZHVsZVByb2plY3RPcHRpb25zKENvbXBvc2l0ZSBtb2R1bGVzR3JvdXApIHsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChtb2R1bGVzR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCWdEYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ0RhdGEpOwotCQlpbnQgajJlZVZlcnNpb24gPSBnZXREYXRhTW9kZWwoKS5nZXRJbnRQcm9wZXJ0eShDT01QT05FTlRfVkVSU0lPTik7Ci0JCUF2YWlsYWJsZUoyRUVDb21wb25lbnRzQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEF2YWlsYWJsZUoyRUVDb21wb25lbnRzQ29udGVudFByb3ZpZGVyKGoyZWVWZXJzaW9uKTsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIoKSk7Ci0JCXNldENoZWNrZWRJdGVtc0Zyb21Nb2RlbCgpOwotCQkKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmICghaWdub3JlQ2hlY2tlZFN0YXRlKSB7Ci0JCQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEoyRUVfUFJPSkVDVFNfTElTVCwgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpKTsKLQkJCQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSkFWQV9QUk9KRUNUX0xJU1QsIGdldENoZWNrZWRKYXZhUHJvamVjdHNBc0xpc3QoKSk7Ci0gICAgICAgICAgICAgICAgfQotCQkJfQotCQl9KTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JCW1vZHVsZVByb2plY3RzVmlld2VyLnNldFNvcnRlcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENoZWNrZWRJdGVtc0Zyb21Nb2RlbCgpIHsKLQkJTGlzdCBjb21wb25lbnRzID0gKExpc3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KElFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuSjJFRV9QUk9KRUNUU19MSVNUKTsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGNvbXBvbmVudHMudG9BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaE1vZHVsZXMoKSB7Ci0JCW1vZHVsZVByb2plY3RzVmlld2VyLnJlZnJlc2goKTsKLQkJc2V0Q2hlY2tlZEl0ZW1zRnJvbU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBtb2R1bGVQcm9qZWN0c1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJTGlzdCBsaXN0OwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkKLQkJCWxpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQllbHNlewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQlmb3IoIGludCBpPTA7IGk8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJCQlpZiggZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUHJvamVjdCApIHsKLQkJCQkJbGlzdC5hZGQoZWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQkKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldENoZWNrZWRKYXZhUHJvamVjdHNBc0xpc3QoKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gbW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCUxpc3QgbGlzdDsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApCi0JCQlsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJZWxzZXsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkJZm9yKCBpbnQgaT0wOyBpPCBlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYoIGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSVByb2plY3QgKSB7Ci0JCQkJCWxpc3QuYWRkKGVsZW1lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zR3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYnV0dG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gNDsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9QUk9KRUNUX01PRFVMRVNfUEdfU0VMRUNUKSk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9QUk9KRUNUX01PRFVMRVNfUEdfREVTRUxFQ1QpKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLndpZHRoSGludCA9IDEyMDsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW5ld01vZHVsZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJbmV3TW9kdWxlQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX1BST0pFQ1RfTU9EVUxFU19QR19ORVcpKTsKLQkJbmV3TW9kdWxlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCW5ld01vZHVsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQlpZiAoZXZ0LndpZGdldCA9PSBzZWxlY3RBbGxCdXR0b24pCi0JCQloYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCWVsc2UgaWYgKGV2dC53aWRnZXQgPT0gZGVzZWxlY3RBbGxCdXR0b24pCi0JCQloYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJZWxzZSBpZiAoZXZ0LndpZGdldCA9PSBuZXdNb2R1bGVCdXR0b24pCi0JCQloYW5kbGVOZXdNb2R1bGVCdXR0b25QcmVzc2VkKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZUV2ZW50KGV2dCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVOZXdNb2R1bGVCdXR0b25QcmVzc2VkKCkgewotCQlJRGF0YU1vZGVsIGFNb2RlbCA9IGNyZWF0ZU5ld01vZHVsZU1vZGVsKCk7Ci0JCURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgd2l6YXJkID0gbmV3IERlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQoYU1vZGVsKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkgewotCQkJSVdvcmtzcGFjZVJvb3QgaW5wdXQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICAgICAgc2V0TmV3TW9kdWxlcyhhTW9kZWwpOwotICAgICAgICAgICAgcmVmcmVzaE1vZHVsZXMoKTsKLQkJfQotCX0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TmV3TW9kdWxlcyhJRGF0YU1vZGVsIGRlZmF1bHRNb2RlbCkgewotICAgICAgICBMaXN0IG5ld0NvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNvbGxlY3ROZXdDb21wb25lbnRzKGRlZmF1bHRNb2RlbCwgbmV3Q29tcG9uZW50cyk7Ci0gICAgICAgIExpc3Qgb2xkQ29tcG9uZW50cyA9IChMaXN0KSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShJRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkoyRUVfUFJPSkVDVFNfTElTVCk7Ci0gICAgICAgIG5ld0NvbXBvbmVudHMuYWRkQWxsKG9sZENvbXBvbmVudHMpOwotICAgICAgICBnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShJRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkoyRUVfUFJPSkVDVFNfTElTVCwgbmV3Q29tcG9uZW50cyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0TmV3Q29tcG9uZW50cyhJRGF0YU1vZGVsIGRlZmF1bHRNb2RlbCwgTGlzdCBuZXdQcm9qZWN0cykgewotICAgICAgICBjb2xsZWN0Q29tcG9uZW50cyhkZWZhdWx0TW9kZWwuZ2V0TmVzdGVkTW9kZWwoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9FSkIpLCBuZXdQcm9qZWN0cyk7Ci0gICAgICAgIGNvbGxlY3RDb21wb25lbnRzKGRlZmF1bHRNb2RlbC5nZXROZXN0ZWRNb2RlbChJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX01PREVMX1dFQiksIG5ld1Byb2plY3RzKTsKLSAgICAgICAgY29sbGVjdENvbXBvbmVudHMoZGVmYXVsdE1vZGVsLmdldE5lc3RlZE1vZGVsKElEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfTU9ERUxfQ0xJRU5UKSwgbmV3UHJvamVjdHMpOwotICAgICAgICBjb2xsZWN0Q29tcG9uZW50cyhkZWZhdWx0TW9kZWwuZ2V0TmVzdGVkTW9kZWwoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9KQ0EpLCBuZXdQcm9qZWN0cyk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0Q29tcG9uZW50cyhJRGF0YU1vZGVsIGNvbXBETSwgTGlzdCBuZXdQcm9qZWN0cykgewotICAgICAgICBpZiAoY29tcERNICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGNvbXBETS5nZXRTdHJpbmdQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0gICAgICAgICAgICBpZihwcm9qZWN0TmFtZSA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyBjb21wTmFtZSA9IGNvbXBETS5nZXRTdHJpbmdQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICBuZXdQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGNyZWF0ZU5ld01vZHVsZU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRlZmF1bHRNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCS8vIHRyYW5zZmVyIHByb3BlcnRpZXMsIHByb2plY3QgbmFtZQotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlkZWZhdWx0TW9kZWwuc2V0UHJvcGVydHkoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCQkvLyBlYXIgY29tcG9uZW50IG5hbWUKLQkJU3RyaW5nIGVhck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT01QT05FTlRfTkFNRSk7Ci0JCWRlZmF1bHRNb2RlbC5zZXRQcm9wZXJ0eShJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9OQU1FLCBlYXJOYW1lKTsKLQkJLy8gZWFyIGoyZWUgdmVyc2lvbgotCQlpbnQgajJlZVZlcnNpb24gPSBtb2RlbC5nZXRJbnRQcm9wZXJ0eShDT01QT05FTlRfVkVSU0lPTik7Ci0JCWRlZmF1bHRNb2RlbC5zZXRQcm9wZXJ0eShJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihqMmVlVmVyc2lvbikpOwotCQlyZXR1cm4gZGVmYXVsdE1vZGVsOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlpZ25vcmVDaGVja2VkU3RhdGUgPSB0cnVlOwotCQl0cnkgewotCQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCQkvL2dldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEoyRUVfQ09NUE9ORU5UX0xJU1QsIG51bGwpOwotCQkJLy9JRGF0YU1vZGVsIG5lc3RlZE1vZGVsID0gKElEYXRhTW9kZWwpZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoTkVTVEVEX0FERF9DT01QT05FTlRfVE9fRUFSX0RNKTsJCi0JCQkvLyhuZXN0ZWRNb2RlbCkuc2V0UHJvcGVydHkoQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlci4sIGdldENoZWNrZWRKMkVFRWxlbWVudHNBc0xpc3QoKSk7Ci0JCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShKMkVFX1BST0pFQ1RTX0xJU1QsIG51bGwpOwotCQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSkFWQV9QUk9KRUNUX0xJU1QsIG51bGwpOwkJCQotCQl9IGZpbmFsbHkgewotCQkJaWdub3JlQ2hlY2tlZFN0YXRlID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCWlnbm9yZUNoZWNrZWRTdGF0ZSA9IHRydWU7Ci0JCXRyeSB7Ci0JCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotCQkJLy9nZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShKMkVFX0NPTVBPTkVOVF9MSVNULCBnZXRDaGVja2VkRWxlbWVudHNBc0xpc3QoKSk7Ci0JCQkvL0lEYXRhTW9kZWwgbmVzdGVkTW9kZWwgPSAoSURhdGFNb2RlbClnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShORVNURURfQUREX0NPTVBPTkVOVF9UT19FQVJfRE0pOwotCQkJLy8obmVzdGVkTW9kZWwpLnNldFByb3BlcnR5KEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIuLCBnZXRDaGVja2VkSjJFRUVsZW1lbnRzQXNMaXN0KCkpOwotCQkJCi0JCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShKMkVFX1BST0pFQ1RTX0xJU1QsIGdldENoZWNrZWRKMkVFRWxlbWVudHNBc0xpc3QoKSk7Ci0JCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShKQVZBX1BST0pFQ1RfTElTVCwgZ2V0Q2hlY2tlZEphdmFQcm9qZWN0c0FzTGlzdCgpKTsKLQkJCQotCQl9IGZpbmFsbHkgewotCQkJaWdub3JlQ2hlY2tlZFN0YXRlID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuSjJFRVdpemFyZFBhZ2UjZW50ZXIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotCQlJV29ya3NwYWNlUm9vdCBpbnB1dCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCW1vZHVsZVByb2plY3RzVmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJc3VwZXIuZW50ZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhMjhmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgZXh0ZW5kcyBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgaW1wbGVtZW50cyBJRXhlY3V0YWJsZUV4dGVuc2lvbiwgSU5ld1dpemFyZCB7Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIFdpemFyZCBJRCBvZiB0aGUgRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuIFVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzIGFuZCBhY3Rpdml0aWVzIG1hbmFnZW1lbnQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9ICBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EX1BHID0gInNlY29uZCI7IC8vJE5PTi1OTFMtMSQKLQkgCi0JCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIAotCSAqIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8gb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIAotCSAqIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scwotCSAqIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCS8qKiAKLQkgKiB7QGluaGVyaXREb2N9ICAgCi0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGlhbG9nIHdpbmRvdyB0aXRsZSBhbmQgZGVmYXVsdCBwYWdlIGltYWdlLiAKLQkgKiA8L3A+IAotCSAqIAotCSAqIEBzZWUgSjJFRUFydGlmYWN0Q3JlYXRpb25XaXphcmQjZG9Jbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9DT01QT05FTlRfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9XSVpfQkFOTkVSKSk7Ci0JfSAKLQkgCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIEFkZHMgYSB7QGxpbmsgSkNBUHJvamVjdENyZWF0aW9uUGFnZX0gYXMgdGhlIHtAbGluayBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQjTUFJTl9QR30uCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCUVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZSBwYWdlMSA9IG5ldyBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcpOwotCQlwYWdlMS5zZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0VBUl9DT01QX1BBR0UpOyAvLyROT04tTkxTLTEkCi0JCWFkZFBhZ2UocGFnZTEpOwotCQlFQVJDb21wb25lbnRDcmVhdGlvblNlY29uZFBhZ2UgcGFnZTIgPSBuZXcgRUFSQ29tcG9uZW50Q3JlYXRpb25TZWNvbmRQYWdlKGdldERhdGFNb2RlbCgpLCBTRUNPTkRfUEcpOwotCQlhZGRQYWdlKHBhZ2UyKTsKLQkJc3VwZXIuZG9BZGRQYWdlcygpOwotCX0KLQotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICAgICAgCi0gICAgfSAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4ZGQxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UgewotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAyNTA7Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0NPTVBPTkVOVF9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9DT01QT05FTlRfTUFJTl9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfV0laX0JBTk5FUikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVNb2R1bGVDcmVhdGlvblBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvQWR2YW5jZWRDb21wb3NpdGUoQ29tcG9zaXRlIGFkdmFuY2VkKSB7Ci0JCXN1cGVyLmFkZFRvQWR2YW5jZWRDb21wb3NpdGUoYWR2YW5jZWQpOwotCX0KLQotCS8vVE9ETzogdXRpbGl0eSB0byBoYW5kbGUgYWRkaXRpb25zCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgQ09NUE9ORU5UX05BTUUsIENPTVBPTkVOVF9WRVJTSU9OLCBJSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FX1RBUkdFVF9JRCB9OwotICAgIH0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRFeHBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5Yjc0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUFSQ29tcG9uZW50RXhwb3J0UGFnZSBleHRlbmRzIEoyRUVFeHBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50RXhwb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9FWFBPUlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfRVhQT1JUX01BSU5fUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfUFJPSkVDVF9GT1JfTU9EVUxFX0NSRUFUSU9OKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLmVhciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNob3dQcm9qZWN0RmlsZXNDaGVja2JveCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUV4cG9ydFBhZ2UjaXNNZXRhVHlwZVN1cHBvcnRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWV0YVR5cGVTdXBwb3J0ZWQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9ERVNUSU5BVElPTiwgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9FWElTVElOR307Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmZvcG9wSUQoKSB7Ci0JCXJldHVybiBJSjJFRVVJQ29udGV4dElkcy5FWFBPUlRfRUFSX1dJWkFSRF9QMTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBuZW50SUQoKSB7Ci0gICAgICAgIHJldHVybiAiSlNUX0VBUiI7ICAvLyROT04tTkxTLTEkCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQxZjhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5FQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFdpemFyZCB1c2VkIHRvIGV4cG9ydCBKMkVFIEVudGVycHJpc2UgQXBwbGljYXRpb24gc3RydWN0dXJlcyBmcm9tIHRoZSBFY2xpcHNlIFdvcmtiZW5jaCB0byBhCi0gKiBkZXBsb3lhYmxlIEVudGVycHJpc2UgQXBwbGljYXRpb24gQXJjaGl2ZSAqLmVhciBmaWxlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkIGltcGxlbWVudHMgSUV4cG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubwotCSAqIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudEV4cG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFQVJDb21wb25lbnRFeHBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0gICAgcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRUFSQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICB9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIHRoZSBmb2xsb3dpbmcgcGFnZXM6Ci0JICogPHVsPgotCSAqIDxsaT57QGxpbmsgRUFSQ29tcG9uZW50RXhwb3J0UGFnZX1hcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNNQUlOX1BHfSkKLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBFQVJDb21wb25lbnRFeHBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHLCBnZXRTZWxlY3Rpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9FWFBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0T3B0aW9uc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0T3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1YWVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgOCwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUFSQ29tcG9uZW50SW1wb3J0T3B0aW9uc1BhZ2UgZXh0ZW5kcyBKMkVFSW1wb3J0UGFnZSB7Ci0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotCXByaXZhdGUgTGFiZWwgbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiB1c2VBbHRlcm5hdGVSb290QnRuOwotCXByb3RlY3RlZCBUZXh0IHN5c3RlbURlZmF1bHRUZXh0OwotCXByb3RlY3RlZCBFQVJGaWxlIGVhckZpbGU7Ci0JcHVibGljIENoZWNrYm94VGFibGVWaWV3ZXIgYXZhaWxhYmxlSkFSc1ZpZXdlcjsKLQlwdWJsaWMgYm9vbGVhbiB1dGlsSmFyU2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfRUFSX1dJWkFSRF9QMik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNyZWF0ZUpBUnNDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJY3JlYXRlUHJvamVjdFJvb3RDb21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogVXBkYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBhbGwgYnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbkVuYWJsZW1lbnRzKCkgewotCQl1dGlsSmFyU2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXZhaWxhYmxlSmFyc0xpc3QoQ29tcG9zaXRlIGxpc3RHcm91cCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QobGlzdEdyb3VwLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDIwMDsKLQkJZ0RhdGEuaGVpZ2h0SGludCA9IDgwOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlciBhdmFpbGFibGVVdGlsSkFSc1Byb3ZpZGVyID0gbmV3IEF2YWlsYWJsZVV0aWxKYXJzQW5kV2ViTGliUHJvdmlkZXIoKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYXZhaWxhYmxlVXRpbEpBUnNQcm92aWRlcik7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihhdmFpbGFibGVVdGlsSkFSc1Byb3ZpZGVyKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJYXZhaWxhYmxlSkFSQ2hlY2tTdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUJ1dHRvbkVuYWJsZW1lbnRzKCk7Ci0JCQl9Ci0JCX0pOwotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQotCQltb2RlbC5hZGRMaXN0ZW5lcihuZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0xJU1QpKSB7Ci0JCQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKCgoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuVVRJTElUWV9MSVNUKSkudG9BcnJheSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCUFycmF5TGlzdCBlbXB0eVNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfTElTVCwgZW1wdHlTZWxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlBcnJheUxpc3QgYWxsU2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyAobnVsbCAhPSAoc2VsZWN0aW9uID0gYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRFbGVtZW50QXQoaSkpKTsgaSsrKSB7Ci0JCQlhbGxTZWxlY3Rpb24uYWRkKHNlbGVjdGlvbik7Ci0JCX0KLQkJbW9kZWwuc2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuVVRJTElUWV9MSVNULCBhbGxTZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVCcm93c2VCdXR0b25QcmVzc2VkKCkgewotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhicm93c2VCdXR0b24uZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlNFTEVDVF9ESVJFQ1RPUllfRExHKSk7Ci0KLQkJU3RyaW5nIGRpck5hbWUgPSBnZXRCcm93c2VTdGFydExvY2F0aW9uKCk7Ci0KLQkJaWYgKCFpc051bGxPckVtcHR5KGRpck5hbWUpKSB7Ci0JCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkaXJOYW1lKTsKLQkJCWlmIChwYXRoLmV4aXN0cygpKQotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQl9Ci0KLQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQlzeXN0ZW1EZWZhdWx0VGV4dC5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QnJvd3NlU3RhcnRMb2NhdGlvbigpIHsKLQkJU3RyaW5nIHRleHQgPSBzeXN0ZW1EZWZhdWx0VGV4dC5nZXRUZXh0KCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBidXR0b25Hcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX1NFTEVDVF9BTExfVVRJTF9CVVRUT04pKTsgLy8kTk9OLU5MUy0xJCA9ICJTZWxlY3QgQWxsIgotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfREVTRUxFQ1RfQUxMX1VUSUxfQlVUVE9OKSk7IC8vJE5PTi1OTFMtMSQgPSAiRGVzZWxlY3QgQWxsIgotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUpBUnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJZ3JvdXAuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX0pBUlNfR1JPVVApKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChncm91cCwgU1dULk5VTEwpOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfU0VMRUNUX1VUSUxfSkFSU19UT19CRV9QUk9KRUNUUykpOwotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShnZDIpOwotCi0JCS8vIGNyZWF0ZSBqYXJzIGNoZWNrIGJveCB2aWV3ZXIKLQkJY3JlYXRlQXZhaWxhYmxlSmFyc0xpc3QoZ3JvdXApOwotCQljcmVhdGVCdXR0b25zR3JvdXAoZ3JvdXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3RSb290Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWdyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuUFJPSkVDVF9MT0NBVElPTlNfR1JPVVApKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChncm91cCwgU1dULk5VTEwpOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19QUk9KRUNUX0dST1VQX0RFU0NSSVBUSU9OKSk7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZDIuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLQkJbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5VU0VfREVGQVVMVF9ST09UX1JBRElPKSk7Ci0JCW1vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCXN5c3RlbURlZmF1bHRUZXh0ID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzeXN0ZW1EZWZhdWx0VGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHN5c3RlbURlZmF1bHRUZXh0LCBJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfTU9EVUxFX1JPT1QsIG51bGwpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoZGVmQnJvd3NlQnV0dG9uTGFiZWwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hFQVJGaWxlSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChpc0VBUkZpbGVDaGFuZ2VkKCkpIHsKLQkJCWVhckZpbGUgPSAoRUFSRmlsZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEUpOwotCQkJcmVmcmVzaCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SkFSc0NvbXBvc2l0ZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldEFsbEdyYXllZCghZW5hYmxlZCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoKCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldElucHV0KGVhckZpbGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRUFSRmlsZUNoYW5nZWQoKSB7Ci0JCXJldHVybiBlYXJGaWxlICE9IG1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJc3VwZXIuZW50ZXIoKTsKLQkJcmVmcmVzaEVBUkZpbGVJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGF2YWlsYWJsZUpBUkNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuVVRJTElUWV9MSVNULCBnZXRKQVJzRm9yUHJvamVjdHMoKSk7Ci0JCXZhbGlkYXRlUGFnZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEpBUnNGb3JQcm9qZWN0cygpIHsKLQkJcmVmcmVzaEVBUkZpbGVJZk5lY2Vzc2FyeSgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxPckVtcHR5KFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBhU3RyaW5nID09IG51bGwgfHwgYVN0cmluZy5sZW5ndGgoKSA9PSAwOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXt9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0JCS8vIFRoaXMgcGFnZSBkb2Vzbid0IGltcGxlbWVudC4uLgotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQkvLyBUaGlzIHBhZ2UgZG9lc24ndCBpbXBsZW1lbnQuLi4KLQl9Ci0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxM2Q2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA4LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVBUkNvbXBvbmVudEltcG9ydFBhZ2UgZXh0ZW5kcyBKMkVFSW1wb3J0UGFnZSB7Ci0JcHJvdGVjdGVkIENvbWJvIHNlcnZlclRhcmdldENvbWJvOwotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudEltcG9ydFBhZ2UoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihkYXRhTW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfTUFJTl9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX0VBUl9XSVpBUkRfUDEpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljcmVhdGVGaWxlTmFtZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljcmVhdGVQcm9qZWN0TmFtZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljcmVhdGVBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChjb21wb3NpdGUpOwotCQlyZXN0b3JlV2lkZ2V0VmFsdWVzKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TmV3UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGVhck1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWVhck1vZGVsLnNldEludFByb3BlcnR5KElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OLCBtb2RlbC5nZXRJbnRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTikpOwotCQllYXJNb2RlbC5zZXRQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgbW9kZWwuZ2V0UHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpKTsKLQkJZWFyTW9kZWwuc2V0UHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgbW9kZWwuZ2V0UHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSkpOwotCQlyZXR1cm4gZWFyTW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX1BST0pFQ1RfTEFCRUwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbGVJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlSW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX0ZJTEVfTEFCRUwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLmVhciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRU1vZHVsZUltcG9ydFBhZ2UjY3JlYXRlQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gbmV3IEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKGNvbXBvc2l0ZSwgbW9kZWwsIGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIElKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRV9UQVJHRVRfSUQsIElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlN9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbGVOYW1lc1N0b3JlSUQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpIHsKLQkJcmV0dXJuICJFQVIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Y2ZkYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gaW1wb3J0IEoyRUUgQXBwbGljYXRpb24gc3RydWN0dXJlcyBpbnRvIHRoZSBFY2xpcHNlIFdvcmtiZW5jaCBmcm9tIGFuIGV4aXN0aW5nCi0gKiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIEFyY2hpdmUgKi5lYXIgZmlsZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVBUkNvbXBvbmVudEltcG9ydFdpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydFdpemFyZCBpbXBsZW1lbnRzIElFeGVjdXRhYmxlRXh0ZW5zaW9uLCBJSW1wb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0YW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBvZiB0aGUgUHJvamVjdHMgcGFnZSBvZiB0aGUgV2l6YXJkLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1BHID0gInByb2plY3RzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBPcHRpb25zIHBhZ2Ugb2YgdGhlIFdpemFyZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OU19QRyA9ICJvcHRpb25zIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiMzgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFQVJDb21wb25lbnRJbXBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCIzOCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayBFQVJDb21wb25lbnRJbXBvcnRQYWdlfWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KQotCSAqIDxsaT57QGxpbmsgRUFSQ29tcG9uZW50SW1wb3J0T3B0aW9uc1BhZ2V9YXMgdGhlIG9wdGlvbnMgd2l6YXJkIHBhZ2UgKHtAbGluayAjT1BUSU9OU19QR30pCi0JICogPGxpPntAbGluayBFQVJDb21wb25lbnRQcm9qZWN0c1BhZ2V9YXMgdGhlIHByb2plY3Qgd2l6YXJkIHBhZ2UgKHtAbGluayAjUFJPSkVDVF9QR30pCi0JICogPC91bD4KLQkgKiAKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgRUFSQ29tcG9uZW50SW1wb3J0UGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRykpOwotCQlhZGRQYWdlKG5ldyBFQVJDb21wb25lbnRJbXBvcnRPcHRpb25zUGFnZShnZXREYXRhTW9kZWwoKSwgT1BUSU9OU19QRykpOwotCQlhZGRQYWdlKG5ldyBFQVJDb21wb25lbnRQcm9qZWN0c1BhZ2UoZ2V0RGF0YU1vZGVsKCksIFBST0pFQ1RfUEcpKTsKLQl9Ci0KLQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRpYWxvZyB3aW5kb3cgdGl0bGUgYW5kIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSU1QT1JUX1dJWl9USVRMRSkpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50UHJvamVjdHNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudFByb2plY3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTZlOWJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50UHJvamVjdHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgOCwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRQcm9qZWN0c1BhZ2UgZXh0ZW5kcyBKMkVFSW1wb3J0UGFnZSB7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgZWFyRmlsZUxpc3RWaWV3ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0NPTFVNTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFQVJJbXBvcnRQcm9qZWN0c1BhZ2VfVUlfMCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9DT0xVTU4gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUFSSW1wb3J0UHJvamVjdHNQYWdlX1VJXzEiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfQ09MVU1OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVBUkltcG9ydFByb2plY3RzUGFnZV9VSV8yIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBFQVJDb21wb25lbnRQcm9qZWN0c1BhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfUFJPSkVDVF9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX1BST0pFQ1RfUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX0VBUl9XSVpBUkRfUDMpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljcmVhdGVMaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQnV0dG9uc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb2x1bW5FZGl0b3JzKCkgewotCQlUYWJsZSB0ID0gZWFyRmlsZUxpc3RWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJQ2VsbEVkaXRvcltdIGNvbHVtbkVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclt0LmdldENvbHVtbkNvdW50KCldOwotCQljb2x1bW5FZGl0b3JzWzFdID0gbmV3IFRleHRDZWxsRWRpdG9yKHQpOwotCi0JCWVhckZpbGVMaXN0Vmlld2VyLnNldENlbGxFZGl0b3JzKGNvbHVtbkVkaXRvcnMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBidXR0b25Hcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJQnV0dG9uIHNlbGVjdE5vdEluV29ya3NwYWNlID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlzZWxlY3ROb3RJbldvcmtzcGFjZS5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFQVJJbXBvcnRQcm9qZWN0c1BhZ2VfVUlfMyIpKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlzZWxlY3ROb3RJbldvcmtzcGFjZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VsZWN0Tm90SW5Xb3Jrc3BhY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFMTF9QUk9KRUNUX01PREVMU19MSVNUKTsKLQkJCQlMaXN0IHNlbGVjdGVkTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TRUxFQ1RFRF9NT0RFTFNfTElTVCk7Ci0JCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW5ld0xpc3QuYWRkQWxsKHNlbGVjdGVkTGlzdCk7Ci0JCQkJSURhdGFNb2RlbCBpbXBvcnRETSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCWltcG9ydERNID0gKElEYXRhTW9kZWwpIGxpc3QuZ2V0KGkpOwotCQkJCQlpZiAoIW5ld0xpc3QuY29udGFpbnMoaW1wb3J0RE0pICYmICEoKElWaXJ0dWFsQ29tcG9uZW50KSBpbXBvcnRETS5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UKSkuZXhpc3RzKCkpIHsKLQkJCQkJCW5ld0xpc3QuYWRkKGltcG9ydERNKTsKLQkJCQkJfQotCQkJCX0KLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TRUxFQ1RFRF9NT0RFTFNfTElTVCwgbmV3TGlzdCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfU0VMRUNUX0FMTF9VVElMX0JVVFRPTikpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QpOwotCQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQluZXdMaXN0LmFkZEFsbChsaXN0KTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TRUxFQ1RFRF9NT0RFTFNfTElTVCwgbmV3TGlzdCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX0RFU0VMRUNUX0FMTF9VVElMX0JVVFRPTikpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNULCBuZXdMaXN0KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QpKSB7Ci0JCQlpZihlYXJGaWxlTGlzdFZpZXdlciAhPSBudWxsKXsKLQkJCQl1cGRhdGVHVUlDaGVja1NlbGVjdGlvbigpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsZUxpc3RWaWV3ZXJJbnB1dCgpIHsKLQkJVGFibGVPYmplY3RzIGZpbGVzID0gbmV3IFRhYmxlT2JqZWN0cygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QpKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlmaWxlcy50YWJsZU9iamVjdHNMaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCWVhckZpbGVMaXN0Vmlld2VyLnNldElucHV0KGZpbGVzKTsKLQkJdXBkYXRlR1VJQ2hlY2tTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR1VJQ2hlY2tTZWxlY3Rpb24oKSB7Ci0JCUxpc3Qgc2VsZWN0ZWRMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNUKTsKLQkJTGlzdCBwcm9qZWN0TGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BTExfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCU9iamVjdCBjdXJyZW50RWxlbWVudCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWN1cnJlbnRFbGVtZW50ID0gcHJvamVjdExpc3QuZ2V0KGkpOwotCQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0Q2hlY2tlZChjdXJyZW50RWxlbWVudCwgc2VsZWN0ZWRMaXN0LmNvbnRhaW5zKGN1cnJlbnRFbGVtZW50KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLndpemFyZC5KMkVFV2l6YXJkUGFnZSNlbnRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JCXNldEZpbGVMaXN0Vmlld2VySW5wdXQoKTsKLQkJdmFsaWRhdGVQYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgaW1wb3J0IHNvdXJjZSBzcGVjaWZpY2F0aW9uIHdpZGdldHMuIDxiPlN1YmNsYXNzZXMgPC9iPiBtdXN0IG92ZXJyaWRlIHRoaXMgaG9vawotCSAqIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCBpcyB0byBiZSB1c2VkIGFzIHRoZSBwYXJlbnQgb2YgdGhpcyBncm91cCdzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIHZpc3VhbCBjb21wb25lbnRzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0R3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgbGlzdEdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJbGlzdEdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCWVhckZpbGVMaXN0Vmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QobGlzdEdyb3VwLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWVhckZpbGVMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0JCWVhckZpbGVMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCQllYXJGaWxlTGlzdFZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSURhdGFNb2RlbCBtYXRjaGluZ01vZGVsID0gbnVsbDsvLyBnZXRFQVJJbXBvcnREYXRhTW9kZWwoKS5nZXRNYXRjaGluZ0VKQkphck9yQ2xpZW50KGFNb2RlbCk7Ci0JCQkJaWYgKG51bGwgIT0gbWF0Y2hpbmdNb2RlbCkgewotCQkJCQllYXJGaWxlTGlzdFZpZXdlci5zZXRDaGVja2VkKG1hdGNoaW5nTW9kZWwsIGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJfQotCQkJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChlYXJGaWxlTGlzdFZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSkpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNULCByZXN1bHQpOwotCi0JCQl9Ci0JCX0pOwotCi0JCVRhYmxlIGVhckZpbGVMaXN0VGFibGUgPSAoVGFibGUpIGVhckZpbGVMaXN0Vmlld2VyLmdldENvbnRyb2woKTsKLQkJZWFyRmlsZUxpc3RUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQllYXJGaWxlTGlzdFRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJLy8gc2V0IHVwIHRhYmxlIGxheW91dAotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTAwLCB0cnVlKSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMjAwLCB0cnVlKSk7Ci0JCWVhckZpbGVMaXN0VGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZ2Qud2lkdGhIaW50ID0gNDAwOwotCQllYXJGaWxlTGlzdFRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCi0KLQkJVGFibGVDb2x1bW4gZmlsZU5hbWVDb2x1bW5zID0gbmV3IFRhYmxlQ29sdW1uKGVhckZpbGVMaXN0VGFibGUsIFNXVC5OT05FKTsKLQkJZmlsZU5hbWVDb2x1bW5zLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9Nb2R1bGVzX2luX0VBUikpOyAvLyROT04tTkxTLTEkID0gIk1vZHVsZXMgaW4gRUFSIgotCQlmaWxlTmFtZUNvbHVtbnMuc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGltcG9ydE5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZWFyRmlsZUxpc3RUYWJsZSwgU1dULk5PTkUpOwotCQlpbXBvcnROYW1lQ29sdW1uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9OZXdfUHJvamVjdF9OYW1lKSk7IC8vJE5PTi1OTFMtMSQgPSAiTmV3IFByb2plY3QgTmFtZSIKLQkJaW1wb3J0TmFtZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJU3RyaW5nW10gY29sdW1uUHJvcGVydGllcyA9IG5ldyBTdHJpbmdbMl07Ci0JCWNvbHVtblByb3BlcnRpZXNbMF0gPSBGSUxFX0NPTFVNTjsKLQkJY29sdW1uUHJvcGVydGllc1sxXSA9IFBST0pFQ1RfQ09MVU1OOwotCQllYXJGaWxlTGlzdFZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0JCXNldENvbHVtbkVkaXRvcnMoKTsKLQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gUFJPSkVDVF9DT0xVTU4uZXF1YWxzKHByb3BlcnR5KTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJVGFibGVJdGVtW10gaXRlbXMgPSBlYXJGaWxlTGlzdFZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbigpOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbMF07Ci0JCQkJcmV0dXJuIGl0ZW0uZ2V0VGV4dCgxKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJCVRhYmxlSXRlbSBlbGVtZW50SG9sZGVyID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQkJCQlpZiAocHJvcGVydHkuZXF1YWxzKFBST0pFQ1RfQ09MVU1OKSkgewotCQkJCQllbGVtZW50SG9sZGVyLnNldFRleHQoMSwgKFN0cmluZykgdmFsdWUpOwotCQkJCQkoKElEYXRhTW9kZWwpIGVsZW1lbnRIb2xkZXIuZ2V0RGF0YSgpKS5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKLQkJLy8gVGhpcyBwYWdlIGRvZXNuJ3QgaW1wbGVtZW50Li4uCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCS8vIFRoaXMgcGFnZSBkb2Vzbid0IGltcGxlbWVudC4uLgotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TRUxFQ1RFRF9NT0RFTFNfTElTVH07Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Q5YWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvNy8yMDAxIDExOjM5OjExIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyIHdoZW4gaXRzIGlucHV0IGlzIHNldCB0byB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwgaXRlbXMgaW4gYSBsaXN0LCBldGMuIFRoZSByZXN1bHQgaXMgbm90Ci0JICogbW9kaWZpZWQgYnkgdGhlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgaW5wdXQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgVGFibGVPYmplY3RzKSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9ICgoVGFibGVPYmplY3RzKSBpbnB1dEVsZW1lbnQpLmdldFRhYmxlT2JqZWN0cygpLnRvQXJyYXkoKTsKLQkJCUFycmF5cy5zb3J0KGFycmF5LCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJcmV0dXJuIGdldENvbHVtblRleHQobzEsIDApLmNvbXBhcmVUbyhnZXRDb2x1bW5UZXh0KG8yLCAwKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07IC8vIHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhYmVsIGltYWdlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZW50aXJlIHJvdywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IG5vCi0JICogICAgICAgICAgICBpbnB1dCBvYmplY3QgaXMgc2V0IGluIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2ggdGhlIGxhYmVsIGFwcGVhcnMKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGdpdmVuIGNvbHVtbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCBubwotCSAqICAgICAgICAgICAgaW5wdXQgb2JqZWN0IGlzIHNldCBpbiB0aGUgdmlld2VyCi0JICogQHBhcmFtIGNvbHVtbkluZGV4Ci0JICogICAgICAgICAgICB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY29sdW1uIGluIHdoaWNoIHRoZSBsYWJlbCBhcHBlYXJzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAoSURhdGFNb2RlbCkgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCXJldHVybiAoKEFyY2hpdmUpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRSkpLmdldFVSSSgpOwotCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCXJldHVybiBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkaXNwb3NlCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSVmFsaWRhdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJWYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDNkYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlVJRWFyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5SdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5PbmVWYWxpZGF0b3JPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRUFSVmFsaWRhdGlvbkhlbHBlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRUFSVmFsaWRhdGlvbkhlbHBlci4KLQkgKi8KLQlwcml2YXRlIEVBUlZhbGlkYXRpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBydW5uYWJsZSB2YWxpZGF0aW9uIG9wZXJhdGlvbnMgZm9yIGFsbCBFQVIgcHJvamVjdHMgd2hpY2ggaGF2ZSBhdXRvIHZhbGlkYXRlCi0JICogZW5hYmxlZCwgYW5kIGFyZSBpbXBhY3RlZCBieSB0aGUgbGlzdCBvZiBwcm9qZWN0czsgSWYgdGhlIGVhciBwcm9qZWN0IGl0c2VsZiBpcyBpbiB0aGUgbGlzdCwKLQkgKiB0aGVuIGl0IGlzIHNraXBwZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3NbXSBnZXRFQVJWYWxpZGF0aW9uT3BlcmF0aW9ucyhMaXN0IG1vZGlmaWVkUHJvamVjdHMpIHsKLQkJTGlzdCBlYXJQcm9qZWN0cyA9IEFycmF5cy5hc0xpc3QoSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0QWxsUHJvamVjdHNJbldvcmtzcGFjZU9mVHlwZShKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKSk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChlYXJQcm9qZWN0cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUHJvamVjdCBlYXJQcm9qID0gKElQcm9qZWN0KSBlYXJQcm9qZWN0cy5nZXQoaSk7Ci0JCQlpZiAod2lsbEVBUlByb2plY3ROZWVkVmFsaWRhdGlvbihlYXJQcm9qLCBtb2RpZmllZFByb2plY3RzKSkgewotCQkJCXJlc3VsdC5hZGQoY3JlYXRlVmFsaWRhdGlvblJ1bm5hYmxlKGVhclByb2opKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElSdW5uYWJsZVdpdGhQcm9ncmVzc1tdKSByZXN1bHQudG9BcnJheShuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHJ1bm5hYmxlIHZhbGlkYXRpb24gb3BlcmF0aW9ucyBmb3IgYWxsIEVBUiBwcm9qZWN0cyB3aGljaCBoYXZlIGF1dG8gdmFsaWRhdGUKLQkgKiBlbmFibGVkLCBhbmQgYXJlIGltcGFjdGVkIGJ5IHRoZSBqMmVlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzc1tdIGdldEVBUlZhbGlkYXRpb25PcGVyYXRpb25zKElQcm9qZWN0IG1vZGlmaWVkSjJFRVByb2plY3QpIHsKLQkJcmV0dXJuIGdldEVBUlZhbGlkYXRpb25PcGVyYXRpb25zKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobW9kaWZpZWRKMkVFUHJvamVjdCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VBUlZhbGlkYXRpb25BdXRvRW5hYmxlZChJUHJvamVjdCBlYXJQcm9qKSB7Ci0JCXJldHVybiBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0F1dG9WYWxpZGF0ZShlYXJQcm9qKSAmJiBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0VuYWJsZWQoZWFyUHJvaiwgVUlFYXJWYWxpZGF0b3IuVkFMSURBVE9SX0lEKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHdpbGxFQVJQcm9qZWN0TmVlZFZhbGlkYXRpb24oSVByb2plY3QgZWFyUHJvaiwgTGlzdCBtb2RpZmllZFByb2plY3RzKSB7Ci0JCWlmIChtb2RpZmllZFByb2plY3RzLmNvbnRhaW5zKGVhclByb2opIHx8ICFpc0VBUlZhbGlkYXRpb25BdXRvRW5hYmxlZChlYXJQcm9qKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy9UT0RPIG1pZ3JhdGUgdG8gdXNlIGFydGlmYWN0IGVkaXRzIGFuZCBjb21wb25lbnRzCi0vLwkJT2JqZWN0IGFjY2Vzc29yS2V5ID0gbmV3IE9iamVjdCgpOwotLy8JCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQoYWNjZXNzb3JLZXkpOwotLy8JCXRyeSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kaWZpZWRQcm9qZWN0cy5zaXplKCk7IGkrKykgewotLy8JCQkJaWYgKGVkaXRNb2RlbC5oYXNNYXBwaW5nVG9Qcm9qZWN0KChJUHJvamVjdCkgbW9kaWZpZWRQcm9qZWN0cy5nZXQoaSkpKQotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKQotLy8JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3MoYWNjZXNzb3JLZXkpOwotLy8JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHdoaWNoIHJ1bnMgYSBvbmUgdmFsaWRhdG9yIG9wZXJhdGlvbiBvbiB0aGUgRUFSIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBjcmVhdGVWYWxpZGF0aW9uUnVubmFibGUoSVByb2plY3QgZWFyUHJvaikgewotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGVhclByb2osIFVJRWFyVmFsaWRhdG9yLlZBTElEQVRPUl9JRCwgdHJ1ZSwgZmFsc2UpOwotCi0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKG9wKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0ZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0ZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTZiN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9GbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxNCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiwgSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7IAotCi0JLyoqCi0JICogPHA+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+Ci0JICogSW52b2tlZCBhZnRlciB0aGUgdXNlciBoYXMgY2xpY2tlZCB0aGUgIkZpbmlzaCIgYnV0dG9uIG9mIHRoZSB3aXphcmQuIFRoZSBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gd2lsbCBhdHRlbXB0IHRvIHVwZGF0ZSB0aGUgZmluYWwgcGVyc3BlY3RpdmUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieQotCSAqIHtAbGluayAjZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgfQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkI3Bvc3RQZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwb3N0UGVyZm9ybUZpbmlzaCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIucG9zdFBlcmZvcm1GaW5pc2goKTsKLQkJaWYgKGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpICE9IG51bGwgJiYgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkubGVuZ3RoKCkgPiAwKSB7Ci0KLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gbmV3IERlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQoY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYU5hbWUpIHsKLQkJCQkJaWYgKGFOYW1lLmVxdWFscygiZmluYWxQZXJzcGVjdGl2ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKGFOYW1lKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZC51cGRhdGVQZXJzcGVjdGl2ZShlbGVtZW50KTsKLQkJfSBlbHNlCi0JCQlCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZC51cGRhdGVQZXJzcGVjdGl2ZShjb25maWd1cmF0aW9uRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgc2F2ZWQgdG8gdXNlIHdoZW4gdGhlIHdpemFyZCBjb21wbGV0ZXMgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZQotCSAqIGN1cnJlbnQgcGVyc3BlY3RpdmUgdXNpbmcgZWl0aGVyICgxKSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHtAc2VlICNnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKX0KLQkgKiBvciAoMikgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgZmluYWxQZXJzcGVjdGl2ZSBhdHRyaWJ1dGUgaW4gdGhlIFdpemFyZCdzIGNvbmZpZ3VyYXRpb24KLQkgKiBlbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWc7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWYxZDIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uY29tcG9uZW50Y29yZS51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIFNlcnZlcyBhcyBhIGJhc2UgY2xhc3MgZm9yIFdpemFyZHMgd2hpY2ggY3JlYXRlIEoyRUUgbW9kdWxlIHN0cnVjdHVyZXMgaW4gRWNsaXBzZSBwcm9qZWN0cy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIEVBUiB3aWxsIGJlIHByZS1wb3B1bGF0ZWQgaW4gdGhlIFdpemFyZCBjb250cm9scyBpZiBhbnkgc2VsZWN0aW9uIHdhcyBwcm92aWRlZCB0byB0aGUgV2l6YXJkLgotICogPC9wPgotICogPHA+Ci0gKiBSZWZlciB0byB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVBcnRpZmFjdENyZWF0aW9uV2l6YXJkfWZvciBpbmZvcm1hdGlvbgotICogb24gaG93IHRvIGV4dGVuZCB0aGlzIGNsYXNzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQXJ0aWZhY3RDcmVhdGlvbldpemFyZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0Q3JlYXRpb25XaXphcmQgaW1wbGVtZW50cyBJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdGFudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBrZXkgb2YgdGhlIG1haW4gcGFnZSBvZiB0aGUgV2l6YXJkLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfUEcgPSAibW9kdWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlCi0JICogICAgICAgICAgICBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBzZWxlY3Rpb24gc3RvcmVkIGluCi0JICoge0BsaW5rIEoyRUVBcnRpZmFjdENyZWF0aW9uV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pfWlzIHVzZWQgdG8KLQkgKiBwcmUtcG9wdWxhdGUgdGhlIEVBUiBwcm9qZWN0IGluIHRoZSBXaXphcmQgZGlhbG9nIGNvbnRyb2xzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIEoyRUVBcnRpZmFjdENyZWF0aW9uV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICogQHNlZSBKMkVFQXJ0aWZhY3RDcmVhdGlvbldpemFyZCNkb0luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJcHJlRmlsbFNlbGVjdGVkRUFSUHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgd2hpY2ggb3ZlcnJpZGUgdGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyBjYWxsIHN1cGVyLmFkZE1vZHVsZXNQYWdlSWZOZWNlc3NhcnkoKQotCSAqIGFoZWFkIG9mIGJlZm9yZSB0aGVpciBvd24gcGFnZXMuCi0JICogPC9wPgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1vZHVsZXNQYWdlSWZOZWNlc3NhcnkoKSB7Ci0gICAgICAgIC8vVE9ETzogYWRkIG1vZHVsZXMgcGFnZSBiYWNrIGZvciAwLjcKLS8vCQlpZiAoZ2V0RGF0YU1vZGVsKCkuZ2V0Qm9vbGVhblByb3BlcnR5KFVJX1NIT1dfRUFSX1NFQ1RJT04pKSB7Ci0vLwkJCWFkZFBhZ2UobmV3IEoyRUVNb2R1bGVzRGVwZW5kZW5jeVBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1PRFVMRV9QRykpOwotLy8JCX0KLQl9Ci0KLQkvKioKLQkgKiBAaW5oZXJpdERvYwotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZE1vZHVsZXNQYWdlSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTa2lwcyB0aGUgcGFnZSBpZGVudGlmaWVkIGJ5IHRoZSBNT0RVTEVfUEcgbmFtZSBpZgotCSAqIHtAbGluayBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQjc2hvdWxkU2hvd01vZHVsZXNQYWdlKCl9aXMgZmFsc2UuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UHJldmlvdXNQYWdlKG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UHJldmlvdXNQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJSVdpemFyZFBhZ2UgcHJldmlvdXMgPSBzdXBlci5nZXRQcmV2aW91c1BhZ2UocGFnZSk7Ci0JCWlmIChwcmV2aW91cyAhPSBudWxsICYmIHByZXZpb3VzLmdldE5hbWUoKS5lcXVhbHMoTU9EVUxFX1BHKSkgewotCQkJaWYgKCFzaG91bGRTaG93TW9kdWxlc1BhZ2UoKSkgewotCQkJCXByZXZpb3VzID0gc3VwZXIuZ2V0UHJldmlvdXNQYWdlKHByZXZpb3VzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJldmlvdXM7Ci0JfQotCi0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogU2tpcHMgdGhlIHBhZ2UgaWRlbnRpZmllZCBieSB0aGUgTU9EVUxFX1BHIG5hbWUgaWYKLQkgKiB7QGxpbmsgSjJFRU1vZHVsZVByb2plY3RDcmVhdGlvbldpemFyZCNzaG91bGRTaG93TW9kdWxlc1BhZ2UoKX1pcyBmYWxzZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXROZXh0UGFnZShvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJSVdpemFyZFBhZ2UgbmV4dCA9IHN1cGVyLmdldE5leHRQYWdlKHBhZ2UpOwotCQlpZiAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0TmFtZSgpLmVxdWFscyhNT0RVTEVfUEcpKSB7Ci0JCQlpZiAoIXNob3VsZFNob3dNb2R1bGVzUGFnZSgpKSB7Ci0JCQkJbmV4dCA9IHN1cGVyLmdldE5leHRQYWdlKG5leHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFVzZXMgdGhlIG1vZGVsIHRvIGRldGVybWluZSBpZiB0aGUgbW9kdWxlIHBhZ2Ugc2hvdWxkIGJlIHNob3duLiBUaGUgZGVmYXVsdCBpcyB0byBBTkQgdGhlCi0JICogdmFsdWVzIG9mIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUikgYW5kCi0JICogc2hvdWxkU2hvd01vZHVsZXNQYWdlRm9yRUFSKCkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgbW9kdWxlIHBhZ2Ugc2hvdWxkIGJlIHNob3duLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHNob3VsZFNob3dNb2R1bGVzUGFnZSgpIHsKLQkJcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fRUFSKSAmJiBzaG91bGRTaG93TW9kdWxlc1BhZ2VGb3JFQVIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBVc2VzIHRoZSBtb2RlbCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZHVsZSBwYWdlIHNob3VsZCBiZSBzaG93biBmb3IgdGhlIEVBUi4gSWYgbm8gbW9kdWxlcyBhcmUKLQkgKiBwcmVzZW50IGluIHRoZSBjbGFzc3BhdGggc2VsZWN0aW9uIG9mIHRoZSBtb2RlbCwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBmYWxzZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0cnVlIG9ubHkgaWYgdGhlCi0JICogQHNlZSBKMkVFTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWxPbGQjZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCkgaXMgbm9uLWVtcHR5LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHNob3VsZFNob3dNb2R1bGVzUGFnZUZvckVBUigpIHsKLQkJLy8gVE9ETyBpcyB0aGlzIHdoYXQgd2Ugd2FudCBoZXJlPwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIEVBUiBtb2R1bGUgc2VsZWN0ZWQgaW4gdGhlIHZpZXcgdXNlZCB0byBsYXVuY2ggdGhlIHdpemFyZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgZ2V0U2VsZWN0ZWRFQVJNb2R1bGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQlpZiAobnVsbCAhPSBzZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRVdGlsaXRpZXMuZmluZENvbXBvbmVudCgoRU9iamVjdCkgb2JqKTsKLQkJCQlpZiAobnVsbCAhPSBjb21wICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpIHsKLQkJCQkJcmV0dXJuIGNvbXA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUZpbGxTZWxlY3RlZEVBUlByb2plY3QoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IGdldFNlbGVjdGVkRUFSTW9kdWxlKCk7Ci0JCWlmIChlYXJDb21wb25lbnQgIT0gbnVsbCkgewotCQkJRUFSQXJ0aWZhY3RFZGl0IGVhckVkaXQgPSBudWxsOwotCQkJaW50IGoyZWVWZXJzaW9uID0gMDsKLQkJCXRyeSB7Ci0JCQkJZWFyRWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGVhckNvbXBvbmVudCk7Ci0JCQkJajJlZVZlcnNpb24gPSBlYXJFZGl0LmdldEoyRUVWZXJzaW9uKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChlYXJFZGl0ICE9IG51bGwpCi0JCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJSURhdGFNb2RlbCBkbSA9IGdldERhdGFNb2RlbCgpOwotCQkJZG0uc2V0SW50UHJvcGVydHkoQ09NUE9ORU5UX1ZFUlNJT04sIGoyZWVWZXJzaW9uKTsKLQkJCWRtLnNldFByb3BlcnR5KEVBUl9DT01QT05FTlRfTkFNRSwgZWFyQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2MDY4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlVdGlsOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1dpbmRvd3MgPSBTV1QuZ2V0UGxhdGZvcm0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoIndpbiIpOyAvLyROT04tTkxTLTEkCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1ZFUlNJT04gPSBKMkVFVUlNZXNzYWdlcy5NT0RVTEVfVkVSU0lPTl9MQUJFTDsKLSAgICBwcm90ZWN0ZWQgTmV3TW9kdWxlR3JvdXAgcHJvamVjdE5hbWVHcm91cDsKLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkdmFuY2VkQ29tcG9zaXRlOwotICAgIHByb3RlY3RlZCBCdXR0b24gYWR2YW5jZWRCdXR0b247Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0FkdmFuY2VkID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIEFkdmFuY2VkU2l6ZUNvbnRyb2xsZXIgYWR2YW5jZWRDb250cm9sbGVyOwotICAgIHByb3RlY3RlZCBib29sZWFuIGFkdmFuY2VkQ29udHJvbHNCdWlsdCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBTZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAgZWFyR3JvdXA7Ci0gICAgcHJvdGVjdGVkIENvbWJvIHNlcnZlclRhcmdldENvbWJvOwotICAgIHByb3RlY3RlZCBUZXh0IG1vZHVsZU5hbWVUZXh0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgVGV4dCBsb2NhdGlvblBhdGhGaWVsZCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b24gPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gc3VwcG9ydE11bHRpcGxlTW9kdWxlcyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENvbWJvIHByb2plY3ROYW1lQ29tYm8gPSBudWxsOwotICAgIHByb3RlY3RlZCBUZXh0IHNvdXJjZUZvbGRlck5hbWVUZXh0ID0gbnVsbDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0vLyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xBQkVMX1VJID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSk7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUVfVUkgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5OQU1FX0xBQkVMKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgU3RyaW5nIGRlZkJyb3dzZUJ1dHRvbkxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQlJPV1NFX0xBQkVMKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZEaXJEaWFsb2dMYWJlbCA9ICJEaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiAgVGhpcyB0eXBlIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHRoZSBTaGVsbCBzaXplIGJhc2VkIG9uIHRoZSBzaG93QWR2YW5jZWQgZmxhZy4gSXQgd2lsbAotICAgICAqIHRyYWNrIHRoZSBvcmlnaW5hbCBzaXplIG9mIHRoZSBTaGVsbCBldmVuIGlmIHRoZSB1c2VyIHJlc2l6ZXMgaXQuIE9uZSBwcm9ibGVtIHRoYXQgd2UgbWF5Ci0gICAgICogZmFjZSBpcyB0aGF0IHRoZSBTaGVsbCBzaXplIGNvdWxkIGNoYW5nZSBieSB0aGUgZnJhbWV3b3JrIHByaW9yIHRvIHRoZSBTaGVsbCBiZWluZyBtYWRlCi0gICAgICogdmlzaWJsZSBidXQgdGhlIHBhZ2Ugd2lsbCBhbHJlYWR5IGdldCBhbiBlbnRlciBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgd2Ugd2lsbCBuZWVkIHRvIHNldCB0aGUKLSAgICAgKiBTaGVsbCBzaXplIGJhc2VkIG9uIHRoZSBzaG93QWR2YW5jZWQgZmxhZyB3aGVuIHRoZSBTaGVsbCByZXNpemUgZXZlbnQgaXMgY2FsbGVkIGFuZCB0aGUgU2hlbGwKLSAgICAgKiBpcyB2aXNpYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgQWR2YW5jZWRTaXplQ29udHJvbGxlciBpbXBsZW1lbnRzIENvbnRyb2xMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgaW50IGFkdmFuY2VkSGVpZ2h0ID0gLTE7Ci0gICAgICAgIHByaXZhdGUgUG9pbnQgb3JpZ2luYWxTaXplOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlU2hlbGxSZXNpemUgPSBmYWxzZTsKLQotICAgICAgICBwcml2YXRlIEFkdmFuY2VkU2l6ZUNvbnRyb2xsZXIoU2hlbGwgYVNoZWxsKSB7Ci0gICAgICAgICAgICBvcmlnaW5hbFNpemUgPSBhU2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgYVNoZWxsLmFkZENvbnRyb2xMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgaWYgKCFpZ25vcmVTaGVsbFJlc2l6ZSkgewotICAgICAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBlLmdldFNvdXJjZSgpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmlzVmlzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU2l6ZSA9IGNvbnRyb2wuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZWRIZWlnaHQgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaGVsbFNpemVGb3JBZHZhbmNlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0T3JpZ2luYWxTaGVsbFNpemUoKSB7Ci0gICAgICAgICAgICBzZXRTaGVsbFNpemUob3JpZ2luYWxTaXplLngsIG9yaWdpbmFsU2l6ZS55KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTaGVsbFNpemUoaW50IHgsIGludCB5KSB7Ci0gICAgICAgICAgICBpZ25vcmVTaGVsbFJlc2l6ZSA9IHRydWU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldFNoZWxsKCkuc2V0U2l6ZSh4LCB5KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWdub3JlU2hlbGxSZXNpemUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFNoZWxsU2l6ZUZvckFkdmFuY2VkKCkgewotICAgICAgICAgICAgaW50IGhlaWdodCA9IGNhbGN1bGF0ZUFkdmFuY2VkU2hlbGxIZWlnaHQoKTsKLSAgICAgICAgICAgIGlmIChoZWlnaHQgIT0gLTEpCi0gICAgICAgICAgICAgICAgc2V0U2hlbGxTaXplKGdldFNoZWxsKCkuZ2V0U2l6ZSgpLngsIGhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBjYWxjdWxhdGVBZHZhbmNlZFNoZWxsSGVpZ2h0KCkgewotICAgICAgICAgICAgUG9pbnQgYWR2YW5jZWRDb21wU2l6ZSA9IGFkdmFuY2VkQ29tcG9zaXRlLmdldFNpemUoKTsKLSAgICAgICAgICAgIGlmIChhZHZhbmNlZENvbXBTaXplLnggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gY29tcHV0ZUFkdmFuY2VkSGVpZ2h0KCk7Ci0gICAgICAgICAgICBpZiAoIXNob3dBZHZhbmNlZCAmJiBoZWlnaHQgIT0gLTEpCi0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IC0gYWR2YW5jZWRDb21wb3NpdGUuZ2V0U2l6ZSgpLnk7Ci0gICAgICAgICAgICByZXR1cm4gaGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29tcHV0ZSB0aGUgaGVpZ2h0IHdpdGggdGhlIGFkdmFuY2VkIHNlY3Rpb24gc2hvd2luZy4gQHJldHVybgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgY29tcHV0ZUFkdmFuY2VkSGVpZ2h0KCkgewotICAgICAgICAgICAgaWYgKGFkdmFuY2VkSGVpZ2h0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUG9pbnQgY29udHJvbFNpemUgPSBnZXRDb250cm9sKCkuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sU2l6ZS54ICE9IDApIHsKLSAgICAgICAgICAgICAgICAJUG9pbnQgcGFnZVNpemUgPSBnZXRDb250cm9sKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbkhlaWdodCA9IG9yaWdpbmFsU2l6ZS55IC0gY29udHJvbFNpemUueTsKLSAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWRIZWlnaHQgPSBwYWdlU2l6ZS55ICsgbWluSGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhZHZhbmNlZEhlaWdodDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodG9wLCBnZXRJbmZvcG9wSUQoKSk7Ci0gICAgICAgIHRvcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIHRvcC5zZXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodG9wLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNyZWF0ZU1vZHVsZUdyb3VwKGNvbXBvc2l0ZSk7Ci0gICAgICAgIENvbXBvc2l0ZSBkZXRhaWwgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotICAgICAgICBkZXRhaWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBkZXRhaWwuc2V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGNyZWF0ZUFkdmFuY2VkQ29tcG9zaXRlKGRldGFpbCk7Ci0gICAgICAgIHJldHVybiB0b3A7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVBZHZhbmNlZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGFkdmFuY2VkQ29udHJvbHNCdWlsdCA9IHRydWU7Ci0gICAgICAgIGFkdmFuY2VkQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5UT0dHTEUpOwotICAgICAgICBzZXRBZHZhbmNlZExhYmVsVGV4dCgpOwotICAgICAgICBmaW5hbCBDdXJzb3IgaGFuZCA9IG5ldyBDdXJzb3IoYWR2YW5jZWRCdXR0b24uZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0hBTkQpOwotICAgICAgICBhZHZhbmNlZEJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhZHZhbmNlZENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIC8vdG9nZ2xlQWR2YW5jZWQoZmFsc2UpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBhZHZhbmNlZENvbXBvc2l0ZS5zZXREYXRhKGRhdGEpOwotICAgICAgICBhZHZhbmNlZENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgYWR2YW5jZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRvZ2dsZUFkdmFuY2VkKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYWR2YW5jZWRCdXR0b24uYWRkTGlzdGVuZXIoU1dULk1vdXNlSG92ZXIsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vdXNlSG92ZXIpCi0gICAgICAgICAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldEN1cnNvcihoYW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGFkZFRvQWR2YW5jZWRDb21wb3NpdGUoYWR2YW5jZWRDb21wb3NpdGUpOwotICAgICAgICByZXR1cm4gYWR2YW5jZWRDb21wb3NpdGU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1vZHVsZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlUHJvamVjdE5hbWVHcm91cChwYXJlbnQpOwotICAgICAgICBjcmVhdGVQcm9qZWN0TG9jYXRpb25Hcm91cChwYXJlbnQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGxhYmVsCi0gICAgICAgIExhYmVsIHByb2plY3ROYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChNT0RVTEVfTkFNRV9VSSk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0gICAgICAgIG1vZHVsZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICBtb2R1bGVOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7IC8vIHBhZAotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaFRleHQobW9kdWxlTmFtZVRleHQsIENPTVBPTkVOVF9OQU1FLCBuZXcgQ29udHJvbFtde3Byb2plY3ROYW1lTGFiZWx9KTsKLSAgICAgICAgbW9kdWxlTmFtZVRleHQuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RMb2NhdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gICAgICBzZXQgdXAgbG9jYXRpb24gcGF0aCBsYWJlbAotICAgICAgICBMYWJlbCBsb2NhdGlvblBhdGhMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbG9jYXRpb25QYXRoTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5QUk9KRUNUX0xPQ19MQkwpKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBsb2NhdGlvblBhdGhMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAvLyBzZXQgdXAgbG9jYXRpb24gcGF0aCBlbnRyeSBmaWVsZAotICAgICAgICBsb2NhdGlvblBhdGhGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0gICAgICAgIGxvY2F0aW9uUGF0aEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIC8vIHNldCB1cCBicm93c2UgYnV0dG9uCi0gICAgICAgIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBsb2NhdGlvblBhdGhGaWVsZC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICAgICAgc3luY2hIZWxwZXIuc3luY2hUZXh0KGxvY2F0aW9uUGF0aEZpZWxkLCBMT0NBVElPTiwgbnVsbCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0gICAgICAgIERpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGxvY2F0aW9uUGF0aEZpZWxkLmdldFNoZWxsKCkpOwotICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShkZWZEaXJEaWFsb2dMYWJlbCk7Ci0gICAgICAgIFN0cmluZyBkaXJOYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoTE9DQVRJT04pOwotICAgICAgICBpZiAoKGRpck5hbWUgIT0gbnVsbCkgJiYgKGRpck5hbWUubGVuZ3RoKCkgIT0gMCkpIHsKLSAgICAgICAgICAgIEZpbGUgcGF0aCA9IG5ldyBGaWxlKGRpck5hbWUpOwotICAgICAgICAgICAgaWYgKHBhdGguZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXJOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotICAgICAgICBpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoTE9DQVRJT04sIHNlbGVjdGVkRGlyZWN0b3J5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvQWR2YW5jZWRDb21wb3NpdGUoQ29tcG9zaXRlIGFkdmFuY2VkKSB7Ci0gICAgICAgIGNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShhZHZhbmNlZCk7Ci0gICAgICAgIGNyZWF0ZVZlcnNpb25Db21wb3NpdGUoYWR2YW5jZWQpOwotICAgICAgICBjcmVhdGVTZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAoYWR2YW5jZWQpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2VydmVyVGFyZ2V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVEFSR0VUX1JVTlRJTUVfTEJMKSk7Ci0gICAgICAgIHNlcnZlclRhcmdldENvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBzZXJ2ZXJUYXJnZXRDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgQnV0dG9uIG5ld1NlcnZlclRhcmdldEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIG5ld1NlcnZlclRhcmdldEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19USFJFRV9ET1RTX0UpKTsKLSAgICAgICAgbmV3U2VydmVyVGFyZ2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmKCFKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLmxhdW5jaE5ld1J1bnRpbWVXaXphcmQoZ2V0U2hlbGwoKSwgbW9kZWwpKXsKLSAgICAgICAgICAgICAgICAJc2V0RXJyb3JNZXNzYWdlKEoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlcnZlclRhcmdldERhdGFNb2RlbF9VSV85IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgQ29udHJvbFtdIGRlcHMgPSBuZXcgQ29udHJvbFtde2xhYmVsLCBuZXdTZXJ2ZXJUYXJnZXRCdXR0b259OwotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaENvbWJvKHNlcnZlclRhcmdldENvbWJvLCBSVU5USU1FX1RBUkdFVF9JRCwgZGVwcyk7Ci0gICAgICAgIGlmKHNlcnZlclRhcmdldENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEgJiYgc2VydmVyVGFyZ2V0Q29tYm8uZ2V0VmlzaWJsZUl0ZW1Db3VudCgpICE9IDApCi0gICAgICAgICAgICBzZXJ2ZXJUYXJnZXRDb21iby5zZWxlY3QoMCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2VydmVyRWFyQW5kU3RhbmRhbG9uZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZWFyR3JvdXAgPSBuZXcgU2VydmVyRWFyQW5kU3RhbmRhbG9uZUdyb3VwKHBhcmVudCwgZ2V0RGF0YU1vZGVsKCksIHN5bmNoSGVscGVyKTsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RzQ29tYm9Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgbGFiZWwKLQkJCi0JCUxhYmVsIHByb2plY3ROYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9UQUJMRV9QUk9KRUNUKSk7Ci0JCQotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuTk9ORSB8IFNXVC5SRUFEX09OTFkpOwotCQlwcm9qZWN0TmFtZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJcHJvamVjdE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKTsKLQotCQkJCS8vdXBkYXRlIHRoZSBwcm9qZWN0IGxvY2F0aW9uIHdpdGggdGhpcyBpbmZvcm1hdGlvbiwgbWFrZSBpdCByZWFkYWJsZQotCQkJCS8vdXBkYXRlIFNlcnZlciBpbmZvIFJVTlRJTUVfVEFSR0VUX0lELCBtYWtlIGl0IHJlYWRhYmxlCi0JCQkJaWYgKHByb2plY3ROYW1lIT1udWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpIT0wKSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCQlpZiAocHJvamVjdCAhPW51bGwpIHsKLQkJCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQkJCQkJCWlmIChydW50aW1lICE9IG51bGwpewotCQkJCQkJCS8vc2VydmVyVGFyZ2V0VGV4dC5zZXRUZXh0KHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCQkJCQlzeW5jaEhlbHBlci5nZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShJSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FX1RBUkdFVF9JRCwgcnVudGltZS5nZXROYW1lKCkpOwotCQkJCQkJfQotCQkJCQkJc3luY2hIZWxwZXIuZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJCQkJCXN5bmNoSGVscGVyLmdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTE9DQVRJT04sIHByb2plY3QuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQkJCQkKLQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0vLwlwcml2YXRlIElQcm9qZWN0IGdldFNlbGVjdGVkUHJvamVjdCgpIHsKLS8vCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotLy8JCWlmICh3aW5kb3cgPT0gbnVsbCkKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotLy8JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pKQotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0vLwkJT2JqZWN0IG9iaiA9IHN0dWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLS8vCQlpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpCi0vLwkJCXJldHVybiAoSVByb2plY3QpIG9iajsKLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117SUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIFJVTlRJTUVfVEFSR0VUX0lELCBDT01QT05FTlRfVkVSU0lPTiwgQ09NUE9ORU5UX05BTUUsIExPQ0FUSU9OLCBFQVJfQ09NUE9ORU5UX05BTUUsIEFERF9UT19FQVIsIEpBVkFTT1VSQ0VfRk9MREVSIH07ICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZUZvbGRlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIAotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KGdldFNvdXJjZUZvbGRlckxhYmVsKCkpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7ICAgICAgCi0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIC8vIHNldCB1cCBwcm9qZWN0IG5hbWUgZW50cnkgZmllbGQKLSAgICAgICAgc291cmNlRm9sZGVyTmFtZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0gICAgICAgIHNvdXJjZUZvbGRlck5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsgLy8gcGFkCi0gICAgICAgIHN5bmNoSGVscGVyLnN5bmNoVGV4dChzb3VyY2VGb2xkZXJOYW1lVGV4dCwgSkFWQVNPVVJDRV9GT0xERVIsIG51bGwpOwotICAgIH0JCi0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJzaW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlVmVyc2lvbkNvbXBvc2l0ZShwYXJlbnQsIGdldFZlcnNpb25MYWJlbCgpLCBDT01QT05FTlRfVkVSU0lPTik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uTGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVfVkVSU0lPTl9MQUJFTCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VGb2xkZXJMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlNPVVJDRUZPTERFUik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKGVhckdyb3VwICE9IG51bGwpCi0gICAgICAgICAgICBlYXJHcm91cC5kaXNwb3NlKCk7Ci0gICAgICAgIGlmIChwcm9qZWN0TmFtZUdyb3VwICE9IG51bGwpCi0gICAgICAgICAgICBwcm9qZWN0TmFtZUdyb3VwLmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZW50ZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotICAgICAgICBpZiAoYWR2YW5jZWRDb250cm9sc0J1aWx0KSB7Ci0gICAgICAgICAgICBpZiAoaXNGaXJzdFRpbWVUb1BhZ2UpCi0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUFkdmFuY2VkQ29udHJvbGxlcigpOwotICAgICAgICAgICAgaWYgKGlzV2luZG93cykgewotICAgICAgICAgICAgICAgIGFkdmFuY2VkQ29udHJvbGxlci5zZXRTaGVsbFNpemVGb3JBZHZhbmNlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVudGVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVBZHZhbmNlZENvbnRyb2xsZXIoKSB7Ci0gICAgICAgIGFkdmFuY2VkQ29udHJvbGxlciA9IG5ldyBBZHZhbmNlZFNpemVDb250cm9sbGVyKGdldFNoZWxsKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2V4aXQoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGV4aXQoKSB7Ci0gICAgICAgIGlmIChhZHZhbmNlZENvbnRyb2xzQnVpbHQgJiYgaXNXaW5kb3dzICYmIGFkdmFuY2VkQ29udHJvbGxlciE9bnVsbCkgewotICAgICAgICAgICAgYWR2YW5jZWRDb250cm9sbGVyLnJlc2V0T3JpZ2luYWxTaGVsbFNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5leGl0KCk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI3N0b3JlRGVmYXVsdFNldHRpbmdzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAgICAgc3VwZXIuc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKGFkdmFuY2VkQ29udHJvbHNCdWlsdCkgewotICAgICAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNldHRpbmdzLnB1dChnZXRTaG93QWR2YW5jZWRLZXkoKSwgc2hvd0FkdmFuY2VkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2hvd0FkdmFuY2VkS2V5KCkgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiX1NIT1dfQURWQU5DRUQiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAgICAgc3VwZXIucmVzdG9yZURlZmF1bHRTZXR0aW5ncygpOwotICAgICAgICBpZiAoYWR2YW5jZWRDb250cm9sc0J1aWx0KSB7Ci0gICAgICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2hvd0FkdmFuY2VkID0gIXNldHRpbmdzLmdldEJvb2xlYW4oZ2V0U2hvd0FkdmFuY2VkS2V5KCkpOwotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0U2VsZWN0aW9uKCFzaG93QWR2YW5jZWQpOyAvL3NldCBvcHBvc2l0ZSBiL2MgdG9nZ2xlQWR2YW5jZWQoYm9vbGVhbikKLSAgICAgICAgICAgIC8vIHdpbGwgZmxpcCBpdAotICAgICAgICAgICAgdG9nZ2xlQWR2YW5jZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFkdmFuY2VkTGFiZWwKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0QWR2YW5jZWRMYWJlbFRleHQoKSB7Ci0gICAgICAgIGlmIChhZHZhbmNlZENvbnRyb2xzQnVpbHQpIHsKLSAgICAgICAgICAgIGlmIChzaG93QWR2YW5jZWQpCi0gICAgICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVByb2plY3RDcmVhdGlvblBhZ2VfVUlfMCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVQcm9qZWN0Q3JlYXRpb25QYWdlX1VJXzEiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhZHZhbmNlZExhYmVsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdG9nZ2xlQWR2YW5jZWQoYm9vbGVhbiBzZXRTaXplKSB7Ci0gICAgICAgIGlmIChhZHZhbmNlZENvbnRyb2xzQnVpbHQpIHsKLSAgICAgICAgICAgIHNob3dBZHZhbmNlZCA9ICFzaG93QWR2YW5jZWQ7Ci0gICAgICAgICAgICBhZHZhbmNlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKHNob3dBZHZhbmNlZCk7Ci0gICAgICAgICAgICBzZXRBZHZhbmNlZExhYmVsVGV4dCgpOwotICAgICAgICAgICAgaWYgKHNldFNpemUgJiYgaXNXaW5kb3dzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkdmFuY2VkQ29udHJvbHNCdWlsdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZWRDb250cm9sbGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplQWR2YW5jZWRDb250cm9sbGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1dpbmRvd3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VkQ29udHJvbGxlci5zZXRTaGVsbFNpemVGb3JBZHZhbmNlZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgYWR2YW5jZWRDb250cm9sbGVyLnNldFNoZWxsU2l6ZUZvckFkdmFuY2VkKCk7Ci0gICAgICAgICAgICB9ICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJzaW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsIFN0cmluZyB2ZXJzaW9uUHJvcCkgewotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChsYWJlbFRleHQpOwotICAgICAgICBDb21ibyB2ZXJzaW9uQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDMwNTsKLSAgICAgICAgdmVyc2lvbkNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBDb250cm9sW10gZGVwcyA9IG5ldyBDb250cm9sW117bGFiZWx9OwotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaENvbWJvKHZlcnNpb25Db21ibywgdmVyc2lvblByb3AsIGRlcHMpOwotICAgICAgICBpZiAodmVyc2lvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEpIHsKLQkgICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gdmVyc2lvbkNvbWJvLmdldEl0ZW1zKCk7Ci0JICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5sZW5ndGggPiAwKQotCSAgICAgICAgICAgIHZlcnNpb25Db21iby5zZWxlY3QoaXRlbXMubGVuZ3RoIC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvL3BhZAotICAgIH0gICAKLSAgICAKLQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsYXVuY2hOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIHByZUFkZGl0aW9uRGVzY3JpcHRvcnMgPSBtb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoUlVOVElNRV9UQVJHRVRfSUQpOwotICAgICAgICBib29sZWFuIGlzT0sgPSBTZXJ2ZXJVSVV0aWwuc2hvd05ld1J1bnRpbWVXaXphcmQoc2hlbGwsICIiLCAiIik7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0gICAgICAgIGlmIChpc09LICYmIG1vZGVsICE9IG51bGwpIHsKLQotICAgICAgICAgICAgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gcG9zdEFkZGl0aW9uRGVzY3JpcHRvcnMgPSBtb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoUlVOVElNRV9UQVJHRVRfSUQpOwotICAgICAgICAgICAgT2JqZWN0W10gcHJlQWRkaXRpb24gPSBuZXcgT2JqZWN0W3ByZUFkZGl0aW9uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlQWRkaXRpb24ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwcmVBZGRpdGlvbltpXSA9IHByZUFkZGl0aW9uRGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0W10gcG9zdEFkZGl0aW9uID0gbmV3IE9iamVjdFtwb3N0QWRkaXRpb25EZXNjcmlwdG9ycy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3N0QWRkaXRpb24ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwb3N0QWRkaXRpb25baV0gPSBwb3N0QWRkaXRpb25EZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgbmV3QWRkaXRpb24gPSBQcm9qZWN0VXRpbGl0aWVzLmdldE5ld09iamVjdChwcmVBZGRpdGlvbiwgcG9zdEFkZGl0aW9uKTsKLQotICAgICAgICAgICAgbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUlVOVElNRV9UQVJHRVRfSUQsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0gICAgICAgICAgICBpZiAobmV3QWRkaXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FX1RBUkdFVF9JRCwgbmV3QWRkaXRpb24pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgCXJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNPSzsKLSAgICB9ICAgCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjIwODRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIDxwPgotICogU2VydmVzIGFzIGEgYmFzZSBjbGFzcyBmb3IgV2l6YXJkcyB3aGljaCBpbXBvcnQgSjJFRSBtb2R1bGUgc3RydWN0dXJlcyBpbnRvIEVjbGlwc2UgcHJvamVjdHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEltcG9ydCB3aXphcmRzIG11c3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgI2dldEltcG9ydE9wZXJhdGlvbigpfQotICogPGxpPntAbGluayAjZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpfQotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogQW5kIG9wdGlvbmFsbHksIHRoZXkgbWF5IG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBmcm9tCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkfToKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgI2dldEZpbmFsUGVyc3BlY3RpdmVJRCgpfQotICogPGxpPntAbGluayAjZG9Jbml0KCkoKX0KLSAqIDxsaT57QGxpbmsgI2RvRGlzcG9zZSgpKCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURBVE9SX1NUUklOR1MgPSBuZXcgU3RyaW5nW117Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uVUlFYXJWYWxpZGF0b3IifTsgLy8kTk9OLU5MUy0xJAotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiMzgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiMzgiKSk7Ly8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvLyAvKioKLQkvLyAqIDxwPgotCS8vICogQ3JlYXRlcyBhbiBJbXBvcnQgT3BlcmF0aW9uIHVzaW5nIHtAbGluayAjZ2V0SW1wb3J0T3BlcmF0aW9uKCl9YW5kIHdyYXBzIGl0IHRvIHJ1bgotCS8vICogdmFsaWRhdGlvbiBvbmNlIHRoZSBtb2R1bGUgaGFzIGJlZW4gaW1wb3J0ZWQuCi0JLy8gKiA8L3A+Ci0JLy8gKgotCS8vICogQHJldHVybiBSZXR1cm5zIGEgd3JhcHBlciBvcGVyYXRpb24gYXJvdW5kIHRoZSByZXN1bHQgb2YgZ2V0SW1wb3J0T3BlcmF0aW9uKCkgdGhhdCBhbHNvCi0JLy8gcnVucwotCS8vICogdmFsaWRhdGlvbiBhcyBkZWZpbmVkIGluIGdldE1vZHVsZVZhbGlkYXRvclN0cmluZ3MoKQotCS8vICogQHNlZSAjZ2V0SW1wb3J0T3BlcmF0aW9uKCkKLQkvLyAqIEBzZWUgI2dldE1vZHVsZVZhbGlkYXRvclN0cmluZ3MoKQotCS8vICovCi0JLy8gcHJvdGVjdGVkIGZpbmFsIFdUUE9wZXJhdGlvbiBjcmVhdGVCYXNlT3BlcmF0aW9uKCkgewotCS8vIHJldHVybiBuZXcgV1RQT3BlcmF0aW9uKCkgewotCS8vIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkvLyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JLy8gV1RQT3BlcmF0aW9uIGltcG9ydE9wID0gZ2V0SW1wb3J0T3BlcmF0aW9uKCk7Ci0JLy8gaWYgKGltcG9ydE9wID09IG51bGwpCi0JLy8gcmV0dXJuOwotCS8vIGltcG9ydE9wLnJ1bihtb25pdG9yKTsKLQkvLwotCS8vIEoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWwgaW1wb3J0TW9kZWwgPSAoSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbCkKLQkvLyBnZXRJbXBvcnRPcGVyYXRpb24oKS5nZXRPcGVyYXRpb25EYXRhTW9kZWwoKTsKLQkvLyBJUHJvamVjdCBtb2R1bGVQcm9qZWN0ID0gaW1wb3J0TW9kZWwuZ2V0UHJvamVjdCgpOwotCS8vIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBtb2R1bGVWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKG1vZHVsZVByb2plY3QsIHRydWUsCi0JLy8gZmFsc2UpOwotCS8vIG1vZHVsZVZhbGlkYXRvci5zZXRWYWxpZGF0b3JzKGdldE1vZHVsZVZhbGlkYXRvclN0cmluZ3MoKSk7Ci0JLy8gbW9kdWxlVmFsaWRhdG9yLnJ1bihtb25pdG9yKTsKLQkvLwotCS8vIGlmIChpbXBvcnRNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbC5BRERfVE9fRUFSKSkgewotCS8vIElQcm9qZWN0IGVhclByb2plY3QgPQotCS8vIGltcG9ydE1vZGVsLmdldEoyRUVNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbCgpLmdldEVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCkuZ2V0VGFyZ2V0UHJvamVjdCgpOwotCS8vIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBlYXJWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGVhclByb2plY3QsIHRydWUsCi0JLy8gZmFsc2UpOwotCS8vIGVhclZhbGlkYXRvci5zZXRWYWxpZGF0b3JzKGdldEVhclZhbGlkYXRvclN0cmluZ3MoKSk7Ci0JLy8gZWFyVmFsaWRhdG9yLnJ1bihtb25pdG9yKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH07Ci0JLy8gfQotCi0JLy8gLyoqCi0JLy8gKgotCS8vICogQHJldHVybiBUaGUgYXBwcm9wcmlhdGUgaW1wb3J0IG9wZXJhdGlvbiBmb3IgdGhlIHNwZWNpZmljIEoyRUUgbW9kZWwgdHlwZQotCS8vICovCi0JLy8gcHJvdGVjdGVkIGFic3RyYWN0IFdUUE9wZXJhdGlvbiBnZXRJbXBvcnRPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBJbXBvcnQgV2l6YXJkcyBjYW4gcnVuIGFyYml0cmFyeSB2YWxpZGF0b3JzIG9uY2UgdGhlIG1vZHVsZSBoYXMgYmVlbiBjcmVhdGVkLiBUaGVzZQotCSAqIHZhbGlkYXRvcnMgZW5zdXJlIHRoYXQgdGhlIHN0cnVjdHVyZSBjcmVhdGVkIGJ5IHRoZSBJbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgY29udGVudHMgb2YgdGhhdAotCSAqIHN0cnVjdHVyZSBhcmUgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBhbm5vdW5jZWQgdG8gdGhlIFByb2JsZW1zIHZpZXcgaW4gRWNsaXBzZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBBbiBhcnJheSBvZiB2YWxpZGF0b3IgSURzIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgbW9kdWxlIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpOwotCi0JLy8gLyoqCi0JLy8gKiA8cD4KLQkvLyAqIFVzZXMgdGhlIHNlbGVjdGlvbiBzdXBwbGllZCBmcm9tIHRoZSB7QGxpbmsgI2luaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pfW1ldGhvZAotCS8vICogdG8gc2V0IHRoZSBhc3NvY2lhdGVkIEVBUiBNb2R1bGUgaWYgYW4gRUFSIGFydGlmYWN0IHdhcyBzZWxlY3RlZC4KLQkvLyAqIDwvcD4KLQkvLyAqCi0JLy8gKiBAcGFyYW0gaW1wb3J0TW9kZWwKLQkvLyAqIFRoZSBNb2R1bGUgSW1wb3J0IGRhdGEgbW9kZWwgdG8gaGF2ZSBpdHMgSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbC5FQVJfUFJPSkVDVAotCS8vICogZmllbGQgc2V0LgotCS8vICovCi0JLy8gcHJvdGVjdGVkIGZpbmFsIHZvaWQgdXBkYXRlRUFSVG9Nb2RlbEZyb21TZWxlY3Rpb24oSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbCBpbXBvcnRNb2RlbCkgewotCS8vIC8qIFNldCB0aGUgZGVmYXVsdCBlYXIgc2VsZWN0ZWQgaWYgYSBlYXIgaXMgc2VsZWN0ZWQgKi8KLQkvLyB0cnkgewotCS8vIGlmIChnZXRTZWxlY3Rpb24oKSAhPSBudWxsICYmICFnZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkvLyBJUHJvamVjdCB0YXJnZXRFQVJQcm9qZWN0ID0gKElQcm9qZWN0KQotCS8vIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihnZXRTZWxlY3Rpb24oKS5nZXRGaXJzdEVsZW1lbnQoKSwgSVBST0pFQ1RfQ0xBU1MpOwotCS8vIGlmICh0YXJnZXRFQVJQcm9qZWN0ICE9IG51bGwgJiYgdGFyZ2V0RUFSUHJvamVjdC5oYXNOYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKQotCS8vIGltcG9ydE1vZGVsLnNldFByb3BlcnR5KEoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWwuRUFSX05BTUUsIHRhcmdldEVBUlByb2plY3QuZ2V0TmFtZSgpKTsKLQkvLyB9Ci0JLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkvLyAvL0lnbm9yZQotCS8vIH0KLQkvLyB9Ci0KLQkvLyBwcml2YXRlIFN0cmluZ1tdIGdldEVhclZhbGlkYXRvclN0cmluZ3MoKSB7Ci0JLy8gcmV0dXJuIFZBTElEQVRPUl9TVFJJTkdTOwotCS8vIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyYTVmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjEsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLS8vCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50KSB7Ci0vLwkJCXJldHVybiAoKElWaXJ0dWFsQ29tcG9uZW50KWVsZW1lbnQpLmdldE5hbWUoKTsKLS8vCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCUlQcm9qZWN0IGhhbmRsZSA9IChJUHJvamVjdCllbGVtZW50OwotCQkJcmV0dXJuIGhhbmRsZS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVFeHBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVFeHBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmNlODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFRXhwb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFRXhwb3J0UGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2luZG93cyA9IFNXVC5nZXRQbGF0Zm9ybSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgid2luIik7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb247Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9MQUJFTCA9ICJKMkVFX0VYUE9SVF8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9WRVJXUklURV9MQUJFTCA9ICJPVkVSV1JJVEUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9MQUJFTCA9ICJTT1VSQ0UiOyAvLyROT04tTkxTLTEkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9MQUJFTCA9ICJNRVRBIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZkJyb3dzZUJ1dHRvbkxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQlJPV1NFX0xBQkVMKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIExBQkVMX0RFU1RJTkFUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSjJFRV9FWFBPUlRfREVTVElOQVRJT04pOwotCXByaXZhdGUgQ29tYm8gcmVzb3VyY2VOYW1lQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBkZXN0aW5hdGlvbk5hbWVDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIG92ZXJ3cml0ZUV4aXN0aW5nRmlsZXNDaGVja2JveDsKLQlwcml2YXRlIEJ1dHRvbiBzb3VyY2VGaWxlc0NoZWNrYm94OwotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEoyRUVFeHBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCWN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBnZXRJbmZvcG9wSUQoKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJY3JlYXRlU291cmNlQW5kRGVzdGluYXRpb25Hcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVPcHRpb25zR3JvdXAoY29tcG9zaXRlKTsKLQotCQkvL3NldHVwQmFzZWRPbkluaXRpYWxTZWxlY3Rpb25zKCk7Ci0JCXNldHVwSW5mb3BvcChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU291cmNlQW5kRGVzdGluYXRpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNyZWF0ZUV4cG9ydENvbXBvbmVudEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZURlc3RpbmF0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQotCX0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBleHBvcnQgc291cmNlIHJlc291cmNlIHNwZWNpZmljYXRpb24gd2lkZ2V0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCBpcyB0byBiZSB1c2VkIGFzIHRoZSBwYXJlbnQgb2YgdGhpcyBncm91cCdzCi0gICAgICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIHZpc3VhbCBjb21wb25lbnRzCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHBvcnRDb21wb25lbnRHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vUHJvamVjdCBsYWJlbAotICAgICAgICBMYWJlbCBwcm9qZWN0TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHByb2plY3RMYWJlbC5zZXRUZXh0KGdldENvbXBvbmVudExhYmVsKCkpOwotICAgICAgICAvL1Byb2plY3QgY29tYm8KLSAgICAgICAgcmVzb3VyY2VOYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLSAgICAgICAgcmVzb3VyY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgc3luY2hIZWxwZXIuc3luY2hDb21ibyhyZXNvdXJjZU5hbWVDb21ibywgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBudWxsKTsKLSAgICAgICAgbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOy8vUGFkIGxhYmVsCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29tcG9uZW50TGFiZWwoKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZURlc3RpbmF0aW9uR3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIC8vRGVzdGluYXRpb24gbGFiZWwKLSAgICAgICAgTGFiZWwgZGVzdGluYXRpb25MYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZGVzdGluYXRpb25MYWJlbC5zZXRUZXh0KExBQkVMX0RFU1RJTkFUSU9OKTsKLSAgICAgICAgLy8gZGVzdGluYXRpb24gbmFtZSBjb21ibyBmaWVsZAotICAgICAgICBkZXN0aW5hdGlvbk5hbWVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGVzdGluYXRpb25OYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHN5bmNoSGVscGVyLnN5bmNoQ29tYm8oZGVzdGluYXRpb25OYW1lQ29tYm8sIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX0RFU1RJTkFUSU9OLCBudWxsKTsKLQotICAgICAgICAvLyBkZXN0aW5hdGlvbiBicm93c2UgYnV0dG9uCi0gICAgICAgIGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgZGVzdGluYXRpb25Ccm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGVzdGluYXRpb25Ccm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKLSAgICAgICAgZGVzdGluYXRpb25Ccm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRGVzdGluYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgZXhwb3J0IG9wdGlvbnMgc3BlY2lmaWNhdGlvbiB3aWRnZXRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU9wdGlvbnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgLy8gb3B0aW9ucyBncm91cAotICAgICAgICBDb21wb3NpdGUgb3B0aW9uc0dyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0gICAgICAgIG9wdGlvbnNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCi0gICAgICAgIC8vIHNvdXJjZSBmaWxlcy4uLiBjaGVja2JveAotICAgICAgICBjcmVhdGVTb3VyY2VGaWxlc0NoZWNrYm94KG9wdGlvbnNHcm91cCk7Ci0KLSAgICAgICAgLy8gb3ZlcndyaXRlLi4uIGNoZWNrYm94Ci0gICAgICAgIGNyZWF0ZU92ZXJ3cml0ZUV4aXN0aW5nRmlsZXNDaGVja2JveChvcHRpb25zR3JvdXApOwotCi0gICAgICAgIC8vIGFkdmFuY2VkIGJ1dHRvbgotICAgICAgICBpZiAoc2hvdWxkU2hvd1Byb2plY3RGaWxlc0NoZWNrYm94KCkpIHsKLSAgICAgICAgICAgIGNyZWF0ZVByb2plY3RGaWxlc0NoZWNrYm94KG9wdGlvbnNHcm91cCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94KENvbXBvc2l0ZSBvcHRpb25zR3JvdXApIHsKLQkJLy9PdmVyd3JpdGUgY2hlY2tib3gKLQkJb3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJb3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSjJFRV9FWFBPUlRfT1ZFUldSSVRFX0NIRUNLQk9YKSk7IC8vJE5PTi1OTFMtMSQgPSAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIHdpdGhvdXQgd2FybmluZyIKLQkJb3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gob3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94LCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0VYSVNUSU5HLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VGaWxlc0NoZWNrYm94KENvbXBvc2l0ZSBvcHRpb25zR3JvdXApIHsKLQkJc291cmNlRmlsZXNDaGVja2JveCA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0JCXNvdXJjZUZpbGVzQ2hlY2tib3guc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KMkVFX0VYUE9SVF9TT1VSQ0VfQ0hFQ0tCT1gpKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KHNvdXJjZUZpbGVzQ2hlY2tib3gsIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FWFBPUlRfU09VUkNFX0ZJTEVTLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2hvd1Byb2plY3RGaWxlc0NoZWNrYm94KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdEZpbGVzQ2hlY2tib3goQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIHJlc291cmNlIG5hbWUgZmllbGQgYmFzZWQgdXBvbiB0aGUgY3VycmVudGx5LXNlbGVjdGVkIHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEJhc2VkT25Jbml0aWFsU2VsZWN0aW9ucygpIHsKLQotCQlpZiAoY3VycmVudFJlc291cmNlU2VsZWN0aW9uLmlzRW1wdHkoKSB8fCBzZXR1cEJhc2VkT25SZWZPYmplY3RTZWxlY3Rpb24oKSkKLQkJCXJldHVybjsgLy8gbm8gc2V0dXAgbmVlZGVkCi0KLQkJamF2YS51dGlsLkxpc3Qgc2VsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgYWVudW0gPSBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFlbnVtLmhhc05leHQoKSkgewotCQkJSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIGFlbnVtLm5leHQoKTsKLQkJCS8vIGRvIG5vdCBhZGQgaW5hY2Nlc3NpYmxlIGVsZW1lbnRzCi0JCQlpZiAoY3VycmVudFJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQotCQkJCXNlbGVjdGlvbnMuYWRkKGN1cnJlbnRSZXNvdXJjZSk7Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOyAvLyBzZXR1cCBub3QgbmVlZGVkIGFueW1vcmUKLQotLy8JCWludCBzZWxlY3RlZFJlc291cmNlQ291bnQgPSBzZWxlY3Rpb25zLnNpemUoKTsKLS8vVE9ETzogZmluZCBhIHdheSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgY29tcG9uZW50Ci0vLwkJaWYgKHNlbGVjdGVkUmVzb3VyY2VDb3VudCA9PSAxKSB7Ci0vLwkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHNlbGVjdGlvbnMuZ2V0KDApOwotLy8JCQlpZiAoKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpICYmIGNoZWNrRm9yTmF0dXJlKChJUHJvamVjdCkgcmVzb3VyY2UpKSB7Ci0vLwkJCQlyZXNvdXJjZU5hbWVDb21iby5zZXRUZXh0KHJlc291cmNlLmdldE5hbWUoKS50b1N0cmluZygpKTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEZXN0aW5hdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0KLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhkZXN0aW5hdGlvbk5hbWVDb21iby5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSk7Ci0JCVN0cmluZ1tdIGZpbHRlcnMgPSBnZXRGaWx0ZXJFeHByZXNzaW9uKCk7Ci0JCWlmICghaXNXaW5kb3dzKSB7Ci0JCQlpZiAoZmlsdGVycy5sZW5ndGggIT0gMCAmJiBmaWx0ZXJzWzBdICE9IG51bGwgJiYgZmlsdGVyc1swXS5pbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCQlmaWxlTmFtZSArPSBmaWx0ZXJzWzBdLnN1YnN0cmluZyhmaWx0ZXJzWzBdLmluZGV4T2YoJy4nKSk7Ci0JCQl9Ci0JCX0KLQkJZGlhbG9nLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJaWYgKGlzV2luZG93cykgewotCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVycyk7Ci0JCX0KLQkJU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVuYW1lICE9IG51bGwpCi0JCQlkZXN0aW5hdGlvbk5hbWVDb21iby5zZXRUZXh0KGZpbGVuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gaWUuLSBubyBzZXR0aW5ncyBzdG9yZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc291cmNlTmFtZXNbaV0gPT0gbnVsbCkKLQkJCQkJc291cmNlTmFtZXNbaV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVzdGluYXRpb25OYW1lQ29tYm8uc2V0SXRlbXMoc291cmNlTmFtZXMpOwotCQkJYm9vbGVhbiBvdmVyd3JpdGUgPSBzZXR0aW5ncy5nZXRCb29sZWFuKFNUT1JFX0xBQkVMICsgT1ZFUldSSVRFX0xBQkVMKTsKLQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0VYSVNUSU5HLCBvdmVyd3JpdGUpOwotCQkJYm9vbGVhbiBpbmNsdWRlU291cmNlID0gc2V0dGluZ3MuZ2V0Qm9vbGVhbihTVE9SRV9MQUJFTCArIFNPVVJDRV9MQUJFTCk7Ci0JCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVYUE9SVF9TT1VSQ0VfRklMRVMsIGluY2x1ZGVTb3VyY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQkvLyB1cGRhdGUgc291cmNlIG5hbWVzIGhpc3RvcnkKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfTEFCRUwgKyBnZXRGaWxlTmFtZXNTdG9yZUlEKCkpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpIHsKLQkJCQlzb3VyY2VOYW1lcyA9IG5ldyBTdHJpbmdbMF07Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdOYW1lID0gZGVzdGluYXRpb25OYW1lQ29tYm8uZ2V0VGV4dCgpOwotCi0JCQkvL3JpcCBvdXQgYW55IGVtcHR5IGZpbGVuYW1lcyBhbmQgdHJpbSBsZW5ndGggdG8gNQotCQkJQXJyYXlMaXN0IG5ld05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGggJiYgaSA8IDU7IGkrKykgewotCQkJCWlmIChzb3VyY2VOYW1lc1tpXS50cmltKCkubGVuZ3RoKCkgPiAwICYmICFuZXdOYW1lLmVxdWFscyhzb3VyY2VOYW1lc1tpXSkpIHsKLQkJCQkJbmV3TmFtZXMuYWRkKHNvdXJjZU5hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQluZXdOYW1lcy5hZGQoMCwgZGVzdGluYXRpb25OYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1tuZXdOYW1lcy5zaXplKCldOwotCQkJbmV3TmFtZXMudG9BcnJheShzb3VyY2VOYW1lcyk7Ci0KLQkJCXNldHRpbmdzLnB1dChTVE9SRV9MQUJFTCArIGdldEZpbGVOYW1lc1N0b3JlSUQoKSwgc291cmNlTmFtZXMpOwotCQkJc2V0dGluZ3MucHV0KFNUT1JFX0xBQkVMICsgT1ZFUldSSVRFX0xBQkVMLCBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9FWElTVElORykpOwotCQkJc2V0dGluZ3MucHV0KFNUT1JFX0xBQkVMICsgU09VUkNFX0xBQkVMLCBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVYUE9SVF9TT1VSQ0VfRklMRVMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7Ci0JCXJldHVybiBnZXRDb21wbmVudElEKCk7Ci0JfQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29tcG5lbnRJRCgpOwotCi0gICAgLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNlbnRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JCXJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JLy9wcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE5hdHVyZUlEKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc01ldGFUeXBlU3VwcG9ydGVkKE9iamVjdCBvKTsKLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNldHVwQmFzZWRPblJlZk9iamVjdFNlbGVjdGlvbigpIHsKLQotCQlpZiAoY3VycmVudFJlc291cmNlU2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU9iamVjdCBvID0gY3VycmVudFJlc291cmNlU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoIWlzTWV0YVR5cGVTdXBwb3J0ZWQobykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgbzsKLQkJSVJlc291cmNlIHJlc291cmNlID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJlZik7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZU5hbWVDb21iby5zZXRUZXh0KHJlc291cmNlLmdldE5hbWUoKS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldERpYWxvZ1NldHRpbmdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUltcG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUltcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2YWJlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVJbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVJbXBvcnRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIENvbWJvIGNvbXBvbmVudENvbWJvOwotCXByaXZhdGUgQ29tYm8gZmlsZU5hbWVDb21ibzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfTEFCRUwgPSAiSjJFRV9JTVBPUlRfIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDMwNTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZCcm93c2VCdXR0b25MYWJlbCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9MQUJFTCk7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZOZXdCdXR0b25MYWJlbCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19USFJFRV9ET1RTX0UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgSjJFRUltcG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY3JlYXRlRmlsZU5hbWVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJY3JlYXRlUHJvamVjdE5hbWVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJcmVzdG9yZVdpZGdldFZhbHVlcygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0vLwkJaWYgKEZsZXhpYmxlSmF2YVByb2plY3RQcmVmZXJlbmNlVXRpbC5nZXRNdWx0aXBsZU1vZHVsZXNQZXJQcm9qZWN0UHJvcCgpKSB7Ci0vLwkJCW5ldyBOZXdNb2R1bGVEYXRhTW9kZWxHcm91cChwYXJlbnQsIGdldERhdGFNb2RlbCgpLCBzeW5jaEhlbHBlcik7Ci0vLwkJfSBlbHNlIHsKLQkJCUxhYmVsIGNvbXBvbmVudExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCQljb21wb25lbnRMYWJlbC5zZXRUZXh0KGdldFByb2plY3RJbXBvcnRMYWJlbCgpKTsKLQkJCWNvbXBvbmVudExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJCS8vIHNldHRpbmcgdXAgY29tYm8KLQkJCWNvbXBvbmVudENvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJCWNvbXBvbmVudENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJCS8vIC8vIHNldHRpbmcgdXAgYnV0dG9uCi0JCQkvLyBCdXR0b24gbmV3UHJvamVjdEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCQkvLyBuZXdQcm9qZWN0QnV0dG9uLnNldFRleHQoZGVmTmV3QnV0dG9uTGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBuZXdQcm9qZWN0QnV0dG9uLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0JCQkvLyBuZXdQcm9qZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJLy8gcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gLy8gaGFuZGxlTmV3UHJvamVjdEJ1dHRvblByZXNzZWQoKTsKLQkJCS8vIH0KLQkJCS8vIH0pOwotCQkJLy8gbmV3UHJvamVjdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhjb21wb25lbnRDb21ibywgSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBuZXcgQ29udHJvbFtde2NvbXBvbmVudExhYmVsfSk7Ci0JCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQljcmVhdGVTZXJ2ZXJUYXJnZXRDb21wb3NpdGUocGFyZW50KTsKLQkJLy99Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2VydmVyVGFyZ2V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVEFSR0VUX1JVTlRJTUVfTEJMKSk7Ci0JCUNvbWJvIHNlcnZlclRhcmdldENvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlzZXJ2ZXJUYXJnZXRDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJQnV0dG9uIG5ld1NlcnZlclRhcmdldEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW5ld1NlcnZlclRhcmdldEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19USFJFRV9ET1RTX0UpKTsKLQkJbmV3U2VydmVyVGFyZ2V0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQluZXdTZXJ2ZXJUYXJnZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmxhdW5jaE5ld1J1bnRpbWVXaXphcmQoZ2V0U2hlbGwoKSwgbW9kZWwpOwotCQkJfQotCQl9KTsKLQkJQ29udHJvbFtdIGRlcHMgPSBuZXcgQ29udHJvbFtde2xhYmVsLCBuZXdTZXJ2ZXJUYXJnZXRCdXR0b259OwotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHNlcnZlclRhcmdldENvbWJvLCBJSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lELCBkZXBzKTsKLQkJaWYgKHNlcnZlclRhcmdldENvbWJvLmdldFZpc2libGVJdGVtQ291bnQoKSAhPSAwKQotCQkJc2VydmVyVGFyZ2V0Q29tYm8uc2VsZWN0KDApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGhhbmRsZU5ld1Byb2plY3RCdXR0b25QcmVzc2VkKCkgewotCS8vIEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBkbSA9IGdldE5ld1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbCgpOwotCS8vCi0JLy8gV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cocHJvamVjdENvbWJvLmdldFNoZWxsKCksIGdldE5ld1Byb2plY3RXaXphcmQoZG0pKTsKLQkvLyBkaWFsb2cuY3JlYXRlKCk7Ci0JLy8gZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg1MDAsIDUwMCk7Ci0JLy8gaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JLy8gbW9kZWwubm90aWZ5VmFsaWRWYWx1ZXNDaGFuZ2UoSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsLlBST0pFQ1RfTkFNRSk7Ci0JLy8gU3RyaW5nIHByb2plY3ROYW1lID0gZG0uZ2V0U3RyaW5nUHJvcGVydHkoRWRpdE1vZGVsT3BlcmF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSk7Ci0JLy8gbW9kZWwuc2V0UHJvcGVydHkoSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCS8vIG1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWwuT1ZFUldSSVRFX1BST0pFQ1QsIHRydWUpOwotCS8vIH0KLQkvLyB9Ci0JLy8gcHJvdGVjdGVkIEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBnZXROZXdQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vCi0JLy8gcHJvdGVjdGVkIFdUUFdpemFyZCBnZXROZXdQcm9qZWN0V2l6YXJkKEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBhTW9kZWwpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXREaWFsb2dTZXR0aW5ncygpCi0JICovCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlTmFtZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGZpbGVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZmlsZUxhYmVsLnNldFRleHQoZ2V0RmlsZUltcG9ydExhYmVsKCkpOwotCi0JCS8vIHNldHVwIGNvbWJvCi0JCWZpbGVOYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWZpbGVOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKLQotCQkvLyBzZXR1cCBicm93c2UgYnV0dG9uCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRmlsZUJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oZmlsZU5hbWVDb21ibywgSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgbmV3IENvbnRyb2xbXXtmaWxlTGFiZWwsIGJyb3dzZUJ1dHRvbn0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZpbGVCcm93c2VCdXR0b25QcmVzc2VkKCkgewotCi0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZmlsZU5hbWVDb21iby5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZ2V0RmlsdGVyRXhwcmVzc2lvbigpKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVuYW1lICE9IG51bGwpCi0JCQltb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBmaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gaWUuLSBubyBzZXR0aW5ncyBzdG9yZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc291cmNlTmFtZXNbaV0gPT0gbnVsbCkKLQkJCQkJc291cmNlTmFtZXNbaV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZmlsZU5hbWVDb21iby5zZXRJdGVtcyhzb3VyY2VOYW1lcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCS8vIHVwZGF0ZSBzb3VyY2UgbmFtZXMgaGlzdG9yeQotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9MQUJFTCArIGdldEZpbGVOYW1lc1N0b3JlSUQoKSk7Ci0JCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkgewotCQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLQkJCX0KLQkJCS8vIHJpcCBvdXQgYW55IGVtcHR5IGZpbGVuYW1lcyBhbmQgdHJpbSBsZW5ndGggdG8gNQotCQkJQXJyYXlMaXN0IG5ld05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGggJiYgaSA8IDU7IGkrKykgewotCQkJCWlmIChzb3VyY2VOYW1lc1tpXS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCW5ld05hbWVzLmFkZChzb3VyY2VOYW1lc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIHRleHQgPSBmaWxlTmFtZUNvbWJvLmdldFRleHQoKTsKLQkJCW5ld05hbWVzLnJlbW92ZSh0ZXh0KTsKLQkJCW5ld05hbWVzLmFkZCgwLCB0ZXh0KTsKLQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1tuZXdOYW1lcy5zaXplKCldOwotCQkJbmV3TmFtZXMudG9BcnJheShzb3VyY2VOYW1lcyk7Ci0KLQkJCS8vIHNvdXJjZU5hbWVzID0gYWRkVG9IaXN0b3J5KHNvdXJjZU5hbWVzLAotCQkJLy8gZ2V0SjJFRUltcG9ydERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KEoyRUVJbXBvcnREYXRhTW9kZWwuRklMRV9OQU1FKSk7Ci0JCQlzZXR0aW5ncy5wdXQoU1RPUkVfTEFCRUwgKyBnZXRGaWxlTmFtZXNTdG9yZUlEKCksIHNvdXJjZU5hbWVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE11c3Qgb3ZlcnJpZGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZW50ZXIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCX0KLQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVFeHBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVFeHBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjdiYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlRXhwb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVNb2R1bGVFeHBvcnRQYWdlIGV4dGVuZHMgSjJFRUV4cG9ydFBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBKMkVFTW9kdWxlRXhwb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfREVTVElOQVRJT04sIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfRVhJU1RJTkd9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUltcG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUltcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3YTFhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVJbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA0LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRU1vZHVsZUltcG9ydFBhZ2UgZXh0ZW5kcyBKMkVFSW1wb3J0UGFnZSB7Ci0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEoyRUVNb2R1bGVJbXBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIGdldEluZm9wb3BJRCgpKTsKLQkJY3JlYXRlU2VydmVyRWFyQW5kU3RhbmRhbG9uZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcnZlckVhckFuZFN0YW5kYWxvbmVHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCW5ldyBTZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAoY29tcG9zaXRlLCBnZXREYXRhTW9kZWwoKS5nZXROZXN0ZWRNb2RlbChJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKSwgc3luY2hIZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBJSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lELCBJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9OQU1FLCBJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUn07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlc0RlcGVuZGVuY3lQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVzRGVwZW5kZW5jeVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyZTk3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVzRGVwZW5kZW5jeVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzcGF0aEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci0KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZAotICogQ29tbWVudHMKLSAqLwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFTW9kdWxlc0RlcGVuZGVuY3lQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzewotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGF2YWlsYWJsZUphcnNWaWV3ZXI7Ci0KLQlwdWJsaWMgSjJFRU1vZHVsZXNEZXBlbmRlbmN5UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfREVTQykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCQl1cGRhdGVKYXJWaWV3ZXIoKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVKYXJWaWV3ZXIoKSB7Ci0gICAgICAgIENsYXNzUGF0aFNlbGVjdGlvbiBjbGFzc1BhdGhTZWxlY3Rpb24gPSAoQ2xhc3NQYXRoU2VsZWN0aW9uKWdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KENMQVNTUEFUSF9TRUxFQ1RJT04pOwotCi0JCWlmIChhdmFpbGFibGVKYXJzVmlld2VyLmdldElucHV0KCkgIT0gY2xhc3NQYXRoU2VsZWN0aW9uKSB7Ci0JCQlhdmFpbGFibGVKYXJzVmlld2VyLnNldElucHV0KGNsYXNzUGF0aFNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLk5FV19FSkJfV0laQVJEX1AzKTsKLQkJTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwcm9qZWN0TGFiZWwuc2V0VGV4dChXb3JrYmVuY2hNZXNzYWdlcy5OZXdQcm9qZWN0X3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlUZXh0IHByb2plY3RUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChwcm9qZWN0VGV4dCwgUFJPSkVDVF9OQU1FLCBudWxsKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcHJvamVjdFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJTGFiZWwgZWFyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVhckxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX1BST0pFQ1RfRk9SX01PRFVMRV9DUkVBVElPTikpOwotCQlUZXh0IGVhclRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGVhclRleHQsIEVBUl9DT01QT05FTlRfTkFNRSwgbnVsbCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWVhclRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJTGFiZWwgc3BhY2VyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3BhY2VyTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJTGFiZWwgamFyc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlqYXJzTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9BVkFJTEFCTEVfSkFSUykpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWphcnNMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlDb21wb3NpdGUgdGFibGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlnZC5oZWlnaHRIaW50ID0gNjA7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJdGFibGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUdyaWRMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQl0YWJsZUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRhYmxlQ29tcG9zaXRlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCWNyZWF0ZUF2YWlsYWJsZUphcnNMaXN0KHRhYmxlQ29tcG9zaXRlKTsKLQotCQlzcGFjZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzcGFjZXJMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBjbGFzc3BhdGhMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY2xhc3NwYXRoTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9DTEFTU1BBVEgpKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljbGFzc3BhdGhMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlUZXh0IGNsYXNzcGF0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkpOwotCQkvL1RPRE8gc3luY2hoZWxwZXIgd29yayB3aXRoIGZsZXhpYmxlIHByb2plY3QKLQkJLy9zeW5jaEhlbHBlci5zeW5jaFRleHQoY2xhc3NwYXRoVGV4dCwgRmxleGlibGVKMkVFTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWwuSkFSX0xJU1RfVEVYVF9VSSwgbnVsbCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDMwOwotCQljbGFzc3BhdGhUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXZhaWxhYmxlSmFyc0xpc3QoQ29tcG9zaXRlIGxpc3RHcm91cCkgewotCQlhdmFpbGFibGVKYXJzVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QobGlzdEdyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQkJYWRkUmVzaXplTGlzdGVuZXJUb1RhYmxlKCk7Ci0JCUF2YWlsYWJsZUphcnNQcm92aWRlciBwcm92aWRlciA9IG5ldyBBdmFpbGFibGVKYXJzUHJvdmlkZXIoKTsKLQkJYXZhaWxhYmxlSmFyc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQlhdmFpbGFibGVKYXJzVmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCQlhdmFpbGFibGVKYXJzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlhdmFpbGFibGVKQVJDaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlUYWJsZSB0YWJsZSA9IGF2YWlsYWJsZUphcnNWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJLy8gc2V0IHVwIHRhYmxlIGxheW91dAotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMjAwLCB0cnVlKSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMjAwLCB0cnVlKSk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJYXZhaWxhYmxlSmFyc1ZpZXdlci5zZXRTb3J0ZXIobnVsbCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIHRhYmxlIGNvbHVtbnMKLQkJVGFibGVDb2x1bW4gZmlsZU5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJZmlsZU5hbWVDb2x1bW4uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9UQUJMRV9NT0RVTEUpKTsKLQkJZmlsZU5hbWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIHByb2plY3RDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJcHJvamVjdENvbHVtbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX1RBQkxFX1BST0pFQ1QpKTsKLQkJcHJvamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJdXBkYXRlSmFyVmlld2VyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXZhaWxhYmxlSkFSQ2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZXZlbnQuZ2V0RWxlbWVudCgpOwotCQllbGVtZW50LnNldFNlbGVjdGVkKGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCVN0cmluZyBjbGFzc0VudHJ5ID0gZWxlbWVudC5nZXRUZXh0KCk7Ci0JCUlEYXRhTW9kZWwgdXBkYXRlTWFuaWZlc3QgPSAoSURhdGFNb2RlbCkgbW9kZWwuZ2V0UHJvcGVydHkoTkVTVEVEX1VQREFURV9NQU5JRkVTVF9ETSk7Ci0JCUxpc3QgY2xhc3NwYXRoTGlzdCA9IChMaXN0KSB1cGRhdGVNYW5pZmVzdC5nZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuSkFSX0xJU1QpOwotCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQlpZiAoIWNsYXNzcGF0aExpc3QuY29udGFpbnMoY2xhc3NFbnRyeSkpIHsKLQkJCQljbGFzc3BhdGhMaXN0LmFkZChjbGFzc0VudHJ5KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjbGFzc3BhdGhMaXN0LmNvbnRhaW5zKGNsYXNzRW50cnkpKSB7Ci0JCQljbGFzc3BhdGhMaXN0LnJlbW92ZShjbGFzc0VudHJ5KTsKLQkJfQotCQl1cGRhdGVNYW5pZmVzdC5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuSkFSX0xJU1QsIGNsYXNzcGF0aExpc3QpOwotLy8JCXVwZGF0ZU1hbmlmZXN0LnByb3BlcnR5Q2hhbmdlZChuZXcgV1RQT3BlcmF0aW9uRGF0YU1vZGVsRXZlbnQodXBkYXRlTWFuaWZlc3QsIFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLkpBUl9MSVNULCBXVFBPcGVyYXRpb25EYXRhTW9kZWxFdmVudC5QUk9QRVJUWV9DSEcpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNpemVMaXN0ZW5lclRvVGFibGUoKSB7Ci0JCVRhYmxlIGFUYWJsZSA9IGF2YWlsYWJsZUphcnNWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJYVRhYmxlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlib29sZWFuIGZSZXNpemVkID0gZmFsc2U7Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgVGFibGUgJiYgIWZSZXNpemVkKSB7Ci0JCQkJCWZpbmFsIFRhYmxlIHRhYmxlID0gKFRhYmxlKSBlLndpZGdldDsKLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpIHx8IGZSZXNpemVkKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJUG9pbnQgc2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQkJCQlpZiAoc2l6ZS54ID4gNCkgewotCQkJCQkJCQlzZXRSZXNpemVkKHRhYmxlKTsKLQkJCQkJCQkJaW50IG5ld1NpemUgPSBzaXplLnggLyAyIC0gMjsKLQkJCQkJCQkJVGFibGVDb2x1bW4gY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKDApOwotCQkJCQkJCQlpZiAoY29sdW1uICE9IG51bGwgJiYgIWNvbHVtbi5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCQljb2x1bW4uc2V0V2lkdGgobmV3U2l6ZSk7Ci0JCQkJCQkJCWNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigxKTsKLQkJCQkJCQkJaWYgKGNvbHVtbiAhPSBudWxsICYmICFjb2x1bW4uaXNEaXNwb3NlZCgpKQotCQkJCQkJCQkJY29sdW1uLnNldFdpZHRoKG5ld1NpemUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRSZXNpemVkKFRhYmxlIHRhYmxlKSB7Ci0JCQkJZlJlc2l6ZWQgPSB0cnVlOwotCQkJCXRhYmxlLnJlbW92ZUNvbnRyb2xMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlTmV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTRiYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA4LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXcgZXh0ZW5kcyBKMkVFSW1wb3J0UGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfTEFCRUwgPSAiSjJFRV9VVElMSVRZX0pBUl9MSVNUX0lNUE9SVF8iOyAvLyROT04tTkxTLTEkCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotCi0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gdXNlQWx0ZXJuYXRlUm9vdEJ0bjsKLQotCXByaXZhdGUgQnV0dG9uIG92ZXJ3cml0ZVByb2plY3RDaGVja2JveDsKLQotCXByb3RlY3RlZCBDaGVja2JveFRhYmxlVmlld2VyIGF2YWlsYWJsZUpBUnNWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1dGlsSmFyU2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBDb21ibyBhdmFpbGFibGVKYXJzQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGxpbmtlZFBhdGhDaGVja2JveDsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXcoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX1VUSUxJVFlfSkFSX1dJWkFSRF9QMSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlVXRpbGl0eUphckZpbGVOYW1lQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUxpbmtlZFBhdGhWYXJpYWJsZShjb21wb3NpdGUpOwotCQljcmVhdGVKQVJzQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCS8qIGNyZWF0ZU92ZXJ3cml0ZUNoZWNrYm94KGNvbXBvc2l0ZSk7ICovCi0KLQkJcmVzdG9yZVdpZGdldFZhbHVlcygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVdGlsaXR5SmFyRmlsZU5hbWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBmaWxlTmFtZUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlmaWxlTmFtZUdyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8yIikpOyAvLyROT04tTkxTLTEkCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlmaWxlTmFtZUdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlmaWxlTmFtZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGZpbGVMYWJlbCA9IG5ldyBMYWJlbChmaWxlTmFtZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWZpbGVMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMyIpKTsgLy8kTk9OLU5MUy0xJAotCQlmaWxlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQkvLyBzZXR1cCBjb21ibwotCQlhdmFpbGFibGVKYXJzQ29tYm8gPSBuZXcgQ29tYm8oZmlsZU5hbWVHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlhdmFpbGFibGVKYXJzQ29tYm8uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKLQotCQkvLyBzZXR1cCBicm93c2UgYnV0dG9uCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oZmlsZU5hbWVHcm91cCwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oYXZhaWxhYmxlSmFyc0NvbWJvLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BVkFJTEFCTEVfSkFSU19ESVJFQ1RPUlksIG5ldyBDb250cm9sW117ZmlsZUxhYmVsLCBicm93c2VCdXR0b259KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaW5rZWRQYXRoVmFyaWFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0KLQkJR3JvdXAgbGlua2VkUGF0aEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlsaW5rZWRQYXRoR3JvdXAuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsaW5rZWRQYXRoR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxpbmtlZFBhdGhHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlDb21wb3NpdGUgY2hlY2tib3hHcm91cCA9IG5ldyBDb21wb3NpdGUobGlua2VkUGF0aEdyb3VwLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgY2hlY2tib3hMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWNoZWNrYm94R3JvdXAuc2V0TGF5b3V0KGNoZWNrYm94TGF5b3V0KTsKLQkJY2hlY2tib3hHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlsaW5rZWRQYXRoQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNoZWNrYm94R3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWxpbmtlZFBhdGhDaGVja2JveC5zZXRUZXh0KCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJVGV4dCBsaW5rZWRQYXRoVGV4dCA9IG5ldyBUZXh0KGNoZWNrYm94R3JvdXAsIFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKLQkJbGlua2VkUGF0aFRleHQuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgdGV4dEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCXRleHRHcmlkRGF0YS5oZWlnaHRIaW50ID0gNTA7Ci0JCXRleHRHcmlkRGF0YS53aWR0aEhpbnQgPSAzNTA7Ci0JCWxpbmtlZFBhdGhUZXh0LnNldExheW91dERhdGEodGV4dEdyaWREYXRhKTsKLQkJbGlua2VkUGF0aFRleHQuc2V0QmFja2dyb3VuZChjaGVja2JveEdyb3VwLmdldEJhY2tncm91bmQoKSk7Ci0KLQkJLy8gc2V0dXAgY29tYm8KLQkJQ29tYm8gYXZhaWxhYmxlTGlua2VkUGF0aHNDb21ibyA9IG5ldyBDb21ibyhsaW5rZWRQYXRoR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJYXZhaWxhYmxlTGlua2VkUGF0aHNDb21iby5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCi0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oYXZhaWxhYmxlTGlua2VkUGF0aHNDb21ibywgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuTElOS0VEX1BBVEhfVkFSSUFCTEUsIG5ldyBDb250cm9sW117YXZhaWxhYmxlTGlua2VkUGF0aHNDb21ib30pOwotCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gobGlua2VkUGF0aENoZWNrYm94LCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUsIG5ldyBDb250cm9sW117YXZhaWxhYmxlTGlua2VkUGF0aHNDb21ib30pOwotCi0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYnJvd3NlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGJyb3dzZUJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuU0VMRUNUX0RJUkVDVE9SWV9ETEcpKTsKLQotCQlTdHJpbmcgZGlyTmFtZSA9IGdldEJyb3dzZVN0YXJ0TG9jYXRpb24oKTsKLQotCQlpZiAoIWlzTnVsbE9yRW1wdHkoZGlyTmFtZSkpIHsKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQkJaWYgKHBhdGguZXhpc3RzKCkpCi0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyTmFtZSk7Ci0JCX0KLQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkKLQkJCWF2YWlsYWJsZUphcnNDb21iby5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCcm93c2VTdGFydExvY2F0aW9uKCkgewotCQlpZiAoYXZhaWxhYmxlSmFyc0NvbWJvLmdldFRleHQoKSAhPSBudWxsICYmIGF2YWlsYWJsZUphcnNDb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIGF2YWlsYWJsZUphcnNDb21iby5nZXRUZXh0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGFTdHJpbmcgPT0gbnVsbCB8fCBhU3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoKLQkgKiBVcGRhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIGFsbCBidXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKSB7Ci0KLQkJdXRpbEphclNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF2YWlsYWJsZUphcnNMaXN0KENvbXBvc2l0ZSBsaXN0R3JvdXApIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGxpc3RHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDIwMDsKLQkJZ0RhdGEuaGVpZ2h0SGludCA9IDgwOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlciBhdmFpbGFibGVVdGlsSkFSc1Byb3ZpZGVyID0gbmV3IEF2YWlsYWJsZVV0aWxpdHlKYXJzUHJvdmlkZXIoKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYXZhaWxhYmxlVXRpbEpBUnNQcm92aWRlcik7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihhdmFpbGFibGVVdGlsSkFSc1Byb3ZpZGVyKTsKLQotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0SW5wdXQobW9kZWwpOwotCi0JCS8qIGdldE1vZGVsKCkuYWRkTGlzdGVuZXIoZ2V0T3BlcmF0aW9uRGF0YU1vZGVsTGlzdGVuZXIoKSk7ICovCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tCb3hUYWJsZVZpZXdlcihhdmFpbGFibGVKQVJzVmlld2VyLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0pBUl9MSVNULCBudWxsKTsKLQotCi0JCW1vZGVsLmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCWlmIChJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BVkFJTEFCTEVfSkFSU19ESVJFQ1RPUlkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkKLQkJCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRJbnB1dChtb2RlbCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfSkFSX0xJU1QsIG5ldyBPYmplY3RbMF0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlPYmplY3RbXSBzZWxlY3Rpb24gPSBuZXcgT2JqZWN0W2F2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlzZWxlY3Rpb25baV0gPSBhdmFpbGFibGVKQVJzVmlld2VyLmdldEVsZW1lbnRBdChpKTsKLQkJfQotCQltb2RlbC5zZXRQcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0pBUl9MSVNULCBzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBidXR0b25Hcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX1NFTEVDVF9BTExfVVRJTF9CVVRUT04pKTsgLy8kTk9OLU5MUy0xJCA9ICJTZWxlY3QgQWxsIgotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9ERVNFTEVDVF9BTExfVVRJTF9CVVRUT04pKTsgLy8kTk9OLU5MUy0xJCA9ICJEZXNlbGVjdCBBbGwiCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDIyOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVOZXN0ZWRQcm9qZWN0T3ZlcndyaXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYWxsb3dOZXN0ZWRPdmVyd3JpdGVDaGVja2JveDsKLQkJYWxsb3dOZXN0ZWRPdmVyd3JpdGVDaGVja2JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlhbGxvd05lc3RlZE92ZXJ3cml0ZUNoZWNrYm94LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9PVkVSV1JJVEVfTkVTVEVEKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYWxsb3dOZXN0ZWRPdmVyd3JpdGVDaGVja2JveCwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0lGX05FQ0VTU0FSWSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSkFSc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlncm91cC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfSkFSU19HUk9VUCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGRlc2NyaXB0aW9uID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSjJFRV9VVElMSVRZX0pBUl9MSVNURUFSX0lNUE9SVF9TRUxFQ1RfVVRJTF9KQVJTX1RPX0JFX1BST0pFQ1RTKSk7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZDIuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLQkJLy8gY3JlYXRlIGphcnMgY2hlY2sgYm94IHZpZXdlcgotCQljcmVhdGVBdmFpbGFibGVKYXJzTGlzdChncm91cCk7Ci0JCWNyZWF0ZUJ1dHRvbnNHcm91cChncm91cCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3RPcHRpb25zR3JvdXAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPdmVyd3JpdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJb3ZlcndyaXRlUHJvamVjdENoZWNrYm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCW92ZXJ3cml0ZVByb2plY3RDaGVja2JveC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KG92ZXJ3cml0ZVByb2plY3RDaGVja2JveCwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0lGX05FQ0VTU0FSWSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SkFSc0NvbXBvc2l0ZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldEFsbEdyYXllZCghZW5hYmxlZCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0pBUl9MSVNULCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfSUZfTkVDRVNTQVJZLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5MSU5LRURfUEFUSF9WQVJJQUJMRX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKLQotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9MQUJFTCArIGdldEZpbGVOYW1lc1N0b3JlSUQoKSk7Ci0JCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGllLi0gbm8gc2V0dGluZ3Mgc3RvcmVkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNvdXJjZU5hbWVzW2ldID09IG51bGwpCi0JCQkJCXNvdXJjZU5hbWVzW2ldID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWF2YWlsYWJsZUphcnNDb21iby5zZXRJdGVtcyhzb3VyY2VOYW1lcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCS8vIHVwZGF0ZSBzb3VyY2UgbmFtZXMgaGlzdG9yeQotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9MQUJFTCArIGdldEZpbGVOYW1lc1N0b3JlSUQoKSk7Ci0JCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkgewotCQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLQkJCX0KLQotCQkJU3RyaW5nIG5ld05hbWUgPSBhdmFpbGFibGVKYXJzQ29tYm8uZ2V0VGV4dCgpOwotCi0JCQkvLyByaXAgb3V0IGFueSBlbXB0eSBmaWxlbmFtZXMgYW5kIHRyaW0gbGVuZ3RoIHRvIDUKLQkJCUFycmF5TGlzdCBuZXdOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoICYmIGkgPCA1OyBpKyspIHsKLQkJCQlpZiAoc291cmNlTmFtZXNbaV0udHJpbSgpLmxlbmd0aCgpID4gMCAmJiAhbmV3TmFtZS5lcXVhbHMoc291cmNlTmFtZXNbaV0pKSB7Ci0JCQkJCW5ld05hbWVzLmFkZChzb3VyY2VOYW1lc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJbmV3TmFtZXMuYWRkKDAsIGF2YWlsYWJsZUphcnNDb21iby5nZXRUZXh0KCkpOwotCQkJc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nW25ld05hbWVzLnNpemUoKV07Ci0JCQluZXdOYW1lcy50b0FycmF5KHNvdXJjZU5hbWVzKTsKLQotCQkJc2V0dGluZ3MucHV0KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpLCBzb3VyY2VOYW1lcyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWxlTmFtZXNTdG9yZUlEKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7Ci0JCXJldHVybiAiVVRJTCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbGVJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlSW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZU5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTI3YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMTMsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZU5ldyBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CUk9XU0VfTEFCRUwpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFJlc291cmNlU2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBDb21ibyByZXNvdXJjZU5hbWVDb21ibzsKLQotCXByaXZhdGUgQnV0dG9uIGNvcHlKYXJJbnRvRUFSOwotCi0JcHJpdmF0ZSBCdXR0b24gbGlua0phckludG9FQVI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVMaW5rZWRQcm9qZWN0czsKLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVByb2plY3RzOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBiaW5hcnlJbXBvcnRDaGVja2JveDsKLQotCXByaXZhdGUgQnV0dG9uIG92ZXJyaWRlUHJvamVjdFJvb3RDaGVja2JveDsKLQotCi0JcHJvdGVjdGVkIFRleHQgcHJvamVjdFJvb3RMb2NhdGlvblRleHQ7Ci0KLQlwcml2YXRlIExhYmVsIG1vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzAiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMSIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEdyb3VwIHByb2plY3RSb290Q29tcG9zaXRlOwotCi0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gdGl0bGVJbWFnZQotCSAqLwotCXB1YmxpYyBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3KElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLCBJbWFnZURlc2NyaXB0b3IgdGl0bGVJbWFnZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHRpdGxlLCB0aXRsZUltYWdlKTsKLQkJc2V0VGl0bGUoIiIpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfVVRJTElUWV9KQVJfV0laQVJEX1AyKTsKLQl9Ci0KLQlwdWJsaWMgSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZU5ldyhJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQl0aGlzLmN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJc2V0VGl0bGUoVElUTEUpOwotCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQlwdWJsaWMgSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZU5ldyhJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoVElUTEUpOwotCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNULCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX1JPT1R9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljcmVhdGVFQVJQcm9qZWN0R3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlVXRpbGl0eUphckltcG9ydFR5cGVzKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVByb2plY3RDcmVhdGlvbk9wdGlvbnMoY29tcG9zaXRlKTsKLQotCQlzZXR1cEJhc2VkT25Jbml0aWFsU2VsZWN0aW9ucygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVdGlsaXR5SmFySW1wb3J0VHlwZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCB0eXBlc0dyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQl0eXBlc0dyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQl0eXBlc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQl0eXBlc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZVByb2plY3RzID0gbmV3IEJ1dHRvbih0eXBlc0dyb3VwLCBTV1QuUkFESU8pOwotCQljcmVhdGVQcm9qZWN0cy5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hSYWRpbyhjcmVhdGVQcm9qZWN0cywgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX1BST0pFQ1QsIG51bGwpOwotCi0JCWNyZWF0ZUxpbmtlZFByb2plY3RzID0gbmV3IEJ1dHRvbih0eXBlc0dyb3VwLCBTV1QuUkFESU8pOwotCQljcmVhdGVMaW5rZWRQcm9qZWN0cy5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hSYWRpbyhjcmVhdGVMaW5rZWRQcm9qZWN0cywgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX0xJTktFRF9QUk9KRUNULCBudWxsKTsKLQotCQljb3B5SmFySW50b0VBUiA9IG5ldyBCdXR0b24odHlwZXNHcm91cCwgU1dULlJBRElPKTsKLQkJY29weUphckludG9FQVIuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV81IikpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8oY29weUphckludG9FQVIsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPUFksIG51bGwpOwotCi0JCWxpbmtKYXJJbnRvRUFSID0gbmV3IEJ1dHRvbih0eXBlc0dyb3VwLCBTV1QuUkFESU8pOwotCQlsaW5rSmFySW50b0VBUi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJLyogbGlua0phckludG9FQVIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0VHlwZVNlbGVjdGlvbkxpc3RlbmVyKCkpOyAqLwotCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGxpbmtKYXJJbnRvRUFSLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5MSU5LX0lNUE9SVCwgbnVsbCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0Q3JlYXRpb25PcHRpb25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlHcm91cCBwcm9qZWN0T3B0aW9uc0dyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlwcm9qZWN0T3B0aW9uc0dyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlwcm9qZWN0T3B0aW9uc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlwcm9qZWN0T3B0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZUJpbmFyeUltcG9ydENoZWNrYm94KHByb2plY3RPcHRpb25zR3JvdXApOwotCi0JCW92ZXJyaWRlUHJvamVjdFJvb3RDaGVja2JveCA9IG5ldyBCdXR0b24ocHJvamVjdE9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJb3ZlcnJpZGVQcm9qZWN0Um9vdENoZWNrYm94LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMTEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlUHJvamVjdFJvb3RDb21wb3NpdGUocHJvamVjdE9wdGlvbnNHcm91cCk7Ci0KLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChvdmVycmlkZVByb2plY3RSb290Q2hlY2tib3gsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJSSURFX1BST0pFQ1RfUk9PVCwgbmV3IENvbnRyb2xbXXsvKgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqIG1vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHByb2plY3RSb290TG9jYXRpb25UZXh0LAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGJyb3dzZUJ1dHRvbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqL30pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI3Byb3BlcnR5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkvLyBpZiAoc3luY2hpbmcpIHJldHVybjsKLQkJLy8gc3luY2hpbmcgPSB0cnVlOwotCQkvLyBpZiAoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLkNSRUFURV9QUk9KRUNULmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkKLQkJLy8gfHwgSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLkxJTktfSU1QT1JULmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJLy8KLQkJLy8gYm9vbGVhbiBzaG91bGRDcmVhdGVQcm9qZWN0ID0KLQkJLy8gZ2V0TW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLkNSRUFURV9QUk9KRUNUKTsKLQkJLy8gYm9vbGVhbiBsaW5rSW1wb3J0ZWRDb250ZW50ID0KLQkJLy8gZ2V0TW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLkxJTktfSU1QT1JUKTsKLQkJLy8KLQkJLy8gY3JlYXRlUHJvamVjdHMuc2V0U2VsZWN0aW9uKHNob3VsZENyZWF0ZVByb2plY3QgJiYgIWxpbmtJbXBvcnRlZENvbnRlbnQpOwotCQkvLyBjcmVhdGVMaW5rZWRQcm9qZWN0cy5zZXRTZWxlY3Rpb24oc2hvdWxkQ3JlYXRlUHJvamVjdCAmJiBsaW5rSW1wb3J0ZWRDb250ZW50KTsKLQkJLy8gbGlua0phckludG9FQVIuc2V0U2VsZWN0aW9uKCFzaG91bGRDcmVhdGVQcm9qZWN0ICYmIGxpbmtJbXBvcnRlZENvbnRlbnQpOwotCQkvLyBjb3B5SmFySW50b0VBUi5zZXRTZWxlY3Rpb24oIXNob3VsZENyZWF0ZVByb2plY3QgJiYgIWxpbmtJbXBvcnRlZENvbnRlbnQpOwotCQkvLyAgICAgICAgICAgICAKLQkJLy8gZW5hYmxlUHJvamVjdE9wdGlvbnMoc2hvdWxkQ3JlYXRlUHJvamVjdCk7Ci0JCS8vCi0JCS8vIH0gZWxzZQotCQkvLyBpZihKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuT1ZFUlJJREVfUFJPSkVDVF9ST09ULmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpCi0JCS8vIHsKLQkJLy8gYm9vbGVhbiBvdmVycmlkZVByb2plY3RSb290ID0KLQkJLy8gZ2V0TW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLk9WRVJSSURFX1BST0pFQ1RfUk9PVCk7Ci0JCS8vIHByb2plY3RSb290TG9jYXRpb25UZXh0LnNldEVuYWJsZWQob3ZlcnJpZGVQcm9qZWN0Um9vdCk7Ci0JCS8vIH0KLQkJLy8gc3luY2hpbmcgPSBmYWxzZTsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCBpcyB0byBiZSB1c2VkIGFzIHRoZSBwYXJlbnQgb2YgdGhpcyBncm91cCdzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIHZpc3VhbCBjb21wb25lbnRzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFQVJQcm9qZWN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUdyb3VwIGVhckdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQllYXJHcm91cC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzgiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJZWFyR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWVhckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIFByb2plY3QgbGFiZWwKLQkJTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKGVhckdyb3VwLCBTV1QuTk9ORSk7Ci0JCXByb2plY3RMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gUHJvamVjdCBjb21ibwotCQlyZXNvdXJjZU5hbWVDb21ibyA9IG5ldyBDb21ibyhlYXJHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCXJlc291cmNlTmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocmVzb3VyY2VOYW1lQ29tYm8sIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNULCBudWxsKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3RSb290Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcHJvamVjdFJvb3RDb21wb3NpdGUgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXByb2plY3RSb290Q29tcG9zaXRlLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuUFJPSkVDVF9MT0NBVElPTlNfR1JPVVApKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXByb2plY3RSb290Q29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlwcm9qZWN0Um9vdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChwcm9qZWN0Um9vdENvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19QUk9KRUNUX0dST1VQX0RFU0NSSVBUSU9OKSk7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZDIuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLQkJbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwocHJvamVjdFJvb3RDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5VU0VfREVGQVVMVF9ST09UX1JBRElPKSk7Ci0JCW1vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCXByb2plY3RSb290TG9jYXRpb25UZXh0ID0gbmV3IFRleHQocHJvamVjdFJvb3RDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlwcm9qZWN0Um9vdExvY2F0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcHJvamVjdFJvb3RMb2NhdGlvblRleHQuc2V0VGV4dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJcHJvamVjdFJvb3RMb2NhdGlvblRleHQuc2V0RW5hYmxlZChmYWxzZSk7IC8qIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8KLQotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHByb2plY3RSb290Q29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVJvb3RQcm9qZWN0QnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQocHJvamVjdFJvb3RMb2NhdGlvblRleHQsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfUk9PVCwgbmV3IENvbnRyb2xbXXttb2R1bGVQcm9qZWN0TG9jYXRpb25MYWJlbCwgcHJvamVjdFJvb3RMb2NhdGlvblRleHQsIGJyb3dzZUJ1dHRvbn0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJpbmFyeUltcG9ydENoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYmluYXJ5SW1wb3J0Q2hlY2tib3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYmluYXJ5SW1wb3J0Q2hlY2tib3guc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8xMCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGJpbmFyeUltcG9ydENoZWNrYm94LCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5CSU5BUllfSU1QT1JULCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGFuIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBicm93c2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUm9vdFByb2plY3RCcm93c2VCdXR0b25QcmVzc2VkKCkgewotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhicm93c2VCdXR0b24uZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlNFTEVDVF9ESVJFQ1RPUllfRExHKSk7Ci0KLQkJU3RyaW5nIGRpck5hbWUgPSBnZXRCcm93c2VTdGFydExvY2F0aW9uKCk7Ci0KLQkJaWYgKCFpc051bGxPckVtcHR5KGRpck5hbWUpKSB7Ci0JCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkaXJOYW1lKTsKLQkJCWlmIChwYXRoLmV4aXN0cygpKQotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQl9Ci0KLQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQlwcm9qZWN0Um9vdExvY2F0aW9uVGV4dC5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QnJvd3NlU3RhcnRMb2NhdGlvbigpIHsKLQkJU3RyaW5nIHRleHQgPSBwcm9qZWN0Um9vdExvY2F0aW9uVGV4dC5nZXRUZXh0KCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gYVN0cmluZyA9PSBudWxsIHx8IGFTdHJpbmcubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIHJlc291cmNlIG5hbWUgZmllbGQgYmFzZWQgdXBvbiB0aGUgY3VycmVudGx5LXNlbGVjdGVkIHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEJhc2VkT25Jbml0aWFsU2VsZWN0aW9ucygpIHsKLQotCQlpZiAobnVsbCA9PSBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24gfHwgY3VycmVudFJlc291cmNlU2VsZWN0aW9uLmlzRW1wdHkoKSB8fCBzZXR1cEJhc2VkT25SZWZPYmplY3RTZWxlY3Rpb24oKSkKLQkJCXJldHVybjsgLy8gbm8KLQkJLy8gc2V0dXAKLQkJLy8gbmVlZGVkCi0KLQkJamF2YS51dGlsLkxpc3Qgc2VsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgYWVudW0gPSBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFlbnVtLmhhc05leHQoKSkgewotCQkJSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIGFlbnVtLm5leHQoKTsKLQkJCS8vIGRvIG5vdCBhZGQgaW5hY2Nlc3NpYmxlIGVsZW1lbnRzCi0JCQlpZiAoY3VycmVudFJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQotCQkJCXNlbGVjdGlvbnMuYWRkKGN1cnJlbnRSZXNvdXJjZSk7Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOyAvLyBzZXR1cCBub3QgbmVlZGVkIGFueW1vcmUKLQotCQlpbnQgc2VsZWN0ZWRSZXNvdXJjZUNvdW50ID0gc2VsZWN0aW9ucy5zaXplKCk7Ci0JCWlmIChzZWxlY3RlZFJlc291cmNlQ291bnQgPT0gMSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgc2VsZWN0aW9ucy5nZXQoMCk7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCApIHsKLQkJCQlyZXNvdXJjZU5hbWVDb21iby5zZXRUZXh0KHJlc291cmNlLmdldE5hbWUoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNldHVwQmFzZWRPblJlZk9iamVjdFNlbGVjdGlvbigpIHsKLQotCQlpZiAoY3VycmVudFJlc291cmNlU2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU9iamVjdCBvID0gY3VycmVudFJlc291cmNlU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoIWlzTWV0YVR5cGVTdXBwb3J0ZWQobykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgbzsKLQkJSVJlc291cmNlIHJlc291cmNlID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJlZik7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJcmVzb3VyY2VOYW1lQ29tYm8uc2V0VGV4dChyZXNvdXJjZS5nZXROYW1lKCkudG9TdHJpbmcoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTWV0YVR5cGVTdXBwb3J0ZWQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBFQVJGaWxlIHx8IG8gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVQcm9qZWN0T3B0aW9ucyhib29sZWFuIGVuYWJsZWQpIHsKLQkJLy8gZ2V0TW9kZWwoKS5zZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLkJJTkFSWV9JTVBPUlQsIGVuYWJsZWQpOwotCQliaW5hcnlJbXBvcnRDaGVja2JveC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlvdmVycmlkZVByb2plY3RSb290Q2hlY2tib3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQotCQlpZiAob3ZlcnJpZGVQcm9qZWN0Um9vdENoZWNrYm94LmdldFNlbGVjdGlvbigpICYmIGVuYWJsZWQpCi0JCQlwcm9qZWN0Um9vdExvY2F0aW9uVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQllbHNlCi0JCQlwcm9qZWN0Um9vdExvY2F0aW9uVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gbW9kZWwudmFsaWRhdGVQcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVCkuaXNPSygpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwNDg3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotCi0vKioKLSAqIDxwPgotICogVXNlZCB0byBpbXBvcnQgVXRpbGl0eSBKYXJzIGludG8gc2V2ZXJhbCBFY2xpcHNlIHdvcmtiZW5jaCBjb25maWd1cmF0aW9ucy4gVGhlc2UgY2FuIGJlIGV4dHJhY3RlZAotICogYXMgZWRpdGFibGUgcHJvamVjdHMsIGJpbmFyeSBwcm9qZWN0cywgbGlua2VkIHJlc291cmNlcyBpbiB0aGUgRUFSIG1vZHVsZSBvciBhY3R1YWwgcmVzb3VyY2VzIGluCi0gKiB0aGUgRUFSIG1vZHVsZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3IGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdGFudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBrZXkgb2YgdGhlIHBhZ2Ugb2YgdGhlIFdpemFyZCB3aGljaCBhbGxvd3MgdXNlcnMgdG8gZGVmaW5lIHRoZQotCSAqIHR5cGUgb2YgaW1wb3J0IHRoZXkgd291bGQgbGlrZSB0byBjYXJyeSBvdXQuCi0JICogPC9wPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVFlQRSA9ICJJTVBPUlRfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0YW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBvZiB0aGUgcGFnZSBvZiB0aGUgV2l6YXJkIHRoYXQgYWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBqYXIKLQkgKiBmaWxlcyBmb3IgaW1wb3J0Ci0JICogPC9wPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfSkFSUyA9ICJTRUxFQ1RfSkFSUyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBKMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBKMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldyhJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIHRoZSBmb2xsb3dpbmcgcGFnZXM6Ci0JICogPHVsPgotCSAqIDxsaT57QGxpbmsgSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZU5ld31hcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNJTVBPUlRfVFlQRX0pCi0JICogPGxpPntAbGluayBKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXd9YXMgdGhlIG1haW4gd2l6YXJkIHBhZ2UgKHtAbGluayAjU0VMRUNUX0pBUlN9KQotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCXRoaXMuYWRkUGFnZShuZXcgSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZU5ldyhnZXREYXRhTW9kZWwoKSwgSU1QT1JUX1RZUEUsIHNlbGVjdGlvbikpOwotCQl0aGlzLmFkZFBhZ2UobmV3IEoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ldyhnZXREYXRhTW9kZWwoKSwgU0VMRUNUX0pBUlMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0phdmFVdGlsaXR5Q29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWQyMTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci0KLS8qKgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEphdmFVdGlsaXR5Q29tcG9uZW50Q3JlYXRpb25XaXphcmQgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLCBJRXhlY3V0YWJsZUV4dGVuc2lvbnsKLQotLy8JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCi0JcHVibGljIEphdmFVdGlsaXR5Q29tcG9uZW50Q3JlYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpBVkFVVElMX0NPTVBPTkVOVF9XSVpfVElUTEUpKTsKLQkJLy9zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5BUFBfQ0xJRU5UX1BST0pFQ1RfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IEphdmFVdGlsaXR5Q29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlKGdldERhdGFNb2RlbCgpLCBKYXZhVXRpbGl0eUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5QQUdFX05BTUUpKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQjZ2V0RGVmYXVsdFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nIGFQcm9wZXJ0eU5hbWUsIE9iamVjdCB0aGVEYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJY29uZmlndXJhdGlvbkVsZW1lbnQgPSBhQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0vLwkJZG9TZXRJbml0aWFsaXplRGF0YShhQ29uZmlndXJhdGlvbkVsZW1lbnQsIGFQcm9wZXJ0eU5hbWUsIHRoZURhdGEpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkZpbmlzaCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3MjBkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0phdmFVdGlsaXR5Q29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5XU1RXZWJQbHVnaW47Ci0KLQotCi0vKioKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVXRpbGl0eUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9ICJKYXZhVXRpbGl0eUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgTmV3TW9kdWxlR3JvdXBFeCBwcm9qZWN0TmFtZUdyb3VwOwkKLQkKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCQotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KQVZBVVRJTElUWV9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpBVkFVVElMSVRZX01BSU5fUEdfREVTQykpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihXU1RXZWJQbHVnaW4uUExVR0lOX0lELCAiaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0pBVkFfQ09NUE9ORU5UX1dJWkFSRF9QMSk7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FfTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgdG9wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJdG9wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdG9wLnNldERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWNyZWF0ZVByb2plY3ROYW1lR3JvdXAoY29tcG9zaXRlKTsKLQkJQ29tcG9zaXRlIGRldGFpbCA9IG5ldyBDb21wb3NpdGUodG9wLCBTV1QuTk9ORSk7Ci0JCWRldGFpbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWRldGFpbC5zZXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCi0JCXJldHVybiB0b3A7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlwcm9qZWN0TmFtZUdyb3VwID0gbmV3IE5ld01vZHVsZUdyb3VwRXgocGFyZW50LCBTV1QuTlVMTCwgbW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjg3OGMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbGVTeXN0ZW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLkFkYXB0YWJsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSA8Y29kZT5NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudDwvY29kZT4gaXMgYSA8Y29kZT5GaWxlU3lzdGVtRWxlbWVudDwvY29kZT4gdGhhdCBrbm93cyBpZgotICogaXQgaGFzIGJlZW4gcG9wdWxhdGVkIG9yIG5vdC4KLSAqLwotY2xhc3MgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZXh0ZW5kcyBGaWxlU3lzdGVtRWxlbWVudCB7Ci0JcHJpdmF0ZSBib29sZWFuIHBvcHVsYXRlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIHBhY2thZ2VCYXNlRGlyTmFtZSA9IG51bGw7Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBhIDxjb2RlPk1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiB3aXRoIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGVsZW1lbnQgdGhpcyByZXByZXNlbnRzCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgcGFyZW50Ci0JICogQHBhcmFtIGlzRGlyZWN0b3J5Ci0JICogICAgICAgICAgICBpbmRpY2F0ZWQgaWYgdGhpcyBjb3VsZCBoYXZlIGNoaWxkcmVuIG9yIG5vdAotCSAqLwotCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KFN0cmluZyBuYW1lLCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbGVTeXN0ZW1FbGVtZW50IHBhcmVudCwgYm9vbGVhbiBpc0RpcmVjdG9yeSkgewotCQlzdXBlcihuYW1lLCBwYXJlbnQsIGlzRGlyZWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdlQmFzZURpck5hbWUoU3RyaW5nIHMpIHsKLQkJcGFja2FnZUJhc2VEaXJOYW1lID0gczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChGaWxlU3lzdGVtRWxlbWVudCBjaGlsZCkgewotCQlpZiAoY2hpbGQuaXNEaXJlY3RvcnkoKSkgewotCQkJc3VwZXIuYWRkQ2hpbGQoY2hpbGQpOwotCQl9IGVsc2UgewotCQkJaWYgKGNoaWxkLmdldEZpbGVOYW1lRXh0ZW5zaW9uKCkuZXF1YWxzKCJjbGFzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdXBlci5hZGRDaGlsZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW1tZWRpYXRlIGNoaWxkcmVuLiBVc2UgdGhlIHN1cHBsaWVkIHByb3ZpZGVyIGlmIGl0Ci0JICogbmVlZHMgdG8gYmUgcG9wdWxhdGVkLiBvZiB0aGlzIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgQWRhcHRhYmxlTGlzdCBnZXRGaWxlcyhJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJaWYgKCFwb3B1bGF0ZWQpCi0JCQlwb3B1bGF0ZShwcm92aWRlcik7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEZpbGVzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgZm9sZGVycyB0aGF0IGFyZSBpbW1lZGlhdGUgY2hpbGRyZW4uIFVzZSB0aGUgc3VwcGxpZWQgcHJvdmlkZXIgaWYgaXQKLQkgKiBuZWVkcyB0byBiZSBwb3B1bGF0ZWQuIG9mIHRoaXMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBBZGFwdGFibGVMaXN0IGdldEZvbGRlcnMoSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWlmICghcG9wdWxhdGVkKQotCQkJcG9wdWxhdGUocHJvdmlkZXIpOwotCi0JCXJldHVybiBzdXBlci5nZXRGb2xkZXJzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgcG9wdWxhdGlvbiBoYXMgaGFwcGVuZWQgZm9yIHRoZSByZWNlaXZlci4KLQkgKi8KLQlib29sZWFuIGlzUG9wdWxhdGVkKCkgewotCQlyZXR1cm4gdGhpcy5wb3B1bGF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHBvcHVsYXRpb24gaGFzIG5vdCBoYXBwZW5lZCBmb3IgdGhlIHJlY2VpdmVyLgotCSAqLwotCWJvb2xlYW4gbm90UG9wdWxhdGVkKCkgewotCQlyZXR1cm4gIXRoaXMucG9wdWxhdGVkOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlIHRoZSBmaWxlcyBhbmQgZm9sZGVycyBvZiB0aGUgcmVjZWl2ZXIgdXNpbmcgdGhlIHN1cHBsaWVjIHN0cnVjdHVyZSBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZShJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQotCQlPYmplY3QgZmlsZVN5c3RlbU9iamVjdCA9IGdldEZpbGVTeXN0ZW1PYmplY3QoKTsKLQotCQlMaXN0IGNoaWxkcmVuID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZmlsZVN5c3RlbU9iamVjdCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlJdGVyYXRvciBjaGlsZHJlbkVudW0gPSBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoY2hpbGRyZW5FbnVtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5FbnVtLm5leHQoKTsKLQotCQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IHByb3ZpZGVyLmdldExhYmVsKGNoaWxkKTsKLQkJCWlmIChlbGVtZW50TGFiZWwuZXF1YWxzKHBhY2thZ2VCYXNlRGlyTmFtZSkgfHwgcGFja2FnZUJhc2VEaXJOYW1lID09IG51bGwpIHsKLQkJCQkvL0NyZWF0ZSBvbmUgbGV2ZWwgYmVsb3cKLQotCQkJCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHJlc3VsdCA9IG5ldyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudChlbGVtZW50TGFiZWwsIHRoaXMsIHByb3ZpZGVyLmlzRm9sZGVyKGNoaWxkKSk7Ci0JCQkJcmVzdWx0LnNldEZpbGVTeXN0ZW1PYmplY3QoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXNldFBvcHVsYXRlZCgpOwotCi0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgb3Igbm90IHBvcHVsYXRpb24gaGFzIGhhcHBlbmVkIGZvciB0aGUgcmVjZWl2ZXIgdG8gdHJ1ZS4KLQkgKi8KLQl2b2lkIHNldFBvcHVsYXRlZCgpIHsKLQkJdGhpcy5wb3B1bGF0ZWQgPSB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0ZsZXhpYmxlUHJvamVjdEdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0ZsZXhpYmxlUHJvamVjdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDk1NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdGbGV4aWJsZVByb2plY3RHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxNCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLQotcHVibGljIGNsYXNzIE5ld0ZsZXhpYmxlUHJvamVjdEdyb3VwIGltcGxlbWVudHMgSUZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXN7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIG1vZGVsOwotCXB1YmxpYyBUZXh0IHByb2plY3ROYW1lRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IGxvY2F0aW9uUGF0aEZpZWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG51bGw7Ci0JLy8JY29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotCS8vCWRlZmF1bHQgdmFsdWVzCi0JcHJpdmF0ZSBTdHJpbmcgZGVmUHJvamVjdE5hbWVMYWJlbCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5BTUVfTEFCRUwpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CUk9XU0VfTEFCRUwpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZkRpckRpYWxvZ0xhYmVsID0gIkRpcmVjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIE5ld0ZsZXhpYmxlUHJvamVjdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSURhdGFNb2RlbCBtb2RlbCwgRGF0YU1vZGVsU3luY2hIZWxwZXIgYUhlbHBlcikgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXN5bmNoSGVscGVyID0gYUhlbHBlcjsKLQkJYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb250cm9scyB3aXRoaW4gdGhpcyBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZENvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVQcm9qZWN0TmFtZUdyb3VwKHBhcmVudCk7Ci0JCWNyZWF0ZVByb2plY3RMb2NhdGlvbkdyb3VwKHBhcmVudCk7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGxhYmVsCi0JCUxhYmVsIHByb2plY3ROYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChkZWZQcm9qZWN0TmFtZUxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgZW50cnkgZmllbGQKLQkJcHJvamVjdE5hbWVGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7IC8vIHBhZAotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQocHJvamVjdE5hbWVGaWVsZCwgUFJPSkVDVF9OQU1FLCBuZXcgQ29udHJvbFtde3Byb2plY3ROYW1lTGFiZWx9KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RMb2NhdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8JCXNldCB1cCBsb2NhdGlvbiBwYXRoIGxhYmVsCi0JCUxhYmVsIGxvY2F0aW9uUGF0aExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsb2NhdGlvblBhdGhMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlBST0pFQ1RfTE9DX0xCTCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxvY2F0aW9uUGF0aExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCS8vIHNldCB1cCBsb2NhdGlvbiBwYXRoIGVudHJ5IGZpZWxkCi0JCWxvY2F0aW9uUGF0aEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJbG9jYXRpb25QYXRoRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy8gc2V0IHVwIGJyb3dzZSBidXR0b24KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoZGVmQnJvd3NlQnV0dG9uTGFiZWwpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChsb2NhdGlvblBhdGhGaWVsZCwgUFJPSkVDVF9MT0NBVElPTiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYnJvd3NlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobG9jYXRpb25QYXRoRmllbGQuZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKGRlZkRpckRpYWxvZ0xhYmVsKTsKLQkJU3RyaW5nIGRpck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX0xPQ0FUSU9OKTsKLQkJaWYgKChkaXJOYW1lICE9IG51bGwpICYmIChkaXJOYW1lLmxlbmd0aCgpICE9IDApKSB7Ci0JCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkaXJOYW1lKTsKLQkJCWlmIChwYXRoLmV4aXN0cygpKSB7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCW1vZGVsLnNldFByb3BlcnR5KFBST0pFQ1RfTE9DQVRJT04sIHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJbW9kZWwgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0oyRUVDb21wb25lbnRTZWxlY3Rpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0oyRUVDb21wb25lbnRTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmZlMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKMkVFQ29tcG9uZW50U2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uRWFyTW9kdWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGx1Z2luQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuV29ya2JlbmNoQWN0aXZpdHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLkdlbmVyaWNXaXphcmROb2RlOwotCi1wdWJsaWMgY2xhc3MgTmV3SjJFRUNvbXBvbmVudFNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIGltcGxlbWVudHMgSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLSAgICBwcml2YXRlIEJ1dHRvbiBkZWZhdWx0TW9kdWxlc0J1dHRvbjsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGRlZmF1bHRNb2R1bGVzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbmV3TW9kdWxlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGFwcENsaWVudFJhZGlvQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZWpiUmFkaW9CdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiB3ZWJSYWRpb0J1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGNvbm5lY3RvclJhZGlvQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBhcHBDbGllbnROb2RlOwotCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBlamJOb2RlOwotCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSB3ZWJOb2RlOwotCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBjb25uZWN0b3JOb2RlOwotCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBzZWxlY3RlZE5vZGU7Ci0KLSAgICBwcml2YXRlIFN0YWNrTGF5b3V0IHN0YWNrTGF5b3V0OwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICogQHBhcmFtIHBhZ2VOYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5ld0oyRUVDb21wb25lbnRTZWxlY3Rpb25QYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotICAgICAgICBzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotICAgICAgICBzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ERUZBVUxUX0NPTVBPTkVOVF9QQUdFX1RJVExFKSk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkRFRkFVTFRfQ09NUE9ORU5UX1BBR0VfREVTQykpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5KMkVFV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgQ1JFQVRFX0FQUENMSUVOVCwgQVBQQ0xJRU5UX0NPTVBPTkVOVF9OQU1FLCBDUkVBVEVfQ09OTkVDVE9SLCBDT05ORUNUT1JfQ09NUE9ORU5UX05BTUUsIENSRUFURV9FSkIsIEVKQl9DT01QT05FTlRfTkFNRSwgQ1JFQVRFX1dFQiwgV0VCX0NPTVBPTkVOVF9OQU1FLCBNT0RVTEVfTkFNRV9DT0xMSVNJT05TX1ZBTElEQVRJT04sIEVOQUJMRUQgfTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuSjJFRVdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuRUFSX05FV19NT0RVTEVfUFJPSkVDVFNfUEFHRSk7Ci0gICAgICAgIGNyZWF0ZURlZmF1bHRDaGVja0JveChjb21wb3NpdGUpOwotICAgICAgICBDb21wb3NpdGUgZm9yU3RhY2tDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBmb3JTdGFja0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgZm9yU3RhY2tDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIENvbXBvc2l0ZSBzdGFja0NvbXBvc2l0ZSA9IGNyZWF0ZVN0YWNrTGF5b3V0Q29tcG9zaXRlKGZvclN0YWNrQ29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlRGVmYXVsdE1vZHVsZXNDb21wb3NpdGUoc3RhY2tDb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVNb2R1bGVTZWxlY3Rpb25Db21wb3NpdGUoc3RhY2tDb21wb3NpdGUpOwotICAgICAgICBzdGFja0xheW91dC50b3BDb250cm9sID0gZGVmYXVsdE1vZHVsZXNDb21wb3NpdGU7Ci0gICAgICAgIHNldEJ1dHRvbkVuYWJsZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVN0YWNrTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIHN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoc3RhY2tMYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRNb2R1bGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZGVmYXVsdE1vZHVsZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgLy8gRGVmYXVsdCBNb2R1bGUgQ29udHJvbHMgY3JlYXRpb24KLSAgICAgICAgY3JlYXRlQXBwQ2xpZW50RGVmYXVsdE1vZHVsZUNvbnRyb2woKTsKLSAgICAgICAgaWYgKEoyRUVQbHVnaW4uaXNFSkJTdXBwb3J0QXZhaWxhYmxlKCkpCi0gICAgICAgICAgICBjcmVhdGVFSkJEZWZhdWx0TW9kdWxlQ29udHJvbCgpOwotICAgICAgICBjcmVhdGVXZWJEZWZhdWx0TW9kdWxlQ29udHJvbCgpOwotICAgICAgICBpZiAoSjJFRVBsdWdpbi5pc0VKQlN1cHBvcnRBdmFpbGFibGUoKSkKLSAgICAgICAgICAgIGNyZWF0ZUNvbm5lY3RvckRlZmF1bHRNb2R1bGVDb250cm9sKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNb2R1bGVTZWxlY3Rpb25Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBuZXdNb2R1bGVzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIG5ld01vZHVsZXNDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIG5ld01vZHVsZXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGFwcENsaWVudFJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihuZXdNb2R1bGVzQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCi0gICAgICAgIGFwcENsaWVudFJhZGlvQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld01vZHVsZVNlbGVjdGlvblBhZ2UuYXBwQ2xpZW50IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFwcENsaWVudFJhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgICAgICBpZiAoRWFyTW9kdWxlTWFuYWdlci5nZXRFSkJNb2R1bGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlamJSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24obmV3TW9kdWxlc0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgICAgIGVqYlJhZGlvQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld01vZHVsZVNlbGVjdGlvblBhZ2UuZWpiIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlamJSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRWFyTW9kdWxlTWFuYWdlci5nZXRXZWJNb2R1bGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3ZWJSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24obmV3TW9kdWxlc0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgICAgIHdlYlJhZGlvQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld01vZHVsZVNlbGVjdGlvblBhZ2Uud2ViIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB3ZWJSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRWFyTW9kdWxlTWFuYWdlci5nZXRKQ0FNb2R1bGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25uZWN0b3JSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24obmV3TW9kdWxlc0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgICAgIGNvbm5lY3RvclJhZGlvQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld01vZHVsZVNlbGVjdGlvblBhZ2UuamNhIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBjb25uZWN0b3JSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb25uZWN0b3JEZWZhdWx0TW9kdWxlQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKEVhck1vZHVsZU1hbmFnZXIuZ2V0SkNBTW9kdWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9KQ0FfTU9EVUxFX0xCTCk7Ci0gICAgICAgICAgICBjcmVhdGVKMkVFQ29tcG9uZW50Q29udHJvbChsYWJlbCwgQ1JFQVRFX0NPTk5FQ1RPUiwgQ09OTkVDVE9SX0NPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWJEZWZhdWx0TW9kdWxlQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKEVhck1vZHVsZU1hbmFnZXIuZ2V0V2ViTW9kdWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9XRUJfTU9EVUxFX0xCTCk7Ci0gICAgICAgICAgICBjcmVhdGVKMkVFQ29tcG9uZW50Q29udHJvbChsYWJlbCwgQ1JFQVRFX1dFQiwgV0VCX0NPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVFSkJEZWZhdWx0TW9kdWxlQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKEVhck1vZHVsZU1hbmFnZXIuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9FSkJfTU9EVUxFX0xCTCk7Ci0gICAgICAgICAgICBjcmVhdGVKMkVFQ29tcG9uZW50Q29udHJvbChsYWJlbCwgQ1JFQVRFX0VKQiwgRUpCX0NPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBcHBDbGllbnREZWZhdWx0TW9kdWxlQ29udHJvbCgpIHsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9BUFBDTElFTlRfTU9EVUxFX0xCTCk7Ci0gICAgICAgIGNyZWF0ZUoyRUVDb21wb25lbnRDb250cm9sKGxhYmVsLCBDUkVBVEVfQVBQQ0xJRU5ULCBBUFBDTElFTlRfQ09NUE9ORU5UX05BTUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVKMkVFQ29tcG9uZW50Q29udHJvbChTdHJpbmcgbGFiZWwsIFN0cmluZyBjcmVhdGVQcm9wZXJ0eSwgU3RyaW5nIHByb2plY3RQcm9wZXJ0eSkgewotICAgICAgICBmaW5hbCBCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKGRlZmF1bHRNb2R1bGVzQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgICAgICBjaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIGNoZWNrQm94LnNldFRleHQobGFiZWwpOwotCi0gICAgICAgIGZpbmFsIFRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQoZGVmYXVsdE1vZHVsZXNDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIHRleHRGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGNoZWNrQm94LCBjcmVhdGVQcm9wZXJ0eSwgbnVsbCk7Ci0gICAgICAgIHN5bmNoSGVscGVyLnN5bmNoVGV4dCh0ZXh0RmllbGQsIHByb2plY3RQcm9wZXJ0eSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRDaGVja0JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjaGVja0JveENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY2hlY2tCb3hDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNoZWNrQm94Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0J1dHRvbiA9IG5ldyBCdXR0b24oY2hlY2tCb3hDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgICBkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0J1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0J1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkRFRkFVTFRfQ09NUE9ORU5UX1BBR0VfTkVXX01PRF9TRUxfUEdfREVGX0JUTikpOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRlZmF1bHRNb2R1bGVzQnV0dG9uLCBFTkFCTEVELCBudWxsKTsKLSAgICAgICAgY3JlYXRlQ29udHJvbHNTZXBhcmF0b3JMaW5lKGNoZWNrQm94Q29tcG9zaXRlKTsgICAgCi0gICAgICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2xzU2VwYXJhdG9yTGluZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGFkZCBhIGhvcml6b250YWwgbGluZQotICAgICAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGlmIChldnQud2lkZ2V0ID09IGRlZmF1bHRNb2R1bGVzQnV0dG9uKQotICAgICAgICAgICAgaGFuZGxlRGVmYXVsdE1vZHVsZXNCdXR0b25QcmVzc2VkKCk7Ci0gICAgICAgIGVsc2UgaWYgKCFkZWZhdWx0TW9kdWxlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgaWYgKGV2dC53aWRnZXQgPT0gYXBwQ2xpZW50UmFkaW9CdXR0b24gJiYgYXBwQ2xpZW50UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWROb2RlKGdldEFwcENsaWVudE5vZGUoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChldnQud2lkZ2V0ID09IGVqYlJhZGlvQnV0dG9uICYmIGVqYlJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkTm9kZShnZXRFamJOb2RlKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LndpZGdldCA9PSB3ZWJSYWRpb0J1dHRvbiAmJiB3ZWJSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZE5vZGUoZ2V0V2ViTm9kZSgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGV2dC53aWRnZXQgPT0gY29ubmVjdG9yUmFkaW9CdXR0b24gJiYgY29ubmVjdG9yUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWROb2RlKGdldENvbm5lY3Rvck5vZGUoKSk7Ci0gICAgICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5oYW5kbGVFdmVudChldnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEZWZhdWx0TW9kdWxlc0J1dHRvblByZXNzZWQoKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0TW9kdWxlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgc2V0U2VsZWN0ZWROb2RlKG51bGwpOwotICAgICAgICAgICAgc2hvd0RlZmF1bHRNb2R1bGVzQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBzZXREZWZhdWx0TW9kdWxlc1NlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldERlZmF1bHRNb2R1bGVzU2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIHNob3dOZXdNb2R1bGVzQ29tcHNpdGUoKTsKLSAgICAgICAgfQotICAgICAgICBzZXRCdXR0b25FbmFibGVtZW50KCk7Ci0gICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0TW9kdWxlc1NlbGVjdGlvbihib29sZWFuIHNlbGVjdGlvbikgewotICAgICAgICBnZXREYXRhTW9kZWwoKS5zZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0FQUENMSUVOVCwgc2VsZWN0aW9uKTsKLSAgICAgICAgZ2V0RGF0YU1vZGVsKCkuc2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9DT05ORUNUT1IsIHNlbGVjdGlvbik7Ci0gICAgICAgIGdldERhdGFNb2RlbCgpLnNldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfRUpCLCBzZWxlY3Rpb24pOwotICAgICAgICBnZXREYXRhTW9kZWwoKS5zZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX1dFQiwgc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0RlZmF1bHRNb2R1bGVzQ29tcG9zaXRlKCkgewotICAgICAgICBkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBuZXdNb2R1bGVzQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICBzdGFja0xheW91dC50b3BDb250cm9sID0gZGVmYXVsdE1vZHVsZXNDb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBkb25lIGJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24uIFdlIG5lZWQgdG8gZGlzYWJsZSBDb25uZWN0b3JzIGlmCi0gICAgICogbm90IGoyZWUgMS4zIG9yIGhpZ2hlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0QnV0dG9uRW5hYmxlbWVudCgpIHsKLSAgICAgICAgaWYgKCFkZWZhdWx0TW9kdWxlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiBjb25uZWN0b3JSYWRpb0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgdmVyc2lvbiA9IGdldERhdGFNb2RlbCgpLmdldEludFByb3BlcnR5KEoyRUVfVkVSU0lPTik7Ci0gICAgICAgICAgICBjb25uZWN0b3JSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHZlcnNpb24gPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2hvd05ld01vZHVsZXNDb21wc2l0ZSgpIHsKLSAgICAgICAgZGVmYXVsdE1vZHVsZXNDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIG5ld01vZHVsZXNDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgaWYgKCFpc0FueU1vZHVsZVJhZGlvU2VsZWN0ZWQoKSkKLSAgICAgICAgICAgIGFwcENsaWVudFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgc2V0U2VsZWN0ZWROb2RlKGdldFdpemFyZE5vZGVGcm9tU2VsZWN0aW9uKCkpOwotICAgICAgICBzdGFja0xheW91dC50b3BDb250cm9sID0gbmV3TW9kdWxlc0NvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBnZXRXaXphcmROb2RlRnJvbVNlbGVjdGlvbigpIHsKLSAgICAgICAgaWYgKGFwcENsaWVudFJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIGdldEFwcENsaWVudE5vZGUoKTsKLSAgICAgICAgaWYgKGNvbm5lY3RvclJhZGlvQnV0dG9uICE9IG51bGwgJiYgY29ubmVjdG9yUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0Q29ubmVjdG9yTm9kZSgpOwotICAgICAgICBpZiAoZWpiUmFkaW9CdXR0b24gIT0gbnVsbCAmJiBlamJSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRFamJOb2RlKCk7Ci0gICAgICAgIGlmICh3ZWJSYWRpb0J1dHRvbiAhPSBudWxsICYmIHdlYlJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIGdldFdlYk5vZGUoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FueU1vZHVsZVJhZGlvU2VsZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBhcHBDbGllbnRSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSB8fCAoY29ubmVjdG9yUmFkaW9CdXR0b24gIT0gbnVsbCAmJiBjb25uZWN0b3JSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgfHwgKGVqYlJhZGlvQnV0dG9uICE9IG51bGwgJiYgZWpiUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHx8ICh3ZWJSYWRpb0J1dHRvbiAhPSBudWxsICYmIHdlYlJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFwcENsaWVudE5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBnZXRBcHBDbGllbnROb2RlKCkgewotICAgICAgICBpZiAoYXBwQ2xpZW50Tm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhcHBDbGllbnROb2RlID0gbmV3IEdlbmVyaWNXaXphcmROb2RlKCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5HZW5lcmljV2l6YXJkTm9kZSNjcmVhdGVXaXphcmQoKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBJV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICBkbS5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkKGRtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcHBDbGllbnROb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29ubmVjdG9yTm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIGdldENvbm5lY3Rvck5vZGUoKSB7Ci0gICAgICAgIGlmIChjb25uZWN0b3JOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbm5lY3Rvck5vZGUgPSBuZXcgR2VuZXJpY1dpemFyZE5vZGUoKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkdlbmVyaWNXaXphcmROb2RlI2NyZWF0ZVdpemFyZCgpCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIElXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotICAgICAgICAgICAgICAgICAgICBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICBJV2l6YXJkUmVnaXN0cnkgbmV3V2l6YXJkUmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE5ld1dpemFyZFJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIElXaXphcmREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXdXaXphcmRSZWdpc3RyeS5maW5kV2l6YXJkKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZClkZXNjcmlwdG9yLmNyZWF0ZVdpemFyZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgSURhdGFNb2RlbCBkbSA9IHJlc3VsdC5nZXREYXRhTW9kZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRtLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0RGF0YU1vZGVsKGRtKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb25uZWN0b3JOb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWpiTm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIGdldEVqYk5vZGUoKSB7Ci0gICAgICAgIGlmIChlamJOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIGVqYk5vZGUgPSBuZXcgR2VuZXJpY1dpemFyZE5vZGUoKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkdlbmVyaWNXaXphcmROb2RlI2NyZWF0ZVdpemFyZCgpCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIElXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotICAgICAgICAgICAgICAgICAgICBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICBJV2l6YXJkUmVnaXN0cnkgbmV3V2l6YXJkUmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE5ld1dpemFyZFJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIElXaXphcmREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXdXaXphcmRSZWdpc3RyeS5maW5kV2l6YXJkKCJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLkVKQkNvbXBvbmVudENyZWF0aW9uV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQpZGVzY3JpcHRvci5jcmVhdGVXaXphcmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEYXRhTW9kZWwgZG0gPSByZXN1bHQuZ2V0RGF0YU1vZGVsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkbS5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldERhdGFNb2RlbChkbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2coY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWpiTm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYk5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBnZXRXZWJOb2RlKCkgewotICAgICAgICBpZiAod2ViTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3ZWJOb2RlID0gbmV3IEdlbmVyaWNXaXphcmROb2RlKCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5HZW5lcmljV2l6YXJkTm9kZSNjcmVhdGVXaXphcmQoKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBJV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgSVdpemFyZCByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBJV2l6YXJkUmVnaXN0cnkgbmV3V2l6YXJkUmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE5ld1dpemFyZFJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIElXaXphcmREZXNjcmlwdG9yIHNlcnZsZXRXaXphcmREZXNjcmlwdG9yID0gbmV3V2l6YXJkUmVnaXN0cnkuZmluZFdpemFyZCgib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VydmxldFdpemFyZERlc2NyaXB0b3IuY3JlYXRlV2l6YXJkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2coY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViTm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWROb2RlCi0gICAgICogICAgICAgICAgICBUaGUgc2VsZWN0ZWROb2RlIHRvIHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWROb2RlKEdlbmVyaWNXaXphcmROb2RlIHNlbGVjdGVkTm9kZSkgewotICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZSA9IHNlbGVjdGVkTm9kZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NhbkZsaXBUb05leHRQYWdlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLSAgICAgICAgaWYgKCFkZWZhdWx0TW9kdWxlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZE5vZGUgIT0gbnVsbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmRTZWxlY3Rpb25QYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SVdpemFyZFBhZ2U8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBjdXJyZW50bHkKLSAgICAgKiBzZWxlY3RlZCB3aXphcmQgaWYgdGhlcmUgaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkTm9kZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIElQbHVnaW5Db250cmlidXRpb24gcGx1Z2luQ29udHJpYnV0aW9uID0gbmV3IElQbHVnaW5Db250cmlidXRpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsSWQoKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWROb2RlID09IGFwcENsaWVudE5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuYXBwY2xpZW50UHJvamVjdFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm9kZSA9PSBlamJOb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmVqYi51aS51dGlsLmVqYlByb2plY3RXaXphcmQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vZGUgPT0gY29ubmVjdG9yTm9kZSkgewotICAgICAgICAgICAgICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5qY2FQcm9qZWN0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb2RlID09IHdlYk5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwud2ViUHJvamVjdFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKCFXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5hbGxvd1VzZU9mKG51bGwscGx1Z2luQ29udHJpYnV0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzQ3JlYXRlZCA9IHNlbGVjdGVkTm9kZS5pc0NvbnRlbnRDcmVhdGVkKCk7Ci0gICAgICAgIElXaXphcmQgd2l6YXJkID0gc2VsZWN0ZWROb2RlLmdldFdpemFyZCgpOwotICAgICAgICBpZiAod2l6YXJkID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGVkTm9kZShudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNDcmVhdGVkKSAvLyBBbGxvdyB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBpdHMgcGFnZXMKLSAgICAgICAgICAgIHdpemFyZC5hZGRQYWdlcygpOwotCi0gICAgICAgIHJldHVybiB3aXphcmQuZ2V0U3RhcnRpbmdQYWdlKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVXaXphcmRQYWdlI3ZhbGlkYXRlUGFnZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotICAgICAgICBpZiAoIWRlZmF1bHRNb2R1bGVzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkMjRhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0phdmFDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuVHlwZVNlbGVjdGlvbkRpYWxvZzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR5cGVTZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdKYXZhQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaWNCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhYnN0cmFjdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZpbmFsQnV0dG9uOwotCXByb3RlY3RlZCBMaXN0Vmlld2VyIGludGVyZmFjZVZpZXdlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGluaGVyaXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjb25zdHJ1Y3RvckJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIG1haW5NZXRob2RCdXR0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgTmV3SmF2YUNsYXNzT3B0aW9uc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24ocGFnZURlc2MpOwotCQl0aGlzLnNldFRpdGxlKHBhZ2VUaXRsZSk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfSkFWQV9DTEFTU19PUFRJT05fV0laQVJEX1AxKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfQUJTVFJBQ1QsIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRElGSUVSX0ZJTkFMfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNyZWF0ZU1vZGlmaWVyQ29udHJvbHMoY29tcG9zaXRlKTsKLQkJY3JlYXRlSW50ZXJmYWNlQ29udHJvbHMoY29tcG9zaXRlKTsKLQotCQkvLyBTZXBhcmF0b3IgbGFiZWwKLQkJTGFiZWwgc2VwZXJhdG9yID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VwZXJhdG9yLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlU3R1YnNDb21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQlwdWJsaWNCdXR0b24uc2V0Rm9jdXMoKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIGdldEluZm9wb3BJRCgpKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY29udHJvbHMgZm9yIHRoZSBtb2RpZmllcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNb2RpZmllckNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbW9kaWZpZXJzTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1vZGlmaWVyc0xhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19NT0RJRklFUlNfTEFCRUwpOwotCQltb2RpZmllcnNMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlwdWJsaWNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJcHVibGljQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19QVUJMSUNfQ0hFQ0tCT1hfTEFCRUwpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KHB1YmxpY0J1dHRvbiwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfUFVCTElDLCBudWxsKTsKLQotCQlhYnN0cmFjdEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlhYnN0cmFjdEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUwpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGFic3RyYWN0QnV0dG9uLCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9BQlNUUkFDVCwgbnVsbCk7Ci0KLQkJZmluYWxCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZmluYWxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0ZJTkFMX0NIRUNLQk9YX0xBQkVMKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChmaW5hbEJ1dHRvbiwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfRklOQUwsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUludGVyZmFjZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgaW50ZXJmYWNlTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWludGVyZmFjZUxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19JTlRFUkZBQ0VTX0xBQkVMKTsKLQkJaW50ZXJmYWNlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpbnRlcmZhY2VWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihjb21wb3NpdGUpOwotCQlpbnRlcmZhY2VWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlpbnRlcmZhY2VWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldEludGVyZmFjZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaW50ZXJmYWNlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0SW50ZXJmYWNlTGFiZWxQcm92aWRlcigpKTsKLQkJaW50ZXJmYWNlVmlld2VyLnNldElucHV0KG1vZGVsLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOVEVSRkFDRVMpKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG8gPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkNvbXBvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkFERF9CVVRUT05fTEFCRUwpOwotCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZUludGVyZmFjZUFkZEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0KLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULlBVU0gpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5SRU1PVkVfQlVUVE9OKTsKLQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVJbnRlcmZhY2VSZW1vdmVCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJaW50ZXJmYWNlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb21wb3NpdGUgd2l0aCBhbGwgdGhlIHN0dWJzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3R1YnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBzdHViTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXN0dWJMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3R1YkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxNTsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQltYWluTWV0aG9kQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULkNIRUNLKTsKLQkJbWFpbk1ldGhvZEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gobWFpbk1ldGhvZEJ1dHRvbiwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTUFJTl9NRVRIT0QsIG51bGwpOwotCi0JCWluaGVyaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuQ0hFQ0spOwotCQlpbmhlcml0QnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChpbmhlcml0QnV0dG9uLCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5BQlNUUkFDVF9NRVRIT0RTLCBudWxsKTsKLQotCQljb25zdHJ1Y3RvckJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5DSEVDSyk7Ci0JCWNvbnN0cnVjdG9yQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goY29uc3RydWN0b3JCdXR0b24sIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlNUUlVDVE9SLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTdGF0ZWZ1bFdpemFyZFBhZ2Ujc2F2ZVdpZGdldFZhbHVlcygpCi0JICovCi0JLy8gcHVibGljIHZvaWQgc2F2ZVdpZGdldFZhbHVlcygpIHsKLQkvLyAvLyBUT0RPOiBkbyB3ZSB3YW50IHRvIGRvIHRoaXMgaGVyZSBvciBpbiB0aGUgY29uY3JldGUgc3ViY2xhc3Nlcz8/PwotCS8vIElEaWFsb2dTZXR0aW5ncyBzdG9yZSA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JLy8gaWYgKHN0b3JlICE9IG51bGwpCi0JLy8gc3RvcmUucHV0KGdldFVuaXF1ZUtleSgiIiksIGdldFVuaXF1ZUtleSgiIikpOyAvLyROT04tTkxTLTEkCi0JLy8gLy8kTk9OLU5MUy0yJAotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnNhdmVCdXR0b24oaW5oZXJpdEJ1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRJbmhlcml0ZWRBYnN0cmFjdEJ1dHRvbiksIHN0b3JlKTsKLQkvLyBEaWFsb2dTZXR0aW5nc0hlbHBlci5zYXZlQnV0dG9uKGNvbnN0cnVjdG9yQnV0dG9uLAotCS8vIGdldFVuaXF1ZUtleShpZFN1cGVyQ2xhc3NDb25zdHJ1Y3RvcnNCdXR0b24pLCBzdG9yZSk7Ci0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIuc2F2ZUJ1dHRvbihwdWJsaWNCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkUHVibGljQnV0dG9uKSwgc3RvcmUpOwotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnNhdmVCdXR0b24oYWJzdHJhY3RCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkQWJzdHJhY3RCdXR0b24pLCBzdG9yZSk7Ci0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIuc2F2ZUJ1dHRvbihmaW5hbEJ1dHRvbiwgZ2V0VW5pcXVlS2V5KGlkRmluYWxCdXR0b24pLAotCS8vIHN0b3JlKTsKLQkvLwotCS8vIH0KLQkvKioKLQkgKiBAc2VlIElTdGF0ZWZ1bFdpemFyZFBhZ2UjcmVzdG9yZVdpZGdldFZhbHVlcygpCi0JICovCi0JLy8gcHVibGljIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKLQkvLyBJRGlhbG9nU2V0dGluZ3Mgc3RvcmUgPSBzdXBlci5nZXREaWFsb2dTZXR0aW5ncygpOwotCS8vIGlmIChzdG9yZSAhPSBudWxsICYmIHN0b3JlLmdldChnZXRVbmlxdWVLZXkoIiIpKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkvLyBEaWFsb2dTZXR0aW5nc0hlbHBlci5yZXN0b3JlQnV0dG9uKGluaGVyaXRCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkSW5oZXJpdGVkQWJzdHJhY3RCdXR0b24pLCBzdG9yZSk7Ci0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIucmVzdG9yZUJ1dHRvbihjb25zdHJ1Y3RvckJ1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRTdXBlckNsYXNzQ29uc3RydWN0b3JzQnV0dG9uKSwgc3RvcmUpOwotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnJlc3RvcmVCdXR0b24ocHVibGljQnV0dG9uLAotCS8vIGdldFVuaXF1ZUtleShpZFB1YmxpY0J1dHRvbiksIHN0b3JlKTsKLQkvLyBEaWFsb2dTZXR0aW5nc0hlbHBlci5yZXN0b3JlQnV0dG9uKGFic3RyYWN0QnV0dG9uLAotCS8vIGdldFVuaXF1ZUtleShpZEFic3RyYWN0QnV0dG9uKSwgc3RvcmUpOwotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnJlc3RvcmVCdXR0b24oZmluYWxCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkRmluYWxCdXR0b24pLCBzdG9yZSk7Ci0JLy8gfQotCS8vIH0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTdXBlciBJbnRlcmZhY2UgQ29udGVudCBQcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBnZXRJbnRlcmZhY2VDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCU9iamVjdFtdIHJldCA9IG5ldyBPYmplY3RbMF07Ci0JCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFycmF5TGlzdCkgewotCQkJCQlyZXQgPSAoKEFycmF5TGlzdCkgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy9EZWZhdWx0IGlzIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTdXBlciBJbnRlcmZhY2UgTGFiZWwgUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZ2V0SW50ZXJmYWNlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJmdWxsL29iajE2L2ludGVyZmFjZV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgcmV0ID0gSjJFRVVJTWVzc2FnZXMuRU1QVFlfU1RSSU5HOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCQlyZXQgPSAoU3RyaW5nKSBlbGVtZW50OwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEJyb3dzZSBmb3IgYSBuZXcgU3VwZXIgSW50ZXJmYWNlIENsYXNzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW50ZXJmYWNlQWRkQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QpOwotCQlJUnVubmFibGVDb250ZXh0IGNvbnRleHQgPSBXb3JrYmVuY2guZ2V0SW5zdGFuY2UoKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJLy8gdGhpcyBlbGltaW5hdGVzIHRoZSBub24tZXhwb3J0ZWQgY2xhc3NwYXRoIGVudHJpZXMKLQkJZmluYWwgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFR5cGVTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlRm9yQVByb2plY3QoamF2YVByb2plY3QsIHRydWUsIHRydWUpOwotCQlUeXBlU2VsZWN0aW9uRGlhbG9nMiBkaWFsb2cgPSBuZXcgVHlwZVNlbGVjdGlvbkRpYWxvZzIoZ2V0U2hlbGwoKSxmYWxzZSwgY29udGV4dCwgc2NvcGUsSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFKTsKLQkJZGlhbG9nLnNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLklOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlJVHlwZSB0eXBlID0gKElUeXBlKSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCVN0cmluZyBzdXBlcmNsYXNzRnVsbFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCQlzdXBlcmNsYXNzRnVsbFBhdGggPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJaW50ZXJmYWNlVmlld2VyLmFkZChzdXBlcmNsYXNzRnVsbFBhdGgpOwotCQl9Ci0JCUxpc3QgdmFsdWVMaXN0ID0gQXJyYXlzLmFzTGlzdChpbnRlcmZhY2VWaWV3ZXIuZ2V0TGlzdCgpLmdldEl0ZW1zKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTLCB2YWx1ZUxpc3QpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbiBpbnRlcmZhY2UgZnJvbSB0aGUgU3VwZXJJbnRlcmZhY2UgTGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUludGVyZmFjZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGludGVyZmFjZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJTGlzdCBpdGVtcyA9IHNlbGVjdGlvbi50b0xpc3QoKTsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBhcnJheVtdID0gaW50ZXJmYWNlVmlld2VyLmdldExpc3QoKS5nZXRJdGVtcygpOwotCQkJTGlzdCB2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQl2YWx1ZUxpc3QuYWRkKGFycmF5W2ldKTsKLQkJCX0KLQkJCWZvciAoaW50IGk9MDsgaTxpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCXZhbHVlTGlzdC5yZW1vdmUoaXRlbXMuZ2V0KGkpKTsKLQkJCX0KLQkJCWludGVyZmFjZVZpZXdlci5zZXRJbnB1dCh2YWx1ZUxpc3QpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUywgdmFsdWVMaXN0KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0phdmFDbGFzc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTJjODc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuZGlhbG9ncy5UeXBlU2VsZWN0aW9uRGlhbG9nMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuSVZpZXdQYXJ0SW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmNvbXBvbmVudGNvcmUudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5UeXBlU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmV3SmF2YUNsYXNzV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBUZXh0IGZvbGRlclRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZm9sZGVyQnV0dG9uOwotCXByb3RlY3RlZCBUZXh0IHBhY2thZ2VUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gcGFja2FnZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgTGFiZWwgcGFja2FnZUxhYmVsOwotCXByb3RlY3RlZCBUZXh0IGNsYXNzVGV4dDsKLQlwcm90ZWN0ZWQgTGFiZWwgY2xhc3NMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBzdXBlclRleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzdXBlckJ1dHRvbjsKLQlwcm90ZWN0ZWQgTGFiZWwgc3VwZXJMYWJlbDsKLQlwcml2YXRlIENvbWJvIHByb2plY3ROYW1lQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBjb21wb25lbnROYW1lQ29tYm87Ci0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0VHlwZTsKLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBOZXdKYXZhQ2xhc3NXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlLAotCQkJU3RyaW5nIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24ocGFnZURlc2MpOwotCQl0aGlzLnNldFRpdGxlKHBhZ2VUaXRsZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCXRoaXMucHJvamVjdFR5cGUgPSBtb2R1bGVUeXBlOwotCQl0aGlzLnByb2plY3ROYW1lID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCAKLQkJCQlJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgCi0JCQkJSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUiwgCi0JCQkJSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFLCAKLQkJCQlJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FLCAKLQkJCQlJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TVVBFUkNMQVNTfTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlhZGRQcm9qZWN0TmFtZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWFkZEZvbGRlckdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWFkZFNlcGVyYXRvcihjb21wb3NpdGUsIDMpOwotCQlhZGRQYWNrYWdlR3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkQ2xhc3NuYW1lR3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkU3VwZXJjbGFzc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJZm9sZGVyVGV4dC5zZXRGb2N1cygpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgZ2V0SW5mb3BvcElEKCkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29tcG9uZW50TGlzdCgpIHsKLQkJTGlzdCBjb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VHlwZShwcm9qZWN0KS5lcXVhbHMocHJvamVjdFR5cGUpICYmICFjb21wb25lbnRMaXN0LmNvbnRhaW5zKGNvbXBvbmVudC5nZXROYW1lKCkpKQotCQkJY29tcG9uZW50TGlzdC5hZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCQotCQlTdHJpbmdbXSBjb21wb25lbnROYW1lcyA9IG5ldyBTdHJpbmdbY29tcG9uZW50TGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWNvbXBvbmVudE5hbWVzW2ldID0gKFN0cmluZykgY29tcG9uZW50TGlzdC5nZXQoaSk7Ci0JCX0KLQkJY29tcG9uZW50TmFtZUNvbWJvLnNldEl0ZW1zKGNvbXBvbmVudE5hbWVzKTsKLQkJaWYgKGNvbXBvbmVudE5hbWVzLmxlbmd0aCA+IDApIHsKLQkJCWNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KGNvbXBvbmVudE5hbWVzWzBdKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJfQotCQkvLyB1cGRhdGUgc291cmNlIGZvbGRlcgotCQlpZiAoZm9sZGVyVGV4dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc291cmNlRm9sZGVyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUik7Ci0JCQlpZiAoc291cmNlRm9sZGVyICE9IG51bGwpCi0JCQkJZm9sZGVyVGV4dC5zZXRUZXh0KHNvdXJjZUZvbGRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgcHJvamVjdCBncm91cAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBsYWJlbAotCQlMYWJlbCBwcm9qZWN0TmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVEFCTEVfUFJPSkVDVCkpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwcm9qZWN0TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb2plY3ROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJaW5pdGlhbGl6ZUNvbXBvbmVudExpc3QoKTsKLQkJCX0KLQkJfSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocHJvamVjdE5hbWVDb21ibywgSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBudWxsKTsKLQkJaW5pdGlhbGl6ZVByb2plY3RMaXN0KCk7Ci0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByb2plY3RMaXN0KCkgewotCQlJUHJvamVjdFtdIHdvcmtzcGFjZVByb2plY3RzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpOwotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlUHJvamVjdHNbaV07Ci0JCQl0cnkgewotCQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpICYmIHByb2plY3QuaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VHlwZShwcm9qZWN0KS5lcXVhbHMocHJvamVjdFR5cGUpKQotCQkJCQkJaXRlbXMuYWRkKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9Ci0JCX0KLQkJaWYgKGl0ZW1zLmlzRW1wdHkoKSkgcmV0dXJuOwotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJbmFtZXNbaV0gPSAoU3RyaW5nKSBpdGVtcy5nZXQoaSk7Ci0JCX0KLQkJcHJvamVjdE5hbWVDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBzZWxlY3RlZFByb2plY3QgPSBnZXRTZWxlY3RlZFByb2plY3QoKTsKLQkJCWlmIChzZWxlY3RlZFByb2plY3QgIT0gbnVsbCAmJiBzZWxlY3RlZFByb2plY3QuaXNBY2Nlc3NpYmxlKCkKLQkJCQkJJiYgc2VsZWN0ZWRQcm9qZWN0Lmhhc05hdHVyZShJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpKSB7Ci0JCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KHNlbGVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgc2VsZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0JCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsICYmIG5hbWVzLmxlbmd0aCA+IDApCi0JCQlwcm9qZWN0TmFtZSA9IG5hbWVzWzBdOwotCi0JCWlmICgocHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSAmJiBwcm9qZWN0TmFtZSAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQocHJvamVjdE5hbWUpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEFkZCBmb2xkZXIgZ3JvdXAgdG8gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEZvbGRlckdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gZm9sZGVyCi0JCUxhYmVsIGZvbGRlckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlmb2xkZXJMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkZPTERFUl9MQUJFTCk7Ci0JCWZvbGRlckxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCWZvbGRlclRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZm9sZGVyVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGZvbGRlclRleHQsIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIsIG51bGwpOwotCi0JCWZvbGRlckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWZvbGRlckJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9CVVRUT05fTEFCRUwpOwotCQlmb2xkZXJCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWZvbGRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRm9sZGVyQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIERvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHBhY2thZ2UgZ3JvdXAgdG8gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFBhY2thZ2VHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIHBhY2thZ2UKLQkJcGFja2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlwYWNrYWdlTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX1BBQ0tBR0VfTEFCRUwpOwotCQlwYWNrYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJcGFja2FnZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJcGFja2FnZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gZ2V0U2VsZWN0ZWRQYWNrYWdlRnJhZ21lbnQoKTsKLQkJaWYgKHBhY2thZ2VGcmFnbWVudCAhPSBudWxsICYmIHBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSkgewotCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRSwgcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQl9Ci0KLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHBhY2thZ2VUZXh0LCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0UsIG51bGwpOwotCi0JCXBhY2thZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlwYWNrYWdlQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuQlJPV1NFX0JVVFRPTl9MQUJFTCk7Ci0JCXBhY2thZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXBhY2thZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVBhY2thZ2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgY2xhc3NuYW1lIGdyb3VwIHRvIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDbGFzc25hbWVHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIGNsYXNzIG5hbWUKLQkJY2xhc3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJY2xhc3NMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkNMQVNTX05BTUVfTEFCRUwpOwotCQljbGFzc0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCWNsYXNzVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQljbGFzc1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChjbGFzc1RleHQsIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUUsIG51bGwpOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgc2VwZXJhdG9yIHRvIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcGVyYXRvcihDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgaG9yU3BhbikgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJLy8gU2VwYXJhdG9yIGxhYmVsCi0JCUxhYmVsIHNlcGVyYXRvciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvclNwYW47Ci0JCXNlcGVyYXRvci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEFkZCBzdXBlcmNsYXNzIGdyb3VwIHRvIHRoZSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU3VwZXJjbGFzc0dyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gc3VwZXJjbGFzcwotCQlzdXBlckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlzdXBlckxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuU1VQRVJDTEFTU19MQUJFTCk7Ci0JCXN1cGVyTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJc3VwZXJUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXN1cGVyVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHN1cGVyVGV4dCwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU1VQRVJDTEFTUywgbnVsbCk7Ci0KLQkJc3VwZXJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlzdXBlckJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9CVVRUT05fTEFCRUwpOwotCQlzdXBlckJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJc3VwZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVN1cGVyQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIERvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQnJvd3NlIGZvciBhIG5ldyBEZXN0aW5hdGlvbiBGb2xkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGb2xkZXJCdXR0b25QcmVzc2VkKCkgewotCQlJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldENvbnRhaW5lckRpYWxvZ1NlbGVjdGlvblZhbGlkYXRvcigpOwotCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gZ2V0Q29udGFpbmVyRGlhbG9nVmlld2VyRmlsdGVyKCk7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKTsKLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIsIGNvbnRlbnRQcm92aWRlcik7Ci0JCWRpYWxvZy5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKLQkJZGlhbG9nLnNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1RJVExFKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSjJFRVVJTWVzc2FnZXMuQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfREVTQyk7Ci0JCWRpYWxvZy5hZGRGaWx0ZXIoZmlsdGVyKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpKTsKLQkJZGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihwcm9qZWN0KTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudDsKLQkJCQkJZm9sZGVyVGV4dC5zZXRUZXh0KGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQkvLyBkZWFsV2l0aFNlbGVjdGVkQ29udGFpbmVyUmVzb3VyY2UoY29udGFpbmVyKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBEbyBub3RoaW5nCi0JCQl9Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhY2thZ2VCdXR0b25QcmVzc2VkKCkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrUm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQlpZiAocGFja1Jvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUphdmFFbGVtZW50W10gcGFja2FnZXMgPSBudWxsOwotCQl0cnkgewotCQkJcGFja2FnZXMgPSBwYWNrUm9vdC5nZXRDaGlsZHJlbigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gRG8gbm90aGluZwotCQl9Ci0JCWlmIChwYWNrYWdlcyA9PSBudWxsKQotCQkJcGFja2FnZXMgPSBuZXcgSUphdmFFbGVtZW50WzBdOwotCi0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCUphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX0RFRkFVTFQpKTsKLQkJZGlhbG9nLnNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEoyRUVVSU1lc3NhZ2VzLlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDKTsKLQkJZGlhbG9nLnNldEVtcHR5TGlzdE1lc3NhZ2UoSjJFRVVJTWVzc2FnZXMuUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FKTsKLQkJZGlhbG9nLnNldEVsZW1lbnRzKHBhY2thZ2VzKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJaWYgKGZyYWdtZW50ICE9IG51bGwpIHsKLQkJCQlwYWNrYWdlVGV4dC5zZXRUZXh0KGZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlwYWNrYWdlVGV4dC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkVNUFRZX1NUUklORyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdXBlckJ1dHRvblByZXNzZWQoKSB7Ci0JCWdldENvbnRyb2woKS5zZXRDdXJzb3IobmV3IEN1cnNvcihnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2tSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBtb2RlbC5nZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0VfRlJBR01FTlRfUk9PVCk7Ci0JCWlmIChwYWNrUm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIHRoaXMgZWxpbWluYXRlcyB0aGUgbm9uLWV4cG9ydGVkIGNsYXNzcGF0aCBlbnRyaWVzCi0JCWZpbmFsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBUeXBlU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZUZvckFQcm9qZWN0KHBhY2tSb290LmdldEphdmFQcm9qZWN0KCksIHRydWUsIHRydWUpOwotCi0JCS8vIFRoaXMgaW5jbHVkZXMgYWxsIGVudHJpZXMgb24gdGhlIGNsYXNzcGF0aC4gVGhpcyBiZWhhdmlvciBpcwotCQkvLyBpZGVudGljYWwKLQkJLy8gdG8gdGhlIFN1cGVyIENsYXNzIEJyb3dzZSBCdXR0b24gb24gdGhlIENyZWF0ZSBuZXcgSmF2YSBDbGFzcyBXaXphcmQKLQkJLy8gZmluYWwgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3Ci0JCS8vIElKYXZhRWxlbWVudFtdIHtyb290LmdldEphdmFQcm9qZWN0KCl9ICk7Ci0JCVR5cGVTZWxlY3Rpb25EaWFsb2cyIGRpYWxvZyA9IG5ldyBUeXBlU2VsZWN0aW9uRGlhbG9nMihnZXRTaGVsbCgpLGZhbHNlLCBnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKSwgc2NvcGUsIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTKTsKLQkJZGlhbG9nLnNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLlNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEoyRUVVSU1lc3NhZ2VzLlNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDKTsKLQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJU3RyaW5nIHN1cGVyY2xhc3NGdWxsUGF0aCA9IEoyRUVVSU1lc3NhZ2VzLkVNUFRZX1NUUklORzsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQlzdXBlcmNsYXNzRnVsbFBhdGggPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJfQotCQkJc3VwZXJUZXh0LnNldFRleHQoc3VwZXJjbGFzc0Z1bGxQYXRoKTsKLQkJCWdldENvbnRyb2woKS5zZXRDdXJzb3IobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZ2V0Q29udHJvbCgpLnNldEN1cnNvcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTZWxlY3Rpb24gdmFsaWRhdG9yIGZvciB0aGUgQ29udGFpbmVyCi0JICogU2VsZWN0aW9uIERpYWxvZyBUaGlzIG1ldGhvZCBjYW4gYmUgZXh0ZW5kZWQgYnkgc3ViY2xhc3NlcywgYXMgaXQgZG9lcwotCSAqIHNvbWUgYmFzaWMgdmFsaWRhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBnZXRDb250YWluZXJEaWFsb2dTZWxlY3Rpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb25bMF0gIT0gbnVsbCAmJiAhKHNlbGVjdGlvblswXSBpbnN0YW5jZW9mIElQcm9qZWN0KSkKLQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhKMkVFVUlNZXNzYWdlcy5DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19WQUxJREFUT1JfTUVTRyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU2VsZWN0aW9uIExpc3RuZXIgZm9yIHRoZSBDb250YWluZXIKLQkgKiBTZWxlY3Rpb24gRGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXRDb250YWluZXJEaWFsb2dWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotCQkJCQlyZXR1cm4gcHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKG1vZGVsLmdldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgZWxlbWVudDsKLQkJCQkJLy8gb25seSBzaG93IHNvdXJjZSBmb2xkZXJzCi0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHNvdXJjZUZvbGRlcnMgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhjb21wb25lbnQpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZvbGRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChzb3VyY2VGb2xkZXJzW2ldLmdldFJlc291cmNlKCkhPSBudWxsICYmIHNvdXJjZUZvbGRlcnNbaV0uZ2V0UmVzb3VyY2UoKS5lcXVhbHMoZm9sZGVyKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRTZWxlY3RlZFByb2plY3QoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCWlmIChzdHVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzdHVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGdldEluaXRpYWxKYXZhRWxlbWVudChzZWxlY3Rpb24pOwotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKSAhPSBudWxsKQotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZ2V0U2VsZWN0ZWRQYWNrYWdlRnJhZ21lbnQoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkvLyBzZWxlY3Rpb247Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0SW5pdGlhbEphdmFFbGVtZW50KHNlbGVjdGlvbik7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpCi0JCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0JCQkJcmV0dXJuICgoSVR5cGUpIGVsZW1lbnQpLmdldFBhY2thZ2VGcmFnbWVudCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGluc3BlY3QgYSBzZWxlY3Rpb24gdG8gZmluZCBhIEphdmEgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIHRvIGJlIGluc3BlY3RlZAotCSAqIEByZXR1cm4gYSBKYXZhIGVsZW1lbnQgdG8gYmUgdXNlZCBhcyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaWYgbm8gSmF2YSBlbGVtZW50IGV4aXN0cyBpbiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIHNlbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2V0SW5pdGlhbEphdmFFbGVtZW50KElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudCBqZWxlbSA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJCUlBZGFwdGFibGUgYWRhcHRhYmxlID0gKElBZGFwdGFibGUpIHNlbGVjdGVkRWxlbWVudDsKLQotCQkJCWplbGVtID0gKElKYXZhRWxlbWVudCkgYWRhcHRhYmxlLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLQkJCQlpZiAoamVsZW0gPT0gbnVsbCkgewotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJCXdoaWxlIChqZWxlbSA9PSBudWxsICYmIHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCQkJCQkJamVsZW0gPSAoSUphdmFFbGVtZW50KSByZXNvdXJjZS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoamVsZW0gPT0gbnVsbCkgewotCQkJCQkJCWplbGVtID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlKTsgLy8gamF2YSBwcm9qZWN0Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGplbGVtID09IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBKYXZhUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7Ci0JCQkJcGFydCA9IEphdmFQbHVnaW4uZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJfQotCi0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElWaWV3UGFydElucHV0UHJvdmlkZXIpIHsKLQkJCQlPYmplY3QgZWxlbSA9ICgoSVZpZXdQYXJ0SW5wdXRQcm92aWRlcikgcGFydCkuZ2V0Vmlld1BhcnRJbnB1dCgpOwotCQkJCWlmIChlbGVtIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQkJCWplbGVtID0gKElKYXZhRWxlbWVudCkgZWxlbTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoamVsZW0gPT0gbnVsbCB8fCBqZWxlbS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX01PREVMKSB7Ci0JCQl0cnkgewotCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gSmF2YUNvcmUuY3JlYXRlKGdldFdvcmtzcGFjZVJvb3QoKSkuZ2V0SmF2YVByb2plY3RzKCk7Ci0JCQkJaWYgKHByb2plY3RzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCWplbGVtID0gcHJvamVjdHNbMF07Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKYXZhUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamVsZW07Ci0JfQotCi0JcHJvdGVjdGVkIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQl0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdNb2R1bGVEYXRhTW9kZWxHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdNb2R1bGVEYXRhTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzE5YWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3TW9kdWxlRGF0YU1vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5GbGV4aWJsZUphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllcy5JRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi1wdWJsaWMgY2xhc3MgTmV3TW9kdWxlRGF0YU1vZGVsR3JvdXAgaW1wbGVtZW50cyBJRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllc3sKLQkKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIENvbWJvIHByb2plY3ROYW1lQ29tYm8gPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IG1vZHVsZU5hbWVUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgc2VydmVyVGFyZ2V0VGV4dDsKLQlwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX1RBQkxFX1BST0pFQ1QpKyAiOiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xBQkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIE5ld01vZHVsZURhdGFNb2RlbEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIElEYXRhTW9kZWwgbW9kZWwsIERhdGFNb2RlbFN5bmNoSGVscGVyIGhlbHBlcikgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMucGFyZW50Q29tcG9zaXRlID0gcGFyZW50OwotCQlzeW5jaEhlbHBlciA9IGhlbHBlcjsKLQkJYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb250cm9scyB3aXRoaW4gdGhpcyBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZENvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVNb2R1bGVHcm91cChwYXJlbnQpOwotICAgICAgICBtb2R1bGVOYW1lVGV4dC5zZXRGb2N1cygpOwotCQljcmVhdGVQcm9qZWN0TmFtZUdyb3VwKHBhcmVudCk7Ci0JCWluaXRpYWxpemVQcm9qZWN0TGlzdCgpOwotCQljcmVhdGVTZXJ2ZXJUYXJnZXRDb21wb3NpdGUocGFyZW50KTsKLQkJYWRkU2VwZXJhdG9yKHBhcmVudCwzKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUHJvamVjdExpc3QoKSB7Ci0JCUlQcm9qZWN0W10gd29ya3NwYWNlUHJvamVjdHMgPSBQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzKCk7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTx3b3Jrc3BhY2VQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZVByb2plY3RzW2ldOwotCQkJdHJ5IHsKLQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSU1vZHVsZUNvbnN0YW50cy5NT0RVTEVfTkFUVVJFX0lEKSkgewotCQkJCQlpdGVtcy5hZGQocHJvamVjdC5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tpdGVtcy5zaXplKCldOwotCQlmb3IgKGludCBpPTA7IGk8aXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCW5hbWVzW2ldPSAoU3RyaW5nKSBpdGVtcy5nZXQoaSk7Ci0JCX0KLS8vCQltb2RlbC5zZXRJZ25vcmVQcm9wZXJ0eUNoYW5nZXModHJ1ZSk7Ci0JCXByb2plY3ROYW1lQ29tYm8uc2V0SXRlbXMobmFtZXMpOwotLy8JCW1vZGVsLnNldElnbm9yZVByb3BlcnR5Q2hhbmdlcyhmYWxzZSk7Ci0JCQotCQlpZiAoIW1vZGVsLmlzUHJvcGVydHlTZXQoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpIAotCQkJCXx8IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKS5sZW5ndGgoKT09MCkgewotCQkJSVByb2plY3Qgc2VsZWN0ZWRQcm9qZWN0ID0gZ2V0U2VsZWN0ZWRQcm9qZWN0KCk7Ci0JCQlpZiAoc2VsZWN0ZWRQcm9qZWN0IT1udWxsKSB7Ci0JCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KHNlbGVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLAotCQkJCQkJc2VsZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChuYW1lcy5sZW5ndGg+MCkgewotCQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChuYW1lc1swXSk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIG5hbWVzWzBdKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByb2plY3ROYW1lQ29tYm8uYWRkKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdE5hbWVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgbGFiZWwKLQkJTGFiZWwgcHJvamVjdE5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRUZXh0KFBST0pFQ1RfTkFNRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJcHJvamVjdE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwcm9qZWN0TmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkpOwotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQkJCQlpZiAocnVudGltZSAhPSBudWxsKXsKLQkJCQkJc2VydmVyVGFyZ2V0VGV4dC5zZXRUZXh0KHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCQkJc3luY2hIZWxwZXIuZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRV9UQVJHRVRfSUQsIHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCQl9CQotCQkJfQotCQl9KTsKLQkJbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJbmV3QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQluZXdCdXR0b24uc2V0VGV4dChORVdfTEFCRUwpOwotCQluZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlTmV3UHJvamVjdFNlbGVjdGVkKCk7Ci0JCQl9Ci0JCX0pOwotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHByb2plY3ROYW1lQ29tYm8sIAotCQkJCUlDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCAKLQkJCQluZXcgQ29udHJvbFtde3Byb2plY3ROYW1lTGFiZWx9KTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0U2VsZWN0ZWRQcm9qZWN0KCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCU9iamVjdCBvYmogPSBzdHVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiAoSVByb2plY3QpIG9iajsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVOZXdQcm9qZWN0U2VsZWN0ZWQoKSB7ICAgCi0gICAgICAgIElEYXRhTW9kZWwgamF2YVByb2pNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGbGV4aWJsZUphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAgICAgRGF0YU1vZGVsV2l6YXJkIG5ld1Byb2plY3RXaXphcmQgPSBuZXcgRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQoamF2YVByb2pNb2RlbCk7Ci0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHBhcmVudENvbXBvc2l0ZS5nZXRTaGVsbCgpLCBuZXdQcm9qZWN0V2l6YXJkKTsKLQkJaWYgKFdpbmRvdy5PSyA9PSBkaWFsb2cub3BlbigpKSB7Ci0JCQlTdHJpbmcgbmV3UHJvamVjdE5hbWUgPSBqYXZhUHJvak1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLQkJCXByb2plY3ROYW1lQ29tYm8uYWRkKG5ld1Byb2plY3ROYW1lKTsKLQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChuZXdQcm9qZWN0TmFtZSk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQkJCWlmIChydW50aW1lICE9IG51bGwpewotCQkJCXNlcnZlclRhcmdldFRleHQuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0JCQkJc3luY2hIZWxwZXIuZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRV9UQVJHRVRfSUQsIHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZHVsZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkvLyBBZGQgdGhlIG1vZHVsZSBuYW1lIGxhYmVsCi0JCUxhYmVsIG1vZHVsZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbW9kdWxlTmFtZUxhYmVsLnNldFRleHQoTU9EVUxFX05BTUUpOwotCQkvLyBBZGQgdGhlIG1vZHVsZSBuYW1lIGVudHJ5IGZpZWxkCi0JCW1vZHVsZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQltb2R1bGVOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQobW9kdWxlTmFtZVRleHQsIAotCQkJCUlDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUsCi0JCQkJbmV3IENvbnRyb2xbXSB7fSk7Ci0JCW5ldyBMYWJlbChwYXJlbnQsU1dULk5PTkUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHN5bmNoSGVscGVyICE9IG51bGwpIHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJCXN5bmNoSGVscGVyLmRpc3Bvc2UoKTsKLQkJfQotCQltb2RlbCA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaFNwYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXBlcmF0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IGhTcGFuKSB7Ci0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gaFNwYW47Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlRBUkdFVF9SVU5USU1FX0xCTCkpOwotCQlzZXJ2ZXJUYXJnZXRUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0vLwkJc2VydmVyVGFyZ2V0VGV4dC4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkpOwotLy8JCQkJSVJ1bnRpbWUgcnVudGltZSA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOwotLy8JCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKLS8vCQkJCQlzZXJ2ZXJUYXJnZXRUZXh0LnNldFRleHQocnVudGltZS5nZXROYW1lKCkpOwotLy8JCQl9Ci0vLwkJfSk7Ci0JCQotCQlzZXJ2ZXJUYXJnZXRUZXh0LnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gcHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCWlmIChwcm9qZWN0TmFtZSE9bnVsbCAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSE9MCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQlpZiAocHJvamVjdCAhPW51bGwpIHsKLQkJCQlJUnVudGltZSBydW50aW1lID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7Ci0JCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCl7Ci0JCQkJCXNlcnZlclRhcmdldFRleHQuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0JCQkJCXN5bmNoSGVscGVyLmdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KElKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lELCBydW50aW1lLmdldE5hbWUoKSk7Ci0JCQkJfQkKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld01vZHVsZUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld01vZHVsZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MWI5ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdNb2R1bGVHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDMsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdNb2R1bGVHcm91cCBpbXBsZW1lbnRzIElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzewotCQotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQlwcm90ZWN0ZWQgVGV4dCBtb2R1bGVOYW1lVGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBuZXdCdXR0b24gPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IHNlcnZlclRhcmdldFRleHQ7Ci0JcHJpdmF0ZSBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKLS8vCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xBQkVMX1VJID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUVfVUkgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIE5ld01vZHVsZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSURhdGFNb2RlbCBtb2RlbCwgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY0hlbHBlcikgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0vLwkJdGhpcy5wYXJlbnRDb21wb3NpdGUgPSBwYXJlbnQ7Ci0JCXN5bmNoSGVscGVyID0gc3luY0hlbHBlcjsKLQkJYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb250cm9scyB3aXRoaW4gdGhpcyBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZENvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvL2NyZWF0ZVByb2plY3ROYW1lR3JvdXAocGFyZW50KTsKLQkJLy9pbml0aWFsaXplUHJvamVjdExpc3QoKTsKLSAgICAgICAgY3JlYXRlTW9kdWxlR3JvdXAocGFyZW50KTsKLSAgICAgICAgLy9hZGRTZXBlcmF0b3IocGFyZW50LDMpOwotCQkvL2NyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShwYXJlbnQpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKgotCSAqLwotLy8JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVByb2plY3RMaXN0KCkgewotLy8JCUlQcm9qZWN0W10gd29ya3NwYWNlUHJvamVjdHMgPSBQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzKCk7Ci0vLwkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlmb3IgKGludCBpPTA7IGk8d29ya3NwYWNlUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLS8vCQkJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZVByb2plY3RzW2ldOwotLy8JCQl0cnkgewotLy8JCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLS8vCQkJCQlpdGVtcy5hZGQocHJvamVjdC5nZXROYW1lKCkpOwotLy8JCQkJfQotLy8JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0vLwkJCQkvL0lnbm9yZQotLy8JCQl9Ci0vLwkJfQotLy8JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tpdGVtcy5zaXplKCldOwotLy8JCWZvciAoaW50IGk9MDsgaTxpdGVtcy5zaXplKCk7IGkrKykgewotLy8JCQluYW1lc1tpXT0gKFN0cmluZykgaXRlbXMuZ2V0KGkpOwotLy8JCX0KLS8vCQkvL21vZGVsLklnbm9yZVByb3BlcnR5Q2hhbmdlcyh0cnVlKTsKLS8vCQlwcm9qZWN0TmFtZUNvbWJvLnNldEl0ZW1zKG5hbWVzKTsKLS8vCQkvL21vZGVsLnNldElnbm9yZVByb3BlcnR5Q2hhbmdlcyhmYWxzZSk7Ci0vLwkJCi0vLwkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KFBST0pFQ1RfTkFNRSkgfHwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKS5sZW5ndGgoKT09MCkgewotLy8JCQlJUHJvamVjdCBzZWxlY3RlZFByb2plY3QgPSBnZXRTZWxlY3RlZFByb2plY3QoKTsKLS8vCQkJaWYgKHNlbGVjdGVkUHJvamVjdCE9bnVsbCkgewotLy8JCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KHNlbGVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotLy8JCQkJbW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FLHNlbGVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotLy8JCQl9Ci0vLwkJCWVsc2UgaWYgKG5hbWVzLmxlbmd0aD4wKSB7Ci0vLwkJCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQobmFtZXNbMF0pOwotLy8JCQkJbW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FLG5hbWVzWzBdKTsKLS8vCQkJfQotLy8JCX0gZWxzZSB7Ci0vLwkJCXByb2plY3ROYW1lQ29tYm8uYWRkKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkpOwotLy8JCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogIAotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotLy8JCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgbGFiZWwKLS8vCQlMYWJlbCBwcm9qZWN0TmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotLy8JCXByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChQUk9KRUNUX05BTUVfVUkpOwotLy8JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLS8vCQlwcm9qZWN0TmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0vLwkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotLy8JCXByb2plY3ROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0vLwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0vLwkJcHJvamVjdE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotLy8JCXByb2plY3ROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkpOwotLy8JCQkJSVJ1bnRpbWUgcnVudGltZSA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOwotLy8JCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKLS8vCQkJCQlzZXJ2ZXJUYXJnZXRUZXh0LnNldFRleHQocnVudGltZS5nZXROYW1lKCkpOwotLy8JCQl9Ci0vLwkJfSk7Ci0vLwkJbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLS8vCQluZXdCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0vLwkJbmV3QnV0dG9uLnNldFRleHQoTkVXX0xBQkVMX1VJKTsKLS8vCQluZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQkJCWhhbmRsZU5ld1Byb2plY3RTZWxlY3RlZCgpOwotLy8JCQl9Ci0vLwkJfSk7Ci0vLwkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhwcm9qZWN0TmFtZUNvbWJvLCBQUk9KRUNUX05BTUUsIG5ldyBDb250cm9sW117cHJvamVjdE5hbWVMYWJlbH0pOwotLy8JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLS8vCXByaXZhdGUgSVByb2plY3QgZ2V0U2VsZWN0ZWRQcm9qZWN0KCkgewotLy8JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0vLwkJaWYgKHdpbmRvdyA9PSBudWxsKQotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0vLwkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikpCi0vLwkJCXJldHVybiBudWxsOwotLy8JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc3R1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLS8vCQlPYmplY3Qgb2JqID0gc3R1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotLy8JCWlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkKLS8vCQkJcmV0dXJuIChJUHJvamVjdCkgb2JqOwotLy8JCXJldHVybiBudWxsOwotLy8JfQotLy8JCi0JLyoqCi0JICogCi0JICoKLQkgKi8KLS8vCXByaXZhdGUgdm9pZCBoYW5kbGVOZXdQcm9qZWN0U2VsZWN0ZWQoKSB7Ci0vLwkJSURhdGFNb2RlbCBwcm9qTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0vLwkJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQgbmV3UHJvamVjdFdpemFyZCA9IG5ldyBGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZChwcm9qTW9kZWwpOwotLy8JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHBhcmVudENvbXBvc2l0ZS5nZXRTaGVsbCgpLCBuZXdQcm9qZWN0V2l6YXJkKTsKLS8vCQlpZiAoV2luZG93Lk9LID09IGRpYWxvZy5vcGVuKCkpIHsKLS8vCQkJU3RyaW5nIG5ld1Byb2plY3ROYW1lID0gcHJvak1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0vLwkJCXByb2plY3ROYW1lQ29tYm8uYWRkKG5ld1Byb2plY3ROYW1lKTsKLS8vCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KG5ld1Byb2plY3ROYW1lKTsKLS8vCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0vLwkJCUlSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLS8vCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKLS8vCQkJCXNlcnZlclRhcmdldFRleHQuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0vLwkJfQotLy8JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTW9kdWxlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCS8vIEFkZCB0aGUgbW9kdWxlIG5hbWUgbGFiZWwKLQkJTGFiZWwgbW9kdWxlTmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQltb2R1bGVOYW1lTGFiZWwuc2V0VGV4dChNT0RVTEVfTkFNRV9VSSk7Ci0JCS8vIEFkZCB0aGUgbW9kdWxlIG5hbWUgZW50cnkgZmllbGQKLQkJbW9kdWxlTmFtZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCW1vZHVsZU5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChtb2R1bGVOYW1lVGV4dCxDT01QT05FTlRfTkFNRSxuZXcgQ29udHJvbFtdIHt9KTsKLQkJbmV3IExhYmVsKHBhcmVudCxTV1QuTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc3luY2hIZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVtb3ZlTGlzdGVuZXIoc3luY2hIZWxwZXIpOwotCQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JCW1vZGVsID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotLy8JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLS8vCQlyZXR1cm4gcHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCk7Ci0vLwl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBoU3BhbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlcGVyYXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgaFNwYW4pIHsKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBoU3BhbjsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2VydmVyVGFyZ2V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVEFSR0VUX1JVTlRJTUVfTEJMKSk7Ci0JCXNlcnZlclRhcmdldFRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJc2VydmVyVGFyZ2V0VGV4dC5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZHVsZU5hbWVUZXh0LmdldFRleHQoKTsKLQkJaWYgKHByb2plY3ROYW1lIT1udWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpIT0wKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCWlmIChwcm9qZWN0ICE9bnVsbCkgewotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQkJCQlpZiAocnVudGltZSAhPSBudWxsKXsKLQkJCQkJc2VydmVyVGFyZ2V0VGV4dC5zZXRUZXh0KHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHNlcnZlclRhcmdldFRleHQsIFJVTlRJTUVfVEFSR0VUX0lELCBudWxsKTsKLQkJCQl9CQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3TW9kdWxlR3JvdXBFeC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdNb2R1bGVHcm91cEV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGRmN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdNb2R1bGVHcm91cEV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld01vZHVsZUdyb3VwRXggewotCQotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQlwcm90ZWN0ZWQgQ29tYm8gcHJvamVjdE5hbWVDb21ibyA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbW9kdWxlTmFtZVRleHQgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gbmV3QnV0dG9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGV4dCBzZXJ2ZXJUYXJnZXRUZXh0OwotCXByaXZhdGUgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDMwNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVEFCTEVfUFJPSkVDVCkrICI6IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTEFCRUwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ORVdfVEhSRUVfRE9UU19FKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTkFNRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRV9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgTmV3TW9kdWxlR3JvdXBFeChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnBhcmVudENvbXBvc2l0ZSA9IHBhcmVudDsKLQkJc3luY2hIZWxwZXIgPSBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIobW9kZWwpOwotCQlidWlsZENvbXBvc2l0ZXMocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbnRyb2xzIHdpdGhpbiB0aGlzIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVByb2plY3ROYW1lR3JvdXAocGFyZW50KTsKLQkJcHJvamVjdE5hbWVDb21iby5zZXRGb2N1cygpOwotCQlpbml0aWFsaXplUHJvamVjdExpc3QoKTsKLQkJY3JlYXRlU2VydmVyVGFyZ2V0Q29tcG9zaXRlKHBhcmVudCk7Ci0JCWFkZFNlcGVyYXRvcihwYXJlbnQsMyk7Ci0JCWNyZWF0ZU1vZHVsZUdyb3VwKHBhcmVudCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVByb2plY3RMaXN0KCkgewotCQlJUHJvamVjdFtdIHdvcmtzcGFjZVByb2plY3RzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpOwotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8d29ya3NwYWNlUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VQcm9qZWN0c1tpXTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQkJaXRlbXMuYWRkKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQluYW1lc1tpXT0gKFN0cmluZykgaXRlbXMuZ2V0KGkpOwotCQl9Ci0JCS8vbW9kZWwuc2V0SWdub3JlUHJvcGVydHlDaGFuZ2VzKHRydWUpOwotCQlwcm9qZWN0TmFtZUNvbWJvLnNldEl0ZW1zKG5hbWVzKTsKLQkJLy9tb2RlbC5zZXRJZ25vcmVQcm9wZXJ0eUNoYW5nZXMoZmFsc2UpOwotCQkKLQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSB8fCBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkubGVuZ3RoKCk9PTApIHsKLQkJCUlQcm9qZWN0IHNlbGVjdGVkUHJvamVjdCA9IGdldFNlbGVjdGVkUHJvamVjdCgpOwotCQkJaWYgKHNlbGVjdGVkUHJvamVjdCE9bnVsbCkgewotCQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChzZWxlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSxzZWxlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5hbWVzLmxlbmd0aD4wKSB7Ci0JCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KG5hbWVzWzBdKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSxuYW1lc1swXSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLmFkZChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkpOwotCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGxhYmVsCi0JCUxhYmVsIHByb2plY3ROYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChQUk9KRUNUX05BTUUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotCQlwcm9qZWN0TmFtZUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCXByb2plY3ROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHJvamVjdE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCQlJUnVudGltZSBydW50aW1lID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7Ci0JCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKLQkJCQkJc2VydmVyVGFyZ2V0VGV4dC5zZXRUZXh0KHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW5ld0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmV3QnV0dG9uLnNldFRleHQoTkVXX0xBQkVMKTsKLQkJbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZU5ld1Byb2plY3RTZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhwcm9qZWN0TmFtZUNvbWJvLCBJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtwcm9qZWN0TmFtZUxhYmVsfSk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFNlbGVjdGVkUHJvamVjdCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBXb3JrYmVuY2guZ2V0SW5zdGFuY2UoKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc3R1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJT2JqZWN0IG9iaiA9IHN0dWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJcmV0dXJuIChJUHJvamVjdCkgb2JqOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlTmV3UHJvamVjdFNlbGVjdGVkKCkgewotCQlJRGF0YU1vZGVsIHByb2pNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGbGV4aWJsZUphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQgbmV3UHJvamVjdFdpemFyZCA9IG5ldyBGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZChwcm9qTW9kZWwpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhwYXJlbnRDb21wb3NpdGUuZ2V0U2hlbGwoKSwgbmV3UHJvamVjdFdpemFyZCk7Ci0JCWlmIChXaW5kb3cuT0sgPT0gZGlhbG9nLm9wZW4oKSkgewotCQkJU3RyaW5nIG5ld1Byb2plY3ROYW1lID0gcHJvak1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLQkJCXByb2plY3ROYW1lQ29tYm8uYWRkKG5ld1Byb2plY3ROYW1lKTsKLQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChuZXdQcm9qZWN0TmFtZSk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQkJCWlmIChydW50aW1lICE9IG51bGwpCi0JCQkJc2VydmVyVGFyZ2V0VGV4dC5zZXRUZXh0KHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZHVsZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkvLyBBZGQgdGhlIG1vZHVsZSBuYW1lIGxhYmVsCi0JCUxhYmVsIG1vZHVsZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbW9kdWxlTmFtZUxhYmVsLnNldFRleHQoTU9EVUxFX05BTUUpOwotCQkvLyBBZGQgdGhlIG1vZHVsZSBuYW1lIGVudHJ5IGZpZWxkCi0JCW1vZHVsZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQltb2R1bGVOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQobW9kdWxlTmFtZVRleHQsSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSxuZXcgQ29udHJvbFtdIHt9KTsKLQkJbmV3IExhYmVsKHBhcmVudCxTV1QuTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc3luY2hIZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVtb3ZlTGlzdGVuZXIoc3luY2hIZWxwZXIpOwotCQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JCW1vZGVsID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBoU3BhbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlcGVyYXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgaFNwYW4pIHsKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBoU3BhbjsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2VydmVyVGFyZ2V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVEFSR0VUX1JVTlRJTUVfTEJMKSk7Ci0JCXNlcnZlclRhcmdldFRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJc2VydmVyVGFyZ2V0VGV4dC5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQlpZiAocHJvamVjdE5hbWUhPW51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkhPTApIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJaWYgKHByb2plY3QgIT1udWxsKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOwotCQkJCWlmIChydW50aW1lICE9IG51bGwpCi0JCQkJCXNlcnZlclRhcmdldFRleHQuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdQcm9qZWN0R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3UHJvamVjdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZTUyY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdQcm9qZWN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAzLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQcm9qZWN0R3JvdXAgewotCXByaXZhdGUgSURhdGFNb2RlbCBwcm9qZWN0TW9kZWw7Ci0JcHVibGljIFRleHQgcHJvamVjdE5hbWVGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbG9jYXRpb25QYXRoRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uID0gbnVsbDsKLQkvLwljb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JLy8JZGVmYXVsdCB2YWx1ZXMKLQlwcml2YXRlIFN0cmluZyBkZWZQcm9qZWN0TmFtZUxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkFNRV9MQUJFTCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBkZWZCcm93c2VCdXR0b25MYWJlbCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9MQUJFTCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmRGlyRGlhbG9nTGFiZWwgPSAiRGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgTmV3UHJvamVjdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSURhdGFNb2RlbCBtb2RlbCwgRGF0YU1vZGVsU3luY2hIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIHByb2plY3RNb2RlbCA9IG1vZGVsOwotCQlzeW5jaEhlbHBlciA9IGhlbHBlcjsKLQkJYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb250cm9scyB3aXRoaW4gdGhpcyBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZENvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVQcm9qZWN0TmFtZUdyb3VwKHBhcmVudCk7Ci0JCWNyZWF0ZVByb2plY3RMb2NhdGlvbkdyb3VwKHBhcmVudCk7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGxhYmVsCi0JCUxhYmVsIHByb2plY3ROYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChkZWZQcm9qZWN0TmFtZUxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgZW50cnkgZmllbGQKLQkJcHJvamVjdE5hbWVGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7IC8vIHBhZAotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQocHJvamVjdE5hbWVGaWVsZCwgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBuZXcgQ29udHJvbFtde3Byb2plY3ROYW1lTGFiZWx9KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RMb2NhdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8JCXNldCB1cCBsb2NhdGlvbiBwYXRoIGxhYmVsCi0JCUxhYmVsIGxvY2F0aW9uUGF0aExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsb2NhdGlvblBhdGhMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlBST0pFQ1RfTE9DX0xCTCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxvY2F0aW9uUGF0aExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCS8vIHNldCB1cCBsb2NhdGlvbiBwYXRoIGVudHJ5IGZpZWxkCi0JCWxvY2F0aW9uUGF0aEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJbG9jYXRpb25QYXRoRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy8gc2V0IHVwIGJyb3dzZSBidXR0b24KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoZGVmQnJvd3NlQnV0dG9uTGFiZWwpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChsb2NhdGlvblBhdGhGaWVsZCwgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuUFJPSkVDVF9MT0NBVElPTiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYnJvd3NlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobG9jYXRpb25QYXRoRmllbGQuZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKGRlZkRpckRpYWxvZ0xhYmVsKTsKLQkJU3RyaW5nIGRpck5hbWUgPSBwcm9qZWN0TW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuUFJPSkVDVF9MT0NBVElPTik7Ci0JCWlmICgoZGlyTmFtZSAhPSBudWxsKSAmJiAoZGlyTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkgewotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9qZWN0TW9kZWwuc2V0UHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuUFJPSkVDVF9MT0NBVElPTiwgc2VsZWN0ZWREaXJlY3RvcnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgcHJvamVjdE1vZGVsID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9QYWNrYWdlTmFtZVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1BhY2thZ2VOYW1lUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlYzE3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1BhY2thZ2VOYW1lUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci0KLS8qKgotICogQGF1dGhvciBTYWNoaW4KLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlTmFtZVJlc29sdmVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgewotCi0JcHVibGljIFBhY2thZ2VOYW1lUmVzb2x2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoZmluYWwgU3RyaW5nIGNsYXNzRmlsZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjbGFzc0ZpbGUpOwotCQlieXRlW10gY2xhc3NidWYgPSBuZXcgYnl0ZVsoaW50KSBmaWxlLmxlbmd0aCgpXTsKLQkJdHJ5IHsKLQkJCUZpbGVJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlpbnN0cmVhbS5yZWFkKGNsYXNzYnVmKTsKLQkJCWluc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlib29sZWFuIGJhZGNsYXNzbmFtZSA9IHRydWU7Ci0JCVN0cmluZyBjbGFzc25hbWUgPSBjbGFzc0ZpbGUucmVwbGFjZShqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKLQkJaW50IGVuZGk7Ci0JCWlmIChjbGFzc25hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQllbmRpID0gY2xhc3NuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWVsc2UKLQkJCWVuZGkgPSBjbGFzc25hbWUubGVuZ3RoKCk7Ci0JCWludCBpID0gY2xhc3NuYW1lLmluZGV4T2YoJy4nKTsKLQkJd2hpbGUgKGkgPCBlbmRpICYmIGJhZGNsYXNzbmFtZSA9PSB0cnVlKSB7Ci0JCQliYWRjbGFzc25hbWUgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZGVmaW5lQ2xhc3MoY2xhc3NuYW1lLnN1YnN0cmluZyhpICsgMSwgZW5kaSksIGNsYXNzYnVmLCAwLCBjbGFzc2J1Zi5sZW5ndGgpOwotCQkJfSBjYXRjaCAoamF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJaWYgKG1zZyA9PSBudWxsIHx8IG1zZy5pbmRleE9mKCcgJykgPiAwKSB7Ci0JCQkJCWJhZGNsYXNzbmFtZSA9IHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQliYWRjbGFzc25hbWUgPSB0cnVlOwotCQkJfQotCQkJaWYgKGJhZGNsYXNzbmFtZSkgewotCQkJCWkgPSBjbGFzc25hbWUuaW5kZXhPZignLicsIGkgKyAxKTsKLQkJCQlpZiAoaSA9PSAtMSkKLQkJCQkJaSA9IGVuZGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhZGNsYXNzbmFtZSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2xhc3NuYW1lLnN1YnN0cmluZyhpICsgMSwgZW5kaSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyRWFyQW5kU3RhbmRhbG9uZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YmM3YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVhckFuZFN0YW5kYWxvbmVHcm91cCBpbXBsZW1lbnRzIElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkKLQlwcml2YXRlIEJ1dHRvbiBuZXdFQVI7Ci0JcHJpdmF0ZSBDb21ibyBlYXJDb21ibzsKLQlwcml2YXRlIExhYmVsIGVhckxhYmVsOwotCXByaXZhdGUgQnV0dG9uIGFkZFRvRUFSOwotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQlwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU2VydmVyRWFyQW5kU3RhbmRhbG9uZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIElEYXRhTW9kZWwgbW9kZWwsIERhdGFNb2RlbFN5bmNoSGVscGVyIGhlbHBlcikgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMucGFyZW50Q29tcG9zaXRlID0gcGFyZW50OwotCQlzeW5jaEhlbHBlciA9IGhlbHBlcjsKLQkJYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUVhckFuZFN0YW5kYWxvbmVDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWFyQW5kU3RhbmRhbG9uZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVSV9TSE9XX0VBUl9TRUNUSU9OKSkgewotCi0JCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvL3BhZAotCi0JCQkvLyBDcmVhdGUgQWRkIHRvIEVBUiBjaGVja2JveAotCQkJYWRkVG9FQVIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJCWFkZFRvRUFSLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTElOS19NT0RVTEVUT19FQVJfUFJPSkVDVCkpOwotCQkJYWRkVG9FQVIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWFkZFRvRUFSLnNldExheW91dERhdGEoZ2QpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChhZGRUb0VBUiwgQUREX1RPX0VBUiwgbnVsbCk7Ci0JCQkKLQkJCS8vIENyZWF0ZSBFQVIgR3JvdXAKLQkJCWVhckxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZWFyTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfUFJPSkVDVF9GT1JfTU9EVUxFX0NSRUFUSU9OKSk7Ci0KLQkJCWVhckNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZWFyQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCW5ld0VBUiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQluZXdFQVIuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ORVdfVEhSRUVfRE9UU19XKSk7Ci0JCQluZXdFQVIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQluZXdFQVIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaGFuZGxlTmV3RWFyU2VsZWN0ZWQoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkvL2RvIG5vdGhpbmcKLQkJCQl9Ci0KLQkJCX0pOwotCi0JCQlDb250cm9sW10gZGVwcyA9IG5ldyBDb250cm9sW117ZWFyTGFiZWwsIG5ld0VBUn07Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKGVhckNvbWJvLCBFQVJfQ09NUE9ORU5UX05BTUUsIGRlcHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5ld0VhclNlbGVjdGVkKCkgewotCQlJRGF0YU1vZGVsIG1vZHVsZU1vZGVsID0gbW9kZWw7Ci0gICAgICAgIElEYXRhTW9kZWwgZWFyTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJZWFyTW9kZWwuc2V0SW50UHJvcGVydHkoQ09NUE9ORU5UX1ZFUlNJT04sIG1vZHVsZU1vZGVsLmdldEludFByb3BlcnR5KElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OKSk7Ci0JCWVhck1vZGVsLnNldFByb3BlcnR5KENPTVBPTkVOVF9OQU1FLCBtb2R1bGVNb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfQ09NUE9ORU5UX05BTUUpKTsKLQkJRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgZWFyV2l6YXJkID0gbmV3IEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkKGVhck1vZGVsKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cocGFyZW50Q29tcG9zaXRlLmdldFNoZWxsKCksIGVhcldpemFyZCk7Ci0JCWlmIChXaW5kb3cuT0sgPT0gZGlhbG9nLm9wZW4oKSkgewotCQkJbW9kdWxlTW9kZWwuc2V0UHJvcGVydHkoRUFSX0NPTVBPTkVOVF9OQU1FLCBlYXJNb2RlbC5nZXRQcm9wZXJ0eShDT01QT05FTlRfTkFNRSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbW9kZWwucmVtb3ZlTGlzdGVuZXIoc3luY2hIZWxwZXIpOwotCQltb2RlbC5kaXNwb3NlKCk7Ci0JCXN5bmNoSGVscGVyID0gbnVsbDsKLQkJbW9kZWwgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1NlcnZlclRhcmdldENvbWJvSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1NlcnZlclRhcmdldENvbWJvSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYzMxODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJUYXJnZXRDb21ib0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDI3LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUKLSAqIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SZXNvdXJjZU1hbmFnZXI7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlclRhcmdldENvbWJvSGVscGVyIHsKLQlwcml2YXRlIExpc3QgdGFyZ2V0czsKLQlwdWJsaWMgU3RyaW5nW10gaXRlbXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdElkID0gImNvbS5pYm0uZXRvb2xzLndlYnNwaGVyZS5zZXJ2ZXJUYXJnZXQuYmFzZS52NTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdEV4cHJlc3NJZCA9ICJjb20uaWJtLmV0b29scy53ZWJzcGhlcmUuc2VydmVyVGFyZ2V0LmV4cHJlc3MudjUxIjsgLy8kTk9OLU5MUy0xJAotCi0JU2VydmVyVGFyZ2V0Q29tYm9IZWxwZXIoTGlzdCB0YXJnZXRzLCBTdHJpbmdbXSBpdGVtcykgewotCQl0aGlzLnRhcmdldHMgPSB0YXJnZXRzOwotCQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JfQotCi0JcHVibGljIElSdW50aW1lIGdldFNlbGVjdGVkVGFyZ2V0KGludCBpdGVtSW5kZXgpIHsKLQkJcmV0dXJuIChJUnVudGltZSkgdGFyZ2V0cy5nZXQoaXRlbUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZShJUnVudGltZSB0YXJnZXQpIHsKLQkJcmV0dXJuIHRhcmdldHMuY29udGFpbnModGFyZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRTZXJ2ZXJUYXJnZXRJbmRleCgpIHsKLQkJSVJ1bnRpbWUgdjUxVGFyZ2V0U2VydmVyID0gbnVsbDsKLQkJaWYgKEoyRUVQbHVnaW4uaXNFSkJTdXBwb3J0QXZhaWxhYmxlKCkpCi0JCQl2NTFUYXJnZXRTZXJ2ZXIgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSdW50aW1lKGRlZmF1bHRJZCk7Ci0JCWVsc2UKLQkJCXY1MVRhcmdldFNlcnZlciA9IFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFJ1bnRpbWUoZGVmYXVsdEV4cHJlc3NJZCk7Ci0JCWlmICh2NTFUYXJnZXRTZXJ2ZXIgIT0gbnVsbCAmJiB0YXJnZXRzLmNvbnRhaW5zKHY1MVRhcmdldFNlcnZlcikpCi0JCQlyZXR1cm4gdGFyZ2V0cy5pbmRleE9mKHY1MVRhcmdldFNlcnZlcikgKyAxOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZXJ2ZXJUYXJnZXRJbmRleEZyb21JdGVtcyhJUnVudGltZSBzZXJ2ZXJUYXJnZXQpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMubGVuZ3RoID4gMCkgewotCQkJU3RyaW5nIHNlcnZlclRhcmdldExhYmVsID0gc2VydmVyVGFyZ2V0LmdldE5hbWUoKSArICIgKCIgKyBzZXJ2ZXJUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXROYW1lKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBsYWJlbCA9IGl0ZW1zW2ldOwotCQkJCWlmIChsYWJlbC5lcXVhbHMoc2VydmVyVGFyZ2V0TGFiZWwpKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VmFsaWRUYXJnZXRzKCkgewotCQlyZXR1cm4gdGFyZ2V0czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJUYXJnZXRHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJUYXJnZXRHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjdiYmUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA4LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUYXJnZXRHcm91cCBpbXBsZW1lbnRzIElKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXN7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7Ci0JcHJpdmF0ZSBDb21ibyB0YXJnZXRTZXJ2ZXJDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBuZXdUYXJnZXRTZXJ2ZXJCdXR0b247Ci0JcHVibGljIENvbXBvc2l0ZSBwYXJlbnRVSTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU2VydmVyVGFyZ2V0R3JvdXAoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgU2VydmVyVGFyZ2V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRGF0YU1vZGVsIG1vZGVsLCBEYXRhTW9kZWxTeW5jaEhlbHBlciBoZWxwZXIpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnBhcmVudFVJID0gcGFyZW50OwotCQlzeW5jaEhlbHBlciA9IGhlbHBlcjsKLQkJYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb250cm9scyB3aXRoaW4gdGhpcyBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZENvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVTZXJ2ZXJUYXJnZXRHcm91cChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VydmVyVGFyZ2V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBzZXJ2ZXJUYXJnZXRMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2VydmVyVGFyZ2V0TGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5UQVJHRVRfUlVOVElNRV9MQkwpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlzZXJ2ZXJUYXJnZXRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0KLQkJdGFyZ2V0U2VydmVyQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXRhcmdldFNlcnZlckNvbWJvLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0KLQkJbmV3VGFyZ2V0U2VydmVyQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJbmV3VGFyZ2V0U2VydmVyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQluZXdUYXJnZXRTZXJ2ZXJCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ORVdfVEhSRUVfRE9UU19FKSk7Ci0JCW5ld1RhcmdldFNlcnZlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVOZXdUYXJnZXRTZXJ2ZXJCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQluZXdUYXJnZXRTZXJ2ZXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotCQlDb250cm9sW10gZGVwcyA9IG5ldyBDb250cm9sW117c2VydmVyVGFyZ2V0TGFiZWwsIG5ld1RhcmdldFNlcnZlckJ1dHRvbn07Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8odGFyZ2V0U2VydmVyQ29tYm8sIFJVTlRJTUVfVEFSR0VUX0lELCBkZXBzKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTmV3VGFyZ2V0U2VydmVyQnV0dG9uUHJlc3NlZCgpIHsKLQkJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmxhdW5jaE5ld1J1bnRpbWVXaXphcmQocGFyZW50VUkuZ2V0U2hlbGwoKSwgbW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJbW9kZWwgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFyZ2V0U2VydmVyQ29tYm8uCi0JICovCi0JcHVibGljIENvbWJvIGdldFRhcmdldFNlcnZlckNvbWJvKCkgewotCQlyZXR1cm4gdGFyZ2V0U2VydmVyQ29tYm87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldFNlcnZlckNvbWJvCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0U2VydmVyQ29tYm8gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldFNlcnZlckNvbWJvKENvbWJvIHRhcmdldFNlcnZlckNvbWJvKSB7Ci0JCXRoaXMudGFyZ2V0U2VydmVyQ29tYm8gPSB0YXJnZXRTZXJ2ZXJDb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ld1RhcmdldFNlcnZlckJ1dHRvbi4KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGdldE5ld1RhcmdldFNlcnZlckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ld1RhcmdldFNlcnZlckJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VGFyZ2V0U2VydmVyQnV0dG9uCi0JICogICAgICAgICAgICBUaGUgbmV3VGFyZ2V0U2VydmVyQnV0dG9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdUYXJnZXRTZXJ2ZXJCdXR0b24oQnV0dG9uIG5ld1RhcmdldFNlcnZlckJ1dHRvbikgewotCQl0aGlzLm5ld1RhcmdldFNlcnZlckJ1dHRvbiA9IG5ld1RhcmdldFNlcnZlckJ1dHRvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJUYXJnZXRVSUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJUYXJnZXRVSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMzODdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0VUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAxNywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclRhcmdldFVJSGVscGVyIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFNlcnZlclRhcmdldFVJSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlbGVjdGVkU2VydmVyVGFyZ2V0U3RyaW5nKENvbWJvIHNlcnZlclRhcmdldENvbWJvKSB7Ci0JCWlmIChzZXJ2ZXJUYXJnZXRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKQotCQkJcmV0dXJuIHNlcnZlclRhcmdldENvbWJvLmdldEl0ZW0oc2VydmVyVGFyZ2V0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRTZWxlY3RlZFNlcnZlclRhcmdldFN0cmluZ0luZGV4KENvbWJvIHNlcnZlclRhcmdldENvbWJvKSB7Ci0JCXJldHVybiBzZXJ2ZXJUYXJnZXRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTZXJ2ZXJUYXJnZXRGb3JQcm9qZWN0KFNoZWxsIHNoZWxsLCBJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lKSB7Ci0vLwkJLy9TZXJ2ZXJUYXJnZXRIZWxwZXIuY2xlYW5VcE5vblNlcnZlclRhcmdldENsYXNzcGF0aChwcm9qZWN0KTsKLS8vCQlzZXRTZXJ2ZXJUYXJnZXQoc2hlbGwsIHByb2plY3QsIHJ1bnRpbWUsIG51bGwpOwotLy8JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhclByb2plY3QKLQkgKiBAcGFyYW0gbW9kdWxlUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0TW9kdWxlU2VydmVyVGFyZ2V0SWZOZWNlc3NhcnkoSVByb2plY3QgZWFyUHJvamVjdCwgSVByb2plY3QgbW9kdWxlUHJvamVjdCwgU2hlbGwgc2hlbGwpIHsKLQkJSVJ1bnRpbWUgZWFyUnVudGltZSA9IGdldFByb2plY3RSdW50aW1lKGVhclByb2plY3QpOwotCQlpZiAoZWFyUnVudGltZSAhPSBudWxsKSB7Ci0JCQlJUnVudGltZSBtb2R1bGVSdW50aW1lID0gZ2V0UHJvamVjdFJ1bnRpbWUobW9kdWxlUHJvamVjdCk7Ci0JCQlpZiAobW9kdWxlUnVudGltZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKCFlYXJSdW50aW1lLmdldElkKCkuZXF1YWxzKG1vZHVsZVJ1bnRpbWUuZ2V0SWQoKSkpIHsKLQkJCQlTdHJpbmcgZGlhbG9nTWVzc2FnZSA9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDaGFuZ2VfTW9kdWxlX1NlcnZlcl9UYXJnZXRfRGlhbG9nX01lc3NhZ2VfVUlfIiwgbmV3IE9iamVjdFtde2VhclJ1bnRpbWUuZ2V0TmFtZSgpLCBtb2R1bGVSdW50aW1lLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGRpYWxvZ1RpdGxlID0gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNoYW5nZV9TZXJ2ZXJfVGFyZ2V0X0RpYWxvZ19UaXRsZV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coc2hlbGwsIGRpYWxvZ1RpdGxlLCBudWxsLCBkaWFsb2dNZXNzYWdlLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9LCAwKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IDApIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gSVJ1bnRpbWUgcmV0dXJuIHRoZSBleGlzdGluZyBUYXJnZXQgcnVudGltZSBvbiBhIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRQcm9qZWN0UnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQl9Ci0KLQkvLwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RUFSSjJFRUxldmVsKElQcm9qZWN0IGVhclByb2plY3QpIHsKLQkvLwkJRUFSTmF0dXJlUnVudGltZSBuYXR1cmUgPSBFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUoZWFyUHJvamVjdCk7Ci0JLy8JCVN0cmluZyBqMmVlTGV2ZWwgPSBudWxsOwotCS8vCQlpbnQgbmF0dXJlSUQgPSBuYXR1cmUuZ2V0SjJFRVZlcnNpb24oKTsKLQkvLwkJc3dpdGNoIChuYXR1cmVJRCkgewotCS8vCQkJY2FzZSAoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpIDoKLQkvLwkJCQlqMmVlTGV2ZWwgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUOwotCS8vCQkJCWJyZWFrOwotCS8vCQkJY2FzZSAoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpIDoKLQkvLwkJCQlqMmVlTGV2ZWwgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUOwotCS8vCQkJCWJyZWFrOwotCS8vCQkJY2FzZSAoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpIDoKLQkvLwkJCQlqMmVlTGV2ZWwgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUOwotCS8vCQkJCWJyZWFrOwotCS8vCQkJZGVmYXVsdCA6Ci0JLy8JCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVDsKLQkvLwkJCQlicmVhazsKLQkvLwkJfQotCS8vCQlyZXR1cm4gajJlZUxldmVsOwotCS8vCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZXJ2ZXJUYXJnZXQoU2hlbGwgc2hlbGwsIElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5zZXRSdW50aW1lVGFyZ2V0KHJ1bnRpbWUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJUYXJnZXRDb21ib0hlbHBlciBnZXRWYWxpZFNlcnZlclRhcmdldENvbWJvSXRlbXMoU3RyaW5nIGoyZWVUeXBlLCBTdHJpbmcgc2VsZWN0ZWRWZXJzaW9uKSB7Ci0JCUlSdW50aW1lW10gdmFsaWRTZXJ2ZXJUYXJnZXRzID0gU2VydmVyVXRpbC5nZXRSdW50aW1lcyhqMmVlVHlwZSwgc2VsZWN0ZWRWZXJzaW9uKTsKLQkJU3RyaW5nW10gc2VydmVyVGFyZ2V0TGlzdCA9IG51bGw7Ci0JCWlmICh2YWxpZFNlcnZlclRhcmdldHMubGVuZ3RoPjApIHsKLQkJCWludCBzZXJ2ZXJUYXJnZXRMaXN0U2l6ZSA9IHZhbGlkU2VydmVyVGFyZ2V0cy5sZW5ndGg7Ci0JCQlzZXJ2ZXJUYXJnZXRMaXN0ID0gbmV3IFN0cmluZ1tzZXJ2ZXJUYXJnZXRMaXN0U2l6ZV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkU2VydmVyVGFyZ2V0cy5sZW5ndGg7IGkrKykgewotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSB2YWxpZFNlcnZlclRhcmdldHNbaV07Ci0JCQkJc2VydmVyVGFyZ2V0TGlzdFtpXSA9IHJ1bnRpbWUuZ2V0TmFtZSgpICsgIiAoIiArIHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXROYW1lKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU2VydmVyVGFyZ2V0Q29tYm9IZWxwZXIoQXJyYXlzLmFzTGlzdCh2YWxpZFNlcnZlclRhcmdldHMpLCBzZXJ2ZXJUYXJnZXRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FYXJWYWxpZGF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IEVBUlZhbGlkYXRpb25IZWxwZXIuY3JlYXRlVmFsaWRhdGlvblJ1bm5hYmxlKHByb2plY3QpOwotCQkJcnVubmFibGUucnVuKG51bGwpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGllKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihpdGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyOTcyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByb3RlY3RlZCBjbGFzcyBTdHJpbmdBcnJheUxpc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJcmV0dXJuICgoTGlzdCkgZWxlbWVudCkudG9BcnJheSgpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJLy9EZWZhdWx0IG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy9EZWZhdWx0IG5vdGhpbmcKLQkJfQotCX0KLQlwcm90ZWN0ZWQgY2xhc3MgU3RyaW5nQXJyYXlMaXN0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBsYWJlbFByb3ZpZGVySW1hZ2U7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlTdHJpbmdbXSBhcnJheSA9IChTdHJpbmdbXSkgZWxlbWVudDsKLQkJCVN0cmluZyBzID0gYXJyYXlbMF07Ci0JCQlyZXR1cm4gczsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBBZGRTdHJpbmdBcnJheURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgd2luZG93VGl0bGU7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBsYWJlbHNGb3JUZXh0RmllbGQ7Ci0JCXByb3RlY3RlZCBUZXh0W10gdGV4dHM7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBzdHJpbmdBcnJheTsKLQkJLyoqCi0JCSAqIENNUEZpZWxkRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgQWRkU3RyaW5nQXJyYXlEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyB3aW5kb3dUaXRsZSwgU3RyaW5nW10gbGFiZWxzRm9yVGV4dEZpZWxkKSB7Ci0JCQlzdXBlcihzaGVsbCk7Ci0JCQl0aGlzLndpbmRvd1RpdGxlID0gd2luZG93VGl0bGU7Ci0JCQl0aGlzLmxhYmVsc0ZvclRleHRGaWVsZCA9IGxhYmVsc0ZvclRleHRGaWVsZDsKLQkJfQotCQkvKioKLQkJICogQ01QRmllbGREaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkJICovCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KHdpbmRvd1RpdGxlKTsKLQotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkJaW50IG4gPSBsYWJlbHNGb3JUZXh0RmllbGQubGVuZ3RoOwotCQkJdGV4dHMgPSBuZXcgVGV4dFtuXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCQkJbGFiZWwuc2V0VGV4dChsYWJlbHNGb3JUZXh0RmllbGRbaV0pOwotCQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQkJdGV4dHNbaV0gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkJZGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCQkJdGV4dHNbaV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCX0KLQotCQkJLy8gc2V0IGZvY3VzCi0JCQl0ZXh0c1swXS5zZXRGb2N1cygpOwotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJCWludCBuID0gbGFiZWxzRm9yVGV4dEZpZWxkLmxlbmd0aDsKLQkJCXN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1tuXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJc3RyaW5nQXJyYXlbaV0gPSB0ZXh0c1tpXS5nZXRUZXh0KCk7Ci0JCQl9Ci0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTdHJpbmdBcnJheSgpIHsKLQkJCXJldHVybiBzdHJpbmdBcnJheTsKLQkJfQotCX0KLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBsYWJlbHNGb3JUZXh0OwotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0JcHJpdmF0ZSBJbWFnZSBsYWJlbFByb3ZpZGVySW1hZ2U7Ci0KLQlwdWJsaWMgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgYWRkQnV0dG9uTGFiZWwsIFN0cmluZyByZW1vdmVCdXR0b25MYWJlbCwgU3RyaW5nW10gbGFiZWxzRm9yVGV4dCwgSW1hZ2UgbGFiZWxQcm92aWRlckltYWdlLAotCQkJSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmxhYmVsc0ZvclRleHQgPSBsYWJlbHNGb3JUZXh0OwotCQl0aGlzLmxhYmVsUHJvdmlkZXJJbWFnZSA9IGxhYmVsUHJvdmlkZXJJbWFnZTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDQ7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRoaXMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRoaXMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgdGl0bGVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTEVGVCk7Ci0JCXRpdGxlTGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRpdGxlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGhpcyk7Ci0JCXZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTdHJpbmdBcnJheUxpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTdHJpbmdBcnJheUxpc3RMYWJlbFByb3ZpZGVyKCkpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wbyA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5VTEwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkNvbXBvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KGFkZEJ1dHRvbkxhYmVsKTsKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0KLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULlBVU0gpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChyZW1vdmVCdXR0b25MYWJlbCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlBZGRTdHJpbmdBcnJheURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkU3RyaW5nQXJyYXlEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIGxhYmVsc0ZvclRleHQpOwotCQlkaWFsb2cub3BlbigpOwotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IGRpYWxvZy5nZXRTdHJpbmdBcnJheSgpOwotCQlhZGRTdHJpbmdBcnJheShzdHJpbmdBcnJheSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybjsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJcmVtb3ZlU3RyaW5nQXJyYXkoc2VsZWN0ZWRPYmopOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0cmluZ0FycmF5KFN0cmluZ1tdIHN0cmluZ0FycmF5KSB7Ci0JCUxpc3QgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoc3RyaW5nQXJyYXkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCQlpZiAodmFsdWVMaXN0ID09IG51bGwpCi0JCQl2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbHVlTGlzdC5hZGQoc3RyaW5nQXJyYXkpOwotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmluZ0FycmF5KE9iamVjdCBzZWxlY3RlZFN0cmluZ0FycmF5KSB7Ci0JCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCQl2YWx1ZUxpc3QucmVtb3ZlKHNlbGVjdGVkU3RyaW5nQXJyYXkpOwotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0KExpc3QgaW5wdXQpIHsKLQkJdmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJLy8gQ3JlYXRlIGEgbmV3IGxpc3QgdG8gdHJpZ2dlciBwcm9wZXJ0eSBjaGFuZ2UKLQkJTGlzdCBuZXdJbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbmV3SW5wdXQuYWRkQWxsKGlucHV0KTsKLQkJbW9kZWwuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXdJbnB1dCk7Ci0JfQotCi0JcHVibGljIFRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXB1YmxpYyBCdXR0b24gZ2V0QWRkQnV0dG9uKCkgewotCQlyZXR1cm4gYWRkQnV0dG9uOwotCX0KLQotCXB1YmxpYyBCdXR0b24gZ2V0UmVtb3ZlQnV0dG9uKCkgewotCQlyZXR1cm4gcmVtb3ZlQnV0dG9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1RhYmxlT2JqZWN0cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9UYWJsZU9iamVjdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4MGQwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1RhYmxlT2JqZWN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMy8xOS8yMDAxIDU6MTA6MTQgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlT2JqZWN0cyB7Ci0JcHVibGljIExpc3QgdGFibGVPYmplY3RzTGlzdDsKLQotCS8qKgotCSAqIEVKQnMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVGFibGVPYmplY3RzKCkgewotCQlzdXBlcigpOwotCQl0YWJsZU9iamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlT2JqZWN0cygpIHsKLQkJcmV0dXJuIHRhYmxlT2JqZWN0c0xpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExpc3QoKSB7Ci0JCWlmICh0YWJsZU9iamVjdHNMaXN0ID09IG51bGwpCi0JCQl0YWJsZU9iamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1dpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjgxYjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQGF1dGhvciBTYWNoaW4KLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCUNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGltcG9ydEZyb21EaXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBpbXBvcnRGcm9tWmlwOwotCi0JcHJpdmF0ZSBMaXN0IGRyYWdBbmREcm9wRmlsZU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBXaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5maWxlU3lzdGVtVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQuaW1wb3J0RmlsZVN5c3RlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImltcG9ydF9jbGFzc19maWxlX3dpel9iYW4iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSwgTGlzdCBmaWxlTmFtZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLmZpbGVTeXN0ZW1UaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRmlsZUltcG9ydC5pbXBvcnRGaWxlU3lzdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaW1wb3J0X2NsYXNzX2ZpbGVfd2l6X2JhbiIpKTsgLy8kTk9OLU5MUy0xJAotCQlkcmFnQW5kRHJvcEZpbGVOYW1lcyA9IGZpbGVOYW1lczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfQ0xBU1NfV0laQVJEX1AxKTsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCUNvbXBvc2l0ZSBhQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJYUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWFDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlhQ29tcG9zaXRlLnNldFNpemUoYUNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQkJYUNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQljcmVhdGVJbXBvcnRUeXBlR3JvdXAoYUNvbXBvc2l0ZSk7Ci0JCXNldENvbnRyb2woYUNvbXBvc2l0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSW1wb3J0VHlwZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGltcG9ydFR5cGVHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW1wb3J0VHlwZUdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlpbXBvcnRUeXBlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCS8vaW1wb3J0VHlwZUdyb3VwLnNldFRleHQoV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJXaXphcmRFeHBvcnRQYWdlLm9wdGlvbnMiKSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlXaXphcmQgd2l6ID0gZ2V0V2l6YXJkKCk7Ci0JCQkJaWYgKCgoQ2xhc3Nlc0ltcG9ydFdpemFyZCkgd2l6KS5wYWdlMSAhPSBudWxsKSB7Ci0JCQkJCSgoQ2xhc3Nlc0ltcG9ydFdpemFyZCkgd2l6KS5wYWdlMS5ibGFua1BhZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWltcG9ydEZyb21EaXIgPSBuZXcgQnV0dG9uKGltcG9ydFR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJaW1wb3J0RnJvbURpci5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDbGFzc2VzSW1wb3J0LmZyb21EaXIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW1wb3J0RnJvbURpci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJaW1wb3J0RnJvbVppcCA9IG5ldyBCdXR0b24oaW1wb3J0VHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpbXBvcnRGcm9tWmlwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsYXNzZXNJbXBvcnQuZnJvbVppcCIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbXBvcnRGcm9tWmlwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQlJV2l6YXJkIHdpeiA9IGdldFdpemFyZCgpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCQlpZiAoKChDbGFzc2VzSW1wb3J0V2l6YXJkKSB3aXopLmZpbGVOYW1lcyAhPSBudWxsKQotCQkJZmlsZU5hbWUgPSAoKENsYXNzZXNJbXBvcnRXaXphcmQpIHdpeikuZmlsZU5hbWVzLmdldCgwKS50b1N0cmluZygpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCAmJiAoZmlsZU5hbWUuZW5kc1dpdGgoIi56aXAiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWltcG9ydEZyb21EaXIuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWltcG9ydEZyb21aaXAuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9IGVsc2UgewotCQkJaW1wb3J0RnJvbURpci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlpbXBvcnRGcm9tWmlwLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NldEltcG9ydEZyb21EaXIoKSB7Ci0JCWlmIChpbXBvcnRGcm9tRGlyICE9IG51bGwpCi0JCQlyZXR1cm4gaW1wb3J0RnJvbURpci5nZXRTZWxlY3Rpb24oKTsKLQotCQlTdHJpbmcgZmlsZU5hbWUgPSBkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoMCkudG9TdHJpbmcoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwgJiYgKGZpbGVOYW1lLmVuZHNXaXRoKCIuemlwIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvV2l6YXJkQ2xhc3Nlc0ltcG9ydFBhZ2UxLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1dpemFyZENsYXNzZXNJbXBvcnRQYWdlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTliYjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvV2l6YXJkQ2xhc3Nlc0ltcG9ydFBhZ2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWxlU3lzdGVtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZFJlc291cmNlSW1wb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkRpYWxvZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuSUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuUmVzb3VyY2VUcmVlQW5kTGlzdEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaFZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5aaXBGaWxlU3RydWN0dXJlUHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBQYWdlIDEgb2YgdGhlIGJhc2UgcmVzb3VyY2UgaW1wb3J0LWZyb20tZmlsZS1zeXN0ZW0gV2l6YXJkCi0gKi8KLS8qIHBhY2thZ2UgKi8KLWNsYXNzIFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMSBleHRlbmRzIFdpemFyZFJlc291cmNlSW1wb3J0UGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCS8vIHdpZGdldHMKLQlwcm90ZWN0ZWQgQ29tYm8gc291cmNlTmFtZUZpZWxkOwotCXByb3RlY3RlZCBCdXR0b24gb3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZU9ubHlTZWxlY3RlZEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHNvdXJjZUJyb3dzZUJ1dHRvbjsKLQkvL3Byb3RlY3RlZCBCdXR0b24gc2VsZWN0VHlwZXNCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQkvL0EgYm9vbGVhbiB0byBpbmRpY2F0ZSBpZiB0aGUgdXNlciBoYXMgdHlwZWQgYW55dGhpbmcKLQlwcml2YXRlIGJvb2xlYW4gZW50cnlDaGFuZ2VkID0gZmFsc2U7Ci0KLQkvLyBkaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX1NPVVJDRV9OQU1FU19JRCA9ICJXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9TT1VSQ0VfTkFNRVNfSUQiOyAvLyROT04tTkxTLTEkCi0JLy8kTk9OLU5MUy0xJAotCS8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX09WRVJXUklURV9FWElTVElOR19SRVNPVVJDRVNfSUQgPQotCS8vICJXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9PVkVSV1JJVEVfRVhJU1RJTkdfUkVTT1VSQ0VTX0lEIjsgLy8kTk9OLU5MUy0xJAotCS8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9DUkVBVEVfQ09OVEFJTkVSX1NUUlVDVFVSRV9JRCA9Ci0JLy8gIldpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUltcG9ydFBhZ2UxLlNUT1JFX0NSRUFURV9DT05UQUlORVJfU1RSVUNUVVJFX0lEIjsgLy8kTk9OLU5MUy0xJAotCS8vJE5PTi1OTFMtMSQKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9UWVBFU19USVRMRSA9ICJEYXRhVHJhbnNmZXIuc2VsZWN0VHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9BTExfVElUTEUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLnNlbGVjdEFsbCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0VMRUNUX0FMTF9USVRMRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEYXRhVHJhbnNmZXIuZGVzZWxlY3RBbGwiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU09VUkNFX01FU1NBR0UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRmlsZUltcG9ydC5zZWxlY3RTb3VyY2UiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9FTVBUWV9NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQuc291cmNlRW1wdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJUGF0aCBpbXBvcnRlZENsYXNzZXNQYXRoOwotCS8vcHJvdGVjdGVkIEJ1dHRvbiBpbXBvcnRGcm9tRGlyOwotCS8vcHJvdGVjdGVkIEJ1dHRvbiBpbXBvcnRGcm9tWmlwOwotCi0KLQlwcml2YXRlIFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlckNhY2hlOwotCVppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBjdXJyZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9JTVBPUlRfTUFTSyA9ICIqLmphcjsqLnppcCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCBkcmFnQW5kRHJvcEZpbGVOYW1lcyA9IG51bGw7Ci0KLQlib29sZWFuIGNyZWF0ZUZ1bGxTdHJ1Y3R1cmUgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlQmFzZURpck5hbWUgPSBudWxsOwotCi0JLy9wcml2YXRlIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHRlc3QgPSBudWxsOwotCi0JLy9wcml2YXRlIENvbXBvc2l0ZSBkdW1teVBhcmVudCA9IG51bGw7Ci0KLQkvL3ByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9XSURUSCA9IDQwMDsKLQkvL3ByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9IRUlHSFQgPSAxNTA7Ci0KLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlRGlyU3RydWMgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JICovCi0JcHJvdGVjdGVkIFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMShTdHJpbmcgbmFtZSwgSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIobmFtZSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gYVdvcmtiZW5jaAotCSAqICAgICAgICAgICAgSVdvcmtiZW5jaAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JICovCi0JcHVibGljIFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMShJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVBhdGggaW1wb3J0ZWRDbGFzc2VzUGF0aCwgTGlzdCBmaWxlTmFtZXMpIHsKLQkJdGhpcygiZmlsZVN5c3RlbUltcG9ydFBhZ2UxIiwgYVdvcmtiZW5jaCwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLmZpbGVTeXN0ZW1UaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRmlsZUltcG9ydC5pbXBvcnRGaWxlU3lzdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaW1wb3J0X2NsYXNzX2ZpbGVfd2l6X2JhbiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmltcG9ydGVkQ2xhc3Nlc1BhdGggPSBpbXBvcnRlZENsYXNzZXNQYXRoOwotCQlpZiAoZmlsZU5hbWVzICE9IG51bGwgJiYgZmlsZU5hbWVzLnNpemUoKSAhPSAwKSB7Ci0JCQlkcmFnQW5kRHJvcEZpbGVOYW1lcyA9IGZpbGVOYW1lczsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGJsYW5rUGFnZSgpIHsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uR3JvdXAgIT0gbnVsbCkKLQkJCXRoaXMuc2VsZWN0aW9uR3JvdXAuc2V0Um9vdChudWxsKTsKLQkJaWYgKHNvdXJjZU5hbWVGaWVsZCAhPSBudWxsKQotCQkJc291cmNlTmFtZUZpZWxkLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZVNlbGVjdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvL0p1c3QgY3JlYXRlIHdpdGggYSBkdW1teSByb290LgotCQl0aGlzLnNlbGVjdGlvbkdyb3VwID0gbmV3IFJlc291cmNlVHJlZUFuZExpc3RHcm91cChwYXJlbnQsIG5ldyBGaWxlU3lzdGVtRWxlbWVudCgiRHVtbXkiLCBudWxsLCB0cnVlKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRGb2xkZXJQcm92aWRlcigpLCBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBnZXRGaWxlUHJvdmlkZXIoKSwKLQkJCQkJLy9uZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlckZvckNsYXNzSW1wb3J0KCksCi0JCQkJCW5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIFNXVC5OT05FLCBEaWFsb2dVdGlsLmluUmVndWxhckZvbnRNb2RlKHBhcmVudCkpOwotCi0JCUlDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotCQkJfQotCQl9OwotCi0JCVdvcmtiZW5jaFZpZXdlclNvcnRlciBzb3J0ZXIgPSBuZXcgV29ya2JlbmNoVmlld2VyU29ydGVyKCk7Ci0JCXRoaXMuc2VsZWN0aW9uR3JvdXAuc2V0VHJlZVNvcnRlcihzb3J0ZXIpOwotCQl0aGlzLnNlbGVjdGlvbkdyb3VwLnNldExpc3RTb3J0ZXIoc29ydGVyKTsKLQkJdGhpcy5zZWxlY3Rpb25Hcm91cC5hZGRDaGVja1N0YXRlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnV0dG9uIHdpdGggdGhlIGdpdmVuIGlkLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBjcmVhdGVzIGEgc3RhbmRhcmQgcHVzaAotCSAqIGJ1dHRvbiwgcmVnaXN0ZXJzIGZvciBzZWxlY3Rpb24gZXZlbnRzIGluY2x1ZGluZyBidXR0b24gcHJlc3NlcyBhbmQgcmVnaXN0ZXJzIGRlZmF1bHQgYnV0dG9ucwotCSAqIHdpdGggaXRzIHNoZWxsLiBUaGUgYnV0dG9uIGlkIGlzIHN0b3JlZCBhcyB0aGUgYnV0dG9ucyBjbGllbnQgZGF0YS4gTm90ZSB0aGF0IHRoZSBwYXJlbnQncwotCSAqIGxheW91dCBpcyBhc3N1bWVkIHRvIGJlIGEgR3JpZExheW91dCBhbmQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoaXMgbGF5b3V0IGlzIGluY3JlbWVudGVkLgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBidXR0b24gKHNlZSA8Y29kZT5JRGlhbG9nQ29uc3RhbnRzLipfSUQ8L2NvZGU+IGNvbnN0YW50cyBmb3IKLQkgKiAgICAgICAgICAgIHN0YW5kYXJkIGRpYWxvZyBidXR0b24gaWRzKQotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIGZyb20gdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBkZWZhdWx0QnV0dG9uCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnV0dG9uIGlzIHRvIGJlIHRoZSBkZWZhdWx0IGJ1dHRvbiwgYW5kCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGlkLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gZGVmYXVsdEJ1dHRvbikgewotCQkvLyBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBidXR0b24gYmFyCi0JCSgoR3JpZExheW91dCkgcGFyZW50LmdldExheW91dCgpKS5udW1Db2x1bW5zKys7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0KLQkJR3JpZERhdGEgYnV0dG9uRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25EYXRhKTsKLQotCQlidXR0b24uc2V0RGF0YShuZXcgSW50ZWdlcihpZCkpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLQkJaWYgKGRlZmF1bHRCdXR0b24pIHsKLQkJCVNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQkJCX0KLQkJCWJ1dHRvbi5zZXRGb2N1cygpOwotCQl9Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgYnV0dG9ucyBmb3Igc2VsZWN0aW5nIHNwZWNpZmljIHR5cGVzIG9yIHNlbGVjdGluZyBhbGwgb3Igbm9uZSBvZiB0aGUgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlQnV0dG9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gdG9wIGxldmVsIGdyb3VwCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIHR5cGVzIGVkaXQgYnV0dG9uCi0JCS8vCQlzZWxlY3RUeXBlc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIElEaWFsb2dDb25zdGFudHMuU0VMRUNUX1RZUEVTX0lELAotCQkvLyBTRUxFQ1RfVFlQRVNfVElUTEUsIGZhbHNlKTsKLQotCQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLwkJCQloYW5kbGVUeXBlc0VkaXRCdXR0b25QcmVzc2VkKCk7Ci0JCQkvLwkJCX0KLQkJfTsKLQkJLy8JCXNlbGVjdFR5cGVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBJRGlhbG9nQ29uc3RhbnRzLlNFTEVDVF9BTExfSUQsIFNFTEVDVF9BTExfVElUTEUsIGZhbHNlKTsKLQotCQlsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldEFsbFNlbGVjdGlvbnModHJ1ZSk7Ci0JCQl9Ci0JCX07Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBJRGlhbG9nQ29uc3RhbnRzLkRFU0VMRUNUX0FMTF9JRCwgREVTRUxFQ1RfQUxMX1RJVExFLCBmYWxzZSk7Ci0KLQkJbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRBbGxTZWxlY3Rpb25zKGZhbHNlKTsKLQkJCX0KLQkJfTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX0NMQVNTX1dJWkFSRF9QMik7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQljb21wb3NpdGUuc2V0U2l6ZShjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCS8vZHVtbXlQYXJlbnQgPSBjb21wb3NpdGU7Ci0KLQkJY3JlYXRlU291cmNlR3JvdXAoY29tcG9zaXRlKTsKLQotCQkvL2NyZWF0ZVNwYWNlcihjb21wb3NpdGUpOwotCi0JCS8vY3JlYXRlUGxhaW5MYWJlbChjb21wb3NpdGUsCi0JCS8vIFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiV2l6YXJkSW1wb3J0UGFnZS5kZXN0aW5hdGlvbkxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCS8vY3JlYXRlRGVzdGluYXRpb25Hcm91cChjb21wb3NpdGUpOwotCi0JCWNyZWF0ZU9wdGlvbnNHcm91cChjb21wb3NpdGUpOwotCi0JCXJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKLQkJdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGRldGVybWluZVBhZ2VDb21wbGV0aW9uKCkpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQl2YWxpZGF0ZVNvdXJjZUdyb3VwKCk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKGdldENvbnRyb2woKSwKLQkJLy8gSURhdGFUcmFuc2ZlckhlbHBDb250ZXh0SWRzLkZJTEVfU1lTVEVNX0lNUE9SVF9XSVpBUkRfUEFHRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIG9wdGlvbnNHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlT3B0aW9uc0dyb3VwQnV0dG9ucyhvcHRpb25zR3JvdXApOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpbXBvcnQgb3B0aW9ucyBzcGVjaWZpY2F0aW9uIHdpZGdldHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0dyb3VwQnV0dG9ucyhDb21wb3NpdGUgb3B0aW9uc0dyb3VwKSB7Ci0KLQkJLy8gb3ZlcndyaXRlLi4uIGNoZWNrYm94Ci0JCW92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJb3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJGaWxlSW1wb3J0Lm92ZXJ3cml0ZUV4aXN0aW5nIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXRJbXBvcnRGcm9tRGlyKCkgewotCQlDbGFzc2VzSW1wb3J0V2l6YXJkIGNpdyA9IChDbGFzc2VzSW1wb3J0V2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJcmV0dXJuIGNpdy5tYWluUGFnZS5pc1NldEltcG9ydEZyb21EaXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzRmlsZURpcmVjdG9yeShTdHJpbmcgcykgewotCQlpbnQgaW5kZXggPSBzLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCXJldHVybiBzLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZ3JvdXAgZm9yIGNyZWF0aW5nIHRoZSByb290IGRpcmVjdG9yeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJvb3REaXJlY3RvcnlHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBzb3VyY2VDb250YWluZXJHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlzb3VyY2VDb250YWluZXJHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc291cmNlQ29udGFpbmVyR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLQkJbmV3IExhYmVsKHNvdXJjZUNvbnRhaW5lckdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dChnZXRTb3VyY2VMYWJlbCgpKTsKLQotCQkvLyBzb3VyY2UgbmFtZSBlbnRyeSBmaWVsZAotCQlzb3VyY2VOYW1lRmllbGQgPSBuZXcgQ29tYm8oc291cmNlQ29udGFpbmVyR3JvdXAsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCXNvdXJjZU5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXNldFNvdXJjZU5hbWVGaWVsZEZvckRyYWdBbmREcm9wKCk7Ci0KLQkJc291cmNlTmFtZUZpZWxkLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCXNvdXJjZU5hbWVGaWVsZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVGcm9tU291cmNlRmllbGQoKTsKLQotCQkJfQotCQl9KTsKLQotCQlzb3VyY2VOYW1lRmllbGQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJLyoKLQkJCSAqIEBzZWUgS2V5TGlzdGVuZXIua2V5UHJlc3NlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkvL0lmIHRoZXJlIGhhcyBiZWVuIGEga2V5IHByZXNzZWQgdGhlbiBtYXJrIGFzIGRpcnR5Ci0JCQkJZW50cnlDaGFuZ2VkID0gdHJ1ZTsKLQotCQkJfQotCi0JCQkvKgotCQkJICogQHNlZSBLZXlMaXN0ZW5lci5rZXlSZWxlYXNlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJLy9kbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCi0JCXNvdXJjZU5hbWVGaWVsZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgewotCQkJLyoKLQkJCSAqIEBzZWUgRm9jdXNMaXN0ZW5lci5mb2N1c0dhaW5lZChGb2N1c0V2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkvL0RvIG5vdGhpbmcgd2hlbiBnZXR0aW5nIGZvY3VzCi0JCQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzICE9IG51bGwpIHsKLQkJCQkJc291cmNlTmFtZUZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQotCQkJfQotCi0JCQkvKgotCQkJICogQHNlZSBGb2N1c0xpc3RlbmVyLmZvY3VzTG9zdChGb2N1c0V2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJLy9DbGVhciB0aGUgZmxhZyB0byBwcmV2ZW50IGNvbnN0YW50IHVwZGF0ZQotCQkJCWlmIChlbnRyeUNoYW5nZWQpIHsKLQotCQkJCQllbnRyeUNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJdXBkYXRlRnJvbVNvdXJjZUZpZWxkKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCi0JCS8vIHNvdXJjZSBicm93c2UgYnV0dG9uCi0JCXNvdXJjZUJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oc291cmNlQ29udGFpbmVyR3JvdXAsIFNXVC5QVVNIKTsKLQkJc291cmNlQnJvd3NlQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5icm93c2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc291cmNlQnJvd3NlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlzb3VyY2VCcm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzICE9IG51bGwpIHsKLQkJCXNvdXJjZUJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNvdXJjZU5hbWVGaWVsZEZvckRyYWdBbmREcm9wKCkgewotCQlpZiAoZHJhZ0FuZERyb3BGaWxlTmFtZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gKFN0cmluZykgKGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldCgwKSk7Ci0JCQlzb3VyY2VOYW1lRmllbGQuc2V0VGV4dChmaWxlTmFtZSk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCQlpZiAoZi5pc0ZpbGUoKSkgewotCQkJCWlmIChJbXBvcnRVdGlsLmdldEV4dGVuc2lvbihmKS5lcXVhbHMoInppcCIpIHx8IEltcG9ydFV0aWwuZ2V0RXh0ZW5zaW9uKGYpLmVxdWFscygiamFyIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS8vaW1wb3J0RnJvbVppcC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCS8vaW1wb3J0RnJvbURpci5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0gZWxzZSBpZiAoSW1wb3J0VXRpbC5nZXRFeHRlbnNpb24oZikuZXF1YWxzKCJjbGFzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc291cmNlTmFtZUZpZWxkLnNldFRleHQoZ2V0Q2xhc3NGaWxlRGlyZWN0b3J5KGZpbGVOYW1lKSk7Ci0KLQkJCQkJLy9nZXQgY29tLmlibS5hYmMuQ2xhc3NOYW1lCi0JCQkJCVBhY2thZ2VOYW1lUmVzb2x2ZXIgbmFtZVJlc29sdmVyID0gbmV3IFBhY2thZ2VOYW1lUmVzb2x2ZXIoKTsKLQkJCQkJU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSA9IG5hbWVSZXNvbHZlci5nZXRDbGFzc05hbWUoZmlsZU5hbWUpOwotCQkJCQlpZiAocXVhbGlmaWVkQ2xhc3NOYW1lICE9IG51bGwpIHsKLQotCQkJCQkJLy9nZXQgY29tCi0JCQkJCQlpbnQgaW5kZXggPSBxdWFsaWZpZWRDbGFzc05hbWUuaW5kZXhPZignLicpOwotCQkJCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJCQkJU3RyaW5nIHRleHRUb1NldCA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCAxICsgZmlsZU5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQkJCQkJc291cmNlTmFtZUZpZWxkLnNldFRleHQodGV4dFRvU2V0KTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgYmFzZURpciA9IHF1YWxpZmllZENsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0JCQkJCQkvL2dldCBjb20uaWJtLmFiYwotCQkJCQkJaW5kZXggPSBxdWFsaWZpZWRDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHF1YWxpZmllZENsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQkJLy9nZXQgY29tL2libS9hYmMKLQkJCQkJCXBhY2thZ2VEaXJTdHJ1YyA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCQkJCQkvL2dldCBDOlxjb20KLQkJCQkJCWluZGV4ID0gZmlsZU5hbWUuaW5kZXhPZihiYXNlRGlyKTsKLQkJCQkJCS8vaWYgcGFja2FnZURpclN0dWMgZXhpc3RzIHRoZW4gc2V0IHRoZSBzb3VyY2VEaXIgdG8gY29tLCBlbHNlCi0JCQkJCQkvL3NldCB0aGUgZGlyZWN0b3J5IHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBjbGFzcwotCQkJCQkJaWYgKGZpbGVOYW1lLmluZGV4T2YocGFja2FnZURpclN0cnVjKSAhPSAtMSkgewotCQkJCQkJCWludCBiYXNlRGlyTGVuZ3RoID0gYmFzZURpci5sZW5ndGgoKTsKLQkJCQkJCQlTdHJpbmcgdGV4dFRvU2V0ID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4ICsgYmFzZURpckxlbmd0aCk7Ci0JCQkJCQkJaW5kZXggPSBwYWNrYWdlTmFtZS5pbmRleE9mKCcuJyk7Ci0JCQkJCQkJaWYgKGluZGV4ID09IC0xKQotCQkJCQkJCQlwYWNrYWdlQmFzZURpck5hbWUgPSBwYWNrYWdlTmFtZTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXBhY2thZ2VCYXNlRGlyTmFtZSA9IHBhY2thZ2VOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJCQkJCQlmID0gbmV3IEZpbGUodGV4dFRvU2V0KTsKLQkJCQkJCQlpZiAoZi5nZXRQYXJlbnQoKSAhPSBudWxsKQotCQkJCQkJCQlmID0gbmV3IEZpbGUoZi5nZXRQYXJlbnQoKSk7Ci0JCQkJCQkJdGV4dFRvU2V0ID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsgLy93YW50IHRvIHNldCB0aGUgcm9vdCBkaXJlY3RvcnkgdG8KLQkJCQkJCQkvLyBjb20ncyBwYXJlbnQKLQkJCQkJCQlzb3VyY2VOYW1lRmllbGQuc2V0VGV4dCh0ZXh0VG9TZXQpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHJlY2VpdmVyIGZyb20gdGhlIHNvdXJjZSBuYW1lIGZpZWxkLgotCSAqLwotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUZyb21Tb3VyY2VGaWVsZCgpIHsKLQotCQlzZXRTb3VyY2VOYW1lKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCQkvL1VwZGF0ZSBlbmFibGVtZW50cyB3aGVuIHRoaXMgaXMgc2VsZWN0ZWQKLQkJdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0gb2JqZWN0Ci0JICogbWVyaXRzIG9uZS4gVGhlIGNyaXRlcmlhIGZvciB0aGlzIGFyZTogQWxzbyBjcmVhdGUgdGhlIGNoaWxkcmVuLgotCSAqLwotCXByb3RlY3RlZCBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBjcmVhdGVSb290RWxlbWVudChPYmplY3QgZmlsZVN5c3RlbU9iamVjdCwgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWJvb2xlYW4gaXNDb250YWluZXIgPSBwcm92aWRlci5pc0ZvbGRlcihmaWxlU3lzdGVtT2JqZWN0KTsKLQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IHByb3ZpZGVyLmdldExhYmVsKGZpbGVTeXN0ZW1PYmplY3QpOwotCi0JCS8vIFVzZSBhbiBlbXB0eSBsYWJlbCBzbyB0aGF0IGRpc3BsYXkgb2YgdGhlIGVsZW1lbnQncyBmdWxsIG5hbWUKLQkJLy8gZG9lc24ndCBpbmNsdWRlIGEgY29uZnVzaW5nIGxhYmVsCi0JCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGR1bW15UGFyZW50ID0gbmV3IE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KCIiLCBudWxsLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlkdW1teVBhcmVudC5zZXRQb3B1bGF0ZWQoKTsKLQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgcmVzdWx0ID0gbmV3IE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KGVsZW1lbnRMYWJlbCwgZHVtbXlQYXJlbnQsIGlzQ29udGFpbmVyKTsKLQotCQlyZXN1bHQuc2V0UGFja2FnZUJhc2VEaXJOYW1lKHBhY2thZ2VCYXNlRGlyTmFtZSk7Ci0JCXJlc3VsdC5zZXRGaWxlU3lzdGVtT2JqZWN0KGZpbGVTeXN0ZW1PYmplY3QpOwotCi0JCS8vR2V0IHRoZSBmaWxlcyBmb3IgdGhlIGVsZW1lbnQgc28gYXMgdG8gYnVpbGQgdGhlIGZpcnN0IGxldmVsCi0JCXJlc3VsdC5nZXRGaWxlcyhwcm92aWRlcik7Ci0KLQkJcmV0dXJuIGR1bW15UGFyZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW1wb3J0IHNvdXJjZSBzcGVjaWZpY2F0aW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vY3JlYXRlSW1wb3J0VHlwZUdyb3VwKHBhcmVudCk7Ci0JCWNyZWF0ZVJvb3REaXJlY3RvcnlHcm91cChwYXJlbnQpOwotCQljcmVhdGVGaWxlU2VsZWN0aW9uR3JvdXAocGFyZW50KTsKLQotCQljcmVhdGVCdXR0b25zR3JvdXAocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgYnV0dG9uIGdyb3VwLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUJ1dHRvbkdyb3VwKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCS8vCQlzZWxlY3RUeXBlc0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjdXJyZW50bHkgZXhpc3RzIGFuZCBpcyB2YWxpZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVuc3VyZVNvdXJjZUlzVmFsaWQoKSB7Ci0JCWlmIChpc1NldEltcG9ydEZyb21EaXIoKSkgewotCQkJaWYgKGdldFNvdXJjZURpcmVjdG9yeSgpICE9IG51bGwgJiYgbmV3IEZpbGUoZ2V0U291cmNlRGlyZWN0b3J5TmFtZSgpKS5pc0RpcmVjdG9yeSgpKQotCQkJCXJldHVybiB0cnVlOwotCQkJZGlzcGxheUVycm9yRGlhbG9nKGdldFN0cmluZygiRmlsZUltcG9ydC5pbnZhbGlkU291cmNlIikpOyAvLyROT04tTkxTLTEkCi0JCQlzb3VyY2VOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlaaXBGaWxlIHNwZWNpZmllZEZpbGUgPSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKCk7Ci0KLQkJaWYgKHNwZWNpZmllZEZpbGUgPT0gbnVsbCkgewotCQkJZGlzcGxheUVycm9yRGlhbG9nKGdldFN0cmluZygiRmlsZUltcG9ydC5pbnZhbGlkU291cmNlIikpOyAvLyROT04tTkxTLTEkCi0JCQlzb3VyY2VOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gY2xvc2VaaXBGaWxlKHNwZWNpZmllZEZpbGUpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHBhc3NlZCBpbXBvcnQgb3BlcmF0aW9uLiBBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlSW1wb3J0T3BlcmF0aW9uKEltcG9ydE9wZXJhdGlvbiBvcCkgewotCQlpbml0aWFsaXplT3BlcmF0aW9uKG9wKTsKLQkJaWYgKGNyZWF0ZUZ1bGxTdHJ1Y3R1cmUpIHsKLQkJCW9wLnNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCW9wLnNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZShmYWxzZSk7Ci0JCX0KLQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWRpc3BsYXlFcnJvckRpYWxvZyhlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gb3AuZ2V0U3RhdHVzKCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksIGdldFN0cmluZygiRmlsZUltcG9ydC5pbXBvcnRQcm9ibGVtcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsLCAvLyBubyBzcGVjaWFsIG1lc3NhZ2UKLQkJCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBuZWVkIHRoZSBmb2xsb3dpbmcgcHJpdmF0ZSBzdHVmZiBqdXN0IGJlY2F1c2UgdGhlIERhdGFUcmFuc2Zlck1lc3NhZ2VzIGNsYXNzIGlzIG5vdCBwdWJsaWMhCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFID0gIm9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLm1lc3NhZ2VzIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy9wcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUkVTT1VSQ0VfQlVORExFKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIEZpbmlzaCBidXR0b24gd2FzIHByZXNzZWQuIFRyeSB0byBkbyB0aGUgcmVxdWlyZWQgd29yayBub3cgYW5kIGFuc3dlciBhIGJvb2xlYW4KLQkgKiBpbmRpY2F0aW5nIHN1Y2Nlc3MuIElmIGZhbHNlIGlzIHJldHVybmVkIHRoZW4gdGhlIHdpemFyZCB3aWxsIG5vdCBjbG9zZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7Ci0JCWlmICghZW5zdXJlU291cmNlSXNWYWxpZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWNsZWFyUHJvdmlkZXJDYWNoZSgpOwotCi0JCXNhdmVXaWRnZXRWYWx1ZXMoKTsKLQotCQlJdGVyYXRvciByZXNvdXJjZXNFbnVtID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotCQlMaXN0IGZpbGVTeXN0ZW1PYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAocmVzb3VyY2VzRW51bS5oYXNOZXh0KCkpIHsKLQkJCWZpbGVTeXN0ZW1PYmplY3RzLmFkZCgoKEZpbGVTeXN0ZW1FbGVtZW50KSByZXNvdXJjZXNFbnVtLm5leHQoKSkuZ2V0RmlsZVN5c3RlbU9iamVjdCgpKTsKLQkJfQotCi0JCWlmIChmaWxlU3lzdGVtT2JqZWN0cy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoZ2V0U291cmNlRGlyZWN0b3J5KCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBpbXBvcnRSZXNvdXJjZXMoZmlsZVN5c3RlbU9iamVjdHMpOwotCQkJfQotCQkJcmV0dXJuIGltcG9ydFJlc291cmNlc0Zyb21aaXAoZmlsZVN5c3RlbU9iamVjdHMpOwotCQl9Ci0KLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwgZ2V0U3RyaW5nKCJEYXRhVHJhbnNmZXIuaW5mb3JtYXRpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIkZpbGVJbXBvcnQubm9uZVNlbGVjdGVkIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb250ZW50IHByb3ZpZGVyIGZvciA8Y29kZT5GaWxlU3lzdGVtRWxlbWVudDwvY29kZT4gcyB0aGF0IHJldHVybnMgb25seSBmaWxlcyBhcwotCSAqIGNoaWxkcmVuLgotCSAqLwotCi0JcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldEZpbGVQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSB7Ci0JCQkJCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIG87Ci0JCQkJCWlmIChjdXJyZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnQuZ2V0RmlsZXMoY3VycmVudFByb3ZpZGVyKS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZWxlbWVudC5nZXRGaWxlcyhGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0UpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJT2JqZWN0W10gc3VwZXJPYmplY3RzID0gc3VwZXIuZ2V0RWxlbWVudHMoZWxlbWVudCk7Ci0JCQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzICE9IG51bGwgJiYgZ2V0U291cmNlRGlyZWN0b3J5KCkgIT0gbnVsbCkgewotCQkJCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBhbkVsZW1lbnQgPSBudWxsOwotCQkJCQlpbnQgbmV3T2JqZWN0c0luZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlck9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWFuRWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgc3VwZXJPYmplY3RzW2ldOwotCi0JCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgYW5FbGVtZW50LmdldEZpbGVTeXN0ZW1PYmplY3QoKTsKLQotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBkcmFnQW5kRHJvcEZpbGVOYW1lcy5zaXplKCk7IGsrKykgewotCQkJCQkJCWlmIChmaWxlLmdldEFic29sdXRlUGF0aCgpLmVxdWFscyhkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoaykpKSB7Ci0JCQkJCQkJCW5ld09iamVjdHNJbmRleCsrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAobmV3T2JqZWN0c0luZGV4ID4gMCkgewotCQkJCQkJT2JqZWN0W10gbmV3T2JqZWN0cyA9IG5ldyBPYmplY3RbbmV3T2JqZWN0c0luZGV4XTsKLQkJCQkJCW5ld09iamVjdHNJbmRleCA9IDA7Ci0KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYW5FbGVtZW50ID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBzdXBlck9iamVjdHNbaV07Ci0KLQkJCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgYW5FbGVtZW50LmdldEZpbGVTeXN0ZW1PYmplY3QoKTsKLQotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZHJhZ0FuZERyb3BGaWxlTmFtZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQkJaWYgKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldChrKSkpIHsKLQotCQkJCQkJCQkJbmV3T2JqZWN0c1tuZXdPYmplY3RzSW5kZXgrK10gPSBhbkVsZW1lbnQ7Ci0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG5ld09iamVjdHM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyT2JqZWN0czsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHJvb3QgRmlsZVN5c3RlbUVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5LXNwZWNpZmllZAotCSAqIHNvdXJjZS4gSWYgdGhpcyBGaWxlU3lzdGVtRWxlbWVudCBpcyBub3QgY3VycmVudGx5IGRlZmluZWQgdGhlbiBjcmVhdGUgYW5kIHJldHVybiBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZ2V0RmlsZVN5c3RlbVRyZWUoKSB7Ci0JCWlmIChpc1NldEltcG9ydEZyb21EaXIoKSkgewotCQkJRmlsZSBzb3VyY2VEaXJlY3RvcnkgPSBnZXRTb3VyY2VEaXJlY3RvcnkoKTsKLQkJCWlmIChzb3VyY2VEaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiBzZWxlY3RGaWxlcyhzb3VyY2VEaXJlY3RvcnksIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlpZiAoc291cmNlTmFtZUZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkaXNwbGF5RXJyb3JEaWFsb2coZ2V0U3RyaW5nKCJGaWxlSW1wb3J0LmludmFsaWRTb3VyY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzb3VyY2VOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVppcEZpbGUgc291cmNlRmlsZSA9IGdldFNwZWNpZmllZFNvdXJjZUZpbGUoKTsKLQkJaWYgKHNvdXJjZUZpbGUgPT0gbnVsbCkgewotCQkJLy9DbGVhciBvdXQgdGhlIHByb3ZpZGVyIGFzIHdlbGwKLQkJCXRoaXMuY3VycmVudFByb3ZpZGVyID0gbnVsbDsKLQkJCWlmIChzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJCWRpc3BsYXlFcnJvckRpYWxvZyhnZXRTdHJpbmcoIkZpbGVJbXBvcnQuaW52YWxpZFNvdXJjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRTdHJ1Y3R1cmVQcm92aWRlcihzb3VyY2VGaWxlKTsKLQkJdGhpcy5jdXJyZW50UHJvdmlkZXIgPSBwcm92aWRlcjsKLQkJcmV0dXJuIHNlbGVjdEZpbGVzKHByb3ZpZGVyLmdldFJvb3QoKSwgcHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb250ZW50IHByb3ZpZGVyIGZvciA8Y29kZT5GaWxlU3lzdGVtRWxlbWVudDwvY29kZT4gcyB0aGF0IHJldHVybnMgb25seSBmb2xkZXJzCi0JICogYXMgY2hpbGRyZW4uCi0JICovCi0JcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldEZvbGRlclByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJCWlmIChvIGluc3RhbmNlb2YgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHsKLQkJCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgbzsKLQkJCQkJaWYgKGN1cnJlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudC5nZXRGb2xkZXJzKGN1cnJlbnRQcm92aWRlcikuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGVsZW1lbnQuZ2V0Rm9sZGVycyhGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0UpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSB7Ci0JCQkJCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIG87Ci0JCQkJCWlmIChlbGVtZW50LmlzUG9wdWxhdGVkKCkpCi0JCQkJCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQkJCQkJLy9JZiB3ZSBoYXZlIG5vdCBwb3B1bGF0ZWQgdGhlbiB3YWl0IHVudGlsIGFza2VkCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50bHktbmFtZWQgc291cmNlIGRpcmVjdG9yeSBpZmYgaXQgZXhpc3RzIGFzIGEKLQkgKiB2YWxpZCBkaXJlY3RvcnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRmlsZSBnZXRTb3VyY2VEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VEaXJlY3RvcnkodGhpcy5zb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50bHktbmFtZWQgc291cmNlIGRpcmVjdG9yeSBpZmYgaXQgZXhpc3RzIGFzIGEKLQkgKiB2YWxpZCBkaXJlY3RvcnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBTdHJpbmcgbm90IHlldCBmb3JtYXR0ZWQgZm9yIGphdmEuaW8uRmlsZSBjb21wYXRhYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSBGaWxlIGdldFNvdXJjZURpcmVjdG9yeShTdHJpbmcgcGF0aCkgewotCQlpZiAoaXNTZXRJbXBvcnRGcm9tRGlyKCkpIHsKLQkJCUZpbGUgc291cmNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoZ2V0U291cmNlRGlyZWN0b3J5TmFtZShwYXRoKSk7Ci0JCQlpZiAoIXNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSB8fCAhc291cmNlRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIHNvdXJjZURpcmVjdG9yeTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGRpcmVjdG9yeSBuYW1lIHNwZWNpZmllZCBhcyBiZWluZyB0aGUgaW1wb3J0IHNvdXJjZS4gTm90ZSB0aGF0IGlmIGl0IGVuZHMgd2l0aCBhCi0JICogc2VwYXJhdG9yIHRoZW4gdGhlIHNlcGFyYXRvciBpcyBmaXJzdCByZW1vdmVkIHNvIHRoYXQgamF2YSB0cmVhdHMgaXQgYXMgYSBwcm9wZXIgZGlyZWN0b3J5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlRGlyZWN0b3J5TmFtZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZURpcmVjdG9yeU5hbWUodGhpcy5zb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGRpcmVjdG9yeSBuYW1lIHNwZWNpZmllZCBhcyBiZWluZyB0aGUgaW1wb3J0IHNvdXJjZS4gTm90ZSB0aGF0IGlmIGl0IGVuZHMgd2l0aCBhCi0JICogc2VwYXJhdG9yIHRoZW4gdGhlIHNlcGFyYXRvciBpcyBmaXJzdCByZW1vdmVkIHNvIHRoYXQgamF2YSB0cmVhdHMgaXQgYXMgYSBwcm9wZXIgZGlyZWN0b3J5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlRGlyZWN0b3J5TmFtZShTdHJpbmcgc291cmNlTmFtZSkgewotCQlJUGF0aCByZXN1bHQgPSBuZXcgUGF0aChzb3VyY2VOYW1lLnRyaW0oKSk7Ci0KLQkJaWYgKHJlc3VsdC5nZXREZXZpY2UoKSAhPSBudWxsICYmIHJlc3VsdC5zZWdtZW50Q291bnQoKSA9PSAwKSAvLyBzb21ldGhpbmcgbGlrZSAiYzoiCi0JCQlyZXN1bHQgPSByZXN1bHQuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gcmVzdWx0LnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdC50b09TU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBzdHJpbmcgdG8gZGlzcGxheSBhcyB0aGUgbGFiZWwgZm9yIHRoZSBzb3VyY2Ugc3BlY2lmaWNhdGlvbiBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlTGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLmRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSGFuZGxlIGFsbCBldmVudHMgYW5kIGVuYWJsZW1lbnRzIGZvciB3aWRnZXRzIGluIHRoaXMgZGlhbG9nCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gc291cmNlQnJvd3NlQnV0dG9uKSB7Ci0JCQlpZiAoaXNTZXRJbXBvcnRGcm9tRGlyKCkpIHsKLQkJCQloYW5kbGVTb3VyY2VCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9IGVsc2UgewotCQkJCWhhbmRsZVNvdXJjZUJyb3dzZUJ1dHRvblByZXNzZWRGb3JaaXAoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgc291cmNlIGJyb3dzZXIgc28gdGhhdCB0aGUgdXNlciBjYW4gc3BlY2lmeSBhIHNvdXJjZSB0byBpbXBvcnQgZnJvbQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNvdXJjZUJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCVN0cmluZyBjdXJyZW50U291cmNlID0gdGhpcy5zb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzb3VyY2VOYW1lRmllbGQuZ2V0U2hlbGwoKSwgU1dULlNBVkUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShTRUxFQ1RfU09VUkNFX01FU1NBR0UpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKGN1cnJlbnRTb3VyY2UpKTsKLQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJLy9KdXN0IHF1aXQgaWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgdmFsaWQKLQkJCWlmICgoZ2V0U291cmNlRGlyZWN0b3J5KHNlbGVjdGVkRGlyZWN0b3J5KSA9PSBudWxsKSB8fCBzZWxlY3RlZERpcmVjdG9yeS5lcXVhbHMoY3VycmVudFNvdXJjZSkpCi0JCQkJcmV0dXJuOwotCQkJLy9JZiBpdCBpcyB2YWxpZCB0aGVuIHByb2NlZWQgdG8gcG9wdWxhdGUKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXNldFNvdXJjZU5hbWUoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQkJc2VsZWN0aW9uR3JvdXAuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW4gYSByZWdpc3RlcmVkIHR5cGUgc2VsZWN0aW9uIGRpYWxvZyBhbmQgbm90ZSB0aGUgc2VsZWN0aW9ucyBpbiB0aGUgcmVjZWl2ZXJzCi0JICogdHlwZXMtdG8tZXhwb3J0IGZpZWxkLiwgQWRkZWQgaGVyZSBzbyB0aGF0IGlubmVyIGNsYXNzZXMgY2FuIGhhdmUgYWNjZXNzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVHlwZXNFZGl0QnV0dG9uUHJlc3NlZCgpIHsKLQotCQlzdXBlci5oYW5kbGVUeXBlc0VkaXRCdXR0b25QcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0IHRoZSByZXNvdXJjZXMgd2l0aCBleHRlbnNpb25zIGFzIHNwZWNpZmllZCBieSB0aGUgdXNlcgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGltcG9ydFJlc291cmNlcyhMaXN0IGZpbGVTeXN0ZW1PYmplY3RzKSB7Ci0JCUl0ZXJhdG9yIGkgPSBmaWxlU3lzdGVtT2JqZWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgZiA9IChGaWxlKSBpLm5leHQoKTsKLQkJCUxpc3Qgc2luZ2xlSXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzaW5nbGVJdGVtTGlzdC5hZGQoZik7Ci0JCQlTdHJpbmcgdGV4dFRvU2V0ID0gZ2V0UGFja2FnZU5hbWUoZik7Ci0JCQlpZiAodGV4dFRvU2V0ICE9IG51bGwpIHsKLQkJCQlGaWxlIG5ld1NvdXJjZSA9IG5ldyBGaWxlKHRleHRUb1NldCk7Ci0JCQkJZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihuZXcgSW1wb3J0T3BlcmF0aW9uKGdldENvbnRhaW5lckZ1bGxQYXRoKCksIG5ld1NvdXJjZSwgRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFLCB0aGlzLCBzaW5nbGVJdGVtTGlzdCkpOwotCQkJfSBlbHNlIHsKLQkJCQlleGVjdXRlSW1wb3J0T3BlcmF0aW9uKG5ldyBJbXBvcnRPcGVyYXRpb24oZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSwgZ2V0U291cmNlRGlyZWN0b3J5KCksIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwgdGhpcywgc2luZ2xlSXRlbUxpc3QpKTsKLQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZShGaWxlIGYpIHsKLQkJaWYgKEltcG9ydFV0aWwuZ2V0RXh0ZW5zaW9uKGYpLmVxdWFscygiY2xhc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZmlsZU5hbWUgPSBmLmdldEFic29sdXRlUGF0aCgpOwotCQkJLy9nZXQgY29tLmlibS5hYmMuQ2xhc3NOYW1lCi0JCQlQYWNrYWdlTmFtZVJlc29sdmVyIG5hbWVSZXNvbHZlciA9IG5ldyBQYWNrYWdlTmFtZVJlc29sdmVyKCk7Ci0JCQlTdHJpbmcgcXVhbGlmaWVkQ2xhc3NOYW1lID0gbmFtZVJlc29sdmVyLmdldENsYXNzTmFtZShmaWxlTmFtZSk7Ci0JCQlpZiAocXVhbGlmaWVkQ2xhc3NOYW1lICE9IG51bGwpIHsKLQotCQkJCS8vZ2V0IGNvbQotCQkJCWludCBpbmRleCA9IHF1YWxpZmllZENsYXNzTmFtZS5pbmRleE9mKCcuJyk7Ci0JCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgMSArIGZpbGVOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQkJCX0KLQkJCQlTdHJpbmcgYmFzZURpciA9IHF1YWxpZmllZENsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0JCQkJLy9nZXQgY29tLmlibS5hYmMKLQkJCQlpbmRleCA9IHF1YWxpZmllZENsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHF1YWxpZmllZENsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0JCQkJLy9nZXQgY29tL2libS9hYmMKLQkJCQlwYWNrYWdlRGlyU3RydWMgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQkJCS8vZ2V0IEM6XGNvbQotCQkJCWluZGV4ID0gZmlsZU5hbWUuaW5kZXhPZihiYXNlRGlyKTsKLQkJCQkvL2lmIHBhY2thZ2VEaXJTdHVjIGV4aXN0cyB0aGVuIHNldCB0aGUgc291cmNlRGlyIHRvIGNvbSwgZWxzZQotCQkJCS8vc2V0IHRoZSBkaXJlY3RvcnkgdG8gdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGNsYXNzCi0JCQkJaWYgKGZpbGVOYW1lLmluZGV4T2YocGFja2FnZURpclN0cnVjKSAhPSAtMSkgewotCQkJCQlpbnQgYmFzZURpckxlbmd0aCA9IGJhc2VEaXIubGVuZ3RoKCk7Ci0JCQkJCVN0cmluZyB0ZXh0VG9TZXQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyBiYXNlRGlyTGVuZ3RoKTsKLQkJCQkJaW5kZXggPSBwYWNrYWdlTmFtZS5pbmRleE9mKCcuJyk7Ci0JCQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQkJCXBhY2thZ2VCYXNlRGlyTmFtZSA9IHBhY2thZ2VOYW1lOwotCQkJCQllbHNlCi0JCQkJCQlwYWNrYWdlQmFzZURpck5hbWUgPSBwYWNrYWdlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0JCQkJCWYgPSBuZXcgRmlsZSh0ZXh0VG9TZXQpOwotCQkJCQlpZiAoZi5nZXRQYXJlbnQoKSAhPSBudWxsKQotCQkJCQkJZiA9IG5ldyBGaWxlKGYuZ2V0UGFyZW50KCkpOwotCQkJCQl0ZXh0VG9TZXQgPSBmLmdldEFic29sdXRlUGF0aCgpOyAvL3dhbnQgdG8gc2V0IHRoZSByb290IGRpcmVjdG9yeSB0byBjb20ncwotCQkJCQkvLyBwYXJlbnQKLQkJCQkJLy9zb3VyY2VOYW1lRmllbGQuc2V0VGV4dCh0ZXh0VG9TZXQpOwotCQkJCQlyZXR1cm4gdGV4dFRvU2V0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcGVyYXRpb24oSW1wb3J0T3BlcmF0aW9uIG9wKSB7Ci0KLQkJLyoKLQkJICogb3Auc2V0Q3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKCBjcmVhdGVDb250YWluZXJTdHJ1Y3R1cmVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkgKi8KLQkJb3Auc2V0T3ZlcndyaXRlUmVzb3VyY2VzKG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZXh0ZW5zaW9uIHByb3ZpZGVkIGlzIGFuIGV4dGVuc2lvbiB0aGF0IGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgZXhwb3J0IGJ5Ci0JICogdGhlIHVzZXIuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIG5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXNvdXJjZSBuYW1lIGlzIHN1aXRhYmxlIGZvciBleHBvcnQgYmFzZWQgdXBvbiBpdHMKLQkgKiAgICAgICAgIGV4dGVuc2lvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwb3J0YWJsZUV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWlmIChzZWxlY3RlZFR5cGVzID09IG51bGwpIC8vIGllLi0gYWxsIGV4dGVuc2lvbnMgYXJlIGFjY2VwdGFibGUKLQkJCXJldHVybiB0cnVlOwotCi0JCUl0ZXJhdG9yIGFlbnVtID0gc2VsZWN0ZWRUeXBlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoYWVudW0uaGFzTmV4dCgpKSB7Ci0JCQlpZiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgYWVudW0ubmV4dCgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcHVsYXRlIHRoZSB2aWV3IGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgZW50ZXJlZCBkaXJlY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRTZWxlY3Rpb24oKSB7Ci0KLQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgY3VycmVudFJvb3QgPSBnZXRGaWxlU3lzdGVtVHJlZSgpOwotCQl0aGlzLnNlbGVjdGlvbkdyb3VwLnNldFJvb3QoY3VycmVudFJvb3QpOwotCQlpZiAoZHJhZ0FuZERyb3BGaWxlTmFtZXMgIT0gbnVsbCkgewotCi0JCQlpZiAoZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi56aXAiKSA9PSBmYWxzZSAmJiBkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoMCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiLmphciIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXRoaXMuc2VsZWN0aW9uR3JvdXAuZXhwYW5kQWxsKCk7Ci0JCQl9Ci0KLQkJCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHRlbXAgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIGN1cnJlbnRSb290LmdldEZvbGRlcnMoKS5nZXRDaGlsZHJlbigpWzBdOwotCi0JCQlMaXN0IGRpckxpc3QgPSBwYXRoVG9BcnJheSgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIGRpckxpc3QuZ2V0KGkpOwotCQkJCU9iamVjdFtdIGZvbGRlcnMgPSB0ZW1wLmdldEZvbGRlcnMoKS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZm9sZGVycy5sZW5ndGg7IGsrKykgewotCQkJCQlpZiAoKChGaWxlKSAoKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBmb2xkZXJzW2tdKS5nZXRGaWxlU3lzdGVtT2JqZWN0KCkpLmdldE5hbWUoKS5lcXVhbHMocykpIHsKLQkJCQkJCXRlbXAgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHRlbXAuZ2V0Rm9sZGVycygpLmdldENoaWxkcmVuKClba107Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCi0JCQlpZiAoZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi56aXAiKSA9PSBmYWxzZSAmJiBkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoMCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiLmphciIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXRoaXMuc2VsZWN0aW9uR3JvdXAuaW5pdGlhbENoZWNrVHJlZUl0ZW0odGVtcCk7Ci0JCQl9Ci0KLQkJCS8vSWYgY2FuIGZpZ3VyZSBvdXQgaG93IHRvIHByZS1oaWdobGlnaHQgZGlyLCB0aGVuIHVzZSBmb2xsb3dpbmcgY29kZQotCQkJLy90byBjaGVjayBkcmFnZ2VkIGZpbGVzIG9ubHkuIEFsc28gbmVlZCB0byBzaG93IGFsbCBmaWxlcyBpbiB0cmVlLgotCQkJLyoKLQkJCSAqIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7IE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IG5hbWUgPSBudWxsOyBpbnQgbnVtRmlsZXMgPQotCQkJICogdGVtcC5nZXRGaWxlcygpLmdldENoaWxkcmVuKCkubGVuZ3RoOyBPYmplY3RbXSBmaWxlcyA9IHRlbXAuZ2V0RmlsZXMoKS5nZXRDaGlsZHJlbigpOwotCQkJICogZm9yKGludCBpID0gMDsgaSA8IGRyYWdBbmREcm9wRmlsZU5hbWVzLnNpemUoKTsgaSsrKSB7IGZpbGVOYW1lID0gKG5ldwotCQkJICogRmlsZSgoU3RyaW5nKWRyYWdBbmREcm9wRmlsZU5hbWVzLmdldChpKSkpLmdldE5hbWUoKTsgZm9yKGludCBrID0gMDsgayA8IG51bUZpbGVzOwotCQkJICogaysrKSB7IGlmKGZpbGVOYW1lLmVxdWFscygoKEZpbGUpICgoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpCi0JCQkgKiBmaWxlc1swXSkuZ2V0RmlsZVN5c3RlbU9iamVjdCgpKS5nZXROYW1lKCkpKSB7Ci0JCQkgKiB0aGlzLnNlbGVjdGlvbkdyb3VwLmluaXRpYWxDaGVja1RyZWVJdGVtKHRlbXApOyBicmVhazsgfSB9IH0KLQkJCSAqLwotCi0JCQkvL3RoaXMuc2VsZWN0aW9uR3JvdXAuc2V0QWxsU2VsZWN0aW9ucyh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBwYXRoVG9BcnJheSgpIHsKLQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoMCk7Ci0KLQkJUGFja2FnZU5hbWVSZXNvbHZlciBuYW1lUmVzb2x2ZXIgPSBuZXcgUGFja2FnZU5hbWVSZXNvbHZlcigpOwotCQlTdHJpbmcgcXVhbGlmaWVkQ2xhc3NOYW1lID0gbmFtZVJlc29sdmVyLmdldENsYXNzTmFtZShzKTsKLQotCQlpbnQgc2xhc2hDb3VudHMgPSAwOwotCQlpZiAocXVhbGlmaWVkQ2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IHF1YWxpZmllZENsYXNzTmFtZS5pbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQkJCVN0cmluZyBiYXNlRGlyID0gcXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQlmb3IgKGludCBpID0gcy5pbmRleE9mKGJhc2VEaXIpOyBpIDwgcy5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOyBpKyspIHsKLQkJCQlpZiAocy5jaGFyQXQoaSkgPT0gRmlsZS5zZXBhcmF0b3JDaGFyKQotCQkJCQlzbGFzaENvdW50cysrOwotCQkJfQotCQl9Ci0KLQkJTGlzdCBkaXJOYW1lc0FycmF5ID0gbmV3IEFycmF5TGlzdChzbGFzaENvdW50cyk7Ci0JCWlmIChzLmVuZHNXaXRoKCIuemlwIikgfHwgcy5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGRpck5hbWVzQXJyYXk7Ci0JCX0KLQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQlpbnQgZW5kSW5kZXg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDw9IHNsYXNoQ291bnRzOyBpKyspIHsKLQkJCWVuZEluZGV4ID0gcXVhbGlmaWVkQ2xhc3NOYW1lLmluZGV4T2YoJy4nLCBzdGFydEluZGV4KTsKLQkJCWRpck5hbWVzQXJyYXkuYWRkKHF1YWxpZmllZENsYXNzTmFtZS5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpKTsKLQkJCXN0YXJ0SW5kZXggPSBlbmRJbmRleCArIDE7Ci0JCX0KLQkJcmV0dXJuIGRpck5hbWVzQXJyYXk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBkaWFsb2cgc3RvcmUgdG8gcmVzdG9yZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSB2YWx1ZXMgdGhhdCB0aGV5IGhlbGQgbGFzdCB0aW1lIHRoaXMKLQkgKiB3aXphcmQgd2FzIHVzZWQgdG8gY29tcGxldGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX1NPVVJDRV9OQU1FU19JRCk7Ci0JCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGllLi0gbm8gdmFsdWVzIHN0b3JlZCwgc28gc3RvcAotCi0JCQkvLyBzZXQgZmlsZW5hbWVzIGhpc3RvcnkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspCi0JCQkJc291cmNlTmFtZUZpZWxkLmFkZChzb3VyY2VOYW1lc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSBGaW5pc2ggd2FzIHByZXNzZWQsIHdyaXRlIHdpZGdldCB2YWx1ZXMgdG8gdGhlIGRpYWxvZyBzdG9yZSBzbyB0aGF0IHRoZXkgd2lsbCBwZXJzaXN0Ci0JICogaW50byB0aGUgbmV4dCBpbnZvY2F0aW9uIG9mIHRoaXMgd2l6YXJkIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlV2lkZ2V0VmFsdWVzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJLy8gdXBkYXRlIHNvdXJjZSBuYW1lcyBoaXN0b3J5Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX1NPVVJDRV9OQU1FU19JRCk7Ci0JCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkKLQkJCQlzb3VyY2VOYW1lcyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkJCXNvdXJjZU5hbWVzID0gYWRkVG9IaXN0b3J5KHNvdXJjZU5hbWVzLCBnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKCkpOwotCQkJc2V0dGluZ3MucHV0KFNUT1JFX1NPVVJDRV9OQU1FU19JRCwgc291cmNlTmFtZXMpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnZva2VzIGEgZmlsZSBzZWxlY3Rpb24gb3BlcmF0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0gYW5kIHN0cnVjdHVyZSBwcm92aWRlci4gSWYKLQkgKiB0aGUgdXNlciBzcGVjaWZpZXMgZmlsZXMgdG8gYmUgaW1wb3J0ZWQgdGhlbiB0aGlzIHNlbGVjdGlvbiBpcyBjYWNoZWQgZm9yIGxhdGVyIHJldHJpZXZhbCBhbmQKLQkgKiBpcyByZXR1cm5lZC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgc2VsZWN0RmlsZXMoZmluYWwgT2JqZWN0IHJvb3RGaWxlU3lzdGVtT2JqZWN0LCBmaW5hbCBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIpIHsKLQotCQlmaW5hbCBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudFtdIHJlc3VsdHMgPSBuZXcgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnRbMV07Ci0KLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvL0NyZWF0ZSB0aGUgcm9vdCBlbGVtZW50IGZyb20gdGhlIHN1cHBsaWVkIGZpbGUgc3lzdGVtIG9iamVjdAotCQkJCXJlc3VsdHNbMF0gPSBjcmVhdGVSb290RWxlbWVudChyb290RmlsZVN5c3RlbU9iamVjdCwgc3RydWN0dXJlUHJvdmlkZXIpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0c1swXTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYWxsIG9mIHRoZSBzZWxlY3Rpb25zIGluIHRoZSBzZWxlY3Rpb24gZ3JvdXAgdG8gdmFsdWUuIEltcGxlbWVudGVkIGhlcmUgdG8gcHJvdmlkZSBhY2Nlc3MKLQkgKiBmb3IgaW5uZXIgY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBbGxTZWxlY3Rpb25zKGJvb2xlYW4gdmFsdWUpIHsKLQkJc3VwZXIuc2V0QWxsU2VsZWN0aW9ucyh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc291cmNlIG5hbWUgb2YgdGhlIGltcG9ydCB0byBiZSB0aGUgc3VwcGxpZWQgcGF0aC4gQWRkcyB0aGUgbmFtZSBvZiB0aGUgcGF0aCB0byB0aGUKLQkgKiBsaXN0IG9mIGl0ZW1zIGluIHRoZSBzb3VyY2UgY29tYm8gYW5kIHNlbGVjdHMgaXQuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIGJlIGFkZGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlTmFtZShTdHJpbmcgcGF0aCkgewotCi0JCWlmIChwYXRoLmxlbmd0aCgpID4gMCkgewotCi0JCQlTdHJpbmdbXSBjdXJyZW50SXRlbXMgPSB0aGlzLnNvdXJjZU5hbWVGaWVsZC5nZXRJdGVtcygpOwotCQkJaW50IHNlbGVjdGlvbkluZGV4ID0gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChjdXJyZW50SXRlbXNbaV0uZXF1YWxzKHBhdGgpKQotCQkJCQlzZWxlY3Rpb25JbmRleCA9IGk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0aW9uSW5kZXggPCAwKSB7Ci0JCQkJaW50IG9sZExlbmd0aCA9IGN1cnJlbnRJdGVtcy5sZW5ndGg7Ci0JCQkJU3RyaW5nW10gbmV3SXRlbXMgPSBuZXcgU3RyaW5nW29sZExlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudEl0ZW1zLCAwLCBuZXdJdGVtcywgMCwgb2xkTGVuZ3RoKTsKLQkJCQluZXdJdGVtc1tvbGRMZW5ndGhdID0gcGF0aDsKLQkJCQl0aGlzLnNvdXJjZU5hbWVGaWVsZC5zZXRJdGVtcyhuZXdJdGVtcyk7Ci0JCQkJc2VsZWN0aW9uSW5kZXggPSBvbGRMZW5ndGg7Ci0JCQl9Ci0JCQl0aGlzLnNvdXJjZU5hbWVGaWVsZC5zZWxlY3Qoc2VsZWN0aW9uSW5kZXgpOwotCi0JCQlyZXNldFNlbGVjdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSB0cmVlIHRvIG9ubHkgc2VsZWN0IHRob3NlIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdGVkIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBTZWxlY3Rpb25zQmFzZWRPblNlbGVjdGVkVHlwZXMoKSB7Ci0JCVByb2dyZXNzTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCkpOwotCQlmaW5hbCBNYXAgc2VsZWN0aW9uTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCWZpbmFsIElFbGVtZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJRWxlbWVudEZpbHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgZmlsdGVyRWxlbWVudHMoQ29sbGVjdGlvbiBmaWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlJdGVyYXRvciBmaWxlc0xpc3QgPSBmaWxlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChmaWxlc0xpc3QuaGFzTmV4dCgpKSB7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCQljaGVja0ZpbGUoZmlsZXNMaXN0Lm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmaWx0ZXJFbGVtZW50cyhPYmplY3RbXSBmaWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCQljaGVja0ZpbGUoZmlsZXNbaV0pOwotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIGNoZWNrRmlsZShPYmplY3QgZmlsZUVsZW1lbnQpIHsKLQkJCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBmaWxlID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBmaWxlRWxlbWVudDsKLQkJCQlpZiAoaXNFeHBvcnRhYmxlRXh0ZW5zaW9uKGZpbGUuZ2V0RmlsZU5hbWVFeHRlbnNpb24oKSkpIHsKLQkJCQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJRmlsZVN5c3RlbUVsZW1lbnQgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJCQkJaWYgKHNlbGVjdGlvbk1hcC5jb250YWluc0tleShwYXJlbnQpKQotCQkJCQkJZWxlbWVudHMgPSAoTGlzdCkgc2VsZWN0aW9uTWFwLmdldChwYXJlbnQpOwotCQkJCQllbGVtZW50cy5hZGQoZmlsZSk7Ci0JCQkJCXNlbGVjdGlvbk1hcC5wdXQocGFyZW50LCBlbGVtZW50cyk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soIkltcG9ydFBhZ2UuZmlsdGVyU2VsZWN0aW9ucyIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTZWxlY3RlZFJlc291cmNlcyhmaWx0ZXIsIG1vbml0b3IpOwotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlkaWFsb2cucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vQ291bGRuJ3Qgc3RhcnQuIERvIG5vdGhpbmcuCi0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy9Hb3QgaW50ZXJydXB0ZWQuIERvIG5vdGhpbmcuCi0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gbWFrZSBzdXJlIHRoYXQgYWxsIHBhaW50IG9wZXJhdGlvbnMgY2F1c2VkIGJ5IGNsb3NpbmcgdGhlIHByb2dyZXNzCi0JCS8vIGRpYWxvZyBnZXQgZmx1c2hlZCwgb3RoZXJ3aXNlIGV4dHJhIHBpeGVscyB3aWxsIHJlbWFpbiBvbiB0aGUgc2NyZWVuIHVudGlsCi0JCS8vIHVwZGF0ZVNlbGVjdGlvbnMgaXMgY29tcGxldGVkCi0JCWdldFNoZWxsKCkudXBkYXRlKCk7Ci0JCS8vIFRoZSB1cGRhdGVTZWxlY3Rpb25zIG1ldGhvZCBhY2Nlc3NlcyBTV1Qgd2lkZ2V0cyBzbyBjYW5ub3QgYmUgZXhlY3V0ZWQKLQkJLy8gYXMgcGFydCBvZiB0aGUgYWJvdmUgcHJvZ3Jlc3MgZGlhbG9nIG9wZXJhdGlvbiBzaW5jZSB0aGUgb3BlcmF0aW9uIGZvcmtzCi0JCS8vIGEgbmV3IHByb2Nlc3MuCi0JCWlmIChzZWxlY3Rpb25NYXAgIT0gbnVsbCkgewotCQkJdXBkYXRlU2VsZWN0aW9ucyhzZWxlY3Rpb25NYXApOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4gU2V0IHRoZSBzZWxlY3Rpb24gdXAgd2hlbiBpdCBiZWNvbWVzIHZpc2libGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJcmVzZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHZpc2libGUpCi0JCQl0aGlzLnNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9ucyB3aXRoIHRob3NlIGluIG1hcCAuIEltcGxlbWVudGVkIGhlcmUgdG8gZ2l2ZSBpbm5lciBjbGFzcyB2aXNpYmlsaXR5Ci0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgTWFwIC0ga2V5IHRyZWUgZWxlbWVudHMsIHZhbHVlcyBMaXN0cyBvZiBsaXN0IGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9ucyhNYXAgbWFwKSB7Ci0JCXN1cGVyLnVwZGF0ZVNlbGVjdGlvbnMobWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB3aWRnZXRzIGFyZSBlbmFibGVkIG9yIGRpc2FibGVkIGJ5IGEgY2hhbmdlIGluIHRoZSBkaWFsb2cuIFByb3ZpZGVkIGhlcmUgdG8gZ2l2ZQotCSAqIGFjY2VzcyB0byBpbm5lciBjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgRXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpIHsKLQotCQlzdXBlci51cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHNlbGYncyBzb3VyY2Ugc3BlY2lmaWNhdGlvbiB3aWRnZXRzIGN1cnJlbnRseSBhbGwgY29udGFpbgotCSAqIHZhbGlkIHZhbHVlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNvdXJjZUdyb3VwKCkgewotCQlpZiAoZ2V0U291cmNlRGlyZWN0b3J5KCkgIT0gbnVsbCkgewotCQkJRmlsZSBzb3VyY2VEaXJlY3RvcnkgPSBnZXRTb3VyY2VEaXJlY3RvcnkoKTsKLQkJCWlmIChzb3VyY2VEaXJlY3RvcnkgPT0gbnVsbCkgewotCQkJCXNldE1lc3NhZ2UoU09VUkNFX0VNUFRZX01FU1NBR0UpOwotCQkJCWVuYWJsZUJ1dHRvbkdyb3VwKGZhbHNlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChzb3VyY2VDb25mbGljdHNXaXRoRGVzdGluYXRpb24obmV3IFBhdGgoc291cmNlRGlyZWN0b3J5LmdldFBhdGgoKSkpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKGdldFNvdXJjZUNvbmZsaWN0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVuYWJsZUJ1dHRvbkdyb3VwKGZhbHNlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWVuYWJsZUJ1dHRvbkdyb3VwKHRydWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy9JZiB0aGVyZSBpcyBub3RoaW5nIGJlaW5nIHByb3ZpZGVkIHRvIHRoZSBpbnB1dCB0aGVuIHRoZXJlIGlzIGEgcHJvYmxlbQotCQlpZiAodGhpcy5jdXJyZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2V0TWVzc2FnZShTT1VSQ0VfRU1QVFlfTUVTU0FHRSk7Ci0JCQllbmFibGVCdXR0b25Hcm91cChmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZW5hYmxlQnV0dG9uR3JvdXAodHJ1ZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgc291cmNlIGxvY2F0aW9uIGNvbmZsaWN0cyB3aXRoIHRoZSBkZXN0aW5hdGlvbiByZXNvdXJjZS4gVGhpcyB3aWxsIG9jY3VyCi0JICogaWYgdGhlIHNvdXJjZSBpcyBhbHJlYWR5IHVuZGVyIHRoZSBkZXN0aW5hdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGEgY29uZmxpY3QsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3VyY2VDb25mbGljdHNXaXRoRGVzdGluYXRpb24oSVBhdGggc291cmNlUGF0aCkgewotCi0JCUlDb250YWluZXIgY29udGFpbmVyID0gZ2V0U3BlY2lmaWVkQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldFNwZWNpZmllZENvbnRhaW5lcigpLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihzb3VyY2VQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0UmVzb3VyY2VQYXRoKCkgewotCQlyZXR1cm4gaW1wb3J0ZWRDbGFzc2VzUGF0aDsKLQl9Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8vbWFrZXN1cmUgdG8gY2FsbCBtYWlucGFnZS5jYW5jZWwoKQotCXB1YmxpYyBib29sZWFuIGNhbmNlbCgpIHsKLQkJY2xlYXJQcm92aWRlckNhY2hlKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgY2FjaGVkIHN0cnVjdHVyZSBwcm92aWRlciBhZnRlciBmaXJzdCBmaW5hbGl6aW5nIGl0IHByb3Blcmx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyUHJvdmlkZXJDYWNoZSgpIHsKLQkJaWYgKHByb3ZpZGVyQ2FjaGUgIT0gbnVsbCkgewotCQkJY2xvc2VaaXBGaWxlKHByb3ZpZGVyQ2FjaGUuZ2V0WmlwRmlsZSgpKTsKLQkJCXByb3ZpZGVyQ2FjaGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gY2xvc2UgdGhlIHBhc3NlZCB6aXAgZmlsZSwgYW5kIGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbG9zZVppcEZpbGUoWmlwRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlmaWxlLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLmZvcm1hdCgiWmlwSW1wb3J0LmNvdWxkTm90Q2xvc2UiLCBuZXcKLQkJCS8vIE9iamVjdFtdIHsgZmlsZS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIGhhbmRsZSB0byB0aGUgemlwIGZpbGUgY3VycmVudGx5IHNwZWNpZmllZCBhcyBiZWluZyB0aGUgc291cmNlLiBSZXR1cm4gbnVsbCBpZiB0aGlzCi0JICogZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3Qgb2YgdmFsaWQgZm9ybWF0LgotCSAqLwotCi0JcHJvdGVjdGVkIFppcEZpbGUgZ2V0U3BlY2lmaWVkU291cmNlRmlsZSgpIHsKLQkJcmV0dXJuIGdldFNwZWNpZmllZFNvdXJjZUZpbGUoc291cmNlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGEgaGFuZGxlIHRvIHRoZSB6aXAgZmlsZSBjdXJyZW50bHkgc3BlY2lmaWVkIGFzIGJlaW5nIHRoZSBzb3VyY2UuIFJldHVybiBudWxsIGlmIHRoaXMKLQkgKiBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBvZiB2YWxpZCBmb3JtYXQuCi0JICovCi0KLQlwcml2YXRlIFppcEZpbGUgZ2V0U3BlY2lmaWVkU291cmNlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBaaXBGaWxlKGZpbGVOYW1lKTsKLQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCS8vZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLmdldFN0cmluZygiWmlwSW1wb3J0LmJhZEZvcm1hdCIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9kaXNwbGF5RXJyb3JEaWFsb2coRGF0YVRyYW5zZmVyTWVzc2FnZXMuZ2V0U3RyaW5nKCJaaXBJbXBvcnQuY291bGROb3RSZWFkIikpOwotCQkJLy8gLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmUgcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgemlwIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcihaaXBGaWxlIHRhcmdldFppcCkgewotCQlpZiAocHJvdmlkZXJDYWNoZSA9PSBudWxsKQotCQkJcHJvdmlkZXJDYWNoZSA9IG5ldyBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIodGFyZ2V0WmlwKTsKLQkJZWxzZSBpZiAoIXByb3ZpZGVyQ2FjaGUuZ2V0WmlwRmlsZSgpLmdldE5hbWUoKS5lcXVhbHModGFyZ2V0WmlwLmdldE5hbWUoKSkpIHsKLQkJCWNsZWFyUHJvdmlkZXJDYWNoZSgpOyAvLyBpZS4tIG5ldyB2YWx1ZSwgc28gZmluYWxpemUmcmVtb3ZlIG9sZCB2YWx1ZQotCQkJcHJvdmlkZXJDYWNoZSA9IG5ldyBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIodGFyZ2V0WmlwKTsKLQkJfSBlbHNlIGlmICghcHJvdmlkZXJDYWNoZS5nZXRaaXBGaWxlKCkuZXF1YWxzKHRhcmdldFppcCkpCi0JCQljbG9zZVppcEZpbGUodGFyZ2V0WmlwKTsgLy8gaWUuLSBkdXBsaWNhdGUgaGFuZGxlIHRvIHNhbWUgLnppcAotCi0JCXJldHVybiBwcm92aWRlckNhY2hlOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSBGaWxlRGlhbG9nIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNwZWNpZnkgdGhlIHNvdXJjZSBmaWxlIHRvIGltcG9ydCBmcm9tCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU291cmNlQnJvd3NlQnV0dG9uUHJlc3NlZEZvclppcCgpIHsKLQkJU3RyaW5nIHNlbGVjdGVkRmlsZSA9IHF1ZXJ5WmlwRmlsZVRvSW1wb3J0KCk7Ci0JCWlmIChzZWxlY3RlZEZpbGUgIT0gbnVsbCkgewotCQkJaWYgKCFzZWxlY3RlZEZpbGUuZXF1YWxzKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpKSB7Ci0JCQkJLy9CZSBzdXJlIGl0IGlzIHZhbGlkIGJlZm9yZSB3ZSBnbyBzZXR0aW5nIGFueSBuYW1lcwotCQkJCVppcEZpbGUgc291cmNlRmlsZSA9IGdldFNwZWNpZmllZFNvdXJjZUZpbGUoc2VsZWN0ZWRGaWxlKTsKLQkJCQlpZiAoc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCWNsb3NlWmlwRmlsZShzb3VyY2VGaWxlKTsKLQkJCQkJc2V0U291cmNlTmFtZShzZWxlY3RlZEZpbGUpOwotCQkJCQlzZWxlY3Rpb25Hcm91cC5zZXRGb2N1cygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEltcG9ydCB0aGUgcmVzb3VyY2VzIHdpdGggZXh0ZW5zaW9ucyBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRSZXNvdXJjZXNGcm9tWmlwKExpc3QgZmlsZVN5c3RlbU9iamVjdHMpIHsKLQotCQlaaXBGaWxlIHppcEZpbGUgPSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKCk7Ci0JCVppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IGdldFN0cnVjdHVyZVByb3ZpZGVyKHppcEZpbGUpOwotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihuZXcgSW1wb3J0T3BlcmF0aW9uKGdldENvbnRhaW5lckZ1bGxQYXRoKCksIHN0cnVjdHVyZVByb3ZpZGVyLmdldFJvb3QoKSwgc3RydWN0dXJlUHJvdmlkZXIsIHRoaXMsIGZpbGVTeXN0ZW1PYmplY3RzKSk7Ci0KLQkJY2xvc2VaaXBGaWxlKHppcEZpbGUpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgYW5kIHJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzZWxlY3RlZCBmaWxlLCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkaWFsb2cgd2FzIGNhbmNlbGVkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnlaaXBGaWxlVG9JbXBvcnQoKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc291cmNlTmFtZUZpZWxkLmdldFNoZWxsKCksIFNXVC5PUEVOKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tde0ZJTEVfSU1QT1JUX01BU0t9KTsKLQotCQlTdHJpbmcgY3VycmVudFNvdXJjZVN0cmluZyA9IHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCWludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBjdXJyZW50U291cmNlU3RyaW5nLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLQkJaWYgKGxhc3RTZXBhcmF0b3JJbmRleCAhPSAtMSkKLQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGN1cnJlbnRTb3VyY2VTdHJpbmcuc3Vic3RyaW5nKDAsIGxhc3RTZXBhcmF0b3JJbmRleCkpOwotCi0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5ZDEyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuQWJzdHJhY3RGYWNldFdpemFyZFBhZ2U7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEVhckZhY2V0SW5zdGFsbFBhZ2UgCi0KLSAgICBleHRlbmRzIEFic3RyYWN0RmFjZXRXaXphcmRQYWdlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBJRGF0YU1vZGVsIGNvbmZpZzsKLSAgICBwcml2YXRlIExhYmVsIGNvbnRlbnREaXJMYWJlbDsKLSAgICBwcml2YXRlIFRleHQgY29udGVudERpcjsKLSAgICAKLSAgICBwdWJsaWMgRWFyRmFjZXRJbnN0YWxsUGFnZSgpIAotICAgIHsKLSAgICAgICAgc3VwZXIoICJlYXIuZmFjZXQuaW5zdGFsbC5wYWdlIiApOwotICAgICAgICAKLSAgICAgICAgc2V0VGl0bGUoIFJlc291cmNlcy5wYWdlVGl0bGUgKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIFJlc291cmNlcy5wYWdlRGVzY3JpcHRpb24gKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCApIAotICAgIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dCggbmV3IEdyaWRMYXlvdXQoIDEsIGZhbHNlICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29udGVudERpckxhYmVsID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0gICAgICAgIHRoaXMuY29udGVudERpckxhYmVsLnNldFRleHQoIFJlc291cmNlcy5jb250ZW50RGlyTGFiZWwgKTsKLSAgICAgICAgdGhpcy5jb250ZW50RGlyTGFiZWwuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbnRlbnREaXIgPSBuZXcgVGV4dCggY29tcG9zaXRlLCBTV1QuQk9SREVSICk7Ci0gICAgICAgIHRoaXMuY29udGVudERpci5zZXRUZXh0KCB0aGlzLmNvbmZpZy5nZXRTdHJpbmdQcm9wZXJ0eSggSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVOVF9ESVIgKSApOwotICAgICAgICB0aGlzLmNvbnRlbnREaXIuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoIGZpbmFsIE1vZGlmeUV2ZW50IGV2ZW50ICkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldFN0cmluZ1Byb3BlcnR5KCBJRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05URU5UX0RJUiwgY29udGVudERpci5nZXRUZXh0KCkgKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgdGhpcy5jb250ZW50RGlyLmFkZE1vZGlmeUxpc3RlbmVyKCBtb2RpZnlMaXN0ZW5lciApOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udHJvbCggY29tcG9zaXRlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZyggZmluYWwgT2JqZWN0IGNvbmZpZyApIAotICAgIHsKLSAgICAgICAgdGhpcy5jb25maWcgPSAoSURhdGFNb2RlbCkgY29uZmlnOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpCi0gICAgewotICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSB0aGlzLmNvbnRlbnREaXJMYWJlbC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudERpckxhYmVsVGV4dDsKLSAgICAgICAgZmluYWwgQ29sb3IgY29udGVudERpckxhYmVsQ29sb3I7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5jb250ZW50RGlyLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRlbnREaXJMYWJlbFRleHQgPSBSZXNvdXJjZXMuY29udGVudERpckxhYmVsSW52YWxpZDsKLSAgICAgICAgICAgIGNvbnRlbnREaXJMYWJlbENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciggU1dULkNPTE9SX1JFRCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgY29udGVudERpckxhYmVsVGV4dCA9IFJlc291cmNlcy5jb250ZW50RGlyTGFiZWw7Ci0gICAgICAgICAgICBjb250ZW50RGlyTGFiZWxDb2xvciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29udGVudERpckxhYmVsLnNldFRleHQoIGNvbnRlbnREaXJMYWJlbFRleHQgKTsKLSAgICAgICAgdGhpcy5jb250ZW50RGlyTGFiZWwuc2V0Rm9yZWdyb3VuZCggY29udGVudERpckxhYmVsQ29sb3IgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuc2V0UGFnZUNvbXBsZXRlKCB2YWxpZCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBHcmlkRGF0YSBnZGhmaWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VUaXRsZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFnZURlc2NyaXB0aW9uOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50RGlyTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnREaXJMYWJlbEludmFsaWQ7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBFYXJGYWNldEluc3RhbGxQYWdlLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2M3NDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFnZVRpdGxlID0gRUFSIE1vZHVsZQotcGFnZURlc2NyaXB0aW9uID0gQ29uZmlndXJlIEVBUiBtb2R1bGUgc2V0dGluZ3MuCi1jb250ZW50RGlyTGFiZWwgPSBDb250ZW50IERpcmVjdG9yeVw6Ci1jb250ZW50RGlyTGFiZWxJbnZhbGlkID0gQ29udGVudCBEaXJlY3RvcnkgKGludmFsaWQpXDoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclByb2plY3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclByb2plY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ODhiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJQcm9qZWN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLkZhY2V0ZWRQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEVhclByb2plY3RXaXphcmQKLQotICAgIGV4dGVuZHMgRmFjZXRlZFByb2plY3RXaXphcmQKLQotewotICAgIHByb3RlY3RlZCBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSBnZXRUZW1wbGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoICJ0ZW1wbGF0ZS5qc3QuZWFyIiApOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhZ2VEZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gIkNyZWF0ZSBhbiBFQVIgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlIG9yIGF0IGFuIGV4dGVybmFsIGxvY2F0aW9uIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoICJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSIgKTsKLSAgICAgICAgZmluYWwgVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeSggImljb25zL2Vhci13aXotYmFubmVyLmdpZiIgKTsKLQotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoIHVybCApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0N2Y3NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEVhclNlbGVjdGlvblBhbmVsCi0KLSAgICBleHRlbmRzIENvbXBvc2l0ZQotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0IGxpc3RlbmVyczsKLSAgICBwcml2YXRlIGZpbmFsIEJ1dHRvbiBhZGRUb0VhcjsKLSAgICBwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOwotICAgIHByaXZhdGUgZmluYWwgQnV0dG9uIG5ld0J1dHRvbjsKLSAgIAotICAgIHB1YmxpYyBFYXJTZWxlY3Rpb25QYW5lbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3R5bGUgKSAKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBwYXJlbnQsIHN0eWxlICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoIDIsIGZhbHNlICk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICAKLSAgICAgICAgc2V0TGF5b3V0KCBsYXlvdXQgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuYWRkVG9FYXIgPSBuZXcgQnV0dG9uKCB0aGlzLCBTV1QuQ0hFQ0sgKTsKLSAgICAgICAgdGhpcy5hZGRUb0Vhci5zZXRUZXh0KCBSZXNvdXJjZXMuYWRkVG9FYXJMYWJlbCApOwotICAgICAgICB0aGlzLmFkZFRvRWFyLnNldExheW91dERhdGEoIGdkaHNwYW4oIGdkaGZpbGwoKSwgMiApICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmFkZFRvRWFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBmaW5hbCBTZWxlY3Rpb25FdmVudCBldmVudCApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0RW5hYmxlZFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29tYm8gPSBuZXcgQ29tYm8oIHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgICAgIHRoaXMuY29tYm8uc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBmaW5hbCBTZWxlY3Rpb25FdmVudCBldmVudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMubmV3QnV0dG9uID0gbmV3IEJ1dHRvbiggdGhpcywgU1dULlBVU0ggKTsKLSAgICAgICAgdGhpcy5uZXdCdXR0b24uc2V0VGV4dCggUmVzb3VyY2VzLm5ld0J1dHRvbkxhYmVsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggZmluYWwgU2VsZWN0aW9uRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhbmRsZUFkZEJ1dHRvbigpOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycygpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgICAgIAotICAgICAgICByZXNldEVuYWJsZWRTdGF0ZSgpOwotICAgICAgICAKLSAgICAgICAgcG9wdWxhdGVFYXJMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5jb21iby5nZXRJdGVtQ291bnQoKSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbWJvLnNlbGVjdCggMCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGdldEFkZFRvRWFyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFkZFRvRWFyLmdldFNlbGVjdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVhclByb2plY3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLmFkZFRvRWFyLmdldFNlbGVjdGlvbigpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gdGhpcy5jb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09IC0xID8gbnVsbCA6IHRoaXMuY29tYm8uZ2V0SXRlbSggaW5kZXggKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCBmaW5hbCBMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycy5hZGQoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycy5yZW1vdmUoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoKQotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSB0aGlzLmxpc3RlbmVycy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICAoIChMaXN0ZW5lcikgdGhpcy5saXN0ZW5lcnMuZ2V0KCBpICkgKS5oYW5kbGVFdmVudCggbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZXNldEVuYWJsZWRTdGF0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBib29sZWFuIGVuYWJsZWQgPSB0aGlzLmFkZFRvRWFyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5jb21iby5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgICAgIHRoaXMubmV3QnV0dG9uLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRWFyTGlzdCgpCi0gICAgewotICAgICAgICB0aGlzLmNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RbXSBwcm9qZWN0cyA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1sgaSBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbWJvLmFkZCggcHJvamVjdC5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhclByb2plY3RXaXphcmQgd2l6YXJkID0gbmV3IEVhclByb2plY3RXaXphcmQoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFdpemFyZERpYWxvZyBkaWFsb2cgCi0gICAgICAgICAgICA9IG5ldyBXaXphcmREaWFsb2coIGdldFNoZWxsKCksIHdpemFyZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGRpYWxvZy5vcGVuKCkgIT0gU1dULkNBTkNFTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlYXJwcm9qID0gd2l6YXJkLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBlYXJwcm9qICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvcHVsYXRlRWFyTGlzdCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gdGhpcy5jb21iby5nZXRJdGVtQ291bnQoKTsgaSA8IG47IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5jb21iby5nZXRJdGVtKCBpICkuZXF1YWxzKCBlYXJwcm9qICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbWJvLnNlbGVjdCggaSApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JpZERhdGEgZ2RoZmlsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWREYXRhIGdkaHNwYW4oIGZpbmFsIEdyaWREYXRhIGdkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNwYW4gKQotICAgIHsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotICAgICAgICByZXR1cm4gZ2Q7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZFRvRWFyTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0J1dHRvbkxhYmVsOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRWFyU2VsZWN0aW9uUGFuZWwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJTZWxlY3Rpb25QYW5lbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3MzJiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJTZWxlY3Rpb25QYW5lbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1hZGRUb0VhckxhYmVsID0gQWRkIHByb2plY3QgdG8gYW4gRUFSLgotbmV3QnV0dG9uTGFiZWwgPSBOZXcuLi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRJbnN0YWxsUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjOGZiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRJbnN0YWxsUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLkFic3RyYWN0RmFjZXRXaXphcmRQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsaXR5RmFjZXRJbnN0YWxsUGFnZSAKLQotICAgIGV4dGVuZHMgQWJzdHJhY3RGYWNldFdpemFyZFBhZ2UKLSAgICAKLXsKLSAgICBwcml2YXRlIElEYXRhTW9kZWwgY29uZmlnOwotICAgIHByaXZhdGUgRWFyU2VsZWN0aW9uUGFuZWwgZWFyUGFuZWw7Ci0gICAgCi0gICAgcHVibGljIFV0aWxpdHlGYWNldEluc3RhbGxQYWdlKCkgCi0gICAgewotICAgICAgICBzdXBlciggInV0aWxpdHkuZmFjZXQuaW5zdGFsbC5wYWdlIiApOwotICAgICAgICAKLSAgICAgICAgc2V0VGl0bGUoIFJlc291cmNlcy5wYWdlVGl0bGUgKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIFJlc291cmNlcy5wYWdlRGVzY3JpcHRpb24gKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCApIAotICAgIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dCggbmV3IEdyaWRMYXlvdXQoIDEsIGZhbHNlICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZWFyUGFuZWwgPSBuZXcgRWFyU2VsZWN0aW9uUGFuZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLSAgICAgICAgdGhpcy5lYXJQYW5lbC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZWFyUGFuZWwuYWRkTGlzdGVuZXIoIG5ldyBMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBFdmVudCBldmVudCApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTdHJpbmdQcm9wZXJ0eShJVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSxlYXJQYW5lbC5nZXRFYXJQcm9qZWN0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSApOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udHJvbCggY29tcG9zaXRlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZyggZmluYWwgT2JqZWN0IGNvbmZpZyApIAotICAgIHsKLSAgICAgICAgdGhpcy5jb25maWcgPSAoSURhdGFNb2RlbCkgY29uZmlnOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpCi0gICAgewotICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLmVhclBhbmVsLmdldEFkZFRvRWFyKCkgJiYgCi0gICAgICAgICAgICB0aGlzLmVhclBhbmVsLmdldEVhclByb2plY3ROYW1lKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuc2V0UGFnZUNvbXBsZXRlKCB2YWxpZCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBHcmlkRGF0YSBnZGhmaWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VUaXRsZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFnZURlc2NyaXB0aW9uOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTMxZTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXBhZ2VUaXRsZSA9IFV0aWxpdHkgTW9kdWxlCi1wYWdlRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdXRpbGl0eSBtb2R1bGUgc2V0dGluZ3MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZThjOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuRmFjZXRlZFByb2plY3RXaXphcmQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVXRpbGl0eVByb2plY3RXaXphcmQgCi0KLSAgICBleHRlbmRzIEZhY2V0ZWRQcm9qZWN0V2l6YXJkIAotICAgIAotewotICAgIHByb3RlY3RlZCBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSBnZXRUZW1wbGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoICJ0ZW1wbGF0ZS5qc3QudXRpbGl0eSIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWdlRGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJDcmVhdGUgYSBVdGlsaXR5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBvciBhdCBhbiBleHRlcm5hbCBsb2NhdGlvbi4iOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoICJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSIgKTsKLSAgICAgICAgZmluYWwgVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeSggImljb25zL3V0aWwtd2l6LWJhbm5lci5naWYiICk7Ci0KLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKCB1cmwgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2phdmFkb2MueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qYXZhZG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzYTAzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2phdmFkb2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgZGVmYXVsdD0iamF2YWRvYyI+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIj4KLSAgICAgICAgPGphdmFkb2MgYWNjZXNzPSJwcm90ZWN0ZWQiIGF1dGhvcj0iZmFsc2UiIGNsYXNzcGF0aD0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2JpbjsuLi9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYmluOy4uL29yZy5lY2xpcHNlLmpzdC5jb21tb24ubmF2aWdhdG9yLmphdmEvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uub3NnaV8zLjEuMFxjb3JlLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXJfMS4wLjBcdXJpcmVzb2x2ZXIuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZW1mLmVkaXQudWlfMi4xLjBccnVudGltZVxlZGl0LnVpLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC53c2RsXzEuMC4wXHdzZGwuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuZWRpdG9yc18zLjEuMFxlZGl0b3JzLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXGNvbS5pYm0ud3RwLmNvbW1vbi51dGlsXzEuMC4xXHV0aWwuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXRfMi4xLjBccnVudGltZVxlY29yZS5lZGl0LmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXJfMS4wLjBceG1sY2F0YWxvZy5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS53b3JrYmVuY2hfMy4xLjBcd29ya2JlbmNoLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5XzMuMC4wXGNvbXBhdGliaWxpdHkuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcY29tLmlibS53dHAuZW1mLndvcmtiZW5jaF8xLjAuMS4xXGVtZndvcmtiZW5jaC5qYXI7Li4vb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmVtZi5lZGl0XzIuMS4wXHJ1bnRpbWVcZWRpdC5qYXI7Li4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaF8xLjAuMS4xXHdvcmtiZW5jaC5qYXI7Li4vb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vYmluOy4uL29yZy5lY2xpcHNlLndzdC53ZWIvYmluOy4uL29yZy5lY2xpcHNlLmpzdC5lamIudWkvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamR0LmNvcmVfMy4xLjBcamR0Y29yZS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5vc2dpXzMuMS4wXG9zZ2kuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aV8yLjAuMVxydW50aW1lXGNvbW1vbi51aS5qYXI7Li4vb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuXzIuMS4wXHJ1bnRpbWVcY29kZWdlbi5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS5pZGVfMy4xLjBcaWRlLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC51aV8zLjEuMFxqZHQuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamVtXzEuMC4xXGphdmFpbnN0LmphcjsuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5lamIvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uub3NnaV8zLjEuMFxkZWZhdWx0QWRhcHRvci5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5zd3Qud2luMzJfMy4xLjBcd3Ncd2luMzJcc3d0LmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLm9zZ2lfMy4xLjBccmVzb2x2ZXIuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LndzZGxfMS4wLjBcamFyc1x3c2RsNGouamFyOy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS54c2RfMi4xLjBccnVudGltZVx4c2QuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamZhY2UudGV4dF8zLjEuMFxqZmFjZXRleHQuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3JfMy4xLjBcdGV4dGVkaXRvci5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS52aWV3c18zLjEuMFx2aWV3cy5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlc18zLjEuMFxyZXNvdXJjZXMuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWxfMS4wLjBcY29udGVudG1vZGVsLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnRleHRfMy4xLjBcdGV4dC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyXzEuMC4wXHBhcnNlci5qYXI7Li4vb3JnLmVjbGlwc2UuanN0LmoyZWUvYmluOy4uL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5vc2dpXzMuMS4wXGVjbGlwc2VBZGFwdG9yLmphcjsuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3J1bnRpbWUvajJlZS5qYXI7Li4vb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnNfMy4xLjBcZmlsZWJ1ZmZlcnMuamFyOy4uL29yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLndvcmtiZW5jaC9iaW47Li4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5taWdyYXRpb24vYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LndlYmJyb3dzZXJfMS4wLjBcd2ViYnJvd3Nlci5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZW1fMS4wLjFcbW9mamF2YS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmVfMy4wLjBcc2VydmVyY29yZS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5lbWYuY29tbW9uXzIuMS4wXHJ1bnRpbWVcY29tbW9uLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWlfMy4wLjBcc2VydmVydWkuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZ18zLjEuMFxsYXVuY2hpbmcuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LndzZGxfMS4wLjBcamFyc1xxbmFtZS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aV8zLjEuMFx1aS5qYXI7Li4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2JpbjsuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlXzIuMS4wXHJ1bnRpbWVcY29kZWdlbi5lY29yZS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZ18zLjEuMFxyZWZjb3JlLmphcjsuLi9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9iaW47YmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lXzMuMS4wXHJ1bnRpbWUuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uub3NnaV8zLjEuMFxjb25zb2xlLmphcjsuLi9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9iaW47Li4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3Iudmlld3MvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcl8zLjAuMFxjb25maWd1cmF0b3IuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaV8yLjEuMFxydW50aW1lXGVjb3JlLnhtaS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZmFjZV8zLjEuMFxqZmFjZS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5lbWYuZWNvcmVfMi4xLjBccnVudGltZVxlY29yZS5qYXI7Li4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZV8zLjAuMFxzamF2YWNvcmUuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZ18xLjAuMFxlbmNvZGluZ3Jlc291cmNlLmphciIgZGVzdGRpcj0iRDpcRGV2ZWxvcG1lbnRcd3RwX2FwaV9kb2NzIiBub2RlcHJlY2F0ZWQ9ImZhbHNlIiBub2RlcHJlY2F0ZWRsaXN0PSJmYWxzZSIgbm9pbmRleD0iZmFsc2UiIG5vbmF2YmFyPSJmYWxzZSIgbm90cmVlPSJmYWxzZSIgcGFja2FnZW5hbWVzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWksb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWksb3JnLmVjbGlwc2UuanN0LmoyZWUudWksb3JnLmVjbGlwc2UuanN0LmVqYi51aSIgc291cmNlcGF0aD0iajJlZV91aTsuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLnVpL3Byb3BlcnR5X2ZpbGVzOy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3Byb3BlcnR5X2ZpbGVzO3Byb3BlcnR5X2ZpbGVzOy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWk7Li4vb3JnLmVjbGlwc2UuanN0LmVqYi51aS9lamJfdWk7Li4vb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3Byb3BlcnR5X2ZpbGVzOy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkiIHNwbGl0aW5kZXg9InRydWUiIHVzZT0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYTkzOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWoyZWU9SjJFRQotY2xpZW50Lmphci5maWxlX3VpXz1BcHAgQ2xpZW50IEpBUiBmaWxlCi1jbGllbnQuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXz1JbXBvcnQgYW4gZXh0ZXJuYWwgQXBwbGljYXRpb24gQ2xpZW50IEpBUiBmaWxlIGludG8gYW4gQXBwbGljYXRpb24gQ2xpZW50IHByb2plY3QKLWNsaWVudC5leHBvcnQuZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCBpbnRvIGFuIEFwcGxpY2F0aW9uIENsaWVudCBKQVIgZmlsZQotZWFyLmZpbGVfdWlfPUVBUiBmaWxlCi1lYXIuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXz1JbXBvcnQgYW4gZXh0ZXJuYWwgRUFSIGZpbGUgaW50byBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QKLWVhci5leHBvcnQuZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZQotZWFyLmV4cG9ydC5hY3Rpb24uZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBFQVIgRmlsZS4uLgotajJlZS5jYXRlZ29yeV91aV89SjJFRQotY2xpZW50LnByb2plY3RfdWlfPUFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0Ci1lYXIucHJvamVjdF91aV89RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0Ci1qMmVlLmFjdGlvbnMuZGVzY3JpcHRpb25fdWlfPUFjdGlvbnMgZm9yIEoyRUUgRGV2ZWxvcG1lbnQKLWNyZWF0ZS5lbnRlcnByaXNlLmFwcGxpY2F0aW9uX3VpXz1DcmVhdGUgYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbgotY3JlYXRlLmNsaWVudC5tb2R1bGVfdWlfPUNyZWF0ZSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdAotY2xpZW50LmV4cG9ydC5hY3Rpb24ubGFiZWxfdWlfPUV4cG9ydCBBcHBsaWNhdGlvbiBDbGllbnQgSkFSLi4uCi1qYXIuZGVwZW5kZW5jaWVzLnByb3BzX3VpXz1KMkVFIE1vZHVsZXMKLWVqYi5leHBvcnQuYWN0aW9uLmRlc2NyaXB0aW9uX3VpXz1FeHBvcnQgRUpCIEpBUiBGaWxlLi4uCi1lamIuY2xpZW50Lmphci5jcmVhdGlvbi5hY3Rpb24uZGVzY3JpcHRpb25fdWlfPUNyZWF0ZSBFSkIgQ2xpZW50IEphcgotZW1wdHlFSkJHcm91cEZpbHRlci5uYW1lPUVtcHR5IEVKQiBncm91cHMKLWVqYi5leHBvcnQuYWN0aW9uLmRlc2NyaXB0aW9uX3VpXz1FeHBvcnQgRUpCIEpBUiBGaWxlLi4uCi11dGlsaXR5X2phcl9pbXBvcnRfd2l6YXJkPUoyRUUgVXRpbGl0eSBKYXIKLWRlcGxveV91aV89RGVwbG95Ci1JbXBvcnRfQ2xhc3Nlcz1JbXBvcnQgQ2xhc3MgRmlsZXMuLi4KLWZsZXhpYmxlLnByb2plY3RfdWlfPUZsZXhpYmxlIEphdmEgUHJvamVjdAotbmV3LmZsZXhpYmxlLnByb2plY3QuZGVzY3JpcHRpb25fdWlfPUNyZWF0ZSBhIGZsZXhpYmxlIEphdmEgcHJvamVjdAotZWFyX2NvbXBvbmVudF91aV89RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0Ci1uZXcuZWFyLmNvbXBvbmVudC5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgSjJFRSBFQVIgcHJvamVjdAotYXBwY2xpZW50X2NvbXBvbmVudF91aV89QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLW5ldy5hcHBjbGllbnQuY29tcG9uZW50LmRlc2NyaXB0aW9uX3VpXz1DcmVhdGUgYSBKMkVFIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ci1KYXZhX0NvbXBvbmVudD1KYXZhIENvbXBvbmVudAotSmF2YV9Db21wb25lbnQuZGVzY3JpcHRpb249Q3JlYXRlIGEgSmF2YSBDb21wb25lbnQKLWFkZG1vZHVsZXN0b2Vhci5wcm9wc191aV89RUFSIG1vZHVsZXMKLUoyRUVEZXBlbmRlbmNpZXNQYWdlLm5hbWUgPSBKMkVFIE1vZHVsZSBEZXBlbmRlbmNpZXMKLXdlYmxpYi5kZXBlbmRlbmNpZXMucHJvcHNfdWlfPSBXZWIgTGlicmFyaWVzIAotSjJFRV9SZW5hbWVfUGFydGljaXBhbnQ9SjJFRSBSZW5hbWUgUGFydGljaXBhbnQKLW5ldy1wcm9qZWN0cy13aXphcmQtY2F0ZWdvcnktbmFtZSA9IFdlYiBUb29scyAoTmV3KQotdXRpbC1wcm9qZWN0LXdpemFyZC1uYW1lID0gVXRpbGl0eSBQcm9qZWN0Ci11dGlsLXByb2plY3Qtd2l6YXJkLWRlc2NyaXB0aW9uID0gQ3JlYXRlIGEgVXRpbGl0eSBwcm9qZWN0Ci1lYXItcHJvamVjdC13aXphcmQtbmFtZSA9IEVBUiBQcm9qZWN0Ci1lYXItcHJvamVjdC13aXphcmQtZGVzY3JpcHRpb24gPSBDcmVhdGUgYW4gRUFSIHByb2plY3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDkwOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gUHVycG9zZTogRXh0ZW5zaW9uIGZvciB0aGUgSjJFRSBBQ3Rpb24gU2V0cyAgICAgICAgICAgIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlajJlZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlajJlZS5hY3Rpb25zLmRlc2NyaXB0aW9uX3VpXyIKLSAgICAgICAgICAgIHZpc2libGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyZWVNYWluQWN0aW9uU2V0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlY3JlYXRlLmNsaWVudC5tb2R1bGVfdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWNyZWF0ZS5jbGllbnQubW9kdWxlX3VpXyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLk5ld0FwcENsaWVudENvbXBvbmVudEFjdGlvbiIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJKMkVFTWFpbiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLk5ld0FwcENsaWVudENvbXBvbmVudCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlY3JlYXRlLmVudGVycHJpc2UuYXBwbGljYXRpb25fdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWNyZWF0ZS5lbnRlcnByaXNlLmFwcGxpY2F0aW9uX3VpXyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLk5ld0VBUkNvbXBvbmVudEFjdGlvbiIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJKMkVFTWFpbiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLk5ld0VBUkNvbXBvbmVudCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PiAKLSAgIDwvZXh0ZW5zaW9uPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gUHJvamVjdCBXaXphcmQgQ29udHJpYnV0aW9ucyAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iSjJFRVVJUHJvamVjdFdpemFyZHMiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVqMmVlLmNhdGVnb3J5X3VpXyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCI+Ci0gICAgICA8L2NhdGVnb3J5PgotPCEtLSBGbGV4aWJsZSBQcm9qZWN0IFdpemFyZCAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVmbGV4aWJsZS5wcm9qZWN0X3VpXyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlYXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qZHQudWkuamF2YSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLkZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotICAgICAgICAgICAgPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJW5ldy5mbGV4aWJsZS5wcm9qZWN0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4tLT4KLTwhLS0gRUFSIENvbXBvbmVudCBXaXphcmQgLS0+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlZWFyX2NvbXBvbmVudF91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkIgotICAgICAgICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgICAgICAgIGZpbmFsUGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJW5ldy5lYXIuY29tcG9uZW50LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLTwhLS0gQXBwbGljYXRpb24gQ2xpZW50IENvbXBvbmVudCBXaXphcmQgLS0+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlYXBwY2xpZW50X2NvbXBvbmVudF91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkIgotICAgICAgICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgICAgICAgIGZpbmFsUGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJW5ldy5hcHBjbGllbnQuY29tcG9uZW50LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gIAotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEltcG9ydCBXaXphcmQgQ29udHJpYnV0aW9ucyAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJWNsaWVudC5qYXIuZmlsZV91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuQXBwQ2xpZW50TW9kdWxlSW1wb3J0V2l6YXJkTmV3Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjbGllbnQuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlZWFyLmZpbGVfdWlfIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0V2l6YXJkTmV3Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVlYXIuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4gCi0gICAgICAgPC9leHRlbnNpb24+Ci0gICAgIAotICAgPCEtLSAgIDx3aXphcmQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9qYXJfb2JqLmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiV1dGlsaXR5X2phcl9pbXBvcnRfd2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLkoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkIj4KLSAgICAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCSAgICAgICAgPC9zZWxlY3Rpb24+Ci0JICA8L3dpemFyZD4gICAgIAotCSAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVJbXBvcnRfQ2xhc3NlcyIKLSAgICAgICAgICAgIGljb249IiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQ2xhc3Nlc0ltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQ2xhc3Nlc0ltcG9ydFdpemFyZCI+Ci0gICAgICAgICAKLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4gICAgICAgICAgICAgCi0gICA8L2V4dGVuc2lvbj4gLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gRXhwb3J0IFdpemFyZCBDb250cmlidXRpb25zICAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlY2xpZW50Lmphci5maWxlX3VpXyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLkFwcENsaWVudE1vZHVsZUV4cG9ydFdpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlY2xpZW50LmV4cG9ydC5kZXNjcmlwdGlvbl91aV8KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlZWFyLmZpbGVfdWlfIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lYXIuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRFeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuRW50ZXJwcmlzZUFwcGxpY2F0aW9uRXhwb3J0V2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVlYXIuZXhwb3J0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UudWkucHJvamVjdE5hdHVyZUltYWdlcyAgICAtLT4KLTwhLS0gUHVycG9zZTogQXR0YWNoIGljb24gb3ZlcmxheXMgZm9yIEoyRUUgcHJvamVjdCBuYXR1cmVzIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLnByb2plY3ROYXR1cmVJbWFnZXMiPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL292cjE2L2VqYl9tb2R1bGVfb3ZyLmdpZiIKLSAgICAgICAgICAgIG5hdHVyZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVqYlByb2plY3ROYXR1cmVJbWFnZSI+Ci0gICAgICA8L2ltYWdlPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL292cjE2L2VudGVycHJpc2VfYXBwX292ci5naWYiCi0gICAgICAgICAgICBuYXR1cmVJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVhclByb2plY3ROYXR1cmVJbWFnZSI+Ci0gICAgICA8L2ltYWdlPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL292cjE2L2NsaWVudF9hcHBfb3ZyLmdpZiIKLSAgICAgICAgICAgIG5hdHVyZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5hcHBDbGllbnRNb2RQcm9qZWN0TmF0dXJlSW1hZ2UiPgotICAgICAgPC9pbWFnZT4KLSAgICAgIDxpbWFnZQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZiIKLSAgICAgICAgICAgIG5hdHVyZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yTmF0dXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLkNvbm5lY3Rvck1vZFByb2plY3ROYXR1cmVJbWFnZSI+Ci0gICAgICA8L2ltYWdlPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZiIKLSAgICAgICAgICAgIG5hdHVyZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndlYlByb2plY3ROYXR1cmVJbWFnZSI+Ci0gICAgICA8L2ltYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLTwhLS0gTmF2aWdhdG9yIE9iamVjdCBDb250cmlidXRpb25zIC0tPgotPCEtLSBFQVIgR3JvdXAgQ29udHJpYnV0aW9ucyAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5ncm91cHMuTmF2aWdhdG9yR3JvdXAiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubmF2aWdhdG9yLmVhck5ld1Byb2plY3RBY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlZWFyLnByb2plY3RfdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuTmV3RUFSUHJvamVjdEFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwubmF2aWdhdG9yLm5ldy5tZW51L2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubmF2aWdhdG9yLm5ld0VBUkFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk5hdHVyZSI+Ci0gICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotPCEtLSBOYXZpZ2F0b3IgT2JqZWN0IENvbnRyaWJ1dGlvbnMgLS0+Ci08IS0tIEFwcGxpY2F0aW9uIENsaWVudCBHcm91cCBDb250cmlidXRpb25zIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLmdyb3Vwcy5OYXZpZ2F0b3JHcm91cCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuYXBwQ2xpZW50TmV3UHJvamVjdEFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhcHBjbGllbnQucHJvamVjdF91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5OZXdBcHBsQ2xpZW50UHJvamVjdEFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwubmF2aWdhdG9yLm5ldy5tZW51L2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubmF2aWdhdG9yLm5ld0FwcENsaWVudEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlIj4KLSAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci08IS0tIE5hdmlnYXRvciBPYmplY3QgQ29udHJpYnV0aW9ucyAtLT4KLQotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkud3RwdWlBY3Rpb24iPiAKLSAgICAgIDxtYXN0ZXJPcGVyYXRpb24KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZWxldGUgdGhlIGRlcGVuZGVudCBKMkVFIG1vZHVsZXMiCi0gICAgICAgICAgICBleHRlbmRlZEdlbmVyaWNJZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5nZW5lcmljLkRlbGV0ZSIKLSAgICAgICAgICAgIHBvcHVsYXRvckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5hY3Rpb25zLkoyRUVEZWxldGVNb2R1bGVBY3Rpb25Qb3B1bGF0b3IiCi0gICAgICAgICAgICBvcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb24udWkuSUFjdGlvbldUUE9wZXJhdGlvbiIKLSAgICAgICAgICAgIG5hbWU9IkRlbGV0ZSBKMkVFIERlcGVuZGVudCBNb2R1bGVzIiAKLSAgICAgICAgICAgIGFsd2F5c0V4ZWN1dGU9InRydWUiCi0gICAgICAgICAgICBvdmVycmlkZUlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmFjdGlvbnMuSmF2YS5kZWxldGUiPgotICAgICAgICAgICAgPHNlbGVjdGlvbkVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICAJPG9yPgotICAgICAgICAgICAgCQk8YW5kPgotICAgICAgICAgICAgCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICAJCQkJCSBhZGFwdGFibGU9InRydWUiIC8+Ci0JCQkJCTxvcj4KLQkJCSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotCQkJICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk5hdHVyZSIKLQkJCSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiIC8+IAotCQkJICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JCQkgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiCi0JCQkgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIiAvPiAKLQkJCSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotCQkJICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JOYXR1cmUiCi0JCQkgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIiAvPiAKLQkJCSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotCQkJICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiCi0JCQkgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIiAvPiAKLQkJCSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotCQkJICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiCi0JCQkgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIiAvPiAKLQkJCSAgICAgICAgICAgIDwvb3I+ICAgICAgICAgICAgCQkJCQkgCi0gICAgICAgICAgICAJCTwvYW5kPiAKLQkgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIj4KLQkgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCI+Ci0JICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EuQ29ubmVjdG9yIj4KLQkgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FSkJKYXIiPgotCSAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViQXBwIj4KLQkgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+ICAgICAgICAgICAgCQkgICAgICAgCQkKLSAgICAgICAgICAgIAk8L29yPgotCQkJPC9zZWxlY3Rpb25FbmFibGVtZW50PgotICAgICAgPC9tYXN0ZXJPcGVyYXRpb24+Ci0JPC9leHRlbnNpb24+ICAgCi0JCi0JCi0JPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUVqYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0iZWpiLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUVqYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICA8IS0tICA8dmlldwotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIj4KLSAgICAgICAgIDwvdmlldz4gLS0+Ci0gICAgICAgICA8dmlldyAKLSAgICAgICAgIAkgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lm5hdmlnYXRvci51aS5XVFBXb3JraW5nU2V0Q29tbW9uTmF2aWdhdG9yIj4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0id2ViYXBwbGljYXRpb24ueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLkoyRUVXZWJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgPCEtLSAgPHZpZXcKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUENvbW1vbk5hdmlnYXRvciI+Ci0gICAgICAgICA8L3ZpZXc+IC0tPgotICAgICAgICAgIDx2aWV3IAotICAgICAgICAgCSAgIGlkPSJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUFdvcmtpbmdTZXRDb21tb25OYXZpZ2F0b3IiPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImFwcGxpY2F0aW9uLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgIDwhLS0gICAgPHZpZXcKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUENvbW1vbk5hdmlnYXRvciI+Ci0gICAgICAgICA8L3ZpZXc+IC0tPgotICAgICAgICAgIDx2aWV3IAotICAgICAgICAgCSAgIGlkPSJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUFdvcmtpbmdTZXRDb21tb25OYXZpZ2F0b3IiPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJtb2R1bGVtYXAueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgIDwhLS0gPHZpZXcKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUENvbW1vbk5hdmlnYXRvciI+Ci0gICAgICAgICA8L3ZpZXc+IC0tPgotICAgICAgICAgIDx2aWV3IAotICAgICAgICAgCSAgIGlkPSJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUFdvcmtpbmdTZXRDb21tb25OYXZpZ2F0b3IiPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0KLSAgIAotICAKLTwhLS0gTmF2aWdhdG9yIE9iamVjdCBDb250cmlidXRpb25zIC0tPgotPCEtLSBFQVIgR3JvdXAgQ29udHJpYnV0aW9ucyAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5ncm91cHMuTmF2aWdhdG9yR3JvdXAiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubmF2aWdhdG9yLmVhclByb2plY3RBY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlZWFyLmZpbGVfdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zLkltcG9ydEVBUkFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwubmF2aWdhdG9yLmltcG9ydC5tZW51L2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubmF2aWdhdG9yLmltcG9ydEVBUkFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlZWFyLmZpbGVfdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lYXIuZ2lmIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zLkV4cG9ydEVBUkFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwubmF2aWdhdG9yLmV4cG9ydC5tZW51L2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubmF2aWdhdG9yLmV4cG9ydEVBUkFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk5hdHVyZSI+Ci0gICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotPCEtLSBOYXZpZ2F0b3IgT2JqZWN0IENvbnRyaWJ1dGlvbnMgLS0+Ci08IS0tIEFwcGxpY2F0aW9uIENsaWVudCBHcm91cCBDb250cmlidXRpb25zCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLm5hdmlnYXRvci5hcHBDbGllbnRQcm9qZWN0QWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWNsaWVudC5qYXIuZmlsZV91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsaWVudC5hY3Rpb25zLkltcG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5uYXZpZ2F0b3IuaW1wb3J0Lm1lbnUvYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuaW1wb3J0QXBwQ2xpZW50QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVjbGllbnQuamFyLmZpbGVfdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsaWVudC5hY3Rpb25zLkV4cG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5uYXZpZ2F0b3IuZXhwb3J0Lm1lbnUvYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuZXhwb3J0QXBwQ2xpZW50QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiPgotICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAgLS0+Ci08IS0tIE5hdmlnYXRvciBPYmplY3QgQ29udHJpYnV0aW9ucyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgIERFUExPWSBFWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJqYXZhLmxhbmcuT2JqZWN0IgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5kZXBsb3kiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVkZXBsb3lfdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L3JlX2V4ZWN1dGUuZ2lmIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSjJFRURlcGxveUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0iZGVwbG95QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuIj4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yIj4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIj4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPiAtLT4KLTwhLS0gTmF2aWdhdG9yIE9iamVjdCBDb250cmlidXRpb25zIC0tPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgCi08IS0tID09PT09PT09PT09IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmN5UGFnZSAoQ2F0ZWdvcnkgUGFnZSk9PT09PT09PT09PT0gLS0+Ci0gICAgICA8cGFnZQotICAgICAgCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAJCW5hbWU9IiVKMkVFRGVwZW5kZW5jaWVzUGFnZS5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmNpZXNQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmNpZXNQYWdlIj4KLSAgICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiPgotICAgICAgICAgIDwvZmlsdGVyPiAgICAgICAgICAgIAotICAgICAgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgIAkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCIKLSAgICAgIAkJbmFtZT0iJUoyRUVEZXBlbmRlbmNpZXNQYWdlLm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiPgotICAgICAgPC9wYWdlPgotPCEtLSA9PT09PT09PT09PSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KQVJEZXBlbmRlbmN5UHJvcGVydGllcz09PT09PT09PT09PSAtLT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBuYW1lPSIlamFyLmRlcGVuZGVuY2llcy5wcm9wc191aV8iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IkpBUkRlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlIj4KLSAgICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiPgotICAgICAgICAgIDwvZmlsdGVyPgotICAgICAJIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0IgotICAgICAgICAgICAgbmFtZT0iJWphci5kZXBlbmRlbmNpZXMucHJvcHNfdWlfIgotICAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KQVJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UiCi0gICAgICAgICAgICBpZD0iSkFSRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICA8L3BhZ2U+Ci08IS0tID09PT09PT09PT09IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSA9PT09PT09PT09PT0gLS0+Ci0gICAgICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgbmFtZT0iJXdlYmxpYi5kZXBlbmRlbmNpZXMucHJvcHNfdWlfIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmNpZXNQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSIKLSAgICAgICAgICAgIGlkPSJXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICAgPC9maWx0ZXI+Ci0gICAgIAkgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiCi0gICAgICAgICAgICBuYW1lPSIld2VibGliLmRlcGVuZGVuY2llcy5wcm9wc191aV8iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IldlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvcGFnZT4KLSAgCTwvZXh0ZW5zaW9uPgotPCEtLSA9PT09PT09PT09PSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5BZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgICAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBuYW1lPSIlYWRkbW9kdWxlc3RvZWFyLnByb3BzX3VpXyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5BZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZSIKLSAgICAgICAgICAgIGlkPSJBZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZSI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCIKLSAgICAgICAgICAgIG5hbWU9IiVhZGRtb2R1bGVzdG9lYXIucHJvcHNfdWlfIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmNpZXNQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkFkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IkFkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlIj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvcGFnZT4gICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucmVuYW1lUGFydGljaXBhbnRzIj4KLQkgIAotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5KMkVFUmVuYW1lUGFydGljaXBhbnQiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSjJFRVJlbmFtZVBhcnRpY2lwYW50IiAKLQkJCQluYW1lPSIlSjJFRV9SZW5hbWVfUGFydGljaXBhbnQiPiAKLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4gCi0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+Ci0JCi08IS0tCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlbmFtZVBhcnRpY2lwYW50cyI+Ci0JICAKLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSjJFRUNvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50IgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkoyRUVDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCIgCi0JCQkJbmFtZT0iSjJFRSBSZW5hbWUgUGFydGljaXBhbnQiPiAKLQkJPGVuYWJsZW1lbnQ+IAotCQkgICAJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0gICAgICAgICAgICAJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4gCi0gICAgICAgICAgICAJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSIgLz4gIAotICAgICAgICAgICAgCTwvaXRlcmF0ZT4KLSAgICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgICAgIDx3aXRoCi0gICAgICAgICAgICAgICAgICB2YXJpYWJsZT0iZWxlbWVudCI+Ci0gICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQiPgotICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PiAKLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQk8L2V4dGVuc2lvbj4gLS0+Ci0JCi0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBuYW1lPSIlajJlZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3ZpZXcxNi9qMmVlX3BlcnNwZWN0aXZlLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wZXJzcGVjdGl2ZS5KMkVFUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvcGVyc3BlY3RpdmU+Ci0gICA8L2V4dGVuc2lvbj4JCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIj4KLSAgICAgICAgIDxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1BlcnNwZWN0aXZlIi8+Ci0gICAgICAgICA8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZSIvPgotICAgICAgICAgPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSIvPgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgkKLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLndvcmtiZW5jaC5jb21tb25XaXphcmQiPgotICAgICAgICAgIDwhLS0gRUFSIE5ldyAtLT4KLSAgICAgICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgPG9yPiAKLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ij4KLQkgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgIDxvcj4KLQkgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0JICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLQkgICAgICAgICAgICAgICA8L29yPiAKLSAgICAgICAgICAgICAgICA8L2FuZD4gICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgICAgIDwhLS0gQXBwQ2xpZW50IE5ldyAtLT4KLSAgICAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCI+Ci0JICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgICA8b3I+Ci0JICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLQkgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiPgotCSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0JICAgICAgICAgICAgICAgPC9vcj4gCi0gICAgICAgICAgICAgICAgPC9hbmQ+IAotICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAJICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZSI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgICAgICAgPCEtLSBFQVIgSW1wb3J0IC0tPgotICAgICAgICA8IS0tICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgPG9yPiAKLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ij4KLQkgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgCSAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIj4KLSAgICAgICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgCSAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICA8L2FuZD4JIAotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L2NvbW1vbldpemFyZD4gLS0+Ci0gICAgICAgICAgICA8IS0tIEFwcCBDbGllbnQgSW1wb3J0IC0tPgotICAgICAgICA8IS0tICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuQXBwQ2xpZW50TW9kdWxlSW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgPG9yPiAKLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ij4KLQkgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgCSAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIj4KLSAgICAgICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgCSAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgICAgPG9yPgotCSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0JICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk5hdHVyZSI+Ci0JICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLQkgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZSI+Ci0JICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLQkgICAgICAgICAgICAgICA8L29yPiAKLSAgICAgICAgICAgICAgICA8L2FuZD4gCi0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwiPgotICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uaW1wbC5BcHBsaWNhdGlvbkltcGwiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAJICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5pbXBsLk1vZHVsZUltcGwiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+IC0tPgotICAgICAgICA8IS0tIFV0aWxpdHkgSmFyIEltcG9ydCAtLT4KLSAgICAgPCEtLSAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgIHR5cGU9ImltcG9ydCIKLSAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlciI+Ci0JICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgCSA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuRUFSUHJvamVjdE1hcEltcGwiPgotCSAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ij4KLQkgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgIDwvYW5kPiAgICAgCi0gICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5pbXBsLkFwcGxpY2F0aW9uSW1wbCI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAJICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uaW1wbC5Nb2R1bGVJbXBsIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+ICAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L2NvbW1vbldpemFyZD4gLS0+Ci0gICAgICAgPCEtLSBFQVIgZXhwb3J0IC0tPgotICAgIDwhLS0gICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJleHBvcnQiCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuRW50ZXJwcmlzZUFwcGxpY2F0aW9uRXhwb3J0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgPG9yPgotICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIj4KLSAgICAgICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICA8L2FuZD4gICAgIAotICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5pbXBsLkFwcGxpY2F0aW9uSW1wbCI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAJICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uaW1wbC5Nb2R1bGVJbXBsIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+ICAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L2NvbW1vbldpemFyZD4gLS0+Ci0gICAgICAgIDwhLS0gQXBwIENsaWVudCBleHBvcnQgLS0+Ci0gICAgPCEtLSAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgIHR5cGU9ImV4cG9ydCIKLSAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5BcHBDbGllbnRNb2R1bGVFeHBvcnRXaXphcmQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5ncm91cHMuTmF2aWdhdG9yR3JvdXAiPgotICAgICAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgPC9hbmQ+ICAKLSAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsaWVudC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCI+Ci0gICAgICAgICAgICA8L29iamVjdENsYXNzPiAgICAgICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+IC0tPgotICAgICAgIDwhLS0gSW1wb3J0IENsYXNzZXMgV2l6YXJkIC0tPgotICAgICAgPCEtLSAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5DbGFzc2VzSW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgPG9yPgotICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIAkgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgIDwvYW5kPiAgICAgCi0gICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xpZW50LmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsIj4KLSAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+IAkgICAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L2NvbW1vbldpemFyZD4gLS0+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgIDxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiI+Ci0JCTxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uSUVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyIvPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLSAgICAgICAgIGlkPSJjb250ZXh0LlNlbnNpdGl2ZS5DbGFzcy53b3JraW5nQ29weU1hbmFnZXIiCi0gICAgICAgICBuYW1lPSJXb3JraW5nIENvcHkgTWFuYWdlciAtIFVJIENvbnRleHQgQ2xhc3MiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBjb250ZXh0PSJVSSIKLSAgICAgICAgICAgIGtleT0id29ya2luZ0NvcHlNYW5hZ2VyIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi51aS5XVFBVSVdvcmtpbmdDb3B5TWFuYWdlciI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PiAKLSAgIDwvZXh0ZW5zaW9uPiAKLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIj4KLSAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2ZXIuZWFyMSIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgCi0gICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2ZXIuZWFyMiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgIAotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlci5lYXIzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICA8L2V4dGVuc2lvbj4KLSAgICAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLndpemFyZCI+Ci0KLSAgICA8d2l6YXJkLXBhZ2VzIGZhY2V0PSJqc3QudXRpbGl0eSIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxpbnN0YWxsPgotICAgICAgICA8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5VdGlsaXR5RmFjZXRJbnN0YWxsUGFnZSIvPgotICAgICAgPC9pbnN0YWxsPgotICAgIDwvd2l6YXJkLXBhZ2VzPgotCi0gICAgPHdpemFyZC1wYWdlcyBmYWNldD0ianN0LmVhciIgdmVyc2lvbj0iMS4yIj4KLSAgICAgIDxpbnN0YWxsPgotICAgICAgICA8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJGYWNldEluc3RhbGxQYWdlIi8+Ci0gICAgICA8L2luc3RhbGw+Ci0gICAgPC93aXphcmQtcGFnZXM+Ci0KLSAgICA8d2l6YXJkLXBhZ2VzIGZhY2V0PSJqc3QuZWFyIiB2ZXJzaW9uPSIxLjMiPgotICAgICAgPGluc3RhbGw+Ci0gICAgICAgIDxwYWdlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhckZhY2V0SW5zdGFsbFBhZ2UiLz4KLSAgICAgIDwvaW5zdGFsbD4KLSAgICA8L3dpemFyZC1wYWdlcz4KLQotICAgIDx3aXphcmQtcGFnZXMgZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IjEuNCI+Ci0gICAgICA8aW5zdGFsbD4KLSAgICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyRmFjZXRJbnN0YWxsUGFnZSIvPgotICAgICAgPC9pbnN0YWxsPgotICAgIDwvd2l6YXJkLXBhZ2VzPgotICAgIAotICA8L2V4dGVuc2lvbj4KLSAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gIAotICAgIDxjYXRlZ29yeQotICAgICAgbmFtZT0iJW5ldy1wcm9qZWN0cy13aXphcmQtY2F0ZWdvcnktbmFtZSIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QubmV3cHJvamVjdHMiPgotICAgIDwvY2F0ZWdvcnk+Ci0gICAgCi0gICAgPHdpemFyZAotICAgICAgbmFtZT0iJXV0aWwtcHJvamVjdC13aXphcmQtbmFtZSIKLSAgICAgIGljb249Imljb25zL3V0aWwtd2l6LWljb24uZ2lmIgotICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5uZXdwcm9qZWN0cyIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlQcm9qZWN0V2l6YXJkIgotICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlQcm9qZWN0V2l6YXJkIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4ldXRpbC1wcm9qZWN0LXdpemFyZC1kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgPC93aXphcmQ+Ci0KLSAgICA8d2l6YXJkCi0gICAgICBuYW1lPSIlZWFyLXByb2plY3Qtd2l6YXJkLW5hbWUiCi0gICAgICBpY29uPSJpY29ucy9lYXItd2l6LWljb24uZ2lmIgotICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5uZXdwcm9qZWN0cyIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhclByb2plY3RXaXphcmQiCi0gICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyUHJvamVjdFdpemFyZCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+JWVhci1wcm9qZWN0LXdpemFyZC1kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgPC93aXphcmQ+Ci0KLSAgICAKLSAgPC9leHRlbnNpb24+Ci0gICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiZmRhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuajJlZS51aSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3Byb3BlcnR5X2ZpbGVzIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vcHJvcGVydHlfZmlsZXMiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0gIAkJCi0gIAkJPGNvcHkgZmlsZT0iJHtwbHVnaW5kaXJ9L3BsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL1V0aWxpdHlGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL1V0aWxpdHlGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzFlODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9VdGlsaXR5RmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wYWdlVGl0bGUgPSBVdGlsaXR5IE1vZHVsZQotcGFnZURlc2NyaXB0aW9uID0gQ29uZmlndXJlIHV0aWxpdHkgbW9kdWxlIHNldHRpbmdzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvZWpiX2ZpZ3VyZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvZWpiX2ZpZ3VyZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhNjZmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2VqYl9maWd1cmVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1SZWxhdGlvbnNoaXBQb2x5TGluZV9VSV8wPU5hdmlnYXRpb24KLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzE9TmF2aWdhdGlvbgotUmVsYXRpb25zaGlwUG9seUxpbmVfVUlfMj1DbXIgRmllbGQgLyBGb3JlaWduIEtleQotUmVsYXRpb25zaGlwUG9seUxpbmVfVUlfMz1DbXIgRmllbGQgLyBGb3JlaWduIEtleQotUmVsYXRpb25zaGlwUG9seUxpbmVfVUlfND1FZGl0IGxlZnQgZW5kCi1SZWxhdGlvbnNoaXBQb2x5TGluZV9VSV81PUVkaXQgcmlnaHQKLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzY9RWRpdCBsZWZ0IGVuZAotUmVsYXRpb25zaGlwUG9seUxpbmVfVUlfNz1FZGl0IHJpZ2h0IGVuZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9lamJfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvZWpiX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYzg0ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9lamJfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLTA9RmFpbGVkIHRvIGZpbmQgdGhlIGltYWdlICJ7MH0iLgotMT1OZXcgRUpCIFByb2plY3QKLTI9RUpCIHZlcnNpb246Ci0zPUVKQiBQcm9qZWN0Ci00PUNyZWF0ZSBhbiBFSkIgcHJvamVjdCBhbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24uCi01PUltcG9ydCBhbiBFSkIgamFyIGZyb20gdGhlIGZpbGUgc3lzdGVtCi02PUVKQiBKYXIgSW1wb3J0Ci03PUVKQiBKYXIgZmlsZToKLTg9RUpCIG1vZHVsZToKLTk9RUpCIEphciBFeHBvcnQKLTEwPUV4cG9ydCBFSkIgcHJvamVjdCB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0xMT1FSkIgY2xpZW50IEpBUiBDcmVhdGlvbgotMTI9VXNlIHRoaXMgd2l6YXJkIHRvIGNyZWF0ZSBhbiBFSkIgY2xpZW50IEpBUiBmcm9tIHlvdXIgZXhpc3RpbmcgRUpCCi0xMz1DbGllbnQgSkFSIFVSSToKLTE0PVByb2plY3QgbmFtZToKLTE1PVByb2plY3QgbG9jYXRpb246Ci0xNj1FSkIgTW9kdWxlOgotMTc9RGVsZXRlIEJlYW4gT25seQotMTg9RGVsZXRlIEJlYW4gQ2xhc3NlcwotMTk9RGVsZXRlIEFjY2VzcyBCZWFuCi0yMD1EZWxldGUgRGVwbG95ZWQgQ29kZQotMjE9U2VsZWN0IEFsbAotMjI9RGVzZWxlY3QgQWxsCi0yMz1UaGUgc2VsZWN0ZWQgZW50ZXJwcmlzZSBiZWFuIGNhbm5vdCBiZSBkZWxldGVkIGJlY2F1c2UgaXQgaXMgaW52b2x2ZWQgaW5cbnJlbGF0aW9uc2hpcHMgd2l0aCBvdGhlciBlbnRlcnByaXNlIGJlYW5zLiAgWW91IG11c3QgZmlyc3QgZGVsZXRlIHRoZXNlXG5yZWxhdGlvbnNoaXBzIGJlZm9yZSBkZWxldGluZyB0aGUgYmVhbi4KLTI0PURlbGV0ZS4uLgotMjU9Q2Fubm90IGRlbGV0ZSBFbnRlcnByaXNlIEJlYW4KLTI2PUNhbm5vdCBkZWxldGUgdGhlIGJlYW4gbmFtZWQgInswfSIgYmVjYXVzZSBpdCBpcyBpbiBhIGJpbmFyeSBwcm9qZWN0LgotMjc9RGVsZXRlIEVudGVycHJpc2UgQmVhbihzKQotMjg9V2hhdCBvcHRpb25zIHdvdWxkIHlvdSBsaWtlIHdoZW4gZGVsZXRpbmcgdGhlIHNlbGVjdGVkXG5FbnRlcnByaXNlIEJlYW4ocyk/Ci1Hcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzA9U2Vzc2lvbgotR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8xPUVudGl0eQotR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8yPU1lc3NhZ2UKLU5ld0VKQlByb2plY3RBY3Rpb25fVUlfMD1FSkIgTW9kdWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2oyZWVfZWpiX3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2oyZWVfZWpiX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzU2NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qMmVlX2VqYl91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Hcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzA9U2Vzc2lvbgotR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8xPUVudGl0eQotR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8yPU1lc3NhZ2UKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qMmVlX3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2oyZWVfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiNzM0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2oyZWVfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0xPVByb2plY3QgbG9jYXRpb246Ci0yPVRhcmdldCBydW50aW1lOgotMz1KMkVFIHZlcnNpb246Ci00PUZhaWxlZCB0byBmaW5kIHRoZSBpbWFnZSAiezB9Ii4KLTU9TmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdAotNj1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QKLTc9Q3JlYXRlIGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBjb250YWluaW5nIG9uZSBvciBtb3JlIG1vZHVsZSBwcm9qZWN0cy4KLTg9RUFSIE1vZHVsZSBQcm9qZWN0cwotOT1TZWxlY3QgdGhlIG1vZHVsZSBwcm9qZWN0cyB0byBhZGQgdG8gdGhlIG5ldyBFQVIgcHJvamVjdCBmcm9tIHRoZSBsaXN0LiBcblNlbGVjdCBOZXcgTW9kdWxlIGJ1dHRvbiB0byBjcmVhdGUgYSBuZXcgbW9kdWxlIHByb2plY3QuCi0xMD0mU2VsZWN0IEFsbAotMTE9JkRlc2VsZWN0IEFsbAotMTI9TmV3ICZNb2R1bGUuLi4KLTEzPUVBUiBhcHBsaWNhdGlvbjoKLTE0PU4mZXcuLi4KLTE0YT1OZSZ3Li4uCi0xNT1BZGQgbW9kdWxlIHRvIGFuIEVBUiBhcHBsaWNhdGlvbi4KLTE2PU5ldyBNb2R1bGUgUHJvamVjdAotMTc9Q3JlYXRlIGEgbmV3IG1vZHVsZSBwcm9qZWN0IGZvciB0aGUgc2VsZWN0ZWQgbW9kdWxlIHR5cGUKLTE4PU5ldyBNb2R1bGUgUHJvamVjdAotMTk9Q3JlYXRlIGRlZmF1bHQgbW9kdWxlIHByb2plY3RzLgotMjA9QXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZToKLTIxPUVKQiBtb2R1bGU6Ci0yMj1XZWIgbW9kdWxlOgotMjM9Q29ubmVjdG9yIG1vZHVsZToKLTI0PU5ldyBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdAotMjU9QXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZQotMjY9Q3JlYXRlIGFuIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0Ci0yNz1Nb2R1bGUgRGVwZW5kZW5jaWVzCi0yOD1TZWxlY3QgZGVwZW5kZW50IEpBUnMgZm9yIHRoZSBtb2R1bGUgd2l0aGluIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuCi0yOT1BdmFpbGFibGUgZGVwZW5kZW50IEpBUnM6Ci0zMD1NYW5pZmVzdCBDbGFzcy1QYXRoOgotMzE9SkFSL01vZHVsZQotMzI9UHJvamVjdDoKLTMzPU5ldwotMzQ9SW1wb3J0IGFuIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0IGZyb20gdGhlIGZpbGUgU3lzdGVtCi0zNT1BcHBsaWNhdGlvbiBDbGllbnQgSW1wb3J0Ci0zNj1BcHBsaWNhdGlvbiBDbGllbnQgZmlsZToKLTM3PUFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0OgotMzg9SW1wb3J0Ci0zOT1JbXBvcnQgYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IGJhc2VkIG9uIHNlbGVjdGVkIHJlc291cmNlcy4KLTQwPUVudGVycHJpc2UgQXBwbGljYXRpb24gSW1wb3J0Ci00MT1FQVIgZmlsZToKLTQyPU92ZXJ3cml0ZSBleGlzdGluZyByZXNvdXJjZXMgd2l0aG91dCB3YXJuaW5nLgotNDM9UHJvamVjdCBpbXBvcnQKLTQ0PU9wdGltaXplZDogbWFrZSBiaW5hcnkgcHJvamVjdHMgZm9yIEVKQiwgY2xpZW50LCBhbmQgdXRpbGl0eSBKQVJzCi00NT1FeHBhbmRlZDogZXh0cmFjdCBwcm9qZWN0IGNvbnRlbnRzIGZvciBkZXZlbG9wbWVudAotNDY9SW1wb3J0IGZvciBwYXJ0aWFsIEVBUiBkZXZlbG9wbWVudAotNDc9U2VsZWN0IEFsbAotNDg9RGVzZWxlY3QgQWxsCi00OT1VdGlsaXR5IEpBUnMgYW5kIHdlYiBsaWJyYXJpZXMKLTUwPVNlbGVjdCB0aGUgdXRpbGl0eSBKQVJzIGZyb20gdGhlIGxpc3QgdG8gYmUgaW1wb3J0ZWQgYXMgdXRpbGl0eSBwcm9qZWN0cy4gVW5zZWxlY3RlZCBKQVJzIHdpbGwgYmUgaW1wb3J0ZWQgYXMgXG51dGlsaXR5IEpBUnMgaW4gdGhlIEVBUi4KLTUxPUVudGVyIHRoZSBuZXcgcHJvamVjdCBuYW1lIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUgaW1wb3J0ZWQgbW9kdWxlIGZpbGUgYnkgc2VsZWN0aW5nIHRoZSBzZWNvbmQgY29sdW1uIG9mIHRoZSB0YWJsZSBmb3IgZWRpdC4KLTUyPUVBUiBNb2R1bGUgYW5kIFV0aWxpdHkgSkFSIFByb2plY3RzCi01Mz1Qcm9qZWN0IGxvY2F0aW9ucwotNTQ9VGhpcyBpcyB0aGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgYWxsIHJlZmVyZW5jZWQgcHJvamVjdHMuIEEgc3ViZGlyZWN0b3J5IHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCBwcm9qZWN0LgotNTU9TW9kdWxlIFJvb3QgTG9jYXRpb246Ci0KLTU3PVNlbGVjdCB0aGUgbG9jYXRpb24gZGlyZWN0b3J5Ci01OD1Nb2R1bGVzIGluIEVBUgotNTk9TmV3IFByb2plY3QgTmFtZQotNjA9ZmlsZW5hbWVzCi02MT1wcm9qZWN0bmFtZXMKLTYyPURlc3RpbmF0aW9uOgotNjM9T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUKLTY0PUV4cG9ydCBzb3VyY2UgZmlsZXMKLTY1PUFwcGxpY2F0aW9uIENsaWVudCBFeHBvcnQKLTY2PUV4cG9ydCBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi02Nz1FeHBvcnQKLTY4PUVBUiBFeHBvcnQKLTY5PUV4cG9ydCBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotNzA9SW5jbHVkZSBwcm9qZWN0IGJ1aWxkIHBhdGhzIGFuZCBtZXRhLWRhdGEgZmlsZXMKLTcxPUlmIHlvdSBzZWxlY3QgdGhpcyBvcHRpb24sIHRoZSBleHBvcnRlZCBFQVIgbWFpbnRhaW5zIHByb2plY3QgbmFtZXMgYW5kIGV4dGVybmFsIGNsYXNzcGF0aCBkZXBlbmRlbmNpZXMsIHdoaWNoIGFyZSB1c2VmdWwgZm9yIGxhdGVyIGltcG9ydGluZyB0aGUgRUFSIGludG8gYmluYXJ5IHByb2plY3RzLiBJZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uIGFuZCBsYXRlciBpbXBvcnQgdGhlIEVBUiwgb25seSBiaW5hcnkgcHJvamVjdHMgYXJlIGNyZWF0ZWQuCi03Mj1JbmNsdWRlCi03ND1BbGxvdyBuZXN0ZWQgcHJvamVjdHMgb3ZlcndyaXRlcyAobW9kdWxlIGFuZCB1dGlsaXR5IHByb2plY3RzKQotNzU9RGVsZXRlIHByb2plY3Qgb24gb3ZlcndyaXRlCi03Nj1FQVIgcHJvamVjdDoKLQotI21pZ3JhdGlvbiBzdHJpbmdzCi03Nz1FcnJvcgotNzg9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgcGVyZm9ybWluZyB0aGUgc2VsZWN0ZWQgYWN0aW9uLgotNzk9QmluYXJ5IFByb2plY3QKLTgwPVRoZSBhY3Rpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgc2VsZWN0aW9uLCB3aGljaCBpcyBwYXJ0IG9mIGEgYmluYXJ5IHByb2plY3QuCi04MT1JbmZvcm1hdGlvbgotODI9VGhlIGNob3NlbiBvcGVyYXRpb24gaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuCi0KLTkwPUNyZWF0ZSBhbiBFSkIgQ2xpZW50IEpBUiBtb2R1bGUgdG8gaG9sZCB0aGUgY2xpZW50IGludGVyZmFjZXMgYW5kIGNsYXNzZXMuCi05MT1HZW5lcmF0ZSBhbiBhbm5vdGF0ZWQgYmVhbiBjbGFzcwotOTI9QWRkIHN1cHBvcnQgZm9yIGFubm90YXRlZCBKYXZhIGNsYXNzZXMKLTkzPUImcm93c2UuLi4KLTk0PU5hJm1lOgotOTU9Q3JlYXRlIGEgZGVmYXVsdCBNYWluIGNsYXNzCi05Nj1DcmVhdGUgYSBkZWZhdWx0IHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4KLTk4PUdlbmVyYXRlIGFuIGFubm90YXRlZCBzZXJ2bGV0IGNsYXNzCi0KLTk3PVNlbGVjdCB0aGUgdXRpbGl0eSBKQVJzIGZyb20gdGhlIGxpc3QgdG8gYmUgaW1wb3J0ZWQgYXMgdXRpbGl0eSBwcm9qZWN0cyBvciBqYXJzLgotOTk9TW9kdWxlIE5hbWU6Ci0xMDA9TW9kdWxlIFZlcnNpb246Ci1FbnRpdHlfVUlfPUVudGl0eSBCZWFucwotTWVzc2FnZV9Ecml2ZW5fQmVhbnNfVUlfPU1lc3NhZ2UtRHJpdmVuIEJlYW5zCi1TZXNzaW9uX0JlYW5zX1VJXz1TZXNzaW9uIEJlYW5zCi1FSkJfQ2xhc3NfVUlfPUVKQiBDbGFzczogezB9Ci1Ib21lX0ludGVyZmFjZV9VSV89SG9tZSBJbnRlcmZhY2U6IHswfQotU2VydmljZV9FbmRwb2ludF9JbnRlcmZhY2VfVUlfPVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOiB7MH0KLVByaW1hcnlfS2V5X0NsYXNzX1VJXz1QcmltYXJ5IEtleSBDbGFzczogezB9Ci1SZW1vdGVfSW50ZXJmYWNlX1VJXz1SZW1vdGUgSW50ZXJmYWNlOiB7MH0KLUxvY2FsX0ludGVyZmFjZV9VSV89TG9jYWwgSW50ZXJmYWNlOiB7MH0KLUxvY2FsX0hvbWVfSW50ZXJmYWNlX1VJXz1Mb2NhbCBIb21lIEludGVyZmFjZTogezB9Ci1EZWxldGVfVUlfPURlbGV0ZS4uLgotUHJvamVjdF9zaG91bGRfbm90X2JlX251bGxfMV9FWENfPUlXQUUwMDIxRSBQcm9qZWN0IHNob3VsZCBub3QgYmUgbnVsbAotTm9uLXByb2plY3RfaW5fc2VsZWN0aW9uXzJfRVhDXz1JV0FFMDAyMkUgTm9uLXByb2plY3QgaW4gc2VsZWN0aW9uCi1Qcm9ibGVtc19PcGVuaW5nX0VkaXRvcl9FUlJPUl89SVdBRTAwNTJFIFByb2JsZW1zIE9wZW5pbmcgRWRpdG9yLgotVXRpbGl0eV9KQVJzX1VJXz1VdGlsaXR5IEpBUnMKLURlbGV0ZV8xPURlbGV0ZS4uLgotRGVsZXRlX3NlbGVjdGVkX3Byb2plY3QocylfMj1EZWxldGUgc2VsZWN0ZWQgcHJvamVjdChzKQotUmVtb3ZlX21vZHVsZShzKV9mcm9tX2FsbF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uc18zPVJlbW92ZSBtb2R1bGUocykgZnJvbSBhbGwgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLVJlbW92ZV9tb2R1bGUocylfZnJvbV9hbGxfb3RoZXJfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfND1SZW1vdmUgbW9kdWxlKHMpIGZyb20gYWxsIG90aGVyIEVudGVycHJpc2UgQXBwbGljYXRpb25zCi1SZW1vdmVfbW9kdWxlX2RlcGVuZGVuY2llc19yZWZlcmVuY2luZ19zZWxlY3RlZF9wcm9qZWN0KHMpXzU9UmVtb3ZlIG1vZHVsZSBkZXBlbmRlbmNpZXMgcmVmZXJlbmNpbmcgc2VsZWN0ZWQgcHJvamVjdChzKQotRGVsZXRlX01vZHVsZV9PcHRpb25zXzY9RGVsZXRlIE1vZHVsZSBPcHRpb25zCi1EZWxldGVfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9PcHRpb25zXzc9RGVsZXRlIEVudGVycHJpc2UgQXBwbGljYXRpb24gT3B0aW9ucwotRGVsZXRlX2NvdWxkX25vdF9iZV9jb21wbGV0ZWRfOD1EZWxldGUgY291bGQgbm90IGJlIGNvbXBsZXRlZAotRGVsZXRlX2Vycm9yXzk9RGVsZXRlIGVycm9yCi1XaGF0X3dvdWxkX3lvdV9saWtlX3RvX2RlbGV0ZV9fMTA9V2hhdCB3b3VsZCB5b3UgbGlrZSB0byBkZWxldGU/Ci1EZWxldGVfc2VsZWN0ZWRfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9wcm9qZWN0KHMpX29ubHlfMTE9RGVsZXRlIHNlbGVjdGVkIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdChzKSBvbmx5Ci1BbHNvX2RlbGV0ZV9tb2R1bGVfYW5kX3V0aWxpdHlfSmF2YV9wcm9qZWN0c18xMj1BbHNvIGRlbGV0ZSBtb2R1bGUgYW5kIHV0aWxpdHkgSmF2YSBwcm9qZWN0cwotRGVsZXRlX3NlbGVjdGVkX3Byb2plY3Qocylfb25seV8xMz1EZWxldGUgc2VsZWN0ZWQgcHJvamVjdChzKSBvbmx5Ci1BbHNvX2RlbGV0ZV9yZWZlcmVuY2VzX3RvX3NlbGVjdGVkX3Byb2plY3QocylfMTQ9QWxzbyBkZWxldGUgcmVmZXJlbmNlcyB0byBzZWxlY3RlZCBwcm9qZWN0KHMpCi1DVVNUT01fREVMRVRFX01JWF9NQVRDSF9VSV89VGhlIGN1c3RvbSBKMkVFIGRlbGV0ZSBvcHRpb25zIGFyZSBub3QgYXZhaWxhYmxlIGZvciB0aGUgc2VsZWN0ZWQgSjJFRSBwcm9qZWN0cy4gIFRoZSBzdGFuZGFyZCBkZWxldGUgb3B0aW9ucyB3aWxsIGJlIHVzZWQuCi1ERVBMT1lfRElBTE9HX1RJVExFPUoyRUUgRGVwbG95bWVudAotREVQTE9ZX0VSUk9SX1RFWFQ9SVdBRTAwMDFFIEVycm9yOgotREVQTE9ZX1dBUk5JTkdfVEVYVD1XYXJuaW5nOgotREVQTE9ZX0lORk9fVEVYVD1JV0FFMDAwMkkgSW5mbzoKLURFUExPWV9PS19URVhUPU9rOgotREVQTE9ZTUVOVF9JTl9QUk9HUkVTUz1EZXBsb3ltZW50IG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4uLgotREVQTE9ZX1NVQ0NFU1NfUkVQT1JUPURlcGxveW1lbnQgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LgotREVQTE9ZX1dBUk5JTkdTX1JFUE9SVD1EZXBsb3ltZW50IGZpbmlzaGVkIHdpdGggd2FybmluZ3M7IHNlZSBsb2cgZmlsZXMgZm9yIGRldGFpbHMuCi1ERVBMT1lfRVJST1JTX1JFUE9SVD1EZXBsb3ltZW50IGZpbmlzaGVkIHdpdGggZXJyb3JzOyBzZWUgbG9nIGZpbGVzIGZvciBkZXRhaWxzLgotCi1OZXdNb2R1bGVTZWxlY3Rpb25QYWdlLmFwcENsaWVudD1BcHBsaWNhdGlvbiBDbGllbnQKLU5ld01vZHVsZVNlbGVjdGlvblBhZ2UuZWpiPUVudGVycHJpc2UgSmF2YSBCZWFuCi1OZXdNb2R1bGVTZWxlY3Rpb25QYWdlLndlYj1XZWIKLU5ld01vZHVsZVNlbGVjdGlvblBhZ2UuamNhPUNvbm5lY3RvcgotCi1OZXdBcHBsQ2xpZW50TW9kdWxlQWN0aW9uX1VJXzA9QXBwbGljYXRpb24gQ2xpZW50IE1vZHVsZQotTmV3RUFSTW9kdWxlQWN0aW9uX1VJXzA9RUFSIE1vZHVsZQotSjJFRVByb2plY3RDcmVhdGlvblBhZ2VfVUlfMD1IaWRlICZBZHZhbmNlZCA8PAotSjJFRVByb2plY3RDcmVhdGlvblBhZ2VfVUlfMT1TaG93ICZBZHZhbmNlZCA+PgotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzA9VXRpbGl0eSBKYXIgSW1wb3J0Ci1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMT1JbXBvcnQgZGVwZW5kZW50IFV0aWxpdHkgSmFycyBmb3IgSjJFRSBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucwotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzI9QXZhaWxhYmxlIFV0aWxpdHkgSmFycyBEaXJlY3RvcnkKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8zPUV4dGVybmFsIEphciBEaXJlY3Rvcnk6Ci1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfND1MaW5rZWQgUGF0aCBWYXJpYWJsZQotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzU9TWFrZSB0aGVzZSBpbXBvcnRlZCBmaWxlcyB0ZWFtLXNoYXJlYWJsZSBieSBjcmVhdGluZyBvciByZS11c2luZyBhIExpbmtlZCBQYXRoIFZhcmlhYmxlIChMUFYpLiBTZWxlY3QgYW4gZXhpc3RpbmcgTFBWIG9yIHR5cGUgYSBuZXcgbmFtZSB0byBjcmVhdGUgb25lIHRvIHRoZSBkaXJlY3RvcnkgYWJvdmUuIE90aGVyIHRlYW1tYXRlcyBzaG91bGQgZGVmaW5lIHRoaXMgdmFsdWUgdGhyb3VnaCBXaW5kb3cgPiBQcmVmZXJlbmNlcyB8IFdvcmtiZW5jaCA+IExpbmtlZCBSZXNvdXJjZXMuIFRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBsaW5rZWQgaW1wb3J0cy4KLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV82PU92ZXJ3cml0ZSBFeGlzdGluZyBSZXNvdXJjZXMgKHByb2plY3RzIGFuZCBhcmNoaXZlcykKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV83PVNlbGVjdCBVdGlsaXR5IEphcjoKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZS4wPVVzZSBFeGlzdGluZyBMaW5rZWQgUGF0aCBWYXJpYWJsZQotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlLjE9TGlua2VkIFBhdGggVmFyaWFibGU6IAotRUFSSW1wb3J0UHJvamVjdHNQYWdlX1VJXzA9aW5jbHVkZQotRUFSSW1wb3J0UHJvamVjdHNQYWdlX1VJXzE9ZmlsZQotRUFSSW1wb3J0UHJvamVjdHNQYWdlX1VJXzI9cHJvamVjdAotRUFSSW1wb3J0UHJvamVjdHNQYWdlX1VJXzM9U2VsZWN0IE5ldwotCi1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzA9VXRpbGl0eSBKYXIgSW1wb3J0Ci1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzE9SW1wb3J0IGRlcGVuZGVudCBVdGlsaXR5IEphcnMgZm9yIEoyRUUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMj1TZWxlY3QgaW1wb3J0IHR5cGUKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMz1DcmVhdGUgSmF2YSBQcm9qZWN0cyBmcm9tIFV0aWxpdHkgSmFycwotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV80PUNyZWF0ZSBsaW5rZWQgSmF2YSBQcm9qZWN0cyBmcm9tIFV0aWxpdHkgSmFycwotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV81PUNvcHkgVXRpbGl0eSBKYXJzIGludG8gYW4gZXhpc3RpbmcgRUFSIGZyb20gYW4gZXh0ZXJuYWwgbG9jYXRpb24KLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNj1DcmVhdGUgTGlua2VkIFV0aWxpdHkgSmFycyBpbiBhbiBleGlzdGluZyBFQVIgZnJvbSBhbiBleHRlcm5hbCBsb2NhdGlvbgotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV83PVByb2plY3QgaW1wb3J0IG9wdGlvbnMKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOD1TZWxlY3QgRUFSIFByb2plY3QKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOT1FQVIgUHJvamVjdDoKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMTA9Q3JlYXRlIEJpbmFyeSBQcm9qZWN0cwotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8xMT1PdmVycmlkZSBQcm9qZWN0IFJvb3QgKFNwZWNpZnkgbG9jYXRpb24gYmVsb3cpCi0KLURlcGxveW1lbnRfRGVzY3JpcHRvcl9VSV89RGVwbG95bWVudCBEZXNjcmlwdG9yCi0KLVJlbmFtZV8xPVJlbmFtZQotUmVuYW1lX3NlbGVjdGVkX3Byb2plY3RfMj1SZW5hbWUgc2VsZWN0ZWQgcHJvamVjdAotUmVuYW1lX21vZHVsZV9pbl9hbGxfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfMz1SZW5hbWUgbW9kdWxlIGluIGFsbCBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucwotUmVuYW1lX21vZHVsZV9pbl9hbGxfb3RoZXJfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfND1SZW5hbWUgbW9kdWxlIGluIGFsbCBvdGhlciBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucwotUmVuYW1lX21vZHVsZV9kZXBlbmRlbmNpZXNfcmVmZXJlbmNpbmdfc2VsZWN0ZWRfcHJvamVjdF81PVJlbmFtZSBtb2R1bGUgZGVwZW5kZW5jaWVzIHJlZmVyZW5jaW5nIHNlbGVjdGVkIHByb2plY3QKLVJlbmFtZV9Nb2R1bGVfT3B0aW9uc182PVJlbmFtZSBNb2R1bGUgT3B0aW9ucwotUmVuYW1lX0VudGVycHJpc2VfQXBwbGljYXRpb25fT3B0aW9uc183PVJlbmFtZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIE9wdGlvbnMKLVJlbmFtZV9jb3VsZF9ub3RfYmVfY29tcGxldGVkXzg9UmVuYW1lIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQKLVJlbmFtZV9lcnJvcl85PVJlbmFtZSBlcnJvcgotV2hhdF93b3VsZF95b3VfbGlrZV90b19yZW5hbWVfdGhpc190b19fMTA9V2hhdCB3b3VsZCB5b3UgbGlrZSB0byByZW5hbWUgdGhpcyB0bz8KLUNvbnRleHRfUm9vdF9fMTE9Q29udGV4dCByb290OgotUmVuYW1lX3NlbGVjdGVkX0VudGVycHJpc2VfQXBwbGljYXRpb25fcHJvamVjdF9vbmx5XzEyPVJlbmFtZSBzZWxlY3RlZCBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3Qgb25seQotQWxzb19yZW5hbWVfbW9kdWxlX2FuZF91dGlsaXR5X0phdmFfcHJvamVjdHNfMTM9QWxzbyByZW5hbWUgbW9kdWxlIGFuZCB1dGlsaXR5IEphdmEgcHJvamVjdHMKLVByb2plY3RfYWxyZWFkeV9leGlzdHMuPVByb2plY3QgezB9IGFscmVhZHkgZXhpc3RzLgotUHJvamVjdF9zaG91bGRfbm90X2JlX251bGxfMV9FWENfPUlXQUUwMDIxRSBQcm9qZWN0IHNob3VsZCBub3QgYmUgbnVsbAotTm9uLXByb2plY3RfaW5fc2VsZWN0aW9uXzJfRVJST1JfPUlXQUUwMDI0RSBOb24tcHJvamVjdCBpbiBzZWxlY3Rpb24KLQotCi1FUlJPUl9PQ0NVUlJFRF9USVRMRT1FcnJvcgotRVJST1JfT0NDVVJSRURfTUVTU0FHRT1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBwZXJmb3JtaW5nIHRoZSBzZWxlY3RlZCBhY3Rpb24uCi0KLUltcG9ydF9DbGFzc19GaWxlc19VST1JbXBvcnQKLUZpbGVJbXBvcnQuc2VsZWN0U291cmNlPVNlbGVjdCBhIGRpcmVjdG9yeSB0byBpbXBvcnQgZnJvbS4KLUltcG9ydF9DbGFzc2VzPUltcG9ydCBDbGFzcyBGaWxlcy4uLgotQ2xhc3Nlc0ltcG9ydC5mcm9tRGlyPUltcG9ydCBmcm9tIERpcmVjdG9yeQotQ2xhc3Nlc0ltcG9ydC5mcm9tWmlwPUltcG9ydCBmcm9tIFppcCBvciBKYXIKLURhdGFUcmFuc2Zlci5icm93c2U9QnJvd3NlLi4uCi1EYXRhVHJhbnNmZXIuZGlyZWN0b3J5PVNvdXJjZToKLURhdGFUcmFuc2Zlci5maWxlU3lzdGVtVGl0bGU9SW1wb3J0IENsYXNzIEZpbGVzCi1GaWxlSW1wb3J0LmltcG9ydEZpbGVTeXN0ZW09SW1wb3J0IGNsYXNzIGZpbGVzIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotRmlsZUltcG9ydC5zb3VyY2VFbXB0eT1Tb3VyY2UgbXVzdCBub3QgYmUgZW1wdHkuCi1GaWxlSW1wb3J0Lm92ZXJ3cml0ZUV4aXN0aW5nPU92ZXJ3cml0ZSBleGlzdGluZyByZXNvdXJjZXMgd2l0aG91dCB3YXJuaW5nCi1EYXRhVHJhbnNmZXIuc2VsZWN0QWxsPVNlbGVjdCBBbGwKLURhdGFUcmFuc2Zlci5kZXNlbGVjdEFsbD1EZXNlbGVjdCBBbGwKLUltcG9ydF9DbGFzc19GaWxlc19VST1JbXBvcnQKLUZpbGVJbXBvcnQuc2VsZWN0U291cmNlPVNlbGVjdCBhIGRpcmVjdG9yeSB0byBpbXBvcnQgZnJvbS4KLUluY29uc2lzdGVudF9GaWxlc18zPUluY29uc2lzdGVudCBGaWxlcwotVGhlX2ZvbGxvd2luZ193b3Jrc3BhY2VfZmlsZXNfYXJlX2luY29uc2lzdGVudF93aXRoX3RoZV9lZGl0b3JfND1UaGUgZm9sbG93aW5nIHdvcmtzcGFjZSBmaWxlcyBhcmUgaW5jb25zaXN0ZW50IHdpdGggdGhlIGVkaXRvcjogXG4KLVVwZGF0ZV90aGVfZWRpdG9yX3dpdGhfdGhlX3dvcmtzcGFjZV9jb250ZW50c19fNT1VcGRhdGUgdGhlIGVkaXRvciB3aXRoIHRoZSB3b3Jrc3BhY2UgY29udGVudHM/Ci1FcnJvcl9jaGVja2luZ19vdXRfZmlsZXNfMTA9RXJyb3IgY2hlY2tpbmcgb3V0IGZpbGVzCi1JbmNvbnNpc3RlbnRfZmlsZXNfZGV0ZWN0ZWRfMTE9SW5jb25zaXN0ZW50IGZpbGVzIGRldGVjdGVkCi1Nb2R1bGVzX1VJXz1Nb2R1bGVzCi1VdGlsaXR5X0phdmFfUHJvamVjdHNfVUlfPVByb2plY3QgVXRpbGl0eSBKQVJzCi1UaGVfZm9sbG93aW5nX2ZpbGVzX2FyZV9pbmNvbnNpc3RlbnRfd2l0aF90aGVfZmlsZV9zeXN0ZW0uX0RvX3lvdV93YW50X3RvX3NhdmVfYW5kX292ZXJ3cml0ZV90aGVzZV9maWxlc19vbl90aGVfZmlsZV9zeXN0ZW1fXzEyX1dBUk5fPUlXQUUwMDIwVyBUaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgZmlsZSBzeXN0ZW0uXG5EbyB5b3Ugd2FudCB0byBzYXZlIGFuZCBvdmVyd3JpdGUgdGhlc2UgZmlsZXMgb24gdGhlIGZpbGUgc3lzdGVtPwotSjJFRV9MZXZlbD1KMkVFIExldmVsOgotSjJFRV8xMj0xLjIKLUoyRUVfMTM9MS4zCi1KMkVFXzE0PTEuNAotSjJFRV8xMl9ERVNDUklQVElPTj1KMkVFIDEuMiBpbmNsdWRlcyBTZXJ2bGV0IFNwZWNpZmljYXRpb24gbGV2ZWwgMi4yLCBKU1AgU3BlY2lmaWNhdGlvbiBsZXZlbCAxLjEsIGFuZCBFSkIgU3BlY2lmaWNhdGlvbiBsZXZlbCAxLjEuCi1KMkVFXzEzX0RFU0NSSVBUSU9OPUoyRUUgMS4zIGluY2x1ZGVzIENvbm5lY3RvciBBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbiBsZXZlbCAxLjAsIFNlcnZsZXQgU3BlY2lmaWNhdGlvbiBsZXZlbCAyLjMsIEpTUCBTcGVjaWZpY2F0aW9uIGxldmVsIDEuMiwgYW5kIEVKQiBTcGVjaWZpY2F0aW9uIGxldmVsIDIuMC4KLUoyRUVfMTRfREVTQ1JJUFRJT049SjJFRSAxLjQgaW5jbHVkZXMgQ29ubmVjdG9yIEFyY2hpdGVjdHVyZSBTcGVjaWZpY2F0aW9uIGxldmVsIDEuNSwgU2VydmxldCBTcGVjaWZpY2F0aW9uIGxldmVsIDIuNCwgSlNQIFNwZWNpZmljYXRpb24gbGV2ZWwgMS4zLCBhbmQgRUpCIFNwZWNpZmljYXRpb24gbGV2ZWwgMi4xLgotRUpCX0xFVkVMPUVKQiBMZXZlbDoKLUVKQl8xMT0xLjEKLUVKQl8yMD0yLjAKLUVKQl8yMT0yLjEKLUVKQl8xMV9ERVNDUklQVElPTj1FSkIgMS4xIGluY2x1ZGVzIFNlc3Npb24gQmVhbnMsIEJNUCBCZWFucyBhbmQgQ01QIDEuMSBCZWFucy4gIEVKQiAxLjEgbW9kdWxlcyBtYXkgYmUgaW5jbHVkZWQgaW4gZWl0aGVyIEoyRUUgMS4yIG9yIEoyRUUgMS4zIEVudGVycHJpc2UgQXBwbGljYXRpb25zLgotRUpCXzIwX0RFU0NSSVBUSU9OPUVKQiAyLjAgaW5jbHVkZXMgTWVzc2FnZS1Ecml2ZW4gQmVhbnMsIEJNUCBCZWFucywgYW5kIENNUCAxLjEgYW5kIENNUCAyLjAgQmVhbnMuICBFSkIgMi4wIG1vZHVsZXMgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gSjJFRSAxLjMgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMuCi1FSkJfMjFfREVTQ1JJUFRJT049RUpCIDIuMSBpbmNsdWRlcyBNZXNzYWdlLURyaXZlbiBCZWFucywgQk1QIEJlYW5zLCBhbmQgQ01QIDEuMSBhbmQgQ01QIDIuMCBCZWFucy4gIEVKQiAyLjEgbW9kdWxlcyBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBKMkVFIDEuNCBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucy4KLVdFQl9MRVZFTD1XZWIgTGV2ZWw6Ci1XRUJfMjI9Mi4yCi1XRUJfMjM9Mi4zCi1XRUJfMjQ9Mi40Ci1XRUJfMjJfREVTQ1JJUFRJT049V2ViIDIuMiBpbmNsdWRlcyBTZXJ2bGV0IHNwZWNpZmljYXRpb24gMi4yIGFuZCBKU1Agc3BlY2lmaWNhdGlvbiAxLjEuCi1XRUJfMjNfREVTQ1JJUFRJT049V2ViIDIuMyBpbmNsdWRlcyBTZXJ2bGV0IHNwZWNpZmljYXRpb24gMi4zIGFuZCBKU1Agc3BlY2lmaWNhdGlvbiAxLjIuCi1XRUJfMjRfREVTQ1JJUFRJT049V2ViIDIuNCBpbmNsdWRlcyBTZXJ2bGV0IHNwZWNpZmljYXRpb24gMi40IGFuZCBKU1Agc3BlY2lmaWNhdGlvbiAyLjAuCi1BUFBfQ0xJRU5UX0xFVkVMPUFwcGxpY2F0aW9uIENsaWVudCBMZXZlbDoKLUFQUF9DTElFTlRfMTJfREVTQ1JJUFRJT049QXBwbGljYXRpb24gMS4yIGluY2x1ZGVzIHRoZSBBcHBsY2lhdGlvbiBjbGllbnQgc3BlY2lmaWNhdGlvbiBsZXZlbCAxLjIuCi1BUFBfQ0xJRU5UXzEzX0RFU0NSSVBUSU9OPUFwcGxpY2F0aW9uIDEuMyBpbmNsdWRlcyB0aGUgQXBwbGNpYXRpb24gY2xpZW50IHNwZWNpZmljYXRpb24gbGV2ZWwgMS4zLgotQVBQX0NMSUVOVF8xNF9ERVNDUklQVElPTj1BcHBsaWNhdGlvbiAxLjQgaW5jbHVkZXMgdGhlIEFwcGxjaWF0aW9uIGNsaWVudCBzcGVjaWZpY2F0aW9uIGxldmVsIDEuNC4KLUNPTk5FQ1RPUl9MRVZFTD1Db25uZWN0b3IgQXJjaGl0ZWN0dXJlIExldmVsOgotQ09OTkVDVE9SXzEwPTEuMAotQ09OTkVDVE9SXzE1PTEuNQotQ09OTkVDVE9SXzEwX0RFU0NSSVBUSU9OPUNvbm5lY3RvciBBcmNoaXRlY3R1cmUgMS4wIG1vZHVsZXMgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gSjJFRSAxLjMgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMuCi1DT05ORUNUT1JfMTVfREVTQ1JJUFRJT049Q29ubmVjdG9yIEFyY2hpdGVjdHVyZSAxLjUgbW9kdWxlcyBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBKMkVFIDEuNCBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucy4KLURFU0NSSVBUSU9OPURlc2NyaXB0aW9uOgotV0VCX0NPTlRFWFRfUk9PVD1Db250ZXh0IFJvb3Q6Ci1XRUJfQ09OVEVOVF9GT0xERVJfTkFNRT1XZWIgY29udGVudCBmb2xkZXIgbmFtZToKLUZpbGVJbXBvcnQuaW52YWxpZFNvdXJjZSA9IFNvdXJjZSBkaXJlY3RvcnkgaXMgbm90IHZhbGlkIG9yIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQuCi1GaWxlSW1wb3J0LmltcG9ydFByb2JsZW1zID0gSW1wb3J0IFByb2JsZW1zCi1EYXRhVHJhbnNmZXIuaW5mb3JtYXRpb24gPSBJbmZvcm1hdGlvbgotRmlsZUltcG9ydC5ub25lU2VsZWN0ZWQgPSBUaGVyZSBhcmUgbm8gcmVzb3VyY2VzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgaW1wb3J0LgotRmlsZV9TZWxlY3Rpb25fVUlfPUZpbGUgU2VsZWN0aW9uCi1TZWxlY3RfYV9maWxlX19VSV89U2VsZWN0IGEgZmlsZToKLUZsZXhpYmxlX1N0cnVjdHVyZT1Vc2UgZmxleGlibGUgcHJvamVjdCBzdHJ1Y3R1cmUKLUZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLnRpdGxlPUoyRUUgUHJvamVjdAotRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubWFpblBhZ2UuZGVzYz1DcmVhdGUgYSBKMkVFIHByb2plY3QuCi1GbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZC50aXRsZT1KMkVFIFByb2plY3QKLUVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlPU5ldyBFQVIgQXBwbGljYXRpb24gUHJvamVjdAotRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UudGl0bGU9RUFSIEFwcGxpY2F0aW9uIFByb2plY3QKLUVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2M9Q3JlYXRlIGEgRUFSIGFwcGxpY2F0aW9uLgotRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuc2Vjb25kUGFnZS50aXRsZT1KMkVFIE1vZHVsZXMgdG8gQWRkIHRvIHRoZSBFQVIKLUVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnNlY29uZFBhZ2UuZGVzYz1TZWxlY3QgdGhlIEoyRUUgbW9kdWxlcyB0byBhZGQgdG8gdGhlIG5ldyBFQVIgYXBwbGljYXRpb24gZnJvbSB0aGUgbGlzdC4gXG5TZWxlY3QgTmV3IE1vZHVsZSBidXR0b24gdG8gY3JlYXRlIGEgbmV3IEoyRUUgbW9kdWxlLgotQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQudGl0bGU9TmV3IEFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0Ci1BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5tYWluUGFnZS50aXRsZT1BcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdAotQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UuZGVzYz1DcmVhdGUgYSBBcHBsaWNhdGlvbiBDbGllbnQuCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlPUNyZWF0ZSBkZWZhdWx0IEoyRUUgbW9kdWxlcy4KLURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS50aXRsZT1OZXcgSjJFRSBNb2R1bGUKLURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5kZXNjPUNyZWF0ZSBhIG5ldyBKMkVFIG1vZHVsZSBmb3IgdGhlIHNlbGVjdGVkIG1vZHVsZSB0eXBlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwuZWpiPUVKQiBtb2R1bGUKLURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5sYWJlbC53ZWI9V2ViIG1vZHVsZQotRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmpjYT1Db25uZWN0b3IgbW9kdWxlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwuYXBwY2xpZW50PUFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUKLURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5idXR0b24uc2VsZWN0PUNyZWF0ZSBkZWZhdWx0IG1vZHVsZXMKLQotRk9MREVSX0xBQkVMPUZvbGRlcjoKLUJST1dTRV9CVVRUT05fTEFCRUw9QnJvd3NlLi4uCi1KQVZBX1BBQ0tBR0VfTEFCRUw9SmF2YSBwYWNrYWdlOgotQ0xBU1NfTkFNRV9MQUJFTD1DbGFzcyBuYW1lOgotU1VQRVJDTEFTU19MQUJFTD1TdXBlcmNsYXNzOgotQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9Q29udGFpbmVyIFNlbGVjdGlvbgotQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfREVTQz1DaG9vc2UgYSBDb250YWluZXI6Ci1DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19WQUxJREFUT1JfTUVTRz1DaG9vc2UgYSB2YWxpZCBqYXZhIHNvdXJjZSBmb2xkZXIgZm9yIHRoZSBzZWxlY3RlZCBtb2R1bGUuCi1QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9UGFja2FnZSBTZWxlY3Rpb24KLVBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDPUNob29zZSBhIHBhY2thZ2U6Ci1QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkU9Tm8gcGFja2FnZXMgdG8gY2hvb3NlIGZyb20KLVNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1TdXBlcmNsYXNzIFNlbGVjdGlvbgotU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGEgc3VwZXJjbGFzczoKLUpBVkFfQ0xBU1NfTU9ESUZJRVJTX0xBQkVMPU1vZGlmaWVyczoKLUpBVkFfQ0xBU1NfUFVCTElDX0NIRUNLQk9YX0xBQkVMPVB1YmxpYwotSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTD1BYnN0cmFjdAotSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTD1GaW5hbAotSkFWQV9DTEFTU19JTlRFUkZBQ0VTX0xBQkVMPUludGVyZmFjZXM6Ci1KQVZBX0NMQVNTX01FVEhPRF9TVFVCU19MQUJFTD1XaGljaCBtZXRob2Qgc3R1YnMgd291bGQgeW91IGxpa2UgdG8gY3JlYXRlPwotSkFWQV9DTEFTU19NQUlOX0NIRUNLQk9YX0xBQkVMPXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi1KQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMPUNvbnN0cnVjdG9ycyBmcm9tIHN1cGVyY2xhc3MKLUpBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTD1Jbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kcwotQUREX0JVVFRPTl9MQUJFTD1BZGQuLi4KLVJFTU9WRV9CVVRUT049UmVtb3ZlCi1JTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1JbnRlcmZhY2UgU2VsZWN0aW9uCi1KQVZBVVRJTElUWV9NQUlOX1BHX1RJVExFPUphdmEgQ29tcG9uZW50Ci1KQVZBVVRJTElUWV9NQUlOX1BHX0RFU0M9Q3JlYXRlIGEgSmF2YSBDb21wb25lbnQKLUpBVkFVVElMX0NPTVBPTkVOVF9XSVpfVElUTEU9TmV3IEphdmEgQ29tcG9uZW50IE1vZHVsZQotQVZBSUxBQkxFX0oyRUVfQ09NUE9ORU5UUz0gQXZhaWxhYmxlIEoyRUUgbW9kdWxlcwotRVhURVJOQUxfSkFSPUFkZCBFeHRlcm5hbCBKYXJzLi4uCi1BRERWQVJJQUJMRT1BZGQgVmFyaWFibGUuLi4KLVNVUFBPUlRNVUxUSVBMRU1PRFVMRVM9U3VwcG9ydCBNdWx0aXBsZSBNb2R1bGVzIHBlciBwcm9qZWN0Ci1TT1VSQ0VGT0xERVI9U291cmNlIEZvbGRlcjoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2pjYV91aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiOGFjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2pjYV91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotMD1GYWlsZWQgdG8gZmluZCB0aGUgaW1hZ2UgInswfSIuCi0xPU5ldyBDb25uZWN0b3IgUHJvamVjdAotMj1KMkMgdmVyc2lvbjoKLTM9Q29ubmVjdG9yIFByb2plY3QKLTQ9Q3JlYXRlIGEgc3RhbmRhbG9uZSBDb25uZWN0b3IgcHJvamVjdCBvciBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LgotNT1JbXBvcnQgYSBDb25uZWN0b3IgbW9kdWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtCi02PUNvbm5lY3RvciBJbXBvcnQKLTc9Q29ubmVjdG9yIGZpbGU6Ci04PUNvbm5lY3RvciBtb2R1bGU6Ci05PUNvbm5lY3RvciBFeHBvcnQKLTEwPUV4cG9ydCBDb25uZWN0b3IgbW9kdWxlIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvbWFuaWZlc3RfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvbWFuaWZlc3RfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljZDdlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL21hbmlmZXN0X3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1VcF8xPSZVcAotRG93bl8yPSZEb3duCi1TZWxlY3RfQWxsXzM9U2VsZWN0ICZBbGwKLURlc2VsZWN0X0FsbF80PUQmZXNlbGVjdCBBbGwKLUVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX1RJVExFPUVycm9yIFJlYWRpbmcgTWFuaWZlc3QKLVNBVkVfTUFOSUZFU1RfV0lUSF9FUlJPUj1UaGUgbWFuaWZlc3QgZmlsZSBjb250YWlucyBlcnJvcnMgYW5kIGNhbiBub3QgYmUgcGFyc2VkLiAgVGhlIGZpbGUgd2lsbCBiZSBzYXZlZCBidXQgdGhlIEphdmEgYnVpbGQgcGF0aCB3aWxsIG5vdCBiZSB1cGRhdGVkLiAgRm9sbG93aW5nIGFyZSBjb21tb24gbGltaXRhdGlvbnMgd2hpY2ggY2FuIGNhdXNlIHByb2JsZW1zOgotRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9FRElUT1I9VGhlIG1hbmlmZXN0IGZpbGUgY29udGFpbnMgZXJyb3JzIGFuZCBjYW4gbm90IGJlIHBhcnNlZC4gIE90aGVyIHBhZ2VzIGNhbm5vdCBiZSB1c2VkIHVudGlsIHRoZXNlIGVycm9ycyBhcmUgY29ycmVjdGVkLiAgRm9sbG93aW5nIGFyZSBjb21tb24gbGltaXRhdGlvbnMgd2hpY2ggY2FuIGNhdXNlIHByb2JsZW1zOgotRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9QUk9QX1BBR0U9VGhlIG1hbmlmZXN0IGZpbGUgY29udGFpbnMgZXJyb3JzIGFuZCBjYW4gbm90IGJlIHBhcnNlZC4gIEZvbGxvd2luZyBhcmUgY29tbW9uIGxpbWl0YXRpb25zIHdoaWNoIGNhbiBjYXVzZSBwcm9ibGVtczoKLU1BTklGRVNUX1BST0JMRU1fMT0qIExpbmVzIGluIHRoZSBmaWxlIG11c3QgYmUgbm8gZ3JlYXRlciB0aGFuIDcyIGJ5dGVzLiBDb250aW51YXRpb24gb2YgbG9uZyBsaW5lcyBpcyBpbmRpY2F0ZWQgYnkgYSBuZXcgbGluZSBhbmQgYSBzcGFjZS4KLU1BTklGRVNUX1BST0JMRU1fMj0qIFRoZSBsYXN0IGxpbmUgaW4gdGhlIGZpbGUgbXVzdCBlbmQgd2l0aCBhIG5ldyBsaW5lIG9yIGl0IHdpbGwgbm90IGJlIHBhcnNlZC4KLU1BTklGRVNUX1BST0JMRU1fMz0qIEJsYW5rIGxpbmVzIHdpdGggZXh0cmEgd2hpdGUgc3BhY2UgbWF5IGNhdXNlIHBhcnNlIHRvIGZhaWwuCi1NQU5JRkVTVF9QUk9CTEVNXzQ9KiBUaGUgYXR0cmlidXRlcyBtdXN0IGJlIGZvcm1hdHRlZCBjb3JyZWN0bHkuICBSZWZlciB0byB0aGUgbWFuaWZlc3QgYW5kIEpBUiBmaWxlIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1Bbl9pbnRlcm5hbF9lcnJvcl9vY2N1cnJlZF9FUlJPUl89SVdBRTAwMTBFIEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkOgotUHJvamVjdF9uYW1lX19VSV89UHJvamVjdCBuYW1lOgotRUFSX1Byb2plY3RfTmFtZV9fVUlfX1VJXz1FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgbmFtZToKLUF2YWlsYWJsZV9kZXBlbmRlbnRfSkFSc19fVUlfPUF2YWlsYWJsZSBkZXBlbmRlbnQgSkFSczoKLU1hbmlmZXN0X0NsYXNzLVBhdGhfX1VJXz1NYW5pZmVzdCBDbGFzcy1QYXRoOgotSkFSL01vZHVsZV9VSV89SkFSL01vZHVsZQotUHJvamVjdF9VSV89UHJvamVjdAotRUFSX01vZHVsZXM9RUFSIE1vZHVsZXM6Ci1FQVJfTW9kdWxlc19EZXNjPVRoaXMgcHJvcGVydHkgcGFnZSBsZXRzIHlvdSBzZXR1cCB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBpbiBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uLgotSjJFRV9Nb2R1bGVzPUoyRUUgTW9kdWxlczoKLUoyRUVfTW9kdWxlc19EZXNjPVRoaXMgcHJvcGVydHkgcGFnZSBsZXRzIHlvdSBzZXR1cCB0aGUgajJlZSBtb2R1bGUgZGVwZW5kZW5jaWVzIHdpdGggb3RoZXIgajJlZSBtb2R1bGVzIHdpdGhpbiBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uLiAgQWxsIG1vZHVsZXMgaW52b2x2ZWQgaW4gdGhlIGRlcGVuZGVuY3kgbmVlZCB0byBiZWxvbmcgdG8gdGhlIHNhbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbi4KLVdlYl9MaWJyYXJpZXM9V2ViIExpYnJhcmllczoKLVdlYl9MaWJyYXJpZXNfRGVzYz1UaGlzIHByb3BlcnR5IHBhZ2UgbGV0cyB5b3UgYWRkIHRoZSBXZWIgTGlicmFyeSBkZXBlbmRlbmN5IHRvIG90aGVyIGphdmEgbW9kdWxlcyBpbiB0aGUgd29ya3BzcGFjZS4gVGhpcyBkZXBlbmRlbmN5IHJlc29sdmVzIHRoZSBqYXZhIG1vZHVsZXMgaW50byB0aGUgd2ViXFxsaWIgZm9sZGVyIG9mIHRoZSB3ZWIgbW9kdWxlIGF0IGRlcGxveW1lbnQgdGltZS4KLUVBUl9Nb2R1bGVfRGVwX0Vycm9yPUoyRUUgTW9kdWxlcyBpcyBub3QgdmFsaWQgZm9yIEVBUiBtb2R1bGVzLgotSmFyX0RlcF9PbmVfTW9kdWxlX0Vycm9yPUphdmEgSmFyIERlcGVuZGVuY2llcyBpcyB2YWxpZCBvbmx5IGZvciBvbmUgbW9kdWxlIHBlciBmbGV4aWJsZSBwcm9qZWN0LgotV2ViX0xpYl9FcnJvcj1XZWIgbGlicmFyeSBzZXR0aW5ncyBhcmUgb25seSB2YWxpZCBmb3IgV2ViIG1vZHVsZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9taWd3aXphcmRzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL21pZ3dpemFyZHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4MjE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL21pZ3dpemFyZHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jbWlncmF0aW9uIHdpemFyZHMKLVNlbGVjdF9BbGw9U2VsZWN0IEFsbAotRGVzZWxlY3RfQWxsPURlc2VsZWN0IEFsbAotTWlncmF0aW9uX1dpemFyZF9UaXRsZV89SjJFRSBNaWdyYXRpb24gV2l6YXJkCi1KMkVFX01pZ3JhdGlvbl9XaXphcmRfV2VsY29tZV89SjJFRSBNaWdyYXRpb24gV2l6YXJkIFdlbGNvbWUgUGFnZQotV2VsY29tZV9Ub19UaGVfSjJFRV9NaWdyYXRpb25fV2l6YXJkXz1XZWxjb21lIHRvIHRoZSBKMkVFIE1pZ3JhdGlvbiBXaXphcmQKLVBsZWFzZV9SZWFkX1RoZV9Gb2xsb3dpbmdfSW5mb3JtYXRpb25fPVBsZWFzZSByZWFkIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24sIHRoZW4gY2xpY2sgTmV4dC4KLVRoZV9NaWdyYXRpb25fV2l6YXJkX0d1aWRlc19UaGVfUHJvY2Vzc189VGhlIE1pZ3JhdGlvbiBXaXphcmQgZ3VpZGVzIHRoZSBwcm9jZXNzIG9mIG9wdGlvbmFsbHkgbWlncmF0aW5nIHlvdXIgSjJFRSBwcm9qZWN0IHN0cnVjdHVyZXMgYW5kIHRoZSBKMkVFIHZlcnNpb24gb2YgdGhlIGFzc29jaWF0ZWQgcHJvamVjdHMuCi1Qcmlvcl9Ub19Qcm9jZWVkaW5nX1dpdGhfVGhlX01pZ3JhdGlvbl9XaXphcmRfPVByaW9yIHRvIHByb2NlZWRpbmcgd2l0aCB0aGUgTWlncmF0aW9uIFdpemFyZCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB5b3U6Ci1SZWFkX1RoZV9PbmxpbmVfSGVscF9TZWN0aW9uXz1SZWFkIHRoZSBvbmxpbmUgaGVscCBvbiBNaWdyYXRpbmcgYXBwbGljYXRpb25zIHRvIEoyRUUgMS4zIGFuZCBKMkVFIDEuNCBzcGVjaWZpY2F0aW9uIGxldmVscy4iCi1CYWNrdXBfWW91cl9FbnRpcmVfV29ya3NwYWNlXz1CYWNrdXAgeW91ciBlbnRpcmUgd29ya3NwYWNlLgotSWZfV29ya2luZ19XaXRoX0FfUmVwb3NpdG9yeV89SWYgd29ya2luZyB3aXRoIGEgcmVwb3NpdG9yeSwgImNoZWNrIG91dCIgb3IgImxvY2siIGFsbCBjb3JyZXNwb25kaW5nIHByb2plY3RzLgotT25jZV9UaGVfTWlncmF0aW9uX1dpemFyZF9Jc19Db21wbGV0ZV89T25jZSB0aGUgTWlncmF0aW9uIFdpemFyZCBpcyBjb21wbGV0ZSwgdGhlIGRldGFpbHMgb2YgdGhlIHN0ZXBzIHBlcmZvcm1lZCBkdXJpbmcgbWlncmF0aW9uIHdpbGwgYmUgcHJlc2VudGVkIGluIGEgcmVzdWx0cyB3aW5kb3cuICBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gd3JpdHRlbiB0byB0aGUgTG9nZ2luZ1V0aWwubG9nIGZpbGUgaW4gdGhlIC5tZXRhZGF0YSBmb2xkZXIgaW4geW91ciBsb2NhbCB3b3Jrc3BhY2UuCi1CYXNlZF9Pbl9UaGVfTnVtYmVyX09mX1Byb2plY3RzXz1CYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHByb2plY3RzLCBtaWdyYXRpb24gbWF5IHRha2UgYSBmZXcgbWludXRlcy4KLUVudGVycHJpc2VfQXBwbGljYXRpb25fPUVudGVycHJpc2UgQXBwbGljYXRpb24KLVRoZV9mb2xsb3dpbmdfZW50ZXJwcmlzZV9hcHBsaWNhdGlvbl9wcm9qZWN0Xz1UaGUgZm9sbG93aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB3aWxsIGJlIG1pZ3JhdGVkLiAgVGhlIHByb2plY3Qgc3RydWN0dXJlIG1pZ3JhdGlvbiBpcyBvcHRpb25hbC4KLUVudGVycHJpc2VfQXBwbGljYXRpb25fUHJvamVjdF89RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0OgotTWlncmF0ZV9Qcm9qZWN0X1N0cnVjdHVyZV89TWlncmF0ZSBwcm9qZWN0IHN0cnVjdHVyZS4KLU1pZ3JhdGVfUHJvamVjdF9Gcm9tX1ZlcnNpb25fPU1pZ3JhdGUgcHJvamVjdCBKMkVFIHNwZWNpZmljYXRpb24gbGV2ZWwuCi1WZXJzaW9uX0xldmVsPUoyRUUgdmVyc2lvbgotVEFSR0VUX1NFUlZFUj1UYXJnZXQgU2VydmVyCi1UaGVfUHJvamVjdF9WZXJzaW9uX0FuZF9UaGVfRGVwbG95bWVudF9EZXNjcmlwdG9yXz1UaGUgcHJvamVjdCB2ZXJzaW9uIGFuZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFyZSBtaWdyYXRlZCBmb3IgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24uICBUaGlzIG1pZ3JhdGlvbiBhbGxvd3MgZm9yIHRoZSBpbmNsdXNpb24gb2YgSjJFRSAxLjMgbW9kdWxlcyBpbnRvIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLgotTWlncmF0ZV9BbGxfTW9kdWxlX1Byb2plY3RzXz1NaWdyYXRlIGFsbCBtb2R1bGUgcHJvamVjdHMKLUFsbF9FSkJfV2ViX0FwcGxpY2F0aW9uX0NsaWVudF9Nb2R1bGVzX1JlZmVyZW5jZWRfPUFsbCBFSkIsIHdlYiwgYW5kIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzIHJlZmVyZW5jZWQgYnkgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gYXJlIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgZm9yIG1pZ3JhdGlvbi4KLVNlbGVjdF9UaGVfRmluaXNoX0J1dHRvbl9Ub19BY2NlcHRfVGhlX0RlZmF1bHRfPVNlbGVjdCB0aGUgRmluaXNoIGJ1dHRvbiB0byBhY2NlcHQgdGhlIGRlZmF1bHQgbWlncmF0aW9uIG9wdGlvbnMgZm9yIGFsbCBtb2R1bGUgcHJvamVjdHMsIG9yIGN1c3RvbWl6ZSB0aGUgbWlncmF0aW9uIG9wdGlvbnMgZm9yIGVhY2ggdHlwZSBvZiBtb2R1bGUgcHJvamVjdCBvbiB0aGUgZm9sbG93aW5nIHBhZ2VzLgotTWlncmF0ZV9Qcm9qZWN0X0Zyb21fVmVyc2lvbl9FSkJfPU1pZ3JhdGUgcHJvamVjdCBmcm9tIHZlcnNpb24gbGV2ZWwgSjJFRSAxLjIgKEVKQiAxLngpIHRvIEoyRUUgMS4zIChFSkIgMi54KQotRUpCX01vZHVsZV9NaWdyYXRpb25fPUVKQiBNb2R1bGUgTWlncmF0aW9uCi1TZWxlY3RfdGhlX0VKQl9wcm9qZWN0c190b19iZV9taWdyYXRlZF89U2VsZWN0IHRoZSBFSkIgcHJvamVjdHMgdG8gYmUgbWlncmF0ZWQuICBUaGUgcHJvamVjdCBzdHJ1Y3R1cmVzIG1pZ3JhdGlvbiBpcyBvcHRpb25hbC4KLU1pZ3JhdGVkX0NNUF9CZWFuc19Ub189TWlncmF0ZSBDTVAgMS54IGJlYW5zIHRvIENNUCAyLnggYmVhbnMKLUFkZF9Mb2NhbF9DbGllbnRfVmlld3NfPUFkZCBsb2NhbCBjbGllbnQgdmlld3MKLUF2YWlsYWJsZV9Qcm9qZWN0c189UHJvamVjdHM6Ci1TZWxlY3RlZF9Qcm9qZWN0c189ezB9IG9mIHsxfSBwcm9qZWN0cyBzZWxlY3RlZC4KLVNlbGVjdGVkX0JlYW5zX01pZ3JhdGlvbl89ezB9IG9mIHsxfSBiZWFucyBzZWxlY3RlZC4KLUFwcGxpY2F0aW9uX0NsaWVudF9Qcm9qZWN0c189QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3RzOgotQ29ubmVjdG9yX1Byb2plY3RzXz1Db25uZWN0b3IgUHJvamVjdHM6Ci1TZWxlY3RfVGhlX0Nvbm5lY3Rvcl9Qcm9qZWN0c189U2VsZWN0IHRoZSBjb25uZWN0b3IgcHJvamVjdHMgdG8gYmUgbWlncmF0ZWQuIFRoZSBwcm9qZWN0IHN0cnVjdHVyZSBtaWdyYXRpb24gaXMgb3B0aW9uYWwuCi1TZWxlY3RfVGhlX0FwcGxpY2F0aW9uX0NsaWVudF9Qcm9qZWN0c189U2VsZWN0IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgdG8gYmUgbWlncmF0ZWQuIFRoZSBwcm9qZWN0IHN0cnVjdHVyZSBtaWdyYXRpb24gaXMgb3B0aW9uYWwuCi1XRUJfTUlHUkFURV9XSVpBUkRfVElUTEU9V2ViIFByb2plY3RzOgotV0VCX01JR1JBVEVfV0laQVJEX0RFU0NSSVBUSU9OPVNlbGVjdCB0aGUgd2ViIHByb2plY3RzIHRvIGJlIG1pZ3JhdGVkLiAgVGhlIHByb2plY3Qgc3RydWN0dXJlIG1pZ3JhdGlvbiBpcyBvcHRpb25hbC4KLVNlbGVjdF90aGVfZW50ZXJwcmlzZV9iZWFuc190aGF0X3dpbGxfaGF2ZV89U2VsZWN0IHRoZSBlbnRlcnByaXNlIGJlYW5zIHRoYXQgd2lsbCBoYXZlIGxvY2FsIGNsaWVudCB2aWV3cyBhZGRlZC4KLUVudGVycHJpc2VfQmVhbnNfU2VsZWN0aW9uXz1FbnRlcnByaXNlIEJlYW5zCi1TZWxlY3RfQWxsX0VudGl0eV9CZWFuc189U2VsZWN0IEFsbCBFbnRpdHkgQmVhbnMKLVNlbGVjdF9SZXF1aXJlZF9CZWFuc189U2VsZWN0IFJlcXVpcmVkCi1EZWxldGVfUmVtb3RlX0NsaWVudF9WaWV3c189RGVsZXRlIHJlbW90ZSBjbGllbnQgdmlld3MKLUxvY2FsX0NsaWVudF9WaWV3X05hbWluZ19TY2hlbWVfPUxvY2FsIGNsaWVudCB2aWV3IG5hbWluZyBzY2hlbWUKLVJldXNlX1RoZV9EZWxldGVkX1JlbW90ZV9DbGllbnRfVmlld189UmV1c2UgdGhlIGRlbGV0ZWQgcmVtb3RlIGNsaWVudCB2aWV3IG5hbWUKLVNwZWNpZnlfU3VmZml4Xz1TcGVjaWZ5IHN1ZmZpeDoKLUVKQl9DbGllbnRfVmlld19FeGFtcGxlXz1Gb3IgZXhhbXBsZSwgRUpCIGJlYW4gIkZvbyIgd2lsbCBoYXZlIGxvY2FsIGNsaWVudCB2aWV3cyBuYW1lZDogIkZvb3swfSIgYW5kICJGb297MX1Ib21lIi4KLVRoZV9TdWZmaXhfVGV4dF9DYW5fTm90X0JlXz1UaGUgc3VmZml4IHRleHQgY2Fubm90IGJlIGVtcHR5LgotQV9Qcm9qZWN0X011c3RfQmVfU2VsZWN0ZWRfPUEgcHJvamVjdCBtdXN0IGJlIHNlbGVjdGVkIGluIG9yZGVyIHRvIG1pZ3JhdGUuCi1BX0JlYW5fTXVzdF9CZV9TZWxlY3RlZF89QSBiZWFuIG11c3QgYmUgc2VsZWN0ZWQgaW4gb3JkZXIgdG8gbWlncmF0ZSB0aGUgbG9jYWwgY2xpZW50IHZpZXcuCi0jbW92ZWQgZnJvbSBtb2ZqMmVlLnByb3BlcnRpZXMKLVN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlPVN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Ci1FUlJPUj1FcnJvcjoKLVdBUk5JTkc9V2FybmluZzoKLUlORk89SW5mbzoKLURFRkFVTFRfQ09NUExFVEVEX1NUQVRVU19NU0c9TWlncmF0aW9uIHdhcyBjb21wbGV0ZWQgZm9yIHswfS4KLURFRkFVTFRfTk9UX05FRURFRF9TVEFUVVNfTVNHPU1pZ3JhdGlvbiB3YXMgbm90IHJlcXVpcmVkIGZvciB7MH0uCi1ERUZBVUxUX05PVF9QT1NTSUJMRV9TVEFUVVNfTVNHPU1pZ3JhdGlvbiB3YXMgbm90IHBvc3NpYmxlIGZvciB7MH0uCi1ERUZBVUxUX0VSUk9SX1NUQVRVU19NU0c9SVdBRTAwMDNFIEVycm9yIG1pZ3JhdGluZyB7MH0uCi1SRU1PVkVEX0xPQ0FMX0NMSUVOVF9NU0c9UmVtb3ZlZCBsb2NhbCBjbGllbnQgdmlldyBmb3IgRUpCIHswfS4KLVJFTU9WRURfQUNDRVNTX0lOVEVOVFNfTVNHPVJlbW92ZWQgezB9IDEuMSBtZXRob2QgYWNjZXNzIGludGVudChzKSBmcm9tIENNUCBiZWFuIHsxfS4KLVJFTU9WRURfSVNPTEFUSU9OX0xFVkVMU19NU0c9UmVtb3ZlZCB7MH0gMS4xIG1ldGhvZCBpc29sYXRpb24gbGV2ZWwocykgZnJvbSBDTVAgYmVhbiB7MX0uCi1DT05WRVJURURfRklOREVSX01TRz1Db252ZXJ0ZWQgZmluZGVyIGRlc2NyaXB0ZXIgZm9yIHswfSBpbiBDTVAgYmVhbiB7MX0uICBVc2UgdGhlIEVKQiBlZGl0b3IgdG8gdXBkYXRlIHRoZSBxdWVyeSBFSkIgUUwuCi1VTk5BTUVEX0VKQj08VW5uYW1lZCBDTVAgYmVhbj4KLUNPTlZFUlRFRF9RVUVSWV9ERVNDUklQVElPTj1Db252ZXJ0ZWQgZnJvbSBJQk0gdmVyc2lvbiAxLjEgZXh0ZW5zaW9ucy4KLU1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9KQVJfTVNHPU1pZ3JhdGVkIGRlZmF1bHQgRGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgZGVmYXVsdCBDTVAgQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcgZm9yIEVKQiBKQVIgXCJ7MH1cIi4KLU1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9NU0c9TWlncmF0ZWQgZGVmYXVsdCBEYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZyBmb3IgRUpCIEpBUi4KLUoyRUVfVkVSU0lPTl9OVUxMX0VSUk9SPVVuYWJsZSB0byBnZXQgSjJFRSB2ZXJzaW9uIG9mIG9iamVjdCBiZWNhdXNlIGl0IGlzIG5vdCBjb250YWluZWQgYnkgYSBkb2N1bWVudC4KLUoyRUVfVkVSU0lPTl9QUk9YWV9FUlJPUj1VbmFibGUgdG8gZ2V0IEoyRUUgdmVyc2lvbiBvZiByZWZlcmVuY2VkIG9iamVjdCBiZWNhdXNlIHRoZSBwcm94eSBjYW5ub3QgYmUgcmVzb2x2ZWQuICBDaGVjayB0aGUgaWRzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMuICBIUkVGID0gezB9LgotI21vdmVkIGZyb20gajJlZWNyZWF0aW9uLnByb3BlcnRpZXMKLUoyRUVfUFJPSkVDVF9NSUdSQVRJT05fVElUTEVfVUlfPUoyRUUgUHJvamVjdCBNaWdyYXRpb24KLUVOVEVSUFJJU0VfQVBQTElDQVRJT05TX1VJXz1FbnRlcnByaXNlIEFwcGxpY2F0aW9ucwotV0laX0JBTl9ERVNDX1VJXz1TZWxlY3QgdGhlIHswfSBwcm9qZWN0cyB0byBiZSBtaWdyYXRlZC4gVGhlIHByb2plY3Qgc3RydWN0dXJlIG1pZ3JhdGlvbiBpcyBvcHRpb25hbC4KLUVOVEVSUFJJU0VfQVBQX1BST0pFQ1RTX1VJXz1FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzOgotTUlHUkFURV9KMkVFX1NQRUNfVUlfPU1pZ3JhdGUgcHJvamVjdCBmcm9tIHZlcnNpb24gbGV2ZWwgSjJFRSAxLjIgdG8gSjJFRSAxLjMKLU1JR1JBVEVfRUpCX1NQRUNfVUlfPU1pZ3JhdGUgcHJvamVjdCBmcm9tIHZlcnNpb24gbGV2ZWwgRUpCIDEuMSB0byBFSkIgMi4wCi1NSUdSQVRFX01PRFVMRV9QUk9KRUNUU19VSV89TWlncmF0ZSBtb2R1bGUgcHJvamVjdHMKLUFQUExJQ0FUSU9OX0NMSUVOVFNfVUlfPUFwcGxpY2F0aW9uIENsaWVudHMKLUFQUExJQ0FUSU9OX0NMSUVOVF9QUk9KRUNUU19VSV89QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzOgotRU5URVJQUklTRV9CRUFOU19CQU5fVUlfPUVudGVycHJpc2UgQmVhbnMKLUVKQl9QUk9KRUNUU19VSV89RUpCIHByb2plY3RzOgotQUREX0xPQ0FMX0NMSUVOVF9WSUVXU19DSEVDS19VSV89QWRkIGxvY2FsIGNsaWVudCB2aWV3cwotTUlHUkFURV9DTVBfQkVBTlNfVUlfPU1pZ3JhdGUgQ01QIDEuMSBiZWFucyB0byBDTVAgMi4wIGJlYW5zCi1BRERfTE9DQUxfQ0xJRU5UX1ZJRVdTX0JBTl9VSV89QWRkIExvY2FsIENsaWVudCBWaWV3cwotU0VMRUNUX0VKQl9DTElFTlRfVklFV1NfVUlfPVNlbGVjdCB0aGUgZW50ZXJwcmlzZSBiZWFucyB0aGF0IHdpbGwgaGF2ZSBsb2NhbCBjbGllbnQgdmlld3MgYWRkZWQuCi1FTlRFUlBSSVNFX0JFQU5TX0xJU1RfVUlfPUVudGVycHJpc2UgYmVhbnM6Ci1ERUxFVEVfUkVNX0NMSUVOVF9WSUVXU19VSV89RGVsZXRlIHJlbW90ZSBjbGllbnQgdmlld3MKLUxPQ0FMX0NMSUVOVF9WSUVXX1NDSEVNRV9VSV89TG9jYWwgY2xpZW50IHZpZXcgbmFtaW5nIHNjaGVtZToKLVJFVVNFX0RFTEVURURfQ0xJRU5UX1ZJRVdfTkFNRV9VSV89UmV1c2UgdGhlIGRlbGV0ZWQgcmVtb3RlIGNsaWVudCB2aWV3IG5hbWUKLVNQRUNJRllfU1VGRklYX1VJXz1TcGVjaWZ5IHN1ZmZpeDoKLVNVRkZJWF9FWEFNUExFX1VJXz0oRm9yIGV4YW1wbGUsIGVudGVycHJpc2UgYmVhbiBcJ2Zvb1wnIHdpbGwgaGF2ZSBsb2NhbCBjbGllbnQgdmlld3MgbmFtZWQ6IFwnZm9vTG9jYWxcJyBhbmQgXCdmb29Mb2NhbEhvbWVcJy4pCi1NSUdSQVRJT05fU1VDQ0VTU19SRVBPUlRfVUlfPU1pZ3JhdGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuCi1NSUdSQVRJT05fV0FSTklOR1NfUkVQT1JUX1VJXz1NaWdyYXRpb24gZmluaXNoZWQgd2l0aCB3YXJuaW5nczsgc2VlIGxvZyBmaWxlcyBmb3IgZGV0YWlscy4KLU1JR1JBVElPTl9FUlJPUlNfUkVQT1JUX1VJXz1NaWdyYXRpb24gZmluaXNoZWQgd2l0aCBlcnJvcnM7IHNlZSBsb2cgZmlsZXMgZm9yIGRldGFpbHMuCi1QUk9KRUNUX1NUUlVDVFVSRV9TVUNDRVNTX1VJXz1Qcm9qZWN0IHN0cnVjdHVyZSBtaWdyYXRpb24gc3VjY2Vzc2Z1bDogezB9LgotUFJPSkVDVF9TVFJVQ1RVUkVfRkFJTEVEX1VJXz1Qcm9qZWN0IHN0cnVjdHVyZSBtaWdyYXRpb24gZmFpbGVkOiB7MH0uCi1QUk9KRUNUX05PVF9ORUVEX01JR1JBVElPTl9VSV89UHJvamVjdCBzdHJ1Y3R1cmUgZGlkIG5vdCBuZWVkIG1pZ3JhdGlvbjogezB9LgotSjJFRV9WRVJTSU9OX1NVQ0NFU1NfVUlfPUoyRUUgdmVyc2lvbiBsZXZlbCBtaWdyYXRpb24gc3VjY2Vzc2Z1bDogezB9LgotSjJFRV9WRVJTSU9OX0ZBSUxFRF9VSV89SjJFRSB2ZXJzaW9uIGxldmVsIG1pZ3JhdGlvbiBmYWlsZWQ6IHswfS4KLUoyRUVfVkVSU0lPTl9OT1RfTkVFRF9NSUdSQVRJT05fVUlfPUoyRUUgdmVyc2lvbiBsZXZlbCBkaWQgbm90IG5lZWQgbWlncmF0aW9uOiB7MH0uCi1MT0NBTF9DTElFTlRfQUREX1NVQ0NFU1NfVUlfPUxvY2FsIGNsaWVudCB2aWV3cyBhZGRlZCBzdWNjZXNzZnVsbHk6IHswfS4KLUxPQ0FMX0NMSUVOVF9BRERfRkFJTEVEX1VJXz1Mb2NhbCBjbGllbnQgdmlld3MgZmFpbGVkIG9uIGFkZDogezB9LgotTE9DQUxfQ0xJRU5UX1ZJRVdTX0VYSVNUX1VJXz1Mb2NhbCBjbGllbnQgdmlld3MgYWxyZWFkeSBleGlzdDogezB9LgotUkVNT1RFX0NMSUVOVF9ERUxFVEVfU1VDQ0VTU19VSV89UmVtb3RlIGNsaWVudCB2aWV3cyBkZWxldGVkIHN1Y2Nlc3NmdWxseTogezB9LgotUkVNT1RFX0NMSUVOVF9ERUxFVEVfRkFJTEVEX1VJXz1SZW1vdGUgY2xpZW50IHZpZXdzIGZhaWxlZCBvbiBkZWxldGU6IHswfS4KLVJFTU9URV9DTElFTlRfVklFV1NfTk9UX0VYSVNUX1VJXz1SZW1vdGUgY2xpZW50IHZpZXdzIGRpZCBub3QgZXhpc3Q6IHswfS4KLUpBUl8xMV9JTVBPUlRfMjBfVUlfPVRoZSAxLjEgSkFSIGlzIGJlaW5nIGltcG9ydGVkIGludG8gYW4gRUpCIDIuMCBtb2R1bGUuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHdpbGwgYmUgY29udmVydGVkLCBidXQgdGhlIENNUCBiZWFucyByZW1haW4gdmVyc2lvbiAxLjEuCi1DTVBfMTFfSU1QT1JUXzIwX1VJXz1UaGUgZm9sbG93aW5nIENNUCAxLjEgYmVhbnMgYXJlIGJlaW5nIGltcG9ydGVkIGludG8gYW4gRUpCIDIuMCBtb2R1bGUuIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igd2lsbCBiZSBjb252ZXJ0ZWQsIGJ1dCB0aGUgQ01QIGJlYW5zIHJlbWFpbiB2ZXJzaW9uIDEuMS4KLU9MRF9QUk9KRUNUX1NUUlVDVFVSRV9VSV89VGhlIEoyRUUgcHJvamVjdCB7MH0gaGFzIGFuIG9sZCBwcm9qZWN0IHN0cnVjdHVyZSwgYW5kIHNob3VsZCBiZSBtaWdyYXRlZC4KLVBST0pFQ1RfTVVTVF9CRV9TRUxFQ1RFRF9VSV89QSB7MH0gcHJvamVjdCBtdXN0IGJlIHNlbGVjdGVkLgotRU5URVJQUklTRV9BUFBMSUNBVElPTl9VSV89ZW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotQVBQTElDQVRJT05fQ0xJRU5UX1VJXz1hcHBsaWNhdGlvbiBjbGllbnQKLUVKQl9VSV89RUpCCi1XRUJfVUlfPVdFQgotRUpCX01VU1RfQkVfU0VMRUNURURfVUlfPUFuIGVudGVycHJpc2UgYmVhbiBtdXN0IGJlIHNlbGVjdGVkLgotTUlHUkFURV9VSV89TWlncmF0ZS4uLgotTUlHUkFURV9KMkVFX1BST0pFQ1RTX1VJXz1NaWdyYXRlIEoyRUUgUHJvamVjdHMuLi4KLU9QRU5fSjJFRV9NSUdSQVRJT05fV0laQVJEX1VJXz1PcGVuIEoyRUUgTWlncmF0aW9uIFdpemFyZC4uLgotTUlHUkFUSU5HX1BST0pFQ1RfU1RSVUNUVVJFU19VSV89TWlncmF0aW5nIHByb2plY3Qgc3RydWN0dXJlLi4uCi1NSUdSQVRJTkdfSjJFRV9WRVJTSU9OX1VJXz1NaWdyYXRpbmcgcHJvamVjdCBKMkVFIHZlcnNpb24gbGV2ZWwuLi4KLUFERElOR19MT0NBTF9DTElFTlRfVklFV1NfVUlfPUFkZGluZyBsb2NhbCBjbGllbnQgdmlld3MuLi4KLURFTEVUSU5HX1JFTU9URV9DTElFTlRfVklFV1NfVUlfPURlbGV0aW5nIHJlbW90ZSBjbGllbnQgdmlld3MuLi4KLU1JR1JBVElPTl9OT1RfTkVFREVEX1JFUE9SVD1NaWdyYXRpb24gd2FzIG5vdCBuZWVkZWQgZm9yIHRoZSBzZWxlY3RlZCBpdGVtcy4KLU1JR1JBVElPTl9OT1RfUE9TU0lCTEVfUkVQT1JUPU1pZ3JhdGlvbiB3YXMgbm90IHBvc3NpYmxlIGZvciB0aGUgc2VsZWN0ZWQgaXRlbXMuCi1TT1VSQ0VfRk9MREVSX1JFTkFNRV9GQUlMRUQ9VW5hYmxlIHRvIHJlbmFtZSB0aGUgSmF2YSBzb3VyY2UgZm9sZGVyIHswfS4KLVNPVVJDRV9GT0xERVJfUkVOQU1FX1NLSVBQRUQ9VGhlIEphdmEgc291cmNlIGZvbGRlcnMgYXJlIG5vdCByZW5hbWVkIHdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzb3VyY2UgZm9sZGVyLgotV0VCQ09OVEVOVF9GT0xERVJfUkVOQU1FX0ZBSUxFRD1VbmFibGUgdG8gcmVuYW1lIHRoZSB3ZWIgY29udGVudCBmb2xkZXIgezB9LgotV0VCQ09OVEVOVF9GT0xERVJfUkVOQU1FX1NLSVBQRUQ9VGhlIHdlYiBjb250ZW50IGZvbGRlciB7MH0gbm90IHJlbmFtZWQuCi1XRUJQUk9KRUNUX1ZFUlNJT05fTUlHUkFURV9GQUlMRUQ9VW5hYmxlIHRvIG1pZ3JhdGUgdGhlIHdlYiBwcm9qZWN0IHZlcnNpb24uCi1BQlNfUEFUSFNfQVBQX0VYVF9SRU1PVkVEPUFic29sdXRlIHBhdGhzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBleHRlbnNpb25zIGZpbGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHswfS4KLVBST0pFQ1RfUkVGRVJFTkNFU19VUERBVEVEPVByb2plY3QgcmVmZXJlbmNlcyB3ZXJlIHVwZGF0ZWQgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHswfS4KLVBST0pFQ1RfQ0xBU1NQQVRIX1VQREFURUQ9UHJvamVjdCBKYXZhIGJ1aWxkIHBhdGggd2FzIHVwZGF0ZWQgZm9yIHByb2plY3QgezB9LgotRkFJTEVEX01JR1JBVElOR19JTVBPUlRFRF9DTEFTU0VTPVVuYWJsZSB0byBtaWdyYXRlIHRoZSBpbXBvcnRlZF9jbGFzc2VzIEpBUiBmaWxlLiAgRXhjZXB0aW9uOiB7MH0KLUVYVFJBQ1RFRF9JTVBPUlRFRF9DTEFTU0VTPUltcG9ydGVkIGNsYXNzZXMgd2VyZSBleHRyYWN0ZWQgZnJvbSBmaWxlIHswfS4KLUlNUE9SVEVEX0NMQVNTRVNfRklMRV9ERUxFVEVEPUltcG9ydGVkIGNsYXNzZXMgZmlsZSB7MH0gd2FzIGRlbGV0ZWQuCi1CQUNLRU5EX01JR1JBVElPTl9GQUlMRUQ9VW5hYmxlIHRvIG1pZ3JhdGUgdGhlIE1hcCBhbmQgU2NoZW1hIGZpbGUgc3RydWN0dXJlIGluIHByb2plY3QgezB9Ci1CSU5BUllfTUlHUkFUSU9OX0ZBSUxFRD1VbmFibGUgdG8gbWlncmF0ZSBiaW5hcnkgcHJvamVjdCB7MH0uCi1DT01QTEVURURfQkFDS0VORF9NSUc9VGhlIGJhY2tlbmQgKE1hcCBhbmQgU2NoZW1hKSBtZXRhLWRhdGEgb2YgdGhlIHswfSBwcm9qZWN0IG1pZ3JhdGVkIHN1Y2Nlc3NmdWxseS4KLU5PVF9ORUVERURfREVQTE9ZTUVOVF9ERVNDX01JRz1UaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHdhcyBub3QgZm91bmQgaW4gdGhlIHByb2plY3QgezB9LgotTk9UX05FRURFRF9CQUNLRU5EX01JRz1UaGUgb2xkIGJhY2tlbmQgKE1hcCBhbmQgU2NoZW1hKSBzdHJ1Y3R1cmUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcHJvamVjdCB7MH0uCi1NSUdSQVRJT05fQ09NUExFVEU9TWlncmF0aW9uIENvbXBsZXRlCi1NSUdSQVRJT05fRVJST1JTPU1pZ3JhdGlvbiBFcnJvcnMKLU1JR1JBVElPTl9OT1RfTkVFREVEPU1pZ3JhdGlvbiBOb3QgTmVlZGVkCi1DT05GSVJNQVRJT05fVElUTEU9Q29uZmlybSBNaWdyYXRpb24KLU9QRU5fRURJVE9SU19USVRMRT1PcGVuIEVkaXRvcnMKLUNPTkZJUk1fTUlHUkFURV9QUk9KRUNUX1NUUlVDVFVSRT1UaGlzIHdpbGwgbWlncmF0ZSB0aGUgcHJvamVjdCBzdHJ1Y3R1cmUgZm9yIHRoZSBzZWxlY3RlZCBpdGVtcyB0byB0aGUgbGF0ZXN0IGZvcm1hdC4gIENvbnRpbnVlPwotQ09ORklSTV9NSUdSQVRFX0oyRUVfMTM9VGhpcyB3aWxsIG1pZ3JhdGUgdGhlIHByb2plY3Qgc3RydWN0dXJlIGZvciB0aGUgc2VsZWN0ZWQgaXRlbXMgaWYgbmVjZXNzYXJ5LCBhbmQgbWlncmF0ZSB0aGUgSjJFRSB2ZXJzaW9uIG9mIHRoZSBzZWxlY3RlZCBpdGVtcyBmcm9tIDEuMiB0byAxLjMuICBDb250aW51ZT8KLUlORk9STV9PUEVOX0VESVRPUlM9T3BlbiBlZGl0b3JzIGV4aXN0IGluIHRoZSB3b3JrYmVuY2guICBQbGVhc2UgY2xvc2UgYWxsIGVkaXRvcnMgYmVmb3JlIHJ1bm5pbmcgbWlncmF0aW9uLlxuXG5EbyB5b3Ugd2FudCB0byBjbG9zZSBhbGwgZWRpdG9ycyBhbmQgY29udGludWUgbWlncmF0aW9uPwotV0VCQ09OVEVOVF9MSUJQQVRIX1VQREFURV9GQUlMRUQ9VW5hYmxlIHRvIHJlbW92ZSBKQVIgZmlsZSBmcm9tIGNsYXNzcGF0aC4KLUZBSUxFRF9ERVBMT1lfREVMRVRFPUZhaWxlZCBkZWxldGluZyBkZXBsb3kgY29kZSBpbiB7MH0gcHJvamVjdC4KLUNPTVBMRVRFRF9ERVBMT1lfREVMRVRFPUNvbXBsZXRlZCBkZWxldGUgb2YgZGVwbG95IGNvZGUgaW4gezB9IHByb2plY3QuCi1GQUlMRURfTE9DQUxfQ0xJRU5UX0NSRUFURT1GYWlsZWQgY3JlYXRpbmcgbG9jYWwgY2xpZW50IHZpZXcgZm9yIHswfS4KLUNPTVBMRVRFRF9MT0NBTF9DTElFTlRfQ1JFQVRFPUNvbXBsZXRlZCBjcmVhdGlvbiBvZiBhIGxvY2FsIGNsaWVudCB2aWV3IGZvciB7MH0uCi1DT01QTEVURURfQ01QMjBfQ09ERUdFTj1Db21wbGV0ZWQgQ01QIDIuMCBjb2RlIGdlbmVyYXRpb24gaW4gezB9IHByb2plY3QuCi1MT0NBTF9DTElFTlRfTk9UX05FRURFRD1BIGxvY2FsIGNsaWVudCB2aWV3IHdhcyBub3QgY3JlYXRlZCBzaW5jZSBvbmUgYWxyZWFkeSBleGlzdHMgZm9yIHswfS4KLUlOVkFMSURfU0VMRUNUSU9OX1RJVExFPUludmFsaWQgU2VsZWN0aW9uCi1JTkZPUk1fSU5WQUxJRF9KMkVFX1NFTEVDVElPTj1PbmUgb3IgbW9yZSBKMkVFIDEuNCBzcGVjaWZpY2F0aW9uIHByb2plY3RzIGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgbWlncmF0aW9uIHRoYXQgaXMgbm90IHZhbGlkLlxuT25seSBKMkVFIDEuMiBvciAxLjMgc3BlY2lmaWNhdGlvbiBwcm9qZWN0cyBjYW4gYmUgbWlncmF0ZWQuCi1JTkZPUk1fUFJPUEVSX1NFTEVDVElPTj1TZWxlY3Rpb24gbXVzdCBiZSBvbmUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IG9yIGFueSBjb21iaW5hdGlvbiBvZiBFSkIsIHdlYiwgYW5kIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgcHJvamVjdHMuCi1SRVFVSVJFRF9DTElFTlRfVklFV19USVRMRT1DbGllbnQgVmlldyBSZXF1aXJlZAotQ09ORklSTV9DTElFTlRfVklFV19SRVFVSVJFRD1UaGUgZm9sbG93aW5nIGJlYW5zIGFyZSByZXF1aXJlZCB0byBoYXZlIGNsaWVudCB2aWV3cyBiZWNhdXNlIG9mIGluaGVyaXRhbmNlIG9yIHJlbGF0aW9uc2hpcCBydWxlcy4gIFRoZXNlIGJlYW5zIHdpbGwgYmUgYXV0b21hdGljYWxseSBzZWxlY3RlZCBhbmQgY2xpZW50IHZpZXdzIHdpbGwgYmUgZ2VuZXJhdGVkLgotRklMRVNfT1VUX09GX1NZTkM9Q2Fubm90IG1pZ3JhdGUgYmVjYXVzZSBzb21lIHJlc291cmNlcyBhcmUgb3V0LW9mLXN5bmMgd2l0aCB0aGUgZmlsZSBzeXN0ZW0gaW4gcHJvamVjdCB7MH0uICBSZWZyZXNoIHRoZSBwcm9qZWN0IGFuZCB0cnkgYWdhaW4uCi1TRVJWRVJfVEFSR0VUX1NFVFRJTkdfRkFJTEVEX1VJXz1TZXR0aW5nIG9mIHRhcmdldCBzZXJ2ZXIgZmFpbGVkOiB7MH0uCi1SZW1vdmVDb21wYXRpYmlsaXR5QWN0aW9uRGVsZWdhdGVfVUlfMD1XYXJuaW5pZwotUmVtb3ZlQ29tcGF0aWJpbGl0eUFjdGlvbkRlbGVnYXRlX1VJXzE9Q29udGludWUgUmVtb3ZpbmcgQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBmcm9tIFByb2plY3RzPwotSmF4cnBjbWFwU3BlY2lmaWNhdGlvbk1pZ3JhdG9yX1VJXzE9amF4cnBjIG1hcHBpbmcgbWlncmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKLUpheHJwY21hcFNwZWNpZmljYXRpb25NaWdyYXRvcl9VSV8yPU1pZ3JhdGlvbiBvZiBqYXhycGMgbWFwcGluZyBkZXNjcmlwdG9yIGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIHRoZSBtb2R1bGUgcm9vdCBmb2xkZXIgd2FzIG5vdCBmb3VuZC4KLVdlYlNlcnZpY2VzQ2xpZW50U3BlY2lmaWNhdGlvbk1pZ3JhdG9yX1VJXzA9V2ViIHNlcnZpY2VzIGNsaWVudCBtaWdyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KLVdlYlNlcnZpY2VzQ2xpZW50U3BlY2lmaWNhdGlvbk1pZ3JhdG9yX1VJXzE9QSB2YWxpZCBwcm9qZWN0IGlzIHJlcXVpcmVkIGZvciBXZWJzZXJ2aWNlcyBNaWdyYXRpb24KLVdlYlNlcnZpY2VzQ2xpZW50U3BlY2lmaWNhdGlvbk1pZ3JhdG9yX1VJXzI9Q291bGQgbm90IGxvY2F0ZSBXZWJzZXJ2aWNlcy4KLVdlYlNlcnZpY2VzQ2xpZW50U3BlY2lmaWNhdGlvbk1pZ3JhdG9yX1VJXzM9VGhlcmUgaXMgbm8gd2Vic2VydmljZXMgY2xpZW50IGZpbGUgdG8gbWlncmF0ZS4KLVdlYlNlcnZpY2VzU3BlY2lmaWNhdGlvbk1pZ3JhdG9yX1VJXzA9V2ViIHNlcnZpY2VzIG1pZ3JhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotV2ViU2VydmljZXNTcGVjaWZpY2F0aW9uTWlncmF0b3JfVUlfMT1ObyBXZWIgc2VydmljZXMgbWlncmF0aW9uIHdhcyByZXF1aXJlZAotSjJFRVByb2plY3RTdHJ1Y3R1cmVNaWdyYXRpb25PcGVyYXRpb25fVUlfND1NaWdyYXRpb24gb2YgV2ViIFByb2plY3QgdmVyc2lvbiBzdWNjZXNzZnVsCi1KMkVFUHJvamVjdFN0cnVjdHVyZU1pZ3JhdGlvbk9wZXJhdGlvbl9VSV8wPSJQcm9qZWN0IHswfSAtLSBSZW5hbWVkIFwnezF9IFwnIHRvIFwnezJ9XCcuCi1KMkVFUHJvamVjdFN0cnVjdHVyZU1pZ3JhdGlvbk9wZXJhdGlvbl9VSV8xPVByb2JsZW0gcmVuYW1pbmcgamF2YSBzb3VyY2U6IHswfS4KLUoyRUVQcm9qZWN0U3RydWN0dXJlTWlncmF0aW9uT3BlcmF0aW9uX1VJXzI9IlByb2JsZW0gcmVuYW1pbmcgd2ViIGNvbnRlbnQ6IHswfS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOTBjNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYnNlcnZpY2VzX3VpLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDYxOThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXNlcnZsZXR1aS5qYXIKLXdlYnNlcnZpY2V1aS5qYXIKLUBkb3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4NjM1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlcy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYWFkOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogV1RQIFdlYnNlcnZpY2UgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZXMudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAuLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5uYXZpZ2F0b3IuamF2YSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci52aWV3cywKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcud3NkbDRqLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcwotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDgxMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS4uID0gcHJvcGVydHlfZmlsZXMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vic2VydmljZXNfdWkvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ4NTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYzA2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1ZWFkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFjNmJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYnNlcnZpY2VkZXNjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvd2Vic2VydmljZWRlc2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvd2Vic2VydmljZWRlc2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93c2RsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93c2RsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTA1OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLnZpZXdzLm5hdmlnYXRvckNvbnRlbnQiPgotICAgICAgPG5hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgICAgIG5hbWU9IldlYiBTZXJ2aWNlcyIKLSAgICAgICAgICAgIHByaW9yaXR5PSJsb3ciCi0gICAgICAgICAgICBpY29uPSJpY29ucy93ZWJncm91cF9vYmouZ2lmIgotICAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIgotICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlc05hdmlnYXRvckxhYmVsUHJvdmlkZXIiCi0gICAgICAgICAgICBvcGVuTGlzdGVuZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZXNOYXZpZ2F0b3JHcm91cE9wZW5MaXN0ZW5lciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwubmF2aWdhdG9yLndlYnNlcnZpY2UiCi0gICAgICAgICAgICA+Ci0gICAgICAgICA8ZW5hYmxlcz4KLSAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAJCW5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGwiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZXM+Ci0gICAgICAgICA8ZW1mRW5hYmxlbWVudD4KLSAgICAgICAgIAk8cGFja2FnZSB1cmk9IndzZGQueG1pIiAvPiAgICAgICAgICAgICAgICAgCQotICAgICAgICAgCTxwYWNrYWdlIHVyaT0id2Vic2VydmljZV9jbGllbnQueG1pIiAvPiAgICAgICAgICAgCSAgICAgICAgIAkKLSAgICAgICAgIAk8cGFja2FnZSB1cmk9IndzY29tbW9uLnhtaSIgLz4KLSAgICAgICAgIAk8cGFja2FnZSB1cmk9Imh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvV1NETCIvPgotICAgICAgICAgPC9lbWZFbmFibGVtZW50PgotICAgICAgPC9uYXZpZ2F0b3JDb250ZW50PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIAotICAgPCEtLSBKMkVFIFZpZXcgV2ViIFNlcnZpY2VzIGNvbnRyaWJ1dGlvbiAtLT4KLSAgIAotIDwhLS0gPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLnZpZXdzLm5hdmlnYXRvclZpZXdlciI+Ci0gICAgICA8bmF2aWdhdG9yVmlld2VyCi0gICAgICAgICAgICByb290Q29udGVudEV4dGVuc2lvbklkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwubmF2aWdhdG9yLndlYnNlcnZpY2UiCi0gICAgICAgICAgICB2aWV3ZXJJZD0ib3JnLmVjbGlwc2Uud3N0Lm5hdmlnYXRvci51aS5XVFBDb21tb25OYXZpZ2F0b3IiPgotICAgICAgPC9uYXZpZ2F0b3JWaWV3ZXI+Ci0gICA8L2V4dGVuc2lvbj4gLS0+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci52aWV3cy5uYXZpZ2F0b3JWaWV3ZXIiPgotICAgICAgPG5hdmlnYXRvclZpZXdlcgotICAgICAgICAgICAgcm9vdENvbnRlbnRFeHRlbnNpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm5hdmlnYXRvci53ZWJzZXJ2aWNlIgotICAgICAgICAgICAgdmlld2VySWQ9Im9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQV29ya2luZ1NldENvbW1vbk5hdmlnYXRvciI+Ci0gICAgICA8L25hdmlnYXRvclZpZXdlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvcHJvcGVydHlfZmlsZXMvd2Vic2VydmljZXVpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvcHJvcGVydHlfZmlsZXMvd2Vic2VydmljZXVpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDNjMzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2V1aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTkVXX0JVVFRPTl9MQUJFTD1OZXcuLi4KLU5FV19IQU5ETEVSX1dJWkFSRF9XSU5ET1dfVElUTEU9TmV3IEhhbmRsZXIKLU5FV19IQU5ETEVSX1dJWkFSRF9QQUdFX1RJVExFPVdlYiBTZXJ2aWNlIEhhbmRsZXIKLU5FV19IQU5ETEVSX1dJWkFSRF9QQUdFX0RFU0M9Q3JlYXRlIGEgbmV3IHdlYiBzZXJ2aWNlIGhhbmRsZXIuCi1IQU5ETEVSX0RJU1BMQVlfTkFNRV9MQUJFTD1EaXNwYWx5IG5hbWU6Ci1IQU5ETEVSX0RFU0NSSVBUSU9OX0xBQkVMPURlc2NyaXB0aW9uOgotSEFORExFUl9OQU1FX0xBQkVMPUhhbmRsZXIgbmFtZToKLUhBTkRMRVJfQ0xBU1NfTkFNRV9MQUJFTD1IYW5kbGVyIGNsYXNzOgotSEFORExFUl9JTklUX1BBUkFNX1dJWkFSRF9XSU5ET1dfVElUTEU9SGFuZGxlciBJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXIKLUhBTkRMRVJfSU5JVF9QQVJBTV9XSVpBUkRfUEFHRV9USVRMRT1FbnRlciBIYW5kbGVyIEluaXRpYWxpemF0aW9uIFBhcmFtZXRlcgotSEFORExFUl9JTklUX1BBUkFNX1dJWkFSRF9QQUdFX0RFU0M9Q3JlYXJlIGEgbmV3IGhhbmRsZXIgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLgotSEFORExFUl9TT0FQX0hFQURFUl9XSVpBUkRfV0lORE9XX1RJVExFPUhhbmRsZXIgU09BUCBIZWFkZXJzCi1IQU5ETEVSX1NPQVBfSEVBREVSX1dJWkFSRF9QQUdFX1RJVExFPUVudGVyIEhhbmRsZXIgU09BUCBIZWFkZXJzCi1IQU5ETEVSX1NPQVBfSEVBREVSX1dJWkFSRF9QQUdFX0RFU0M9Q3JlYXRlIGEgbmV3IFNPQVAgaGVhZGVyLgotSEFORExFUl9OQU1FU1BBQ0VfVVJMX0xBQkVMPU5hbWVzcGFjZSBVUkw6Ci1IQU5ETEVSX0xPQ0FMX1BBUlRfTEFCRUw9TG9jYWwgcGFydDoKLVBvcnRDb21wb25lbnRSZWZMYWJlbFByb3ZpZGVyX1VJXzE9U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U6Ci1Qb3J0Q29tcG9uZW50UmVmTGFiZWxQcm92aWRlcl9VSV8yPVBvcnQgQ29tcG9uZW50IExpbms6Ci1XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzA9U2VydmljZXMKLVdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGVfVUlfMT1DbGllbnRzCi1XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzI9SGFuZGxlcnMKLVdlYlNlcnZpY2VGaWxlc0NvbnRyaWJ1dGlvbl9VSV8wPUZpbGVzCi1XZWJTZXJ2aWNlR3JvdXBDb250ZW50RXh0ZW5zaW9uX1VJXzE9V2ViIEJyb3dzZXIKLVdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cF9VSV8wPVdlYiBTZXJ2aWNlcwotU2VydmVyX0ludmFsaWRfRm9yX0V4aXNpdG5nX0VBUl9VSV89U2VsZWN0ZWQgdGFyZ2V0IHNlcnZlciAiezB9IiBpcyBpbnZhbGlkIGZvciB0aGUgZXhpc3RpbmcgRUFSIHByb2plY3QgInsxfSIKLVNlcnZpY2VSZWZlcmVuY2VTZWxlY3Rpb25XaXphcmRfVUlfNj1TZXJ2aWNlIFJlZmVyZW5jZSBTZWxlY3Rpb24KLVNlcnZpY2VSZWZlcmVuY2VTZWxlY3Rpb25XaXphcmRfVUlfNz1TZXJ2aWNlIFJlZmVyZW5jZSBTbmlwcGV0Ci1TZXJ2aWNlUmVmZXJlbmNlU2VsZWN0aW9uUGFnZV9VSV8wPVNlbGVjdCBhIFNlcnZpY2UgUmVmZXJlbmNlCi1TZXJ2aWNlUmVmZXJlbmNlU2VsZWN0aW9uUGFnZV9VSV8xPVNlcnZpY2UgUmVmZXJlbmNlIG93bmVyOgotU2VydmljZVJlZmVyZW5jZVNlbGVjdGlvblBhZ2VfVUlfMj1OZXcgU2VydmljZSBSZWZlcmVuY2UuLi4KLVNFUlZJQ0VfQ0xBU1NFU19VSV89U2VydmljZSBDbGFzc2VzCi1QT1JUX1VJXz1Qb3J0OgotSEFORExFUl9VSV89SGFuZGxlcjoKLVdTRExfUE9SVF9VSV89V1NETCBQb3J0OgotU0VSVklDRV9JTVBMX1VJXz1TZXJ2aWNlSW1wbDoKLVdTRExfVUlfPVdTREw6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvT3BlbkV4dGVybmFsV1NETEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvT3BlbkV4dGVybmFsV1NETEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWM3NGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL09wZW5FeHRlcm5hbFdTRExBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkFic3RyYWN0T3BlbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV2ViQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqLwotcHVibGljIGNsYXNzIE9wZW5FeHRlcm5hbFdTRExBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5BY3Rpb24gewotCi0JU3RyaW5nIHVyaSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBPcGVuRXh0ZXJuYWxXU0RMQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQl0aGlzLnNldEltYWdlRGVzY3JpcHRvcihBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL3dlYl90eXBlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hCcm93c2VyU3VwcG9ydCBicm93c2VyU3VwcG9ydCA9IFdlYlNlcnZpY2VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsgCi0JCQlJV2ViQnJvd3NlciBicm93c2VyID0gYnJvd3NlclN1cHBvcnQuY3JlYXRlQnJvd3NlcihJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTE9DQVRJT05fQkFSIHwgSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0Lk5BVklHQVRJT05fQkFSLCJXU0RMIiwiIiwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlicm93c2VyLm9wZW5VUkwobmV3IFVSTCh1cmkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gcykgewotCQlPYmplY3Qgb2JqID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChzZXJ2aWNlSGVscGVyLmlzV1NETFJlc291cmNlKG9iaikpCi0JCQl1cmkgPSAoKFJlc291cmNlKSBvYmopLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24ocyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYzQ1ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRU1GQWRhcHRlckZhY3RvcnkgewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlXc2RkUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChzZXJ2aWNlSGVscGVyLmlzU2VydmljZShhZGFwdGFibGVPYmplY3QpKQotCQkJcmVzID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0V3NkZFJlc291cmNlKChFT2JqZWN0KSBhZGFwdGFibGVPYmplY3QpOwotCi0JCWlmIChyZXMgIT0gbnVsbCAmJiBhZGFwdGVyVHlwZSA9PSBFTUZBZGFwdGVyRmFjdG9yeS5JRklMRV9DTEFTUykKLQkJCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7Ci0JCWVsc2UgaWYgKHJlcyAhPSBudWxsICYmIGFkYXB0ZXJUeXBlID09IEVNRkFkYXB0ZXJGYWN0b3J5LklSRVNPVVJDRV9DTEFTUykKLQkJCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7Ci0JCWVsc2UgaWYgKHJlcyAhPSBudWxsICYmIGFkYXB0ZXJUeXBlID09IEVNRkFkYXB0ZXJGYWN0b3J5LklQUk9KRUNUX0NMQVNTKQotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChyZXMpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGFibGVPYmplY3QsIGFkYXB0ZXJUeXBlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZUZpbGVzQ29udHJpYnV0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlRmlsZXNDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2YTYxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlRmlsZXNDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIzLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUZpbGVzQ29udHJpYnV0aW9uIHsKLQotCXByb3RlY3RlZCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZTsKLQlwcm90ZWN0ZWQgTGlzdCBhbGxGaWxlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlRmlsZXNDb250cmlidXRpb24oV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy53ZWJTZXJ2aWNlID0gd2ViU2VydmljZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJTZXJ2aWNlRmlsZXNDb250cmlidXRpb25fVUlfMCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXU0RMRmlsZSgpIHsKLQkJcmV0dXJuIHdlYlNlcnZpY2UuZ2V0V3NkbEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gd2ViU2VydmljZS5nZXRKYXhycGNNYXBwaW5nRmlsZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFsbEZpbGVzKCkgewotCQlpZiAoYWxsRmlsZXMgPT0gbnVsbCkgewotCQkJYWxsRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlhbGxGaWxlcy5hZGQoZ2V0V1NETEZpbGUoKSk7Ci0JCQlhbGxGaWxlcy5hZGQoZ2V0TWFwcGluZ0ZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGFsbEZpbGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZS4KLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZURlc2NyaXB0aW9uIGdldFdlYlNlcnZpY2UoKSB7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZU5hdmlnYXRvckdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzhlZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZU5hdmlnYXRvckdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cCB7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbCA9IFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cF9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElXb3Jrc3BhY2VSb290IHJvb3Q7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cChJV29ya3NwYWNlUm9vdCB3c1Jvb3QpIHsKLQkJc3VwZXIoKTsKLQkJcm9vdCA9IHdzUm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJvb3QuCi0JICovCi0JcHVibGljIElXb3Jrc3BhY2VSb290IGdldFJvb3QoKSB7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByb290Ci0JICogICAgICAgICAgICBUaGUgcm9vdCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9vdChJV29ya3NwYWNlUm9vdCByb290KSB7Ci0JCXRoaXMucm9vdCA9IHJvb3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWViNmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGltcGxlbWVudHMgSUFjdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFUyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UUyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFORExFUlMgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRVNfVUkgPSBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzAiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVFNfVUkgPSBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzEiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJTX1VJID0gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZV9VSV8yIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IFRZUEU7Ci0JcHJpdmF0ZSBFT2JqZWN0IHdzZGxTZXJ2aWNlID0gbnVsbDsKLQlwcml2YXRlIFNlcnZpY2VSZWYgc2VydmljZVJlZiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzcGVjaWZpYyB0eXBlIG9mIHdlYiBzZXJ2aWNlIG5hdmlnYXRvciBncm91cGluZwotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKGludCBncm91cFR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJVFlQRSA9IGdyb3VwVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzcGVjaWZpYyB0eXBlIG9mIHdlYiBzZXJ2aWNlIG5hdmlnYXRvciBncm91cGluZwotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKGludCBncm91cFR5cGUsIEVPYmplY3Qgd3NkbFNlcnZpY2UpIHsKLQkJc3VwZXIoKTsKLQkJVFlQRSA9IGdyb3VwVHlwZTsKLQkJdGhpcy53c2RsU2VydmljZSA9IHdzZGxTZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHNwZWNpZmljIHR5cGUgb2Ygd2ViIHNlcnZpY2UgbmF2aWdhdG9yIGdyb3VwaW5nCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUoaW50IGdyb3VwVHlwZSwgU2VydmljZVJlZiBzZXJ2aWNlUmVmKSB7Ci0JCXN1cGVyKCk7Ci0JCVRZUEUgPSBncm91cFR5cGU7Ci0JCXRoaXMuc2VydmljZVJlZiA9IHNlcnZpY2VSZWY7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBUWVBFLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0R3JvdXBUeXBlKCkgewotCQlyZXR1cm4gVFlQRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXBUeXBlKCkgPT0gU0VSVklDRVM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDbGllbnRzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXBUeXBlKCkgPT0gQ0xJRU5UUzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0hhbmRsZXJzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXBUeXBlKCkgPT0gSEFORExFUlM7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0V3NkbFNlcnZpY2UoKSB7Ci0JCXJldHVybiB3c2RsU2VydmljZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChpc1NlcnZpY2VzKCkpCi0JCQlyZXR1cm4gU0VSVklDRVNfVUk7Ci0JCWVsc2UgaWYgKGlzQ2xpZW50cygpKQotCQkJcmV0dXJuIENMSUVOVFNfVUk7Ci0JCWVsc2UgaWYgKGlzSGFuZGxlcnMoKSkKLQkJCXJldHVybiBIQU5ETEVSU19VSTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyI3Rlc3RBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdGVzdEF0dHJpYnV0ZShPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlICYmIHZhbHVlICE9IG51bGwpIHsKLQkJCVdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgZ3JvdXAgPSAoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgdGFyZ2V0OwotCQkJaWYgKGdyb3VwLmlzQ2xpZW50cygpICYmIHZhbHVlLmVxdWFscyhDTElFTlRTX1VJKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UgaWYgKGdyb3VwLmlzU2VydmljZXMoKSAmJiB2YWx1ZS5lcXVhbHMoU0VSVklDRVNfVUkpKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZSBpZiAoZ3JvdXAuaXNIYW5kbGVycygpICYmIHZhbHVlLmVxdWFscyhIQU5ETEVSU19VSSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmljZVJlZi4KLQkgKi8KLQlwdWJsaWMgU2VydmljZVJlZiBnZXRTZXJ2aWNlUmVmKCkgewotCQlyZXR1cm4gc2VydmljZVJlZjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMWNhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDI3LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgid2Vic2VydmljZXVpIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBubHNDb25jYXRlbmF0aW9uRmluZGVyKCkgewotCQkvLyB1c2VkIHRvIHRhZyBtZXRob2RzIHdoaWNoIGhhdmUgY29uY2F0ZW5hdGVkIHN0cmluZ3MKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhODllNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnByb3ZpZGVycy5Db21tb25BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXIuV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkR5bmFtaWNBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3cy5JTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlciBleHRlbmRzIENvbW1vbkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciwgV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VzTWFuYWdlciB3ZWJTZXJ2aWNlc01hbmFnZXIgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBhY3Rpdml0eUVuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cCB3ZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXA7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIFNFUlZJQ0VTID0gbnVsbDsKLQlwcml2YXRlIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgQ0xJRU5UUyA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIEhBTkRMRVJTID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVklFV0VSX0lEID0gIm9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIjsvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcihjcmVhdGVBZGFwdGVyRmFjdG9yeSgpKTsKLQkJV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCS8vIGNyZWF0ZSB0aGUgZGVmYXVsdCBzeW5jaHJvbml6ZXIgZm9yIGFueSB3ZWIgc2VydmljZSBlZGl0b3IgdG8gdXNlIHdpdGggdmlldyBkdWUKLQkJLy8gdG8gdGhlIHVzYWdlIG9mIHNlcGVyYXRlIGVkaXQgbW9kZWxzLgotCQlXZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplci5jcmVhdGVJbnN0YW5jZShjcmVhdGVBZGFwdGVyRmFjdG9yeSgpLCB0aGlzKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIENvbmZpZ3VyZSBhbmQgcmV0dXJuIGEgY29tcG9zaXRlIGFkYXB0ZXIgZmFjdG9yeSBmb3Igb3VyIGNvbnRlbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBEeW5hbWljQWRhcHRlckZhY3RvcnkoVklFV0VSX0lEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0vLwkJaWYgKCFOYXZpZ2F0b3JBY3Rpdml0eUhlbHBlci5pc0FjdGl2aXR5RW5hYmxlZChnZXRDb250YWluaW5nRXh0ZW5zaW9uKCkpKSB7Ci0vLwkJCWFjdGl2aXR5RW5hYmxlZCA9IGZhbHNlOwotLy8JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0vLwkJfQotLy8JCWFjdGl2aXR5RW5hYmxlZCA9IHRydWU7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtde2dldFdlYlNlcnZpY2VzTmF2aWdhdG9yR3JvdXAocGFyZW50RWxlbWVudCl9OwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXApIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0W117Z2V0U2VydmljZXNHcm91cCgpLCBnZXRDbGllbnRzR3JvdXAoKX07Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgJiYgKChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSBwYXJlbnRFbGVtZW50KS5pc1NlcnZpY2VzKCkpIHsKLQkJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcmVzdWx0LmFkZEFsbChnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5nZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpKTsKLQkJCXJlc3VsdC5hZGRBbGwoZ2V0V2ViU2VydmljZXNNYW5hZ2VyKCkuZ2V0RXh0ZXJuYWxXU0RMU2VydmljZXMoKSk7Ci0JCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSAmJiAoKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIHBhcmVudEVsZW1lbnQpLmlzQ2xpZW50cygpKSB7Ci0JCQlyZXR1cm4gZ2V0V2ViU2VydmljZXNNYW5hZ2VyKCkuZ2V0QWxsV29ya3NwYWNlU2VydmljZVJlZnMoKS50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAoc2VydmljZUhlbHBlci5pc1NlcnZpY2UocGFyZW50RWxlbWVudCkpIHsKLQkJCXJldHVybiBnZXRTZXJ2aWNlTGV2ZWxOb2RlcyhwYXJlbnRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgJiYgKChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSBwYXJlbnRFbGVtZW50KS5pc0hhbmRsZXJzKCkpIHsKLQkJCXJldHVybiBnZXRIYW5kbGVyQ2hpbGRyZW4ocGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKSB7Ci0JCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlc3VsdC5hZGQoZ2V0SGFuZGxlcnNHcm91cChwYXJlbnRFbGVtZW50KSk7Ci0JCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSGFuZGxlciB8fCBwYXJlbnRFbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpLnRvQXJyYXkoKTsKLQkJfSBlbHNlIGlmIChzZXJ2aWNlSGVscGVyLmlzV1NETFJlc291cmNlKHBhcmVudEVsZW1lbnQpKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKS50b0FycmF5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0U2VydmljZUxldmVsTm9kZXMoT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGFkZCBzZXJ2aWNlIGNsYXNzZXMKLQkJaWYgKGdldFdlYlNlcnZpY2VzTWFuYWdlcigpLmlzU2VydmljZUludGVybmFsKChFT2JqZWN0KSBwYXJlbnRFbGVtZW50KSAmJiBnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5nZXRTZXJ2aWNlSW1wbEJlYW4oKEVPYmplY3QpIHBhcmVudEVsZW1lbnQpICE9IG51bGwpCi0JCQlyZXN1bHQuYWRkKGdldFdlYlNlcnZpY2VzTWFuYWdlcigpLmdldFNlcnZpY2VJbXBsQmVhbigoRU9iamVjdCkgcGFyZW50RWxlbWVudCkpOwotCQkvLyBBZGQgaGFuZGxlcnMKLQkJaWYgKGdldFdlYlNlcnZpY2VzTWFuYWdlcigpLmlzU2VydmljZUludGVybmFsKChFT2JqZWN0KSBwYXJlbnRFbGVtZW50KSkKLQkJCXJlc3VsdC5hZGQoZ2V0SGFuZGxlcnNHcm91cChwYXJlbnRFbGVtZW50KSk7Ci0JCS8vYWRkIHdzZGwgZmlsZQotCQlSZXNvdXJjZSB3c2RsID0gZ2V0V2ViU2VydmljZXNNYW5hZ2VyKCkuZ2V0V1NETFJlc291cmNlKChFT2JqZWN0KSBwYXJlbnRFbGVtZW50KTsKLQkJaWYgKHdzZGwgIT0gbnVsbCkKLQkJCXJlc3VsdC5hZGQod3NkbCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEhhbmRsZXJDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSBoYW5kbGVyc0dyb3VwID0gKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIHBhcmVudEVsZW1lbnQ7Ci0JCS8vIGhhbmRsZSB3ZWIgc2VydmljZSBoYW5kbGVycyBjYXNlCi0JCWlmIChoYW5kbGVyc0dyb3VwLmdldFdzZGxTZXJ2aWNlKCkgIT0gbnVsbCkgewotCQkJUG9ydENvbXBvbmVudCBwb3J0ID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UG9ydENvbXBvbmVudChoYW5kbGVyc0dyb3VwLmdldFdzZGxTZXJ2aWNlKCkpOwotCQkJaWYgKHBvcnQgIT0gbnVsbCAmJiBwb3J0LmdldEhhbmRsZXJzKCkgIT0gbnVsbCAmJiAhcG9ydC5nZXRIYW5kbGVycygpLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHBvcnQuZ2V0SGFuZGxlcnMoKSk7Ci0JCX0KLQkJLy8gaGFuZGxlIHNlcnZpY2UgcmVmIGNhc2UKLQkJZWxzZSBpZiAoaGFuZGxlcnNHcm91cC5nZXRTZXJ2aWNlUmVmKCkgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZEFsbChoYW5kbGVyc0dyb3VwLmdldFNlcnZpY2VSZWYoKS5nZXRIYW5kbGVycygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAgZ2V0V2ViU2VydmljZXNOYXZpZ2F0b3JHcm91cChPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAod2ViU2VydmljZU5hdmlnYXRvckdyb3VwID09IG51bGwpCi0JCQl3ZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAgPSBuZXcgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwKChJV29ya3NwYWNlUm9vdCkgcGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXApCi0JCQlyZXR1cm4gKChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXApIGVsZW1lbnQpLmdldFJvb3QoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gVE9ETyBoYW5kbGUgY2hhbmdlIGV2ZW50cwotCQlpZiAoYVZpZXdlciAhPW51bGwgJiYgYVZpZXdlciBpbnN0YW5jZW9mIFRyZWVWaWV3ZXIpCi0JCQl2aWV3ZXIgPSAoVHJlZVZpZXdlcilhVmlld2VyOwotCQlzdXBlci5pbnB1dENoYW5nZWQoYVZpZXdlcixvbGRJbnB1dCxuZXdJbnB1dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJLy8gZGlzcG9zZSBjdXJyZW50IGluc3RhbmNlIG9mIHdlYiBzZXJ2aWNlIGVkaXRvci9leHBsb3JlciBzeW5jaHJvbml6ZXIKLQkJV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIuZGlzcG9zZUluc3RhbmNlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lciNlZGl0TW9kZWxDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdlYlNlcnZpY2VNYW5hZ2VyQ2hhbmdlZChXZWJTZXJ2aWNlRXZlbnQgYW5FdmVudCkgewotCQlpZiAoZ2V0Vmlld2VyKCk9PW51bGwpIHJldHVybjsKLQkJRGlzcGxheSBkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWQgPSBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlpZiAoZCAhPSBEaXNwbGF5LmdldEN1cnJlbnQoKSAmIGQgIT0gbnVsbCkgewotCQkJZC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZ2V0Vmlld2VyKCkucmVmcmVzaChnZXROYXZpZ2F0b3JHcm91cCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfSBlbHNlCi0JCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKGdldE5hdmlnYXRvckdyb3VwKCkpOyAKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBuYXZpZ2F0b3JHcm91cC4KLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwIGdldE5hdmlnYXRvckdyb3VwKCkgewotCQlpZiAobnVsbCA9PSB3ZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXApIHsKLQkJCXdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cCA9IG5ldyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCX0KLQkJcmV0dXJuIHdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgV2ViU2VydmljZXNNYW5hZ2VyIGdldFdlYlNlcnZpY2VzTWFuYWdlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VzTWFuYWdlciA9PSBudWxsKQotCQkJd2ViU2VydmljZXNNYW5hZ2VyID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlc01hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhY3Rpdml0eUVuYWJsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY3Rpdml0eUVuYWJsZWQoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVuYWJsZWQ7Ci0JfQotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGdldFNlcnZpY2VzR3JvdXAoKSB7Ci0JCWlmIChTRVJWSUNFUyA9PSBudWxsKQotCQkJU0VSVklDRVMgPSBuZXcgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlLlNFUlZJQ0VTKTsKLQkJcmV0dXJuIFNFUlZJQ0VTOwotCX0KLQotCXByaXZhdGUgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSBnZXRDbGllbnRzR3JvdXAoKSB7Ci0JCWlmIChDTElFTlRTID09IG51bGwpCi0JCQlDTElFTlRTID0gbmV3IFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZS5DTElFTlRTKTsKLQkJcmV0dXJuIENMSUVOVFM7Ci0JfQotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGdldEhhbmRsZXJzR3JvdXAoT2JqZWN0IGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSBoYW5kbGVyID0gbnVsbDsKLQkJaGFuZGxlciA9IChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSBIQU5ETEVSUy5nZXQoa2V5KTsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpIHsKLQkJCWlmIChzZXJ2aWNlSGVscGVyLmlzU2VydmljZShrZXkpKQotCQkJCWhhbmRsZXIgPSBuZXcgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlLkhBTkRMRVJTLCAoRU9iamVjdCkga2V5KTsKLQkJCWVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpCi0JCQkJaGFuZGxlciA9IG5ldyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUuSEFORExFUlMsIChTZXJ2aWNlUmVmKSBrZXkpOwotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKLQkJCQlIQU5ETEVSUy5wdXQoa2V5LCBoYW5kbGVyKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIFRyZWVWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckdyb3VwT3Blbkxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckdyb3VwT3Blbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTZhMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JHcm91cE9wZW5MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JT3Blbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuT3BlbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmNvbXBvbmVudGNvcmUudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSjJFRVJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNOYXZpZ2F0b3JHcm91cE9wZW5MaXN0ZW5lciBpbXBsZW1lbnRzIElPcGVuTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBPcGVuRXh0ZXJuYWxXU0RMQWN0aW9uIG9wZW5FeHRlcm5hbFdTRExBY3Rpb24gPSBuZXcgT3BlbkV4dGVybmFsV1NETEFjdGlvbihXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJTZXJ2aWNlR3JvdXBDb250ZW50RXh0ZW5zaW9uX1VJXzEiKSk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24gb3BlbkFjdGlvbiA9IG5ldyBPcGVuSjJFRVJlc291cmNlQWN0aW9uKCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JT3Blbkxpc3RlbmVyI29wZW4ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5PcGVuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbihPcGVuRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpPT1udWxsKQotCQkJcmV0dXJuOwotCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZXJ2aWNlSGVscGVyPT1udWxsKQotCQkJcmV0dXJuOwotCQllbHNlIGlmIChzZXJ2aWNlSGVscGVyLmlzV1NETFJlc291cmNlKHNlbGVjdGVkT2JqZWN0KSkgewotCQkJUmVzb3VyY2Ugd3NkbCA9IChSZXNvdXJjZSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlJRmlsZSB3c2RsRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUod3NkbCk7Ci0JCQlpZiAod3NkbEZpbGUgPT0gbnVsbCB8fCAhd3NkbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlvcGVuRXh0ZXJuYWxXU0RMQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQkJCQlvcGVuRXh0ZXJuYWxXU0RMQWN0aW9uLnJ1bigpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJb3BlbkFjdGlvbi5ydW4oKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsKSB7Ci0JCQlXc2RkUmVzb3VyY2UgcmVzb3VyY2UgPSBXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRXc2RkUmVzb3VyY2UoKFNlcnZpY2VJbXBsKXNlbGVjdGVkT2JqZWN0KTsKLQkJCUxpc3Qgd3NkZFNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdzZGRTZWxlY3Rpb24uYWRkKHJlc291cmNlKTsKLQkJCQotCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHdzZGRTZWxlY3Rpb24pKTsKLQkJCW9wZW5BY3Rpb24ucnVuKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKSB7Ci0JCQlpZiAoIVdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzSjJFRTE0KChTZXJ2aWNlUmVmKXNlbGVjdGVkT2JqZWN0KSkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kQ29tcG9uZW50KChTZXJ2aWNlUmVmKXNlbGVjdGVkT2JqZWN0KTsKLQkJCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlhcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJCQlMaXN0IG1vZHVsZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbW9kdWxlLmFkZChhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpKTsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kdWxlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpCi0JCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJb3BlbkFjdGlvbi5ydW4oKTsKLQkJfQotCQllbHNlIHsKLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJb3BlbkFjdGlvbi5ydW4oKTsKLQkJfQkKLQl9Ci0JLy9UT0RPIGZpbGwgb3BlbiB3aXRoIG1lbnUgZm9yIHdlYiBzZXJ2aWNlcyBncm91cAotCQotLy8JcmV0dXJuIG5ldyBDb21tb25FZGl0QWN0aW9uR3JvdXAoZ2V0RXh0ZW5zaW9uU2l0ZSgpKSB7Ci0vLwkJcHVibGljIHZvaWQgZmlsbE9wZW5XaXRoTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotLy8JCQlpZiAoKGdldEV4dGVuc2lvblNpdGUoKS5nZXRTZWxlY3Rpb24oKS5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJlYW5MaW5rKSkgewotLy8JCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGdldEV4dGVuc2lvblNpdGUoKS5nZXRTZWxlY3Rpb24oKSk7Ci0vLwkJCQltZW51Lmluc2VydEFmdGVyKElDb21tb25NZW51Q29uc3RhbnRzLkNPTU1PTl9NRU5VX1RPUCwgb3BlbkFjdGlvbik7Ci0vLwkJCX0gZWxzZSBpZiAoKGdldEV4dGVuc2lvblNpdGUoKS5nZXRTZWxlY3Rpb24oKS5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpKSB7Ci0vLwkJCQlXU0RMUmVzb3VyY2VJbXBsIHdzZGwgPSAoV1NETFJlc291cmNlSW1wbCkgZ2V0RXh0ZW5zaW9uU2l0ZSgpLmdldFNlbGVjdGlvbigpLmdldEZpcnN0RWxlbWVudCgpOwotLy8JCQkJSUZpbGUgd3NkbEZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHdzZGwpOwotLy8JCQkJaWYgKHdzZGxGaWxlID09IG51bGwgfHwgIXdzZGxGaWxlLmV4aXN0cygpKSB7Ci0vLwkJCQkJb3BlbkV4dGVybmFsV1NETEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGdldEV4dGVuc2lvblNpdGUoKS5nZXRTZWxlY3Rpb24oKSk7Ci0vLwkJCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5DT01NT05fTUVOVV9UT1AsIG9wZW5FeHRlcm5hbFdTRExBY3Rpb24pOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI1MjdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc05hdmlnYXRvckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVklFV0VSX0lEID0gIm9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFdlYlNlcnZpY2VzTmF2aWdhdG9yTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoY3JlYXRlQWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbmZpZ3VyZSBhbmQgcmV0dXJuIGEgY29tcG9zaXRlIGFkYXB0ZXIgZmFjdG9yeSBmb3Igb3VyIGNvbnRlbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBEeW5hbWljQWRhcHRlckZhY3RvcnkoVklFV0VSX0lEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoIndlYlNlcnZpY2VzRm9sZGVyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid3NkbCIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNTZXJ2aWNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNTZXJ2aWNlSW50ZXJuYWwoKEVPYmplY3QpIGVsZW1lbnQpKQotCQkJCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ3ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZXh0d2Vic2VydmljZWl0ZW1wcm92aWRlcl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNXU0RMUmVzb3VyY2UoZWxlbWVudCkpCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid3NkbCIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJU3RyaW5nIHNwYWNlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZURlc2NyaXB0aW9uKQotCQkJcmV0dXJuIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvblRleHQoKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgZWxlbWVudCk7Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50KQotCQkJcmV0dXJuIFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlBPUlRfVUlfIikgKyBzcGFjZSArIHN1cGVyLmdldFRleHQoZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhhbmRsZXIpCi0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSEFORExFUl9VSV8iKSArIHNwYWNlICsgc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV1NETFBvcnQpCi0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV1NETF9QT1JUX1VJXyIpICsgc3BhY2UgKyBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbEJlYW4pCi0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU0VSVklDRV9DTEFTU0VTX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFSkJMaW5rKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNFUlZJQ0VfSU1QTF9VSV8iKSArIHNwYWNlICsgc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmxldExpbmspCi0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU0VSVklDRV9JTVBMX1VJXyIpICsgc3BhY2UgKyBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNTZXJ2aWNlKGVsZW1lbnQpKQotCQkJcmV0dXJuIHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZUxvY2FsUGFydChlbGVtZW50KTsKLQkJZWxzZSBpZiAoc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShlbGVtZW50KSkgewotCQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoUmVzb3VyY2UpIGVsZW1lbnQpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotCQkJCXJlc3VsdCA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9ICgoUmVzb3VyY2UpIGVsZW1lbnQpLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV1NETF9VSV8iKSArIHNwYWNlICsgcmVzdWx0OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpIHsKLQkJCVN0cmluZyBiZWFuTmFtZTE0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0oyRUUxNCgoU2VydmljZVJlZikgZWxlbWVudCkpIHsKLQkJCQlpZiAoKChTZXJ2aWNlUmVmKSBlbGVtZW50KS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBTZXNzaW9uKQotCQkJCQliZWFuTmFtZTE0ID0gKChTZXNzaW9uKSAoKFNlcnZpY2VSZWYpIGVsZW1lbnQpLmVDb250YWluZXIoKSkuZ2V0TmFtZSgpICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChTZXJ2aWNlUmVmKSBlbGVtZW50KS5nZXROYW1lKCkgKyAiOiAiICsgYmVhbk5hbWUxNCAvLyROT04tTkxTLTEkCi0JCQkJCQkrICgoU2VydmljZVJlZikgZWxlbWVudCkuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGV4dCBmb3Igd2ViIHNlcnZpY2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25UZXh0KFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlSZXNvdXJjZSByZXMgPSBkZXNjcmlwdGlvbi5lUmVzb3VyY2UoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCVN0cmluZyBwcm9qU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlcyAhPSBudWxsKQotCQkJcHJvamVjdCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldFByb2plY3QocmVzKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCXByb2pTdHJpbmcgPSBwcm9qZWN0LmdldE5hbWUoKSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHByb2pTdHJpbmcgKyBzdXBlci5nZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gYWRkIGFueSBsaXN0ZW5lcnM/Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRPRE8gaGFuZGxlIGRpc3Bvc2UKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIFRPRE8gZG8gc29tZXRoaW5nIHNtYXJ0IGhlcmU/Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gaG93IGRvIHdlIHJlbW92ZSBsaXN0ZW5lcnM/Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmM2E1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDEwLCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnByb3ZpZGVycy5Db21tb25BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIgZXh0ZW5kcyBDb21tb25BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCi0KLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplciBJTlNUQU5DRSA9IG51bGw7Ci0JcHJvdGVjdGVkIE5vdGlmaWVyIHRhcmdldCA9IG51bGw7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJY29udGVudFByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIgY3JlYXRlSW5zdGFuY2UoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCUlOU1RBTkNFID0gbmV3IFdlYlNlcnZpY2VzTmF2aWdhdG9yU3luY2hyb25pemVyKGFkYXB0ZXJGYWN0b3J5LCBwcm92aWRlcik7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZUluc3RhbmNlKCkgewotCQlJTlNUQU5DRSA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2dldFRhcmdldCgpCi0JICovCi0JcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI3NldFRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCXRhcmdldCA9IG5ld1RhcmdldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJRU9iamVjdCBub3RpZmllciA9IChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlcykKLQkJCXJldHVybjsKLQotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZ2V0Vmlld2VyKCkucmVmcmVzaChub3RpZmllcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXdoaWxlICghKG5vdGlmaWVyIGluc3RhbmNlb2YgV2ViU2VydmljZURlc2NyaXB0aW9uKSAmJiBub3RpZmllciAhPSBudWxsKQotCQkJbm90aWZpZXIgPSBub3RpZmllci5lQ29udGFpbmVyKCk7Ci0KLQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgV2ViU2VydmljZURlc2NyaXB0aW9uICYmIG5vdGlmaWVyICE9bnVsbCkgewotCQkJRU9iamVjdCB3c2RsID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0V1NETFNlcnZpY2VGb3JXZWJTZXJ2aWNlKChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIG5vdGlmaWVyKTsKLQkJCWNvbnRlbnRQcm92aWRlci5nZXRWaWV3ZXIoKS5yZWZyZXNoKHdzZGwpOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV3NkbFJlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dzZGxSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTNhMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV3NkbFJlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlRXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV3NkbFJlc291cmNlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBFTUZBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdzZGxSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChzZXJ2aWNlSGVscGVyLmlzV1NETFJlc291cmNlKGFkYXB0YWJsZU9iamVjdCkpCi0JCQlyZXMgPSAoUmVzb3VyY2UpIGFkYXB0YWJsZU9iamVjdDsKLQotCQlpZiAocmVzICE9IG51bGwgJiYgYWRhcHRlclR5cGUgPT0gRU1GQWRhcHRlckZhY3RvcnkuSUZJTEVfQ0xBU1MpCi0JCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXMpICE9IG51bGwgPyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcykgOiBudWxsOwotCQllbHNlIGlmIChyZXMgIT0gbnVsbCAmJiBhZGFwdGVyVHlwZSA9PSBFTUZBZGFwdGVyRmFjdG9yeS5JUkVTT1VSQ0VfQ0xBU1MpCi0JCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXMpOwotCQllbHNlIGlmIChyZXMgIT0gbnVsbCAmJiBhZGFwdGVyVHlwZSA9PSBFTUZBZGFwdGVyRmFjdG9yeS5JUFJPSkVDVF9DTEFTUykKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3BsdWdpbi9XZWJTZXJ2aWNlVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3BsdWdpbi9XZWJTZXJ2aWNlVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNTFhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTUsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlcy51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLwlUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTNiNDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJzZXJ2aWNlLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTI5YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd2Vic2VydmljZS5qYXIKLUBkb3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjZmI0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmMDM5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBXZWIgU2VydmljZSBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IC4sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbXBvbmVudGNvcmUudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbnN0YW50cywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlciwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndzZGQucHJvdmlkZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LAotIG9yZy5lY2xpcHNlLmplbSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwsCi0gb3JnLndzZGw0aiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbAotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvSmF4UlBDTWFwQXJ0aWZhY3RFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9KYXhSUENNYXBBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjYzRkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9KYXhSUENNYXBBcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiA8cD4KLSAqIFdTRERBcnRpZmFjdEVkaXQgb2J0YWlucyBhIFdTIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YSBmcm9tIGEKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDsgd2hpY2ggc3RvcmVzIHRoZSBtZXRhbW9kZWwuIFRoZQotICoge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwO2lzIHJldHJpZXZlZCBmcm9tIHRoZQotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwO3VzaW5nIGEgY29uc3RhbnQge0BzZWUKLSAqIEoyRUVDb25zdGFudHMjRUpCSkFSX0REX1VSSV9PQkp9LiBUaGUgZGVmaW5lZCBtZXRob2RzIGV4dHJhY3QgZGF0YSBvciBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZgotICogdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKiAKLSAqLyAKLXB1YmxpYyBjbGFzcyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IHsKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBJZGVudGlmaWVyIHVzZWQgdG8gbGluayBXU0REQXJ0aWZhY3RFZGl0IHRvIGEgV3NkZEFkYXB0ZXJGYWN0b3J5IHtAc2VlCi0JICogV3NkZEFkYXB0ZXJGYWN0b3J5fSBzdG9yZWQgaW4gYW4gQWRhcHRlck1hbmdlciAoQHNlZSBBZGFwdGVyTWFuYWdlcikKLQkgKiA8L3A+Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IEpheFJQQ01hcEFydGlmYWN0RWRpdC5jbGFzczsKLQkKLQotCS8qKgotCSAqIEBwYXJhbSBhSGFuZGxlCi0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIEpheFJQQ01hcEFydGlmYWN0RWRpdChJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkFydGlmYWN0RWRpdE1vZGVsCi0JICovCi0JcHVibGljIEpheFJQQ01hcEFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1wb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8gCi0JcHJvdGVjdGVkIEpheFJQQ01hcEFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCXN1cGVyKGFOYXR1cmUsIGFNb2R1bGUsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gV3NkZFJlc291cmNlIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkKLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgSmF4cnBjbWFwUmVzb3VyY2UgZ2V0SmF4UlBDTWFwWG1pUmVzb3VyY2UoU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCQkKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG1hcHBpbmdGaWxlUGF0aFVSSSk7Ci0JCVJlc291cmNlU2V0IHJlc1NldCA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkpIHJlc1NldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQlyZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudCh1cmkubGFzdFNlZ21lbnQoKSwgbmV3IEpheHJwY21hcFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0KLQkJSmF4cnBjbWFwUmVzb3VyY2UgamF4cnBjbWFwUmVzID0gKEpheHJwY21hcFJlc291cmNlKSByZXNTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQkKLQkJcmV0dXJuIGpheHJwY21hcFJlczsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIEoyRUUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIEVKQlJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIFNwZWMgdmVyc2lvbgotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCQlyZXR1cm4gZ2V0SmF4UlBDTWFwWG1pUmVzb3VyY2UobWFwcGluZ0ZpbGVQYXRoVVJJKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBmcm9tIHRoZSBBcnRpZmFjdEVkaXRNb2RlbCB1c2luZyBkZWZpbmVkIFVSSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBSZXNvdXJjZQotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKFN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkpIHsKLQkJcmV0dXJuIGdldEpheFJQQ01hcFhtaVJlc291cmNlKG1hcHBpbmdGaWxlUGF0aFVSSSk7Ci0JfQotCQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gV2ViU2VydmljZXMgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkpCi0JICogIAotCSAqLwotCXB1YmxpYyBKYXZhV1NETE1hcHBpbmcgZ2V0SmF2YVdTRExNYXBwaW5nKCkgewotCQlyZXR1cm4gKEphdmFXU0RMTWFwcGluZykgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIE9idGFpbnMgdGhlIFdlYlNlcnZpY2VzIChAc2VlIFdlYlNlcnZpY2VzKSByb290IG9iamVjdCBmcm9tIHRoZSBXc2RkUmVzb3VyY2UuIElmIHRoZSByb290IG9iamVjdCBkb2VzCi0JICogbm90IGV4aXN0LCB0aGVuIG9uZSBpcyBjcmVhdGVkIChAbGluayBhZGRFSkJKYXJJZk5lY2Vzc2FyeShnZXRFSkJKYXJYbWlSZXNvdXJjZSgpKSkuCi0JICogVGhlIHJvb3Qgb2JqZWN0IGNvbnRhaW5zIGFsbCBvdGhlciByZXNvdXJjZSBkZWZpbmVkIG9iamVjdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gRU9iamVjdAotCSAqICAKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCQlMaXN0IGNvbnRlbnRzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZShtYXBwaW5nRmlsZVBhdGhVUkkpLmdldENvbnRlbnRzKCk7Ci0JCWlmIChjb250ZW50cy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JCWFkZEphdmFXU0RMTWFwcGluZ0lmTmVjZXNzYXJ5KGdldEpheFJQQ01hcFhtaVJlc291cmNlKG1hcHBpbmdGaWxlUGF0aFVSSSkpOwotCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoV2ViU2VydmljZXMpIGFuZCBwb3B1bGF0ZXMgd2l0aCBkYXRhLiBBZGRzIHRoZSByb290Ci0JICogb2JqZWN0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHBvaW50aW5nIHRvIGEge0BzZWUgWE1MUmVzb3VyY2V9Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIEpVTklUIC0gbW92ZT8KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVdTRExNYXBwaW5nSWZOZWNlc3NhcnkoSmF4cnBjbWFwUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkgICAgaWYoYVJlc291cmNlLmdldENvbnRlbnRzKCkgPT0gbnVsbCB8fCBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlKYXZhV1NETE1hcHBpbmcgbWFwID0gSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVdTRExNYXBwaW5nKCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1hcCk7Ci0JCSAgICB9Ci0JCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldE1vZHVsZVVSSSgpOwotCQkJdHJ5IHsKLQkJCQlhUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGdldEpheFJQQ01hcEFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGdldEpheFJQQ01hcEFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCUpheFJQQ01hcEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IEpheFJQQ01hcEFydGlmYWN0RWRpdChhUHJvamVjdCwgZmFsc2UpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBub3QKLQkgKiBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZAotCSAqIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZQotCSAqICAgICAgICAgICAgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQKLQkgKiAgICAgICAgIG1vZGVsCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgY291bGQgbm90IHJlc29sdmUgdXJpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGdldEpheFJQQ01hcEFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCQlyZXR1cm4gbmV3IEpheFJQQ01hcEFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIHRydWUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEVKQkFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUKLQkgKiAgICAgICAgICAgIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZ2V0SmF4UlBDTWFwQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQkKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCQkJcmV0dXJuIG5ldyBKYXhSUENNYXBBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCBmYWxzZSk7Ci0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFSkJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kIHRoZSBtb2R1bGVUeXBlSWQgaXMgYQotCSAqICAgICAgICAgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KFN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkpIHsKLQkgICAgcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpLG1hcHBpbmdGaWxlUGF0aFVSSSk7Ci0JfQotCQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KGludCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24sU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCSAgICBKYXhycGNtYXBSZXNvdXJjZSByZXMgPSBnZXRKYXhSUENNYXBYbWlSZXNvdXJjZShtYXBwaW5nRmlsZVBhdGhVUkkpOwotCSAgICByZXMuc2V0TW9kdWxlVmVyc2lvbklEKHZlcnNpb24pOwotCSAgICBhZGRKYXZhV1NETE1hcHBpbmdJZk5lY2Vzc2FyeShyZXMpOwotCQlyZXR1cm4gZ2V0SmF2YVdTRExNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNYXBwaW5nIGZpbGUgbmFtZSB1bmtub3duIik7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hcHBpbmcgZmlsZSBuYW1lIHVua25vd24iKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWFwcGluZyBmaWxlIG5hbWUgdW5rbm93biIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hcHBpbmcgZmlsZSBuYW1lIHVua25vd24iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0NEREFydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvV1NDRERBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1YjQxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0NEREFydGlmYWN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21wb25lbnRjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBXU0REQXJ0aWZhY3RFZGl0IG9idGFpbnMgYSBXUyBEZXBsb3ltZW50IERlc2NyaXB0b3IgbWV0YW1vZGVsIHNwZWNpZmVjIGRhdGEgZnJvbSBhCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2V9Jm5ic3A7IHdoaWNoIHN0b3JlcyB0aGUgbWV0YW1vZGVsLiBUaGUKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDtpcyByZXRyaWV2ZWQgZnJvbSB0aGUKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5BcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDt1c2luZyBhIGNvbnN0YW50IHtAc2VlCi0gKiBKMkVFQ29uc3RhbnRzI0VKQkpBUl9ERF9VUklfT0JKfS4gVGhlIGRlZmluZWQgbWV0aG9kcyBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YKLSAqIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotICogPC9wPgotICogCi0gKi8gCi1wdWJsaWMgY2xhc3MgV1NDRERBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IHsKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBJZGVudGlmaWVyIHVzZWQgdG8gbGluayBXU0REQXJ0aWZhY3RFZGl0IHRvIGEgV3NkZEFkYXB0ZXJGYWN0b3J5IHtAc2VlCi0JICogV3NkZEFkYXB0ZXJGYWN0b3J5fSBzdG9yZWQgaW4gYW4gQWRhcHRlck1hbmdlciAoQHNlZSBBZGFwdGVyTWFuYWdlcikKLQkgKiA8L3A+Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IFdTQ0REQXJ0aWZhY3RFZGl0LmNsYXNzOwotCQotCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgV1NDRERBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5BcnRpZmFjdEVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBXU0NEREFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1wb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8gCi0JcHJvdGVjdGVkIFdTQ0REQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBXc2RkUmVzb3VyY2UgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKQotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBXZWJTZXJ2aWNlc1Jlc291cmNlIGdldFdzY2RkWG1pUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoV2ViU2VydmljZXNSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRUpCUmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgU3BlYyB2ZXJzaW9uCi0JICogIAotCSAqLwotCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbigpIHsKLQkJcmV0dXJuIGdldFdzY2RkWG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBmcm9tIHRoZSBBcnRpZmFjdEVkaXRNb2RlbCB1c2luZyBkZWZpbmVkIFVSSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBSZXNvdXJjZQotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShnZXRXZWJTZXJ2aWNlc0NsaWVudFhtbFJlc291cmNlVVJJKCkpOwotCX0KLQkKLQlwdWJsaWMgVVJJIGdldFdlYlNlcnZpY2VzQ2xpZW50WG1sUmVzb3VyY2VVUkkoKSB7Ci0JCQotCQlVUkkgcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfV0VCX0lORl9ERF9VUklfT0JKOwotCQlpZiAoaXNWYWxpZEFwcENsaWVudE1vZHVsZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpKSkKLQkJCXJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX01FVEFfSU5GX0REX1VSSV9PQko7Ci0JCWVsc2UgaWYgKGlzVmFsaWRFSkJNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKSkpCi0JCQlyZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9NRVRBX0lORl9ERF9VUklfT0JKOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXNvdXJjZVVSSTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBXZWJTZXJ2aWNlcyBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSkKLQkgKiAgCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzQ2xpZW50IGdldFdlYlNlcnZpY2VzQ2xpZW50KCkgewotCQlyZXR1cm4gKFdlYlNlcnZpY2VzQ2xpZW50KSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgV2ViU2VydmljZXMgKEBzZWUgV2ViU2VydmljZXMpIHJvb3Qgb2JqZWN0IGZyb20gdGhlIFdzZGRSZXNvdXJjZS4gSWYgdGhlIHJvb3Qgb2JqZWN0IGRvZXMKLQkgKiBub3QgZXhpc3QsIHRoZW4gb25lIGlzIGNyZWF0ZWQgKEBsaW5rIGFkZEVKQkphcklmTmVjZXNzYXJ5KGdldEVKQkphclhtaVJlc291cmNlKCkpKS4KLQkgKiBUaGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICogIAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpIHsKLQkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KGdldFdzY2RkWG1pUmVzb3VyY2UoKSk7Ci0JCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3Qgb2JqZWN0IChXZWJTZXJ2aWNlcykgYW5kIHBvcHVsYXRlcyB3aXRoIGRhdGEuIEFkZHMgdGhlIHJvb3QKLQkgKiBvYmplY3QgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgcG9pbnRpbmcgdG8gYSB7QHNlZSBYTUxSZXNvdXJjZX0KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KFdlYlNlcnZpY2VzUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkgICAgaWYoYVJlc291cmNlLmdldENvbnRlbnRzKCkgPT0gbnVsbCB8fCBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlXZWJTZXJ2aWNlc0NsaWVudCB3c19jbGllbnQgPSBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdzX2NsaWVudCk7Ci0JCSAgICB9Ci0JCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldE1vZHVsZVVSSSgpOwotCQkJdHJ5IHsKLQkJCQlhUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NDRERBcnRpZmFjdEVkaXQgZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JSZWFkKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgV1NDRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0NEREFydGlmYWN0RWRpdCBnZXRXU0NEREFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgV1NDRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIGZhbHNlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIFdTRERBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90Ci0JICogYmUgdXNlZCBmb3IgZWRpdGluZy4gSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUKLQkgKiAgICAgICAgICAgIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTQ0REQXJ0aWZhY3RFZGl0IGdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCQotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCQlpZiAoYU1vZHVsZSAhPSBudWxsICYmIGlzVmFsaWRXU0NERE1vZHVsZShhTW9kdWxlKSkKLQkJCQkJcmV0dXJuIG5ldyBXU0NEREFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIHRydWUpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgRUpCQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZQotCSAqICAgICAgICAgICAgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTQ0REQXJ0aWZhY3RFZGl0IGdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCQlpZiAoYU1vZHVsZSAhPSBudWxsICYmIGlzVmFsaWRXU0NERE1vZHVsZShhTW9kdWxlKSkKLQkJCQkJcmV0dXJuIG5ldyBXU0NEREFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIGZhbHNlKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFSkJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRXU0RETW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXU0NERE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiAoaXNWYWxpZEFwcENsaWVudE1vZHVsZShhQ29tcG9uZW50KSB8fAotCQkJCWlzVmFsaWRXZWJNb2R1bGUoYUNvbXBvbmVudCkgfHwKLQkJCQlpc1ZhbGlkRUpCTW9kdWxlKGFDb21wb25lbnQpKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kIHRoZSBtb2R1bGVUeXBlSWQgaXMgYQotCSAqICAgICAgICAgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCSAgICByZXR1cm4gY3JlYXRlTW9kZWxSb290KGdldEoyRUVWZXJzaW9uKCkpOwotCX0KLQkJCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChpbnQpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JICAgIFdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCSAgICByZXMuc2V0TW9kdWxlVmVyc2lvbklEKHZlcnNpb24pOwotCSAgICBhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiBnZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTRERBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTRERBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0NDZkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0REQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbXBvbmVudGNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiA8cD4KLSAqIFdTRERBcnRpZmFjdEVkaXQgb2J0YWlucyBhIFdTIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YQotICogZnJvbSBhIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDsgd2hpY2ggc3RvcmVzIHRoZQotICogbWV0YW1vZGVsLiBUaGUge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwO2lzIHJldHJpZXZlZAotICogZnJvbSB0aGUge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwO3VzaW5nCi0gKiBhIGNvbnN0YW50IHtAc2VlIEoyRUVDb25zdGFudHMjRUpCSkFSX0REX1VSSV9PQkp9LiBUaGUgZGVmaW5lZCBtZXRob2RzCi0gKiBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdTRERBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IHsKLQotCS8qKgotCSAqIDxwPgotCSAqIElkZW50aWZpZXIgdXNlZCB0byBsaW5rIFdTRERBcnRpZmFjdEVkaXQgdG8gYSBXc2RkQWRhcHRlckZhY3Rvcnkge0BzZWUKLQkgKiBXc2RkQWRhcHRlckZhY3Rvcnl9IHN0b3JlZCBpbiBhbiBBZGFwdGVyTWFuZ2VyIChAc2VlIEFkYXB0ZXJNYW5hZ2VyKQotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gV1NEREFydGlmYWN0RWRpdC5jbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTSUxfRklMRV9FWFQgPSAid3NpbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRklMRV9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBhSGFuZGxlCi0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFdTRERBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KQotCQkJdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgV1NEREFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfWZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0JcHJvdGVjdGVkIFdTRERBcnRpZmFjdEVkaXQoTW9kdWxlQ29yZU5hdHVyZSBhTmF0dXJlLAotCQkJSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFdzZGRSZXNvdXJjZSBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpCi0JICogCi0JICovCi0KLQlwdWJsaWMgV3NkZFJlc291cmNlIGdldFdzZGRYbWlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChXc2RkUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRUpCUmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgU3BlYyB2ZXJzaW9uCi0JICogCi0JICovCi0KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0V3NkZFhtaVJlc291cmNlKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBmcm9tIHRoZSBBcnRpZmFjdEVkaXRNb2RlbCB1c2luZwotCSAqIGRlZmluZWQgVVJJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICogCi0JICovCi0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoCi0JCQkJZ2V0V2ViU2VydmljZXNYbWxSZXNvdXJjZVVSSSgpKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFdlYlNlcnZpY2VzWG1sUmVzb3VyY2VVUkkoKSB7Ci0KLQkJVVJJIHJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfV0VCX0lORl9ERF9VUklfT0JKOwotCQlpZiAoaXNWYWxpZEFwcENsaWVudE1vZHVsZShnZXRDb21wb25lbnQoKSkpCi0JCQlyZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX01FVEFfSU5GX0REX1VSSV9PQko7Ci0JCWVsc2UgaWYgKGlzVmFsaWRFSkJNb2R1bGUoZ2V0Q29tcG9uZW50KCkpKQotCQkJcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19NRVRBX0lORl9ERF9VUklfT0JKOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXNvdXJjZVVSSTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFdlYlNlcnZpY2VzIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpKQotCSAqIAotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlcyBnZXRXZWJTZXJ2aWNlcygpIHsKLQkJaWYgKCFnZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGdldFdzZGRYbWlSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViU2VydmljZXMpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE9idGFpbnMgdGhlIFdlYlNlcnZpY2VzIChAc2VlIFdlYlNlcnZpY2VzKSByb290IG9iamVjdCBmcm9tIHRoZQotCSAqIFdzZGRSZXNvdXJjZS4gSWYgdGhlIHJvb3Qgb2JqZWN0IGRvZXMgbm90IGV4aXN0LCB0aGVuIG9uZSBpcyBjcmVhdGVkCi0JICogKEBsaW5rIGFkZEVKQkphcklmTmVjZXNzYXJ5KGdldEVKQkphclhtaVJlc291cmNlKCkpKS4gVGhlIHJvb3Qgb2JqZWN0Ci0JICogY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICogCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewotCQlMaXN0IGNvbnRlbnRzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldENvbnRlbnRzKCk7Ci0JCWlmIChjb250ZW50cy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JCWFkZFdlYlNlcnZpY2VzSWZOZWNlc3NhcnkoZ2V0V3NkZFhtaVJlc291cmNlKCkpOwotCQlpZiAoY29udGVudHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBvYmplY3QgKFdlYlNlcnZpY2VzKSBhbmQgcG9wdWxhdGVzCi0JICogd2l0aCBkYXRhLiBBZGRzIHRoZSByb290IG9iamVjdCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBwb2ludGluZyB0byBhIHtAc2VlIFhNTFJlc291cmNlfSBOb3RlOiBUaGlzIG1ldGhvZAotCSAqICAgICAgICAgICAgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIEpVTklUIC0gbW92ZT8KLQkgKiAgICAgICAgICAgIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJTZXJ2aWNlc0lmTmVjZXNzYXJ5KFdzZGRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpZiAoYVJlc291cmNlLmdldENvbnRlbnRzKCkgPT0gbnVsbAotCQkJCQl8fCBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlXZWJTZXJ2aWNlcyB3cyA9IFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWJTZXJ2aWNlcygpOwotCQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCh3cyk7Ci0JCQl9Ci0JCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldE1vZHVsZVVSSSgpOwotCQkJdHJ5IHsKLQkJCQlhUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0REQXJ0aWZhY3RFZGl0IGdldFdTRERBcnRpZmFjdEVkaXRGb3JSZWFkKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KTsKLQkJaWYgKGNvbXAgIT0gbnVsbCAmJiBpc1ZhbGlkV1NERE1vZHVsZShjb21wKSkgewotCQkJdHJ5IHsKLQkJCQlhcnRpZmFjdEVkaXQgPSBuZXcgV1NEREFydGlmYWN0RWRpdChhUHJvamVjdCwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlCi0JICogcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubwotCSAqIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZAotCSAqICAgICAgICAgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KTsKLQkJaWYgKGNvbXAgIT0gbnVsbCAmJiBpc1ZhbGlkV1NERE1vZHVsZShjb21wKSkgewotCQkJdHJ5IHsKLQkJCQlhcnRpZmFjdEVkaXQgPSBuZXcgV1NEREFydGlmYWN0RWRpdChhUHJvamVjdCwgZmFsc2UpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCi0JICogd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQoCi0JCQlJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCWlmIChhTW9kdWxlICE9IG51bGwgJiYgaXNWYWxpZFdTRERNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gbmV3IFdTRERBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCB0cnVlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBFSkJBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZAotCSAqICAgICAgICAgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvcldyaXRlKAotCQkJSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlpZiAoYU1vZHVsZSAhPSBudWxsICYmIGlzVmFsaWRXU0RETW9kdWxlKGFNb2R1bGUpKQotCQkJcmV0dXJuIG5ldyBXU0REQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgZmFsc2UpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFSkJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZFdTRERNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZCB0aGUKLQkgKiAgICAgICAgIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdTRERNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gKGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoYUNvbXBvbmVudCkKLQkJCQl8fCBpc1ZhbGlkV2ViTW9kdWxlKGFDb21wb25lbnQpIHx8IGlzVmFsaWRFSkJNb2R1bGUoYUNvbXBvbmVudCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZAotCSAqICAgICAgICAgdGhlIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdlYk1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcwotCQkJCS5pc0R5bmFtaWNXZWJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoYUNvbXBvbmVudAotCQkJCS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoKSB7Ci0JCXJldHVybiBjcmVhdGVNb2RlbFJvb3QoZ2V0SjJFRVZlcnNpb24oKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoaW50KQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdChpbnQgdmVyc2lvbikgewotCQlXc2RkUmVzb3VyY2UgcmVzID0gKFdzZGRSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlyZXMuc2V0TW9kdWxlVmVyc2lvbklEKHZlcnNpb24pOwotCQlhZGRXZWJTZXJ2aWNlc0lmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiBnZXRXZWJTZXJ2aWNlcygpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldENvbnRlbnRNb2RlbFJvb3QoKSB7Ci0JCXJldHVybiBnZXRXZWJTZXJ2aWNlcygpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdTSUxSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0RmlsZXMoZ2V0UHJvamVjdCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJaWYgKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0lMX0ZJTEVfRVhUKSkgewotCQkJCUlWaXJ0dWFsUmVzb3VyY2VbXSB2UmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZQotCQkJCQkJLmNyZWF0ZVJlc291cmNlcyhmaWxlKTsKLQkJCQlpZiAodlJlc291cmNlcy5sZW5ndGggPiAwICYmICFyZXN1bHQuY29udGFpbnMoZmlsZSkpCi0JCQkJCXJlc3VsdC5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXU0RMUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKFdTRExfRklMRV9FWFQpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSZXNvdXJjZXMoU3RyaW5nIGV4dCkgewotCQlMaXN0IHJlc291cmNlcyA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRVUkkoKS5maWxlRXh0ZW5zaW9uKCkgIT0gbnVsbAotCQkJCQkmJiByZXMuZ2V0VVJJKCkuZmlsZUV4dGVuc2lvbigpLmVxdWFscyhleHQpKQotCQkJCXJlc3VsdC5hZGQocmVzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgV1NETFJlc291cmNlIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHJldHVybiBudWxsCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFdzZGxSZXNvdXJjZShTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguZXF1YWxzKCIiKSlyZXR1cm4gbnVsbDsgLy8kTk9OLU5MUy0xJAotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQl0cnkgewotCQkJcmVzID0gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHBhdGgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIKLQkJCQkuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmlzTG9hZGVkKCkgJiYgc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShyZXMpKQotCQkJcmV0dXJuIHJlczsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvQVRLVUlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29uc3RhbnRzL0FUS1VJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjBlMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvQVRLVUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWwuUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQ29uc3RhbnRzIHsKLQkvLyBpbml0LXBhcmFtCi0JcHVibGljIFN0cmluZyBkZWZhdWx0SW5pdFBhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfTkFNRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEluaXRQYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9WQUxVRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9ERVNDUklQVElPTiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIFFOYW1lCi0JcHJpdmF0ZSBTdHJpbmcgREVGQVVMVF9QUkVGSVggPSAicGZ4IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIERFRkFVTFRfTkFNRVNQQUNFVVJJID0gIk5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBERUZBVUxUX0xPQ0FMUEFSVCA9ICJMb2NhbFBhcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRQcmVmaXgoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKERFRkFVTFRfUFJFRklYKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKERFRkFVTFRfTkFNRVNQQUNFVVJJKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRMb2NhbFBhcnQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKERFRkFVTFRfTE9DQUxQQVJUKTsKLQl9Ci0KLQkvLyBzb2FwIHJvbGUKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTT0FQUm9sZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfU09BUF9ST0xFIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcG9ydCBuYW1lCi0JcHVibGljIFN0cmluZyBkZWZhdWx0UG9ydE5hbWUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1RBQkxFX1BPUlRfTkFNRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vcG9ydCBjb21wb25lbnQKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCJqYXZhLnJtaS5SZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gcG9ydCBjb21wb25lbnQgcmVmCi0JcHVibGljIEphdmFDbGFzcyBkZWZhdWx0Q2xpZW50U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLnJtaS5SZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFBvcnRDb21wb25lbnRMaW5rKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9QT1JUX0NPTVBPTkVOVF9MSU5LIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gc2VydmljZS1yZWYKLQlwdWJsaWMgU2VydmljZVJlZiBkZWZhdWx0U2VydmljZVJlZigpIHsKLQkJU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlUmVmKCk7Ci0JCXNlcnZpY2VSZWYuc2V0U2VydmljZVJlZk5hbWUoZGVmYXVsdFNlcnZpY2VSZWZOYW1lKCkpOwotCQlzZXJ2aWNlUmVmLnNldFNlcnZpY2VJbnRlcmZhY2UoZGVmYXVsdFNlcnZpY2VJbnRlcmZhY2UoKSk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFNlcnZpY2VSZWZOYW1lKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJzZXJ2aWNlLyIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVfVUlfU2VydmljZVJlZl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBKYXZhQ2xhc3MgZGVmYXVsdFNlcnZpY2VJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmF4LnhtbC5ycGMuU2VydmljZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcG9ydCBjb21wb25lbnQgbmFtZQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFBvcnRDb21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVfVUlfUG9ydENvbXBvbmVudF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gc2VydmljZSBpbXBsIGJlYW4KLQlwdWJsaWMgU2VydmljZUltcGxCZWFuIGRlZmF1bHRTZXJ2aWNlSW1wbEJlYW4oKSB7Ci0JCVNlcnZpY2VJbXBsQmVhbiBzZXJ2aWNlSW1wbEJlYW4gPSBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUltcGxCZWFuKCk7Ci0JCXNlcnZpY2VJbXBsQmVhbi5zZXRFU2VydmxldExpbmsoZGVmYXVsdFNlcnZsZXRMaW5rKCkpOwotCQlyZXR1cm4gc2VydmljZUltcGxCZWFuOwotCX0KLQotCS8vIHNlcnZsZXQgbGluawotCXB1YmxpYyBTZXJ2bGV0TGluayBkZWZhdWx0U2VydmxldExpbmsoKSB7Ci0JCVNlcnZsZXRMaW5rIHNlcnZsZXRMaW5rID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXRMaW5rKCk7Ci0JCXNlcnZsZXRMaW5rLnNldFNlcnZsZXRMaW5rKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1NFUlZMRVRfTElOSyIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2VydmxldExpbms7Ci0JfQotCi0JLy8gV1NETCBwb3J0Ci0JcHVibGljIFdTRExQb3J0IGRlZmF1bHRXU0RMUG9ydChpbnQgdmVyc2lvbklEKSB7Ci0JCVdTRExQb3J0IHdzZGxwb3J0ID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExQb3J0KCk7Ci0JCVFOYW1lSGVscGVyLnNldFFOYW1lVmFsdWUod3NkbHBvcnQsIGRlZmF1bHROYW1lc3BhY2VVUkkoKSwgZGVmYXVsdExvY2FsUGFydCgpLCBkZWZhdWx0UHJlZml4KCksIHZlcnNpb25JRCk7Ci0JCXJldHVybiB3c2RscG9ydDsKLQl9Ci0KLQkvLyBwb3J0IGNvbXBvbmVudAotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGRlZmF1bHRQb3J0Q29tcG9uZW50KGludCB2ZXJzaW9uSUQpIHsKLQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50ID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRDb21wb25lbnQoKTsKLQkJcG9ydENvbXBvbmVudC5zZXRQb3J0Q29tcG9uZW50TmFtZShkZWZhdWx0UG9ydENvbXBvbmVudE5hbWUoKSk7Ci0JCXBvcnRDb21wb25lbnQuc2V0V3NkbFBvcnQoZGVmYXVsdFdTRExQb3J0KHZlcnNpb25JRCkpOwotCQlwb3J0Q29tcG9uZW50LnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShkZWZhdWx0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpOwotCQlwb3J0Q29tcG9uZW50LnNldFNlcnZpY2VJbXBsQmVhbihkZWZhdWx0U2VydmljZUltcGxCZWFuKCkpOwotCQlyZXR1cm4gcG9ydENvbXBvbmVudDsKLQl9Ci0KLQkvLyBKQVggUlBDIG1hcHBpbmcKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRKYXhScGNNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoImpheHJwY21hcHBpbmcueG1sIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBjb21wb25lbnQgc2NvcGVkIHJlZmVyZW5jZQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdENvbXBvbmVudE5hbWUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvSW5mb3BvcENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvSW5mb3BvcENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTIwN2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29uc3RhbnRzL0luZm9wb3BDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSW5mb3BvcENvbnN0YW50cyB7Ci0KLQkvKiogKioqKioqKioqKioqKioqKioqKioqKioqKkluZm9wb3BzIGZvciBwYWdlcyoqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdlYlNlcnZpY2VzUGFnZSgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIi5FSlNSUDAwMDEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wUG9ydENvbXBvbmVudFBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDAyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTSGFuZGxlclBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDAzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VSZWZQYWdlKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKU1JQMDAwNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTUkhhbmRsZXJQYWdlKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKU1JQMDAwNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCi0JLyoqICoqKioqKioqKioqKioqKioqKioqKioqKipJbmZvcG9wcyBmb3Igc2VjdGlvbnMqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcERlc2NyaXB0aW9uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDAxIGZvciB0aGUgZGVzY3JpcHRpb24gdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wRGlzcGxheU5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDIgZm9yIHRoZSBkaXNwbGF5IG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU21hbGxJY29uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDAzIGZvciB0aGUgc21hbGwgaWNvbiBkaXNwbGF5ICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAwMyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BMYXJnZUljb24oKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDQgZm9yIHRoZSBsYXJnZSBpY29uIGRpc3BsYXkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDUgZm9yIHRoZSBXZWIgc2VydmljZSBkZXNjcmlwdGlvbiBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA1IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTRExGaWxlKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA2IGZvciB0aGUgV1NETCBmaWxlIGxvY2F0aW9uIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA2IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcEpBWFJQQ01hcHBpbmdGaWxlKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA3IGZvciB0aGUgSkFYLVJQQyBtYXBwaW5nIGZpbGUgbG9jYXRpb24gdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wUG9ydENvbXBvbmVudE5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDggZm9yIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTRExQb3J0TmFtZXNwYWNlVVJJKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA5IGZvciB0aGUgV1NETCBwb3J0IG5hbWVzcGFjZSBVUkkgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wV1NETFBvcnRMb2NhbHBhcnQoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTAgZm9yIHRoZSBXU0RMIHBvcnQgbG9jYWwgcGFydCB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMTEgZm9yIHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgY2xhc3MgbmFtZSB0ZXh0Ci0JCSAqIGZpZWxkCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZUltcGxCZWFuKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDEyIGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBjbGFzcyBuYW1lIHRleHQKLQkJICogZmllbGQKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BFSkJMaW5rKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDEzIGZvciB0aGUgdXNlIEVKQiBsaW5rIHJhZGlvIGJ1dHRvbiAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmxldExpbmsoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTQgZm9yIHRoZSB1c2Ugc2VydmxldCBsaW5rIHJhZGlvIGJ1dHRvbiAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wSGFuZGxlck5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTUgZm9yIHRoZSBoYW5kbGVyIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wSGFuZGxlckNsYXNzKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDE2IGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIGhhbmRsZXIgY2xhc3MgbmFtZSB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxNiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlUmVmTmFtZSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxNyBmb3IgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZUludGVyZmFjZU5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTggZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDE4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VRTmFtZU5hbWVzcGFjZVVSSSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxOSBmb3IgdGhlIHNlcnZpY2UgcW5hbWUgbmFtc3BhY2UgVVJJIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDE5IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VRTmFtZUxvY2FscGFydCgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAyMCBmb3IgdGhlIHNlcnZpY2UgcW5hbWUgbG9jYWwgcGFydCB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BDb21ib1dlYlNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAyMSBmb3IgdGhlIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9uIGRyb3AtZG93biAobGlzdCBvZiBXZWIgc2VydmljZQotCQkgKiBkZXNjcmlwdGlvbnMpCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wQ29tYm9Qb3J0Q29tcG9uZW50KCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDIyIGZvciB0aGUgcG9ydCBjb21wb25lbnQgZHJvcC1kb3duIChsaXN0IG9mIHBvcnQgY29tcG9uZW50cykgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDIyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcENvbWJvQ29tcG9uZW50U2NvcGVkUmVmKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDIzIGZvciB0aGUgY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2UgZHJvcC1kb3duIChsaXN0IG9mIGNvbXBvbmVudAotCQkgKiBzY29wZWQgcmVmZXJlbmNlKQotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDIzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcENvbWJvU2VydmljZVJlZigpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAyNCBmb3IgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIGRyb3AtZG93biAobGlzdCBvZiBzZXJ2aWNlIHJlZmVyZW5jZXMpICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uV2ViU2VydmljZURlc2NyaXB0aW9uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI1IGZvciB0aGUgV2ViIHNlcnZpY2UgZGVzY3JpcHRpb24gc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXMueG1sIGVkaXRvciAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnRDb21wb25lbnQoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMjYgZm9yIHRoZSBwb3J0IGNvbXBvbmVudCBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlcy54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uSGFuZGxlcldTKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI3IGZvciB0aGUgaGFuZGxlciBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlcy54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uQ29tcG9uZW50U2NvcGVkUmVmKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDI4IGZvciB0aGUgY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUKLQkJICogd2Vic2VydmljZXNjbGllbnQueG1sIGVkaXRvcgotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDI4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25TZXJ2aWNlUmVmKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI5IGZvciB0aGUgc2VydmljZSByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIGVkaXRvciAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnRDb21wb25lbnRSZWYoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzAgZm9yIHRoZSBwb3J0IGNvbXBvbmVudCByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sCi0JCSAqIGVkaXRvcgotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDMwIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25IYW5kbGVyV1NDKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDMxIGZvciB0aGUgaGFuZGxlciBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzMSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uSW5pdFBhcmFtcygpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzMiBmb3IgdGhlIGluaXRpYWwgcGFyYW1ldGVyIHNlY3Rpb24gaW4gYm90aCB3ZWJzZXJ2aWNlcy54bWwgYW5kCi0JCSAqIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBlZGl0b3IKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzMiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uU09BUEhlYWRlcnMoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzMgZm9yIHRoZSBTT0FQIGhlYWRlciBzZWN0aW9uIGluIGJvdGggd2Vic2VydmljZXMueG1sIGFuZAotCQkgKiB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblNPQVBSb2xlcygpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzNCBmb3IgdGhlIFNPQVAgcm9sZSBzZWN0aW9uIGluIGJvdGggd2Vic2VydmljZXMueG1sIGFuZAotCQkgKiB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnROYW1lcygpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAzNSBmb3IgdGhlIHBvcnQgbmFtZSBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BSZXNvdXJjZVRyZWUoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzYgZm9yIHRoZSBwb3B1cCBkaWFsb2cgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcmVzb3VyY2UgaW4gdGhlCi0JCSAqIHdvcmtiZW5jaAotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDM2IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYzJlODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBtZXRob2RzIHRvIGhlbHAgbmF2aWdhdGUgV1NETCBmaWxlcyBwcm92aWRlZCBpbiB2YXJpb3VzIEpTUi0xMDkgZGVzY3JpcHRvcnMKLSAqLwotcHVibGljIGNsYXNzIFdTRExIZWxwZXIgewotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qOwotCi0JcHVibGljIFdTRExIZWxwZXIoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdGhpcy5wcm9qID0gYVByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbGlzdCBvZiB3c2RsOnBvcnRAbmFtZSdzIGNvbnRhaW5lZCBpbiB0aGUgV1NETCBmaWxlIHJlZmVycmVkIHRvIGJ5Ci0JICogdGhlIHNwZWNpZmllZCA8c2VydmljZS1yZWY+Ci0JICogCi0JICogQHBhcmFtIHNlcnZpY2VSZWZOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgPHNlcnZpY2UtcmVmPgotCSAqIEBwYXJhbSBjb21wU2NvcGVkUmVmTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIDxjb21wb25lbnQtc2NvcGVkLXJlZnM+Ci0JICogQHBhcmFtIHdzYwotCSAqICAgICAgICAgICAgVGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBleGNsdWRlCi0JICogICAgICAgICAgICBwb3J0IG5hbWVzIHRvIGV4Y2x1ZGUgaW4gdGhlIHJldHVybmVkIGFycmF5Ci0JICogQHJldHVybiBTdHJpbmdbXSBBbiBhcnJheSBvZiB3c2RsOnBvcnRAbmFtZXMncy4gbnVsbCBpcyByZXR1cm5lZCBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zCi0JICogICAgICAgICB3aXRoIG5hdmlnYXRpbmcgdGhlIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBvciB0aGUgV1NETC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UG9ydE5hbWVzKFN0cmluZyBzZXJ2aWNlUmVmTmFtZSwgU3RyaW5nIGNvbXBTY29wZWRSZWZOYW1lLCBXZWJTZXJ2aWNlc0NsaWVudCB3c2MsIFN0cmluZ1tdIGV4Y2x1ZGUpIHsKLQkJU2VydmljZVJlZiBzciA9IGdldFNlcnZpY2VSZWYoc2VydmljZVJlZk5hbWUsIGNvbXBTY29wZWRSZWZOYW1lLCB3c2MpOwotCQlpZiAoc3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB3c2RsVVJMID0gZ2V0V1NETEZpbGVVUkwoc3IpOwotCQlpZiAod3NkbFVSTC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHNlcnZpY2VMb2NhbE5hbWUgPSBnZXRTZXJ2aWNlUW5hbWUoc3IpOwotCQlTdHJpbmdbXSBwb3J0TmFtZXMgPSBnZXRQb3J0TmFtZXMod3NkbFVSTCwgc2VydmljZUxvY2FsTmFtZSk7Ci0JCXBvcnROYW1lcyA9IHRyaW0ocG9ydE5hbWVzLCBleGNsdWRlKTsKLQkJcmV0dXJuIHBvcnROYW1lczsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgd3NkbDpzZXJ2aWNlIGluIFdTREwgZmlsZSByZWZlcnJlZCB0byBieSB0aGUKLQkgKiBzcGVjaWZpZWQgPHNlcnZpY2UtcmVmPgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2aWNlUmVmTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIDxzZXJ2aWNlLXJlZj4KLQkgKiBAcGFyYW0gY29tcFNjb3BlZFJlZk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSA8Y29tcG9uZW50LXNjb3BlZC1yZWZzPgotCSAqIEBwYXJhbSB3c2MKLQkgKiAgICAgICAgICAgIFRoZSByb290IG9iamVjdCBvZiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZXhjbHVkZQotCSAqICAgICAgICAgICAgcG9ydCBuYW1lcyB0byBleGNsdWRlIGluIHRoZSByZXR1cm5lZCBhcnJheQotCSAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHdzZGw6c2VydmljZS4gbnVsbCBpcyByZXR1cm5lZCBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zCi0JICogICAgICAgICB3aXRoIG5hdmlnYXRpbmcgdGhlIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBvciB0aGUgV1NETC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lc3BhY2UoU3RyaW5nIHNlcnZpY2VSZWZOYW1lLCBTdHJpbmcgY29tcFNjb3BlZFJlZk5hbWUsIFdlYlNlcnZpY2VzQ2xpZW50IHdzYykgewotCQlTZXJ2aWNlUmVmIHNyID0gZ2V0U2VydmljZVJlZihzZXJ2aWNlUmVmTmFtZSwgY29tcFNjb3BlZFJlZk5hbWUsIHdzYyk7Ci0JCWlmIChzciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHdzZGxVUkwgPSBnZXRXU0RMRmlsZVVSTChzcik7Ci0JCWlmICh3c2RsVVJMLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgc2VydmljZUxvY2FsTmFtZSA9IGdldFNlcnZpY2VRbmFtZShzcik7Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSBnZXRQb3J0TmFtZXNwYWNlKHdzZGxVUkwsIHNlcnZpY2VMb2NhbE5hbWUpOwotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGxpc3Qgb2Ygd3NkbDpwb3J0QG5hbWUncyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCB3c2RsOnNlcnZpY2UgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIFdTREwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gd3NkbFVSTAotCSAqICAgICAgICAgICAgVGhlIFVSTCBvZiB0aGUgV1NETCBmaWxlLgotCSAqIEBwYXJhbSBzZXJ2aWNlTG9jYWxOYW1lCi0JICogICAgICAgICAgICBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgd3NkbDpzZXJ2aWNlIHRvIGxvb2sgaW4uCi0JICogQHJldHVybiBTdHJpbmdbXSBBbiBhcnJheSBvZiB3c2RsOnBvcnRAbmFtZSdzLiBOdWxsIGlzIHJldHVybmVkIGEgd3NkbDpzZXJ2aWNlIHdpdGggdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQgbG9jYWwgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRQb3J0TmFtZXMoU3RyaW5nIHdzZGxVUkwsIFN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlPYmplY3QgdGFyZ2V0U2VydmljZSA9IGdldFRhcmdldFNlcnZpY2Uod3NkbFVSTCwgc2VydmljZUxvY2FsTmFtZSk7Ci0KLQkJaWYgKHRhcmdldFNlcnZpY2UgPT0gbnVsbCkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldFBvcnROYW1lcyAuLi4gdGFyZ2V0U2VydmljZSBudWxsLiIpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcG9ydHMgPSBzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyh0YXJnZXRTZXJ2aWNlKTsKLQkJaW50IG51bWJlck9mUG9ydHMgPSBwb3J0cy5zaXplKCk7Ci0JCVN0cmluZ1tdIHBvcnROYW1lcyA9IG5ldyBTdHJpbmdbbnVtYmVyT2ZQb3J0c107Ci0JCUl0ZXJhdG9yIGsgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlmb3IgKGludCBtID0gMDsgbSA8IG51bWJlck9mUG9ydHM7IG0rKykgewotCQkJT2JqZWN0IHBvcnQgPSBrLm5leHQoKTsKLQkJCXBvcnROYW1lc1ttXSA9IHNlcnZpY2VIZWxwZXIuZ2V0UG9ydE5hbWUocG9ydCk7Ci0JCX0KLQotCQlyZXR1cm4gcG9ydE5hbWVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgc3BlY2lmaWVkIHdzZGw6c2VydmljZSBpbiB0aGUgc3BlY2lmaWVkIFdTREwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gd3NkbFVSTAotCSAqICAgICAgICAgICAgVGhlIFVSTCBvZiB0aGUgV1NETCBmaWxlLgotCSAqIEBwYXJhbSBzZXJ2aWNlTG9jYWxOYW1lCi0JICogICAgICAgICAgICBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgd3NkbDpzZXJ2aWNlIHRvIGxvb2sgaW4uCi0JICogQHJldHVybiBTdHJpbmdbXSBBbiBhcnJheSBvZiB3c2RsOnBvcnRAbmFtZSdzLiBBbiBlbXB0eSBTdHJpbmcgaXMgcmV0dXJuZWQgaWYgYSB3c2RsOnNlcnZpY2UKLQkgKiAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQb3J0TmFtZXNwYWNlKFN0cmluZyB3c2RsVVJMLCBTdHJpbmcgc2VydmljZUxvY2FsTmFtZSkgewotCQlPYmplY3QgdGFyZ2V0U2VydmljZSA9IGdldFRhcmdldFNlcnZpY2Uod3NkbFVSTCwgc2VydmljZUxvY2FsTmFtZSk7Ci0KLQkJaWYgKHRhcmdldFNlcnZpY2UgPT0gbnVsbCkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldFBvcnROYW1lc3BhY2UgLi4uIHRhcmdldFNlcnZpY2UgbnVsbC4iKTsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCkuZ2V0U2VydmljZU5hbWVzcGFjZVVSSSh0YXJnZXRTZXJ2aWNlKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRUYXJnZXRTZXJ2aWNlKFN0cmluZyB3c2RsVVJMLCBTdHJpbmcgc2VydmljZUxvY2FsTmFtZSkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJT2JqZWN0IGRlZmluaXRpb24gPSBnZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLQkJaWYgKGRlZmluaXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlPYmplY3QgdGFyZ2V0U2VydmljZSA9IG51bGw7Ci0JCU1hcCBzZXJ2aWNlcyA9IHNlcnZpY2VIZWxwZXIuZ2V0RGVmaW5pdGlvblNlcnZpY2VzKGRlZmluaXRpb24pOwotCQlpZiAoIXNlcnZpY2VzLmlzRW1wdHkoKSkgewotCQkJaWYgKChzZXJ2aWNlTG9jYWxOYW1lID09IG51bGwgfHwgc2VydmljZUxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSAmJiBzZXJ2aWNlcy5zaXplKCkgPiAxKSAvL011bHRpcGxlCi0JCQkvLyBzZXJ2aWNlcwotCQkJLy8gd2l0aG91dAotCQkJLy8gb25lCi0JCQkvLyBkZXNpZ25hdGVkCi0JCQkvLyBpcwotCQkJLy8gYW4KLQkJCS8vIGVycm9yCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmICgoc2VydmljZUxvY2FsTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VMb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkgJiYgc2VydmljZXMuc2l6ZSgpID09IDEpIHsKLQkJCQkvL1JldHVybiB0aGUgcG9ydCBuYW1lcyBpbiB0aGUgb25lIHNlcnZpY2UKLQkJCQlJdGVyYXRvciBpID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl0YXJnZXRTZXJ2aWNlID0gaS5uZXh0KCk7Ci0JCQl9IGVsc2UgLy9UaGVyZSBhcmUgbXVsdGlwbGUgc2VydmljZXMgYnV0IG9uZSBpcyBkZXNpZ25hdGVkCi0JCQl7Ci0JCQkJSXRlcmF0b3IgaiA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGouaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBzZXJ2aWNlID0gai5uZXh0KCk7Ci0JCQkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZUxvY2FsUGFydChzZXJ2aWNlKTsKLQkJCQkJaWYgKHNlcnZpY2VOYW1lLmVxdWFscyhzZXJ2aWNlTG9jYWxOYW1lKSkgewotCQkJCQkJdGFyZ2V0U2VydmljZSA9IHNlcnZpY2U7Ci0JCQkJCQlicmVhazsgLy9Gb3VuZCBhIG1hdGNoLiBCcmVhayBvdXQgb2YgbG9vcC4gV2UgbXVzdCBiZSBhc3N1bWluZyB1bmlxdWUgbmFtZXMKLQkJCQkJCS8vIG9uIHNlcnZpY2VzLgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRhcmdldFNlcnZpY2U7Ci0KLQl9Ci0KLQotCXByaXZhdGUgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsVVJMKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlyZXR1cm4gc2VydmljZUhlbHBlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLQkJCi0JCS8qdHJ5IHsKLQkJCVdTRExSZXNvdXJjZUltcGwgcmVzID0gKFdTRExSZXNvdXJjZUltcGwpIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHdzZGxVUkwpLCB0cnVlKTsKLQkJCWlmIChyZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiByZXMuZ2V0RGVmaW5pdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gd3NkbGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ki8KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIFVSTCBvZiB0aGUgPHdzZGwtZmlsZT5zcGVjaWZpZWQgaW4gdGhlIGdpdmVuIDxzZXJ2aWNlLXJlZj4uIFJldHVybnMgYSBibGFuawotCSAqIFN0cmluZyBpZiA8d3NkbC1maWxlPmlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHByb3ZpZGVkIDxzZXJ2aWNlLXJlZj4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRXU0RMRmlsZVVSTChTZXJ2aWNlUmVmIHNyKSB7Ci0JCVN0cmluZyB3c2RsRmlsZVJlbFBhdGggPSBzci5nZXRXc2RsRmlsZSgpOwotCQlpZiAod3NkbEZpbGVSZWxQYXRoID09IG51bGwgfHwgd3NkbEZpbGVSZWxQYXRoLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBHZXQgYSBoYW5kbGUgb24gdGhlIFdTREwgZmlsZS4KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvaik7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJSVZpcnR1YWxGb2xkZXIgbW9kdWxlUm9vdCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCUlGaWxlIHdzZGxGaWxlID0gbW9kdWxlUm9vdC5nZXRGaWxlKHdzZGxGaWxlUmVsUGF0aCkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJCWlmICghd3NkbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vR2V0IHRoZSBmaWxlVVJMIGZyb20gd3NkbEZpbGUKLQkJCVN0cmluZyB3c2RsVVJMOwotCQkJdHJ5IHsKLQkJCQl3c2RsVVJMID0gd3NkbEZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKHdzZGxVUkwgPT0gbnVsbCB8fCB3c2RsVVJMLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gd3NkbFVSTDsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSA8c2VydmljZS1xbmFtZT5zcGVjaWZpZWQgaW4gdGhlIGdpdmVuIDxzZXJ2aWNlLXJlZj4uIFJldHVybnMgYQotCSAqIGJsYW5rIFN0cmluZyBpZiA8c2VydmljZS1xbmFtZT5pcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCA8c2VydmljZS1yZWY+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmljZVFuYW1lKFNlcnZpY2VSZWYgc3IpIHsKLQkJUU5hbWUgc2VydmljZVFuYW1lID0gc3IuZ2V0U2VydmljZVFuYW1lKCk7Ci0JCWlmIChzZXJ2aWNlUW5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lID0gc2VydmljZVFuYW1lLmdldExvY2FsUGFydCgpOwotCQlpZiAoc2VydmljZUxvY2FsTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHNlcnZpY2VMb2NhbE5hbWU7Ci0JfQotCi0JLyogSWYgY29tcFNjb3BlZFJlZk5hbWUgaXMgZW1wdHkgb3IgbnVsbCwgd2UgbWF5IGhhdmUgdG8gY2hlY2sgYWxsIG9mIHRoZW0uICovCi0JcHVibGljIFNlcnZpY2VSZWYgZ2V0U2VydmljZVJlZihTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbXBTY29wZWRSZWZOYW1lLCBXZWJTZXJ2aWNlc0NsaWVudCB3c2MpIHsKLQkJSXRlcmF0b3Igc2VydmljZVJlZnM7Ci0JCWlmIChjb21wU2NvcGVkUmVmTmFtZSAhPSBudWxsICYmIGNvbXBTY29wZWRSZWZOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBjc3IgPSBnZXRDb21wU2NvcGVkUmVmKGNvbXBTY29wZWRSZWZOYW1lLCB3c2MpOwotCQkJc2VydmljZVJlZnMgPSBjc3IuZ2V0U2VydmljZVJlZnMoKS5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJc2VydmljZVJlZnMgPSB3c2MuZ2V0U2VydmljZVJlZnMoKS5pdGVyYXRvcigpOwotCQkJLy9JZiB0aGVyZSBhcmUgbm8gc2VydmljZSByZWZzIC4uLiBjaGVjayBhbGwgY29tcG9uZW50LXNjb3BlZC1yZWZzIGZvciB0aGUgc2VydmljZS1yZWYKLQkJCWlmICghc2VydmljZVJlZnMuaGFzTmV4dCgpKSB7Ci0JCQkJSXRlcmF0b3IgY3NSZWZzID0gd3NjLmdldENvbXBvbmVudFNjb3BlZFJlZnMoKS5pdGVyYXRvcigpOwotCi0JCQkJd2hpbGUgKGNzUmVmcy5oYXNOZXh0KCkpIHsKLQkJCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBjc3IgPSAoQ29tcG9uZW50U2NvcGVkUmVmcykgY3NSZWZzLm5leHQoKTsKLQkJCQkJSXRlcmF0b3Igc3JzID0gY3NyLmdldFNlcnZpY2VSZWZzKCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKHNycy5oYXNOZXh0KCkpIHsKLQkJCQkJCVNlcnZpY2VSZWYgc3IgPSAoU2VydmljZVJlZikgc3JzLm5leHQoKTsKLQkJCQkJCVN0cmluZyB0aGlzTmFtZSA9IHNyLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0JCQkJCQlpZiAodGhpc05hbWUuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQkJcmV0dXJuIHNyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7IC8vQ291bGQgbm90IGZpbmQgaXQgaW4gYW55IG9mIHRoZSBjb21wb25lbnQtc2NvcGVkLXJlZnMKLQkJCX0KLQotCQl9Ci0KLQkJd2hpbGUgKHNlcnZpY2VSZWZzLmhhc05leHQoKSkgewotCQkJU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIHNlcnZpY2VSZWZzLm5leHQoKTsKLQkJCVN0cmluZyBzZXJ2aWNlUmVmTmFtZSA9IHNlcnZpY2VSZWYuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJCWlmIChzZXJ2aWNlUmVmTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIHNlcnZpY2VSZWY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIENvbXBvbmVudFNjb3BlZFJlZnMgZ2V0Q29tcFNjb3BlZFJlZihTdHJpbmcgbmFtZSwgV2ViU2VydmljZXNDbGllbnQgd3NjKSB7Ci0JCUl0ZXJhdG9yIGNvbXBTY29wZWRSZWZzID0gd3NjLmdldENvbXBvbmVudFNjb3BlZFJlZnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoY29tcFNjb3BlZFJlZnMuaGFzTmV4dCgpKSB7Ci0JCQlDb21wb25lbnRTY29wZWRSZWZzIGNvbXBTY29wZWRSZWYgPSAoQ29tcG9uZW50U2NvcGVkUmVmcykgY29tcFNjb3BlZFJlZnMubmV4dCgpOwotCQkJU3RyaW5nIGNvbXBTY29wZWRSZWZOYW1lID0gY29tcFNjb3BlZFJlZi5nZXRDb21wb25lbnROYW1lKCk7Ci0JCQlpZiAoY29tcFNjb3BlZFJlZk5hbWUuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBjb21wU2NvcGVkUmVmOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0KLQlwcml2YXRlIFN0cmluZ1tdIHRyaW0oU3RyaW5nW10gdmFsdWVzLCBTdHJpbmdbXSBleGNsdWRlKSB7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMubGVuZ3RoID09IDAgfHwgZXhjbHVkZSA9PSBudWxsIHx8IGV4Y2x1ZGUubGVuZ3RoID09IDApIC8vbm8KLQkJCS8vIGNoYW5nZQotCQkJLy8gcmVxdWlyZWQuCi0JCQkvLyByZXR1cm4KLQkJCS8vIGFzCi0JCQkvLyBpcy4KLQkJCXJldHVybiB2YWx1ZXM7Ci0KLQkJU3RyaW5nW10gZmluYWxWYWx1ZXM7Ci0JCUFycmF5TGlzdCBmaW5hbExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWNvbnRhaW5zKGV4Y2x1ZGUsIHZhbHVlc1tpXSkpIHsKLQkJCQlmaW5hbExpc3QuYWRkKHZhbHVlc1tpXSk7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgZmluYWxTaXplID0gZmluYWxMaXN0LnNpemUoKTsKLQkJZmluYWxWYWx1ZXMgPSBuZXcgU3RyaW5nW2ZpbmFsU2l6ZV07Ci0JCU9iamVjdFtdIGZpbmFsQXJyYXkgPSBmaW5hbExpc3QudG9BcnJheSgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbmFsU2l6ZTsgaisrKSB7Ci0JCQlmaW5hbFZhbHVlc1tqXSA9IChTdHJpbmcpIChmaW5hbEFycmF5W2pdKTsKLQkJfQotCi0JCXJldHVybiBmaW5hbFZhbHVlczsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJyYXkgb2YgU3RyaW5nJ3MgY29udGFpbnMgdGhlIHNwZWNpZmllZCBTdHJpbmcuIEZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nW10gdmFsdWVzLCBTdHJpbmcgcykgewotCQlpZiAodmFsdWVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh2YWx1ZXNbaV0uZXF1YWxzKHMpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dTRExTZXJ2aWNlSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETFNlcnZpY2VIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MjI0YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETFNlcnZpY2VIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VIZWxwZXJJbXBsIGltcGxlbWVudHMgV1NETFNlcnZpY2VIZWxwZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFdTRExTZXJ2aWNlSGVscGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9IAotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRQb3J0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoT2JqZWN0IHBvcnQpIHsKLQkJUG9ydCBhUG9ydCA9IChQb3J0KXBvcnQ7Ci0JCXJldHVybiBhUG9ydC5nZXROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVBvcnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXRTZXJ2aWNlUG9ydHMoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZU5hbWVzcGFjZVVSSShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWVzcGFjZVVSSShPYmplY3QgYVNlcnZpY2UpIHsKLQkJU2VydmljZSBzZXJ2aWNlID0oU2VydmljZSlhU2VydmljZTsKLQkJcmV0dXJuIHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlRGVmaW5pdGlvbkxvY2F0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VydmljZURlZmluaXRpb25Mb2NhdGlvbihFT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFBvcnRCaW5kaW5nTmFtZXNwYWNlVVJJKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0QmluZGluZ05hbWVzcGFjZVVSSShPYmplY3QgYVBvcnQpIHsKLQkJUG9ydCBwb3J0ID0gKFBvcnQpYVBvcnQ7Ci0JCXJldHVybiBwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFNlcnZpY2VMb2NhbFBhcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhbFBhcnQoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVFOYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlUU5hbWUoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0RGVmaW5pdGlvblNlcnZpY2VzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXREZWZpbml0aW9uU2VydmljZXMoT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCURlZmluaXRpb24gZGVmaW5pdGlvbiA9KERlZmluaXRpb24pYURlZmluaXRpb247Ci0JCXJldHVybiBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0V1NETERlZmluaXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsVVJMKSB7Ci0JCXRyeSB7Ci0JCQlXU0RMUmVzb3VyY2VJbXBsIHJlcyA9IChXU0RMUmVzb3VyY2VJbXBsKSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh3c2RsVVJMKSwgdHJ1ZSk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gcmVzLmdldERlZmluaXRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHdzZGxlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFdTRExEZWZpbml0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFJlc291cmNlIHdzZGxSZXNvdXJjZSkgewotCQlyZXR1cm4gKChXU0RMUmVzb3VyY2VJbXBsKXdzZGxSZXNvdXJjZSkuZ2V0RGVmaW5pdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJV2ViU2VydmljZUVudGl0eSBlbnRpdHkgPSBwYXJzZVdzaWxGaWxlKHdzaWwpOwotCQlpZiAoZW50aXR5ICE9IG51bGwgJiYgZW50aXR5LmdldFR5cGUoKSA9PSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCkgewotCQkJLy8gZ2V0IGFsbCB0aGUgV1NETCByZWZlcmVuY2VzIGZyb20gdGhlIFdTSUwgZW50aXR5Ci0JCQlMaXN0IHdzZGxMaXN0ID0gZW50aXR5LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd3NkbExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJCWlmIChpdGVtICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFbnRpdHkpIHsKLQkJCQkJaWYgKCgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKSAhPSBudWxsICYmICgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIERlZmluaXRpb24pIHsKLQkJCQkJCURlZmluaXRpb24gZGVmID0gKERlZmluaXRpb24pICgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChkZWYgIT0gbnVsbCAmJiAhZGVmLmdldFNlcnZpY2VzKCkuaXNFbXB0eSgpKQotCQkJCQkJCXJlc3VsdC5hZGRBbGwoZGVmLmdldFNlcnZpY2VzKCkudmFsdWVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBXZWJTZXJ2aWNlRW50aXR5IHBhcnNlV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCVdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JU3RyaW5nIHVybCA9IG51bGw7Ci0JLy8gdmVyaWZ5IHByb3BlciBpbnB1dAotCWlmICh3c2lsID09IG51bGwgfHwgIXdzaWwuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0lMX0VYVCkpCi0JCXJldHVybiBudWxsOwotCS8vIFBhcnNlIHdzaWwgZmlsZSB0byBnZXQgd3NkbCBzZXJ2aWNlcwotCXRyeSB7Ci0JCXVybCA9IHdzaWwuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JCXBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlcih1cmwpOwotCQlwYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfV1NJTCB8IFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX1dTREwpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCS8vSWdub3JlCi0JfQotCWlmIChwYXJzZXIgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIHBhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkodXJsKTsKLX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VydmljZShPYmplY3QgYVNlcnZpY2UpIHsKLQkJCi0JCXJldHVybiBhU2VydmljZSBpbnN0YW5jZW9mIFNlcnZpY2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzV1NETFJlc291cmNlKE9iamVjdCBhUmVzb3VyY2UpIHsKLQkJCi0JCXJldHVybiBhUmVzb3VyY2UgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRpb24oT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCQotCQlyZXR1cm4gYURlZmluaXRpb24gaW5zdGFuY2VvZiBEZWZpbml0aW9uOwotCX0KLQotCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhFT2JqZWN0IGoyZWVPYmplY3QpIHsKLQkJaWYgKGoyZWVPYmplY3QgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkNsaWVudCkKLQkJCXJldHVybiBXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXQxM1NlcnZpY2VSZWZzKChBcHBsaWNhdGlvbkNsaWVudClqMmVlT2JqZWN0KTsKLQkJZWxzZSBpZiAoajJlZU9iamVjdCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldDEzU2VydmljZVJlZnMoKEVudGVycHJpc2VCZWFuKWoyZWVPYmplY3QpOwotCQllbHNlIGlmIChqMmVlT2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldDEzU2VydmljZVJlZnMoKFdlYkFwcClqMmVlT2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZUV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzZTBmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRXZlbnQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSCA9IDE7Ci0JCi0JcHJpdmF0ZSBpbnQgZXZlbnRUeXBlID0gMDsKLQkKLQlwdWJsaWMgV2ViU2VydmljZUV2ZW50KGludCBhbkV2ZW50VHlwZSkgewotCQlzdXBlcigpOwotCQlldmVudFR5cGUgPSBhbkV2ZW50VHlwZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0JCXJldHVybiBldmVudFR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZDcxZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgd2ViU2VydmljZU1hbmFnZXJDaGFuZ2VkKFdlYlNlcnZpY2VFdmVudCBhbkV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VzTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDk0NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLQotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsLldTQ0REQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsLldTRERBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNNYW5hZ2VyIGltcGxlbWVudHMgRWRpdE1vZGVsTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JcHJpdmF0ZSBIYXNoTWFwIHdzQXJ0aWZhY3RFZGl0czsKLQlwcml2YXRlIEhhc2hNYXAgd3NDbGllbnRBcnRpZmFjdEVkaXRzOwotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VzTWFuYWdlciBJTlNUQU5DRSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGxpc3RlbmVyczsKLQlwcml2YXRlIExpc3QgcmVtb3ZlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gaXNOb3RpZmluZyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lMX0VYVCA9ICJ3c2lsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlc01hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKQotCQkJSU5TVEFOQ0UgPSBuZXcgV2ViU2VydmljZXNNYW5hZ2VyKCk7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQljb2xsZWN0QXJ0aWZhY3RFZGl0cygpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RBcnRpZmFjdEVkaXRzKCkgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IHdzZGRBcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJV1NDRERBcnRpZmFjdEVkaXQgd3NjZGRBcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQkJdHJ5IHsKLQkJCQlpZiAoIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkgfHwgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKQotCQkJCQljb250aW51ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy9UT0RPIGltcGxlbWVudCBhIHNtYXJ0ZXIgc29sdXRpb24gdGhhbiB0cnkgY2F0Y2hzCi0JCQkJdHJ5IHsKLQkJCQl3c2RkQXJ0aWZhY3RFZGl0ID0gV1NEREFydGlmYWN0RWRpdC5nZXRXU0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJCWlmICh3c2RkQXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJd3NkZEFydGlmYWN0RWRpdC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJZ2V0V1NBcnRpZmFjdEVkaXRzKCkucHV0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCksd3NkZEFydGlmYWN0RWRpdCk7Ci0JCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmICh3c2RkQXJ0aWZhY3RFZGl0ICE9IG51bGwpIHdzZGRBcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCXdzY2RkQXJ0aWZhY3RFZGl0ID0gV1NDRERBcnRpZmFjdEVkaXQuZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXBvbmVudCk7Ci0JCQkJaWYgKHdzY2RkQXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJd3NjZGRBcnRpZmFjdEVkaXQuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCWdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLnB1dChjb21wb25lbnQuZ2V0UHJvamVjdCgpLHdzY2RkQXJ0aWZhY3RFZGl0KTsKLQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKHdzY2RkQXJ0aWZhY3RFZGl0ICE9IG51bGwpIHdzY2RkQXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBlZGl0TW9kZWxzLgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRXU0FydGlmYWN0RWRpdHMoKSB7Ci0JCWlmICh3c0FydGlmYWN0RWRpdHMgPT0gbnVsbCkKLQkJCXdzQXJ0aWZhY3RFZGl0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiB3c0FydGlmYWN0RWRpdHM7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWRpdE1vZGVscy4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkgewotCQlpZiAod3NDbGllbnRBcnRpZmFjdEVkaXRzID09IG51bGwpCi0JCQl3c0NsaWVudEFydGlmYWN0RWRpdHMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gd3NDbGllbnRBcnRpZmFjdEVkaXRzOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYUxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihXZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlpZiAoYUxpc3RlbmVyICE9IG51bGwgJiYgIWdldExpc3RlbmVycygpLmNvbnRhaW5zKGFMaXN0ZW5lcikpCi0JCQlnZXRMaXN0ZW5lcnMoKS5hZGQoYUxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCWlmIChhbkV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChhbkV2ZW50LmdldEV2ZW50Q29kZSgpPT1FZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSkgewotCQkJTGlzdCByZXNvdXJjZXMgPSBhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxyZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIFdzZGRSZXNvdXJjZSB8fCByZXMgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlc1Jlc291cmNlKSB7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhhbkV2ZW50LmdldEV2ZW50Q29kZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoYW5FdmVudC5nZXRFdmVudENvZGUoKSA9PSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSkgewotCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBhbkV2ZW50LmdldEVkaXRNb2RlbCgpOwotCQkJaWYgKGVkaXRNb2RlbCA9PSBudWxsIHx8IGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IHdzQXJ0aWZhY3RFZGl0ID0gKFdTRERBcnRpZmFjdEVkaXQpIGdldFdTQXJ0aWZhY3RFZGl0cygpLmdldChlZGl0TW9kZWwuZ2V0UHJvamVjdCgpKTsKLQkJCWlmICh3c0FydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0V1NBcnRpZmFjdEVkaXRzKCkucmVtb3ZlKGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkpOwotCQkJCQl3c0FydGlmYWN0RWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl3c0FydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJV1NDRERBcnRpZmFjdEVkaXQgd3NDbGllbnRBcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLmdldChlZGl0TW9kZWwuZ2V0UHJvamVjdCgpKTsKLQkJCWlmICh3c0NsaWVudEFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkucmVtb3ZlKGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkpOwotCQkJCQl3c0NsaWVudEFydGlmYWN0RWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCXdzQ2xpZW50QXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlub3RpZnlMaXN0ZW5lcnMoYW5FdmVudC5nZXRFdmVudENvZGUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBXU0REQXJ0aWZhY3RFZGl0IGdldFdTQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGhhbmRsZSkgewotCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBnZXRXU0FydGlmYWN0RWRpdHMoKS5nZXQoaGFuZGxlKTsKLQkJaWYgKGFydGlmYWN0RWRpdCA9PSBudWxsKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBXU0REQXJ0aWZhY3RFZGl0LmdldFdTRERBcnRpZmFjdEVkaXRGb3JSZWFkKGhhbmRsZSk7Ci0JCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQlhcnRpZmFjdEVkaXQuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJZ2V0V1NBcnRpZmFjdEVkaXRzKCkucHV0KGhhbmRsZSxhcnRpZmFjdEVkaXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCQotCXByaXZhdGUgV1NDRERBcnRpZmFjdEVkaXQgZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXQoSVByb2plY3QgaGFuZGxlKSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0NEREFydGlmYWN0RWRpdCkgZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkuZ2V0KGhhbmRsZSk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgPT0gbnVsbCkgewotCQkJYXJ0aWZhY3RFZGl0ID0gV1NDRERBcnRpZmFjdEVkaXQuZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JSZWFkKGhhbmRsZSk7Ci0JCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQlhcnRpZmFjdEVkaXQuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkucHV0KGhhbmRsZSxhcnRpZmFjdEVkaXQpOwotCQkJfQotCQl9Ci0JCi0JcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mCi0JICogCi0JICogQGFuRXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBhbkV2ZW50VHlwZSkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaXNOb3RpZmluZyA9IHRydWU7Ci0JCX0KLQkJdHJ5IHsKLQkJCUxpc3QgbGlzdCA9IGdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJV2ViU2VydmljZUV2ZW50IHdlYlNlcnZpY2VFdmVudCA9IG5ldyBXZWJTZXJ2aWNlRXZlbnQoV2ViU2VydmljZUV2ZW50LlJFRlJFU0gpOwotCQkJCSgoV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lcikgbGlzdC5nZXQoaSkpLndlYlNlcnZpY2VNYW5hZ2VyQ2hhbmdlZCh3ZWJTZXJ2aWNlRXZlbnQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaXNOb3RpZmluZyA9IGZhbHNlOwotCQkJCWlmIChyZW1vdmVkTGlzdGVuZXJzICE9IG51bGwgJiYgIXJlbW92ZWRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZExpc3RlbmVycy5zaXplKCk7IGkrKykKLQkJCQkJCWxpc3RlbmVycy5yZW1vdmUocmVtb3ZlZExpc3RlbmVycy5nZXQoaSkpOwotCQkJCQlyZW1vdmVkTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFMaXN0ZW5lciBmcm9tIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlTGlzdGVuZXIoV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJaWYgKGFMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlpZiAoaXNOb3RpZmluZykKLQkJCQlyZXR1cm4gcmVtb3ZlZExpc3RlbmVycy5hZGQoYUxpc3RlbmVyKTsKLQkJCXJldHVybiBnZXRMaXN0ZW5lcnMoKS5yZW1vdmUoYUxpc3RlbmVyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbGVhc2VBcnRpZmFjdEVkaXRzKCkgewotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NBcnRpZmFjdEVkaXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCWFydGlmYWN0RWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQkJZ2V0V1NBcnRpZmFjdEVkaXRzKCkuY2xlYXIoKTsKLQkJCi0JCWl0ZXIgPSBnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0NEREFydGlmYWN0RWRpdCkgaXRlci5uZXh0KCk7Ci0JCQlhcnRpZmFjdEVkaXQucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCWdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLmNsZWFyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWFjY2VwdERlbHRhKGV2ZW50KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFjY2VwdERlbHRhKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJLy8gc2VhcmNoIGZvciBjaGFuZ2VzIHRvIGFueSBwcm9qZWN0cyB1c2luZyBhIHZpc2l0b3IKLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KHRoaXMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIGEgbGlzdCBvZiBpbnRlcm5hbCB3ZWIgc2VydmljZXMgZGVzY3JpcHRpb25zIGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcm5hbFdlYlNlcnZpY2VzRGVzY3JpcHRpb25zKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB3ZWJTZXJ2aWNlcyA9IGdldEludGVybmFsV2ViU2VydmljZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWJTZXJ2aWNlcy5zaXplKCk7IGkrKykgewotCQkJV2ViU2VydmljZXMgd2ViU2VydmljZSA9IChXZWJTZXJ2aWNlcykgd2ViU2VydmljZXMuZ2V0KGkpOwotCQkJaWYgKHdlYlNlcnZpY2UgIT0gbnVsbCkKLQkJCQlyZXN1bHQuYWRkQWxsKHdlYlNlcnZpY2UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWxsIGludGVybmFsIHdlYiBzZXJ2aWNlcyBpbnN0YW5jZXMgaW4gd29ya3NwYWNlCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJuYWxXZWJTZXJ2aWNlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBnZXRXU0FydGlmYWN0RWRpdHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJV2ViU2VydmljZXMgd2ViU2VydmljZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V2ViU2VydmljZXMoKTsKLQkJCWlmICh3ZWJTZXJ2aWNlcyAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGQod2ViU2VydmljZXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnRlcm5hbCB3c2RsIHNlcnZpY2VzIGluIHdzZGwncyBwb2ludGVkIHRvIGJ5IHdzZGQncwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludGVybmFsV1NETFNlcnZpY2VzKCkgewotCQlyZXR1cm4gZ2V0V1NETFNlcnZpY2VzRnJvbVdTRExSZXNvdXJjZXMoZ2V0SW50ZXJuYWxXU0RMUmVzb3VyY2VzKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEludGVybmFsV1NETFJlc291cmNlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgd3NkZFdlYlNlcnZpY2VzID0gZ2V0SW50ZXJuYWxXZWJTZXJ2aWNlc0Rlc2NyaXB0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdzZGRXZWJTZXJ2aWNlcy5zaXplKCk7IGkrKykgewotCQkJV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VzID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgd3NkZFdlYlNlcnZpY2VzLmdldChpKTsKLQkJCVJlc291cmNlIHdzZGwgPSBnZXRXU0RMUmVzb3VyY2Uod2ViU2VydmljZXMpOwotCQkJaWYgKHdzZGwgIT0gbnVsbCAmJiAhcmVzdWx0LmNvbnRhaW5zKHdzZGwpKQotCQkJCXJlc3VsdC5hZGQod3NkbCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0RXh0ZXJuYWxXU0RMUmVzb3VyY2VzKCkgewotCQkJLy9UT0RPIGZpeCB1cCBmb3IgYmFzaXMgb2ZmIC53c2lsCi0JCQlMaXN0IHJlc3VsdCA9IGdldFdvcmtzcGFjZVdTRExSZXNvdXJjZXMoKTsKLQkJCXJlc3VsdC5yZW1vdmVBbGwoZ2V0SW50ZXJuYWxXU0RMUmVzb3VyY2VzKCkpOwotCQkJTGlzdCBzZXJ2aWNlUmVmcyA9IGdldEFsbFdvcmtzcGFjZVNlcnZpY2VSZWZzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VydmljZVJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTZXJ2aWNlUmVmIHJlZiA9IChTZXJ2aWNlUmVmKSBzZXJ2aWNlUmVmcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkocmVmLmdldFdzZGxGaWxlKCkpLCB0cnVlKTsKLQkJCQkJaWYgKHJlcyAhPW51bGwgJiYgcmVzdWx0LmNvbnRhaW5zKHJlcykpCi0JCQkJCQlyZXN1bHQucmVtb3ZlKHJlcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzU2VydmljZUludGVybmFsKEVPYmplY3Qgc2VydmljZSkgewotCQlyZXR1cm4gZ2V0SW50ZXJuYWxXU0RMUmVzb3VyY2VzKCkuY29udGFpbnMoZ2V0V1NETFJlc291cmNlKHNlcnZpY2UpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0V1NETFNlcnZpY2VzRnJvbVdTRExSZXNvdXJjZXMoTGlzdCB3c2RsUmVzb3VyY2VzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdzZGxSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVJlc291cmNlIHdzZGwgPSAoUmVzb3VyY2UpIHdzZGxSZXNvdXJjZXMuZ2V0KGkpOwotCQkJTGlzdCBzZXJ2aWNlcyA9IGdldFdTRExTZXJ2aWNlcyh3c2RsKTsKLQkJCWlmICh3c2RsICE9IG51bGwgJiYgc2VydmljZXMgIT0gbnVsbCAmJiAhc2VydmljZXMuaXNFbXB0eSgpKQotCQkJCXJlc3VsdC5hZGRBbGwoc2VydmljZXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RXh0ZXJuYWxXU0RMU2VydmljZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gZ2V0V3NkbFNlcnZpY2VzRnJvbVdvcmtzcGFjZVdTSUxzKCk7Ci0JCXJlc3VsdC5yZW1vdmVBbGwoZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V3NkbFNlcnZpY2VzRnJvbVdvcmtzcGFjZVdTSUxzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB3c2lsRmlsZXMgPSBnZXRXb3Jrc3BhY2VXU0lMRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c2lsRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGaWxlIHdzaWwgPSAoSUZpbGUpIHdzaWxGaWxlcy5nZXQoaSk7Ci0JCQlMaXN0IHNlcnZpY2VzID0gZ2V0V3NkbFNlcnZpY2VzRnJvbVdzaWxGaWxlKHdzaWwpOwotCQkJaWYgKCFzZXJ2aWNlcy5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbChzZXJ2aWNlcyk7Ci0JCX0KLQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZShJRmlsZSB3c2lsKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlyZXR1cm4gc2VydmljZUhlbHBlci5nZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUod3NpbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgV1NETCBTZXJ2aWNlcywgYm90aCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBbGxXU0RMU2VydmljZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKGdldEludGVybmFsV1NETFNlcnZpY2VzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEV4dGVybmFsV1NETFNlcnZpY2VzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlyZWxlYXNlQXJ0aWZhY3RFZGl0cygpOwotCQlJTlNUQU5DRSA9IG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFdTRExSZXNvdXJjZShXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZSkgewotCQlpZiAod2ViU2VydmljZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB3c2RsRmlsZU5hbWUgPSB3ZWJTZXJ2aWNlLmdldFdzZGxGaWxlKCk7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHdlYlNlcnZpY2UpKTsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKSByZXR1cm4gcmVzOwotCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBnZXRXU0FydGlmYWN0RWRpdHMoKS5nZXQocmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7Ci0JCWlmIChhcnRpZmFjdEVkaXQhPW51bGwpIAotCQkJcmVzID0gYXJ0aWZhY3RFZGl0LmdldFdzZGxSZXNvdXJjZSh3c2RsRmlsZU5hbWUpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdTRExTZXJ2aWNlcyhSZXNvdXJjZSB3c2RsKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0IGRlZiA9IHNlcnZpY2VIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbCk7Ci0JCWlmIChkZWYgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCXJlc3VsdCA9IG5ldyBBcnJheUxpc3Qoc2VydmljZUhlbHBlci5nZXREZWZpbml0aW9uU2VydmljZXMoZGVmKS52YWx1ZXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0V1NETFNlcnZpY2VGb3JXZWJTZXJ2aWNlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlKSB7Ci0JCUVPYmplY3Qgc2VydmljZSA9IG51bGw7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlSZXNvdXJjZSB3c2RsID0gZ2V0V1NETFJlc291cmNlKHdlYlNlcnZpY2UpOwotCQlpZiAod3NkbCA9PSBudWxsKSByZXR1cm4gc2VydmljZTsKLQkJT2JqZWN0IGRlZmluaXRpb24gPSBzZXJ2aWNlSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGwpOwotCQlpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSByZXR1cm4gc2VydmljZTsKLQkJTWFwIHNlcnZpY2VzID0gc2VydmljZUhlbHBlci5nZXREZWZpbml0aW9uU2VydmljZXMoZGVmaW5pdGlvbik7Ci0JCWlmIChzZXJ2aWNlcy5pc0VtcHR5KCkpIHJldHVybiBzZXJ2aWNlOwotCQlQb3J0Q29tcG9uZW50IHBvcnRDb21wID0gbnVsbDsKLQkJaWYgKHdlYlNlcnZpY2UuZ2V0UG9ydENvbXBvbmVudHMoKSE9bnVsbCAmJiB3ZWJTZXJ2aWNlLmdldFBvcnRDb21wb25lbnRzKCkuc2l6ZSgpPjApIHsKLQkJCXBvcnRDb21wID0gKFBvcnRDb21wb25lbnQpIHdlYlNlcnZpY2UuZ2V0UG9ydENvbXBvbmVudHMoKS5nZXQoMCk7Ci0JCQlyZXR1cm4gZ2V0U2VydmljZShwb3J0Q29tcCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFdTRExSZXNvdXJjZShFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCXJldHVybiB3c2RsU2VydmljZS5lUmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRTZXJ2aWNlKFBvcnRDb21wb25lbnQgcG9ydCkgewotCQlMaXN0IHNlcnZpY2VzID0gZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKTsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVPYmplY3Qgc2VydmljZSA9IChFT2JqZWN0KXNlcnZpY2VzLmdldChpKTsKLQkJCWlmIChzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyhzZXJ2aWNlKS5zaXplKCkgPT0gMSkgewotCQkJCU9iamVjdCB3c2RsUG9ydCA9IHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZVBvcnRzKHNlcnZpY2UpLnZhbHVlcygpLnRvQXJyYXkoKVswXTsKLQkJCQlTdHJpbmcgcU5hbWUgPSBzZXJ2aWNlSGVscGVyLmdldFBvcnRCaW5kaW5nTmFtZXNwYWNlVVJJKHdzZGxQb3J0KTsKLQkJCQlpZiAocG9ydC5nZXRXc2RsUG9ydCgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhxTmFtZSkpCi0JCQkJCXJldHVybiBzZXJ2aWNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnRDb21wb25lbnQoU3RyaW5nIHFOYW1lKSB7Ci0JCUxpc3Qgd3NEZXNjcyA9IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c0Rlc2NzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgd3NEZXNjcy5nZXQoaSk7Ci0JCQlMaXN0IHBvcnRzID0gd3NEZXNjLmdldFBvcnRDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBvcnRzLnNpemUoKTsgaisrKSB7Ci0JCQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcCA9IChQb3J0Q29tcG9uZW50KSBwb3J0cy5nZXQoaik7Ci0JCQkJaWYgKHBvcnRDb21wLmdldFdzZGxQb3J0KCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHFOYW1lKSkKLQkJCQkJcmV0dXJuIHBvcnRDb21wOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnRDb21wb25lbnQoU3RyaW5nIHFOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3Qgd3NEZXNjcyA9IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c0Rlc2NzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgd3NEZXNjcy5nZXQoaSk7Ci0JCQlMaXN0IHBvcnRzID0gd3NEZXNjLmdldFBvcnRDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBvcnRzLnNpemUoKTsgaisrKSB7Ci0JCQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcCA9IChQb3J0Q29tcG9uZW50KSBwb3J0cy5nZXQoaik7Ci0JCQkJaWYgKHBvcnRDb21wLmdldFdzZGxQb3J0KCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHFOYW1lKSAmJiBwcm9qZWN0ID09IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwb3J0Q29tcCkpCi0JCQkJCXJldHVybiBwb3J0Q29tcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUG9ydENvbXBvbmVudCBnZXRQb3J0Q29tcG9uZW50KEVPYmplY3Qgd3NkbFNlcnZpY2UpIHsKLQkJLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgcG9ydCBpbiB0aGUgd3NkbCBzZXJ2aWNlLCBmaW5kIHRoZSBtYXRjaGluZyBwb3J0IGNvbXBvbmVudAotCQkvLyBvdGhlcndpc2UgaWYgbXVsdGlwbGUgcG9ydHMgcmV0dXJuIG51bGwgYmVjYXVzZSB3ZSBuZWVkIG1vcmUgaW5mb3JtYXRpb24KLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmICh3c2RsU2VydmljZSA9PSBudWxsIHx8IHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZVBvcnRzKHdzZGxTZXJ2aWNlKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZVBvcnRzKHdzZGxTZXJ2aWNlKS5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IHBvcnQgPSBzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyh3c2RsU2VydmljZSkudmFsdWVzKCkudG9BcnJheSgpWzBdOwotCQkJU3RyaW5nIHFOYW1lID0gc2VydmljZUhlbHBlci5nZXRQb3J0QmluZGluZ05hbWVzcGFjZVVSSShwb3J0KTsKLQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50KHFOYW1lLCBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod3NkbFNlcnZpY2UpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU2VydmljZUltcGxCZWFuIGdldFNlcnZpY2VJbXBsQmVhbihFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCVBvcnRDb21wb25lbnQgcG9ydCA9IGdldFBvcnRDb21wb25lbnQod3NkbFNlcnZpY2UpOwotCQlpZiAocG9ydCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwb3J0LmdldFNlcnZpY2VJbXBsQmVhbigpOwotCX0KLQotCXB1YmxpYyBXc2RkUmVzb3VyY2UgZ2V0V3NkZFJlc291cmNlKEVPYmplY3Qgd3NkbFNlcnZpY2UpIHsKLQkJUG9ydENvbXBvbmVudCBwb3J0ID0gZ2V0UG9ydENvbXBvbmVudCh3c2RsU2VydmljZSk7Ci0JCWlmIChwb3J0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXc2RkUmVzb3VyY2UpIHBvcnQuZVJlc291cmNlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoRU9iamVjdCB3c2RsU2VydmljZSkgewotCQlQb3J0Q29tcG9uZW50IHBvcnQgPSBnZXRQb3J0Q29tcG9uZW50KHdzZGxTZXJ2aWNlKTsKLQkJaWYgKHBvcnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcG9ydC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBbGxXb3Jrc3BhY2VTZXJ2aWNlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0V29ya3NwYWNlMTNTZXJ2aWNlUmVmcygpKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRXb3Jrc3BhY2UxNFNlcnZpY2VSZWZzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZTEzU2VydmljZVJlZnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpICYmIHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZEFsbChyZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKS5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldDEzU2VydmljZVJlZnMoSVByb2plY3QgaGFuZGxlKSB7Ci0KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IHdzQ2xpZW50QXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKS5nZXQoaGFuZGxlKTsKLQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSB3c0NsaWVudEFydGlmYWN0RWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKSAmJiByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKSAhPSBudWxsKQotCQkJcmVzdWx0LmFkZEFsbChyZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKS5nZXRTZXJ2aWNlUmVmcygpKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZTE0U2VydmljZVJlZnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0NEREFydGlmYWN0RWRpdCB3c2NBcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKHdzY0FydGlmYWN0RWRpdC5nZXRQcm9qZWN0KCkpOwotCQkJdHJ5IHsKLQkJCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotCQkJCS8vIGhhbmRsZSBFSkIgcHJvamVjdCBjYXNlCi0JCQkJaWYgKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBFSkJKYXIpIHsKLQkJCQkJTGlzdCBjbXBzID0gKChFSkJKYXIpIHJvb3RPYmplY3QpLmdldEVudGVycHJpc2VCZWFucygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNtcHMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGNtcHMuZ2V0KGopOwotCQkJCQkJaWYgKGJlYW4uZ2V0U2VydmljZVJlZnMoKSAhPSBudWxsICYmICFiZWFuLmdldFNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpKQotCQkJCQkJCXJlc3VsdC5hZGRBbGwoYmVhbi5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBoYW5kbGUgV2ViIFByb2plY3QKLQkJCQllbHNlIGlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwKSB7Ci0JCQkJCWlmICgoKFdlYkFwcCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSAhPSBudWxsICYmICEoKFdlYkFwcCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKS5pc0VtcHR5KCkpCi0JCQkJCQlyZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSByb290T2JqZWN0KS5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJCQl9Ci0JCQkJLy8gaGFuZGxlIEFwcCBjbGllbnRzCi0JCQkJZWxzZSBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ2xpZW50KSB7Ci0JCQkJCWlmICgoKEFwcGxpY2F0aW9uQ2xpZW50KSByb290T2JqZWN0KS5nZXRTZXJ2aWNlUmVmcygpICE9IG51bGwgJiYgISgoQXBwbGljYXRpb25DbGllbnQpIHJvb3RPYmplY3QpLmdldFNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpKQotCQkJCQkJcmVzdWx0LmFkZEFsbCgoKEFwcGxpY2F0aW9uQ2xpZW50KSByb290T2JqZWN0KS5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkKLQkJCQkJYXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSjJFRTE0KFNlcnZpY2VSZWYgcmVmKSB7Ci0JCXJldHVybiAhKHJlZi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlc0NsaWVudCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V29ya3NwYWNlV1NJTEZpbGVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGdldFdTQXJ0aWZhY3RFZGl0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgaXRlci5uZXh0KCk7Ci0JCQlMaXN0IGZpbGVzID0gYXJ0aWZhY3RFZGl0LmdldFdTSUxSZXNvdXJjZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmlsZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBmaWxlcy5nZXQoaik7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBXU0lMX0VYVC5lcXVhbHMoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKQotCQkJCQlyZXN1bHQuYWRkKGZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V29ya3NwYWNlV1NETFJlc291cmNlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBnZXRXU0FydGlmYWN0RWRpdHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IGFydGlmYWN0RWRpdC5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJTGlzdCB3c2RsUmVzb3VyY2VzID0gYXJ0aWZhY3RFZGl0LmdldFdTRExSZXNvdXJjZXMoKTsKLQkJCQlpZiAod3NkbFJlc291cmNlcyAhPSBudWxsICYmICF3c2RsUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHdzZGxSZXNvdXJjZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCVJlc291cmNlIHdzZGwgPSAoUmVzb3VyY2UpIHdzZGxSZXNvdXJjZXMuZ2V0KGopOwotCQkJCQkJaWYgKCFyZXN1bHQuY29udGFpbnMod3NkbCkpCi0JCQkJCQkJcmVzdWx0LmFkZCh3c2RsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdTRExTZXJ2aWNlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW50ZXJuYWxXc2RscyA9IGdldEludGVybmFsV1NETFNlcnZpY2VzKCk7Ci0JCWlmIChpbnRlcm5hbFdzZGxzICE9IG51bGwgJiYgIWludGVybmFsV3NkbHMuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbChpbnRlcm5hbFdzZGxzKTsKLQkJLy9UT0RPIGFkZCBleHRlcm5hbHMKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJV1NDRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKS5nZXQoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShiZWFuKS5nZXRQcm9qZWN0KCkpOwotCQlXZWJTZXJ2aWNlc1Jlc291cmNlIHJlcyA9IGFydGlmYWN0RWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZWpiTmFtZSA9IGJlYW4uZ2V0TmFtZSgpOwotCQkJTGlzdCBzY29wZXMgPSByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKS5nZXRDb21wb25lbnRTY29wZWRSZWZzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY29wZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBzY29wZSA9IChDb21wb25lbnRTY29wZWRSZWZzKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoc2NvcGUuZ2V0Q29tcG9uZW50TmFtZSgpLmVxdWFscyhlamJOYW1lKSkKLQkJCQkJcmV0dXJuIHNjb3BlLmdldFNlcnZpY2VSZWZzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsaWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKEFwcGxpY2F0aW9uQ2xpZW50IGNsaWVudCkgewotCQlJUHJvamVjdCBoYW5kbGUgPSBnZXRDb21wb25lbnRQcm9qZWN0KFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoY2xpZW50KSk7Ci0JCWlmIChoYW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLmdldChoYW5kbGUpOwotCQlXZWJTZXJ2aWNlc1Jlc291cmNlIHJlcyA9IGFydGlmYWN0RWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJV2ViU2VydmljZXNDbGllbnQgd2ViQ2xpZW50ID0gcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQlpZiAod2ViQ2xpZW50ICE9IG51bGwpCi0JCQkJcmV0dXJuIHdlYkNsaWVudC5nZXRTZXJ2aWNlUmVmcygpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3ZWJhcHAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhXZWJBcHAgd2ViYXBwKSB7Ci0JCUlQcm9qZWN0IGhhbmRsZSA9IGdldENvbXBvbmVudFByb2plY3QoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSh3ZWJhcHApKTsKLQkJaWYgKGhhbmRsZSA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0NEREFydGlmYWN0RWRpdCkgZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkuZ2V0KGhhbmRsZSk7Ci0JCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gYXJ0aWZhY3RFZGl0LmdldFdzY2RkWG1pUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlXZWJTZXJ2aWNlc0NsaWVudCB3ZWJDbGllbnQgPSByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKTsKLQkJCWlmICh3ZWJDbGllbnQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gd2ViQ2xpZW50LmdldFNlcnZpY2VSZWZzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJSVByb2plY3QgcCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkvLyBIYW5kbGUgcHJvamVjdCBhZGRzIGFuZCBwcm9qZWN0IG9wZW5zCi0JCQlpZiAoKGRlbHRhLmdldEtpbmQoKT09SVJlc291cmNlRGVsdGEuQURERUQgfHwgKCgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApICYmIHAuaXNBY2Nlc3NpYmxlKCkpKSkgewotCQkJCWJvb2xlYW4gc3RhdGUgPSB0cnVlOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHApOwotCQkJCWlmIChjb21wb25lbnQhPW51bGwgJiYgIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwKSkgewotCQkJCQlXU0REQXJ0aWZhY3RFZGl0IHdzQXJ0aWZhY3RFZGl0ID0gZ2V0V1NBcnRpZmFjdEVkaXQocCk7Ci0JCQkJCWlmICh3c0FydGlmYWN0RWRpdCAhPW51bGwpCi0JCQkJCQlzdGF0ZSA9IGZhbHNlOwotCQkJCQlXU0NEREFydGlmYWN0RWRpdCB3c2NBcnRpZmFjdEVkaXQgPSBnZXRXU0NsaWVudEFydGlmYWN0RWRpdChwKTsKLQkJCQkJaWYgKHdzY0FydGlmYWN0RWRpdCAhPW51bGwpIHsKLQkJCQkJCXN0YXRlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQlyZXR1cm4gc3RhdGU7Ci0JCQkJfQotCQkJfQotCQkJLy8gSGFuZGxlIHByb2plY3QgY2xvc2UgZXZlbnRzIGFuZCByZW1vdmFscyAKLQkJCWVsc2UgaWYgKChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAgJiYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkpCi0JCQkJCXx8IChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkpewotCQkJCWJvb2xlYW4gc3RhdGUgPSB0cnVlOwotCQkJCUxpc3Qgd3NkZEFydGlmYWN0RWRpdHNUb1JlbW92ZSA9IGdldEFzc29jaWF0ZWRBcnRpZmFjdEVkaXRLZXlzKHAsZ2V0V1NBcnRpZmFjdEVkaXRzKCkpOwotCQkJCWZvciAoaW50IGk9MDsgaTx3c2RkQXJ0aWZhY3RFZGl0c1RvUmVtb3ZlLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlQcm9qZWN0IGhhbmRsZSA9IChJUHJvamVjdCkgd3NkZEFydGlmYWN0RWRpdHNUb1JlbW92ZS5nZXQoaSk7Ci0JCQkJCWlmIChoYW5kbGUgIT0gbnVsbCAmJiBnZXRXU0FydGlmYWN0RWRpdHMoKS5jb250YWluc0tleShoYW5kbGUpKSB7Ci0JCQkJCQlXU0REQXJ0aWZhY3RFZGl0IHdzQXJ0aWZhY3RFZGl0ID0gKFdTRERBcnRpZmFjdEVkaXQpIGdldFdTQXJ0aWZhY3RFZGl0cygpLmdldChoYW5kbGUpOwotCQkJCQkJZ2V0V1NBcnRpZmFjdEVkaXRzKCkucmVtb3ZlKGhhbmRsZSk7Ci0JCQkJCQl3c0FydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJCQlzdGF0ZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCUxpc3Qgd3NjZGRBcnRpZmFjdEVkaXRzVG9SZW1vdmUgPSBnZXRBc3NvY2lhdGVkQXJ0aWZhY3RFZGl0S2V5cyhwLGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8d3NjZGRBcnRpZmFjdEVkaXRzVG9SZW1vdmUuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVByb2plY3QgaGFuZGxlID0gKElQcm9qZWN0KSB3c2NkZEFydGlmYWN0RWRpdHNUb1JlbW92ZS5nZXQoaSk7Ci0JCQkJCWlmIChoYW5kbGUgIT0gbnVsbCAmJiBnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKS5jb250YWluc0tleShoYW5kbGUpKSB7Ci0JCQkJCQlXU0NEREFydGlmYWN0RWRpdCB3c2NBcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLmdldChoYW5kbGUpOwotCQkJCQkJZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkucmVtb3ZlKGhhbmRsZSk7Ci0JCQkJCQl3c2NBcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCQkJc3RhdGUgPSBmYWxzZTsKLQkJCQkJfQkKLQkJCQl9Ci0JCQkJcmV0dXJuIHN0YXRlOwotCQkJfQotCQl9Ci0JCQotCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgaXNJbnRlcnJlc3RlZEluRmlsZSgoSUZpbGUpIHJlc291cmNlKSkgewotCQkJLy8gSGFuZGxlIFdTSUwgYW5kIFdTREwgRmlsZSBhZGRpdGlvbnMKLQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSB8fCAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0RMX0VYVCkpCi0JCQkJICAgIGFkZGVkV3NkbCgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTSUxfRVhUKSkKLQkJCQkgICAgYWRkZWRXc2lsKChJRmlsZSlyZXNvdXJjZSk7Ci0JCQl9Ci0JCQkvLyBIYW5kbGUgV1NJTCBvciBXU0RMIGZpbGUgcmVtb3ZhbHMKLQkJCWVsc2UgaWYgKChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgfHwgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgIT0gMCkpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0RMX0VYVCkgfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0lMX0VYVCkpCi0JCQkJbm90aWZ5TGlzdGVuZXJzKEVkaXRNb2RlbEV2ZW50LlVOTE9BREVEX1JFU09VUkNFKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldEFzc29jaWF0ZWRBcnRpZmFjdEVkaXRLZXlzKElQcm9qZWN0IHByb2plY3QsIEhhc2hNYXAgYXJ0aWZhY3RFZGl0cykgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0RWRpdHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJSVByb2plY3QgaGFuZGxlID0gKElQcm9qZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChoYW5kbGUuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQlyZXN1bHQuYWRkKGhhbmRsZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRlZFdzZGwoSUZpbGUgd3NkbCkgewotCQlpZiAoIXdzZGwuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCUlQcm9qZWN0IGhhbmRsZSA9IGdldENvbXBvbmVudFByb2plY3Qod3NkbCk7Ci0JCWlmIChoYW5kbGUgIT0gbnVsbCkgewotCQkJZ2V0V1NBcnRpZmFjdEVkaXQoaGFuZGxlKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhFZGl0TW9kZWxFdmVudC5MT0FERURfUkVTT1VSQ0UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkZWRXc2lsKElGaWxlIHdzaWwpIHsKLQkJaWYgKCF3c2lsLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlJUHJvamVjdCBoYW5kbGUgPSBnZXRDb21wb25lbnRQcm9qZWN0KHdzaWwpOwotCQlpZiAoaGFuZGxlICE9IG51bGwpIHsKLQkJCWdldFdTQXJ0aWZhY3RFZGl0KGhhbmRsZSk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoRWRpdE1vZGVsRXZlbnQuTE9BREVEX1JFU09VUkNFKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElQcm9qZWN0IGdldENvbXBvbmVudFByb2plY3QoSUZpbGUgcmVzKSB7Ci0JCXJldHVybiByZXMuZ2V0UHJvamVjdCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJyZXN0ZWRJbkZpbGUoSUZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSBhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlyZXR1cm4gZXh0ZW5zaW9uLmVxdWFscyhXU0RMX0VYVCkgfHwgZXh0ZW5zaW9uLmVxdWFscyhXU0lMX0VYVCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0U2VydmljZVJlZnMoRUpCSmFyIGphcikgewotCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBiZWFucyA9IGphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmVhbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKSBiZWFucy5nZXQoaSk7Ci0JCQkJbGlzdC5hZGRBbGwoZ2V0U2VydmljZVJlZnMoYmVhbikpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRTZXJ2aWNlUmVmcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGJlYW4uZ2V0RWpiSmFyKCkuZ2V0SjJFRVZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotCQkJbGlzdC5hZGRBbGwoYmVhbi5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJZWxzZQotCQkJbGlzdC5hZGRBbGwoZ2V0MTNTZXJ2aWNlUmVmcyhiZWFuKSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFNlcnZpY2VSZWZzKFdlYkFwcCB3ZWJhcHApIHsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlpZiAod2ViYXBwLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQpCi0JCQkJbGlzdC5hZGRBbGwod2ViYXBwLmdldFNlcnZpY2VSZWZzKCkpOwotCQkJZWxzZQotCQkJCWxpc3QuYWRkQWxsKGdldDEzU2VydmljZVJlZnMod2ViYXBwKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFNlcnZpY2VSZWZzKEFwcGxpY2F0aW9uQ2xpZW50IGNsaWVudCkgewotCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWlmIChjbGllbnQuZ2V0SjJFRVZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotCQkJCWxpc3QuYWRkQWxsKGNsaWVudC5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJCWVsc2UKLQkJCQlsaXN0LmFkZEFsbChnZXQxM1NlcnZpY2VSZWZzKGNsaWVudCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWI0MWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyOCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5Xc2RkUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gaW1wbGVtZW50cyBSZXNvdXJjZUxvY2F0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVBsdWdpbiBzaW5nbGV0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSB0aGlzOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbAotCSAqIGxvY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIG5hbWUpOwotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLQkgKiAoQVRLVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLmF0ay51aSIpOwotCSAqIAotCSAqIEByZXR1cm4gVGhlIEFUS1VJUGx1Z2luIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yCi0JICogdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4gVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4KLQkgKiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLQkgKiAgICAgICAgICAgIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0JICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvcgotCSAqIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nIGFyZSByZXBsYWNlZCBieSB0aGUKLQkgKiBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2ggYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlCi0JICogamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluCi0JICogICAgICAgICAgICBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0JICogICAgICAgICAgICBmb3JtOiAiS0VZID0gdmFsdWUiLgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBUaGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgYXMgcmVxdWlyZWQgYnkgdGhlIG1lc3NhZ2UgaW4KLQkgKiAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZCBieSB0aGUgcnVsZXMgb2YgY2xhc3MgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuCi0JICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksIGFyZ3MpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGZyb20gd2hpY2ggYWxsIHJlc291cmNlcyBhcmUgYmFzZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgVVJMIGZyb20gd2hpY2ggYWxsIHJlc291cmNlcyBhcmUgYmFzZWQuCi0JICovCi0JcHVibGljIFVSTCBnZXRCYXNlVVJMKCkgewotCQlTdHJpbmcgaW5zdGFsbFVSTCA9IGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpOwotCQlpZiAoaW5zdGFsbFVSTCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoaW5zdGFsbFVSTCk7Ci0JCQkJc2IuYXBwZW5kKCJwbHVnaW4ucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBVUkwoc2IudG9TdHJpbmcoKSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBrZXkuIFRoZSBkZXNjcmlwdGlvbiB3aWxsIHR5cGljYWxseSBiZSBpbiB0aGUgZm9ybSBvZiBhIFVSTCB0byB0aGUgaW1hZ2UgZGF0YS4gQ3JlYXRpb24gb2YgYW4KLQkgKiBhY3R1YWwgaW1hZ2UgZGVwZW5kcyBvbiB0aGUgR1VJIGVudmlyb25tZW50OyB3aXRoaW4gRWNsaXBzZSwKLQkgKiBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnkgY2FuIGJlIHVzZWQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgaW1hZ2UgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb24gdGhlIGltYWdlIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbih0aGlzKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSkuZ2V0RmlsZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBzdHJpbmcgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2Uoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCBhbmQgcGVmb3JtcyBzdWJzdGl0dXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIHN0cmluZy4KLQkgKiBAcGFyYW0gc3Vic3RpdHV0aW9ucwotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2Ugc3Vic3RpdHV0aW9ucy4KLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgotCSAqIEBzZWUgI2dldFN0cmluZyhTdHJpbmcpCi0JICogQHNlZSBNZXNzYWdlRm9ybWF0I2Zvcm1hdChTdHJpbmcsIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBzdWJzdGl0dXRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgb25jZSBieSB0aGUgcGxhdGZvcm0gd2hlbiB0aGlzIHBsdWdpbiBpcyBmaXJzdCBsb2FkZWQuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc3RhcnQuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCVdzZGRSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UpOwotCQlXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcihXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgdW5sb2FkZWQuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc2h1dGRvd24uCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zLCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5LHN1YnN0aXR1dGlvbnMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDgzZjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzXzsKLQotCXB1YmxpYyBBVEtVSUFkYXB0ZXJGYWN0b3J5KCkgewotCQlhZGFwdGVyRmFjdG9yaWVzXyA9IG5ldyBBZGFwdGVyRmFjdG9yeVs0XTsKLQkJYWRhcHRlckZhY3Rvcmllc19bMF0gPSBuZXcgV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWFkYXB0ZXJGYWN0b3JpZXNfWzFdID0gbmV3IEFUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeSgpOwotCQlhZGFwdGVyRmFjdG9yaWVzX1syXSA9IG5ldyBBVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJYWRhcHRlckZhY3Rvcmllc19bM10gPSBuZXcgQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSgpOwotCi0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb3RpZmllcikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzXy5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBvYmplY3QgPSBhZGFwdGVyRmFjdG9yaWVzX1tpXS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvbHZlKHRhcmdldCwgdHlwZSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3Qgb2JqZWN0ID0gYWRhcHQoKE9iamVjdCkgdGFyZ2V0LCB0eXBlKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpIHsKLQkJCXJldHVybiAoQWRhcHRlcikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHtAbGluayAjYWRhcHQoT2JqZWN0LE9iamVjdCkgYWRhcHQoT2JqZWN0LCBPYmplY3QpfWZvciBvYmplY3RzIHRoYXQgYXJlbid0Ci0JICogbm90aWZpZXJzLgotCSAqIAotCSAqIEBwYXJhbSBhbgotCSAqICAgICAgICAgICAgYXJiaXRyYXJ5IG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGtleSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGFkYXB0ZXIgcmVxdWlyZWQuCi0JICogQHJldHVybiB0aGUgb2JqZWN0IGl0c2VsZi4KLQkgKiBAc2VlICNhZGFwdChPYmplY3QsT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gcmVzb2x2ZUVMaXN0KChFTGlzdCkgb2JqZWN0LCB0eXBlKTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gcmVzb2x2ZUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0LCB0eXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZUVMaXN0KEVMaXN0IGVMaXN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoZUxpc3Quc2l6ZSgpID4gMCkKLQkJCXJldHVybiBhZGFwdChlTGlzdC5nZXQoMCksIHR5cGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCByZXNvbHZlQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0sIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiByZXNvbHZlRUxpc3QoYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKSwgdHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkoKFdzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc19bMF0pLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJKChBVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3JpZXNfWzFdKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCSgoQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yaWVzX1syXSkuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkoKEFUS1VJQ29tbW9uQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3JpZXNfWzNdKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWQxYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYXJhbVZhbHVlQWRhcHRlcigpIHsKLQkJaWYgKHBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlQYXJhbVZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOwotCi0JCXJldHVybiBwYXJhbVZhbHVlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVFOYW1lQWRhcHRlcigpIHsKLQkJaWYgKHFOYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXFOYW1lSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUU5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcU5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0KLQkvKgotCSAqIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCkgeyBpZiAoc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9PSBudWxsKQotCSAqIHNvYXBIZWFkZXJJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyKHRoaXMpOyByZXR1cm4KLQkgKiBzb2FwSGVhZGVySXRlbVByb3ZpZGVyOyB9Ci0JICogCi0JICogcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUFJvbGVBZGFwdGVyKCkgeyBpZiAoc29hcFJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkgKiBzb2FwUm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOyByZXR1cm4gc29hcFJvbGVJdGVtUHJvdmlkZXI7IH0KLQkgKiAKLQkgKiBwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TmFtZUFkYXB0ZXIoKSB7IGlmIChwb3J0TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCSAqIHBvcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7IHJldHVybiBwb3J0TmFtZUl0ZW1Qcm92aWRlcjsgfQotCSAqICAKLQkgKi8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlYzQ3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIChzICE9IG51bGwpID8gcyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoKChDb21wb25lbnRTY29wZWRSZWZzKSBvYmplY3QpLmdldENvbXBvbmVudE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlIYW5kbGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTdiM2RmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlIYW5kbGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBIYW5kbGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoKChIYW5kbGVyKSBvYmplY3QpLmdldEhhbmRsZXJOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlyZXR1cm4gKGNsYXNzTmFtZSAhPSBudWxsKSA/IGNsYXNzTmFtZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjBjNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUluaXRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyIGV4dGVuZHMgSW5pdFBhcmFtSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSUluaXRQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCUluaXRQYXJhbSBpbml0UGFyYW0gPSAoSW5pdFBhcmFtKSBvYmplY3Q7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXRQYXJhbVZhbHVlKCkpOwotCQkJY2FzZSAyIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXREZXNjcmlwdGlvbigpKTsKLQkJCWRlZmF1bHQgOgotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlzYi5hcHBlbmQoaW5pdFBhcmFtLmdldFBhcmFtTmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIj0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZChpbml0UGFyYW0uZ2V0UGFyYW1WYWx1ZSgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBhcmFtVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjNDUwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlBhcmFtVmFsdWVJdGVtUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBBVEtVSVBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQYXJhbVZhbHVlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVBhcmFtVmFsdWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlQYXJhbVZhbHVlIGluaXRQYXJhbSA9IChQYXJhbVZhbHVlKSBvYmplY3Q7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhpbml0UGFyYW0uZ2V0TmFtZSgpKTsKLQkJCWNhc2UgMSA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhpbml0UGFyYW0uZ2V0VmFsdWUoKSk7Ci0JCQljYXNlIDIgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoaW5pdFBhcmFtLmdldERlc2NyaXB0aW9uKCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChpbml0UGFyYW0uZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIj0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZChpbml0UGFyYW0uZ2V0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMWVmMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIFBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVBvcnRDb21wb25lbnRSZWYgcG9ydENvbXBSZWYgPSAoUG9ydENvbXBvbmVudFJlZikgb2JqZWN0OwotCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQljYXNlIDAgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocG9ydENvbXBSZWYuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHBvcnRDb21wUmVmLmdldFBvcnRDb21wb25lbnRMaW5rKCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhwb3J0Q29tcFJlZi5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJcmV0dXJuIChjbGFzc05hbWUgIT0gbnVsbCkgPyBjbGFzc05hbWUgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQb3J0TmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZWFiMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgUG9ydE5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlQb3J0TmFtZSBwb3J0TmFtZSA9IChQb3J0TmFtZSkgb2JqZWN0OwotCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHBvcnROYW1lLmdldFBvcnROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUU5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlRTmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjM4MzlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlRTmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlRTmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVFOYW1lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJUU5hbWUgcW5hbWUgPSAoUU5hbWUpIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJCWNhc2UgMSA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJc2IuYXBwZW5kKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJCQlzYi5hcHBlbmQoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZChxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDk3NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLQotCi0KLQotcHVibGljIGNsYXNzIEFUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlciBleHRlbmRzIFNPQVBIZWFkZXJJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKSBvYmplY3Q7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJCWNhc2UgMSA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhzb2FwSGVhZGVyLmdldExvY2FsUGFydCgpKTsKLQkJCWRlZmF1bHQgOgotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlzYi5hcHBlbmQoc29hcEhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCQkJc2IuYXBwZW5kKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzYi5hcHBlbmQoc29hcEhlYWRlci5nZXRMb2NhbFBhcnQoKSk7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyM2QyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTT0FQUm9sZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVNPQVBSb2xlIHNvYXBSb2xlID0gKFNPQVBSb2xlKSBvYmplY3Q7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoc29hcFJvbGUuZ2V0U29hcFJvbGUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU2VydmljZVJlZkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg3Yjg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoKChTZXJ2aWNlUmVmKSBvYmplY3QpLmdldFNlcnZpY2VSZWZOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlyZXR1cm4gKGNsYXNzTmFtZSAhPSBudWxsKSA/IGNsYXNzTmFtZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2U1YmM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJZmVhdHVyZSA9IFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuZ2V0V2Vic2VydmljZV9jbGllbnRQYWNrYWdlKCkuZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpOwotCQlpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKSkpCi0JCQlyZXN1bHQuYWRkKFNlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIuZ2V0V3NDbGllbnQoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdlYlNlcnZpY2VzQ2xpZW50LmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1VOUVVBTElGSUVEX0NPTVBPTkVOVCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXc2NkZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdkOWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXc2NkZEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgQVRLVUlXc2NkZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50QWRhcHRlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQl3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gd2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc0FkYXB0ZXIoKSB7Ci0JCWlmIChjb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQljb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydENvbXBvbmVudFJlZkFkYXB0ZXIoKSB7Ci0JCWlmIChwb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlwb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY2xpZW50LnV0aWwuV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeSNjcmVhdGVTZXJ2aWNlUmVmQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJU2VydmljZVJlZkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIHNlcnZpY2VSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY2xpZW50LnV0aWwuV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeSNjcmVhdGVIYW5kbGVyQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckFkYXB0ZXIoKSB7Ci0JCWlmIChoYW5kbGVySXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQloYW5kbGVySXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJSGFuZGxlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGhhbmRsZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NmY5NDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluaXRQYXJhbUFkYXB0ZXIoKSB7Ci0JCWlmIChpbml0UGFyYW1JdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWluaXRQYXJhbUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSUluaXRQYXJhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGluaXRQYXJhbUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQSGVhZGVyQWRhcHRlcigpIHsKLQkJaWYgKHNvYXBIZWFkZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXNvYXBIZWFkZXJJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gc29hcEhlYWRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChzb2FwUm9sZUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJc29hcFJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIHNvYXBSb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnROYW1lQWRhcHRlcigpIHsKLQkJaWYgKHBvcnROYW1lSXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlwb3J0TmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gcG9ydE5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMmEzMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLQotCi0vLyBOb24tZ2VuZXJhdGVkIHByb3ZpZGVyIGNvZGUKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIHsKLQlwdWJsaWMgQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGFkYXB0ZXIncyByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9CZWFuTGlua0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9CZWFuTGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGMwNDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQmVhbkxpbmtJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5CZWFuTGlua31vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmVhbkxpbmtJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJlYW5MaW5rSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQmVhbkxpbmsuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9CZWFuTGluayIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyByZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQmVhbkxpbmtfdHlwZSIpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiJV9VSV9CZWFuTGlua190eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Db21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMjIzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRDb21wb25lbnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb21wb25lbnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db21wb25lbnRTY29wZWRSZWZzX2NvbXBvbmVudE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29tcG9uZW50U2NvcGVkUmVmc19jb21wb25lbnROYW1lX2ZlYXR1cmUiLCAiX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFNjb3BlZFJlZnNfQ29tcG9uZW50TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29tcG9uZW50U2NvcGVkUmVmcy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9Ci0JICogKChDb21wb25lbnRTY29wZWRSZWZzKW9iamVjdCkuZ2V0Q29tcG9uZW50TmFtZSgpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkgKiBnZXRTdHJpbmcoIl9VSV9Db21wb25lbnRTY29wZWRSZWZzX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfdHlwZSIpICsgIiAiICsKLQkgKiBsYWJlbDsgfQotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbXBvbmVudFNjb3BlZFJlZnMpIG9iamVjdCkuZ2V0Q29tcG9uZW50TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb21wb25lbnRTY29wZWRSZWZzLmNsYXNzKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19DT01QT05FTlRfTkFNRSA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFNjb3BlZFJlZnNfU2VydmljZVJlZnMoKSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlUmVmKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyY2NmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcn1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9pZF9mZWF0dXJlIiwgIl9VSV9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9FbGVtZW50TmFtZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcikgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fRUxFTUVOVF9OQU1FUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbGVtZW50TmFtZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Rlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzNGU2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Rlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGV9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlc2NyaXB0aW9uVHlwZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0Rlc2NyaXB0aW9uVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZXNjcmlwdGlvblR5cGUpIG9iamVjdCkuZ2V0TGFuZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRpb25UeXBlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRpb25UeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Rpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDc2YWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuRGlzcGxheU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZX1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlzcGxheU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlzcGxheU5hbWVUeXBlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzcGxheU5hbWVUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpc3BsYXlOYW1lVHlwZSkgb2JqZWN0KS5nZXRMYW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaXNwbGF5TmFtZVR5cGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNwbGF5TmFtZVR5cGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FSkJMaW5rSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VKQkxpbmtJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiY2NiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VKQkxpbmtJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkVKQkxpbmt9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQkxpbmtJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCZWFuTGlua0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFSkJMaW5rSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEVqYkxpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX0VKQkxpbmtfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfRUpCTGlua19pZF9mZWF0dXJlIiwgIl9VSV9FSkJMaW5rX3R5cGUiKSwgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkxpbmtfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVqYiBMaW5rIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVqYkxpbmtQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0VKQkxpbmtfZWpiTGlua19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FSkJMaW5rX2VqYkxpbmtfZmVhdHVyZSIsICJfVUlfRUpCTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMaW5rX0VqYkxpbmsoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRUpCTGluay5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKEVKQkxpbmspb2JqZWN0KS5nZXRJZCgpOyByZXR1cm4gbGFiZWwgPT0KLQkgKiBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FSkJMaW5rX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX0VKQkxpbmtfdHlwZSIpICsgIiAiICsKLQkgKiBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRUpCTGluaykgb2JqZWN0KS5nZXRFamJMaW5rKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfRUpCTGlua190eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFSkJMaW5rLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5FSkJfTElOS19fRUpCX0xJTksgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FbGVtZW50TmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FbGVtZW50TmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY0ODU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRWxlbWVudE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnROYW1lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRWxlbWVudE5hbWVfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxlbWVudE5hbWVfaWRfZmVhdHVyZSIsICJfVUlfRWxlbWVudE5hbWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbGVtZW50TmFtZV9JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGV4dCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZXh0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FbGVtZW50TmFtZV90ZXh0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsZW1lbnROYW1lX3RleHRfZmVhdHVyZSIsICJfVUlfRWxlbWVudE5hbWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbGVtZW50TmFtZV9UZXh0KCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEVsZW1lbnROYW1lLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRWxlbWVudE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRWxlbWVudE5hbWUpIG9iamVjdCkuZ2V0SWQoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0VsZW1lbnROYW1lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxlbWVudE5hbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFbGVtZW50TmFtZS5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX1RFWFQgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0V4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQ5ZTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeGNlcHRpb25UeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRXhjZXB0aW9uTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FeGNlcHRpb25NYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeGNlcHRpb24gVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGNlcHRpb25UeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX2V4Y2VwdGlvblR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ19leGNlcHRpb25UeXBlX2ZlYXR1cmUiLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0V4Y2VwdGlvblR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgTWVzc2FnZSBQYXJ0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRXhjZXB0aW9uTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiwgIl9VSV9FeGNlcHRpb25NYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFeGNlcHRpb25NYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRXhjZXB0aW9uTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFeGNlcHRpb25NYXBwaW5nKSBvYmplY3QpLmdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRXhjZXB0aW9uTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0UgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMTWVzc2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3YjU0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuSGFuZGxlcn1vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhhbmRsZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSGFuZGxlck5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNvYXBSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUG9ydE5hbWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIYW5kbGVyQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhbmRsZXIgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIYW5kbGVyTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9IYW5kbGVyX2hhbmRsZXJOYW1lX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBSb2xlcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9IYW5kbGVyX3NvYXBSb2xlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfc29hcFJvbGVzX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IE5hbWVzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBvcnROYW1lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfcG9ydE5hbWVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9wb3J0TmFtZXNfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1BvcnROYW1lcygpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhbmRsZXIgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIGZhbHNlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEhhbmRsZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9vYmoxNi9oYW5kbGVyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKEhhbmRsZXIpb2JqZWN0KS5nZXRIYW5kbGVyTmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSGFuZGxlcikgb2JqZWN0KS5nZXRIYW5kbGVyTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfdHlwZSIpIDogZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfdHlwZSIpICsgIjogIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEhhbmRsZXIuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUUgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUyA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBIZWFkZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFBvcnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0luaXRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Jbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyMzNhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0luaXRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW19Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQkvL3BnbSBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFyYW1OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfSW5pdFBhcmFtX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX0luaXRQYXJhbV9pZF9mZWF0dXJlIiwgIl9VSV9Jbml0UGFyYW1fdHlwZSIpLAotCSAqIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fcGFyYW1OYW1lX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW0gVmFsdWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1WYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX3BhcmFtVmFsdWVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQgCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSW5pdFBhcmFtLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChJbml0UGFyYW0pb2JqZWN0KS5nZXRQYXJhbU5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSW5pdFBhcmFtX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfSW5pdFBhcmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyB9IC8qCi0JICogCi0JICogLyoqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+IEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pIG9iamVjdDsKLQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCk7Ci0JCVN0cmluZyB2YWx1ZSA9IGluaXRQYXJhbS5nZXRQYXJhbVZhbHVlKCk7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwIHx8IHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxhYmVsLmFwcGVuZChuYW1lKTsKLQkJbGFiZWwuYXBwZW5kKCI9Iik7IC8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuYXBwZW5kKHZhbHVlKTsKLQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEluaXRQYXJhbS5jbGFzcykpIHsKLQkJCS8vcGdtIGNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0lEOgotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSA6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRSA6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsgcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsgfQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUluaXRQYXJhbSBwYXJhbSA9IChJbml0UGFyYW0pIG9iamVjdDsKLQkJaWYgKHBhcmFtLmdldFBhcmFtTmFtZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQocGFyYW0uZ2V0UGFyYW1OYW1lKCkpOwotCQlpZiAocGFyYW0uZ2V0UGFyYW1WYWx1ZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQocGFyYW0uZ2V0UGFyYW1WYWx1ZSgpKTsKLQkJaWYgKHBhcmFtLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChwYXJhbS5nZXREZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9JbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTJjYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9JbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBJbnRlcmZhY2VNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSW50ZXJmYWNlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0ludGVyZmFjZU1hcHBpbmdfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjN2JkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KYXZhV1NETE1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSmF2YVdTRExNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX0phdmFXU0RMTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19FeGNlcHRpb25NYXBwaW5ncygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSmF2YVdTRExNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSmF2YVdTRExNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEphdmFXU0RMTWFwcGluZykgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSmF2YVdTRExNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfSmF2YVdTRExNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSmF2YVdTRExNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1MgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19KQVZBX1hNTF9UWVBFX01BUFBJTkdTIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fRVhDRVBUSU9OX01BUFBJTkdTIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSU5URVJGQUNFX01BUFBJTkdTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19QYWNrYWdlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFja2FnZU1hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19KYXZhWE1MVHlwZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4Y2VwdGlvbk1hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbnRlcmZhY2VNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUludGVyZmFjZU1hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU1MTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2xhc3NUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRRbmFtZVNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBbm9ueW1vdXNUeXBlUW5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2xhc3MgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDbGFzc1R5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19jbGFzc1R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2NsYXNzVHlwZV9mZWF0dXJlIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQ2xhc3NUeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBRbmFtZSBTY29wZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRRbmFtZVNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfcW5hbWVTY29wZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfcW5hbWVTY29wZV9mZWF0dXJlIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfUW5hbWVTY29wZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQW5vbnltb3VzIFR5cGUgUW5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5vbnltb3VzVHlwZVFuYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfYW5vbnltb3VzVHlwZVFuYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19hbm9ueW1vdXNUeXBlUW5hbWVfZmVhdHVyZSIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0Fub255bW91c1R5cGVRbmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSmF2YVhNTFR5cGVNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSmF2YVhNTFR5cGVNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEphdmFYTUxUeXBlTWFwcGluZykgb2JqZWN0KS5nZXRBbm9ueW1vdXNUeXBlUW5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUk9PVF9UWVBFX1FOQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19Sb290VHlwZVFuYW1lKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvb3RUeXBlUW5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVZhcmlhYmxlTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0pheHJwY21hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0pheHJwY21hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGQyODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXhycGNtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLnV0aWwuSmF4cnBjbWFwQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuIFRoZQotICogYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0bwotICoge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKYXhycGNtYXBBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlciBqYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVdTRExNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgcGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBQYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciBqYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVhNTFR5cGVNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyIGV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2VwdGlvbk1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoZXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlleGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgc2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ30uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nfWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlciByb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb290VHlwZVFuYW1lQWRhcHRlcigpIHsKLQkJaWYgKHJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBSb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgdmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhcmlhYmxlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmICh2YXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB2YXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExNZXNzYWdlSXRlbVByb3ZpZGVyIHdzZGxNZXNzYWdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VBZGFwdGVyKCkgewotCQlpZiAod3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXIgPSBuZXcgV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJ9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlciBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJBZGFwdGVyKCkgewotCQlpZiAoY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyID0gbmV3IENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudE5hbWVJdGVtUHJvdmlkZXIgZWxlbWVudE5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWV9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGVtZW50TmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChlbGVtZW50TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllbGVtZW50TmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBFbGVtZW50TmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciB3c2RsU2VydmljZU5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFNlcnZpY2VOYW1lQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsU2VydmljZU5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIgcG9ydE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExQb3J0VHlwZUl0ZW1Qcm92aWRlciB3c2RsUG9ydFR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFBvcnRUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxQb3J0VHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsUG9ydFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxQb3J0VHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETEJpbmRpbmdJdGVtUHJvdmlkZXIgd3NkbEJpbmRpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMQmluZGluZ0FkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsQmluZGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsQmluZGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBXU0RMQmluZGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsQmluZGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9ufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIgd3NkbE9wZXJhdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE9wZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsT3BlcmF0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxPcGVyYXRpb25JdGVtUHJvdmlkZXIgPSBuZXcgV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsT3BlcmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlciBtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlciB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZ30uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAod3NkbFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciB3c2RsTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZX1pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyIHdzZGxNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExNZXNzYWdlUGFydE5hbWVBZGFwdGVyKCkgewotCQlpZiAod3NkbE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IFdTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVyZmFjZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoaW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxODgwYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0gKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFyYW1Qb3NpdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFyYW1UeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW0gUG9zaXRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1Qb3NpdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfcGFyYW1Qb3NpdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19wYXJhbVBvc2l0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1Qb3NpdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW0gVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3BhcmFtVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19wYXJhbVR5cGVfZmVhdHVyZSIsICJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcpIG9iamVjdCkuZ2V0SWQoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9QT1NJVElPTiA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1RZUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzMDZhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFja2FnZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE5hbWVzcGFjZVVSSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BhY2thZ2VNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BhY2thZ2VNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1BhY2thZ2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhY2thZ2UgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWNrYWdlVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfcGFja2FnZVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGFja2FnZU1hcHBpbmdfcGFja2FnZVR5cGVfZmVhdHVyZSIsICJfVUlfUGFja2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZXNwYWNlIFVSSSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lc3BhY2VVUklQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BhY2thZ2VNYXBwaW5nX25hbWVzcGFjZVVSSV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYWNrYWdlTWFwcGluZ19uYW1lc3BhY2VVUklfZmVhdHVyZSIsICJfVUlfUGFja2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUGFja2FnZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9QYWNrYWdlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQYWNrYWdlTWFwcGluZykgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBhY2thZ2VNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fUEFDS0FHRV9UWVBFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjE3NGM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50fQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQb3J0Q29tcG9uZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExhcmdlSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1BvcnRDb21wb25lbnRfaWRfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksCi0JICogV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgQ29tcG9uZW50IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydENvbXBvbmVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfcG9ydENvbXBvbmVudE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9wb3J0Q29tcG9uZW50TmFtZV9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU21hbGwgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfc21hbGxJY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfc21hbGxJY29uX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhcmdlIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2xhcmdlSWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X2xhcmdlSWNvbl9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzcGxheSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfZGlzcGxheU5hbWVfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0ljb25UeXBlKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9ydENvbXBvbmVudC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeyByZXR1cm4KLQkgKiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50Iik7IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9Ci0JICogKChQb3J0Q29tcG9uZW50KW9iamVjdCkuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JICogZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF90eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9ydENvbXBvbmVudC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvcnRDb21wb25lbnQpIG9iamVjdCkuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcnRDb21wb25lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fTEFSR0VfSUNPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIYW5kbGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvblR5cGUoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lVHlwZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSWNvblR5cGUoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDU4MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZn1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQb3J0Q29tcG9uZW50TGlua1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IENvbXBvbmVudCBMaW5rIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBvcnRDb21wb25lbnRMaW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfUG9ydENvbXBvbmVudFJlZl9wb3J0Q29tcG9uZW50TGlua19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRSZWZfcG9ydENvbXBvbmVudExpbmtfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1BvcnRDb21wb25lbnRMaW5rKCksIGZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfUG9ydENvbXBvbmVudFJlZl9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCBmYWxzZSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvcnRDb21wb25lbnRSZWYuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9vYmoxNi9wb3J0Y29tcG9uZW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPQotCSAqICgoUG9ydENvbXBvbmVudFJlZilvYmplY3QpLmdldFBvcnRDb21wb25lbnRMaW5rKCk7IHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09Ci0JICogMCA/IGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRSZWZfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudFJlZl90eXBlIikgKyAiICIgKwotCSAqIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQb3J0Q29tcG9uZW50UmVmKSBvYmplY3QpLmdldFBvcnRDb21wb25lbnRMaW5rKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfUG9ydENvbXBvbmVudFJlZl90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3J0Q29tcG9uZW50UmVmLmNsYXNzKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzk5MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRKYXZhUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0TWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0TWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9Qb3J0TWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX3BvcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRNYXBwaW5nX3BvcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEphdmEgUG9ydCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydE1hcHBpbmdfamF2YVBvcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRNYXBwaW5nX2phdmFQb3J0TmFtZV9mZWF0dXJlIiwgIl9VSV9Qb3J0TWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRNYXBwaW5nX0phdmFQb3J0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb3J0TWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BvcnRNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvcnRNYXBwaW5nKSBvYmplY3QpLmdldFBvcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qb3J0TWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9ydE1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19QT1JUX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmE3NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydE5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvcnROYW1lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCS8vcGdtIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfUG9ydE5hbWVfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfUG9ydE5hbWVfaWRfZmVhdHVyZSIsICJfVUlfUG9ydE5hbWVfdHlwZSIpLCBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnROYW1lX0lkKCksCi0JICogdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnROYW1lX3BvcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnROYW1lX3BvcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0TmFtZV9Qb3J0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb3J0TmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BvcnROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoUG9ydE5hbWUpb2JqZWN0KS5nZXRQb3J0TmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qb3J0TmFtZV90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1BvcnROYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9ydE5hbWUpIG9iamVjdCkuZ2V0UG9ydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Qb3J0TmFtZV90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcnROYW1lLmNsYXNzKSkgewotCQkJLy9wZ20gY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FX19JRDoKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeyByZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOyB9Ci0JICovCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Sb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1Jvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhMDZjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1Jvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb290VHlwZVFuYW1lLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9vdFR5cGVRbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb290VHlwZVFuYW1lKSBvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Jvb3RUeXBlUW5hbWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb290VHlwZVFuYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU09BUEhlYWRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TT0FQSGVhZGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MTMwMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TT0FQSGVhZGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlckl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNPQVBIZWFkZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTT0FQSGVhZGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU09BUEhlYWRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9Ci0JICogKChTT0FQSGVhZGVyKW9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkgKiBnZXRTdHJpbmcoIl9VSV9TT0FQSGVhZGVyX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX1NPQVBIZWFkZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTT0FQSGVhZGVyIHNvYXBIZWFkZXIgPSAoU09BUEhlYWRlcikgb2JqZWN0OwotCQlTdHJpbmcgbnNVUkkgPSBzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOwotCQlTdHJpbmcgbG9jYWxwYXJ0ID0gc29hcEhlYWRlci5nZXRMb2NhbFBhcnQoKTsKLQkJaWYgKG5zVVJJID09IG51bGwgfHwgbnNVUkkubGVuZ3RoKCkgPT0gMCB8fCBsb2NhbHBhcnQgPT0gbnVsbCB8fCBsb2NhbHBhcnQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfU09BUEhlYWRlcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGxhYmVsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlsYWJlbC5hcHBlbmQobnNVUkkpOwotCQlsYWJlbC5hcHBlbmQoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlsYWJlbC5hcHBlbmQobG9jYWxwYXJ0KTsKLQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBSb2xlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBSb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmEzODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TT0FQUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUFJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNPQVBSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCS8vcGdtIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTb2FwUm9sZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfU09BUFJvbGVfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfU09BUFJvbGVfaWRfZmVhdHVyZSIsICJfVUlfU09BUFJvbGVfdHlwZSIpLCBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBSb2xlX0lkKCksCi0JICogdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIFJvbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcFJvbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NPQVBSb2xlX3NvYXBSb2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NPQVBSb2xlX3NvYXBSb2xlX2ZlYXR1cmUiLCAiX1VJX1NPQVBSb2xlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQUm9sZV9Tb2FwUm9sZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTT0FQUm9sZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1NPQVBSb2xlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoU09BUFJvbGUpb2JqZWN0KS5nZXRJZCgpOyByZXR1cm4KLQkgKiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TT0FQUm9sZV90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1NPQVBSb2xlX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTT0FQUm9sZSkgb2JqZWN0KS5nZXRTb2FwUm9sZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1NPQVBSb2xlX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU09BUFJvbGUuY2xhc3MpKSB7Ci0JCQkvL3BnbSBjYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX1JPTEVfX0lEOgotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19TT0FQX1JPTEUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7IHJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7IH0KLQkgKi8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQyYzk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZXNDbGllbnQgd3NDbGllbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V3NDbGllbnQoV2ViU2VydmljZXNDbGllbnQgY2xpZW50KSB7Ci0JCXdzQ2xpZW50ID0gY2xpZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZXNDbGllbnQgZ2V0V3NDbGllbnQoKSB7Ci0JCXJldHVybiB3c0NsaWVudDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYzE3MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxQb3J0VHlwZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsQmluZGluZygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZykgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1MgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsUG9ydFR5cGUoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFBvcnRUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExCaW5kaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmYzE4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ31vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSmF2YU1ldGhvZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdyYXBwZWRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBKYXZhIE1ldGhvZCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFNZXRob2ROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX2phdmFNZXRob2ROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfamF2YU1ldGhvZE5hbWVfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgT3BlcmF0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfd3NkbE9wZXJhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3dzZGxPcGVyYXRpb25fZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3JhcHBlZCBFbGVtZW50IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdyYXBwZWRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3dyYXBwZWRFbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfd3JhcHBlZEVsZW1lbnRfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3JhcHBlZEVsZW1lbnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKSBvYmplY3QpLmdldEphdmFNZXRob2ROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX01ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTgxZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFufQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfU2VydmljZUltcGxCZWFuX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1NlcnZpY2VJbXBsQmVhbl9pZF9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlSW1wbEJlYW5fdHlwZSIpLAotCSAqIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VydmljZUltcGxCZWFuLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvc3J2Y2VfZWxlbV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoU2VydmljZUltcGxCZWFuKW9iamVjdCkuZ2V0SWQoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU2VydmljZUltcGxCZWFuX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfU2VydmljZUltcGxCZWFuX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU2VydmljZUltcGxCZWFuIHNlcnZpY2VJbXBsQmVhbiA9IChTZXJ2aWNlSW1wbEJlYW4pIG9iamVjdDsKLQkJU3RyaW5nIGVqYkxpbmsgPSBzZXJ2aWNlSW1wbEJlYW4uZ2V0RUVKQkxpbmsoKS5nZXRFamJMaW5rKCk7Ci0JCWlmIChlamJMaW5rICE9IG51bGwgJiYgZWpiTGluay5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gZWpiTGluazsKLQkJU3RyaW5nIGJlYW5MaW5rID0gc2VydmljZUltcGxCZWFuLmdldEJlYW5MaW5rKCkudG9TdHJpbmcoKTsKLQkJaWYgKGJlYW5MaW5rICE9IG51bGwgJiYgYmVhbkxpbmsubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIGJlYW5MaW5rOwotCQlTdHJpbmcgc2VydmxldExpbmsgPSBzZXJ2aWNlSW1wbEJlYW4uZ2V0RVNlcnZsZXRMaW5rKCkuZ2V0U2VydmxldExpbmsoKTsKLQkJaWYgKHNlcnZsZXRMaW5rICE9IG51bGwgJiYgc2VydmxldExpbmsubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIHNlcnZsZXRMaW5rOwotCQlyZXR1cm4gZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VJbXBsQmVhbl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmljZUltcGxCZWFuLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VTRVJWTEVUX0xJTksgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVKQkxpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0TGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmVhbkxpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXRMaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFSkJMaW5rKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiBxdWFsaWZ5ID0gZmVhdHVyZSA9PSBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpIHx8IGZlYXR1cmUgPT0gV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpIHx8IGZlYXR1cmUgPT0gV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpOwotCQlyZXR1cm4gZ2V0U3RyaW5nKHF1YWxpZnkgPyAiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiA6ICJfVUlfQ3JlYXRlQ2hpbGRfdGV4dCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQluZXcgT2JqZWN0W117Z2V0VHlwZVRleHQoY2hpbGQpLCBnZXRGZWF0dXJlVGV4dChmZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzIyNGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZXJ2aWNlSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfc2VydmljZUludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfU2VydmljZUludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfV3NkbFNlcnZpY2VOYW1lKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Qb3J0TWFwcGluZ3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFNlcnZpY2VOYW1lKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Qb3J0TWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydE1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZFZGl0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5YWRhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZFZGl0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlciBleHRlbmRzIFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgewotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBhcmcwKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhZjliYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuU2VydmljZVJlZn1vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkU2VydmljZUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VydmljZVJlZk5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxGaWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRKYXhycGNNYXBwaW5nRmlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBSZWYgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlUmVmTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfc2VydmljZVJlZk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX3NlcnZpY2VSZWZOYW1lX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBGaWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxGaWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl93c2RsRmlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfd3NkbEZpbGVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCksIGZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSmF4cnBjIE1hcHBpbmcgRmlsZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXhycGNNYXBwaW5nRmlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfamF4cnBjTWFwcGluZ0ZpbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX3NlcnZpY2VJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX3NlcnZpY2VJbnRlcmZhY2VfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKSwgZmFsc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCS8vY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpKTsKLQkJCS8vY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VydmljZVJlZi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L3NlcnZpY2VyZWYuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9Ci0JICogKChTZXJ2aWNlUmVmKW9iamVjdCkuZ2V0U2VydmljZVJlZk5hbWUoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JICogZ2V0U3RyaW5nKCJfVUlfU2VydmljZVJlZl90eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlUmVmX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZXJ2aWNlUmVmKSBvYmplY3QpLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0JCXJldHVybiAiU2VydmljZVJlZiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2aWNlUmVmLmNsYXNzKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUUgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1dTRExfRklMRSA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRSA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUyA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydENvbXBvbmVudFJlZigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0hhbmRsZXJzKCksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGFuZGxlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRTmFtZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBIZWFkZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExQb3J0KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2bGV0TGlua0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2bGV0TGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2FjNmI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmxldExpbmtJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGlua30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyIGV4dGVuZHMgQmVhbkxpbmtJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmxldExpbmtJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkU2VydmxldExpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1NlcnZsZXRMaW5rX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1NlcnZsZXRMaW5rX2lkX2ZlYXR1cmUiLCAiX1VJX1NlcnZsZXRMaW5rX3R5cGUiKSwKLQkgKiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldExpbmtfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZsZXQgTGluayBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2bGV0TGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmxldExpbmtfc2VydmxldExpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmxldExpbmtfc2VydmxldExpbmtfZmVhdHVyZSIsICJfVUlfU2VydmxldExpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldExpbmtfU2VydmxldExpbmsoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VydmxldExpbmsuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoU2VydmxldExpbmspb2JqZWN0KS5nZXRJZCgpOyByZXR1cm4KLQkgKiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2bGV0TGlua190eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1NlcnZsZXRMaW5rX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZXJ2bGV0TGluaykgb2JqZWN0KS5nZXRTZXJ2bGV0TGluaygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1NlcnZsZXRMaW5rX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZsZXRMaW5rLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9WYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvVmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzYyZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9WYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSmF2YVZhcmlhYmxlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkWG1sRWxlbWVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERhdGFNZW1iZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFhtbEF0dHJpYnV0ZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFhtbFdpbGRjYXJkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEphdmEgVmFyaWFibGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVmFyaWFibGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfamF2YVZhcmlhYmxlTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfamF2YVZhcmlhYmxlTmFtZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWG1sIEVsZW1lbnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEVsZW1lbnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxFbGVtZW50TmFtZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERhdGEgTWVtYmVyIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERhdGFNZW1iZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ19kYXRhTWVtYmVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ19kYXRhTWVtYmVyX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19EYXRhTWVtYmVyKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBYbWwgQXR0cmlidXRlIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sQXR0cmlidXRlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEF0dHJpYnV0ZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEF0dHJpYnV0ZU5hbWVfZmVhdHVyZSIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFhtbCBXaWxkY2FyZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxXaWxkY2FyZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3htbFdpbGRjYXJkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxXaWxkY2FyZF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVmFyaWFibGVNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVmFyaWFibGVNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFZhcmlhYmxlTWFwcGluZykgb2JqZWN0KS5nZXRKYXZhVmFyaWFibGVOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJsZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0pBVkFfVkFSSUFCTEVfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVIgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX1dJTERDQVJEIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMQmluZGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMQmluZGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjlmMTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETEJpbmRpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmd9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMQmluZGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExCaW5kaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETEJpbmRpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMQmluZGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMQmluZGluZykgb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMQmluZGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExCaW5kaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1NDBiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBRTmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMTWVzc2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExNZXNzYWdlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETE1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETE1lc3NhZ2UpIG9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1NWQxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhcmFtZXRlck1vZGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNvYXBIZWFkZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBNZXNzYWdlIFBhcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW1ldGVyIE1vZGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1ldGVyTW9kZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3BhcmFtZXRlck1vZGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3BhcmFtZXRlck1vZGVfZmVhdHVyZSIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1BhcmFtZXRlck1vZGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvYXAgSGVhZGVyIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNvYXBIZWFkZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19zb2FwSGVhZGVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19zb2FwSGVhZGVyX2ZlYXR1cmUiLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19Tb2FwSGVhZGVyKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMTWVzc2FnZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMTWVzc2FnZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETE1lc3NhZ2VNYXBwaW5nKSBvYmplY3QpLmdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdTRExNZXNzYWdlTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUiA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETE1lc3NhZ2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiOGIyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWV9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfaWRfZmVhdHVyZSIsICJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlUGFydE5hbWVfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgTWVzc2FnZSBQYXJ0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV93c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9Xc2RsTWVzc2FnZVBhcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExNZXNzYWdlUGFydE5hbWUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMTWVzc2FnZVBhcnROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExNZXNzYWdlUGFydE5hbWUpIG9iamVjdCkuZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXU0RMTWVzc2FnZVBhcnROYW1lLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMT3BlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmMmU4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbn0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMT3BlcmF0aW9uX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExPcGVyYXRpb25faWRfZmVhdHVyZSIsICJfVUlfV1NETE9wZXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb25fSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgT3BlcmF0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExPcGVyYXRpb25fd3NkbE9wZXJhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMT3BlcmF0aW9uX3dzZGxPcGVyYXRpb25fZmVhdHVyZSIsICJfVUlfV1NETE9wZXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMT3BlcmF0aW9uLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETE9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMT3BlcmF0aW9uKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMT3BlcmF0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETE9wZXJhdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdTRExPcGVyYXRpb24uY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT04gOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTk0MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMUG9ydEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnR9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExQb3J0SXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETFBvcnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMUG9ydC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvd3NkbC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChXU0RMUG9ydClvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETFBvcnRfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9XU0RMUG9ydF90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVdTRExQb3J0IHdzZGxwb3J0ID0gKFdTRExQb3J0KSBvYmplY3Q7Ci0JCVN0cmluZyBuc1VSSSA9IHdzZGxwb3J0LmdldE5hbWVzcGFjZVVSSSgpOwotCQlTdHJpbmcgbG9jYWxwYXJ0ID0gd3NkbHBvcnQuZ2V0TG9jYWxQYXJ0KCk7Ci0JCWlmIChuc1VSSSA9PSBudWxsIHx8IG5zVVJJLmxlbmd0aCgpID09IDAgfHwgbG9jYWxwYXJ0ID09IG51bGwgfHwgbG9jYWxwYXJ0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZ2V0U3RyaW5nKCIlX1VJX1dTRExQb3J0X3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxhYmVsLmFwcGVuZChuc1VSSSk7Ci0JCWxhYmVsLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLmFwcGVuZChsb2NhbHBhcnQpOwotCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3MTdiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETFBvcnRUeXBlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETFBvcnRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExQb3J0VHlwZSkgb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMUG9ydFR5cGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9XU0RMUG9ydFR5cGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkMzY3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTWV0aG9kUmV0dXJuVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1ldGhvZCBSZXR1cm4gVmFsdWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kUmV0dXJuVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfbWV0aG9kUmV0dXJuVmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ19tZXRob2RSZXR1cm5WYWx1ZV9mZWF0dXJlIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19NZXRob2RSZXR1cm5WYWx1ZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBNZXNzYWdlIFBhcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETFJldHVyblZhbHVlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKSBvYmplY3QpLmdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fTUVUSE9EX1JFVFVSTl9WQUxVRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETE1lc3NhZ2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjUwMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWV9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExTZXJ2aWNlTmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExTZXJ2aWNlTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMU2VydmljZU5hbWUpIG9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETFNlcnZpY2VOYW1lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETFNlcnZpY2VOYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM4YmM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbn1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSmF4cnBjTWFwcGluZ0ZpbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxGaWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExhcmdlSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25faWRfZmVhdHVyZSIpLAotCSAqIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2lkX2ZlYXR1cmUiLAotCSAqICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSmF4cnBjIE1hcHBpbmcgRmlsZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXhycGNNYXBwaW5nRmlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9qYXhycGNNYXBwaW5nRmlsZV9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0pheHJwY01hcHBpbmdGaWxlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl93ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl93ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBGaWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxGaWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fd3NkbEZpbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3dzZGxGaWxlX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNtYWxsIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU21hbGxJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fc21hbGxJY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9zbWFsbEljb25fZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9TbWFsbEljb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhcmdlIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fbGFyZ2VJY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9sYXJnZUljb25fZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9MYXJnZUljb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpc3BsYXkgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNwbGF5TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2Rpc3BsYXlOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9kaXNwbGF5TmFtZV9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsgcmV0dXJuCi0JICogZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV2ViU2VydmljZURlc2NyaXB0aW9uIik7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFdlYlNlcnZpY2VEZXNjcmlwdGlvbilvYmplY3QpLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwKLQkgKiBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L3dlYnNlcnZpY2VkZXNjLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV2ViU2VydmljZURlc2NyaXB0aW9uKSBvYmplY3QpLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0xBUkdFX0lDT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0Q29tcG9uZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZVR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxYjliMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnR9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlc0NsaWVudC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dlYlNlcnZpY2VzQ2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvL3JldHVybiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlc0NsaWVudF90eXBlIik7Ci0JCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfV2ViU2VydmljZXNDbGllbnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlYlNlcnZpY2VzQ2xpZW50LmNsYXNzKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb25lbnRTY29wZWRSZWZzKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZVJlZigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkYjI0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlc19pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9XZWJTZXJ2aWNlc19pZF9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlc190eXBlIiksCi0JICogV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdlYlNlcnZpY2VzLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV2ViU2VydmljZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChXZWJTZXJ2aWNlcylvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7Ci0JICogcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VzX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZXNfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdlYlNlcnZpY2VzKSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfV2ViU2VydmljZXNfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViU2VydmljZXMuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyNjcxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC51dGlsLldlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VSZWZFZGl0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZVJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlYzUxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLnV0aWwuV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4gVGhlCi0gKiBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvCi0gKiB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuU2VydmljZVJlZn0KLQkgKiBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZVJlZkl0ZW1Qcm92aWRlciBzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlNlcnZpY2VSZWZ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlUmVmQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWZ9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciBwb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWZ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0Q29tcG9uZW50UmVmQWRhcHRlcigpIHsKLQkJaWYgKHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciA9IG5ldyBQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5IYW5kbGVyfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYW5kbGVySXRlbVByb3ZpZGVyIGhhbmRsZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuSGFuZGxlcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCkgewotCQlpZiAoaGFuZGxlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQloYW5kbGVySXRlbVByb3ZpZGVyID0gbmV3IEhhbmRsZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnR9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgd2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlc0NsaWVudEFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciA9IG5ldyBXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmc31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyIGNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmc30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNBZGFwdGVyKCkgewotCQlpZiAoY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyID0gbmV3IENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhYWIzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIFdlYnNlcnZpY2UtajJlZSBlZGl0IHBsdWdpbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4gewotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbigpOwotCi0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXXt9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luIDwvYj4uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiAKLQkJICogQHBhcmFtIGRlc2NyaXB0b3IKLQkJICogICAgICAgICAgICB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBsdWdpbi4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEltcGxlbWVudGF0aW9uKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJCXN1cGVyKGRlc2NyaXB0b3IpOwotCi0JCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotCQkJLy8KLQkJCXBsdWdpbiA9IHRoaXM7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlNWM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLnV0aWwuV3Njb21tb25BZGFwdGVyRmFjdG9yeTsKLQotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLiBUaGUKLSAqIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8KLSAqIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluaXRQYXJhbUl0ZW1Qcm92aWRlciBpbml0UGFyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW19LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCkgewotCQlpZiAoaW5pdFBhcmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWluaXRQYXJhbUl0ZW1Qcm92aWRlciA9IG5ldyBJbml0UGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5pdFBhcmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXJ9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU09BUEhlYWRlckl0ZW1Qcm92aWRlciBzb2FwSGVhZGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCkgewotCQlpZiAoc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzb2FwSGVhZGVySXRlbVByb3ZpZGVyID0gbmV3IFNPQVBIZWFkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc29hcEhlYWRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTT0FQUm9sZUl0ZW1Qcm92aWRlciBzb2FwUm9sZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUFJvbGVBZGFwdGVyKCkgewotCQlpZiAoc29hcFJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc29hcFJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgU09BUFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc29hcFJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydE5hbWVJdGVtUHJvdmlkZXIgcG9ydE5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnROYW1lQWRhcHRlcigpIHsKLQkJaWYgKHBvcnROYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBvcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IFBvcnROYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvcnROYW1lSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIgZGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25UeXBlQWRhcHRlcigpIHsKLQkJaWYgKGRlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyIGRpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc3BsYXlOYW1lVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyID0gbmV3IERpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfWFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MTcxMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53c2RkLnByb3ZpZGVyLkhhbmRsZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLnV0aWwuV3NkZEFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLiBUaGUKLSAqIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8KLSAqIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdzZGRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlc31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlciB3ZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXN9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlc0FkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3ZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlciA9IG5ldyBXZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3ZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgd2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAod2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudH1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyIHBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0Q29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydH1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMUG9ydEl0ZW1Qcm92aWRlciB3c2RsUG9ydEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMUG9ydEFkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsUG9ydEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsUG9ydEl0ZW1Qcm92aWRlciA9IG5ldyBXU0RMUG9ydEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsUG9ydEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIgc2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW59LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlSW1wbEJlYW5BZGFwdGVyKCkgewotCQlpZiAoc2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmt9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmxldExpbmtJdGVtUHJvdmlkZXIgc2VydmxldExpbmtJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldExpbmtBZGFwdGVyKCkgewotCQlpZiAoc2VydmxldExpbmtJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmxldExpbmtJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmxldExpbmtJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmxldExpbmtJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVKQkxpbmtJdGVtUHJvdmlkZXIgZWpiTGlua0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuRUpCTGlua30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkxpbmtBZGFwdGVyKCkgewotCQlpZiAoZWpiTGlua0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllamJMaW5rSXRlbVByb3ZpZGVyID0gbmV3IEVKQkxpbmtJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZWpiTGlua0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkhhbmRsZXJ9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSGFuZGxlckl0ZW1Qcm92aWRlciBoYW5kbGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckFkYXB0ZXIoKSB7Ci0JCWlmIChoYW5kbGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWhhbmRsZXJJdGVtUHJvdmlkZXIgPSBuZXcgSGFuZGxlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBoYW5kbGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbmt9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmVhbkxpbmtJdGVtUHJvdmlkZXIgYmVhbkxpbmtJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkJlYW5MaW5rfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmVhbkxpbmtBZGFwdGVyKCkgewotCQlpZiAoYmVhbkxpbmtJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYmVhbkxpbmtJdGVtUHJvdmlkZXIgPSBuZXcgQmVhbkxpbmtJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYmVhbkxpbmtJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfWFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd3NkZC9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93c2RkL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjZjQyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93c2RkL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud3NkZC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0vKgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggSGFuZGxlckl0ZW1Qcm92aWRlciBpbiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyCi0gKiBwYWNrYWdlIGFuZCBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIGNsYXNzIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBIYW5kbGVySXRlbVByb3ZpZGVyIGluIAotICogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlciBwYWNrYWdlLgotICovCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcn1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhhbmRsZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSGFuZGxlck5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEhhbmRsZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl9pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9IYW5kbGVyX2lkX2ZlYXR1cmUiLCAiX1VJX0hhbmRsZXJfdHlwZSIpLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGFuZGxlciBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhhbmRsZXJOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX2hhbmRsZXJOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZSIsICJfVUlfSGFuZGxlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYW5kbGVyIENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhhbmRsZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZSIsICJfVUlfSGFuZGxlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBSb2xlcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSGFuZGxlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeyByZXR1cm4KLQkgKiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9IYW5kbGVyIik7IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoSGFuZGxlcilvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7Ci0JICogcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0hhbmRsZXJfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEhhbmRsZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L2hhbmRsZXIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChIYW5kbGVyKSBvYmplY3QpLmdldEhhbmRsZXJOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChIYW5kbGVyLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX0NMQVNTIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVMgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlMgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0luaXRQYXJhbXMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbml0UGFyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcFJvbGVzKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUFJvbGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5NTk3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZsZXRfdWkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YWMxMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXNlcnZsZXR1aS5qYXIKLUBkb3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjA5YmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkNzhiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogV1RQIFNlcnZsZXQgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogLiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmNsYXNzcGF0aCwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcywKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiZjU2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2UuLiA9IHNlcnZsZXRfdWkvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDg1OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjMDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVlYWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWM2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWJhbm5lci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWJhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTQ0ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1pY29uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYi13aXotaWNvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWM2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1pY29uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2YwZjhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWNyZWF0ZS53ZWIubW9kdWxlX3VpXz1DcmVhdGUgYSBKMkVFIFdlYiBNb2R1bGUKLWNyZWF0ZS53ZWIucHJvamVjdF91aV89Q3JlYXRlIGEgSjJFRSBXZWIgbW9kdWxlCi13ZWIuYWN0aW9ucy5kZXNjcmlwdGlvbl91aV89QWN0aW9ucyBmb3IgSjJFRSBXZWIgRGV2ZWxvcG1lbnQKLWNyZWF0ZV9zZXJ2bGV0X3VpXz1DcmVhdGUgSmF2YSBTZXJ2bGV0IGZpbGUKLXdhci5pbXBvcnQuZGVzY3JpcHRpb25fdWlfPUltcG9ydCBhbiBleHRlcm5hbCBXQVIgZmlsZSBpbnRvIGFuIFdlYiBwcm9qZWN0Ci13YXIuaW1wb3J0LmFjdGlvbi5kZXNjcmlwdGlvbl91aV89SW1wb3J0IFdBUiBGaWxlLi4uCi13YXIuZXhwb3J0LmRlc2NyaXB0aW9uX3VpXz1FeHBvcnQgYSBXZWIgcHJvamVjdCBpbnRvIGEgV0FSIGZpbGUKLXdhci5leHBvcnQuYWN0aW9uLmRlc2NyaXB0aW9uX3VpXz1FeHBvcnQgV0FSIEZpbGUuLi4KLVdhcmV4cG9ydFdpemFyZC5uYW1lPVdBUiBmaWxlCi1XYXJleHBvcnRXaXphcmQuZGVzY3JpcHRpb249RXhwb3J0IGEgV2ViIE1vZHVsZSBpbnRvIGFuIGV4dGVybmFsIFdBUiBmaWxlCi1XYXJJbXBvcnRXaXphcmQubmFtZT1XQVIgZmlsZQotV2FySW1wb3J0V2l6YXJkLmRlc2NyaXB0aW9uPUltcG9ydCBhbiBleHRlcm5hbCBXQVIgZmlsZSBpbnRvIGEgV2ViIFByb2plY3QKLXdlYi5jYXRlZ29yeV91aV89V2ViCi13ZWIucHJvamVjdF91aV89RHluYW1pYyBXZWIgUHJvamVjdAotbmV3LndlYi5wcm9qZWN0LmRlc2NyaXB0aW9uX3VpXz1DcmVhdGUgYSBEeW5hbWljIFdlYiBwcm9qZWN0Ci1Db252ZXJ0V2ViUHJvamVjdFR5cGU9Q29udmVydCBXZWIgUHJvamVjdAotY29udmVydFdlYlByb2plY3RUeXBlQWN0aW9uLmxhYmVsPUNvbnZlcnQgdG8gYSBEeW5hbWljIFdlYiBwcm9qZWN0Li4uCi1Db252ZXJ0V2ViUHJvamVjdFR5cGVBY3Rpb24udG9vbHRpcD1XZWIgTW9kdWxlIENvbnZlcnNpb24gV2l6YXJkCi1jb252ZXJ0VG9EeW5hbWljPUNvbnZlcnQgdG8gV2ViIE1vZHVsZS4uLgotU2VydmxldFdlYlJlZ2lvbldpemFyZC5uYW1lPVNlcnZsZXQKLVNlcnZsZXRXZWJSZWdpb25XaXphcmQuZGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IFNlcnZsZXQKLVNlcnZsZXRXZWJSZWdpb25XaXphcmQudGl0bGU9TmV3IFNlcnZsZXQKLVNlcnZsZXRfVUlfPVNlcnZsZXQuLi4KLXdlYmFwcC5jb250YWluZXIubmFtZT1XZWIgQXBwIExpYnJhcmllcwotc2VydmxldEFubm90YXRpb25EZWNvcmF0b3I9U2VydmxldCBBbm5vdGF0aW9uIERlY29yYXRvcgotc2VydmxldEFubm90YXRpb25EZWNvcmF0b3IuZGVzY3JpcHRpb249QWRkcyBhIGRlY29yYXRvciB0byBhbiBhbm5vdGF0ZWQgc2VydmxldC4KLXdlYi1wcm9qZWN0LXdpemFyZC1uYW1lID0gV2ViIFByb2plY3QKLXdlYi1wcm9qZWN0LXdpemFyZC1kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIFdlYiBwcm9qZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmI0YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBQdXJwb3NlOiBFeHRlbnNpb24gZm9yIHRoZSBKMkVFIEFDdGlvbiBTZXRzICAgICAgICAgICAgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiV3ZWIuY2F0ZWdvcnlfdWlfIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiV3ZWIuYWN0aW9ucy5kZXNjcmlwdGlvbl91aV8iCi0gICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMmVlTWFpbkFjdGlvblNldDIiPgotICAgICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVjcmVhdGUud2ViLm1vZHVsZV91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlY3JlYXRlLndlYi5tb2R1bGVfdWlfIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmFjdGlvbnMuTmV3V2ViQ29tcG9uZW50QWN0aW9uIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9IkoyRUVNYWluIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmFjdGlvbnMuTmV3V2ViQ29tcG9uZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0JPC9leHRlbnNpb24+Ci0gICAgPCEtLW5ldyBzZXJ2bGV0IGNvbnRyaWJ1dGlvbi0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJVNlcnZsZXRXZWJSZWdpb25XaXphcmQubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkU2VydmxldFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkU2VydmxldFdpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlU2VydmxldFdlYlJlZ2lvbldpemFyZC5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgIAotICAgPCEtLSBXZWIgTW9kdWxlIFdpemFyZCAtLT4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iSjJFRVVJUHJvamVjdFdpemFyZHMiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiV3ZWIuY2F0ZWdvcnlfdWlfIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiV3ZWIucHJvamVjdF91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLldlYkNvbXBvbmVudENyZWF0aW9uV2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVuZXcud2ViLnByb2plY3QuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgIDwvZXh0ZW5zaW9uPgotICAgICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJVdhckltcG9ydFdpemFyZC5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXYXJJbXBvcnRXaXphcmQuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICAKLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVXYXJleHBvcnRXaXphcmQubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLldlYkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV2FyZXhwb3J0V2l6YXJkLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLmV4dGVuZGFibGVXaXphcmQiPgotICAgICAgPGV4dGVuZGFibGVXaXphcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5XZWJNb2R1bGVDcmVhdGlvbldpemFyZCI+Ci0gICAgICA8L2V4dGVuZGFibGVXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSA8IS0tICA8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLQkJPGFjdGlvblNldAotCQkJbGFiZWw9IiVDb252ZXJ0V2ViUHJvamVjdFR5cGUiCi0JCQlkZXNjcmlwdGlvbj0iJUNvbnZlcnRXZWJQcm9qZWN0VHlwZSIKLQkJCXZpc2libGU9InRydWUiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuYWN0aW9ucy5Db252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uU2V0Ij4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJWNvbnZlcnRXZWJQcm9qZWN0VHlwZUFjdGlvbi5sYWJlbCIKLQkJCQl0b29sdGlwPSIlQ29udmVydFdlYlByb2plY3RUeXBlQWN0aW9uLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9InByb2plY3QvYWRkaXRpb25zIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5hY3Rpb25zLkNvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24iCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpZD0iY29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbiI+ICAgCi0JCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCTxvYmplY3RTdGF0ZSBuYW1lPSJuYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud2ViLlN0YXRpY1dlYk5hdHVyZSIvPgotCQkJCQk8L2FuZD4KLQkJCQk8L2VuYWJsZW1lbnQ+ICAgICAgICAgICAgCi0JCQk8L2FjdGlvbj4KLQkJPC9hY3Rpb25TZXQ+Ci0JPC9leHRlbnNpb24+IC0tPgotCQotCTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci53b3JrYmVuY2guY29tbW9uV2l6YXJkIj4KLSAgICAgICAgICA8IS0tIFdlYiBOZXcgLS0+Ci0gICAgICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5XZWJDb21wb25lbnRDcmVhdGlvbldpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiPgotCSAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgICAgPG9yPgotCSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0JICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLQkgICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotCSAgICAgICAgICAgICAgIDwvb3I+IAotICAgICAgICAgICAgICAgPC9hbmQ+IAotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZSI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAJICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgICAgPCEtLSBOZXcgU2VydmxldCAtLT4KLSAgICAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRTZXJ2bGV0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCI+Ci0JICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgICA8b3I+Ci0JICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLQkgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiPgotCSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0JICAgICAgICAgICAgICAgPC9vcj4gCi0gICAgICAgICAgICAgICA8L2FuZD4gCi0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgIAkgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIAkgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCI+Ci0gICAgICAgICAgICAgICAJIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvY29tbW9uV2l6YXJkPgotICAgICAgIDwhLS0gV2ViIEltcG9ydCAtLT4KLSAgICAgIDwhLS0gIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgIHR5cGU9ImltcG9ydCIKLSAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5XZWJNb2R1bGVJbXBvcnRXaXphcmQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiPgotCSAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAJICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5ncm91cHMuTmF2aWdhdG9yR3JvdXAiPgotICAgICAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICAJICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgIDxvcj4KLQkgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotCSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0JICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLQkgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSI+Ci0JICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLQkgICAgICAgICAgICAgICA8L29yPiAKLSAgICAgICAgICAgICAgICA8L2FuZD4gCi0gICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5pbXBsLldlYkFwcEltcGwiPgotICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYkdyb3VwSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPiAgICAgCi0gICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLmltcGwuQXBwbGljYXRpb25JbXBsIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5pbXBsLk1vZHVsZUltcGwiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIDwvb3I+Ci0gICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvY29tbW9uV2l6YXJkPiAtLT4KLSAgICAgICA8IS0tIFdlYiBFeHBvcnQgLS0+Ci0gICAgIDwhLS0gICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJleHBvcnQiCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuV2ViTW9kdWxlRXhwb3J0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgPG9yPgotICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIj4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICA8L2FuZD4gICAgICAKLSAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5pbXBsLldlYkFwcEltcGwiPgotICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+ICAgICAgCi0gICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJHcm91cEl0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4gICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L2NvbW1vbldpemFyZD4gLS0+Ci0gICAgICAgIDwhLS0gSW1wb3J0IENsYXNzZXMgV2l6YXJkIC0tPgotICAgICAgIDwhLS0gPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5DbGFzc2VzSW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPG9yPgotCSAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uaW1wbC5XZWJBcHBJbXBsIj4KLSAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPiAgCi0gICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViR3JvdXBJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+ICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+IC0tPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24KLSAgICBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmNsYXNzcGF0aENvbnRhaW5lclBhZ2UiPgotICAgIDxjbGFzc3BhdGhDb250YWluZXJQYWdlCi0gICAgICBuYW1lPSIld2ViYXBwLmNvbnRhaW5lci5uYW1lIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmNsYXNzcGF0aC5XZWJBcHBDb250YWluZXJQYWdlIgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5jb250YWluZXIiPgotICAgIDwvY2xhc3NwYXRoQ29udGFpbmVyUGFnZT4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLmV0b29scy5zZXJ2ZXIuY29yZS5tb2R1bGVPYmplY3RBZGFwdGVycyAtLT4KLTwhLS0gUHVycG9zZTogRGVmaW5lIGFkYXB0ZXJzIGZvciBXZWIgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMiPiAgCi0gICAgICAKLSAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2VicmVzb3VyY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPiAgICAgCi0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4gCi0gICAgICAKLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJyZXNvdXJjZTIiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4gICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZsZXQiLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgIAotICAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJyZXNvdXJjZTMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPiAgICAgCi0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4gICAgIAotICAgICAgIAotICAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2VicmVzb3VyY2U0IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2VicmVzb3VyY2U1IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ij4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIj4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4gCi0gICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZsZXQiPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotICAgICAgICAgIAotICAgPC9leHRlbnNpb24+ICAKLSAgCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgIExhYmVsIERlY29yYXRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIAotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgICAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgbGFiZWw9IiVzZXJ2bGV0QW5ub3RhdGlvbkRlY29yYXRvciIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS51dGlsLkFubm90YXRpb25JY29uRGVjb3JhdG9yIgotICAgICAgICAgICAgICAgc3RhdGU9InRydWUiCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iVE9QX0xFRlQiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkudXRpbC5Bbm5vdGF0aW9uSWNvbkRlY29yYXRvcl9zZXJ2bGV0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVzZXJ2bGV0QW5ub3RhdGlvbkRlY29yYXRvci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0Ij4KLSAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgIDwvZXh0ZW5zaW9uPiAKLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkIj4KLSAgCi0gICAgPHdpemFyZC1wYWdlcyBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iMi4yIj4KLSAgICAgIDxpbnN0YWxsPgotICAgICAgICA8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldC5XZWJGYWNldEluc3RhbGxQYWdlIi8+Ci0gICAgICA8L2luc3RhbGw+Ci0gICAgPC93aXphcmQtcGFnZXM+Ci0KLSAgICA8d2l6YXJkLXBhZ2VzIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjMiPgotICAgICAgPGluc3RhbGw+Ci0gICAgICAgIDxwYWdlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYkZhY2V0SW5zdGFsbFBhZ2UiLz4KLSAgICAgIDwvaW5zdGFsbD4KLSAgICA8L3dpemFyZC1wYWdlcz4KLQotICAgIDx3aXphcmQtcGFnZXMgZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IjIuNCI+Ci0gICAgICA8aW5zdGFsbD4KLSAgICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViRmFjZXRJbnN0YWxsUGFnZSIvPgotICAgICAgPC9pbnN0YWxsPgotICAgIDwvd2l6YXJkLXBhZ2VzPgotICAgIAotICA8L2V4dGVuc2lvbj4KLSAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0KLSAgICA8d2l6YXJkCi0gICAgICBuYW1lPSIld2ViLXByb2plY3Qtd2l6YXJkLW5hbWUiCi0gICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1pY29uLmdpZiIKLSAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QubmV3cHJvamVjdHMiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldC5XZWJQcm9qZWN0V2l6YXJkIgotICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQiPgotICAgICAgPGRlc2NyaXB0aW9uPiV3ZWItcHJvamVjdC13aXphcmQtZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICAgIDwvd2l6YXJkPgotICAgIAotICA8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wcm9wZXJ0eV9maWxlcy93ZWJfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcHJvcGVydHlfZmlsZXMvd2ViX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDdiYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wcm9wZXJ0eV9maWxlcy93ZWJfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0wPUZhaWxlZCB0byBmaW5kIHRoZSBpbWFnZSAiezB9Ii4KLTE9TmV3IER5bmFtaWMgV2ViIFByb2plY3QKLTI9U2VydmxldCB2ZXJzaW9uOgotMz1EeW5hbWljIFdlYiBQcm9qZWN0Ci00PUNyZWF0ZSBhIHN0YW5kYWxvbmUgRHluYW1pYyBXZWIgcHJvamVjdCBvciBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbi4KLTU9V2ViIHByb2plY3Q6Ci02PVdBUiBmaWxlOgotNz1JbXBvcnQgYSBXQVIgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbQotOD1XQVIgSW1wb3J0Ci05PVdBUiBFeHBvcnQKLTEwPUV4cG9ydCBXZWIgcHJvamVjdCB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0xMT1Db250ZXh0IFJvb3Q6Ci0xMj1Db252ZXJ0IFNpbXBsZSBXZWIgdG8gV2ViIE1vZHVsZQotMTM9Q29udmVydCBTaW1wbGUgV2ViIHRvIFdlYiBNb2R1bGUuCi0xND1XQVIgSW1wb3J0OiBXZWIgbGlicmFyaWVzCi0xNT1TZWxlY3QgdGhlIHdlYiBsaWJyYXJ5IGphcnMgZnJvbSB0aGUgbGlzdCBiZWxvdyB0byBiZSBpbXBvcnRlZCBhcyB3ZWIgbGlicmFyeSBwcm9qZWN0cy4gIFVuc2VsZWN0ZWQgd2ViIGxpYnJhcmllcyB3aWxsIGJlIGltcG9ydGVkIGFzIGphcnMgaW4gdGhlIFdFQi1JTkYvbGliIGRpcmVjdG9yeS4KLTE2PVNlbGVjdCBBbGwKLTE3PURlc2VsZWN0IEFsbAotCi1BRERfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFPUNyZWF0ZSBTZXJ2bGV0Ci1BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRT1DcmVhdGUgU2VydmxldAotQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQz1FbnRlciBzZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvciBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLQotREVGQVVMVF9QQUNLQUdFPShkZWZhdWx0IHBhY2thZ2UpCi1TRUxFQ1RfQ0xBU1NfVElUTEU9U2VsZWN0IENsYXNzCi1NQVBfQ0xBU1NfTkFNRV9UT19DTEFTU19FUlJPUl9NU0c9SVdBRTAwNjBFIENvdWxkIG5vdCB1bmlxdWVseSBtYXAgdGhlIGNsYXNzIG5hbWUgdG8gYSBjbGFzcy4KLUVNUFRZX0xJU1RfTVNHPUVtcHR5IExpc3QKLUFERF9MQUJFTD1BZGQKLVVTRV9FWElTVElOR19TRVJWTEVUX0NMQVNTPVVzZSBleGlzdGluZyBTZXJ2bGV0IGNsYXNzCi1JTklUX1BBUkFNX0xBQkVMPUluaXRpYWxpemF0aW9uIFBhcmFtZXRlcnM6Ci1VUkxfTUFQUElOR1NfTEFCRUw9VVJMIE1hcHBpbmdzOgotQ0hPT1NFX1NFUlZMRVRfQ0xBU1M9Q2hvb3NlIGEgc2VydmxldCBjbGFzcwotCi1ORVdfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFPU5ldyBTZXJ2bGV0Ci1ORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRT1TZXJ2bGV0Ci1ORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDPUNyZWF0ZSBhIG5ldyBzZXJ2bGV0LgotU0VSVkxFVF9QQUNLQUdFX0xBQkVMPUphdmEgcGFja2FnZToKLVNFUlZMRVRfTkFNRV9MQUJFTD1TZXJ2bGV0IG5hbWU6Ci0KLUFERF9CVVRUT05fTEFCRUw9QWRkLi4uCi1SRU1PVkVfQlVUVE9OX0xBQkVMPVJlbW92ZQotVVJMX1BBVFRFUk5fVElUTEU9VVJMIFBhdHRlcm5zCi1VUkxfUEFUVEVSTl9MQUJFTD1QYXR0ZXJuOgotRk9MREVSX0xBQkVMPUZvbGRlcjoKLUpBVkFfUEFDS0FHRV9MQUJFTD1KYXZhIHBhY2thZ2U6Ci1DTEFTU19OQU1FX0xBQkVMPUNsYXNzIG5hbWU6Ci1TVVBFUkNMQVNTX0xBQkVMPVN1cGVyY2xhc3M6Ci1DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1Db250YWluZXIgU2VsZWN0aW9uCi1DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19ERVNDPUNob29zZSBhIENvbnRhaW5lcjoKLUNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHPUNob29zZSB0aGUgV2ViIENvbnRlbnQgRm9sZGVyIG9yIGl0cyBzdWJmb2xkZXIKLVBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1QYWNrYWdlIFNlbGVjdGlvbgotUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGEgcGFja2FnZToKLVBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORT1ObyBwYWNrYWdlcyB0byBjaG9vc2UgZnJvbQotU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX1RJVExFPVN1cGVyY2xhc3MgU2VsZWN0aW9uCi1TVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfREVTQz1DaG9vc2UgYSBzdXBlcmNsYXNzOgotSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9SW50ZXJmYWNlIFNlbGVjdGlvbgotSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfREVTQz1DaG9vc2UgaW50ZXJmYWNlczoKLUlOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FPScnezB9JycgYWRkZWQuCi1KQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTD1Nb2RpZmllcnM6Ci1KQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTD1QdWJsaWMKLUpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUw9QWJzdHJhY3QKLUpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUw9RmluYWwKLUpBVkFfQ0xBU1NfSU5URVJGQUNFU19MQUJFTD1JbnRlcmZhY2VzOgotSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUw9V2hpY2ggbWV0aG9kIHN0dWJzIHdvdWxkIHlvdSBsaWtlIHRvIGNyZWF0ZT8KLUpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTD1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTD1Db25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzCi1KQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUw9SW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZHMKLUpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19USVRMRT1KYXZhIENsYXNzIEJyb3dzZXIKLUpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19NRVNTQUdFPUJyb3dzZSBmb3IgYSBKYXZhIGNsYXNzCi0KLU5BTUVfTEFCRUw9TmFtZQotREVTQ1JJUFRJT05fTEFCRUw9RGVzY3JpcHRpb24KLVZBTFVFX0xBQkVMPVZhbHVlCi1CUk9XU0VfQlVUVE9OX0xBQkVMPUJyb3dzZS4uLgotUkVNT1ZFX0JVVFRPTj1SZW1vdmUKLQotTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQz1TcGVjaWZpeSBjbGFzcyBmaWxlIGRlc3RpbmF0aW9uLgotTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDPVNwZWNpZnkgbW9kaWZpZXJzLCBpbnRlcmZhY2VzIHRvIGltcGxlbWVudCwgYW5kIG1ldGhvZCBzdHVicyB0byBnZW5lcmF0ZS4KLQotSW1wb3J0V0FSQWN0aW9uX1VJXz1JbXBvcnQgV2ViIE1vZHVsZS4uLgotRXhwb3J0V0FSQWN0aW9uX1VJXz1FeHBvcnQgV0FSIGZpbGUuLi4KLQotTk9fV0VCX1BST0pFQ1RTPU5vIFdlYiBQcm9qZWN0cwotCi1TRVJWTEVUUyA9U2VydmxldHMKLQotV0VCX0NPTlRfTkFNRSA9IFdlYkFwcENvbnRhaW5lclBhZ2UKLVdFQl9DT05UX1BBR0VfVElUTEUgPSBXZWIgQXBwIExpYnJhcmllcyBDb250YWluZXIKLVdFQl9DT05UX1BBR0VfREVTQ1JJUFRJT04gPSBUaGlzIGNvbnRhaW5lciBkeW5hbWljYWxseSBwb3B1bGF0ZXMgY2xhc3NwYXRoIGVudHJpZXMgZnJvbSB0aGUgV0VCLUlORi9saWIgYW5kIFdFQi1JTkYvY2xhc3NlcyBkaXJlY3RvcmllcyBvZiBhIHdlYiBhcHAuCi1XRUJfQ09OVF9QQUdFX0NPTVBfTEFCRUwgPSBDb21wb25lbnQ6Ci1XRUJDT05URU5UPVdlYiBDb250ZW50IGZvbGRlcjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9JV2ViVUlDb250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvSVdlYlVJQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmIzZmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9JV2ViVUlDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlVJQ29udGV4dElkcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fU0VSVkxFVF9VSSA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX1NFUlZMRVRfUEFHRV9BRERfU0VSVkxFVF9XSVpBUkRfMSA9IFBMVUdJTl9TRVJWTEVUX1VJICsgInNydncxMDUwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9TRVJWTEVUX1BBR0VfQUREX1NFUlZMRVRfV0laQVJEXzIgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJzcnZ3MTEwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfU0VSVkxFVF9QQUdFX0FERF9TRVJWTEVUX1dJWkFSRF8zID0gUExVR0lOX1NFUlZMRVRfVUkgKyAic3J2dzEyMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzRlNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2FjdGlvbnMvQ29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLXB1YmxpYyBjbGFzcyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uIHsKLQotCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb24gPSBudWxsOwotCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCUlXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotCS8qKgotCSAqIENvbnZlcnRMaW5rc0RpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIENsYXNzW10gYWNjZXB0ZWRUeXBlcykgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBhY2NlcHRlZFR5cGVzLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZCBjcmVhdGVXaXphcmQoKSB7Ci0gICAgICAgIC8vVE9ETzogcmVpbXBsZW1lbnQKLS8qCQlDb252ZXJ0VG9XZWJDb21wb25lbnRUeXBlV2l6YXJkIHdpemFyZCA9IG5ldyBDb252ZXJ0VG9XZWJDb21wb25lbnRUeXBlV2l6YXJkKG5ldyBDb252ZXJ0V2ViUHJvamVjdERhdGFNb2RlbCgpKTsKLQkJV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgbW9kZWwgPSAoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwpIHdpemFyZC5nZXRNb2RlbCgpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShFZGl0TW9kZWxPcGVyYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUiwgdHJ1ZSk7Ci0KLQkJU3RhdGljV2ViTmF0dXJlUnVudGltZSBuYXR1cmU7Ci0JCXRyeSB7Ci0JCQluYXR1cmUgPSAoU3RhdGljV2ViTmF0dXJlUnVudGltZSkgcHJvamVjdC5nZXROYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5TVEFUSUNfTkFUVVJFX0lEKTsKLQkJCVN0cmluZyB3ZWJDb250ZW50ID0gbmF0dXJlLmdldFJvb3RQdWJsaXNoYWJsZUZvbGRlcigpLmdldE5hbWUoKTsKLQkJCVN0cmluZyBjb250ZXh0Um9vdCA9IG5hdHVyZS5nZXRDb250ZXh0Um9vdCgpOwotCQkJLy9tb2RlbC5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5XRUJfQ09OVEVOVCwgd2ViQ29udGVudCk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5DT05URVhUX1JPT1QsIGNvbnRleHRSb290KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQkvLyB3aXphcmQuc2V0V2luZG93VGl0bGUoIkNvbnZlcnQgdG8gRHluYW1pYyBXZWIgUHJvamVjdCIpOwotCi0JCXJldHVybiB3aXphcmQ7Ki8KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogbWFrZSBzdXJlIGEgd2ViIHByb2plY3QgaXMgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZFByb2plY3QoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhdGljV2ViUHJvamVjdChhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIGJFbmFibGUgPSBmYWxzZTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQliRW5hYmxlID0gdmFsaWRhdGVTZWxlY3RlZChmU2VsZWN0aW9uKTsKLQkJfQotCQkoKEFjdGlvbikgYWN0aW9uKS5zZXRFbmFibGVkKGJFbmFibGUpOwotCX0KLQotCS8qKgotCSAqIHNlbGVjdGlvbkNoYW5nZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZWxlY3RlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZlNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCU9iamVjdCBzZWxlY3RlZFByb2plY3QgPSBmU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoIShzZWxlY3RlZFByb2plY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcHJvamVjdCA9IChJUHJvamVjdCkgc2VsZWN0ZWRQcm9qZWN0OwotCQlyZXR1cm4gaXNWYWxpZFByb2plY3QocHJvamVjdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dlYkNvbXBvbmVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2ViQ29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDVkZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2ViQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotcHVibGljIGNsYXNzIE5ld1dlYkNvbXBvbmVudEFjdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLldFQl9NT0RVTEVfV0laX1RJVExFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gIndhcl93aXoiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIE5ld1dlYkNvbXBvbmVudEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChMQUJFTCk7IAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQkKLQlwdWJsaWMgTmV3V2ViQ29tcG9uZW50QWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIENsYXNzW10gYWN0aXZhdGVkT25UeXBlcywgYm9vbGVhbiBhY2NlcHRFbXB0eVNlbGVjdGlvbikgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBhY3RpdmF0ZWRPblR5cGVzLCBhY2NlcHRFbXB0eVNlbGVjdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCQotCXB1YmxpYyBOZXdXZWJDb21wb25lbnRBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBhY2NlcHRFbXB0eVNlbGVjdGlvbikgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBhY2NlcHRFbXB0eVNlbGVjdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZCBjcmVhdGVXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWNjZXB0RWxlbWVudChPYmplY3Qgb2JqKSB7IAotCQlyZXR1cm4gdHJ1ZTsgLyogTmV3R3JvdXAuaXNPbkJ1aWxkUGF0aChvYmopICYmICFOZXdHcm91cC5pc0luQXJjaGl2ZShvYmopOyAqLwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1RleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9jbGFzc3BhdGgvV2ViQXBwQ29udGFpbmVyUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2NsYXNzcGF0aC9XZWJBcHBDb250YWluZXJQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGI3YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2NsYXNzcGF0aC9XZWJBcHBDb250YWluZXJQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmNsYXNzcGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5JQ2xhc3NwYXRoQ29udGFpbmVyUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5JQ2xhc3NwYXRoQ29udGFpbmVyUGFnZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdFbGVtZW50V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY2xhc3NwYXRoLldlYkFwcENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgV2ViQXBwQ29udGFpbmVyUGFnZSAKLQotICAgIGV4dGVuZHMgTmV3RWxlbWVudFdpemFyZFBhZ2UgCi0gICAgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSwgSUNsYXNzcGF0aENvbnRhaW5lclBhZ2VFeHRlbnNpb24gCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGpwcm9qZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIGNvbXBvbmVudDsKLSAgICBwcml2YXRlIExhYmVsIGNvbXBvbmVudExhYmVsOwotICAgIHByaXZhdGUgQ29tYm8gY29tcG9uZW50Q29tYm87Ci0gICAgCi0gICAgcHVibGljIFdlYkFwcENvbnRhaW5lclBhZ2UoKSAKLSAgICB7Ci0gICAgICAgIHN1cGVyKCByZXNvdXJjZSggIldFQl9DT05UX05BTUUiICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgc2V0VGl0bGUoIHJlc291cmNlKCAiV0VCX0NPTlRfUEFHRV9USVRMRSIgKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERlc2NyaXB0aW9uKCByZXNvdXJjZSggIldFQl9DT05UX1BBR0VfREVTQ1JJUFRJT04iICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgLy8gVE9ETzogUmVwbGFjZSB3aXRoIGEgY3VzdG9tIGltYWdlLgotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoIEphdmFQbHVnaW5JbWFnZXMuREVTQ19XSVpCQU5fQUREX0xJQlJBUlkgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCBmaW5hbCBJSmF2YVByb2plY3QgYUpwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNwICkKLSAgICB7Ci0gICAgICAgIHRoaXMuanByb2plY3QgPSBhSnByb2plY3Q7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IGFKcHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0U2VsZWN0aW9uKCkgCi0gICAgewotICAgICAgICBmaW5hbCBpbnQgc2VsID0gdGhpcy5jb21wb25lbnRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgY21wID0gdGhpcy5jb21wb25lbnRDb21iby5nZXRJdGVtKCBzZWwgKS50cmltKCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gV2ViQXBwQ29udGFpbmVyLmNvbnZlcnQoIGNtcCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbiggZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSApIAotICAgIHsKLSAgICAgICAgaWYoIGNwZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IFdlYkFwcENvbnRhaW5lci5jb252ZXJ0KCBjcGUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCApIAotICAgIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dCggbmV3IEdyaWRMYXlvdXQoIDEsIGZhbHNlICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29tcG9uZW50TGFiZWwgPSBuZXcgTGFiZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLSAgICAgICAgdGhpcy5jb21wb25lbnRMYWJlbC5zZXRUZXh0KCByZXNvdXJjZSggIldFQl9DT05UX1BBR0VfQ09NUF9MQUJFTCIgKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICB0aGlzLmNvbXBvbmVudENvbWJvID0gbmV3IENvbWJvKCBjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3QgY29tcG9uZW50cyA9IGNvbXBvbmVudHMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gY29tcG9uZW50cy5zaXplKCk7IGkgPCBuOyBpKysgICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNtcCA9IChTdHJpbmcpIGNvbXBvbmVudHMuZ2V0KCBpICk7Ci0gICAgICAgICAgICB0aGlzLmNvbXBvbmVudENvbWJvLmFkZCggY21wICsgIiAgICAgICAgIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLmNvbXBvbmVudCAhPSBudWxsICYmIHRoaXMuY29tcG9uZW50LmVxdWFscyggY21wICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50Q29tYm8uc2VsZWN0KCBpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNldENvbnRyb2woIGNvbXBvc2l0ZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gLTE7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdCBjb21wb25lbnRzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3QgdXNlZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IHRoaXMuanByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBjcFsgaSBdOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBXZWJBcHBDb250YWluZXIuY2hlY2soIGNwZSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVzZWQuYWRkKCBXZWJBcHBDb250YWluZXIuY29udmVydCggY3BlICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEphdmFNb2RlbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIHRoaXMuCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3QgcmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0gICAgICAgIAotICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgdmMgPSBjb21wb25lbnQ7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY21wID0gdmMuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUT0RPOiBSZS1lbmFibGUgdGhpcyBjaGVjayB3aGVuIGdldENvbXBvbmVudFR5cGVJZCgpIGlzIGltcGxlbWVudGVkLgotICAgICAgICAgICAgLy9pZiggdmMuZ2V0Q29tcG9uZW50VHlwZUlkKCkuZXF1YWxzKCAianN0LndlYiIgKSApCi0gICAgICAgICAgICBpZiggKCB0aGlzLmNvbXBvbmVudCAhPSBudWxsICYmIHRoaXMuY29tcG9uZW50LmVxdWFscyggY21wICkgKSB8fAotICAgICAgICAgICAgICAgICEgdXNlZC5jb250YWlucyggdmMuZ2V0TmFtZSgpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlcy5hZGQoIHZjLmdldE5hbWUoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXNvdXJjZSggZmluYWwgU3RyaW5nIGtleSApCi0gICAgewotICAgICAgICByZXR1cm4gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygga2V5ICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWY0YzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtJTGF1bmNoYWJsZS5jbGFzc307Ci0JfQotCi0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFdlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuZ2V0TW9kdWxlT2JqZWN0KG9iaik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvcGx1Z2luL1NlcnZsZXRVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3BsdWdpbi9TZXJ2bGV0VUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjZGZkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvcGx1Z2luL1NlcnZsZXRVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSI7IC8vJE5PTi1OTFMtMSQKLQkvLwlUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFNlcnZsZXRVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZXJ2bGV0VUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZsZXRVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9wbHVnaW4vV0VCVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3BsdWdpbi9XRUJVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTY0OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3BsdWdpbi9XRUJVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLk1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBXRUJVSU1lc3NhZ2VzIGV4dGVuZHMgTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfTE9BRF9FUlJPUiA9ICIwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEVfV0laX1RJVExFID0gIjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1ZFUlNJT05fTEJMID0gIjIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BST0pFQ1RfTUFJTl9QR19USVRMRSA9ICIzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QUk9KRUNUX01BSU5fUEdfREVTQyA9ICI0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9QUk9KRUNUX0xCTCA9ICI1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9GSUxFX0xCTCA9ICI2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTVBPUlRfTUFJTl9QR19ERVNDID0gIjciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lNUE9SVF9NQUlOX1BHX1RJVExFID0gIjgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0VYUE9SVF9NQUlOX1BHX1RJVExFID0gIjkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0VYUE9SVF9NQUlOX1BHX0RFU0MgPSAiMTAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lNUE9SVF9DT05URVhUX1JPT1QgPSAiMTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlZFUlRfTUFJTl9QR19ERVNDID0gIjEyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05WRVJUX01BSU5fUEdfVElUTEUgPSAiMTMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lNUE9SVF9XRUJfTElCX1BHX1RJVExFID0gIjE0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTVBPUlRfV0VCX0xJQl9QR19ERVNDID0gIjE1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9JTVBPUlRfU0VMRUNUX0FMTF9MSUJTX0JVVFRPTiA9ICIxNiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfSU1QT1JUX0RFU0VMRUNUX0FMTF9MSUJTX0JVVFRPTiA9ICIxNyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJDT05URU5UPSJXRUJDT05URU5UIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXRUJVSU1lc3NhZ2VzIElOU1RBTkNFID0gbmV3IFdFQlVJTWVzc2FnZXMoKTsKLQotCi0JcHJpdmF0ZSBXRUJVSU1lc3NhZ2VzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBJTlNUQU5DRS5kb0dldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gSU5TVEFOQ0UuZG9HZXRSZXNvdXJjZVN0cmluZyhrZXksIGFyZ3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLk1lc3NhZ2VzI2luaXRpYWxpemVCdW5kbGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgid2ViX3VpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCS8vIERvIG5vdGhpbmcKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkU2VydmxldFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YWY0ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiBOZXcgc2VydmxldCB3aXphcmQKLSAqLwotcHVibGljIGNsYXNzIEFkZFNlcnZsZXRXaXphcmQgZXh0ZW5kcyBOZXdXZWJXaXphcmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX09ORSA9ICJwYWdlT25lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1RXTyA9ICJwYWdlVHdvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1RIUkVFID0gInBhZ2VUaHJlZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgQWRkU2VydmxldFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJc2V0V2luZG93VGl0bGUoSVdlYldpemFyZENvbnN0YW50cy5BRERfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoIm5ld3NlcnZsZXRfd2l6IikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBBZGRTZXJ2bGV0V2l6YXJkKCkgewotCSAgICB0aGlzKG51bGwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQkKLQkJTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZSBwYWdlMSA9IG5ldyBOZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlKAotCQkJCWdldERhdGFNb2RlbCgpLCAKLQkJCQlQQUdFX09ORSwKLQkJCQlJV2ViV2l6YXJkQ29uc3RhbnRzLk5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0MsCi0JCQkJSVdlYldpemFyZENvbnN0YW50cy5BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRSwgSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIpOwotCQlwYWdlMS5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfU0VSVkxFVF9QQUdFX0FERF9TRVJWTEVUX1dJWkFSRF8yKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0JCUFkZFNlcnZsZXRXaXphcmRQYWdlIHBhZ2UyID0gbmV3IEFkZFNlcnZsZXRXaXphcmRQYWdlKGdldERhdGFNb2RlbCgpLCBQQUdFX1RXTyk7Ci0JCXBhZ2UyLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9TRVJWTEVUX1BBR0VfQUREX1NFUlZMRVRfV0laQVJEXzEpOwotCQlhZGRQYWdlKHBhZ2UyKTsKLQkJTmV3U2VydmxldENsYXNzT3B0aW9uc1dpemFyZFBhZ2UgcGFnZTMgPSBuZXcgTmV3U2VydmxldENsYXNzT3B0aW9uc1dpemFyZFBhZ2UoCi0JCQkJZ2V0RGF0YU1vZGVsKCksIAotCQkJCVBBR0VfVEhSRUUsCi0JCQkJSVdlYldpemFyZENvbnN0YW50cy5ORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0MsCi0JCQkJSVdlYldpemFyZENvbnN0YW50cy5BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRSk7Ci0JCXBhZ2UzLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9TRVJWTEVUX1BBR0VfQUREX1NFUlZMRVRfV0laQVJEXzMpOwotCQlhZGRQYWdlKHBhZ2UzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWkud2l6YXJkLldUUFdpemFyZCNydW5Gb3JrZWQoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJ1bkZvcmtlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBnZXREYXRhTW9kZWwoKS5pc1ZhbGlkKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvL29wZW4gbmV3IHNlcnZsZXQgY2xhc3MgaW4gamF2YSBlZGl0b3IKLQkJV2ViQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5RVUFMSUZJRURfQ0xBU1NfTkFNRSk7Ci0JCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHApOwotCQkJYXJ0aWZhY3RFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gYXJ0aWZhY3RFZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJamF2YUNsYXNzID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGNsYXNzTmFtZSxyZXNvdXJjZVNldCk7Ci0JCQlKMkVFRWRpdG9yVXRpbGl0eS5vcGVuSW5FZGl0b3IoamF2YUNsYXNzLCBwICk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjYW50T3BlbikgewotCQkJY2FudE9wZW4ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYXJ0aWZhY3RFZGl0IT1udWxsKQotCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCX0JCi0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjE2M2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkU2VydmxldFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogU2VydmxldCBXaXphcmQgU2V0dGluZyBQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRTZXJ2bGV0V2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCWZpbmFsIHN0YXRpYyBTdHJpbmdbXSBKU1BFWFRFTlNJT05TID0geyJqc3AifTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGRpc3BsYXlOYW1lVGV4dDsKLQotCXByaXZhdGUgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24gdXJsU2VjdGlvbjsKLQotCXB1YmxpYyBBZGRTZXJ2bGV0V2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oSVdlYldpemFyZENvbnN0YW50cy5BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDKTsKLQkJdGhpcy5zZXRUaXRsZShJV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUX1BBUkFNLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VUkxfTUFQUElOR1N9OwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlTmFtZURlc2NyaXB0aW9uKGNvbXBvc2l0ZSk7Ci0JCW5ldyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbihjb21wb3NpdGUsIElXZWJXaXphcmRDb25zdGFudHMuSU5JVF9QQVJBTV9MQUJFTCwgSVdlYldpemFyZENvbnN0YW50cy5BRERfQlVUVE9OX0xBQkVMLAotCQkJCUlXZWJXaXphcmRDb25zdGFudHMuUkVNT1ZFX0JVVFRPTl9MQUJFTCwgbmV3IFN0cmluZ1tde0lXZWJXaXphcmRDb25zdGFudHMuTkFNRV9MQUJFTCwgSVdlYldpemFyZENvbnN0YW50cy5WQUxVRV9MQUJFTCwgSVdlYldpemFyZENvbnN0YW50cy5ERVNDUklQVElPTl9MQUJFTH0sIG51bGwsLy8gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiaW5pdGlhbGl6X3BhcmFtZXRlciIpLAotCQkJCW1vZGVsLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUX1BBUkFNKTsKLQkJdXJsU2VjdGlvbiA9IG5ldyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbihjb21wb3NpdGUsIElXZWJXaXphcmRDb25zdGFudHMuVVJMX01BUFBJTkdTX0xBQkVMLCBJV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9CVVRUT05fTEFCRUwsIElXZWJXaXphcmRDb25zdGFudHMuUkVNT1ZFX0JVVFRPTl9MQUJFTCwKLQkJCQluZXcgU3RyaW5nW117SVdlYldpemFyZENvbnN0YW50cy5VUkxfUEFUVEVSTl9MQUJFTH0sIG51bGwsLy8gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgidXJsX3R5cGUiKSwKLQkJCQltb2RlbCwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVJMX01BUFBJTkdTKTsKLQkJU3RyaW5nIHRleHQgPSBkaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCQkvLyBTZXQgZGVmYXVsdCBVUkwgUGF0dGVybgotCQlMaXN0IGlucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnB1dC5hZGQobmV3IFN0cmluZ1tdeyIvIiArIHRleHR9KTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsU2VjdGlvbiAhPSBudWxsKQotCQkJdXJsU2VjdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0JCWRpc3BsYXlOYW1lVGV4dC5zZXRGb2N1cygpOwotCi0JCUlTdGF0dXMgcHJvamVjdFN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdE5hbWUoKTsKLQkJaWYgKCFwcm9qZWN0U3RhdHVzLmlzT0soKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKHByb2plY3RTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCWNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdE5hbWUoKSB7Ci0JCS8vIGNoZWNrIGZvciBlbXB0eQotCQlpZiAobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSA9PSBudWxsIHx8IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoSVdlYldpemFyZENvbnN0YW50cy5OT19XRUJfUFJPSkVDVFMpOwotCQl9Ci0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5hbWVEZXNjcmlwdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJLy8gZGlzcGxheSBuYW1lCi0JCUxhYmVsIGRpc3BsYXlOYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRpc3BsYXlOYW1lTGFiZWwuc2V0VGV4dChJV2ViV2l6YXJkQ29uc3RhbnRzLk5BTUVfTEFCRUwpOwotCQlkaXNwbGF5TmFtZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWRpc3BsYXlOYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlkaXNwbGF5TmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRpc3BsYXlOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGRpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQkJLy8gU2V0IGRlZmF1bHQgVVJMIFBhdHRlcm4KLQkJCQlMaXN0IGlucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlucHV0LmFkZChuZXcgU3RyaW5nW117Ii8iICsgdGV4dH0pOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHVybFNlY3Rpb24gIT0gbnVsbCkKLQkJCQkJdXJsU2VjdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChkaXNwbGF5TmFtZVRleHQsIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRSwgbnVsbCk7Ci0KLQkJLy8gZGVzY3JpcHRpb24KLQkJTGFiZWwgZGVzY0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlkZXNjTGFiZWwuc2V0VGV4dChJV2ViV2l6YXJkQ29uc3RhbnRzLkRFU0NSSVBUSU9OX0xBQkVMKTsKLQkJZGVzY0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCVRleHQgZGVzY1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZGVzY1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChkZXNjVGV4dCwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTQ1JJUFRJT04sIG51bGwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZVdlYkxpYlByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZVdlYkxpYlByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzI0ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVXZWJMaWJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BdmFpbGFibGVKYXJzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIoKSB7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFdBUkZpbGUpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gKChXQVJGaWxlKSBpbnB1dEVsZW1lbnQpLmdldExpYkFyY2hpdmVzKCkudG9BcnJheSgpOwotCQkJQXJyYXlzLnNvcnQoYXJyYXksIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlyZXR1cm4gZ2V0Q29sdW1uVGV4dChvMSwgMCkuY29tcGFyZVRvKGdldENvbHVtblRleHQobzIsIDApKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBBdmFpbGFibGVKYXJzUHJvdmlkZXIuZ2V0VXRpbEltYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJRmlsZSBmaWxlID0gKEZpbGUpIGVsZW1lbnQ7Ci0JCXJldHVybiBmaWxlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0NvbnZlcnRUb1dlYkNvbXBvbmVudFR5cGVXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQ29udmVydFRvV2ViQ29tcG9uZW50VHlwZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODEwOTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQ29udmVydFRvV2ViQ29tcG9uZW50VHlwZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wdWJsaWMgY2xhc3MgQ29udmVydFRvV2ViQ29tcG9uZW50VHlwZVdpemFyZCBleHRlbmRzIFdlYkNvbXBvbmVudENyZWF0aW9uV2l6YXJkIHsKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlV2l6YXJkID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5jb252ZXJ0V2ViUHJvamVjdFR5cGVXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ29udmVydFRvV2ViQ29tcG9uZW50VHlwZVdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQkvLyBUT0RPIHVzZSBmbGV4aWJsZSBwcm9qZWN0Ci0JCS8vc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCS8vVE9ETyB1c2UgZmxleGlibGUgcHJvamVjdAotCQkvL2FkZFBhZ2UobmV3IENvbnZlcnRUb1dlYk1vZHVsZVR5cGVXaXphcmRQYWdlKChXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbCkgbW9kZWwsIFBBR0VfT05FKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC53ZWIudWkud2l6YXJkLldFQlByb2plY3RXaXphcmQjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0luaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKFdFQlVJTWVzc2FnZXMuV0VCX0NPTlZFUlRfTUFJTl9QR19USVRMRSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC51aS53aXphcmQuV1RQV2l6YXJkI3ByZVBlcmZvcm1GaW5pc2goKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZVBlcmZvcm1GaW5pc2goKSB7Ci0vKgkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjOwotCQl0cnkgewotCQkJLy9kZXNjID0gKChXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCkgbW9kZWwpLmdldFRhcmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpOwotCQkJLy9kZXNjLnNldEJ1aWxkU3BlYyhuZXcgSUNvbW1hbmRbMF0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIucHJlUGVyZm9ybUZpbmlzaCgpOyovCi0gICAgICAgIHJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0NvbnZlcnRUb1dlYkNvbXBvbmVudFR5cGVXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0NvbnZlcnRUb1dlYkNvbXBvbmVudFR5cGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Mzg5MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9Db252ZXJ0VG9XZWJDb21wb25lbnRUeXBlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb252ZXJ0VG9XZWJDb21wb25lbnRUeXBlV2l6YXJkUGFnZSBleHRlbmRzIFdlYkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udmVydFRvV2ViQ29tcG9uZW50VHlwZVdpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCS8vIFRPRE8gdXNlIGZsZXhpYmxlIHByb2plY3QKLQkJLy9zdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbihXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKFdFQlVJTWVzc2FnZXMuV0VCX0NPTlZFUlRfTUFJTl9QR19ERVNDKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhXRUJVSU1lc3NhZ2VzLldFQl9DT05WRVJUX01BSU5fUEdfVElUTEUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53dHAuajJlZS51aS53aXphcmQuSjJFRVByb2plY3RDcmVhdGlvblBhZ2UjY3JlYXRlUHJvamVjdE5hbWVHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdE5hbWVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vc3VwZXIuY3JlYXRlUHJvamVjdE5hbWVHcm91cChwYXJlbnQpOwotCQkvLyBwcm9qZWN0TmFtZUdyb3VwLnByb2plY3ROYW1lRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvSVdlYldpemFyZENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9JV2ViV2l6YXJkQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDQ1YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9JV2ViV2l6YXJkQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYldpemFyZENvbnN0YW50cyB7Ci0JCi0JLy8gQWRkU2VydmxldFdpemFyZAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBRERfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRSA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1BBQ0tBR0UgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERUZBVUxUX1BBQ0tBR0UiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFTEVDVF9DTEFTU19USVRMRSA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlNFTEVDVF9DTEFTU19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFQX0NMQVNTX05BTUVfVE9fQ0xBU1NfRVJST1JfTVNHID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTUFQX0NMQVNTX05BTUVfVE9fQ0xBU1NfRVJST1JfTVNHIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTVBUWV9MSVNUX01TRyA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVNUFRZX0xJU1RfTVNHIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBRERfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRV9FWElTVElOR19TRVJWTEVUX0NMQVNTID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiVVNFX0VYSVNUSU5HX1NFUlZMRVRfQ0xBU1MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOSVRfUEFSQU1fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJTklUX1BBUkFNX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfTUFQUElOR1NfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJVUkxfTUFQUElOR1NfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENIT09TRV9TRVJWTEVUX0NMQVNTID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ0hPT1NFX1NFUlZMRVRfQ0xBU1MiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8vIE5ld1NlcnZsZXRXaXphcmQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBORVdfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTkVXX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQyA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5FV19TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfUEFDS0FHRV9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlNFUlZMRVRfUEFDS0FHRV9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9OQU1FX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiU0VSVkxFVF9OQU1FX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8vIGNvbW1vbgotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9CVVRUT05fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBRERfQlVUVE9OX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRU1PVkVfQlVUVE9OX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUkVNT1ZFX0JVVFRPTl9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX1BBVFRFUk5fVElUTEUgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJVUkxfUEFUVEVSTl9USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX1BBVFRFUk5fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJVUkxfUEFUVEVSTl9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9MREVSX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRk9MREVSX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX1BBQ0tBR0VfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKQVZBX1BBQ0tBR0VfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDTEFTU19OQU1FX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiU1VQRVJDTEFTU19MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfREVTQyA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0ciKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfREVTQyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORSA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIklOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTCA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfTU9ESUZJRVJTX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfUFVCTElDX0NIRUNLQk9YX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19QVUJMSUNfQ0hFQ0tCT1hfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX0FCU1RSQUNUX0NIRUNLQk9YX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0ZJTkFMX0NIRUNLQk9YX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19NRVNTQUdFID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19CUk9XRVJfRElBTE9HX01FU1NBR0UiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJOQU1FX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERVNDUklQVElPTl9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFU0NSSVBUSU9OX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxVRV9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlZBTFVFX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJST1dTRV9CVVRUT05fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJCUk9XU0VfQlVUVE9OX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQlVUVE9OID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUkVNT1ZFX0JVVFRPTiIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQyA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQyA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQyIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSW1wb3J0V0FSQWN0aW9uX1VJXyA9IFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkltcG9ydFdBUkFjdGlvbl9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEV4cG9ydFdBUkFjdGlvbl9VSV8gPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFeHBvcnRXQVJBY3Rpb25fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT19XRUJfUFJPSkVDVFMgPSBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJOT19XRUJfUFJPSkVDVFMiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRTID0gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiU0VSVkxFVFMiKTsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5ZWMxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL011bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotLyoqCi0gKiAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuZGlhbG9ncy5TdGF0dXNJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS51dGlsLlN0cmluZ01hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR3b0FycmF5UXVpY2tTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5UeXBlZEZpbGVWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNy8zMC8yMDAxIDExOjE2OjM2IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYWNrYWdlUmVuZGVyZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJbWFnZSBQQUNLQUdFX0lDT04gPSBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19PQkpTX1BBQ0tBR0UpOwotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLQkJCVN0cmluZyBwID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYgKCIiLmVxdWFscyhwKSkgLy8kTk9OLU5MUy0xJAotCQkJCXAgPSBJV2ViV2l6YXJkQ29uc3RhbnRzLkRFRkFVTFRfUEFDS0FHRTsKLQkJCXJldHVybiAocCArICIgLSAiICsgdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBQQUNLQUdFX0lDT047Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlUmVuZGVyZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJbWFnZSBDTEFTU19JQ09OID0gSmF2YVBsdWdpbkltYWdlcy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfT0JKU19DTEFTUyk7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlJVHlwZSBlID0gKChJVHlwZSkgZWxlbWVudCk7Ci0JCQlyZXR1cm4gZS5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gQ0xBU1NfSUNPTjsKLQkJfQotCi0JfQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEpTUCA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VSVkxFVCA9IDE7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmU2VydmxldEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZKU1BCdXR0b247Ci0JcHJvdGVjdGVkIGludCBmU2VsZWN0aW9uID0gLTE7Ci0JcHJvdGVjdGVkIFBhZ2VCb29rIGZQYWdlQm9vayA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbnRyb2wgZkpzcENvbnRyb2wgPSBudWxsOwotCXByb3RlY3RlZCBDb250cm9sIGZTZXJ2bGV0Q29udHJvbCA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBmQ2hpbGQgPSBudWxsOwotCS8vIGNvbnN0cnVjdGlvbiBwYXJhbWV0ZXJzCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZlJ1bm5hYmxlQ29udGV4dDsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZkVsZW1lbnRSZW5kZXJlcjsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZlF1YWxpZmllclJlbmRlcmVyOwotCXByaXZhdGUgT2JqZWN0W10gZkVsZW1lbnRzOwotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlQ2FzZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlVwcGVyTGlzdExhYmVsOwotCXByaXZhdGUgU3RyaW5nIGZMb3dlckxpc3RMYWJlbDsKLQkvLyBTV1Qgd2lkZ2V0cwotCXByaXZhdGUgVGFibGUgZlVwcGVyTGlzdDsKLQlwcml2YXRlIFRhYmxlIGZMb3dlckxpc3Q7Ci0JcHJvdGVjdGVkIFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBJVHlwZVtdIGZJVDsKLQlwcml2YXRlIFN0cmluZ1tdIGZSZW5kZXJlZFN0cmluZ3M7Ci0JcHJpdmF0ZSBpbnRbXSBmRWxlbWVudE1hcDsKLQlwcml2YXRlIEludGVnZXJbXSBmUXVhbGlmaWVyTWFwOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIGZMb2NhbFZhbGlkYXRvciA9IG51bGw7Ci0JLyoqCi0JICogTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gcGFyZW50IFNoZWxsCi0JICogQHBhcmFtIHRpdGxlIFN0cmluZwotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqIEBwYXJlbnQgZXh0ZW5zaW9ucyBTdHJpbmdbXQotCSAqIEBwYXJhbSBhbGxvd011bHRpcGxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBleHRlbnNpb25zLCBib29sZWFuIGFsbG93TXVsdGlwbGUsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgZXh0ZW5zaW9ucywgYWxsb3dNdWx0aXBsZSk7Ci0JCXNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7Ci0KLQkJaWYgKHRpdGxlID09IG51bGwpCi0JCQlzZXRUaXRsZShXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsZV9TZWxlY3Rpb25fVUlfIikpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQltZXNzYWdlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdF9hX2ZpbGVfX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JCXNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCXNldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCWFkZEZpbHRlcihuZXcgVHlwZWRGaWxlVmlld2VyRmlsdGVyKGV4dGVuc2lvbnMpKTsKLQkJZkxvY2FsVmFsaWRhdG9yID0gbmV3IFR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcihuZXcgQ2xhc3NbXSB7IElGaWxlLmNsYXNzIH0sIGFsbG93TXVsdGlwbGUpOwotCQlzZXRWYWxpZGF0b3IoZkxvY2FsVmFsaWRhdG9yKTsKLQkJU3RhdHVzSW5mbyBjdXJyU3RhdHVzID0gbmV3IFN0YXR1c0luZm8oKTsKLQkJY3VyclN0YXR1cy5zZXRPSygpOwotCQl1cGRhdGVTdGF0dXMoY3VyclN0YXR1cyk7Ci0JCWZFbGVtZW50UmVuZGVyZXIgPSBuZXcgVHlwZVJlbmRlcmVyKCk7Ci0JCWZRdWFsaWZpZXJSZW5kZXJlciA9IG5ldyBQYWNrYWdlUmVuZGVyZXIoKTsKLQkJZlJ1bm5hYmxlQ29udGV4dCA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCXRyeSB7Ci0JCQlJSmF2YUVsZW1lbnQgamVsZW0gPSBudWxsOwotCQkJSVByb2plY3QgcHJvaiA9IG51bGw7Ci0JCQlqZWxlbSA9IChJSmF2YUVsZW1lbnQpIHByb2plY3QuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpOwotCQkJaWYgKGplbGVtID09IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBwcm9qZWN0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlwcm9qID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQlpZiAocHJvaiAhPSBudWxsKSB7Ci0JCQkJCQlqZWxlbSA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlLmNyZWF0ZShwcm9qKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUlKYXZhUHJvamVjdCBqcCA9IGplbGVtLmdldEphdmFQcm9qZWN0KCk7Ci0KLQkJCUlUeXBlIHNlcnZsZXRUeXBlID0ganAuZmluZFR5cGUoImphdmF4LnNlcnZsZXQuU2VydmxldCIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBuZXh0IDMgbGluZXMgZml4IGRlZmVjdCAxNzc2ODYKLQkJCWlmIChzZXJ2bGV0VHlwZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlBcnJheUxpc3Qgc2VydmxldENsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJVHlwZUhpZXJhcmNoeSB0SCA9IHNlcnZsZXRUeXBlLm5ld1R5cGVIaWVyYXJjaHkoanAsIG51bGwpOwotCQkJSVR5cGVbXSB0eXBlcyA9IHRILmdldEFsbFN1YnR5cGVzKHNlcnZsZXRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZXNbaV0uaXNDbGFzcygpICYmICFzZXJ2bGV0Q2xhc3Nlcy5jb250YWlucyh0eXBlc1tpXSkpCi0JCQkJCXNlcnZsZXRDbGFzc2VzLmFkZCh0eXBlc1tpXSk7Ci0JCQl9Ci0JCQlmSVQgPSAoSVR5cGVbXSkgc2VydmxldENsYXNzZXMudG9BcnJheShuZXcgSVR5cGVbc2VydmxldENsYXNzZXMuc2l6ZSgpXSk7Ci0JCQlzZXJ2bGV0Q2xhc3NlcyA9IG51bGw7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Yyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHByaXZhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgewotCQlpZiAoZlNlbGVjdGlvbiA9PSBKU1ApIHsKLQkJCXN1cGVyLmNvbXB1dGVSZXN1bHQoKTsKLQkJfSBlbHNlIHsKLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGdldFdpZGdldFNlbGVjdGlvbigpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdF9DbGFzc19VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJTZWxlY3QgQ2xhc3MiCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvdWxkX25vdF91bmlxdWVseV9tYXBfdGhlX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCB1bmlxdWVseSBtYXAgdGhlIGNsYXNzIG5hbWUgdG8gYSBjbGFzcy4iCi0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkJCQkJc2V0UmVzdWx0KG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWphdmEudXRpbC5MaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJCXJlc3VsdC5hZGQodHlwZSk7Ci0JCQkJCXNldFJlc3VsdChyZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQlmVGV4dC5zZXRGb2N1cygpOwotCQlyZW1hdGNoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGlhbG9nJ3MgCi0JICogYnV0dG9uIGJhci4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QKLQkgKiBsYXlzIG91dCBhIGJ1dHRvbiBiYXIgYW5kIGNhbGxzIHRoZSA8Y29kZT5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyPC9jb2RlPgotCSAqIGZyYW1ld29yayBtZXRob2QgdG8gcG9wdWxhdGUgaXQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgYnV0dG9uIGJhcgotCSAqIEByZXR1cm4gdGhlIGJ1dHRvbiBiYXIgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0KLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUyID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQkvLyBjcmVhdGUgYSBsYXlvdXQgd2l0aCBzcGFjaW5nIGFuZCBtYXJnaW5zIGFwcHJvcHJpYXRlIGZvciB0aGUgZm9udCBzaXplLgotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDA7IC8vIHRoaXMgaXMgaW5jcmVtZW50ZWQgYnkgY3JlYXRlQnV0dG9uCi0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0KLQkJY29tcG9zaXRlMi5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJY29tcG9zaXRlMi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNvbXBvc2l0ZTIuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQkvLyBBZGQgdGhlIGJ1dHRvbnMgdG8gdGhlIGJ1dHRvbiBiYXIuCi0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoY29tcG9zaXRlMik7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoKLQkgKiBAcHJpdmF0ZQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCWZDaGlsZCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZkNoaWxkLCAiY29tLmlibS5ldG9vbHMud2ViYXBwbGljYXRpb25lZGl0LndlYngyMDEwIik7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsLm51bUNvbHVtbnMgPSAyOwotCQlnbC5tYXJnaW5IZWlnaHQgPSAwOwotCQlmQ2hpbGQuc2V0TGF5b3V0KGdsKTsKLQotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZkNoaWxkLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSB0aGUgV2ViIFR5cGUgcmFkaW8gYnV0dG9ucyBhbmQgdGV4dCBmaWVsZHMuCi0JCWZTZXJ2bGV0QnV0dG9uID0gbmV3IEJ1dHRvbihmQ2hpbGQsIFNXVC5SQURJTyk7Ci0JCWZTZXJ2bGV0QnV0dG9uLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlcnZsZXRfVUlfIikpOyAvLyROT04tTkxTLTEkID0gU2VydmxldAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlmU2VydmxldEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZlNlcnZsZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZkpTUEJ1dHRvbiA9IG5ldyBCdXR0b24oZkNoaWxkLCBTV1QuUkFESU8pOwotCQlmSlNQQnV0dG9uLnNldFRleHQoIkpTUCIpOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWZKU1BCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZKU1BCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJaWYgKGZTZWxlY3Rpb24gPT0gSlNQKQotCQkJZkpTUEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWVsc2UgewotCQkJZlNlcnZsZXRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZlNlbGVjdGlvbiA9IFNFUlZMRVQ7Ci0JCX0KLQotCQlmUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soZkNoaWxkLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlBhZ2VCb29rLnNldExheW91dERhdGEoZ2QpOwotCQlmSnNwQ29udHJvbCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoZlBhZ2VCb29rKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShmUGFnZUJvb2ssIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJTGFiZWwgbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDaG9vc2VfYV9zZXJ2bGV0X18xIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZlRleHQgPSBjcmVhdGVUZXh0KGNvbXBvc2l0ZSk7Ci0KLQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNYXRjaGluZ19zZXJ2bGV0c19fMiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZVcHBlckxpc3QgPSBjcmVhdGVVcHBlckxpc3QoY29tcG9zaXRlKTsKLQotCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbWVzc2FnZUxhYmVsLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlF1YWxpZmllcl9fMyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZMb3dlckxpc3QgPSBjcmVhdGVMb3dlckxpc3QoY29tcG9zaXRlKTsKLQotCQlmU2VydmxldENvbnRyb2wgPSBjb21wb3NpdGU7Ci0KLQkJaWYgKGZTZWxlY3Rpb24gPT0gSlNQKQotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZKc3BDb250cm9sKTsKLQkJZWxzZQotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZTZXJ2bGV0Q29udHJvbCk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgd2lkZ2V0IGFuZCBzZXRzIGxheW91dCBkYXRhLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdAotCSAqLwotCXByaXZhdGUgVGFibGUgY3JlYXRlTG93ZXJMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGZMb3dlckxpc3RMYWJlbCAhPSBudWxsKQotCQkJIChuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkpLnNldFRleHQoZkxvd2VyTGlzdExhYmVsKTsKLQotCQlUYWJsZSBsaXN0ID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlTG93ZXJTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVMb3dlckRvdWJsZUNsaWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlmUXVhbGlmaWVyUmVuZGVyZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCQlzcGVjLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCXNwZWMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGV4dCB3aWRnZXQgYW5kIHNldHMgbGF5b3V0IGRhdGEuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ci0JICovCi0JcHJpdmF0ZSBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQlMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJcmVtYXRjaChmVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9OwotCQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGwpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCB3aWRnZXQgYW5kIHNldHMgbGF5b3V0IGRhdGEuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0JICovCi0JcHJpdmF0ZSBUYWJsZSBjcmVhdGVVcHBlckxpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZlVwcGVyTGlzdExhYmVsICE9IG51bGwpCi0JCQkgKG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKSkuc2V0VGV4dChmVXBwZXJMaXN0TGFiZWwpOwotCi0JCVRhYmxlIGxpc3QgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVVcHBlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZVVwcGVyRG91YmxlQ2xpY2soKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWZFbGVtZW50UmVuZGVyZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCQlzcGVjLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCXNwZWMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTUpOwotCQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIElEIG9mIHRoZSBidXR0b24gdGhhdCBpcyAncHJlc3NlZCcgb24gZG91YmxlQ2xpY2sgaW4gdGhlIGxpc3RzLgotCSAqIEJ5IGRlZmF1bHQgaXQgaXMgdGhlIE9LIGJ1dHRvbi4KLQkgKiBPdmVycmlkZSB0byBjaGFuZ2UgdGhpcyBzZXR0aW5nLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdEJ1dHRvbklEKCkgewotCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5PS19JRDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFdpZGdldFNlbGVjdGlvbigpIHsKLQkJaW50IGkgPSBmTG93ZXJMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChmUXVhbGlmaWVyTWFwICE9IG51bGwpIHsKLQkJCWlmIChmUXVhbGlmaWVyTWFwLmxlbmd0aCA9PSAxKQotCQkJCWkgPSAwOwotCQkJaWYgKGkgPCAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IAotCQkJSW50ZWdlciBpbmRleCA9IGZRdWFsaWZpZXJNYXBbaV07Ci0JCQlyZXR1cm4gZkVsZW1lbnRzW2luZGV4LmludFZhbHVlKCldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVMb3dlckRvdWJsZUNsaWNrKCkgewotCQlpZiAoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkKLQkJCWJ1dHRvblByZXNzZWQoZ2V0RGVmYXVsdEJ1dHRvbklEKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVMb3dlclNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlVXBwZXJEb3VibGVDbGljaygpIHsKLQkJaWYgKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQlidXR0b25QcmVzc2VkKGdldERlZmF1bHRCdXR0b25JRCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlVXBwZXJTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlpbnQgc2VsZWN0aW9uID0gZlVwcGVyTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsZWN0aW9uID49IDApIHsKLQkJCWludCBpID0gZkVsZW1lbnRNYXBbc2VsZWN0aW9uXTsKLQkJCWludCBrID0gaTsKLQkJCWludCBsZW5ndGggPSBmUmVuZGVyZWRTdHJpbmdzLmxlbmd0aDsKLQkJCXdoaWxlIChrIDwgbGVuZ3RoICYmIGZSZW5kZXJlZFN0cmluZ3Nba10uZXF1YWxzKGZSZW5kZXJlZFN0cmluZ3NbaV0pKSB7Ci0JCQkJaysrOwotCQkJfQotCQkJdXBkYXRlTG93ZXJMaXN0V2lkZ2V0KGksIGspOwotCQl9IGVsc2UKLQkJCXVwZGF0ZUxvd2VyTGlzdFdpZGdldCgwLCAwKTsKLQl9Ci0JCi0JcHVibGljIGludCBvcGVuKCkgewotCi0JCWlmIChmSVQgPT0gbnVsbCB8fCBmSVQubGVuZ3RoID09IDApIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFNoZWxsKCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFbXB0eV9MaXN0XzEiKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9JTkZPX05vX3NlcnZsZXRzX2V4aXN0X3RvX2FkZC5fMSIpKTsgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIENBTkNFTDsKLQkJfQotCi0JCXNldEVsZW1lbnRzKGZJVCk7Ci0JCXNldEluaXRpYWxTZWxlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCQotCS8qKgotCSAqIHVwZGF0ZSB0aGUgbGlzdCB0byByZWZsZWN0IGEgbmV3IG1hdGNoIHN0cmluZy4KLQkgKiBAcGFyYW0gbWF0Y2hTdHJpbmcgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbWF0Y2goU3RyaW5nIG1hdGNoU3RyaW5nKSB7Ci0JCWludCBrID0gMDsKLQkJU3RyaW5nIHRleHQgPSBmVGV4dC5nZXRUZXh0KCk7Ci0JCVN0cmluZ01hdGNoZXIgbWF0Y2hlciA9IG5ldyBTdHJpbmdNYXRjaGVyKHRleHQgKyAiKiIsIGZJZ25vcmVDYXNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxhc3RTdHJpbmcgPSBudWxsOwotCQlpbnQgbGVuZ3RoID0gZkVsZW1lbnRzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJd2hpbGUgKGkgPCBsZW5ndGggJiYgZlJlbmRlcmVkU3RyaW5nc1tpXS5lcXVhbHMobGFzdFN0cmluZykpCi0JCQkJaSsrOwotCQkJaWYgKGkgPCBsZW5ndGgpIHsKLQkJCQlsYXN0U3RyaW5nID0gZlJlbmRlcmVkU3RyaW5nc1tpXTsKLQkJCQlpZiAobWF0Y2hlci5tYXRjaChmUmVuZGVyZWRTdHJpbmdzW2ldKSkgewotCQkJCQlmRWxlbWVudE1hcFtrXSA9IGk7Ci0JCQkJCWsrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZkVsZW1lbnRNYXBba10gPSAtMTsKLQotCQl1cGRhdGVVcHBlckxpc3RXaWRnZXQoZkVsZW1lbnRNYXAsIGspOwotCX0KLQkKLQkvKioKLQkJICogCi0JCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JCSAqIEBwYXJhbSBwIG9yZy5lY2xpcHNlLmpmYWNlLmVsZW1lbnRzLklJbmRleGVkUHJvcGVydHkKLQkJICovCi0JcHJpdmF0ZSBTdHJpbmdbXSByZW5kZXJTdHJpbmdzKE9iamVjdFtdIHApIHsKLQkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbcC5sZW5ndGhdOwotCQlpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJc3RyaW5nc1tpXSA9IGZFbGVtZW50UmVuZGVyZXIuZ2V0VGV4dChwW2ldKTsKLQkJfQotCQluZXcgVHdvQXJyYXlRdWlja1NvcnRlcihmSWdub3JlQ2FzZSkuc29ydChzdHJpbmdzLCBwKTsKLQkJcmV0dXJuIHN0cmluZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJZkVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCWZFbGVtZW50TWFwID0gbmV3IGludFtmRWxlbWVudHMubGVuZ3RoICsgMV07Ci0JCWZSZW5kZXJlZFN0cmluZ3MgPSByZW5kZXJTdHJpbmdzKGZFbGVtZW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKGludCBuZXdTZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTG93ZXJMaXN0V2lkZ2V0KGludCBmcm9tLCBpbnQgdG8pIHsKLQkJZkxvd2VyTGlzdC5yZW1vdmVBbGwoKTsKLQkJZlF1YWxpZmllck1hcCA9IG5ldyBJbnRlZ2VyW3RvIC0gZnJvbV07Ci0JCVN0cmluZ1tdIHF1YWxpZmllcnMgPSBuZXcgU3RyaW5nW3RvIC0gZnJvbV07Ci0JCWZvciAoaW50IGkgPSBmcm9tOyBpIDwgdG87IGkrKykgewotCQkJLy8gWFhYOiAxRzY1TERHOiBKRlVJRjpXSU4yMDAwIC0gSUxhYmVsUHJvdmlkZXIgdXNlZCBvdXRzaWRlIGEgdmlld2VyCi0JCQlxdWFsaWZpZXJzW2kgLSBmcm9tXSA9IGZRdWFsaWZpZXJSZW5kZXJlci5nZXRUZXh0KGZFbGVtZW50c1tpXSk7Ci0JCQlmUXVhbGlmaWVyTWFwW2kgLSBmcm9tXSA9IG5ldyBJbnRlZ2VyKGkpOwotCQl9Ci0KLQkJbmV3IFR3b0FycmF5UXVpY2tTb3J0ZXIoZklnbm9yZUNhc2UpLnNvcnQocXVhbGlmaWVycywgZlF1YWxpZmllck1hcCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0byAtIGZyb207IGkrKykgewotCQkJVGFibGVJdGVtIHRpID0gbmV3IFRhYmxlSXRlbShmTG93ZXJMaXN0LCBpKTsKLQkJCXRpLnNldFRleHQocXVhbGlmaWVyc1tpXSk7Ci0JCQkvLyBYWFg6IDFHNjVMREc6IEpGVUlGOldJTjIwMDAgLSBJTGFiZWxQcm92aWRlciB1c2VkIG91dHNpZGUgYSB2aWV3ZXIKLQkJCUltYWdlIGltZyA9IGZRdWFsaWZpZXJSZW5kZXJlci5nZXRJbWFnZShmRWxlbWVudHNbZnJvbSArIGldKTsKLQkJCWlmIChpbWcgIT0gbnVsbCkKLQkJCQl0aS5zZXRJbWFnZShpbWcpOwotCQl9Ci0KLQkJaWYgKGZMb3dlckxpc3QuZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJZkxvd2VyTGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU9rU3RhdGUoKSB7Ci0JCUJ1dHRvbiBva0J1dHRvbiA9IGdldE9rQnV0dG9uKCk7Ci0JCWlmIChva0J1dHRvbiAhPSBudWxsKQotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVVwcGVyTGlzdFdpZGdldChpbnRbXSBpbmRpY2VzLCBpbnQgc2l6ZSkgewotCQlmVXBwZXJMaXN0LnNldFJlZHJhdyhmYWxzZSk7Ci0JCWludCBpdGVtQ291bnQgPSBmVXBwZXJMaXN0LmdldEl0ZW1Db3VudCgpOwotCQlpZiAoc2l6ZSA8IGl0ZW1Db3VudCkKLQkJCWZVcHBlckxpc3QucmVtb3ZlKDAsIGl0ZW1Db3VudCAtIHNpemUgLSAxKTsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBmVXBwZXJMaXN0LmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBudWxsOwotCQkJaWYgKGkgPCBpdGVtQ291bnQpCi0JCQkJdGkgPSBpdGVtc1tpXTsKLQkJCWVsc2UKLQkJCQl0aSA9IG5ldyBUYWJsZUl0ZW0oZlVwcGVyTGlzdCwgaSk7Ci0JCQl0aS5zZXRUZXh0KGZSZW5kZXJlZFN0cmluZ3NbaW5kaWNlc1tpXV0pOwotCQkJLy8gWFhYOiAxRzY1TERHOiBKRlVJRjpXSU4yMDAwIC0gSUxhYmVsUHJvdmlkZXIgdXNlZCBvdXRzaWRlIGEgdmlld2VyCi0JCQlJbWFnZSBpbWcgPSBmRWxlbWVudFJlbmRlcmVyLmdldEltYWdlKGZFbGVtZW50c1tpbmRpY2VzW2ldXSk7Ci0JCQlpZiAoaW1nICE9IG51bGwpCi0JCQkJdGkuc2V0SW1hZ2UoaW1nKTsKLQkJfQotCQlpZiAoZlVwcGVyTGlzdC5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQlmVXBwZXJMaXN0LnNldFNlbGVjdGlvbigwKTsKLQkJZlVwcGVyTGlzdC5zZXRSZWRyYXcodHJ1ZSk7Ci0JCWhhbmRsZVVwcGVyU2VsZWN0aW9uQ2hhbmdlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZW50IHdoZW4gZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBvbiBzb21lIHBsYXRmb3JtcyBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMKLQkgKiBpbiBhIExpc3Qgd2hlbiB0aGUgdXNlciBkb3VibGUtY2xpY2tzIGFuIGl0ZW0gb3IgdHlwZXMKLQkgKiByZXR1cm4gaW4gYSBUZXh0LgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlZmF1bHQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBTZW50IHdoZW4gc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgb24gc29tZSBwbGF0Zm9ybXMgc2VsZWN0aW9uIG9jY3VycyBpbgotCSAqIGEgTGlzdCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBvciBpdGVtcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSBmSlNQQnV0dG9uKSB7Ci0JCQlmU2VsZWN0aW9uID0gSlNQOwotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZKc3BDb250cm9sKTsKLQkJCXVwZGF0ZU9LU3RhdHVzKCk7Ci0JCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gZlNlcnZsZXRCdXR0b24pIHsKLQkJCWZTZWxlY3Rpb24gPSBTRVJWTEVUOwotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZTZXJ2bGV0Q29udHJvbCk7Ci0JCX0gZWxzZQotCQkJZlNlbGVjdGlvbiA9IC0xOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nI3VwZGF0ZU9LU3RhdHVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPS1N0YXR1cygpIHsKLQkJc3VwZXIudXBkYXRlT0tTdGF0dXMoKTsKLQkJQnV0dG9uIG9rQnV0dG9uID0gZ2V0T2tCdXR0b24oKTsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpCi0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGZMb2NhbFZhbGlkYXRvci52YWxpZGF0ZShnZXRSZXN1bHQoKSkuaXNPSygpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMTliNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2bGV0Q2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuTmV3SmF2YUNsYXNzT3B0aW9uc1dpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2bGV0Q2xhc3NPcHRpb25zV2l6YXJkUGFnZSBleHRlbmRzIE5ld0phdmFDbGFzc09wdGlvbnNXaXphcmRQYWdlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGluaXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiB0b1N0cmluZ0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGdldEluZm9CdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb1Bvc3RCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb1B1dEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvRGVsZXRlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZGVzdHJveUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvR2V0QnV0dG9uOwotCi0JcHVibGljIE5ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlIHdpdGggYWxsIHRoZSBzdHVicwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVN0dWJzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgc3R1YkxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlzdHViTGFiZWwuc2V0VGV4dChJV2ViV2l6YXJkQ29uc3RhbnRzLkpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3R1YkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxNTsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljb25zdHJ1Y3RvckJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5DSEVDSyk7Ci0JCWNvbnN0cnVjdG9yQnV0dG9uLnNldFRleHQoSVdlYldpemFyZENvbnN0YW50cy5KQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChjb25zdHJ1Y3RvckJ1dHRvbiwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ09OU1RSVUNUT1IsIG51bGwpOwotCi0JCWluaGVyaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuQ0hFQ0spOwotCQlpbmhlcml0QnV0dG9uLnNldFRleHQoSVdlYldpemFyZENvbnN0YW50cy5KQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUwpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGluaGVyaXRCdXR0b24sIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkFCU1RSQUNUX01FVEhPRFMsIG51bGwpOwotCQlpbmhlcml0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIGVuYWJsZSA9IGluaGVyaXRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaW5pdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJdG9TdHJpbmdCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWdldEluZm9CdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWRvUG9zdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJZG9QdXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWRvRGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlkZXN0cm95QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlkb0dldEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoYnV0dG9uQ29tcG8sIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlpbml0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlpbml0QnV0dG9uLnNldFRleHQoImluaXQiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGluaXRCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVQsIG51bGwpOwotCi0JCXRvU3RyaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQl0b1N0cmluZ0J1dHRvbi5zZXRUZXh0KCJ0b1N0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3godG9TdHJpbmdCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlRPX1NUUklORywgbnVsbCk7Ci0KLQkJZ2V0SW5mb0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZ2V0SW5mb0J1dHRvbi5zZXRUZXh0KCJnZXRTZXJ2bGV0SW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZ2V0SW5mb0J1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuR0VUX1NFUlZMRVRfSU5GTywgbnVsbCk7Ci0KLQkJZG9Qb3N0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb1Bvc3RCdXR0b24uc2V0VGV4dCgiZG9Qb3N0Iik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb1Bvc3RCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1BPU1QsIG51bGwpOwotCi0JCWRvUHV0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb1B1dEJ1dHRvbi5zZXRUZXh0KCJkb1B1dCIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9QdXRCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1BVVCwgbnVsbCk7Ci0KLQkJZG9EZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRvRGVsZXRlQnV0dG9uLnNldFRleHQoImRvRGVsZXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb0RlbGV0ZUJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fREVMRVRFLCBudWxsKTsKLQotCQlkZXN0cm95QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkZXN0cm95QnV0dG9uLnNldFRleHQoImRlc3Ryb3kiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRlc3Ryb3lCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU1RST1ksIG51bGwpOwotCi0JCWRvR2V0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb0dldEJ1dHRvbi5zZXRUZXh0KCJkb0dldCIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9HZXRCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0dFVCwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMDg4ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5OZXdKYXZhQ2xhc3NXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZSBleHRlbmRzIE5ld0phdmFDbGFzc1dpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cCBhbm5vdGF0aW9uc0dyb3VwID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBleGlzdGluZ0NsYXNzQnV0dG9uOwotCXByaXZhdGUgTGFiZWwgZXhpc3RpbmdDbGFzc0xhYmVsOwotCXByaXZhdGUgVGV4dCBleGlzdGluZ0NsYXNzVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBleGlzdGluZ0J1dHRvbjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBKU1BFWFRFTlNJT05TID0geyAianNwIiB9OyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIE5ld1NlcnZsZXRDbGFzc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUsIFN0cmluZyBtb2R1bGVUeXBlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSwgbW9kdWxlVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbm5vdGF0aW9ucyBncm91cCBhbmQgc2V0IGRlZmF1bHQgZW5hYmxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYW5ub3RhdGlvbnNHcm91cCA9IG5ldyBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChwYXJlbnQsIG1vZGVsLCBKMkVFUHJvamVjdFV0aWxpdGllcy5FSkIuZXF1YWxzKHByb2plY3RUeXBlKSwKLQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQi5lcXVhbHMocHJvamVjdFR5cGUpKTsKLQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkpCi0JCQlyZXR1cm47Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCWFubm90YXRpb25zR3JvdXAuc2V0RW5hYmxlbWVudChwcm9qZWN0KTsKLQkJLy8gYW5ub3RhdGlvbnNHcm91cC5zZXRVc2VBbm5vdGF0aW9ucyh0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQlhZGRTZXBlcmF0b3IoY29tcG9zaXRlLDMpOwotCQljcmVhdGVVc2VFeGlzdGluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUFubm90YXRpb25zR3JvdXAoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVXNlRXhpc3RpbmdHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWV4aXN0aW5nQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWV4aXN0aW5nQnV0dG9uLnNldFRleHQoSVdlYldpemFyZENvbnN0YW50cy5VU0VfRVhJU1RJTkdfU0VSVkxFVF9DTEFTUyk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWV4aXN0aW5nQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZXhpc3RpbmdCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRV9FWElTVElOR19DTEFTUywgbnVsbCk7Ci0JCWV4aXN0aW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUV4aXN0aW5nQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlleGlzdGluZ0NsYXNzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWV4aXN0aW5nQ2xhc3NMYWJlbC5zZXRUZXh0KElXZWJXaXphcmRDb25zdGFudHMuQ0xBU1NfTkFNRV9MQUJFTCk7Ci0JCWV4aXN0aW5nQ2xhc3NMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQlleGlzdGluZ0NsYXNzTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZXhpc3RpbmdDbGFzc1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWV4aXN0aW5nQ2xhc3NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlleGlzdGluZ0NsYXNzVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGV4aXN0aW5nQ2xhc3NUZXh0LCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FLCBudWxsKTsKLQotCQlleGlzdGluZ0NsYXNzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZXhpc3RpbmdDbGFzc0J1dHRvbi5zZXRUZXh0KElXZWJXaXphcmRDb25zdGFudHMuQlJPV1NFX0JVVFRPTl9MQUJFTCk7Ci0JCWV4aXN0aW5nQ2xhc3NCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWV4aXN0aW5nQ2xhc3NCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWV4aXN0aW5nQ2xhc3NCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQ2xhc3NCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUV4aXN0aW5nQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlID0gZXhpc3RpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghZW5hYmxlKSB7Ci0JCQlleGlzdGluZ0NsYXNzVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWV4aXN0aW5nQ2xhc3NMYWJlbC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWV4aXN0aW5nQ2xhc3NCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQlwYWNrYWdlVGV4dC5zZXRFbmFibGVkKCFlbmFibGUpOwotCQlwYWNrYWdlQnV0dG9uLnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCXBhY2thZ2VMYWJlbC5zZXRFbmFibGVkKCFlbmFibGUpOwotCQljbGFzc1RleHQuc2V0RW5hYmxlZCghZW5hYmxlKTsKLQkJY2xhc3NUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWNsYXNzTGFiZWwuc2V0RW5hYmxlZCghZW5hYmxlKTsKLQkJc3VwZXJUZXh0LnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCXN1cGVyQnV0dG9uLnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCXN1cGVyTGFiZWwuc2V0RW5hYmxlZCghZW5hYmxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2xhc3NCdXR0b25TZWxlY3RlZCgpIHsKLQkJZ2V0Q29udHJvbCgpLnNldEN1cnNvcihuZXcgQ3Vyc29yKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1dBSVQpKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlNdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyBtcyA9IG5ldyBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCUlXZWJXaXphcmRDb25zdGFudHMuTkVXX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRSwKLQkJCQlJV2ViV2l6YXJkQ29uc3RhbnRzLkNIT09TRV9TRVJWTEVUX0NMQVNTLCAKLQkJCQlKU1BFWFRFTlNJT05TLCAKLQkJCQlmYWxzZSwgCi0JCQkJcHJvamVjdCk7Ci0JCUlDb250YWluZXIgcm9vdCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCQltcy5zZXRJbnB1dChyb290KTsKLQkJbXMub3BlbigpOwotCQlpZiAobXMuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobXMuZ2V0U2VsZWN0ZWRJdGVtKCkgPT0gTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuSlNQKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IG1zLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgb2JqOwotCQkJCQkJSVBhdGggcEZ1bGwgPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlJUGF0aCBwQmFzZSA9IHJvb3QuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCUlQYXRoIHBhdGggPSBwRnVsbC5yZW1vdmVGaXJzdFNlZ21lbnRzKHBCYXNlLnNlZ21lbnRDb3VudCgpKTsKLQkJCQkJCXF1YWxpZmllZENsYXNzTmFtZSA9IHBhdGgubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKLQkJCQkJCW1vZGVsLnNldFByb3BlcnR5KElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklTX1NFUlZMRVRfVFlQRSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCQllbHNlIHsKLQkJCQlJVHlwZSB0eXBlID0gKElUeXBlKSBtcy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJcXVhbGlmaWVkQ2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQkJbW9kZWwuc2V0UHJvcGVydHkoSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSVNfU0VSVkxFVF9UWVBFLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJfQotCQkJfQotCQkJZXhpc3RpbmdDbGFzc1RleHQuc2V0VGV4dChxdWFsaWZpZWRDbGFzc05hbWUpOwotCQl9Ci0JCWdldENvbnRyb2woKS5zZXRDdXJzb3IobnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyOWNhMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5ld1dlYldpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHVibGljIE5ld1dlYldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE5ld1dlYldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZ2V0RGF0YU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYxYTAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gY3JlYXRlIEoyRUUgV2ViIG1vZHVsZSBzdHJ1Y3R1cmVzIGluIEVjbGlwc2UgUHJvamVjdHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgd2l6YXJkIGlzIG5vdCBleHBvc2VkIGFzIEFQSSB0byBiZSBleHRlbmRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudENyZWF0aW9uV2l6YXJkIGV4dGVuZHMgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkIGltcGxlbWVudHMgSUV4ZWN1dGFibGVFeHRlbnNpb24sIElOZXdXaXphcmQgewotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBXaXphcmQgSUQgb2YgdGhlIENvbm5lY3Rvck1vZHVsZUNyZWF0aW9uV2l6YXJkLiBVc2VkIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBhbmQgYWN0aXZpdGllcyBtYW5hZ2VtZW50LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSAgV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCSAKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgCi0JICogbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubyBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgCi0JICogb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRDcmVhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzCi0JICogYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKiogCi0JICoge0Bpbmhlcml0RG9jfSAgIAotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRpYWxvZyB3aW5kb3cgdGl0bGUgYW5kIGRlZmF1bHQgcGFnZSBpbWFnZS4gCi0JICogPC9wPiAKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV0VCVUlNZXNzYWdlcy5XRUJfTU9EVUxFX1dJWl9USVRMRSkpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5XRUJfUFJPSkVDVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXByZUZpbGxTZWxlY3RlZEVBUlByb2plY3QoKTsKLQl9IAotCSAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogQWRkcyBhIHtAbGluayBKQ0FQcm9qZWN0Q3JlYXRpb25QYWdlfSBhcyB0aGUge0BsaW5rIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCNNQUlOX1BHfS4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIHBhZ2UgPSBuZXcgV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHKTsKLQkJcGFnZS5zZXRJbmZvcG9wSUQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLndlYncxMDAwIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUGFnZShwYWdlKTsKLQkJc3VwZXIuZG9BZGRQYWdlcygpOwotCX0KLQotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICB9IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmMwODlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkRhdGFNb2RlbEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5kYXRhbW9kZWwucHJvcGVydGllcy5JV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UgaW1wbGVtZW50cyBJV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzewotCi0JcHVibGljIFRleHQgY29udGV4dFJvb3ROYW1lRmllbGQgPSBudWxsOwotCXB1YmxpYyBMYWJlbCBjb250ZXh0Um9vdExhYmVsID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgVGV4dCB3ZWJGb2xkZXJOYW1lVGV4dCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAyNTA7Ci0JcHJpdmF0ZSBEYXRhTW9kZWxBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cCBhbm5vdGF0aW9uc0dyb3VwOwotCQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV0VCVUlNZXNzYWdlcy5XRUJfUFJPSkVDVF9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV0VCVUlNZXNzYWdlcy5XRUJfUFJPSkVDVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLldFQl9QUk9KRUNUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFTW9kdWxlQ3JlYXRpb25QYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb0FkdmFuY2VkQ29tcG9zaXRlKENvbXBvc2l0ZSBhZHZhbmNlZCkgewotCQlzdXBlci5hZGRUb0FkdmFuY2VkQ29tcG9zaXRlKGFkdmFuY2VkKTsKLQkJY29udGV4dFJvb3RMYWJlbCA9IG5ldyBMYWJlbChhZHZhbmNlZCwgU1dULk5VTEwpOwotCQljb250ZXh0Um9vdExhYmVsLnNldFRleHQoV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhXRUJVSU1lc3NhZ2VzLldFQl9JTVBPUlRfQ09OVEVYVF9ST09UKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJY29udGV4dFJvb3RMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgY29udGV4dCByb290IGVudHJ5IGZpZWxkCi0KLQkJY29udGV4dFJvb3ROYW1lRmllbGQgPSBuZXcgVGV4dChhZHZhbmNlZCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJY29udGV4dFJvb3ROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGNvbnRleHRSb290TmFtZUZpZWxkLCBDT05URVhUX1JPT1QsIG5ldyBDb250cm9sW117Y29udGV4dFJvb3RMYWJlbH0pOwotCQkKLQkJY3JlYXRlU291cmNlRm9sZGVyQ29tcG9zaXRlKGFkdmFuY2VkKTsKLQkJY3JlYXRlV2ViQ29udGVudEZvbGRlckNvbXBvc2l0ZShhZHZhbmNlZCk7Ci0JCWNyZWF0ZUFubm90YXRpb25zR3JvdXAoYWR2YW5jZWQpOwotCX0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVdlYkNvbnRlbnRGb2xkZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhXRUJVSU1lc3NhZ2VzLldFQkNPTlRFTlQpKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOyAgICAgIAotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0gICAgICAgIHdlYkZvbGRlck5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICB3ZWJGb2xkZXJOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7IC8vIHBhZAotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaFRleHQod2ViRm9sZGVyTmFtZVRleHQsIFdFQkNPTlRFTlRfRk9MREVSLCBudWxsKTsKLSAgICB9CQotICAgIAotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYW5ub3RhdGlvbnNHcm91cCA9IG5ldyBEYXRhTW9kZWxBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChwYXJlbnQsIGdldERhdGFNb2RlbCgpLCBmYWxzZSwgc3luY2hIZWxwZXIpOwotCX0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVzID0gc3VwZXIuZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgU3RyaW5nW10gYWxsTmFtZXMgPSBuZXcgU3RyaW5nW25hbWVzLmxlbmd0aCArIDNdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCAwLCBhbGxOYW1lcywgMCwgbmFtZXMubGVuZ3RoKTsKLSAgICAgICAgYWxsTmFtZXNbbmFtZXMubGVuZ3RoXSA9IENPTlRFWFRfUk9PVDsKLSAgICAgICAgYWxsTmFtZXNbbmFtZXMubGVuZ3RoICsgMV0gPSBJQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TOwotICAgICAgICBhbGxOYW1lc1tuYW1lcy5sZW5ndGggKyAyXSA9IFdFQkNPTlRFTlRfRk9MREVSOwotICAgICAgICByZXR1cm4gYWxsTmFtZXM7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoYW5ub3RhdGlvbnNHcm91cCAhPSBudWxsKQotCQkJYW5ub3RhdGlvbnNHcm91cC5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50RXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTExNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVNb2R1bGVFeHBvcnRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudEV4cG9ydFBhZ2UgZXh0ZW5kcyBKMkVFTW9kdWxlRXhwb3J0UGFnZSB7Ci0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEV4cG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCQlzZXRUaXRsZShXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKFdFQlVJTWVzc2FnZXMuV0VCX0VYUE9SVF9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV0VCVUlNZXNzYWdlcy5XRUJfRVhQT1JUX01BSU5fUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuV0VCX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5XRUJfUFJPSl9MQkwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLndhciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUV4cG9ydFBhZ2UjaXNNZXRhVHlwZVN1cHBvcnRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWV0YVR5cGVTdXBwb3J0ZWQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0JfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wbmVudElEKCkgewotICAgICAgICByZXR1cm4gIkpTVF9XRUIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTY2MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gZXhwb3J0IEoyRUUgV2ViIEFwcGxpY2F0aW9uIG1vZHVsZSBzdHJ1Y3R1cmVzIAotICogZnJvbSB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggdG8gYSBkZXBsb3lhYmxlIFdlYiBBcHBsaWNhdGlvbiAKLSAqIEFyY2hpdmUgKi53YXIgZmlsZS4gIAotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkIGltcGxlbWVudHMgSUV4cG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgCi0JICogbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubyBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgCi0JICogb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRFeHBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMKLQkgKiBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEV4cG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICB9Ci0JLyoqCi0JICogPHA+Ci0JICogQWRkcyB0aGUgZm9sbG93aW5nIHBhZ2VzOgotCSAqIDx1bD4KLQkgKiAJPGxpPiB7QGxpbmsgV2ViQ29tcG9uZW50RXhwb3J0UGFnZX0gYXMgdGhlIG1haW4gd2l6YXJkIHBhZ2UgKHtAbGluayAjTUFJTl9QR30pIAotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IFdlYkNvbXBvbmVudEV4cG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcsIGdldFNlbGVjdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfSAgIAotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuIAotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLldFQl9FWFBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQwMWZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFTW9kdWxlSW1wb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViQ29tcG9uZW50SW1wb3J0UGFnZSBleHRlbmRzIEoyRUVNb2R1bGVJbXBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50SW1wb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhXRUJVSU1lc3NhZ2VzLldFQl9JTVBPUlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKFdFQlVJTWVzc2FnZXMuV0VCX0lNUE9SVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLldFQl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlSW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBXRUJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKFdFQlVJTWVzc2FnZXMuV0VCX0ZJTEVfTEJMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi53YXIifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdEltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhXRUJVSU1lc3NhZ2VzLkVKQl9QUk9KRUNUX0xCTCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBUT0RPOiBpbXBsZW1lbnQgd2l0aCBuZXcgaW1wb3J0IHdpemFyZHMKLQkJLy8gbmV3IEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKGNvbXBvc2l0ZSwgZ2V0V2ViRGF0YU1vZGVsKCksIGZhbHNlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFdlYkxpYnNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFdlYkxpYnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZWI0MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRXZWJMaWJzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUltcG9ydFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRJbXBvcnRXZWJMaWJzUGFnZSBleHRlbmRzIEoyRUVJbXBvcnRQYWdlIHsKLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJvdGVjdGVkIFdBUkZpbGUgd2FyRmlsZTsKLQlwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlciBhdmFpbGFibGVKQVJzVmlld2VyOwotCXB1YmxpYyBib29sZWFuIHV0aWxKYXJTZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50SW1wb3J0V2ViTGlic1BhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV0VCVUlNZXNzYWdlcy5XRUJfSU1QT1JUX1dFQl9MSUJfUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhXRUJVSU1lc3NhZ2VzLldFQl9JTVBPUlRfV0VCX0xJQl9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5XRUJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNyZWF0ZUF2YWlsYWJsZUphcnNMaXN0KGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUJ1dHRvbnNHcm91cChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogVXBkYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBhbGwgYnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbkVuYWJsZW1lbnRzKCkgewotCQl1dGlsSmFyU2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXZhaWxhYmxlSmFyc0xpc3QoQ29tcG9zaXRlIGxpc3RHcm91cCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QobGlzdEdyb3VwLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDIwMDsKLQkJZ0RhdGEuaGVpZ2h0SGludCA9IDgwOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIgbGlic1Byb3ZpZGVyID0gbmV3IEF2YWlsYWJsZVdlYkxpYlByb3ZpZGVyKCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGxpYnNQcm92aWRlcik7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsaWJzUHJvdmlkZXIpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlhdmFpbGFibGVKQVJDaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKTsKLQkJCX0KLQkJfSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0JCW1vZGVsLmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQpKSB7Ci0JCQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKCgoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCkpLnRvQXJyYXkoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlBcnJheUxpc3QgZW1wdHlTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KDIpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5XRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVELCBlbXB0eVNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCUFycmF5TGlzdCBhbGxTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlPYmplY3Qgc2VsZWN0aW9uID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IChudWxsICE9IChzZWxlY3Rpb24gPSBhdmFpbGFibGVKQVJzVmlld2VyLmdldEVsZW1lbnRBdChpKSkpOyBpKyspIHsKLQkJCWFsbFNlbGVjdGlvbi5hZGQoc2VsZWN0aW9uKTsKLQkJfQotCQltb2RlbC5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5XRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVELCBhbGxTZWxlY3Rpb24pOwotCX0KLQotCQotCi0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zR3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYnV0dG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gNDsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoV0VCVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhXRUJVSU1lc3NhZ2VzLldBUl9JTVBPUlRfU0VMRUNUX0FMTF9MSUJTX0JVVFRPTikpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KFdFQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV0VCVUlNZXNzYWdlcy5XQVJfSU1QT1JUX0RFU0VMRUNUX0FMTF9MSUJTX0JVVFRPTikpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCi0JCi0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaEVBUkZpbGVJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKGlzRUFSRmlsZUNoYW5nZWQoKSkgewotCQkJd2FyRmlsZSA9IChXQVJGaWxlKSBtb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRSk7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKQVJzQ29tcG9zaXRlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsR3JheWVkKCFlbmFibGVkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0SW5wdXQod2FyRmlsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFQVJGaWxlQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIHdhckZpbGUgIT0gbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCQlyZWZyZXNoRUFSRmlsZUlmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXZhaWxhYmxlSkFSQ2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQltb2RlbC5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5XRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVELCBnZXRKQVJzRm9yUHJvamVjdHMoKSk7Ci0JCXZhbGlkYXRlUGFnZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEpBUnNGb3JQcm9qZWN0cygpIHsKLQkJcmVmcmVzaEVBUkZpbGVJZk5lY2Vzc2FyeSgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxPckVtcHR5KFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBhU3RyaW5nID09IG51bGwgfHwgYVN0cmluZy5sZW5ndGgoKSA9PSAwOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXt9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0JCS8vIFRoaXMgcGFnZSBkb2Vzbid0IGltcGxlbWVudC4uLgotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQkvLyBUaGlzIHBhZ2UgZG9lc24ndCBpbXBsZW1lbnQuLi4KLQl9Ci0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOTA2ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBpbXBvcnQgSjJFRSBXZWIgQXBwbGljYXRpb24gbW9kdWxlIHN0cnVjdHVyZXMgaW50byB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggZnJvbSBhbgotICogZXhpc3RpbmcgV2ViIEFwcGxpY2F0aW9uICoud2FyIGZpbGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJDb21wb25lbnRJbXBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9MSUJTX1BHID0gIldFQl9MSUJTX1BHIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEltcG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIGFuIHtAbGluayBXQVJJbXBvcnRQYWdlfSBhcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNNQUlOX1BHfSkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IFdlYkNvbXBvbmVudEltcG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcpKTsKLQkJYWRkUGFnZShuZXcgV2ViQ29tcG9uZW50SW1wb3J0V2ViTGlic1BhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGlhbG9nIHdpbmRvdyB0aXRsZSBhbmQgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZG9Jbml0KCkgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5JTVBPUlRfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLldFQl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCQkvLyB1cGRhdGVFQVJUb01vZGVsRnJvbVNlbGVjdGlvbihnZXRTcGVjaWZpY0RhdGFNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnZhbGlkYXRpb24uVUlXYXJWYWxpZGF0b3IifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0JLy8gLy8gSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIHByb2pDcmVhdGlvbk1vZGVsID0KLQkvLyAvLyBnZXRTcGVjaWZpY0RhdGFNb2RlbCgpLmdldEoyRUVNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbCgpOwotCS8vIC8vIHJldHVybiBwcm9qQ3JlYXRpb25Nb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5GSU5BTF9QRVJTUEVDVElWRSk7Ci0JLy8gcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkZJTkFMX1BFUlNQRUNUSVZFKTsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWEzMjAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyU2VsZWN0aW9uUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuQWJzdHJhY3RGYWNldFdpemFyZFBhZ2U7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYkZhY2V0SW5zdGFsbFBhZ2UgCi0KLSAgICBleHRlbmRzIEFic3RyYWN0RmFjZXRXaXphcmRQYWdlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBJRGF0YU1vZGVsIGNvbmZpZzsKLSAgICBwcml2YXRlIEVhclNlbGVjdGlvblBhbmVsIGVhclBhbmVsOwotICAgIHByaXZhdGUgTGFiZWwgY29udGV4dFJvb3RMYWJlbDsKLSAgICBwcml2YXRlIFRleHQgY29udGV4dFJvb3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRleHRSb290TW9kaWZpZWQ7IAotICAgIHByaXZhdGUgTGFiZWwgY29udGVudERpckxhYmVsOwotICAgIHByaXZhdGUgVGV4dCBjb250ZW50RGlyOwotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZVdlYkluZlNyYzsKLSAgICAKLSAgICBwdWJsaWMgV2ViRmFjZXRJbnN0YWxsUGFnZSgpIAotICAgIHsKLSAgICAgICAgc3VwZXIoICJ3ZWIuZmFjZXQuaW5zdGFsbC5wYWdlIiApOwotICAgICAgICAKLSAgICAgICAgc2V0VGl0bGUoIFJlc291cmNlcy5wYWdlVGl0bGUgKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIFJlc291cmNlcy5wYWdlRGVzY3JpcHRpb24gKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCApIAotICAgIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dCggbmV3IEdyaWRMYXlvdXQoIDEsIGZhbHNlICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZWFyUGFuZWwgPSBuZXcgRWFyU2VsZWN0aW9uUGFuZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLSAgICAgICAgdGhpcy5lYXJQYW5lbC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZWFyUGFuZWwuYWRkTGlzdGVuZXIoIG5ldyBMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBFdmVudCBldmVudCApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTdHJpbmdQcm9wZXJ0eShJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLGVhclBhbmVsLmdldEVhclByb2plY3ROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbnRleHRSb290TGFiZWwgPSBuZXcgTGFiZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLSAgICAgICAgdGhpcy5jb250ZXh0Um9vdExhYmVsLnNldFRleHQoIFJlc291cmNlcy5jb250ZXh0Um9vdExhYmVsICk7Ci0gICAgICAgIHRoaXMuY29udGV4dFJvb3RMYWJlbC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29udGV4dFJvb3QgPSBuZXcgVGV4dCggY29tcG9zaXRlLCBTV1QuQk9SREVSICk7Ci0gICAgICAgIHRoaXMuY29udGV4dFJvb3Quc2V0VGV4dCggIiIgKTsKLSAgICAgICAgdGhpcy5jb250ZXh0Um9vdC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgdGhpcy5jb250ZXh0Um9vdC5zZXREYXRhKCAibGFiZWwiLCB0aGlzLmNvbnRleHRSb290TGFiZWwgKTsKLQotICAgICAgICB0aGlzLmNvbnRleHRSb290LmFkZE1vZGlmeUxpc3RlbmVyKCBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KCBmaW5hbCBNb2RpZnlFdmVudCBldmVudCApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdlYkZhY2V0SW5zdGFsbFBhZ2UudGhpcy5jb250ZXh0Um9vdE1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbnRlbnREaXJMYWJlbCA9IG5ldyBMYWJlbCggY29tcG9zaXRlLCBTV1QuTk9ORSApOwotICAgICAgICB0aGlzLmNvbnRlbnREaXJMYWJlbC5zZXRUZXh0KCBSZXNvdXJjZXMuY29udGVudERpckxhYmVsICk7Ci0gICAgICAgIHRoaXMuY29udGVudERpckxhYmVsLnNldExheW91dERhdGEoIGdkaGZpbGwoKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5jb250ZW50RGlyID0gbmV3IFRleHQoIGNvbXBvc2l0ZSwgU1dULkJPUkRFUiApOwotICAgICAgICB0aGlzLmNvbnRlbnREaXIuc2V0VGV4dCggY29uZmlnLmdldFN0cmluZ1Byb3BlcnR5KElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFTlRfRElSKSk7Ci0gICAgICAgIHRoaXMuY29udGVudERpci5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgdGhpcy5jb250ZW50RGlyLnNldERhdGEoICJsYWJlbCIsIHRoaXMuY29udGVudERpckxhYmVsICk7Ci0KLSAgICAgICAgdGhpcy5jb250ZW50RGlyLmFkZE1vZGlmeUxpc3RlbmVyKCBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KCBmaW5hbCBNb2RpZnlFdmVudCBldmVudCApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY3JlYXRlV2ViSW5mU3JjID0gbmV3IEJ1dHRvbiggY29tcG9zaXRlLCBTV1QuQ0hFQ0sgKTsKLSAgICAgICAgdGhpcy5jcmVhdGVXZWJJbmZTcmMuc2V0VGV4dCggUmVzb3VyY2VzLmNyZWF0ZVdlYmluZlNyY0xhYmVsICk7Ci0gICAgICAgIAotICAgICAgICBzZXRDb250cm9sKCBjb21wb3NpdGUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnKCBmaW5hbCBPYmplY3QgY29uZmlnICkgCi0gICAgewotICAgICAgICB0aGlzLmNvbmZpZyA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHJhbnNmZXJTdGF0ZVRvQ29uZmlnKCkgCi0gICAgewotICAgICAgICBpZiggdGhpcy5lYXJQYW5lbC5nZXRBZGRUb0VhcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0U3RyaW5nUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwgdGhpcy5lYXJQYW5lbC5nZXRFYXJQcm9qZWN0TmFtZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5jb250ZXh0Um9vdE1vZGlmaWVkICkKLSAgICAgICAgewotICAgICAgICAJdGhpcy5jb25maWcuc2V0U3RyaW5nUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09ULCB0aGlzLmNvbnRleHRSb290LmdldFRleHQoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJdGhpcy5jb25maWcuc2V0U3RyaW5nUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09ULCB0aGlzLmNvbnRleHQuZ2V0UHJvamVjdE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbmZpZy5zZXRTdHJpbmdQcm9wZXJ0eShJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05URU5UX0RJUiwgdGhpcy5jb250ZW50RGlyLmdldFRleHQoKSApOwotICAgICAgICB0aGlzLmNvbmZpZy5zZXRCb29sZWFuUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX1dFQl9JTkZfU1JDLHRoaXMuY3JlYXRlV2ViSW5mU3JjLmdldFNlbGVjdGlvbigpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSApCi0gICAgewotICAgICAgICBpZiggdmlzaWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIHRoaXMuY29udGV4dFJvb3RNb2RpZmllZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0Um9vdC5zZXRUZXh0KCB0aGlzLmNvbnRleHQuZ2V0UHJvamVjdE5hbWUoKSApOwotICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dFJvb3RNb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdXBlci5zZXRWaXNpYmxlKCB2aXNpYmxlICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpCi0gICAgewotICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIGlmKCAhIHZhbGlkYXRlTm90RW1wdHkoIHRoaXMuY29udGV4dFJvb3QsIFJlc291cmNlcy5jb250ZXh0Um9vdExhYmVsLCBSZXNvdXJjZXMuY29udGVudERpckxhYmVsSW52YWxpZCApIHx8Ci0gICAgICAgICAgICAhIHZhbGlkYXRlTm90RW1wdHkoIHRoaXMuY29udGVudERpciwgUmVzb3VyY2VzLmNvbnRlbnREaXJMYWJlbCwgUmVzb3VyY2VzLmNvbnRlbnREaXJMYWJlbEludmFsaWQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLmVhclBhbmVsLmdldEFkZFRvRWFyKCkgJiYgCi0gICAgICAgICAgICB0aGlzLmVhclBhbmVsLmdldEVhclByb2plY3ROYW1lKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuc2V0UGFnZUNvbXBsZXRlKCB2YWxpZCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlTm90RW1wdHkoIGZpbmFsIFRleHQgdGV4dGJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWxpZExhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGludmFsaWRMYWJlbCApCi0gICAgewotICAgICAgICBmaW5hbCBMYWJlbCBsYWJlbCA9IChMYWJlbCkgdGV4dGJveC5nZXREYXRhKCAibGFiZWwiICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBib29sZWFuIHZhbGlkOwotICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dDsKLSAgICAgICAgZmluYWwgQ29sb3IgY29sb3I7Ci0gICAgICAgIAotICAgICAgICBpZiggdGV4dGJveC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZXh0ID0gaW52YWxpZExhYmVsOwotICAgICAgICAgICAgY29sb3IgPSBsYWJlbC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoIFNXVC5DT0xPUl9SRUQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRleHQgPSB2YWxpZExhYmVsOwotICAgICAgICAgICAgY29sb3IgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB2YWxpZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGxhYmVsLnNldFRleHQoIHRleHQgKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZCggY29sb3IgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB2YWxpZDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JpZERhdGEgZ2RoZmlsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VEZXNjcmlwdGlvbjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGV4dFJvb3RMYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGV4dFJvb3RMYWJlbEludmFsaWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnREaXJMYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGVudERpckxhYmVsSW52YWxpZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlV2ViaW5mU3JjTGFiZWw7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBXZWJGYWNldEluc3RhbGxQYWdlLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTE3M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWdlVGl0bGUgPSBXZWIgTW9kdWxlCi1wYWdlRGVzY3JpcHRpb24gPSBDb25maWd1cmUgd2ViIG1vZHVsZSBzZXR0aW5ncy4KLWNvbnRleHRSb290TGFiZWwgPSBDb250ZXh0IFJvb3RcOgotY29udGV4dFJvb3RMYWJlbEludmFsaWQgPSBDb250ZXh0IFJvb3QgKGludmFsaWQpXDoKLWNvbnRlbnREaXJMYWJlbCA9IENvbnRlbnQgRGlyZWN0b3J5XDoKLWNvbnRlbnREaXJMYWJlbEludmFsaWQgPSBDb250ZW50IERpcmVjdG9yeSAoaW52YWxpZClcOgotY3JlYXRlV2ViaW5mU3JjTGFiZWwgPSBBZGQgV0VCLUlORi9zcmMgZGlyZWN0b3J5IHRvIHNvdXJjZSBwYXRoLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNmNzMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYlByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuRmFjZXRlZFByb2plY3RXaXphcmQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViUHJvamVjdFdpemFyZCAKLQotICAgIGV4dGVuZHMgRmFjZXRlZFByb2plY3RXaXphcmQgCi0gICAgCi17Ci0gICAgcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSggInRlbXBsYXRlLmpzdC53ZWIiICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWdlRGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJDcmVhdGUgYSBXZWIgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlIG9yIGF0IGFuIGV4dGVybmFsIGxvY2F0aW9uLiI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKQotICAgIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSggIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpIiApOwotICAgICAgICBmaW5hbCBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KCAiaWNvbnMvZnVsbC9jdG9vbDE2L3dlYi13aXotYmFubmVyLmdpZiIgKTsKLQotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoIHVybCApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDU2ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InN0YXRpY193ZWJfdWkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmZmFiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi11aS5qYXIKLXVpc3JjLnppcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODU4ZjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmZlZGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFNpbXBsZSBXZWIgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndlYi51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHVpLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC5XU1RXZWJVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLAotIG9yZy5lY2xpcHNlLndzdC53ZWIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2N2U5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLnVpLmphciA9IHN0YXRpY193ZWJfdWkvCi1vdXRwdXQudWkuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB1aS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3ZWJwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1NmIzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL29iajE2L3dlYl9hcHBsaWNhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlOTYxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjNjhiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDdjOGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuCi0jIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLQotU3RhdGljV2ViUHJvamVjdC5uYW1lPVN0YXRpYyBXZWIgUHJvamVjdAotU3RhdGljV2ViUHJvamVjdC5kZXNjcmlwdGlvbj1DcmVhdGUgYSBXZWIgcHJvamVjdCBmb3Igc3RhdGljIGNvbnRlbnQgKEhUTUwgZmlsZXMpIG9ubHkKLQotU3RhdGljV2ViU2V0dGluZ3M9U2ltcGxlIFdlYgotV2ViUHJvamVjdEZlYXR1cmVzLm5hbWU9V2ViIFByb2plY3QgRmVhdHVyZXMKLXdlYi5jYXRlZ29yeV91aV89V2ViCi1TdGF0aWNXZWJNb2R1bGUubmFtZT1TaW1wbGUgV2ViIE1vZHVsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTZhNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8IS0tIHN0YXRpYyB3ZWIgcHJvamVjdCB3aXphcmQgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIld2ViLmNhdGVnb3J5X3VpXyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlU3RhdGljV2ViUHJvamVjdC5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLlNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uV2l6YXJkIgotICAgICAgICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb24iPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVN0YXRpY1dlYlByb2plY3QuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4gLS0+Ci0gICA8IS0tIGFkZCBpbiB0aGUgZmVhdHVyZXMgcGFnZSAKLSAgIAk8ZXh0ZW5zaW9uCi0gICAJCWlkPSJjb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLldlYlByb2plY3RGZWF0dXJlc1dpemFyZFBhZ2UiCi0gICAgICAgIG5hbWU9IiVXZWJQcm9qZWN0RmVhdHVyZXMubmFtZSIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS53aXphcmRQYWdlR3JvdXAiPgotICAgICAgCTx3aXphcmRQYWdlR3JvdXAKLSAgICAgICAgCXBhZ2VHcm91cElEPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuV2ViUHJvamVjdEZlYXR1cmVzV2l6YXJkUGFnZSIKLSAgICAgICAgICAgIHdpemFyZElEPSJjb20uaWJtLmV0b29scy53ZWJ0b29scy5TdGF0aWNXZWJQcm9qZWN0Q3JlYXRpb24iPgotICAgICAgICAJPGZhY3RvcnkKLSAgICAgICAgICAgIAljbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5XZWJQcm9qZWN0RmVhdHVyZXNXaXphcmRQYWdlRmFjdG9yeSI+Ci0gICAgICAgICAJPC9mYWN0b3J5PgotICAgICAgCTwvd2l6YXJkUGFnZUdyb3VwPgotICAgCTwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gPCEtLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVN0YXRpY1dlYlNldHRpbmdzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5TaW1wbGVXZWJTZXR0aW5nc1Byb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IlN0YXRpY1dlYlNldHRpbmdzUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53ZWIuU3RhdGljV2ViTmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICAgPHBhZ2UKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVXZWJQcm9qZWN0RmVhdHVyZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJjb20uaWJtLml0cC53dC51aS5XZWJGZWF0dXJlc1Byb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IldlYkZlYXR1cmVzUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53ZWIuU3RhdGljV2ViTmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgPC9wYWdlPiAKLSAgIDwvZXh0ZW5zaW9uPiAKLSAgIC0tPgotICAgCi0gICA8IS0tIHRoZSBmb2xsb3dpbmcgMiBhcmUgbmVlZGVkIHRvIGFkZCBhbiBpbWFnZSBmb3IgU1dQcyBpbnRvIHRoZSAiQWRkL1JlbW92ZSBQcm9qZWN0IiBkaWFsb2cgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZVR5cGVzIj4KLQkJPG1vZHVsZVR5cGUKLQkJCWlkPSJ3ZWIuc3RhdGljIgotCQkJbmFtZT0iJVN0YXRpY1dlYk1vZHVsZS5uYW1lIi8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotCQk8aW1hZ2UKLQkJCWlkPSJjb20uaWJtLnd0cC53ZWIuc3RhdGljIgotCQkJdHlwZUlkcz0id2ViLnN0YXRpYyIKLQkJCWljb249Imljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZiIvPgotCTwvZXh0ZW5zaW9uPgotCQotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLnVpLnByb2plY3ROYXR1cmVJbWFnZXMgICAgLS0+Ci08IS0tIFB1cnBvc2U6IEF0dGFjaCBpY29uIG92ZXJsYXlzIGZvciBKMkVFIHByb2plY3QgbmF0dXJlcyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5wcm9qZWN0TmF0dXJlSW1hZ2VzIj4KLSAgICAgIDxpbWFnZQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYiCi0gICAgICAgICAgICBuYXR1cmVJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi5TdGF0aWNXZWJOYXR1cmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuc2ltcGxlV2ViUHJvamVjdE5hdHVyZUltYWdlIj4KLSAgICAgIDwvaW1hZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI1NTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvV1NUV2ViUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBXU1RXZWJQcmVmZXJlbmNlcyB7Ci0JcHVibGljIGludGVyZmFjZSBLZXlzIHsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5zdGF0aWNXZWJDb250ZW50TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIGludGVyZmFjZSBWYWx1ZXMgewotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRJQ19XRUJfQ09OVEVOVCA9ICJXZWJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRzIHsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSBWYWx1ZXMuU1RBVElDX1dFQl9DT05URU5UOwotCX0KLQlwcml2YXRlIFBsdWdpbiBvd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHBlcnNpc3RPbkNoYW5nZSA9IGZhbHNlOwotCi0JcHVibGljIFdTVFdlYlByZWZlcmVuY2VzKFBsdWdpbiBvd25lcikgewotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLlNUQVRJQ19XRUJfQ09OVEVOVCwgRGVmYXVsdHMuU1RBVElDX1dFQl9DT05URU5UKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRpY1dlYkNvbnRlbnRGb2xkZXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXRpY1dlYkNvbnRlbnRGb2xkZXJOYW1lKFN0cmluZyB2YWx1ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKEtleXMuU1RBVElDX1dFQl9DT05URU5ULCB2YWx1ZSk7Ci0JCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpIHsKLQkJaWYgKGlzUGVyc2lzdE9uQ2hhbmdlKCkpCi0JCQlwZXJzaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyc2lzdCgpIHsKLQkJZ2V0T3duZXIoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBlcnNpc3RPbkNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RPbkNoYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdE9uQ2hhbmdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwZXJzaXN0T25DaGFuZ2UKLQkgKiAgICAgICAgICAgIFRoZSBwZXJzaXN0T25DaGFuZ2UgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcnNpc3RPbkNoYW5nZShib29sZWFuIHBlcnNpc3RPbkNoYW5nZSkgewotCQl0aGlzLnBlcnNpc3RPbkNoYW5nZSA9IHBlcnNpc3RPbkNoYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5wcmVmZXJlbmNlcyA9IGdldE93bmVyKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvd25lci4KLQkgKi8KLQlwcml2YXRlIFBsdWdpbiBnZXRPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODAxMTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvV1NUV2ViVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdTVFdlYlVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBXU1RXZWJVSVBsdWdpbiBwbHVnaW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJQ09OX0RJUlMgPSBuZXcgU3RyaW5nW117Imljb25zL2Z1bGwvb2JqMTYiLCAvLyROT04tTkxTLTEkCi0JCSJpY29ucy9mdWxsL2N0b29sMTYiLCAvLyROT04tTkxTLTEkCi0JCSJpY29ucy9mdWxsL3dpemJhbiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zIiwgLy8kTk9OLU5MUy0xJAotCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1NUV2ViVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCVVSTCBnaWZJbWFnZVVSTCA9IGdldEltYWdlVVJMKGtleSwgZ2V0QnVuZGxlKCkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0SW1hZ2VVUkwoU3RyaW5nIGtleSwgQnVuZGxlIGJ1bmRsZSkgewotCQlTdHJpbmcgZ2lmID0gIi8iICsga2V5ICsgIi5naWYiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgSUNPTl9ESVJTLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoID0gbmV3IFBhdGgoSUNPTl9ESVJTW2ldKS5hcHBlbmQoZ2lmKTsKLQkJCWlmIChidW5kbGUuZ2V0RW50cnkocGF0aC50b1N0cmluZygpKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKCJMb2FkX0ltYWdlX0Vycm9yXyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTVFdlYlVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvU2ltcGxlQ29udGV4dFJvb3RDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVDb250ZXh0Um9vdENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjJmY2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVDb250ZXh0Um9vdENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLldlYlByb3BlcnRpZXNVdGlsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29udGV4dFJvb3RDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCXByb3RlY3RlZCBUZXh0IGNvbnRleHRSb290RmllbGQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQotCS8vIGxpc3RlbmVycyBpbnRlcmVzdGVkIGluIHRoZSBldmVudCB3aGVuIHRoZSBjb250ZXh0IHJvb3QKLQkvLyB2YWx1ZSBpcyBtb2RpZmllZC4KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IG1vZGlmeUxpc3RlbmVyczsKLQotCXByb3RlY3RlZCBMaXN0ZW5lciBjb250ZXh0Um9vdE1vZGlmeUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoY29udGV4dFJvb3RGaWVsZCAhPSBudWxsKQotCQkJCWNvbnRleHRSb290TW9kaWZpZWQoKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgU2ltcGxlQ29udGV4dFJvb3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJY3JlYXRlQ29udHJvbHMoKTsKLQkJbW9kaWZ5TGlzdGVuZXJzID0gbmV3IFZlY3RvcigxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9scygpIHsKLQkJLy8gY29udGFpbmVyIHNwZWNpZmljYXRpb24gZ3JvdXAKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBOZXcgQ29udGV4dCBSb290IExhYmVsCi0JCUxhYmVsIGNvbnRleHRSb290TGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkNIRUNLKTsKLQkJY29udGV4dFJvb3RMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN0YXRpY0NvbnRleHRSb290Q29tcG9zaXRlLkNvbnRleHRfUm9vdF9MYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIE5ldyBDb250ZXh0IFJvb3QgRW50cnlmaWVsZAotCQljb250ZXh0Um9vdEZpZWxkID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJY29udGV4dFJvb3RGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNvbnRleHRSb290RmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgY29udGV4dFJvb3RNb2RpZnlMaXN0ZW5lcik7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHRSb290KCkgewotCQlyZXR1cm4gY29udGV4dFJvb3RGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKGNvbnRleHRSb290RmllbGQgIT0gbnVsbCkKLQkJCWNvbnRleHRSb290RmllbGQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250ZXh0Um9vdE1vZGlmaWVkKCkgewotCQllcnJvck1lc3NhZ2UgPSBXZWJQcm9wZXJ0aWVzVXRpbC52YWxpZGF0ZUNvbnRleHRSb290KGdldENvbnRleHRSb290KCkpOwotCQkvLyBub3RpZnkgbGlzdGVuZXJzCi0JCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJZS50eXBlID0gU1dULk1vZGlmeTsKLQkJZS53aWRnZXQgPSBjb250ZXh0Um9vdEZpZWxkOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGlmeUxpc3RlbmVycy5zaXplKCk7IGkrKykgewotCQkJKChMaXN0ZW5lcikgbW9kaWZ5TGlzdGVuZXJzLmdldChpKSkuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0Um9vdChTdHJpbmcgY3IpIHsKLQkJY29udGV4dFJvb3RGaWVsZC5zZXRUZXh0KGNyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBpcyBhIGRlZmF1bHQgY29udGV4dCByb290IHZhbGlkYXRpb24gbGlzdGVuZXIgcHJvdmlkZWQgYnkgdGhlCi0JICogY29tcG9zaXRlLCBhZGRpbmcgZXh0ZXJuYWwgbGlzdGVuZXJzIHdpbGwgcmVwbGFjZSB0aGUgZGVmYXVsdCBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihMaXN0ZW5lciBsKSB7Ci0JCW1vZGlmeUxpc3RlbmVycy5hZGQobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTGlzdGVuZXIgbCkgewotCQltb2RpZnlMaXN0ZW5lcnMucmVtb3ZlKGwpOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb250ZXh0IHJvb3QgdmFsdWUgYW5kIHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotCQlyZXR1cm4gY29udGV4dFJvb3RGaWVsZC5zZXRGb2N1cygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ3ZWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbi5TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwuV1NUV2ViVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbldpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCBpbXBsZW1lbnRzIElFeGVjdXRhYmxlRXh0ZW5zaW9uLCBJTmV3V2l6YXJkIHsKLQotCXB1YmxpYyBTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIFNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uV2l6YXJkKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7Ci0gICAgfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBTaW1wbGVXZWJNb2R1bGVXaXphcmRCYXNlUGFnZShnZXREYXRhTW9kZWwoKSwgInBhZ2UxIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7ICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHNldFdpbmRvd1RpdGxlKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN0YXRpY1dlYlByb2plY3RDcmVhdGlvbldpemFyZC5XaXphcmRfVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoV1NUV2ViVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigibmV3d3Byal93aXoiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLS8vCXByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotLy8JCUlXaXphcmRSZWdpc3RyeSBuZXdXaXphcmRSZWdpc3RyeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKTsJCQotLy8JCQotLy8JCUlXaXphcmREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXdXaXphcmRSZWdpc3RyeS5maW5kV2l6YXJkKGdldFdpemFyZElEKCkpOwotLy8KLS8vCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya2JlbmNoV2l6YXJkRWxlbWVudCkKLS8vCQkJQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQudXBkYXRlUGVyc3BlY3RpdmUoKChXb3JrYmVuY2hXaXphcmRFbGVtZW50KWRlc2NyaXB0b3IpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkpOwotLy8JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gV1NUV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gKChTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbCkgbW9kZWwpLmdldFRhcmdldFByb2plY3QoKTsKLS8vCQlCYXNpY05ld1Jlc291cmNlV2l6YXJkLnNlbGVjdEFuZFJldmVhbChwcm9qZWN0LCB3aW5kb3cpOwotLy8JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVXZWJNb2R1bGVXaXphcmRCYXNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL1NpbXBsZVdlYk1vZHVsZVdpemFyZEJhc2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Yjk4YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL1NpbXBsZVdlYk1vZHVsZVdpemFyZEJhc2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLk5ld1Byb2plY3RHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5XU1RXZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5vcGVyYXRpb24uSVNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLQotY2xhc3MgU2ltcGxlV2ViTW9kdWxlV2l6YXJkQmFzZVBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIGltcGxlbWVudHMgSVNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllc3sKLQlwcm90ZWN0ZWQgTmV3UHJvamVjdEdyb3VwIHByb2plY3ROYW1lR3JvdXA7Ci0JcHVibGljIFRleHQgcHJvamVjdE5hbWVGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbG9jYXRpb25QYXRoRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uID0gbnVsbDsKLQkvLwljb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JLy8JZGVmYXVsdCB2YWx1ZXMKLQlwcml2YXRlIFN0cmluZyBkZWZQcm9qZWN0TmFtZUxhYmVsID0gV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJOYW1lXyIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkJyb3dzZV8iKTsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZkRpckRpYWxvZ0xhYmVsID0gIkRpcmVjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBTaW1wbGVXZWJNb2R1bGVXaXphcmRCYXNlUGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2UuUGFnZV9EZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2UuUGFnZV9UaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihXU1RXZWJQbHVnaW4uUExVR0lOX0lELCAiaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0IGhhcwotCQkJLy8gc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde1BST0pFQ1RfTkFNRX07Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgdG9wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJdG9wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdG9wLnNldERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnVpbGRDb21wb3NpdGVzKGNvbXBvc2l0ZSk7Ci0JCUNvbXBvc2l0ZSBkZXRhaWwgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotCQlkZXRhaWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkZXRhaWwuc2V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0b3AsICJjb20uaWJtLmV0b29scy53ZWJ0b29scy53aXphcmRzLmJhc2ljLndlYncxNDUwIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRvcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbnRyb2xzIHdpdGhpbiB0aGlzIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVByb2plY3ROYW1lR3JvdXAocGFyZW50KTsKLQkJY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAocGFyZW50KTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLwkJc2V0IHVwIGxvY2F0aW9uIHBhdGggbGFiZWwKLQkJTGFiZWwgbG9jYXRpb25QYXRoTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uUGF0aExhYmVsLnNldFRleHQoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQcm9qZWN0X2xvY2F0aW9uXyIpKTsvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbG9jYXRpb25QYXRoTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy8gc2V0IHVwIGxvY2F0aW9uIHBhdGggZW50cnkgZmllbGQKLQkJbG9jYXRpb25QYXRoRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgYnJvd3NlIGJ1dHRvbgotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGxvY2F0aW9uUGF0aEZpZWxkLCBMT0NBVElPTiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYnJvd3NlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobG9jYXRpb25QYXRoRmllbGQuZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKGRlZkRpckRpYWxvZ0xhYmVsKTsKLQkJU3RyaW5nIGRpck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShMT0NBVElPTik7Ci0JCWlmICgoZGlyTmFtZSAhPSBudWxsKSAmJiAoZGlyTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkgewotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShMT0NBVElPTiwgc2VsZWN0ZWREaXJlY3RvcnkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBsYWJlbAotCQlMYWJlbCBwcm9qZWN0TmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoZGVmUHJvamVjdE5hbWVMYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvLyBwYWQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHByb2plY3ROYW1lRmllbGQsIFBST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtwcm9qZWN0TmFtZUxhYmVsfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK